diff --git a/compiler/.gitignore b/compiler/.gitignore
index 02aa8f2..5a9c6a0 100644
--- a/compiler/.gitignore
+++ b/compiler/.gitignore
@@ -13,8 +13,10 @@
 /jsonlib_sources.gypi
 /jsonlib_sources.xml
 /sources.gypi
+/sources.txt
 /sources.xml
 /test_sources.gypi
+/test_sources.txt
 /test_sources.xml
 /out
 /xcodebuild
diff --git a/compiler/generate_source_list.py b/compiler/generate_source_list.py
index 4fe72a5..d0dfa5b 100644
--- a/compiler/generate_source_list.py
+++ b/compiler/generate_source_list.py
@@ -57,6 +57,10 @@
       out.write('''      r'%s/%s',%s''' % (self.path, filename,'\n'))
     out.write("    ],\n")
 
+  def _print_txt_files(self, out, files):
+    for filename in files:
+      out.write('%s\n' % os.path.join(self.path, filename))
+
   def _print_ant_files(self, out, name, files):
     out.write("  <filelist id='%s' dir='%s'>\n" % (name, self.path))
     for filename in files:
@@ -89,6 +93,7 @@
 
   def generate(self):
     self._list_files()
+
     file_name = self.output + '.gypi';
     gypi = self._make_output(file_name)
     gypi.write("{\n  'variables': {\n")
@@ -96,6 +101,7 @@
     self._print_gypi_files(gypi, self.name + '_resources', self.resources)
     gypi.write("  },\n}\n")
     self._close(file_name, gypi)
+
     file_name = self.output + '.xml'
     ant = self._make_output(file_name)
     ant.write("<project>\n")
@@ -104,6 +110,11 @@
     ant.write("</project>\n")
     self._close(file_name, ant)
 
+    file_name = self.output + '.txt';
+    txt = self._make_output(file_name)
+    self._print_txt_files(txt, self.sources)
+    self._close(file_name, txt)
+
 
 def Main(script_name = None, name = None, output = None, path = None,
          *rest):
diff --git a/compiler/scripts/generate_my_projects.py b/compiler/scripts/generate_my_projects.py
index 82f7400..ff5800bb 100755
--- a/compiler/scripts/generate_my_projects.py
+++ b/compiler/scripts/generate_my_projects.py
@@ -12,28 +12,49 @@
     return os.path.normpath(os.path.join(*args))
 
   compiler = normjoin(sys.argv[0], os.pardir, os.pardir)
-  tools = normjoin(compiler, os.pardir, 'tools')
+  editor = normjoin(compiler, os.pardir, 'editor')
+
   locations = {
     'compiler': compiler,
-    'tools': tools,
-    }
+    'editor': editor,
+  }
 
-  exit_code = os.system("python %(compiler)s/generate_source_list.py "
-                        "java %(compiler)s/sources java" % locations)
-  if exit_code:
-    return exit_code
+  generate_source_list_calls = [
+    # The paths are relative to dart/compiler/
+    {
+        "name" : "java",
+        "output" : "%(compiler)s/sources" % locations,
+        "path" : "java",
+    },
+    {
+        "name" : "javatests",
+        "output" : "%(compiler)s/test_sources" % locations,
+        "path" : "javatests",
+    },
+    # The paths are relative to dart/editor/
+    {
+        "name" : "plugin_engine_java",
+        "output" : "%(editor)s/plugin_engine_sources" % locations,
+        "path" : "tools/plugins/com.google.dart.engine",
+    },
+    {
+        "name" : "plugin_command_analyze_java",
+        "output" : "%(editor)s/plugin_command_analyze_sources" % locations,
+        "path" : "tools/plugins/com.google.dart.command.analyze",
+    },
+  ]
 
-
-  exit_code = os.system("python %(compiler)s/generate_source_list.py "
-                        "javatests %(compiler)s/test_sources javatests"
-                        % locations)
-  if exit_code:
-    return exit_code
+  for call_options in generate_source_list_calls:
+    command = ("python %(compiler)s/generate_source_list.py " % locations +
+              "%(name)s %(output)s %(path)s" % call_options)
+    exit_code = os.system(command)
+    if exit_code:
+      return exit_code
 
   if '--no-gyp' in sys.argv:
     print '--no-gyp is deprecated.'
 
-  return exit_code
+  return 0
 
 
 if __name__ == '__main__':
diff --git a/dart.gyp b/dart.gyp
index a40eae5..b4f7aa4 100644
--- a/dart.gyp
+++ b/dart.gyp
@@ -5,22 +5,7 @@
 {
   'targets': [
     {
-      # Contains all dependencies.
-      'target_name': 'everything',
-      'type': 'none',
-      'dependencies': [
-        # Most dependencies.
-        'default',
-        # All other targets.
-        'api_docs',
-        'dartc_bot',
-        'dart2js_bot',
-      ],
-    },
-    {
-      # Contains all the dependencies that will run by default.
-      # Excludes api_docs.
-      'target_name': 'default',
+      'target_name': 'most',
       'type': 'none',
       'dependencies': [
         'analyzer',
@@ -75,7 +60,7 @@
             '<!@(["python", "tools/list_files.py", "", "sdk/bin"])',
             'tools/create_sdk.py',
             '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
-            '<(PRODUCT_DIR)/dart2js.snapshot',
+            '<(SHARED_INTERMEDIATE_DIR)/utils_wrapper.dart.snapshot',
             '<(PRODUCT_DIR)/analyzer/bin/dart_analyzer',
           ],
           'outputs': [
@@ -84,7 +69,9 @@
           'action': [
             'python',
             'tools/create_sdk.py',
-            '<(PRODUCT_DIR)/dart-sdk',
+            '--sdk_output_dir', '<(PRODUCT_DIR)/dart-sdk',
+            '--utils_snapshot_location',
+             '<(SHARED_INTERMEDIATE_DIR)/utils_wrapper.dart.snapshot'
           ],
           'message': 'Creating SDK.',
         },
@@ -128,11 +115,21 @@
       'target_name': 'analyzer',
       'type': 'none',
       'dependencies': [
-        'create_sdk',
         'editor/analyzer.gyp:analyzer',
       ],
     },
     {
+      # This is the target that is built on the dart2dart bots.
+      # It must depend on anything that is required by dart2dart
+      # tests.
+      'target_name': 'dart2dart_bot',
+      'type': 'none',
+      'dependencies': [
+        'create_sdk',
+        'packages',
+      ],
+    },
+    {
       # This is the target that is built on the dartc bots.
       # It must depend on anything that is required by dartc
       # tests.
diff --git a/pkg/analyzer_experimental/lib/src/generated/ast.dart b/pkg/analyzer_experimental/lib/src/generated/ast.dart
index cc22cd4..96e7662 100644
--- a/pkg/analyzer_experimental/lib/src/generated/ast.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/ast.dart
@@ -13045,7 +13045,7 @@
     owner.becomeParentOf(node);
     elements.add(node);
   }
-  bool addAll(Collection<E> nodes) {
+  bool addAll(Iterable<E> nodes) {
     if (nodes != null) {
       for (E node in nodes) {
         add(node);
@@ -13081,4 +13081,4 @@
   ASTNode getOwner() {
     return owner;
   }
-}
\ No newline at end of file
+}
diff --git a/pkg/analyzer_experimental/lib/src/generated/element.dart b/pkg/analyzer_experimental/lib/src/generated/element.dart
index 1a140b9..3d7e2a4 100644
--- a/pkg/analyzer_experimental/lib/src/generated/element.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/element.dart
@@ -1277,9 +1277,9 @@
   accept(ElementVisitor visitor) => visitor.visitClassElement(this);
   List<PropertyAccessorElement> get accessors => _accessors;
   List<InterfaceType> get allSupertypes {
-    Collection<InterfaceType> list = new Set<InterfaceType>();
-    collectAllSupertypes(list);
-    return new List.from(list);
+    Set<InterfaceType> set = new Set<InterfaceType>();
+    collectAllSupertypes(set);
+    return set.toList();
   }
   ElementImpl getChild(String identifier25) {
     for (PropertyAccessorElement accessor in _accessors) {
@@ -1541,7 +1541,7 @@
       builder.append(">");
     }
   }
-  void collectAllSupertypes(Collection<InterfaceType> list) {
+  void collectAllSupertypes(var list) {
     if (_supertype == null || list.contains(_supertype)) {
       return;
     }
@@ -4913,4 +4913,4 @@
  */
 abstract class VoidType implements Type2 {
   VoidType substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes);
-}
\ No newline at end of file
+}
diff --git a/pkg/analyzer_experimental/lib/src/generated/java_core.dart b/pkg/analyzer_experimental/lib/src/generated/java_core.dart
index 900c2ca..f293998 100644
--- a/pkg/analyzer_experimental/lib/src/generated/java_core.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/java_core.dart
@@ -2,6 +2,7 @@
 
 import "dart:math" as math;
 import "dart:uri";
+import "dart:collection" show ListBase;
 
 class JavaSystem {
   static int currentTimeMillis() {
@@ -257,7 +258,7 @@
   String toString() => "IOException";
 }
 
-class ListWrapper<E> extends Collection<E> implements List<E> {
+class ListWrapper<E> extends ListBase<E> implements List<E> {
   List<E> elements = new List<E>();
 
   Iterator<E> get iterator {
@@ -276,6 +277,8 @@
     elements.length = newLength;
   }
 
+  int get length => elements.length;
+
   void add(E value) {
     elements.add(value);
   }
@@ -344,13 +347,13 @@
 }
 
 class JavaIterator<E> {
-  Collection<E> _collection;
+  Iterable<E> _iterable;
   List<E> _elements = new List<E>();
   int _coPos = 0;
   int _elPos = 0;
   E _current = null;
-  JavaIterator(this._collection) {
-    Iterator iterator = _collection.iterator;
+  JavaIterator(this._iterable) {
+    Iterator iterator = _iterable.iterator;
     while (iterator.moveNext()) {
       _elements.add(iterator.current);
     }
@@ -368,13 +371,13 @@
   }
 
   void remove() {
-    if (_collection is List) {
+    if (_iterable is List) {
       _coPos--;
-      (_collection as List).remove(_coPos);
-    } else if (_collection is Set) {
-      _collection.remove(_current);
+      (_iterable as List).remove(_coPos);
+    } else if (_iterable is Set) {
+      _iterable.remove(_current);
     } else {
-      throw new StateError("Unsupported collection ${_collection.runtimeType}");
+      throw new StateError("Unsupported iterable ${_iterable.runtimeType}");
     }
   }
 }
diff --git a/pkg/args/lib/args.dart b/pkg/args/lib/args.dart
index 48cef16..1337b46 100644
--- a/pkg/args/lib/args.dart
+++ b/pkg/args/lib/args.dart
@@ -417,7 +417,7 @@
     return _options[name];
   }
 
-  /** Get the names of the options as a [Collection]. */
-  Collection<String> get options => _options.keys.toList(growable: false);
+  /** Get the names of the options as an [Iterable]. */
+  Iterable<String> get options => _options.keys;
 }
 
diff --git a/sdk/lib/core/expect.dart b/pkg/expect/lib/expect.dart
similarity index 96%
rename from sdk/lib/core/expect.dart
rename to pkg/expect/lib/expect.dart
index 0302d3d..0f83041 100644
--- a/sdk/lib/core/expect.dart
+++ b/pkg/expect/lib/expect.dart
@@ -2,23 +2,23 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of dart.core;
+/**
+ * This library contains an Expect class with static methods that can be used
+ * for simple unit-tests.
+ */
+library expect;
 
 /**
- * This class is *deprecated*.
- *
  * Expect is used for tests that do not want to make use of the
  * Dart unit test library - for example, the core language tests.
  * Third parties are discouraged from using this, and should use
  * the expect() function in the unit test library instead for
  * test assertions.
  */
-@deprecated
 class Expect {
   /**
    * Checks whether the expected and actual values are equal (using `==`).
    */
-  @deprecated
   static void equals(var expected, var actual, [String reason = null]) {
     if (expected == actual) return;
     String msg = _getMessage(reason);
@@ -28,7 +28,6 @@
   /**
    * Checks whether the actual value is a bool and its value is true.
    */
-  @deprecated
   static void isTrue(var actual, [String reason = null]) {
     if (_identical(actual, true)) return;
     String msg = _getMessage(reason);
@@ -38,7 +37,6 @@
   /**
    * Checks whether the actual value is a bool and its value is false.
    */
-  @deprecated
   static void isFalse(var actual, [String reason = null]) {
     if (_identical(actual, false)) return;
     String msg = _getMessage(reason);
@@ -48,7 +46,6 @@
   /**
    * Checks whether [actual] is null.
    */
-  @deprecated
   static void isNull(actual, [String reason = null]) {
     if (null == actual) return;
     String msg = _getMessage(reason);
@@ -58,7 +55,6 @@
   /**
    * Checks whether [actual] is not null.
    */
-  @deprecated
   static void isNotNull(actual, [String reason = null]) {
     if (null != actual) return;
     String msg = _getMessage(reason);
@@ -69,7 +65,6 @@
    * Checks whether the expected and actual values are identical
    * (using `identical`).
    */
-  @deprecated
   static void identical(var expected, var actual, [String reason = null]) {
     if (_identical(expected, actual)) return;
     String msg = _getMessage(reason);
@@ -78,7 +73,6 @@
   }
 
   // Unconditional failure.
-  @deprecated
   static void fail(String msg) {
     _fail("Expect.fail('$msg')");
   }
@@ -88,7 +82,6 @@
    * given tolerance. If no tolerance is given, tolerance is assumed to be the
    * value 4 significant digits smaller than the value given for expected.
    */
-  @deprecated
   static void approxEquals(num expected,
                            num actual,
                            [num tolerance = null,
@@ -104,7 +97,6 @@
           'tolerance:<$tolerance>$msg) fails');
   }
 
-  @deprecated
   static void notEquals(unexpected, actual, [String reason = null]) {
     if (unexpected != actual) return;
     String msg = _getMessage(reason);
@@ -118,7 +110,6 @@
    * used by the standard list implementation.  It should also produce nicer
    * error messages than just calling `Expect.equals(expected, actual)`.
    */
-  @deprecated
   static void listEquals(List expected, List actual, [String reason = null]) {
     String msg = _getMessage(reason);
     int n = (expected.length < actual.length) ? expected.length : actual.length;
@@ -143,7 +134,6 @@
    * the semantics of [Map.containsKey] to determine what "same" means. For
    * each key, checks that the values in both maps are equal using `==`.
    */
-  @deprecated
   static void mapEquals(Map expected, Map actual, [String reason = null]) {
     String msg = _getMessage(reason);
 
@@ -168,7 +158,6 @@
    * Specialized equality test for strings. When the strings don't match,
    * this method shows where the mismatch starts and ends.
    */
-  @deprecated
   static void stringEquals(String expected,
                            String actual,
                            [String reason = null]) {
@@ -237,7 +226,6 @@
    * Checks that every element of [expected] is also in [actual], and that
    * every element of [actual] is also in [expected].
    */
-  @deprecated
   static void setEquals(Iterable expected,
                         Iterable actual,
                         [String reason = null]) {
@@ -278,7 +266,6 @@
    *
    *     Expect.throws(myThrowingFunction, (e) => e is MyException);
    */
-  @deprecated
   static void throws(void f(),
                      [_CheckExceptionFn check = null,
                       String reason = null]) {
@@ -309,7 +296,6 @@
 
 typedef bool _CheckExceptionFn(exception);
 
-@deprecated
 class ExpectException implements Exception {
   ExpectException(this.message);
   String toString() => message;
diff --git a/pkg/expect/pubspec.yaml b/pkg/expect/pubspec.yaml
new file mode 100644
index 0000000..0b2ed15
--- /dev/null
+++ b/pkg/expect/pubspec.yaml
@@ -0,0 +1,9 @@
+name: expect
+author: "Dart Team <misc@dartlang.org>"
+homepage: http://www.dartlang.org
+description: >
+ Expect is used for tests that do not want to make use of the
+ Dart unit test library - for example, the core language tests.
+ Third parties are discouraged from using this, and should use
+ the expect() function in the unit test library instead for
+ test assertions.
diff --git a/pkg/fixnum/test/int_32_test.dart b/pkg/fixnum/test/int_32_test.dart
index dea6621..407f2a0 100644
--- a/pkg/fixnum/test/int_32_test.dart
+++ b/pkg/fixnum/test/int_32_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library int32test;
+import "package:expect/expect.dart";
 import 'package:fixnum/fixnum.dart';
 
 void main() {
diff --git a/pkg/fixnum/test/int_64_test.dart b/pkg/fixnum/test/int_64_test.dart
index a4e2537..8aa3e5b 100644
--- a/pkg/fixnum/test/int_64_test.dart
+++ b/pkg/fixnum/test/int_64_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library int64test;
+import "package:expect/expect.dart";
 import 'package:fixnum/fixnum.dart';
 
 void main() {
diff --git a/pkg/fixnum/test/int_64_vm_test.dart b/pkg/fixnum/test/int_64_vm_test.dart
index b9d0f70..b0a40a7 100644
--- a/pkg/fixnum/test/int_64_vm_test.dart
+++ b/pkg/fixnum/test/int_64_vm_test.dart
@@ -6,6 +6,7 @@
 
 library int64vmtest;
 
+import "package:expect/expect.dart";
 import 'dart:math' as math;
 
 part 'package:fixnum/src/int32.dart';
diff --git a/pkg/http/lib/http.dart b/pkg/http/lib/http.dart
index 8a61f6e..07457cd 100644
--- a/pkg/http/lib/http.dart
+++ b/pkg/http/lib/http.dart
@@ -50,7 +50,6 @@
 ///         return _inner.send(request);
 ///       }
 ///     }
-
 library http;
 
 import 'dart:async';
diff --git a/pkg/http/lib/src/io_client.dart b/pkg/http/lib/src/io_client.dart
index 9bbb7ee..b7a6730 100644
--- a/pkg/http/lib/src/io_client.dart
+++ b/pkg/http/lib/src/io_client.dart
@@ -32,8 +32,7 @@
       request.headers.forEach((name, value) {
         ioRequest.headers.set(name, value);
       });
-      return Future.wait([stream.pipe(ioRequest), ioRequest.response])
-          .then((list) => list[1]);
+      return stream.pipe(ioRequest);
     }).then((response) {
       var headers = {};
       response.headers.forEach((key, values) {
diff --git a/pkg/http/lib/src/multipart_request.dart b/pkg/http/lib/src/multipart_request.dart
index bc58871..ab66bbd 100644
--- a/pkg/http/lib/src/multipart_request.dart
+++ b/pkg/http/lib/src/multipart_request.dart
@@ -41,6 +41,21 @@
 
   static final Random _random = new Random();
 
+  /// The form fields to send for this request.
+  final Map<String, String> fields;
+
+  /// The private version of [files].
+  final List<MultipartFile> _files;
+
+  /// Creates a new [MultipartRequest].
+  MultipartRequest(String method, Uri url)
+    : super(method, url),
+      fields = {},
+      _files = <MultipartFile>[];
+
+  /// The list of files to upload for this request.
+  List<MultipartFile> get files => _files;
+
   /// The total length of the request body, in bytes. This is calculated from
   /// [fields] and [files] and cannot be set manually.
   int get contentLength {
@@ -52,7 +67,7 @@
           encodeUtf8(value).length + "\r\n".length;
     });
 
-    for (var file in _files.collection) {
+    for (var file in _files) {
       length += "--".length + _BOUNDARY_LENGTH + "\r\n".length +
           _headerForFile(file).length +
           file.length + "\r\n".length;
@@ -66,25 +81,6 @@
         "multipart requests.");
   }
 
-  /// The form fields to send for this request.
-  final Map<String, String> fields;
-
-  /// The sink for files to upload for this request.
-  ///
-  /// This doesn't need to be closed. When the request is sent, whichever files
-  /// are written to this sink at that point will be used.
-  CollectionSink<MultipartFile> get files => _files;
-
-  /// The private version of [files], typed so that the underlying collection is
-  /// accessible.
-  final CollectionSink<MultipartFile> _files;
-
-  /// Creates a new [MultipartRequest].
-  MultipartRequest(String method, Uri url)
-    : super(method, url),
-      fields = {},
-      _files = new CollectionSink<MultipartFile>(<MultipartFile>[]);
-
   /// Freezes all mutable fields and returns a single-subscription [ByteStream]
   /// that will emit the request body.
   ByteStream finalize() {
@@ -111,7 +107,7 @@
       writeLine();
     });
 
-    Future.forEach(_files.collection, (file) {
+    Future.forEach(_files, (file) {
       writeAscii('--$boundary\r\n');
       writeAscii(_headerForFile(file));
       return writeStreamToSink(file.finalize(), controller)
diff --git a/pkg/http/lib/testing.dart b/pkg/http/lib/testing.dart
index 4c750ce..9fe7b06 100644
--- a/pkg/http/lib/testing.dart
+++ b/pkg/http/lib/testing.dart
@@ -2,8 +2,6 @@
 // for 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 testing;
-
 /// This library contains testing classes for the HTTP library.
 ///
 /// The [MockClient] class is a drop-in replacement for `http.Client` that
@@ -23,5 +21,6 @@
 ///         'content-type': 'application/json'
 ///       });
 ///     };
+library http.testing;
 
 export 'src/mock_client.dart';
diff --git a/pkg/http/test/client_test.dart b/pkg/http/test/client_test.dart
index daa3acb..e898426 100644
--- a/pkg/http/test/client_test.dart
+++ b/pkg/http/test/client_test.dart
@@ -37,6 +37,7 @@
         'path': '/',
         'headers': {
           'content-type': ['application/json; charset=utf-8'],
+          'accept-encoding': ['gzip'],
           'transfer-encoding': ['chunked']
         },
         'body': '{"hello": "world"}'
diff --git a/pkg/http/test/http_test.dart b/pkg/http/test/http_test.dart
index 81cca76..b3227f5 100644
--- a/pkg/http/test/http_test.dart
+++ b/pkg/http/test/http_test.dart
@@ -36,6 +36,7 @@
             'path': '/',
             'headers': {
               'content-length': ['0'],
+              'accept-encoding': ['gzip'],
               'x-random-header': ['Value'],
               'x-other-header': ['Other Value']
             },
@@ -62,6 +63,7 @@
                 'application/x-www-form-urlencoded; charset=utf-8'
               ],
               'content-length': ['40'],
+              'accept-encoding': ['gzip'],
               'x-random-header': ['Value'],
               'x-other-header': ['Other Value']
             },
@@ -83,6 +85,7 @@
             'method': 'POST',
             'path': '/',
             'headers': {
+              'accept-encoding': ['gzip'],
               'content-length': ['0'],
               'content-type': ['text/plain'],
               'x-random-header': ['Value'],
@@ -110,6 +113,7 @@
               'content-type': [
                 'application/x-www-form-urlencoded; charset=utf-8'
               ],
+              'accept-encoding': ['gzip'],
               'content-length': ['40'],
               'x-random-header': ['Value'],
               'x-other-header': ['Other Value']
@@ -133,6 +137,7 @@
             'path': '/',
             'headers': {
               'content-length': ['0'],
+              'accept-encoding': ['gzip'],
               'content-type': ['text/plain'],
               'x-random-header': ['Value'],
               'x-other-header': ['Other Value']
@@ -154,6 +159,7 @@
             'path': '/',
             'headers': {
               'content-length': ['0'],
+              'accept-encoding': ['gzip'],
               'x-random-header': ['Value'],
               'x-other-header': ['Other Value']
             }
@@ -172,6 +178,7 @@
           'path': '/',
           'headers': {
             'content-length': ['0'],
+            'accept-encoding': ['gzip'],
             'x-random-header': ['Value'],
             'x-other-header': ['Other Value']
           },
@@ -197,6 +204,7 @@
           'path': '/',
           'headers': {
             'content-length': ['0'],
+            'accept-encoding': ['gzip'],
             'x-random-header': ['Value'],
             'x-other-header': ['Other Value']
           },
diff --git a/pkg/http/test/request_test.dart b/pkg/http/test/request_test.dart
index ea49199..e17589c 100644
--- a/pkg/http/test/request_test.dart
+++ b/pkg/http/test/request_test.dart
@@ -27,6 +27,7 @@
         'path': '/',
         'headers': {
           'content-type': ['text/plain; charset=utf-8'],
+          'accept-encoding': ['gzip'],
           'content-length': ['5']
         },
         'body': 'hello'
diff --git a/pkg/http/test/safe_http_server.dart b/pkg/http/test/safe_http_server.dart
index 408f080..2b388dd 100644
--- a/pkg/http/test/safe_http_server.dart
+++ b/pkg/http/test/safe_http_server.dart
@@ -131,7 +131,7 @@
   List<Cookie> get cookies => _inner.cookies;
   Future<Socket> detachSocket() => _inner.detachSocket();
   HttpConnectionInfo get connectionInfo => _inner.connectionInfo;
-  void writeBytes(List<int> data) => _inner.writeBytes(data);
+  void add(List<int> data) => _inner.add(data);
   Future<HttpResponse> consume(Stream<List<int>> stream) =>
     _inner.consume(stream);
   Future<HttpResponse> writeStream(Stream<List<int>> stream) =>
diff --git a/pkg/intl/lib/intl.dart b/pkg/intl/lib/intl.dart
index c3cbdd5..9a9c529 100644
--- a/pkg/intl/lib/intl.dart
+++ b/pkg/intl/lib/intl.dart
@@ -21,12 +21,15 @@
 import 'dart:math';
 import 'date_symbols.dart';
 import 'src/date_format_internal.dart';
+import "number_symbols.dart";
+import "number_symbols_data.dart";
 
 part 'date_format.dart';
 part 'src/date_format_field.dart';
 part 'src/date_format_helpers.dart';
 part 'bidi_formatter.dart';
 part 'bidi_utils.dart';
+part 'number_format.dart';
 
 /**
  * The Intl class provides a common entry point for internationalization
@@ -170,7 +173,7 @@
     // difficult. As a result, we call this more often. Consider keeping
     // verified locales for each purpose if it turns out to be a performance
     // issue.
-    if (newLocale == null) return systemLocale;
+    if (newLocale == null) return getCurrentLocale();
     if (localeExists(newLocale)) {
       return newLocale;
     }
@@ -244,8 +247,7 @@
     // We have to do this silliness because Locale is not known at compile time,
     // but must be a static variable in order to be visible to the Intl.message
     // invocation.
-    if (_defaultLocale == null) _defaultLocale = systemLocale;
-    var oldLocale = _defaultLocale;
+    var oldLocale = getCurrentLocale();
     _defaultLocale = locale;
     var result = message_function();
     _defaultLocale = oldLocale;
diff --git a/pkg/intl/lib/number_format.dart b/pkg/intl/lib/number_format.dart
index ed5cf2b..c700e62 100644
--- a/pkg/intl/lib/number_format.dart
+++ b/pkg/intl/lib/number_format.dart
@@ -2,14 +2,41 @@
 // for 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 number_format;
-
-import 'dart:math';
-
-import "intl.dart";
-import "number_symbols.dart";
-import "number_symbols_data.dart";
-
+part of intl;
+/**
+ * Provides the ability to format a number in a locale-specific way. The
+ * format is specified as a pattern using a subset of the ICU formatting
+ * patterns.
+ *
+ * 0 - A single digit
+ * # - A single digit, omitted if the value is zero
+ * . - Decimal separator
+ * - - Minus sign
+ * , - Grouping separator
+ * E - Separates mantissa and expontent
+ * + - Before an exponent, indicates it should be prefixed with a plus sign.
+ * % - In prefix or suffix, multiply by 100 and show as percentage
+ * \u2030 - In prefix or suffix, multiply by 1000 and show as per mille
+ * \u00A4 - Currency sign, replaced by currency name
+ * ' - Used to quote special characters
+ * ; - Used to separate the positive and negative patterns if both are present
+ *
+ * For example,
+ *       var f = new NumberFormat("###.0#", "en_US");
+ *       print(f.format(12.345));
+ *       ==> 12.34
+ * If the locale is not specified, it will default to the current locale. If
+ * the format is not specified it will print in a basic format with at least
+ * one integer digit and three fraction digits.
+ *
+ * There are also standard patterns available via the special constructors. e.g.
+ *       var symbols = new NumberFormat.percentFormat("ar");
+ * There are four such constructors: decimalFormat, percentFormat,
+ * scientificFormat and currencyForamt. However, at the moment,
+ * scientificFormat prints only as equivalent to "#E0" and does not take
+ * into account significant digits. currencyFormat will always use the name
+ * of the currency rather than the symbol.
+ */
 class NumberFormat {
   /** Variables to determine how number printing behaves. */
   // TODO(alanknight): If these remain as variables and are set based on the
@@ -18,19 +45,64 @@
   String _positivePrefix = '';
   String _negativeSuffix = '';
   String _positiveSuffix = '';
-  /** How many numbers in a group when using punctuation to group digits in
+  /**
+   * How many numbers in a group when using punctuation to group digits in
    * large numbers. e.g. in en_US: "1,000,000" has a grouping size of 3 digits
    * between commas.
    */
   int _groupingSize = 3;
   bool _decimalSeparatorAlwaysShown = false;
+  bool _useSignForPositiveExponent = false;
   bool _useExponentialNotation = false;
+
   int _maximumIntegerDigits = 40;
   int _minimumIntegerDigits = 1;
-  int _maximumFractionDigits = 3; // invariant, >= minFractionDigits
+  int _maximumFractionDigits = 3;
   int _minimumFractionDigits = 0;
   int _minimumExponentDigits = 0;
-  bool _useSignForPositiveExponent = false;
+
+  int _multiplier = 1;
+
+  /**
+   * Stores the pattern used to create this format. This isn't used, but
+   * is helpful in debugging.
+   */
+  String _pattern;
+  /**
+   * Set the maximum digits printed to the left of the decimal point.
+   * Normally this is computed from the pattern, but it's exposed here for
+   * testing purposes and for rare cases where you want to force it explicitly.
+   */
+  void setMaximumIntegerDigits(int max) {
+    _maximumIntegerDigits = max;
+  }
+
+  /**
+   * Set the minimum number of digits printed to the left of the decimal point.
+   * Normally this is computed from the pattern, but it's exposed here for
+   * testing purposes and for rare cases where you want to force it explicitly.
+   */
+  void setMinimumIntegerDigits(int min) {
+    _minimumIntegerDigits = min;
+  }
+
+  /**
+   * Set the maximum number of digits printed to the right of the decimal point.
+   * Normally this is computed from the pattern, but it's exposed here for
+   * testing purposes and for rare cases where you want to force it explicitly.
+   */
+  void setMaximumFractionDigits(int max) {
+    _maximumFractionDigits = max;
+  }
+
+  /**
+   * Set the minimum digits printed to the left of the decimal point.
+   * Normally this is computed from the pattern, but it's exposed here for
+   * testing purposes and for rare cases where you want to force it explicitly.
+   */
+  void setMinimumFractionDigits(int max) {
+    _minimumFractionDigits = max;
+  }
 
   /** The locale in which we print numbers. */
   final String _locale;
@@ -48,15 +120,37 @@
   StringBuffer _buffer;
 
   /**
-   * Create a number format that prints in [newPattern] as it applies in
+   * Create a number format that prints using [newPattern] as it applies in
    * [locale].
    */
-  NumberFormat([String newPattern, String locale]):
-    _locale = Intl.verifiedLocale(locale, localeExists) {
-    // TODO(alanknight): There will need to be some kind of async setup
-    // operations so as not to bring along every locale in every program.
+  factory NumberFormat([String newPattern, String locale]) {
+    return new NumberFormat._forPattern(locale, (x) => newPattern);
+  }
+
+  /** Create a number format that prints as DECIMAL_PATTERN. */
+  NumberFormat.decimalPattern([String locale]) :
+      this._forPattern(locale, (x) => x.DECIMAL_PATTERN);
+
+  /** Create a number format that prints as PERCENT_PATTERN. */
+  NumberFormat.percentPattern([String locale]) :
+    this._forPattern(locale, (x) => x.PERCENT_PATTERN);
+
+  /** Create a number format that prints as SCIENTIFIC_PATTERN. */
+  NumberFormat.scientificPattern([String locale]) :
+    this._forPattern(locale, (x) => x.SCIENTIFIC_PATTERN);
+
+  /** Create a number format that prints as CURRENCY_PATTERN. */
+  NumberFormat.currencyPattern([String locale]) :
+    this._forPattern(locale, (x) => x.CURRENCY_PATTERN);
+
+  /**
+   * Create a number format that prints in a pattern we get from
+   * the [getPattern] function using the locale [locale].
+   */
+  NumberFormat._forPattern(String locale, Function getPattern) :
+      _locale = Intl.verifiedLocale(locale, localeExists) {
     _symbols = numberFormatSymbols[_locale];
-    _setPattern(newPattern);
+    _setPattern(getPattern(_symbols));
   }
 
   /**
@@ -81,9 +175,6 @@
     return _symbols;
   }
 
-  // TODO(alanknight): Actually use the pattern and locale.
-  _setPattern(String x) {}
-
   /**
    * Format [number] according to our pattern and return the formatted string.
    */
@@ -95,7 +186,7 @@
 
     _newBuffer();
     _add(_signPrefix(number));
-    _formatNumber(number.abs());
+    _formatNumber(number.abs() * _multiplier);
     _add(_signSuffix(number));
 
     var result = _buffer.toString();
@@ -115,7 +206,7 @@
   }
 
   /** Format the number in exponential notation. */
-  _formatExponential(num number) {
+  void _formatExponential(num number) {
     if (number == 0.0) {
       _formatFixed(number);
       _formatExponent(0);
@@ -123,16 +214,32 @@
     }
 
     var exponent = (log(number) / log(10)).floor();
-    var mantissa = number / pow(10, exponent);
+    var mantissa = number / pow(10.0, exponent);
 
-    if (_minimumIntegerDigits < 1) {
-      exponent++;
-      mantissa /= 10;
+    var minIntDigits = _minimumIntegerDigits;
+    if (_maximumIntegerDigits > 1 &&
+        _maximumIntegerDigits > _minimumIntegerDigits) {
+      // A repeating range is defined; adjust to it as follows.
+      // If repeat == 3, we have 6,5,4=>3; 3,2,1=>0; 0,-1,-2=>-3;
+      // -3,-4,-5=>-6, etc. This takes into account that the
+      // exponent we have here is off by one from what we expect;
+      // it is for the format 0.MMMMMx10^n.
+      while ((exponent % _maximumIntegerDigits) != 0) {
+        mantissa *= 10;
+        exponent--;
+      }
+      minIntDigits = 1;
     } else {
-      exponent -= _minimumIntegerDigits - 1;
-      mantissa *= pow(10, _minimumIntegerDigits - 1);
+      // No repeating range is defined, use minimum integer digits.
+      if (_minimumIntegerDigits < 1) {
+        exponent++;
+        mantissa /= 10;
+      } else {
+        exponent -= _minimumIntegerDigits - 1;
+        mantissa *= pow(10, _minimumIntegerDigits - 1);
+      }
     }
-    _formatFixed(number);
+    _formatFixed(mantissa);
     _formatExponent(exponent);
   }
 
@@ -150,24 +257,45 @@
     _pad(_minimumExponentDigits, exponent.toString());
   }
 
+  /** Used to test if we have exceeded Javascript integer limits. */
+  final _maxInt = pow(2, 52);
+
   /**
    * Format the basic number portion, inluding the fractional digits.
    */
   void _formatFixed(num number) {
-    // Round the number.
+    // Very fussy math to get integer and fractional parts.
     var power = pow(10, _maximumFractionDigits);
-    var intValue = number.truncate();
-    var multiplied = (number * power).round();
-    var fracValue = (multiplied - intValue * power).floor();
+    var shiftedNumber = (number * power);
+    // We must not roundToDouble() an int or it will lose precision. We must not
+    // round() a large double or it will take its loss of precision and
+    // preserve it in an int, which we will then print to the right
+    // of the decimal place. Therefore, only roundToDouble if we are already
+    // a double.
+    if (shiftedNumber is double) {
+      shiftedNumber = shiftedNumber.roundToDouble();
+    }
+    var intValue, fracValue;
+    if (shiftedNumber.isInfinite) {
+      intValue = number.toInt();
+      fracValue = 0;
+    } else {
+      intValue = shiftedNumber.round() ~/ power;
+      fracValue = (shiftedNumber - intValue * power).floor();
+    }
     var fractionPresent = _minimumFractionDigits > 0 || fracValue > 0;
 
-    // On dartj2s the integer part may be large enough to be a floating
-    // point value, in which case we reduce it until it is small enough
-    // to be printed as an integer and pad the remainder with zeros.
+    // If the int part is larger than 2^52 and we're on Javascript (so it's
+    // really a float) it will lose precision, so pad out the rest of it
+    // with zeros. Check for Javascript by seeing if an integer is double.
     var paddingDigits = new StringBuffer();
-    while ((intValue & 0x7fffffff) != intValue) {
-      paddingDigits.write(symbols.ZERO_DIGIT);
-      intValue = intValue ~/ 10;
+    if (1 is double && intValue > _maxInt) {
+        var howManyDigitsTooBig = (log(intValue) / LN10).ceil() - 16;
+        var divisor = pow(10, howManyDigitsTooBig).round();
+        for (var each in new List(howManyDigitsTooBig.toInt())) {
+          paddingDigits.write(symbols.ZERO_DIGIT);
+        }
+        intValue = (intValue / divisor).truncate();
     }
     var integerDigits = "${intValue}${paddingDigits}".codeUnits;
     var digitLength = integerDigits.length;
@@ -193,7 +321,7 @@
   void _formatFractionPart(String fractionPart) {
     var fractionCodes = fractionPart.codeUnits;
     var fractionLength = fractionPart.length;
-    while (fractionPart[fractionLength - 1] == '0' &&
+    while(fractionCodes[fractionLength - 1] == _zero &&
            fractionLength > _minimumFractionDigits + 1) {
       fractionLength--;
     }
@@ -258,14 +386,14 @@
   }
 
   /** Returns the code point for the character '0'. */
-  int get _zero => '0'.codeUnits.first;
+  final _zero = '0'.codeUnits.first;
 
   /** Returns the code point for the locale's zero digit. */
   // Note that there is a slight risk of a locale's zero digit not fitting
   // into a single code unit, but it seems very unlikely, and if it did,
   // there's a pretty good chance that our assumptions about being able to do
   // arithmetic on it would also be invalid.
-  int get _localeZero => symbols.ZERO_DIGIT.codeUnits.first;
+  get _localeZero => symbols.ZERO_DIGIT.codeUnits.first;
 
   /**
    * Returns the prefix for [x] based on whether it's positive or negative.
@@ -282,4 +410,332 @@
   String _signSuffix(num x) {
     return x.isNegative ? _negativeSuffix : _positiveSuffix;
   }
+
+  void _setPattern(String newPattern) {
+    if (newPattern == null) return;
+    // Make spaces non-breaking
+    _pattern = newPattern.replaceAll(' ', '\u00a0');
+    var parser = new _NumberFormatParser(this, newPattern);
+    parser.parse();
+  }
+
+  String toString() => "NumberFormat($_locale, $_pattern)";
 }
+
+/**
+ * Private class that parses the numeric formatting pattern and sets the
+ * variables in [format] to appropriate values. Instances of this are
+ * transient and store parsing state in instance variables, so can only be used
+ * to parse a single pattern.
+ */
+class _NumberFormatParser {
+
+  /**
+   * The special characters in the pattern language. All others are treated
+   * as literals.
+   */
+  static const _PATTERN_SEPARATOR = ';';
+  static const _QUOTE = "'";
+  static const _PATTERN_DIGIT = '#';
+  static const _PATTERN_ZERO_DIGIT = '0';
+  static const _PATTERN_GROUPING_SEPARATOR = ',';
+  static const _PATTERN_DECIMAL_SEPARATOR = '.';
+  static const _PATTERN_CURRENCY_SIGN = '\u00A4';
+  static const _PATTERN_PER_MILLE = '\u2030';
+  static const _PATTERN_PERCENT = '%';
+  static const _PATTERN_EXPONENT = 'E';
+  static const _PATTERN_PLUS = '+';
+
+  /** The format whose state we are setting. */
+  final NumberFormat format;
+
+  /** The pattern we are parsing. */
+  final _StringIterator pattern;
+
+  /**
+   * Create a new [_NumberFormatParser] for a particular [NumberFormat] and
+   * [input] pattern.
+   */
+  _NumberFormatParser(this.format, input) : pattern = _iterator(input) {
+    pattern.moveNext();
+  }
+
+  /** The [NumberSymbols] for the locale in which our [format] prints. */
+  NumberSymbols get symbols => format.symbols;
+
+  /** Parse the input pattern and set the values. */
+  void parse() {
+    format._positivePrefix = _parseAffix();
+    var trunk = _parseTrunk();
+    format._positiveSuffix = _parseAffix();
+    // If we have separate positive and negative patterns, now parse the
+    // the negative version.
+    if (pattern.current == _NumberFormatParser._PATTERN_SEPARATOR) {
+      pattern.moveNext();
+      format._negativePrefix = _parseAffix();
+      // Skip over the negative trunk, verifying that it's identical to the
+      // positive trunk.
+      for (var each in _iterator(trunk)) {
+        if (pattern.current != each && pattern.current != null) {
+          throw new FormatException(
+              "Positive and negative trunks must be the same");
+        }
+        pattern.moveNext();
+      }
+      format._negativeSuffix = _parseAffix();
+    } else {
+      // If no negative affix is specified, they share the same positive affix.
+      format._negativePrefix = format._positivePrefix + format._negativePrefix;
+      format._negativeSuffix = format._negativeSuffix + format._positiveSuffix;
+    }
+  }
+
+  /** Variable used in parsing prefixes and suffixes to keep track of
+   * whether or not we are in a quoted region. */
+  bool inQuote = false;
+
+  /**
+   * Parse a prefix or suffix and return the prefix/suffix string. Note that
+   * this also may modify the state of [format].
+   */
+  String _parseAffix() {
+    var affix = new StringBuffer();
+    inQuote = false;
+    var loop = true;
+    while (loop) {
+      loop = parseCharacterAffix(affix) && pattern.moveNext();
+    }
+    return affix.toString();
+  }
+
+  /**
+   * Parse an individual character as part of a prefix or suffix.  Return true
+   * if we should continue to look for more affix characters, and false if
+   * we have reached the end.
+   */
+  bool parseCharacterAffix(StringBuffer affix) {
+    var ch = pattern.current;
+    if (ch == null) return false;
+    if (ch == _QUOTE) {
+      var nextChar = pattern.peek;
+      if (nextChar == _QUOTE) {
+        pattern.moveNext();
+        affix.write(_QUOTE); // 'don''t'
+      } else {
+        inQuote = !inQuote;
+      }
+      return true;
+    }
+
+    if (inQuote) {
+      affix.write(ch);
+    } else {
+      switch (ch) {
+        case _PATTERN_DIGIT:
+        case _PATTERN_ZERO_DIGIT:
+        case _PATTERN_GROUPING_SEPARATOR:
+        case _PATTERN_DECIMAL_SEPARATOR:
+        case _PATTERN_SEPARATOR:
+          return false;
+        case _PATTERN_CURRENCY_SIGN:
+          // TODO(alanknight): Handle the local/global/portable currency signs
+          affix.write(symbols.DEF_CURRENCY_CODE);
+          break;
+        case _PATTERN_PERCENT:
+          if (format._multiplier != 1) {
+            throw new FormatException('Too many percent/permill');
+          }
+          format._multiplier = 100;
+          affix.write(symbols.PERCENT);
+          break;
+        case _PATTERN_PER_MILLE:
+          if (format._multiplier != 1) {
+            throw new FormatException('Too many percent/permill');
+          }
+          format._multiplier = 1000;
+          affix.write(symbols.PERMILL);
+          break;
+        default:
+          affix.write(ch);
+      }
+    }
+    return true;
+  }
+
+  /** Variables used in [parseTrunk] and [parseTrunkCharacter]. */
+  var decimalPos;
+  var digitLeftCount;
+  var zeroDigitCount;
+  var digitRightCount;
+  var groupingCount;
+  var trunk;
+
+  /**
+   * Parse the "trunk" portion of the pattern, the piece that doesn't include
+   * positive or negative prefixes or suffixes.
+   */
+  String _parseTrunk() {
+    decimalPos = -1;
+    digitLeftCount = 0;
+    zeroDigitCount = 0;
+    digitRightCount = 0;
+    groupingCount = -1;
+
+    var loop = true;
+    trunk = new StringBuffer();
+    while (pattern.current != null && loop) {
+      loop = parseTrunkCharacter();
+    }
+
+    if (zeroDigitCount == 0 && digitLeftCount > 0 && decimalPos >= 0) {
+      // Handle '###.###' and '###.' and '.###'
+      var n = decimalPos;
+      if (n == 0) { // Handle '.###'
+        n++;
+      }
+      digitRightCount = digitLeftCount - n;
+      digitLeftCount = n - 1;
+      zeroDigitCount = 1;
+    }
+
+    // Do syntax checking on the digits.
+    if (decimalPos < 0 && digitRightCount > 0 ||
+        decimalPos >= 0 && (decimalPos < digitLeftCount ||
+            decimalPos > digitLeftCount + zeroDigitCount) ||
+            groupingCount == 0) {
+      throw new FormatException('Malformed pattern "${pattern.input}"');
+    }
+    var totalDigits = digitLeftCount + zeroDigitCount + digitRightCount;
+
+    format._maximumFractionDigits =
+        decimalPos >= 0 ? totalDigits - decimalPos : 0;
+    if (decimalPos >= 0) {
+      format._minimumFractionDigits =
+          digitLeftCount + zeroDigitCount - decimalPos;
+      if (format._minimumFractionDigits < 0) {
+        format._minimumFractionDigits = 0;
+      }
+    }
+
+    // The effectiveDecimalPos is the position the decimal is at or would be at
+    // if there is no decimal. Note that if decimalPos<0, then digitTotalCount
+    // == digitLeftCount + zeroDigitCount.
+    var effectiveDecimalPos = decimalPos >= 0 ? decimalPos : totalDigits;
+    format._minimumIntegerDigits = effectiveDecimalPos - digitLeftCount;
+    if (format._useExponentialNotation) {
+      format._maximumIntegerDigits =
+          digitLeftCount + format._minimumIntegerDigits;
+
+      // In exponential display, we need to at least show something.
+      if (format._maximumFractionDigits == 0 &&
+          format._minimumIntegerDigits == 0) {
+        format._minimumIntegerDigits = 1;
+      }
+    }
+
+    format._groupingSize = max(0, groupingCount);
+    format._decimalSeparatorAlwaysShown = decimalPos == 0 ||
+        decimalPos == totalDigits;
+
+    return trunk.toString();
+  }
+
+  /**
+   * Parse an individual character of the trunk. Return true if we should
+   * continue to look for additional trunk characters or false if we have
+   * reached the end.
+   */
+  bool parseTrunkCharacter() {
+    var ch = pattern.current;
+    switch (ch) {
+      case _PATTERN_DIGIT:
+        if (zeroDigitCount > 0) {
+          digitRightCount++;
+        } else {
+          digitLeftCount++;
+        }
+        if (groupingCount >= 0 && decimalPos < 0) {
+          groupingCount++;
+        }
+        break;
+      case _PATTERN_ZERO_DIGIT:
+        if (digitRightCount > 0) {
+          throw new FormatException('Unexpected "0" in pattern "'
+              + pattern.input + '"');
+        }
+        zeroDigitCount++;
+        if (groupingCount >= 0 && decimalPos < 0) {
+          groupingCount++;
+        }
+        break;
+      case _PATTERN_GROUPING_SEPARATOR:
+        groupingCount = 0;
+        break;
+      case _PATTERN_DECIMAL_SEPARATOR:
+        if (decimalPos >= 0) {
+          throw new FormatException(
+              'Multiple decimal separators in pattern "$pattern"');
+        }
+        decimalPos = digitLeftCount + zeroDigitCount + digitRightCount;
+        break;
+      case _PATTERN_EXPONENT:
+        trunk.write(ch);
+        if (format._useExponentialNotation) {
+          throw new FormatException(
+              'Multiple exponential symbols in pattern "$pattern"');
+        }
+        format._useExponentialNotation = true;
+        format._minimumExponentDigits = 0;
+
+        // exponent pattern can have a optional '+'.
+        pattern.moveNext();
+        var nextChar = pattern.current;
+        if (nextChar == _PATTERN_PLUS) {
+          trunk.write(pattern.current);
+          pattern.moveNext();
+          format._useSignForPositiveExponent = true;
+        }
+
+        // Use lookahead to parse out the exponential part
+        // of the pattern, then jump into phase 2.
+        while (pattern.current == _PATTERN_ZERO_DIGIT) {
+          trunk.write(pattern.current);
+          pattern.moveNext();
+          format._minimumExponentDigits++;
+        }
+
+        if ((digitLeftCount + zeroDigitCount) < 1 ||
+            format._minimumExponentDigits < 1) {
+          throw new FormatException(
+              'Malformed exponential pattern "$pattern"');
+        }
+        return false;
+      default:
+        return false;
+    }
+    trunk.write(ch);
+    pattern.moveNext();
+    return true;
+  }
+}
+
+/**
+ * Return an iterator on the string as a list of substrings.
+ */
+Iterator _iterator(String s) => new _StringIterator(s);
+
+/**
+ * Provides an iterator over a string as a list of substrings, and also
+ * gives us a lookahead of one via the [peek] method.
+ */
+class _StringIterator implements Iterator<String> {
+  String input;
+  var index = -1;
+  inBounds(i) => i >= 0 && i < input.length;
+  _StringIterator(this.input);
+  String get current => inBounds(index) ? input[index] : null;
+
+  bool moveNext() => inBounds(++index);
+  String get peek => inBounds(index + 1) ? input[index + 1] : null;
+  Iterator<String> get iterator => this;
+}
\ No newline at end of file
diff --git a/pkg/intl/lib/number_symbols.dart b/pkg/intl/lib/number_symbols.dart
index 6b2e616..f45cb2c 100644
--- a/pkg/intl/lib/number_symbols.dart
+++ b/pkg/intl/lib/number_symbols.dart
@@ -9,7 +9,6 @@
  * and infinity. We expect the data for instances to be generated out of ICU
  * or a similar reference source.
  */
-
 class NumberSymbols {
   final String NAME;
   final String DECIMAL_SEP, GROUP_SEP, PERCENT, ZERO_DIGIT, PLUS_SIGN,
diff --git a/pkg/intl/lib/number_symbols_data.dart b/pkg/intl/lib/number_symbols_data.dart
index 1c11791..bb6ea5d 100644
--- a/pkg/intl/lib/number_symbols_data.dart
+++ b/pkg/intl/lib/number_symbols_data.dart
@@ -36,24 +36,24 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4#,##0.00',
+      CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)',
       DEF_CURRENCY_CODE: 'ZAR'),
   /**
    * Number formatting symbols for locale am.
    */
   "am" : const NumberSymbols(
       NAME: "am",
-      DECIMAL_SEP: '\u066B',
-      GROUP_SEP: '\u066C',
-      PERCENT: '\u066A',
+      DECIMAL_SEP: '.',
+      GROUP_SEP: ',',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0627\u0633',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
-      DECIMAL_PATTERN: '000\u12AA\u1263',
+      DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)',
@@ -72,7 +72,7 @@
       EXP_SYMBOL: '\u0627\u0633',
       PERMILL: '\u0609',
       INFINITY: '\u221E',
-      NAN: '\u0644\u064A\u0633 \u0631\u0642\u0645',
+      NAN: '\u0644\u064A\u0633\u00A0\u0631\u0642\u0645',
       DECIMAL_PATTERN: '#0.###;#0.###-',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
@@ -89,7 +89,7 @@
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0627\u0633',
+      EXP_SYMBOL: 'E',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
@@ -112,7 +112,7 @@
       EXP_SYMBOL: 'E',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
-      NAN: '\u09B8\u0982\u0996\u09CD\u09AF\u09BE \u09A8\u09BE',
+      NAN: '\u09B8\u0982\u0996\u09CD\u09AF\u09BE\u00A0\u09A8\u09BE',
       DECIMAL_PATTERN: '#,##,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##,##0%',
@@ -136,7 +136,7 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
+      CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)',
       DEF_CURRENCY_CODE: 'EUR'),
   /**
    * Number formatting symbols for locale cs.
@@ -254,7 +254,7 @@
       INFINITY: '\u221E',
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
-      SCIENTIFIC_PATTERN: '#E0',
+      SCIENTIFIC_PATTERN: '[#E0]',
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'EUR'),
@@ -453,7 +453,7 @@
       PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
-      DECIMAL_PATTERN: '0000',
+      DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
@@ -476,7 +476,7 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
+      CURRENCY_PATTERN: '#0.00\u00A4;(#0.00\u00A4)',
       DEF_CURRENCY_CODE: 'EUR'),
   /**
    * Number formatting symbols for locale eu.
@@ -495,8 +495,8 @@
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
-      PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
+      PERCENT_PATTERN: '%\u00A0#,##0',
+      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4;(#,##0.00\u00A0\u00A4)',
       DEF_CURRENCY_CODE: 'EUR'),
   /**
    * Number formatting symbols for locale fa.
@@ -512,11 +512,11 @@
       EXP_SYMBOL: '\u00D7\u06F1\u06F0^',
       PERMILL: '\u0609',
       INFINITY: '\u221E',
-      NAN: 'NaN',
+      NAN: '\u0646\u0627\u0639\u062F\u062F',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4;\u2212#,##0.00\u00A0\u00A4',
+      CURRENCY_PATTERN: '\u200E\u00A4#,##0.00;\u200E(\u00A4#,##0.00)',
       DEF_CURRENCY_CODE: 'IRR'),
   /**
    * Number formatting symbols for locale fi.
@@ -553,10 +553,10 @@
       PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
-      DECIMAL_PATTERN: '0.0B',
+      DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00',
+      CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)',
       DEF_CURRENCY_CODE: 'PHP'),
   /**
    * Number formatting symbols for locale fr.
@@ -576,7 +576,7 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0\u00A0%',
-      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
+      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4;(#,##0.00\u00A0\u00A4)',
       DEF_CURRENCY_CODE: 'EUR'),
   /**
    * Number formatting symbols for locale fr_CA.
@@ -593,7 +593,7 @@
       PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
-      DECIMAL_PATTERN: '0.0B',
+      DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0\u00A0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4;(#,##0.00\u00A0\u00A4)',
@@ -616,7 +616,7 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
+      CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)',
       DEF_CURRENCY_CODE: 'EUR'),
   /**
    * Number formatting symbols for locale gsw.
@@ -643,20 +643,20 @@
    */
   "gu" : const NumberSymbols(
       NAME: "gu",
-      DECIMAL_SEP: '\u066B',
-      GROUP_SEP: '\u066C',
-      PERCENT: '\u066A',
+      DECIMAL_SEP: '.',
+      GROUP_SEP: ',',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0AAA\u0AC2\u0AB0\u0ACD\u0AB5',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
-      NAN: '\u0AB8\u0A82\u0A96\u0ACD\u0AAF\u0ABE \u0AA8\u0AA5\u0AC0\u0A82',
-      DECIMAL_PATTERN: '#,##,##0.###',
+      NAN: 'NaN',
+      DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
-      PERCENT_PATTERN: '#,##,##0%',
-      CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00',
+      PERCENT_PATTERN: '#,##0%',
+      CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)',
       DEF_CURRENCY_CODE: 'INR'),
   /**
    * Number formatting symbols for locale he.
@@ -705,15 +705,15 @@
       NAME: "hr",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
-      PERCENT: '\u066A',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0627\u0633',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
-      DECIMAL_PATTERN: '0000',
+      DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
@@ -745,15 +745,15 @@
       NAME: "id",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
-      PERCENT: '\u066A',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0627\u0633',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
-      DECIMAL_PATTERN: '0000',
+      DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
@@ -765,15 +765,15 @@
       NAME: "in",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
-      PERCENT: '\u066A',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0627\u0633',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
-      DECIMAL_PATTERN: '0000',
+      DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
@@ -788,15 +788,15 @@
       PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
-      MINUS_SIGN: '\u2212',
-      EXP_SYMBOL: '\u00D710^',
+      MINUS_SIGN: '-',
+      EXP_SYMBOL: 'E',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
-      NAN: 'EiTa',
+      NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
+      CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)',
       DEF_CURRENCY_CODE: 'ISK'),
   /**
    * Number formatting symbols for locale it.
@@ -809,7 +809,7 @@
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0627\u0633',
+      EXP_SYMBOL: 'E',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
@@ -845,14 +845,14 @@
       NAME: "ja",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
-      PERCENT: '\u066A',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0627\u0633',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
-      NAN: 'NaN\uFF08\u975E\u6570\uFF09',
+      NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
@@ -863,20 +863,20 @@
    */
   "kn" : const NumberSymbols(
       NAME: "kn",
-      DECIMAL_SEP: '\u066B',
-      GROUP_SEP: '\u066C',
-      PERCENT: '\u066A',
+      DECIMAL_SEP: '.',
+      GROUP_SEP: ',',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0CAA\u0CC2\u0CB0\u0CCD\u0CB5',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: '\u0C88',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
-      NAN: '\u0CB8\u0C82\u0C96\u0CCD\u0CAF\u0CC6\u0CAF\u0CB2\u0CCD\u0CB2',
-      DECIMAL_PATTERN: '#,##,##0.###',
+      NAN: 'NaN',
+      DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
-      PERCENT_PATTERN: '#,##,##0%',
-      CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00',
+      PERCENT_PATTERN: '#,##0%',
+      CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)',
       DEF_CURRENCY_CODE: 'INR'),
   /**
    * Number formatting symbols for locale ko.
@@ -896,7 +896,7 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4#,##0.00',
+      CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)',
       DEF_CURRENCY_CODE: 'KRW'),
   /**
    * Number formatting symbols for locale ln.
@@ -905,12 +905,12 @@
       NAME: "ln",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
-      PERCENT: '\u066A',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0627\u0633',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
@@ -923,19 +923,19 @@
    */
   "lt" : const NumberSymbols(
       NAME: "lt",
-      DECIMAL_SEP: '.',
-      GROUP_SEP: ',',
+      DECIMAL_SEP: ',',
+      GROUP_SEP: '\u00A0',
       PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
-      MINUS_SIGN: '\u2212',
-      EXP_SYMBOL: '\u00D710^',
+      MINUS_SIGN: '\u2013',
+      EXP_SYMBOL: 'E',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
-      NAN: '\u00A4\u00A4\u00A4',
+      NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
-      PERCENT_PATTERN: '#,##0\u00A0%',
+      PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'LTL'),
   /**
@@ -948,7 +948,7 @@
       PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
-      MINUS_SIGN: '\u2212',
+      MINUS_SIGN: '-',
       EXP_SYMBOL: 'E',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
@@ -956,7 +956,7 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
+      CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)',
       DEF_CURRENCY_CODE: 'LVL'),
   /**
    * Number formatting symbols for locale ml.
@@ -983,37 +983,37 @@
    */
   "mr" : const NumberSymbols(
       NAME: "mr",
-      DECIMAL_SEP: '\u066B',
-      GROUP_SEP: '\u066C',
-      PERCENT: '\u066A',
+      DECIMAL_SEP: '.',
+      GROUP_SEP: ',',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u092A\u0942',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
-      NAN: '\u0928\u093E\u0928',
-      DECIMAL_PATTERN: '#,##,##0.###',
+      NAN: 'NaN',
+      DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
-      PERCENT_PATTERN: '#,##,##0%',
-      CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00',
+      PERCENT_PATTERN: '#,##0%',
+      CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)',
       DEF_CURRENCY_CODE: 'INR'),
   /**
    * Number formatting symbols for locale ms.
    */
   "ms" : const NumberSymbols(
       NAME: "ms",
-      DECIMAL_SEP: '\u066B',
-      GROUP_SEP: '\u066C',
-      PERCENT: '\u066A',
+      DECIMAL_SEP: '.',
+      GROUP_SEP: ',',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0627\u0633',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
-      DECIMAL_PATTERN: '0.0B',
+      DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)',
@@ -1025,19 +1025,19 @@
       NAME: "mt",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
-      PERCENT: '\u066A',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0627\u0633',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
-      DEF_CURRENCY_CODE: 'MTL'),
+      DEF_CURRENCY_CODE: 'EUR'),
   /**
    * Number formatting symbols for locale nl.
    */
@@ -1085,12 +1085,12 @@
       NAME: "or",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
-      PERCENT: '\u066A',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0627\u0633',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##,##0.###',
@@ -1116,7 +1116,7 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
+      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4;(#,##0.00\u00A0\u00A4)',
       DEF_CURRENCY_CODE: 'PLN'),
   /**
    * Number formatting symbols for locale pt.
@@ -1173,7 +1173,7 @@
       PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
-      DECIMAL_PATTERN: '0000',
+      DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
@@ -1195,7 +1195,7 @@
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
-      PERCENT_PATTERN: '#,##0%',
+      PERCENT_PATTERN: '#,##0\u00A0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'RON'),
   /**
@@ -1212,7 +1212,7 @@
       EXP_SYMBOL: 'E',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
-      NAN: '\u043D\u0435 \u0447\u0438\u0441\u043B\u043E',
+      NAN: '\u043D\u0435\u00A0\u0447\u0438\u0441\u043B\u043E',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0\u00A0%',
@@ -1225,19 +1225,19 @@
       NAME: "sk",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
-      PERCENT: '\u066A',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0627\u0633',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
-      DECIMAL_PATTERN: '0.0\u00A0tis\'.\'',
+      DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0\u00A0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
-      DEF_CURRENCY_CODE: 'SKK'),
+      DEF_CURRENCY_CODE: 'EUR'),
   /**
    * Number formatting symbols for locale sl.
    */
@@ -1256,7 +1256,7 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
+      CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)',
       DEF_CURRENCY_CODE: 'EUR'),
   /**
    * Number formatting symbols for locale sq.
@@ -1264,13 +1264,13 @@
   "sq" : const NumberSymbols(
       NAME: "sq",
       DECIMAL_SEP: ',',
-      GROUP_SEP: '.',
-      PERCENT: '\u066A',
+      GROUP_SEP: '\u00A0',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0627\u0633',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
@@ -1323,20 +1323,20 @@
    */
   "sw" : const NumberSymbols(
       NAME: "sw",
-      DECIMAL_SEP: '\u066B',
-      GROUP_SEP: '\u066C',
-      PERCENT: '\u066A',
+      DECIMAL_SEP: '.',
+      GROUP_SEP: ',',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0627\u0633',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
-      DECIMAL_PATTERN: 'M0.0',
+      DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
+      CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)',
       DEF_CURRENCY_CODE: 'TZS'),
   /**
    * Number formatting symbols for locale ta.
@@ -1345,14 +1345,14 @@
       NAME: "ta",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
-      PERCENT: '\u066A',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0627\u0633',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
-      NAN: '\u0B8E\u0BA3\u0BCD \u0B87\u0BB2\u0BCD\u0BB2\u0BC8',
+      NAN: 'NaN',
       DECIMAL_PATTERN: '#,##,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##,##0%',
@@ -1363,20 +1363,20 @@
    */
   "te" : const NumberSymbols(
       NAME: "te",
-      DECIMAL_SEP: '\u066B',
-      GROUP_SEP: '\u066C',
-      PERCENT: '\u066A',
+      DECIMAL_SEP: '.',
+      GROUP_SEP: ',',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0C24\u0C42',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
-      DECIMAL_PATTERN: '#,##,##0.###',
+      DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
-      PERCENT_PATTERN: '#,##,##0%',
-      CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00',
+      PERCENT_PATTERN: '#,##0%',
+      CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)',
       DEF_CURRENCY_CODE: 'INR'),
   /**
    * Number formatting symbols for locale th.
@@ -1396,7 +1396,7 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4#,##0.00;\u00A4-#,##0.00',
+      CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)',
       DEF_CURRENCY_CODE: 'THB'),
   /**
    * Number formatting symbols for locale tl.
@@ -1413,10 +1413,10 @@
       PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
-      DECIMAL_PATTERN: '0.0B',
+      DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00',
+      CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)',
       DEF_CURRENCY_CODE: 'PHP'),
   /**
    * Number formatting symbols for locale tr.
@@ -1436,7 +1436,7 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '%#,##0',
-      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
+      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4;(#,##0.00\u00A0\u00A4)',
       DEF_CURRENCY_CODE: 'TRY'),
   /**
    * Number formatting symbols for locale uk.
@@ -1452,7 +1452,7 @@
       EXP_SYMBOL: '\u0415',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
-      NAN: '\u041D\u0435 \u0447\u0438\u0441\u043B\u043E',
+      NAN: '\u041D\u0435\u00A0\u0447\u0438\u0441\u043B\u043E',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
@@ -1505,18 +1505,18 @@
       NAME: "zh",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
-      PERCENT: '\u066A',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0627\u0633',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4#,##0.00',
+      CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)',
       DEF_CURRENCY_CODE: 'CNY'),
   /**
    * Number formatting symbols for locale zh_CN.
@@ -1525,18 +1525,18 @@
       NAME: "zh_CN",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
-      PERCENT: '\u066A',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0627\u0633',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4#,##0.00',
+      CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)',
       DEF_CURRENCY_CODE: 'CNY'),
   /**
    * Number formatting symbols for locale zh_HK.
@@ -1545,15 +1545,15 @@
       NAME: "zh_HK",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
-      PERCENT: '\u066A',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0627\u0633',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: '\u975E\u6578\u503C',
-      DECIMAL_PATTERN: '0000',
+      DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)',
@@ -1565,15 +1565,15 @@
       NAME: "zh_TW",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
-      PERCENT: '\u066A',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0627\u0633',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: '\u975E\u6578\u503C',
-      DECIMAL_PATTERN: '0000',
+      DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
@@ -1583,19 +1583,19 @@
    */
   "zu" : const NumberSymbols(
       NAME: "zu",
-      DECIMAL_SEP: ',',
-      GROUP_SEP: '\u00A0',
-      PERCENT: '\u066A',
+      DECIMAL_SEP: '.',
+      GROUP_SEP: ',',
+      PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0627\u0633',
-      PERMILL: '\u0609',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
       INFINITY: '\u221E',
-      NAN: 'NaN',
+      NAN: 'I-NaN',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4#,##0.00',
+      CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)',
       DEF_CURRENCY_CODE: 'ZAR')
 };
\ No newline at end of file
diff --git a/pkg/intl/test/date_time_format_file_even_test.dart b/pkg/intl/test/date_time_format_file_even_test.dart
index ca9daee..1fdebe5 100644
--- a/pkg/intl/test/date_time_format_file_even_test.dart
+++ b/pkg/intl/test/date_time_format_file_even_test.dart
@@ -9,9 +9,10 @@
  */
 
 library date_time_format_file_test_2;
-import 'date_time_format_file_test_stub.dart';
-import 'date_time_format_test_core.dart';
+import 'date_time_format_test_stub.dart';
+import 'data_directory.dart';
+import 'package:intl/date_symbol_data_file.dart';
 
 main() {
-  runWith(evenLocales);
+  runWith(evenLocales, dataDirectory, initializeDateFormatting);
 }
diff --git a/pkg/intl/test/date_time_format_file_odd_test.dart b/pkg/intl/test/date_time_format_file_odd_test.dart
index fbf05bd..acc9c4c 100644
--- a/pkg/intl/test/date_time_format_file_odd_test.dart
+++ b/pkg/intl/test/date_time_format_file_odd_test.dart
@@ -9,9 +9,10 @@
  */
 
 library date_time_format_file_test_1;
-import 'date_time_format_file_test_stub.dart';
-import 'date_time_format_test_core.dart';
+import 'date_time_format_test_stub.dart';
+import 'data_directory.dart';
+import 'package:intl/date_symbol_data_file.dart';
 
 main() {
-  runWith(oddLocales);
+  runWith(oddLocales, dataDirectory, initializeDateFormatting);
 }
diff --git a/pkg/intl/test/date_time_format_file_test_stub.dart b/pkg/intl/test/date_time_format_file_test_stub.dart
deleted file mode 100644
index e3868c8..0000000
--- a/pkg/intl/test/date_time_format_file_test_stub.dart
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * Tests date formatting and parsing using locale data read from the
- * local file system.
- */
-library date_time_format_file_test;
-
-import 'dart:async';
-import 'package:intl/intl.dart';
-import 'package:intl/date_symbol_data_file.dart';
-import 'dart:io';
-import 'date_time_format_test_core.dart';
-import 'data_directory.dart';
-import 'package:unittest/unittest.dart';
-
-runWith([Function getSubset]) {
-  // Initialize one locale just so we know what the list is.
-  test('Run all date formatting tests with locales from files', () {
-    initializeDateFormatting("en_US", dataDirectory).then(
-        expectAsync1((_) => runEverything(getSubset)));
-  });
-}
-
-void runEverything(Function getSubset) {
-  // Initialize all locales sequentially before running tests. Be sure not
-  // to do it in parallel or we can run into ulimit problems on fast machines.
-  var futureList = Future.forEach(DateFormat.allLocalesWithSymbols(),
-      (locale) => initializeDateFormatting(locale, dataDirectory));
-
-  test('Run all date formatting tests nested test', () {
-    futureList.then(
-        expectAsync1((results) => runDateTests(getSubset())));
-  });
-}
diff --git a/pkg/intl/test/date_time_format_http_request_test.dart b/pkg/intl/test/date_time_format_http_request_test.dart
index 65bc87b..d36ac2b 100644
--- a/pkg/intl/test/date_time_format_http_request_test.dart
+++ b/pkg/intl/test/date_time_format_http_request_test.dart
@@ -9,30 +9,15 @@
 
 library date_time_format_http_request_test;
 
-import 'dart:async';
-import 'package:intl/intl.dart';
-import 'package:intl/date_symbol_data_http_request.dart';
-import 'date_time_format_test_core.dart';
 import 'dart:html';
-import 'package:unittest/unittest.dart';
 import 'package:unittest/html_config.dart';
-
-var url = '';
+import 'package:intl/date_symbol_data_http_request.dart';
+import 'date_time_format_test_stub.dart';
 
 main() {
   useHtmlConfiguration();
-  url = "http://localhost:${window.location.port}/root_dart/pkg/intl/lib/src/data/dates/";
-  // Initialize one locale just so we know what the list is.
-  test('Run everything', () {
-    initializeDateFormatting("en_US", url).then(expectAsync1(runEverything));});
-}
+  var url = "http://localhost:${window.location.port}"
+    "/root_dart/pkg/intl/lib/src/data/dates/";
 
-void runEverything(_) {
-  // Initialize all locales and wait for them to finish before running tests.
-  var futures = DateFormat.allLocalesWithSymbols()
-      .map((locale) => initializeDateFormatting(locale, url))
-      .toList();
-  Future.wait(futures).then(expectAsync1((_) {
-      runDateTests(smallSetOfLocales());
-    }));
+  runWith(smallSetOfLocales, url, initializeDateFormatting);
 }
diff --git a/pkg/intl/test/date_time_format_local_even_test.dart b/pkg/intl/test/date_time_format_local_even_test.dart
index 3516cda..e21f01e 100644
--- a/pkg/intl/test/date_time_format_local_even_test.dart
+++ b/pkg/intl/test/date_time_format_local_even_test.dart
@@ -10,9 +10,9 @@
  */
 
 library date_time_format_test_2;
-import 'date_time_format_local_test_stub.dart';
-import 'date_time_format_test_core.dart';
+import 'date_time_format_test_stub.dart';
+import 'package:intl/date_symbol_data_local.dart';
 
 main() {
-  runWith(evenLocales);
+  runWith(evenLocales, null, initializeDateFormatting);
 }
diff --git a/pkg/intl/test/date_time_format_local_odd_test.dart b/pkg/intl/test/date_time_format_local_odd_test.dart
index ef55b44..229cbdb 100644
--- a/pkg/intl/test/date_time_format_local_odd_test.dart
+++ b/pkg/intl/test/date_time_format_local_odd_test.dart
@@ -10,9 +10,9 @@
  */
 
 library date_time_format_test_1;
-import 'date_time_format_local_test_stub.dart';
-import 'date_time_format_test_core.dart';
+import 'date_time_format_test_stub.dart';
+import 'package:intl/date_symbol_data_local.dart';
 
 main() {
-  runWith(oddLocales);
+  runWith(oddLocales, null, initializeDateFormatting);
 }
diff --git a/pkg/intl/test/date_time_format_local_test_stub.dart b/pkg/intl/test/date_time_format_local_test_stub.dart
deleted file mode 100644
index 1b9bfc2..0000000
--- a/pkg/intl/test/date_time_format_local_test_stub.dart
+++ /dev/null
@@ -1,32 +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.
-
-/**
- * Test date formatting and parsing using locale data which is available
- * directly in the program as a constant.
- */
-
-library date_time_format_test;
-
-import 'dart:async';
-import 'package:intl/intl.dart';
-import 'package:intl/date_time_patterns.dart';
-import 'package:intl/date_symbol_data_local.dart';
-import 'date_time_format_test_core.dart';
-
-runWith([Function getSubset]) {
-  // Initialize one locale just so we know what the list is.
-  // Also, note that we take the list of locales as a function so that we don't
-  // evaluate it until after we know that all the locales are available.
-  initializeDateFormatting("en_US",null).then(
-      (_) => runEverything(getSubset));
-}
-
-void runEverything(Function getSubset) {
-  // Initialize all locales and wait for them to finish before running tests.
-  var futures = DateFormat.allLocalesWithSymbols()
-      .map((locale) => initializeDateFormatting(locale, null))
-      .toList();
-  Future.wait(futures).then((results) => runDateTests(getSubset()));
-}
diff --git a/pkg/intl/test/date_time_format_test_core.dart b/pkg/intl/test/date_time_format_test_core.dart
index ff880f8..a4fb30d 100644
--- a/pkg/intl/test/date_time_format_test_core.dart
+++ b/pkg/intl/test/date_time_format_test_core.dart
@@ -171,35 +171,24 @@
 /** A shortcut for returning all the locales we have available.*/
 List<String> allLocales() => DateFormat.allLocalesWithSymbols();
 
-/**
- * Return only the odd-numbered locales. A simple way to divide the list into
- * two roughly equal parts.
- */
-List oddLocales() {
-  int i = 1;
-  return allLocales().where((x) => (i++).isOdd).toList();
-}
+Function _subsetFunc;
 
-/**
- * Return a set of a few locales to run just the tests on a small sample.
- */
-List smallSetOfLocales() {
-  return allLocales().sublist(0,10);
-}
+List<String> _subsetValue;
 
-/**
- * Return only the even-numbered locales. A simple way to divide the list into
- * two roughly equal parts.
- */
-List evenLocales() {
-  int i = 1;
-  return allLocales().where((x) => !((i++).isOdd)).toList();
+List<String> get subset {
+  if(_subsetValue == null) {
+    _subsetValue = _subsetFunc();
+  }
+  return _subsetValue;
 }
 
 // TODO(alanknight): Run specific tests for the en_ISO locale which isn't
 // included in CLDR, and check that our patterns for it are correct (they
 // very likely aren't).
-runDateTests([List<String> subset]) {
+void runDateTests(Function subsetFunc) {
+  assert(subsetFunc != null);
+  _subsetFunc = subsetFunc;
+
   test('Multiple patterns', () {
     var date = new DateTime.now();
     var multiple1 = new DateFormat.yMd().add_jms();
@@ -244,8 +233,7 @@
   test('Test round-trip parsing of dates', () {
     var hours = [0, 1, 11, 12, 13, 23];
     var months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
-    var locales = subset == null ? allLocales() : subset;
-    for (var locale in locales) {
+    for (var locale in subset) {
       for (var month in months) {
         var aDate = new DateTime(2012, month, 27, 13, 58, 59, 012);
         testRoundTripParsing(locale, aDate);
diff --git a/pkg/intl/test/date_time_format_test_stub.dart b/pkg/intl/test/date_time_format_test_stub.dart
new file mode 100644
index 0000000..1aa1577
--- /dev/null
+++ b/pkg/intl/test/date_time_format_test_stub.dart
@@ -0,0 +1,70 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Test date formatting and parsing using locale data which is available
+ * directly in the program as a constant.
+ */
+
+library date_time_format_test;
+
+import 'dart:async';
+import 'package:unittest/unittest.dart';
+import 'package:intl/intl.dart';
+import 'date_time_format_test_core.dart';
+
+typedef List<String> TestListFunc();
+
+typedef Future InitializeDateFormattingFunc(String locale, String filePath);
+
+/**
+ * Return only the odd-numbered locales. A simple way to divide the list into
+ * two roughly equal parts.
+ */
+List<String> oddLocales() {
+  int i = 1;
+  return allLocales().where((x) => (i++).isOdd).toList();
+}
+
+/**
+ * Return a set of a few locales to run just the tests on a small sample.
+ */
+List smallSetOfLocales() {
+  return allLocales().sublist(0,10);
+}
+
+/**
+ * Return only the even-numbered locales. A simple way to divide the list into
+ * two roughly equal parts.
+ */
+List<String> evenLocales() {
+  int i = 1;
+  return allLocales().where((x) => !((i++).isOdd)).toList();
+}
+
+void runWith(TestListFunc getSubset, String dir,
+             InitializeDateFormattingFunc initFunction) {
+  // Initialize one locale just so we know what the list is.
+  // Also, note that we take the list of locales as a function so that we don't
+  // evaluate it until after we know that all the locales are available.
+
+  bool initialized = false;
+
+  setUp(() {
+    if(initialized) {
+      return;
+    }
+    return initFunction("en_US", dir)
+        .then((_) {
+          return Future.forEach(DateFormat.allLocalesWithSymbols(), (locale) {
+            return initFunction(locale, dir);
+          });
+        })
+        .then((_) {
+          initialized = true;
+        });
+  });
+
+  runDateTests(getSubset);
+}
diff --git a/pkg/intl/test/date_time_format_uninitialized_test.dart b/pkg/intl/test/date_time_format_uninitialized_test.dart
index dcd97cd..d460c47 100644
--- a/pkg/intl/test/date_time_format_uninitialized_test.dart
+++ b/pkg/intl/test/date_time_format_uninitialized_test.dart
@@ -8,11 +8,8 @@
  */
 library date_time_format_file_test;
 
-import 'package:intl/intl.dart';
-import 'package:intl/date_symbol_data_local.dart';
 import 'date_time_format_test_core.dart';
-import 'package:unittest/unittest.dart';
 
 main() {
-  runDateTests(['en_US']);
+  runDateTests(() => ['en_US']);
 }
diff --git a/pkg/intl/test/number_closure_test.dart b/pkg/intl/test/number_closure_test.dart
new file mode 100644
index 0000000..8574e08
--- /dev/null
+++ b/pkg/intl/test/number_closure_test.dart
@@ -0,0 +1,388 @@
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Tests based on the closure number formatting tests.
+ */
+library number_closure_test;
+
+import "package:intl/intl.dart";
+import "package:unittest/unittest.dart";
+
+main() {
+  test("testVeryBigNumber", testVeryBigNumber);
+  test("testStandardFormat", testStandardFormat);
+  test("testNegativePercentage", testNegativePercentage);
+  test("testCustomPercentage", testCustomPercentage);
+  test("testBasicFormat", testBasicFormat);
+  test("testGrouping", testGrouping);
+  test("testPerMill", testPerMill);
+  test("testQuotes", testQuotes);
+  test("testZeros", testZeros);
+  test("testExponential", testExponential);
+  test("testPlusSignInExponentPart", testPlusSignInExponentPart);
+  test("testApis", testApis);
+  test("testLocaleSwitch", testLocaleSwitch);
+}
+
+/**
+ * Test two large numbers for equality, assuming that there may be some
+ * loss of precision in the less significant digits.
+ */
+veryBigNumberCompare(str1, str2) {
+  return str1.length == str2.length &&
+         str1.substring(0, 8) == str2.substring(0, 8);
+}
+
+testVeryBigNumber() {
+  var str;
+  var fmt;
+
+  fmt = new NumberFormat.decimalPattern();
+  str = fmt.format(1.3456E20);
+  expect(veryBigNumberCompare('134,559,999,999,999,000,000', str), isTrue);
+
+  fmt = new NumberFormat.percentPattern();
+  str = fmt.format(1.3456E20);
+  expect(veryBigNumberCompare('13,456,000,000,000,000,000,000%', str), isTrue);
+
+  // TODO(alanknight): Note that this disagrees with what ICU would print
+  // for this. We need significant digit support to do this properly.
+  fmt = new NumberFormat.scientificPattern();
+  str = fmt.format(1.3456E20);
+  expect('1E20', str);
+
+  fmt = new NumberFormat.decimalPattern();
+  str = fmt.format(-1.234567890123456e306);
+  expect(1 + 1 + 306 + 306 / 3, str.length);
+  expect('-1,234,567,890,123,45', str.substring(0, 21));
+
+  str = fmt.format(1 / 0);
+  expect('∞', str);
+  str = fmt.format(-1 / 0);
+  expect('-∞', str);
+}
+
+void testStandardFormat() {
+  var str;
+  var fmt;
+  fmt = new NumberFormat.decimalPattern();
+  str = fmt.format(1234.579);
+  expect('1,234.579', str);
+  fmt = new NumberFormat.percentPattern();
+  str = fmt.format(1234.579);
+  expect('123,458%', str);
+  fmt = new NumberFormat.scientificPattern();
+  str = fmt.format(1234.579);
+  expect('1E3', str);
+}
+
+void testNegativePercentage() {
+  var str;
+  var fmt = new NumberFormat('#,##0.00%');
+  str = fmt.format(-1234.56);
+  expect('-123,456.00%', str);
+
+  fmt = new NumberFormat.percentPattern();
+  str = fmt.format(-1234.579);
+  expect('-123,458%', str);
+}
+
+void testCustomPercentage() {
+  var fmt = new NumberFormat.percentPattern();
+  fmt.setMaximumFractionDigits(1);
+  fmt.setMinimumFractionDigits(1);
+  var str = fmt.format(0.1291);
+  expect('12.9%', str);
+  fmt.setMaximumFractionDigits(2);
+  fmt.setMinimumFractionDigits(1);
+  str = fmt.format(0.129);
+  expect('12.9%', str);
+  fmt.setMaximumFractionDigits(2);
+  fmt.setMinimumFractionDigits(1);
+  str = fmt.format(0.12);
+  expect('12.0%', str);
+  fmt.setMaximumFractionDigits(2);
+  fmt.setMinimumFractionDigits(1);
+  str = fmt.format(0.12911);
+  expect('12.91%', str);
+}
+
+void testBasicFormat() {
+  var fmt = new NumberFormat('0.0000');
+  var str = fmt.format(123.45789179565757);
+  expect('123.4579', str);
+}
+
+void testGrouping() {
+  var str;
+
+  var fmt = new NumberFormat('#,###');
+  str = fmt.format(1234567890);
+  expect('1,234,567,890', str);
+  fmt = new NumberFormat('#,####');
+  str = fmt.format(1234567890);
+  expect('12,3456,7890', str);
+
+  fmt = new NumberFormat('#');
+  str = fmt.format(1234567890);
+  expect('1234567890', str);
+}
+
+void testPerMill() {
+  var str;
+
+  var fmt = new NumberFormat('###.###\u2030');
+  str = fmt.format(0.4857);
+  expect('485.7\u2030', str);
+}
+
+void testQuotes() {
+  var str;
+
+  var fmt = new NumberFormat('a\'fo\'\'o\'b#');
+  str = fmt.format(123);
+  expect('afo\'ob123', str);
+
+  fmt = new NumberFormat('a\'\'b#');
+  str = fmt.format(123);
+  expect('a\'b123', str);
+
+  fmt = new NumberFormat('a\'fo\'\'o\'b#');
+  str = fmt.format(-123);
+  expect('afo\'ob-123', str);
+
+  fmt = new NumberFormat('a\'\'b#');
+  str = fmt.format(-123);
+  expect('a\'b-123', str);
+}
+
+void testZeros() {
+  var str;
+  var fmt;
+
+  fmt = new NumberFormat('#.#');
+  str = fmt.format(0);
+  expect('0', str);
+  fmt = new NumberFormat('#.');
+  str = fmt.format(0);
+  expect('0.', str);
+  fmt = new NumberFormat('.#');
+  str = fmt.format(0);
+  expect('.0', str);
+  fmt = new NumberFormat('#');
+  str = fmt.format(0);
+  expect('0', str);
+
+  fmt = new NumberFormat('#0.#');
+  str = fmt.format(0);
+  expect('0', str);
+  fmt = new NumberFormat('#0.');
+  str = fmt.format(0);
+  expect('0.', str);
+  fmt = new NumberFormat('#.0');
+  str = fmt.format(0);
+  expect('.0', str);
+  fmt = new NumberFormat('#');
+  str = fmt.format(0);
+  expect('0', str);
+  fmt = new NumberFormat('000');
+  str = fmt.format(0);
+  expect('000', str);
+}
+
+void testExponential() {
+  var str;
+  var fmt;
+
+  fmt = new NumberFormat('0.####E0');
+  str = fmt.format(0.01234);
+  expect('1.234E-2', str);
+  fmt = new NumberFormat('00.000E00');
+  str = fmt.format(0.01234);
+  expect('12.340E-03', str);
+  fmt = new NumberFormat('##0.######E000');
+  str = fmt.format(0.01234);
+  expect('12.34E-003', str);
+  fmt = new NumberFormat('0.###E0;[0.###E0]');
+  str = fmt.format(0.01234);
+  expect('1.234E-2', str);
+
+  fmt = new NumberFormat('0.####E0');
+  str = fmt.format(123456789);
+  expect('1.2346E8', str);
+  fmt = new NumberFormat('00.000E00');
+  str = fmt.format(123456789);
+  expect('12.346E07', str);
+  fmt = new NumberFormat('##0.######E000');
+  str = fmt.format(123456789);
+  expect('123.456789E006', str);
+  fmt = new NumberFormat('0.###E0;[0.###E0]');
+  str = fmt.format(123456789);
+  expect('1.235E8', str);
+
+  fmt = new NumberFormat('0.####E0');
+  str = fmt.format(1.23e300);
+  expect('1.23E300', str);
+  fmt = new NumberFormat('00.000E00');
+  str = fmt.format(1.23e300);
+  expect('12.300E299', str);
+  fmt = new NumberFormat('##0.######E000');
+  str = fmt.format(1.23e300);
+  expect('1.23E300', str);
+  fmt = new NumberFormat('0.###E0;[0.###E0]');
+  str = fmt.format(1.23e300);
+  expect('1.23E300', str);
+
+  fmt = new NumberFormat('0.####E0');
+  str = fmt.format(-3.141592653e-271);
+  expect('-3.1416E-271', str);
+  fmt = new NumberFormat('00.000E00');
+  str = fmt.format(-3.141592653e-271);
+  expect('-31.416E-272', str);
+  fmt = new NumberFormat('##0.######E000');
+  str = fmt.format(-3.141592653e-271);
+  expect('-314.159265E-273', str);
+  fmt = new NumberFormat('0.###E0;[0.###E0]');
+  str = fmt.format(-3.141592653e-271);
+  expect('[3.142E-271]', str);
+
+  fmt = new NumberFormat('0.####E0');
+  str = fmt.format(0);
+  expect('0E0', str);
+  fmt = new NumberFormat('00.000E00');
+  str = fmt.format(0);
+  expect('00.000E00', str);
+  fmt = new NumberFormat('##0.######E000');
+  str = fmt.format(0);
+  expect('0E000', str);
+  fmt = new NumberFormat('0.###E0;[0.###E0]');
+  str = fmt.format(0);
+  expect('0E0', str);
+
+  fmt = new NumberFormat('0.####E0');
+  str = fmt.format(-1);
+  expect('-1E0', str);
+  fmt = new NumberFormat('00.000E00');
+  str = fmt.format(-1);
+  expect('-10.000E-01', str);
+  fmt = new NumberFormat('##0.######E000');
+  str = fmt.format(-1);
+  expect('-1E000', str);
+  fmt = new NumberFormat('0.###E0;[0.###E0]');
+  str = fmt.format(-1);
+  expect('[1E0]', str);
+
+  fmt = new NumberFormat('0.####E0');
+  str = fmt.format(1);
+  expect('1E0', str);
+  fmt = new NumberFormat('00.000E00');
+  str = fmt.format(1);
+  expect('10.000E-01', str);
+  fmt = new NumberFormat('##0.######E000');
+  str = fmt.format(1);
+  expect('1E000', str);
+  fmt = new NumberFormat('0.###E0;[0.###E0]');
+  str = fmt.format(1);
+  expect('1E0', str);
+
+  fmt = new NumberFormat('#E0');
+  str = fmt.format(12345.0);
+  expect('1E4', str);
+  fmt = new NumberFormat('0E0');
+  str = fmt.format(12345.0);
+  expect('1E4', str);
+  fmt = new NumberFormat('##0.###E0');
+  str = fmt.format(12345.0);
+  expect('12.345E3', str);
+  fmt = new NumberFormat('##0.###E0');
+  str = fmt.format(12345.00001);
+  expect('12.345E3', str);
+  fmt = new NumberFormat('##0.###E0');
+  str = fmt.format(12345);
+  expect('12.345E3', str);
+
+  fmt = new NumberFormat('##0.####E0');
+  str = fmt.format(789.12345e-9);
+  fmt = new NumberFormat('##0.####E0');
+  str = fmt.format(780e-9);
+  expect('780E-9', str);
+  fmt = new NumberFormat('.###E0');
+  str = fmt.format(45678.0);
+  expect('.457E5', str);
+  fmt = new NumberFormat('.###E0');
+  str = fmt.format(0);
+  expect('.0E0', str);
+
+  fmt = new NumberFormat('#E0');
+  str = fmt.format(45678000);
+  expect('5E7', str);
+  fmt = new NumberFormat('##E0');
+  str = fmt.format(45678000);
+  expect('46E6', str);
+  fmt = new NumberFormat('####E0');
+  str = fmt.format(45678000);
+  expect('4568E4', str);
+  fmt = new NumberFormat('0E0');
+  str = fmt.format(45678000);
+  expect('5E7', str);
+  fmt = new NumberFormat('00E0');
+  str = fmt.format(45678000);
+  expect('46E6', str);
+  fmt = new NumberFormat('000E0');
+  str = fmt.format(45678000);
+  expect('457E5', str);
+  fmt = new NumberFormat('###E0');
+  str = fmt.format(0.0000123);
+  expect('12E-6', str);
+  fmt = new NumberFormat('###E0');
+  str = fmt.format(0.000123);
+  expect('123E-6', str);
+  fmt = new NumberFormat('###E0');
+  str = fmt.format(0.00123);
+  expect('1E-3', str);
+  fmt = new NumberFormat('###E0');
+  str = fmt.format(0.0123);
+  expect('12E-3', str);
+  fmt = new NumberFormat('###E0');
+  str = fmt.format(0.123);
+  expect('123E-3', str);
+  fmt = new NumberFormat('###E0');
+  str = fmt.format(1.23);
+  expect('1E0', str);
+  fmt = new NumberFormat('###E0');
+  str = fmt.format(12.3);
+  expect('12E0', str);
+  fmt = new NumberFormat('###E0');
+  str = fmt.format(123.0);
+  expect('123E0', str);
+  fmt = new NumberFormat('###E0');
+  str = fmt.format(1230.0);
+  expect('1E3', str);
+}
+
+void testPlusSignInExponentPart() {
+  var fmt;
+  fmt = new NumberFormat('0E+0');
+  var str = fmt.format(45678000);
+  expect('5E+7', str);
+}
+
+void testApis() {
+  var fmt;
+  var str;
+
+  fmt = new NumberFormat('#,###');
+  str = fmt.format(1234567890);
+  expect('1,234,567,890', str);
+}
+
+testLocaleSwitch() {
+  Intl.withLocale("fr", verifyFrenchLocale);
+}
+
+void verifyFrenchLocale() {
+  var fmt = new NumberFormat('#,###');
+  var str = fmt.format(1234567890);
+  expect('1\u00a0234\u00a0567\u00a0890', str);
+}
diff --git a/pkg/intl/test/number_format_test.dart b/pkg/intl/test/number_format_test.dart
index 048d6ad..2306470 100644
--- a/pkg/intl/test/number_format_test.dart
+++ b/pkg/intl/test/number_format_test.dart
@@ -7,13 +7,16 @@
 library number_format_test;
 
 import 'package:unittest/unittest.dart';
-import 'package:intl/number_format.dart';
+import 'package:intl/number_symbols.dart';
+import 'package:intl/number_symbols_data.dart';
 import 'package:intl/intl.dart';
+import 'number_test_data.dart';
+import 'dart:math';
 
 /**
  * Tests the Numeric formatting library in dart.
  */
-var testNumbers = const {
+var testNumbers = {
   "0.001":  0.001,
   "0.01": 0.01,
   "0.1": 0.1,
@@ -23,21 +26,59 @@
   "100": 100,
   "1,000": 1000,
   "2,000,000,000,000": 2000000000000,
-  "10,000,000,000,000,000,000,000,000,000,000":
-      10000000000000000000000000000000,
   "0.123": 0.123,
   "1,234": 1234.0,
   "1.234": 1.234,
   "1.23": 1.230,
-  "NaN": 0/0,
-  "∞": 1/0,
-  "-∞": -1/0};
+  "NaN": double.NAN,
+  "∞": double.INFINITY,
+  "-∞": double.NEGATIVE_INFINITY,
+  "3.142": PI};
+
+var testExponential = const {
+  "1E-3" : 0.001,
+  "1E-2": 0.01,
+  "1.23E0" : 1.23
+  };
+
+// TODO(alanknight): Test against currency, which requires generating data
+// for the three different forms that this now supports.
+// TODO(alanknight): Test against scientific, which requires significant
+// digit support.
+List<NumberFormat> standardFormats(String locale) {
+  return [
+          new NumberFormat.decimalPattern(locale),
+          new NumberFormat.percentPattern(locale)
+          ];
+}
+
+inJavaScript() => 1 is double;
 
 main() {
-  test('Basic number printing', () {
-    var number = new NumberFormat();
-    expect(number.format(3.14),"3.14");
-  });
+  if (!inJavaScript()) {
+    testNumbers["10,000,000,000,000,000,000,000,000,000,000"] =
+        10000000000000000000000000000000;
+  }
+
+  // For data from a list of locales, run each locale's data as a separate
+  // test so we can see exactly which ones pass or fail.
+  var mainList = numberTestData;
+  var sortedLocales = new List.from(numberFormatSymbols.keys);
+  sortedLocales.sort((a, b) => a.compareTo(b));
+  for (var locale in sortedLocales) {
+    var testFormats = standardFormats(locale);
+    var list = mainList.take(testFormats.length + 1).iterator;
+    mainList = mainList.skip(testFormats.length + 1);
+    var nextLocaleFromList = (list..moveNext()).current;
+    test("Test against ICU data for $locale", () {
+      expect(locale, nextLocaleFromList);
+      for (var format in testFormats) {
+        var formatted = format.format(123);
+        var expected = (list..moveNext()).current;
+        expect(formatted, expected);
+      }
+    });
+  }
 
   test('Simple set of numbers', () {
     var number = new NumberFormat();
@@ -46,4 +87,12 @@
       expect(formatted, x);
     }
   });
-}
+
+  test('Exponential form', () {
+    var number = new NumberFormat("#.###E0");
+    for (var x in testExponential.keys) {
+      var formatted = number.format(testExponential[x]);
+      expect(formatted, x);
+    }
+  });
+}
\ No newline at end of file
diff --git a/pkg/intl/test/number_test_data.dart b/pkg/intl/test/number_test_data.dart
new file mode 100644
index 0000000..4d780bf
--- /dev/null
+++ b/pkg/intl/test/number_test_data.dart
@@ -0,0 +1,252 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Test data for numeric formatting from a large set of locales.
+ *
+ * DO NOT EDIT. This file is autogenerated from ICU data.
+ * File generated from CLDR ver. 22.1
+ */
+
+library number_test_data;
+
+var numberTestData = const [
+    "af",
+    r"123",
+    r"12 300%",
+    "am",
+    r"123",
+    r"12,300%",
+    "ar",
+    r"١٢٣",
+    r"١٢٬٣٠٠٪",
+    "bg",
+    r"123",
+    r"12 300%",
+    "bn",
+    r"১২৩",
+    r"১২,৩০০%",
+    "ca",
+    r"123",
+    r"12.300%",
+    "cs",
+    r"123",
+    r"12 300 %",
+    "da",
+    r"123",
+    r"12.300 %",
+    "de",
+    r"123",
+    r"12.300 %",
+    "de_AT",
+    r"123",
+    r"12.300 %",
+    "de_CH",
+    r"123",
+    r"12'300 %",
+    "el",
+    r"123",
+    r"12.300%",
+    "en",
+    r"123",
+    r"12,300%",
+    "en_AU",
+    r"123",
+    r"12,300%",
+    "en_GB",
+    r"123",
+    r"12,300%",
+    "en_IE",
+    r"123",
+    r"12,300%",
+    "en_IN",
+    r"123",
+    r"12,300%",
+    "en_SG",
+    r"123",
+    r"12,300%",
+    "en_US",
+    r"123",
+    r"12,300%",
+    "en_ZA",
+    r"123",
+    r"12 300%",
+    "es",
+    r"123",
+    r"12.300%",
+    "es_419",
+    r"123",
+    r"12,300%",
+    "et",
+    r"123",
+    r"12 300%",
+    "eu",
+    r"123",
+    r"% 12.300",
+    "fa",
+    r"۱۲۳",
+    r"۱۲٬۳۰۰٪",
+    "fi",
+    r"123",
+    r"12 300 %",
+    "fil",
+    r"123",
+    r"12,300%",
+    "fr",
+    r"123",
+    r"12 300 %",
+    "fr_CA",
+    r"123",
+    r"12 300 %",
+    "gl",
+    r"123",
+    r"12.300%",
+    "gsw",
+    r"123",
+    r"12’300 %",
+    "gu",
+    r"123",
+    r"12,300%",
+    "he",
+    r"123",
+    r"12,300%",
+    "hi",
+    r"123",
+    r"12,300%",
+    "hr",
+    r"123",
+    r"12.300%",
+    "hu",
+    r"123",
+    r"12 300%",
+    "id",
+    r"123",
+    r"12.300%",
+    "in",
+    r"123",
+    r"12.300%",
+    "is",
+    r"123",
+    r"12.300%",
+    "it",
+    r"123",
+    r"12.300%",
+    "iw",
+    r"123",
+    r"12,300%",
+    "ja",
+    r"123",
+    r"12,300%",
+    "kn",
+    r"123",
+    r"12,300%",
+    "ko",
+    r"123",
+    r"12,300%",
+    "ln",
+    r"123",
+    r"12.300%",
+    "lt",
+    r"123",
+    r"12 300%",
+    "lv",
+    r"123",
+    r"12 300%",
+    "ml",
+    r"123",
+    r"12,300%",
+    "mr",
+    r"123",
+    r"12,300%",
+    "ms",
+    r"123",
+    r"12,300%",
+    "mt",
+    r"123",
+    r"12,300%",
+    "nl",
+    r"123",
+    r"12.300%",
+    "no",
+    r"123",
+    r"12 300 %",
+    "or",
+    r"123",
+    r"12,300%",
+    "pl",
+    r"123",
+    r"12 300%",
+    "pt",
+    r"123",
+    r"12.300%",
+    "pt_BR",
+    r"123",
+    r"12.300%",
+    "pt_PT",
+    r"123",
+    r"12 300%",
+    "ro",
+    r"123",
+    r"12.300 %",
+    "ru",
+    r"123",
+    r"12 300 %",
+    "sk",
+    r"123",
+    r"12 300 %",
+    "sl",
+    r"123",
+    r"12.300%",
+    "sq",
+    r"123",
+    r"12 300%",
+    "sr",
+    r"123",
+    r"12.300%",
+    "sv",
+    r"123",
+    r"12 300 %",
+    "sw",
+    r"123",
+    r"12,300%",
+    "ta",
+    r"123",
+    r"12,300%",
+    "te",
+    r"123",
+    r"12,300%",
+    "th",
+    r"123",
+    r"12,300%",
+    "tl",
+    r"123",
+    r"12,300%",
+    "tr",
+    r"123",
+    r"%12.300",
+    "uk",
+    r"123",
+    r"12 300%",
+    "ur",
+    r"123",
+    r"12,300%",
+    "vi",
+    r"123",
+    r"12.300%",
+    "zh",
+    r"123",
+    r"12,300%",
+    "zh_CN",
+    r"123",
+    r"12,300%",
+    "zh_HK",
+    r"123",
+    r"12,300%",
+    "zh_TW",
+    r"123",
+    r"12,300%",
+    "zu",
+    r"123",
+    r"12,300%",
+    "END"];
\ No newline at end of file
diff --git a/pkg/oauth2/lib/src/client.dart b/pkg/oauth2/lib/src/client.dart
index afb59e4..0d422af 100644
--- a/pkg/oauth2/lib/src/client.dart
+++ b/pkg/oauth2/lib/src/client.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library client;
+library oauth2_client;
 
 import 'dart:async';
 import 'dart:uri';
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 96f05ef..0c0512c 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -12,7 +12,7 @@
 # Skip non-test files ending with "_test".
 scheduled_test/lib/*: Skip
 
-scheduled_test/test/scheduled_server_test: Pass, Fail, Slow # Issue 9231, 9582
+scheduled_test/test/scheduled_server_test: Pass, Fail, Slow, Crash # Issue 9231, 9582
 scheduled_test/test/scheduled_process_test: Pass, Slow # Issue 9231
 
 # WebDriver tests have 3rd party dependencies (we need to run
@@ -20,11 +20,10 @@
 # testing.
 webdriver/test/webdriver_test: Skip
 
-[$compiler == none && $runtime == vm]
-intl/test/date_time_format_file_even_test: Pass, Crash # Issue 9342
-intl/test/date_time_format_file_odd_test: Pass, Crash # Issue 9342
-intl/test/date_time_format_local_even_test: Pass, Crash # Issue 9342
-intl/test/date_time_format_local_odd_test: Pass, Crash # Issue 9342
+
+[ $compiler == dart2js && $runtime == drt ]
+unittest/test/unittest_test: Pass, Fail, Crash # Bug in v8, http://dartbug.com/9407
+
 
 [$compiler == dart2dart]
 *: Skip
@@ -76,7 +75,7 @@
 intl/test/date_time_format_http_request_test: Skip # Timeout.
 
 [ $runtime == ie9 ]
-intl/test/date_time_format_http_request_test: Fail # Issue 8983
+intl/test/date_time_format_http_request_test: Skip # Issue 8983
 
 [ $runtime == safari ]
 fixnum/test/int_64_test: Pass, Fail # Bug in JSC.
@@ -90,11 +89,6 @@
 intl/test/find_default_locale_standalone_test: Fail # Issue 8110
 intl/test/message_extraction/message_extraction_test: Fail # Issue 9167
 
-# Skip http request tests on Dartium while resolving an odd
-# error there that causes the tests to timeout.
-[ $runtime == dartium || $runtime == drt ]
-intl/test/date_time_format_http_request_test: Skip
-
 [ $compiler == dart2js ]
 # Skip intl_message tests that use mirrors on dart2js until it's been
 # implemented there.
diff --git a/pkg/scheduled_test/lib/descriptor.dart b/pkg/scheduled_test/lib/descriptor.dart
index ecb89f3..1b2b988 100644
--- a/pkg/scheduled_test/lib/descriptor.dart
+++ b/pkg/scheduled_test/lib/descriptor.dart
@@ -60,7 +60,7 @@
 ///
 ///       // ...
 ///     }
-library descriptor;
+library scheduled_test.descriptor;
 
 import 'dart:async';
 
diff --git a/pkg/scheduled_test/lib/scheduled_process.dart b/pkg/scheduled_test/lib/scheduled_process.dart
index 57af0b6..cf37211 100644
--- a/pkg/scheduled_test/lib/scheduled_process.dart
+++ b/pkg/scheduled_test/lib/scheduled_process.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library scheduled_process;
+library scheduled_test.scheduled_process;
 
 import 'dart:async';
 import 'dart:io';
diff --git a/pkg/scheduled_test/lib/scheduled_server.dart b/pkg/scheduled_test/lib/scheduled_server.dart
index 88d9807..1ad8ac2 100644
--- a/pkg/scheduled_test/lib/scheduled_server.dart
+++ b/pkg/scheduled_test/lib/scheduled_server.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library scheduled_server;
+library scheduled_test.scheduled_server;
 
 import 'dart:async';
 import 'dart:collection';
diff --git a/pkg/scheduled_test/lib/src/descriptor/descriptor.dart b/pkg/scheduled_test/lib/src/descriptor/descriptor.dart
index 1d3a14a..1dc2c94 100644
--- a/pkg/scheduled_test/lib/src/descriptor/descriptor.dart
+++ b/pkg/scheduled_test/lib/src/descriptor/descriptor.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library descriptor.entry;
+library descriptor.descriptor;
 
 import 'dart:async';
 
diff --git a/pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart b/pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart
index feaa55b..d07b5bc 100644
--- a/pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart
+++ b/pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library descriptor.file;
+library descriptor.directory;
 
 import 'dart:async';
 import 'dart:io';
@@ -108,7 +108,7 @@
 
 /// A class for formatting errors thrown by [DirectoryDescriptor].
 class _DirectoryValidationError {
-  final Collection<String> errors;
+  final Iterable<String> errors;
 
   /// Flatten nested [_DirectoryValidationError]s in [errors] to create a single
   /// list of errors.
diff --git a/pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart b/pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart
index 39f61cb..e56db2a 100644
--- a/pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart
+++ b/pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library descriptor.async;
+library descriptor.nothing;
 
 import 'dart:async';
 import 'dart:io';
diff --git a/pkg/scheduled_test/lib/src/mock_clock.dart b/pkg/scheduled_test/lib/src/mock_clock.dart
index d60e418..a4bbdee 100644
--- a/pkg/scheduled_test/lib/src/mock_clock.dart
+++ b/pkg/scheduled_test/lib/src/mock_clock.dart
@@ -67,7 +67,7 @@
   /// code runs before the next tick.
   void run() {
     pumpEventQueue().then((_) {
-      if (!_onTickController.hasSubscribers) return;
+      if (!_onTickController.hasListener) return;
       tick();
       return run();
     });
diff --git a/pkg/scheduled_test/lib/src/schedule.dart b/pkg/scheduled_test/lib/src/schedule.dart
index 88c26eb..2569b4b 100644
--- a/pkg/scheduled_test/lib/src/schedule.dart
+++ b/pkg/scheduled_test/lib/src/schedule.dart
@@ -110,6 +110,14 @@
   /// The timer for keeping track of task timeouts. This may be null.
   Timer _timeoutTimer;
 
+  /// If `true`, then new [Task]s will capture the current stack trace before
+  /// running. This can be set to `false` to speed up running tests since
+  /// capturing stack traces is currently quite slow. Even when set to `false`,
+  /// stack traces from *thrown* exceptions will be caught. This only disables
+  /// the eager collection of stack traces *before* an error occurs. Defaults
+  /// to `true`.
+  bool captureStackTraces = true;
+
   /// Creates a new schedule with empty task queues.
   Schedule() {
     _tasks = new TaskQueue._("tasks", this);
@@ -309,7 +317,7 @@
   /// are no duplicate errors, and that all errors are wrapped in
   /// [ScheduleError].
   void _addError(error) {
-    if (errors.contains(error)) return;
+    if (error is ScheduleError && errors.contains(error)) return;
     errors.add(new ScheduleError.from(this, error));
   }
 }
@@ -340,12 +348,16 @@
 class TaskQueue {
   // TODO(nweiz): make this a read-only view when issue 8321 is fixed.
   /// The tasks in the queue.
-  Collection<Task> get contents => _contents;
+  Iterable<Task> get contents => _contents;
   final _contents = new Queue<Task>();
 
   /// The name of the queue, for debugging purposes.
   final String name;
 
+  /// If `true`, then new [Task]s in this queue will capture the current stack
+  /// trace before running.
+  bool get captureStackTraces => _schedule.captureStackTraces;
+
   /// The [Schedule] that created this queue.
   final Schedule _schedule;
 
@@ -368,7 +380,7 @@
   // TODO(nweiz): make this a read-only view when issue 8321 is fixed.
   /// The descriptions of all callbacks that are blocking the completion of
   /// [this].
-  Collection<String> get pendingCallbacks => _pendingCallbacks;
+  Iterable<String> get pendingCallbacks => _pendingCallbacks;
   final _pendingCallbacks = new Queue<String>();
 
   /// A completer that will be completed once [_pendingCallbacks] becomes empty
@@ -496,8 +508,12 @@
     if (description == null) {
       description = "Out-of-band operation #${_totalCallbacks}";
     }
-    var stackString = prefixLines(terseTraceString(new Trace.current()));
-    description = "$description\n\nStack trace:\n$stackString";
+
+    if (captureStackTraces) {
+      var stackString = prefixLines(terseTraceString(new Trace.current()));
+      description += "\n\nStack trace:\n$stackString";
+    }
+
     _totalCallbacks++;
 
     _pendingCallbacks.add(description);
diff --git a/pkg/scheduled_test/lib/src/schedule_error.dart b/pkg/scheduled_test/lib/src/schedule_error.dart
index 3df208a..7b66391 100644
--- a/pkg/scheduled_test/lib/src/schedule_error.dart
+++ b/pkg/scheduled_test/lib/src/schedule_error.dart
@@ -27,7 +27,7 @@
 
   /// The descriptions of out-of-band callbacks that were pending when this
   /// error occurred.
-  final Collection<String> pendingCallbacks;
+  final Iterable<String> pendingCallbacks;
 
   /// The state of the schedule at the time the error was detected.
   final ScheduleState _stateWhenDetected;
@@ -50,12 +50,8 @@
       error = error.error;
     }
 
-    if (stackTrace == null) {
-      try {
-        throw '';
-      } catch (_, thrownStackTrace) {
-        stackTrace = thrownStackTrace;
-      }
+    if (schedule.captureStackTraces && stackTrace == null) {
+      stackTrace = new Trace.current();
     }
 
     return new ScheduleError(schedule, error, stackTrace, cause);
@@ -88,9 +84,11 @@
       result.write('ScheduleError: "$errorString"\n');
     }
 
-    result.write('Stack trace:\n');
-    result.write(prefixLines(terseTraceString(stackTrace)));
-    result.write("\n\n");
+    if (stackTrace != null) {
+      result.write('Stack trace:\n');
+      result.write(prefixLines(terseTraceString(stackTrace)));
+      result.write("\n\n");
+    }
 
     if (task != null) {
       result.write('Error detected during task in queue "$queue":\n');
diff --git a/pkg/scheduled_test/lib/src/scheduled_server/safe_http_server.dart b/pkg/scheduled_test/lib/src/scheduled_server/safe_http_server.dart
index f326ac1..7e4e4cc 100644
--- a/pkg/scheduled_test/lib/src/scheduled_server/safe_http_server.dart
+++ b/pkg/scheduled_test/lib/src/scheduled_server/safe_http_server.dart
@@ -131,7 +131,7 @@
   List<Cookie> get cookies => _inner.cookies;
   Future<Socket> detachSocket() => _inner.detachSocket();
   HttpConnectionInfo get connectionInfo => _inner.connectionInfo;
-  void writeBytes(List<int> data) => _inner.writeBytes(data);
+  void add(List<int> data) => _inner.add(data);
   Future<HttpResponse> consume(Stream<List<int>> stream) =>
     _inner.consume(stream);
   Future<HttpResponse> addStream(Stream<List<int>> stream) =>
diff --git a/pkg/scheduled_test/lib/src/task.dart b/pkg/scheduled_test/lib/src/task.dart
index 4ccb201..aabdbba 100644
--- a/pkg/scheduled_test/lib/src/task.dart
+++ b/pkg/scheduled_test/lib/src/task.dart
@@ -9,6 +9,7 @@
 
 import 'package:stack_trace/stack_trace.dart';
 
+import '../scheduled_test.dart' show currentSchedule;
 import 'future_group.dart';
 import 'schedule.dart';
 import 'utils.dart';
@@ -61,7 +62,7 @@
   Future get result => _resultCompleter.future;
   final _resultCompleter = new Completer();
 
-  final stackTrace = new Trace.current();
+  final Trace stackTrace;
 
   Task(fn(), String description, TaskQueue queue)
     : this._(fn, description, queue, null, queue.contents.length);
@@ -69,7 +70,9 @@
   Task._child(fn(), String description, Task parent)
     : this._(fn, description, parent.queue, parent, parent.children.length);
 
-  Task._(fn(), this.description, this.queue, this.parent, this._id) {
+  Task._(fn(), this.description, TaskQueue queue, this.parent, this._id)
+      : queue = queue,
+        stackTrace = queue.captureStackTraces ? new Trace.current() : null {
     this.fn = () {
       if (state != TaskState.WAITING) {
         throw new StateError("Can't run $state task '$this'.");
@@ -121,8 +124,12 @@
   String toString() => description == null ? "#$_id" : description;
 
   String toStringWithStackTrace() {
-    var stackString = prefixLines(terseTraceString(stackTrace));
-    return "$this\n\nStack trace:\n$stackString";
+    var result = toString();
+    if (stackTrace != null) {
+      var stackString = prefixLines(terseTraceString(stackTrace));
+      result += "\n\nStack trace:\n$stackString";
+    }
+    return result;
   }
 
   /// Returns a detailed representation of [queue] with this task highlighted.
diff --git a/pkg/scheduled_test/test/scheduled_test/capture_stack_traces_test.dart b/pkg/scheduled_test/test/scheduled_test/capture_stack_traces_test.dart
new file mode 100644
index 0000000..6ea9e59
--- /dev/null
+++ b/pkg/scheduled_test/test/scheduled_test/capture_stack_traces_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io' hide sleep;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../metatest.dart';
+import '../utils.dart';
+
+void main() {
+  setUpTimeout();
+
+  expectTestsPass('error includes a stack trace by default', () {
+    var error;
+    test('test 1', () {
+      currentSchedule.onComplete.schedule(() {
+        error = currentSchedule.errors.first;
+      });
+
+      schedule(() => throw 'error');
+    });
+
+    test('test 2', () {
+      // There should be two stack traces: one for the thrown error, and one
+      // for the failed task (which is the captured one).
+      expect(error.toString(),
+          stringContainsInOrder(['Stack trace:', 'Stack trace:']));
+    });
+  }, passing: ['test 2']);
+
+  expectTestsPass('does not capture a stack trace if set to false', () {
+    var error;
+    test('test 1', () {
+      currentSchedule.captureStackTraces = false;
+      currentSchedule.onComplete.schedule(() {
+        error = currentSchedule.errors.first;
+      });
+
+      schedule(() => throw 'error');
+    });
+
+    test('test 2', () {
+      // There should only be the stack trace for the thrown exception, but no
+      // captured trace for the failed task.
+      var numStackTraces = 'Stack trace:'.allMatches(error.toString()).length;
+      expect(numStackTraces, equals(1));
+    });
+  }, passing: ['test 2']);
+}
diff --git a/pkg/serialization/lib/src/basic_rule.dart b/pkg/serialization/lib/src/basic_rule.dart
index fe9428f..c640ba6 100644
--- a/pkg/serialization/lib/src/basic_rule.dart
+++ b/pkg/serialization/lib/src/basic_rule.dart
@@ -375,7 +375,7 @@
   }
 
   valueIn(InstanceMirror mirror) =>
-      deprecatedFutureValue(mirror.getField(name)).reflectee;
+      deprecatedFutureValue(mirror.getFieldAsync(name)).reflectee;
 
   /** Return the function to use to set our value. */
   Function get setter =>
@@ -383,7 +383,7 @@
 
   /** Return a default setter function. */
   void defaultSetter(InstanceMirror object, value) {
-    object.setField(name, reflect(value));
+    object.setFieldAsync(name, reflect(value));
   }
 
   String toString() => 'Field($name)';
@@ -615,7 +615,7 @@
     // TODO(alanknight): Handle named parameters
     Iterable inflated = fieldNumbers.map(
         (x) => (x is int) ? reflect(r.inflateReference(state[x])) : reflect(x));
-    var result = type.newInstance(name, inflated.toList());
+    var result = type.newInstanceAsync(name, inflated.toList());
     return deprecatedFutureValue(result);
   }
 }
diff --git a/pkg/serialization/lib/src/serialization_rule.dart b/pkg/serialization/lib/src/serialization_rule.dart
index 483197a..e83e804 100644
--- a/pkg/serialization/lib/src/serialization_rule.dart
+++ b/pkg/serialization/lib/src/serialization_rule.dart
@@ -544,7 +544,7 @@
   lastIndexOf(x, [pos]) => _inflated.toList().lastIndexOf(x);
   sublist(start, [end]) => _inflated.sublist(start, end);
 
-  Map<int, dynamic> asMap() => IterableMixinWorkaround.asMapList(this);
+  Map<int, dynamic> asMap() => _inflated.asMap();
 
   // These operations are all invalid
   _throw() {
diff --git a/pkg/source_maps/lib/span.dart b/pkg/source_maps/lib/span.dart
index 1982994..fd302bc 100644
--- a/pkg/source_maps/lib/span.dart
+++ b/pkg/source_maps/lib/span.dart
@@ -5,7 +5,7 @@
 /// Dart classes representing the souce spans and source files.
 library source_maps.span;
 
-import 'dart:utf' show stringToCodepoints, codepointsToString;
+import 'dart:utf' show stringToCodepoints;
 import 'dart:math' show min;
 
 import 'src/utils.dart';
@@ -232,7 +232,7 @@
 
   /// Gets the text at the given offsets.
   String getText(int start, [int end]) {
-    return codepointsToString(_decodedChars.sublist(start, end));
+    return new String.fromCharCodes(_decodedChars.sublist(start, end));
   }
 
   /// Create a pretty string representation from a span.
diff --git a/pkg/stack_trace/lib/src/trace.dart b/pkg/stack_trace/lib/src/trace.dart
index 43a598c..bed1d5d 100644
--- a/pkg/stack_trace/lib/src/trace.dart
+++ b/pkg/stack_trace/lib/src/trace.dart
@@ -5,6 +5,7 @@
 library trace;
 
 import 'dart:uri';
+import 'dart:math';
 
 import 'frame.dart';
 
@@ -116,7 +117,7 @@
     if (frames.length == '') return '';
 
     // Figure out the longest path so we know how much to pad.
-    var longest = frames.map((frame) => frame.location.length).max();
+    var longest = frames.map((frame) => frame.location.length).reduce(max);
 
     // Print out the stack trace nicely formatted.
     return frames.map((frame) {
diff --git a/pkg/stack_trace/lib/stack_trace.dart b/pkg/stack_trace/lib/stack_trace.dart
index 455dd57..5747b85 100644
--- a/pkg/stack_trace/lib/stack_trace.dart
+++ b/pkg/stack_trace/lib/stack_trace.dart
@@ -4,8 +4,5 @@
 
 library stack_trace;
 
-import 'src/trace.dart';
-import 'src/frame.dart';
-
 export 'src/trace.dart';
 export 'src/frame.dart';
diff --git a/pkg/unittest/lib/matcher.dart b/pkg/unittest/lib/matcher.dart
index 29c5504..6584198 100644
--- a/pkg/unittest/lib/matcher.dart
+++ b/pkg/unittest/lib/matcher.dart
@@ -10,7 +10,7 @@
 import 'dart:async';
 
 part 'src/basematcher.dart';
-part 'src/collection_matchers.dart';
+part 'src/iterable_matchers.dart';
 part 'src/core_matchers.dart';
 part 'src/description.dart';
 part 'src/expect.dart';
diff --git a/pkg/unittest/lib/mock.dart b/pkg/unittest/lib/mock.dart
index 730e4ff..db243db 100644
--- a/pkg/unittest/lib/mock.dart
+++ b/pkg/unittest/lib/mock.dart
@@ -671,7 +671,7 @@
    * list is created.
    */
   LogEntryList after(DateTime when, [bool inPlace = false]) =>
-      _tail((e) => e.time > when, inPlace, 'after $when', logs.length);
+      _tail((e) => e.time.isAfter(when), inPlace, 'after $when', logs.length);
 
   /**
    * Returns log events that happened from [when] onwards. If
@@ -680,7 +680,7 @@
    * a new list is created.
    */
   LogEntryList from(DateTime when, [bool inPlace = false]) =>
-      _tail((e) => e.time >= when, inPlace, 'from $when', logs.length);
+      _tail((e) => !e.time.isBefore(when), inPlace, 'from $when', logs.length);
 
   /**
    * Returns log events that happened until [when]. If [inPlace]
@@ -689,7 +689,7 @@
    * list is created.
    */
   LogEntryList until(DateTime when, [bool inPlace = false]) =>
-      _head((e) => e.time > when, inPlace, 'until $when', logs.length);
+      _head((e) => e.time.isAfter(when), inPlace, 'until $when', logs.length);
 
   /**
    * Returns log events that happened before [when]. If [inPlace]
@@ -698,7 +698,10 @@
    * list is created.
    */
   LogEntryList before(DateTime when, [bool inPlace = false]) =>
-      _head((e) => e.time >= when, inPlace, 'before $when', logs.length);
+      _head((e) => !e.time.isBefore(when),
+            inPlace,
+            'before $when',
+            logs.length);
 
   /**
    * Returns log events that happened after [logEntry]'s time.
diff --git a/pkg/unittest/lib/src/core_matchers.dart b/pkg/unittest/lib/src/core_matchers.dart
index 236da4e..1a8143c 100644
--- a/pkg/unittest/lib/src/core_matchers.dart
+++ b/pkg/unittest/lib/src/core_matchers.dart
@@ -599,7 +599,7 @@
  * Returns a matcher that matches if the match argument contains
  * the expected value. For [String]s this means substring matching;
  * for [Map]s it means the map has the key, and for [Iterable]s
- * (including [Collection]s) it means the iterable has a matching
+ * (including [Iterable]s) it means the iterable has a matching
  * element. In the case of iterables, [expected] can itself be a
  * matcher.
  */
@@ -645,7 +645,7 @@
   bool matches(item, MatchState matchState) {
     if (_expected is String) {
       return _expected.indexOf(item) >= 0;
-    } else if (_expected is Collection) {
+    } else if (_expected is Iterable) {
       return _expected.any((e) => e == item);
     } else if (_expected is Map) {
       return _expected.containsKey(item);
diff --git a/pkg/unittest/lib/src/collection_matchers.dart b/pkg/unittest/lib/src/iterable_matchers.dart
similarity index 86%
rename from pkg/unittest/lib/src/collection_matchers.dart
rename to pkg/unittest/lib/src/iterable_matchers.dart
index 7f3a64c..e5b0e9a 100644
--- a/pkg/unittest/lib/src/collection_matchers.dart
+++ b/pkg/unittest/lib/src/iterable_matchers.dart
@@ -5,12 +5,12 @@
 part of matcher;
 
 /**
- * Returns a matcher which matches [Collection]s in which all elements
+ * Returns a matcher which matches [Iterable]s in which all elements
  * match the given [matcher].
  */
 Matcher everyElement(matcher) => new _EveryElement(wrapMatcher(matcher));
 
-class _EveryElement extends _CollectionMatcher {
+class _EveryElement extends _IterableMatcher {
   Matcher _matcher;
 
   _EveryElement(Matcher this._matcher);
@@ -51,12 +51,12 @@
 }
 
 /**
- * Returns a matcher which matches [Collection]s in which at least one
+ * Returns a matcher which matches [Iterable]s in which at least one
  * element matches the given [matcher].
  */
 Matcher someElement(matcher) => new _SomeElement(wrapMatcher(matcher));
 
-class _SomeElement extends _CollectionMatcher {
+class _SomeElement extends _IterableMatcher {
   Matcher _matcher;
 
   _SomeElement(this._matcher);
@@ -120,23 +120,8 @@
       return 'not iterable';
     }
     // Check the lengths are the same.
-    var expectedLength = 0;
-    if (_expected is Collection) {
-      Collection cast = _expected; // "_expected as Collection"
-      expectedLength = cast.length;
-    } else {
-      for (var element in _expected) {
-        ++expectedLength;
-      }
-    }
-    var actualLength = 0;
-    if (item is Collection) {
-      actualLength = item.length;
-    } else {
-      for (var element in item) {
-        ++actualLength;
-      }
-    }
+    var expectedLength = _expected.length;
+    var actualLength = item.length;
     if (expectedLength > actualLength) {
       return 'has too few elements (${actualLength} < ${expectedLength})';
     } else if (expectedLength < actualLength) {
@@ -182,11 +167,11 @@
 }
 
 /**
- * Collection matchers match against [Collection]s. We add this intermediate
+ * Iterable matchers match against [Iterable]s. We add this intermediate
  * class to give better mismatch error messages than the base Matcher class.
  */
-abstract class _CollectionMatcher extends BaseMatcher {
-  const _CollectionMatcher();
+abstract class _IterableMatcher extends BaseMatcher {
+  const _IterableMatcher();
   Description describeMismatch(item, Description mismatchDescription,
                                MatchState matchState, bool verbose) {
     if (item is! Iterable) {
diff --git a/pkg/unittest/lib/src/test_case.dart b/pkg/unittest/lib/src/test_case.dart
index f8eb233..23d04de 100644
--- a/pkg/unittest/lib/src/test_case.dart
+++ b/pkg/unittest/lib/src/test_case.dart
@@ -158,7 +158,13 @@
                 [String messageText = '',
                  String stack = '']) {
     if (runningTime == null) {
-      _runningTime = new DateTime.now().difference(startTime);
+      // The startTime can be `null` if an error happened during setup. In this
+      // case we simply report a running time of 0.
+      if (startTime != null) {
+        _runningTime = new DateTime.now().difference(startTime);
+      } else {
+        _runningTime = const Duration(seconds: 0);
+      }
     }
     _setResult(testResult, messageText, stack);
     if (!_doneTeardown) {
diff --git a/pkg/unittest/test/matchers_test.dart b/pkg/unittest/test/matchers_test.dart
index f49e0cb..7e97b38 100644
--- a/pkg/unittest/test/matchers_test.dart
+++ b/pkg/unittest/test/matchers_test.dart
@@ -461,7 +461,7 @@
     });
   });
   
-  group('Collection Matchers', () {
+  group('Iterable Matchers', () {
 
     test('isEmpty', () {
       shouldPass([], isEmpty);
diff --git a/pkg/yaml/lib/parser.dart b/pkg/yaml/lib/parser.dart
index c84f374..9621b13 100644
--- a/pkg/yaml/lib/parser.dart
+++ b/pkg/yaml/lib/parser.dart
@@ -1119,7 +1119,7 @@
   });
 
   // 138
-  Collection<_Node> ns_s_flowSeqEntries(int indent, int ctx) {
+  Iterable<_Node> ns_s_flowSeqEntries(int indent, int ctx) {
     var first = ns_flowSeqEntry(indent, ctx);
     if (!truth(first)) return new Queue<_Node>();
     zeroOrOne(() => s_separate(indent, ctx));
diff --git a/pkg/yaml/test/yaml_test.dart b/pkg/yaml/test/yaml_test.dart
index 901bd3d..6013dc9 100644
--- a/pkg/yaml/test/yaml_test.dart
+++ b/pkg/yaml/test/yaml_test.dart
@@ -4,6 +4,8 @@
 
 library yaml_test;
 
+// TODO(rnystrom): rewrite tests so that they don't need "Expect".
+import "package:expect/expect.dart";
 import 'package:unittest/unittest.dart';
 import 'package:yaml/yaml.dart';
 import 'package:yaml/deep_equals.dart';
diff --git a/runtime/bin/bin.gypi b/runtime/bin/bin.gypi
index 2e360e0..c32c092 100644
--- a/runtime/bin/bin.gypi
+++ b/runtime/bin/bin.gypi
@@ -535,6 +535,11 @@
             'OTHER_LDFLAGS': [ '-undefined', 'dynamic_lookup' ],
           },
         }],
+        ['OS=="linux"', {
+          'cflags': [
+            '-fPIC',
+          ],
+        }],
       ],
     },
   ],
diff --git a/runtime/bin/builtin_natives.cc b/runtime/bin/builtin_natives.cc
index 33be02e..b4b44d0 100644
--- a/runtime/bin/builtin_natives.cc
+++ b/runtime/bin/builtin_natives.cc
@@ -44,6 +44,7 @@
   V(File_CreateLink, 2)                                                        \
   V(File_LinkTarget, 1)                                                        \
   V(File_Delete, 1)                                                            \
+  V(File_DeleteLink, 1)                                                        \
   V(File_Directory, 1)                                                         \
   V(File_FullPath, 1)                                                          \
   V(File_OpenStdio, 1)                                                         \
diff --git a/runtime/bin/common_patch.dart b/runtime/bin/common_patch.dart
index 1c878aa..8b77d3a 100644
--- a/runtime/bin/common_patch.dart
+++ b/runtime/bin/common_patch.dart
@@ -7,4 +7,7 @@
       native "Common_IsBuiltinList";
 }
 
-
+patch class _IOCrypto {
+  /* patch */ static Uint8List getRandomBytes(int count)
+      native "Crypto_GetRandomBytes";
+}
diff --git a/runtime/bin/dbg_message.cc b/runtime/bin/dbg_message.cc
index d364d87..931d2bc 100644
--- a/runtime/bin/dbg_message.cc
+++ b/runtime/bin/dbg_message.cc
@@ -390,7 +390,8 @@
 
 
 static void FormatLocationFromTrace(dart::TextBuffer* msg,
-                                    Dart_StackTrace trace) {
+                                    Dart_StackTrace trace,
+                                    const char* prefix) {
   intptr_t trace_len = 0;
   Dart_Handle res = Dart_StackTraceLength(trace, &trace_len);
   ASSERT_NOT_ERROR(res);
@@ -400,16 +401,21 @@
   Dart_Handle script_url;
   intptr_t token_number = 0;
   intptr_t line_number = 0;
+  intptr_t library_id = 0;
+  // TODO(hausner): Remove this call and line_number once Editor no
+  // longer depends on line number info.
   res = Dart_ActivationFrameInfo(frame, NULL, NULL, &line_number, NULL);
   ASSERT_NOT_ERROR(res);
-  res = Dart_ActivationFrameGetLocation(frame, &script_url, &token_number);
+  res = Dart_ActivationFrameGetLocation(
+      frame, &script_url, &library_id, &token_number);
   ASSERT_NOT_ERROR(res);
   if (!Dart_IsNull(script_url)) {
     ASSERT(Dart_IsString(script_url));
-    msg->Printf("\"location\": { \"url\":");
+    msg->Printf("%s\"location\": { \"url\":", prefix);
     FormatEncodedString(msg, script_url);
-    msg->Printf(",\"tokenOffset\":%"Pd",", token_number);
-    msg->Printf("\"lineNumber\":%"Pd"},", line_number);
+    msg->Printf(",\"libraryId\":%"Pd",", library_id);
+    msg->Printf("\"tokenOffset\":%"Pd",", token_number);
+    msg->Printf("\"lineNumber\":%"Pd"}", line_number);
   }
 }
 
@@ -435,15 +441,19 @@
     ASSERT(Dart_IsString(func_name));
     msg->Printf("%s{\"functionName\":", (i > 0) ? "," : "");
     FormatEncodedString(msg, func_name);
+    // TODO(hausner): Remove this libraryId field when Editor
+    // no longer depends on it.
     msg->Printf(",\"libraryId\": %"Pd",", library_id);
 
-    res = Dart_ActivationFrameGetLocation(frame, &script_url, &token_number);
+    res = Dart_ActivationFrameGetLocation(
+        frame, &script_url, NULL, &token_number);
     ASSERT_NOT_ERROR(res);
     if (!Dart_IsNull(script_url)) {
       ASSERT(Dart_IsString(script_url));
       msg->Printf("\"location\": { \"url\":");
       FormatEncodedString(msg, script_url);
-      msg->Printf(",\"tokenOffset\":%"Pd",", token_number);
+      msg->Printf(",\"libraryId\": %"Pd",", library_id);
+      msg->Printf("\"tokenOffset\":%"Pd",", token_number);
       msg->Printf("\"lineNumber\":%"Pd"},", line_number);
     }
 
@@ -479,6 +489,7 @@
   { "getGlobalVariables", DbgMessage::HandleGetGlobalsCmd },
   { "getScriptURLs", DbgMessage::HandleGetScriptURLsCmd },
   { "getScriptSource", DbgMessage::HandleGetSourceCmd },
+  { "getLineNumberTable", DbgMessage::HandleGetLineNumbersCmd },
   { "getStackTrace", DbgMessage::HandleGetStackTraceCmd },
   { "setBreakpoint", DbgMessage::HandleSetBpCmd },
   { "setPauseOnException", DbgMessage::HandlePauseOnExcCmd },
@@ -788,6 +799,53 @@
 }
 
 
+bool DbgMessage::HandleGetLineNumbersCmd(DbgMessage* in_msg) {
+  ASSERT(in_msg != NULL);
+  MessageParser msg_parser(in_msg->buffer(), in_msg->buffer_len());
+  int msg_id = msg_parser.MessageId();
+  dart::TextBuffer msg(64);
+  intptr_t lib_id = msg_parser.GetIntParam("libraryId");
+  char* url_chars = msg_parser.GetStringParam("url");
+  ASSERT(url_chars != NULL);
+  Dart_Handle url = DartUtils::NewString(url_chars);
+  ASSERT_NOT_ERROR(url);
+  free(url_chars);
+  url_chars = NULL;
+  Dart_Handle info = Dart_ScriptGetTokenInfo(lib_id, url);
+  if (Dart_IsError(info)) {
+    in_msg->SendErrorReply(msg_id, Dart_GetError(info));
+    return false;
+  }
+  ASSERT(Dart_IsList(info));
+  intptr_t info_len = 0;
+  Dart_Handle res = Dart_ListLength(info, &info_len);
+  ASSERT_NOT_ERROR(res);
+  msg.Printf("{ \"id\": %d, ", msg_id);
+  msg.Printf("\"result\": { \"lines\": [");
+  Dart_Handle elem;
+  bool num_elems = 0;
+  for (intptr_t i = 0; i < info_len; i++) {
+    elem = Dart_ListGetAt(info, i);
+    if (Dart_IsNull(elem)) {
+      msg.Printf((i == 0) ? "[" : "], [");
+      num_elems = 0;
+    } else {
+      ASSERT(Dart_IsInteger(elem));
+      int value = GetIntValue(elem);
+      if (num_elems == 0) {
+        msg.Printf("%d", value);
+      } else {
+        msg.Printf(",%d", value);
+      }
+      num_elems++;
+    }
+  }
+  msg.Printf("]]}}");
+  in_msg->SendReply(&msg);
+  return false;
+}
+
+
 bool DbgMessage::HandleGetStackTraceCmd(DbgMessage* in_msg) {
   ASSERT(in_msg != NULL);
   MessageParser msg_parser(in_msg->buffer(), in_msg->buffer_len());
@@ -950,9 +1008,8 @@
   dart::TextBuffer msg(128);
   msg.Printf("{ \"event\": \"paused\", \"params\": { ");
   msg.Printf("\"reason\": \"breakpoint\", ");
-  msg.Printf("\"id\": %"Pd64", ", isolate_id_);
-  FormatLocationFromTrace(&msg, trace);
-  FormatCallFrames(&msg, trace);
+  msg.Printf("\"isolateId\": %"Pd64"", isolate_id_);
+  FormatLocationFromTrace(&msg, trace, ", ");
   msg.Printf("}}");
   DebuggerConnectionHandler::BroadcastMsg(&msg);
 }
@@ -967,12 +1024,10 @@
   dart::TextBuffer msg(128);
   msg.Printf("{ \"event\": \"paused\", \"params\": {");
   msg.Printf("\"reason\": \"exception\", ");
-  msg.Printf("\"id\": %"Pd64", ", isolate_id_);
+  msg.Printf("\"isolateId\": %"Pd64", ", isolate_id_);
   msg.Printf("\"exception\":");
   FormatRemoteObj(&msg, exception);
-  msg.Printf(", ");
-  FormatLocationFromTrace(&msg, stack_trace);
-  FormatCallFrames(&msg, stack_trace);
+  FormatLocationFromTrace(&msg, stack_trace, ", ");
   msg.Printf("}}");
   DebuggerConnectionHandler::BroadcastMsg(&msg);
 }
@@ -989,9 +1044,8 @@
     ASSERT_NOT_ERROR(res);
     msg.Printf("{ \"event\": \"paused\", \"params\": { ");
     msg.Printf("\"reason\": \"interrupted\", ");
-    msg.Printf("\"id\": %"Pd64", ", isolate_id);
-    FormatLocationFromTrace(&msg, trace);
-    FormatCallFrames(&msg, trace);
+    msg.Printf("\"isolateId\": %"Pd64"", isolate_id);
+    FormatLocationFromTrace(&msg, trace, ", ");
     msg.Printf("}}");
   } else {
     msg.Printf("{ \"event\": \"isolate\", \"params\": { ");
diff --git a/runtime/bin/dbg_message.h b/runtime/bin/dbg_message.h
index 58d5df9..95bc688 100644
--- a/runtime/bin/dbg_message.h
+++ b/runtime/bin/dbg_message.h
@@ -104,6 +104,7 @@
   static bool HandleGetListCmd(DbgMessage* msg);
   static bool HandleGetScriptURLsCmd(DbgMessage* msg);
   static bool HandleGetSourceCmd(DbgMessage* msg);
+  static bool HandleGetLineNumbersCmd(DbgMessage* msg);
   static bool HandleGetStackTraceCmd(DbgMessage* msg);
   static bool HandlePauseOnExcCmd(DbgMessage* msg);
   static bool HandleSetBpCmd(DbgMessage* msg);
diff --git a/runtime/bin/directory_android.cc b/runtime/bin/directory_android.cc
index 1fb42cb..58060d8 100644
--- a/runtime/bin/directory_android.cc
+++ b/runtime/bin/directory_android.cc
@@ -54,10 +54,20 @@
 };
 
 
+// A linked list of symbolic links, with their unique file system identifiers.
+// These are scanned to detect loops while doing a recursive directory listing.
+struct LinkList {
+  dev_t dev;
+  ino_t ino;
+  LinkList* next;
+};
+
+
 // Forward declarations.
 static bool ListRecursively(PathBuffer* path,
                             bool recursive,
                             bool follow_links,
+                            LinkList* seen,
                             DirectoryListing* listing);
 static bool DeleteRecursively(PathBuffer* path);
 
@@ -72,6 +82,7 @@
                       PathBuffer* path,
                       bool recursive,
                       bool follow_links,
+                      LinkList* seen,
                       DirectoryListing *listing) {
   if (strcmp(dir_name, ".") == 0) return true;
   if (strcmp(dir_name, "..") == 0) return true;
@@ -80,7 +91,8 @@
     return false;
   }
   return listing->HandleDirectory(path->data) &&
-      (!recursive || ListRecursively(path, recursive, follow_links, listing));
+      (!recursive ||
+       ListRecursively(path, recursive, follow_links, seen, listing));
 }
 
 
@@ -109,6 +121,7 @@
 static bool ListRecursively(PathBuffer* path,
                             bool recursive,
                             bool follow_links,
+                            LinkList* seen,
                             DirectoryListing *listing) {
   if (!path->Add(File::PathSeparator())) {
     PostError(listing, path->data);
@@ -140,6 +153,7 @@
                             path,
                             recursive,
                             follow_links,
+                            seen,
                             listing) && success;
         break;
       case DT_REG:
@@ -167,25 +181,63 @@
           break;
         }
         int stat_success;
-        if (follow_links) {
-          stat_success = TEMP_FAILURE_RETRY(stat(path->data, &entry_info));
-          if (stat_success == -1) {
-            stat_success = TEMP_FAILURE_RETRY(lstat(path->data, &entry_info));
-          }
-        } else {
-          stat_success = TEMP_FAILURE_RETRY(lstat(path->data, &entry_info));
-        }
+        stat_success = TEMP_FAILURE_RETRY(lstat(path->data, &entry_info));
         if (stat_success == -1) {
           success = false;
           PostError(listing, path->data);
           break;
         }
+        if (follow_links && S_ISLNK(entry_info.st_mode)) {
+          // Check to see if we are in a loop created by a symbolic link.
+          LinkList current_link = { entry_info.st_dev,
+                                    entry_info.st_ino,
+                                    seen };
+          LinkList* previous = seen;
+          bool looping_link = false;
+          while (previous != NULL) {
+            if (previous->dev == current_link.dev &&
+                previous->ino == current_link.ino) {
+              // Report the looping link as a link, rather than following it.
+              path->Reset(path_length);
+              success = HandleLink(entry.d_name,
+                                   path,
+                                   listing) && success;
+              looping_link = true;
+              break;
+            }
+            previous = previous->next;
+          }
+          if (looping_link) break;
+          stat_success = TEMP_FAILURE_RETRY(stat(path->data, &entry_info));
+          if (stat_success == -1) {
+            // Report a broken link as a link, even if follow_links is true.
+            path->Reset(path_length);
+            success = HandleLink(entry.d_name,
+                                 path,
+                                 listing) && success;
+            break;
+          }
+          if (S_ISDIR(entry_info.st_mode)) {
+            // Recurse into the subdirectory with current_link added to the
+            // linked list of seen file system links.
+            path->Reset(path_length);
+            success = HandleDir(entry.d_name,
+                                path,
+                                recursive,
+                                follow_links,
+                                seen,
+                                &current_link,
+                                listing) && success;
+            break;
+          }
+        }
         path->Reset(path_length);
         if (S_ISDIR(entry_info.st_mode)) {
           success = HandleDir(entry.d_name,
                               path,
                               recursive,
                               follow_links,
+                              seen,
                               listing) && success;
         } else if (S_ISREG(entry_info.st_mode)) {
           success = HandleFile(entry.d_name,
@@ -221,7 +273,7 @@
 
 static bool DeleteFile(char* file_name,
                        PathBuffer* path) {
-  return path->Add(file_name) && remove(path->data) == 0;
+  return path->Add(file_name) && unlink(path->data) == 0;
 }
 
 
@@ -235,11 +287,12 @@
 
 static bool DeleteRecursively(PathBuffer* path) {
   // Do not recurse into links for deletion. Instead delete the link.
+  // If it's a file, delete it.
   struct stat st;
   if (TEMP_FAILURE_RETRY(lstat(path->data, &st)) == -1) {
     return false;
-  } else if (S_ISLNK(st.st_mode)) {
-    return (remove(path->data) == 0);
+  } else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
+    return (unlink(path->data) == 0);
   }
 
   if (!path->Add(File::PathSeparator())) return false;
@@ -326,7 +379,7 @@
     PostError(listing, dir_name);
     return false;
   }
-  return ListRecursively(&path, recursive, follow_links, listing);
+  return ListRecursively(&path, recursive, follow_links, NULL, listing);
 }
 
 
@@ -441,7 +494,11 @@
 
 bool Directory::Delete(const char* dir_name, bool recursive) {
   if (!recursive) {
-    return (TEMP_FAILURE_RETRY(remove(dir_name)) == 0);
+    if (File::GetType(dir_name, false) == File::kIsLink &&
+        File::GetType(dir_name, true) == File::kIsDirectory) {
+      return (TEMP_FAILURE_RETRY(unlink(dir_name)) == 0);
+    }
+    return (TEMP_FAILURE_RETRY(rmdir(dir_name)) == 0);
   } else {
     PathBuffer path;
     if (!path.Add(dir_name)) {
diff --git a/runtime/bin/directory_linux.cc b/runtime/bin/directory_linux.cc
index a316633..2f86f5b 100644
--- a/runtime/bin/directory_linux.cc
+++ b/runtime/bin/directory_linux.cc
@@ -54,10 +54,20 @@
 };
 
 
+// A linked list of symbolic links, with their unique file system identifiers.
+// These are scanned to detect loops while doing a recursive directory listing.
+struct LinkList {
+  dev_t dev;
+  ino_t ino;
+  LinkList* next;
+};
+
+
 // Forward declarations.
 static bool ListRecursively(PathBuffer* path,
                             bool recursive,
                             bool follow_links,
+                            LinkList* seen,
                             DirectoryListing* listing);
 static bool DeleteRecursively(PathBuffer* path);
 
@@ -72,6 +82,7 @@
                       PathBuffer* path,
                       bool recursive,
                       bool follow_links,
+                      LinkList* seen,
                       DirectoryListing *listing) {
   if (strcmp(dir_name, ".") == 0) return true;
   if (strcmp(dir_name, "..") == 0) return true;
@@ -80,7 +91,8 @@
     return false;
   }
   return listing->HandleDirectory(path->data) &&
-      (!recursive || ListRecursively(path, recursive, follow_links, listing));
+      (!recursive ||
+       ListRecursively(path, recursive, follow_links, seen, listing));
 }
 
 
@@ -109,6 +121,7 @@
 static bool ListRecursively(PathBuffer* path,
                             bool recursive,
                             bool follow_links,
+                            LinkList* seen,
                             DirectoryListing *listing) {
   if (!path->Add(File::PathSeparator())) {
     PostError(listing, path->data);
@@ -140,6 +153,7 @@
                             path,
                             recursive,
                             follow_links,
+                            seen,
                             listing) && success;
         break;
       case DT_REG:
@@ -167,25 +181,62 @@
           break;
         }
         int stat_success;
-        if (follow_links) {
-          stat_success = TEMP_FAILURE_RETRY(stat(path->data, &entry_info));
-          if (stat_success == -1) {
-            stat_success = TEMP_FAILURE_RETRY(lstat(path->data, &entry_info));
-          }
-        } else {
-          stat_success = TEMP_FAILURE_RETRY(lstat(path->data, &entry_info));
-        }
+        stat_success = TEMP_FAILURE_RETRY(lstat(path->data, &entry_info));
         if (stat_success == -1) {
           success = false;
           PostError(listing, path->data);
           break;
         }
+        if (follow_links && S_ISLNK(entry_info.st_mode)) {
+          // Check to see if we are in a loop created by a symbolic link.
+          LinkList current_link = { entry_info.st_dev,
+                                    entry_info.st_ino,
+                                    seen };
+          LinkList* previous = seen;
+          bool looping_link = false;
+          while (previous != NULL) {
+            if (previous->dev == current_link.dev &&
+                previous->ino == current_link.ino) {
+              // Report the looping link as a link, rather than following it.
+              path->Reset(path_length);
+              success = HandleLink(entry.d_name,
+                                   path,
+                                   listing) && success;
+              looping_link = true;
+              break;
+            }
+            previous = previous->next;
+          }
+          if (looping_link) break;
+          stat_success = TEMP_FAILURE_RETRY(stat(path->data, &entry_info));
+          if (stat_success == -1) {
+            // Report a broken link as a link, even if follow_links is true.
+            path->Reset(path_length);
+            success = HandleLink(entry.d_name,
+                                 path,
+                                 listing) && success;
+            break;
+          }
+          if (S_ISDIR(entry_info.st_mode)) {
+            // Recurse into the subdirectory with current_link added to the
+            // linked list of seen file system links.
+            path->Reset(path_length);
+            success = HandleDir(entry.d_name,
+                                path,
+                                recursive,
+                                follow_links,
+                                &current_link,
+                                listing) && success;
+            break;
+          }
+        }
         path->Reset(path_length);
         if (S_ISDIR(entry_info.st_mode)) {
           success = HandleDir(entry.d_name,
                               path,
                               recursive,
                               follow_links,
+                              seen,
                               listing) && success;
         } else if (S_ISREG(entry_info.st_mode)) {
           success = HandleFile(entry.d_name,
@@ -221,7 +272,7 @@
 
 static bool DeleteFile(char* file_name,
                        PathBuffer* path) {
-  return path->Add(file_name) && remove(path->data) == 0;
+  return path->Add(file_name) && unlink(path->data) == 0;
 }
 
 
@@ -235,11 +286,12 @@
 
 static bool DeleteRecursively(PathBuffer* path) {
   // Do not recurse into links for deletion. Instead delete the link.
+  // If it's a file, delete it.
   struct stat st;
   if (TEMP_FAILURE_RETRY(lstat(path->data, &st)) == -1) {
     return false;
-  } else if (S_ISLNK(st.st_mode)) {
-    return (remove(path->data) == 0);
+  } else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
+    return (unlink(path->data) == 0);
   }
 
   if (!path->Add(File::PathSeparator())) return false;
@@ -326,7 +378,7 @@
     PostError(listing, dir_name);
     return false;
   }
-  return ListRecursively(&path, recursive, follow_links, listing);
+  return ListRecursively(&path, recursive, follow_links, NULL, listing);
 }
 
 
@@ -409,7 +461,11 @@
 
 bool Directory::Delete(const char* dir_name, bool recursive) {
   if (!recursive) {
-    return (TEMP_FAILURE_RETRY(remove(dir_name)) == 0);
+    if (File::GetType(dir_name, false) == File::kIsLink &&
+        File::GetType(dir_name, true) == File::kIsDirectory) {
+      return (TEMP_FAILURE_RETRY(unlink(dir_name)) == 0);
+    }
+    return (TEMP_FAILURE_RETRY(rmdir(dir_name)) == 0);
   } else {
     PathBuffer path;
     if (!path.Add(dir_name)) {
diff --git a/runtime/bin/directory_macos.cc b/runtime/bin/directory_macos.cc
index 401f80c..ece3685 100644
--- a/runtime/bin/directory_macos.cc
+++ b/runtime/bin/directory_macos.cc
@@ -54,10 +54,20 @@
 };
 
 
+// A linked list of symbolic links, with their unique file system identifiers.
+// These are scanned to detect loops while doing a recursive directory listing.
+struct LinkList {
+  dev_t dev;
+  ino_t ino;
+  LinkList* next;
+};
+
+
 // Forward declarations.
 static bool ListRecursively(PathBuffer* path,
                             bool recursive,
                             bool follow_links,
+                            LinkList* seen,
                             DirectoryListing* listing);
 static bool DeleteRecursively(PathBuffer* path);
 
@@ -72,6 +82,7 @@
                       PathBuffer* path,
                       bool recursive,
                       bool follow_links,
+                      LinkList* seen,
                       DirectoryListing *listing) {
   if (strcmp(dir_name, ".") == 0) return true;
   if (strcmp(dir_name, "..") == 0) return true;
@@ -80,7 +91,8 @@
     return false;
   }
   return listing->HandleDirectory(path->data) &&
-      (!recursive || ListRecursively(path, recursive, follow_links, listing));
+      (!recursive ||
+       ListRecursively(path, recursive, follow_links, seen, listing));
 }
 
 
@@ -109,6 +121,7 @@
 static bool ListRecursively(PathBuffer* path,
                             bool recursive,
                             bool follow_links,
+                            LinkList* seen,
                             DirectoryListing *listing) {
   if (!path->Add(File::PathSeparator())) {
     PostError(listing, path->data);
@@ -140,6 +153,7 @@
                             path,
                             recursive,
                             follow_links,
+                            seen,
                             listing) && success;
         break;
       case DT_REG:
@@ -167,25 +181,62 @@
           break;
         }
         int stat_success;
-        if (follow_links) {
-          stat_success = TEMP_FAILURE_RETRY(stat(path->data, &entry_info));
-          if (stat_success == -1) {
-            stat_success = TEMP_FAILURE_RETRY(lstat(path->data, &entry_info));
-          }
-        } else {
-          stat_success = TEMP_FAILURE_RETRY(lstat(path->data, &entry_info));
-        }
+        stat_success = TEMP_FAILURE_RETRY(lstat(path->data, &entry_info));
         if (stat_success == -1) {
           success = false;
           PostError(listing, path->data);
           break;
         }
+        if (follow_links && S_ISLNK(entry_info.st_mode)) {
+          // Check to see if we are in a loop created by a symbolic link.
+          LinkList current_link = { entry_info.st_dev,
+                                    entry_info.st_ino,
+                                    seen };
+          LinkList* previous = seen;
+          bool looping_link = false;
+          while (previous != NULL) {
+            if (previous->dev == current_link.dev &&
+                previous->ino == current_link.ino) {
+              // Report the looping link as a link, rather than following it.
+              path->Reset(path_length);
+              success = HandleLink(entry.d_name,
+                                   path,
+                                   listing) && success;
+              looping_link = true;
+              break;
+            }
+            previous = previous->next;
+          }
+          if (looping_link) break;
+          stat_success = TEMP_FAILURE_RETRY(stat(path->data, &entry_info));
+          if (stat_success == -1) {
+            // Report a broken link as a link, even if follow_links is true.
+            path->Reset(path_length);
+            success = HandleLink(entry.d_name,
+                                 path,
+                                 listing) && success;
+            break;
+          }
+          if (S_ISDIR(entry_info.st_mode)) {
+            // Recurse into the subdirectory with current_link added to the
+            // linked list of seen file system links.
+            path->Reset(path_length);
+            success = HandleDir(entry.d_name,
+                                path,
+                                recursive,
+                                follow_links,
+                                &current_link,
+                                listing) && success;
+            break;
+          }
+        }
         path->Reset(path_length);
         if (S_ISDIR(entry_info.st_mode)) {
           success = HandleDir(entry.d_name,
                               path,
                               recursive,
                               follow_links,
+                              seen,
                               listing) && success;
         } else if (S_ISREG(entry_info.st_mode)) {
           success = HandleFile(entry.d_name,
@@ -221,7 +272,7 @@
 
 static bool DeleteFile(char* file_name,
                        PathBuffer* path) {
-  return path->Add(file_name) && remove(path->data) == 0;
+  return path->Add(file_name) && unlink(path->data) == 0;
 }
 
 
@@ -235,11 +286,12 @@
 
 static bool DeleteRecursively(PathBuffer* path) {
   // Do not recurse into links for deletion. Instead delete the link.
+  // If it's a file, delete it.
   struct stat st;
   if (TEMP_FAILURE_RETRY(lstat(path->data, &st)) == -1) {
     return false;
-  } else if (S_ISLNK(st.st_mode)) {
-    return (remove(path->data) == 0);
+  } else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
+    return (unlink(path->data) == 0);
   }
 
   if (!path->Add(File::PathSeparator())) return false;
@@ -326,7 +378,7 @@
     PostError(listing, dir_name);
     return false;
   }
-  return ListRecursively(&path, recursive, follow_links, listing);
+  return ListRecursively(&path, recursive, follow_links, NULL, listing);
 }
 
 
@@ -409,7 +461,11 @@
 
 bool Directory::Delete(const char* dir_name, bool recursive) {
   if (!recursive) {
-    return (TEMP_FAILURE_RETRY(remove(dir_name)) == 0);
+    if (File::GetType(dir_name, false) == File::kIsLink &&
+        File::GetType(dir_name, true) == File::kIsDirectory) {
+      return (TEMP_FAILURE_RETRY(unlink(dir_name)) == 0);
+    }
+    return (TEMP_FAILURE_RETRY(rmdir(dir_name)) == 0);
   } else {
     PathBuffer path;
     if (!path.Add(dir_name)) {
diff --git a/runtime/bin/directory_win.cc b/runtime/bin/directory_win.cc
index d4b0aaf..79c7b08 100644
--- a/runtime/bin/directory_win.cc
+++ b/runtime/bin/directory_win.cc
@@ -6,6 +6,7 @@
 #if defined(TARGET_OS_WINDOWS)
 
 #include "bin/directory.h"
+#include "bin/file.h"
 
 #include <errno.h>  // NOLINT
 #include <sys/stat.h>  // NOLINT
@@ -48,11 +49,39 @@
   }
 };
 
+// If link_name points to a link, IsBrokenLink will return true if link_name
+// points to an invalid target.
+static bool IsBrokenLink(const wchar_t* link_name) {
+  HANDLE handle = CreateFileW(
+      link_name,
+      0,
+      FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+      NULL,
+      OPEN_EXISTING,
+      FILE_FLAG_BACKUP_SEMANTICS,
+      NULL);
+  if (handle == INVALID_HANDLE_VALUE) {
+    return true;
+  } else {
+    CloseHandle(handle);
+    return false;
+  }
+}
+
+// A linked list structure holding a link target's unique file system ID.
+// Used to detect loops in the file system when listing recursively.
+struct LinkList {
+  DWORD volume;
+  DWORD id_low;
+  DWORD id_high;
+  LinkList* next;
+};
 
 // Forward declarations.
 static bool ListRecursively(PathBuffer* path,
                             bool recursive,
                             bool follow_links,
+                            LinkList* seen,
                             DirectoryListing* listing);
 static bool DeleteRecursively(PathBuffer* path);
 
@@ -69,6 +98,7 @@
                       PathBuffer* path,
                       bool recursive,
                       bool follow_links,
+                      LinkList* seen,
                       DirectoryListing* listing) {
   if (wcscmp(dir_name, L".") == 0) return true;
   if (wcscmp(dir_name, L"..") == 0) return true;
@@ -80,7 +110,8 @@
   bool ok = listing->HandleDirectory(utf8_path);
   free(utf8_path);
   return ok &&
-      (!recursive || ListRecursively(path, recursive, follow_links, listing));
+      (!recursive ||
+       ListRecursively(path, recursive, follow_links, seen, listing));
 }
 
 
@@ -116,24 +147,62 @@
                         PathBuffer* path,
                         bool recursive,
                         bool follow_links,
+                        LinkList* seen,
                         DirectoryListing* listing) {
   DWORD attributes = find_file_data->dwFileAttributes;
   if ((attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) {
     if (!follow_links) {
       return HandleLink(find_file_data->cFileName, path, listing);
     }
-    // Attempt to list the directory, to see if it's a valid link or not.
     int path_length = path->length;
     if (!path->Add(find_file_data->cFileName)) return false;
-    if (!path->Add(L"\\*")) return false;
-    WIN32_FIND_DATAW tmp_file_data;
-    HANDLE find_handle = FindFirstFileW(path->data, &tmp_file_data);
+    HANDLE handle = CreateFileW(
+        path->data,
+        0,
+        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+        NULL,
+        OPEN_EXISTING,
+        FILE_FLAG_BACKUP_SEMANTICS,
+        NULL);
     path->Reset(path_length);
-    if (find_handle == INVALID_HANDLE_VALUE) {
-      // Invalid handle, report as (broken) link.
+    if (handle == INVALID_HANDLE_VALUE) {
+      // Report as (broken) link.
       return HandleLink(find_file_data->cFileName, path, listing);
-    } else {
-      FindClose(find_handle);
+    }
+    if ((attributes & FILE_ATTRIBUTE_DIRECTORY) != 0) {
+      // Check the seen link targets to see if we are in a file system loop.
+      LinkList current_link;
+      BY_HANDLE_FILE_INFORMATION info;
+      // Get info
+      if (!GetFileInformationByHandle(handle, &info)) {
+        DWORD error = GetLastError();
+        CloseHandle(handle);
+        SetLastError(error);
+        PostError(listing, path->data);
+        return false;
+      }
+      CloseHandle(handle);
+      current_link.volume = info.dwVolumeSerialNumber;
+      current_link.id_low = info.nFileIndexLow;
+      current_link.id_high = info.nFileIndexHigh;
+      current_link.next = seen;
+      LinkList* previous = seen;
+      while (previous != NULL) {
+        if (previous->volume == current_link.volume &&
+            previous->id_low == current_link.id_low &&
+            previous->id_high == current_link.id_high) {
+          // Report the looping link as a link, rather than following it.
+          return HandleLink(find_file_data->cFileName, path, listing);
+        }
+        previous = previous->next;
+      }
+      // Recurse into the directory, adding current link to the seen links list.
+      return HandleDir(find_file_data->cFileName,
+                       path,
+                       recursive,
+                       follow_links,
+                       &current_link,
+                       listing);
     }
   }
   if ((attributes & FILE_ATTRIBUTE_DIRECTORY) != 0) {
@@ -141,6 +210,7 @@
                      path,
                      recursive,
                      follow_links,
+                     seen,
                      listing);
   } else {
     return HandleFile(find_file_data->cFileName, path, listing);
@@ -151,6 +221,7 @@
 static bool ListRecursively(PathBuffer* path,
                             bool recursive,
                             bool follow_links,
+                            LinkList* seen,
                             DirectoryListing* listing) {
   if (!path->Add(L"\\*")) {
     PostError(listing, path->data);
@@ -173,6 +244,7 @@
                              path,
                              recursive,
                              follow_links,
+                             seen,
                              listing);
 
   while ((FindNextFileW(find_handle, &find_file_data) != 0)) {
@@ -181,6 +253,7 @@
                           path,
                           recursive,
                           follow_links,
+                          seen,
                           listing) && success;
   }
 
@@ -248,14 +321,20 @@
 
 
 static bool DeleteRecursively(PathBuffer* path) {
+  DWORD attributes = GetFileAttributesW(path->data);
+  if ((attributes == INVALID_FILE_ATTRIBUTES)) {
+    return false;
+  }
   // If the directory is a junction, it's pointing to some other place in the
   // filesystem that we do not want to recurse into.
-  DWORD attributes = GetFileAttributesW(path->data);
-  if ((attributes != INVALID_FILE_ATTRIBUTES) &&
-      (attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) {
+  if ((attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) {
     // Just delete the junction itself.
     return RemoveDirectoryW(path->data) != 0;
   }
+  // If it's a file, remove it directly.
+  if ((attributes & FILE_ATTRIBUTE_DIRECTORY) == 0) {
+    return DeleteFile(L"", path);
+  }
 
   if (!path->Add(L"\\*")) return false;
 
@@ -299,7 +378,7 @@
     return false;
   }
   free(const_cast<wchar_t*>(system_name));
-  return ListRecursively(&path, recursive, follow_links, listing);
+  return ListRecursively(&path, recursive, follow_links, NULL, listing);
 }
 
 
@@ -318,6 +397,7 @@
     }
   }
   bool exists = (attributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
+  exists = exists && !IsBrokenLink(dir_name);
   return exists ? Directory::EXISTS : Directory::DOES_NOT_EXIST;
 }
 
@@ -407,13 +487,16 @@
   bool result = false;
   const wchar_t* system_dir_name = StringUtils::Utf8ToWide(dir_name);
   if (!recursive) {
-    result = (RemoveDirectoryW(system_dir_name) != 0);
+    if (File::GetType(dir_name, true) == File::kIsDirectory) {
+      result = (RemoveDirectoryW(system_dir_name) != 0);
+    } else {
+      SetLastError(ERROR_FILE_NOT_FOUND);
+    }
   } else {
     PathBuffer path;
-    if (!path.Add(system_dir_name)) {
-      return false;
+    if (path.Add(system_dir_name)) {
+      result = DeleteRecursively(&path);
     }
-    result = DeleteRecursively(&path);
   }
   free(const_cast<wchar_t*>(system_dir_name));
   return result;
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc
index 5c54ed8..f04a367 100644
--- a/runtime/bin/file.cc
+++ b/runtime/bin/file.cc
@@ -488,6 +488,22 @@
 }
 
 
+void FUNCTION_NAME(File_DeleteLink)(Dart_NativeArguments args) {
+  Dart_EnterScope();
+  const char* str =
+      DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
+  bool result = File::DeleteLink(str);
+  if (result) {
+    Dart_SetReturnValue(args, Dart_NewBoolean(result));
+  } else {
+    Dart_Handle err = DartUtils::NewDartOSError();
+    if (Dart_IsError(err)) Dart_PropagateError(err);
+    Dart_SetReturnValue(args, err);
+  }
+  Dart_ExitScope();
+}
+
+
 void FUNCTION_NAME(File_Directory)(Dart_NativeArguments args) {
   Dart_EnterScope();
   const char* str =
@@ -997,6 +1013,36 @@
 }
 
 
+static CObject* FileCreateLinkRequest(const CObjectArray& request) {
+  if (request.Length() != 3 ||
+      !request[1]->IsString() ||
+      !request[2]->IsString()) {
+    return CObject::IllegalArgumentError();
+  }
+  CObjectString link_name(request[1]);
+  CObjectString target_name(request[2]);
+  if (File::CreateLink(link_name.CString(), target_name.CString())) {
+    return CObject::True();
+  } else {
+    return CObject::NewOSError();
+  }
+}
+
+
+static CObject* FileDeleteLinkRequest(const CObjectArray& request) {
+  if (request.Length() == 2 && request[1]->IsString()) {
+    CObjectString filename(request[1]);
+    bool result = File::DeleteLink(filename.CString());
+    if (result) {
+      return CObject::True();
+    } else {
+      return CObject::NewOSError();
+    }
+  }
+  return CObject::IllegalArgumentError();
+}
+
+
 static void FileService(Dart_Port dest_port_id,
                  Dart_Port reply_port_id,
                  Dart_CObject* message) {
@@ -1063,6 +1109,12 @@
         case File::kWriteListRequest:
           response = FileWriteListRequest(request);
           break;
+        case File::kDeleteLinkRequest:
+          response = FileDeleteLinkRequest(request);
+          break;
+        case File::kCreateLinkRequest:
+          response = FileCreateLinkRequest(request);
+          break;
         default:
           UNREACHABLE();
       }
diff --git a/runtime/bin/file.h b/runtime/bin/file.h
index 0895a84..b4c5c50 100644
--- a/runtime/bin/file.h
+++ b/runtime/bin/file.h
@@ -76,7 +76,9 @@
     kWriteByteRequest = 15,
     kReadRequest = 16,
     kReadListRequest = 17,
-    kWriteListRequest = 18
+    kWriteListRequest = 18,
+    kCreateLinkRequest = 19,
+    kDeleteLinkRequest = 20
   };
 
   ~File();
@@ -131,6 +133,7 @@
   static bool Create(const char* path);
   static bool CreateLink(const char* path, const char* target);
   static bool Delete(const char* path);
+  static bool DeleteLink(const char* path);
   static off_t LengthFromPath(const char* path);
   static time_t LastModified(const char* path);
   static char* LinkTarget(const char* pathname);
diff --git a/runtime/bin/file_android.cc b/runtime/bin/file_android.cc
index 21dcaa9..2d7c99d 100644
--- a/runtime/bin/file_android.cc
+++ b/runtime/bin/file_android.cc
@@ -166,11 +166,25 @@
 
 
 bool File::Delete(const char* name) {
-  int status = TEMP_FAILURE_RETRY(remove(name));
-  if (status == -1) {
-    return false;
+  File::Type type = File::GetType(name, true);
+  if (type == kIsFile) {
+    return TEMP_FAILURE_RETRY(unlink(name)) == 0;
+  } else if (type == kIsDirectory) {
+    errno = EISDIR;
+  } else {
+    errno = ENOENT;
   }
-  return true;
+  return false;
+}
+
+
+bool File::DeleteLink(const char* name) {
+  File::Type type = File::GetType(name, false);
+  if (type == kIsLink) {
+    return TEMP_FAILURE_RETRY(unlink(name)) == 0;
+  }
+  errno = EINVAL;
+  return false;
 }
 
 
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index ceac630..8126ff9 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -167,11 +167,25 @@
 
 
 bool File::Delete(const char* name) {
-  int status = TEMP_FAILURE_RETRY(remove(name));
-  if (status == -1) {
-    return false;
+  File::Type type = File::GetType(name, true);
+  if (type == kIsFile) {
+    return TEMP_FAILURE_RETRY(unlink(name)) == 0;
+  } else if (type == kIsDirectory) {
+    errno = EISDIR;
+  } else {
+    errno = ENOENT;
   }
-  return true;
+  return false;
+}
+
+
+bool File::DeleteLink(const char* name) {
+  File::Type type = File::GetType(name, false);
+  if (type == kIsLink) {
+    return TEMP_FAILURE_RETRY(unlink(name)) == 0;
+  }
+  errno = EINVAL;
+  return false;
 }
 
 
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc
index 301424b..a5af904 100644
--- a/runtime/bin/file_macos.cc
+++ b/runtime/bin/file_macos.cc
@@ -169,11 +169,25 @@
 
 
 bool File::Delete(const char* name) {
-  int status = TEMP_FAILURE_RETRY(remove(name));
-  if (status == -1) {
-    return false;
+  File::Type type = File::GetType(name, true);
+  if (type == kIsFile) {
+    return TEMP_FAILURE_RETRY(unlink(name)) == 0;
+  } else if (type == kIsDirectory) {
+    errno = EISDIR;
+  } else {
+    errno = ENOENT;
   }
-  return true;
+  return false;
+}
+
+
+bool File::DeleteLink(const char* name) {
+  File::Type type = File::GetType(name, false);
+  if (type == kIsLink) {
+    return TEMP_FAILURE_RETRY(unlink(name)) == 0;
+  }
+  errno = EINVAL;
+  return false;
 }
 
 
diff --git a/runtime/bin/file_patch.dart b/runtime/bin/file_patch.dart
index e1e1bfa..c246002 100644
--- a/runtime/bin/file_patch.dart
+++ b/runtime/bin/file_patch.dart
@@ -13,6 +13,7 @@
       native "File_CreateLink";
   /* patch */ static _linkTarget(String path) native "File_LinkTarget";
   /* patch */ static _delete(String path) native "File_Delete";
+  /* patch */ static _deleteLink(String path) native "File_DeleteLink";
   /* patch */ static _directory(String path) native "File_Directory";
   /* patch */ static _lengthFromPath(String path) native "File_LengthFromPath";
   /* patch */ static _lastModified(String path) native "File_LastModified";
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index 3780fca..78074cc 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -259,19 +259,25 @@
 
 bool File::Delete(const char* name) {
   const wchar_t* system_name = StringUtils::Utf8ToWide(name);
+  int status = _wremove(system_name);
+  free(const_cast<wchar_t*>(system_name));
+  return status != -1;
+}
+
+
+bool File::DeleteLink(const char* name) {
+  const wchar_t* system_name = StringUtils::Utf8ToWide(name);
+  bool result = false;
   DWORD attributes = GetFileAttributesW(system_name);
   if ((attributes != INVALID_FILE_ATTRIBUTES) &&
       (attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) {
     // It's a junction(link), delete it.
-    return RemoveDirectoryW(system_name) != 0;
+    result = (RemoveDirectoryW(system_name) != 0);
   } else {
-    int status = _wremove(system_name);
-    free(const_cast<wchar_t*>(system_name));
-    if (status == -1) {
-      return false;
-    }
-    return true;
+    SetLastError(ERROR_NOT_A_REPARSE_POINT);
   }
+  free(const_cast<wchar_t*>(system_name));
+  return result;
 }
 
 
@@ -319,14 +325,12 @@
   if (result == 0) {
     DWORD error = GetLastError();
     CloseHandle(dir_handle);
-    free(buffer);
     SetLastError(error);
+    free(buffer);
     return NULL;
   }
   if (CloseHandle(dir_handle) == 0) {
-    DWORD error = GetLastError();
     free(buffer);
-    SetLastError(error);
     return NULL;
   }
 
@@ -372,10 +376,8 @@
                                utf8_length,
                                NULL,
                                NULL)) {
-    DWORD error = GetLastError();
     free(buffer);
     free(utf8_target);
-    SetLastError(error);
     return NULL;
   }
   utf8_target[utf8_length] = '\0';
@@ -480,15 +482,11 @@
 
 File::Type File::GetType(const char* pathname, bool follow_links) {
   const wchar_t* name = StringUtils::Utf8ToWide(pathname);
-  WIN32_FIND_DATAW file_data;
-  HANDLE find_handle = FindFirstFileW(name, &file_data);
-  if (find_handle == INVALID_HANDLE_VALUE) {
-    // TODO(whesse): Distinguish other errors from does not exist.
-    return File::kDoesNotExist;
-  }
-  FindClose(find_handle);
-  DWORD attributes = file_data.dwFileAttributes;
-  if ((attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) {
+  DWORD attributes = GetFileAttributesW(name);
+  File::Type result = kIsFile;
+  if (attributes == INVALID_FILE_ATTRIBUTES) {
+    result = kDoesNotExist;
+  } else if ((attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) {
     if (follow_links) {
       HANDLE dir_handle = CreateFileW(
           name,
@@ -499,26 +497,19 @@
           FILE_FLAG_BACKUP_SEMANTICS,
           NULL);
       if (dir_handle == INVALID_HANDLE_VALUE) {
-        // TODO(whesse): Distinguish other errors from does not exist.
-        return File::kDoesNotExist;
+        result = File::kIsLink;
       } else {
         CloseHandle(dir_handle);
-        return File::kIsDirectory;
+        result = File::kIsDirectory;
       }
     } else {
-      DWORD reparse_tag = file_data.dwReserved0;
-      if (reparse_tag == IO_REPARSE_TAG_SYMLINK ||
-          reparse_tag == IO_REPARSE_TAG_MOUNT_POINT) {
-        return File::kIsLink;
-      } else {
-        return File::kDoesNotExist;
-      }
+      result = kIsLink;
     }
   } else if ((attributes & FILE_ATTRIBUTE_DIRECTORY) != 0) {
-    return File::kIsDirectory;
-  } else {
-    return File::kIsFile;
+    result = kIsDirectory;
   }
+  free(const_cast<wchar_t*>(name));
+  return result;
 }
 
 
@@ -536,9 +527,7 @@
         FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
         NULL);
     if (file_handle == INVALID_HANDLE_VALUE) {
-      DWORD error = GetLastError();
       free(const_cast<wchar_t*>(wide_name));
-      SetLastError(error);
       return File::kError;
     }
     free(const_cast<wchar_t*>(wide_name));
diff --git a/runtime/bin/http_patch.dart b/runtime/bin/http_patch.dart
deleted file mode 100644
index fc3da60..0000000
--- a/runtime/bin/http_patch.dart
+++ /dev/null
@@ -1,8 +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.
-
-patch class _HttpSessionManager {
-  /* patch */ static Uint8List _getRandomBytes(int count)
-      native "Crypto_GetRandomBytes";
-}
diff --git a/runtime/bin/io.dart b/runtime/bin/io.dart
index 92ca329..4b2e666 100644
--- a/runtime/bin/io.dart
+++ b/runtime/bin/io.dart
@@ -11,6 +11,7 @@
 import "dart:collection";
 import "dart:crypto";
 import "dart:isolate";
+import 'dart:json' as JSON;
 import "dart:math";
 import "dart:nativewrappers";
 import "dart:typeddata";
diff --git a/runtime/bin/io_sources.gypi b/runtime/bin/io_sources.gypi
index 52ec37c..67294c9 100644
--- a/runtime/bin/io_sources.gypi
+++ b/runtime/bin/io_sources.gypi
@@ -11,7 +11,6 @@
     'file_patch.dart',
     'file_system_entity_patch.dart',
     'filter_patch.dart',
-    'http_patch.dart',
     'platform_patch.dart',
     'process_patch.dart',
     'socket_patch.dart',
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 988f78a..5e266ce 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -293,7 +293,8 @@
                           char** executable_name,
                           char** script_name,
                           CommandLineOptions* dart_options,
-                          bool* print_flags_seen) {
+                          bool* print_flags_seen,
+                          bool* verbose_debug_seen) {
   const char* kPrefix = "--";
   const intptr_t kPrefixLen = strlen(kPrefix);
 
@@ -318,6 +319,10 @@
           (strncmp(argv[i], kPrintFlags2, strlen(kPrintFlags2)) == 0)) {
         *print_flags_seen = true;
       }
+      const char* kVerboseDebug = "--verbose_debug";
+      if (strncmp(argv[i], kVerboseDebug, strlen(kVerboseDebug)) == 0) {
+        *verbose_debug_seen = true;
+      }
       vm_options->AddArgument(argv[i]);
       i++;
     }
@@ -422,19 +427,19 @@
     *error = strdup(Dart_GetError(result));                                    \
     Dart_ExitScope();                                                          \
     Dart_ShutdownIsolate();                                                    \
-    return false;                                                              \
+    return NULL;                                                               \
   }                                                                            \
 
 
 // Returns true on success, false on failure.
-static bool CreateIsolateAndSetupHelper(const char* script_uri,
-                                        const char* main,
-                                        void* data,
-                                        char** error) {
+static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri,
+                                                const char* main,
+                                                void* data,
+                                                char** error) {
   Dart_Isolate isolate =
       Dart_CreateIsolate(script_uri, main, snapshot_buffer, data, error);
   if (isolate == NULL) {
-    return false;
+    return NULL;
   }
 
   Dart_EnterScope();
@@ -476,17 +481,28 @@
     *error = strdup(errbuf);
     Dart_ExitScope();
     Dart_ShutdownIsolate();
-    return false;
+    return NULL;
   }
+
+  // Make the isolate runnable so that it is ready to handle messages.
   Dart_ExitScope();
+  Dart_ExitIsolate();
+  bool retval = Dart_IsolateMakeRunnable(isolate);
+  if (!retval) {
+    *error = strdup("Invalid isolate state - Unable to make it runnable");
+    Dart_EnterIsolate(isolate);
+    Dart_ShutdownIsolate();
+    return NULL;
+  }
+
   VmStats::AddIsolate(reinterpret_cast<IsolateData*>(data), isolate);
-  return true;
+  return isolate;
 }
 
 
-static bool CreateIsolateAndSetup(const char* script_uri,
-                                  const char* main,
-                                  void* data, char** error) {
+static Dart_Isolate CreateIsolateAndSetup(const char* script_uri,
+                                          const char* main,
+                                          void* data, char** error) {
   return CreateIsolateAndSetupHelper(script_uri,
                                      main,
                                      new IsolateData(),
@@ -563,34 +579,20 @@
 
 static Dart_Handle SetBreakpoint(const char* breakpoint_at,
                                  Dart_Handle library) {
-  Dart_Handle result;
-  if (strchr(breakpoint_at, ':')) {
-    char* bpt_line = strdup(breakpoint_at);
-    char* colon = strchr(bpt_line, ':');
-    ASSERT(colon != NULL);
-    *colon = '\0';
-    Dart_Handle url = DartUtils::NewString(bpt_line);
-    Dart_Handle line_number = Dart_NewInteger(atoi(colon + 1));
-    free(bpt_line);
-    Dart_Breakpoint bpt;
-    result = Dart_SetBreakpointAtLine(url, line_number, &bpt);
+  char* bpt_function = strdup(breakpoint_at);
+  Dart_Handle class_name;
+  Dart_Handle function_name;
+  char* dot = strchr(bpt_function, '.');
+  if (dot == NULL) {
+    class_name = DartUtils::NewString("");
+    function_name = DartUtils::NewString(breakpoint_at);
   } else {
-    char* bpt_function = strdup(breakpoint_at);
-    Dart_Handle class_name;
-    Dart_Handle function_name;
-    char* dot = strchr(bpt_function, '.');
-    if (dot == NULL) {
-      class_name = DartUtils::NewString("");
-      function_name = DartUtils::NewString(breakpoint_at);
-    } else {
-      *dot = '\0';
-      class_name = DartUtils::NewString(bpt_function);
-      function_name = DartUtils::NewString(dot + 1);
-    }
-    free(bpt_function);
-    result = Dart_OneTimeBreakAtEntry(library, class_name, function_name);
+    *dot = '\0';
+    class_name = DartUtils::NewString(bpt_function);
+    function_name = DartUtils::NewString(dot + 1);
   }
-  return result;
+  free(bpt_function);
+  return Dart_OneTimeBreakAtEntry(library, class_name, function_name);
 }
 
 
@@ -677,6 +679,7 @@
   CommandLineOptions vm_options(argc);
   CommandLineOptions dart_options(argc);
   bool print_flags_seen = false;
+  bool verbose_debug_seen = false;
 
   // Perform platform specific initialization.
   if (!Platform::Initialize()) {
@@ -694,7 +697,8 @@
                      &executable_name,
                      &script_name,
                      &dart_options,
-                     &print_flags_seen) < 0) {
+                     &print_flags_seen,
+                     &verbose_debug_seen) < 0) {
     if (has_help_option) {
       PrintUsage();
       return 0;
@@ -728,16 +732,20 @@
   if (start_debugger) {
     ASSERT(debug_port != 0);
     DebuggerConnectionHandler::StartHandler(debug_ip, debug_port);
+    if (verbose_debug_seen) {
+      Log::Print("Debugger initialized\n");
+    }
   }
 
   // Call CreateIsolateAndSetup which creates an isolate and loads up
   // the specified application script.
   char* error = NULL;
   char* isolate_name = BuildIsolateName(script_name, "main");
-  if (!CreateIsolateAndSetupHelper(script_name,
-                                   "main",
-                                   new IsolateData(),
-                                   &error)) {
+  Dart_Isolate isolate = CreateIsolateAndSetupHelper(script_name,
+                                                     "main",
+                                                     new IsolateData(),
+                                                     &error);
+  if (isolate == NULL) {
     Log::PrintErr("%s\n", error);
     free(error);
     delete [] isolate_name;
@@ -745,7 +753,8 @@
   }
   delete [] isolate_name;
 
-  Dart_Isolate isolate = Dart_CurrentIsolate();
+  Dart_EnterIsolate(isolate);
+  ASSERT(isolate == Dart_CurrentIsolate());
   ASSERT(isolate != NULL);
   Dart_Handle result;
 
diff --git a/runtime/bin/process_patch.dart b/runtime/bin/process_patch.dart
index 281259b..64828f5 100644
--- a/runtime/bin/process_patch.dart
+++ b/runtime/bin/process_patch.dart
@@ -90,11 +90,11 @@
     }
 
     // stdin going to process.
-    _stdin = new _Socket._writePipe();
+    _stdin = new _StdSink(new _Socket._writePipe());
     // stdout coming from process.
-    _stdout = new _Socket._readPipe();
+    _stdout = new _StdStream(new _Socket._readPipe());
     // stderr coming from process.
-    _stderr = new _Socket._readPipe();
+    _stderr = new _StdStream(new _Socket._readPipe());
     _exitHandler = new _Socket._readPipe();
     _ended = false;
     _started = false;
@@ -163,9 +163,9 @@
                                   _arguments,
                                   _workingDirectory,
                                   _environment,
-                                  _stdin._nativeSocket,
-                                  _stdout._nativeSocket,
-                                  _stderr._nativeSocket,
+                                  _stdin._sink._nativeSocket,
+                                  _stdout._stream._nativeSocket,
+                                  _stderr._stream._nativeSocket,
                                   _exitHandler._nativeSocket,
                                   status);
       if (!success) {
@@ -196,7 +196,7 @@
           _ended = true;
           _exitCode.complete(exitCode(exitDataBuffer));
           // Kill stdin, helping hand if the user forgot to do it.
-          _stdin.destroy();
+          _stdin._sink.destroy();
         }
 
         exitDataBuffer.setRange(exitDataRead, data.length, data);
@@ -222,17 +222,14 @@
                     _ProcessStartStatus status) native "Process_Start";
 
   Stream<List<int>> get stdout {
-    // TODO(ajohnsen): Get stream object only.
     return _stdout;
   }
 
   Stream<List<int>> get stderr {
-    // TODO(ajohnsen): Get stream object only.
     return _stderr;
   }
 
   IOSink get stdin {
-    // TODO(ajohnsen): Get consumer object only.
     return _stdin;
   }
 
@@ -255,9 +252,9 @@
   String _workingDirectory;
   List<String> _environment;
   // Private methods of Socket are used by _in, _out, and _err.
-  Socket _stdin;
-  Socket _stdout;
-  Socket _stderr;
+  _StdSink _stdin;
+  _StdStream _stdout;
+  _StdStream _stderr;
   Socket _exitHandler;
   bool _ended;
   bool _started;
diff --git a/runtime/bin/secure_socket.cc b/runtime/bin/secure_socket.cc
index 0f9140b..e66ff35 100644
--- a/runtime/bin/secure_socket.cc
+++ b/runtime/bin/secure_socket.cc
@@ -17,6 +17,7 @@
 #include <prerror.h>
 #include <prinit.h>
 #include <prnetdb.h>
+#include <secmod.h>
 #include <ssl.h>
 #include <sslproto.h>
 
@@ -333,36 +334,57 @@
   bad_certificate_callback_ = ThrowIfError(Dart_NewPersistentHandle(callback));
 }
 
+static const char* builtin_roots_module =
+#if defined(TARGET_OS_LINUX) || defined(TARGET_OS_ANDROID)
+    "name=\"Root Certs\" library=\"libnssckbi.so\"";
+#elif defined(TARGET_OS_MACOS)
+    "name=\"Root Certs\" library=\"libnssckbi.dylib\"";
+#elif defined(TARGET_OS_WINDOWS)
+    "name=\"Root Certs\" library=\"nssckbi.dll\"";
+#else
+#error Automatic target os detection failed.
+#endif
+
+
 
 void SSLFilter::InitializeLibrary(const char* certificate_database,
                                   const char* password,
                                   bool use_builtin_root_certificates,
                                   bool report_duplicate_initialization) {
   MutexLocker locker(&mutex_);
+  SECStatus status;
   if (!library_initialized_) {
     password_ = strdup(password);  // This one copy persists until Dart exits.
     PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);
     // TODO(whesse): Verify there are no UTF-8 issues here.
-    PRUint32 init_flags = NSS_INIT_READONLY;
-    if (certificate_database == NULL) {
-      // Passing the empty string as the database path does not try to open
-      // a database in the current directory.
-      certificate_database = "";
-      // The flag NSS_INIT_NOCERTDB is documented to do what we want here,
-      // however it causes the builtins not to be available on Windows.
-      init_flags |= NSS_INIT_FORCEOPEN;
-    }
-    if (!use_builtin_root_certificates) {
-      init_flags |= NSS_INIT_NOMODDB;
-    }
-    SECStatus status = NSS_Initialize(certificate_database,
-                                      "",
-                                      "",
-                                      SECMOD_DB,
-                                      init_flags);
-    if (status != SECSuccess) {
-      mutex_.Unlock();  // MutexLocker destructor not called when throwing.
-      ThrowPRException("Failed NSS_Init call.");
+    if (certificate_database == NULL || certificate_database[0] == '\0') {
+      status = NSS_NoDB_Init(NULL);
+      if (status != SECSuccess) {
+        mutex_.Unlock();  // MutexLocker destructor not called when throwing.
+        ThrowPRException("Failed NSS_NoDB_Init call.");
+      }
+      if (use_builtin_root_certificates) {
+        SECMODModule* module = SECMOD_LoadUserModule(
+            const_cast<char*>(builtin_roots_module), NULL, PR_FALSE);
+        if (!module) {
+          mutex_.Unlock();  // MutexLocker destructor not called when throwing.
+          ThrowPRException("Failed to load builtin root certificates.");
+        }
+      }
+    } else {
+      PRUint32 init_flags = NSS_INIT_READONLY;
+      if (!use_builtin_root_certificates) {
+        init_flags |= NSS_INIT_NOMODDB;
+      }
+      status = NSS_Initialize(certificate_database,
+                              "",
+                              "",
+                              SECMOD_DB,
+                              init_flags);
+      if (status != SECSuccess) {
+        mutex_.Unlock();  // MutexLocker destructor not called when throwing.
+        ThrowPRException("Failed NSS_Init call.");
+      }
     }
     library_initialized_ = true;
 
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index cb289e8..81e8ab3 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -471,7 +471,7 @@
   }
 
   void _onSubscriptionStateChange() {
-    if (_controller.hasSubscribers) {
+    if (_controller.hasListener) {
       _resume();
     } else {
       close();
@@ -598,7 +598,7 @@
   }
 
   void _onSubscriptionStateChange() {
-    if (_controller.hasSubscribers) {
+    if (_controller.hasListener) {
       _resume();
     } else {
       close();
@@ -659,7 +659,7 @@
 }
 
 
-class _SocketStreamConsumer extends StreamConsumer<List<int>, Socket> {
+class _SocketStreamConsumer extends StreamConsumer<List<int>> {
   StreamSubscription subscription;
   final _Socket socket;
   int offset;
@@ -813,9 +813,9 @@
 
   void writeCharCode(int charCode) => _sink.writeCharCode(charCode);
 
-  void writeAll(Iterable objects) => _sink.writeAll(objects);
+  void writeAll(Iterable objects, [sep = ""]) => _sink.writeAll(objects, sep);
 
-  void writeBytes(List<int> bytes) => _sink.writeBytes(bytes);
+  void add(List<int> bytes) => _sink.add(bytes);
 
   Future<Socket> consume(Stream<List<int>> stream) {
     return _sink.consume(stream);
@@ -867,7 +867,7 @@
   }
 
   void _onSubscriptionStateChange() {
-    if (_controller.hasSubscribers) {
+    if (_controller.hasListener) {
       _ensureRawSocketSubscription();
       // Enable read events for providing data to subscription.
       if (_raw != null) {
diff --git a/runtime/bin/stdio_patch.dart b/runtime/bin/stdio_patch.dart
index 941ae37..cb1c920 100644
--- a/runtime/bin/stdio_patch.dart
+++ b/runtime/bin/stdio_patch.dart
@@ -8,9 +8,9 @@
       case _STDIO_HANDLE_TYPE_TERMINAL:
       case _STDIO_HANDLE_TYPE_PIPE:
       case _STDIO_HANDLE_TYPE_SOCKET:
-        return new _Socket._readPipe(0);
+        return new _StdStream(new _Socket._readPipe(0));
       case _STDIO_HANDLE_TYPE_FILE:
-        return new _FileStream.forStdin();
+        return new _StdStream(new _FileStream.forStdin());
       default:
         throw new FileIOException("Unsupported stdin type");
     }
@@ -22,9 +22,9 @@
       case _STDIO_HANDLE_TYPE_TERMINAL:
       case _STDIO_HANDLE_TYPE_PIPE:
       case _STDIO_HANDLE_TYPE_SOCKET:
-        return new _Socket._writePipe(fd);
+        return new _StdSink(new _Socket._writePipe(fd));
       case _STDIO_HANDLE_TYPE_FILE:
-        return new IOSink(new _FileStreamConsumer.fromStdio(fd));
+        return new _StdSink(new IOSink(new _FileStreamConsumer.fromStdio(fd)));
       default:
         throw new FileIOException("Unsupported stdin type");
     }
diff --git a/runtime/bin/vmstats/bargraph.dart b/runtime/bin/vmstats/bargraph.dart
index c353253..865a5a8 100644
--- a/runtime/bin/vmstats/bargraph.dart
+++ b/runtime/bin/vmstats/bargraph.dart
@@ -38,7 +38,7 @@
 
   void drawBarGraph() {
     // Draw chart's outer box.
-    var context = _canvas.context2d;
+    var context = _canvas.context2D;
     context.beginPath();
     context.strokeStyle = 'black';
     // The '2's are the width of the line, even though 1 is specified.
@@ -76,7 +76,7 @@
 
   void drawChart(int maxHeight, double scale) {
     var dividerHeight = maxHeight ~/ NUM_DIVIDERS;
-    var context = _canvas.context2d;
+    var context = _canvas.context2D;
     context.beginPath();
     var height = maxHeight.toInt();
     var scaledY = dividerHeight * scale;
@@ -105,7 +105,7 @@
     var y = INSIDE_MARGIN;
     var w = _canvas.width - LEFT_MARGIN - RIGHT_MARGIN - INSIDE_MARGIN;
     var h = (maxHeight * scale).ceil() - (2 * INSIDE_MARGIN);
-    _canvas.context2d.clearRect(x, y, w, h);
+    _canvas.context2D.clearRect(x, y, w, h);
 
     while (iterator.moveNext()) {
       Sample s = iterator.current;
@@ -129,7 +129,7 @@
 
   void drawVerticalSegment(int x, int y, int w, int h, String color,
                            num scale) {
-    var context = _canvas.context2d;
+    var context = _canvas.context2D;
     y = (y * scale).floor();
     h = (h * scale).ceil();
     context.beginPath();
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index c9375ca..2ac024a 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -546,6 +546,20 @@
 DART_EXPORT const char* Dart_VersionString();
 
 /**
+ * An isolate is the unit of concurrency in Dart. Each isolate has
+ * its own memory and thread of control. No state is shared between
+ * isolates. Instead, isolates communicate by message passing.
+ *
+ * Each thread keeps track of its current isolate, which is the
+ * isolate which is ready to execute on the current thread. The
+ * current isolate may be NULL, in which case no isolate is ready to
+ * execute. Most of the Dart apis require there to be a current
+ * isolate in order to function without error. The current isolate is
+ * set by any call to Dart_CreateIsolate or Dart_EnterIsolate.
+ */
+typedef struct _Dart_Isolate* Dart_Isolate;
+
+/**
  * An isolate creation and initialization callback function.
  *
  * This callback, provided by the embedder, is called when the vm
@@ -573,18 +587,20 @@
  *   eventually run.  This is provided for advisory purposes only to
  *   improve debugging messages.  The main function is not invoked by
  *   this function.
+ * \param unhandled_exc The name of the function to this isolate will
+ *   call when an unhandled exception is encountered.
  * \param callback_data The callback data which was passed to the
  *   parent isolate when it was created by calling Dart_CreateIsolate().
  * \param error A structure into which the embedder can place a
  *   C string containing an error message in the case of failures.
  *
- * \return The embedder returns false if the creation and
- *   initialization was not successful and true if successful.
+ * \return The embedder returns NULL if the creation and
+ *   initialization was not successful and the isolate if successful.
  */
-typedef bool (*Dart_IsolateCreateCallback)(const char* script_uri,
-                                           const char* main,
-                                           void* callback_data,
-                                           char** error);
+typedef Dart_Isolate (*Dart_IsolateCreateCallback)(const char* script_uri,
+                                                   const char* main,
+                                                   void* callback_data,
+                                                   char** error);
 
 /**
  * An isolate interrupt callback function.
@@ -680,20 +696,6 @@
 // --- Isolates ---
 
 /**
- * An isolate is the unit of concurrency in Dart. Each isolate has
- * its own memory and thread of control. No state is shared between
- * isolates. Instead, isolates communicate by message passing.
- *
- * Each thread keeps track of its current isolate, which is the
- * isolate which is ready to execute on the current thread. The
- * current isolate may be NULL, in which case no isolate is ready to
- * execute. Most of the Dart apis require there to be a current
- * isolate in order to function without error. The current isolate is
- * set by any call to Dart_CreateIsolate or Dart_EnterIsolate.
- */
-typedef struct _Dart_Isolate* Dart_Isolate;
-
-/**
  * Creates a new isolate. The new isolate becomes the current isolate.
  *
  * A snapshot can be used to restore the VM quickly to a saved state
@@ -827,6 +829,20 @@
  */
 DART_EXPORT void Dart_InterruptIsolate(Dart_Isolate isolate);
 
+
+/**
+ * Make isolate runnable.
+ *
+ * When isolates are spawned this function is used to indicate that
+ * the creation and initialization (including script loading) of the
+ * isolate is complete and the isolate can start.
+ * This function does not expect there to be a current isolate.
+ *
+ * \param isolate The isolate to be made runnable.
+ */
+DART_EXPORT bool Dart_IsolateMakeRunnable(Dart_Isolate isolate);
+
+
 // --- Messages and Ports ---
 
 /**
diff --git a/runtime/include/dart_debugger_api.h b/runtime/include/dart_debugger_api.h
index 810623d9..1fa5f2d 100755
--- a/runtime/include/dart_debugger_api.h
+++ b/runtime/include/dart_debugger_api.h
@@ -68,22 +68,6 @@
 
 
 /**
- * DEPRECATED -- use Dart_GetLibraryIds instead.
- *
- * Returns a list of urls (strings) of all the libraries loaded in the
- * current isolate.
- *
- * Requires there to be a current isolate.
- *
- * \return A handle to a list of string handles.
- */
-DART_EXPORT Dart_Handle Dart_GetLibraryURLs();
-// TODO(turnidge): The embedding and debugger apis are not consistent
-// in how they capitalize url.  One uses 'Url' and the other 'URL'.
-// They should be the same.
-
-
-/**
  * Returns a list of ids (integers) of all the libraries loaded in the
  * current isolate.
  *
@@ -142,6 +126,28 @@
 
 
 /**
+ * Returns an array containing line number and token offset info
+ * for the given script.
+ *
+ * Returns an array of numbers. Null values indicate the beginning of
+ * a new line. The first number after null is the line number.
+ * The line number is followed by pairs of numbers, with the first value
+ * being the "token offset" and the second value being the character offset
+ * of the token relative to the beginning of the script.
+ * The "token offset" is a value that is used to indicate a location
+ * in code, similarly to a "PC" address.
+ * Source lines with no tokens are omitted.
+ *
+ * Requires there to be a current isolate.
+ *
+ * \return A handle to an array or an error object.
+ */
+DART_EXPORT Dart_Handle Dart_ScriptGetTokenInfo(
+                            intptr_t library_id,
+                            Dart_Handle script_url_in);
+
+
+/**
  * Returns a string containing a generated source code of the given script
  * in the given library. This is essentially used to pretty print dart code
  * generated from any tool (e.g: dart2dart).
@@ -201,41 +207,19 @@
 
 
 /**
- * DEPRECATED -- use Dart_SetBreakpoint instead.
- *
- * Sets a breakpoint at line \line_number in \script_url, or the closest
- * following line (within the same function) where a breakpoint can be set.
- *
- * Requires there to be a current isolate.
- *
- * \breakpoint If non-null, will point to the breakpoint object
- *   if a breakpoint was successfully created.
- *
- * \return A handle to the True object if no error occurs.
- */
-DART_EXPORT Dart_Handle Dart_SetBreakpointAtLine(
-                            Dart_Handle script_url,
-                            Dart_Handle line_number,
-                            Dart_Breakpoint* breakpoint);
-
-
-/**
  * Sets a one-time breakpoint at the entry of the given function.
  * If class_name is the empty string, looks for a library function
  * with the given name.
  *
  * Requires there to be a current isolate.
  *
- * \breakpoint If non-null, will point to the breakpoint object
- *   if a breakpoint was successfully created.
- *
- * \return A handle to the True object if no error occurs.
+ * \return A handle containing the breakpoint id, which is an integer
+ * value, or an error object if a breakpoint could not be set.
  */
 DART_EXPORT Dart_Handle Dart_SetBreakpointAtEntry(
                             Dart_Handle library,
                             Dart_Handle class_name,
-                            Dart_Handle function_name,
-                            Dart_Breakpoint* breakpoint);
+                            Dart_Handle function_name);
 
 
 /**
@@ -254,19 +238,6 @@
 
 
 /**
- * DEPRECATED -- use Dart_RemoveBreakpoint instead.
- *
- * Deletes the given \breakpoint.
- *
- * Requires there to be a current isolate.
- *
- * \return A handle to the True object if no error occurs.
- */
-DART_EXPORT Dart_Handle Dart_DeleteBreakpoint(
-                            Dart_Breakpoint breakpoint);
-
-
-/**
  * Can be called from the breakpoint handler. Sets the debugger to
  * single step mode.
  *
@@ -434,6 +405,7 @@
 DART_EXPORT Dart_Handle Dart_ActivationFrameGetLocation(
                             Dart_ActivationFrame activation_frame,
                             Dart_Handle* script_url,
+                            intptr_t* library_id,
                             intptr_t* token_number);
 
 
diff --git a/runtime/lib/array.dart b/runtime/lib/array.dart
index e92744c..0ee4d08 100644
--- a/runtime/lib/array.dart
+++ b/runtime/lib/array.dart
@@ -13,7 +13,7 @@
   void operator []=(int index, E value) native "ObjectArray_setIndexed";
 
   String toString() {
-    return Collections.collectionToString(this);
+    return ToString.iterableToString(this);
   }
 
   int get length native "ObjectArray_getLength";
@@ -39,17 +39,6 @@
         "Cannot remove element of a non-extendable array");
   }
 
-  // Collection interface.
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError(
-        "Cannot remove element of a non-extendable array");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError(
-        "Cannot remove element of a non-extendable array");
-  }
-
   void removeWhere(bool test(E element)) {
     throw new UnsupportedError(
         "Cannot remove element of a non-extendable array");
@@ -60,6 +49,10 @@
         "Cannot remove element of a non-extendable array");
   }
 
+  Iterable<E> getRange(int start, [int end]) {
+    return IterableMixinWorkaround.getRangeList(this, start, end);
+  }
+
   // List interface.
   void setRange(int start, int length, List<E> from, [int startFrom = 0]) {
     if (length < 0) {
@@ -94,8 +87,6 @@
     return list;
   }
 
-  List<E> getRange(int start, int length) => sublist(start, start + length);
-
   // Iterable interface.
 
   bool contains(E element) {
@@ -106,7 +97,7 @@
     IterableMixinWorkaround.forEach(this, f);
   }
 
-  String join([String separator]) {
+  String join([String separator = ""]) {
     return IterableMixinWorkaround.joinList(this, separator);
   }
 
@@ -114,8 +105,8 @@
     return IterableMixinWorkaround.mapList(this, f);
   }
 
-  reduce(initialValue, combine(previousValue, E element)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  E reduce(E combine(E value, E element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
   fold(initialValue, combine(previousValue, E element)) {
@@ -174,7 +165,7 @@
     return this.length == 0;
   }
 
-  Iterable<E> get reversed => new ReversedListIterable<E>(this);
+  Iterable<E> get reversed => IterableMixinWorkaround.reversedList(this);
 
   void sort([int compare(E a, E b)]) {
     IterableMixinWorkaround.sortList(this, compare);
@@ -234,10 +225,6 @@
     throw new StateError("More than one element");
   }
 
-  E min([int compare(E a, E b)]) => IterableMixinWorkaround.min(this, compare);
-
-  E max([int compare(E a, E b)]) => IterableMixinWorkaround.max(this, compare);
-
   List<E> toList({ bool growable: true}) {
     return new List<E>.from(this, growable: growable);
   }
@@ -290,16 +277,6 @@
         "Cannot modify an immutable array");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError(
-        "Cannot modify an immutable array");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError(
-        "Cannot modify an immutable array");
-  }
-
   void removeWhere(bool test(E element)) {
     throw new UnsupportedError(
         "Cannot modify an immutable array");
@@ -341,7 +318,9 @@
     return list;
   }
 
-  List<E> getRange(int start, int length) => sublist(start, start + length);
+  Iterable<E> getRange(int start, int end) {
+    return IterableMixinWorkaround.getRangeList(this, start, end);
+  }
 
   // Collection interface.
 
@@ -357,12 +336,12 @@
     return IterableMixinWorkaround.mapList(this, f);
   }
 
-  String join([String separator]) {
+  String join([String separator = ""]) {
     return IterableMixinWorkaround.joinList(this, separator);
   }
 
-  reduce(initialValue, combine(previousValue, E element)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  E reduce(E combine(E value, E element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
   fold(initialValue, combine(previousValue, E element)) {
@@ -421,7 +400,7 @@
     return this.length == 0;
   }
 
-  Iterable<E> get reversed => new ReversedListIterable<E>(this);
+  Iterable<E> get reversed => IterableMixinWorkaround.reversedList(this);
 
   void sort([int compare(E a, E b)]) {
     throw new UnsupportedError(
@@ -429,7 +408,7 @@
   }
 
   String toString() {
-    return Collections.collectionToString(this);
+    return ToString.iterableToString(this);
   }
 
   int indexOf(E element, [int start = 0]) {
@@ -486,10 +465,6 @@
     throw new StateError("More than one element");
   }
 
-  E min([int compare(E a, E b)]) => IterableMixinWorkaround.min(this, compare);
-
-  E max([int compare(E a, E b)]) => IterableMixinWorkaround.max(this, compare);
-
   List<E> toList({ bool growable: true }) {
     return new List<E>.from(this, growable: growable);
   }
diff --git a/runtime/lib/collection_patch.dart b/runtime/lib/collection_patch.dart
index 2d4881e..8ed2abc 100644
--- a/runtime/lib/collection_patch.dart
+++ b/runtime/lib/collection_patch.dart
@@ -9,7 +9,6 @@
     _hashTable._container = this;
   }
 
-
   /* patch */ bool containsKey(K key) {
     return _hashTable._get(key) >= 0;
   }
@@ -189,3 +188,815 @@
     _table._clear();
   }
 }
+
+/**
+ * A hash-based map that iterates keys and values in key insertion order.
+ */
+patch class LinkedHashMap<K, V> {
+  final _LinkedHashMapTable _hashTable;
+
+  /* patch */ LinkedHashMap() : _hashTable = new _LinkedHashMapTable<K, V>() {
+    _hashTable._container = this;
+  }
+
+  /* patch */ bool containsKey(K key) {
+    return _hashTable._get(key) >= 0;
+  }
+
+  /* patch */ bool containsValue(V value) {
+    int modificationCount = _hashTable._modificationCount;
+    for (int offset = _hashTable._next(_LinkedHashTable._HEAD_OFFSET);
+         offset != _LinkedHashTable._HEAD_OFFSET;
+         offset = _hashTable._next(offset)) {
+      if (_hashTable._value(offset) == value) {
+        return true;
+      }
+      // The == call may modify the table.
+      _hashTable._checkModification(modificationCount);
+    }
+    return false;
+  }
+
+  /* patch */ void addAll(Map<K, V> other) {
+    other.forEach((K key, V value) {
+      int offset = _hashTable._put(key);
+      _hashTable._setValue(offset, value);
+      _hashTable._checkCapacity();
+    });
+  }
+
+  /* patch */ V operator [](K key) {
+    int offset = _hashTable._get(key);
+    if (offset >= 0) return _hashTable._value(offset);
+    return null;
+  }
+
+  /* patch */ void operator []=(K key, V value) {
+    int offset = _hashTable._put(key);
+    _hashTable._setValue(offset, value);
+    _hashTable._checkCapacity();
+  }
+
+  /* patch */ V putIfAbsent(K key, V ifAbsent()) {
+    int offset = _hashTable._probeForAdd(_hashTable._hashCodeOf(key), key);
+    Object entry = _hashTable._table[offset];
+    if (!_hashTable._isFree(entry)) {
+      return _hashTable._value(offset);
+    }
+    int modificationCount = _hashTable._modificationCount;
+    V value = ifAbsent();
+    if (modificationCount == _hashTable._modificationCount) {
+      _hashTable._setKey(offset, key);
+      _hashTable._setValue(offset, value);
+      _hashTable._linkLast(offset);
+      if (entry == null) {
+        _hashTable._entryCount++;
+        _hashTable._checkCapacity();
+      } else {
+        assert(identical(entry, _TOMBSTONE));
+        _hashTable._deletedCount--;
+      }
+      _hashTable._recordModification();
+    } else {
+      // The table might have changed, so we can't trust [offset] any more.
+      // Do another lookup before setting the value.
+      offset = _hashTable._put(key);
+      _hashTable._setValue(offset, value);
+      _hashTable._checkCapacity();
+    }
+    return value;
+  }
+
+  /* patch */ V remove(K key) {
+    int offset = _hashTable._remove(key);
+    if (offset < 0) return null;
+    Object oldValue = _hashTable._value(offset);
+    _hashTable._setValue(offset, null);
+    _hashTable._checkCapacity();
+    return oldValue;
+  }
+
+  /* patch */ void clear() {
+    _hashTable._clear();
+  }
+
+  /* patch */ void forEach(void action (K key, V value)) {
+    int modificationCount = _hashTable._modificationCount;
+    for (int offset = _hashTable._next(_LinkedHashTable._HEAD_OFFSET);
+         offset != _LinkedHashTable._HEAD_OFFSET;
+         offset = _hashTable._next(offset)) {
+      action(_hashTable._key(offset), _hashTable._value(offset));
+      _hashTable._checkModification(modificationCount);
+    }
+  }
+
+  /* patch */ Iterable<K> get keys =>
+      new _LinkedHashTableKeyIterable<K>(_hashTable);
+
+  /* patch */ Iterable<V> get values =>
+      new _LinkedHashTableValueIterable<V>(_hashTable,
+                                           _LinkedHashMapTable._VALUE_INDEX);
+
+  /* patch */ int get length => _hashTable._elementCount;
+
+  /* patch */ bool get isEmpty => _hashTable._elementCount == 0;
+}
+
+patch class LinkedHashSet<E> extends _HashSetBase<E> {
+  static const int _INITIAL_CAPACITY = 8;
+  _LinkedHashTable<E> _table;
+
+  /* patch */ LinkedHashSet() {
+    _table = new _LinkedHashTable(_INITIAL_CAPACITY);
+    _table._container = this;
+  }
+
+  // Iterable.
+  /* patch */ Iterator<E> get iterator {
+    return new _LinkedHashTableKeyIterator<E>(_table);
+  }
+
+  /* patch */ int get length => _table._elementCount;
+
+  /* patch */ bool get isEmpty => _table._elementCount == 0;
+
+  /* patch */ bool contains(Object object) => _table._get(object) >= 0;
+
+  /* patch */ void forEach(void action(E element)) {
+    int offset = _table._next(_LinkedHashTable._HEAD_OFFSET);
+    int modificationCount = _table._modificationCount;
+    while (offset != _LinkedHashTable._HEAD_OFFSET) {
+      E key = _table._key(offset);
+      action(key);
+      _table._checkModification(modificationCount);
+      offset = _table._next(offset);
+    }
+  }
+
+  /* patch */ E get first {
+    int firstOffset = _table._next(_LinkedHashTable._HEAD_OFFSET);
+    if (firstOffset == _LinkedHashTable._HEAD_OFFSET) {
+      throw new StateError("No elements");
+    }
+    return _table._key(firstOffset);
+  }
+
+  /* patch */ E get last {
+    int lastOffset = _table._prev(_LinkedHashTable._HEAD_OFFSET);
+    if (lastOffset == _LinkedHashTable._HEAD_OFFSET) {
+      throw new StateError("No elements");
+    }
+    return _table._key(lastOffset);
+  }
+
+  // Collection.
+  void _filterWhere(bool test(E element), bool removeMatching) {
+    int entrySize = _table._entrySize;
+    int length = _table._table.length;
+    int offset = _table._next(_LinkedHashTable._HEAD_OFFSET);
+    while (offset != _LinkedHashTable._HEAD_OFFSET) {
+      E key = _table._key(offset);
+      int nextOffset = _table._next(offset);
+      int modificationCount = _table._modificationCount;
+      bool shouldRemove = (removeMatching == test(key));
+      _table._checkModification(modificationCount);
+      if (shouldRemove) {
+        _table._deleteEntry(offset);
+      }
+      offset = nextOffset;
+    }
+    _table._checkCapacity();
+  }
+
+  /* patch */ void add(E element) {
+    _table._put(element);
+    _table._checkCapacity();
+  }
+
+  /* patch */ void addAll(Iterable<E> objects) {
+    for (E object in objects) {
+      _table._put(object);
+      _table._checkCapacity();
+    }
+  }
+
+  /* patch */ bool remove(Object object) {
+    int offset = _table._remove(object);
+    if (offset >= 0) {
+      _table._checkCapacity();
+      return true;
+    }
+    return false;
+  }
+
+  /* patch */ void removeAll(Iterable objectsToRemove) {
+    for (Object object in objectsToRemove) {
+      if (_table._remove(object) >= 0) {
+        _table._checkCapacity();
+      }
+    }
+  }
+
+  /* patch */ void removeWhere(bool test(E element)) {
+    _filterWhere(test, true);
+  }
+
+  /* patch */ void retainWhere(bool test(E element)) {
+    _filterWhere(test, false);
+  }
+
+  /* patch */ void clear() {
+    _table._clear();
+  }
+}
+
+class _DeadEntry {
+  const _DeadEntry();
+}
+
+class _NullKey {
+  const _NullKey();
+  int get hashCode => null.hashCode;
+}
+
+const _TOMBSTONE = const _DeadEntry();
+const _NULL = const _NullKey();
+
+class _HashTable<K> {
+  /**
+   * Table of entries with [_entrySize] slots per entry.
+   *
+   * Capacity in entries must be factor of two.
+   */
+  List _table;
+  /** Current capacity. Always equal to [:_table.length ~/ _entrySize:]. */
+  int _capacity;
+  /** Count of occupied entries, including deleted ones. */
+  int _entryCount = 0;
+  /** Count of deleted entries. */
+  int _deletedCount = 0;
+  /** Counter incremented when table is modified. */
+  int _modificationCount = 0;
+  /** If set, used as the source object for [ConcurrentModificationError]s. */
+  Object _container;
+
+  _HashTable(int initialCapacity) : _capacity = initialCapacity {
+    _table = _createTable(initialCapacity);
+  }
+
+  /** Reads key from table. Converts _NULL marker to null. */
+  Object _key(offset) {
+    assert(!_isFree(_table[offset]));
+    Object key = _table[offset];
+    if (!identical(key, _NULL)) return key;
+    return null;
+  }
+
+  /** Writes key to table. Converts null to _NULL marker. */
+  void _setKey(int offset, Object key) {
+    if (key == null) key = _NULL;
+    _table[offset] = key;
+  }
+
+  int get _elementCount => _entryCount - _deletedCount;
+
+  /** Size of each entry. */
+  int get _entrySize => 1;
+
+  void _checkModification(int expectedModificationCount) {
+    if (_modificationCount != expectedModificationCount) {
+      throw new ConcurrentModificationError(_container);
+    }
+  }
+
+  void _recordModification() {
+    // Value cycles after 2^30 modifications. If you keep hold of an
+    // iterator for that long, you might miss a modification detection,
+    // and iteration can go sour. Don't do that.
+    _modificationCount = (_modificationCount + 1) & (0x3FFFFFFF);
+  }
+
+  /**
+   * Create an empty table.
+   */
+  List _createTable(int capacity) {
+    List table = new List(capacity * _entrySize);
+    return table;
+  }
+
+  /** First table probe. */
+  int _firstProbe(int hashCode, int capacity) {
+    return hashCode & (capacity - 1);
+  }
+
+  /** Following table probes. */
+  int _nextProbe(int previousIndex, int probeCount, int capacity) {
+    // When capacity is a power of 2, this probing algorithm (the triangular
+    // number sequence modulo capacity) is guaranteed to hit all indices exactly
+    // once before repeating.
+    return (previousIndex + probeCount) & (capacity - 1);
+  }
+
+  /** Whether an object is a free-marker (either tombstone or free). */
+  bool _isFree(Object marker) =>
+      marker == null || identical(marker, _TOMBSTONE);
+
+  /**
+   * Look up the offset for an object in the table.
+   *
+   * Finds the offset of the object in the table, if it is there,
+   * or the first free offset for its hashCode.
+   */
+  int _probeForAdd(int hashCode, Object object) {
+    int entrySize = _entrySize;
+    int index = _firstProbe(hashCode, _capacity);
+    int firstTombstone = -1;
+    int probeCount = 0;
+    while (true) {
+      int offset = index * entrySize;
+      Object entry = _table[offset];
+      if (identical(entry, _TOMBSTONE)) {
+        if (firstTombstone < 0) firstTombstone = offset;
+      } else if (entry == null) {
+        if (firstTombstone < 0) return offset;
+        return firstTombstone;
+      } else if (identical(_NULL, entry) ? _equals(null, object)
+                                         : _equals(entry, object)) {
+        return offset;
+      }
+      // The _nextProbe is designed so that it hits
+      // every index eventually.
+      index = _nextProbe(index, ++probeCount, _capacity);
+    }
+  }
+
+  /**
+   * Look up the offset for an object in the table.
+   *
+   * If the object is in the table, its offset is returned.
+   *
+   * If the object is not in the table, Otherwise a negative value is returned.
+   */
+  int _probeForLookup(int hashCode, Object object) {
+    int entrySize = _entrySize;
+    int index = _firstProbe(hashCode, _capacity);
+    int probeCount = 0;
+    while (true) {
+      int offset = index * entrySize;
+      Object entry = _table[offset];
+      if (entry == null) {
+        return -1;
+      } else if (!identical(_TOMBSTONE, entry)) {
+        if (identical(_NULL, entry) ? _equals(null, object)
+                                    : _equals(entry, object)) {
+          return offset;
+        }
+      }
+      // The _nextProbe is designed so that it hits
+      // every index eventually.
+      index = _nextProbe(index, ++probeCount, _capacity);
+    }
+  }
+
+  // Override the following two to change equality/hashCode computations
+
+  /**
+   * Compare two object for equality.
+   *
+   * The first object is the one already in the table,
+   * and the second is the one being searched for.
+   */
+  bool _equals(Object element, Object other) {
+    return element == other;
+  }
+
+  /**
+   * Compute hash-code for an object.
+   */
+  int _hashCodeOf(Object object) => object.hashCode;
+
+  /**
+   * Ensure that the table isn't too full for its own good.
+   *
+   * Call this after adding an element.
+   */
+  int _checkCapacity() {
+    // Compute everything in multiples of entrySize to avoid division.
+    int freeCount = _capacity - _entryCount;
+    if (freeCount * 4 < _capacity ||
+        freeCount < _deletedCount) {
+      // Less than 25% free or more deleted entries than free entries.
+      _grow(_entryCount - _deletedCount);
+    }
+  }
+
+  void _grow(int contentCount) {
+    int capacity = _capacity;
+    // Don't grow to less than twice the needed capacity.
+    int minCapacity = contentCount * 2;
+    while (capacity < minCapacity) {
+      capacity *= 2;
+    }
+    // Reset to another table and add all existing elements.
+    List oldTable = _table;
+    _table = _createTable(capacity);
+    _capacity = capacity;
+    _entryCount = 0;
+    _deletedCount = 0;
+    _addAllEntries(oldTable);
+    _recordModification();
+  }
+
+  /**
+   * Copies all non-free entries from the old table to the new empty table.
+   */
+  void _addAllEntries(List oldTable) {
+    for (int i = 0; i < oldTable.length; i += _entrySize) {
+      Object object = oldTable[i];
+      if (!_isFree(object)) {
+        int toOffset = _put(object);
+        _copyEntry(oldTable, i, toOffset);
+      }
+    }
+  }
+
+  /**
+   * Copies everything but the key element from one entry to another.
+   *
+   * Called while growing the base array.
+   *
+   * Override this if any non-key fields need copying.
+   */
+  void _copyEntry(List fromTable, int fromOffset, int toOffset) {}
+
+  // The following three methods are for simple get/set/remove operations.
+  // They only affect the key of an entry. The remaining fields must be
+  // filled by the caller.
+
+  /**
+   * Returns the offset of a key in [_table], or negative if it's not there.
+   */
+  int _get(K key) {
+    return _probeForLookup(_hashCodeOf(key), key);
+  }
+
+  /**
+   * Puts the key into the table and returns its offset into [_table].
+   *
+   * If [_entrySize] is greater than 1, the caller should fill the
+   * remaining fields.
+   *
+   * Remember to call [_checkCapacity] after using this method.
+   */
+  int _put(K key) {
+    int offset = _probeForAdd(_hashCodeOf(key), key);
+    Object oldEntry = _table[offset];
+    if (oldEntry == null) {
+      _entryCount++;
+    } else if (identical(oldEntry, _TOMBSTONE)) {
+      _deletedCount--;
+    } else {
+      return offset;
+    }
+    _setKey(offset, key);
+    _recordModification();
+    return offset;
+  }
+
+  /**
+   * Removes a key from the table and returns its offset into [_table].
+   *
+   * Returns null if the key was not in the table.
+   * If [_entrySize] is greater than 1, the caller should clean up the
+   * remaining fields.
+   */
+  int _remove(K key) {
+    int offset = _probeForLookup(_hashCodeOf(key), key);
+    if (offset >= 0) {
+      _deleteEntry(offset);
+    }
+    return offset;
+  }
+
+  /** Clears the table completely, leaving it empty. */
+  void _clear() {
+    if (_elementCount == 0) return;
+    for (int i = 0; i < _table.length; i++) {
+      _table[i] = null;
+    }
+    _entryCount = _deletedCount = 0;
+    _recordModification();
+  }
+
+  /** Clears an entry in the table. */
+  void _deleteEntry(int offset) {
+    assert(!_isFree(_table[offset]));
+    _setKey(offset, _TOMBSTONE);
+    _deletedCount++;
+    _recordModification();
+  }
+}
+
+/**
+ * Generic iterable based on a [_HashTable].
+ */
+abstract class _HashTableIterable<E> extends Iterable<E> {
+  final _HashTable _hashTable;
+  _HashTableIterable(this._hashTable);
+
+  Iterator<E> get iterator;
+
+  /**
+   * Return the iterated value for a given entry.
+   */
+  E _valueAt(int offset, Object key);
+
+  int get length => _hashTable._elementCount;
+
+  bool get isEmpty => _hashTable._elementCount == 0;
+
+  void forEach(void action(E element)) {
+    int entrySize = _hashTable._entrySize;
+    List table = _hashTable._table;
+    int modificationCount = _hashTable._modificationCount;
+    for (int offset = 0; offset < table.length; offset += entrySize) {
+      Object entry = table[offset];
+      if (!_hashTable._isFree(entry)) {
+        E value = _valueAt(offset, entry);
+        action(value);
+      }
+      _hashTable._checkModification(modificationCount);
+    }
+  }
+}
+
+abstract class _HashTableIterator<E> implements Iterator<E> {
+  final _HashTable _hashTable;
+  final int _modificationCount;
+  /** Location right after last found element. */
+  int _offset = 0;
+  E _current = null;
+
+  _HashTableIterator(_HashTable hashTable)
+      : _hashTable = hashTable,
+        _modificationCount = hashTable._modificationCount;
+
+  bool moveNext() {
+    _hashTable._checkModification(_modificationCount);
+
+    List table = _hashTable._table;
+    int entrySize = _hashTable._entrySize;
+
+    while (_offset < table.length) {
+      int currentOffset = _offset;
+      Object entry = table[currentOffset];
+      _offset = currentOffset + entrySize;
+      if (!_hashTable._isFree(entry)) {
+        _current = _valueAt(currentOffset, entry);
+        return true;
+      }
+    }
+    _current = null;
+    return false;
+  }
+
+  E get current => _current;
+
+  E _valueAt(int offset, Object key);
+}
+
+class _HashTableKeyIterable<K> extends _HashTableIterable<K> {
+  _HashTableKeyIterable(_HashTable<K> hashTable) : super(hashTable);
+
+  Iterator<K> get iterator => new _HashTableKeyIterator<K>(_hashTable);
+
+  K _valueAt(int offset, Object key) {
+    if (identical(key, _NULL)) return null;
+    return key;
+  }
+
+  bool contains(Object value) => _hashTable._get(value) >= 0;
+}
+
+class _HashTableKeyIterator<K> extends _HashTableIterator<K> {
+  _HashTableKeyIterator(_HashTable hashTable) : super(hashTable);
+
+  K _valueAt(int offset, Object key) {
+    if (identical(key, _NULL)) return null;
+    return key;
+  }
+}
+
+class _HashTableValueIterable<V> extends _HashTableIterable<V> {
+  final int _entryIndex;
+
+  _HashTableValueIterable(_HashTable hashTable, this._entryIndex)
+      : super(hashTable);
+
+  Iterator<V> get iterator {
+    return new _HashTableValueIterator<V>(_hashTable, _entryIndex);
+  }
+
+  V _valueAt(int offset, Object key) => _hashTable._table[offset + _entryIndex];
+}
+
+class _HashTableValueIterator<V> extends _HashTableIterator<V> {
+  final int _entryIndex;
+
+  _HashTableValueIterator(_HashTable hashTable, this._entryIndex)
+      : super(hashTable);
+
+  V _valueAt(int offset, Object key) => _hashTable._table[offset + _entryIndex];
+}
+
+class _HashMapTable<K, V> extends _HashTable<K> {
+  static const int _INITIAL_CAPACITY = 8;
+  static const int _VALUE_INDEX = 1;
+
+  _HashMapTable() : super(_INITIAL_CAPACITY);
+
+  int get _entrySize => 2;
+
+  V _value(int offset) => _table[offset + _VALUE_INDEX];
+  void _setValue(int offset, V value) { _table[offset + _VALUE_INDEX] = value; }
+
+  _copyEntry(List fromTable, int fromOffset, int toOffset) {
+    _table[toOffset + _VALUE_INDEX] = fromTable[fromOffset + _VALUE_INDEX];
+  }
+}
+
+/** Unique marker object for the head of a linked list of entries. */
+class _LinkedHashTableHeadMarker {
+  const _LinkedHashTableHeadMarker();
+}
+
+const _LinkedHashTableHeadMarker _HEAD_MARKER =
+    const _LinkedHashTableHeadMarker();
+
+class _LinkedHashTable<K> extends _HashTable<K> {
+  static const _NEXT_INDEX = 1;
+  static const _PREV_INDEX = 2;
+  static const _HEAD_OFFSET = 0;
+
+  _LinkedHashTable(int initialCapacity) : super(initialCapacity);
+
+  int get _entrySize => 3;
+
+  List _createTable(int capacity) {
+    List result = new List(capacity * _entrySize);
+    result[_HEAD_OFFSET] = _HEAD_MARKER;
+    result[_HEAD_OFFSET + _NEXT_INDEX] = _HEAD_OFFSET;
+    result[_HEAD_OFFSET + _PREV_INDEX] = _HEAD_OFFSET;
+    return result;
+  }
+
+  int _next(int offset) => _table[offset + _NEXT_INDEX];
+  void _setNext(int offset, int to) { _table[offset + _NEXT_INDEX] = to; }
+
+  int _prev(int offset) => _table[offset + _PREV_INDEX];
+  void _setPrev(int offset, int to) { _table[offset + _PREV_INDEX] = to; }
+
+  void _linkLast(int offset) {
+    // Add entry at offset at end of double-linked list.
+    int last = _prev(_HEAD_OFFSET);
+    _setNext(offset, _HEAD_OFFSET);
+    _setPrev(offset, last);
+    _setNext(last, offset);
+    _setPrev(_HEAD_OFFSET, offset);
+  }
+
+  void _unlink(int offset) {
+    assert(offset != _HEAD_OFFSET);
+    int next = _next(offset);
+    int prev = _prev(offset);
+    _setNext(offset, null);
+    _setPrev(offset, null);
+    _setNext(prev, next);
+    _setPrev(next, prev);
+  }
+
+  /**
+   * Copies all non-free entries from the old table to the new empty table.
+   */
+  void _addAllEntries(List oldTable) {
+    int offset = oldTable[_HEAD_OFFSET + _NEXT_INDEX];
+    while (offset != _HEAD_OFFSET) {
+      Object object = oldTable[offset];
+      int nextOffset = oldTable[offset + _NEXT_INDEX];
+      int toOffset = _put(object);
+      _copyEntry(oldTable, offset, toOffset);
+      offset = nextOffset;
+    }
+  }
+
+  void _clear() {
+    if (_elementCount == 0) return;
+    _setNext(_HEAD_OFFSET, _HEAD_OFFSET);
+    _setPrev(_HEAD_OFFSET, _HEAD_OFFSET);
+    for (int i = _entrySize; i < _table.length; i++) {
+      _table[i] = null;
+    }
+    _entryCount = _deletedCount = 0;
+    _recordModification();
+  }
+
+  int _put(K key) {
+    int offset = _probeForAdd(_hashCodeOf(key), key);
+    Object oldEntry = _table[offset];
+    if (identical(oldEntry, _TOMBSTONE)) {
+      _deletedCount--;
+    } else if (oldEntry == null) {
+      _entryCount++;
+    } else {
+      return offset;
+    }
+    _recordModification();
+    _setKey(offset, key);
+    _linkLast(offset);
+    return offset;
+  }
+
+  void _deleteEntry(int offset) {
+    _unlink(offset);
+    _setKey(offset, _TOMBSTONE);
+    _deletedCount++;
+    _recordModification();
+  }
+}
+
+class _LinkedHashTableKeyIterable<K> extends Iterable<K> {
+  final _LinkedHashTable<K> _table;
+  _LinkedHashTableKeyIterable(this._table);
+  Iterator<K> get iterator => new _LinkedHashTableKeyIterator<K>(_table);
+
+  bool contains(Object value) => _table._get(value) >= 0;
+
+  int get length => _table._elementCount;
+}
+
+class _LinkedHashTableKeyIterator<K> extends _LinkedHashTableIterator<K> {
+  _LinkedHashTableKeyIterator(_LinkedHashTable<K> hashTable): super(hashTable);
+
+  K _getCurrent(int offset) => _hashTable._key(offset);
+}
+
+class _LinkedHashTableValueIterable<V> extends Iterable<V> {
+  final _LinkedHashTable _hashTable;
+  final int _valueIndex;
+  _LinkedHashTableValueIterable(this._hashTable, this._valueIndex);
+  Iterator<V> get iterator =>
+      new _LinkedHashTableValueIterator<V>(_hashTable, _valueIndex);
+  int get length => _hashTable._elementCount;
+}
+
+class _LinkedHashTableValueIterator<V> extends _LinkedHashTableIterator<V> {
+  final int _valueIndex;
+
+  _LinkedHashTableValueIterator(_LinkedHashTable hashTable, this._valueIndex)
+      : super(hashTable);
+
+  V _getCurrent(int offset) => _hashTable._table[offset + _valueIndex];
+}
+
+abstract class _LinkedHashTableIterator<T> implements Iterator<T> {
+  final _LinkedHashTable _hashTable;
+  final int _modificationCount;
+  int _offset;
+  T _current;
+
+  _LinkedHashTableIterator(_LinkedHashTable table)
+      : _hashTable = table,
+        _modificationCount = table._modificationCount,
+        _offset = table._next(_LinkedHashTable._HEAD_OFFSET);
+
+  bool moveNext() {
+    _hashTable._checkModification(_modificationCount);
+    if (_offset == _LinkedHashTable._HEAD_OFFSET) {
+      _current = null;
+      return false;
+    }
+    _current = _getCurrent(_offset);
+    _offset = _hashTable._next(_offset);
+    return true;
+  }
+
+  T _getCurrent(int offset);
+
+  T get current => _current;
+}
+
+class _LinkedHashMapTable<K, V> extends _LinkedHashTable<K> {
+  static const int _INITIAL_CAPACITY = 8;
+  static const int _VALUE_INDEX = 3;
+
+  int get _entrySize => 4;
+
+  _LinkedHashMapTable() : super(_INITIAL_CAPACITY);
+
+  V _value(int offset) => _table[offset + _VALUE_INDEX];
+  void _setValue(int offset, V value) { _table[offset + _VALUE_INDEX] = value; }
+
+  _copyEntry(List oldTable, int fromOffset, int toOffset) {
+    _table[toOffset + _VALUE_INDEX] = oldTable[fromOffset + _VALUE_INDEX];
+  }
+}
diff --git a/runtime/lib/date_patch.dart b/runtime/lib/date_patch.dart
index b83e96b..c1336c4 100644
--- a/runtime/lib/date_patch.dart
+++ b/runtime/lib/date_patch.dart
@@ -75,8 +75,9 @@
     int daysSince1970 =
         _flooredDivision(_localDateInUtcMs, Duration.MILLISECONDS_PER_DAY);
     // 1970-1-1 was a Thursday.
-    return ((daysSince1970 + DateTime.THU - DateTime.MON) % DateTime.DAYS_IN_WEEK) +
-        DateTime.MON;
+    return ((daysSince1970 + DateTime.THURSDAY - DateTime.MONDAY)
+            % DateTime.DAYS_IN_WEEK) +
+        DateTime.MONDAY;
   }
 
 
diff --git a/runtime/lib/double.cc b/runtime/lib/double.cc
index 3fc2261..035b2e6 100644
--- a/runtime/lib/double.cc
+++ b/runtime/lib/double.cc
@@ -221,9 +221,8 @@
           }
         }
         if (dot_ok) {
-          char* p_end = NULL;
-          const double double_value = strtod(cstr, &p_end);
-          if (p_end == (cstr + len)) {
+          double double_value;
+          if (CStringToDouble(cstr, len, &double_value)) {
             return Double::New(double_value);
           }
         }
@@ -238,10 +237,16 @@
                               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();
-    char* p_end = NULL;
-    double double_value = strtod(cstr, &p_end);
-    ASSERT(p_end != cstr);
+
+    double double_value;
+    bool ok = CStringToDouble(cstr, number_string->Length(), &double_value);
+    ASSERT(ok);
+
     if (!is_positive) {
       double_value = -double_value;
     }
diff --git a/runtime/lib/growable_array.dart b/runtime/lib/growable_array.dart
index 753ba1e..76cacb4 100644
--- a/runtime/lib/growable_array.dart
+++ b/runtime/lib/growable_array.dart
@@ -52,14 +52,6 @@
     }
   }
 
-  void removeAll(Iterable elements) {
-    IterableMixinWorkaround.removeAllList(this, elements);
-  }
-
-  void retainAll(Iterable elements) {
-    IterableMixinWorkaround.retainAll(this, elements);
-  }
-
   void removeWhere(bool test(T element)) {
     IterableMixinWorkaround.removeWhereList(this, test);
   }
@@ -69,6 +61,10 @@
                                             (T element) => !test(element));
   }
 
+  Iterable<T> getRange(int start, int end) {
+    return IterableMixinWorkaround.getRangeList(this, start, end);
+  }
+
   void setRange(int start, int length, List<T> from, [int startFrom = 0]) {
     IterableMixinWorkaround.setRangeList(this, start, length, from, startFrom);
   }
@@ -119,8 +115,6 @@
     return list;
   }
 
-  List<T> getRange(int start, int length) => sublist(start, start + length);
-
   factory _GrowableObjectArray(int length) {
     var data = new _ObjectArray((length == 0) ? 4 : length);
     var result = new _GrowableObjectArray<T>.withData(data);
@@ -133,7 +127,7 @@
     return new _GrowableObjectArray<T>.withData(data);
   }
 
-  factory _GrowableObjectArray.from(Collection<T> other) {
+  factory _GrowableObjectArray.from(Iterable<T> other) {
     List<T> result = new _GrowableObjectArray<T>();
     result.addAll(other);
     return result;
@@ -208,10 +202,6 @@
     throw new StateError("More than one element");
   }
 
-  T min([int compare(T a, T b)]) => IterableMixinWorkaround.min(this, compare);
-
-  T max([int compare(T a, T b)]) => IterableMixinWorkaround.max(this, compare);
-
   int indexOf(T element, [int start = 0]) {
     return IterableMixinWorkaround.indexOfList(this, element, start);
   }
@@ -242,11 +232,11 @@
     }
   }
 
-  String join([String separator]) {
+  String join([String separator = ""]) {
     if (isEmpty) return "";
     if (this.length == 1) return "${this[0]}";
     StringBuffer buffer = new StringBuffer();
-    if (separator == null || separator == "") {
+    if (separator.isEmpty) {
       for (int i = 0; i < this.length; i++) {
         buffer.write("${this[i]}");
       }
@@ -264,8 +254,8 @@
     return IterableMixinWorkaround.mapList(this, f);
   }
 
-  reduce(initialValue, combine(previousValue, T element)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  T reduce(T combine(T value, T element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
   fold(initialValue, combine(previousValue, T element)) {
@@ -328,14 +318,14 @@
     this.length = 0;
   }
 
-  Iterable<T> get reversed => new ReversedListIterable<T>(this);
+  Iterable<T> get reversed => IterableMixinWorkaround.reversedList(this);
 
   void sort([int compare(T a, T b)]) {
     IterableMixinWorkaround.sortList(this, compare);
   }
 
   String toString() {
-    return Collections.collectionToString(this);
+    return ToString.iterableToString(this);
   }
 
   Iterator<T> get iterator {
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index 5282247..e631a3e 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -42,12 +42,6 @@
 }
 
 
-static void StoreError(Isolate* isolate, const Object& obj) {
-  ASSERT(obj.IsError());
-  isolate->object_store()->set_sticky_error(Error::Cast(obj));
-}
-
-
 // TODO(turnidge): Move to DartLibraryCalls.
 static RawObject* ReceivePortCreate(intptr_t port_id) {
   Isolate* isolate = Isolate::Current();
@@ -82,37 +76,6 @@
 }
 
 
-static void ShutdownIsolate(uword parameter) {
-  Isolate* isolate = reinterpret_cast<Isolate*>(parameter);
-  {
-    // Print the error if there is one.  This may execute dart code to
-    // print the exception object, so we need to use a StartIsolateScope.
-    StartIsolateScope start_scope(isolate);
-    StackZone zone(isolate);
-    HandleScope handle_scope(isolate);
-    Error& error = Error::Handle();
-    error = isolate->object_store()->sticky_error();
-    if (!error.IsNull()) {
-      OS::PrintErr("in ShutdownIsolate: %s\n", error.ToErrorCString());
-    }
-  }
-  {
-    // Shut the isolate down.
-    SwitchIsolateScope switch_scope(isolate);
-    Dart::ShutdownIsolate();
-  }
-}
-
-
-static char* GetRootScriptUri(Isolate* isolate) {
-  const Library& library =
-      Library::Handle(isolate->object_store()->root_library());
-  ASSERT(!library.IsNull());
-  const String& script_name = String::Handle(library.url());
-  return isolate->current_zone()->MakeCopyOfString(script_name.ToCString());
-}
-
-
 DEFINE_NATIVE_ENTRY(ReceivePortImpl_factory, 1) {
   ASSERT(AbstractTypeArguments::CheckedHandle(
       arguments->NativeArgAt(0)).IsNull());
@@ -202,100 +165,7 @@
 }
 
 
-class SpawnState {
- public:
-  SpawnState(const Function& func, const Function& callback_func)
-      : isolate_(NULL),
-        script_url_(NULL),
-        library_url_(NULL),
-        function_name_(NULL),
-        exception_callback_name_(NULL) {
-    script_url_ = strdup(GetRootScriptUri(Isolate::Current()));
-    const Class& cls = Class::Handle(func.Owner());
-    ASSERT(cls.IsTopLevel());
-    const Library& lib = Library::Handle(cls.library());
-    const String& lib_url = String::Handle(lib.url());
-    library_url_ = strdup(lib_url.ToCString());
-
-    const String& func_name = String::Handle(func.name());
-    function_name_ = strdup(func_name.ToCString());
-    if (!callback_func.IsNull()) {
-      const String& callback_name = String::Handle(callback_func.name());
-      exception_callback_name_ = strdup(callback_name.ToCString());
-    } else {
-      exception_callback_name_ = strdup("_unhandledExceptionCallback");
-    }
-  }
-
-  explicit SpawnState(const char* script_url)
-      : isolate_(NULL),
-        library_url_(NULL),
-        function_name_(NULL),
-        exception_callback_name_(NULL) {
-    script_url_ = strdup(script_url);
-    library_url_ = NULL;
-    function_name_ = strdup("main");
-    exception_callback_name_ = strdup("_unhandledExceptionCallback");
-  }
-
-  ~SpawnState() {
-    free(script_url_);
-    free(library_url_);
-    free(function_name_);
-    free(exception_callback_name_);
-  }
-
-  Isolate* isolate() const { return isolate_; }
-  void set_isolate(Isolate* value) { isolate_ = value; }
-  char* script_url() const { return script_url_; }
-  char* library_url() const { return library_url_; }
-  char* function_name() const { return function_name_; }
-  char* exception_callback_name() const { return exception_callback_name_; }
-
-  RawObject* ResolveFunction() {
-    // Resolve the library.
-    Library& lib = Library::Handle();
-    if (library_url()) {
-      const String& lib_url = String::Handle(String::New(library_url()));
-      lib = Library::LookupLibrary(lib_url);
-      if (lib.IsNull() || lib.IsError()) {
-        const String& msg = String::Handle(String::NewFormatted(
-            "Unable to find library '%s'.", library_url()));
-        return LanguageError::New(msg);
-      }
-    } else {
-      lib = isolate()->object_store()->root_library();
-    }
-    ASSERT(!lib.IsNull());
-
-    // Resolve the function.
-    const String& func_name =
-        String::Handle(String::New(function_name()));
-    const Function& func = Function::Handle(lib.LookupLocalFunction(func_name));
-    if (func.IsNull()) {
-      const String& msg = String::Handle(String::NewFormatted(
-          "Unable to resolve function '%s' in library '%s'.",
-          function_name(), (library_url() ? library_url() : script_url())));
-      return LanguageError::New(msg);
-    }
-    return func.raw();
-  }
-
-  void Cleanup() {
-    SwitchIsolateScope switch_scope(isolate());
-    Dart::ShutdownIsolate();
-  }
-
- private:
-  Isolate* isolate_;
-  char* script_url_;
-  char* library_url_;
-  char* function_name_;
-  char* exception_callback_name_;
-};
-
-
-static bool CreateIsolate(SpawnState* state, char** error) {
+static bool CreateIsolate(IsolateSpawnState* state, char** error) {
   Isolate* parent_isolate = Isolate::Current();
 
   Dart_IsolateCreateCallback callback = Isolate::CreateCallback();
@@ -306,87 +176,23 @@
   }
 
   void* init_data = parent_isolate->init_callback_data();
-  bool retval = (callback)(state->script_url(),
-                           state->function_name(),
-                           init_data,
-                           error);
-  if (!retval) {
+  Isolate* child_isolate = reinterpret_cast<Isolate*>(
+      (callback)(state->script_url(),
+                 state->function_name(),
+                 init_data,
+                 error));
+  if (child_isolate == NULL) {
     Isolate::SetCurrent(parent_isolate);
     return false;
   }
-
-  Isolate* child_isolate = Isolate::Current();
-  ASSERT(child_isolate);
-  state->set_isolate(child_isolate);
-
-  // Attempt to resolve the entry function now, so that we fail fast
-  // in the case that the function cannot be resolved.
-  //
-  // TODO(turnidge): Revisit this once we have an isolate death api.
-  bool resolve_error = false;
-  {
-    StackZone zone(child_isolate);
-    HandleScope handle_scope(child_isolate);
-    const Object& result = Object::Handle(state->ResolveFunction());
-    if (result.IsError()) {
-      Error& errobj = Error::Handle();
-      errobj ^= result.raw();
-      *error = strdup(errobj.ToErrorCString());
-      resolve_error = true;
-    } else {
-      const String& callback_name =
-          String::Handle(child_isolate,
-                         String::New(state->exception_callback_name()));
-      child_isolate->object_store()->
-          set_unhandled_exception_handler(callback_name);
-    }
-  }
-  if (resolve_error) {
-    Dart::ShutdownIsolate();
-    Isolate::SetCurrent(parent_isolate);
-    return false;
-  }
+  state->set_isolate(reinterpret_cast<Isolate*>(child_isolate));
 
   Isolate::SetCurrent(parent_isolate);
   return true;
 }
 
 
-static bool RunIsolate(uword parameter) {
-  Isolate* isolate = reinterpret_cast<Isolate*>(parameter);
-  SpawnState* state = reinterpret_cast<SpawnState*>(isolate->spawn_data());
-  isolate->set_spawn_data(0);
-  {
-    StartIsolateScope start_scope(isolate);
-    StackZone zone(isolate);
-    HandleScope handle_scope(isolate);
-    if (!ClassFinalizer::FinalizePendingClasses()) {
-      // Error is in sticky error already.
-      return false;
-    }
-
-    Object& result = Object::Handle();
-    result = state->ResolveFunction();
-    delete state;
-    state = NULL;
-    if (result.IsError()) {
-      StoreError(isolate, result);
-      return false;
-    }
-    ASSERT(result.IsFunction());
-    Function& func = Function::Handle(isolate);
-    func ^= result.raw();
-    result = DartEntry::InvokeFunction(func, Object::empty_array());
-    if (result.IsError()) {
-      StoreError(isolate, result);
-      return false;
-    }
-  }
-  return true;
-}
-
-
-static RawObject* Spawn(NativeArguments* arguments, SpawnState* state) {
+static RawObject* Spawn(NativeArguments* arguments, IsolateSpawnState* state) {
   // Create a new isolate.
   char* error = NULL;
   if (!CreateIsolate(state, &error)) {
@@ -405,11 +211,12 @@
     Exceptions::PropagateError(Error::Cast(port));
   }
 
-  // Start the new isolate.
+  // Start the new isolate if it is already marked as runnable.
+  MutexLocker ml(state->isolate()->mutex());
   state->isolate()->set_spawn_data(reinterpret_cast<uword>(state));
-  state->isolate()->message_handler()->Run(
-      Dart::thread_pool(), RunIsolate, ShutdownIsolate,
-      reinterpret_cast<uword>(state->isolate()));
+  if (state->isolate()->is_runnable()) {
+    state->isolate()->Run();
+  }
 
   return port.raw();
 }
@@ -464,7 +271,7 @@
   }
 #endif
 
-  return Spawn(arguments, new SpawnState(func, callback_func));
+  return Spawn(arguments, new IsolateSpawnState(func, callback_func));
 }
 
 
@@ -482,7 +289,7 @@
     ThrowIsolateSpawnException(msg);
   }
 
-  return Spawn(arguments, new SpawnState(canonical_uri));
+  return Spawn(arguments, new IsolateSpawnState(canonical_uri));
 }
 
 
diff --git a/runtime/lib/lib_sources.gypi b/runtime/lib/lib_sources.gypi
index d3efd48..7f1c37a 100644
--- a/runtime/lib/lib_sources.gypi
+++ b/runtime/lib/lib_sources.gypi
@@ -50,6 +50,7 @@
     'string.cc',
     'string_patch.dart',
     'string_buffer_patch.dart',
+    'symbol_patch.dart',
     'type_patch.dart',
     'weak_property.dart',
     'weak_property.cc',
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index fce7051..c76e5e3 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -833,17 +833,23 @@
   // TODO(turnidge): This should be an immutable map.
   Dart_Handle map = MapNew();
 
-  Dart_Handle lib_urls = Dart_GetLibraryURLs();
-  if (Dart_IsError(lib_urls)) {
-    return lib_urls;
+  Dart_Handle lib_ids = Dart_GetLibraryIds();
+  if (Dart_IsError(lib_ids)) {
+    return lib_ids;
   }
   intptr_t len;
-  Dart_Handle result = Dart_ListLength(lib_urls, &len);
+  Dart_Handle result = Dart_ListLength(lib_ids, &len);
   if (Dart_IsError(result)) {
     return result;
   }
   for (intptr_t i = 0; i < len; i++) {
-    Dart_Handle lib_url = Dart_ListGetAt(lib_urls, i);
+    Dart_Handle lib_id = Dart_ListGetAt(lib_ids, i);
+    int64_t id64;
+    Dart_IntegerToInt64(lib_id, &id64);
+    Dart_Handle lib_url = Dart_GetLibraryURL(id64);
+    if (Dart_IsError(lib_url)) {
+      return lib_url;
+    }
     Dart_Handle lib = Dart_LookupLibrary(lib_url);
     if (Dart_IsError(lib)) {
       return lib;
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index 43f511c..6588649 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -139,10 +139,10 @@
 abstract class _LocalObjectMirrorImpl extends _LocalVMObjectMirrorImpl
     implements ObjectMirror {
   _LocalObjectMirrorImpl(ref) : super(ref) {}
-
-  Future<InstanceMirror> invoke(String memberName,
-                                List positionalArguments,
-                                [Map<String,dynamic> namedArguments]) {
+  
+Future<InstanceMirror> invokeAsync(String memberName,
+                                   List positionalArguments,
+                                   [Map<String,dynamic> namedArguments]) {
     if (namedArguments != null) {
       throw new UnimplementedError(
           'named argument support is not implemented');
@@ -162,8 +162,7 @@
     return completer.future;
   }
 
-  Future<InstanceMirror> getField(String fieldName)
-  {
+  Future<InstanceMirror> getFieldAsync(String fieldName) {
     Completer<InstanceMirror> completer = new Completer<InstanceMirror>();
     try {
       completer.complete(_getField(this, fieldName));
@@ -173,8 +172,7 @@
     return completer.future;
   }
 
-  Future<InstanceMirror> setField(String fieldName, Object arg)
-  {
+  Future<InstanceMirror> setFieldAsync(String fieldName, Object arg) {
     _validateArgument(0, arg);
 
     Completer<InstanceMirror> completer = new Completer<InstanceMirror>();
@@ -305,8 +303,8 @@
         'ClosureMirror.source is not implemented');
   }
 
-  Future<InstanceMirror> apply(List<Object> positionalArguments,
-                               [Map<String,Object> namedArguments]) {
+  Future<InstanceMirror> applyAsync(List<Object> positionalArguments,
+                                    [Map<String,Object> namedArguments]) {
     if (namedArguments != null) {
       throw new UnimplementedError(
           'named argument support is not implemented');
@@ -501,9 +499,9 @@
 
   String toString() => "ClassMirror on '$simpleName'";
 
-  Future<InstanceMirror> newInstance(String constructorName,
-                                     List positionalArguments,
-                                     [Map<String,dynamic> namedArguments]) {
+  Future<InstanceMirror> newInstanceAsync(String constructorName,
+                                          List positionalArguments,
+                                          [Map<String,dynamic> namedArguments]) {
     if (namedArguments != null) {
       throw new UnimplementedError(
           'named argument support is not implemented');
@@ -970,4 +968,8 @@
   static InstanceMirror reflect(Object reflectee) {
     return makeLocalInstanceMirror(reflectee);
   }
+
+  static ClassMirror reflectClass(Type reflectee) {
+    throw new UnimplementedError('reflectClass is not implemented');
+  }
 }
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
index 1ba5e1a..43101b0 100644
--- a/runtime/lib/string_patch.dart
+++ b/runtime/lib/string_patch.dart
@@ -417,7 +417,7 @@
     return result;
   }
 
-  List<int> get codeUnits => new CodeUnits(this);
+  List<int> get codeUnits => new _CodeUnits(this);
 
   Runes get runes => new Runes(this);
 
@@ -613,3 +613,17 @@
   final String str;
   final String pattern;
 }
+
+/**
+ * An [Iterable] of the UTF-16 code units of a [String] in index order.
+ */
+class _CodeUnits extends Object with ListMixin<int>,
+                                     UnmodifiableListMixin<int> {
+  /** The string that this is the code units of. */
+  String _string;
+
+  _CodeUnits(this._string);
+
+  int get length => _string.length;
+  int operator[](int i) => _string.codeUnitAt(i);
+}
diff --git a/runtime/lib/symbol_patch.dart b/runtime/lib/symbol_patch.dart
new file mode 100644
index 0000000..6771348
--- /dev/null
+++ b/runtime/lib/symbol_patch.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.
+
+patch  class Symbol {
+  final String _name;
+  /* patch */ const Symbol(String name)
+    : this._name = _validate(name);
+
+
+  static final RegExp _validationPattern =
+      new RegExp(r'^[a-zA-Z$][a-zA-Z$0-9_]*=?');
+
+  static _validate(String name) {
+    if (name is! String) throw new ArgumentError('name must be a String');
+    if (name.isEmpty) return;
+    if (name.startsWith('_')) {
+      throw new ArgumentError('"$name" is a private identifier');
+    }
+    if (!_validationPattern.hasMatch(name)) {
+      throw new ArgumentError(
+	  '"$name" is not an identifier or an empty String');
+    }
+    return name;
+  }
+
+  /* patch */ bool operator ==(other) {
+    return other is Symbol && _name == other._name;
+  }
+
+  /* patch */ int get hashCode {
+    const arbitraryPrime = 664597;
+    return 0x1fffffff & (arbitraryPrime * _name.hashCode);
+  }
+}
diff --git a/runtime/lib/typeddata.dart b/runtime/lib/typeddata.dart
index 244948c..75f81a7 100644
--- a/runtime/lib/typeddata.dart
+++ b/runtime/lib/typeddata.dart
@@ -13,6 +13,12 @@
     return _newTransferable(length);
   }
 
+  /* patch */ factory Int8List.fromList(List<int> elements) {
+    var result = new _Int8Array(elements.length);
+    for (int i = 0; i < elements.length; i++) result[i] = elements[i];
+    return result;
+  }
+
   /* patch */ factory Int8List.view(ByteBuffer buffer,
                                     [int offsetInBytes = 0, int length]) {
     return new _Int8ArrayView(buffer, offsetInBytes, length);
@@ -33,6 +39,12 @@
     return _newTransferable(length);
   }
 
+  /* patch */ factory Uint8List.fromList(List<int> elements) {
+    var result = new _Uint8Array(elements.length);
+    for (int i = 0; i < elements.length; i++) result[i] = elements[i];
+    return result;
+  }
+
   /* patch */ factory Uint8List.view(ByteBuffer buffer,
                                      [int offsetInBytes = 0, int length]) {
     return new _Uint8ArrayView(buffer, offsetInBytes, length);
@@ -53,6 +65,12 @@
     return _newTransferable(length);
   }
 
+  /* patch */ factory Uint8ClampedList.fromList(List<int> elements) {
+    var result = new _Uint8ClampedArray(elements.length);
+    for (int i = 0; i < elements.length; i++) result[i] = elements[i];
+    return result;
+  }
+
   /* patch */ factory Uint8ClampedList.view(ByteBuffer buffer,
                                             [int offsetInBytes = 0,
                                              int length]) {
@@ -74,6 +92,12 @@
     return _newTransferable(length);
   }
 
+  /* patch */ factory Int16List.fromList(List<int> elements) {
+    var result = new _Int16Array(elements.length);
+    for (int i = 0; i < elements.length; i++) result[i] = elements[i];
+    return result;
+  }
+
   /* patch */ factory Int16List.view(ByteBuffer buffer,
                                      [int offsetInBytes = 0, int length]) {
     return new _Int16ArrayView(buffer, offsetInBytes, length);
@@ -94,6 +118,12 @@
     return _newTransferable(length);
   }
 
+  /* patch */ factory Uint16List.fromList(List<int> elements) {
+    var result = new _Uint16Array(elements.length);
+    for (int i = 0; i < elements.length; i++) result[i] = elements[i];
+    return result;
+  }
+
   /* patch */ factory Uint16List.view(ByteBuffer buffer,
                                       [int offsetInBytes = 0, int length]) {
     return new _Uint16ArrayView(buffer, offsetInBytes, length);
@@ -114,6 +144,12 @@
     return _newTransferable(length);
   }
 
+  /* patch */ factory Int32List.fromList(List<int> elements) {
+    var result = new _Int32Array(elements.length);
+    for (int i = 0; i < elements.length; i++) result[i] = elements[i];
+    return result;
+  }
+
   /* patch */ factory Int32List.view(ByteBuffer buffer,
                                      [int offsetInBytes = 0, int length]) {
     return new _Int32ArrayView(buffer, offsetInBytes, length);
@@ -134,6 +170,12 @@
     return _newTransferable(length);
   }
 
+  /* patch */ factory Uint32List.fromList(List<int> elements) {
+    var result = new _Uint32Array(elements.length);
+    for (int i = 0; i < elements.length; i++) result[i] = elements[i];
+    return result;
+  }
+
   /* patch */ factory Uint32List.view(ByteBuffer buffer,
                                       [int offsetInBytes = 0, int length]) {
     return new _Uint32ArrayView(buffer, offsetInBytes, length);
@@ -154,6 +196,12 @@
     return _newTransferable(length);
   }
 
+  /* patch */ factory Int64List.fromList(List<int> elements) {
+    var result = new _Int64Array(elements.length);
+    for (int i = 0; i < elements.length; i++) result[i] = elements[i];
+    return result;
+  }
+
   /* patch */ factory Int64List.view(ByteBuffer buffer,
                                      [int offsetInBytes = 0, int length]) {
     return new _Int64ArrayView(buffer, offsetInBytes, length);
@@ -174,6 +222,12 @@
     return _newTransferable(length);
   }
 
+  /* patch */ factory Uint64List.fromList(List<int> elements) {
+    var result = new _Uint64Array(elements.length);
+    for (int i = 0; i < elements.length; i++) result[i] = elements[i];
+    return result;
+  }
+
   /* patch */ factory Uint64List.view(ByteBuffer buffer,
                                       [int offsetInBytes = 0, int length]) {
     return new _Uint64ArrayView(buffer, offsetInBytes, length);
@@ -194,6 +248,12 @@
     return _newTransferable(length);
   }
 
+  /* patch */ factory Float32List.fromList(List<double> elements) {
+    var result = new _Float32Array(elements.length);
+    for (int i = 0; i < elements.length; i++) result[i] = elements[i];
+    return result;
+  }
+
   /* patch */ factory Float32List.view(ByteBuffer buffer,
                                        [int offsetInBytes = 0, int length]) {
     return new _Float32ArrayView(buffer, offsetInBytes, length);
@@ -214,6 +274,12 @@
     return _newTransferable(length);
   }
 
+  /* patch */ factory Float64List.fromList(List<double> elements) {
+    var result = new _Float64Array(elements.length);
+    for (int i = 0; i < elements.length; i++) result[i] = elements[i];
+    return result;
+  }
+
   /* patch */ factory Float64List.view(ByteBuffer buffer,
                                        [int offsetInBytes = 0, int length]) {
     return new _Float64ArrayView(buffer, offsetInBytes, length);
@@ -303,13 +369,12 @@
     return IterableMixinWorkaround.mapList(this, f);
   }
 
-  String join([String separator]) {
+  String join([String separator = ""]) {
     return IterableMixinWorkaround.join(this, separator);
   }
 
-  dynamic reduce(dynamic initialValue,
-                 dynamic combine(dynamic initialValue, element)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  dynamic reduce(dynamic combine(value, element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
   dynamic fold(dynamic initialValue,
@@ -450,12 +515,6 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) =>
-    IterableMixinWorkaround.min(this, compare);
-
-  int max([int compare(int a, int b)]) =>
-    IterableMixinWorkaround.max(this, compare);
-
   void removeRange(int start, int length) {
     throw new UnsupportedError(
         "Cannot remove from a non-extendable array");
@@ -483,8 +542,8 @@
     return result;
   }
 
-  List getRange(int start, int length) {
-    return sublist(start, start + length);
+  Iterable getRange(int start, [int end]) {
+    return IterableMixinWorkaround.getRangeList(this, start, end);
   }
 
   void setRange(int start, int length, List from, [int startFrom = 0]) {
@@ -498,7 +557,7 @@
   // Method(s) implementing Object interface.
 
   String toString() {
-    return Collections.collectionToString(this);
+    return ToString.iterableToString(this);
   }
 
 
diff --git a/runtime/tests/vm/dart/byte_array_optimized_test.dart b/runtime/tests/vm/dart/byte_array_optimized_test.dart
index 8713ecb..ca3f9e5 100644
--- a/runtime/tests/vm/dart/byte_array_optimized_test.dart
+++ b/runtime/tests/vm/dart/byte_array_optimized_test.dart
@@ -5,6 +5,7 @@
 // Library tag to be able to run in html test framework.
 library byte_array_test;
 
+import "package:expect/expect.dart";
 import 'dart:typeddata';
 
 // This test exercises optimized [] and []= operators
diff --git a/runtime/tests/vm/dart/byte_array_test.dart b/runtime/tests/vm/dart/byte_array_test.dart
index f4ede60..388e1bb 100644
--- a/runtime/tests/vm/dart/byte_array_test.dart
+++ b/runtime/tests/vm/dart/byte_array_test.dart
@@ -5,6 +5,7 @@
 // Library tag to be able to run in html test framework.
 library byte_array_test;
 
+import "package:expect/expect.dart";
 import 'dart:typeddata';
 
 class ByteArrayTest {
diff --git a/runtime/tests/vm/dart/inline_stack_frame_test.dart b/runtime/tests/vm/dart/inline_stack_frame_test.dart
index 64e24c7..f8592ac 100644
--- a/runtime/tests/vm/dart/inline_stack_frame_test.dart
+++ b/runtime/tests/vm/dart/inline_stack_frame_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:expect/expect.dart";
+
 // This test tries to verify that we produce the correct stack trace when
 // throwing exceptions even when functions are inlined.
 // The test invokes a bunch of functions and then does a throw. There is a
diff --git a/runtime/tests/vm/dart/isolate_mirror_local_test.dart b/runtime/tests/vm/dart/isolate_mirror_local_test.dart
index 5d2e687..e72f5a1 100644
--- a/runtime/tests/vm/dart/isolate_mirror_local_test.dart
+++ b/runtime/tests/vm/dart/isolate_mirror_local_test.dart
@@ -9,6 +9,7 @@
 
 library isolate_mirror_local_test;
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:isolate';
 import 'dart:mirrors';
@@ -116,7 +117,7 @@
 
   // Test library invocation by calling function(123).
   Expect.equals(0, global_var);
-  lib_mirror.invoke('function', [ 123 ]).then(
+  lib_mirror.invokeAsync('function', [123]).then(
       (InstanceMirror retval) {
         Expect.equals(123, global_var);
         Expect.equals('int', retval.type.simpleName);
@@ -307,7 +308,7 @@
   Expect.equals('Object', list_intf.superclass.simpleName);
   Expect.equals('dart.core', list_intf.owner.simpleName);
   Expect.isTrue(list_intf.isClass);
-  Expect.equals('Collection', list_intf.superinterfaces[0].simpleName);
+  Expect.equals('Iterable', list_intf.superinterfaces[0].simpleName);
   Expect.equals("ClassMirror on 'List'", list_intf.toString());
 
   // Lookup a class from a library and make sure it is sane.
@@ -342,7 +343,7 @@
   Expect.equals("InstanceMirror on <1001>", mirror.toString());
 
   // Invoke (mirror + mirror).
-  mirror.invoke('+', [ mirror ]).then(
+  mirror.invokeAsync('+', [ mirror ]).then(
       (InstanceMirror retval) {
         Expect.equals('int', retval.type.simpleName);
         Expect.isTrue(retval.hasReflectee);
@@ -359,7 +360,7 @@
                 mirror.toString());
 
   // Invoke mirror[0].
-  mirror.invoke('[]', [ 0 ]).then(
+  mirror.invokeAsync('[]', [ 0 ]).then(
       (InstanceMirror retval) {
         Expect.equals('String', retval.type.simpleName);
         Expect.isTrue(retval.hasReflectee);
@@ -431,7 +432,7 @@
                 cls.toString());
 
   // Invoke mirror.method(1000).
-  mirror.invoke('method', [ 1000 ]).then(
+  mirror.invokeAsync('method', [ 1000 ]).then(
       (InstanceMirror retval) {
         Expect.equals('int', retval.type.simpleName);
         Expect.isTrue(retval.hasReflectee);
@@ -459,7 +460,7 @@
 void testMirrorErrors(MirrorSystem mirrors) {
   LibraryMirror lib_mirror = mirrors.isolate.rootLibrary;
 
-  lib_mirror.invoke('methodWithException', [])
+  lib_mirror.invokeAsync('methodWithException', [])
     .then((InstanceMirror retval) {
       // Should not reach here.
       Expect.isTrue(false);
@@ -475,7 +476,7 @@
         testDone('testMirrorErrors1');
       });
 
-  lib_mirror.invoke('methodWithError', [])
+  lib_mirror.invokeAsync('methodWithError', [])
     .then((InstanceMirror retval) {
       // Should not reach here.
       Expect.isTrue(false);
@@ -489,7 +490,7 @@
   // TODO(turnidge): When we call a method that doesn't exist, we
   // should probably call noSuchMethod().  I'm adding this test to
   // document the current behavior in the meantime.
-  lib_mirror.invoke('methodNotFound', [])
+  lib_mirror.invokeAsync('methodNotFound', [])
     .then((InstanceMirror retval) {
       // Should not reach here.
       Expect.isTrue(false);
diff --git a/runtime/tests/vm/dart/isolate_mirror_remote_test.dart b/runtime/tests/vm/dart/isolate_mirror_remote_test.dart
index 1be85fc..f3fff3a 100644
--- a/runtime/tests/vm/dart/isolate_mirror_remote_test.dart
+++ b/runtime/tests/vm/dart/isolate_mirror_remote_test.dart
@@ -7,6 +7,7 @@
 
 library isolate_mirror_local_test;
 
+import "package:expect/expect.dart";
 import 'dart:isolate';
 import 'dart:mirrors';
 
diff --git a/runtime/tests/vm/dart/isolate_unhandled_exception_test.dart b/runtime/tests/vm/dart/isolate_unhandled_exception_test.dart
index 68d2002..f7b0c04 100644
--- a/runtime/tests/vm/dart/isolate_unhandled_exception_test.dart
+++ b/runtime/tests/vm/dart/isolate_unhandled_exception_test.dart
@@ -4,6 +4,7 @@
 
 library isolate_unhandled_exception_test;
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:isolate';
 
diff --git a/runtime/tests/vm/dart/isolate_unhandled_exception_uri_test.dart b/runtime/tests/vm/dart/isolate_unhandled_exception_uri_test.dart
index 6446ded..e3b9ebc 100644
--- a/runtime/tests/vm/dart/isolate_unhandled_exception_uri_test.dart
+++ b/runtime/tests/vm/dart/isolate_unhandled_exception_uri_test.dart
@@ -4,6 +4,7 @@
 
 library isolate_unhandled_exception_uri_helper;
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:isolate';
 
diff --git a/runtime/tests/vm/dart/optimized_stacktrace_test.dart b/runtime/tests/vm/dart/optimized_stacktrace_test.dart
index c3e24ba..40413c5 100644
--- a/runtime/tests/vm/dart/optimized_stacktrace_test.dart
+++ b/runtime/tests/vm/dart/optimized_stacktrace_test.dart
@@ -1,8 +1,8 @@
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-
 // Test correct source positions in stack trace with optimized functions.
+import "package:expect/expect.dart";
 
 // (1) Test normal exception. 
 foo(x) => bar(x);
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 1939598..45afdd9 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -40,9 +40,10 @@
 # The source positions do not match with dart2js.
 dart/optimized_stacktrace_test: Fail
 
-[ $compiler == dart2js && $minified ]
-# Methods in stack traces are renamed.
-dart/inline_stack_frame_test: Fail # Issue 7953.
+[ $compiler == dart2js ]
+# Methods can be missing in dart2js stack traces due to inlining.  Also when
+# minifying they can be renamed, which is issue 7953.
+dart/inline_stack_frame_test: Fail
 
 [ $runtime == ff || $runtime == ie9 ]
 dart/inline_stack_frame_test: Skip
@@ -69,7 +70,6 @@
 [ $arch == simmips ]
 # Tests needing an assembler.
 cc/Dart2JSCompileAll: Skip
-cc/FrameLookup: Skip
 cc/UseDartApi: Skip
 # Tests needing Dart execution.
 dart/*: Skip
diff --git a/runtime/tools/create_snapshot_bin.py b/runtime/tools/create_snapshot_bin.py
index a6bb324..c80df4d 100755
--- a/runtime/tools/create_snapshot_bin.py
+++ b/runtime/tools/create_snapshot_bin.py
@@ -150,7 +150,7 @@
     return 1
 
   # Setup arguments to the snapshot generator binary.
-  script_args = []
+  script_args = ["--error_on_malformed_type"]
 
   # First setup the snapshot output filename.
   script_args.append(''.join([ "--snapshot=", options.output_bin ]))
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
index a698ada..3c6f644 100644
--- a/runtime/vm/assembler_arm.cc
+++ b/runtime/vm/assembler_arm.cc
@@ -1296,6 +1296,85 @@
 }
 
 
+// Preserves object and value registers.
+void Assembler::StoreIntoObjectFilterNoSmi(Register object,
+                                           Register value,
+                                           Label* no_update) {
+  COMPILE_ASSERT((kNewObjectAlignmentOffset == kWordSize) &&
+                 (kOldObjectAlignmentOffset == 0), young_alignment);
+
+  // Write-barrier triggers if the value is in the new space (has bit set) and
+  // the object is in the old space (has bit cleared).
+  // To check that, we compute value & ~object and skip the write barrier
+  // if the bit is not set. We can't destroy the object.
+  bic(IP, value, ShifterOperand(object));
+  tst(IP, ShifterOperand(kNewObjectAlignmentOffset));
+  b(no_update, EQ);
+}
+
+
+// Preserves object and value registers.
+void Assembler::StoreIntoObjectFilter(Register object,
+                                      Register value,
+                                      Label* no_update) {
+  // For the value we are only interested in the new/old bit and the tag bit.
+  // And the new bit with the tag bit. The resulting bit will be 0 for a Smi.
+  and_(IP, value, ShifterOperand(value, LSL, kObjectAlignmentLog2 - 1));
+  // And the result with the negated space bit of the object.
+  bic(IP, IP, ShifterOperand(object));
+  tst(IP, ShifterOperand(kNewObjectAlignmentOffset));
+  b(no_update, EQ);
+}
+
+
+void Assembler::StoreIntoObject(Register object,
+                                const Address& dest,
+                                Register value,
+                                bool can_value_be_smi) {
+  ASSERT(object != value);
+  str(value, dest);
+  Label done;
+  if (can_value_be_smi) {
+    StoreIntoObjectFilter(object, value, &done);
+  } else {
+    StoreIntoObjectFilterNoSmi(object, value, &done);
+  }
+  // A store buffer update is required.
+  if (value != R0) Push(R0);  // Preserve R0.
+  if (object != R0) {
+    mov(R0, ShifterOperand(object));
+  }
+  BranchLink(&StubCode::UpdateStoreBufferLabel());
+  if (value != R0) Pop(R0);  // Restore R0.
+  Bind(&done);
+}
+
+
+void Assembler::StoreIntoObjectNoBarrier(Register object,
+                                         const Address& dest,
+                                         Register value) {
+  str(value, dest);
+#if defined(DEBUG)
+  Label done;
+  StoreIntoObjectFilter(object, value, &done);
+  Stop("Store buffer update is required");
+  Bind(&done);
+#endif  // defined(DEBUG)
+  // No store buffer update.
+}
+
+
+void Assembler::StoreIntoObjectNoBarrier(Register object,
+                                         const Address& dest,
+                                         const Object& value) {
+  ASSERT(value.IsSmi() || value.InVMHeap() ||
+         (value.IsOld() && value.IsNotTemporaryScopedHandle()));
+  // No store buffer update.
+  LoadObject(IP, value);
+  str(IP, dest);
+}
+
+
 void Assembler::LoadClassId(Register result, Register object) {
   ASSERT(RawObject::kClassIdTagBit == 16);
   ASSERT(RawObject::kClassIdTagSize == 16);
diff --git a/runtime/vm/assembler_arm.h b/runtime/vm/assembler_arm.h
index c5a2940..724652b 100644
--- a/runtime/vm/assembler_arm.h
+++ b/runtime/vm/assembler_arm.h
@@ -554,6 +554,18 @@
   void PushObject(const Object& object);
   void CompareObject(Register rn, const Object& object);
 
+  void StoreIntoObject(Register object,  // Object we are storing into.
+                       const Address& dest,  // Where we are storing into.
+                       Register value,  // Value we are storing.
+                       bool can_value_be_smi = true);
+
+  void StoreIntoObjectNoBarrier(Register object,
+                                const Address& dest,
+                                Register value);
+  void StoreIntoObjectNoBarrier(Register object,
+                                const Address& dest,
+                                const Object& value);
+
   void LoadClassId(Register result, Register object);
   void LoadClassById(Register result, Register class_id);
   void LoadClass(Register result, Register object, Register scratch);
@@ -772,10 +784,12 @@
   int32_t EncodeTstOffset(int32_t offset, int32_t inst);
   int DecodeTstOffset(int32_t inst);
 
-  // Returns whether or not the given register is used for passing parameters.
-  static int RegisterCompare(const Register* reg1, const Register* reg2) {
-    return *reg1 - *reg2;
-  }
+  void StoreIntoObjectFilter(Register object, Register value, Label* no_update);
+
+  // Shorter filtering sequence that assumes that value is not a smi.
+  void StoreIntoObjectFilterNoSmi(Register object,
+                                  Register value,
+                                  Label* no_update);
 
   DISALLOW_ALLOCATION();
   DISALLOW_COPY_AND_ASSIGN(Assembler);
diff --git a/runtime/vm/assembler_arm_test.cc b/runtime/vm/assembler_arm_test.cc
index fa47c7f..93955a80 100644
--- a/runtime/vm/assembler_arm_test.cc
+++ b/runtime/vm/assembler_arm_test.cc
@@ -1536,6 +1536,21 @@
 }
 
 
+// Called from assembler_test.cc.
+// LR: return address.
+// R0: context.
+// R1: value.
+// R2: growable array.
+ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) {
+  __ PushList((1 << CTX) | (1 << LR));
+  __ mov(CTX, ShifterOperand(R0));
+  __ StoreIntoObject(R2,
+                     FieldAddress(R2, GrowableObjectArray::data_offset()),
+                     R1);
+  __ PopList((1 << CTX) | (1 << LR));
+  __ Ret();
+}
+
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_ARM
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc
index 3359f46..f293cb9 100644
--- a/runtime/vm/assembler_ia32.cc
+++ b/runtime/vm/assembler_ia32.cc
@@ -165,6 +165,14 @@
 }
 
 
+void Assembler::setcc(Condition condition, ByteRegister dst) {
+  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  EmitUint8(0x0F);
+  EmitUint8(0x90 + condition);
+  EmitUint8(0xC0 + dst);
+}
+
+
 void Assembler::movl(Register dst, const Immediate& imm) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xB8 + dst);
@@ -322,6 +330,13 @@
 }
 
 
+void Assembler::rep_movsb() {
+  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  EmitUint8(0xF3);
+  EmitUint8(0xA4);
+}
+
+
 void Assembler::movss(XmmRegister dst, const Address& src) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xF3);
diff --git a/runtime/vm/assembler_ia32.h b/runtime/vm/assembler_ia32.h
index d147296..4ed8c0e 100644
--- a/runtime/vm/assembler_ia32.h
+++ b/runtime/vm/assembler_ia32.h
@@ -329,6 +329,8 @@
   void pushal();
   void popal();
 
+  void setcc(Condition condition, ByteRegister dst);
+
   void movl(Register dst, const Immediate& src);
   void movl(Register dst, Register src);
 
@@ -356,6 +358,8 @@
   void cmovs(Register dst, Register src);
   void cmovns(Register dst, Register src);
 
+  void rep_movsb();
+
   void movss(XmmRegister dst, const Address& src);
   void movss(const Address& dst, XmmRegister src);
   void movss(XmmRegister dst, XmmRegister src);
@@ -605,6 +609,7 @@
   void Drop(intptr_t stack_elements);
 
   void LoadObject(Register dst, const Object& object);
+
   void PushObject(const Object& object);
   void CompareObject(Register reg, const Object& object);
   void LoadDoubleConstant(XmmRegister dst, double value);
diff --git a/runtime/vm/assembler_ia32_test.cc b/runtime/vm/assembler_ia32_test.cc
index 7933061..bada450 100644
--- a/runtime/vm/assembler_ia32_test.cc
+++ b/runtime/vm/assembler_ia32_test.cc
@@ -2426,6 +2426,21 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(TestSetCC, assembler) {
+  __ movl(EAX, Immediate(0xFFFFFFFF));
+  __ cmpl(EAX, EAX);
+  __ setcc(NOT_EQUAL, AL);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(TestSetCC, test) {
+  typedef uword (*TestSetCC)();
+  uword res = reinterpret_cast<TestSetCC>(test->entry())();
+  EXPECT_EQ(0xFFFFFF00, res);
+}
+
+
 ASSEMBLER_TEST_GENERATE(TestNop, assembler) {
   __ nop(1);
   __ nop(2);
@@ -2506,6 +2521,35 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(TestRepMovsBytes, assembler) {
+  // Preserve registers.
+  __ pushl(ESI);
+  __ pushl(EDI);
+  __ pushl(ECX);
+  __ movl(ESI, Address(ESP, 4 * kWordSize));  // from.
+  __ movl(EDI, Address(ESP, 5 * kWordSize));  // to.
+  __ movl(ECX, Address(ESP, 6 * kWordSize));  // count.
+  __ rep_movsb();
+  __ popl(ECX);
+  __ popl(EDI);
+  __ popl(ESI);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(TestRepMovsBytes, test) {
+  const char* from = "0123456789";
+  const char* to = new char[10];
+  typedef void (*TestRepMovsBytes)(const char* from, const char* to, int count);
+  reinterpret_cast<TestRepMovsBytes>(test->entry())(from, to, 10);
+  EXPECT_EQ(to[0], '0');
+  for (int i = 0; i < 10; i++) {
+    EXPECT_EQ(from[i], to[i]);
+  }
+  delete [] to;
+}
+
+
 // Called from assembler_test.cc.
 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) {
   __ pushl(CTX);
@@ -2521,7 +2565,6 @@
   __ ret();
 }
 
-
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_IA32
diff --git a/runtime/vm/assembler_mips.cc b/runtime/vm/assembler_mips.cc
index c1b9721..b8aed32 100644
--- a/runtime/vm/assembler_mips.cc
+++ b/runtime/vm/assembler_mips.cc
@@ -79,6 +79,44 @@
 }
 
 
+void Assembler::AdduDetectOverflow(Register rd, Register rs, Register rt,
+                                   Register ro) {
+  ASSERT(rd != ro);
+  ASSERT(rd != TMP1);
+  ASSERT(ro != TMP1);
+  ASSERT(ro != rs);
+  ASSERT(ro != rt);
+
+  if ((rs == rt) && (rd == rs)) {
+    ASSERT(rd != TMP2);
+    ASSERT(ro != TMP2);
+    ASSERT(rs != TMP2);
+    ASSERT(rt != TMP2);
+    mov(TMP2, rt);
+    rt = TMP2;
+  }
+
+  if (rd == rs) {
+    mov(TMP1, rs);  // Preserve rs.
+    addu(rd, rs, rt);  // rs is overwritten.
+    xor_(TMP1, rd, TMP1);  // Original rs.
+    xor_(ro, rd, rt);
+    and_(ro, ro, TMP1);
+  } else if (rd == rt) {
+    mov(TMP1, rt);  // Preserve rt.
+    addu(rd, rs, rt);  // rt is overwritten.
+    xor_(TMP1, rd, TMP1);  // Original rt.
+    xor_(ro, rd, rs);
+    and_(ro, ro, TMP1);
+  } else {
+    addu(rd, rs, rt);
+    xor_(ro, rd, rs);
+    xor_(TMP1, rd, rt);
+    and_(ro, TMP1, ro);
+  }
+}
+
+
 void Assembler::LoadObject(Register rd, const Object& object) {
   // Smi's and VM heap objects are never relocated; do not use object pool.
   if (object.IsSmi()) {
@@ -119,15 +157,15 @@
 
 
 void Assembler::PushObject(const Object& object) {
-  LoadObject(TMP, object);
-  Push(TMP);
+  LoadObject(TMP1, object);
+  Push(TMP1);
 }
 
 
 void Assembler::CompareObject(Register rd, Register rn, const Object& object) {
-  ASSERT(rn != TMP);
-  LoadObject(TMP, object);
-  subu(rd, rn, TMP);
+  ASSERT(rn != TMP1);
+  LoadObject(TMP1, object);
+  subu(rd, rn, TMP1);
 }
 
 
@@ -146,40 +184,67 @@
   const intptr_t table_offset_in_isolate =
       Isolate::class_table_offset() + ClassTable::table_offset();
   lw(result, Address(result, table_offset_in_isolate));
-  sll(TMP, class_id, 2);
-  addu(result, result, TMP);
+  sll(TMP1, class_id, 2);
+  addu(result, result, TMP1);
   lw(result, Address(result));
 }
 
 
-void Assembler::LoadClass(Register result, Register object, Register scratch) {
-  ASSERT(scratch != result);
-  LoadClassId(scratch, object);
+void Assembler::LoadClass(Register result, Register object) {
+  ASSERT(TMP1 != result);
+  LoadClassId(TMP1, object);
 
   lw(result, FieldAddress(CTX, Context::isolate_offset()));
   const intptr_t table_offset_in_isolate =
       Isolate::class_table_offset() + ClassTable::table_offset();
   lw(result, Address(result, table_offset_in_isolate));
-  sll(scratch, scratch, 2);
-  addu(result, result, scratch);
+  sll(TMP1, TMP1, 2);
+  addu(result, result, TMP1);
   lw(result, Address(result));
 }
 
 
-void Assembler::EnterStubFrame() {
-  addiu(SP, SP, Immediate(-3 * kWordSize));
-  sw(ZR, Address(SP, 2 * kWordSize));  // PC marker is 0 in stubs.
-  sw(RA, Address(SP, 1 * kWordSize));
-  sw(FP, Address(SP, 0 * kWordSize));
-  mov(FP, SP);
+void Assembler::EnterStubFrame(bool uses_pp) {
+  if (uses_pp) {
+    addiu(SP, SP, Immediate(-4 * kWordSize));
+    sw(ZR, Address(SP, 3 * kWordSize));  // PC marker is 0 in stubs.
+    sw(RA, Address(SP, 2 * kWordSize));
+    sw(PP, Address(SP, 1 * kWordSize));
+    sw(FP, Address(SP, 0 * kWordSize));
+    mov(FP, SP);
+    // Setup pool pointer for this stub.
+    Label next;
+    bal(&next);
+    delay_slot()->mov(T0, RA);
+
+    const intptr_t object_pool_pc_dist =
+        Instructions::HeaderSize() - Instructions::object_pool_offset() +
+        CodeSize();
+
+    Bind(&next);
+    lw(PP, Address(T0, -object_pool_pc_dist));
+  } else {
+    addiu(SP, SP, Immediate(-3 * kWordSize));
+    sw(ZR, Address(SP, 2 * kWordSize));  // PC marker is 0 in stubs.
+    sw(RA, Address(SP, 1 * kWordSize));
+    sw(FP, Address(SP, 0 * kWordSize));
+    mov(FP, SP);
+  }
 }
 
 
-void Assembler::LeaveStubFrame() {
+void Assembler::LeaveStubFrame(bool uses_pp) {
   mov(SP, FP);
-  lw(RA, Address(SP, 1 * kWordSize));
-  lw(FP, Address(SP, 0 * kWordSize));
-  addiu(SP, SP, Immediate(3 * kWordSize));
+  if (uses_pp) {
+    lw(RA, Address(SP, 2 * kWordSize));
+    lw(PP, Address(SP, 1 * kWordSize));
+    lw(FP, Address(SP, 0 * kWordSize));
+    addiu(SP, SP, Immediate(4 * kWordSize));
+  } else {
+    lw(RA, Address(SP, 1 * kWordSize));
+    lw(FP, Address(SP, 0 * kWordSize));
+    addiu(SP, SP, Immediate(3 * kWordSize));
+  }
 }
 
 
@@ -212,14 +277,15 @@
   // the PC at this sw instruction.
   Bind(&next);
 
-  if (offset != 0) {
-    // Adjust PC for any intrinsic code that could have been generated
-    // before a frame is created.
-    addiu(T0, T0, Immediate(-offset));
-  }
-
   // Save PC in frame for fast identification of corresponding code.
-  sw(T0, Address(SP, 3 * kWordSize));
+  if (offset == 0) {
+    sw(T0, Address(SP, 3 * kWordSize));
+  } else {
+    // Adjust saved PC for any intrinsic code that could have been generated
+    // before a frame is created.
+    AddImmediate(T1, T0, -offset);
+    sw(T1, Address(SP, 3 * kWordSize));
+  }
 
   // Set FP to the saved previous FP.
   addiu(FP, SP, Immediate(kWordSize));
@@ -228,7 +294,7 @@
   lw(PP, Address(T0, -object_pool_pc_dist));
 
   // Reserve space for locals.
-  addiu(SP, SP, Immediate(-frame_size));
+  AddImmediate(SP, -frame_size);
 }
 
 
@@ -247,10 +313,10 @@
 void Assembler::ReserveAlignedFrameSpace(intptr_t frame_space) {
   // Reserve space for arguments and align frame before entering
   // the C++ world.
-  addiu(SP, SP, Immediate(-frame_space));
+  AddImmediate(SP, -frame_space);
   if (OS::ActivationFrameAlignment() > 0) {
-    LoadImmediate(TMP, ~(OS::ActivationFrameAlignment() - 1));
-    and_(SP, SP, TMP);
+    LoadImmediate(TMP1, ~(OS::ActivationFrameAlignment() - 1));
+    and_(SP, SP, TMP1);
   }
 }
 
diff --git a/runtime/vm/assembler_mips.h b/runtime/vm/assembler_mips.h
index dda489f..8f430a6 100644
--- a/runtime/vm/assembler_mips.h
+++ b/runtime/vm/assembler_mips.h
@@ -58,13 +58,13 @@
   }
 
   uint32_t encoding() const {
-    ASSERT(Utils::IsInt(16, offset_));
+    ASSERT(Utils::IsInt(kImmBits, offset_));
     uint16_t imm_value = static_cast<uint16_t>(offset_);
     return (base_ << kRsShift) | imm_value;
   }
 
   static bool CanHoldOffset(int32_t offset) {
-    return Utils::IsInt(16, offset);
+    return Utils::IsInt(kImmBits, offset);
   }
 
  private:
@@ -169,8 +169,8 @@
 
   // Set up a stub frame so that the stack traversal code can easily identify
   // a stub frame.
-  void EnterStubFrame();
-  void LeaveStubFrame();
+  void EnterStubFrame(bool uses_pp = false);
+  void LeaveStubFrame(bool uses_pp = false);
 
   // Instruction pattern from entrypoint is used in dart frame prologs
   // to set up the frame and save a PC which can be used to figure out the
@@ -224,7 +224,7 @@
 
   // CPU instructions in alphabetical order.
   void addiu(Register rt, Register rs, const Immediate& imm) {
-    ASSERT(Utils::IsInt(16, imm.value()));
+    ASSERT(Utils::IsInt(kImmBits, imm.value()));
     const uint16_t imm_value = static_cast<uint16_t>(imm.value());
     EmitIType(ADDIU, rs, rt, imm_value);
   }
@@ -238,7 +238,7 @@
   }
 
   void andi(Register rt, Register rs, const Immediate& imm) {
-    ASSERT(Utils::IsUint(16, imm.value()));
+    ASSERT(Utils::IsUint(kImmBits, imm.value()));
     const uint16_t imm_value = static_cast<uint16_t>(imm.value());
     EmitIType(ANDI, rs, rt, imm_value);
   }
@@ -397,7 +397,7 @@
   }
 
   void lui(Register rt, const Immediate& imm) {
-    ASSERT(Utils::IsUint(16, imm.value()));
+    ASSERT(Utils::IsUint(kImmBits, imm.value()));
     uint16_t imm_value = static_cast<uint16_t>(imm.value());
     EmitIType(LUI, R0, rt, imm_value);
   }
@@ -447,7 +447,7 @@
   }
 
   void ori(Register rt, Register rs, const Immediate& imm) {
-    ASSERT(Utils::IsUint(16, imm.value()));
+    ASSERT(Utils::IsUint(kImmBits, imm.value()));
     uint16_t imm_value = static_cast<uint16_t>(imm.value());
     EmitIType(ORI, rs, rt, imm_value);
   }
@@ -506,45 +506,47 @@
 
   // Macros in alphabetical order.
 
+  // Addition of rs and rt with the result placed in rd.
+  // After, ro < 0 if there was signed overflow, ro >= 0 otherwise.
+  // rd and ro must not be TMP1 or TMP2.
+  // ro must be different from all the other registers.
+  void AdduDetectOverflow(Register rd, Register rs, Register rt, Register ro);
+
+  // ro must be different from rd and rs.
+  // rd and ro must not be TMP1 or TMP2
+  void AddImmediateDetectOverflow(Register rd, Register rs, int32_t imm,
+                                  Register ro) {
+    LoadImmediate(rd, imm);
+    AdduDetectOverflow(rd, rs, rd, ro);
+  }
+
   void Branch(const ExternalLabel* label) {
-    LoadImmediate(TMP, label->address());
-    jr(TMP);
+    LoadImmediate(TMP1, label->address());
+    jr(TMP1);
   }
 
   void BranchPatchable(const ExternalLabel* label) {
     const uint16_t low = Utils::Low16Bits(label->address());
     const uint16_t high = Utils::High16Bits(label->address());
-    lui(TMP, Immediate(high));
-    ori(TMP, TMP, Immediate(low));
-    jr(TMP);
+    lui(TMP1, Immediate(high));
+    ori(TMP1, TMP1, Immediate(low));
+    jr(TMP1);
     delay_slot_available_ = false;  // CodePatcher expects a nop.
   }
 
   void BranchLink(const ExternalLabel* label) {
-    LoadImmediate(TMP, label->address());
-    jalr(TMP);
+    LoadImmediate(TMP1, label->address());
+    jalr(TMP1);
   }
 
   void BranchLinkPatchable(const ExternalLabel* label) {
     const int32_t offset =
         Array::data_offset() + 4*AddExternalLabel(label) - kHeapObjectTag;
-    LoadWordFromPoolOffset(TMP, offset);
-    jalr(TMP);
+    LoadWordFromPoolOffset(TMP1, offset);
+    jalr(TMP1);
     delay_slot_available_ = false;  // CodePatcher expects a nop.
   }
 
-  // If the signed value in rs is less than value, rd is 1, and 0 otherwise.
-  void LessThanSImmediate(Register rd, Register rs, int32_t value) {
-    LoadImmediate(TMP, value);
-    slt(rd, rs, TMP);
-  }
-
-  // If the unsigned value in rs is less than value, rd is 1, and 0 otherwise.
-  void LessThanUImmediate(Register rd, Register rs, uint32_t value) {
-    LoadImmediate(TMP, value);
-    sltu(rd, rs, TMP);
-  }
-
   void Drop(intptr_t stack_elements) {
     ASSERT(stack_elements >= 0);
     if (stack_elements > 0) {
@@ -553,7 +555,7 @@
   }
 
   void LoadImmediate(Register rd, int32_t value) {
-    if (Utils::IsInt(16, value)) {
+    if (Utils::IsInt(kImmBits, value)) {
       addiu(rd, ZR, Immediate(value));
     } else {
       const uint16_t low = Utils::Low16Bits(value);
@@ -563,6 +565,103 @@
     }
   }
 
+  void AddImmediate(Register rd, Register rs, int32_t value) {
+    if (Utils::IsInt(kImmBits, value)) {
+      addiu(rd, rs, Immediate(value));
+    } else {
+      LoadImmediate(TMP1, value);
+      addu(rd, rs, TMP1);
+    }
+  }
+
+  void AddImmediate(Register rd, int32_t value) {
+    AddImmediate(rd, rd, value);
+  }
+
+  void BranchEqual(Register rd, int32_t value, Label* l) {
+    LoadImmediate(TMP1, value);
+    beq(rd, TMP1, l);
+  }
+
+  void BranchEqual(Register rd, const Object& object, Label* l) {
+    LoadObject(TMP1, object);
+    beq(rd, TMP1, l);
+  }
+
+  void BranchNotEqual(Register rd, int32_t value, Label* l) {
+    LoadImmediate(TMP1, value);
+    bne(rd, TMP1, l);
+  }
+
+  void BranchNotEqual(Register rd, const Object& object, Label* l) {
+    LoadObject(TMP1, object);
+    bne(rd, TMP1, l);
+  }
+
+  void BranchGreater(Register rd, int32_t value, Label* l) {
+    if (Utils::IsInt(kImmBits, -value)) {
+      addiu(TMP1, rd, Immediate(-value));
+      bgtz(TMP1, l);
+    } else {
+      LoadImmediate(TMP1, value);
+      subu(TMP1, rd, TMP1);
+      bgtz(TMP1, l);
+    }
+  }
+
+  void BranchGreater(Register rd, Register rs, Label* l) {
+    subu(TMP1, rd, rs);
+    bgtz(TMP1, l);
+  }
+
+  void BranchGreaterEqual(Register rd, int32_t value, Label* l) {
+    if (Utils::IsInt(kImmBits, -value)) {
+      addiu(TMP1, rd, Immediate(-value));
+      bgez(TMP1, l);
+    } else {
+      LoadImmediate(TMP1, value);
+      subu(TMP1, rd, TMP1);
+      bgez(TMP1, l);
+    }
+  }
+
+  void BranchGreaterEqual(Register rd, Register rs, Label* l) {
+    subu(TMP1, rd, rs);
+    bgez(TMP1, l);
+  }
+
+  void BranchLess(Register rd, int32_t value, Label* l) {
+    if (Utils::IsInt(kImmBits, -value)) {
+      addiu(TMP1, rd, Immediate(-value));
+      bltz(TMP1, l);
+    } else {
+      LoadImmediate(TMP1, value);
+      subu(TMP1, rd, TMP1);
+      bltz(TMP1, l);
+    }
+  }
+
+  void BranchLess(Register rd, Register rs, Label* l) {
+    subu(TMP1, rd, rs);
+    bltz(TMP1, l);
+  }
+
+  void BranchLessEqual(Register rd, int32_t value, Label* l) {
+    if (Utils::IsInt(kImmBits, -value)) {
+      addiu(TMP1, rd, Immediate(-value));
+      blez(TMP1, l);
+    } else {
+      LoadImmediate(TMP1, value);
+      subu(TMP1, rd, TMP1);
+      blez(TMP1, l);
+    }
+  }
+
+  void BranchLessEqual(Register rd, Register rs, Label* l) {
+    subu(TMP1, rd, rs);
+    blez(TMP1, l);
+  }
+
   void Push(Register rt) {
     addiu(SP, SP, Immediate(-kWordSize));
     sw(rt, Address(SP));
@@ -592,12 +691,12 @@
   void PushObject(const Object& object);
 
   // Sets register rd to zero if the object is equal to register rn,
-  // set to non-zero otherwise.
+  // sets it to non-zero otherwise.
   void CompareObject(Register rd, Register rn, const Object& object);
 
   void LoadClassId(Register result, Register object);
   void LoadClassById(Register result, Register class_id);
-  void LoadClass(Register result, Register object, Register scratch);
+  void LoadClass(Register result, Register object);
 
   void CallRuntime(const RuntimeEntry& entry);
 
diff --git a/runtime/vm/assembler_mips_test.cc b/runtime/vm/assembler_mips_test.cc
index 4124ee0..88d6472 100644
--- a/runtime/vm/assembler_mips_test.cc
+++ b/runtime/vm/assembler_mips_test.cc
@@ -1041,6 +1041,72 @@
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
 }
 
+
+ASSEMBLER_TEST_GENERATE(AddOverflow_detect, assembler) {
+  Register left = T0;
+  Register right = T1;
+  Register result = T2;
+  Register overflow = T3;
+  Label error, done;
+
+  __ LoadImmediate(V0, 1);  // Success value.
+
+  __ LoadImmediate(left, 0x7fffffff);
+  __ LoadImmediate(right, 1);
+  __ AdduDetectOverflow(result, left, right, overflow);
+  __ bgez(overflow, &error);  // INT_MAX + 1 overflows.
+
+  __ LoadImmediate(left, 0x7fffffff);
+  __ AdduDetectOverflow(result, left, left, overflow);
+  __ bgez(overflow, &error);  // INT_MAX + INT_MAX overflows.
+
+  __ LoadImmediate(left, 0x7fffffff);
+  __ LoadImmediate(right, -1);
+  __ AdduDetectOverflow(result, left, right, overflow);
+  __ bltz(overflow, &error);  // INT_MAX - 1 does not overflow.
+
+  __ LoadImmediate(left, -1);
+  __ LoadImmediate(right, 1);
+  __ AdduDetectOverflow(result, left, right, overflow);
+  __ bltz(overflow, &error);  // -1 + 1 does not overflow.
+
+  __ LoadImmediate(left, 123456);
+  __ LoadImmediate(right, 654321);
+  __ AdduDetectOverflow(result, left, right, overflow);
+  __ bltz(overflow, &error);  // 123456 + 654321 does not overflow.
+
+  __ LoadImmediate(left, 0x80000000);
+  __ LoadImmediate(right, -1);
+  __ AdduDetectOverflow(result, left, right, overflow);
+  __ bgez(overflow, &error);  // INT_MIN - 1 overflows.
+
+  // result has 0x7fffffff.
+  __ AdduDetectOverflow(result, result, result, overflow);
+  __ bgez(overflow, &error);  // INT_MAX + INT_MAX overflows.
+
+  __ LoadImmediate(left, 0x80000000);
+  __ LoadImmediate(right, 0x80000000);
+  __ AdduDetectOverflow(result, left, right, overflow);
+  __ bgez(overflow, &error);  // INT_MIN + INT_MIN overflows.
+
+  __ LoadImmediate(left, -123456);
+  __ LoadImmediate(right, -654321);
+  __ AdduDetectOverflow(result, left, right, overflow);
+  __ bltz(overflow, &error);  // -123456 + -654321 does not overflow.
+
+  __ b(&done);
+  __ Bind(&error);
+  __ mov(V0, ZR);
+  __ Bind(&done);
+  __ Ret();
+}
+
+
+ASSEMBLER_TEST_RUN(AddOverflow_detect, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(1, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
+}
+
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_MIPS
diff --git a/runtime/vm/assembler_test.cc b/runtime/vm/assembler_test.cc
index 4071847..2e026d5 100644
--- a/runtime/vm/assembler_test.cc
+++ b/runtime/vm/assembler_test.cc
@@ -5,20 +5,33 @@
 #include "vm/assembler.h"
 #include "vm/globals.h"
 #include "vm/os.h"
+#include "vm/simulator.h"
 #include "vm/unit_test.h"
 #include "vm/virtual_memory.h"
 
 namespace dart {
 
-#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
+#if defined(TARGET_ARCH_IA32) ||                                               \
+    defined(TARGET_ARCH_X64) ||                                                \
+    defined(TARGET_ARCH_ARM)
 
 ASSEMBLER_TEST_EXTERN(StoreIntoObject);
 
 ASSEMBLER_TEST_RUN(StoreIntoObject, test) {
+#if defined(USING_SIMULATOR)
+#define test_code(ctx, value, growable_array)                                  \
+  Simulator::Current()->Call(                                                  \
+      bit_cast<int32_t, uword>(test->entry()),                                 \
+      reinterpret_cast<int32_t>(ctx),                                          \
+      reinterpret_cast<int32_t>(value),                                        \
+      reinterpret_cast<int32_t>(growable_array),                               \
+      0)
+#else
   typedef void (*StoreData)(RawContext* ctx,
                             RawObject* value,
                             RawObject* growable_array);
   StoreData test_code = reinterpret_cast<StoreData>(test->entry());
+#endif
 
   const Array& old_array = Array::Handle(Array::New(3, Heap::kOld));
   const Array& new_array = Array::Handle(Array::New(3, Heap::kNew));
@@ -70,6 +83,6 @@
       reinterpret_cast<uword>(grow_new_array.raw())));
 }
 
-#endif
+#endif  // TARGET_ARCH_IA32 || TARGET_ARCH_X64 || TARGET_ARCH_ARM
 
 }  // namespace dart
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index ec43f5d..2385749 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -155,6 +155,14 @@
 }
 
 
+void Assembler::setcc(Condition condition, ByteRegister dst) {
+  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  EmitUint8(0x0F);
+  EmitUint8(0x90 + condition);
+  EmitUint8(0xC0 + dst);
+}
+
+
 void Assembler::movl(Register dst, Register src) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   Operand operand(src);
@@ -382,6 +390,13 @@
 }
 
 
+void Assembler::rep_movsb() {
+  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  EmitUint8(0xF3);
+  EmitUint8(0xA4);
+}
+
+
 void Assembler::leaq(Register dst, const Address& src) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitOperandREX(dst, src, REX_W);
diff --git a/runtime/vm/assembler_x64.h b/runtime/vm/assembler_x64.h
index 6f049bb..9ba4fba 100644
--- a/runtime/vm/assembler_x64.h
+++ b/runtime/vm/assembler_x64.h
@@ -339,6 +339,8 @@
   void popq(Register reg);
   void popq(const Address& address);
 
+  void setcc(Condition condition, ByteRegister dst);
+
   void movl(Register dst, Register src);
   void movl(Register dst, const Immediate& imm);
   void movl(Register dst, const Address& src);
@@ -368,6 +370,8 @@
   void movsxd(Register dst, Register src);
   void movsxd(Register dst, const Address& src);
 
+  void rep_movsb();
+
   void leaq(Register dst, const Address& src);
 
   void movss(XmmRegister dst, const Address& src);
diff --git a/runtime/vm/assembler_x64_test.cc b/runtime/vm/assembler_x64_test.cc
index 2d29d9d..bb29537 100644
--- a/runtime/vm/assembler_x64_test.cc
+++ b/runtime/vm/assembler_x64_test.cc
@@ -2291,6 +2291,51 @@
   EXPECT_EQ(1, res);
 }
 
+
+ASSEMBLER_TEST_GENERATE(TestSetCC, assembler) {
+  __ movq(RAX, Immediate(0xFFFFFFFF));
+  __ cmpq(RAX, RAX);
+  __ setcc(NOT_EQUAL, AL);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(TestSetCC, test) {
+  typedef uword (*TestSetCC)();
+  uword res = reinterpret_cast<TestSetCC>(test->entry())();
+  EXPECT_EQ(0xFFFFFF00, res);
+}
+
+
+ASSEMBLER_TEST_GENERATE(TestRepMovsBytes, assembler) {
+  // Save incoming arguments.
+  __ pushq(RDI);  // Arg0, from.
+  __ pushq(RSI);  // Arg1, to.
+  __ pushq(RDX);  // Arg2, count.
+  __ movq(RSI, Address(RSP, 2 * kWordSize));  // from.
+  __ movq(RDI, Address(RSP, 1 * kWordSize));  // to.
+  __ movq(RCX, Address(RSP, 0 * kWordSize));  // count.
+  __ rep_movsb();
+  // Remove saved arguments.
+  __ popq(RAX);
+  __ popq(RAX);
+  __ popq(RAX);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(TestRepMovsBytes, test) {
+  const char* from = "0123456789";
+  const char* to = new char[10];
+  typedef void (*TestRepMovsBytes)(const char* from, const char* to, int count);
+  reinterpret_cast<TestRepMovsBytes>(test->entry())(from, to, 10);
+  EXPECT_EQ(to[0], '0');
+  for (int i = 0; i < 10; i++) {
+    EXPECT_EQ(from[i], to[i]);
+  }
+  delete [] to;
+}
+
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_X64
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index b72a1c5..2c8f1c1 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -68,6 +68,7 @@
 void AddSuperType(const AbstractType& type,
                   GrowableArray<intptr_t>* finalized_super_classes) {
   ASSERT(type.HasResolvedTypeClass());
+  ASSERT(!type.IsDynamicType());
   if (type.IsObjectType()) {
     return;
   }
@@ -160,6 +161,7 @@
     // Clear pending classes array.
     class_array = GrowableObjectArray::New();
     object_store->set_pending_classes(class_array);
+    VerifyImplicitFieldOffsets();  // Verification after an error may fail.
   } else {
     retval = false;
   }
@@ -167,7 +169,6 @@
   if (FLAG_use_cha) {
     RemoveOptimizedCode(added_subclasses_to_cids);
   }
-  VerifyImplicitFieldOffsets();
   return retval;
 }
 
@@ -897,35 +898,6 @@
                                                  const Function& function) {
   // Resolve result type.
   AbstractType& type = AbstractType::Handle(function.result_type());
-  // TODO(regis): Remove this code once the parser checks the factory name and
-  // once the core library is fixed. See issue 6641.
-  // In case of a factory, the parser sets the factory result type to a type
-  // with an unresolved class whose name matches the factory name and no type
-  // arguments. We resolve the class and specify type arguments in case the
-  // class is generic.
-  if (function.IsFactory()) {
-    Type& factory_result_type = Type::Handle();
-    factory_result_type ^= type.raw();
-    ASSERT(factory_result_type.arguments() == TypeArguments::null());
-    const UnresolvedClass& unresolved_factory_class =
-        UnresolvedClass::Handle(factory_result_type.unresolved_class());
-    const Class& factory_class =
-        Class::Handle(ResolveClass(cls, unresolved_factory_class));
-    if (factory_class.IsNull()) {
-      type = NewFinalizedMalformedType(
-          Error::Handle(),  // No previous error.
-          cls,
-          unresolved_factory_class.token_pos(),
-          kTryResolve,  // No compile-time error.
-          "cannot resolve factory class name '%s' from '%s'",
-          String::Handle(unresolved_factory_class.Name()).ToCString(),
-          String::Handle(cls.Name()).ToCString());
-    } else {
-      type = Type::New(factory_class,
-                       TypeArguments::Handle(factory_class.type_parameters()),
-                       unresolved_factory_class.token_pos());
-    }
-  }
   // It is not a compile time error if this name does not resolve to a class or
   // interface.
   ResolveType(cls, type, kCanonicalize);
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 28b4c8e..e39278b 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -167,14 +167,16 @@
       FlowGraphPrinter::PrintGraph("Before Optimizations", flow_graph);
     }
 
-    const ZoneGrowableArray<Field*>* guarded_fields = NULL;
-
+    // Collect all instance fields that are loaded in the graph and
+    // have non-generic type feedback attached to them that can
+    // potentially affect optimizations.
+    GrowableArray<Field*> guarded_fields(10);
     if (optimized) {
       TimerScope timer(FLAG_compiler_stats,
                        &CompilerStats::graphoptimizer_timer,
                        isolate);
 
-      FlowGraphOptimizer optimizer(flow_graph);
+      FlowGraphOptimizer optimizer(flow_graph, &guarded_fields);
       optimizer.ApplyICData();
       DEBUG_ASSERT(flow_graph->VerifyUseLists());
 
@@ -189,14 +191,12 @@
       if (FLAG_use_inlining) {
         TimerScope timer(FLAG_compiler_stats,
                          &CompilerStats::graphinliner_timer);
-        FlowGraphInliner inliner(flow_graph);
+        FlowGraphInliner inliner(flow_graph, &guarded_fields);
         inliner.Inline();
         // Use lists are maintained and validated by the inliner.
         DEBUG_ASSERT(flow_graph->VerifyUseLists());
       }
 
-      guarded_fields = flow_graph->FieldDependencies();
-
       // Propagate types and eliminate more type tests.
       if (FLAG_propagate_types) {
         FlowGraphTypePropagator propagator(flow_graph);
@@ -215,6 +215,9 @@
       BranchSimplifier::Simplify(flow_graph);
       DEBUG_ASSERT(flow_graph->VerifyUseLists());
 
+      IfConverter::Simplify(flow_graph);
+      DEBUG_ASSERT(flow_graph->VerifyUseLists());
+
       if (FLAG_constant_propagation) {
         ConstantPropagator::Optimize(flow_graph);
         DEBUG_ASSERT(flow_graph->VerifyUseLists());
@@ -325,8 +328,8 @@
                     Code::Handle(function.unoptimized_code()).EntryPoint());
         }
 
-        for (intptr_t i = 0; i < guarded_fields->length(); i++) {
-          const Field& field = *(*guarded_fields)[i];
+        for (intptr_t i = 0; i < guarded_fields.length(); i++) {
+          const Field& field = *guarded_fields[i];
           field.RegisterDependentCode(code);
         }
       } else {
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index 43547b6..75edcfd 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -133,6 +133,7 @@
 typedef DRegister FpuRegister;
 const FpuRegister FpuTMP = D0;
 const int kNumberOfFpuRegisters = kNumberOfDRegisters;
+const FpuRegister kNoFpuRegister = kNoDRegister;
 
 
 // Register aliases.
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index 937ff99..b6b1367 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -56,6 +56,7 @@
 typedef XmmRegister FpuRegister;
 const FpuRegister FpuTMP = XMM0;
 const int kNumberOfFpuRegisters = kNumberOfXmmRegisters;
+const FpuRegister kNoFpuRegister = kNoXmmRegister;
 
 
 // Register aliases.
diff --git a/runtime/vm/constants_mips.h b/runtime/vm/constants_mips.h
index 9bad858..9a47410 100644
--- a/runtime/vm/constants_mips.h
+++ b/runtime/vm/constants_mips.h
@@ -31,11 +31,11 @@
   R19 = 19,
   R20 = 20,
   R21 = 21,
+  kLastFreeCpuRegister = 21,
   R22 = 22,
   R23 = 23,
   R24 = 24,
   R25 = 25,
-  kLastFreeCpuRegister = 25,
   R26 = 26,
   R27 = 27,
   R28 = 28,
@@ -131,15 +131,23 @@
 typedef FRegister FpuRegister;
 const FpuRegister FpuTMP = F0;
 const int kNumberOfFpuRegisters = kNumberOfFRegisters;
+const FpuRegister kNoFpuRegister = kNoFRegister;
 
 
 // Register aliases.
-const Register TMP = AT;  // Used as scratch register by assembler.
+const Register TMP1 = AT;  // Used as scratch register by assembler.
+const Register TMP2 = T9;  // Used as scratch register by assembler.
+const Register TMP = TMP1;  // Arch independent flow graph compiler needs a
+                            // Register called TMP.
 const Register CTX = S6;  // Caches current context in generated code.
 const Register PP = S7;  // Caches object pool pointer in generated code.
 const Register SPREG = SP;  // Stack pointer register.
 const Register FPREG = FP;  // Frame pointer register.
 
+// The code that generates a comparison can be far away from the code that
+// generates the branch that uses the result of that comparison. In this case,
+// CMPRES is used for the result of the comparison.
+const Register CMPRES = T8;
 
 typedef uint32_t RegList;
 const RegList kAllCpuRegistersList = 0xFFFFFFFF;
@@ -158,10 +166,12 @@
 static const int kFirstLocalSlotIndex = -2;
 
 
-// Values for the condition field.  // UNIMPLEMENTED.
+// Values for the condition field.
+// There is no condition field on MIPS, but Conditions are used and passed
+// around by the intermediate language, so we need them here, too.
 enum Condition {
-  kNoCondition = -1,
-  kMaxCondition = 16,
+  EQ,  // equal
+  NE,  // not equal
 };
 
 
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index a343543..d3f5f9f 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -70,6 +70,7 @@
 typedef XmmRegister FpuRegister;
 const FpuRegister FpuTMP = XMM0;
 const int kNumberOfFpuRegisters = kNumberOfXmmRegisters;
+const FpuRegister kNoFpuRegister = kNoXmmRegister;
 
 
 enum RexBits {
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 8ad2e6b..e7ee27b 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -938,6 +938,16 @@
 }
 
 
+DART_EXPORT bool Dart_IsolateMakeRunnable(Dart_Isolate isolate) {
+  CHECK_NO_ISOLATE(Isolate::Current());
+  if (isolate == NULL) {
+    FATAL1("%s expects argument 'isolate' to be non-null.",  CURRENT_FUNC);
+  }
+  Isolate* iso = reinterpret_cast<Isolate*>(isolate);
+  return iso->MakeRunnable();
+}
+
+
 // --- Messages and Ports ---
 
 DART_EXPORT void Dart_SetMessageNotifyCallback(
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 61c4dbc..cc2d2de 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -906,6 +906,13 @@
 TEST_CASE(ByteDataAccess) {
   const char* kScriptChars =
       "import 'dart:typeddata';\n"
+      "class Expect {\n"
+      "  static equals(a, b) {\n"
+      "    if (a != b) {\n"
+      "      throw 'not equal. expected: $a, got: $b';\n"
+      "    }\n"
+      "  }\n"
+      "}\n"
       "ByteData createByteData() native 'CreateByteData';"
       "ByteData main() {"
       "  var length = 16;"
@@ -961,6 +968,13 @@
   // appropriate getter instead of the host endian format used now.
   const char* kScriptChars =
       "import 'dart:typeddata';\n"
+      "class Expect {\n"
+      "  static equals(a, b) {\n"
+      "    if (a != b) {\n"
+      "      throw 'not equal. expected: $a, got: $b';\n"
+      "    }\n"
+      "  }\n"
+      "}\n"
       "ByteData createExternalByteData() native 'CreateExternalByteData';"
       "ByteData main() {"
       "  var length = 16;"
@@ -1073,6 +1087,13 @@
 TEST_CASE(TypedDataDirectAccess1) {
   const char* kScriptChars =
       "import 'dart:typeddata';\n"
+      "class Expect {\n"
+      "  static equals(a, b) {\n"
+      "    if (a != b) {\n"
+      "      throw new Exception('not equal. expected: $a, got: $b');\n"
+      "    }\n"
+      "  }\n"
+      "}\n"
       "void setMain(var a) {"
       "  for (var i = 0; i < 10; i++) {"
       "    a[i] = i;"
@@ -1113,6 +1134,13 @@
 TEST_CASE(TypedDataViewDirectAccess) {
   const char* kScriptChars =
       "import 'dart:typeddata';\n"
+      "class Expect {\n"
+      "  static equals(a, b) {\n"
+      "    if (a != b) {\n"
+      "      throw 'not equal. expected: $a, got: $b';\n"
+      "    }\n"
+      "  }\n"
+      "}\n"
       "void setMain(var list) {"
       "  Expect.equals(10, list.length);"
       "  for (var i = 0; i < 10; i++) {"
@@ -1145,6 +1173,13 @@
 TEST_CASE(ByteDataDirectAccess) {
   const char* kScriptChars =
       "import 'dart:typeddata';\n"
+      "class Expect {\n"
+      "  static equals(a, b) {\n"
+      "    if (a != b) {\n"
+      "      throw 'not equal. expected: $a, got: $b';\n"
+      "    }\n"
+      "  }\n"
+      "}\n"
       "void setMain(var list) {"
       "  Expect.equals(10, list.length);"
       "  for (var i = 0; i < 10; i++) {"
@@ -6243,10 +6278,10 @@
 }
 
 
-static bool RunLoopTestCallback(const char* script_name,
-                                const char* main,
-                                void* data,
-                                char** error) {
+static Dart_Isolate RunLoopTestCallback(const char* script_name,
+                                        const char* main,
+                                        void* data,
+                                        char** error) {
   const char* kScriptChars =
       "import 'builtin';\n"
       "import 'dart:isolate';\n"
@@ -6282,7 +6317,10 @@
   Dart_Handle lib = Dart_LoadScript(url, source, 0, 0);
   EXPECT_VALID(lib);
   Dart_ExitScope();
-  return true;
+  Dart_ExitIsolate();
+  bool retval = Dart_IsolateMakeRunnable(isolate);
+  EXPECT(retval);
+  return isolate;
 }
 
 
@@ -6308,8 +6346,9 @@
   Dart_IsolateCreateCallback saved = Isolate::CreateCallback();
   Isolate::SetCreateCallback(RunLoopTestCallback);
   Isolate::SetUnhandledExceptionCallback(RunLoopUnhandledExceptionCallback);
-  RunLoopTestCallback(NULL, NULL, NULL, NULL);
+  Dart_Isolate isolate = RunLoopTestCallback(NULL, NULL, NULL, NULL);
 
+  Dart_EnterIsolate(isolate);
   Dart_EnterScope();
   Dart_Handle lib = Dart_LookupLibrary(NewString(TestCase::url()));
   EXPECT_VALID(lib);
@@ -6648,6 +6687,13 @@
       "  int bar43(int i, int j, int k) {\n"
       "    var func = foo4; return func(i, j, k); }\n"
       "}\n"
+      "class Expect {\n"
+      "  static equals(a, b) {\n"
+      "    if (a != b) {\n"
+      "      throw 'not equal. expected: $a, got: $b';\n"
+      "    }\n"
+      "  }\n"
+      "}\n"
       "int testMain() {\n"
       "  Test obj = new Test();\n"
       "  Expect.equals(1, obj.foo1());\n"
@@ -6786,6 +6832,13 @@
       "  int bar43(int i, int j, int k) {\n"
       "    var func = foo4; return func(i, j, k); }\n"
       "}\n"
+      "class Expect {\n"
+      "  static equals(a, b) {\n"
+      "    if (a != b) {\n"
+      "      throw 'not equal. expected: $a, got: $b';\n"
+      "    }\n"
+      "  }\n"
+      "}\n"
       "int testMain() {\n"
       "  Test obj = new Test();\n"
       "  Expect.equals(0, Test.foo1());\n"
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index ab1e060..5315301b 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -164,6 +164,22 @@
 }
 
 
+Dart_CObject_Internal* ApiMessageReader::AllocateDartCObjectInternal(
+    Dart_CObject_Internal::Type type) {
+  Dart_CObject_Internal* value =
+      reinterpret_cast<Dart_CObject_Internal*>(
+          alloc_(NULL, 0, sizeof(Dart_CObject_Internal)));
+  ASSERT(value != NULL);
+  value->type = static_cast<Dart_CObject::Type>(type);
+  return value;
+}
+
+
+Dart_CObject_Internal* ApiMessageReader::AllocateDartCObjectClass() {
+  return AllocateDartCObjectInternal(Dart_CObject_Internal::kClass);
+}
+
+
 ApiMessageReader::BackRefNode* ApiMessageReader::AllocateBackRefNode(
     Dart_CObject* reference,
     DeserializeState state) {
@@ -182,9 +198,55 @@
   USE(tags);
   intptr_t class_id;
 
-  // Reading of regular dart instances is not supported.
+  // There is limited support for reading regular dart instances. Only
+  // typed data views are currently handled.
   if (SerializedHeaderData::decode(class_header) == kInstanceObjectId) {
-    return AllocateDartCObjectUnsupported();
+    Dart_CObject_Internal* object =
+        reinterpret_cast<Dart_CObject_Internal*>(GetBackRef(object_id));
+    if (object == NULL) {
+      object =
+          AllocateDartCObjectInternal(Dart_CObject_Internal::kUninitialized);
+      AddBackRef(object_id, object, kIsDeserialized);
+      // Read class of object.
+      object->cls = reinterpret_cast<Dart_CObject_Internal*>(ReadObjectImpl());
+      ASSERT(object->cls->type ==
+             static_cast<Dart_CObject::Type>(Dart_CObject_Internal::kClass));
+    }
+    ASSERT(object->type ==
+           static_cast<Dart_CObject::Type>(
+               Dart_CObject_Internal::kUninitialized));
+
+    // Handle typed data views.
+    char* library_url =
+        object->cls->internal.as_class.library_url->value.as_string;
+    char* class_name =
+        object->cls->internal.as_class.class_name->value.as_string;
+    if (strcmp("dart:typeddata", library_url) == 0 &&
+        strncmp("_Uint8ArrayView", class_name, 15) == 0) {
+      object->type =
+          static_cast<Dart_CObject::Type>(Dart_CObject_Internal::kView);
+      // Skip type arguments.
+      ReadObjectImpl();
+      object->internal.as_view.buffer = ReadObjectImpl();
+      object->internal.as_view.offset_in_bytes = ReadSmiValue();
+      object->internal.as_view.length = ReadSmiValue();
+
+      // The buffer is fully read now as typed data objects are
+      // serialized in-line.
+      Dart_CObject* buffer = object->internal.as_view.buffer;
+      ASSERT(buffer->type == Dart_CObject::kUint8Array);
+
+      // Now turn the view into a byte array.
+      object->type = Dart_CObject::kUint8Array;
+      object->value.as_byte_array.length = object->internal.as_view.length;
+      object->value.as_byte_array.values =
+          buffer->value.as_byte_array.values +
+          object->internal.as_view.offset_in_bytes;
+    } else {
+      // TODO(sgjesse): Handle other instances. Currently this will
+      // skew the reading as the fields of the instance is not read.
+    }
+    return object;
   }
 
   ASSERT((class_header & kSmiTagMask) != 0);
@@ -265,11 +327,17 @@
   // Read the class header information and lookup the class.
   intptr_t class_header = ReadIntptrValue();
 
-  // Reading of regular dart instances is not supported.
+  // Reading of regular dart instances has limited support in order to
+  // read typed data views.
   if (SerializedHeaderData::decode(class_header) == kInstanceObjectId) {
     intptr_t object_id = SerializedHeaderData::decode(value);
-    Dart_CObject* object = AllocateDartCObjectUnsupported();
+    Dart_CObject_Internal* object =
+        AllocateDartCObjectInternal(Dart_CObject_Internal::kUninitialized);
     AddBackRef(object_id, object, kIsNotDeserialized);
+    // Read class of object.
+    object->cls = reinterpret_cast<Dart_CObject_Internal*>(ReadObjectImpl());
+    ASSERT(object->cls->type ==
+           static_cast<Dart_CObject::Type>(Dart_CObject_Internal::kClass));
     return object;
   }
   ASSERT((class_header & kSmiTagMask) != 0);
@@ -313,8 +381,14 @@
                                                      intptr_t object_id) {
   switch (class_id) {
     case kClassCid: {
-      Dart_CObject* object = AllocateDartCObjectUnsupported();
+      Dart_CObject_Internal* object = AllocateDartCObjectClass();
       AddBackRef(object_id, object, kIsDeserialized);
+      object->internal.as_class.library_url = ReadObjectImpl();
+      ASSERT(object->internal.as_class.library_url->type ==
+             Dart_CObject::kString);
+      object->internal.as_class.class_name = ReadObjectImpl();
+      ASSERT(object->internal.as_class.class_name->type ==
+             Dart_CObject::kString);
       return object;
     }
     case kTypeArgumentsCid: {
diff --git a/runtime/vm/dart_api_message.h b/runtime/vm/dart_api_message.h
index 84d44a8..d215ab0 100644
--- a/runtime/vm/dart_api_message.h
+++ b/runtime/vm/dart_api_message.h
@@ -14,13 +14,26 @@
 // data. These are objects that we need to process in order to
 // generate the Dart_CObject graph but that we don't want to expose in
 // that graph.
-// TODO(sjesse): Remove this when message serialization format is
-// updated.
 struct Dart_CObject_Internal : public Dart_CObject {
   enum Type {
     kTypeArguments = Dart_CObject::kNumberOfTypes,
     kDynamicType,
+    kClass,
+    kView,
+    kUninitialized,
   };
+  struct Dart_CObject_Internal* cls;
+  union {
+    struct {
+      struct _Dart_CObject* library_url;
+      struct _Dart_CObject* class_name;
+    } as_class;
+    struct {
+      struct _Dart_CObject* buffer;
+      int offset_in_bytes;
+      int length;
+    } as_view;
+  } internal;
 };
 
 
@@ -79,6 +92,11 @@
   Dart_CObject* AllocateDartCObjectUint8Array(intptr_t length);
   // Allocates a C array of Dart_CObject objects.
   Dart_CObject* AllocateDartCObjectArray(intptr_t length);
+  // Allocates a Dart_CObject_Internal object with the specified type.
+  Dart_CObject_Internal* AllocateDartCObjectInternal(
+      Dart_CObject_Internal::Type type);
+  // Allocates a Dart_CObject_Internal object for a class object.
+  Dart_CObject_Internal* AllocateDartCObjectClass();
   // Allocates a backwards reference node.
   BackRefNode* AllocateBackRefNode(Dart_CObject* ref, DeserializeState state);
 
diff --git a/runtime/vm/dart_entry_test.cc b/runtime/vm/dart_entry_test.cc
index f067736..a09b35c 100644
--- a/runtime/vm/dart_entry_test.cc
+++ b/runtime/vm/dart_entry_test.cc
@@ -14,8 +14,10 @@
 
 namespace dart {
 
-// Only ia32 and x64 can run execution tests.
-#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
+// Only IA32, X64, and ARM can run execution tests.
+#if defined(TARGET_ARCH_IA32) ||                                               \
+    defined(TARGET_ARCH_X64) ||                                                \
+    defined(TARGET_ARCH_ARM)
 
 TEST_CASE(DartEntry) {
   const char* kScriptChars =
@@ -113,6 +115,6 @@
   EXPECT_SUBSTRING("++++", Error::Cast(retval).ToErrorCString());
 }
 
-#endif  // TARGET_ARCH_IA32 || TARGET_ARCH_X64.
+#endif  // TARGET_ARCH_IA32 || TARGET_ARCH_X64 || TARGET_ARCH_ARM
 
 }  // namespace dart
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 30909a9..685a8c1 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -262,7 +262,6 @@
         break;
       }
     }
-    ASSERT(token_pos_ >= 0);
   }
   return token_pos_;
 }
@@ -270,8 +269,7 @@
 
 intptr_t ActivationFrame::PcDescIndex() {
   if (pc_desc_index_ < 0) {
-    TokenPos();
-    ASSERT(pc_desc_index_ >= 0);
+    TokenPos();  // Sets pc_desc_index_ as a side effect.
   }
   return pc_desc_index_;
 }
@@ -279,13 +277,17 @@
 
 intptr_t ActivationFrame::TryIndex() {
   intptr_t desc_index = PcDescIndex();
-  return pc_desc_.TryIndex(desc_index);
+  if (desc_index < 0) {
+    return -1;
+  } else {
+    return pc_desc_.TryIndex(desc_index);
+  }
 }
 
 
 intptr_t ActivationFrame::LineNumber() {
   // Compute line number lazily since it causes scanning of the script.
-  if (line_number_ < 0) {
+  if ((line_number_ < 0) && (TokenPos() >= 0)) {
     const Script& script = Script::Handle(SourceScript());
     intptr_t ignore_column;
     script.GetTokenLocation(TokenPos(), &line_number_, &ignore_column);
@@ -308,6 +310,12 @@
     ASSERT(!code_.is_optimized());
     context_level_ = 0;
     intptr_t pc_desc_idx = PcDescIndex();
+    // TODO(hausner): What to do if there is no descriptor entry
+    // for the code position of the frame? For now say we are at context
+    // level 0.
+    if (pc_desc_idx < 0) {
+      return context_level_;
+    }
     ASSERT(!pc_desc_.IsNull());
     if (pc_desc_.DescriptorKind(pc_desc_idx) == PcDescriptors::kReturn) {
       // Special case: the context chain has already been deallocated.
@@ -316,6 +324,7 @@
     }
     intptr_t innermost_begin_pos = 0;
     intptr_t activation_token_pos = TokenPos();
+    ASSERT(activation_token_pos >= 0);
     GetVarDescriptors();
     intptr_t var_desc_len = var_descriptors_.Length();
     for (int cur_idx = 0; cur_idx < var_desc_len; cur_idx++) {
@@ -406,8 +415,15 @@
     return;
   }
 
-  GrowableArray<String*> var_names(8);
   intptr_t activation_token_pos = TokenPos();
+  if (activation_token_pos < 0) {
+    // We don't have a token position for this frame, so can't determine
+    // which variables are visible.
+    vars_initialized_ = true;
+    return;
+  }
+
+  GrowableArray<String*> var_names(8);
   intptr_t var_desc_len = var_descriptors_.Length();
   for (int cur_idx = 0; cur_idx < var_desc_len; cur_idx++) {
     ASSERT(var_names.length() == desc_indices_.length());
@@ -992,6 +1008,7 @@
   intptr_t lowest_pc_index = -1;
   for (int i = 0; i < desc.Length(); i++) {
     intptr_t desc_token_pos = desc.TokenPos(i);
+    ASSERT(desc_token_pos >= 0);
     if (desc_token_pos < first_token_pos) {
       continue;
     }
diff --git a/runtime/vm/debugger_api_impl.cc b/runtime/vm/debugger_api_impl.cc
index 84dc81e..cf4c340 100644
--- a/runtime/vm/debugger_api_impl.cc
+++ b/runtime/vm/debugger_api_impl.cc
@@ -225,6 +225,7 @@
 DART_EXPORT Dart_Handle Dart_ActivationFrameGetLocation(
                             Dart_ActivationFrame activation_frame,
                             Dart_Handle* script_url,
+                            intptr_t* library_id,
                             intptr_t* token_number) {
   // TODO(hausner): Implement implement a way to recognize when there
   // is no source code for the code in the frame.
@@ -234,6 +235,10 @@
   if (script_url != NULL) {
     *script_url = Api::NewHandle(isolate, frame->SourceUrl());
   }
+  if (library_id != NULL) {
+    const Library& lib = Library::Handle(frame->Library());
+    *library_id = lib.index();
+  }
   if (token_number != NULL) {
     *token_number = frame->TokenPos();
   }
@@ -268,43 +273,6 @@
 }
 
 
-// TODO(hausner): remove this function.
-DART_EXPORT Dart_Handle Dart_SetBreakpointAtLine(
-                            Dart_Handle script_url_in,
-                            Dart_Handle line_number_in,
-                            Dart_Breakpoint* breakpoint) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  UNWRAP_AND_CHECK_PARAM(String, script_url, script_url_in);
-  UNWRAP_AND_CHECK_PARAM(Integer, line_number, line_number_in);
-  CHECK_NOT_NULL(breakpoint);
-
-  if (!line_number.IsSmi()) {
-    return Api::NewError("%s: line number out of range", CURRENT_FUNC);
-  }
-  intptr_t line = line_number.AsInt64Value();
-
-  Dart_Handle state = Api::CheckIsolateState(isolate);
-  if (::Dart_IsError(state)) {
-    return state;
-  }
-
-  Dart_Handle result = Api::True(isolate);
-  *breakpoint = NULL;
-  Debugger* debugger = isolate->debugger();
-  ASSERT(debugger != NULL);
-  SourceBreakpoint* bpt =
-      debugger->SetBreakpointAtLine(script_url, line);
-  if (bpt == NULL) {
-    result = Api::NewError("%s: could not set breakpoint at line %"Pd" of '%s'",
-                           CURRENT_FUNC, line, script_url.ToCString());
-  } else {
-    *breakpoint = reinterpret_cast<Dart_Breakpoint>(bpt);
-  }
-  return result;
-}
-
-
 DART_EXPORT Dart_Handle Dart_GetBreakpointURL(intptr_t bp_id) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
@@ -338,14 +306,12 @@
 DART_EXPORT Dart_Handle Dart_SetBreakpointAtEntry(
                             Dart_Handle library_in,
                             Dart_Handle class_name_in,
-                            Dart_Handle function_name_in,
-                            Dart_Breakpoint* breakpoint) {
+                            Dart_Handle function_name_in) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
   UNWRAP_AND_CHECK_PARAM(Library, library, library_in);
   UNWRAP_AND_CHECK_PARAM(String, class_name, class_name_in);
   UNWRAP_AND_CHECK_PARAM(String, function_name, function_name_in);
-  CHECK_NOT_NULL(breakpoint);
 
   Dart_Handle state = Api::CheckIsolateState(isolate);
   if (::Dart_IsError(state)) {
@@ -365,18 +331,13 @@
                          function_name.ToCString());
   }
 
-  Dart_Handle result = Api::True(isolate);
-  *breakpoint = NULL;
-
   SourceBreakpoint* bpt = debugger->SetBreakpointAtEntry(bp_target);
   if (bpt == NULL) {
     const char* target_name = Debugger::QualifiedFunctionName(bp_target);
-    result = Api::NewError("%s: no breakpoint location found in '%s'",
-                             CURRENT_FUNC, target_name);
-  } else {
-    *breakpoint = reinterpret_cast<Dart_Breakpoint>(bpt);
+    return Api::NewError("%s: no breakpoint location found in '%s'",
+                         CURRENT_FUNC, target_name);
   }
-  return result;
+  return Dart_NewInteger(bpt->id());
 }
 
 
@@ -413,9 +374,6 @@
 }
 
 
-
-
-
 DART_EXPORT Dart_Handle Dart_RemoveBreakpoint(intptr_t bp_id) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
@@ -427,17 +385,6 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_DeleteBreakpoint(
-                            Dart_Breakpoint breakpoint_in) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-
-  CHECK_AND_CAST(SourceBreakpoint, breakpoint, breakpoint_in);
-  isolate->debugger()->RemoveBreakpoint(breakpoint->id());
-  return Api::True(isolate);
-}
-
-
 DART_EXPORT Dart_Handle Dart_SetStepOver() {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
@@ -587,6 +534,57 @@
 }
 
 
+DART_EXPORT Dart_Handle Dart_ScriptGetTokenInfo(
+                            intptr_t library_id,
+                            Dart_Handle script_url_in) {
+  Isolate* isolate = Isolate::Current();
+  DARTSCOPE(isolate);
+  const Library& lib = Library::Handle(Library::GetLibrary(library_id));
+  if (lib.IsNull()) {
+    return Api::NewError("%s: %"Pd" is not a valid library id",
+                         CURRENT_FUNC, library_id);
+  }
+  UNWRAP_AND_CHECK_PARAM(String, script_url, script_url_in);
+  const Script& script = Script::Handle(lib.LookupScript(script_url));
+  if (script.IsNull()) {
+    return Api::NewError("%s: script '%s' not found in library '%s'",
+                         CURRENT_FUNC, script_url.ToCString(),
+                         String::Handle(lib.url()).ToCString());
+  }
+
+  const GrowableObjectArray& info =
+      GrowableObjectArray::Handle(GrowableObjectArray::New());
+  const String& source = String::Handle(script.Source());
+  const String& key = Symbols::Empty();
+  const Object& line_separator = Object::Handle();
+  const TokenStream& tkns = TokenStream::Handle(script.tokens());
+  ASSERT(!tkns.IsNull());
+  TokenStream::Iterator tkit(tkns, 0);
+  int current_line = -1;
+  Scanner s(source, key);
+  s.Scan();
+  while (s.current_token().kind != Token::kEOS) {
+    ASSERT(tkit.IsValid());
+    ASSERT(s.current_token().kind == tkit.CurrentTokenKind());
+    int token_line = s.current_token().position.line;
+    if (token_line != current_line) {
+      // emit line
+      info.Add(line_separator);
+      info.Add(Smi::Handle(Smi::New(token_line)));
+      current_line = token_line;
+    }
+    // TODO(hausner): Could optimize here by not reporting tokens
+    // that will never be a location used by the debugger, e.g.
+    // braces, semicolons, most keywords etc.
+    info.Add(Smi::Handle(Smi::New(tkit.CurrentPosition())));
+    info.Add(Smi::Handle(Smi::New(s.current_token().offset)));
+    s.Scan();
+    tkit.Advance();
+  }
+  return Api::NewHandle(isolate, Array::MakeArray(info));
+}
+
+
 DART_EXPORT Dart_Handle Dart_GenerateScriptSource(Dart_Handle library_url_in,
                                                   Dart_Handle script_url_in) {
   Isolate* isolate = Isolate::Current();
@@ -710,29 +708,6 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_GetLibraryURLs() {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate != NULL);
-  DARTSCOPE(isolate);
-
-  const GrowableObjectArray& libs =
-      GrowableObjectArray::Handle(isolate->object_store()->libraries());
-  int num_libs = libs.Length();
-
-  // Create new list and populate with the url of loaded libraries.
-  Library &lib = Library::Handle();
-  String& lib_url = String::Handle();
-  const Array& library_url_list = Array::Handle(Array::New(num_libs));
-  for (int i = 0; i < num_libs; i++) {
-    lib ^= libs.At(i);
-    ASSERT(!lib.IsNull());
-    lib_url = lib.url();
-    library_url_list.SetAt(i, lib_url);
-  }
-  return Api::NewHandle(isolate, library_url_list.raw());
-}
-
-
 DART_EXPORT Dart_Handle Dart_GetLibraryDebuggable(intptr_t library_id,
                                                   bool* is_debuggable) {
   Isolate* isolate = Isolate::Current();
diff --git a/runtime/vm/debugger_api_impl_test.cc b/runtime/vm/debugger_api_impl_test.cc
index 81e9c9d..a667fd0 100644
--- a/runtime/vm/debugger_api_impl_test.cc
+++ b/runtime/vm/debugger_api_impl_test.cc
@@ -29,12 +29,10 @@
   ASSERT(script_lib != NULL);
   ASSERT(!Dart_IsError(script_lib));
   ASSERT(Dart_IsLibrary(script_lib));
-  Dart_Breakpoint bpt;
   Dart_Handle res = Dart_SetBreakpointAtEntry(script_lib,
                         NewString(cname),
-                        NewString(fname),
-                        &bpt);
-  EXPECT_TRUE(res);
+                        NewString(fname));
+  EXPECT(Dart_IsInteger(res));
 }
 
 
@@ -998,14 +996,17 @@
   func = test_lib.LookupFunctionInSource(script_url, 10);
   EXPECT(func.IsNull());
 
-  Dart_Handle libs = Dart_GetLibraryURLs();
+  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_url = Dart_ListGetAt(libs, i);
-    EXPECT(Dart_IsString(lib_url));
+    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);
@@ -1033,35 +1034,6 @@
 }
 
 
-TEST_CASE(GetLibraryURLs) {
-  const char* kScriptChars =
-      "main() {"
-      "  return 12345;"
-      "}";
-
-  Dart_Handle lib_list = Dart_GetLibraryURLs();
-  EXPECT_VALID(lib_list);
-  EXPECT(Dart_IsList(lib_list));
-  Dart_Handle list_as_string = Dart_ToString(lib_list);
-  const char* list_cstr = "";
-  EXPECT_VALID(Dart_StringToCString(list_as_string, &list_cstr));
-  EXPECT_NOTSUBSTRING(TestCase::url(), list_cstr);
-
-  // Load a script.
-  Dart_Handle url = NewString(TestCase::url());
-  Dart_Handle source = NewString(kScriptChars);
-  EXPECT_VALID(Dart_LoadScript(url, source, 0, 0));
-
-  lib_list = Dart_GetLibraryURLs();
-  EXPECT_VALID(lib_list);
-  EXPECT(Dart_IsList(lib_list));
-  list_as_string = Dart_ToString(lib_list);
-  list_cstr = "";
-  EXPECT_VALID(Dart_StringToCString(list_as_string, &list_cstr));
-  EXPECT_SUBSTRING(TestCase::url(), list_cstr);
-}
-
-
 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 f505590..f6f8869 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -243,17 +243,16 @@
 
 
 // Deoptimization instruction creating return address using function and
-// deopt-id stored at 'object_table_index'. Uses the deopt-after
-// continuation point.
-class DeoptRetAfterAddressInstr : public DeoptInstr {
+// deopt-id stored at 'object_table_index'.
+class DeoptRetAddressInstr : public DeoptInstr {
  public:
-  DeoptRetAfterAddressInstr(intptr_t object_table_index, intptr_t deopt_id)
+  DeoptRetAddressInstr(intptr_t object_table_index, intptr_t deopt_id)
       : object_table_index_(object_table_index), deopt_id_(deopt_id) {
     ASSERT(object_table_index >= 0);
     ASSERT(deopt_id >= 0);
   }
 
-  explicit DeoptRetAfterAddressInstr(intptr_t from_index)
+  explicit DeoptRetAddressInstr(intptr_t from_index)
       : object_table_index_(ObjectTableIndex::decode(from_index)),
         deopt_id_(DeoptId::decode(from_index)) {
   }
@@ -262,14 +261,12 @@
     return ObjectTableIndex::encode(object_table_index_) |
         DeoptId::encode(deopt_id_);
   }
-  virtual DeoptInstr::Kind kind() const { return kRetAfterAddress; }
+
+  virtual DeoptInstr::Kind kind() const { return kRetAddress; }
 
   virtual const char* ToCString() const {
-    const char* format = "ret aft oti:%"Pd"(%"Pd")";
-    intptr_t len = OS::SNPrint(NULL, 0, format, object_table_index_, deopt_id_);
-    char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1);
-    OS::SNPrint(chars, len + 1, format, object_table_index_, deopt_id_);
-    return chars;
+    return Isolate::Current()->current_zone()->PrintToString(
+        "ret oti:%"Pd"(%"Pd")", object_table_index_, deopt_id_);
   }
 
   void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) {
@@ -278,64 +275,8 @@
     const Code& code =
         Code::Handle(deopt_context->isolate(), function.unoptimized_code());
     ASSERT(!code.IsNull());
-    uword continue_at_pc = code.GetDeoptAfterPcAtDeoptId(deopt_id_);
-    ASSERT(continue_at_pc != 0);
-    intptr_t* to_addr = deopt_context->GetToFrameAddressAt(to_index);
-    *to_addr = continue_at_pc;
-  }
-
-  intptr_t object_table_index() const { return object_table_index_; }
-  intptr_t deopt_id() const { return deopt_id_; }
-
- private:
-  static const intptr_t kFieldWidth = kBitsPerWord / 2;
-  class ObjectTableIndex : public BitField<intptr_t, 0, kFieldWidth> { };
-  class DeoptId : public BitField<intptr_t, kFieldWidth, kFieldWidth> { };
-
-  const intptr_t object_table_index_;
-  const intptr_t deopt_id_;
-
-  DISALLOW_COPY_AND_ASSIGN(DeoptRetAfterAddressInstr);
-};
-
-
-// Deoptimization instruction creating return address using function and
-// deopt-id stored at 'object_table_index'. Uses the deopt-before
-// continuation point.
-class DeoptRetBeforeAddressInstr : public DeoptInstr {
- public:
-  DeoptRetBeforeAddressInstr(intptr_t object_table_index, intptr_t deopt_id)
-      : object_table_index_(object_table_index), deopt_id_(deopt_id) {
-    ASSERT(object_table_index >= 0);
-    ASSERT(deopt_id >= 0);
-  }
-
-  explicit DeoptRetBeforeAddressInstr(intptr_t from_index)
-      : object_table_index_(ObjectTableIndex::decode(from_index)),
-        deopt_id_(DeoptId::decode(from_index)) {
-  }
-
-  virtual intptr_t from_index() const {
-    return ObjectTableIndex::encode(object_table_index_) |
-        DeoptId::encode(deopt_id_);
-  }
-  virtual DeoptInstr::Kind kind() const { return kRetBeforeAddress; }
-
-  virtual const char* ToCString() const {
-    const char* format = "ret bef oti:%"Pd"(%"Pd")";
-    intptr_t len = OS::SNPrint(NULL, 0, format, object_table_index_, deopt_id_);
-    char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1);
-    OS::SNPrint(chars, len + 1, format, object_table_index_, deopt_id_);
-    return chars;
-  }
-
-  void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) {
-    Function& function = Function::Handle(deopt_context->isolate());
-    function ^= deopt_context->ObjectAt(object_table_index_);
-    const Code& code =
-        Code::Handle(deopt_context->isolate(), function.unoptimized_code());
-    ASSERT(!code.IsNull());
-    uword continue_at_pc = code.GetDeoptBeforePcAtDeoptId(deopt_id_);
+    uword continue_at_pc = code.GetPcForDeoptId(deopt_id_,
+                                                PcDescriptors::kDeopt);
     ASSERT(continue_at_pc != 0);
     intptr_t* to_addr = deopt_context->GetToFrameAddressAt(to_index);
     *to_addr = continue_at_pc;
@@ -352,6 +293,9 @@
     }
   }
 
+  intptr_t object_table_index() const { return object_table_index_; }
+  intptr_t deopt_id() const { return deopt_id_; }
+
  private:
   static const intptr_t kFieldWidth = kBitsPerWord / 2;
   class ObjectTableIndex : public BitField<intptr_t, 0, kFieldWidth> { };
@@ -360,7 +304,7 @@
   const intptr_t object_table_index_;
   const intptr_t deopt_id_;
 
-  DISALLOW_COPY_AND_ASSIGN(DeoptRetBeforeAddressInstr);
+  DISALLOW_COPY_AND_ASSIGN(DeoptRetAddressInstr);
 };
 
 
@@ -713,18 +657,20 @@
 }
 
 
-uword DeoptInstr::GetRetAfterAddress(DeoptInstr* instr,
-                                     const Array& object_table,
-                                     Function* func) {
-  ASSERT(instr->kind() == kRetAfterAddress);
-  DeoptRetAfterAddressInstr* ret_after_instr =
-      static_cast<DeoptRetAfterAddressInstr*>(instr);
+uword DeoptInstr::GetRetAddress(DeoptInstr* instr,
+                                const Array& object_table,
+                                Function* func) {
+  ASSERT(instr->kind() == kRetAddress);
+  DeoptRetAddressInstr* ret_address_instr =
+      static_cast<DeoptRetAddressInstr*>(instr);
+  ASSERT(Isolate::IsDeoptAfter(ret_address_instr->deopt_id()));
   ASSERT(!object_table.IsNull());
   ASSERT(func != NULL);
-  *func ^= object_table.At(ret_after_instr->object_table_index());
+  *func ^= object_table.At(ret_address_instr->object_table_index());
   const Code& code = Code::Handle(func->unoptimized_code());
   ASSERT(!code.IsNull());
-  uword res = code.GetDeoptAfterPcAtDeoptId(ret_after_instr->deopt_id());
+  uword res = code.GetPcForDeoptId(ret_address_instr->deopt_id(),
+                                   PcDescriptors::kDeopt);
   ASSERT(res != 0);
   return res;
 }
@@ -740,8 +686,7 @@
         return new DeoptFloat32x4StackSlotInstr(from_index);
     case kUint32x4StackSlot:
         return new DeoptUint32x4StackSlotInstr(from_index);
-    case kRetAfterAddress: return new DeoptRetAfterAddressInstr(from_index);
-    case kRetBeforeAddress: return new DeoptRetBeforeAddressInstr(from_index);
+    case kRetAddress: return new DeoptRetAddressInstr(from_index);
     case kConstant: return new DeoptConstantInstr(from_index);
     case kRegister: return new DeoptRegisterInstr(from_index);
     case kFpuRegister: return new DeoptFpuRegisterInstr(from_index);
@@ -814,26 +759,19 @@
 }
 
 
-void DeoptInfoBuilder::AddReturnAddressBefore(const Function& function,
-                                              intptr_t deopt_id,
-                                              intptr_t to_index) {
+void DeoptInfoBuilder::AddReturnAddress(const Function& function,
+                                        intptr_t deopt_id,
+                                        intptr_t to_index) {
   // Check that deopt_id exists.
-  ASSERT(Code::Handle(function.unoptimized_code()).
-      GetDeoptBeforePcAtDeoptId(deopt_id) != 0);
+  // TODO(vegorov): verify after deoptimization targets as well.
+#ifdef DEBUG
+  const Code& code = Code::Handle(function.unoptimized_code());
+  ASSERT(Isolate::IsDeoptAfter(deopt_id) ||
+      (code.GetPcForDeoptId(deopt_id, PcDescriptors::kDeopt) != 0));
+#endif
   const intptr_t object_table_index = FindOrAddObjectInTable(function);
   ASSERT(to_index == instructions_.length());
-  instructions_.Add(new DeoptRetBeforeAddressInstr(object_table_index,
-                                                   deopt_id));
-}
-
-
-void DeoptInfoBuilder::AddReturnAddressAfter(const Function& function,
-                                             intptr_t deopt_id,
-                                             intptr_t to_index) {
-  const intptr_t object_table_index = FindOrAddObjectInTable(function);
-  ASSERT(to_index == instructions_.length());
-  instructions_.Add(new DeoptRetAfterAddressInstr(object_table_index,
-                                                  deopt_id));
+  instructions_.Add(new DeoptRetAddressInstr(object_table_index, deopt_id));
 }
 
 
@@ -846,24 +784,29 @@
 }
 
 
-void DeoptInfoBuilder::AddCopy(const Location& from_loc,
+void DeoptInfoBuilder::AddCopy(Value* value,
+                               const Location& from_loc,
                                const intptr_t to_index) {
   DeoptInstr* deopt_instr = NULL;
   if (from_loc.IsConstant()) {
     intptr_t object_table_index = FindOrAddObjectInTable(from_loc.constant());
     deopt_instr = new DeoptConstantInstr(object_table_index);
   } else if (from_loc.IsRegister()) {
-    ASSERT(from_loc.representation() == kTagged);
+    ASSERT(value->definition()->representation() == kTagged);
     deopt_instr = new DeoptRegisterInstr(from_loc.reg());
   } else if (from_loc.IsFpuRegister()) {
-    if (from_loc.representation() == kUnboxedDouble) {
+    if (value->definition()->representation() == kUnboxedDouble) {
       deopt_instr = new DeoptFpuRegisterInstr(from_loc.fpu_reg());
-    } else {
-      ASSERT(from_loc.representation() == kUnboxedMint);
+    } else if (value->definition()->representation() == kUnboxedMint) {
       deopt_instr = new DeoptInt64FpuRegisterInstr(from_loc.fpu_reg());
+    } else if (value->definition()->representation() == kUnboxedFloat32x4) {
+      deopt_instr = new DeoptFloat32x4FpuRegisterInstr(from_loc.fpu_reg());
+    } else {
+      ASSERT(value->definition()->representation() == kUnboxedUint32x4);
+      deopt_instr = new DeoptUint32x4FpuRegisterInstr(from_loc.fpu_reg());
     }
   } else if (from_loc.IsStackSlot()) {
-    ASSERT(from_loc.representation() == kTagged);
+    ASSERT(value->definition()->representation() == kTagged);
     intptr_t from_index = (from_loc.stack_index() < 0) ?
         from_loc.stack_index() + num_args_ :
         from_loc.stack_index() + num_args_ - kFirstLocalSlotIndex + 1;
@@ -872,10 +815,10 @@
     intptr_t from_index = (from_loc.stack_index() < 0) ?
         from_loc.stack_index() + num_args_ :
         from_loc.stack_index() + num_args_ - kFirstLocalSlotIndex + 1;
-    if (from_loc.representation() == kUnboxedDouble) {
+    if (value->definition()->representation() == kUnboxedDouble) {
       deopt_instr = new DeoptDoubleStackSlotInstr(from_index);
     } else {
-      ASSERT(from_loc.representation() == kUnboxedMint);
+      ASSERT(value->definition()->representation() == kUnboxedMint);
       deopt_instr = new DeoptInt64StackSlotInstr(from_index);
     }
   } else {
diff --git a/runtime/vm/deopt_instructions.h b/runtime/vm/deopt_instructions.h
index 7967aa9..5f22368 100644
--- a/runtime/vm/deopt_instructions.h
+++ b/runtime/vm/deopt_instructions.h
@@ -95,8 +95,7 @@
 class DeoptInstr : public ZoneAllocated {
  public:
   enum Kind {
-    kRetAfterAddress,
-    kRetBeforeAddress,
+    kRetAddress,
     kConstant,
     kRegister,
     kFpuRegister,
@@ -136,9 +135,9 @@
 
   // Get the function and return address which is encoded in this
   // kRetAfterAddress deopt instruction.
-  static uword GetRetAfterAddress(DeoptInstr* instr,
-                                  const Array& object_table,
-                                  Function* func);
+  static uword GetRetAddress(DeoptInstr* instr,
+                             const Array& object_table,
+                             Function* func);
 
  protected:
   virtual intptr_t from_index() const = 0;
@@ -164,17 +163,12 @@
   const GrowableObjectArray& object_table() { return object_table_; }
 
   // Return address before instruction.
-  void AddReturnAddressBefore(const Function& function,
-                              intptr_t deopt_id,
-                              intptr_t to_index);
-
-  // Return address after instruction.
-  void AddReturnAddressAfter(const Function& function,
-                             intptr_t deopt_id,
-                             intptr_t to_index);
+  void AddReturnAddress(const Function& function,
+                        intptr_t deopt_id,
+                        intptr_t to_index);
 
   // Copy from optimized frame to unoptimized.
-  void AddCopy(const Location& from_loc, intptr_t to_index);
+  void AddCopy(Value* value, const Location& from_loc, intptr_t to_index);
   void AddPcMarker(const Function& function, intptr_t to_index);
   void AddCallerFp(intptr_t to_index);
   void AddCallerPc(intptr_t to_index);
diff --git a/runtime/vm/disassembler_ia32.cc b/runtime/vm/disassembler_ia32.cc
index f17d0c7..49664cc 100644
--- a/runtime/vm/disassembler_ia32.cc
+++ b/runtime/vm/disassembler_ia32.cc
@@ -386,12 +386,16 @@
   "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"
 };
 
+static const int kMaxByteCPURegisters = 8;
+static const char* byte_cpu_regs[kMaxByteCPURegisters] = {
+  "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh"
+};
+
 static const int kMaxXmmRegisters = 8;
 static const char* xmm_regs[kMaxXmmRegisters] = {
   "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
 };
 
-
 void X86Decoder::PrintCPURegister(int reg) {
   ASSERT(0 <= reg);
   ASSERT(reg < kMaxCPURegisters);
@@ -400,7 +404,9 @@
 
 
 void X86Decoder::PrintCPUByteRegister(int reg) {
-  UNIMPLEMENTED();
+  ASSERT(0 <= reg);
+  ASSERT(reg < kMaxByteCPURegisters);
+  Print(byte_cpu_regs[reg]);
 }
 
 
@@ -634,8 +640,7 @@
 
 
 int X86Decoder::PrintRightByteOperand(uint8_t* modrmp) {
-  UNIMPLEMENTED();
-  return 0;
+  return PrintRightOperandHelper(modrmp, &X86Decoder::PrintCPUByteRegister);
 }
 
 
@@ -909,6 +914,11 @@
       default:
         UNIMPLEMENTED();
     }
+  } else if (*(data+1) == 0xA4) {
+    Print("rep_movsb");
+    data += 2;
+  } else {
+    UNIMPLEMENTED();
   }
   return data;
 }
diff --git a/runtime/vm/double_conversion.cc b/runtime/vm/double_conversion.cc
index 7f5b072..44233fe 100644
--- a/runtime/vm/double_conversion.cc
+++ b/runtime/vm/double_conversion.cc
@@ -166,4 +166,25 @@
   return String::New(builder.Finalize());
 }
 
+
+bool CStringToDouble(const char* str, intptr_t length, double* result) {
+  if (length == 0) {
+    return false;
+  }
+
+  double_conversion::StringToDoubleConverter converter(
+    double_conversion::StringToDoubleConverter::NO_FLAGS,
+    0.0,
+    0.0,
+    kDoubleToStringCommonInfinitySymbol,
+    kDoubleToStringCommonNaNSymbol);
+
+  int parsed_count = 0;
+  *result = converter.StringToDouble(str,
+                                     static_cast<int>(length),
+                                     &parsed_count);
+  return (parsed_count == length);
+}
+
+
 }  // namespace dart
diff --git a/runtime/vm/double_conversion.h b/runtime/vm/double_conversion.h
index c4f584d..ded82a4 100644
--- a/runtime/vm/double_conversion.h
+++ b/runtime/vm/double_conversion.h
@@ -15,6 +15,8 @@
 RawString* DoubleToStringAsExponential(double d, int fraction_digits);
 RawString* DoubleToStringAsPrecision(double d, int precision);
 
+bool CStringToDouble(const char* str, intptr_t length, double* result);
+
 }  // namespace dart
 
 #endif  // VM_DOUBLE_CONVERSION_H_
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc
index 9f8e9a5..03074f7 100644
--- a/runtime/vm/flow_graph.cc
+++ b/runtime/vm/flow_graph.cc
@@ -29,8 +29,7 @@
     graph_entry_(graph_entry),
     preorder_(),
     postorder_(),
-    reverse_postorder_(),
-    invalid_dominator_tree_(true) {
+    reverse_postorder_() {
   DiscoverBlocks();
 }
 
@@ -170,7 +169,11 @@
       ASSERT(defn == curr->definition());
       Instruction* instr = curr->instruction();
       ASSERT(curr == instr->env()->ValueAtUseIndex(curr->use_index()));
-      ASSERT((instr->IsPhi() && instr->AsPhi()->is_alive()) ||
+      // BlockEntry instructions have environments attached to them but
+      // have no reliable way to verify if they are still in the graph.
+      // Thus we just assume they are.
+      ASSERT(instr->IsBlockEntry() ||
+             (instr->IsPhi() && instr->AsPhi()->is_alive()) ||
              (instr->previous() != NULL));
       prev = curr;
       curr = curr->next_use();
@@ -231,7 +234,6 @@
 //     (preorder block numbers of) blocks in the dominance frontier.
 void FlowGraph::ComputeDominators(
     GrowableArray<BitVector*>* dominance_frontier) {
-  invalid_dominator_tree_ = false;
   // Use the SEMI-NCA algorithm to compute dominators.  This is a two-pass
   // version of the Lengauer-Tarjan algorithm (LT is normally three passes)
   // that eliminates a pass by using nearest-common ancestor (NCA) to
@@ -441,6 +443,23 @@
 }
 
 
+void FlowGraph::AttachEnvironment(Instruction* instr,
+                                  GrowableArray<Definition*>* env) {
+  Environment* deopt_env =
+      Environment::From(*env,
+                        num_non_copied_params_,
+                        parsed_function_.function());
+  instr->SetEnvironment(deopt_env);
+  for (Environment::DeepIterator it(deopt_env); !it.Done(); it.Advance()) {
+    Value* use = it.CurrentValue();
+    use->definition()->AddEnvUse(use);
+  }
+  if (instr->CanDeoptimize()) {
+    instr->env()->set_deopt_id(instr->deopt_id());
+  }
+}
+
+
 void FlowGraph::RenameRecursive(BlockEntryInstr* block_entry,
                                 GrowableArray<Definition*>* env,
                                 GrowableArray<PhiInstr*>* live_phis) {
@@ -458,25 +477,17 @@
     }
   }
 
+  // Attach environment to the block entry.
+  AttachEnvironment(block_entry, env);
+
   // 2. Process normal instructions.
+
   for (ForwardInstructionIterator it(block_entry); !it.Done(); it.Advance()) {
     Instruction* current = it.Current();
-    // Attach current environment to the instructions that can deoptimize and
-    // at goto instructions. Optimizations like LICM expect an environment at
-    // gotos.
-    if (current->CanDeoptimize() || current->IsGoto()) {
-      Environment* deopt_env =
-          Environment::From(*env,
-                            num_non_copied_params_,
-                            parsed_function_.function());
-      current->SetEnvironment(deopt_env);
-      for (Environment::DeepIterator it(deopt_env); !it.Done(); it.Advance()) {
-        Value* use = it.CurrentValue();
-        use->definition()->AddEnvUse(use);
-      }
-    }
-    if (current->CanDeoptimize()) {
-      current->env()->set_deopt_id(current->deopt_id());
+
+    // Attach current environment to the instructions that need it.
+    if (current->NeedsEnvironment()) {
+      AttachEnvironment(current, env);
     }
 
     // 2a. Handle uses:
@@ -673,15 +684,6 @@
 }
 
 
-void FlowGraph::RepairGraphAfterInlining() {
-  DiscoverBlocks();
-  if (invalid_dominator_tree_) {
-    GrowableArray<BitVector*> dominance_frontier;
-    ComputeDominators(&dominance_frontier);
-  }
-}
-
-
 intptr_t FlowGraph::InstructionCount() const {
   intptr_t size = 0;
   // Iterate each block, skipping the graph entry.
@@ -695,40 +697,4 @@
   return size;
 }
 
-
-const ZoneGrowableArray<Field*>* FlowGraph::FieldDependencies() const {
-  ZoneGrowableArray<Field*>* result = new ZoneGrowableArray<Field*>(10);
-
-  for (intptr_t i = 1; i < reverse_postorder().length(); i++) {
-    BlockEntryInstr* entry = reverse_postorder()[i];
-    for (ForwardInstructionIterator it(entry); !it.Done(); it.Advance()) {
-      LoadFieldInstr* load_field = it.Current()->AsLoadField();
-      if (load_field == NULL) {
-        continue;
-      }
-
-      Field* field = load_field->field();
-      if ((field == NULL) ||
-          (field->guarded_cid() == kDynamicCid) ||
-          (field->guarded_cid() == kIllegalCid)) {
-        continue;
-      }
-
-      bool found = false;
-      for (intptr_t j = 0; j < result->length(); j++) {
-        if ((*result)[j]->raw() == field->raw()) {
-          found = true;
-          break;
-        }
-      }
-
-      if (!found) {
-        result->Add(field);
-      }
-    }
-  }
-
-  return result;
-}
-
 }  // namespace dart
diff --git a/runtime/vm/flow_graph.h b/runtime/vm/flow_graph.h
index a3c0235..13d9cba 100644
--- a/runtime/vm/flow_graph.h
+++ b/runtime/vm/flow_graph.h
@@ -129,29 +129,21 @@
   // body blocks for each loop header.
   void ComputeLoops(GrowableArray<BlockEntryInstr*>* loop_headers);
 
-  void RepairGraphAfterInlining();
-
   // TODO(zerny): Once the SSA is feature complete this should be removed.
   void Bailout(const char* reason) const;
 
-  void InvalidateDominatorTree() { invalid_dominator_tree_ = true; }
-
 #ifdef DEBUG
   // Verification methods for debugging.
   bool VerifyUseLists();
 #endif  // DEBUG
 
-  // Return all instance fields that are loaded in the graph and
-  // have non-generic type feedback attached to them that can
-  // potentially affect optimizations.
-  const ZoneGrowableArray<Field*>* FieldDependencies() const;
+  void DiscoverBlocks();
 
  private:
+  friend class IfConverter;
   friend class BranchSimplifier;
   friend class ConstantPropagator;
 
-  void DiscoverBlocks();
-
   // SSA transformation methods and fields.
   void ComputeDominators(GrowableArray<BitVector*>* dominance_frontier);
 
@@ -168,6 +160,8 @@
       GrowableArray<Definition*>* env,
       GrowableArray<PhiInstr*>* live_phis);
 
+  void AttachEnvironment(Instruction* instr, GrowableArray<Definition*>* env);
+
   void InsertPhis(
       const GrowableArray<BlockEntryInstr*>& preorder,
       const GrowableArray<BitVector*>& assigned_vars,
@@ -195,7 +189,6 @@
   GrowableArray<BlockEntryInstr*> preorder_;
   GrowableArray<BlockEntryInstr*> postorder_;
   GrowableArray<BlockEntryInstr*> reverse_postorder_;
-  bool invalid_dominator_tree_;
   ConstantInstr* constant_null_;
 };
 
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index c1f8f32..3b89eba 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -606,6 +606,7 @@
       if (flow_graph_.num_copied_params() > 0) {
         ASSERT(spill_slots_.length() == slot_index);
         spill_slots_.Add(range->End());
+        quad_spill_slots_.Add(false);
       }
       AssignSafepoints(range);
     } else {
@@ -993,9 +994,8 @@
     }
 
     for (intptr_t reg = 0; reg < kNumberOfFpuRegisters; reg++) {
-      Representation ignored = kNoRepresentation;
       BlockLocation(
-          Location::FpuRegisterLocation(static_cast<FpuRegister>(reg), ignored),
+          Location::FpuRegisterLocation(static_cast<FpuRegister>(reg)),
           pos,
           pos + 1);
     }
@@ -1581,40 +1581,76 @@
 void FlowGraphAllocator::AllocateSpillSlotFor(LiveRange* range) {
   ASSERT(range->spill_slot().IsInvalid());
 
-  intptr_t idx = 0;
-  for (; idx < spill_slots_.length(); idx++) {
-    if (spill_slots_[idx] <= range->Start()) break;
-  }
-
-  if (idx == spill_slots_.length()) spill_slots_.Add(0);
-
+  // Compute range start and end.
   LiveRange* last_sibling = range;
   while (last_sibling->next_sibling() != NULL) {
     last_sibling = last_sibling->next_sibling();
   }
 
-  spill_slots_[idx] = last_sibling->End();
+  const intptr_t start = range->Start();
+  const intptr_t end = last_sibling->End();
 
+  // During fpu register allocation spill slot indices are computed in terms of
+  // double (64bit) stack slots. We treat quad stack slot (128bit) as a
+  // consecutive pair of two double spill slots.
+  // Special care is taken to never allocate the same index to both
+  // double and quad spill slots as it complicates disambiguation during
+  // parallel move resolution.
+  const bool need_quad = (register_kind_ == Location::kFpuRegister) &&
+      ((range->representation() == kUnboxedFloat32x4) ||
+       (range->representation() == kUnboxedUint32x4));
+
+  // Search for a free spill slot among allocated: the value in it should be
+  // dead and its type should match (e.g. it should not be a part of the quad if
+  // we are allocating normal double slot).
+  intptr_t idx = 0;
+  for (; idx < spill_slots_.length(); idx++) {
+    if ((need_quad == quad_spill_slots_[idx]) &&
+        (spill_slots_[idx] <= start)) {
+      break;
+    }
+  }
+
+  if (idx == spill_slots_.length()) {
+    // No free spill slot found. Allocate a new one.
+    spill_slots_.Add(0);
+    quad_spill_slots_.Add(need_quad);
+    if (need_quad) {  // Allocate two double stack slots if we need quad slot.
+      spill_slots_.Add(0);
+      quad_spill_slots_.Add(need_quad);
+    }
+  }
+
+
+  // Set spill slot expiration boundary to the live range's end.
+  spill_slots_[idx] = end;
+  if (need_quad) {
+    ASSERT(quad_spill_slots_[idx] && quad_spill_slots_[idx + 1]);
+    idx++;  // Use the higher index it corresponds to the lower stack address.
+    spill_slots_[idx] = end;
+  } else {
+    ASSERT(!quad_spill_slots_[idx]);
+  }
+
+  // Assign spill slot to the range.
   if (register_kind_ == Location::kRegister) {
     range->set_spill_slot(Location::StackSlot(idx));
   } else {
-    // FPU register spill slots are essentially two (x64) or four (ia32) normal
-    // word size spill slots.  We use the index of the slot with the lowest
-    // address as an index for the FPU register spill slot. In terms of indexes
-    // this relation is inverted: so we have to take the highest index.
+    // We use the index of the slot with the lowest address as an index for the
+    // FPU register spill slot. In terms of indexes this relation is inverted:
+    // so we have to take the highest index.
     const intptr_t slot_idx = cpu_spill_slot_count_ +
-        idx * kFpuRegisterSpillFactor + (kFpuRegisterSpillFactor - 1);
+        idx * kDoubleSpillFactor + (kDoubleSpillFactor - 1);
 
     Location location;
-    if (range->representation() == kUnboxedFloat32x4) {
-      location = Location::Float32x4StackSlot(slot_idx);
-    } else if (range->representation() == kUnboxedUint32x4) {
-      location = Location::Uint32x4StackSlot(slot_idx);
+    if ((range->representation() == kUnboxedFloat32x4) ||
+        (range->representation() == kUnboxedUint32x4)) {
+      ASSERT(need_quad);
+      location = Location::QuadStackSlot(slot_idx);
     } else {
       ASSERT((range->representation() == kUnboxedDouble) ||
              (range->representation() == kUnboxedMint));
-      location = Location::DoubleStackSlot(slot_idx,
-                                           range->representation());
+      location = Location::DoubleStackSlot(slot_idx);
     }
     range->set_spill_slot(location);
   }
@@ -1815,7 +1851,7 @@
       TRACE_ALLOC(OS::Print(
           "considering %s for v%"Pd": has interference on the back edge"
           " {loop [%"Pd", %"Pd")}\n",
-          MakeRegisterLocation(candidate, kUnboxedDouble).Name(),
+          MakeRegisterLocation(candidate).Name(),
           unallocated->vreg(),
           loop_header->entry()->start_pos(),
           loop_header->last_block()->end_pos()));
@@ -1833,7 +1869,7 @@
           free_until = intersection;
           TRACE_ALLOC(OS::Print(
               "found %s for v%"Pd" with no interference on the back edge\n",
-              MakeRegisterLocation(candidate, kUnboxedDouble).Name(),
+              MakeRegisterLocation(candidate).Name(),
               candidate));
           break;
         }
@@ -1842,7 +1878,7 @@
   }
 
   TRACE_ALLOC(OS::Print("assigning free register "));
-  TRACE_ALLOC(MakeRegisterLocation(candidate, kUnboxedDouble).Print());
+  TRACE_ALLOC(MakeRegisterLocation(candidate).Print());
   TRACE_ALLOC(OS::Print(" to v%"Pd"\n", unallocated->vreg()));
 
   if (free_until != kMaxPosition) {
@@ -1853,8 +1889,7 @@
   }
 
   registers_[candidate].Add(unallocated);
-  unallocated->set_assigned_location(
-      MakeRegisterLocation(candidate, unallocated->representation()));
+  unallocated->set_assigned_location(MakeRegisterLocation(candidate));
 
   return true;
 }
@@ -1945,7 +1980,7 @@
   }
 
   TRACE_ALLOC(OS::Print("assigning blocked register "));
-  TRACE_ALLOC(MakeRegisterLocation(candidate, kUnboxedDouble).Print());
+  TRACE_ALLOC(MakeRegisterLocation(candidate).Print());
   TRACE_ALLOC(OS::Print(" to live range v%"Pd" until %"Pd"\n",
                         unallocated->vreg(), blocked_at));
 
@@ -2051,8 +2086,7 @@
   if (first_evicted != -1) RemoveEvicted(reg, first_evicted);
 
   registers_[reg].Add(unallocated);
-  unallocated->set_assigned_location(
-      MakeRegisterLocation(reg, unallocated->representation()));
+  unallocated->set_assigned_location(MakeRegisterLocation(reg));
 }
 
 
@@ -2522,6 +2556,7 @@
 
   cpu_spill_slot_count_ = spill_slots_.length();
   spill_slots_.Clear();
+  quad_spill_slots_.Clear();
 
   PrepareForAllocation(Location::kFpuRegister,
                        kNumberOfFpuRegisters,
@@ -2534,8 +2569,7 @@
 
   GraphEntryInstr* entry = block_order_[0]->AsGraphEntry();
   ASSERT(entry != NULL);
-  intptr_t double_spill_slot_count =
-      spill_slots_.length() * kFpuRegisterSpillFactor;
+  intptr_t double_spill_slot_count = spill_slots_.length() * kDoubleSpillFactor;
   entry->set_spill_slot_count(cpu_spill_slot_count_ + double_spill_slot_count);
 
   if (FLAG_print_ssa_liveranges) {
diff --git a/runtime/vm/flow_graph_allocator.h b/runtime/vm/flow_graph_allocator.h
index 5268c31..ab60b82 100644
--- a/runtime/vm/flow_graph_allocator.h
+++ b/runtime/vm/flow_graph_allocator.h
@@ -38,7 +38,7 @@
 class FlowGraphAllocator : public ValueObject {
  public:
   // Number of stack slots needed for a fpu register spill slot.
-  static const intptr_t kFpuRegisterSpillFactor = kFpuRegisterSize / kWordSize;
+  static const intptr_t kDoubleSpillFactor = kDoubleSize / kWordSize;
 
   explicit FlowGraphAllocator(const FlowGraph& flow_graph);
 
@@ -227,8 +227,8 @@
 
   MoveOperands* AddMoveAt(intptr_t pos, Location to, Location from);
 
-  Location MakeRegisterLocation(intptr_t reg, Representation rep) {
-    return Location::MachineRegisterLocation(register_kind_, reg, rep);
+  Location MakeRegisterLocation(intptr_t reg) {
+    return Location::MachineRegisterLocation(register_kind_, reg);
   }
 
   void PrintLiveRanges();
@@ -309,8 +309,13 @@
   // List of used spill slots. Contains positions after which spill slots
   // become free and can be reused for allocation.
   GrowableArray<intptr_t> spill_slots_;
-  intptr_t cpu_spill_slot_count_;
 
+  // For every used spill slot contains a flag determines whether it is
+  // QuadSpillSlot to ensure that indexes of quad and double spill slots
+  // are disjoint.
+  GrowableArray<bool> quad_spill_slots_;
+
+  intptr_t cpu_spill_slot_count_;
 
   DISALLOW_COPY_AND_ASSIGN(FlowGraphAllocator);
 };
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 337eebe..00b3932 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -62,17 +62,15 @@
 }
 
 
-void InliningContext::PrepareGraphs(FlowGraph* caller_graph,
-                                    Definition* call,
-                                    FlowGraph* callee_graph) {
+void InliningContext::PrepareGraphs(FlowGraph* callee_graph) {
   ASSERT(callee_graph->graph_entry()->SuccessorCount() == 1);
-  ASSERT(callee_graph->max_block_id() > caller_graph->max_block_id());
+  ASSERT(callee_graph->max_block_id() > caller_graph_->max_block_id());
   ASSERT(callee_graph->max_virtual_register_number() >
-         caller_graph->max_virtual_register_number());
+         caller_graph_->max_virtual_register_number());
 
   // Adjust the caller's maximum block id and current SSA temp index.
-  caller_graph->set_max_block_id(callee_graph->max_block_id());
-  caller_graph->set_current_ssa_temp_index(
+  caller_graph_->set_max_block_id(callee_graph->max_block_id());
+  caller_graph_->set_current_ssa_temp_index(
       callee_graph->max_virtual_register_number());
 
   // Attach the outer environment on each instruction in the callee graph.
@@ -86,7 +84,7 @@
       // TODO(zerny): Avoid creating unnecessary environments. Note that some
       // optimizations need deoptimization info for non-deoptable instructions,
       // eg, LICM on GOTOs.
-      if (instr->env() != NULL) call->env()->DeepCopyToOuter(instr);
+      if (instr->env() != NULL) call_->env()->DeepCopyToOuter(instr);
     }
   }
 }
@@ -113,116 +111,181 @@
 }
 
 
-void InliningContext::ReplaceCall(FlowGraph* caller_graph,
-                                  Definition* call,
-                                  FlowGraph* callee_graph) {
-  ASSERT(call->previous() != NULL);
-  ASSERT(call->next() != NULL);
-  PrepareGraphs(caller_graph, call, callee_graph);
-
-  BlockEntryInstr* caller_entry = call->GetBlock();
-  TargetEntryInstr* callee_entry = callee_graph->graph_entry()->normal_entry();
-
-  // Insert the callee graph into the caller graph.  First sort the list of
-  // exits by block id (recording block entries as a side effect).
+Definition* InliningContext::JoinReturns(BlockEntryInstr** exit_block,
+                                         Instruction** last_instruction) {
+  // First sort the list of exits by block id (caching return instruction
+  // 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) {
-    // For just one exit, replace the uses and remove the call from the graph.
-    call->ReplaceUsesWith(ValueAt(0)->definition());
-    ValueAt(0)->RemoveFromUseList();
-    call->previous()->LinkTo(callee_entry->next());
-    LastInstructionAt(0)->LinkTo(call->next());
-    // In case of control flow, locally update the predecessors, phis and
-    // dominator tree.
-    // TODO(zerny): should we leave the dominator tree since we recompute it
-    // after a full inlining pass?
-    if (callee_graph->preorder().length() > 2) {
-      BlockEntryInstr* exit_block = ExitBlockAt(0);
-      // Pictorially, the graph structure is:
-      //
-      //   Bc : caller_entry    Bi : callee_entry
-      //     before_call          inlined_head
-      //     call               ... other blocks ...
-      //     after_call         Be : exit_block
-      //                          inlined_foot
-      // And becomes:
-      //
-      //   Bc : caller_entry
-      //     before_call
-      //     inlined_head
-      //   ... other blocks ...
-      //   Be : exit_block
-      //    inlined_foot
-      //    after_call
-      //
-      // For 'after_call', caller entry (Bc) is replaced by callee exit (Be).
-      caller_entry->ReplaceAsPredecessorWith(exit_block);
-      // For 'inlined_head', callee entry (Bi) is replaced by caller entry (Bc).
-      callee_entry->ReplaceAsPredecessorWith(caller_entry);
-      // The callee exit is now the immediate dominator of blocks whose
-      // immediate dominator was the caller entry.
-      ASSERT(exit_block->dominated_blocks().is_empty());
-      for (intptr_t i = 0; i < caller_entry->dominated_blocks().length(); ++i) {
-        BlockEntryInstr* block = caller_entry->dominated_blocks()[i];
-        block->set_dominator(exit_block);
-        exit_block->AddDominatedBlock(block);
-      }
-      // The caller entry is now the immediate dominator of blocks whose
-      // immediate dominator was the callee entry.
-      caller_entry->ClearDominatedBlocks();
-      for (intptr_t i = 0; i < callee_entry->dominated_blocks().length(); ++i) {
-        BlockEntryInstr* block = callee_entry->dominated_blocks()[i];
-        block->set_dominator(caller_entry);
-        caller_entry->AddDominatedBlock(block);
-      }
-    }
+    ReturnAt(0)->UnuseAllInputs();
+    *exit_block = ExitBlockAt(0);
+    *last_instruction = LastInstructionAt(0);
+    return call_->HasUses() ? ValueAt(0)->definition() : NULL;
   } else {
     // Create a join of the returns.
-    intptr_t join_id = caller_graph->max_block_id() + 1;
-    caller_graph->set_max_block_id(join_id);
+    intptr_t join_id = caller_graph_->max_block_id() + 1;
+    caller_graph_->set_max_block_id(join_id);
     JoinEntryInstr* join =
         new JoinEntryInstr(join_id, CatchClauseNode::kInvalidTryIndex);
+    join->InheritDeoptTarget(call_);
+
+    // The dominator set of the join is the intersection of the dominator
+    // sets of all the predecessors.  If we keep the dominator sets ordered
+    // by height in the dominator tree, we can also get the immediate
+    // dominator of the join node from the intersection.
+    //
+    // block_dominators is the dominator set for each block, ordered from
+    // the immediate dominator to the root of the dominator tree.  This is
+    // the order we collect them in (adding at the end).
+    //
+    // join_dominators is the join's dominators ordered from the root of the
+    // dominator tree to the immediate dominator.  This order supports
+    // removing during intersection by truncating the list.
+    GrowableArray<BlockEntryInstr*> block_dominators;
+    GrowableArray<BlockEntryInstr*> join_dominators;
     for (intptr_t i = 0; i < num_exits; ++i) {
-      LastInstructionAt(i)->Goto(join);
-      // Directly add the predecessors of the join in ascending block id order.
+      // Add the control-flow edge.
+      GotoInstr* goto_instr = new GotoInstr(join);
+      goto_instr->InheritDeoptTarget(ReturnAt(i));
+      LastInstructionAt(i)->LinkTo(goto_instr);
+      ExitBlockAt(i)->set_last_instruction(LastInstructionAt(i)->next());
       join->predecessors_.Add(ExitBlockAt(i));
+
+      // Collect the block's dominators.
+      block_dominators.Clear();
+      BlockEntryInstr* dominator = ExitBlockAt(i)->dominator();
+      while (dominator != NULL) {
+        block_dominators.Add(dominator);
+        dominator = dominator->dominator();
+      }
+
+      if (i == 0) {
+        // The initial dominator set is the first predecessor's dominator
+        // set.  Reverse it.
+        for (intptr_t j = block_dominators.length() - 1; j >= 0; --j) {
+          join_dominators.Add(block_dominators[j]);
+        }
+      } else {
+        // Intersect the block's dominators with the join's dominators so far.
+        intptr_t last = block_dominators.length() - 1;
+        for (intptr_t j = 0; j < join_dominators.length(); ++j) {
+          intptr_t k = last - j;  // Corresponding index in block_dominators.
+          if ((k < 0) || (join_dominators[j] != block_dominators[k])) {
+            // We either exhausted the dominators for this block before
+            // exhausting the current intersection, or else we found a block
+            // on the path from the root of the tree that is not in common.
+            ASSERT(j >= 2);
+            join_dominators.TruncateTo(j);
+            break;
+          }
+        }
+      }
     }
+    // The immediate dominator of the join is the last one in the ordered
+    // intersection.
+    join->set_dominator(join_dominators.Last());
+    join_dominators.Last()->AddDominatedBlock(join);
+    *exit_block = join;
+    *last_instruction = join;
+
     // If the call has uses, create a phi of the returns.
-    if (call->HasUses()) {
+    if (call_->HasUses()) {
       // Add a phi of the return values.
       PhiInstr* phi = new PhiInstr(join, num_exits);
-      phi->set_ssa_temp_index(caller_graph->alloc_ssa_temp_index());
+      phi->set_ssa_temp_index(caller_graph_->alloc_ssa_temp_index());
       phi->mark_alive();
       for (intptr_t i = 0; i < num_exits; ++i) {
+        ReturnAt(i)->RemoveEnvironment();
         phi->SetInputAt(i, ValueAt(i));
       }
       join->InsertPhi(phi);
-      // Replace uses of the call with the phi.
-      call->ReplaceUsesWith(phi);
+      return phi;
     } else {
       // In the case that the result is unused, remove the return value uses
       // from their definition's use list.
       for (intptr_t i = 0; i < num_exits; ++i) {
-        ValueAt(i)->RemoveFromUseList();
+        ReturnAt(i)->UnuseAllInputs();
       }
+      return NULL;
     }
-    // Remove the call from the graph.
-    call->previous()->LinkTo(callee_entry->next());
-    join->LinkTo(call->next());
-    // Replace the blocks after splitting (see comment in the len=1 case above).
-    caller_entry->ReplaceAsPredecessorWith(join);
-    callee_entry->ReplaceAsPredecessorWith(caller_entry);
-    // Update the last instruction pointers on each exit block to the new goto.
-    for (intptr_t i = 0; i < num_exits; ++i) {
-      ExitBlockAt(i)->set_last_instruction(LastInstructionAt(i)->next());
+  }
+}
+
+
+void InliningContext::ReplaceCall(FlowGraph* callee_graph) {
+  ASSERT(call_->previous() != NULL);
+  ASSERT(call_->next() != NULL);
+  PrepareGraphs(callee_graph);
+
+  BlockEntryInstr* call_block = call_->GetBlock();
+  TargetEntryInstr* callee_entry = callee_graph->graph_entry()->normal_entry();
+
+  // 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());
+  } 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];
+      block->set_dominator(callee_exit);
+      callee_exit->AddDominatedBlock(block);
     }
-    // Mark that the dominator tree is invalid.
-    // TODO(zerny): Compute the dominator frontier locally.
-    caller_graph->InvalidateDominatorTree();
+    // 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];
+      block->set_dominator(call_block);
+      call_block->AddDominatedBlock(block);
+    }
   }
 }
 
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index 825b381..4bb63ba 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -20,7 +20,8 @@
 // graph construction so they can be plugged into the caller's flow graph.
 class InliningContext: public ValueObject {
  public:
-  InliningContext() : exits_(4) { }
+  InliningContext(FlowGraph* caller_graph, Definition* call)
+      : caller_graph_(caller_graph), call_(call), exits_(4) { }
 
   void AddExit(ReturnInstr* exit);
 
@@ -30,11 +31,11 @@
   // context and transformed to SSA with ComputeSSA with a correct virtual
   // register number, and that the use lists have been correctly computed.
   //
-  // After inlining the caller graph will correctly have adjusted the
-  // pre/post orders, the dominator tree and the use lists.
-  void ReplaceCall(FlowGraph* caller_graph,
-                   Definition* call,
-                   FlowGraph* callee_graph);
+  // After inlining the caller graph will have correctly adjusted the use
+  // lists.  The block orders will need to be recomputed, and the dominator
+  // tree will need to be recomputed if it is marked invalid in the caller
+  // graph.
+  void ReplaceCall(FlowGraph* callee_graph);
 
  private:
   struct Data {
@@ -42,24 +43,33 @@
     ReturnInstr* exit_return;
   };
 
-  static void PrepareGraphs(FlowGraph* caller_graph,
-                            Definition* call,
-                            FlowGraph* callee_graph);
+  void PrepareGraphs(FlowGraph* caller_graph);
 
   BlockEntryInstr* ExitBlockAt(intptr_t i) const {
     ASSERT(exits_[i].exit_block != NULL);
     return exits_[i].exit_block;
   }
+
   Instruction* LastInstructionAt(intptr_t i) const {
-    return exits_[i].exit_return->previous();
+    return ReturnAt(i)->previous();
   }
+
   Value* ValueAt(intptr_t i) const {
-    return exits_[i].exit_return->value();
+    return ReturnAt(i)->value();
+  }
+
+  ReturnInstr* ReturnAt(intptr_t i) const {
+    return exits_[i].exit_return;
   }
 
   static int LowestBlockIdFirst(const Data* a, const Data* b);
   void SortExits();
 
+  Definition* JoinReturns(BlockEntryInstr** exit_block,
+                          Instruction** last_instruction);
+
+  FlowGraph* caller_graph_;
+  Definition* call_;
   GrowableArray<Data> exits_;
 };
 
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 55add24..14e4dd9 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -31,19 +31,6 @@
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(bool, use_cha);
 
-void CompilerDeoptInfo::BuildReturnAddress(DeoptInfoBuilder* builder,
-                                           const Function& function,
-                                           intptr_t slot_ix) {
-  builder->AddReturnAddressAfter(function, deopt_id(), slot_ix);
-}
-
-
-void CompilerDeoptInfoWithStub::BuildReturnAddress(DeoptInfoBuilder* builder,
-                                                   const Function& function,
-                                                   intptr_t slot_ix) {
-  builder->AddReturnAddressBefore(function, deopt_id(), slot_ix);
-}
-
 
 // Assign locations to incoming arguments, i.e., values pushed above spill slots
 // with PushArgument.  Recursively allocates from outermost to innermost
@@ -72,14 +59,15 @@
   intptr_t slot_ix = 0;
   Environment* current = deoptimization_env_;
 
-  // For the innermost environment, call the virtual return builder.
-  BuildReturnAddress(builder, current->function(), slot_ix++);
+  builder->AddReturnAddress(current->function(),
+                            deopt_id(),
+                            slot_ix++);
 
   // For the innermost environment, set outgoing arguments and the locals.
   for (intptr_t i = current->Length() - 1;
        i >= current->fixed_parameter_count();
        i--) {
-    builder->AddCopy(current->LocationAt(i), slot_ix++);
+    builder->AddCopy(current->ValueAt(i), current->LocationAt(i), slot_ix++);
   }
 
   // PC marker and caller FP.
@@ -91,21 +79,25 @@
   while (current != NULL) {
     // For any outer environment the deopt id is that of the call instruction
     // which is recorded in the outer environment.
-    builder->AddReturnAddressAfter(current->function(),
-                                   current->deopt_id(),
-                                   slot_ix++);
+    builder->AddReturnAddress(current->function(),
+                              Isolate::ToDeoptAfter(current->deopt_id()),
+                              slot_ix++);
 
     // The values of outgoing arguments can be changed from the inlined call so
     // we must read them from the previous environment.
     for (intptr_t i = previous->fixed_parameter_count() - 1; i >= 0; i--) {
-      builder->AddCopy(previous->LocationAt(i), slot_ix++);
+      builder->AddCopy(previous->ValueAt(i),
+                       previous->LocationAt(i),
+                       slot_ix++);
     }
 
     // Set the locals, note that outgoing arguments are not in the environment.
     for (intptr_t i = current->Length() - 1;
          i >= current->fixed_parameter_count();
          i--) {
-      builder->AddCopy(current->LocationAt(i), slot_ix++);
+      builder->AddCopy(current->ValueAt(i),
+                       current->LocationAt(i),
+                       slot_ix++);
     }
 
     // PC marker and caller FP.
@@ -124,7 +116,7 @@
 
   // For the outermost environment, set the incoming arguments.
   for (intptr_t i = previous->fixed_parameter_count() - 1; i >= 0; i--) {
-    builder->AddCopy(previous->LocationAt(i), slot_ix++);
+    builder->AddCopy(previous->ValueAt(i), previous->LocationAt(i), slot_ix++);
   }
 
   const DeoptInfo& deopt_info = DeoptInfo::Handle(builder->CreateDeoptInfo());
@@ -151,6 +143,8 @@
       may_reoptimize_(false),
       double_class_(Class::ZoneHandle(
           Isolate::Current()->object_store()->double_class())),
+      float32x4_class_(Class::ZoneHandle(
+          Isolate::Current()->object_store()->float32x4_class())),
       parallel_move_resolver_(this),
       pending_deoptimization_env_(NULL) {
   ASSERT(assembler != NULL);
@@ -416,7 +410,7 @@
         // FPU registers have the highest register number at the highest
         // address (i.e., first in the stackmap).
         const intptr_t kFpuRegisterSpillFactor =
-            FlowGraphAllocator::kFpuRegisterSpillFactor;
+            kFpuRegisterSize / kWordSize;
         for (intptr_t i = kNumberOfFpuRegisters - 1; i >= 0; --i) {
           FpuRegister reg = static_cast<FpuRegister>(i);
           if (regs->ContainsFpuRegister(reg)) {
@@ -944,6 +938,99 @@
 }
 
 
+bool ParallelMoveResolver::IsScratchLocation(Location loc) {
+  for (int i = 0; i < moves_.length(); ++i) {
+    if (moves_[i]->Blocks(loc)) {
+      return false;
+    }
+  }
+
+  for (int i = 0; i < moves_.length(); ++i) {
+    if (moves_[i]->dest().Equals(loc)) {
+      return true;
+    }
+  }
+
+  return false;
+}
+
+
+intptr_t ParallelMoveResolver::AllocateScratchRegister(Location::Kind kind,
+                                                       intptr_t blocked,
+                                                       intptr_t register_count,
+                                                       bool* spilled) {
+  intptr_t scratch = -1;
+  for (intptr_t reg = 0; reg < register_count; reg++) {
+    if ((blocked != reg) &&
+        IsScratchLocation(Location::MachineRegisterLocation(kind, reg))) {
+      scratch = reg;
+      break;
+    }
+  }
+
+  if (scratch == -1) {
+    *spilled = true;
+    for (intptr_t reg = 0; reg < register_count; reg++) {
+      if (blocked != reg) {
+        scratch = reg;
+      }
+    }
+  } else {
+    *spilled = false;
+  }
+
+  return scratch;
+}
+
+
+ParallelMoveResolver::ScratchFpuRegisterScope::ScratchFpuRegisterScope(
+    ParallelMoveResolver* resolver, FpuRegister blocked)
+    : resolver_(resolver),
+      reg_(kNoFpuRegister),
+      spilled_(false) {
+  reg_ = static_cast<FpuRegister>(
+      resolver_->AllocateScratchRegister(Location::kFpuRegister,
+                                         blocked,
+                                         kNumberOfFpuRegisters,
+                                         &spilled_));
+
+  if (spilled_) {
+    resolver->SpillFpuScratch(reg_);
+  }
+}
+
+
+ParallelMoveResolver::ScratchFpuRegisterScope::~ScratchFpuRegisterScope() {
+  if (spilled_) {
+    resolver_->RestoreFpuScratch(reg_);
+  }
+}
+
+
+ParallelMoveResolver::ScratchRegisterScope::ScratchRegisterScope(
+    ParallelMoveResolver* resolver, Register blocked)
+    : resolver_(resolver),
+      reg_(kNoRegister),
+      spilled_(false) {
+  reg_ = static_cast<Register>(
+      resolver_->AllocateScratchRegister(Location::kRegister,
+                                         blocked,
+                                         kNumberOfCpuRegisters,
+                                         &spilled_));
+
+  if (spilled_) {
+    resolver->SpillScratch(reg_);
+  }
+}
+
+
+ParallelMoveResolver::ScratchRegisterScope::~ScratchRegisterScope() {
+  if (spilled_) {
+    resolver_->RestoreScratch(reg_);
+  }
+}
+
+
 intptr_t FlowGraphCompiler::ElementSizeFor(intptr_t cid) {
   if (RawObject::IsExternalTypedDataClassId(cid)) {
     return ExternalTypedData::ElementSizeInBytes(cid);
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index f141fd1..6ae9b1f 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -31,6 +31,47 @@
   void EmitNativeCode(ParallelMoveInstr* parallel_move);
 
  private:
+  class ScratchFpuRegisterScope : public ValueObject {
+   public:
+    ScratchFpuRegisterScope(ParallelMoveResolver* resolver,
+                            FpuRegister blocked);
+    ~ScratchFpuRegisterScope();
+
+    FpuRegister reg() const { return reg_; }
+
+   private:
+    ParallelMoveResolver* resolver_;
+    FpuRegister reg_;
+    bool spilled_;
+  };
+
+  class ScratchRegisterScope : public ValueObject {
+   public:
+    ScratchRegisterScope(ParallelMoveResolver* resolver, Register blocked);
+    ~ScratchRegisterScope();
+
+    Register reg() const { return reg_; }
+
+   private:
+    ParallelMoveResolver* resolver_;
+    Register reg_;
+    bool spilled_;
+  };
+
+
+  bool IsScratchLocation(Location loc);
+  intptr_t AllocateScratchRegister(Location::Kind kind,
+                                   intptr_t blocked,
+                                   intptr_t register_count,
+                                   bool* spilled);
+
+  void SpillScratch(Register reg);
+  void RestoreScratch(Register reg);
+  void SpillFpuScratch(FpuRegister reg);
+  void RestoreFpuScratch(FpuRegister reg);
+
+  // friend class ScratchXmmRegisterScope;
+
   // Build the initial list of moves.
   void BuildInitialMoveList(ParallelMoveInstr* parallel_move);
 
@@ -81,11 +122,6 @@
   // No code needs to be generated.
   virtual void GenerateCode(FlowGraphCompiler* compiler, intptr_t stub_ix) {}
 
-  // Builds deopt-after continuation point.
-  virtual void BuildReturnAddress(DeoptInfoBuilder* builder,
-                                  const Function& function,
-                                  intptr_t slot_ix);
-
   intptr_t pc_offset() const { return pc_offset_; }
   void set_pc_offset(intptr_t offset) { pc_offset_ = offset; }
 
@@ -119,11 +155,6 @@
   // Implementation is in architecture specific file.
   virtual void GenerateCode(FlowGraphCompiler* compiler, intptr_t stub_ix);
 
-  // Builds deopt-before continuation point.
-  virtual void BuildReturnAddress(DeoptInfoBuilder* builder,
-                                  const Function& function,
-                                  intptr_t slot_ix);
-
  private:
   Label entry_label_;
 
@@ -381,6 +412,7 @@
   void FinalizeStaticCallTargetsTable(const Code& code);
 
   const Class& double_class() const { return double_class_; }
+  const Class& float32x4_class() const { return float32x4_class_; }
 
   void SaveLiveRegisters(LocationSummary* locs);
   void RestoreLiveRegisters(LocationSummary* locs);
@@ -539,6 +571,7 @@
   bool may_reoptimize_;
 
   const Class& double_class_;
+  const Class& float32x4_class_;
 
   ParallelMoveResolver parallel_move_resolver_;
 
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index db7e56a..c9b8b86 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -408,9 +408,18 @@
   if (!is_optimizing()) {
     if (FLAG_enable_type_checks && instr->IsAssertAssignable()) {
       AssertAssignableInstr* assert = instr->AsAssertAssignable();
-      AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
+      AddCurrentDescriptor(PcDescriptors::kDeopt,
                            assert->deopt_id(),
                            assert->token_pos());
+    } else if (instr->IsGuardField()) {
+      GuardFieldInstr* guard = instr->AsGuardField();
+      AddCurrentDescriptor(PcDescriptors::kDeopt,
+                           guard->deopt_id(),
+                           Scanner::kDummyTokenIndex);
+    } else if (instr->CanBeDeoptimizationTarget()) {
+      AddCurrentDescriptor(PcDescriptors::kDeopt,
+                           instr->deopt_id(),
+                           Scanner::kDummyTokenIndex);
     }
     AllocateRegistersLocally(instr);
   }
@@ -884,14 +893,13 @@
   RecordSafepoint(locs);
   // Marks either the continuation point in unoptimized code or the
   // deoptimization point in optimized code, after call.
+  const intptr_t deopt_id_after = Isolate::ToDeoptAfter(deopt_id);
   if (is_optimizing()) {
-    AddDeoptIndexAtCall(deopt_id, token_pos);
+    AddDeoptIndexAtCall(deopt_id_after, token_pos);
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    AddCurrentDescriptor(PcDescriptors::kDeoptAfter,
-                         deopt_id,
-                         token_pos);
+    AddCurrentDescriptor(PcDescriptors::kDeopt, deopt_id_after, token_pos);
   }
 }
 
@@ -906,13 +914,14 @@
   if (deopt_id != Isolate::kNoDeoptId) {
     // Marks either the continuation point in unoptimized code or the
     // deoptimization point in optimized code, after call.
+    const intptr_t deopt_id_after = Isolate::ToDeoptAfter(deopt_id);
     if (is_optimizing()) {
-      AddDeoptIndexAtCall(deopt_id, token_pos);
+      AddDeoptIndexAtCall(deopt_id_after, token_pos);
     } else {
       // Add deoptimization continuation point after the call and before the
       // arguments are removed.
-      AddCurrentDescriptor(PcDescriptors::kDeoptAfter,
-                           deopt_id,
+      AddCurrentDescriptor(PcDescriptors::kDeopt,
+                           deopt_id_after,
                            token_pos);
     }
   }
@@ -1146,8 +1155,7 @@
       if (destination.IsDoubleStackSlot()) {
         __ vstrd(source.fpu_reg(), destination.ToStackSlotAddress());
       } else {
-        ASSERT(destination.IsFloat32x4StackSlot() ||
-               destination.IsUint32x4StackSlot());
+        ASSERT(destination.IsQuadStackSlot());
         UNIMPLEMENTED();
       }
     }
@@ -1159,7 +1167,7 @@
       __ vldrd(FpuTMP, source.ToStackSlotAddress());
       __ vstrd(FpuTMP, destination.ToStackSlotAddress());
     }
-  } else if (source.IsFloat32x4StackSlot() || source.IsUint32x4StackSlot()) {
+  } else if (source.IsQuadStackSlot()) {
     UNIMPLEMENTED();
   } else {
     ASSERT(source.IsConstant());
@@ -1199,11 +1207,9 @@
     __ vmovd(destination.fpu_reg(), FpuTMP);
   } else if (source.IsFpuRegister() || destination.IsFpuRegister()) {
     ASSERT(destination.IsDoubleStackSlot() ||
-           destination.IsFloat32x4StackSlot() ||
-           destination.IsUint32x4StackSlot() ||
+           destination.IsQuadStackSlot() ||
            source.IsDoubleStackSlot() ||
-           source.IsFloat32x4StackSlot() ||
-           source.IsUint32x4StackSlot());
+           source.IsQuadStackSlot());
     bool double_width = destination.IsDoubleStackSlot() ||
                         source.IsDoubleStackSlot();
     DRegister reg = source.IsFpuRegister() ? source.fpu_reg()
@@ -1219,6 +1225,17 @@
     } else {
       UNIMPLEMENTED();
     }
+  } else if (source.IsDoubleStackSlot() && destination.IsDoubleStackSlot()) {
+    const Address& source_slot_address = source.ToStackSlotAddress();
+    const Address& destination_slot_address = destination.ToStackSlotAddress();
+
+    ScratchFpuRegisterScope ensure_scratch(this, FpuTMP);
+    __ vldrd(FpuTMP, source_slot_address);
+    __ vldrd(ensure_scratch.reg(), destination_slot_address);
+    __ vstrd(FpuTMP, destination_slot_address);
+    __ vstrd(ensure_scratch.reg(), source_slot_address);
+  } else if (source.IsQuadStackSlot() && destination.IsQuadStackSlot()) {
+    UNIMPLEMENTED();
   } else {
     UNREACHABLE();
   }
@@ -1263,13 +1280,31 @@
 
 
 void ParallelMoveResolver::Exchange(const Address& mem1, const Address& mem2) {
-  // TODO(vegorov): allocate temporary registers for such moves.
-  __ Push(R0);
-  __ ldr(R0, mem1);
+  ScratchRegisterScope ensure_scratch(this, IP);
+  __ ldr(ensure_scratch.reg(), mem1);
   __ ldr(IP, mem2);
+  __ str(ensure_scratch.reg(), mem2);
   __ str(IP, mem1);
-  __ str(R0, mem2);
-  __ Pop(R0);
+}
+
+
+void ParallelMoveResolver::SpillScratch(Register reg) {
+  __ Push(reg);
+}
+
+
+void ParallelMoveResolver::RestoreScratch(Register reg) {
+  __ Pop(reg);
+}
+
+
+void ParallelMoveResolver::SpillFpuScratch(FpuRegister reg) {
+  __ vstrd(reg, Address(SP, -kDoubleSize, Address::PreIndex));
+}
+
+
+void ParallelMoveResolver::RestoreFpuScratch(FpuRegister reg) {
+  __ vldrd(reg, Address(SP, kDoubleSize, Address::PostIndex));
 }
 
 
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 0113aeb..dce40df 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -505,7 +505,10 @@
     __ pushl(EDX);  // Instantiator type arguments.
     __ LoadObject(EAX, test_cache);
     __ pushl(EAX);
-    GenerateCallRuntime(token_pos, deopt_id, kInstanceofRuntimeEntry, locs);
+    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);
@@ -628,14 +631,18 @@
   if (!is_optimizing()) {
     if (FLAG_enable_type_checks && instr->IsAssertAssignable()) {
       AssertAssignableInstr* assert = instr->AsAssertAssignable();
-      AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
+      AddCurrentDescriptor(PcDescriptors::kDeopt,
                            assert->deopt_id(),
                            assert->token_pos());
     } else if (instr->IsGuardField()) {
       GuardFieldInstr* guard = instr->AsGuardField();
-      AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
+      AddCurrentDescriptor(PcDescriptors::kDeopt,
                            guard->deopt_id(),
                            Scanner::kDummyTokenIndex);
+    } else if (instr->CanBeDeoptimizationTarget()) {
+      AddCurrentDescriptor(PcDescriptors::kDeopt,
+                           instr->deopt_id(),
+                           Scanner::kDummyTokenIndex);
     }
     AllocateRegistersLocally(instr);
   }
@@ -1094,14 +1101,13 @@
   RecordSafepoint(locs);
   // Marks either the continuation point in unoptimized code or the
   // deoptimization point in optimized code, after call.
+  const intptr_t deopt_id_after = Isolate::ToDeoptAfter(deopt_id);
   if (is_optimizing()) {
-    AddDeoptIndexAtCall(deopt_id, token_pos);
+    AddDeoptIndexAtCall(deopt_id_after, token_pos);
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    AddCurrentDescriptor(PcDescriptors::kDeoptAfter,
-                         deopt_id,
-                         token_pos);
+    AddCurrentDescriptor(PcDescriptors::kDeopt, deopt_id_after, token_pos);
   }
 }
 
@@ -1116,14 +1122,13 @@
   if (deopt_id != Isolate::kNoDeoptId) {
     // Marks either the continuation point in unoptimized code or the
     // deoptimization point in optimized code, after call.
+    const intptr_t deopt_id_after = Isolate::ToDeoptAfter(deopt_id);
     if (is_optimizing()) {
-      AddDeoptIndexAtCall(deopt_id, token_pos);
+      AddDeoptIndexAtCall(deopt_id_after, token_pos);
     } else {
       // Add deoptimization continuation point after the call and before the
       // arguments are removed.
-      AddCurrentDescriptor(PcDescriptors::kDeoptAfter,
-                           deopt_id,
-                           token_pos);
+      AddCurrentDescriptor(PcDescriptors::kDeopt, deopt_id_after, token_pos);
     }
   }
 }
@@ -1235,7 +1240,7 @@
   __ call(EAX);
   AddCurrentDescriptor(PcDescriptors::kOther, Isolate::kNoDeoptId, token_pos);
   RecordSafepoint(locs);
-  AddDeoptIndexAtCall(deopt_id, token_pos);
+  AddDeoptIndexAtCall(Isolate::ToDeoptAfter(deopt_id), token_pos);
   __ Drop(argument_count);
 }
 
@@ -1529,6 +1534,7 @@
     case 2: return TIMES_1;
     case 4: return TIMES_2;
     case 8: return TIMES_4;
+    case 16: return TIMES_8;
     default:
       UNREACHABLE();
       return TIMES_1;
@@ -1596,8 +1602,7 @@
       if (destination.IsDoubleStackSlot()) {
         __ movsd(destination.ToStackSlotAddress(), source.fpu_reg());
       } else {
-        ASSERT(destination.IsFloat32x4StackSlot() ||
-               destination.IsUint32x4StackSlot());
+        ASSERT(destination.IsQuadStackSlot());
         __ movups(destination.ToStackSlotAddress(), source.fpu_reg());
       }
     }
@@ -1609,12 +1614,11 @@
       __ movsd(XMM0, source.ToStackSlotAddress());
       __ movsd(destination.ToStackSlotAddress(), XMM0);
     }
-  } else if (source.IsFloat32x4StackSlot() || source.IsUint32x4StackSlot()) {
+  } else if (source.IsQuadStackSlot()) {
     if (destination.IsFpuRegister()) {
       __ movups(destination.fpu_reg(), source.ToStackSlotAddress());
     } else {
-      ASSERT(destination.IsFloat32x4StackSlot() ||
-             destination.IsUint32x4StackSlot());
+      ASSERT(destination.IsQuadStackSlot());
       __ movups(XMM0, source.ToStackSlotAddress());
       __ movups(destination.ToStackSlotAddress(), XMM0);
     }
@@ -1656,11 +1660,9 @@
     __ movaps(destination.fpu_reg(), XMM0);
   } else if (source.IsFpuRegister() || destination.IsFpuRegister()) {
     ASSERT(destination.IsDoubleStackSlot() ||
-           destination.IsFloat32x4StackSlot() ||
-           destination.IsUint32x4StackSlot() ||
+           destination.IsQuadStackSlot() ||
            source.IsDoubleStackSlot() ||
-           source.IsFloat32x4StackSlot() ||
-           source.IsUint32x4StackSlot());
+           source.IsQuadStackSlot());
     bool double_width = destination.IsDoubleStackSlot() ||
                         source.IsDoubleStackSlot();
     XmmRegister reg = source.IsFpuRegister() ? source.fpu_reg()
@@ -1677,6 +1679,24 @@
       __ movups(slot_address, reg);
     }
     __ movaps(reg, XMM0);
+  } else if (source.IsDoubleStackSlot() && destination.IsDoubleStackSlot()) {
+    const Address& source_slot_address = source.ToStackSlotAddress();
+    const Address& destination_slot_address = destination.ToStackSlotAddress();
+
+    ScratchFpuRegisterScope ensure_scratch(this, XMM0);
+    __ movsd(XMM0, source_slot_address);
+    __ movsd(ensure_scratch.reg(), destination_slot_address);
+    __ movsd(destination_slot_address, XMM0);
+    __ movsd(source_slot_address, ensure_scratch.reg());
+  } else if (source.IsQuadStackSlot() && destination.IsQuadStackSlot()) {
+    const Address& source_slot_address = source.ToStackSlotAddress();
+    const Address& destination_slot_address = destination.ToStackSlotAddress();
+
+    ScratchFpuRegisterScope ensure_scratch(this, XMM0);
+    __ movups(XMM0, source_slot_address);
+    __ movups(ensure_scratch.reg(), destination_slot_address);
+    __ movups(destination_slot_address, XMM0);
+    __ movups(source_slot_address, ensure_scratch.reg());
   } else {
     UNREACHABLE();
   }
@@ -1701,48 +1721,60 @@
 
 void ParallelMoveResolver::MoveMemoryToMemory(const Address& dst,
                                               const Address& src) {
-  // TODO(vegorov): allocate temporary register for such moves.
-  __ pushl(EAX);
-  __ movl(EAX, src);
-  __ movl(dst, EAX);
-  __ popl(EAX);
+  ScratchRegisterScope ensure_scratch(this, kNoRegister);
+  __ movl(ensure_scratch.reg(), src);
+  __ movl(dst, ensure_scratch.reg());
 }
 
 
 void ParallelMoveResolver::StoreObject(const Address& dst, const Object& obj) {
-  // TODO(vegorov): allocate temporary register for such moves.
   if (obj.IsSmi() || obj.IsNull()) {
     __ movl(dst, Immediate(reinterpret_cast<int32_t>(obj.raw())));
   } else {
-    __ pushl(EAX);
-    __ LoadObject(EAX, obj);
-    __ movl(dst, EAX);
-    __ popl(EAX);
+    ScratchRegisterScope ensure_scratch(this, kNoRegister);
+    __ LoadObject(ensure_scratch.reg(), obj);
+    __ movl(dst, ensure_scratch.reg());
   }
 }
 
 
 void ParallelMoveResolver::Exchange(Register reg, const Address& mem) {
-  // TODO(vegorov): allocate temporary register for such moves.
-  Register scratch = (reg == EAX) ? ECX : EAX;
-  __ pushl(scratch);
-  __ movl(scratch, mem);
-  __ xchgl(scratch, reg);
-  __ movl(mem, scratch);
-  __ popl(scratch);
+  ScratchRegisterScope ensure_scratch(this, reg);
+  __ movl(ensure_scratch.reg(), mem);
+  __ movl(mem, reg);
+  __ movl(reg, ensure_scratch.reg());
 }
 
 
 void ParallelMoveResolver::Exchange(const Address& mem1, const Address& mem2) {
-  // TODO(vegorov): allocate temporary registers for such moves.
-  __ pushl(EAX);
-  __ pushl(ECX);
-  __ movl(EAX, mem1);
-  __ movl(ECX, mem2);
-  __ movl(mem1, ECX);
-  __ movl(mem2, EAX);
-  __ popl(ECX);
-  __ popl(EAX);
+  ScratchRegisterScope ensure_scratch1(this, kNoRegister);
+  ScratchRegisterScope ensure_scratch2(this, ensure_scratch1.reg());
+  __ movl(ensure_scratch1.reg(), mem1);
+  __ movl(ensure_scratch2.reg(), mem2);
+  __ movl(mem2, ensure_scratch1.reg());
+  __ movl(mem1, ensure_scratch2.reg());
+}
+
+
+void ParallelMoveResolver::SpillScratch(Register reg) {
+  __ pushl(reg);
+}
+
+
+void ParallelMoveResolver::RestoreScratch(Register reg) {
+  __ popl(reg);
+}
+
+
+void ParallelMoveResolver::SpillFpuScratch(FpuRegister reg) {
+  __ subl(ESP, Immediate(kFpuRegisterSize));
+  __ movups(Address(ESP, 0), reg);
+}
+
+
+void ParallelMoveResolver::RestoreFpuScratch(FpuRegister reg) {
+  __ movups(reg, Address(ESP, 0));
+  __ addl(ESP, Immediate(kFpuRegisterSize));
 }
 
 
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index 778ffcd..8a54d5b 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -49,13 +49,21 @@
 #define __ assembler()->
 
 
+// Fall through if bool_register contains null.
 void FlowGraphCompiler::GenerateBoolToJump(Register bool_register,
                                            Label* is_true,
                                            Label* is_false) {
-  UNIMPLEMENTED();
+  Label fall_through;
+  __ BranchEqual(bool_register, reinterpret_cast<intptr_t>(Object::null()),
+                 &fall_through);
+  __ BranchEqual(bool_register, Bool::True(), is_true);
+  __ b(is_false);
+  __ Bind(&fall_through);
 }
 
 
+// A0: instance (must be preserved).
+// A1: instantiator type arguments (if used).
 RawSubtypeTestCache* FlowGraphCompiler::GenerateCallSubtypeTestStub(
     TypeTestStubKind test_kind,
     Register instance_reg,
@@ -63,8 +71,28 @@
     Register temp_reg,
     Label* is_instance_lbl,
     Label* is_not_instance_lbl) {
-  UNIMPLEMENTED();
-  return NULL;
+  ASSERT(instance_reg == A0);
+  ASSERT(temp_reg == kNoRegister);  // Unused on MIPS.
+  const SubtypeTestCache& type_test_cache =
+      SubtypeTestCache::ZoneHandle(SubtypeTestCache::New());
+  __ LoadObject(A2, type_test_cache);
+  if (test_kind == kTestTypeOneArg) {
+    ASSERT(type_arguments_reg == kNoRegister);
+    __ LoadImmediate(A1, reinterpret_cast<intptr_t>(Object::null()));
+    __ BranchLink(&StubCode::Subtype1TestCacheLabel());
+  } else if (test_kind == kTestTypeTwoArgs) {
+    ASSERT(type_arguments_reg == kNoRegister);
+    __ LoadImmediate(A1, reinterpret_cast<intptr_t>(Object::null()));
+    __ BranchLink(&StubCode::Subtype2TestCacheLabel());
+  } else if (test_kind == kTestTypeThreeArgs) {
+    ASSERT(type_arguments_reg == A1);
+    __ BranchLink(&StubCode::Subtype3TestCacheLabel());
+  } else {
+    UNREACHABLE();
+  }
+  // Result is in V0: null -> not found, otherwise Bool::True or Bool::False.
+  GenerateBoolToJump(V0, is_instance_lbl, is_not_instance_lbl);
+  return type_test_cache.raw();
 }
 
 
@@ -84,8 +112,7 @@
                                       Label* is_equal_lbl,
                                       Label* is_not_equal_lbl) {
   for (intptr_t i = 0; i < class_ids.length(); i++) {
-    __ LoadImmediate(TMP, class_ids[i]);
-    __ beq(class_id_reg, TMP, is_equal_lbl);
+    __ BranchEqual(class_id_reg, class_ids[i], is_equal_lbl);
   }
   __ b(is_not_equal_lbl);
 }
@@ -121,14 +148,13 @@
   // Compare if the classes are equal.
   const Register kClassIdReg = T0;
   __ LoadClassId(kClassIdReg, kInstanceReg);
-  __ LoadImmediate(T1, type_class.id());
-  __ beq(kClassIdReg, T1, is_instance_lbl);
+  __ BranchEqual(kClassIdReg, type_class.id(), is_instance_lbl);
+
   // See ClassFinalizer::ResolveSuperTypeAndInterfaces for list of restricted
   // interfaces.
   // Bool interface can be implemented only by core class Bool.
   if (type.IsBoolType()) {
-    __ LoadImmediate(T1, kBoolCid);
-    __ beq(kClassIdReg, T1, is_instance_lbl);
+    __ BranchEqual(kClassIdReg, kBoolCid, is_instance_lbl);
     __ b(is_not_instance_lbl);
     return false;
   }
@@ -136,8 +162,8 @@
     // Check if instance is a closure.
     __ LoadClassById(T1, kClassIdReg);
     __ lw(T1, FieldAddress(T1, Class::signature_function_offset()));
-    __ LoadImmediate(T2, reinterpret_cast<int32_t>(Object::null()));
-    __ bne(T1, T2, is_instance_lbl);
+    __ BranchNotEqual(T1, reinterpret_cast<int32_t>(Object::null()),
+                      is_instance_lbl);
   }
   // Custom checking for numbers (Smi, Mint, Bigint and Double).
   // Note that instance is not Smi (checked above).
@@ -155,13 +181,35 @@
 }
 
 
+// Uses SubtypeTestCache to store instance class and result.
+// A0: instance to test.
+// Clobbers A1, A2, T0-T3.
+// Immediate class test already done.
+// TODO(srdjan): Implement a quicker subtype check, as type test
+// arrays can grow too high, but they may be useful when optimizing
+// code (type-feedback).
 RawSubtypeTestCache* FlowGraphCompiler::GenerateSubtype1TestCacheLookup(
     intptr_t token_pos,
     const Class& type_class,
     Label* is_instance_lbl,
     Label* is_not_instance_lbl) {
-  UNIMPLEMENTED();
-  return NULL;
+  __ Comment("Subtype1TestCacheLookup");
+  const Register kInstanceReg = A0;
+  __ LoadClass(T0, kInstanceReg);
+  // T0: instance class.
+  // Check immediate superclass equality.
+  __ lw(T0, FieldAddress(T0, Class::super_type_offset()));
+  __ lw(T0, FieldAddress(T0, Type::type_class_offset()));
+  __ BranchEqual(T0, type_class, is_instance_lbl);
+
+  const Register kTypeArgumentsReg = kNoRegister;
+  const Register kTempReg = kNoRegister;
+  return GenerateCallSubtypeTestStub(kTestTypeOneArg,
+                                     kInstanceReg,
+                                     kTypeArgumentsReg,
+                                     kTempReg,
+                                     is_instance_lbl,
+                                     is_not_instance_lbl);
 }
 
 
@@ -204,8 +252,7 @@
     } else {
       __ beq(T0, ZR, is_not_instance_lbl);
       __ LoadClassId(T0, kInstanceReg);
-      __ LoadImmediate(T1, type_cid);
-      __ beq(T0, T1, is_instance_lbl);
+      __ BranchEqual(T0, type_cid, is_instance_lbl);
     }
     __ b(is_not_instance_lbl);
     return SubtypeTestCache::null();
@@ -282,14 +329,12 @@
   __ sw(A1, Address(SP, 0 * kWordSize));
   // A null object is always assignable and is returned as result.
   Label is_assignable, runtime_call;
-  __ LoadImmediate(T0, reinterpret_cast<int32_t>(Object::null()));
-  __ beq(A0, T0, &is_assignable);
+  __ BranchEqual(A0, reinterpret_cast<int32_t>(Object::null()), &is_assignable);
 
   if (!FLAG_eliminate_type_checks) {
     // If type checks are not eliminated during the graph building then
     // a transition sentinel can be seen here.
-    __ LoadObject(T0, Object::transition_sentinel());
-    __ beq(A0, T0, &is_assignable);
+    __ BranchEqual(A0, Object::transition_sentinel(), &is_assignable);
   }
 
   // Generate throw new TypeError() if the type is malformed.
@@ -334,8 +379,8 @@
   __ sw(A2, Address(SP, 1 * kWordSize));
   __ sw(A1, Address(SP, 0 * kWordSize));
   __ PushObject(dst_name);  // Push the name of the destination.
-  __ LoadObject(A0, test_cache);
-  __ Push(A0);
+  __ LoadObject(T0, test_cache);
+  __ Push(T0);
   GenerateCallRuntime(token_pos, deopt_id, kTypeCheckRuntimeEntry, locs);
   // Pop the parameters supplied to the runtime entry. The result of the
   // type check runtime call is the checked value.
@@ -344,9 +389,9 @@
 
   __ Bind(&is_assignable);
   // Restore instantiator and its type arguments.
-    __ lw(A1, Address(SP, 0 * kWordSize));
-    __ lw(A2, Address(SP, 1 * kWordSize));
-    __ addiu(SP, SP, Immediate(2 * kWordSize));
+  __ lw(A1, Address(SP, 0 * kWordSize));
+  __ lw(A2, Address(SP, 1 * kWordSize));
+  __ addiu(SP, SP, Immediate(2 * kWordSize));
 }
 
 
@@ -354,9 +399,18 @@
   if (!is_optimizing()) {
     if (FLAG_enable_type_checks && instr->IsAssertAssignable()) {
       AssertAssignableInstr* assert = instr->AsAssertAssignable();
-      AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
+      AddCurrentDescriptor(PcDescriptors::kDeopt,
                            assert->deopt_id(),
                            assert->token_pos());
+    } else if (instr->IsGuardField()) {
+      GuardFieldInstr* guard = instr->AsGuardField();
+      AddCurrentDescriptor(PcDescriptors::kDeopt,
+                           guard->deopt_id(),
+                           Scanner::kDummyTokenIndex);
+    } else if (instr->CanBeDeoptimizationTarget()) {
+      AddCurrentDescriptor(PcDescriptors::kDeopt,
+                           instr->deopt_id(),
+                           Scanner::kDummyTokenIndex);
     }
     AllocateRegistersLocally(instr);
   }
@@ -394,29 +448,27 @@
   __ lw(T2, FieldAddress(S4, ArgumentsDescriptor::positional_count_offset()));
   // Check that min_num_pos_args <= num_pos_args.
   Label wrong_num_arguments;
-  __ addiu(T3, T2, Immediate(-Smi::RawValue(min_num_pos_args)));
-  __ bltz(T3, &wrong_num_arguments);
+  __ BranchLess(T2, Smi::RawValue(min_num_pos_args), &wrong_num_arguments);
 
   // Check that num_pos_args <= max_num_pos_args.
-  __ addiu(T3, T2, Immediate(-Smi::RawValue(max_num_pos_args)));
-  __ bgtz(T3, &wrong_num_arguments);
+  __ BranchGreater(T2, Smi::RawValue(max_num_pos_args), &wrong_num_arguments);
 
   // Copy positional arguments.
   // Argument i passed at fp[kLastParamSlotIndex + num_args - 1 - i] is copied
   // to fp[kFirstLocalSlotIndex - i].
 
   __ lw(T1, FieldAddress(S4, ArgumentsDescriptor::count_offset()));
-  // Since T1 and T2 are Smi, use LSL 1 instead of LSL 2.
+  // Since T1 and T2 are Smi, use sll 1 instead of sll 2.
   // Let T1 point to the last passed positional argument, i.e. to
   // fp[kLastParamSlotIndex + num_args - 1 - (num_pos_args - 1)].
   __ subu(T1, T1, T2);
   __ sll(T1, T1, 1);
   __ addu(T1, FP, T1);
-  __ addiu(T1, T1, Immediate(kLastParamSlotIndex * kWordSize));
+  __ AddImmediate(T1, kLastParamSlotIndex * kWordSize);
 
   // Let T0 point to the last copied positional argument, i.e. to
   // fp[kFirstLocalSlotIndex - (num_pos_args - 1)].
-  __ addiu(T0, FP, Immediate((kFirstLocalSlotIndex + 1) * kWordSize));
+  __ AddImmediate(T0, FP, (kFirstLocalSlotIndex + 1) * kWordSize);
   __ sll(T3, T2, 1);  // T2 is a Smi.
   __ subu(T0, T0, T3);
 
@@ -429,8 +481,8 @@
   __ Bind(&loop);
   __ addu(T4, T1, T2);
   __ addu(T5, T0, T2);
-  __ lw(TMP, Address(T4));
-  __ sw(TMP, Address(T5));
+  __ lw(T3, Address(T4));
+  __ sw(T3, Address(T5));
   __ Bind(&loop_condition);
   __ addiu(T2, T2, Immediate(-kWordSize));
   __ bgez(T2, &loop);
@@ -464,10 +516,10 @@
     // fp[kLastParamSlotIndex + num_args - 1 - 0]; num_args (T1) is Smi.
     __ sll(T3, T1, 1);
     __ addu(T1, FP, T3);
-    __ addiu(T1, T1, Immediate((kLastParamSlotIndex - 1) * kWordSize));
+    __ AddImmediate(T1, (kLastParamSlotIndex - 1) * kWordSize);
     // Let T0 point to the entry of the first named argument.
-    __ addiu(T0, S4, Immediate(
-        ArgumentsDescriptor::first_named_entry_offset() - kHeapObjectTag));
+    __ AddImmediate(T0, S4,
+        ArgumentsDescriptor::first_named_entry_offset() - kHeapObjectTag);
     for (int i = 0; i < num_opt_named_params; i++) {
       Label load_default_value, assign_optional_parameter;
       const int param_pos = opt_param_position[i];
@@ -475,15 +527,14 @@
       // Load T3 with the name of the argument.
       __ lw(T3, Address(T0, ArgumentsDescriptor::name_offset()));
       ASSERT(opt_param[i]->name().IsSymbol());
-      __ LoadObject(T4, opt_param[i]->name());
-      __ bne(T3, T4, &load_default_value);
+      __ BranchNotEqual(T3, opt_param[i]->name(), &load_default_value);
 
       // Load T3 with passed-in argument at provided arg_pos, i.e. at
       // fp[kLastParamSlotIndex + num_args - 1 - arg_pos].
       __ lw(T3, Address(T0, ArgumentsDescriptor::position_offset()));
       // T3 is arg_pos as Smi.
       // Point to next named entry.
-      __ addiu(T0, T0, Immediate(ArgumentsDescriptor::named_entry_size()));
+      __ AddImmediate(T0, ArgumentsDescriptor::named_entry_size());
       __ subu(T3, ZR, T3);
       __ sll(T3, T3, 1);
       __ addu(T3, T1, T3);
@@ -508,8 +559,8 @@
     delete[] opt_param_position;
     // Check that T0 now points to the null terminator in the array descriptor.
     __ lw(T3, Address(T0));
-    __ LoadImmediate(T4, reinterpret_cast<int32_t>(Object::null()));
-    __ beq(T3, T4, &all_arguments_processed);
+    __ BranchEqual(T3, reinterpret_cast<int32_t>(Object::null()),
+                &all_arguments_processed);
   } else {
     ASSERT(num_opt_pos_params > 0);
     __ lw(T2,
@@ -521,8 +572,7 @@
       // arguments have been passed, where k is param_pos, the position of this
       // optional parameter in the formal parameter list.
       const int param_pos = num_fixed_params + i;
-      __ addiu(T3, T2, Immediate(-param_pos));
-      __ bgtz(T3, &next_parameter);
+      __ BranchGreater(T2, param_pos, &next_parameter);
       // Load T3 with default argument.
       const Object& value = Object::ZoneHandle(
           parsed_function().default_parameter_values().At(i));
@@ -538,7 +588,7 @@
     __ lw(T1, FieldAddress(S4, ArgumentsDescriptor::count_offset()));
     __ SmiUntag(T1);
     // Check that T2 equals T1, i.e. no named arguments passed.
-    __ beq(T2, T2, &all_arguments_processed);
+    __ beq(T2, T1, &all_arguments_processed);
   }
 
   __ Bind(&wrong_num_arguments);
@@ -546,7 +596,7 @@
     // We need to unwind the space we reserved for locals and copied parameters.
     // The NoSuchMethodFunction stub does not expect to see that area on the
     // stack.
-    __ addiu(SP, SP, Immediate(StackSize() * kWordSize));
+    __ AddImmediate(SP, StackSize() * kWordSize);
   }
   // The call below has an empty stackmap because we have just
   // dropped the spill slots.
@@ -590,13 +640,13 @@
   __ lw(T2, FieldAddress(S4, ArgumentsDescriptor::count_offset()));
   __ SmiUntag(T2);
 
-  __ LoadImmediate(TMP, reinterpret_cast<intptr_t>(Object::null()));
+  __ LoadImmediate(T0, reinterpret_cast<intptr_t>(Object::null()));
   Label null_args_loop, null_args_loop_condition;
   __ b(&null_args_loop_condition);
   __ delay_slot()->addiu(T1, FP, Immediate(kLastParamSlotIndex * kWordSize));
   __ Bind(&null_args_loop);
   __ addu(T3, T1, T2);
-  __ sw(TMP, Address(T3));
+  __ sw(T0, Address(T3));
   __ Bind(&null_args_loop_condition);
   __ addiu(T2, T2, Immediate(-kWordSize));
   __ bgez(T2, &null_args_loop);
@@ -622,7 +672,7 @@
       Label next;
       // The pool pointer is not setup before entering the Dart frame.
 
-      __ mov(TMP, RA);  // Save RA.
+      __ mov(TMP1, RA);  // Save RA.
       __ bal(&next);  // Branch and link to next instruction to get PC in RA.
       __ delay_slot()->mov(T2, RA);  // Save PC of the following mov.
 
@@ -632,7 +682,7 @@
          assembler()->CodeSize();
 
       __ Bind(&next);
-      __ mov(RA, TMP);  // Restore RA.
+      __ mov(RA, TMP1);  // Restore RA.
 
       // Preserve PP of caller.
       __ mov(T1, PP);
@@ -666,9 +716,7 @@
 
       // Skip Branch if T1 is less than the threshold.
       Label dont_branch;
-      __ LoadImmediate(T2, FLAG_optimization_counter_threshold);
-      __ sltu(T2, T1, T2);
-      __ bgtz(T2, &dont_branch);
+      __ BranchLess(T1, FLAG_optimization_counter_threshold, &dont_branch);
 
       ASSERT(function_reg == T0);
       __ Branch(&StubCode::OptimizeFunctionLabel());
@@ -729,8 +777,8 @@
       // Check that exactly num_fixed arguments are passed in.
       Label correct_num_arguments, wrong_num_arguments;
       __ lw(T0, FieldAddress(S4, ArgumentsDescriptor::count_offset()));
-      __ LoadImmediate(T1, Smi::RawValue(num_fixed_params));
-      __ bne(T0, T1, &wrong_num_arguments);
+      __ BranchNotEqual(T0, Smi::RawValue(num_fixed_params),
+                        &wrong_num_arguments);
 
       __ lw(T1, FieldAddress(S4,
                              ArgumentsDescriptor::positional_count_offset()));
@@ -741,7 +789,7 @@
           // We need to unwind the space we reserved for locals and copied
           // parameters. The NoSuchMethodFunction stub does not expect to see
           // that area on the stack.
-          __ addiu(SP, SP, Immediate(StackSize() * kWordSize));
+          __ AddImmediate(SP, StackSize() * kWordSize);
         }
         // The call below has an empty stackmap because we have just
         // dropped the spill slots.
@@ -853,13 +901,14 @@
   RecordSafepoint(locs);
   // Marks either the continuation point in unoptimized code or the
   // deoptimization point in optimized code, after call.
+  const intptr_t deopt_id_after = Isolate::ToDeoptAfter(deopt_id);
   if (is_optimizing()) {
-    AddDeoptIndexAtCall(deopt_id, token_pos);
+    AddDeoptIndexAtCall(deopt_id_after, token_pos);
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    AddCurrentDescriptor(PcDescriptors::kDeoptAfter,
-                         deopt_id,
+    AddCurrentDescriptor(PcDescriptors::kDeopt,
+                         deopt_id_after,
                          token_pos);
   }
 }
@@ -869,7 +918,23 @@
                                             intptr_t deopt_id,
                                             const RuntimeEntry& entry,
                                             LocationSummary* locs) {
-  __ Unimplemented("call runtime");
+  __ CallRuntime(entry);
+  AddCurrentDescriptor(PcDescriptors::kOther, deopt_id, token_pos);
+  RecordSafepoint(locs);
+  if (deopt_id != Isolate::kNoDeoptId) {
+    // Marks either the continuation point in unoptimized code or the
+    // deoptimization point in optimized code, after call.
+    const intptr_t deopt_id_after = Isolate::ToDeoptAfter(deopt_id);
+    if (is_optimizing()) {
+      AddDeoptIndexAtCall(deopt_id_after, token_pos);
+    } else {
+      // Add deoptimization continuation point after the call and before the
+      // arguments are removed.
+      AddCurrentDescriptor(PcDescriptors::kDeopt,
+                           deopt_id_after,
+                           token_pos);
+    }
+  }
 }
 
 
@@ -943,7 +1008,16 @@
 void FlowGraphCompiler::EmitEqualityRegRegCompare(Register left,
                                                   Register right,
                                                   bool needs_number_check) {
-  UNIMPLEMENTED();
+  if (needs_number_check) {
+    __ Push(left);
+    __ Push(right);
+    __ BranchLink(&StubCode::IdenticalWithNumberCheckLabel());
+    // Stub returns result in CMPRES. If it is 0, then left and right are equal.
+    __ Pop(right);
+    __ Pop(left);
+  } else {
+    __ subu(CMPRES, left, right);
+  }
 }
 
 
@@ -1111,6 +1185,26 @@
 }
 
 
+void ParallelMoveResolver::SpillScratch(Register reg) {
+  UNIMPLEMENTED();
+}
+
+
+void ParallelMoveResolver::RestoreScratch(Register reg) {
+  UNIMPLEMENTED();
+}
+
+
+void ParallelMoveResolver::SpillFpuScratch(FpuRegister reg) {
+  UNIMPLEMENTED();
+}
+
+
+void ParallelMoveResolver::RestoreFpuScratch(FpuRegister reg) {
+  UNIMPLEMENTED();
+}
+
+
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_MIPS
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index b4da30b..48d2624 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -504,7 +504,10 @@
     __ pushq(RDX);  // Instantiator type arguments.
     __ LoadObject(RAX, test_cache);
     __ pushq(RAX);
-    GenerateCallRuntime(token_pos, deopt_id, kInstanceofRuntimeEntry, locs);
+    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);
@@ -624,14 +627,18 @@
   if (!is_optimizing()) {
     if (FLAG_enable_type_checks && instr->IsAssertAssignable()) {
       AssertAssignableInstr* assert = instr->AsAssertAssignable();
-      AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
+      AddCurrentDescriptor(PcDescriptors::kDeopt,
                            assert->deopt_id(),
                            assert->token_pos());
     } else if (instr->IsGuardField()) {
       GuardFieldInstr* guard = instr->AsGuardField();
-      AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
+      AddCurrentDescriptor(PcDescriptors::kDeopt,
                            guard->deopt_id(),
                            Scanner::kDummyTokenIndex);
+    } else if (instr->CanBeDeoptimizationTarget()) {
+      AddCurrentDescriptor(PcDescriptors::kDeopt,
+                           instr->deopt_id(),
+                           Scanner::kDummyTokenIndex);
     }
     AllocateRegistersLocally(instr);
   }
@@ -1094,14 +1101,13 @@
   RecordSafepoint(locs);
   // Marks either the continuation point in unoptimized code or the
   // deoptimization point in optimized code, after call.
+  const intptr_t deopt_id_after = Isolate::ToDeoptAfter(deopt_id);
   if (is_optimizing()) {
-    AddDeoptIndexAtCall(deopt_id, token_pos);
+    AddDeoptIndexAtCall(deopt_id_after, token_pos);
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    AddCurrentDescriptor(PcDescriptors::kDeoptAfter,
-                         deopt_id,
-                         token_pos);
+    AddCurrentDescriptor(PcDescriptors::kDeopt, deopt_id_after, token_pos);
   }
 }
 
@@ -1116,14 +1122,13 @@
   if (deopt_id != Isolate::kNoDeoptId) {
     // Marks either the continuation point in unoptimized code or the
     // deoptimization point in optimized code, after call.
+    const intptr_t deopt_id_after = Isolate::ToDeoptAfter(deopt_id);
     if (is_optimizing()) {
-      AddDeoptIndexAtCall(deopt_id, token_pos);
+      AddDeoptIndexAtCall(deopt_id_after, token_pos);
     } else {
       // Add deoptimization continuation point after the call and before the
       // arguments are removed.
-      AddCurrentDescriptor(PcDescriptors::kDeoptAfter,
-                           deopt_id,
-                           token_pos);
+      AddCurrentDescriptor(PcDescriptors::kDeopt, deopt_id_after, token_pos);
     }
   }
 }
@@ -1235,7 +1240,7 @@
   __ call(RAX);
   AddCurrentDescriptor(PcDescriptors::kOther, Isolate::kNoDeoptId, token_pos);
   RecordSafepoint(locs);
-  AddDeoptIndexAtCall(deopt_id, token_pos);
+  AddDeoptIndexAtCall(Isolate::ToDeoptAfter(deopt_id), token_pos);
   __ Drop(argument_count);
 }
 
@@ -1529,6 +1534,7 @@
     case 2: return TIMES_1;
     case 4: return TIMES_2;
     case 8: return TIMES_4;
+    case 16: return TIMES_8;
     default:
       UNREACHABLE();
       return TIMES_1;
@@ -1596,8 +1602,7 @@
       if (destination.IsDoubleStackSlot()) {
         __ movsd(destination.ToStackSlotAddress(), source.fpu_reg());
       } else {
-        ASSERT(destination.IsFloat32x4StackSlot() ||
-               destination.IsUint32x4StackSlot());
+        ASSERT(destination.IsQuadStackSlot());
         __ movups(destination.ToStackSlotAddress(), source.fpu_reg());
       }
     }
@@ -1609,12 +1614,11 @@
       __ movsd(XMM0, source.ToStackSlotAddress());
       __ movsd(destination.ToStackSlotAddress(), XMM0);
     }
-  } else if (source.IsFloat32x4StackSlot() || source.IsUint32x4StackSlot()) {
+  } else if (source.IsQuadStackSlot()) {
     if (destination.IsFpuRegister()) {
       __ movups(destination.fpu_reg(), source.ToStackSlotAddress());
     } else {
-      ASSERT(destination.IsFloat32x4StackSlot() ||
-             destination.IsUint32x4StackSlot());
+      ASSERT(destination.IsQuadStackSlot());
       __ movups(XMM0, source.ToStackSlotAddress());
       __ movups(destination.ToStackSlotAddress(), XMM0);
     }
@@ -1656,11 +1660,9 @@
     __ movaps(destination.fpu_reg(), XMM0);
   } else if (source.IsFpuRegister() || destination.IsFpuRegister()) {
     ASSERT(destination.IsDoubleStackSlot() ||
-           destination.IsFloat32x4StackSlot() ||
-           destination.IsUint32x4StackSlot() ||
+           destination.IsQuadStackSlot() ||
            source.IsDoubleStackSlot() ||
-           source.IsFloat32x4StackSlot() ||
-           source.IsUint32x4StackSlot());
+           source.IsQuadStackSlot());
     bool double_width = destination.IsDoubleStackSlot() ||
                         source.IsDoubleStackSlot();
     XmmRegister reg = source.IsFpuRegister() ? source.fpu_reg()
@@ -1677,6 +1679,24 @@
       __ movups(slot_address, reg);
     }
     __ movaps(reg, XMM0);
+  } else if (source.IsDoubleStackSlot() && destination.IsDoubleStackSlot()) {
+    const Address& source_slot_address = source.ToStackSlotAddress();
+    const Address& destination_slot_address = destination.ToStackSlotAddress();
+
+    ScratchFpuRegisterScope ensure_scratch(this, XMM0);
+    __ movsd(XMM0, source_slot_address);
+    __ movsd(ensure_scratch.reg(), destination_slot_address);
+    __ movsd(destination_slot_address, XMM0);
+    __ movsd(source_slot_address, ensure_scratch.reg());
+  } else if (source.IsQuadStackSlot() && destination.IsQuadStackSlot()) {
+    const Address& source_slot_address = source.ToStackSlotAddress();
+    const Address& destination_slot_address = destination.ToStackSlotAddress();
+
+    ScratchFpuRegisterScope ensure_scratch(this, XMM0);
+    __ movups(XMM0, source_slot_address);
+    __ movups(ensure_scratch.reg(), destination_slot_address);
+    __ movups(destination_slot_address, XMM0);
+    __ movups(source_slot_address, ensure_scratch.reg());
   } else {
     UNREACHABLE();
   }
@@ -1720,6 +1740,28 @@
 }
 
 
+void ParallelMoveResolver::SpillScratch(Register reg) {
+  __ pushq(reg);
+}
+
+
+void ParallelMoveResolver::RestoreScratch(Register reg) {
+  __ popq(reg);
+}
+
+
+void ParallelMoveResolver::SpillFpuScratch(FpuRegister reg) {
+  __ subq(RSP, Immediate(kFpuRegisterSize));
+  __ movups(Address(RSP, 0), reg);
+}
+
+
+void ParallelMoveResolver::RestoreFpuScratch(FpuRegister reg) {
+  __ movups(reg, Address(RSP, 0));
+  __ addq(RSP, Immediate(kFpuRegisterSize));
+}
+
+
 #undef __
 
 }  // namespace dart
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 91552ab..2956d0c 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -292,7 +292,7 @@
 
 class CallSiteInliner : public ValueObject {
  public:
-  explicit CallSiteInliner(FlowGraph* flow_graph)
+  CallSiteInliner(FlowGraph* flow_graph, GrowableArray<Field*>* guarded_fields)
       : caller_graph_(flow_graph),
         inlined_(false),
         initial_size_(flow_graph->InstructionCount()),
@@ -300,7 +300,8 @@
         inlining_depth_(1),
         collected_call_sites_(NULL),
         inlining_call_sites_(NULL),
-        function_cache_() { }
+        function_cache_(),
+        guarded_fields_(guarded_fields) { }
 
   // Inlining heuristics based on Cooper et al. 2008.
   bool ShouldWeInline(intptr_t instr_count,
@@ -438,7 +439,7 @@
       }
 
       // Build the callee graph.
-      InliningContext inlining_context;
+      InliningContext inlining_context(caller_graph_, call);
       FlowGraphBuilder builder(*parsed_function, &inlining_context);
       builder.SetInitialBlockId(caller_graph_->max_block_id());
       FlowGraph* callee_graph;
@@ -501,7 +502,7 @@
                          &CompilerStats::graphinliner_opt_timer,
                          isolate);
         // TODO(zerny): Do more optimization passes on the callee graph.
-        FlowGraphOptimizer optimizer(callee_graph);
+        FlowGraphOptimizer optimizer(callee_graph, guarded_fields_);
         optimizer.ApplyICData();
         DEBUG_ASSERT(callee_graph->VerifyUseLists());
       }
@@ -561,7 +562,7 @@
                          isolate);
 
         // Plug result in the caller graph.
-        inlining_context.ReplaceCall(caller_graph_, call, callee_graph);
+        inlining_context.ReplaceCall(callee_graph);
 
         // Replace each stub with the actual argument or the caller's constant.
         // Nulls denote optional parameters for which no actual was given.
@@ -834,6 +835,7 @@
   CallSites* collected_call_sites_;
   CallSites* inlining_call_sites_;
   GrowableArray<ParsedFunction*> function_cache_;
+  GrowableArray<Field*>* guarded_fields_;
 
   DISALLOW_COPY_AND_ASSIGN(CallSiteInliner);
 };
@@ -874,11 +876,11 @@
     printer.PrintBlocks();
   }
 
-  CallSiteInliner inliner(flow_graph_);
+  CallSiteInliner inliner(flow_graph_, guarded_fields_);
   inliner.InlineCalls();
 
   if (inliner.inlined()) {
-    flow_graph_->RepairGraphAfterInlining();
+    flow_graph_->DiscoverBlocks();
     if (FLAG_trace_inlining) {
       OS::Print("Inlining growth factor: %f\n", inliner.GrowthFactor());
       if (FLAG_print_flow_graph || FLAG_print_flow_graph_optimized) {
diff --git a/runtime/vm/flow_graph_inliner.h b/runtime/vm/flow_graph_inliner.h
index f95f8de..fd8c518 100644
--- a/runtime/vm/flow_graph_inliner.h
+++ b/runtime/vm/flow_graph_inliner.h
@@ -9,13 +9,14 @@
 
 namespace dart {
 
+class Field;
 class FlowGraph;
 template <typename T> class GrowableArray;
 
 class FlowGraphInliner : ValueObject {
  public:
-  explicit FlowGraphInliner(FlowGraph* flow_graph)
-      : flow_graph_(flow_graph) {}
+  FlowGraphInliner(FlowGraph* flow_graph, GrowableArray<Field*>* guarded_fields)
+      : flow_graph_(flow_graph), guarded_fields_(guarded_fields) {}
 
   // The flow graph is destructively updated upon inlining.
   void Inline();
@@ -24,6 +25,8 @@
 
  private:
   FlowGraph* flow_graph_;
+  GrowableArray<Field*>* guarded_fields_;
+
   DISALLOW_COPY_AND_ASSIGN(FlowGraphInliner);
 };
 
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index bcd752c..404caab 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -21,9 +21,6 @@
 
 DEFINE_FLAG(bool, array_bounds_check_elimination, true,
     "Eliminate redundant bounds checks.");
-// TODO(srdjan): Enable/remove flag once it works.
-DEFINE_FLAG(bool, inline_getter_with_guarded_cid, false,
-    "Inline implict getter using guarded cid");
 DEFINE_FLAG(bool, load_cse, true, "Use redundant load elimination.");
 DEFINE_FLAG(int, max_polymorphic_checks, 4,
     "Maximum number of polymorphic check, otherwise it is megamorphic.");
@@ -348,7 +345,7 @@
     converted = new UnboxDoubleInstr(new Value(boxed), deopt_id);
 
   } else if ((from == kUnboxedDouble) && (to == kTagged)) {
-    converted = new BoxDoubleInstr(use->CopyWithType(), NULL);
+    converted = new BoxDoubleInstr(use->CopyWithType());
 
   } else if ((from == kTagged) && (to == kUnboxedDouble)) {
     ASSERT((deopt_target != NULL) ||
@@ -366,6 +363,14 @@
     } else {
       converted = new UnboxDoubleInstr(use->CopyWithType(), deopt_id);
     }
+  } else if ((from == kTagged) && (to == kUnboxedFloat32x4)) {
+    ASSERT((deopt_target != NULL) ||
+           (use->Type()->ToCid() == kFloat32x4Cid));
+    const intptr_t deopt_id = (deopt_target != NULL) ?
+        deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
+    converted = new UnboxFloat32x4Instr(use->CopyWithType(), deopt_id);
+  } else if ((from == kUnboxedFloat32x4) && (to == kTagged)) {
+    converted = new BoxFloat32x4Instr(use->CopyWithType());
   }
   ASSERT(converted != NULL);
   use->BindTo(converted);
@@ -766,6 +771,15 @@
       }
       break;
     }
+    case kTypedDataFloat32x4ArrayCid: {
+      // Check that value is always a Float32x4.
+      value_check = call->ic_data()->AsUnaryClassChecksForArgNr(2);
+      if ((value_check.NumberOfChecks() != 1) ||
+          (value_check.GetReceiverClassIdAt(0) != kFloat32x4Cid)) {
+          return false;
+      }
+    }
+    break;
     default:
       // TODO(fschneider): Add support for other array types.
       return false;
@@ -827,6 +841,13 @@
         ASSERT(value_type.IsInstantiated());
         break;
       }
+      case kTypedDataFloat32x4ArrayCid: {
+        type_args = instantiator = flow_graph_->constant_null();
+        ASSERT((class_id != kTypedDataFloat32x4ArrayCid) ||
+               value_type.IsFloat32x4Type());
+        ASSERT(value_type.IsInstantiated());
+        break;
+      }
       default:
         // TODO(fschneider): Add support for other array types.
         UNREACHABLE();
@@ -853,8 +874,8 @@
        RawObject::IsExternalTypedDataClassId(array_cid)) ? kNoStoreBarrier
                                                          : kEmitStoreBarrier;
   if (!value_check.IsNull()) {
-    // No store barrier needed because checked value is a smi, an unboxed mint
-    // or unboxed double.
+    // No store barrier needed because checked value is a smi, an unboxed mint,
+    // an unboxed double, an unboxed Float32x4, or unboxed Uint32x4.
     needs_store_barrier = kNoStoreBarrier;
     AddCheckClass(stored_value, value_check, call->deopt_id(), call->env(),
                   call);
@@ -883,6 +904,7 @@
     case kGrowableObjectArrayCid:
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
+    case kTypedDataFloat32x4ArrayCid:
     case kTypedDataInt8ArrayCid:
     case kTypedDataUint8ArrayCid:
     case kTypedDataUint8ClampedArrayCid:
@@ -1177,6 +1199,20 @@
 }
 
 
+void FlowGraphOptimizer::AddToGuardedFields(Field* field) {
+  if ((field->guarded_cid() == kDynamicCid) ||
+      (field->guarded_cid() == kIllegalCid)) {
+    return;
+  }
+  for (intptr_t j = 0; j < guarded_fields_->length(); j++) {
+    if ((*guarded_fields_)[j]->raw() == field->raw()) {
+      return;
+    }
+  }
+  guarded_fields_->Add(field);
+}
+
+
 void FlowGraphOptimizer::InlineImplicitInstanceGetter(InstanceCallInstr* call) {
   ASSERT(call->HasICData());
   const ICData& ic_data = *call->ic_data();
@@ -1202,7 +1238,9 @@
     if (!field.is_nullable() || (field.guarded_cid() == kNullCid)) {
       load->set_result_cid(field.guarded_cid());
     }
-    load->set_field(&Field::ZoneHandle(field.raw()));
+    Field* the_field = &Field::ZoneHandle(field.raw());
+    load->set_field(the_field);
+    AddToGuardedFields(the_field);
   }
   load->set_field_name(String::Handle(field.name()).ToCString());
 
@@ -1211,14 +1249,12 @@
   call->RemoveEnvironment();
   ReplaceCall(call, load);
 
-  if (FLAG_inline_getter_with_guarded_cid) {
-    if (load->result_cid() != kDynamicCid) {
-      // Reset value types if guarded_cid was used.
-      for (Value::Iterator it(load->input_use_list());
-           !it.Done();
-           it.Advance()) {
-        it.Current()->SetReachingType(NULL);
-      }
+  if (load->result_cid() != kDynamicCid) {
+    // Reset value types if guarded_cid was used.
+    for (Value::Iterator it(load->input_use_list());
+         !it.Done();
+         it.Advance()) {
+      it.Current()->SetReachingType(NULL);
     }
   }
 }
@@ -1459,6 +1495,7 @@
     case kTypedDataUint32ArrayCid:
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
+    case kTypedDataFloat32x4ArrayCid:
       return true;
     default:
       return false;
@@ -1592,6 +1629,9 @@
       case MethodRecognizer::kByteArrayBaseGetFloat64:
         return BuildByteArrayViewLoad(
             call, class_ids[0], kTypedDataFloat64ArrayCid);
+      case MethodRecognizer::kByteArrayBaseGetFloat32x4:
+        return BuildByteArrayViewLoad(
+            call, class_ids[0], kTypedDataFloat32x4ArrayCid);
 
       // ByteArray setters.
       case MethodRecognizer::kByteArrayBaseSetInt8:
@@ -1618,6 +1658,9 @@
       case MethodRecognizer::kByteArrayBaseSetFloat64:
         return BuildByteArrayViewStore(
             call, class_ids[0], kTypedDataFloat64ArrayCid);
+      case MethodRecognizer::kByteArrayBaseSetFloat32x4:
+        return BuildByteArrayViewStore(
+            call, class_ids[0], kTypedDataFloat32x4ArrayCid);
       default:
         // Unsupported method.
         return false;
@@ -1700,6 +1743,15 @@
       value_check.AddReceiverCheck(kDoubleCid, Function::Handle());
       break;
     }
+    case kTypedDataFloat32x4ArrayCid: {
+      // Check that value is always Float32x4.
+      value_check = ICData::New(Function::Handle(),
+                                String::Handle(),
+                                Isolate::kNoDeoptId,
+                                1);
+      value_check.AddReceiverCheck(kFloat32x4Cid, Function::Handle());
+      break;
+    }
     default:
       // Array cids are already checked in the caller.
       UNREACHABLE();
@@ -1846,7 +1898,8 @@
                           new Value(instantiator),
                           new Value(type_args),
                           type,
-                          negate);
+                          negate,
+                          call->deopt_id());
   ReplaceCall(call, instance_of);
 }
 
@@ -1886,6 +1939,9 @@
                                 new Value(type_args),
                                 type,
                                 dst_name);
+  // Newly inserted instructions that can deoptimize or throw an exception
+  // must have a deoptimization id that is valid for lookup in the unoptimized
+  // code.
   assert_as->deopt_id_ = call->deopt_id();
   ReplaceCall(call, assert_as);
 }
@@ -3919,6 +3975,39 @@
 }
 
 
+void ConstantPropagator::VisitIfThenElse(IfThenElseInstr* instr) {
+  ASSERT(Token::IsEqualityOperator(instr->kind()));
+
+  const Object& left = instr->left()->definition()->constant_value();
+  const Object& right = instr->right()->definition()->constant_value();
+
+  if (IsNonConstant(left) || IsNonConstant(right)) {
+    // TODO(vegorov): incorporate nullability information into the lattice.
+    if ((left.IsNull() && instr->right()->Type()->HasDecidableNullability()) ||
+        (right.IsNull() && instr->left()->Type()->HasDecidableNullability())) {
+      bool result = left.IsNull() ? instr->right()->Type()->IsNull()
+                                  : instr->left()->Type()->IsNull();
+      if (instr->kind() == Token::kNE_STRICT ||
+          instr->kind() == Token::kNE) {
+        result = !result;
+      }
+      SetValue(instr, Smi::Handle(
+          Smi::New(result ? instr->if_true() : instr->if_false())));
+    } else {
+      SetValue(instr, non_constant_);
+    }
+  } else if (IsConstant(left) && IsConstant(right)) {
+    bool result = (left.raw() == right.raw());
+    if (instr->kind() == Token::kNE_STRICT ||
+        instr->kind() == Token::kNE) {
+      result = !result;
+    }
+    SetValue(instr, Smi::Handle(
+        Smi::New(result ? instr->if_true() : instr->if_false())));
+  }
+}
+
+
 void ConstantPropagator::VisitStrictCompare(StrictCompareInstr* instr) {
   const Object& left = instr->left()->definition()->constant_value();
   const Object& right = instr->right()->definition()->constant_value();
@@ -4343,6 +4432,28 @@
 }
 
 
+void ConstantPropagator::VisitUnboxFloat32x4(UnboxFloat32x4Instr* instr) {
+  const Object& value = instr->value()->definition()->constant_value();
+  if (IsNonConstant(value)) {
+    SetValue(instr, non_constant_);
+  } else if (IsConstant(value)) {
+    // TODO(kmillikin): Handle conversion.
+    SetValue(instr, non_constant_);
+  }
+}
+
+
+void ConstantPropagator::VisitBoxFloat32x4(BoxFloat32x4Instr* instr) {
+  const Object& value = instr->value()->definition()->constant_value();
+  if (IsNonConstant(value)) {
+    SetValue(instr, non_constant_);
+  } else if (IsConstant(value)) {
+    // TODO(kmillikin): Handle conversion.
+    SetValue(instr, non_constant_);
+  }
+}
+
+
 void ConstantPropagator::Analyze() {
   GraphEntryInstr* entry = graph_->graph_entry();
   reachable_->Add(entry->preorder_number());
@@ -4428,6 +4539,7 @@
           it.Current()->UnuseAllInputs();
         }
       }
+      block->UnuseAllInputs();
       for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
         it.Current()->UnuseAllInputs();
       }
@@ -4520,11 +4632,15 @@
         ASSERT(if_false->parallel_move() == NULL);
         ASSERT(if_false->loop_info() == NULL);
         join = new JoinEntryInstr(if_false->block_id(), if_false->try_index());
+        join->InheritDeoptTarget(if_false);
+        if_false->UnuseAllInputs();
         next = if_false->next();
       } else if (!reachable_->Contains(if_false->preorder_number())) {
         ASSERT(if_true->parallel_move() == NULL);
         ASSERT(if_true->loop_info() == NULL);
         join = new JoinEntryInstr(if_true->block_id(), if_true->try_index());
+        join->InheritDeoptTarget(if_true);
+        if_true->UnuseAllInputs();
         next = if_true->next();
       }
 
@@ -4534,9 +4650,12 @@
         // as it is a strict compare (the only one we can determine is
         // constant with the current analysis).
         GotoInstr* jump = new GotoInstr(join);
+        jump->InheritDeoptTarget(branch);
+
         Instruction* previous = branch->previous();
         branch->set_previous(NULL);
         previous->LinkTo(jump);
+
         // Replace the false target entry with the new join entry. We will
         // recompute the dominators after this pass.
         join->LinkTo(next);
@@ -4557,6 +4676,28 @@
 }
 
 
+// Returns true if the given phi has a single input use and
+// is used in the environments either at the corresponding block entry or
+// at the same instruction where input use is.
+static bool PhiHasSingleUse(PhiInstr* phi, Value* use) {
+  if ((use->next_use() != NULL) || (phi->input_use_list() != use)) {
+    return false;
+  }
+
+  BlockEntryInstr* block = phi->block();
+  for (Value* env_use = phi->env_use_list();
+       env_use != NULL;
+       env_use = env_use->next_use()) {
+    if ((env_use->instruction() != block) &&
+        (env_use->instruction() != use->instruction())) {
+      return false;
+    }
+  }
+
+  return true;
+}
+
+
 bool BranchSimplifier::Match(JoinEntryInstr* block) {
   // Match the pattern of a branch on a comparison whose left operand is a
   // phi from the same block, and whose right operand is a constant.
@@ -4578,7 +4719,7 @@
   return (phi != NULL) &&
       (constant != NULL) &&
       (phi->GetBlock() == block) &&
-      phi->HasOnlyUse(left) &&
+      PhiHasSingleUse(phi, left) &&
       constant->HasOnlyUse(right) &&
       (block->next() == constant) &&
       (constant->next() == branch) &&
@@ -4592,8 +4733,10 @@
   // from all the duplicated branches.
   JoinEntryInstr* join =
       new JoinEntryInstr(target->block_id(), target->try_index());
+  join->InheritDeoptTarget(target);
   join->LinkTo(target->next());
   join->set_last_instruction(target->last_instruction());
+  target->UnuseAllInputs();
   return join;
 }
 
@@ -4614,18 +4757,24 @@
   if (comparison->IsStrictCompare()) {
     new_comparison = new StrictCompareInstr(comparison->kind(), left, right);
   } else if (comparison->IsEqualityCompare()) {
-    new_comparison =
-        new EqualityCompareInstr(comparison->AsEqualityCompare()->token_pos(),
+    EqualityCompareInstr* equality_compare = comparison->AsEqualityCompare();
+    EqualityCompareInstr* new_equality_compare =
+        new EqualityCompareInstr(equality_compare->token_pos(),
                                  comparison->kind(),
                                  left,
                                  right);
+    new_equality_compare->set_ic_data(equality_compare->ic_data());
+    new_comparison = new_equality_compare;
   } else {
     ASSERT(comparison->IsRelationalOp());
-    new_comparison =
-        new RelationalOpInstr(comparison->AsRelationalOp()->token_pos(),
+    RelationalOpInstr* relational_op = comparison->AsRelationalOp();
+    RelationalOpInstr* new_relational_op =
+        new RelationalOpInstr(relational_op->token_pos(),
                               comparison->kind(),
                               left,
                               right);
+    new_relational_op->set_ic_data(relational_op->ic_data());
+    new_comparison = new_relational_op;
   }
   return new BranchInstr(new_comparison, branch->is_checked());
 }
@@ -4694,6 +4843,7 @@
         Value* new_left = phi->InputAt(i)->Copy();
         Value* new_right = new Value(new_constant);
         BranchInstr* new_branch = CloneBranch(branch, new_left, new_right);
+        new_branch->InheritDeoptTarget(old_goto);
         new_branch->InsertBefore(old_goto);
         new_branch->set_next(NULL);  // Detaching the goto from the graph.
         old_goto->UnuseAllInputs();
@@ -4709,16 +4859,20 @@
         TargetEntryInstr* true_target =
             new TargetEntryInstr(flow_graph->max_block_id() + 1,
                                  block->try_index());
+        true_target->InheritDeoptTarget(join_true);
         TargetEntryInstr* false_target =
             new TargetEntryInstr(flow_graph->max_block_id() + 2,
                                  block->try_index());
+        false_target->InheritDeoptTarget(join_false);
         flow_graph->set_max_block_id(flow_graph->max_block_id() + 2);
         *new_branch->true_successor_address() = true_target;
         *new_branch->false_successor_address() = false_target;
         GotoInstr* goto_true = new GotoInstr(join_true);
+        goto_true->InheritDeoptTarget(join_true);
         true_target->LinkTo(goto_true);
         true_target->set_last_instruction(goto_true);
         GotoInstr* goto_false = new GotoInstr(join_false);
+        goto_false->InheritDeoptTarget(join_false);
         false_target->LinkTo(goto_false);
         false_target->set_last_instruction(goto_false);
       }
@@ -4726,6 +4880,136 @@
       // unreachable from the graph.
       phi->UnuseAllInputs();
       branch->UnuseAllInputs();
+      block->UnuseAllInputs();
+    }
+  }
+
+  if (changed) {
+    // We may have changed the block order and the dominator tree.
+    flow_graph->DiscoverBlocks();
+    GrowableArray<BitVector*> dominance_frontier;
+    flow_graph->ComputeDominators(&dominance_frontier);
+  }
+}
+
+
+static bool IsTrivialBlock(BlockEntryInstr* block, Definition* defn) {
+  return (block->IsTargetEntry() && (block->PredecessorCount() == 1)) &&
+    ((block->next() == block->last_instruction()) ||
+     ((block->next() == defn) && (defn->next() == block->last_instruction())));
+}
+
+
+static void EliminateTrivialBlock(BlockEntryInstr* block,
+                                  Definition* instr,
+                                  IfThenElseInstr* before) {
+  block->UnuseAllInputs();
+  block->last_instruction()->UnuseAllInputs();
+
+  if ((block->next() == instr) &&
+      (instr->next() == block->last_instruction())) {
+    before->previous()->LinkTo(instr);
+    instr->LinkTo(before);
+  }
+}
+
+
+void IfConverter::Simplify(FlowGraph* flow_graph) {
+  if (!IfThenElseInstr::IsSupported()) {
+    return;
+  }
+
+  bool changed = false;
+
+  const GrowableArray<BlockEntryInstr*>& postorder = flow_graph->postorder();
+  for (BlockIterator it(postorder); !it.Done(); it.Advance()) {
+    BlockEntryInstr* block = it.Current();
+    JoinEntryInstr* join = block->AsJoinEntry();
+
+    // Detect diamond control flow pattern which materializes a value depending
+    // on the result of the comparison:
+    //
+    // B_pred:
+    //   ...
+    //   Branch if COMP goto (B_pred1, B_pred2)
+    // B_pred1: -- trivial block that contains at most one definition
+    //   v1 = Constant(...)
+    //   goto B_block
+    // B_pred2: -- trivial block that contains at most one definition
+    //   v2 = Constant(...)
+    //   goto B_block
+    // B_block:
+    //   v3 = phi(v1, v2) -- single phi
+    //
+    // and replace it with
+    //
+    // Ba:
+    //   v3 = IfThenElse(COMP ? v1 : v2)
+    //
+    if ((join != NULL) &&
+        (join->phis() != NULL) &&
+        (join->phis()->length() == 1) &&
+        (block->PredecessorCount() == 2)) {
+      BlockEntryInstr* pred1 = block->PredecessorAt(0);
+      BlockEntryInstr* pred2 = block->PredecessorAt(1);
+
+      PhiInstr* phi = (*join->phis())[0];
+      Value* v1 = phi->InputAt(0);
+      Value* v2 = phi->InputAt(1);
+
+      if (IsTrivialBlock(pred1, v1->definition()) &&
+          IsTrivialBlock(pred2, v2->definition()) &&
+          (pred1->PredecessorAt(0) == pred2->PredecessorAt(0))) {
+        BlockEntryInstr* pred = pred1->PredecessorAt(0);
+        BranchInstr* branch = pred->last_instruction()->AsBranch();
+        ComparisonInstr* comparison = branch->comparison();
+
+        // Check if the platform supports efficient branchless IfThenElseInstr
+        // for the given combination of comparison and values flowing from
+        // false and true paths.
+        if (IfThenElseInstr::Supports(comparison, v1, v2)) {
+          Value* if_true = (pred1 == branch->true_successor()) ? v1 : v2;
+          Value* if_false = (pred2 == branch->true_successor()) ? v1 : v2;
+
+          IfThenElseInstr* if_then_else = new IfThenElseInstr(
+              comparison->kind(),
+              comparison->InputAt(0)->Copy(),
+              comparison->InputAt(1)->Copy(),
+              if_true->Copy(),
+              if_false->Copy());
+          flow_graph->InsertBefore(branch,
+                                   if_then_else,
+                                   NULL,
+                                   Definition::kValue);
+
+          phi->ReplaceUsesWith(if_then_else);
+
+          // Connect IfThenElseInstr to the first instruction in the merge block
+          // effectively eliminating diamond control flow.
+          // Current block as well as pred1 and pred2 blocks are no longer in
+          // the graph at this point.
+          if_then_else->LinkTo(join->next());
+          pred->set_last_instruction(join->last_instruction());
+
+          // Resulting block must inherit block id from the eliminated current
+          // block to guarantee that ordering of phi operands in its successor
+          // stays consistent.
+          pred->set_block_id(block->block_id());
+
+          // If v1 and v2 were defined inside eliminated blocks pred1/pred2
+          // move them out to the place before inserted IfThenElse instruction.
+          EliminateTrivialBlock(pred1, v1->definition(), if_then_else);
+          EliminateTrivialBlock(pred2, v2->definition(), if_then_else);
+
+          // Update use lists to reflect changes in the graph.
+          phi->UnuseAllInputs();
+          branch->UnuseAllInputs();
+
+          // The graph has changed. Recompute dominators and block orders after
+          // this pass is finished.
+          changed = true;
+        }
+      }
     }
   }
 
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index 03d623d..1b48ac2 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -16,9 +16,11 @@
 
 class FlowGraphOptimizer : public FlowGraphVisitor {
  public:
-  explicit FlowGraphOptimizer(FlowGraph* flow_graph)
+  FlowGraphOptimizer(FlowGraph* flow_graph,
+                     GrowableArray<Field*>* guarded_fields)
       : FlowGraphVisitor(flow_graph->reverse_postorder()),
-        flow_graph_(flow_graph) { }
+        flow_graph_(flow_graph),
+        guarded_fields_(guarded_fields) { }
   virtual ~FlowGraphOptimizer() {}
 
   FlowGraph* flow_graph() const { return flow_graph_; }
@@ -157,7 +159,10 @@
                                     Definition* left_instr,
                                     Definition* right_instr);
 
+  void AddToGuardedFields(Field* field);
+
   FlowGraph* flow_graph_;
+  GrowableArray<Field*>* guarded_fields_;
 
   DISALLOW_COPY_AND_ASSIGN(FlowGraphOptimizer);
 };
@@ -299,6 +304,15 @@
 };
 
 
+// Rewrite diamond control flow patterns that materialize values to use more
+// efficient branchless code patterns if such are supported on the current
+// platform.
+class IfConverter : public AllStatic {
+ public:
+  static void Simplify(FlowGraph* flow_graph);
+};
+
+
 }  // namespace dart
 
 #endif  // VM_FLOW_GRAPH_OPTIMIZER_H_
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index 52fd2e2..2e5abea 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -645,6 +645,12 @@
 }
 
 
+CompileType IfThenElseInstr::ComputeType() const {
+  ASSERT(InputCount() == 2);
+  return CompileType::FromCid(kSmiCid);
+}
+
+
 CompileType ParameterInstr::ComputeType() const {
   // Note that returning the declared type of the formal parameter would be
   // incorrect, because ParameterInstr is used as input to the type check
@@ -971,6 +977,16 @@
 }
 
 
+CompileType UnboxFloat32x4Instr::ComputeType() const {
+  return CompileType::FromCid(kFloat32x4Cid);
+}
+
+
+CompileType BoxFloat32x4Instr::ComputeType() const {
+  return CompileType::FromCid(kFloat32x4Cid);
+}
+
+
 CompileType SmiToDoubleInstr::ComputeType() const {
   return CompileType::FromCid(kDoubleCid);
 }
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index cb6b005..1465a83 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -429,6 +429,16 @@
 }
 
 
+void IfThenElseInstr::PrintOperandsTo(BufferFormatter* f) const {
+  left()->PrintTo(f);
+  f->Print(" %s ", Token::Str(kind_));
+  right()->PrintTo(f);
+  f->Print(" ? %"Pd" : %"Pd,
+           if_true_,
+           if_false_);
+}
+
+
 void LoadStaticFieldInstr::PrintOperandsTo(BufferFormatter* f) const {
   f->Print("%s", String::Handle(field().name()).ToCString());
 }
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 292d6aa..71acde1 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -510,11 +510,11 @@
 
 
 bool Definition::HasOnlyUse(Value* use) const {
-  if (((input_use_list() == use) && (env_use_list() == NULL)) ||
-      ((input_use_list() == NULL) && (env_use_list() == use))) {
-    return (use->next_use() == NULL);
-  }
-  return false;
+  return (input_use_list() == use) &&
+     (use->next_use() == NULL) &&
+     ((env_use_list() == NULL) ||
+      ((env_use_list()->instruction() == use->instruction()) &&
+       (env_use_list()->next_use() == NULL)));
 }
 
 
@@ -568,6 +568,28 @@
 }
 
 
+void Instruction::InheritDeoptTargetAfter(Instruction* other) {
+  ASSERT(other->env() != NULL);
+  deopt_id_ = Isolate::ToDeoptAfter(other->deopt_id_);
+  other->env()->DeepCopyTo(this);
+  env()->set_deopt_id(deopt_id_);
+}
+
+
+void Instruction::InheritDeoptTarget(Instruction* other) {
+  ASSERT(other->env() != NULL);
+  deopt_id_ = other->deopt_id_;
+  other->env()->DeepCopyTo(this);
+  env()->set_deopt_id(deopt_id_);
+}
+
+
+void BranchInstr::InheritDeoptTarget(Instruction* other) {
+  Instruction::InheritDeoptTarget(other);
+  comparison()->SetDeoptId(GetDeoptId());
+}
+
+
 void Definition::ReplaceWith(Definition* other,
                              ForwardInstructionIterator* iterator) {
   // Record other's input uses.
@@ -1260,9 +1282,11 @@
 
     // Replace the comparison if the replacement is used at this branch,
     // and has exactly one use.
-    if ((comp->input_use_list()->instruction() == this) &&
-        (comp->input_use_list()->next_use() == NULL) &&
-        (comp->env_use_list() == NULL)) {
+    Value* use = comp->input_use_list();
+    if ((use->instruction() == this) && comp->HasOnlyUse(use)) {
+      RemoveEnvironment();
+      InheritDeoptTarget(comp);
+
       comp->RemoveFromGraph();
       SetComparison(comp);
       if (FLAG_trace_optimization) {
@@ -1378,6 +1402,11 @@
 
 
 void JoinEntryInstr::PrepareEntry(FlowGraphCompiler* compiler) {
+  if (!compiler->is_optimizing()) {
+    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+                                   deopt_id_,
+                                   Scanner::kDummyTokenIndex);
+  }
   __ Bind(compiler->GetJumpLabel(this));
   if (HasParallelMove()) {
     compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
@@ -1386,6 +1415,11 @@
 
 
 void TargetEntryInstr::PrepareEntry(FlowGraphCompiler* compiler) {
+  if (!compiler->is_optimizing()) {
+    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+                                   deopt_id_,
+                                   Scanner::kDummyTokenIndex);
+  }
   __ Bind(compiler->GetJumpLabel(this));
   if (HasParallelMove()) {
     compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
@@ -1553,7 +1587,7 @@
   } else {
     // Unoptimized code.
     ASSERT(!HasICData());
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
+    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
                                    deopt_id(),
                                    token_pos());
     compiler->GenerateInstanceCall(deopt_id(),
@@ -1576,7 +1610,7 @@
   if (!compiler->is_optimizing()) {
     // Some static calls can be optimized by the optimizing compiler (e.g. sqrt)
     // and therefore need a deoptimization descriptor.
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
+    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
                                    deopt_id(),
                                    token_pos());
   }
@@ -2039,6 +2073,14 @@
 }
 
 
+void IfThenElseInstr::InferRange() {
+  const intptr_t min = Utils::Minimum(if_true_, if_false_);
+  const intptr_t max = Utils::Maximum(if_true_, if_false_);
+  range_ = new Range(RangeBoundary::FromConstant(min),
+                     RangeBoundary::FromConstant(max));
+}
+
+
 void PhiInstr::InferRange() {
   RangeBoundary new_min;
   RangeBoundary new_max;
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index ac497ff..9ac45c1 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -46,6 +46,7 @@
   V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 380843687)                 \
   V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 979971573)               \
   V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 979971573)               \
+  V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 690339584)           \
   V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 287047804)                     \
   V(_TypedList, _setUint8, ByteArrayBaseSetUint8, 287047804)                   \
   V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 287047804)                   \
@@ -54,6 +55,7 @@
   V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 287047804)                 \
   V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1032541114)              \
   V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 1032541114)              \
+  V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 1016704782)          \
   V(_GrowableObjectArray, get:length, GrowableArrayLength, 725548050)          \
   V(_GrowableObjectArray, get:_capacity, GrowableArrayCapacity, 725548050)     \
   V(_StringBase, get:length, StringBaseLength, 320803993)                      \
@@ -489,6 +491,8 @@
   M(MathSqrt)                                                                  \
   M(UnboxDouble)                                                               \
   M(BoxDouble)                                                                 \
+  M(BoxFloat32x4)                                                              \
+  M(UnboxFloat32x4)                                                            \
   M(UnboxInteger)                                                              \
   M(BoxInteger)                                                                \
   M(BinaryMintOp)                                                              \
@@ -499,7 +503,7 @@
   M(StringFromCharCode)                                                        \
   M(InvokeMathCFunction)                                                       \
   M(GuardField)                                                                \
-
+  M(IfThenElse)                                                                \
 
 #define FORWARD_DECLARATION(type) class type##Instr;
 FOR_EACH_INSTRUCTION(FORWARD_DECLARATION)
@@ -535,7 +539,7 @@
   virtual Tag tag() const = 0;
 
   intptr_t deopt_id() const {
-    ASSERT(CanDeoptimize());
+    ASSERT(CanDeoptimize() || CanBeDeoptimizationTarget());
     return deopt_id_;
   }
 
@@ -728,6 +732,18 @@
     return false;
   }
 
+  virtual void InheritDeoptTarget(Instruction* other);
+
+  bool NeedsEnvironment() const {
+    return CanDeoptimize() || CanBeDeoptimizationTarget();
+  }
+
+  virtual bool CanBeDeoptimizationTarget() const {
+    return false;
+  }
+
+  void InheritDeoptTargetAfter(Instruction* other);
+
  protected:
   // Fetch deopt id without checking if this computation can deoptimize.
   intptr_t GetDeoptId() const {
@@ -740,6 +756,7 @@
   // Classes that set deopt_id_.
   friend class UnboxIntegerInstr;
   friend class UnboxDoubleInstr;
+  friend class UnboxFloat32x4Instr;
   friend class BinaryDoubleOpInstr;
   friend class BinaryMintOpInstr;
   friend class BinarySmiOpInstr;
@@ -760,6 +777,11 @@
   friend class LoadIndexedInstr;
   friend class StoreIndexedInstr;
   friend class StoreInstanceFieldInstr;
+  friend class ControlInstruction;
+  friend class ComparisonInstr;
+  friend class TargetEntryInstr;
+  friend class JoinEntryInstr;
+  friend class InstanceOfInstr;
 
   virtual void RawSetInputAt(intptr_t i, Value* value) = 0;
 
@@ -981,6 +1003,12 @@
 
   virtual intptr_t ArgumentCount() const { return 0; }
 
+  virtual bool CanBeDeoptimizationTarget() const {
+    // BlockEntry environment is copied to Goto and Branch instructions
+    // when we insert new blocks targeting this block.
+    return true;
+  }
+
   virtual bool CanDeoptimize() const { return false; }
 
   virtual bool HasSideEffect() const { return false; }
@@ -1001,6 +1029,8 @@
   // successors.
   void ReplaceAsPredecessorWith(BlockEntryInstr* new_block);
 
+  void set_block_id(intptr_t block_id) { block_id_ = block_id; }
+
  protected:
   BlockEntryInstr(intptr_t block_id, intptr_t try_index)
       : block_id_(block_id),
@@ -1019,7 +1049,7 @@
   virtual void ClearPredecessors() = 0;
   virtual void AddPredecessor(BlockEntryInstr* predecessor) = 0;
 
-  const intptr_t block_id_;
+  intptr_t block_id_;
   const intptr_t try_index_;
   intptr_t preorder_number_;
   intptr_t postorder_number_;
@@ -1653,6 +1683,12 @@
   intptr_t token_pos() const { return token_pos_; }
   Value* value() const { return inputs_[0]; }
 
+  virtual bool CanBeDeoptimizationTarget() const {
+    // Return instruction might turn into a Goto instruction after inlining.
+    // Every Goto must have an environment.
+    return true;
+  }
+
   virtual bool CanDeoptimize() const { return false; }
 
   virtual bool HasSideEffect() const { return false; }
@@ -1721,6 +1757,12 @@
   virtual intptr_t SuccessorCount() const;
   virtual BlockEntryInstr* SuccessorAt(intptr_t index) const;
 
+  virtual bool CanBeDeoptimizationTarget() const {
+    // Goto instruction can be used as a deoptimization target when LICM
+    // hoists instructions out of the loop.
+    return true;
+  }
+
   virtual bool CanDeoptimize() const { return false; }
 
   virtual bool HasSideEffect() const { return false; }
@@ -1789,6 +1831,7 @@
   intptr_t InputCount() const;
   Value* InputAt(intptr_t i) const;
   virtual bool CanDeoptimize() const;
+  virtual bool CanBeDeoptimizationTarget() const;
 
   virtual bool HasSideEffect() const;
 
@@ -1833,6 +1876,8 @@
     return constant_target_;
   }
 
+  virtual void InheritDeoptTarget(Instruction* other);
+
  private:
   virtual void RawSetInputAt(intptr_t i, Value* value);
 
@@ -2446,6 +2491,10 @@
   virtual void EmitBranchCode(FlowGraphCompiler* compiler,
                               BranchInstr* branch) = 0;
 
+  void SetDeoptId(intptr_t deopt_id) {
+    deopt_id_ = deopt_id;
+  }
+
  protected:
   Token::Kind kind_;
 };
@@ -2474,6 +2523,11 @@
 }
 
 
+inline bool BranchInstr::CanBeDeoptimizationTarget() const {
+  return comparison()->CanBeDeoptimizationTarget();
+}
+
+
 inline bool BranchInstr::HasSideEffect() const {
   return comparison()->HasSideEffect();
 }
@@ -2510,6 +2564,11 @@
 
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
+  virtual bool CanBeDeoptimizationTarget() const {
+    // StrictCompare can be merged into Branch and thus needs an environment.
+    return true;
+  }
+
   virtual bool CanDeoptimize() const { return false; }
 
   virtual bool HasSideEffect() const { return false; }
@@ -2557,6 +2616,7 @@
   bool HasICData() const {
     return (ic_data() != NULL) && !ic_data()->IsNull();
   }
+  void set_ic_data(const ICData* value) { ic_data_ = value; }
 
   intptr_t token_pos() const { return token_pos_; }
 
@@ -2627,6 +2687,7 @@
   bool HasICData() const {
     return (ic_data() != NULL) && !ic_data()->IsNull();
   }
+  void set_ic_data(const ICData* value) { ic_data_ = value; }
 
   intptr_t token_pos() const { return token_pos_; }
 
@@ -2677,6 +2738,65 @@
 };
 
 
+// TODO(vegorov): ComparisonInstr should be switched to use IfTheElseInstr for
+// materialization of true and false constants.
+class IfThenElseInstr : public TemplateDefinition<2> {
+ public:
+  IfThenElseInstr(Token::Kind kind,
+                  Value* left,
+                  Value* right,
+                  Value* if_true,
+                  Value* if_false)
+      : kind_(kind),
+        if_true_(Smi::Cast(if_true->BoundConstant()).Value()),
+        if_false_(Smi::Cast(if_false->BoundConstant()).Value()) {
+    ASSERT(Token::IsEqualityOperator(kind));
+    SetInputAt(0, left);
+    SetInputAt(1, right);
+  }
+
+  // Returns true if this instruction is supported on the current platform.
+  static bool IsSupported();
+
+  // Returns true if this combination of comparison and values flowing on
+  // the true and false paths is supported on the current platform.
+  static bool Supports(ComparisonInstr* comparison, Value* v1, Value* v2);
+
+  DECLARE_INSTRUCTION(IfThenElse)
+
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+  virtual CompileType ComputeType() const;
+
+  virtual void InferRange();
+
+  virtual bool CanDeoptimize() const { return false; }
+  virtual bool HasSideEffect() const { return false; }
+
+  virtual bool AttributesEqual(Instruction* other) const {
+    return kind_ == other->AsIfThenElse()->kind_;
+  }
+
+  virtual bool AffectedBySideEffect() const {
+    return false;
+  }
+
+  Value* left() const { return inputs_[0]; }
+  Value* right() const { return inputs_[1]; }
+  intptr_t if_true() const { return if_true_; }
+  intptr_t if_false() const { return if_false_; }
+
+  Token::Kind kind() const { return kind_; }
+
+ private:
+  const Token::Kind kind_;
+  const intptr_t if_true_;
+  const intptr_t if_false_;
+
+  DISALLOW_COPY_AND_ASSIGN(IfThenElseInstr);
+};
+
+
 class StaticCallInstr : public TemplateDefinition<0> {
  public:
   StaticCallInstr(intptr_t token_pos,
@@ -2955,6 +3075,13 @@
   virtual bool HasSideEffect() const { return true; }
 
  private:
+  bool CanValueBeSmi() const {
+    const intptr_t cid = value()->Type()->ToNullableCid();
+    // Write barrier is skipped for nullable and non-nullable smis.
+    ASSERT(cid != kSmiCid);
+    return (cid == kDynamicCid);
+  }
+
   const Field& field_;
 
   DISALLOW_COPY_AND_ASSIGN(StoreStaticFieldInstr);
@@ -3129,7 +3256,8 @@
                   Value* instantiator,
                   Value* instantiator_type_arguments,
                   const AbstractType& type,
-                  bool negate_result)
+                  bool negate_result,
+                  intptr_t deopt_id)
       : token_pos_(token_pos),
         type_(type),
         negate_result_(negate_result) {
@@ -3137,6 +3265,7 @@
     SetInputAt(0, value);
     SetInputAt(1, instantiator);
     SetInputAt(2, instantiator_type_arguments);
+    deopt_id_ = deopt_id;
   }
 
   DECLARE_INSTRUCTION(InstanceOf)
@@ -3677,15 +3806,12 @@
 
 class BoxDoubleInstr : public TemplateDefinition<1> {
  public:
-  BoxDoubleInstr(Value* value, InstanceCallInstr* instance_call)
-      : token_pos_((instance_call != NULL) ? instance_call->token_pos() : 0) {
+  explicit BoxDoubleInstr(Value* value) {
     SetInputAt(0, value);
   }
 
   Value* value() const { return inputs_[0]; }
 
-  intptr_t token_pos() const { return token_pos_; }
-
   virtual bool CanDeoptimize() const { return false; }
 
   virtual bool HasSideEffect() const { return false; }
@@ -3702,12 +3828,38 @@
   virtual CompileType ComputeType() const;
 
  private:
-  const intptr_t token_pos_;
-
   DISALLOW_COPY_AND_ASSIGN(BoxDoubleInstr);
 };
 
 
+class BoxFloat32x4Instr : public TemplateDefinition<1> {
+ public:
+  explicit BoxFloat32x4Instr(Value* value) {
+    SetInputAt(0, value);
+  }
+
+  Value* value() const { return inputs_[0]; }
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual bool HasSideEffect() const { return false; }
+
+  virtual bool AffectedBySideEffect() const { return false; }
+  virtual bool AttributesEqual(Instruction* other) const { return true; }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT(idx == 0);
+    return kUnboxedFloat32x4;
+  }
+
+  DECLARE_INSTRUCTION(BoxFloat32x4)
+  virtual CompileType ComputeType() const;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(BoxFloat32x4Instr);
+};
+
+
 class BoxIntegerInstr : public TemplateDefinition<1> {
  public:
   explicit BoxIntegerInstr(Value* value) {
@@ -3767,6 +3919,36 @@
 };
 
 
+class UnboxFloat32x4Instr : public TemplateDefinition<1> {
+ public:
+  UnboxFloat32x4Instr(Value* value, intptr_t deopt_id) {
+    SetInputAt(0, value);
+    deopt_id_ = deopt_id;
+  }
+
+  Value* value() const { return inputs_[0]; }
+
+  virtual bool CanDeoptimize() const {
+    return (value()->Type()->ToCid() != kFloat32x4Cid);
+  }
+
+  virtual bool HasSideEffect() const { return false; }
+
+  virtual Representation representation() const {
+    return kUnboxedFloat32x4;
+  }
+
+  virtual bool AffectedBySideEffect() const { return false; }
+  virtual bool AttributesEqual(Instruction* other) const { return true; }
+
+  DECLARE_INSTRUCTION(UnboxFloat32x4)
+  virtual CompileType ComputeType() const;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(UnboxFloat32x4Instr);
+};
+
+
 class UnboxIntegerInstr : public TemplateDefinition<1> {
  public:
   UnboxIntegerInstr(Value* value, intptr_t deopt_id) {
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 69f9178..5ae8494 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -103,6 +103,30 @@
 }
 
 
+bool IfThenElseInstr::IsSupported() {
+  return false;
+}
+
+
+bool IfThenElseInstr::Supports(ComparisonInstr* comparison,
+                               Value* v1,
+                               Value* v2) {
+  UNREACHABLE();
+  return false;
+}
+
+
+LocationSummary* IfThenElseInstr::MakeLocationSummary() const {
+  UNREACHABLE();
+  return NULL;
+}
+
+
+void IfThenElseInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNREACHABLE();
+}
+
+
 LocationSummary* ClosureCallInstr::MakeLocationSummary() const {
   UNIMPLEMENTED();
   return NULL;
@@ -311,7 +335,7 @@
                                        LocationSummary* locs,
                                        const ICData& original_ic_data) {
   if (!compiler->is_optimizing()) {
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
+    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
                                    deopt_id,
                                    token_pos);
   }
@@ -669,7 +693,7 @@
   const String& function_name =
       String::ZoneHandle(Symbols::New(Token::Str(kind())));
   if (!compiler->is_optimizing()) {
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
+    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
                                    deopt_id(),
                                    token_pos());
   }
@@ -1264,6 +1288,28 @@
 }
 
 
+LocationSummary* BoxFloat32x4Instr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BoxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnboxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary() const {
   UNIMPLEMENTED();
   return NULL;
@@ -1533,7 +1579,7 @@
   // Add deoptimization descriptor for deoptimizing instructions
   // that may be inserted before this instruction.
   if (!compiler->is_optimizing()) {
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
+    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
                                    GetDeoptId(),
                                    0);  // No token position.
   }
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 50f3dc8..96e14fa 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -336,7 +336,7 @@
                                        LocationSummary* locs,
                                        const ICData& original_ic_data) {
   if (!compiler->is_optimizing()) {
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
+    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
                                    deopt_id,
                                    token_pos);
   }
@@ -972,7 +972,7 @@
   const String& function_name =
       String::ZoneHandle(Symbols::New(Token::Str(kind())));
   if (!compiler->is_optimizing()) {
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
+    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
                                    deopt_id(),
                                    token_pos());
   }
@@ -1124,6 +1124,8 @@
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return CompileType::FromCid(kDoubleCid);
+    case kTypedDataFloat32x4ArrayCid:
+      return CompileType::FromCid(kFloat32x4Cid);
 
     case kTypedDataInt8ArrayCid:
     case kTypedDataUint8ArrayCid:
@@ -1173,6 +1175,8 @@
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return kUnboxedDouble;
+    case kTypedDataFloat32x4ArrayCid:
+      return kUnboxedFloat32x4;
     default:
       UNIMPLEMENTED();
       return kTagged;
@@ -1230,7 +1234,8 @@
   }
 
   if ((representation() == kUnboxedDouble) ||
-      (representation() == kUnboxedMint)) {
+      (representation() == kUnboxedMint) ||
+      (representation() == kUnboxedFloat32x4)) {
     XmmRegister result = locs()->out().fpu_reg();
     if ((index_scale() == 1) && index.IsRegister()) {
       __ SmiUntag(index.reg());
@@ -1252,6 +1257,9 @@
       case kTypedDataFloat64ArrayCid:
         __ movsd(result, element_address);
         break;
+      case kTypedDataFloat32x4ArrayCid:
+        __ movups(result, element_address);
+        break;
     }
     return;
   }
@@ -1332,6 +1340,8 @@
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return kUnboxedDouble;
+    case kTypedDataFloat32x4ArrayCid:
+      return kUnboxedFloat32x4;
     default:
       UNIMPLEMENTED();
       return kTagged;
@@ -1394,6 +1404,9 @@
       // TODO(srdjan): Support Float64 constants.
       locs->set_in(2, Location::RequiresFpuRegister());
       break;
+    case kTypedDataFloat32x4ArrayCid:
+      locs->set_in(2, Location::RequiresFpuRegister());
+      break;
     default:
       UNREACHABLE();
       return NULL;
@@ -1510,6 +1523,9 @@
     case kTypedDataFloat64ArrayCid:
       __ movsd(element_address, locs()->in(2).fpu_reg());
       break;
+    case kTypedDataFloat32x4ArrayCid:
+      __ movups(element_address, locs()->in(2).fpu_reg());
+      break;
     default:
       UNREACHABLE();
   }
@@ -1729,7 +1745,8 @@
 
   __ LoadObject(temp, field());
   if (this->value()->NeedsStoreBuffer()) {
-    __ StoreIntoObject(temp, FieldAddress(temp, Field::value_offset()), value);
+    __ StoreIntoObject(temp,
+        FieldAddress(temp, Field::value_offset()), value, CanValueBeSmi());
   } else {
     __ StoreIntoObjectNoBarrier(
         temp, FieldAddress(temp, Field::value_offset()), value);
@@ -2611,11 +2628,11 @@
     locs->live_registers()->Remove(locs->out());
 
     compiler->SaveLiveRegisters(locs);
-    compiler->GenerateCall(instruction_->token_pos(),
+    compiler->GenerateCall(Scanner::kDummyTokenIndex,  // No token position.
                            &label,
                            PcDescriptors::kOther,
                            locs);
-    if (EAX != locs->out().reg()) __ movl(locs->out().reg(), EAX);
+    __ MoveRegister(locs->out().reg(), EAX);
     compiler->RestoreLiveRegisters(locs);
 
     __ jmp(exit_label());
@@ -2688,6 +2705,88 @@
 }
 
 
+LocationSummary* BoxFloat32x4Instr::MakeLocationSummary() const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs,
+                          kNumTemps,
+                          LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(Location::RequiresRegister());
+  return summary;
+}
+
+
+class BoxFloat32x4SlowPath : public SlowPathCode {
+ public:
+  explicit BoxFloat32x4SlowPath(BoxFloat32x4Instr* instruction)
+      : instruction_(instruction) { }
+
+  virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
+    __ Comment("BoxFloat32x4SlowPath");
+    __ Bind(entry_label());
+    const Class& float32x4_class = compiler->float32x4_class();
+    const Code& stub =
+        Code::Handle(StubCode::GetAllocationStubForClass(float32x4_class));
+    const ExternalLabel label(float32x4_class.ToCString(), stub.EntryPoint());
+
+    LocationSummary* locs = instruction_->locs();
+    locs->live_registers()->Remove(locs->out());
+
+    compiler->SaveLiveRegisters(locs);
+    compiler->GenerateCall(Scanner::kDummyTokenIndex,  // No token position.
+                           &label,
+                           PcDescriptors::kOther,
+                           locs);
+    __ MoveRegister(locs->out().reg(), EAX);
+    compiler->RestoreLiveRegisters(locs);
+
+    __ jmp(exit_label());
+  }
+
+ private:
+  BoxFloat32x4Instr* instruction_;
+};
+
+
+void BoxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  BoxFloat32x4SlowPath* slow_path = new BoxFloat32x4SlowPath(this);
+  compiler->AddSlowPathCode(slow_path);
+
+  Register out_reg = locs()->out().reg();
+  XmmRegister value = locs()->in(0).fpu_reg();
+
+  __ TryAllocate(compiler->float32x4_class(),
+                 slow_path->entry_label(),
+                 Assembler::kFarJump,
+                 out_reg);
+  __ Bind(slow_path->exit_label());
+  __ movups(FieldAddress(out_reg, Float32x4::value_offset()), value);
+}
+
+
+LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary() const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(Location::RequiresFpuRegister());
+  return summary;
+}
+
+
+void UnboxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const intptr_t value_cid = value()->Type()->ToCid();
+  const Register value = locs()->in(0).reg();
+  const XmmRegister result = locs()->out().fpu_reg();
+
+  ASSERT(value_cid == kFloat32x4Cid);
+  __ movups(result, FieldAddress(value, Float32x4::value_offset()));
+}
+
+
 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
@@ -2903,11 +3002,11 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* result =
       new LocationSummary(InputCount(), kNumTemps, LocationSummary::kCall);
-  result->set_in(0, Location::FpuRegisterLocation(XMM1, kUnboxedDouble));
+  result->set_in(0, Location::FpuRegisterLocation(XMM1));
   if (InputCount() == 2) {
-    result->set_in(1, Location::FpuRegisterLocation(XMM2, kUnboxedDouble));
+    result->set_in(1, Location::FpuRegisterLocation(XMM2));
   }
-  result->set_out(Location::FpuRegisterLocation(XMM1, kUnboxedDouble));
+  result->set_out(Location::FpuRegisterLocation(XMM1));
   return result;
 }
 
@@ -3184,11 +3283,11 @@
     locs->live_registers()->Remove(locs->out());
 
     compiler->SaveLiveRegisters(locs);
-    compiler->GenerateCall(0,  // No token pos.
+    compiler->GenerateCall(Scanner::kDummyTokenIndex,  // No token position.
                            &label,
                            PcDescriptors::kOther,
                            locs);
-    if (EAX != locs->out().reg()) __ movl(locs->out().reg(), EAX);
+    __ MoveRegister(locs->out().reg(), EAX);
     compiler->RestoreLiveRegisters(locs);
 
     __ jmp(exit_label());
@@ -3442,7 +3541,7 @@
   // Add deoptimization descriptor for deoptimizing instructions
   // that may be inserted before this instruction.
   if (!compiler->is_optimizing()) {
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
+    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
                                    GetDeoptId(),
                                    0);  // No token position.
   }
@@ -3603,6 +3702,127 @@
 }
 
 
+static bool BindsToSmiConstant(Value* val, intptr_t* smi_value) {
+  if (!val->BindsToConstant()) {
+    return false;
+  }
+
+  const Object& bound_constant = val->BoundConstant();
+  if (!bound_constant.IsSmi()) {
+    return false;
+  }
+
+  *smi_value = Smi::Cast(bound_constant).Value();
+  return true;
+}
+
+
+// Detect pattern when one value is zero and another is a power of 2.
+static bool IsPowerOfTwoKind(intptr_t v1, intptr_t v2) {
+  return (Utils::IsPowerOfTwo(v1) && (v2 == 0)) ||
+         (Utils::IsPowerOfTwo(v2) && (v1 == 0));
+}
+
+
+// Detect pattern when one value is increment of another.
+static bool IsIncrementKind(intptr_t v1, intptr_t v2) {
+  return ((v1 == v2 + 1) || (v1 + 1 == v2));
+}
+
+
+bool IfThenElseInstr::IsSupported() {
+  return true;
+}
+
+
+bool IfThenElseInstr::Supports(ComparisonInstr* comparison,
+                               Value* v1,
+                               Value* v2) {
+  if (!(comparison->IsStrictCompare() &&
+        !comparison->AsStrictCompare()->needs_number_check()) &&
+      !(comparison->IsEqualityCompare() &&
+        (comparison->AsEqualityCompare()->receiver_class_id() == kSmiCid))) {
+    return false;
+  }
+
+  intptr_t v1_value, v2_value;
+
+  if (!BindsToSmiConstant(v1, &v1_value) ||
+      !BindsToSmiConstant(v2, &v2_value)) {
+    return false;
+  }
+
+  if (IsPowerOfTwoKind(v1_value, v2_value) ||
+      IsIncrementKind(v1_value, v2_value)) {
+    return true;
+  }
+
+  return false;
+}
+
+
+LocationSummary* IfThenElseInstr::MakeLocationSummary() const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_in(0, Location::RegisterOrConstant(left()));
+  locs->set_in(1, Location::RegisterOrConstant(right()));
+  // TODO(vegorov): support byte register constraints in the register allocator.
+  locs->set_out(Location::RegisterLocation(EDX));
+  return locs;
+}
+
+
+void IfThenElseInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  ASSERT(locs()->out().reg() == EDX);
+  ASSERT(Token::IsEqualityOperator(kind()));
+
+  Location left = locs()->in(0);
+  Location right = locs()->in(1);
+  ASSERT(!left.IsConstant() || !right.IsConstant());
+
+  // Clear upper part of the out register. We are going to use setcc on it
+  // which is a byte move.
+  __ xorl(EDX, EDX);
+
+  // Compare left and right. For now only equality comparison is supported.
+  // TODO(vegorov): reuse code from the other comparison instructions instead of
+  // generating it inline here.
+  if (left.IsConstant()) {
+    __ CompareObject(right.reg(), left.constant());
+  } else if (right.IsConstant()) {
+    __ CompareObject(left.reg(), right.constant());
+  } else {
+    __ cmpl(left.reg(), right.reg());
+  }
+
+  Condition true_condition =
+      ((kind_ == Token::kEQ_STRICT) || (kind_ == Token::kEQ)) ? EQUAL
+                                                              : NOT_EQUAL;
+
+  const bool is_power_of_two_kind = IsPowerOfTwoKind(if_true_, if_false_);
+
+  const intptr_t base = Utils::Minimum(if_true_, if_false_);
+
+  if (if_true_ == base) {
+    // We need to have zero in EDX on true_condition.
+    true_condition = NegateCondition(true_condition);
+  }
+
+  __ setcc(true_condition, DL);
+
+  if (is_power_of_two_kind) {
+    const intptr_t shift =
+        Utils::ShiftForPowerOfTwo(Utils::Maximum(if_true_, if_false_));
+    __ shll(EDX, Immediate(shift + kSmiTagSize));
+  } else {
+    ASSERT(kSmiTagSize == 1);
+    __ leal(EDX, Address(EDX, TIMES_2, base << kSmiTagSize));
+  }
+}
+
+
 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // The arguments to the stub include the closure, as does the arguments
   // descriptor.
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index c912b09..b6ec1b0 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -13,6 +13,7 @@
 #include "vm/locations.h"
 #include "vm/object_store.h"
 #include "vm/parser.h"
+#include "vm/simulator.h"
 #include "vm/stub_code.h"
 #include "vm/symbols.h"
 
@@ -87,8 +88,7 @@
     const int sp_fp_dist = compiler->StackSize() + (-kFirstLocalSlotIndex - 1);
     __ subu(T2, FP, SP);
 
-    __ addiu(T2, T2, Immediate(-sp_fp_dist * kWordSize));
-    __ beq(T2, ZR, &stack_ok);
+    __ BranchEqual(T2, sp_fp_dist * kWordSize, &stack_ok);
     __ break_(0);
 
     __ Bind(&stack_ok);
@@ -107,6 +107,30 @@
 }
 
 
+bool IfThenElseInstr::IsSupported() {
+  return false;
+}
+
+
+bool IfThenElseInstr::Supports(ComparisonInstr* comparison,
+                               Value* v1,
+                               Value* v2) {
+  UNREACHABLE();
+  return false;
+}
+
+
+LocationSummary* IfThenElseInstr::MakeLocationSummary() const {
+  UNREACHABLE();
+  return NULL;
+}
+
+
+void IfThenElseInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNREACHABLE();
+}
+
+
 LocationSummary* ClosureCallInstr::MakeLocationSummary() const {
   UNIMPLEMENTED();
   return NULL;
@@ -171,13 +195,45 @@
 
 
 LocationSummary* AssertBooleanInstr::MakeLocationSummary() const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_in(0, Location::RegisterLocation(A0));
+  locs->set_out(Location::RegisterLocation(A0));
+  return locs;
+}
+
+
+static void EmitAssertBoolean(Register reg,
+                              intptr_t token_pos,
+                              intptr_t deopt_id,
+                              LocationSummary* locs,
+                              FlowGraphCompiler* compiler) {
+  // Check that the type of the value is allowed in conditional context.
+  // Call the runtime if the object is not bool::true or bool::false.
+  ASSERT(locs->always_calls());
+  Label done;
+  __ BranchEqual(reg, Bool::True(), &done);
+  __ BranchEqual(reg, Bool::False(), &done);
+
+  __ Push(reg);  // Push the source object.
+  compiler->GenerateCallRuntime(token_pos,
+                                deopt_id,
+                                kConditionTypeErrorRuntimeEntry,
+                                locs);
+  // We should never return here.
+  __ break_(0);
+  __ Bind(&done);
 }
 
 
 void AssertBooleanInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register obj = locs()->in(0).reg();
+  Register result = locs()->out().reg();
+
+  EmitAssertBoolean(obj, token_pos(), deopt_id(), locs(), compiler);
+  ASSERT(obj == result);
 }
 
 
@@ -193,19 +249,296 @@
 
 
 LocationSummary* EqualityCompareInstr::MakeLocationSummary() const {
+  const intptr_t kNumInputs = 2;
+  const bool is_checked_strict_equal =
+      HasICData() && ic_data()->AllTargetsHaveSameOwner(kInstanceCid);
+  if (receiver_class_id() == kMintCid) {
+    const intptr_t kNumTemps = 1;
+    LocationSummary* locs =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresFpuRegister());
+    locs->set_in(1, Location::RequiresFpuRegister());
+    locs->set_temp(0, Location::RequiresRegister());
+    locs->set_out(Location::RequiresRegister());
+    return locs;
+  }
+  if (receiver_class_id() == kDoubleCid) {
+    const intptr_t kNumTemps = 0;
+    LocationSummary* locs =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresFpuRegister());
+    locs->set_in(1, Location::RequiresFpuRegister());
+    locs->set_out(Location::RequiresRegister());
+    return locs;
+  }
+  if (receiver_class_id() == kSmiCid) {
+    const intptr_t kNumTemps = 0;
+    LocationSummary* locs =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    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.
+    locs->set_in(1, locs->in(0).IsConstant()
+                        ? Location::RequiresRegister()
+                        : Location::RegisterOrConstant(right()));
+    locs->set_out(Location::RequiresRegister());
+    return locs;
+  }
+  if (is_checked_strict_equal) {
+    const intptr_t kNumTemps = 1;
+    LocationSummary* locs =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
+    locs->set_in(1, Location::RequiresRegister());
+    locs->set_temp(0, Location::RequiresRegister());
+    locs->set_out(Location::RequiresRegister());
+    return locs;
+  }
+  if (IsPolymorphic()) {
+    const intptr_t kNumTemps = 1;
+    LocationSummary* locs =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+    UNIMPLEMENTED();  // TODO(regis): Verify register allocation.
+    return locs;
+  }
+  const intptr_t kNumTemps = 1;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_in(0, Location::RegisterLocation(A1));
+  locs->set_in(1, Location::RegisterLocation(A0));
+  locs->set_temp(0, Location::RegisterLocation(T0));
+  locs->set_out(Location::RegisterLocation(V0));
+  return locs;
+}
+
+
+// A1: left.
+// A0: right.
+// Uses T0 to load ic_call_data.
+// Result in V0.
+static void EmitEqualityAsInstanceCall(FlowGraphCompiler* compiler,
+                                       intptr_t deopt_id,
+                                       intptr_t token_pos,
+                                       Token::Kind kind,
+                                       LocationSummary* locs,
+                                       const ICData& original_ic_data) {
+  if (!compiler->is_optimizing()) {
+    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+                                   deopt_id,
+                                   token_pos);
+  }
+  const int kNumberOfArguments = 2;
+  const Array& kNoArgumentNames = Array::Handle();
+  const int kNumArgumentsChecked = 2;
+
+  Label check_identity;
+  __ LoadImmediate(TMP1, reinterpret_cast<intptr_t>(Object::null()));
+  __ beq(A1, TMP1, &check_identity);
+  __ beq(A0, TMP1, &check_identity);
+
+  ICData& equality_ic_data = ICData::ZoneHandle();
+  if (compiler->is_optimizing() && FLAG_propagate_ic_data) {
+    ASSERT(!original_ic_data.IsNull());
+    if (original_ic_data.NumberOfChecks() == 0) {
+      // IC call for reoptimization populates original ICData.
+      equality_ic_data = original_ic_data.raw();
+    } else {
+      // Megamorphic call.
+      equality_ic_data = original_ic_data.AsUnaryClassChecks();
+    }
+  } else {
+    equality_ic_data = ICData::New(compiler->parsed_function().function(),
+                                   Symbols::EqualOperator(),
+                                   deopt_id,
+                                   kNumArgumentsChecked);
+  }
+  __ addiu(SP, SP, Immediate(-2 * kWordSize));
+  __ sw(A1, Address(SP, 1 * kWordSize));
+  __ sw(A0, Address(SP, 0 * kWordSize));
+  compiler->GenerateInstanceCall(deopt_id,
+                                 token_pos,
+                                 kNumberOfArguments,
+                                 kNoArgumentNames,
+                                 locs,
+                                 equality_ic_data);
+  Label check_ne;
+  __ b(&check_ne);
+
+  __ Bind(&check_identity);
+  Label equality_done;
+  if (compiler->is_optimizing()) {
+    // No need to update IC data.
+    Label is_true;
+    __ beq(A1, A0, &is_true);
+    __ LoadObject(V0, (kind == Token::kEQ) ? Bool::False() : Bool::True());
+    __ b(&equality_done);
+    __ Bind(&is_true);
+    __ LoadObject(V0, (kind == Token::kEQ) ? Bool::True() : Bool::False());
+    if (kind == Token::kNE) {
+      // Skip not-equal result conversion.
+      __ b(&equality_done);
+    }
+  } else {
+    // Call stub, load IC data in register. The stub will update ICData if
+    // necessary.
+    Register ic_data_reg = locs->temp(0).reg();
+    ASSERT(ic_data_reg == T0);  // Stub depends on it.
+    __ LoadObject(ic_data_reg, equality_ic_data);
+    // Pass left in A1 and right in A0.
+    compiler->GenerateCall(token_pos,
+                           &StubCode::EqualityWithNullArgLabel(),
+                           PcDescriptors::kOther,
+                           locs);
+  }
+  __ Bind(&check_ne);
+  if (kind == Token::kNE) {
+    Label true_label, done;
+    // Negate the condition: true label returns false and vice versa.
+    __ BranchEqual(V0, Bool::True(), &true_label);
+    __ LoadObject(V0, Bool::True());
+    __ b(&done);
+    __ Bind(&true_label);
+    __ LoadObject(V0, Bool::False());
+    __ Bind(&done);
+  }
+  __ Bind(&equality_done);
+}
+
+
+// Emit code when ICData's targets are all Object == (which is ===).
+static void EmitCheckedStrictEqual(FlowGraphCompiler* compiler,
+                                   const ICData& ic_data,
+                                   const LocationSummary& locs,
+                                   Token::Kind kind,
+                                   BranchInstr* branch,
+                                   intptr_t deopt_id) {
   UNIMPLEMENTED();
-  return NULL;
+}
+
+
+// First test if receiver is NULL, in which case === is applied.
+// If type feedback was provided (lists of <class-id, target>), do a
+// type by type check (either === or static call to the operator.
+static void EmitGenericEqualityCompare(FlowGraphCompiler* compiler,
+                                       LocationSummary* locs,
+                                       Token::Kind kind,
+                                       BranchInstr* branch,
+                                       const ICData& ic_data,
+                                       intptr_t deopt_id,
+                                       intptr_t token_pos) {
+  UNIMPLEMENTED();
+}
+
+
+static void EmitSmiComparisonOp(FlowGraphCompiler* compiler,
+                                const LocationSummary& locs,
+                                Token::Kind kind,
+                                BranchInstr* branch) {
+  UNIMPLEMENTED();
+}
+
+
+static void EmitUnboxedMintEqualityOp(FlowGraphCompiler* compiler,
+                                      const LocationSummary& locs,
+                                      Token::Kind kind,
+                                      BranchInstr* branch) {
+  UNIMPLEMENTED();
+}
+
+
+static void EmitDoubleComparisonOp(FlowGraphCompiler* compiler,
+                                   const LocationSummary& locs,
+                                   Token::Kind kind,
+                                   BranchInstr* branch) {
+  UNIMPLEMENTED();
 }
 
 
 void EqualityCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  ASSERT((kind() == Token::kNE) || (kind() == Token::kEQ));
+  BranchInstr* kNoBranch = NULL;
+  if (receiver_class_id() == kSmiCid) {
+    EmitSmiComparisonOp(compiler, *locs(), kind(), kNoBranch);
+    return;
+  }
+  if (receiver_class_id() == kMintCid) {
+    EmitUnboxedMintEqualityOp(compiler, *locs(), kind(), kNoBranch);
+    return;
+  }
+  if (receiver_class_id() == kDoubleCid) {
+    EmitDoubleComparisonOp(compiler, *locs(), kind(), kNoBranch);
+    return;
+  }
+  const bool is_checked_strict_equal =
+      HasICData() && ic_data()->AllTargetsHaveSameOwner(kInstanceCid);
+  if (is_checked_strict_equal) {
+    EmitCheckedStrictEqual(compiler, *ic_data(), *locs(), kind(), kNoBranch,
+                           deopt_id());
+    return;
+  }
+  if (IsPolymorphic()) {
+    EmitGenericEqualityCompare(compiler, locs(), kind(), kNoBranch, *ic_data(),
+                               deopt_id(), token_pos());
+    return;
+  }
+  Register left = locs()->in(0).reg();
+  Register right = locs()->in(1).reg();
+  ASSERT(left == A1);
+  ASSERT(right == A0);
+  EmitEqualityAsInstanceCall(compiler,
+                             deopt_id(),
+                             token_pos(),
+                             kind(),
+                             locs(),
+                             *ic_data());
+  ASSERT(locs()->out().reg() == V0);
 }
 
 
 void EqualityCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                           BranchInstr* branch) {
-  UNIMPLEMENTED();
+  ASSERT((kind() == Token::kNE) || (kind() == Token::kEQ));
+  if (receiver_class_id() == kSmiCid) {
+    // Deoptimizes if both arguments not Smi.
+    EmitSmiComparisonOp(compiler, *locs(), kind(), branch);
+    return;
+  }
+  if (receiver_class_id() == kMintCid) {
+    EmitUnboxedMintEqualityOp(compiler, *locs(), kind(), branch);
+    return;
+  }
+  if (receiver_class_id() == kDoubleCid) {
+    EmitDoubleComparisonOp(compiler, *locs(), kind(), branch);
+    return;
+  }
+  const bool is_checked_strict_equal =
+      HasICData() && ic_data()->AllTargetsHaveSameOwner(kInstanceCid);
+  if (is_checked_strict_equal) {
+    EmitCheckedStrictEqual(compiler, *ic_data(), *locs(), kind(), branch,
+                           deopt_id());
+    return;
+  }
+  if (IsPolymorphic()) {
+    EmitGenericEqualityCompare(compiler, locs(), kind(), branch, *ic_data(),
+                               deopt_id(), token_pos());
+    return;
+  }
+  Register left = locs()->in(0).reg();
+  Register right = locs()->in(1).reg();
+  ASSERT(left == A1);
+  ASSERT(right == A0);
+  EmitEqualityAsInstanceCall(compiler,
+                             deopt_id(),
+                             token_pos(),
+                             Token::kEQ,  // kNE reverse occurs at branch.
+                             locs(),
+                             *ic_data());
+  if (branch->is_checked()) {
+    EmitAssertBoolean(V0, token_pos(), deopt_id(), locs(), compiler);
+  }
+  Condition branch_condition = (kind() == Token::kNE) ? NE : EQ;
+  __ CompareObject(CMPRES, V0, Bool::True());
+  branch->EmitBranchOnCondition(compiler, branch_condition);
 }
 
 
@@ -249,10 +582,10 @@
   __ PushObject(Object::ZoneHandle());
   // Pass a pointer to the first argument in A2.
   if (!function().HasOptionalParameters()) {
-    __ addiu(A2, FP, Immediate((kLastParamSlotIndex +
-                                function().NumParameters() - 1) * kWordSize));
+    __ AddImmediate(A2, FP, (kLastParamSlotIndex +
+                             function().NumParameters() - 1) * kWordSize);
   } else {
-    __ addiu(A2, FP, Immediate(kFirstLocalSlotIndex * kWordSize));
+    __ AddImmediate(A2, FP, kFirstLocalSlotIndex * kWordSize);
   }
   // Compute the effective address. When running under the simulator,
   // this is a redirection address that forces the simulator to call
@@ -537,11 +870,10 @@
   CheckStackOverflowSlowPath* slow_path = new CheckStackOverflowSlowPath(this);
   compiler->AddSlowPathCode(slow_path);
 
-  __ LoadImmediate(TMP, Isolate::Current()->stack_limit_address());
+  __ LoadImmediate(TMP1, Isolate::Current()->stack_limit_address());
 
-  __ lw(TMP, Address(TMP));
-  __ subu(TMP, SP, TMP);
-  __ blez(TMP, slow_path->entry_label());
+  __ lw(TMP1, Address(TMP1));
+  __ BranchLessEqual(SP, TMP1, slow_path->entry_label());
 
   __ Bind(slow_path->exit_label());
 }
@@ -591,6 +923,28 @@
 }
 
 
+LocationSummary* BoxFloat32x4Instr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BoxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary() const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnboxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary() const {
   UNIMPLEMENTED();
   return NULL;
@@ -697,7 +1051,7 @@
 
 
 void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  comparison()->EmitBranchCode(compiler, this);
 }
 
 
@@ -813,25 +1167,79 @@
 
 
 LocationSummary* GotoInstr::MakeLocationSummary() const {
-  UNIMPLEMENTED();
-  return NULL;
+  return new LocationSummary(0, 0, LocationSummary::kNoCall);
 }
 
 
 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  // Add deoptimization descriptor for deoptimizing instructions
+  // that may be inserted before this instruction.
+  if (!compiler->is_optimizing()) {
+    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+                                   GetDeoptId(),
+                                   0);  // No token position.
+  }
+
+  if (HasParallelMove()) {
+    compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
+  }
+
+  // We can fall through if the successor is the next block in the list.
+  // Otherwise, we need a jump.
+  if (!compiler->CanFallThroughTo(successor())) {
+    __ b(compiler->GetJumpLabel(successor()));
+  }
+}
+
+
+static Condition NegateCondition(Condition condition) {
+  switch (condition) {
+    case EQ: return NE;
+    case NE: return EQ;
+    default:
+      OS::Print("Error: Condition not recognized: %d\n", condition);
+      UNIMPLEMENTED();
+      return EQ;
+  }
 }
 
 
 void ControlInstruction::EmitBranchOnValue(FlowGraphCompiler* compiler,
                                            bool value) {
-  UNIMPLEMENTED();
+  if (value && !compiler->CanFallThroughTo(true_successor())) {
+    __ b(compiler->GetJumpLabel(true_successor()));
+  } else if (!value && !compiler->CanFallThroughTo(false_successor())) {
+    __ b(compiler->GetJumpLabel(false_successor()));
+  }
 }
 
 
+// The comparison result is in CMPRES.
 void ControlInstruction::EmitBranchOnCondition(FlowGraphCompiler* compiler,
                                                Condition true_condition) {
-  UNIMPLEMENTED();
+  if (compiler->CanFallThroughTo(false_successor())) {
+    // If the next block is the false successor we will fall through to it.
+    if (true_condition == EQ) {
+      __ beq(CMPRES, ZR, compiler->GetJumpLabel(true_successor()));
+    } else {
+      ASSERT(true_condition == NE);
+      __ bne(CMPRES, ZR, compiler->GetJumpLabel(true_successor()));
+    }
+  } else {
+    // If the next block is the true successor we negate comparison and fall
+    // through to it.
+    Condition false_condition = NegateCondition(true_condition);
+    if (false_condition == EQ) {
+      __ beq(CMPRES, ZR, compiler->GetJumpLabel(false_successor()));
+    } else {
+      ASSERT(false_condition == NE);
+      __ bne(CMPRES, ZR, compiler->GetJumpLabel(false_successor()));
+    }
+    // Fall through or jump to the true successor.
+    if (!compiler->CanFallThroughTo(true_successor())) {
+      __ b(compiler->GetJumpLabel(true_successor()));
+    }
+  }
 }
 
 
@@ -847,19 +1255,89 @@
 
 
 LocationSummary* StrictCompareInstr::MakeLocationSummary() const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_in(0, Location::RegisterOrConstant(left()));
+  locs->set_in(1, Location::RegisterOrConstant(right()));
+  locs->set_out(Location::RequiresRegister());
+  return locs;
 }
 
 
+// Special code for numbers (compare values instead of references.)
 void StrictCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
+  Location left = locs()->in(0);
+  Location right = locs()->in(1);
+  if (left.IsConstant() && right.IsConstant()) {
+    // TODO(vegorov): should be eliminated earlier by constant propagation.
+    const bool result = (kind() == Token::kEQ_STRICT) ?
+        left.constant().raw() == right.constant().raw() :
+        left.constant().raw() != right.constant().raw();
+    __ LoadObject(locs()->out().reg(), result ? Bool::True() : Bool::False());
+    return;
+  }
+  if (left.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(right.reg(),
+                                          left.constant(),
+                                          needs_number_check());
+  } else if (right.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(left.reg(),
+                                          right.constant(),
+                                          needs_number_check());
+  } else {
+    compiler->EmitEqualityRegRegCompare(left.reg(),
+                                       right.reg(),
+                                       needs_number_check());
+  }
+
+  Register result = locs()->out().reg();
+  Label load_true, done;
+  if (kind() == Token::kEQ_STRICT) {
+    __ beq(CMPRES, ZR, &load_true);
+  } else {
+    ASSERT(kind() == Token::kNE_STRICT);
+    __ bne(CMPRES, ZR, &load_true);
+  }
+  __ LoadObject(result, Bool::False());
+  __ b(&done);
+  __ Bind(&load_true);
+  __ LoadObject(result, Bool::True());
+  __ Bind(&done);
 }
 
 
 void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                         BranchInstr* branch) {
-  UNIMPLEMENTED();
+  ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
+  Location left = locs()->in(0);
+  Location right = locs()->in(1);
+  if (left.IsConstant() && right.IsConstant()) {
+    // TODO(vegorov): should be eliminated earlier by constant propagation.
+    const bool result = (kind() == Token::kEQ_STRICT) ?
+        left.constant().raw() == right.constant().raw() :
+        left.constant().raw() != right.constant().raw();
+    branch->EmitBranchOnValue(compiler, result);
+    return;
+  }
+  if (left.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(right.reg(),
+                                          left.constant(),
+                                          needs_number_check());
+  } else if (right.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(left.reg(),
+                                          right.constant(),
+                                          needs_number_check());
+  } else {
+    compiler->EmitEqualityRegRegCompare(left.reg(),
+                                        right.reg(),
+                                        needs_number_check());
+  }
+
+  Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQ : NE;
+  branch->EmitBranchOnCondition(compiler, true_condition);
 }
 
 
@@ -902,13 +1380,19 @@
 
 
 LocationSummary* AllocateObjectInstr::MakeLocationSummary() const {
-  UNIMPLEMENTED();
-  return NULL;
+  return MakeCallSummary();
 }
 
 
 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const Class& cls = Class::ZoneHandle(constructor().Owner());
+  const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls));
+  const ExternalLabel label(cls.ToCString(), stub.EntryPoint());
+  compiler->GenerateCall(token_pos(),
+                         &label,
+                         PcDescriptors::kOther,
+                         locs());
+  __ Drop(ArgumentCount());  // Discard arguments.
 }
 
 
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 3edf1ed..264c3199 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -113,6 +113,147 @@
 }
 
 
+static Condition NegateCondition(Condition condition) {
+  switch (condition) {
+    case EQUAL:         return NOT_EQUAL;
+    case NOT_EQUAL:     return EQUAL;
+    case LESS:          return GREATER_EQUAL;
+    case LESS_EQUAL:    return GREATER;
+    case GREATER:       return LESS_EQUAL;
+    case GREATER_EQUAL: return LESS;
+    case BELOW:         return ABOVE_EQUAL;
+    case BELOW_EQUAL:   return ABOVE;
+    case ABOVE:         return BELOW_EQUAL;
+    case ABOVE_EQUAL:   return BELOW;
+    default:
+      OS::Print("Error %d\n", condition);
+      UNIMPLEMENTED();
+      return EQUAL;
+  }
+}
+
+
+static bool BindsToSmiConstant(Value* val, intptr_t* smi_value) {
+  if (!val->BindsToConstant()) {
+    return false;
+  }
+
+  const Object& bound_constant = val->BoundConstant();
+  if (!bound_constant.IsSmi()) {
+    return false;
+  }
+
+  *smi_value = Smi::Cast(bound_constant).Value();
+  return true;
+}
+
+
+// Detect pattern when one value is zero and another is a power of 2.
+static bool IsPowerOfTwoKind(intptr_t v1, intptr_t v2) {
+  return (Utils::IsPowerOfTwo(v1) && (v2 == 0)) ||
+         (Utils::IsPowerOfTwo(v2) && (v1 == 0));
+}
+
+
+// Detect pattern when one value is increment of another.
+static bool IsIncrementKind(intptr_t v1, intptr_t v2) {
+  return ((v1 == v2 + 1) || (v1 + 1 == v2));
+}
+
+
+bool IfThenElseInstr::IsSupported() {
+  return true;
+}
+
+
+bool IfThenElseInstr::Supports(ComparisonInstr* comparison,
+                               Value* v1,
+                               Value* v2) {
+  if (!(comparison->IsStrictCompare() &&
+        !comparison->AsStrictCompare()->needs_number_check()) &&
+      !(comparison->IsEqualityCompare() &&
+        (comparison->AsEqualityCompare()->receiver_class_id() == kSmiCid))) {
+    return false;
+  }
+
+  intptr_t v1_value, v2_value;
+
+  if (!BindsToSmiConstant(v1, &v1_value) ||
+      !BindsToSmiConstant(v2, &v2_value)) {
+    return false;
+  }
+
+  if (IsPowerOfTwoKind(v1_value, v2_value) ||
+      IsIncrementKind(v1_value, v2_value)) {
+    return true;
+  }
+
+  return false;
+}
+
+
+LocationSummary* IfThenElseInstr::MakeLocationSummary() const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_in(0, Location::RegisterOrConstant(left()));
+  locs->set_in(1, Location::RegisterOrConstant(right()));
+  // TODO(vegorov): support byte register constraints in the register allocator.
+  locs->set_out(Location::RegisterLocation(RDX));
+  return locs;
+}
+
+
+void IfThenElseInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  ASSERT(locs()->out().reg() == RDX);
+  ASSERT(Token::IsEqualityOperator(kind()));
+
+  Location left = locs()->in(0);
+  Location right = locs()->in(1);
+  ASSERT(!left.IsConstant() || !right.IsConstant());
+
+  // Clear upper part of the out register. We are going to use setcc on it
+  // which is a byte move.
+  __ xorq(RDX, RDX);
+
+  // Compare left and right. For now only equality comparison is supported.
+  // TODO(vegorov): reuse code from the other comparison instructions instead of
+  // generating it inline here.
+  if (left.IsConstant()) {
+    __ CompareObject(right.reg(), left.constant());
+  } else if (right.IsConstant()) {
+    __ CompareObject(left.reg(), right.constant());
+  } else {
+    __ cmpq(left.reg(), right.reg());
+  }
+
+  Condition true_condition =
+      ((kind_ == Token::kEQ_STRICT) || (kind_ == Token::kEQ)) ? EQUAL
+                                                              : NOT_EQUAL;
+
+  const bool is_power_of_two_kind = IsPowerOfTwoKind(if_true_, if_false_);
+
+  const intptr_t base = Utils::Minimum(if_true_, if_false_);
+
+  if (if_true_ == base) {
+    // We need to have zero in RDX on true_condition.
+    true_condition = NegateCondition(true_condition);
+  }
+
+  __ setcc(true_condition, DL);
+
+  if (is_power_of_two_kind) {
+    const intptr_t shift =
+        Utils::ShiftForPowerOfTwo(Utils::Maximum(if_true_, if_false_));
+    __ shlq(RDX, Immediate(shift + kSmiTagSize));
+  } else {
+    ASSERT(kSmiTagSize == 1);
+    __ leaq(RDX, Address(RDX, TIMES_2, base << kSmiTagSize));
+  }
+}
+
+
 LocationSummary* ClosureCallInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
@@ -334,7 +475,7 @@
                                        LocationSummary* locs,
                                        const ICData& original_ic_data) {
   if (!compiler->is_optimizing()) {
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
+    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
                                    deopt_id,
                                    token_pos);
   }
@@ -842,7 +983,7 @@
   const String& function_name =
       String::ZoneHandle(Symbols::New(Token::Str(kind())));
   if (!compiler->is_optimizing()) {
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
+    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
                                    deopt_id(),
                                    token_pos());
   }
@@ -991,6 +1132,8 @@
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return CompileType::FromCid(kDoubleCid);
+    case kTypedDataFloat32x4ArrayCid:
+      return CompileType::FromCid(kFloat32x4Cid);
 
     case kTypedDataInt8ArrayCid:
     case kTypedDataUint8ArrayCid:
@@ -1031,6 +1174,8 @@
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return kUnboxedDouble;
+    case kTypedDataFloat32x4ArrayCid:
+      return kUnboxedFloat32x4;
     default:
       UNIMPLEMENTED();
       return kTagged;
@@ -1090,7 +1235,8 @@
             Smi::Cast(index.constant()).Value());
   }
 
-  if (representation() == kUnboxedDouble) {
+  if ((representation() == kUnboxedDouble) ||
+      (representation() == kUnboxedFloat32x4)) {
     if ((index_scale() == 1) && index.IsRegister()) {
       __ SmiUntag(index.reg());
     }
@@ -1101,9 +1247,11 @@
       __ movss(result, element_address);
       // Promote to double.
       __ cvtss2sd(result, locs()->out().fpu_reg());
-    } else {
-      ASSERT(class_id() == kTypedDataFloat64ArrayCid);
+    } else if (class_id() == kTypedDataFloat64ArrayCid) {
       __ movsd(result, element_address);
+    } else {
+      ASSERT(class_id() == kTypedDataFloat32x4ArrayCid);
+      __ movups(result, element_address);
     }
     return;
   }
@@ -1170,6 +1318,8 @@
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return kUnboxedDouble;
+    case kTypedDataFloat32x4ArrayCid:
+      return kUnboxedFloat32x4;
     default:
       UNIMPLEMENTED();
       return kTagged;
@@ -1226,6 +1376,9 @@
       // TODO(srdjan): Support Float64 constants.
       locs->set_in(2, Location::RequiresFpuRegister());
       break;
+    case kTypedDataFloat32x4ArrayCid:
+      locs->set_in(2, Location::RequiresFpuRegister());
+      break;
     default:
       UNREACHABLE();
       return NULL;
@@ -1339,6 +1492,9 @@
     case kTypedDataFloat64ArrayCid:
       __ movsd(element_address, locs()->in(2).fpu_reg());
       break;
+    case kTypedDataFloat32x4ArrayCid:
+      __ movups(element_address, locs()->in(2).fpu_reg());
+      break;
     default:
       UNREACHABLE();
   }
@@ -1556,7 +1712,8 @@
 
   __ LoadObject(temp, field());
   if (this->value()->NeedsStoreBuffer()) {
-    __ StoreIntoObject(temp, FieldAddress(temp, Field::value_offset()), value);
+    __ StoreIntoObject(temp,
+        FieldAddress(temp, Field::value_offset()), value, CanValueBeSmi());
   } else {
     __ StoreIntoObjectNoBarrier(
         temp, FieldAddress(temp, Field::value_offset()), value);
@@ -2487,11 +2644,11 @@
     locs->live_registers()->Remove(locs->out());
 
     compiler->SaveLiveRegisters(locs);
-    compiler->GenerateCall(instruction_->token_pos(),
+    compiler->GenerateCall(Scanner::kDummyTokenIndex,  // No token position.
                            &label,
                            PcDescriptors::kOther,
                            locs);
-    if (RAX != locs->out().reg()) __ movq(locs->out().reg(), RAX);
+    __ MoveRegister(locs->out().reg(), RAX);
     compiler->RestoreLiveRegisters(locs);
 
     __ jmp(exit_label());
@@ -2559,6 +2716,88 @@
 }
 
 
+LocationSummary* BoxFloat32x4Instr::MakeLocationSummary() const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs,
+                          kNumTemps,
+                          LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(Location::RequiresRegister());
+  return summary;
+}
+
+
+class BoxFloat32x4SlowPath : public SlowPathCode {
+ public:
+  explicit BoxFloat32x4SlowPath(BoxFloat32x4Instr* instruction)
+      : instruction_(instruction) { }
+
+  virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
+    __ Comment("BoxFloat32x4SlowPath");
+    __ Bind(entry_label());
+    const Class& float32x4_class = compiler->float32x4_class();
+    const Code& stub =
+        Code::Handle(StubCode::GetAllocationStubForClass(float32x4_class));
+    const ExternalLabel label(float32x4_class.ToCString(), stub.EntryPoint());
+
+    LocationSummary* locs = instruction_->locs();
+    locs->live_registers()->Remove(locs->out());
+
+    compiler->SaveLiveRegisters(locs);
+    compiler->GenerateCall(Scanner::kDummyTokenIndex,  // No token position.
+                           &label,
+                           PcDescriptors::kOther,
+                           locs);
+    __ MoveRegister(locs->out().reg(), RAX);
+    compiler->RestoreLiveRegisters(locs);
+
+    __ jmp(exit_label());
+  }
+
+ private:
+  BoxFloat32x4Instr* instruction_;
+};
+
+
+void BoxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  BoxFloat32x4SlowPath* slow_path = new BoxFloat32x4SlowPath(this);
+  compiler->AddSlowPathCode(slow_path);
+
+  Register out_reg = locs()->out().reg();
+  XmmRegister value = locs()->in(0).fpu_reg();
+
+  __ TryAllocate(compiler->float32x4_class(),
+                 slow_path->entry_label(),
+                 Assembler::kFarJump,
+                 out_reg);
+  __ Bind(slow_path->exit_label());
+  __ movups(FieldAddress(out_reg, Float32x4::value_offset()), value);
+}
+
+
+LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary() const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(Location::RequiresFpuRegister());
+  return summary;
+}
+
+
+void UnboxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const intptr_t value_cid = value()->Type()->ToCid();
+  const Register value = locs()->in(0).reg();
+  const XmmRegister result = locs()->out().fpu_reg();
+
+  ASSERT(value_cid == kFloat32x4Cid);
+  __ movups(result, FieldAddress(value, Float32x4::value_offset()));
+}
+
+
 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
@@ -2788,11 +3027,11 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* result =
       new LocationSummary(InputCount(), kNumTemps, LocationSummary::kCall);
-  result->set_in(0, Location::FpuRegisterLocation(XMM1, kUnboxedDouble));
+  result->set_in(0, Location::FpuRegisterLocation(XMM1));
   if (InputCount() == 2) {
-    result->set_in(1, Location::FpuRegisterLocation(XMM2, kUnboxedDouble));
+    result->set_in(1, Location::FpuRegisterLocation(XMM2));
   }
-  result->set_out(Location::FpuRegisterLocation(XMM1, kUnboxedDouble));
+  result->set_out(Location::FpuRegisterLocation(XMM1));
   return result;
 }
 
@@ -3079,7 +3318,7 @@
   // Add deoptimization descriptor for deoptimizing instructions
   // that may be inserted before this instruction.
   if (!compiler->is_optimizing()) {
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
+    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
                                    GetDeoptId(),
                                    0);  // No token position.
   }
@@ -3096,26 +3335,6 @@
 }
 
 
-static Condition NegateCondition(Condition condition) {
-  switch (condition) {
-    case EQUAL:         return NOT_EQUAL;
-    case NOT_EQUAL:     return EQUAL;
-    case LESS:          return GREATER_EQUAL;
-    case LESS_EQUAL:    return GREATER;
-    case GREATER:       return LESS_EQUAL;
-    case GREATER_EQUAL: return LESS;
-    case BELOW:         return ABOVE_EQUAL;
-    case BELOW_EQUAL:   return ABOVE;
-    case ABOVE:         return BELOW_EQUAL;
-    case ABOVE_EQUAL:   return BELOW;
-    default:
-      OS::Print("Error %d\n", condition);
-      UNIMPLEMENTED();
-      return EQUAL;
-  }
-}
-
-
 void ControlInstruction::EmitBranchOnValue(FlowGraphCompiler* compiler,
                                            bool value) {
   if (value && !compiler->CanFallThroughTo(true_successor())) {
diff --git a/runtime/vm/intrinsifier.h b/runtime/vm/intrinsifier.h
index f57a929..0716629 100644
--- a/runtime/vm/intrinsifier.h
+++ b/runtime/vm/intrinsifier.h
@@ -80,6 +80,8 @@
   V(_StringBase, get:length, String_getLength, 320803993)                      \
   V(_StringBase, codeUnitAt, String_codeUnitAt, 984449525)                     \
   V(_OneByteString, get:hashCode, OneByteString_getHashCode, 682660413)        \
+  V(_OneByteString, _substringUncheckedNative,                                 \
+      OneByteString_substringUnchecked, 713121438)                             \
 
 
 #define MATH_LIB_INTRINSIC_LIST(V)                                             \
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index 1f86747..2e8f6ea 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -335,6 +335,11 @@
   return false;
 }
 
+
+bool Intrinsifier::OneByteString_substringUnchecked(Assembler* assembler) {
+  return false;
+}
+
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_ARM
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc
index fc32498..3a00aed 100644
--- a/runtime/vm/intrinsifier_ia32.cc
+++ b/runtime/vm/intrinsifier_ia32.cc
@@ -1498,6 +1498,110 @@
   return true;
 }
 
+
+// Allocates one-byte string of length 'end - start'. The content is not
+// initialized.
+static void TryAllocateOnebyteString(Assembler* assembler,
+                                     Label* failure,
+                                     intptr_t start_index_offset,
+                                     intptr_t end_index_offset) {
+  __ movl(EDI, Address(ESP, + end_index_offset));
+  __ subl(EDI, Address(ESP, + start_index_offset));
+  const intptr_t fixed_size = sizeof(RawString) + kObjectAlignment - 1;
+  __ SmiUntag(EDI);
+  __ leal(EDI, Address(EDI, TIMES_1, fixed_size));  // EDI is a Smi.
+  __ andl(EDI, Immediate(-kObjectAlignment));
+
+  Isolate* isolate = Isolate::Current();
+  Heap* heap = isolate->heap();
+
+  __ movl(EAX, Address::Absolute(heap->TopAddress()));
+  __ movl(EBX, EAX);
+
+  // EDI: allocation size.
+  __ addl(EBX, EDI);
+  __ j(CARRY, failure);
+
+  // Check if the allocation fits into the remaining space.
+  // EAX: potential new object start.
+  // EBX: potential next object start.
+  // EDI: allocation size.
+  __ cmpl(EBX, Address::Absolute(heap->EndAddress()));
+  __ j(ABOVE_EQUAL, failure);
+
+  // Successfully allocated the object(s), now update top to point to
+  // next object start and initialize the object.
+  __ movl(Address::Absolute(heap->TopAddress()), EBX);
+  __ addl(EAX, Immediate(kHeapObjectTag));
+
+  // Initialize the tags.
+  // EAX: new object start as a tagged pointer.
+  // EBX: new object end address.
+  // EDI: allocation size.
+  {
+    Label size_tag_overflow, done;
+    __ cmpl(EDI, Immediate(RawObject::SizeTag::kMaxSizeTag));
+    __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
+    __ shll(EDI, Immediate(RawObject::kSizeTagBit - kObjectAlignmentLog2));
+    __ jmp(&done, Assembler::kNearJump);
+
+    __ Bind(&size_tag_overflow);
+    __ xorl(EDI, EDI);
+    __ Bind(&done);
+
+    // Get the class index and insert it into the tags.
+    const Class& cls =
+        Class::Handle(isolate->object_store()->one_byte_string_class());
+    __ orl(EDI, Immediate(RawObject::ClassIdTag::encode(cls.id())));
+    __ movl(FieldAddress(EAX, String::tags_offset()), EDI);  // Tags.
+  }
+
+  // Set the length field.
+  __ movl(EDI, Address(ESP, + end_index_offset));
+  __ subl(EDI, Address(ESP, + start_index_offset));  // Length.
+  __ StoreIntoObjectNoBarrier(EAX,
+                              FieldAddress(EAX, String::length_offset()),
+                              EDI);
+  // Clear hash.
+  __ movl(FieldAddress(EAX, String::hash_offset()), Immediate(0));
+}
+
+
+// Arg0: Onebyte String
+// Arg1: Start index as Smi.
+// Arg2: End index as Smi.
+// The indexes must be valid.
+bool Intrinsifier::OneByteString_substringUnchecked(Assembler* assembler) {
+  const intptr_t kStringOffset = 3 * kWordSize;
+  const intptr_t kStartIndexOffset = 2 * kWordSize;
+  const intptr_t kEndIndexOffset = 1 * kWordSize;
+  Label fall_through;
+  TryAllocateOnebyteString(
+      assembler, &fall_through, kStartIndexOffset, kEndIndexOffset);
+  // EAX: new string as tagged pointer.
+  // Copy string.
+  __ movl(EDI, Address(ESP, + kStringOffset));
+  __ movl(EBX, Address(ESP, + kStartIndexOffset));
+  __ SmiUntag(EBX);
+  __ leal(EDI, FieldAddress(EDI, EBX, TIMES_1, OneByteString::data_offset()));
+  // EDI: Start address to copy from (untagged).
+  // EBX: Untagged start index.
+  __ movl(ECX, Address(ESP, + kEndIndexOffset));
+  __ SmiUntag(ECX);
+  __ subl(ECX, EBX);
+  // ECX: Untagged number of bytes to copy.
+  ASSERT(CTX == ESI);
+  __ pushl(ESI);  // Preserve CTX.
+  __ movl(ESI, EDI);  // from.
+  __ leal(EDI, FieldAddress(EAX, OneByteString::data_offset()));  // to.
+  __ rep_movsb();
+  __ popl(ESI);  // Restore CTX.
+
+  __ ret();
+  __ Bind(&fall_through);
+  return false;
+}
+
 #undef __
 }  // namespace dart
 
diff --git a/runtime/vm/intrinsifier_mips.cc b/runtime/vm/intrinsifier_mips.cc
index a93d678..7b47cdf 100644
--- a/runtime/vm/intrinsifier_mips.cc
+++ b/runtime/vm/intrinsifier_mips.cc
@@ -335,6 +335,11 @@
   return false;
 }
 
+
+bool Intrinsifier::OneByteString_substringUnchecked(Assembler* assembler) {
+  return false;
+}
+
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_MIPS
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc
index 231eacc..3e65b9f 100644
--- a/runtime/vm/intrinsifier_x64.cc
+++ b/runtime/vm/intrinsifier_x64.cc
@@ -1420,6 +1420,109 @@
 }
 
 
+// Allocates one-byte string of length 'end - start'. The content is not
+// initialized.
+static void TryAllocateOnebyteString(Assembler* assembler,
+                                     Label* failure,
+                                     intptr_t start_index_offset,
+                                     intptr_t end_index_offset) {
+  __ movq(RDI, Address(RSP, + end_index_offset));
+  __ subq(RDI, Address(RSP, + start_index_offset));
+  const intptr_t fixed_size = sizeof(RawString) + kObjectAlignment - 1;
+  __ SmiUntag(RDI);
+  __ leaq(RDI, Address(RDI, TIMES_1, fixed_size));  // RDI is a Smi.
+  __ andq(RDI, Immediate(-kObjectAlignment));
+
+  Isolate* isolate = Isolate::Current();
+  Heap* heap = isolate->heap();
+
+  __ movq(RAX, Immediate(heap->TopAddress()));
+  __ movq(RAX, Address(RAX, 0));
+
+  // RDI: allocation size.
+  __ movq(RCX, RAX);
+  __ addq(RCX, RDI);
+  __ j(CARRY, failure);
+
+  // Check if the allocation fits into the remaining space.
+  // RAX: potential new object start.
+  // RCX: potential next object start.
+  // RDI: allocation size.
+  __ movq(R13, Immediate(heap->EndAddress()));
+  __ cmpq(RCX, Address(R13, 0));
+  __ j(ABOVE_EQUAL, failure);
+
+  // Successfully allocated the object(s), now update top to point to
+  // next object start and initialize the object.
+  __ movq(R13, Immediate(heap->TopAddress()));
+  __ movq(Address(R13, 0), RCX);
+  __ addq(RAX, Immediate(kHeapObjectTag));
+
+  // Initialize the tags.
+  // RAX: new object start as a tagged pointer.
+  // RDI: allocation size.
+  {
+    Label size_tag_overflow, done;
+    __ cmpq(RDI, Immediate(RawObject::SizeTag::kMaxSizeTag));
+    __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
+    __ shlq(RDI, Immediate(RawObject::kSizeTagBit - kObjectAlignmentLog2));
+    __ jmp(&done, Assembler::kNearJump);
+
+    __ Bind(&size_tag_overflow);
+    __ xorq(RDI, RDI);
+    __ Bind(&done);
+
+    // Get the class index and insert it into the tags.
+    const Class& cls =
+        Class::Handle(isolate->object_store()->one_byte_string_class());
+    __ orq(RDI, Immediate(RawObject::ClassIdTag::encode(cls.id())));
+    __ movq(FieldAddress(RAX, String::tags_offset()), RDI);  // Tags.
+  }
+
+  // Set the length field.
+  __ movq(RDI, Address(RSP, + end_index_offset));
+  __ subq(RDI, Address(RSP, + start_index_offset));  // Length.
+  __ StoreIntoObjectNoBarrier(RAX,
+                              FieldAddress(RAX, String::length_offset()),
+                              RDI);
+  // Clear hash.
+  __ movq(FieldAddress(RAX, String::hash_offset()), Immediate(0));
+}
+
+
+// Arg0: Onebyte String
+// Arg1: Start index as Smi.
+// Arg2: End index as Smi.
+// The indexes must be valid.
+bool Intrinsifier::OneByteString_substringUnchecked(Assembler* assembler) {
+  const intptr_t kStringOffset = 3 * kWordSize;
+  const intptr_t kStartIndexOffset = 2 * kWordSize;
+  const intptr_t kEndIndexOffset = 1 * kWordSize;
+  Label fall_through;
+  TryAllocateOnebyteString(
+      assembler, &fall_through, kStartIndexOffset, kEndIndexOffset);
+  // RAX: new string as tagged pointer.
+  // Copy string.
+  __ movq(RSI, Address(RSP, + kStringOffset));
+  __ movq(RBX, Address(RSP, + kStartIndexOffset));
+  __ SmiUntag(RBX);
+  __ leaq(RSI, FieldAddress(RSI, RBX, TIMES_1, OneByteString::data_offset()));
+  // RDI: Start address to copy from (untagged).
+  // RBX: Untagged start index.
+  __ movq(RCX, Address(RSP, + kEndIndexOffset));
+  __ SmiUntag(RCX);
+  __ subq(RCX, RBX);
+  // RCX: Untagged number of bytes to copy.
+
+  __ leaq(RDI, FieldAddress(RAX, OneByteString::data_offset()));  // to.
+  __ rep_movsb();
+
+  __ ret();
+  __ Bind(&fall_through);
+  return false;
+}
+
+
 #undef __
 
 }  // namespace dart
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index c5e68536..d67b4e1 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -337,6 +337,7 @@
       saved_stack_limit_(0),
       message_handler_(NULL),
       spawn_data_(0),
+      is_runnable_(false),
       gc_prologue_callbacks_(),
       gc_epilogue_callbacks_(),
       deopt_cpu_registers_copy_(NULL),
@@ -480,6 +481,109 @@
 }
 
 
+bool Isolate::MakeRunnable() {
+  ASSERT(Isolate::Current() == NULL);
+  // Can't use MutexLocker here because MutexLocker is
+  // a StackResource, which requires a current isolate.
+  mutex_->Lock();
+  // Check if we are in a valid state to make the isolate runnable.
+  if (is_runnable_ == true) {
+    mutex_->Unlock();
+    return false;  // Already runnable.
+  }
+  // Set the isolate as runnable and if we are being spawned schedule
+  // isolate on thread pool for execution.
+  is_runnable_ = true;
+  IsolateSpawnState* state = reinterpret_cast<IsolateSpawnState*>(spawn_data());
+  if (state != NULL) {
+    ASSERT(this == state->isolate());
+    Run();
+  }
+  mutex_->Unlock();
+  return true;
+}
+
+
+static void StoreError(Isolate* isolate, const Object& obj) {
+  ASSERT(obj.IsError());
+  isolate->object_store()->set_sticky_error(Error::Cast(obj));
+}
+
+
+static bool RunIsolate(uword parameter) {
+  Isolate* isolate = reinterpret_cast<Isolate*>(parameter);
+  IsolateSpawnState* state = NULL;
+  {
+    MutexLocker ml(isolate->mutex());
+    state = reinterpret_cast<IsolateSpawnState*>(isolate->spawn_data());
+    isolate->set_spawn_data(0);
+  }
+  {
+    StartIsolateScope start_scope(isolate);
+    StackZone zone(isolate);
+    HandleScope handle_scope(isolate);
+    if (!ClassFinalizer::FinalizePendingClasses()) {
+      // Error is in sticky error already.
+      return false;
+    }
+
+    // Set up specific unhandled exception handler.
+    const String& callback_name = String::Handle(
+        isolate, String::New(state->exception_callback_name()));
+    isolate->object_store()->
+        set_unhandled_exception_handler(callback_name);
+
+    Object& result = Object::Handle();
+    result = state->ResolveFunction();
+    delete state;
+    state = NULL;
+    if (result.IsError()) {
+      StoreError(isolate, result);
+      return false;
+    }
+    ASSERT(result.IsFunction());
+    Function& func = Function::Handle(isolate);
+    func ^= result.raw();
+    result = DartEntry::InvokeFunction(func, Object::empty_array());
+    if (result.IsError()) {
+      StoreError(isolate, result);
+      return false;
+    }
+  }
+  return true;
+}
+
+
+static void ShutdownIsolate(uword parameter) {
+  Isolate* isolate = reinterpret_cast<Isolate*>(parameter);
+  {
+    // Print the error if there is one.  This may execute dart code to
+    // print the exception object, so we need to use a StartIsolateScope.
+    StartIsolateScope start_scope(isolate);
+    StackZone zone(isolate);
+    HandleScope handle_scope(isolate);
+    Error& error = Error::Handle();
+    error = isolate->object_store()->sticky_error();
+    if (!error.IsNull()) {
+      OS::PrintErr("in ShutdownIsolate: %s\n", error.ToErrorCString());
+    }
+  }
+  {
+    // Shut the isolate down.
+    SwitchIsolateScope switch_scope(isolate);
+    Dart::ShutdownIsolate();
+  }
+}
+
+
+void Isolate::Run() {
+  message_handler()->Run(Dart::thread_pool(),
+                         RunIsolate,
+                         ShutdownIsolate,
+                         reinterpret_cast<uword>(this));
+}
+
+
 uword Isolate::GetAndClearInterrupts() {
   MutexLocker ml(mutex_);
   if (stack_limit_ == saved_stack_limit_) {
@@ -878,4 +982,94 @@
   return NULL;  // Unimplemented query.
 }
 
+
+static char* GetRootScriptUri(Isolate* isolate) {
+  const Library& library =
+      Library::Handle(isolate->object_store()->root_library());
+  ASSERT(!library.IsNull());
+  const String& script_name = String::Handle(library.url());
+  return isolate->current_zone()->MakeCopyOfString(script_name.ToCString());
+}
+
+
+IsolateSpawnState::IsolateSpawnState(const Function& func,
+                                     const Function& callback_func)
+    : isolate_(NULL),
+      script_url_(NULL),
+      library_url_(NULL),
+      function_name_(NULL),
+      exception_callback_name_(NULL) {
+  script_url_ = strdup(GetRootScriptUri(Isolate::Current()));
+  const Class& cls = Class::Handle(func.Owner());
+  ASSERT(cls.IsTopLevel());
+  const Library& lib = Library::Handle(cls.library());
+  const String& lib_url = String::Handle(lib.url());
+  library_url_ = strdup(lib_url.ToCString());
+
+  const String& func_name = String::Handle(func.name());
+  function_name_ = strdup(func_name.ToCString());
+  if (!callback_func.IsNull()) {
+    const String& callback_name = String::Handle(callback_func.name());
+    exception_callback_name_ = strdup(callback_name.ToCString());
+  } else {
+    exception_callback_name_ = strdup("_unhandledExceptionCallback");
+  }
+}
+
+
+IsolateSpawnState::IsolateSpawnState(const char* script_url)
+    : isolate_(NULL),
+      library_url_(NULL),
+      function_name_(NULL),
+      exception_callback_name_(NULL) {
+  script_url_ = strdup(script_url);
+  library_url_ = NULL;
+  function_name_ = strdup("main");
+  exception_callback_name_ = strdup("_unhandledExceptionCallback");
+}
+
+
+IsolateSpawnState::~IsolateSpawnState() {
+  free(script_url_);
+  free(library_url_);
+  free(function_name_);
+  free(exception_callback_name_);
+}
+
+
+RawObject* IsolateSpawnState::ResolveFunction() {
+  // Resolve the library.
+  Library& lib = Library::Handle();
+  if (library_url()) {
+    const String& lib_url = String::Handle(String::New(library_url()));
+    lib = Library::LookupLibrary(lib_url);
+    if (lib.IsNull() || lib.IsError()) {
+      const String& msg = String::Handle(String::NewFormatted(
+          "Unable to find library '%s'.", library_url()));
+      return LanguageError::New(msg);
+    }
+  } else {
+    lib = isolate()->object_store()->root_library();
+  }
+  ASSERT(!lib.IsNull());
+
+  // Resolve the function.
+  const String& func_name =
+      String::Handle(String::New(function_name()));
+  const Function& func = Function::Handle(lib.LookupLocalFunction(func_name));
+  if (func.IsNull()) {
+    const String& msg = String::Handle(String::NewFormatted(
+        "Unable to resolve function '%s' in library '%s'.",
+        function_name(), (library_url() ? library_url() : script_url())));
+    return LanguageError::New(msg);
+  }
+  return func.raw();
+}
+
+
+void IsolateSpawnState::Cleanup() {
+  SwitchIsolateScope switch_scope(isolate());
+  Dart::ShutdownIsolate();
+}
+
 }  // namespace dart
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index c2e1523..05c05b4 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -21,6 +21,7 @@
 class ApiState;
 class CodeIndexTable;
 class Debugger;
+class Function;
 class HandleScope;
 class HandleVisitor;
 class Heap;
@@ -35,6 +36,7 @@
 class RawContext;
 class RawDouble;
 class RawMint;
+class RawObject;
 class RawInteger;
 class RawError;
 class Simulator;
@@ -274,13 +276,22 @@
   void ScheduleInterrupts(uword interrupt_bits);
   uword GetAndClearInterrupts();
 
+  bool MakeRunnable();
+  void Run();
+
   MessageHandler* message_handler() const { return message_handler_; }
   void set_message_handler(MessageHandler* value) { message_handler_ = value; }
 
+  bool is_runnable() const { return is_runnable_; }
+  void set_is_runnable(bool value) { is_runnable_ = value; }
+
   uword spawn_data() const { return spawn_data_; }
   void set_spawn_data(uword value) { spawn_data_ = value; }
 
   static const intptr_t kNoDeoptId = -1;
+  static const intptr_t kDeoptIdStep = 2;
+  static const intptr_t kDeoptIdBeforeOffset = 0;
+  static const intptr_t kDeoptIdAfterOffset = 1;
   intptr_t deopt_id() const { return deopt_id_; }
   void set_deopt_id(int value) {
     ASSERT(value >= 0);
@@ -288,13 +299,30 @@
   }
   intptr_t GetNextDeoptId() {
     ASSERT(deopt_id_ != kNoDeoptId);
-    return deopt_id_++;
+    const intptr_t id = deopt_id_;
+    deopt_id_ += kDeoptIdStep;
+    return id;
+  }
+
+  static intptr_t ToDeoptAfter(intptr_t deopt_id) {
+    ASSERT(IsDeoptBefore(deopt_id));
+    return deopt_id + kDeoptIdAfterOffset;
+  }
+
+  static bool IsDeoptBefore(intptr_t deopt_id) {
+    return (deopt_id % kDeoptIdStep) == kDeoptIdBeforeOffset;
+  }
+
+  static bool IsDeoptAfter(intptr_t deopt_id) {
+    return (deopt_id % kDeoptIdStep) == kDeoptIdAfterOffset;
   }
 
   RawArray* ic_data_array() const { return ic_data_array_; }
   void set_ic_data_array(RawArray* value) { ic_data_array_ = value; }
   ICData* GetICDataForDeoptId(intptr_t deopt_id) const;
 
+  Mutex* mutex() const { return mutex_; }
+
   Debugger* debugger() const { return debugger_; }
 
   Simulator* simulator() const { return simulator_; }
@@ -463,6 +491,7 @@
   uword saved_stack_limit_;
   MessageHandler* message_handler_;
   uword spawn_data_;
+  bool is_runnable_;
   GcPrologueCallbacks gc_prologue_callbacks_;
   GcEpilogueCallbacks gc_epilogue_callbacks_;
 
@@ -553,6 +582,31 @@
   DISALLOW_COPY_AND_ASSIGN(SwitchIsolateScope);
 };
 
+
+class IsolateSpawnState {
+ public:
+  IsolateSpawnState(const Function& func, const Function& callback_func);
+  explicit IsolateSpawnState(const char* script_url);
+  ~IsolateSpawnState();
+
+  Isolate* isolate() const { return isolate_; }
+  void set_isolate(Isolate* value) { isolate_ = value; }
+  char* script_url() const { return script_url_; }
+  char* library_url() const { return library_url_; }
+  char* function_name() const { return function_name_; }
+  char* exception_callback_name() const { return exception_callback_name_; }
+
+  RawObject* ResolveFunction();
+  void Cleanup();
+
+ private:
+  Isolate* isolate_;
+  char* script_url_;
+  char* library_url_;
+  char* function_name_;
+  char* exception_callback_name_;
+};
+
 }  // namespace dart
 
 #endif  // VM_ISOLATE_H_
diff --git a/runtime/vm/locations.cc b/runtime/vm/locations.cc
index 58ecdd9..1f8e01b 100644
--- a/runtime/vm/locations.cc
+++ b/runtime/vm/locations.cc
@@ -105,8 +105,7 @@
     case kFpuRegister: return Assembler::FpuRegisterName(fpu_reg());
     case kStackSlot: return "S";
     case kDoubleStackSlot: return "DS";
-    case kFloat32x4StackSlot: return "F32x4S";
-    case kUint32x4StackSlot: return "UI32x4S";
+    case kQuadStackSlot: return "QS";
     case kUnallocated:
       switch (policy()) {
         case kAny:
diff --git a/runtime/vm/locations.h b/runtime/vm/locations.h
index 031a290..d74b91c 100644
--- a/runtime/vm/locations.h
+++ b/runtime/vm/locations.h
@@ -35,7 +35,12 @@
 // low 3 bits denote location kind, rest is kind specific location payload
 // e.g. for REGISTER kind payload is register code (value of the Register
 // enumeration), constant locations contain a tagged (low 2 bits are set to 01)
-// Object handle
+// Object handle.
+//
+// Locations must satisfy the following invariant: if two locations' encodings
+// are bitwise unequal then these two locations are guaranteed to be disjoint.
+// Properties like representation belong to the value that is stored in
+// the location not to the location itself.
 class Location : public ValueObject {
  private:
   enum {
@@ -54,6 +59,9 @@
   // Constant payload can overlap with kind field so Kind values
   // have to be chosen in a way that their last 2 bits are never
   // the same as kConstant.
+  // Note that two locations with different kinds should never point to
+  // the same place. For example kQuadStackSlot location should never intersect
+  // with kDoubleStackSlot location.
   enum Kind {
     // This location is invalid.  Payload must be zero.
     kInvalid = 0,
@@ -67,12 +75,11 @@
     // contains register allocation policy.
     kUnallocated = 2,
 
-    // Spill slot allocated by the register allocator.  Payload contains
+    // Spill slots allocated by the register allocator.  Payload contains
     // a spill index.
-    kStackSlot = 3,
-    kDoubleStackSlot = 4,
-    kFloat32x4StackSlot = 8,
-    kUint32x4StackSlot = 10,
+    kStackSlot = 3,  // Word size slot.
+    kDoubleStackSlot = 4,  // 64bit stack slot.
+    kQuadStackSlot = 8,  // 128bit stack slot.
 
     // Register location represents a fixed register.  Payload contains
     // register code.
@@ -175,11 +182,8 @@
   }
 
   // Register locations.
-  static Location RegisterLocation(Register reg, Representation rep = kTagged) {
-    uword payload =
-        RegisterField::encode(reg) |
-        RepresentationField::encode(rep);
-    return Location(kRegister, payload);
+  static Location RegisterLocation(Register reg) {
+    return Location(kRegister, reg);
   }
 
   bool IsRegister() const {
@@ -188,19 +192,12 @@
 
   Register reg() const {
     ASSERT(IsRegister());
-    return RegisterField::decode(payload());
-  }
-
-
-  Representation representation() const {
-    return RepresentationField::decode(payload());
+    return static_cast<Register>(payload());
   }
 
   // FpuRegister locations.
-  static Location FpuRegisterLocation(FpuRegister reg, Representation rep) {
-    uword payload =
-        FpuRegisterField::encode(reg) | RepresentationField::encode(rep);
-    return Location(kFpuRegister, payload);
+  static Location FpuRegisterLocation(FpuRegister reg) {
+    return Location(kFpuRegister, reg);
   }
 
   bool IsFpuRegister() const {
@@ -209,7 +206,7 @@
 
   FpuRegister fpu_reg() const {
     ASSERT(IsFpuRegister());
-    return FpuRegisterField::decode(payload());
+    return static_cast<FpuRegister>(payload());
   }
 
   static bool IsMachineRegisterKind(Kind kind) {
@@ -217,13 +214,12 @@
   }
 
   static Location MachineRegisterLocation(Kind kind,
-                                          intptr_t reg,
-                                          Representation rep) {
+                                          intptr_t reg) {
     if (kind == kRegister) {
       return RegisterLocation(static_cast<Register>(reg));
     } else {
       ASSERT(kind == kFpuRegister);
-      return FpuRegisterLocation(static_cast<FpuRegister>(reg), rep);
+      return FpuRegisterLocation(static_cast<FpuRegister>(reg));
     }
   }
 
@@ -233,22 +229,18 @@
 
   intptr_t register_code() const {
     ASSERT(IsMachineRegister());
-    return static_cast<intptr_t>(RegisterField::decode(payload()));
+    return static_cast<intptr_t>(payload());
   }
 
-  static uword make_stack_index_payload(intptr_t stack_index,
-                                        Representation rep) {
+  static uword EncodeStackIndex(intptr_t stack_index) {
     ASSERT((-kStackIndexBias <= stack_index) &&
-       (stack_index < kStackIndexBias));
-    uword payload =
-      IndexField::encode(static_cast<uword>(kStackIndexBias + stack_index));
-    return payload | RepresentationField::encode(rep);
+           (stack_index < kStackIndexBias));
+    return static_cast<uword>(kStackIndexBias + stack_index);
   }
 
   // Spill slots.
-  static Location StackSlot(intptr_t stack_index,
-                            Representation rep = kTagged) {
-    uword payload = make_stack_index_payload(stack_index, rep);
+  static Location StackSlot(intptr_t stack_index) {
+    uword payload = EncodeStackIndex(stack_index);
     Location loc(kStackSlot, payload);
     // Ensure that sign is preserved.
     ASSERT(loc.stack_index() == stack_index);
@@ -259,8 +251,8 @@
     return kind() == kStackSlot;
   }
 
-  static Location DoubleStackSlot(intptr_t stack_index, Representation rep) {
-    uword payload = make_stack_index_payload(stack_index, rep);
+  static Location DoubleStackSlot(intptr_t stack_index) {
+    uword payload = EncodeStackIndex(stack_index);
     Location loc(kDoubleStackSlot, payload);
     // Ensure that sign is preserved.
     ASSERT(loc.stack_index() == stack_index);
@@ -271,36 +263,22 @@
     return kind() == kDoubleStackSlot;
   }
 
-  static Location Float32x4StackSlot(intptr_t stack_index) {
-    uword payload = make_stack_index_payload(stack_index, kUnboxedFloat32x4);
-    Location loc(kFloat32x4StackSlot, payload);
+  static Location QuadStackSlot(intptr_t stack_index) {
+    uword payload = EncodeStackIndex(stack_index);
+    Location loc(kQuadStackSlot, payload);
     // Ensure that sign is preserved.
     ASSERT(loc.stack_index() == stack_index);
     return loc;
   }
 
-  bool IsFloat32x4StackSlot() const {
-    return kind() == kFloat32x4StackSlot;
+  bool IsQuadStackSlot() const {
+    return kind() == kQuadStackSlot;
   }
 
-  static Location Uint32x4StackSlot(intptr_t stack_index) {
-    uword payload = make_stack_index_payload(stack_index, kUnboxedUint32x4);
-    Location loc(kUint32x4StackSlot, payload);
-    // Ensure that sign is preserved.
-    ASSERT(loc.stack_index() == stack_index);
-    return loc;
-  }
-
-  bool IsUint32x4StackSlot() const {
-    return kind() == kUint32x4StackSlot;
-  }
-
-
   intptr_t stack_index() const {
-    ASSERT(IsStackSlot() || IsDoubleStackSlot() || IsFloat32x4StackSlot() ||
-           IsUint32x4StackSlot());
+    ASSERT(IsStackSlot() || IsDoubleStackSlot() || IsQuadStackSlot());
     // Decode stack index manually to preserve sign.
-    return IndexField::decode(payload()) - kStackIndexBias;
+    return payload() - kStackIndexBias;
   }
 
   // Return a memory operand for stack slot locations.
@@ -344,30 +322,9 @@
   // Layout for kUnallocated locations payload.
   typedef BitField<Policy, 0, 3> PolicyField;
 
-  // Layout for register locations payload.
-  static const intptr_t kBitsForRepresentation = 3;
-  COMPILE_ASSERT(kNumRepresentations <= (1 << kBitsForRepresentation),
-                 invalid_enum);
-  static const intptr_t kBitsForRegister =
-      kBitsForPayload - kBitsForRepresentation;
-  typedef BitField<Representation,
-                   0,
-                   kBitsForRepresentation> RepresentationField;
-  typedef BitField<Register,
-                   kBitsForRepresentation,
-                   kBitsForRegister> RegisterField;
-  typedef BitField<FpuRegister,
-                   kBitsForRepresentation,
-                   kBitsForRegister> FpuRegisterField;
-
   // Layout for stack slots.
-  static const intptr_t kBitsForIndex =
-      kBitsForPayload - kBitsForRepresentation;
-  typedef BitField<uword,
-                   kBitsForRepresentation,
-                   kBitsForIndex> IndexField;
   static const intptr_t kStackIndexBias =
-      static_cast<intptr_t>(1) << (kBitsForIndex - 1);
+      static_cast<intptr_t>(1) << (kBitsForPayload - 1);
 
   // Location either contains kind and payload fields or a tagged handle for
   // a constant locations. Values of enumeration Kind are selected in such a
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 45a0147..ded68b8 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -194,7 +194,11 @@
   intptr_t dot_pos = len;  // Position of '.' in the name.
   bool is_setter = false;
 
-  for (int i = 0; i < name.Length(); i++) {
+  if (name.Equals(Symbols::TopLevel())) {
+    // Name of invisible top-level class.
+    return Symbols::Empty().raw();
+  }
+  for (int i = start; i < name.Length(); i++) {
     if (name.CharAt(i) == ':') {
       ASSERT(start == 0);
       if (name.CharAt(0) == 's') {
@@ -910,6 +914,19 @@
   object_store->set_uint32x4_class(cls);
   RegisterPrivateClass(cls, Symbols::_Uint32x4(), lib);
 
+  cls = Class::New<Instance>(Symbols::Float32x4(), script,
+                             Scanner::kDummyTokenIndex);
+  RegisterClass(cls, Symbols::Float32x4(), lib);
+  pending_classes.Add(cls, Heap::kOld);
+  type = Type::NewNonParameterizedType(cls);
+  object_store->set_float32x4_type(type);
+
+  cls = Class::New<Instance>(Symbols::Uint32x4(), script,
+                             Scanner::kDummyTokenIndex);
+  pending_classes.Add(cls, Heap::kOld);
+  type = Type::NewNonParameterizedType(cls);
+  object_store->set_uint32x4_type(type);
+
   object_store->set_typeddata_classes(typeddata_classes);
 
   // Set the super type of class Stacktrace to Object type so that the
@@ -6923,8 +6940,7 @@
 
 const char* PcDescriptors::KindAsStr(intptr_t index) const {
   switch (DescriptorKind(index)) {
-    case PcDescriptors::kDeoptBefore:   return "deopt-before ";
-    case PcDescriptors::kDeoptAfter:    return "deopt-after  ";
+    case PcDescriptors::kDeopt:         return "deopt ";
     case PcDescriptors::kEntryPatch:    return "entry-patch  ";
     case PcDescriptors::kPatchCode:     return "patch        ";
     case PcDescriptors::kLazyDeoptJump: return "lazy-deopt   ";
@@ -7005,10 +7021,19 @@
     PcDescriptors::Kind kind = DescriptorKind(i);
     // 'deopt_id' is set for kDeopt and kIcCall and must be unique for one kind.
     intptr_t deopt_id = Isolate::kNoDeoptId;
-    if ((DescriptorKind(i) == PcDescriptors::kDeoptBefore) ||
-        (DescriptorKind(i) == PcDescriptors::kIcCall)) {
-      deopt_id = DeoptId(i);
+    if ((DescriptorKind(i) != PcDescriptors::kDeopt) ||
+        (DescriptorKind(i) != PcDescriptors::kIcCall)) {
+      continue;
     }
+
+    deopt_id = DeoptId(i);
+    if (Isolate::IsDeoptAfter(deopt_id)) {
+      // TODO(vegorov): some instructions contain multiple calls and have
+      // multiple "after" targets recorded. Right now it is benign but might
+      // lead to issues in the future. Fix that and enable verification.
+      continue;
+    }
+
     for (intptr_t k = i + 1; k < Length(); k++) {
       if (kind == DescriptorKind(k)) {
         if (deopt_id != Isolate::kNoDeoptId) {
@@ -7750,18 +7775,6 @@
 }
 
 
-uword Code::GetDeoptBeforePcAtDeoptId(intptr_t deopt_id) const {
-  ASSERT(!is_optimized());
-  return GetPcForDeoptId(deopt_id, PcDescriptors::kDeoptBefore);
-}
-
-
-uword Code::GetDeoptAfterPcAtDeoptId(intptr_t deopt_id) const {
-  ASSERT(!is_optimized());
-  return GetPcForDeoptId(deopt_id, PcDescriptors::kDeoptAfter);
-}
-
-
 const char* Code::ToCString() const {
   const char* kFormat = "Code entry:%p";
   intptr_t len = OS::SNPrint(NULL, 0, kFormat, EntryPoint()) + 1;
@@ -9242,6 +9255,18 @@
 }
 
 
+bool AbstractType::IsFloat32x4Type() const {
+  return HasResolvedTypeClass() &&
+      (type_class() == Type::Handle(Type::Float32x4()).type_class());
+}
+
+
+bool AbstractType::IsUint32x4Type() const {
+  return HasResolvedTypeClass() &&
+      (type_class() == Type::Handle(Type::Uint32x4()).type_class());
+}
+
+
 bool AbstractType::IsNumberType() const {
   return HasResolvedTypeClass() &&
       (type_class() == Type::Handle(Type::Number()).type_class());
@@ -9390,6 +9415,16 @@
 }
 
 
+RawType* Type::Float32x4() {
+  return Isolate::Current()->object_store()->float32x4_type();
+}
+
+
+RawType* Type::Uint32x4() {
+  return Isolate::Current()->object_store()->uint32x4_type();
+}
+
+
 RawType* Type::Number() {
   return Isolate::Current()->object_store()->number_type();
 }
@@ -10607,29 +10642,9 @@
 }
 
 
-static bool IsWhiteSpace(char ch) {
-  return ch == '\0' || ch == '\n' || ch == '\r' || ch == ' ' || ch == '\t';
-}
-
-
-static bool StringToDouble(const String& str, double* double_value) {
-  ASSERT(double_value != NULL);
-  // TODO(regis): For now, we use strtod to convert a string to double.
-  const char* nptr = str.ToCString();
-  char* endptr = NULL;
-  *double_value = strtod(nptr, &endptr);
-  // We do not treat overflow or underflow as an error and therefore do not
-  // check errno for ERANGE.
-  if (!IsWhiteSpace(*endptr)) {
-    return false;
-  }
-  return true;
-}
-
-
 RawDouble* Double::New(const String& str, Heap::Space space) {
   double double_value;
-  if (!StringToDouble(str, &double_value)) {
+  if (!CStringToDouble(str.ToCString(), str.Length(), &double_value)) {
     return Double::Handle().raw();
   }
   return New(double_value, space);
@@ -10666,7 +10681,7 @@
 
 RawDouble* Double::NewCanonical(const String& str) {
   double double_value;
-  if (!StringToDouble(str, &double_value)) {
+  if (!CStringToDouble(str.ToCString(), str.Length(), &double_value)) {
     return Double::Handle().raw();
   }
   return NewCanonical(double_value);
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 6d73f43..5473069 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -2393,8 +2393,7 @@
 
  public:
   enum Kind {
-    kDeoptBefore = 0,  // Deoptimization continuation point before instruction.
-    kDeoptAfter,       // Deoptimization continuation point after instruction.
+    kDeopt,            // Deoptimization continuation point.
     kEntryPatch,       // Location where to patch entry.
     kPatchCode,        // Buffer for patching code entry.
     kLazyDeoptJump,    // Lazy deoptimization trampoline.
@@ -2810,9 +2809,6 @@
   uword GetPatchCodePc() const;
   uword GetLazyDeoptPc() const;
 
-  uword GetDeoptBeforePcAtDeoptId(intptr_t deopt_id) const;
-  uword GetDeoptAfterPcAtDeoptId(intptr_t deopt_id) const;
-
   uword GetPcForDeoptId(intptr_t deopt_id, PcDescriptors::Kind kind) const;
 
   // Returns true if there is an object in the code between 'start_offset'
@@ -3510,6 +3506,12 @@
   // Check if this type represents the 'double' type.
   bool IsDoubleType() const;
 
+  // Check if this type represents the 'Float32x4' type.
+  bool IsFloat32x4Type() const;
+
+  // Check if this type represents the 'Uint32x4' type.
+  bool IsUint32x4Type() const;
+
   // Check if this type represents the 'num' type.
   bool IsNumberType() const;
 
@@ -3622,6 +3624,12 @@
   // The 'double' type.
   static RawType* Double();
 
+  // The 'Float32x4' type.
+  static RawType* Float32x4();
+
+  // The 'Uint32x4' type.
+  static RawType* Uint32x4();
+
   // The 'num' type.
   static RawType* Number();
 
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index fde7670..5ceabd5 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -181,6 +181,9 @@
     float32x4_class_ = value.raw();
   }
 
+  RawType* float32x4_type() const { return float32x4_type_; }
+  void set_float32x4_type(const Type& value) { float32x4_type_ = value.raw(); }
+
   RawClass* uint32x4_class() const {
     return uint32x4_class_;
   }
@@ -188,6 +191,9 @@
     uint32x4_class_ = value.raw();
   }
 
+  RawType* uint32x4_type() const { return uint32x4_type_; }
+  void set_uint32x4_type(const Type& value) { uint32x4_type_ = value.raw(); }
+
   RawArray* typeddata_classes() const {
     return typeddata_classes_;
   }
@@ -442,6 +448,8 @@
   RawClass* bigint_class_;
   RawClass* double_class_;
   RawType* double_type_;
+  RawType* float32x4_type_;
+  RawType* uint32x4_type_;
   RawType* string_type_;
   RawClass* one_byte_string_class_;
   RawClass* two_byte_string_class_;
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 44d6e61..df54b52 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -2360,7 +2360,7 @@
   PcDescriptors& descriptors = PcDescriptors::Handle();
   descriptors ^= PcDescriptors::New(kNumEntries);
   descriptors.AddDescriptor(0, 10, PcDescriptors::kOther, 1, 20, 1);
-  descriptors.AddDescriptor(1, 20, PcDescriptors::kDeoptBefore, 2, 30, 0);
+  descriptors.AddDescriptor(1, 20, PcDescriptors::kDeopt, 2, 30, 0);
   descriptors.AddDescriptor(2, 30, PcDescriptors::kOther, 3, 40, 1);
   descriptors.AddDescriptor(3, 10, PcDescriptors::kOther, 4, 40, 2);
   descriptors.AddDescriptor(4, 10, PcDescriptors::kOther, 5, 80, 3);
@@ -2384,7 +2384,7 @@
   EXPECT_EQ(static_cast<uword>(80), pc_descs.PC(5));
   EXPECT_EQ(150, pc_descs.TokenPos(5));
   EXPECT_EQ(PcDescriptors::kOther, pc_descs.DescriptorKind(0));
-  EXPECT_EQ(PcDescriptors::kDeoptBefore, pc_descs.DescriptorKind(1));
+  EXPECT_EQ(PcDescriptors::kDeopt, pc_descs.DescriptorKind(1));
 }
 
 
diff --git a/runtime/vm/os_android.cc b/runtime/vm/os_android.cc
index 0bf5d36..6b19878 100644
--- a/runtime/vm/os_android.cc
+++ b/runtime/vm/os_android.cc
@@ -22,6 +22,7 @@
 #include "vm/dart.h"
 #include "vm/debuginfo.h"
 #include "vm/isolate.h"
+#include "vm/vtune.h"
 #include "vm/zone.h"
 
 
@@ -381,7 +382,7 @@
     CodeObservers::Register(new PprofCodeObserver);
   }
 #if defined(DART_VTUNE_SUPPORT)
-  Register(new VTuneCodeObserver);
+  CodeObservers::Register(new VTuneCodeObserver);
 #endif
 }
 
diff --git a/runtime/vm/os_linux.cc b/runtime/vm/os_linux.cc
index ab50b27..cf113b6 100644
--- a/runtime/vm/os_linux.cc
+++ b/runtime/vm/os_linux.cc
@@ -21,6 +21,7 @@
 #include "vm/dart.h"
 #include "vm/debuginfo.h"
 #include "vm/isolate.h"
+#include "vm/vtune.h"
 #include "vm/zone.h"
 
 
@@ -477,7 +478,7 @@
     CodeObservers::Register(new PprofCodeObserver);
   }
 #if defined(DART_VTUNE_SUPPORT)
-  Register(new VTuneCodeObserver);
+  CodeObservers::Register(new VTuneCodeObserver);
 #endif
 }
 
diff --git a/runtime/vm/os_win.cc b/runtime/vm/os_win.cc
index 7fa1b8c..2e1a398 100644
--- a/runtime/vm/os_win.cc
+++ b/runtime/vm/os_win.cc
@@ -6,6 +6,7 @@
 #if defined(TARGET_OS_WINDOWS)
 
 #include "vm/os.h"
+#include "vm/vtune.h"
 
 #include <malloc.h>  // NOLINT
 #include <time.h>  // NOLINT
@@ -254,7 +255,7 @@
 
 void OS::RegisterCodeObservers() {
 #if defined(DART_VTUNE_SUPPORT)
-  Register(new VTuneCodeObserver);
+  CodeObservers::Register(new VTuneCodeObserver);
 #endif
 }
 
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index fdca884..1f06422 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -132,7 +132,7 @@
 
 
 intptr_t PageSpace::LargePageSizeFor(intptr_t size) {
-  intptr_t page_size = Utils::RoundUp(size + sizeof(HeapPage),
+  intptr_t page_size = Utils::RoundUp(size + HeapPage::ObjectStartOffset(),
                                       VirtualMemory::PageSize());
   return page_size;
 }
diff --git a/runtime/vm/pages.h b/runtime/vm/pages.h
index f3e67a3..f89b083 100644
--- a/runtime/vm/pages.h
+++ b/runtime/vm/pages.h
@@ -35,8 +35,7 @@
   }
 
   uword object_start() const {
-    return (reinterpret_cast<uword>(this) +
-            Utils::RoundUp(sizeof(HeapPage), kObjectAlignment));
+    return (reinterpret_cast<uword>(this) + ObjectStartOffset());
   }
   uword object_end() const {
     return object_end_;
@@ -59,6 +58,10 @@
 
   void WriteProtect(bool read_only);
 
+  static intptr_t ObjectStartOffset() {
+    return Utils::RoundUp(sizeof(HeapPage), OS::kMaxPreferredCodeAlignment);
+  }
+
  private:
   void set_object_end(uword val) {
     ASSERT((val & kObjectAlignmentMask) == kOldObjectAlignmentOffset);
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index fa258c4..83dcbcf 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -3071,14 +3071,19 @@
         ErrorMsg(member.name_pos, "factory name must be '%s'",
                  members->class_name().ToCString());
       }
+      // Do not bypass class resolution by using current_class() directly, since
+      // it may be a patch class.
       const Object& result_type_class = Object::Handle(
           UnresolvedClass::New(LibraryPrefix::Handle(),
                                *member.name,
                                member.name_pos));
-      // The type arguments of the result type are set during finalization.
-      member.type = &Type::ZoneHandle(Type::New(result_type_class,
-                                                TypeArguments::Handle(),
-                                                member.name_pos));
+      // The type arguments of the result type are the type parameters of the
+      // current class. Note that in the case of a patch class, they are copied
+      // from the class being patched.
+      member.type = &Type::ZoneHandle(Type::New(
+          result_type_class,
+          TypeArguments::Handle(current_class().type_parameters()),
+          member.name_pos));
     } else if (member.has_static) {
       ErrorMsg(member.name_pos, "constructor cannot be static");
     }
@@ -3235,10 +3240,11 @@
       // Preserve and reuse the original type parameters and bounds since the
       // ones defined in the patch class will not be finalized.
       orig_type_parameters = cls.type_parameters();
-      String& patch = String::Handle(
-          String::Concat(Symbols::PatchSpace(), class_name));
-      patch = Symbols::New(patch);
-      cls = Class::New(patch, script_, classname_pos);
+      // A patch class must be given the same name as the class it is patching,
+      // otherwise the generic signature classes it defines will not match the
+      // patched generic signature classes. Therefore, new signature classes
+      // will be introduced and the original ones will not get finalized.
+      cls = Class::New(class_name, script_, classname_pos);
       cls.set_library(library_);
     } else {
       // Not patching a class, but it has been found. This must be one of the
@@ -3301,6 +3307,11 @@
                class_name.ToCString(),
                String::Handle(super_type.UserVisibleName()).ToCString());
     }
+    if (super_type.IsDynamicType()) {
+      ErrorMsg(type_pos,
+               "class '%s' may not extend 'dynamic'",
+               class_name.ToCString());
+    }
     if (CurrentToken() == Token::kWITH) {
       super_type = ParseMixins(super_type);
     }
@@ -3842,6 +3853,9 @@
                "type parameter '%s' may not be used in interface list",
                String::Handle(interface.UserVisibleName()).ToCString());
     }
+    if (interface.IsDynamicType()) {
+      ErrorMsg(interface_pos, "'dynamic' may not be used in interface list");
+    }
     all_interfaces.Add(interface);
   } while (CurrentToken() == Token::kCOMMA);
   cls_interfaces = Array::MakeArray(all_interfaces);
diff --git a/runtime/vm/resolver_test.cc b/runtime/vm/resolver_test.cc
index 5ce8ebb..2f253ba 100644
--- a/runtime/vm/resolver_test.cc
+++ b/runtime/vm/resolver_test.cc
@@ -14,11 +14,6 @@
 
 namespace dart {
 
-// Compiler only implemented on IA32, X64, and ARM.
-#if defined(TARGET_ARCH_IA32) ||                                               \
-    defined(TARGET_ARCH_X64) ||                                                \
-    defined(TARGET_ARCH_ARM)
-
 // Setup function for invocation.
 static void SetupFunction(const char* test_library_name,
                           const char* test_class_name,
@@ -221,6 +216,4 @@
   }
 }
 
-#endif  // TARGET_ARCH_IA32 || TARGET_ARCH_X64 || TARGET_ARCH_ARM
-
 }  // namespace dart
diff --git a/runtime/vm/simulator_mips.cc b/runtime/vm/simulator_mips.cc
index 41a1f4d..c868443 100644
--- a/runtime/vm/simulator_mips.cc
+++ b/runtime/vm/simulator_mips.cc
@@ -832,6 +832,8 @@
         reinterpret_cast<intptr_t>(instr) - Instr::kInstrSize);
     set_pc(get_pc() + Instr::kInstrSize);
     dbg.Stop(instr, message);
+    // Adjust for extra pc increment.
+    set_pc(get_pc() - Instr::kInstrSize);
   } else if (instr->BreakCodeField() == Instr::kRedirectCode) {
     SimulatorSetjmpBuffer buffer(this);
 
@@ -914,6 +916,8 @@
   } else {
     SimulatorDebugger dbg(this);
     dbg.Stop(instr, "breakpoint");
+    // Adjust for extra pc increment.
+    set_pc(get_pc() - Instr::kInstrSize);
   }
 }
 
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 6dbff55..d7ba30d 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -980,6 +980,10 @@
 
     return;
   }
+  if (RawObject::IsTypedDataViewClassId(class_id)) {
+    WriteInstanceRef(raw, cls);
+    return;
+  }
   // Object is being referenced, add it to the forward ref list and mark
   // it so that future references to this object in the snapshot will use
   // this object id. Mark it as not having been serialized yet so that we
@@ -1014,15 +1018,6 @@
       return;
     }
 #undef SNAPSHOT_WRITE
-#define SNAPSHOT_WRITE(clazz)                                                  \
-    case kTypedData##clazz##ViewCid:                                           \
-
-    CLASS_LIST_TYPED_DATA(SNAPSHOT_WRITE)
-    case kByteDataViewCid: {
-      WriteInstanceRef(raw, cls);
-      return;
-    }
-#undef SNAPSHOT_WRITE
     default: break;
   }
   UNREACHABLE();
@@ -1088,6 +1083,7 @@
   value = SerializedHeaderTag::update(kObjectId, value);
   value = SerializedHeaderData::update(object_id, value);
   uword tags = raw->ptr()->tags_;
+  ASSERT(SerializedHeaderTag::decode(tags) != kObjectId);
   raw->ptr()->tags_ = value;
   ForwardObjectNode* node = new ForwardObjectNode(raw, tags, state);
   ASSERT(node != NULL);
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index 08b2ab8..41c9461 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -917,6 +917,11 @@
       "  static const int smi_sfld = 10;\n"
       "  static const int bigint_sfld = 0xfffffffffff;\n"
       "}\n"
+      "class Expect {\n"
+      "  static void equals(x, y) {\n"
+      "    if (x != y) throw new RuntimeError('not equal');\n"
+      "  }\n"
+      "}\n"
       "class FieldsTest {\n"
       "  static Fields testMain() {\n"
       "    Expect.equals(true, Fields.bigint_sfld == 0xfffffffffff);\n"
@@ -1115,7 +1120,7 @@
     EXPECT_VALID(Api::CheckIsolateState(Isolate::Current()));
 
     // Get list of library URLs loaded and save the count.
-    Dart_Handle libs = Dart_GetLibraryURLs();
+    Dart_Handle libs = Dart_GetLibraryIds();
     EXPECT(Dart_IsList(libs));
     Dart_ListLength(libs, &expected_num_libs);
 
@@ -1140,7 +1145,7 @@
     EXPECT_VALID(result);
 
     // Get list of library URLs loaded and compare with expected count.
-    Dart_Handle libs = Dart_GetLibraryURLs();
+    Dart_Handle libs = Dart_GetLibraryIds();
     EXPECT(Dart_IsList(libs));
     Dart_ListLength(libs, &actual_num_libs);
 
@@ -1795,12 +1800,21 @@
       "  for (var i = 0; i < kArrayLength; i++) list[i] = d;\n"
       "  return list;\n"
       "}\n"
-      "getByteArrayList() {\n"
+      "getTypedDataList() {\n"
       "  var byte_array = new Uint8List(256);\n"
       "  var list = new List(kArrayLength);\n"
       "  for (var i = 0; i < kArrayLength; i++) list[i] = byte_array;\n"
       "  return list;\n"
       "}\n"
+      "getTypedDataViewList() {\n"
+      "  var uint8_list = new Uint8List(256);\n"
+      "  uint8_list[64] = 1;\n"
+      "  var uint8_list_view =\n"
+      "      new Uint8List.view(uint8_list.buffer, 64, 128);\n"
+      "  var list = new List(kArrayLength);\n"
+      "  for (var i = 0; i < kArrayLength; i++) list[i] = uint8_list_view;\n"
+      "  return list;\n"
+      "}\n"
       "getMixedList() {\n"
       "  var list = new List(kArrayLength);\n"
       "  for (var i = 0; i < kArrayLength; i++) {\n"
@@ -1885,9 +1899,9 @@
       }
     }
     {
-      // Generate a list of doubles from Dart code.
+      // Generate a list of Uint8Lists from Dart code.
       ApiNativeScope scope;
-      Dart_CObject* root = GetDeserializedDartMessage(lib, "getByteArrayList");
+      Dart_CObject* root = GetDeserializedDartMessage(lib, "getTypedDataList");
       EXPECT_NOTNULL(root);
       EXPECT_EQ(Dart_CObject::kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
@@ -1899,6 +1913,23 @@
       }
     }
     {
+      // Generate a list of Uint8List views from Dart code.
+      ApiNativeScope scope;
+      Dart_CObject* root =
+          GetDeserializedDartMessage(lib, "getTypedDataViewList");
+      EXPECT_NOTNULL(root);
+      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(kArrayLength, root->value.as_array.length);
+      for (int i = 0; i < kArrayLength; i++) {
+        Dart_CObject* element = root->value.as_array.values[i];
+        EXPECT_EQ(root->value.as_array.values[0], element);
+        EXPECT_EQ(Dart_CObject::kUint8Array, element->type);
+        EXPECT_EQ(128, element->value.as_byte_array.length);
+        EXPECT_EQ(1, element->value.as_byte_array.values[0]);
+        EXPECT_EQ(0, element->value.as_byte_array.values[1]);
+      }
+    }
+    {
       // Generate a list of objects of different types from Dart code.
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getMixedList");
@@ -1968,7 +1999,7 @@
       "  list.add(3.14);;\n"
       "  return list;\n"
       "}\n"
-      "getByteArrayList() {\n"
+      "getTypedDataList() {\n"
       "  var byte_array = new Uint8List(256);\n"
       "  var list = [];\n"
       "  for (var i = 0; i < kArrayLength; i++) {\n"
@@ -1976,6 +2007,17 @@
       "  }\n"
       "  return list;\n"
       "}\n"
+      "getTypedDataViewList() {\n"
+      "  var uint8_list = new Uint8List(256);\n"
+      "  uint8_list[64] = 1;\n"
+      "  var uint8_list_view =\n"
+      "      new Uint8List.view(uint8_list.buffer, 64, 128);\n"
+      "  var list = [];\n"
+      "  for (var i = 0; i < kArrayLength; i++) {\n"
+      "    list.add(uint8_list_view);\n"
+      "  }\n"
+      "  return list;\n"
+      "}\n"
       "getMixedList() {\n"
       "  var list = [];\n"
       "  for (var i = 0; i < kArrayLength; i++) {\n"
@@ -2001,7 +2043,6 @@
 
   {
     DARTSCOPE(isolate);
-
     {
       // Generate a list of strings from Dart code.
       ApiNativeScope scope;
@@ -2060,9 +2101,9 @@
       }
     }
     {
-      // Generate a list of doubles from Dart code.
+      // Generate a list of Uint8Lists from Dart code.
       ApiNativeScope scope;
-      Dart_CObject* root = GetDeserializedDartMessage(lib, "getByteArrayList");
+      Dart_CObject* root = GetDeserializedDartMessage(lib, "getTypedDataList");
       EXPECT_NOTNULL(root);
       EXPECT_EQ(Dart_CObject::kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
@@ -2074,6 +2115,23 @@
       }
     }
     {
+      // Generate a list of Uint8List views from Dart code.
+      ApiNativeScope scope;
+      Dart_CObject* root =
+          GetDeserializedDartMessage(lib, "getTypedDataViewList");
+      EXPECT_NOTNULL(root);
+      EXPECT_EQ(Dart_CObject::kArray, root->type);
+      EXPECT_EQ(kArrayLength, root->value.as_array.length);
+      for (int i = 0; i < kArrayLength; i++) {
+        Dart_CObject* element = root->value.as_array.values[i];
+        EXPECT_EQ(root->value.as_array.values[0], element);
+        EXPECT_EQ(Dart_CObject::kUint8Array, element->type);
+        EXPECT_EQ(128, element->value.as_byte_array.length);
+        EXPECT_EQ(1, element->value.as_byte_array.values[0]);
+        EXPECT_EQ(0, element->value.as_byte_array.values[1]);
+      }
+    }
+    {
       // Generate a list of objects of different types from Dart code.
       ApiNativeScope scope;
       Dart_CObject* root = GetDeserializedDartMessage(lib, "getMixedList");
diff --git a/runtime/vm/snapshot_test.dart b/runtime/vm/snapshot_test.dart
index 50ed111..f9c2336 100644
--- a/runtime/vm/snapshot_test.dart
+++ b/runtime/vm/snapshot_test.dart
@@ -5,6 +5,12 @@
 import 'dart:isolate';
 import 'dart:async';
 
+class Expect {
+  static void equals(x, y) {
+    if (x != y) throw new RuntimeError('not equal');
+  }
+}
+
 class Fields {
   Fields(int i, int j) : fld1 = i, fld2 = j, fld5 = true {}
   int fld1;
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 47a72d2..3ae8d33 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -332,11 +332,8 @@
   ASSERT(deopt_instructions_.length() != 0);
   while (index_ < deopt_instructions_.length()) {
     DeoptInstr* deopt_instr = deopt_instructions_[index_++];
-    ASSERT(deopt_instr->kind() != DeoptInstr::kRetBeforeAddress);
-    if (deopt_instr->kind() == DeoptInstr::kRetAfterAddress) {
-      pc_ = DeoptInstr::GetRetAfterAddress(deopt_instr,
-                                           object_table_,
-                                           &func);
+    if (deopt_instr->kind() == DeoptInstr::kRetAddress) {
+      pc_ = DeoptInstr::GetRetAddress(deopt_instr, object_table_, &func);
       code_ = func.unoptimized_code();
       function_ = func.raw();
       return;
diff --git a/runtime/vm/stack_frame_mips.cc b/runtime/vm/stack_frame_mips.cc
index a4a94f2..032197d6 100644
--- a/runtime/vm/stack_frame_mips.cc
+++ b/runtime/vm/stack_frame_mips.cc
@@ -9,6 +9,9 @@
 
 namespace dart {
 
+// The constant kExitLinkOffsetInEntryFrame must be kept in sync with the
+// code in the InvokeDartCode stub.
+static const int kExitLinkOffsetInEntryFrame = -10 * kWordSize;
 static const int kPcAddressOffsetFromSp = -2 * kWordSize;
 static const int kEntrypointMarkerOffsetFromFp = 2 * kWordSize;
 static const int kSpOffsetFromPreviousFp = 3 * kWordSize;
@@ -54,7 +57,10 @@
 
 
 void StackFrameIterator::SetupNextExitFrameData() {
-  UNIMPLEMENTED();
+  uword exit_address = entry_.fp() + kExitLinkOffsetInEntryFrame;
+  uword exit_marker = *reinterpret_cast<uword*>(exit_address);
+  frames_.fp_ = exit_marker;
+  frames_.sp_ = 0;
 }
 
 }  // namespace dart
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 4be2161..0bf4538 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -356,8 +356,52 @@
 }
 
 
+DECLARE_LEAF_RUNTIME_ENTRY(void, StoreBufferBlockProcess, Isolate* isolate);
+
+// Helper stub to implement Assembler::StoreIntoObject.
+// Input parameters:
+//   R0: Address (i.e. object) being stored into.
 void StubCode::GenerateUpdateStoreBufferStub(Assembler* assembler) {
-  __ Unimplemented("UpdateStoreBuffer stub");
+  // Save values being destroyed.
+  __ PushList((1 << R1) | (1 << R2) | (1 << R3));
+
+  // Load the isolate out of the context.
+  // Spilled: R1, R2, R3.
+  // R0: Address being stored.
+  __ ldr(R1, FieldAddress(CTX, Context::isolate_offset()));
+
+  // Load top_ out of the StoreBufferBlock and add the address to the pointers_.
+  // R1: Isolate.
+  intptr_t store_buffer_offset = Isolate::store_buffer_block_offset();
+  __ LoadFromOffset(kLoadWord, R2, R1,
+                    store_buffer_offset + StoreBufferBlock::top_offset());
+  __ add(R3, R1, ShifterOperand(R2, LSL, 2));
+  __ StoreToOffset(kStoreWord, R0, R3,
+                   store_buffer_offset + StoreBufferBlock::pointers_offset());
+
+  // Increment top_ and check for overflow.
+  // R2: top_
+  // R1: Isolate
+  Label L;
+  __ add(R2, R2, ShifterOperand(1));
+  __ StoreToOffset(kStoreWord, R2, R1,
+                   store_buffer_offset + StoreBufferBlock::top_offset());
+  __ CompareImmediate(R2, StoreBufferBlock::kSize);
+  // Restore values.
+  __ PopList((1 << R1) | (1 << R2) | (1 << R3));
+  __ b(&L, EQ);
+  __ Ret();
+
+  // Handle overflow: Call the runtime leaf function.
+  __ Bind(&L);
+  // Setup frame, push callee-saved registers.
+
+  __ EnterCallRuntimeFrame(0 * kWordSize);
+  __ ldr(R0, FieldAddress(CTX, Context::isolate_offset()));
+  __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry);
+  // Restore callee-saved registers, tear down frame.
+  __ LeaveCallRuntimeFrame();
+  __ Ret();
 }
 
 
@@ -720,7 +764,7 @@
 
   // Instance in R0, return its class-id in R0 as Smi.
   __ Bind(&get_class_id_as_smi);
-  Label not_smi;
+
   // Test if Smi -> load Smi class for comparison.
   __ tst(R0, ShifterOperand(kSmiTagMask));
   __ mov(R0, ShifterOperand(Smi::RawValue(kSmiCid)), EQ);
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index 01e9876..a56f2d9 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -8,6 +8,7 @@
 #include "vm/assembler.h"
 #include "vm/code_generator.h"
 #include "vm/dart_entry.h"
+#include "vm/flow_graph_compiler.h"
 #include "vm/instructions.h"
 #include "vm/stack_frame.h"
 #include "vm/stub_code.h"
@@ -16,6 +17,13 @@
 
 namespace dart {
 
+DEFINE_FLAG(bool, inline_alloc, true, "Inline allocation of objects.");
+DEFINE_FLAG(bool, use_slow_path, false,
+    "Set to true for debugging & verifying the slow paths.");
+DECLARE_FLAG(int, optimization_counter_threshold);
+DECLARE_FLAG(bool, trace_optimized_ic_calls);
+
+
 // Input parameters:
 //   RA : return address.
 //   SP : address of last argument in argument array.
@@ -90,8 +98,8 @@
   __ mov(SP, FP);
   __ lw(RA, Address(SP, 1 * kWordSize));
   __ lw(FP, Address(SP, 0 * kWordSize));
-  __ addiu(SP, SP, Immediate(2 * kWordSize));
   __ Ret();
+  __ delay_slot()->addiu(SP, SP, Immediate(2 * kWordSize));
 }
 
 
@@ -167,8 +175,7 @@
   __ jalr(T5);
 
   // Reset exit frame information in Isolate structure.
-  __ LoadImmediate(A2, 0);
-  __ sw(A2, Address(CTX, Isolate::top_exit_frame_info_offset()));
+  __ sw(ZR, Address(CTX, Isolate::top_exit_frame_info_offset()));
 
   // Load Context pointer from Isolate structure into R2.
   __ lw(A2, Address(CTX, Isolate::top_context_offset()));
@@ -183,8 +190,8 @@
   __ mov(SP, FP);
   __ lw(RA, Address(SP, 1 * kWordSize));
   __ lw(FP, Address(SP, 0 * kWordSize));
-  __ addiu(SP, SP, Immediate(2 * kWordSize));
   __ Ret();
+  __ delay_slot()->addiu(SP, SP, Immediate(2 * kWordSize));
 }
 
 
@@ -193,25 +200,25 @@
 void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) {
   __ EnterStubFrame();
   // Setup space on stack for return value and preserve arguments descriptor.
-  __ LoadImmediate(V0, reinterpret_cast<intptr_t>(Object::null()));
+  __ LoadImmediate(T0, reinterpret_cast<intptr_t>(Object::null()));
 
   __ addiu(SP, SP, Immediate(-2 * kWordSize));
   __ sw(S4, Address(SP, 1 * kWordSize));
-  __ sw(V0, Address(SP, 0 * kWordSize));
+  __ sw(T0, Address(SP, 0 * kWordSize));
 
   __ CallRuntime(kPatchStaticCallRuntimeEntry);
 
   // Get Code object result and restore arguments descriptor array.
-  __ lw(V0, Address(SP, 0 * kWordSize));
+  __ lw(T0, Address(SP, 0 * kWordSize));
   __ lw(S4, Address(SP, 1 * kWordSize));
   __ addiu(SP, SP, Immediate(2 * kWordSize));
 
   // Remove the stub frame as we are about to jump to the dart function.
   __ LeaveStubFrame();
 
-  __ lw(V0, FieldAddress(V0, Code::instructions_offset()));
-  __ addiu(V0, V0, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
-  __ jr(V0);
+  __ lw(T0, FieldAddress(T0, Code::instructions_offset()));
+  __ AddImmediate(T0, Instructions::HeaderSize() - kHeapObjectTag);
+  __ jr(T0);
 }
 
 
@@ -284,23 +291,22 @@
   // Load Isolate pointer from Context structure into temporary register R8.
   __ lw(T2, FieldAddress(CTX, Context::isolate_offset()));
 
-  // Save the top exit frame info. Use R5 as a temporary register.
+  // Save the top exit frame info. Use T0 as a temporary register.
   // StackFrameIterator reads the top exit frame info saved in this frame.
-  __ lw(S5, Address(T2, Isolate::top_exit_frame_info_offset()));
-  __ LoadImmediate(T0, 0);
-  __ sw(T0, Address(T2, Isolate::top_exit_frame_info_offset()));
+  __ lw(T0, Address(T2, Isolate::top_exit_frame_info_offset()));
+  __ sw(ZR, Address(T2, Isolate::top_exit_frame_info_offset()));
 
-  // Save the old Context pointer. Use S4 as a temporary register.
+  // Save the old Context pointer. Use T1 as a temporary register.
   // Note that VisitObjectPointers will find this saved Context pointer during
   // GC marking, since it traverses any information between SP and
   // FP - kExitLinkOffsetInEntryFrame.
   // EntryFrame::SavedContext reads the context saved in this frame.
-  __ lw(S4, Address(T2, Isolate::top_context_offset()));
+  __ lw(T1, Address(T2, Isolate::top_context_offset()));
 
   // The constants kSavedContextOffsetInEntryFrame and
   // kExitLinkOffsetInEntryFrame must be kept in sync with the code below.
-  __ sw(S5, Address(SP, 1 * kWordSize));
-  __ sw(S4, Address(SP, 0 * kWordSize));
+  __ sw(T0, Address(SP, 1 * kWordSize));
+  __ sw(T1, Address(SP, 0 * kWordSize));
 
   // after the call, The stack pointer is restored to this location.
   // Pushed A3, S0-7, S4, S5 = 11.
@@ -310,26 +316,24 @@
   __ lw(S4, Address(A1, VMHandles::kOffsetOfRawPtrInHandle));
 
   // Load number of arguments into S5.
-  __ lw(S5, FieldAddress(S4, ArgumentsDescriptor::count_offset()));
-  __ SmiUntag(S5);
+  __ lw(T1, FieldAddress(S4, ArgumentsDescriptor::count_offset()));
+  __ SmiUntag(T1);
 
   // Compute address of 'arguments array' data area into A2.
   __ lw(A2, Address(A2, VMHandles::kOffsetOfRawPtrInHandle));
-  __ addiu(A2, A2, Immediate(Array::data_offset() - kHeapObjectTag));
+  __ AddImmediate(A2, Array::data_offset() - kHeapObjectTag);
 
   // Set up arguments for the Dart call.
   Label push_arguments;
   Label done_push_arguments;
-
-  __ beq(S5, ZR, &done_push_arguments);  // check if there are arguments.
-  __ LoadImmediate(A1, 0);
+  __ beq(T1, ZR, &done_push_arguments);  // check if there are arguments.
+  __ mov(A1, ZR);
   __ Bind(&push_arguments);
   __ lw(A3, Address(A2));
   __ Push(A3);
-  __ addiu(A2, A2, Immediate(kWordSize));
   __ addiu(A1, A1, Immediate(1));
-  __ subu(T0, A1, S5);
-  __ bltz(T0, &push_arguments);
+  __ BranchLess(A1, T1, &push_arguments);
+  __ delay_slot()->addiu(A2, A2, Immediate(kWordSize));
 
   __ Bind(&done_push_arguments);
 
@@ -341,19 +345,19 @@
   __ lw(CTX, Address(CTX, VMHandles::kOffsetOfRawPtrInHandle));
 
   // Get rid of arguments pushed on the stack.
-  __ addiu(SP, FP, Immediate(kSavedContextOffsetInEntryFrame));
+  __ AddImmediate(SP, FP, kSavedContextOffsetInEntryFrame);
 
   // Load Isolate pointer from Context structure into CTX. Drop Context.
   __ lw(CTX, FieldAddress(CTX, Context::isolate_offset()));
 
   // Restore the saved Context pointer into the Isolate structure.
-  // Uses S4 as a temporary register for this.
+  // Uses T1 as a temporary register for this.
   // Restore the saved top exit frame info back into the Isolate structure.
-  // Uses S5 as a temporary register for this.
-  __ lw(S4, Address(SP, 0 * kWordSize));
-  __ lw(S5, Address(SP, 1 * kWordSize));
-  __ sw(S4, Address(CTX, Isolate::top_context_offset()));
-  __ sw(S5, Address(CTX, Isolate::top_exit_frame_info_offset()));
+  // Uses T0 as a temporary register for this.
+  __ lw(T1, Address(SP, 0 * kWordSize));
+  __ lw(T0, Address(SP, 1 * kWordSize));
+  __ sw(T1, Address(CTX, Isolate::top_context_offset()));
+  __ sw(T0, Address(CTX, Isolate::top_exit_frame_info_offset()));
 
   // Restore C++ ABI callee-saved registers.
   for (int i = S0; i <= S7; i++) {
@@ -379,9 +383,174 @@
 }
 
 
+// Called for inline allocation of objects.
+// Input parameters:
+//   RA : return address.
+//   SP + 4 : type arguments object (only if class is parameterized).
+//   SP + 0 : type arguments of instantiator (only if class is parameterized).
 void StubCode::GenerateAllocationStubForClass(Assembler* assembler,
                                               const Class& cls) {
-  __ Unimplemented("AllocateObject stub");
+  // The generated code is different if the class is parameterized.
+  const bool is_cls_parameterized =
+      cls.type_arguments_field_offset() != Class::kNoTypeArguments;
+  // kInlineInstanceSize is a constant used as a threshold for determining
+  // when the object initialization should be done as a loop or as
+  // straight line code.
+  const int kInlineInstanceSize = 12;
+  const intptr_t instance_size = cls.instance_size();
+  ASSERT(instance_size > 0);
+  const intptr_t type_args_size = InstantiatedTypeArguments::InstanceSize();
+  if (FLAG_inline_alloc &&
+      PageSpace::IsPageAllocatableSize(instance_size + type_args_size)) {
+    Label slow_case;
+    Heap* heap = Isolate::Current()->heap();
+    __ LoadImmediate(T5, heap->TopAddress());
+    __ lw(T2, Address(T5));
+    __ LoadImmediate(T4, instance_size);
+    __ addu(T3, T2, T4);
+    if (is_cls_parameterized) {
+      Label no_instantiator;
+      __ lw(T1, Address(SP, 1 * kWordSize));
+      __ lw(T0, Address(SP, 0 * kWordSize));
+      // A new InstantiatedTypeArguments object only needs to be allocated if
+      // the instantiator is provided (not kNoInstantiator, but may be null).
+      __ BranchEqual(T0, Smi::RawValue(StubCode::kNoInstantiator),
+                     &no_instantiator);
+      __ delay_slot()->mov(T4, T3);
+      __ AddImmediate(T3, type_args_size);
+      __ Bind(&no_instantiator);
+      // T4: potential new object end and, if T4 != T3, potential new
+      // InstantiatedTypeArguments object start.
+    }
+    // Check if the allocation fits into the remaining space.
+    // T2: potential new object start.
+    // T3: potential next object start.
+    if (FLAG_use_slow_path) {
+      __ b(&slow_case);
+    } else {
+      __ BranchGreaterEqual(T3, heap->EndAddress(), &slow_case);
+    }
+
+    // Successfully allocated the object(s), now update top to point to
+    // next object start and initialize the object.
+    __ sw(T3, Address(T5));
+
+    if (is_cls_parameterized) {
+      // Initialize the type arguments field in the object.
+      // T2: new object start.
+      // T4: potential new object end and, if T4 != T3, potential new
+      // InstantiatedTypeArguments object start.
+      // T3: next object start.
+      Label type_arguments_ready;
+      __ beq(T4, T3, &type_arguments_ready);
+      // Initialize InstantiatedTypeArguments object at T4.
+      __ sw(T1, Address(T4,
+          InstantiatedTypeArguments::uninstantiated_type_arguments_offset()));
+      __ sw(T0, Address(T4,
+          InstantiatedTypeArguments::instantiator_type_arguments_offset()));
+      const Class& ita_cls =
+          Class::ZoneHandle(Object::instantiated_type_arguments_class());
+      // Set the tags.
+      uword tags = 0;
+      tags = RawObject::SizeTag::update(type_args_size, tags);
+      tags = RawObject::ClassIdTag::update(ita_cls.id(), tags);
+      __ LoadImmediate(T0, tags);
+      __ sw(T0, Address(T4, Instance::tags_offset()));
+      // Set the new InstantiatedTypeArguments object (T4) as the type
+      // arguments (T1) of the new object (T2).
+      __ addiu(T1, T4, Immediate(kHeapObjectTag));
+      // Set T3 to new object end.
+      __ mov(T3, T4);
+      __ Bind(&type_arguments_ready);
+      // T2: new object.
+      // T1: new object type arguments.
+    }
+
+    // T2: new object start.
+    // T3: next object start.
+    // T1: new object type arguments (if is_cls_parameterized).
+    // Set the tags.
+    uword tags = 0;
+    tags = RawObject::SizeTag::update(instance_size, tags);
+    ASSERT(cls.id() != kIllegalCid);
+    tags = RawObject::ClassIdTag::update(cls.id(), tags);
+    __ LoadImmediate(T0, tags);
+    __ sw(T0, Address(T2, Instance::tags_offset()));
+
+    // Initialize the remaining words of the object.
+    __ LoadImmediate(T0, reinterpret_cast<intptr_t>(Object::null()));
+
+    // T0: raw null.
+    // T2: new object start.
+    // T3: next object start.
+    // T1: new object type arguments (if is_cls_parameterized).
+    // First try inlining the initialization without a loop.
+    if (instance_size < (kInlineInstanceSize * kWordSize)) {
+      // Check if the object contains any non-header fields.
+      // Small objects are initialized using a consecutive set of writes.
+      for (intptr_t current_offset = sizeof(RawObject);
+           current_offset < instance_size;
+           current_offset += kWordSize) {
+        __ sw(T0, Address(T2, current_offset));
+      }
+    } else {
+      __ addiu(T4, T2, Immediate(sizeof(RawObject)));
+      // Loop until the whole object is initialized.
+      // T0: raw null.
+      // T2: new object.
+      // T3: next object start.
+      // T4: next word to be initialized.
+      // T1: new object type arguments (if is_cls_parameterized).
+      Label init_loop;
+      Label done;
+      __ Bind(&init_loop);
+      __ BranchGreaterEqual(T4, T3, &done);  // Done if T4 >= T3.
+      __ sw(T0, Address(T4));
+      __ AddImmediate(T4, kWordSize);
+      __ b(&init_loop);
+      __ Bind(&done);
+    }
+    if (is_cls_parameterized) {
+      // R1: new object type arguments.
+      // Set the type arguments in the new object.
+      __ sw(T1, Address(T2, cls.type_arguments_field_offset()));
+    }
+    // Done allocating and initializing the instance.
+    // R2: new object still missing its heap tag.
+    __ Ret();
+    __ delay_slot()->addiu(V0, T2, Immediate(kHeapObjectTag));
+
+    __ Bind(&slow_case);
+  }
+  if (is_cls_parameterized) {
+    __ lw(T1, Address(SP, 1 * kWordSize));
+    __ lw(T0, Address(SP, 0 * kWordSize));
+  }
+  // Create a stub frame as we are pushing some objects on the stack before
+  // calling into the runtime.
+  __ EnterStubFrame(true);  // Uses pool pointer to pass cls to runtime.
+  __ LoadImmediate(T2, reinterpret_cast<intptr_t>(Object::null()));
+  __ Push(T2);  // Setup space on stack for return value.
+  __ PushObject(cls);  // Push class of object to be allocated.
+  if (is_cls_parameterized) {
+    // Push type arguments of object to be allocated and of instantiator.
+    __ addiu(SP, SP, Immediate(-2 * kWordSize));
+    __ sw(T1, Address(SP, 1 * kWordSize));
+    __ sw(T0, Address(SP, 0 * kWordSize));
+  } else {
+    // Push null type arguments and kNoInstantiator.
+    __ LoadImmediate(T1, Smi::RawValue(StubCode::kNoInstantiator));
+    __ addiu(SP, SP, Immediate(-2 * kWordSize));
+    __ sw(T2, Address(SP, 1 * kWordSize));
+    __ sw(T1, Address(SP, 0 * kWordSize));
+  }
+  __ CallRuntime(kAllocateObjectRuntimeEntry);  // Allocate object.
+  __ Drop(3);  // Pop arguments.
+  __ Pop(V0);  // Pop result (newly allocated object).
+  // V0: new object
+  // Restore the frame pointer.
+  __ LeaveStubFrame(true);
+  __ Ret();
 }
 
 
@@ -401,30 +570,242 @@
 }
 
 
+// Loads function into 'temp_reg'.
 void StubCode::GenerateUsageCounterIncrement(Assembler* assembler,
                                              Register temp_reg) {
-  __ Unimplemented("UsageCounterIncrement stub");
+  Register ic_reg = S5;
+  Register func_reg = temp_reg;
+  ASSERT(temp_reg == T0);
+  __ lw(func_reg, FieldAddress(ic_reg, ICData::function_offset()));
+  __ lw(T1, FieldAddress(func_reg, Function::usage_counter_offset()));
+  Label is_hot;
+  if (FlowGraphCompiler::CanOptimize()) {
+    ASSERT(FLAG_optimization_counter_threshold > 1);
+    // The usage_counter is always less than FLAG_optimization_counter_threshold
+    // except when the function gets optimized.
+    __ BranchEqual(T1, FLAG_optimization_counter_threshold, &is_hot);
+    // As long as VM has no OSR do not optimize in the middle of the function
+    // but only at exit so that we have collected all type feedback before
+    // optimizing.
+  }
+  __ addiu(T1, T1, Immediate(1));
+  __ sw(T1, FieldAddress(func_reg, Function::usage_counter_offset()));
+  __ Bind(&is_hot);
 }
 
 
+// Generate inline cache check for 'num_args'.
+//  AR: return address
+//  S5: Inline cache data object.
+//  S4: Arguments descriptor array.
+// Control flow:
+// - If receiver is null -> jump to IC miss.
+// - If receiver is Smi -> load Smi class.
+// - If receiver is not-Smi -> load receiver's class.
+// - Check if 'num_args' (including receiver) match any IC data group.
+// - Match found -> jump to target.
+// - Match not found -> jump to IC miss.
 void StubCode::GenerateNArgsCheckInlineCacheStub(Assembler* assembler,
                                                  intptr_t num_args) {
-  __ Unimplemented("NArgsCheckInlineCache stub");
+  ASSERT(num_args > 0);
+#if defined(DEBUG)
+  { Label ok;
+    // Check that the IC data array has NumberOfArgumentsChecked() == num_args.
+    // 'num_args_tested' is stored as an untagged int.
+    __ lw(T0, FieldAddress(S5, ICData::num_args_tested_offset()));
+    __ BranchEqual(T0, num_args, &ok);
+    __ Stop("Incorrect stub for IC data");
+    __ Bind(&ok);
+  }
+#endif  // DEBUG
+
+  // Preserve return address, since LR is needed for subroutine call.
+  __ mov(T2, RA);
+  // Loop that checks if there is an IC data match.
+  Label loop, update, test, found, get_class_id_as_smi;
+  // S5: IC data object (preserved).
+  __ lw(T0, FieldAddress(S5, ICData::ic_data_offset()));
+  // T0: ic_data_array with check entries: classes and target functions.
+  __ AddImmediate(T0, Array::data_offset() - kHeapObjectTag);
+  // T0: points directly to the first ic data array element.
+
+  // Get the receiver's class ID (first read number of arguments from
+  // arguments descriptor array and then access the receiver from the stack).
+  __ lw(T1, FieldAddress(S4, ArgumentsDescriptor::count_offset()));
+  __ AddImmediate(T1, -Smi::RawValue(1));
+  __ sll(T3, T1, 1);  // T1 (argument_count - 1) is smi.
+  __ addu(T3, T3, SP);
+  __ bal(&get_class_id_as_smi);
+  __ delay_slot()->lw(T3, Address(T3));
+  // T1: argument_count - 1 (smi).
+  // T3: receiver's class ID (smi).
+  __ b(&test);
+  __ delay_slot()->lw(T4, Address(T0));  // First class id (smi) to check.
+
+  __ Bind(&loop);
+  for (int i = 0; i < num_args; i++) {
+    if (i > 0) {
+      // If not the first, load the next argument's class ID.
+      __ LoadImmediate(T3, Smi::RawValue(-i));
+      __ addu(T3, T1, T3);
+      __ sll(T3, T3, 1);
+      __ addu(T3, SP, T3);
+      __ bal(&get_class_id_as_smi);
+      __ delay_slot()->lw(T3, Address(T3));
+      // T3: next argument class ID (smi).
+      __ lw(T4, Address(T0, i * kWordSize));
+      // T4: next class ID to check (smi).
+    }
+    if (i < (num_args - 1)) {
+      __ bne(T3, T4, &update);  // Continue.
+    } else {
+      // Last check, all checks before matched.
+      Label skip;
+      __ bne(T3, T4, &skip);
+      __ b(&found);  // Break.
+      __ delay_slot()->mov(RA, T2);  // Restore return address if found.
+      __ Bind(&skip);
+    }
+  }
+  __ Bind(&update);
+  // Reload receiver class ID.  It has not been destroyed when num_args == 1.
+  if (num_args > 1) {
+    __ sll(T3, T1, 1);
+    __ addu(T3, SP, T3);
+    __ bal(&get_class_id_as_smi);
+    __ delay_slot()->lw(T3, Address(T3));
+  }
+
+  const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
+  __ AddImmediate(T0, entry_size);  // Next entry.
+  __ lw(T4, Address(T0));  // Next class ID.
+
+  __ Bind(&test);
+  __ BranchNotEqual(T4, Smi::RawValue(kIllegalCid), &loop);  // Done?
+
+  // IC miss.
+  // Restore return address.
+  __ mov(RA, T2);
+
+  // Compute address of arguments (first read number of arguments from
+  // arguments descriptor array and then compute address on the stack).
+  // T1: argument_count - 1 (smi).
+  __ sll(T1, T1, 1);
+  __ addu(T1, SP, T1);  // T1 is Smi.
+  // T1: address of receiver.
+  // Create a stub frame as we are pushing some objects on the stack before
+  // calling into the runtime.
+  __ EnterStubFrame();
+  __ LoadImmediate(T3, reinterpret_cast<intptr_t>(Object::null()));
+  // Preserve IC data object and arguments descriptor array and
+  // setup space on stack for result (target code object).
+  __ addiu(SP, SP, Immediate(-3 * kWordSize));
+  __ sw(S5, Address(SP, 2 * kWordSize));
+  __ sw(S4, Address(SP, 1 * kWordSize));
+  __ sw(T3, Address(SP, 0 * kWordSize));
+  // Push call arguments.
+  for (intptr_t i = 0; i < num_args; i++) {
+    __ lw(TMP, Address(T1, -i * kWordSize));
+    __ Push(TMP);
+  }
+  // Pass IC data object and arguments descriptor array.
+  __ addiu(SP, SP, Immediate(-2 * kWordSize));
+  __ sw(S5, Address(SP, 1 * kWordSize));
+  __ sw(S4, Address(SP, 0 * kWordSize));
+
+  if (num_args == 1) {
+    __ CallRuntime(kInlineCacheMissHandlerOneArgRuntimeEntry);
+  } else if (num_args == 2) {
+    __ CallRuntime(kInlineCacheMissHandlerTwoArgsRuntimeEntry);
+  } else if (num_args == 3) {
+    __ CallRuntime(kInlineCacheMissHandlerThreeArgsRuntimeEntry);
+  } else {
+    UNIMPLEMENTED();
+  }
+  // Remove the call arguments pushed earlier, including the IC data object
+  // and the arguments descriptor array.
+  __ Drop(num_args + 2);
+  // Pop returned code object into T3 (null if not found).
+  // Restore arguments descriptor array and IC data array.
+  __ lw(T3, Address(SP, 0 * kWordSize));
+  __ lw(S4, Address(SP, 1 * kWordSize));
+  __ lw(S5, Address(SP, 2 * kWordSize));
+  __ addiu(SP, SP, Immediate(3 * kWordSize));
+  __ LeaveStubFrame();
+  Label call_target_function;
+  __ BranchNotEqual(T3, reinterpret_cast<intptr_t>(Object::null()),
+                    &call_target_function);
+  // NoSuchMethod or closure.
+  // Mark IC call that it may be a closure call that does not collect
+  // type feedback.
+  __ LoadImmediate(TMP2, 1);
+  __ Branch(&StubCode::InstanceFunctionLookupLabel());
+  __ delay_slot()->sb(TMP2, FieldAddress(S5, ICData::is_closure_call_offset()));
+
+  __ Bind(&found);
+  // T0: Pointer to an IC data check group.
+  const intptr_t target_offset = ICData::TargetIndexFor(num_args) * kWordSize;
+  const intptr_t count_offset = ICData::CountIndexFor(num_args) * kWordSize;
+  __ lw(T3, Address(T0, target_offset));
+  __ lw(T4, Address(T0, count_offset));
+
+  __ AddImmediateDetectOverflow(T4, T4, Smi::RawValue(1), T5);
+
+  __ bgez(T5, &call_target_function);  // No overflow.
+  __ delay_slot()->sw(T4, Address(T0, count_offset));
+
+  __ LoadImmediate(T1, Smi::RawValue(Smi::kMaxValue));
+  __ sw(T1, Address(T0, count_offset));
+
+  __ Bind(&call_target_function);
+  // T0: Target function.
+  __ lw(T3, FieldAddress(T3, Function::code_offset()));
+  __ lw(T3, FieldAddress(T3, Code::instructions_offset()));
+  __ AddImmediate(T3, Instructions::HeaderSize() - kHeapObjectTag);
+  __ jr(T3);
+
+  // Instance in T3, return its class-id in T3 as Smi.
+  __ Bind(&get_class_id_as_smi);
+  Label not_smi;
+  // Test if Smi -> load Smi class for comparison.
+  __ andi(TMP1, T3, Immediate(kSmiTagMask));
+  __ bne(TMP1, ZR, &not_smi);
+  __ LoadImmediate(T3, Smi::RawValue(kSmiCid));
+  __ jr(RA);
+
+  __ Bind(&not_smi);
+  __ LoadClassId(T3, T3);
+  __ SmiTag(T3);
+  __ jr(RA);
 }
 
 
+// Use inline cache data array to invoke the target or continue in inline
+// cache miss handler. Stub for 1-argument check (receiver class).
+//  RA: Return address.
+//  S5: Inline cache data object.
+//  S4: Arguments descriptor array.
+// Inline cache data object structure:
+// 0: function-name
+// 1: N, number of arguments checked.
+// 2 .. (length - 1): group of checks, each check containing:
+//   - N classes.
+//   - 1 target function.
 void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
-  __ Unimplemented("GenerateOneArgCheckInlineCacheStub stub");
+  GenerateUsageCounterIncrement(assembler, T0);
+  GenerateNArgsCheckInlineCacheStub(assembler, 1);
 }
 
 
 void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
-  __ Unimplemented("GenerateTwoArgsCheckInlineCacheStub stub");
+  GenerateUsageCounterIncrement(assembler, T0);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2);
 }
 
 
 void StubCode::GenerateThreeArgsCheckInlineCacheStub(Assembler* assembler) {
-  __ Unimplemented("GenerateThreeArgsCheckInlineCacheStub stub");
+  GenerateUsageCounterIncrement(assembler, T0);
+  GenerateNArgsCheckInlineCacheStub(assembler, 3);
 }
 
 
@@ -474,18 +855,106 @@
 }
 
 
+// Used to check class and type arguments. Arguments passed in registers:
+// RA: return address.
+// A0: instance (must be preserved).
+// A1: instantiator type arguments or NULL.
+// A2: cache array.
+// Result in V0: null -> not found, otherwise result (true or false).
+static void GenerateSubtypeNTestCacheStub(Assembler* assembler, int n) {
+  ASSERT((1 <= n) && (n <= 3));
+  if (n > 1) {
+    // Get instance type arguments.
+    __ LoadClass(T0, A0);
+    // Compute instance type arguments into R4.
+    Label has_no_type_arguments;
+    __ LoadImmediate(T1, reinterpret_cast<intptr_t>(Object::null()));
+    __ lw(T2, FieldAddress(T0,
+        Class::type_arguments_field_offset_in_words_offset()));
+    __ BranchEqual(T2, Class::kNoTypeArguments, &has_no_type_arguments);
+    __ sll(T2, T2, 2);
+    __ addu(T2, A0, T2);  // T2 <- A0 + T2 * 4
+    __ lw(T1, FieldAddress(T2, 0));
+    __ Bind(&has_no_type_arguments);
+  }
+  __ LoadClassId(T0, A0);
+  // A0: instance.
+  // A1: instantiator type arguments or NULL.
+  // A2: SubtypeTestCache.
+  // T0: instance class id.
+  // T1: instance type arguments (null if none), used only if n > 1.
+  __ lw(T2, FieldAddress(A2, SubtypeTestCache::cache_offset()));
+  __ AddImmediate(T2, Array::data_offset() - kHeapObjectTag);
+
+  Label loop, found, not_found, next_iteration;
+  // T0: instance class id.
+  // T1: instance type arguments.
+  // T2: Entry start.
+  __ SmiTag(T0);
+  __ Bind(&loop);
+  __ lw(T3, Address(T2, kWordSize * SubtypeTestCache::kInstanceClassId));
+  __ BranchEqual(T3, reinterpret_cast<intptr_t>(Object::null()), &not_found);
+
+  if (n == 1) {
+    __ BranchEqual(T3, T0, &found);
+  } else {
+    __ BranchNotEqual(T3, T0, &next_iteration);
+    __ lw(T3,
+          Address(T2, kWordSize * SubtypeTestCache::kInstanceTypeArguments));
+    if (n == 2) {
+      __ BranchEqual(T3, T1, &found);
+    } else {
+      __ BranchNotEqual(T3, T1, &next_iteration);
+      __ lw(T3, Address(T2, kWordSize *
+                        SubtypeTestCache::kInstantiatorTypeArguments));
+      __ BranchEqual(T3, A1, &found);
+    }
+  }
+  __ Bind(&next_iteration);
+  __ AddImmediate(T2, kWordSize * SubtypeTestCache::kTestEntryLength);
+  __ b(&loop);
+  // Fall through to not found.
+  __ Bind(&not_found);
+  __ LoadImmediate(V0, reinterpret_cast<intptr_t>(Object::null()));
+  __ Ret();
+
+  __ Bind(&found);
+  __ Ret();
+  __ delay_slot()->lw(V0,
+                      Address(T2, kWordSize * SubtypeTestCache::kTestResult));
+}
+
+
+// Used to check class and type arguments. Arguments passed in registers:
+// RA: return address.
+// A0: instance (must be preserved).
+// A1: instantiator type arguments or NULL.
+// A2: cache array.
+// Result in V0: null -> not found, otherwise result (true or false).
 void StubCode::GenerateSubtype1TestCacheStub(Assembler* assembler) {
-  __ Unimplemented("Subtype1TestCache Stub");
+  GenerateSubtypeNTestCacheStub(assembler, 1);
 }
 
 
+// Used to check class and type arguments. Arguments passed in registers:
+// LR: return address.
+// A0: instance (must be preserved).
+// A1: instantiator type arguments or NULL.
+// A2: cache array.
+// Result in V0: null -> not found, otherwise result (true or false).
 void StubCode::GenerateSubtype2TestCacheStub(Assembler* assembler) {
-  __ Unimplemented("Subtype2TestCache Stub");
+  GenerateSubtypeNTestCacheStub(assembler, 2);
 }
 
 
+// Used to check class and type arguments. Arguments passed in registers:
+// RA: return address.
+// A0: instance (must be preserved).
+// A1: instantiator type arguments or NULL.
+// A2: cache array.
+// Result in V0: null -> not found, otherwise result (true or false).
 void StubCode::GenerateSubtype3TestCacheStub(Assembler* assembler) {
-  __ Unimplemented("Subtype3TestCache Stub");
+  GenerateSubtypeNTestCacheStub(assembler, 3);
 }
 
 
@@ -511,17 +980,113 @@
 
 
 void StubCode::GenerateEqualityWithNullArgStub(Assembler* assembler) {
-  __ Unimplemented("EqualityWithNullArg stub");
+  __ Unimplemented("EqualityWithNullArg Stub");
 }
 
 
 void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) {
-  __ Unimplemented("OptimizeFunction stub");
+  __ Unimplemented("OptimizeFunction Stub");
 }
 
 
+DECLARE_LEAF_RUNTIME_ENTRY(intptr_t,
+                           BigintCompare,
+                           RawBigint* left,
+                           RawBigint* right);
+
+
+// Does identical check (object references are equal or not equal) with special
+// checks for boxed numbers.
+// LR: return address.
+// SP + 4: left operand.
+// SP + 0: right operand.
+// Return: CMPRES is zero if equal, non-zero otherwise.
+// Note: A Mint cannot contain a value that would fit in Smi, a Bigint
+// cannot contain a value that fits in Mint or Smi.
 void StubCode::GenerateIdenticalWithNumberCheckStub(Assembler* assembler) {
-  __ Unimplemented("IdenticalWithNumberCheck stub");
+  const Register ret = CMPRES;
+  const Register temp1 = TMP1;
+  const Register temp2 = TMP2;
+  const Register left = T1;
+  const Register right = T0;
+  // Preserve left, right and temp.
+  __ addiu(SP, SP, Immediate(-2 * kWordSize));
+  __ sw(T1, Address(SP, 1 * kWordSize));
+  __ sw(T0, Address(SP, 0 * kWordSize));
+  // TOS + 4: left argument.
+  // TOS + 3: right argument.
+  // TOS + 1: saved left
+  // TOS + 0: saved right
+  __ lw(left, Address(SP, 3 * kWordSize));
+  __ lw(right, Address(SP, 2 * kWordSize));
+  Label reference_compare, done, check_mint, check_bigint;
+  // If any of the arguments is Smi do reference compare.
+  __ andi(temp1, left, Immediate(kSmiTagMask));
+  __ beq(temp1, ZR, &reference_compare);
+  __ andi(temp1, right, Immediate(kSmiTagMask));
+  __ beq(temp1, ZR, &reference_compare);
+
+  // Value compare for two doubles.
+  __ LoadImmediate(temp1, kDoubleCid);
+  __ LoadClassId(temp2, left);
+  __ bne(temp1, temp2, &check_mint);
+  __ LoadClassId(temp2, right);
+  __ subu(ret, temp1, temp2);
+  __ bne(ret, ZR, &done);
+
+  // Double values bitwise compare.
+  __ lw(temp1, FieldAddress(left, Double::value_offset() + 0 * kWordSize));
+  __ lw(temp1, FieldAddress(right, Double::value_offset() + 0 * kWordSize));
+  __ subu(ret, temp1, temp2);
+  __ bne(ret, ZR, &done);
+  __ lw(temp1, FieldAddress(left, Double::value_offset() + 1 * kWordSize));
+  __ lw(temp2, FieldAddress(right, Double::value_offset() + 1 * kWordSize));
+  __ b(&done);
+  __ delay_slot()->subu(ret, temp1, temp2);
+
+  __ Bind(&check_mint);
+  __ LoadImmediate(temp1, kMintCid);
+  __ LoadClassId(temp2, left);
+  __ bne(temp1, temp2, &check_bigint);
+  __ LoadClassId(temp2, right);
+  __ subu(ret, temp1, temp2);
+  __ bne(ret, ZR, &done);
+
+  __ lw(temp1, FieldAddress(left, Mint::value_offset() + 0 * kWordSize));
+  __ lw(temp2, FieldAddress(right, Mint::value_offset() + 0 * kWordSize));
+  __ subu(ret, temp1, temp2);
+  __ bne(ret, ZR, &done);
+  __ lw(temp1, FieldAddress(left, Mint::value_offset() + 1 * kWordSize));
+  __ lw(temp2, FieldAddress(right, Mint::value_offset() + 1 * kWordSize));
+  __ b(&done);
+  __ delay_slot()->subu(ret, temp1, temp2);
+
+  __ Bind(&check_bigint);
+  __ LoadImmediate(temp1, kBigintCid);
+  __ LoadClassId(temp2, left);
+  __ bne(temp1, temp2, &reference_compare);
+  __ LoadClassId(temp2, right);
+  __ subu(ret, temp1, temp2);
+  __ bne(ret, ZR, &done);
+
+  __ EnterStubFrame(0);
+  __ ReserveAlignedFrameSpace(2 * kWordSize);
+  __ addiu(SP, SP, Immediate(-2 * kWordSize));
+  __ sw(T1, Address(SP, 1 * kWordSize));
+  __ sw(T0, Address(SP, 0 * kWordSize));
+  __ CallRuntime(kBigintCompareRuntimeEntry);
+  // Result in V0, 0 means equal.
+  __ LeaveStubFrame();
+  __ b(&done);
+  __ delay_slot()->mov(CMPRES, V0);
+
+  __ Bind(&reference_compare);
+  __ subu(ret, left, right);
+  __ Bind(&done);
+  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ lw(T1, Address(SP, 1 * kWordSize));
+  __ Ret();
+  __ delay_slot()->addiu(SP, SP, Immediate(2 * kWordSize));
 }
 
 }  // namespace dart
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index a3d62b9..5cf2f00 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -221,7 +221,6 @@
   V(ColonSpace, ": ")                                                          \
   V(RParenArrow, ") => ")                                                      \
   V(SpaceExtendsSpace, " extends ")                                            \
-  V(PatchSpace, "patch ")                                                      \
   V(SwitchExpr, ":switch_expr")                                                \
   V(TwoNewlines, "\n\n")                                                       \
   V(TwoSpaces, "  ")                                                           \
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index 392b69b..2749149 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -145,26 +145,29 @@
 #else
 // Not running on ARM or MIPS hardware, call simulator to execute code.
 #define EXECUTE_TEST_CODE_INT32(name, entry)                                   \
-  static_cast<int32_t>(Simulator::Current()->Call((int32_t)entry,              \
-      0, 0, 0, 0))
+  static_cast<int32_t>(Simulator::Current()->Call(                             \
+      bit_cast<int32_t, uword>(entry), 0, 0, 0, 0))
 #define EXECUTE_TEST_CODE_INT64_LL(name, entry, long_arg0, long_arg1)          \
-  static_cast<int64_t>(Simulator::Current()->Call((int32_t)entry,              \
+  static_cast<int64_t>(Simulator::Current()->Call(                             \
+      bit_cast<int32_t, uword>(entry),                                         \
       Utils::Low32Bits(long_arg0),                                             \
       Utils::High32Bits(long_arg0),                                            \
       Utils::Low32Bits(long_arg1),                                             \
       Utils::High32Bits(long_arg1)))
 #define EXECUTE_TEST_CODE_FLOAT(name, entry)                                   \
-  bit_cast<float, int32_t>(Simulator::Current()->Call((int32_t)entry,          \
-      0, 0, 0, 0))
+  bit_cast<float, int32_t>(Simulator::Current()->Call(                         \
+      bit_cast<int32_t, uword>(entry), 0, 0, 0, 0))
 #define EXECUTE_TEST_CODE_DOUBLE(name, entry)                                  \
-  bit_cast<double, int64_t>(Simulator::Current()->Call((int32_t)entry,         \
-      0, 0, 0, 0))
+  bit_cast<double, int64_t>(Simulator::Current()->Call(                        \
+      bit_cast<int32_t, uword>(entry), 0, 0, 0, 0))
 #define EXECUTE_TEST_CODE_INT32_F(name, entry, float_arg)                      \
-  static_cast<int32_t>(Simulator::Current()->Call((int32_t)entry,              \
+  static_cast<int32_t>(Simulator::Current()->Call(                             \
+      bit_cast<int32_t, uword>(entry),                                         \
       bit_cast<int32_t, float>(float_arg),                                     \
       0, 0, 0))
 #define EXECUTE_TEST_CODE_INT32_D(name, entry, double_arg)                     \
-  static_cast<int32_t>(Simulator::Current()->Call((int32_t)entry,              \
+  static_cast<int32_t>(Simulator::Current()->Call(                             \
+      bit_cast<int32_t, uword>(entry),                                         \
       Utils::Low32Bits(bit_cast<int64_t, double>(double_arg)),                 \
       Utils::High32Bits(bit_cast<int64_t, double>(double_arg)),                \
       0, 0))
diff --git a/sdk/bin/dart2js b/sdk/bin/dart2js
index 9e70d6f..96354ca 100755
--- a/sdk/bin/dart2js
+++ b/sdk/bin/dart2js
@@ -23,7 +23,8 @@
 
 DART="$BIN_DIR/dart"
 
-SNAPSHOT="${DART2JS}.snapshot"
+SNAPSHOT_DIR="$BIN_DIR/snapshots"
+SNAPSHOT="$SNAPSHOT_DIR/utils_wrapper.dart.snapshot"
 
 unset EXTRA_OPTIONS
 declare -a EXTRA_OPTIONS
@@ -42,6 +43,8 @@
 if test -f "$SNAPSHOT"; then
   # TODO(ahe): Remove the following line when we are relatively sure it works.
   echo Using snapshot "$SNAPSHOT" 1>&2
+
+  EXTRA_OPTIONS[${#EXTRA_OPTIONS[@]}]="--library-root=$SDK_DIR"
 fi
 
 # Tell the VM to grow the heap more aggressively. This should only
@@ -57,7 +60,8 @@
 esac
 
 if test -f "$SNAPSHOT"; then
-  exec "$DART" "${EXTRA_VM_OPTIONS[@]}" "$SNAPSHOT" "${EXTRA_OPTIONS[@]}" "$@"
+  exec "$DART" "${EXTRA_VM_OPTIONS[@]}" "$SNAPSHOT" "dart2js" \
+      "${EXTRA_OPTIONS[@]}" "$@"
 else
   exec "$DART" "${EXTRA_VM_OPTIONS[@]}" "$DART2JS" "${EXTRA_OPTIONS[@]}" "$@"
 fi
diff --git a/sdk/bin/dart2js.bat b/sdk/bin/dart2js.bat
index 97bf774..be0219f 100644
--- a/sdk/bin/dart2js.bat
+++ b/sdk/bin/dart2js.bat
@@ -14,9 +14,12 @@
 rem Get absolute full name for SDK_DIR.
 for %%i in ("%BIN_DIR%\..\") do set SDK_DIR=%%~fi
 
-set DART2JS=%SDK_DIR%lib\_internal\compiler\implementation\dart2js.dart
+rem Remove trailing backslash if there is one
+IF %SDK_DIR:~-1%==\ set SDK_DIR=%SDK_DIR:~0,-1%
+
+set DART2JS=%SDK_DIR%\lib\_internal\compiler\implementation\dart2js.dart
 set DART=%BIN_DIR%\dart
-set SNAPSHOT=%DART2JS%.snapshot
+set SNAPSHOT=%BIN_DIR%\snapshots\utils_wrapper.dart.snapshot
 
 set EXTRA_OPTIONS=
 set EXTRA_VM_OPTIONS=
@@ -27,13 +30,18 @@
 
 if exist "%SNAPSHOT%" (
   echo Using snapshot "%SNAPSHOT%" >&2
-  set DART2JS=%SNAPSHOT%
+  set EXTRA_OPTIONS=%EXTRA_OPTIONS% "--library-root=%SDK_DIR%"
 )
 
 rem See comments regarding options below in dart2js shell script.
 set EXTRA_VM_OPTIONS=%EXTRA_VM_OPTIONS% --heap_growth_rate=512
 
-"%DART%" %EXTRA_VM_OPTIONS% "%DART2JS%" %EXTRA_OPTIONS% %*
+if exist "%SNAPSHOT%" (
+  "%DART%" %EXTRA_VM_OPTIONS% "%SNAPSHOT%" "dart2js" %EXTRA_OPTIONS% %*
+) else (
+  "%DART%" %EXTRA_VM_OPTIONS% "%DART2JS%" %EXTRA_OPTIONS% %*
+)
+
 endlocal
 
 exit /b %errorlevel%
diff --git a/sdk/bin/analyzer b/sdk/bin/dartanalyzer_developer
similarity index 85%
rename from sdk/bin/analyzer
rename to sdk/bin/dartanalyzer_developer
index 0281b61..b522f56 100755
--- a/sdk/bin/analyzer
+++ b/sdk/bin/dartanalyzer_developer
@@ -31,11 +31,11 @@
 
 if [[ `uname` == 'Darwin' ]]; 
 then
-  JAR_DIR="$CUR_DIR"/../../xcodebuild/$DART_CONFIGURATION/new_analyzer
+  JAR_DIR="$CUR_DIR"/../../xcodebuild/$DART_CONFIGURATION/dartanalyzer
 else
-  JAR_DIR="$CUR_DIR"/../../out/$DART_CONFIGURATION/new_analyzer
+  JAR_DIR="$CUR_DIR"/../../out/$DART_CONFIGURATION/dartanalyzer
 fi 
 
-JAR_FILE="$JAR_DIR/new_analyzer.jar"
+JAR_FILE="$JAR_DIR/dartanalyzer.jar"
 
 exec java -jar $JAR_FILE --dart-sdk "$SDK_DIR" "$@"
diff --git a/sdk/bin/analyzer.bat b/sdk/bin/dartanalyzer_developer.bat
similarity index 88%
rename from sdk/bin/analyzer.bat
rename to sdk/bin/dartanalyzer_developer.bat
index 21daf3e..6ba62e0 100644
--- a/sdk/bin/analyzer.bat
+++ b/sdk/bin/dartanalyzer_developer.bat
@@ -20,8 +20,8 @@
 
 set "SDK_DIR=%SCRIPTPATH%\..\..\build\%DART_CONFIGURATION%\dart-sdk"
 
-set "JAR_DIR=%SCRIPTPATH%\..\..\build\%DART_CONFIGURATION%\new_analyzer"
+set "JAR_DIR=%SCRIPTPATH%\..\..\build\%DART_CONFIGURATION%\dartanalyzer"
 
-set "JAR_FILE=%JAR_DIR%\new_analyzer.jar"
+set "JAR_FILE=%JAR_DIR%\dartanalyzer.jar"
 
 java -jar %JAR_FILE% --dart-sdk %SDK_DIR% %arguments%
diff --git a/sdk/bin/dartdoc b/sdk/bin/dartdoc
index faec172..3f22367 100755
--- a/sdk/bin/dartdoc
+++ b/sdk/bin/dartdoc
@@ -23,4 +23,4 @@
   echo Using snapshot "$BIN_DIR/../lib/_internal/dartdoc/bin/dartdoc.dart.snapshot" 1>&2
   SNAPSHOT="--use-script-snapshot=$BIN_DIR/../lib/_internal/dartdoc/bin/dartdoc.dart.snapshot"
 fi
-exec "$BIN_DIR"/dart --heap_growth_rate=32 "--package-root=$BIN_DIR/../packages/" $SNAPSHOT "$BIN_DIR/../lib/_internal/dartdoc/bin/dartdoc.dart" $COLORS "$@"
+exec "$BIN_DIR"/dart --heap_growth_rate=32 "--package-root=$BIN_DIR/../packages/" $SNAPSHOT "$BIN_DIR/../lib/_internal/dartdoc/bin/dartdoc.dart" "--package-root=$BIN_DIR/../packages/" $COLORS "$@"
diff --git a/sdk/lib/_collection_dev/collection_dev.dart b/sdk/lib/_collection_dev/collection_dev.dart
index dabbe2b..385d029 100644
--- a/sdk/lib/_collection_dev/collection_dev.dart
+++ b/sdk/lib/_collection_dev/collection_dev.dart
@@ -4,6 +4,8 @@
 
 library dart._collection.dev;
 
+import 'dart:collection';
+
 part 'arrays.dart';
 part 'iterable.dart';
 part 'list.dart';
diff --git a/sdk/lib/_collection_dev/iterable.dart b/sdk/lib/_collection_dev/iterable.dart
index e8a6a95..60777e9 100644
--- a/sdk/lib/_collection_dev/iterable.dart
+++ b/sdk/lib/_collection_dev/iterable.dart
@@ -126,49 +126,9 @@
     throw new StateError("No matching element");
   }
 
-  E min([int compare(E a, E b)]) {
-    if (length == 0) return null;
-    if (compare == null) {
-      var defaultCompare = Comparable.compare;
-      compare = defaultCompare;
-    }
-    E min = elementAt(0);
+  String join([String separator = ""]) {
     int length = this.length;
-    for (int i = 1; i < length; i++) {
-      E element = elementAt(i);
-      if (compare(min, element) > 0) {
-        min = element;
-      }
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    return min;
-  }
-
-  E max([int compare(E a, E b)]) {
-    if (length == 0) return null;
-    if (compare == null) {
-      var defaultCompare = Comparable.compare;
-      compare = defaultCompare;
-    }
-    E max = elementAt(0);
-    int length = this.length;
-    for (int i = 1; i < length; i++) {
-      E element = elementAt(i);
-      if (compare(max, element) < 0) {
-        max = element;
-      }
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    return max;
-  }
-
-  String join([String separator]) {
-    int length = this.length;
-    if (separator != null && !separator.isEmpty) {
+    if (!separator.isEmpty) {
       if (length == 0) return "";
       String first = "${elementAt(0)}";
       if (length != this.length) {
@@ -177,7 +137,7 @@
       StringBuffer buffer = new StringBuffer(first);
       for (int i = 1; i < length; i++) {
         buffer.write(separator);
-        buffer.write("${elementAt(i)}");
+        buffer.write(elementAt(i));
         if (length != this.length) {
           throw new ConcurrentModificationError(this);
         }
@@ -186,7 +146,7 @@
     } else {
       StringBuffer buffer = new StringBuffer();
       for (int i = 0; i < length; i++) {
-        buffer.write("${elementAt(i)}");
+        buffer.write(elementAt(i));
         if (length != this.length) {
           throw new ConcurrentModificationError(this);
         }
@@ -199,8 +159,13 @@
 
   Iterable map(f(E element)) => new MappedListIterable(this, f);
 
-  reduce(var initialValue, combine(var previousValue, E element)) {
-    return fold(initialValue, combine);
+  E reduce(E combine(var value, E element)) {
+    if (length == 0) throw new StateError("No elements");
+    E value = elementAt(0);
+    for (int i = 1; i < length; i++) {
+      value = combine(value, elementAt(i));
+    }
+    return value;
   }
 
   fold(var initialValue, combine(var previousValue, E element)) {
@@ -663,18 +628,14 @@
     throw new StateError("No matching element");
   }
 
-  E min([int compare(E a, E b)]) => null;
-
-  E max([int compare(E a, E b)]) => null;
-
-  String join([String separator]) => "";
+  String join([String separator = ""]) => "";
 
   Iterable<E> where(bool test(E element)) => this;
 
   Iterable map(f(E element)) => const EmptyIterable();
 
-  reduce(var initialValue, combine(var previousValue, E element)) {
-    return fold(initialValue, combine);
+  E reduce(E combine(E value, E element)) {
+    throw new StateError("No elements");
   }
 
   fold(var initialValue, combine(var previousValue, E element)) {
diff --git a/sdk/lib/_collection_dev/list.dart b/sdk/lib/_collection_dev/list.dart
index 1e40785..3ab841d 100644
--- a/sdk/lib/_collection_dev/list.dart
+++ b/sdk/lib/_collection_dev/list.dart
@@ -5,449 +5,6 @@
 part of dart._collection.dev;
 
 /**
- * Base implementation of a [List] class.
- *
- * This class can be used as a mixin.
- *
- * This implements all read operations using only the `length` and
- * `operator[]` members. It implements write operations using those and
- * `length=` and `operator[]=`
- *
- * A fixed-length list should mix this class in, and the [FixedLengthListMixin]
- * as well, in that order, to overwrite the methods that modify the length.
- *
- * An unmodifiable list should mix [UnmodifiableListMixin] on top of this
- * mixin to prevent all modifications.
- */
-abstract class ListMixin<E> implements List<E> {
-  // Iterable interface.
-  Iterator<E> get iterator => new ListIterator<E>(this);
-
-  E elementAt(int index) => this[index];
-
-  void forEach(void action(E element)) {
-    int length = this.length;
-    for (int i = 0; i < length; i++) {
-      action(this[i]);
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-  }
-
-  bool get isEmpty => length == 0;
-
-  E get first {
-    if (length == 0) throw new StateError("No elements");
-    return this[0];
-  }
-
-  E get last {
-    if (length == 0) throw new StateError("No elements");
-    return this[length - 1];
-  }
-
-  E get single {
-    if (length == 0) throw new StateError("No elements");
-    if (length > 1) throw new StateError("Too many elements");
-    return this[0];
-  }
-
-  bool contains(E element) {
-    int length = this.length;
-    for (int i = 0; i < length; i++) {
-      if (this[i] == element) return true;
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    return false;
-  }
-
-  bool every(bool test(E element)) {
-    int length = this.length;
-    for (int i = 0; i < length; i++) {
-      if (!test(this[i])) return false;
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    return true;
-  }
-
-  bool any(bool test(E element)) {
-    int length = this.length;
-    for (int i = 0; i < length; i++) {
-      if (test(this[i])) return true;
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    return false;
-  }
-
-  E firstWhere(bool test(E element), { E orElse() }) {
-    int length = this.length;
-    for (int i = 0; i < length; i++) {
-      E element = this[i];
-      if (test(element)) return element;
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    if (orElse != null) return orElse();
-    throw new StateError("No matching element");
-  }
-
-  E lastWhere(bool test(E element), { E orElse() }) {
-    int length = this.length;
-    for (int i = length - 1; i >= 0; i--) {
-      E element = this[i];
-      if (test(element)) return element;
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    if (orElse != null) return orElse();
-    throw new StateError("No matching element");
-  }
-
-  E singleWhere(bool test(E element)) {
-    int length = this.length;
-    E match = null;
-    bool matchFound = false;
-    for (int i = 0; i < length; i++) {
-      E element = this[i];
-      if (test(element)) {
-        if (matchFound) {
-          throw new StateError("More than one matching element");
-        }
-        matchFound = true;
-        match = element;
-      }
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    if (matchFound) return match;
-    throw new StateError("No matching element");
-  }
-
-  E min([int compare(E a, E b)]) {
-    if (length == 0) return null;
-    if (compare == null) {
-      var defaultCompare = Comparable.compare;
-      compare = defaultCompare;
-    }
-    E min = this[0];
-    int length = this.length;
-    for (int i = 1; i < length; i++) {
-      E element = this[i];
-      if (compare(min, element) > 0) {
-        min = element;
-      }
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    return min;
-  }
-
-  E max([int compare(E a, E b)]) {
-    if (length == 0) return null;
-    if (compare == null) {
-      var defaultCompare = Comparable.compare;
-      compare = defaultCompare;
-    }
-    E max = this[0];
-    int length = this.length;
-    for (int i = 1; i < length; i++) {
-      E element = this[i];
-      if (compare(max, element) < 0) {
-        max = element;
-      }
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    return max;
-  }
-
-  String join([String separator]) {
-    int length = this.length;
-    if (separator != null && !separator.isEmpty) {
-      if (length == 0) return "";
-      String first = "${this[0]}";
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-      StringBuffer buffer = new StringBuffer(first);
-      for (int i = 1; i < length; i++) {
-        buffer.write(separator);
-        buffer.write("${this[i]}");
-        if (length != this.length) {
-          throw new ConcurrentModificationError(this);
-        }
-      }
-      return buffer.toString();
-    } else {
-      StringBuffer buffer = new StringBuffer();
-      for (int i = 0; i < length; i++) {
-        buffer.write("${this[i]}");
-        if (length != this.length) {
-          throw new ConcurrentModificationError(this);
-        }
-      }
-      return buffer.toString();
-    }
-  }
-
-  Iterable<E> where(bool test(E element)) => new WhereIterable<E>(this, test);
-
-  Iterable map(f(E element)) => new MappedListIterable(this, f);
-
-  reduce(var initialValue, combine(var previousValue, E element)) {
-    return fold(initialValue, combine);
-  }
-
-  fold(var initialValue, combine(var previousValue, E element)) {
-    var value = initialValue;
-    int length = this.length;
-    for (int i = 0; i < length; i++) {
-      value = combine(value, this[i]);
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    return value;
-  }
-
-  Iterable<E> skip(int count) => new SubListIterable(this, count, null);
-
-  Iterable<E> skipWhile(bool test(E element)) {
-    return new SkipWhileIterable<E>(this, test);
-  }
-
-  Iterable<E> take(int count) => new SubListIterable(this, 0, count);
-
-  Iterable<E> takeWhile(bool test(E element)) {
-    return new TakeWhileIterable<E>(this, test);
-  }
-
-  List<E> toList({ bool growable: true }) {
-    List<E> result;
-    if (growable) {
-      result = new List<E>()..length = length;
-    } else {
-      result = new List<E>(length);
-    }
-    for (int i = 0; i < length; i++) {
-      result[i] = this[i];
-    }
-    return result;
-  }
-
-  Set<E> toSet() {
-    Set<E> result = new Set<E>();
-    for (int i = 0; i < length; i++) {
-      result.add(this[i]);
-    }
-    return result;
-  }
-
-  // Collection interface.
-  void add(E element) {
-    this[this.length++] = element;
-  }
-
-  void addAll(Iterable<E> iterable) {
-    for (E element in iterable) {
-      this[this.length++] = element;
-    }
-  }
-
-  void remove(Object element) {
-    for (int i = 0; i < this.length; i++) {
-      if (this[i] == element) {
-        this.setRange(i, this.length - i - 1, this, i + 1);
-        this.length -= 1;
-        return;
-      }
-    }
-  }
-
-  void removeAll(Iterable<Object> elements) {
-    if (elements is! Set) {
-      elements = elements.toSet();
-    }
-    _filter(this, elements.contains, false);
-  }
-
-
-  void retainAll(Iterable<E> iterable) {
-    if (elements is! Set) {
-      elements = elements.toSet();
-    }
-    _filter(this, elements.contains, true);
-  }
-
-  void removeWhere(bool test(E element)) {
-    _filter(this, test, false);
-  }
-
-  void retainWhere(bool test(E element)) {
-    _filter(this, test, true);
-  }
-
-  static void _filter(List source,
-                      bool test(var element),
-                      bool retainMatching) {
-    List retained = [];
-    int length = source.length;
-    for (int i = 0; i < length; i++) {
-      var element = source[i];
-      if (test(element) == retainMatching) {
-        retained.add(element);
-      }
-      if (length != source.length) {
-        throw new ConcurrentModificationError(source);
-      }
-    }
-    if (retained.length != source.length) {
-      source.setRange(0, retained.length, retained);
-      source.length = retained.length;
-    }
-  }
-
-  // List interface.
-
-  void sort([Comparator<E> compare]) {
-    Sort.sort(this, compare);
-  }
-
-  Map<int, E> asMap() {
-    return new ListMapView(this);
-  }
-
-  List<E> sublist(int start, [int end]) {
-    if (end == null) end = length;
-    if (start < 0 || start > this.length) {
-      throw new RangeError.range(start, 0, this.length);
-    }
-    if (end < start || end > this.length) {
-      throw new RangeError.range(end, start, this.length);
-    }
-    int length = end - start;
-    List<E> result = new List<E>()..length = length;
-    for (int i = 0; i < length; i++) {
-      result[i] = this[start + i];
-    }
-    return result;
-  }
-
-  List<E> getRange(int start, int length) => sublist(start, start + length);
-
-  void insertRange(int start, int length, [E initialValue]) {
-    if (start < 0 || start > this.length) {
-      throw new RangeError.range(start, 0, this.length);
-    }
-    int oldLength = this.length;
-    int moveLength = oldLength - start;
-    this.length += length;
-    if (moveLength > 0) {
-      this.setRange(start + length, moveLength, this, start);
-    }
-    for (int i = 0; i < length; i++) {
-      this[start + i] = initialValue;
-    }
-  }
-
-  void removeRange(int start, int length) {
-    if (start < 0 || start > this.length) {
-      throw new RangeError.range(start, 0, this.length);
-    }
-    if (length < 0 || start + length > this.length) {
-      throw new RangeError.range(length, 0, this.length - start);
-    }
-    int end = start + length;
-    setRange(start, this.length - end, this, end);
-    this.length -= length;
-  }
-
-  void clearRange(int start, int length, [E fill]) {
-    for (int i = 0; i < length; i++) {
-      this[start + i] = fill;
-    }
-  }
-
-  void setRange(int start, int length, List<E> from, [int startFrom]) {
-    if (start < 0 || start > this.length) {
-      throw new RangeError.range(start, 0, this.length);
-    }
-    if (length < 0 || start + length > this.length) {
-      throw new RangeError.range(length, 0, this.length - start);
-    }
-    if (startFrom == null) {
-      startFrom = 0;
-    }
-    if (startFrom < 0 || startFrom + length > from.length) {
-      throw new RangeError.range(startFrom, 0, from.length - length);
-    }
-    if (startFrom < start) {
-      // Copy backwards to ensure correct copy if [from] is this.
-      for (int i = length - 1; i >= 0; i--) {
-        this[start + i] = from[startFrom + i];
-      }
-    } else {
-      for (int i = 0; i < length; i++) {
-        this[start + i] = from[startFrom + i];
-      }
-    }
-  }
-
-  int indexOf(E element, [int startIndex = 0]) {
-    if (startIndex >= this.length) {
-      return -1;
-    }
-    if (startIndex < 0) {
-      startIndex = 0;
-    }
-    for (int i = startIndex; i < this.length; i++) {
-      if (this[i] == element) {
-        return i;
-      }
-    }
-    return -1;
-  }
-
-  /**
-   * Returns the last index in the list [a] of the given [element], starting
-   * the search at index [startIndex] to 0.
-   * Returns -1 if [element] is not found.
-   */
-  int lastIndexOf(E element, [int startIndex]) {
-    if (startIndex == null) {
-      startIndex = this.length - 1;
-    } else {
-      if (startIndex < 0) {
-        return -1;
-      }
-      if (startIndex >= a.length) {
-        startIndex = a.length - 1;
-      }
-    }
-    for (int i = startIndex; i >= 0; i--) {
-      if (this[i] == element) {
-        return i;
-      }
-    }
-    return -1;
-  }
-
-  Iterable<E> get reversed => new ReversedListIterable(this);
-}
-
-/**
  * Mixin that throws on the length changing operations of [List].
  *
  * Intended to mix-in on top of [ListMixin] for fixed-length lists.
@@ -619,23 +176,13 @@
   }
 }
 
-
-/**
- * Abstract implementation of a list.
- *
- * All operations are defined in terms of `length`, `operator[]`,
- * `operator[]=` and `length=`, which need to be implemented.
- */
-abstract class ListBase<E> extends ListMixin<E> implements List<E> {}
-
 /**
  * Abstract implementation of a fixed-length list.
  *
  * All operations are defined in terms of `length`, `operator[]` and
  * `operator[]=`, which need to be implemented.
  */
-abstract class FixedLengthListBase<E> extends ListBase<E>
-                                      with FixedLengthListMixin<E> {}
+typedef FixedLengthListBase<E> = ListBase<E> with FixedLengthListMixin<E>;
 
 /**
  * Abstract implementation of an unmodifiable list.
@@ -643,41 +190,7 @@
  * All operations are defined in terms of `length` and `operator[]`,
  * which need to be implemented.
  */
-abstract class UnmodifiableListBase<E> extends ListBase<E>
-                                       with UnmodifiableListMixin<E> {}
-
-/** An empty fixed-length (and therefore unmodifiable) list. */
-class EmptyList<E> extends FixedLengthListBase<E> {
-  int get length => 0;
-  E operator[](int index) { throw new RangeError.value(index); }
-  void operator []=(int index, E value) { throw new RangeError.value(index); }
-  Iterable<E> skip(int count) => const EmptyIterable();
-  Iterable<E> take(int count) => const EmptyIterable();
-  Iterable<E> get reversed => const EmptyIterable();
-  void sort([int compare(E a, E b)]) {}
-}
-
-class ReversedListIterable<E> extends ListIterable<E> {
-  Iterable<E> _source;
-  ReversedListIterable(this._source);
-
-  int get length => _source.length;
-
-  E elementAt(int index) => _source.elementAt(_source.length - 1 - index);
-}
-
-/**
- * An [Iterable] of the UTF-16 code units of a [String] in index order.
- */
-class CodeUnits extends UnmodifiableListBase<int> {
-  /** The string that this is the code units of. */
-  String _string;
-
-  CodeUnits(this._string);
-
-  int get length => _string.length;
-  int operator[](int i) => _string.codeUnitAt(i);
-}
+typedef UnmodifiableListBase<E> = ListBase<E> with UnmodifiableListMixin<E>;
 
 class _ListIndicesIterable extends ListIterable<int> {
   List _backedList;
@@ -734,3 +247,12 @@
     throw new UnsupportedError("Cannot modify an unmodifiable map");
   }
 }
+
+class ReversedListIterable<E> extends ListIterable<E> {
+  Iterable<E> _source;
+  ReversedListIterable(this._source);
+
+  int get length => _source.length;
+
+  E elementAt(int index) => _source.elementAt(_source.length - 1 - index);
+}
diff --git a/sdk/lib/_collection_dev/to_string.dart b/sdk/lib/_collection_dev/to_string.dart
index f90ff18..e1ff05d 100644
--- a/sdk/lib/_collection_dev/to_string.dart
+++ b/sdk/lib/_collection_dev/to_string.dart
@@ -11,50 +11,50 @@
   // TODO(jjb): visiting list should be an identityHashSet when it exists
 
   /**
-   * Returns a string representing the specified collection. If the
-   * collection is a [List], the returned string looks like this:
+   * Returns a string representing the specified iterable. If the
+   * iterable is a [List], the returned string looks like this:
    * [:'[element0, element1, ... elementN]':]. The value returned by its
    * [toString] method is used to represent each element. If the specified
-   * collection is not a list, the returned string looks like this:
+   * iterable is not a list, the returned string looks like this:
    * [:{element0, element1, ... elementN}:]. In other words, the strings
    * returned for lists are surrounded by square brackets, while the strings
-   * returned for other collections are surrounded by curly braces.
+   * returned for other iterables are surrounded by curly braces.
    *
-   * If the specified collection contains a reference to itself, either
-   * directly or indirectly through other collections or maps, the contained
+   * If the specified iterable contains a reference to itself, either
+   * directly or indirectly through other iterables or maps, the contained
    * reference is rendered as [:'[...]':] if it is a list, or [:'{...}':] if
    * it is not. This prevents the infinite regress that would otherwise occur.
    * So, for example, calling this method on a list whose sole element is a
    * reference to itself would return [:'[[...]]':].
    *
-   * A typical implementation of a collection's [toString] method will
-   * simply return the results of this method applied to the collection.
+   * A typical implementation of a iterable's [toString] method will
+   * simply return the results of this method applied to the iterable.
    */
-  static String collectionToString(Collection c) {
+  static String iterableToString(Iterable i) {
     var result = new StringBuffer();
-    _emitCollection(c, result, new List());
+    _emitValue(i, result, new List());
     return result.toString();
   }
 
   /**
-   * Appends a string representing the specified collection to the specified
-   * string buffer. The string is formatted as per [collectionToString].
+   * Appends a string representing the specified iterable to the specified
+   * string buffer. The string is formatted as per [iterableToString].
    * The [:visiting:] list contains references to all of the enclosing
-   * collections and maps (which are currently in the process of being
+   * iterables and maps (which are currently in the process of being
    * emitted into [:result:]). The [:visiting:] parameter allows this method to
    * generate a [:'[...]':] or [:'{...}':] where required. In other words,
-   * it allows this method and [_emitMap] to identify recursive collections
+   * it allows this method and [_emitMap] to identify recursive iterables
    * and maps.
    */
-  static void _emitCollection(Collection c,
-                              StringBuffer result,
-                              List visiting) {
-    visiting.add(c);
-    bool isList = c is List;
+  static void _emitValue(Iterable i,
+                         StringBuffer result,
+                         List visiting) {
+    visiting.add(i);
+    bool isList = i is List;
     result.write(isList ? '[' : '{');
 
     bool first = true;
-    for (var e in c) {
+    for (var e in i) {
       if (!first) {
         result.write(', ');
       }
@@ -68,8 +68,8 @@
 
   /**
    * Appends a string representing the specified object to the specified
-   * string buffer. If the object is a [Collection] or [Map], it is formatted
-   * as per [collectionToString] or [mapToString]; otherwise, it is formatted
+   * string buffer. If the object is a [iterable] or [Map], it is formatted
+   * as per [iterableToString] or [mapToString]; otherwise, it is formatted
    * by invoking its own [toString] method.
    *
    * The [:visiting:] list contains references to all of the enclosing
@@ -80,17 +80,17 @@
    * and collections.
    */
   static void _emitObject(Object o, StringBuffer result, List visiting) {
-    if (o is Collection) {
+    if (o is Iterable) {
       if (_containsRef(visiting, o)) {
         result.write(o is List ? '[...]' : '{...}');
       } else {
-        _emitCollection(o, result, visiting);
+        _emitValue(o, result, visiting);
       }
     } else if (o is Map) {
       if (_containsRef(visiting, o)) {
         result.write('{...}');
       } else {
-        _emitMap(o, result, visiting);
+        _emitPair(o, result, visiting);
       }
     } else { // o is neither a collection nor a map
       result.write(o);
@@ -101,8 +101,8 @@
    * Returns true if the specified collection contains the specified object
    * reference.
    */
-  static _containsRef(Collection c, Object ref) {
-    for (var e in c) {
+  static _containsRef(Iterable i, Object ref) {
+    for (var e in i) {
       if (identical(e, ref)) return true;
     }
     return false;
@@ -126,7 +126,7 @@
    */
   static String mapToString(Map m) {
     var result = new StringBuffer();
-    _emitMap(m, result, new List());
+    _emitPair(m, result, new List());
     return result.toString();
   }
 
@@ -140,7 +140,7 @@
    * it allows this method and [_emitCollection] to identify recursive maps
    * and collections.
    */
-  static void _emitMap(Map m, StringBuffer result, List visiting) {
+  static void _emitPair(Map m, StringBuffer result, List visiting) {
     visiting.add(m);
     result.write('{');
 
diff --git a/sdk/lib/_internal/compiler/implementation/apiimpl.dart b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
index b3de769..6a81d46 100644
--- a/sdk/lib/_internal/compiler/implementation/apiimpl.dart
+++ b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
@@ -56,7 +56,8 @@
             enableConcreteTypeInference:
                 hasOption(options, '--enable-concrete-type-inference'),
             preserveComments: hasOption(options, '--preserve-comments'),
-            verbose: hasOption(options, '--verbose')) {
+            verbose: hasOption(options, '--verbose'),
+            buildId: getBuildId(options)) {
     if (!libraryRoot.path.endsWith("/")) {
       throw new ArgumentError("libraryRoot must end with a /");
     }
@@ -65,6 +66,15 @@
     }
   }
 
+  static String getBuildId(List<String> options) {
+    for (String option in options) {
+      if (option.startsWith('--build-id=')) {
+        return option.substring('--build-id='.length);
+      }
+    }
+    return "build number could not be determined";
+  }
+
   static List<String> getStrips(List<String> options) {
     for (String option in options) {
       if (option.startsWith('--force-strip=')) {
diff --git a/sdk/lib/_internal/compiler/implementation/closure.dart b/sdk/lib/_internal/compiler/implementation/closure.dart
index aa17a00..48fa3b3 100644
--- a/sdk/lib/_internal/compiler/implementation/closure.dart
+++ b/sdk/lib/_internal/compiler/implementation/closure.dart
@@ -63,6 +63,9 @@
   }
 }
 
+// TODO(ahe): These classes continuously cause problems.  We need to
+// move these classes to elements/modelx.dart or see if we can find a
+// more general solution.
 class ClosureFieldElement extends ElementX {
   ClosureFieldElement(SourceString name, ClassElement enclosing)
       : super(name, ElementKind.FIELD, enclosing);
@@ -79,6 +82,9 @@
   String toString() => "ClosureFieldElement($name)";
 }
 
+// TODO(ahe): These classes continuously cause problems.  We need to
+// move these classes to elements/modelx.dart or see if we can find a
+// more general solution.
 class ClosureClassElement extends ClassElementX {
   DartType rawType;
   DartType thisType;
@@ -114,11 +120,17 @@
   Element methodElement;
 }
 
+// TODO(ahe): These classes continuously cause problems.  We need to
+// move these classes to elements/modelx.dart or see if we can find a
+// more general solution.
 class BoxElement extends ElementX {
   BoxElement(SourceString name, Element enclosingElement)
       : super(name, ElementKind.VARIABLE, enclosingElement);
 }
 
+// TODO(ahe): These classes continuously cause problems.  We need to
+// move these classes to elements/modelx.dart or see if we can find a
+// more general solution.
 class ThisElement extends ElementX {
   ThisElement(Element enclosing)
       : super(const SourceString('this'), ElementKind.PARAMETER, enclosing);
@@ -130,6 +142,9 @@
   Token position() => enclosingElement.position();
 }
 
+// TODO(ahe): These classes continuously cause problems.  We need to
+// move these classes to elements/modelx.dart or see if we can find a
+// more general solution.
 class CheckVariableElement extends ElementX {
   Element parameter;
   CheckVariableElement(SourceString name, this.parameter, Element enclosing)
diff --git a/sdk/lib/_internal/compiler/implementation/code_buffer.dart b/sdk/lib/_internal/compiler/implementation/code_buffer.dart
index 4c0a1fe..1d58b9b 100644
--- a/sdk/lib/_internal/compiler/implementation/code_buffer.dart
+++ b/sdk/lib/_internal/compiler/implementation/code_buffer.dart
@@ -40,7 +40,7 @@
   CodeBuffer writeAll(Iterable<Object> objects, [String separator = ""]) {
     Iterator iterator = objects.iterator;
     if (!iterator.moveNext()) return this;
-    if (separator == "") {
+    if (separator.isEmpty) {
       do {
         write(iterator.current);
       } while (iterator.moveNext());
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index 4270b83..1e2ab51 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -16,16 +16,6 @@
 const bool DUMP_INFERRED_TYPES = false;
 
 /**
- * A string to identify the revision or build.
- *
- * This ID is displayed if the compiler crashes and in verbose mode, and is
- * an aid in reproducing bug reports.
- *
- * The actual string is rewritten during the SDK build process.
- */
-const String BUILD_ID = 'build number could not be determined';
-
-/**
  * Contains backend-specific data that is used throughout the compilation of
  * one work item.
  */
@@ -85,6 +75,15 @@
   }
 }
 
+typedef void PostProcessAction();
+
+class PostProcessTask {
+  final Element element;
+  final PostProcessAction action;
+
+  PostProcessTask(this.element, this.action);
+}
+
 class ReadingFilesTask extends CompilerTask {
   ReadingFilesTask(Compiler compiler) : super(compiler);
   String get name => 'Reading input files';
@@ -139,7 +138,8 @@
                                  TreeElements elements) {}
   void registerStringInterpolation(TreeElements elements) {}
   void registerCatchStatement(TreeElements elements) {}
-  void registerThrow(TreeElements elements) {}
+  void registerWrapException(TreeElements elements) {}
+  void registerThrowExpression(TreeElements elements) {}
   void registerLazyField(TreeElements elements) {}
   void registerTypeVariableExpression(TreeElements elements) {}
   void registerTypeLiteral(TreeElements elements) {}
@@ -364,6 +364,7 @@
   EnqueueTask enqueuer;
   CompilerTask fileReadingTask;
   DeferredLoadTask deferredLoadTask;
+  String buildId;
 
   static const SourceString MAIN = const SourceString('main');
   static const SourceString CALL_OPERATOR_NAME = const SourceString('call');
@@ -375,6 +376,14 @@
   static const SourceString RUNTIME_TYPE = const SourceString('runtimeType');
   static const SourceString START_ROOT_ISOLATE =
       const SourceString('startRootIsolate');
+
+  final Selector iteratorSelector =
+      new Selector.getter(const SourceString('iterator'), null);
+  final Selector currentSelector =
+      new Selector.getter(const SourceString('current'), null);
+  final Selector moveNextSelector =
+      new Selector.call(const SourceString('moveNext'), null, 0);
+
   bool enabledNoSuchMethod = false;
   bool enabledRuntimeType = false;
   bool enabledFunctionApply = false;
@@ -409,6 +418,7 @@
             bool checkDeprecationInSdk: false,
             bool preserveComments: false,
             bool verbose: false,
+            String this.buildId: "build number could not be determined",
             outputProvider,
             List<String> strips: const []})
       : tracer = tracer,
@@ -508,7 +518,7 @@
   }
 
   void pleaseReportCrash() {
-    print(MessageKind.PLEASE_REPORT_THE_CRASH.message({'buildId': BUILD_ID}));
+    print(MessageKind.PLEASE_REPORT_THE_CRASH.message({'buildId': buildId}));
   }
 
   void cancel(String reason, {Node node, Token token,
@@ -715,15 +725,15 @@
     scanBuiltinLibraries();
     if (librariesToAnalyzeWhenRun != null) {
       for (Uri libraryUri in librariesToAnalyzeWhenRun) {
-        log('analyzing $libraryUri ($BUILD_ID)');
+        log('analyzing $libraryUri ($buildId)');
         libraryLoader.loadLibrary(libraryUri, null, libraryUri);
       }
     }
     if (uri != null) {
       if (analyzeOnly) {
-        log('analyzing $uri ($BUILD_ID)');
+        log('analyzing $uri ($buildId)');
       } else {
-        log('compiling $uri ($BUILD_ID)');
+        log('compiling $uri ($buildId)');
       }
       mainApp = libraryLoader.loadLibrary(uri, null, uri);
     }
@@ -835,6 +845,9 @@
       withCurrentElement(work.element, () => work.run(this, world));
     });
     world.queueIsClosed = true;
+    world.forEachPostProcessTask((PostProcessTask work) {
+      withCurrentElement(work.element, () => work.action());
+    });
     if (compilationFailed) return;
     assert(world.checkNoEnqueuedInvokedInstanceMethods());
     if (DUMP_INFERRED_TYPES && phase == PHASE_COMPILING) {
@@ -1239,13 +1252,16 @@
  * [spannable] must be non-null and will be used to provide positional
  * information in the generated error message.
  */
-bool invariant(Spannable spannable, var condition, {String message: null}) {
+bool invariant(Spannable spannable, var condition, {var message: null}) {
   // TODO(johnniwinther): Use [spannable] and [message] to provide better
   // information on assertion errors.
   if (condition is Function){
     condition = condition();
   }
   if (spannable == null || !condition) {
+    if (message is Function) {
+      message = message();
+    }
     throw new SpannableAssertionFailure(spannable, message);
   }
   return true;
diff --git a/sdk/lib/_internal/compiler/implementation/dart2js.dart b/sdk/lib/_internal/compiler/implementation/dart2js.dart
index af7befd..d1f08f9 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2js.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2js.dart
@@ -20,6 +20,16 @@
 const String LIBRARY_ROOT = '../../../../..';
 const String OUTPUT_LANGUAGE_DART = 'Dart';
 
+/**
+ * A string to identify the revision or build.
+ *
+ * This ID is displayed if the compiler crashes and in verbose mode, and is
+ * an aid in reproducing bug reports.
+ *
+ * The actual string is rewritten by a wrapper script when included in the sdk.
+ */
+String BUILD_ID = null;
+
 typedef void HandleOption(String option);
 
 class OptionHandler {
@@ -87,6 +97,10 @@
 
   passThrough(String argument) => options.add(argument);
 
+  if (BUILD_ID != null) {
+    passThrough("--build-id=$BUILD_ID");
+  }
+
   setLibraryRoot(String argument) {
     libraryRoot = cwd.resolve(extractPath(argument));
   }
@@ -486,9 +500,9 @@
   fail(message);
 }
 
-void main() {
+void mainWithErrorHandler(Options options) {
   try {
-    compilerMain(new Options());
+    compilerMain(options);
   } catch (exception, trace) {
     try {
       print('Internal error: $exception');
@@ -502,3 +516,7 @@
     }
   }
 }
+
+void main() {
+  mainWithErrorHandler(new Options());
+}
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/emitter.dart
index c074af4..c58319e 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/emitter.dart
@@ -7,8 +7,8 @@
 String emitCode(
       Unparser unparser,
       Map<LibraryElement, String> imports,
-      Collection<Node> topLevelNodes,
-      Map<ClassNode, Collection<Node>> classMembers) {
+      Iterable<Node> topLevelNodes,
+      Map<ClassNode, Iterable<Node>> classMembers) {
   imports.forEach((libraryElement, prefix) {
     unparser.unparseImportTag('${libraryElement.canonicalUri}', prefix);
   });
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
index 9acc6ec..83531c7 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
@@ -71,7 +71,7 @@
   final Map<LibraryElement, Map<String, String>> renamed
       = new Map<LibraryElement, Map<String, String>>();
 
-  renameNodes(Collection<Node> nodes, renamer) {
+  renameNodes(Iterable<Node> nodes, renamer) {
     for (Node node in sorted(nodes, _compareNodes)) {
       renames[node] = renamer(node);
     }
diff --git a/sdk/lib/_internal/compiler/implementation/dart_types.dart b/sdk/lib/_internal/compiler/implementation/dart_types.dart
index 5f00a62..560bb53 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_types.dart
@@ -5,7 +5,8 @@
 library dart_types;
 
 import 'dart2jslib.dart' show Compiler, invariant, Script, Message;
-import 'elements/modelx.dart' show VoidElementX, LibraryElementX;
+import 'elements/modelx.dart'
+    show VoidElementX, LibraryElementX, BaseClassElementX;
 import 'elements/elements.dart';
 import 'scanner/scannerlib.dart' show SourceString;
 import 'util/util.dart' show Link, LinkBuilder;
@@ -133,6 +134,15 @@
   bool get containsTypeVariables => typeVariableOccurrence != null;
 
   accept(DartTypeVisitor visitor, var argument);
+
+  void visitChildren(DartTypeVisitor visitor, var argument) {}
+
+  static void visitList(Link<DartType> types,
+                        DartTypeVisitor visitor, var argument) {
+    for (Link<DartType> link = types; !link.isEmpty ; link = link.tail) {
+      link.head.accept(visitor, argument);
+    }
+  }
 }
 
 /**
@@ -396,6 +406,10 @@
     return _findTypeVariableOccurrence(typeArguments);
   }
 
+  void visitChildren(DartTypeVisitor visitor, var argument) {
+    DartType.visitList(typeArguments, visitor, argument);
+  }
+
   String toString() {
     StringBuffer sb = new StringBuffer();
     sb.write(name.slowToString());
@@ -438,8 +452,8 @@
     assert(invariant(element, element.isDeclaration));
     assert(invariant(element, element.thisType == null ||
         typeArguments.slowLength() == element.typeVariables.slowLength(),
-        message: 'Invalid type argument count on ${element.thisType}. '
-                 'Provided type arguments: $typeArguments.'));
+        message: () => 'Invalid type argument count on ${element.thisType}. '
+                       'Provided type arguments: $typeArguments.'));
   }
 
   InterfaceType.userProvidedBadType(this.element,
@@ -663,6 +677,13 @@
     return visitor.visitFunctionType(this, argument);
   }
 
+  void visitChildren(DartTypeVisitor visitor, var argument) {
+   returnType.accept(visitor, argument);
+   DartType.visitList(parameterTypes, visitor, argument);
+   DartType.visitList(optionalParameterTypes, visitor, argument);
+   DartType.visitList(namedParameterTypes, visitor, argument);
+  }
+
   String toString() {
     StringBuffer sb = new StringBuffer();
     sb.write('(');
@@ -1033,8 +1054,30 @@
   }
 
   bool visitTypeVariableType(TypeVariableType t, DartType s) {
-    if (s is !TypeVariableType) return false;
-    return (identical(t.element, s.element));
+    // Identity check is handled in [isSubtype].
+    DartType bound = t.element.bound;
+    if (bound.element.isTypeVariable()) {
+      // The bound is potentially cyclic so we need to be extra careful.
+      Link<TypeVariableElement> seenTypeVariables =
+          const Link<TypeVariableElement>();
+      seenTypeVariables = seenTypeVariables.prepend(t.element);
+      while (bound.element.isTypeVariable()) {
+        TypeVariableElement element = bound.element;
+        if (identical(bound.element, s.element)) {
+          // [t] extends [s].
+          return true;
+        }
+        if (seenTypeVariables.contains(element)) {
+          // We have a cycle and have already checked all bounds in the cycle
+          // against [s] and can therefore conclude that [t] is not a subtype
+          // of [s].
+          return false;
+        }
+        seenTypeVariables = seenTypeVariables.prepend(element);
+        bound = element.bound;
+      }
+    }
+    return isSubtype(bound, s);
   }
 }
 
@@ -1045,11 +1088,11 @@
   final DynamicType dynamicType;
   final SubtypeVisitor subtypeVisitor;
 
-  factory Types(Compiler compiler, ClassElement dynamicElement) {
+  factory Types(Compiler compiler, BaseClassElementX dynamicElement) {
     LibraryElement library = new LibraryElementX(new Script(null, null));
     VoidType voidType = new VoidType(new VoidElementX(library));
     DynamicType dynamicType = new DynamicType(dynamicElement);
-    dynamicElement.rawType = dynamicElement.thisType = dynamicType;
+    dynamicElement.rawTypeCache = dynamicElement.thisType = dynamicType;
     SubtypeVisitor subtypeVisitor =
         new SubtypeVisitor(compiler, dynamicType, voidType);
     return new Types.internal(compiler, voidType, dynamicType, subtypeVisitor);
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index b35824d..94d8a1c 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -185,7 +185,6 @@
   bool isClosure();
   bool isMember();
   bool isInstanceMember();
-  bool isInStaticMember();
 
   bool isFactoryConstructor();
   bool isGenerativeConstructor();
@@ -294,6 +293,20 @@
                element.enclosingElement.kind == ElementKind.LIBRARY);
   }
 
+  static bool isInStaticContext(Element element) {
+    if (isUnresolved(element)) return true;
+    if (element.enclosingElement.isClosure()) {
+      var closureClass = element.enclosingElement;
+      element = closureClass.methodElement;
+    }
+    Element outer = element.getOutermostEnclosingMemberOrTopLevel();
+    if (isUnresolved(outer)) return true;
+    if (outer.isTopLevel()) return true;
+    if (outer.isGenerativeConstructor()) return false;
+    if (outer.isInstanceMember()) return false;
+    return true;
+  }
+
   static bool isStaticOrTopLevelField(Element element) {
     return isStaticOrTopLevel(element)
            && (identical(element.kind, ElementKind.FIELD)
@@ -321,8 +334,11 @@
   static bool isClosureSend(Send send, Element element) {
     if (send.isPropertyAccess) return false;
     if (send.receiver != null) return false;
+    Node selector = send.selector;
+    // this().
+    if (selector.isThis()) return true;
     // (o)() or foo()().
-    if (element == null && send.selector.asIdentifier() == null) return true;
+    if (element == null && selector.asIdentifier() == null) return true;
     if (element == null) return false;
     // foo() with foo a local or a parameter.
     return isLocal(element);
@@ -459,8 +475,7 @@
 
   static bool isListSupertype(Element element, Compiler compiler) {
     LibraryElement coreLibrary = compiler.coreLibrary;
-    return (element == coreLibrary.find(const SourceString('Collection')))
-        || (element == coreLibrary.find(const SourceString('Iterable')));
+    return element == coreLibrary.find(const SourceString('Iterable'));
   }
 
   /// A `compareTo` function that places [Element]s in a consistent order based
@@ -741,7 +756,6 @@
   bool get hasLocalScopeMembers;
 
   // TODO(kasperl): These are bit fishy. Do we really need them?
-  void set rawType(InterfaceType value);
   void set thisType(InterfaceType value);
   void set supertype(DartType value);
   void set allSupertypes(Link<DartType> value);
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index 8e9bf31..915a55d 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -70,15 +70,6 @@
   }
   bool isInstanceMember() => false;
 
-  /**
-   * Returns [:true:] if this element is enclosed in a static member or is
-   * itself a static member.
-   */
-  bool isInStaticMember() {
-    Element member = getEnclosingMember();
-    return member != null && member.modifiers.isStatic();
-  }
-
   bool isFactoryConstructor() => modifiers.isFactory();
   bool isGenerativeConstructor() =>
       identical(kind, ElementKind.GENERATIVE_CONSTRUCTOR);
@@ -1364,7 +1355,7 @@
    *
    * This type is computed together with [thisType] in [computeType].
    */
-  InterfaceType rawType;
+  InterfaceType rawTypeCache;
   DartType supertype;
   DartType defaultClass;
   Link<DartType> interfaces;
@@ -1400,23 +1391,29 @@
         Link<DartType> parameters = computeTypeParameters(compiler);
         thisType = new InterfaceType(this, parameters);
         if (parameters.isEmpty) {
-          rawType = thisType;
+          rawTypeCache = thisType;
         } else {
           var dynamicParameters = const Link<DartType>();
           parameters.forEach((_) {
             dynamicParameters =
                 dynamicParameters.prepend(compiler.types.dynamicType);
           });
-          rawType = new InterfaceType(this, dynamicParameters);
+          rawTypeCache = new InterfaceType(this, dynamicParameters);
         }
       } else {
         thisType = origin.computeType(compiler);
-        rawType = origin.rawType;
+        rawTypeCache = origin.rawType;
       }
     }
     return thisType;
   }
 
+  InterfaceType get rawType {
+    assert(invariant(this, rawTypeCache != null,
+                     message: 'Raw type has not been computed for $this'));
+    return rawTypeCache;
+  }
+
   Link<DartType> computeTypeParameters(Compiler compiler);
 
   /**
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index 125a355..70897cb 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -386,6 +386,15 @@
     compiler.backend.registerIsCheck(type, this, elements);
   }
 
+  /**
+   * If a factory constructor is used with type arguments, we lose track
+   * which arguments could be used to create instances of classes that use their
+   * type variables as expressions, so we have to remember if we saw such a use.
+   */
+  void registerFactoryWithTypeArguments(TreeElements elements) {
+    universe.usingFactoryWithTypeArguments = true;
+  }
+
   void registerAsCheck(DartType type, TreeElements elements) {
     registerIsCheck(type, elements);
     compiler.backend.registerAsCheck(type, elements);
@@ -393,6 +402,8 @@
 
   void forEach(f(WorkItem work));
 
+  void forEachPostProcessTask(f(PostProcessTask work)) {}
+
   void logSummary(log(message)) {
     _logSpecificSummary(log);
     nativeEnqueuer.logSummary(log);
@@ -416,11 +427,18 @@
 
   final Queue<ResolutionWorkItem> queue;
 
+  /**
+   * A post-processing queue for the resolution phase which is processed
+   * immediately after the resolution queue has been closed.
+   */
+  final Queue<PostProcessTask> postQueue;
+
   ResolutionEnqueuer(Compiler compiler,
                      ItemCompilationContext itemCompilationContextCreator())
       : super('resolution enqueuer', compiler, itemCompilationContextCreator),
         resolvedElements = new Map<Element, TreeElements>(),
-        queue = new Queue<ResolutionWorkItem>();
+        queue = new Queue<ResolutionWorkItem>(),
+        postQueue = new Queue<PostProcessTask>();
 
   bool get isResolutionQueue => true;
 
@@ -521,6 +539,27 @@
     }
   }
 
+  /**
+   * Adds an action to the post-processing queue.
+   *
+   * The action is performed as part of the post-processing immediately after
+   * the resolution queue has been closed. As a consequence, [action] must not
+   * add elements to the resolution queue.
+   */
+  void addPostProcessAction(Element element, PostProcessAction action) {
+    if (queueIsClosed) {
+      throw new SpannableAssertionFailure(element,
+                                          "Resolution work list is closed.");
+    }
+    postQueue.add(new PostProcessTask(element, action));
+  }
+
+  void forEachPostProcessTask(f(PostProcessTask work)) {
+    while (!postQueue.isEmpty) {
+      f(postQueue.removeFirst());
+    }
+  }
+
   void registerJsCall(Send node, ResolverVisitor resolver) {
     nativeEnqueuer.registerJsCall(node, resolver);
   }
diff --git a/sdk/lib/_internal/compiler/implementation/js/builder.dart b/sdk/lib/_internal/compiler/implementation/js/builder.dart
index 5492466..5247d67 100644
--- a/sdk/lib/_internal/compiler/implementation/js/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/builder.dart
@@ -10,18 +10,19 @@
 class JsBuilder {
   const JsBuilder();
 
-  Expression operator [](String source) {
-    return new MiniJsParser(source).expression();
-  }
-
-  // TODO(ahe): Remove this method.
-  Binary equals(Expression left, Expression right) {
-    return new Binary('==', left, right);
-  }
-
-  // TODO(ahe): Remove this method.
-  Binary strictEquals(Expression left, Expression right) {
-    return new Binary('===', left, right);
+  // Parse a bit of JS, and return an expression.  See the MiniJsParser class.
+  // You can provide an expression or a list of expressions, which will be
+  // interpolated into the source at the '#' signs.
+  Expression call(String source, [var expression]) {
+    List<Expression> expressions;
+    if (expression != null) {
+      if (expression is List) {
+        expressions = expression;
+      } else {
+        expressions = <Expression>[expression];
+      }
+    }
+    return new MiniJsParser(source, expressions).expression();
   }
 
   LiteralString string(String value) => new LiteralString('"$value"');
@@ -92,7 +93,7 @@
     if (expression is Expression) {
       return expression;
     } else if (expression is String) {
-      return this[expression];
+      return this(expression);
     } else if (expression is num) {
       return new LiteralNumber('$expression');
     } else if (expression is bool) {
@@ -161,12 +162,11 @@
 /// * most operators.
 /// * brackets.
 /// * var declarations.
-/// Notable things it can't do yet include:
 /// * operator precedence.
+/// Notable things it can't do yet include:
 /// * non-empty object literals.
 /// * throw, return.
 /// * statements, including any flow control (if, while, for, etc.)
-/// * the 'in' keyword.
 ///
 /// It's a fairly standard recursive descent parser.
 ///
@@ -178,11 +178,12 @@
 /// to get early errors for unintentional escape sequences without complicating
 /// this parser unneccessarily.
 class MiniJsParser {
-  MiniJsParser(this.src)
+  MiniJsParser(this.src, this.interpolatedValues)
       : lastCategory = NONE,
         lastToken = null,
         lastPosition = 0,
-        position = 0 {
+        position = 0,
+        valuesUsed = 0 {
     getSymbol();
   }
 
@@ -190,14 +191,16 @@
   String lastToken;
   int lastPosition;
   int position;
+  int valuesUsed;
   String src;
+  List<Expression> interpolatedValues;
 
   static const NONE = -1;
   static const ALPHA = 0;
   static const NUMERIC = 1;
   static const STRING = 2;
   static const SYMBOL = 3;
-  static const RELATION = 4;
+  static const ASSIGNMENT = 4;
   static const DOT = 5;
   static const LPAREN = 6;
   static const RPAREN = 7;
@@ -208,7 +211,9 @@
   static const COMMA = 12;
   static const QUERY = 13;
   static const COLON = 14;
-  static const OTHER = 15;
+  static const HASH = 15;
+  static const WHITESPACE = 16;
+  static const OTHER = 17;
 
   // Make sure that ]] is two symbols.
   bool singleCharCategory(int category) => category >= DOT;
@@ -219,7 +224,7 @@
       case ALPHA: return "ALPHA";
       case NUMERIC: return "NUMERIC";
       case SYMBOL: return "SYMBOL";
-      case RELATION: return "RELATION";
+      case ASSIGNMENT: return "ASSIGNMENT";
       case DOT: return "DOT";
       case LPAREN: return "LPAREN";
       case RPAREN: return "RPAREN";
@@ -230,6 +235,8 @@
       case COMMA: return "COMMA";
       case QUERY: return "QUERY";
       case COLON: return "COLON";
+      case HASH: return "HASH";
+      case WHITESPACE: return "WHITESPACE";
       case OTHER: return "OTHER";
     }
     return "Unknown: $cat";
@@ -237,14 +244,15 @@
 
   static const CATEGORIES = const <int>[
       OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,       // 0-7
-      OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,       // 8-15
-      OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,       // 16-23
-      OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,       // 24-31
-      OTHER, RELATION, OTHER, OTHER, ALPHA, SYMBOL, SYMBOL, OTHER,  //  !"#$%&´
+      OTHER, WHITESPACE, WHITESPACE, OTHER, OTHER, WHITESPACE,      // 8-13
+      OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,       // 14-21
+      OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,       // 22-29
+      OTHER, OTHER, WHITESPACE,                                     // 30-32
+      SYMBOL, OTHER, HASH, ALPHA, SYMBOL, SYMBOL, OTHER,            // !"#$%&´
       LPAREN, RPAREN, SYMBOL, SYMBOL, COMMA, SYMBOL, DOT, SYMBOL,   // ()*+,-./
       NUMERIC, NUMERIC, NUMERIC, NUMERIC, NUMERIC,                  // 01234
       NUMERIC, NUMERIC, NUMERIC, NUMERIC, NUMERIC,                  // 56789
-      COLON, OTHER, RELATION, RELATION, RELATION, QUERY, OTHER,     // :;<=>?@
+      COLON, OTHER, SYMBOL, SYMBOL, SYMBOL, QUERY, OTHER,           // :;<=>?@
       ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA,       // ABCDEFGH
       ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA,       // IJKLMNOP
       ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA,       // QRSTUVWX
@@ -254,11 +262,27 @@
       ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA,       // qrstuvwx
       ALPHA, ALPHA, LBRACE, SYMBOL, RBRACE, SYMBOL];                // yz{|}~
 
-  static final BINARY_OPERATORS = [
-      '+', '-', '*', '/', '%', '^', '|', '&', '||', '&&', '<<', '>>', '>>>',
-      '+=', '-=', '*=', '/=', '%=', '^=', '|=', '&=', '<<=', '>>=', '>>>=',
-      '=', '!=', '==', '!==', '===', '<', '<=', '>=', '>'].toSet();
-  static final UNARY_OPERATORS = ['++', '--', '+', '-', '~', '!'].toSet();
+  // This must be a >= the highest precedence number handled by parseBinary.
+  static var HIGHEST_PARSE_BINARY_PRECEDENCE = 16;
+  static bool isAssignment(String symbol) => BINARY_PRECEDENCE[symbol] == 17;
+
+  // From https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence
+  static final BINARY_PRECEDENCE = {
+      '+=': 17, '-=': 17, '*=': 17, '/=': 17, '%=': 17, '^=': 17, '|=': 17,
+      '&=': 17, '<<=': 17, '>>=': 17, '>>>=': 17, '=': 17,
+      '||': 14,
+      '&&': 13,
+      '|': 12,
+      '^': 11,
+      '&': 10,
+      '!=': 9, '==': 9, '!==': 9, '===': 9,
+      '<': 8, '<=': 8, '>=': 8, '>': 8, 'in': 8, 'instanceof': 8,
+      '<<': 7, '>>': 7, '>>>': 7,
+      '+': 6, '-': 6,
+      '*': 5, '/': 5, '%': 5
+  };
+  static final UNARY_OPERATORS =
+      ['++', '--', '+', '-', '~', '!', 'typeof', 'void', 'delete'].toSet();
 
   static int category(int code) {
     if (code >= CATEGORIES.length) return OTHER;
@@ -267,7 +291,7 @@
 
   void getSymbol() {
     while (position < src.length &&
-           src.codeUnitAt(position) == charCodes.$SPACE) {
+           category(src.codeUnitAt(position)) == WHITESPACE) {
       position++;
     }
     if (position == src.length) {
@@ -311,23 +335,32 @@
       do {
         position++;
         if (position == src.length) break;
-        newCat = category(src.codeUnitAt(position));
+        int code = src.codeUnitAt(position);
+        // Special code to disallow ! in non-first position in token, so that
+        // !! parses as two tokens and != parses as one.
+        newCat = (code == charCodes.$BANG) ? NONE : category(code);
       } while (!singleCharCategory(cat) &&
                (cat == newCat ||
                 (cat == ALPHA && newCat == NUMERIC) ||    // eg. level42.
-                (cat == NUMERIC && newCat == DOT) ||      // eg. 3.1415
-                (cat == SYMBOL && newCat == RELATION)));  // eg. +=.
+                (cat == NUMERIC && newCat == DOT)));      // eg. 3.1415
       lastCategory = cat;
       lastToken = src.substring(lastPosition, position);
       if (cat == NUMERIC) {
         double.parse(lastToken, (_) {
           throw new MiniJsParserError(this, "Unparseable number");
         });
-      } else if (cat == SYMBOL || cat == RELATION) {
-        if (!BINARY_OPERATORS.contains(lastToken) &&
-            !UNARY_OPERATORS.contains(lastToken)) {
+      } else if (cat == SYMBOL) {
+        int binaryPrecendence = BINARY_PRECEDENCE[lastToken];
+        if (binaryPrecendence == null && !UNARY_OPERATORS.contains(lastToken)) {
           throw new MiniJsParserError(this, "Unknown operator");
         }
+        if (isAssignment(lastToken)) lastCategory = ASSIGNMENT;
+      } else if (cat == ALPHA) {
+        if (lastToken == 'typeof' || lastToken == 'void' ||
+            lastToken == 'delete' || lastToken == 'in' ||
+            lastToken == 'instanceof') {
+          lastCategory = SYMBOL;
+        }
       }
     }
   }
@@ -387,6 +420,12 @@
         expectCategory(RSQUARE);
       }
       return new ArrayInitializer(values.length, values);
+    } else if (acceptCategory(HASH)) {
+      if (interpolatedValues == null ||
+          valuesUsed >= interpolatedValues.length) {
+        throw new MiniJsParserError(this, "Too few values for #es");
+      }
+      return interpolatedValues[valuesUsed++];
     } else {
       throw new MiniJsParserError(this, "Expected primary expression");
     }
@@ -412,25 +451,28 @@
   Expression parseCall() {
     bool constructor = acceptString("new");
     Expression receiver = parseMember();
-    if (acceptCategory(LPAREN)) {
-      final arguments = <Expression>[];
-      if (!acceptCategory(RPAREN)) {
-        while (true) {
-          Expression argument = parseExpression();
-          arguments.add(argument);
-          if (acceptCategory(RPAREN)) break;
-          expectCategory(COMMA);
+    while (true) {
+      if (acceptCategory(LPAREN)) {
+        final arguments = <Expression>[];
+        if (!acceptCategory(RPAREN)) {
+          while (true) {
+            Expression argument = parseExpression();
+            arguments.add(argument);
+            if (acceptCategory(RPAREN)) break;
+            expectCategory(COMMA);
+          }
         }
+        receiver = constructor ?
+               new New(receiver, arguments) :
+               new Call(receiver, arguments);
+        constructor = false;
+      } else {
+        if (constructor) {
+          // JS allows new without (), but we don't.
+          throw new MiniJsParserError(this, "Parentheses are required for new");
+        }
+        return receiver;
       }
-      return constructor ?
-             new New(receiver, arguments) :
-             new Call(receiver, arguments);
-    } else {
-      if (constructor) {
-        // JS allows new without (), but we don't.
-        throw new MiniJsParserError(this, "Parentheses are required for new");
-      }
-      return receiver;
     }
   }
 
@@ -443,71 +485,53 @@
     return expression;
   }
 
-  Expression parseUnary() {
+  Expression parseUnaryHigh() {
     String operator = lastToken;
-    if (lastCategory == ALPHA) {
-     if (acceptString("typeof") || acceptString("void") ||
-         acceptString("delete")) {
-        return new Prefix(operator, parsePostfix());
-     }
-    } else if (lastCategory == SYMBOL) {
-      if (acceptString("~") || acceptString("-") || acceptString("++") ||
-          acceptString("--") || acceptString("+")) {
-        return new Prefix(operator, parsePostfix());
-      }
-    } else if (acceptString("!")) {
+    if (lastCategory == SYMBOL && UNARY_OPERATORS.contains(operator) &&
+        (acceptString("++") || acceptString("--"))) {
       return new Prefix(operator, parsePostfix());
     }
     return parsePostfix();
   }
 
-  Expression parseBinary() {
-    // Since we don't handle precedence we don't allow two different symbols
-    // without parentheses.
-    Expression lhs = parseUnary();
-    String firstSymbol = lastToken;
-    while (true) {
-      String symbol = lastToken;
-      if (!acceptCategory(SYMBOL)) return lhs;
-      if (!BINARY_OPERATORS.contains(symbol)) {
-        throw new MiniJsParserError(this, "Unknown binary operator");
-      }
-      if (symbol != firstSymbol) {
-        throw new MiniJsParserError(
-            this, "Mixed $firstSymbol and $symbol operators without ()");
-      }
-      Expression rhs = parseUnary();
-      if (symbol.endsWith("=")) {
-        // +=, -=, *= etc.
-        lhs = new Assignment.compound(lhs,
-                                      symbol.substring(0, symbol.length - 1),
-                                      rhs);
-      } else {
-        lhs = new Binary(symbol, lhs, rhs);
-      }
+  Expression parseUnaryLow() {
+    String operator = lastToken;
+    if (lastCategory == SYMBOL && UNARY_OPERATORS.contains(operator) &&
+        operator != "++" && operator != "--") {
+      expectCategory(SYMBOL);
+      return new Prefix(operator, parseUnaryLow());
     }
+    return parseUnaryHigh();
   }
 
-  Expression parseRelation() {
-    Expression lhs = parseBinary();
-    String relation = lastToken;
-    // The lexer returns "=" as a relational operator because it looks a bit
-    // like ==, <=, etc.  But we don't want to handle it here (that would give
-    // it the wrong prescedence), so we just return if we see it.
-    if (relation == "=" || !acceptCategory(RELATION)) return lhs;
-    Expression rhs = parseBinary();
-    if (relation == "<<=" || relation == ">>=" || relation == ">>>=") {
-      return new Assignment.compound(lhs,
-                                     relation.substring(0, relation.length - 1),
-                                     rhs);
-    } else {
-      // Regular binary operation.
-      return new Binary(relation, lhs, rhs);
+  Expression parseBinary(int maxPrecedence) {
+    Expression lhs = parseUnaryLow();
+    int minPrecedence;
+    String lastSymbol;
+    Expression rhs;  // This is null first time around.
+    while (true) {
+      String symbol = lastToken;
+      if (lastCategory != SYMBOL ||
+          !BINARY_PRECEDENCE.containsKey(symbol) ||
+          BINARY_PRECEDENCE[symbol] > maxPrecedence) {
+        if (rhs == null) return lhs;
+        return new Binary(lastSymbol, lhs, rhs);
+      }
+      expectCategory(SYMBOL);
+      if (rhs == null || BINARY_PRECEDENCE[symbol] >= minPrecedence) {
+        if (rhs != null) lhs = new Binary(lastSymbol, lhs, rhs);
+        minPrecedence = BINARY_PRECEDENCE[symbol];
+        rhs = parseUnaryLow();
+        lastSymbol = symbol;
+      } else {
+        Expression higher = parseBinary(BINARY_PRECEDENCE[symbol]);
+        rhs = new Binary(symbol, rhs, higher);
+      }
     }
   }
 
   Expression parseConditional() {
-    Expression lhs = parseRelation();
+    Expression lhs = parseBinary(HIGHEST_PARSE_BINARY_PRECEDENCE);
     if (!acceptCategory(QUERY)) return lhs;
     Expression ifTrue = parseAssignment();
     expectCategory(COLON);
@@ -518,8 +542,17 @@
 
   Expression parseAssignment() {
     Expression lhs = parseConditional();
-    if (acceptString("=")) {
-      return new Assignment(lhs, parseAssignment());
+    String assignmentOperator = lastToken;
+    if (acceptCategory(ASSIGNMENT)) {
+      Expression rhs = parseAssignment();
+      if (assignmentOperator == "=") {
+        return new Assignment(lhs, rhs);
+      } else  {
+        // Handle +=, -=, etc.
+        String operator =
+            assignmentOperator.substring(0, assignmentOperator.length - 1);
+        return new Assignment.compound(lhs, operator, rhs);
+      }
     }
     return lhs;
   }
@@ -552,6 +585,9 @@
       throw new MiniJsParserError(
           this, "Unparsed junk: ${categoryToString(lastCategory)}");
     }
+    if (interpolatedValues != null && valuesUsed != interpolatedValues.length) {
+      throw new MiniJsParserError(this, "Too many values for #es");
+    }
     return expression;
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index 2902003..69caf46 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -734,12 +734,19 @@
    * the generic version that contains all possible type checks is
    * also stored in this map.
    */
-  final Map<String, Collection<ClassElement>> specializedGetInterceptors;
+  final Map<String, Set<ClassElement>> specializedGetInterceptors;
 
   /**
    * Set of classes whose methods are intercepted.
    */
-  final Set<ClassElement> interceptedClasses;
+  final Set<ClassElement> interceptedClasses = new Set<ClassElement>();
+
+  /**
+   * Set of classes used as mixins on native classes.  Methods on these classes
+   * might also be mixed in to non-native classes.
+   */
+  final Set<ClassElement> classesMixedIntoNativeClasses =
+      new Set<ClassElement>();
 
   /**
    * Set of classes whose `operator ==` methods handle `null` themselves.
@@ -760,9 +767,7 @@
         oneShotInterceptors = new Map<String, Selector>(),
         interceptedElements = new Map<SourceString, Set<Element>>(),
         rti = new RuntimeTypes(compiler),
-        specializedGetInterceptors =
-            new Map<String, Collection<ClassElement>>(),
-        interceptedClasses = new Set<ClassElement>(),
+        specializedGetInterceptors = new Map<String, Set<ClassElement>>(),
         super(compiler, JAVA_SCRIPT_CONSTANT_SYSTEM) {
     emitter = disableEval
         ? new CodeEmitterNoEvalTask(compiler, namer, generateSourceMap)
@@ -783,7 +788,9 @@
   bool isInterceptorClass(ClassElement element) {
     if (element == null) return false;
     if (element.isNative()) return true;
-    return interceptedClasses.contains(element);
+    if (interceptedClasses.contains(element)) return true;
+    if (classesMixedIntoNativeClasses.contains(element)) return true;
+    return false;
   }
 
   void addInterceptedSelector(Selector selector) {
@@ -949,7 +956,19 @@
       ClassElement cls, Enqueuer enqueuer) {
     if (enqueuer.isResolutionQueue) {
       cls.ensureResolved(compiler);
-      addInterceptorMembers(cls);
+      cls.forEachMember((ClassElement classElement, Element member) {
+          // All methods on [Object] are shadowed by [Interceptor].
+          if (classElement == compiler.objectClass) return;
+          Set<Element> set = interceptedElements.putIfAbsent(
+              member.name, () => new Set<Element>());
+          set.add(member);
+          if (!classElement.isNative()) {
+            MixinApplicationElement mixinApplication = classElement;
+            assert(member.getEnclosingClass() == mixinApplication.mixin);
+            classesMixedIntoNativeClasses.add(mixinApplication.mixin);
+          }
+        },
+        includeSuperMembers: true);
     }
   }
 
@@ -958,22 +977,18 @@
                        TreeElements elements) {
     if (enqueuer.isResolutionQueue) {
       cls.ensureResolved(compiler);
-      addInterceptorMembers(cls);
+      cls.forEachMember((ClassElement classElement, Element member) {
+          // All methods on [Object] are shadowed by [Interceptor].
+          if (classElement == compiler.objectClass) return;
+          Set<Element> set = interceptedElements.putIfAbsent(
+              member.name, () => new Set<Element>());
+          set.add(member);
+        },
+        includeSuperMembers: true);
     }
     enqueuer.registerInstantiatedClass(cls, elements);
   }
 
-  void addInterceptorMembers(ClassElement cls) {
-    cls.forEachMember((ClassElement classElement, Element member) {
-        // All methods on [Object] are shadowed by [Interceptor].
-        if (classElement == compiler.objectClass) return;
-        Set<Element> set = interceptedElements.putIfAbsent(
-            member.name, () => new Set<Element>());
-        set.add(member);
-      },
-      includeSuperMembers: true);
-  }
-
   void registerSpecializedGetInterceptor(Set<ClassElement> classes) {
     String name = namer.getInterceptorName(getInterceptorMethod, classes);
     if (classes.contains(jsInterceptorClass)) {
@@ -1119,8 +1134,12 @@
     enqueueInResolution(getExceptionUnwrapper(), elements);
   }
 
-  void registerThrow(TreeElements elements) {
-    enqueueInResolution(getThrowHelper(), elements);
+  void registerWrapException(TreeElements elements) {
+    enqueueInResolution(getWrapExceptionHelper(), elements);
+  }
+
+  void registerThrowExpression(TreeElements elements) {
+    enqueueInResolution(getThrowExpressionHelper(), elements);
   }
 
   void registerLazyField(TreeElements elements) {
@@ -1656,8 +1675,12 @@
     return compiler.findHelper(const SourceString('S'));
   }
 
-  Element getThrowHelper() {
-    return compiler.findHelper(const SourceString(r'$throw'));
+  Element getWrapExceptionHelper() {
+    return compiler.findHelper(const SourceString(r'wrapException'));
+  }
+
+  Element getThrowExpressionHelper() {
+    return compiler.findHelper(const SourceString('throwExpression'));
   }
 
   Element getClosureConverter() {
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
index 2597d91..9397f1a 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
@@ -80,11 +80,11 @@
   jsAst.Expression visitDouble(DoubleConstant constant) {
     double value = constant.value;
     if (value.isNaN) {
-      return new jsAst.LiteralNumber("(0/0)");
+      return js("0/0");
     } else if (value == double.INFINITY) {
-      return new jsAst.LiteralNumber("(1/0)");
+      return js("1/0");
     } else if (value == -double.INFINITY) {
-      return new jsAst.LiteralNumber("(-1/0)");
+      return js("-1/0");
     } else {
       return new jsAst.LiteralNumber("$value");
     }
@@ -93,18 +93,18 @@
   jsAst.Expression visitTrue(TrueConstant constant) {
     if (compiler.enableMinification) {
       // Use !0 for true.
-      return js["!0"];
+      return js("!0");
     } else {
-      return new jsAst.LiteralBool(true);
+      return js('true');
     }
   }
 
   jsAst.Expression visitFalse(FalseConstant constant) {
     if (compiler.enableMinification) {
       // Use !1 for false.
-      return js["!1"];
+      return js("!1");
     } else {
-      return new jsAst.LiteralBool(false);
+      return js('false');
     }
   }
 
@@ -286,8 +286,7 @@
     Element helper = backend.getCreateRuntimeType();
     String helperName = backend.namer.getName(helper);
     DartType type = constant.representedType;
-    Element element = type.element;
-    String name = backend.rti.getRawTypeRepresentation(type);
+    String name = namer.getRuntimeTypeName(type.element);
     jsAst.Expression typeName = new jsAst.LiteralString("'$name'");
     return new jsAst.Call(
         new jsAst.PropertyAccess.field(
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
index 4d32c89..124a132 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
@@ -142,7 +142,8 @@
   void computeRequiredTypeChecks() {
     assert(checkedClasses == null && checkedTypedefs == null);
 
-    compiler.codegenWorld.addImplicitChecks(classesUsingTypeVariableTests);
+    backend.rti.addImplicitChecks(compiler.codegenWorld,
+                                  classesUsingTypeVariableTests);
 
     checkedClasses = new Set<ClassElement>();
     checkedTypedefs = new Set<TypedefElement>();
@@ -218,46 +219,46 @@
 
     // function generateAccessor(field, prototype) {
     jsAst.Fun fun = js.fun(['field', 'prototype'], [
-      js['var len = field.length'],
-      js['var code = field.charCodeAt(len - 1)'],
-      js['code = ((code >= $RANGE1_FIRST) && (code <= $RANGE1_LAST))'
+      js('var len = field.length'),
+      js('var code = field.charCodeAt(len - 1)'),
+      js('code = ((code >= $RANGE1_FIRST) && (code <= $RANGE1_LAST))'
           '    ? code - $RANGE1_ADJUST'
           '    : ((code >= $RANGE2_FIRST) && (code <= $RANGE2_LAST))'
           '      ? code - $RANGE2_ADJUST'
           '      : ((code >= $RANGE3_FIRST) && (code <= $RANGE3_LAST))'
           '        ? code - $RANGE3_ADJUST'
-          '        : $NO_FIELD_CODE'],
+          '        : $NO_FIELD_CODE'),
 
       // if (needsAccessor) {
       js.if_('code', [
-        js['var getterCode = code & 3'],
-        js['var setterCode = code >> 2'],
-        js['var accessorName = field = field.substring(0, len - 1)'],
+        js('var getterCode = code & 3'),
+        js('var setterCode = code >> 2'),
+        js('var accessorName = field = field.substring(0, len - 1)'),
 
-        js['var divider = field.indexOf(":")'],
+        js('var divider = field.indexOf(":")'),
         js.if_('divider > 0', [  // Colon never in first position.
-          js['accessorName = field.substring(0, divider)'],
-          js['field = field.substring(divider + 1)']
+          js('accessorName = field.substring(0, divider)'),
+          js('field = field.substring(divider + 1)')
         ]),
 
         // if (needsGetter) {
         js.if_('getterCode', [
-          js['var args = (getterCode & 2) ? "$receiverParamName" : ""'],
-          js['var receiver = (getterCode & 1) ? "this" : "$receiverParamName"'],
-          js['var body = "return " + receiver + "." + field'],
-          js['prototype["${namer.getterPrefix}" + accessorName] = '
-                 'new Function(args, body)']
+          js('var args = (getterCode & 2) ? "$receiverParamName" : ""'),
+          js('var receiver = (getterCode & 1) ? "this" : "$receiverParamName"'),
+          js('var body = "return " + receiver + "." + field'),
+          js('prototype["${namer.getterPrefix}" + accessorName] = '
+                 'new Function(args, body)')
         ]),
 
         // if (needsSetter) {
         js.if_('setterCode', [
-          js['var args = (setterCode & 2)'
+          js('var args = (setterCode & 2)'
               '  ? "$receiverParamName,${_}$valueParamName"'
-              '  : "$valueParamName"'],
-          js['var receiver = (setterCode & 1) ? "this" : "$receiverParamName"'],
-          js['var body = receiver + "." + field + "$_=$_$valueParamName"'],
-          js['prototype["${namer.setterPrefix}" + accessorName] = '
-                 'new Function(args, body)']
+              '  : "$valueParamName"'),
+          js('var receiver = (setterCode & 1) ? "this" : "$receiverParamName"'),
+          js('var body = receiver + "." + field + "$_=$_$valueParamName"'),
+          js('prototype["${namer.setterPrefix}" + accessorName] = '
+                 'new Function(args, body)')
         ]),
 
       ]),
@@ -288,33 +289,33 @@
 
     // function(cls, fields, prototype) {
     var defineClass = js.fun(['cls', 'fields', 'prototype'], [
-      js['var constructor'],
+      js('var constructor'),
 
       // if (typeof fields == "function") {
-      js.if_(js['typeof fields == "function"'], [
-        js['constructor = fields']
+      js.if_(js('typeof fields == "function"'), [
+        js('constructor = fields')
       ], /* else */ [
-        js['var str = "function " + cls + "("'],
-        js['var body = ""'],
+        js('var str = "function " + cls + "("'),
+        js('var body = ""'),
 
         // for (var i = 0; i < fields.length; i++) {
         js.for_('var i = 0', 'i < fields.length', 'i++', [
           // if (i != 0) str += ", ";
-          js.if_('i != 0', js['str += ", "']),
+          js.if_('i != 0', js('str += ", "')),
 
-          js['var field = fields[i]'],
-          js['field = generateAccessor(field, prototype)'],
-          js['str += field'],
-          js['body += ("this." + field + " = " + field + ";\\n")']
+          js('var field = fields[i]'),
+          js('field = generateAccessor(field, prototype)'),
+          js('str += field'),
+          js('body += ("this." + field + " = " + field + ";\\n")')
         ]),
 
-        js['str += (") {" + body + "}\\nreturn " + cls)'],
+        js('str += (") {" + body + "}\\nreturn " + cls)'),
 
-        js['constructor = (new Function(str))()']
+        js('constructor = new Function(str)()')
       ]),
 
-      js['constructor.prototype = prototype'],
-      js['constructor.builtin\$cls = cls'],
+      js('constructor.prototype = prototype'),
+      js('constructor.builtin\$cls = cls'),
 
       // return constructor;
       js.return_('constructor')
@@ -323,7 +324,7 @@
     // defineClassFunction (it's a local declaration in init()).
     return [
         generateAccessorFunction,
-        js['$generateAccessorHolder = generateAccessor'],
+        js('$generateAccessorHolder = generateAccessor'),
         new jsAst.FunctionDeclaration(
             new jsAst.VariableDeclaration('defineClass'), defineClass) ];
   }
@@ -341,13 +342,13 @@
     // TODO(8541): Remove this work around.
 
     return [
-      js['var $supportsProtoName = false'],
-      js['var tmp = (defineClass("c", ["f?"], {})).prototype'],
+      js('var $supportsProtoName = false'),
+      js('var tmp = (defineClass("c", ["f?"], {})).prototype'),
 
-      js.if_(js['tmp.__proto__'], [
-        js['tmp.__proto__ = {}'],
-        js.if_(js[r'typeof tmp.get$f != "undefined"'],
-               js['$supportsProtoName = true'])
+      js.if_(js('tmp.__proto__'), [
+        js('tmp.__proto__ = {}'),
+        js.if_(js(r'typeof tmp.get$f != "undefined"'),
+               js('$supportsProtoName = true'))
 
       ])
     ];
@@ -498,37 +499,37 @@
     var type = 0;
     if (useDiffEncoding) {
       statements.addAll([
-        js['var objectClassObject = '
+        js('var objectClassObject = '
            '        collectedClasses["${namer.getName(objectClass)}"],'
            '    shortNames = "$diffEncoding".split(","),'
            '    nameNumber = 0,'
            '    diffEncodedString = shortNames[0],'
-           '    calculatedShortNames = [0, 1]'],  // 0, 1 are args for splice.
+           '    calculatedShortNames = [0, 1]'),  // 0, 1 are args for splice.
         js.for_('var i = 0', 'i < diffEncodedString.length', 'i++', [
-          js['var codes = [],'
+          js('var codes = [],'
              '    diff = 0,'
-             '    digit = diffEncodedString.charCodeAt(i)'],
+             '    digit = diffEncodedString.charCodeAt(i)'),
           js.if_('digit == ${$PERIOD}', [
-            js['nameNumber = 0'],
-            js['digit = diffEncodedString.charCodeAt(++i)']
+            js('nameNumber = 0'),
+            js('digit = diffEncodedString.charCodeAt(++i)')
           ]),
           js.while_('digit <= ${$Z}', [
-            js['diff *= 26'],
-            js['diff += (digit - ${$A})'],
-            js['digit = diffEncodedString.charCodeAt(++i)']
+            js('diff *= 26'),
+            js('diff += (digit - ${$A})'),
+            js('digit = diffEncodedString.charCodeAt(++i)')
           ]),
-          js['diff *= 26'],
-          js['diff += (digit - ${$a})'],
-          js['nameNumber += diff'],
+          js('diff *= 26'),
+          js('diff += (digit - ${$a})'),
+          js('nameNumber += diff'),
           js.for_('var remaining = nameNumber',
                   'remaining > 0',
-                  'remaining = ((remaining / 88) | 0)', [
-            js['codes.unshift(${$HASH} + (remaining % 88))']
+                  'remaining = (remaining / 88) | 0', [
+            js('codes.unshift(${$HASH} + remaining % 88)')
           ]),
-          js['calculatedShortNames.push('
-             '    String.fromCharCode.apply(String, codes))']
+          js('calculatedShortNames.push('
+             '    String.fromCharCode.apply(String, codes))')
         ]),
-        js['shortNames.splice.apply(shortNames, calculatedShortNames)']
+        js('shortNames.splice.apply(shortNames, calculatedShortNames)')
       ]);
     } else {
       // No useDiffEncoding version.
@@ -537,10 +538,10 @@
       String longNamesConstant = minify ? "" :
           ',longNames = "${longs.join(",")}".split(",")';
       statements.add(
-        js['var objectClassObject = '
+        js('var objectClassObject = '
            '        collectedClasses["${namer.getName(objectClass)}"],'
            '    shortNames = "$diffEncoding".split(",")'
-           '    $longNamesConstant']);
+           '    $longNamesConstant'));
     }
 
     String sliceOffset = '," + (j < $firstNormalSelector ? 1 : 0)';
@@ -553,11 +554,11 @@
 
     statements.addAll([
       js.for_('var j = 0', 'j < shortNames.length', 'j++', [
-        js['var type = 0'],
-        js['var short = shortNames[j]'],
-        js.if_('short[0] == "${namer.getterPrefix[0]}"', js['type = 1']),
-        js.if_('short[0] == "${namer.setterPrefix[0]}"', js['type = 2']),
-        js['$whatToPatch[short] = Function("'
+        js('var type = 0'),
+        js('var short = shortNames[j]'),
+        js.if_('short[0] == "${namer.getterPrefix[0]}"', js('type = 1')),
+        js.if_('short[0] == "${namer.setterPrefix[0]}"', js('type = 2')),
+        js('$whatToPatch[short] = Function("'
                'return this.$noSuchMethodName('
                    'this,'
                    '${namer.CURRENT_ISOLATE}.$createInvocationMirror(\'"'
@@ -566,7 +567,7 @@
                        ' + type'
                        ' + ",Array.prototype.slice.call(arguments'
                        '$sliceOffset'
-                       ' + "),[]))")']
+                       ' + "),[]))")')
       ])
     ]);
   }
@@ -586,15 +587,15 @@
     // object and copy over the members.
 
     List<jsAst.Node> statements = [
-      js['var pendingClasses = {}'],
+      js('var pendingClasses = {}'),
 
-      js['var hasOwnProperty = Object.prototype.hasOwnProperty'],
+      js('var hasOwnProperty = Object.prototype.hasOwnProperty'),
 
-      // for (var cls in collectedClasses) {
+      // for (var cls in collectedClasses)
       js.forIn('cls', 'collectedClasses', [
-        // if (hasOwnProperty.call(collectedClasses, cls)) {
+        // if (hasOwnProperty.call(collectedClasses, cls))
         js.if_('hasOwnProperty.call(collectedClasses, cls)', [
-          js['var desc = collectedClasses[cls]'],
+          js('var desc = collectedClasses[cls]'),
 
           /* The 'fields' are either a constructor function or a
            * string encoding fields, constructor and superclass.  Get
@@ -603,24 +604,24 @@
            * descriptor.
            */
           // var fields = desc[""], supr;
-          js['var fields = desc[""], supr'],
+          js('var fields = desc[""], supr'),
 
           js.if_('typeof fields == "string"', [
-            js['var s = fields.split(";")'],
-            js['supr = s[0]'],
-            js['fields = s[1] == "" ? [] : s[1].split(",")'],
+            js('var s = fields.split(";")'),
+            js('supr = s[0]'),
+            js('fields = s[1] == "" ? [] : s[1].split(",")'),
           ], /* else */ [
-            js['supr = desc.super']
+            js('supr = desc.super')
           ]),
 
-          js['isolateProperties[cls] = defineClass(cls, fields, desc)'],
+          js('isolateProperties[cls] = defineClass(cls, fields, desc)'),
 
           // if (supr) pendingClasses[cls] = supr;
-          js.if_('supr', js['pendingClasses[cls] = supr'])
+          js.if_('supr', js('pendingClasses[cls] = supr'))
         ])
       ]),
 
-      js['var finishedClasses = {}'],
+      js('var finishedClasses = {}'),
 
       // function finishClass(cls) { ... }
       buildFinishClass(),
@@ -630,11 +631,11 @@
 
     statements.add(
       // for (var cls in pendingClasses) finishClass(cls);
-      js.forIn('cls', 'pendingClasses', js['finishClass(cls)'])
+      js.forIn('cls', 'pendingClasses', js('finishClass(cls)'))
     );
     // function(collectedClasses,
     //          isolateProperties,
-    //          existingIsolateProperties) {
+    //          existingIsolateProperties)
     return js.fun(['collectedClasses', 'isolateProperties',
                    'existingIsolateProperties'], statements);
   }
@@ -646,37 +647,35 @@
       // TODO(8540): Remove this work around.
       /* Opera does not support 'getOwnPropertyNames'. Therefore we use
          hasOwnProperty instead. */
-      js['var hasOwnProperty = Object.prototype.hasOwnProperty'],
+      js('var hasOwnProperty = Object.prototype.hasOwnProperty'),
 
       // if (hasOwnProperty.call(finishedClasses, cls)) return;
       js.if_('hasOwnProperty.call(finishedClasses, cls)',
              js.return_()),
 
-      js['finishedClasses[cls] = true'],
+      js('finishedClasses[cls] = true'),
 
-      js['var superclass = pendingClasses[cls]'],
+      js('var superclass = pendingClasses[cls]'),
 
       // The superclass is only false (empty string) for Dart's Object class.
       // The minifier together with noSuchMethod can put methods on the
       // Object.prototype object, and they show through here, so we check that
       // we have a string.
       js.if_('!superclass || typeof superclass != "string"', js.return_()),
-      js['finishClass(superclass)'],
-      js['var constructor = isolateProperties[cls]'],
-      js['var superConstructor = isolateProperties[superclass]'],
+      js('finishClass(superclass)'),
+      js('var constructor = isolateProperties[cls]'),
+      js('var superConstructor = isolateProperties[superclass]'),
 
-      // if (!superConstructor)
-      //   superConstructor = existingIsolateProperties[superclass];
-      js.if_(js['superConstructor'].not,
-             js['superConstructor'].assign(
-                 js['existingIsolateProperties'][js['superclass']])),
+      js.if_(js('!superConstructor'),
+             js('superConstructor ='
+                    'existingIsolateProperties[superclass]')),
 
-      js['var prototype = constructor.prototype'],
+      js('var prototype = constructor.prototype'),
 
       // if ($supportsProtoName) {
       js.if_(supportsProtoName, [
-        js['prototype.__proto__ = superConstructor.prototype'],
-        js['prototype.constructor = constructor'],
+        js('prototype.__proto__ = superConstructor.prototype'),
+        js('prototype.constructor = constructor'),
 
       ], /* else */ [
         // function tmp() {};
@@ -684,11 +683,11 @@
             new jsAst.VariableDeclaration('tmp'),
             js.fun([], [])),
 
-        js['tmp.prototype = superConstructor.prototype'],
-        js['var newPrototype = new tmp()'],
+        js('tmp.prototype = superConstructor.prototype'),
+        js('var newPrototype = new tmp()'),
 
-        js['constructor.prototype = newPrototype'],
-        js['newPrototype.constructor = constructor'],
+        js('constructor.prototype = newPrototype'),
+        js('newPrototype.constructor = constructor'),
 
         // for (var member in prototype) {
         js.forIn('member', 'prototype', [
@@ -698,7 +697,7 @@
 
           // if (hasOwnProperty.call(prototype, member)) {
           js.if_('hasOwnProperty.call(prototype, member)', [
-            js['newPrototype[member] = prototype[member]']
+            js('newPrototype[member] = prototype[member]')
           ])
         ])
 
@@ -736,41 +735,40 @@
     List copyFinishClasses = [];
     if (needsDefineClass) {
       copyFinishClasses.add(
-          // newIsolate.$finishClasses = oldIsolate.$finishClasses;
-          js['newIsolate'][finishClassesProperty].assign(
-              js['oldIsolate'][finishClassesProperty]));
+          js('newIsolate.$finishClassesProperty = '
+             '    oldIsolate.$finishClassesProperty'));
     }
 
     // function(oldIsolate) {
     return js.fun('oldIsolate', [
-      js['var isolateProperties = oldIsolate.${namer.isolatePropertiesName}'],
+      js('var isolateProperties = oldIsolate.${namer.isolatePropertiesName}'),
 
-      js[r'isolateProperties.$currentScript ='
+      js(r'isolateProperties.$currentScript ='
               'typeof document == "object" ?'
               '(document.currentScript ||'
                      'document.scripts[document.scripts.length - 1]) :'
-              'null'],
+              'null'),
 
-      js['var isolatePrototype = oldIsolate.prototype'],
-      js['var str = "{\\n"'],
-      js['str += '
-             '"var properties = $isolate.${namer.isolatePropertiesName};\\n"'],
-      js['var hasOwnProperty = Object.prototype.hasOwnProperty'],
+      js('var isolatePrototype = oldIsolate.prototype'),
+      js('var str = "{\\n"'),
+      js('str += '
+             '"var properties = $isolate.${namer.isolatePropertiesName};\\n"'),
+      js('var hasOwnProperty = Object.prototype.hasOwnProperty'),
 
       // for (var staticName in isolateProperties) {
       js.forIn('staticName', 'isolateProperties', [
         js.if_('hasOwnProperty.call(isolateProperties, staticName)', [
-          js['str += ("this." + staticName + "= properties." + staticName + '
-                          '";\\n")']
+          js('str += ("this." + staticName + "= properties." + staticName + '
+                          '";\\n")')
         ])
       ]),
 
-      js['str += "}\\n"'],
+      js('str += "}\\n"'),
 
-      js['var newIsolate = new Function(str)'],
-      js['newIsolate.prototype = isolatePrototype'],
-      js['isolatePrototype.constructor = newIsolate'],
-      js['newIsolate.${namer.isolatePropertiesName} = isolateProperties'],
+      js('var newIsolate = new Function(str)'),
+      js('newIsolate.prototype = isolatePrototype'),
+      js('isolatePrototype.constructor = newIsolate'),
+      js('newIsolate.${namer.isolatePropertiesName} = isolateProperties'),
     ]..addAll(copyFinishClasses)
      ..addAll([
 
@@ -786,7 +784,7 @@
     var parameters = <String>['prototype', 'staticName', 'fieldName',
                               'getterName', 'lazyValue'];
     return js.fun(parameters, [
-      js['var getter = new Function("{ return $isolate." + fieldName + ";}")'],
+      js('var getter = new Function("{ return $isolate." + fieldName + ";}")'),
     ]..addAll(addLazyInitializerLogic())
     );
   }
@@ -796,38 +794,38 @@
     String cyclicThrow = namer.isolateAccess(backend.getCyclicThrowHelper());
 
     return [
-      js['var sentinelUndefined = {}'],
-      js['var sentinelInProgress = {}'],
-      js['prototype[fieldName] = sentinelUndefined'],
+      js('var sentinelUndefined = {}'),
+      js('var sentinelInProgress = {}'),
+      js('prototype[fieldName] = sentinelUndefined'),
 
-      // prototype[getterName] = function() {
-      js['prototype'][js['getterName']].assign(js.fun([], [
-        js['var result = $isolate[fieldName]'],
+      // prototype[getterName] = function()
+      js('prototype[getterName] = #', js.fun([], [
+        js('var result = $isolate[fieldName]'),
 
-        // try {
+        // try
         js.try_([
           js.if_('result === sentinelUndefined', [
-            js['$isolate[fieldName] = sentinelInProgress'],
+            js('$isolate[fieldName] = sentinelInProgress'),
 
-            // try {
+            // try
             js.try_([
-              js['result = $isolate[fieldName] = lazyValue()'],
+              js('result = $isolate[fieldName] = lazyValue()'),
 
             ], finallyPart: [
               // Use try-finally, not try-catch/throw as it destroys the
               // stack trace.
 
-              // if (result === sentinelUndefined) {
+              // if (result === sentinelUndefined)
               js.if_('result === sentinelUndefined', [
-                // if ($isolate[fieldName] === sentinelInProgress) {
+                // if ($isolate[fieldName] === sentinelInProgress)
                 js.if_('$isolate[fieldName] === sentinelInProgress', [
-                  js['$isolate[fieldName] = null'],
+                  js('$isolate[fieldName] = null'),
                 ])
               ])
             ])
           ], /* else */ [
             js.if_('result === sentinelInProgress',
-              js['$cyclicThrow(staticName)']
+              js('$cyclicThrow(staticName)')
             )
           ]),
 
@@ -835,7 +833,7 @@
           js.return_('result')
 
         ], finallyPart: [
-          js['$isolate[getterName] = getter']
+          js('$isolate[getterName] = getter')
         ])
       ]))
     ];
@@ -846,21 +844,19 @@
     return defineClassFunction
     ..addAll(buildProtoSupportCheck())
     ..addAll([
-      js[finishClassesName].assign(finishClassesFunction)
+      js('$finishClassesName = #', finishClassesFunction)
     ]);
   }
 
   List buildLazyInitializerFunctionIfNecessary() {
     if (!needsLazyInitializer) return [];
 
-    // $lazyInitializerName = $lazyInitializerFunction
-    return [js[lazyInitializerName].assign(lazyInitializerFunction)];
+    return [js('$lazyInitializerName = #', lazyInitializerFunction)];
   }
 
   List buildFinishIsolateConstructor() {
     return [
-      // $finishIsolateConstructorName = $finishIsolateConstructorFunction
-      js[finishIsolateConstructorName].assign(finishIsolateConstructorFunction)
+      js('$finishIsolateConstructorName = #', finishIsolateConstructorFunction)
     ];
   }
 
@@ -922,7 +918,7 @@
     if (isInterceptedMethod) {
       count++;
       parametersBuffer[0] = new jsAst.Parameter(receiverArgumentName);
-      argumentsBuffer[0] = js[receiverArgumentName];
+      argumentsBuffer[0] = js(receiverArgumentName);
     }
 
     int optionalParameterStart = positionalArgumentCount + extraArgumentCount;
@@ -937,14 +933,14 @@
       assert(jsName != receiverArgumentName);
       if (count < optionalParameterStart) {
         parametersBuffer[count] = new jsAst.Parameter(jsName);
-        argumentsBuffer[count] = js[jsName];
+        argumentsBuffer[count] = js(jsName);
       } else {
         int index = names.indexOf(element.name);
         if (index != -1) {
           indexOfLastOptionalArgumentInParameters = count;
           // The order of the named arguments is not the same as the
           // one in the real method (which is in Dart source order).
-          argumentsBuffer[count] = js[jsName];
+          argumentsBuffer[count] = js(jsName);
           parametersBuffer[optionalParameterStart + index] =
               new jsAst.Parameter(jsName);
         // Note that [elements] may be null for a synthesized [member].
@@ -974,7 +970,7 @@
           parametersBuffer, argumentsBuffer,
           indexOfLastOptionalArgumentInParameters);
     } else {
-      body = [js.return_(js['this'][namer.getName(member)](argumentsBuffer))];
+      body = [js.return_(js('this')[namer.getName(member)](argumentsBuffer))];
     }
 
     jsAst.Fun function = js.fun(parametersBuffer, body);
@@ -1170,21 +1166,6 @@
       }
     }
 
-    // TODO(kasperl): We should make sure to only emit one version of
-    // overridden methods. Right now, we rely on the ordering so the
-    // methods pulled in from mixins are replaced with the members
-    // from the class definition.
-
-    // If the class is a native class, we have to add the instance
-    // members defined in the non-native mixin applications used by
-    // the class.
-    visitNativeMixins(classElement, (MixinApplicationElement mixin) {
-      mixin.forEachMember(
-          visitMember,
-          includeBackendMembers: true,
-          includeSuperMembers: false);
-    });
-
     classElement.implementation.forEachMember(
         visitMember,
         includeBackendMembers: true,
@@ -1199,7 +1180,7 @@
       if (nativeEmitter.requiresNativeIsCheck(other)) {
         code = js.fun([], [js.return_(true)]);
       } else {
-        code = new jsAst.LiteralBool(true);
+        code = js('true');
       }
       builder.addProperty(namer.operatorIs(other), code);
     }
@@ -1270,7 +1251,7 @@
     void maybeGenerateHolder(ClassElement cls) {
       if (!needsHolder(cls)) return;
       String holder = namer.isolateAccess(cls);
-      String name = namer.getName(cls);
+      String name = namer.getRuntimeTypeName(cls);
       buffer.write('$holder$_=$_{builtin\$cls:$_"$name"');
       buffer.write('}$N');
     }
@@ -1295,22 +1276,6 @@
     }
   }
 
-  void visitNativeMixins(ClassElement classElement,
-                         void visit(MixinApplicationElement mixinApplication)) {
-    if (!classElement.isNative()) return;
-    // Use recursion to make sure to visit the superclasses before the
-    // subclasses. Once we start keeping track of the emitted fields
-    // and members, we're going to want to visit these in the other
-    // order so we get the most specialized definition first.
-    void recurse(ClassElement cls) {
-      if (cls == null || !cls.isMixinApplication) return;
-      recurse(cls.superclass);
-      assert(!cls.isNative());
-      visit(cls);
-    }
-    recurse(classElement.superclass);
-  }
-
   /**
    * Documentation wanted -- johnniwinther
    *
@@ -1388,15 +1353,6 @@
     // fields pulled in from mixins are replaced with the fields from
     // the class definition.
 
-    // If the class is a native class, we have to add the fields
-    // defined in the non-native mixin applications used by the class.
-    visitNativeMixins(classElement, (MixinApplicationElement mixin) {
-      mixin.forEachInstanceField(
-          visitField,
-          includeBackendMembers: true,
-          includeSuperMembers: false);
-    });
-
     // If a class is not instantiated then we add the field just so we can
     // generate the field getter/setter dynamically. Since this is only
     // allowed on fields that are in [classElement] we don't need to visit
@@ -1404,7 +1360,7 @@
     classElement.implementation.forEachInstanceField(
         visitField,
         includeBackendMembers: true,
-        includeSuperMembers: isInstantiated && !classElement.isNative());
+        includeSuperMembers: isInstantiated);
   }
 
   void generateGetter(Element member, String fieldName, String accessorName,
@@ -1416,7 +1372,7 @@
         ? ['receiver']
         : [];
     builder.addProperty(getterName,
-        js.fun(args, js.return_(js['$receiver.$fieldName'])));
+        js.fun(args, js.return_(js('$receiver.$fieldName'))));
   }
 
   void generateSetter(Element member, String fieldName, String accessorName,
@@ -1428,7 +1384,7 @@
         ? ['receiver', 'v']
         : ['v'];
     builder.addProperty(setterName,
-        js.fun(args, js[receiver][fieldName].assign('v')));
+        js.fun(args, js('$receiver.$fieldName = v')));
   }
 
   bool canGenerateCheckedSetter(Element member) {
@@ -1453,7 +1409,7 @@
     FunctionElement helperElement
         = backend.getCheckedModeHelper(type, typeCast: false);
     String helperName = namer.isolateAccess(helperElement);
-    List<jsAst.Expression> arguments = <jsAst.Expression>[js['v']];
+    List<jsAst.Expression> arguments = <jsAst.Expression>[js('v')];
     if (helperElement.computeSignature(compiler).parameterCount != 1) {
       arguments.add(js.string(namer.operatorIs(type.element)));
     }
@@ -1466,7 +1422,7 @@
         : ['v'];
     builder.addProperty(setterName,
         js.fun(args,
-            js[receiver][fieldName].assign(js[helperName](arguments))));
+            js('$receiver.$fieldName = #', js(helperName)(arguments))));
   }
 
   void emitClassConstructor(ClassElement classElement, ClassBuilder builder) {
@@ -1589,12 +1545,7 @@
     needsDefineClass = true;
     String className = namer.getName(classElement);
 
-    // Find the first non-native superclass.
     ClassElement superclass = classElement.superclass;
-    while (superclass != null && superclass.isNative()) {
-      superclass = superclass.superclass;
-    }
-
     String superName = "";
     if (superclass != null) {
       superName = namer.getName(superclass);
@@ -1610,7 +1561,7 @@
     emitInstanceMembers(classElement, builder);
 
     jsAst.Expression init =
-        js[classesCollector][className].assign(builder.toObjectInitializer());
+        js('$classesCollector.$className = #', builder.toObjectInitializer());
     buffer.write(jsAst.prettyPrint(init, compiler));
     buffer.write('$N$n');
   }
@@ -1724,17 +1675,6 @@
       generateInterfacesIsTests(interfaceType.element, emitIsTest,
                                 emitSubstitution, generated);
     }
-
-    // For native classes, we also have to run through their mixin
-    // applications and make sure we deal with 'is' tests correctly
-    // for those.
-    visitNativeMixins(cls, (MixinApplicationElement mixin) {
-      for (DartType interfaceType in mixin.interfaces) {
-        ClassElement interfaceElement = interfaceType.element;
-        generateInterfacesIsTests(interfaceType.element, emitIsTest,
-                                  emitSubstitution, generated);
-      }
-    });
   }
 
   /**
@@ -1784,7 +1724,7 @@
     // interceptors are needed.
     Set<ClassElement> needed = new Set<ClassElement>();
     backend.specializedGetInterceptors.forEach(
-        (_, Collection<ClassElement> elements) {
+        (_, Iterable<ClassElement> elements) {
           needed.addAll(elements);
         }
     );
@@ -1833,7 +1773,7 @@
                           String name,
                           jsAst.Expression functionExpression) {
     jsAst.Expression assignment =
-        js[isolateProperties][name].assign(functionExpression);
+        js('$isolateProperties.$name = #', functionExpression);
     buffer.write(jsAst.prettyPrint(assignment, compiler));
     buffer.write('$N$n');
   }
@@ -1890,7 +1830,7 @@
 
       addParameterStubs(callElement, (String name, jsAst.Expression value) {
         jsAst.Expression assignment =
-            js[isolateProperties][staticName][name].assign(value);
+            js('$isolateProperties.$staticName.$name = #', value);
         buffer.write(jsAst.prettyPrint(assignment.toStatement(), compiler));
         buffer.write('$N');
       });
@@ -2012,28 +1952,28 @@
       List<String> parameters = <String>[];
       List<jsAst.Expression> arguments = <jsAst.Expression>[];
       if (inInterceptor) {
-        arguments.add(js['this'][fieldNames[2]]);
+        arguments.add(js('this')[fieldNames[2]]);
       }
       for (int i = 0; i < parameterCount; i++) {
         String name = 'p$i';
         parameters.add(name);
-        arguments.add(js[name]);
+        arguments.add(js(name));
       }
 
       jsAst.Expression fun = js.fun(
           parameters,
           js.return_(
-              js['this'][fieldNames[0]][js['this'][fieldNames[1]]](arguments)));
+              js('this')[fieldNames[0]][js('this')[fieldNames[1]]](arguments)));
       boundClosureBuilder.addProperty(invocationName, fun);
 
       addParameterStubs(callElement, boundClosureBuilder.addProperty);
       typedefChecks.forEach((Element typedef) {
         String operator = namer.operatorIs(typedef);
-        boundClosureBuilder.addProperty(operator, new jsAst.LiteralBool(true));
+        boundClosureBuilder.addProperty(operator, js('true'));
       });
 
       boundClosures.add(
-          js[classesCollector][mangledName].assign(
+          js('$classesCollector.$mangledName = #',
               boundClosureBuilder.toObjectInitializer()));
 
       closureClass = namer.isolateAccess(closureClassElement);
@@ -2050,16 +1990,16 @@
 
     List<String> parameters = <String>[];
     List<jsAst.Expression> arguments = <jsAst.Expression>[];
-    arguments.add(js['this']);
+    arguments.add(js('this'));
     arguments.add(js.string(targetName));
     if (inInterceptor) {
       parameters.add(extraArg);
-      arguments.add(js[extraArg]);
+      arguments.add(js(extraArg));
     }
 
     jsAst.Expression getterFunction = js.fun(
         parameters,
-        js.return_(js[closureClass].newWith(arguments)));
+        js.return_(js(closureClass).newWith(arguments)));
 
     defineStub(getterName, getterFunction);
   }
@@ -2083,15 +2023,15 @@
     jsAst.Expression buildGetter() {
       if (member.isGetter()) {
         String getterName = namer.getterName(member);
-        return js['this'][getterName](
+        return js('this')[getterName](
             isInterceptedMethod
-                ? <jsAst.Expression>[js[receiverArgumentName]]
+                ? <jsAst.Expression>[js(receiverArgumentName)]
                 : <jsAst.Expression>[]);
       } else {
         String fieldName = member.hasFixedBackendName()
             ? member.fixedBackendName()
             : namer.instanceFieldName(member);
-        return js['this'][fieldName];
+        return js('this')[fieldName];
       }
     }
 
@@ -2119,7 +2059,7 @@
         for (int i = 0; i < selector.argumentCount; i++) {
           String name = 'arg$i';
           parameters.add(new jsAst.Parameter(name));
-          arguments.add(js[name]);
+          arguments.add(js(name));
         }
 
         jsAst.Fun function = js.fun(
@@ -2141,7 +2081,7 @@
       compiler.withCurrentElement(element, () {
         Constant initialValue = handler.getInitialValueFor(element);
         jsAst.Expression init =
-          js[isolateProperties][namer.getName(element)].assign(
+          js('$isolateProperties.${namer.getName(element)} = #',
               constantEmitter.referenceInInitializationContext(initialValue));
         buffer.write(jsAst.prettyPrint(init, compiler));
         buffer.write('$N');
@@ -2168,7 +2108,7 @@
         // The name is used for error reporting. The 'initial' must be a
         // closure that constructs the initial value.
         List<jsAst.Expression> arguments = <jsAst.Expression>[];
-        arguments.add(js[isolateProperties]);
+        arguments.add(js(isolateProperties));
         arguments.add(js.string(element.name.slowToString()));
         arguments.add(js.string(namer.getName(element)));
         arguments.add(js.string(namer.getLazyInitializerName(element)));
@@ -2177,7 +2117,7 @@
         if (getter != null) {
           arguments.add(getter);
         }
-        jsAst.Expression init = js[lazyInitializerName](arguments);
+        jsAst.Expression init = js(lazyInitializerName)(arguments);
         buffer.write(jsAst.prettyPrint(init, compiler));
         buffer.write("$N");
       }
@@ -2210,7 +2150,7 @@
       }
       CodeBuffer buffer =
           bufferForElement(constant.computeType(compiler).element, eagerBuffer);
-      jsAst.Expression init = js[isolateProperties][name].assign(
+      jsAst.Expression init = js('$isolateProperties.$name = #',
           constantInitializerExpression(constant));
       buffer.write(jsAst.prettyPrint(init, compiler));
       buffer.write('$N');
@@ -2401,15 +2341,15 @@
           compiler.createInvocationMirrorElement);
 
       assert(backend.isInterceptedName(Compiler.NO_SUCH_METHOD));
-      jsAst.Expression expression = js['this.$noSuchMethodName'](
-          [js['this'],
-           js[namer.CURRENT_ISOLATE][createInvocationMirror]([
+      jsAst.Expression expression = js('this.$noSuchMethodName')(
+          [js('this'),
+           js(namer.CURRENT_ISOLATE)[createInvocationMirror]([
                js.string(compiler.enableMinification ?
                          internalName : methodName),
                js.string(internalName),
                type,
                new jsAst.ArrayInitializer.from(
-                   parameters.map((param) => js[param.name]).toList()),
+                   parameters.map((param) => js(param.name)).toList()),
                new jsAst.ArrayInitializer.from(argNames)])]);
       parameters = backend.isInterceptedName(selector.name)
           ? ([new jsAst.Parameter('\$receiver')]..addAll(parameters))
@@ -2475,9 +2415,9 @@
 
   void emitGetInterceptorMethod(CodeBuffer buffer,
                                 String key,
-                                Collection<ClassElement> classes) {
+                                Iterable<ClassElement> classes) {
     jsAst.Statement buildReturnInterceptor(ClassElement cls) {
-      return js.return_(js[namer.isolateAccess(cls)]['prototype']);
+      return js.return_(js(namer.isolateAccess(cls))['prototype']);
     }
 
     /**
@@ -2488,7 +2428,7 @@
       jsAst.Expression condition;
       assert(backend.isInterceptorClass(cls));
       if (cls == backend.jsBoolClass) {
-        condition = js['(typeof receiver) == "boolean"'];
+        condition = js('(typeof receiver) == "boolean"');
       } else if (cls == backend.jsIntClass ||
                  cls == backend.jsDoubleClass ||
                  cls == backend.jsNumberClass) {
@@ -2497,13 +2437,13 @@
                  cls == backend.jsMutableArrayClass ||
                  cls == backend.jsFixedArrayClass ||
                  cls == backend.jsExtendableArrayClass) {
-        condition = js['receiver.constructor == Array'];
+        condition = js('receiver.constructor == Array');
       } else if (cls == backend.jsStringClass) {
-        condition = js['(typeof receiver) == "string"'];
+        condition = js('(typeof receiver) == "string"');
       } else if (cls == backend.jsNullClass) {
-        condition = js['receiver == null'];
+        condition = js('receiver == null');
       } else if (cls == backend.jsFunctionClass) {
-        condition = js['(typeof receiver) == "function"'];
+        condition = js('(typeof receiver) == "function"');
       } else {
         throw 'internal error';
       }
@@ -2563,7 +2503,7 @@
           hasDouble ? backend.jsDoubleClass : backend.jsNumberClass);
 
       if (hasInt) {
-        jsAst.Expression isInt = js['Math.floor(receiver) == receiver'];
+        jsAst.Expression isInt = js('Math.floor(receiver) == receiver');
         whenNumber = js.block([
             js.if_(isInt, buildReturnInterceptor(backend.jsIntClass)),
             returnNumberClass]);
@@ -2585,7 +2525,7 @@
       // TypeError which is later identified as a null-error by
       // [unwrapException] in js_helper.dart.
       block.statements.add(js.if_('receiver == null',
-                                  js.return_(js['receiver'])));
+                                  js.return_(js('receiver'))));
     }
     if (hasFunction) {
       block.statements.add(buildInterceptorCheck(backend.jsFunctionClass));
@@ -2602,18 +2542,15 @@
     if (hasNative) {
       block.statements.add(
           js.if_(
-              js['(typeof receiver) != "object"'],
-              js.return_(js['receiver'])));
+              js('(typeof receiver) != "object"'),
+              js.return_(js('receiver'))));
 
       // if (receiver instanceof $.Object) return receiver;
       // return $.getNativeInterceptor(receiver);
       block.statements.add(
-          js.if_(
-              new jsAst.Binary(
-                  "instanceof",
-                  js['receiver'],
-                  js[namer.isolateAccess(compiler.objectClass)]),
-              js.return_(js['receiver'])));
+          js.if_(js('receiver instanceof #',
+                    js(namer.isolateAccess(compiler.objectClass))),
+                 js.return_(js('receiver'))));
 
       // TODO(sra): Fold this 'Object' check into the `getNativeInterceptor`
       // check by patching `Object.prototype` with a special hook function.
@@ -2621,20 +2558,20 @@
       // 'holders' are not Dart classes.
       block.statements.add(
           js.if_(
-              js['Object.getPrototypeOf(receiver) === Object.prototype'],
+              js('Object.getPrototypeOf(receiver) === Object.prototype'),
               buildReturnInterceptor(backend.jsInterceptorClass)));
 
       block.statements.add(
           js.return_(
-              js[namer.isolateAccess(backend.getNativeInterceptorMethod)](
+              js(namer.isolateAccess(backend.getNativeInterceptorMethod))(
                   ['receiver'])));
 
     } else {
-      block.statements.add(js.return_(js['receiver']));
+      block.statements.add(js.return_(js('receiver')));
     }
 
     buffer.write(jsAst.prettyPrint(
-        js[isolateProperties][key].assign(js.fun(['receiver'], block)),
+        js('$isolateProperties.$key = #', js.fun(['receiver'], block)),
         compiler));
     buffer.write(N);
   }
@@ -2645,7 +2582,7 @@
   void emitGetInterceptorMethods(CodeBuffer buffer) {
     var specializedGetInterceptors = backend.specializedGetInterceptors;
     for (String name in specializedGetInterceptors.keys.toList()..sort()) {
-      Collection<ClassElement> classes = specializedGetInterceptors[name];
+      Iterable<ClassElement> classes = specializedGetInterceptors[name];
       emitGetInterceptorMethod(buffer, name, classes);
     }
   }
@@ -2708,21 +2645,20 @@
   jsAst.Statement tryOptimizeOneShotInterceptor(Selector selector,
                                                 Set<ClassElement> classes) {
     jsAst.Expression isNumber(String variable) {
-      return js[variable].typeof.equals(js.string('number'));
+      return js('typeof $variable == "number"');
     }
 
     jsAst.Expression isNotObject(String variable) {
-      return js[variable].typeof.equals(js.string('object')).not;
+      return js('typeof $variable != "object"');
     }
 
     jsAst.Expression isInt(String variable) {
-      jsAst.Expression receiver = js[variable];
       return isNumber(variable).binary('&&',
-          js['Math']['floor'](receiver).equals(receiver));
+          js('Math.floor($variable) == $variable'));
     }
 
     jsAst.Expression tripleShiftZero(jsAst.Expression receiver) {
-      return receiver.binary('>>>', js.toExpression(0));
+      return receiver.binary('>>>', js('0'));
     }
 
     if (selector.isOperator()) {
@@ -2735,12 +2671,10 @@
         //    }
         // :].
         List<jsAst.Statement> body = <jsAst.Statement>[];
-        body.add(js.if_('receiver == null',
-                        js.return_(js['a0'].equals(new jsAst.LiteralNull()))));
+        body.add(js.if_('receiver == null', js.return_(js('a0 == null'))));
         body.add(js.if_(
             isNotObject('receiver'),
-            js.return_(js['a0'].equals(new jsAst.LiteralNull()).not.binary(
-                '&&', js['receiver'].strictEquals(js['a0'])))));
+            js.return_(js('a0 != null && receiver === a0'))));
         return new jsAst.Block(body);
       }
       if (!classes.contains(backend.jsIntClass)
@@ -2752,7 +2686,7 @@
         // The following operators do not map to a JavaScript
         // operator.
         if (name != '~/' && name != '<<' && name != '%' && name != '>>') {
-          jsAst.Expression result = js['receiver'].binary(name, js['a0']);
+          jsAst.Expression result = js('receiver').binary(name, js('a0'));
           if (name == '&' || name == '|' || name == '^') {
             result = tripleShiftZero(result);
           }
@@ -2768,15 +2702,12 @@
         // operator~ does not map to a JavaScript operator.
         // Unfolds to:
         // [: if (typeof receiver == "number") return -receiver:].
-        return js.if_(
-            isNumber('receiver'),
-            js.return_(new jsAst.Prefix('-', js['receiver'])));
+        return js.if_(isNumber('receiver'),
+                      js.return_(js('-receiver')));
       } else {
         assert(name == '~');
-        return js.if_(
-            isInt('receiver'),
-            js.return_(
-                tripleShiftZero(new jsAst.Prefix(name, js['receiver']))));
+        return js.if_(isInt('receiver'),
+                      js.return_(js('~receiver >>> 0')));
       }
     } else if (selector.isIndex() || selector.isIndexSet()) {
       // For an index operation, this code generates:
@@ -2808,16 +2739,12 @@
       if (!containsArray && !containsString) {
         return null;
       }
-      jsAst.Expression receiver = js['receiver'];
-      jsAst.Expression arg0 = js['a0'];
-      jsAst.Expression isIntAndAboveZero =
-          arg0.binary('>>>', js.toExpression(0)).strictEquals(arg0);
-      jsAst.Expression belowLength = arg0.binary('<', receiver['length']);
-      jsAst.Expression arrayCheck = receiver['constructor'].equals('Array');
+      jsAst.Expression isIntAndAboveZero = js('a0 >>> 0 === a0');
+      jsAst.Expression belowLength = js('a0 < receiver.length');
+      jsAst.Expression arrayCheck = js('receiver.constructor == Array');
 
       if (selector.isIndex()) {
-        jsAst.Expression stringCheck =
-            receiver.typeof.equals(js.string('string'));
+        jsAst.Expression stringCheck = js('typeof receiver == "string"');
         jsAst.Expression typeCheck;
         if (containsArray) {
           if (containsString) {
@@ -2832,13 +2759,13 @@
 
         return js.if_(typeCheck,
                       js.if_(isIntAndAboveZero.binary('&&', belowLength),
-                             js.return_(receiver[arg0])));
+                             js.return_(js('receiver[a0]'))));
       } else {
         jsAst.Expression isImmutableArray = arrayCheck.binary(
-            '&&', receiver[r'immutable$list'].not);
+            '&&', js(r'!receiver.immutable$list'));
         return js.if_(isImmutableArray.binary(
                       '&&', isIntAndAboveZero.binary('&&', belowLength)),
-                      js.return_(receiver[arg0].assign(js['a1'])));
+                      js.return_(js('receiver[a0] = a1')));
       }
     }
     return null;
@@ -2857,16 +2784,16 @@
       List<jsAst.Parameter> parameters = <jsAst.Parameter>[];
       List<jsAst.Expression> arguments = <jsAst.Expression>[];
       parameters.add(new jsAst.Parameter('receiver'));
-      arguments.add(js['receiver']);
+      arguments.add(js('receiver'));
 
       if (selector.isSetter()) {
         parameters.add(new jsAst.Parameter('value'));
-        arguments.add(js['value']);
+        arguments.add(js('value'));
       } else {
         for (int i = 0; i < selector.argumentCount; i++) {
           String argName = 'a$i';
           parameters.add(new jsAst.Parameter(argName));
-          arguments.add(js[argName]);
+          arguments.add(js(argName));
         }
       }
 
@@ -2879,15 +2806,13 @@
 
       String invocationName = backend.namer.invocationName(selector);
       body.add(js.return_(
-          js[isolateProperties][getInterceptorName]('receiver')[invocationName](
+          js(isolateProperties)[getInterceptorName]('receiver')[invocationName](
               arguments)));
 
-      jsAst.Fun function = js.fun(parameters, body);
+      jsAst.Expression assignment =
+          js('$isolateProperties.$name = #', js.fun(parameters, body));
 
-      jsAst.PropertyAccess property =
-          js[isolateProperties][name];
-
-      buffer.write(jsAst.prettyPrint(property.assign(function), compiler));
+      buffer.write(jsAst.prettyPrint(assignment, compiler));
       buffer.write(N);
     }
   }
@@ -2902,7 +2827,6 @@
   void emitInterceptedNames(CodeBuffer buffer) {
     if (!compiler.enabledInvokeOn) return;
     String name = backend.namer.getName(backend.interceptedNames);
-    jsAst.PropertyAccess property = js[isolateProperties][name];
 
     int index = 0;
     List<jsAst.ArrayElement> elements = backend.usedInterceptors.map(
@@ -2914,13 +2838,15 @@
         backend.usedInterceptors.length,
         elements);
 
-    buffer.write(jsAst.prettyPrint(property.assign(array), compiler));
+    jsAst.Expression assignment = js('$isolateProperties.$name = #', array);
+
+    buffer.write(jsAst.prettyPrint(assignment, compiler));
     buffer.write(N);
   }
 
   void emitInitFunction(CodeBuffer buffer) {
     jsAst.Fun fun = js.fun([], [
-      js['$isolateProperties = {}'],
+      js('$isolateProperties = {}'),
     ]
     ..addAll(buildDefineClassAndFinishClassFunctionsIfNecessary())
     ..addAll(buildLazyInitializerFunctionIfNecessary())
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter_no_eval.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter_no_eval.dart
index 41ec3e8..9814102 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter_no_eval.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter_no_eval.dart
@@ -67,15 +67,15 @@
     return [new jsAst.FunctionDeclaration(
         new jsAst.VariableDeclaration('defineClass'),
         js.fun(['cls', 'constructor', 'prototype'],
-               [js[r'constructor.prototype = prototype'],
-                js[r'constructor.builtin$cls = cls'],
+               [js(r'constructor.prototype = prototype'),
+                js(r'constructor.builtin$cls = cls'),
                 js.return_('constructor')]))];
   }
 
   List buildProtoSupportCheck() {
     // We don't modify the prototypes in CSP mode. Therefore we can have an
     // easier prototype-check.
-    return [js['var $supportsProtoName = !(!({}.__proto__))']];
+    return [js('var $supportsProtoName = !!{}.__proto__')];
   }
 
   jsAst.Expression buildConstructor(String mangledName,
@@ -83,7 +83,7 @@
     return new jsAst.NamedFunction(
         new jsAst.VariableDeclaration(mangledName),
         js.fun(fieldNames, fieldNames.map(
-            (name) => js['this.$name = $name']).toList()));
+            (name) => js('this.$name = $name')).toList()));
   }
 
   jsAst.Expression buildUnusedConstructor(String mangledName) {
@@ -104,7 +104,7 @@
   jsAst.Expression buildLazyInitializedGetter(VariableElement element) {
     String isolate = namer.CURRENT_ISOLATE;
     String name = namer.getName(element);
-    return js.fun([], js.return_(js['$isolate.$name']));
+    return js.fun([], js.return_(js('$isolate.$name')));
   }
 
   jsAst.Fun get lazyInitializerFunction {
@@ -122,25 +122,25 @@
     // We also copy over old values like the prototype, and the
     // isolateProperties themselves.
     return js.fun('oldIsolate', [
-      js['var isolateProperties = oldIsolate.${namer.isolatePropertiesName}'],
+      js('var isolateProperties = oldIsolate.${namer.isolatePropertiesName}'),
       new jsAst.FunctionDeclaration(
         new jsAst.VariableDeclaration('Isolate'),
           js.fun([], [
-            js['var hasOwnProperty = Object.prototype.hasOwnProperty'],
+            js('var hasOwnProperty = Object.prototype.hasOwnProperty'),
             js.forIn('staticName', 'isolateProperties',
               js.if_('hasOwnProperty.call(isolateProperties, staticName)',
-                js['this[staticName] = isolateProperties[staticName]'])),
+                js('this[staticName] = isolateProperties[staticName]'))),
             // Use the newly created object as prototype. In Chrome,
             // this creates a hidden class for the object and makes
             // sure it is fast to access.
             new jsAst.FunctionDeclaration(
               new jsAst.VariableDeclaration('ForceEfficientMap'),
               js.fun([], [])),
-            js['ForceEfficientMap.prototype = this'],
-            js['new ForceEfficientMap()']])),
-      js['Isolate.prototype = oldIsolate.prototype'],
-      js['Isolate.prototype.constructor = Isolate'],
-      js['Isolate.${namer.isolatePropertiesName} = isolateProperties'],
+            js('ForceEfficientMap.prototype = this'),
+            js('new ForceEfficientMap()')])),
+      js('Isolate.prototype = oldIsolate.prototype'),
+      js('Isolate.prototype.constructor = Isolate'),
+      js('Isolate.${namer.isolatePropertiesName} = isolateProperties'),
       js.return_('Isolate')]);
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart
index e459ba0..bfc844a 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart
@@ -108,8 +108,9 @@
         suggestedGlobalNames,
         usedGlobalNames,
         const <String>[
-            r'Object', r'$throw', r'$eq', r'S', r'ioore', r'UnsupportedError$',
-            r'length', r'$sub', r'getInterceptor$JSArrayJSString', r'$add',
+            r'Object', 'wrapException', r'$eq', r'S', r'ioore',
+            r'UnsupportedError$', r'length', r'$sub',
+            r'getInterceptor$JSArrayJSString', r'$add',
             r'$gt', r'$ge', r'$lt', r'$le', r'add', r'getInterceptor$JSNumber',
             r'iterator', r'$index', r'iae', r'getInterceptor$JSArray',
             r'ArgumentError$', r'BoundClosure', r'StateError$',
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
index 4a5623e..07c32c0 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
@@ -536,7 +536,7 @@
     return name;
   }
 
-  String getInterceptorSuffix(Collection<ClassElement> classes) {
+  String getInterceptorSuffix(Iterable<ClassElement> classes) {
     String abbreviate(ClassElement cls) {
       if (cls == compiler.objectClass) return "o";
       JavaScriptBackend backend = compiler.backend;
@@ -565,7 +565,7 @@
     return names.join();
   }
 
-  String getInterceptorName(Element element, Collection<ClassElement> classes) {
+  String getInterceptorName(Element element, Iterable<ClassElement> classes) {
     JavaScriptBackend backend = compiler.backend;
     if (classes.contains(backend.jsInterceptorClass)) {
       // If the base Interceptor class is in the set of intercepted classes, we
@@ -578,7 +578,7 @@
   }
 
   String getOneShotInterceptorName(Selector selector,
-                                   Collection<ClassElement> classes) {
+                                   Iterable<ClassElement> classes) {
     JavaScriptBackend backend = compiler.backend;
     // The one-shot name is a global name derived from the invocation name.  To
     // avoid instability we would like the names to be unique and not clash with
@@ -635,6 +635,17 @@
     return name;
   }
 
+  /// Returns the runtime name for [element].  The result is not safe as an id.
+  String getRuntimeTypeName(Element element) {
+    if (element == compiler.intClass) {
+      return 'int';
+    } else if (element == compiler.doubleClass) {
+      return 'double';
+    } else {
+      return getName(element);
+    }
+  }
+
   /**
    * Returns a preferred JS-id for the given element. The returned id is
    * guaranteed to be a valid JS-id. Globals and static fields are furthermore
@@ -728,7 +739,7 @@
 
   String operatorIs(Element element) {
     // TODO(erikcorry): Reduce from $isx to ix when we are minifying.
-    return '${operatorIsPrefix()}${getName(element)}';
+    return '${operatorIsPrefix()}${getRuntimeTypeName(element)}';
   }
 
   /*
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
index 2c4a38f..6ef9fc3 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
@@ -157,7 +157,7 @@
     // Define interceptor class for [classElement].
     String className = backend.namer.getName(classElement);
     jsAst.Expression init =
-        js[emitter.classesCollector][className].assign(
+        js(emitter.classesCollector)[className].assign(
             builder.toObjectInitializer());
     mainBuffer.write(jsAst.prettyPrint(init, compiler));
     mainBuffer.write('$N$n');
@@ -175,9 +175,9 @@
     if (nativeTag == 'HTMLElement') definer = defineNativeMethodsNonleafName;
 
     jsAst.Expression definition =
-        js[definer](
+        js(definer)(
             [js.string(nativeTag),
-             js[backend.namer.isolateAccess(classElement)]]);
+             js(backend.namer.isolateAccess(classElement))]);
 
     nativeBuffer.add(jsAst.prettyPrint(definition, compiler));
     nativeBuffer.add('$N$n');
@@ -190,7 +190,7 @@
     // `Object.prototype` to avoid checking in `getInterceptor` and
     // specializations.
 
-    // jsAst.Expression call = js[defineNativeMethodsFinishName]([]);
+    // jsAst.Expression call = js(defineNativeMethodsFinishName)([]);
     // nativeBuffer.add(jsAst.prettyPrint(call, compiler));
     // nativeBuffer.add('$N$n');
   }
@@ -221,14 +221,8 @@
             // The parameter type is a function type either directly or through
             // typedef(s).
             int arity = type.computeArity();
-
             statements.add(
-                new jsAst.ExpressionStatement(
-                    js.assign(
-                        js[name],
-                        js[closureConverter](
-                            [js[name],
-                             new jsAst.LiteralNumber('$arity')]))));
+                js('$name = $closureConverter($name, $arity)').toStatement());
             break;
           }
         }
@@ -277,7 +271,7 @@
         arguments = argumentsBuffer.sublist(1,
             indexOfLastOptionalArgumentInParameters + 1);
       } else {
-        receiver = new jsAst.VariableUse('this');
+        receiver = js('this');
         arguments = argumentsBuffer.sublist(0,
             indexOfLastOptionalArgumentInParameters + 1);
       }
@@ -364,13 +358,13 @@
               // don't have DAGs yet, but if the dispatch is used for mixins
               // that will be a possibility.
               // Re-use the previously created temporary variable.
-              expressions.add(new jsAst.VariableUse(use.name));
+              expressions.add(js(use.name));
             } else {
               String varName = 'v${varNames.length}_${tag.name.slowToString()}';
               varNames.add(varName);
               varDefns[varName] = existing;
-              tagDefns[tag] = new jsAst.VariableUse(varName);
-              expressions.add(new jsAst.VariableUse(varName));
+              tagDefns[tag] = js(varName);
+              expressions.add(js(varName));
             }
           }
         }
@@ -424,12 +418,7 @@
                       js.string(toNativeTag(cls)),
                       tagDefns[cls]])));
 
-      //  $.dynamicSetMetadata(table);
-      statements.add(
-          new jsAst.ExpressionStatement(
-              new jsAst.Call(
-                  new jsAst.VariableUse(dynamicSetMetadataName),
-                  [table])));
+      statements.add(js('$dynamicSetMetadataName(#)', table).toStatement());
 
       //  (function(){statements})();
       if (emitter.compiler.enableMinification) nativeBuffer.add(';');
@@ -488,42 +477,17 @@
         // Add function for the is-test.
         String name = backend.namer.operatorIs(element);
         addProperty(name,
-            js.fun([], js.return_(js['false'])));
+            js.fun([], js.return_(js('false'))));
         // Add a function for the (trivial) substitution.
         addProperty(backend.namer.substitutionName(element),
-                    js.fun([], js.return_(js['null'])));
+                    js.fun([], js.return_(js('null'))));
       }
     }
     emitIsChecks();
 
-    jsAst.Expression makeCallOnThis(String functionName) {
-      // Because we know the function is intercepted, we need an extra
-      // parameter.
-      return js.fun(['_'], js.return_(js['$functionName(this)']));
-    }
-
     if (!nativeClasses.isEmpty) {
       emitDynamicDispatchMetadata();
 
-      // In order to have the toString method on every native class,
-      // we must patch the JS Object prototype with a helper method.
-      String toStringName = backend.namer.publicInstanceMethodNameByArity(
-          const SourceString('toString'), 0);
-      addProperty(toStringName, makeCallOnThis(toStringHelperName));
-
-      // Same as above, but for hashCode.
-      String hashCodeName =
-          backend.namer.publicGetterName(const SourceString('hashCode'));
-      addProperty(hashCodeName, makeCallOnThis(hashCodeHelperName));
-
-      // Same as above, but for operator==.
-      String equalsName = backend.namer.publicInstanceMethodNameByArity(
-          const SourceString('=='), 1);
-      // Because we know the function is intercepted, we need an extra
-      // parameter.
-      addProperty(equalsName, js.fun(['_', 'a'],
-          js.return_(js['this === a'])));
-
       // If the native emitter has been asked to take care of the
       // noSuchMethod handlers, we do that now.
       if (handleNoSuchMethod) {
@@ -541,9 +505,9 @@
                       [new jsAst.VariableInitialization(
                           new jsAst.VariableDeclaration('key'),
                           null)]),
-                  js['table'],
+                  js('table'),
                   new jsAst.ExpressionStatement(
-                      js['$defPropName(Object.prototype, key, table[key])'])))(
+                      js('$defPropName(Object.prototype, key, table[key])'))))(
               new jsAst.ObjectInitializer(objectProperties));
 
       if (emitter.compiler.enableMinification) targetBuffer.add(';');
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 d23b1e4..9c5008f 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
@@ -52,6 +52,54 @@
     classes.add(dependency);
   }
 
+  bool usingFactoryWithTypeArguments = false;
+
+  /**
+   * Compute type arguments of classes that use one of their type variables in
+   * is-checks and add the is-checks that they imply.
+   *
+   * This function must be called after all is-checks have been registered.
+   *
+   * TODO(karlklose): move these computations into a function producing an
+   * immutable datastructure.
+   */
+  void addImplicitChecks(Universe universe,
+                         Iterable<ClassElement> classesUsingChecks) {
+    // If there are no classes that use their variables in checks, there is
+    // nothing to do.
+    if (classesUsingChecks.isEmpty) return;
+    if (universe.usingFactoryWithTypeArguments) {
+      for (DartType type in universe.instantiatedTypes) {
+        if (type.kind != TypeKind.INTERFACE) continue;
+        InterfaceType interface = type;
+        for (DartType argument in interface.typeArguments) {
+          universe.isChecks.add(argument);
+        }
+      }
+    } else {
+      // Find all instantiated types that are a subtype of a class that uses
+      // one of its type arguments in an is-check and add the arguments to the
+      // 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) {
+        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);
+          }
+        }
+      }
+    }
+  }
+
   void computeClassesNeedingRti() {
     // Find the classes that need runtime type information. Such
     // classes are:
@@ -88,7 +136,7 @@
       }
     });
     // Add is-checks that result from classes using type variables in checks.
-    compiler.resolverWorld.addImplicitChecks(classesUsingTypeVariableTests);
+    addImplicitChecks(compiler.resolverWorld, classesUsingTypeVariableTests);
     // Add the rti dependencies that are implicit in the way the backend
     // generates code: when we create a new [List], we actually create
     // a JSArray in the backend and we need to add type arguments to
@@ -121,10 +169,12 @@
     if (cachedRequiredChecks != null) return cachedRequiredChecks;
 
     // Get all types used in type arguments of instantiated types.
-    Set<ClassElement> instantiatedArguments = getInstantiatedArguments();
+    Set<ClassElement> instantiatedArguments =
+        getInstantiatedArguments(compiler.codegenWorld);
 
     // Collect all type arguments used in is-checks.
-    Set<ClassElement> checkedArguments = getCheckedArguments();
+    Set<ClassElement> checkedArguments =
+        getCheckedArguments(compiler.codegenWorld);
 
     // Precompute the set of all seen type arguments for use in the emitter.
     allArguments = new Set<ClassElement>.from(instantiatedArguments)
@@ -158,9 +208,9 @@
    * have a type check against this supertype that includes a check against
    * the type arguments.
    */
-  Set<ClassElement> getInstantiatedArguments() {
+  Set<ClassElement> getInstantiatedArguments(Universe universe) {
     ArgumentCollector collector = new ArgumentCollector();
-    for (DartType type in instantiatedTypes) {
+    for (DartType type in universe.instantiatedTypes) {
       collector.collect(type);
       ClassElement cls = type.element;
       for (DartType supertype in cls.allSupertypes) {
@@ -176,22 +226,14 @@
   }
 
   /// Collects all type arguments used in is-checks.
-  Set<ClassElement> getCheckedArguments() {
+  Set<ClassElement> getCheckedArguments(Universe universe) {
     ArgumentCollector collector = new ArgumentCollector();
-    for (DartType type in isChecks) {
+    for (DartType type in universe.isChecks) {
       collector.collect(type);
     }
     return collector.classes;
   }
 
-  Iterable<DartType> get isChecks {
-    return compiler.enqueuer.resolution.universe.isChecks;
-  }
-
-  Iterable<DartType> get instantiatedTypes {
-    return compiler.codegenWorld.instantiatedTypes;
-  }
-
   /// Return the unique name for the element as an unquoted string.
   String getNameAsString(Element element) {
     JavaScriptBackend backend = compiler.backend;
@@ -465,16 +507,6 @@
     type.accept(this, false);
   }
 
-  visit(DartType type) {
-    type.accept(this, true);
-  }
-
-  visitList(Link<DartType> types) {
-    for (Link<DartType> link = types; !link.isEmpty; link = link.tail) {
-      link.head.accept(this, true);
-    }
-  }
-
   visitType(DartType type, _) {
     // Do nothing.
   }
@@ -487,13 +519,10 @@
     if (isTypeArgument) {
       classes.add(type.element);
     }
-    visitList(type.typeArguments);
+    type.visitChildren(this, true);
   }
 
   visitFunctionType(FunctionType type, _) {
-    visit(type.returnType);
-    visitList(type.parameterTypes);
-    visitList(type.optionalParameterTypes);
-    visitList(type.namedParameterTypes);
+    type.visitChildren(this, true);
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/lib/collection_patch.dart b/sdk/lib/_internal/compiler/implementation/lib/collection_patch.dart
index da51828..1fd94cd 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/collection_patch.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/collection_patch.dart
@@ -8,7 +8,7 @@
 patch class HashMap<K, V> {
   int _length = 0;
 
-  // The hash map contents is divided into three parts: one part for
+  // The hash map contents are divided into three parts: one part for
   // string keys, one for numeric keys, and one for the rest. String
   // and numeric keys map directly to their values, but the rest of
   // the entries are stored in bucket lists of the form:
@@ -356,10 +356,361 @@
   }
 }
 
+patch class LinkedHashMap<K, V> {
+  int _length = 0;
+
+  // The hash map contents are divided into three parts: one part for
+  // string keys, one for numeric keys, and one for the rest. String
+  // and numeric keys map directly to their linked cells, but the rest
+  // of the entries are stored in bucket lists of the form:
+  //
+  //    [cell-0, cell-1, ...]
+  //
+  // where all keys in the same bucket share the same hash code.
+  var _strings;
+  var _nums;
+  var _rest;
+
+  // The keys and values are stored in cells that are linked together
+  // to form a double linked list.
+  LinkedHashMapCell _first;
+  LinkedHashMapCell _last;
+
+  // We track the number of modifications done to the key set of the
+  // hash map to be able to throw when the map is modified while being
+  // iterated over.
+  int _modifications = 0;
+
+  patch LinkedHashMap();
+
+  patch int get length => _length;
+  patch bool get isEmpty => _length == 0;
+
+  patch Iterable<K> get keys {
+    return new LinkedHashMapKeyIterable<K>(this);
+  }
+
+  patch Iterable<V> get values {
+    return keys.map((each) => this[each]);
+  }
+
+  patch bool containsKey(K key) {
+    if (_isStringKey(key)) {
+      var strings = _strings;
+      if (strings == null) return false;
+      LinkedHashMapCell cell = _getTableEntry(strings, key);
+      return cell != null;
+    } else if (_isNumericKey(key)) {
+      var nums = _nums;
+      if (nums == null) return false;
+      LinkedHashMapCell cell = _getTableEntry(nums, key);
+      return cell != null;
+    } else {
+      var rest = _rest;
+      if (rest == null) return false;
+      var bucket = _getBucket(rest, key);
+      return _findBucketIndex(bucket, key) >= 0;
+    }
+  }
+
+  patch bool containsValue(V value) {
+    return keys.any((each) => this[each] == value);
+  }
+
+  patch void addAll(Map<K, V> other) {
+    other.forEach((K key, V value) {
+      this[key] = value;
+    });
+  }
+
+  patch V operator[](K key) {
+    if (_isStringKey(key)) {
+      var strings = _strings;
+      if (strings == null) return null;
+      LinkedHashMapCell cell = _getTableEntry(strings, key);
+      return (cell == null) ? null : cell._value;
+    } else if (_isNumericKey(key)) {
+      var nums = _nums;
+      if (nums == null) return null;
+      LinkedHashMapCell cell = _getTableEntry(nums, key);
+      return (cell == null) ? null : cell._value;
+    } else {
+      var rest = _rest;
+      if (rest == null) return null;
+      var bucket = _getBucket(rest, key);
+      int index = _findBucketIndex(bucket, key);
+      if (index < 0) return null;
+      LinkedHashMapCell cell = JS('var', '#[#]', bucket, index);
+      return cell._value;
+    }
+  }
+
+  patch void operator[]=(K key, V value) {
+    if (_isStringKey(key)) {
+      var strings = _strings;
+      if (strings == null) _strings = strings = _newHashTable();
+      _addHashTableEntry(strings, key, value);
+    } else if (_isNumericKey(key)) {
+      var nums = _nums;
+      if (nums == null) _nums = nums = _newHashTable();
+      _addHashTableEntry(nums, key, value);
+    } else {
+      var rest = _rest;
+      if (rest == null) _rest = rest = _newHashTable();
+      var hash = _computeHashCode(key);
+      var bucket = JS('var', '#[#]', rest, hash);
+      if (bucket == null) {
+        LinkedHashMapCell cell = _newLinkedCell(key, value);
+        _setTableEntry(rest, hash, JS('var', '[#]', cell));
+      } else {
+        int index = _findBucketIndex(bucket, key);
+        if (index >= 0) {
+          LinkedHashMapCell cell = JS('var', '#[#]', bucket, index);
+          cell._value = value;
+        } else {
+          LinkedHashMapCell cell = _newLinkedCell(key, value);
+          JS('void', '#.push(#)', bucket, cell);
+        }
+      }
+    }
+  }
+
+  patch V putIfAbsent(K key, V ifAbsent()) {
+    if (containsKey(key)) return this[key];
+    V value = ifAbsent();
+    this[key] = value;
+    return value;
+  }
+
+  patch V remove(K key) {
+    if (_isStringKey(key)) {
+      return _removeHashTableEntry(_strings, key);
+    } else if (_isNumericKey(key)) {
+      return _removeHashTableEntry(_nums, key);
+    } else {
+      var rest = _rest;
+      if (rest == null) return null;
+      var bucket = _getBucket(rest, key);
+      int index = _findBucketIndex(bucket, key);
+      if (index < 0) return null;
+      // Use splice to remove the [cell] element at the index and
+      // unlink the cell before returning its value.
+      LinkedHashMapCell cell = JS('var', '#.splice(#, 1)[0]', bucket, index);
+      _unlinkCell(cell);
+      // TODO(kasperl): Consider getting rid of the bucket list when
+      // the length reaches zero.
+      return cell._value;
+    }
+  }
+
+  patch void clear() {
+    if (_length > 0) {
+      _strings = _nums = _rest = _first = _last = null;
+      _length = 0;
+      _modified();
+    }
+  }
+
+  patch void forEach(void action(K key, V value)) {
+    LinkedHashMapCell cell = _first;
+    int modifications = _modifications;
+    while (cell != null) {
+      action(cell._key, cell._value);
+      if (modifications != _modifications) {
+        throw new ConcurrentModificationError(this);
+      }
+      cell = cell._next;
+    }
+  }
+
+  void _addHashTableEntry(var table, K key, V value) {
+    LinkedHashMapCell cell = _getTableEntry(table, key);
+    if (cell == null) {
+      _setTableEntry(table, key, _newLinkedCell(key, value));
+    } else {
+      cell._value = value;
+    }
+  }
+
+  V _removeHashTableEntry(var table, K key) {
+    if (table == null) return null;
+    LinkedHashMapCell cell = _getTableEntry(table, key);
+    if (cell == null) return null;
+    _unlinkCell(cell);
+    _deleteTableEntry(table, key);
+    return cell._value;
+  }
+
+  void _modified() {
+    // Value cycles after 2^30 modifications. If you keep hold of an
+    // iterator for that long, you might miss a modification
+    // detection, and iteration can go sour. Don't do that.
+    _modifications = (_modifications + 1) & 0x3ffffff;
+  }
+
+  // Create a new cell and link it in as the last one in the list.
+  LinkedHashMapCell _newLinkedCell(K key, V value) {
+    LinkedHashMapCell cell = new LinkedHashMapCell(key, value);
+    if (_first == null) {
+      _first = _last = cell;
+    } else {
+      LinkedHashMapCell last = _last;
+      cell._previous = last;
+      _last = last._next = cell;
+    }
+    _length++;
+    _modified();
+    return cell;
+  }
+
+  // Unlink the given cell from the linked list of cells.
+  void _unlinkCell(LinkedHashMapCell cell) {
+    LinkedHashMapCell previous = cell._previous;
+    LinkedHashMapCell next = cell._next;
+    if (previous == null) {
+      assert(cell == _first);
+      _first = next;
+    } else {
+      previous._next = next;
+    }
+    if (next == null) {
+      assert(cell == _last);
+      _last = previous;
+    } else {
+      next._previous = previous;
+    }
+    _length--;
+    _modified();
+  }
+
+  static bool _isStringKey(var key) {
+    return key is String && key != '__proto__';
+  }
+
+  static bool _isNumericKey(var key) {
+    // Only treat unsigned 30-bit integers as numeric keys. This way,
+    // we avoid converting them to strings when we use them as keys in
+    // the JavaScript hash table object.
+    return key is num && JS('bool', '(# & 0x3ffffff) === #', key, key);
+  }
+
+  static int _computeHashCode(var key) {
+    // We force the hash codes to be unsigned 30-bit integers to avoid
+    // issues with problematic keys like '__proto__'. Another option
+    // would be to throw an exception if the hash code isn't a number.
+    return JS('int', '# & 0x3ffffff', key.hashCode);
+  }
+
+  static _getTableEntry(var table, var key) {
+    return JS('var', '#[#]', table, key);
+  }
+
+  static void _setTableEntry(var table, var key, var value) {
+    assert(value != null);
+    JS('void', '#[#] = #', table, key, value);
+  }
+
+  static void _deleteTableEntry(var table, var key) {
+    JS('void', 'delete #[#]', table, key);
+  }
+
+  static List _getBucket(var table, var key) {
+    var hash = _computeHashCode(key);
+    return JS('var', '#[#]', table, hash);
+  }
+
+  static int _findBucketIndex(var bucket, var key) {
+    if (bucket == null) return -1;
+    int length = JS('int', '#.length', bucket);
+    for (int i = 0; i < length; i++) {
+      LinkedHashMapCell cell = JS('var', '#[#]', bucket, i);
+      if (cell._key == key) return i;
+    }
+    return -1;
+  }
+
+  static _newHashTable() {
+    // Create a new JavaScript object to be used as a hash table. Use
+    // Object.create to avoid the properties on Object.prototype
+    // showing up as entries.
+    var table = JS('var', 'Object.create(null)');
+    // Attempt to force the hash table into 'dictionary' mode by
+    // adding a property to it and deleting it again.
+    var temporaryKey = '<non-identifier-key>';
+    _setTableEntry(table, temporaryKey, table);
+    _deleteTableEntry(table, temporaryKey);
+    return table;
+  }
+}
+
+class LinkedHashMapCell {
+  final _key;
+  var _value;
+
+  LinkedHashMapCell _next;
+  LinkedHashMapCell _previous;
+
+  LinkedHashMapCell(this._key, this._value);
+}
+
+class LinkedHashMapKeyIterable<E> extends Iterable<E> {
+  final _map;
+  LinkedHashMapKeyIterable(this._map);
+
+  int get length => _map._length;
+  bool get isEmpty => _map._length == 0;
+
+  Iterator<E> get iterator {
+    return new LinkedHashMapKeyIterator<E>(_map, _map._modifications);
+  }
+
+  bool contains(E element) {
+    return _map.containsKey(element);
+  }
+
+  void forEach(void f(E element)) {
+    LinkedHashMapCell cell = _map._first;
+    int modifications = _map._modifications;
+    while (cell != null) {
+      f(cell._key);
+      if (modifications != _map._modifications) {
+        throw new ConcurrentModificationError(_map);
+      }
+      cell = cell._next;
+    }
+  }
+}
+
+class LinkedHashMapKeyIterator<E> implements Iterator<E> {
+  final _map;
+  final int _modifications;
+  LinkedHashMapCell _cell;
+  E _current;
+
+  LinkedHashMapKeyIterator(this._map, this._modifications) {
+    _cell = _map._first;
+  }
+
+  E get current => _current;
+
+  bool moveNext() {
+    if (_modifications != _map._modifications) {
+      throw new ConcurrentModificationError(_map);
+    } else if (_cell == null) {
+      _current = null;
+      return false;
+    } else {
+      _current = _cell._key;
+      _cell = _cell._next;
+      return true;
+    }
+  }
+}
+
 patch class HashSet<E> {
   int _length = 0;
 
-  // The hash set contents is divided into three parts: one part for
+  // The hash set contents are divided into three parts: one part for
   // string elements, one for numeric elements, and one for the
   // rest. String and numeric elements map directly to a sentinel
   // value, but the rest of the entries are stored in bucket lists of
@@ -641,3 +992,328 @@
     }
   }
 }
+
+patch class LinkedHashSet<E> extends _HashSetBase<E> {
+  int _length = 0;
+
+  // The hash set contents are divided into three parts: one part for
+  // string elements, one for numeric elements, and one for the
+  // rest. String and numeric elements map directly to their linked
+  // cells, but the rest of the entries are stored in bucket lists of
+  // the form:
+  //
+  //    [cell-0, cell-1, ...]
+  //
+  // where all elements in the same bucket share the same hash code.
+  var _strings;
+  var _nums;
+  var _rest;
+
+  // The elements are stored in cells that are linked together
+  // to form a double linked list.
+  LinkedHashSetCell _first;
+  LinkedHashSetCell _last;
+
+  // We track the number of modifications done to the element set to
+  // be able to throw when the set is modified while being iterated
+  // over.
+  int _modifications = 0;
+
+  patch LinkedHashSet();
+
+  void _unsupported(String operation) {
+    throw 'LinkedHashSet: unsupported $operation';
+  }
+
+  // Iterable.
+  patch Iterator<E> get iterator {
+    return new LinkedHashSetIterator(this, _modifications);
+  }
+
+  patch int get length => _length;
+  patch bool get isEmpty => _length == 0;
+
+  patch bool contains(Object object) {
+    if (_isStringElement(object)) {
+      var strings = _strings;
+      if (strings == null) return false;
+      LinkedHashSetCell cell = _getTableEntry(strings, object);
+      return cell != null;
+    } else if (_isNumericElement(object)) {
+      var nums = _nums;
+      if (nums == null) return false;
+      LinkedHashSetCell cell = _getTableEntry(nums, object);
+      return cell != null;
+    } else {
+      var rest = _rest;
+      if (rest == null) return false;
+      var bucket = _getBucket(rest, object);
+      return _findBucketIndex(bucket, object) >= 0;
+    }
+  }
+
+  patch void forEach(void action(E element)) {
+    LinkedHashSetCell cell = _first;
+    int modifications = _modifications;
+    while (cell != null) {
+      action(cell._element);
+      if (modifications != _modifications) {
+        throw new ConcurrentModificationError(this);
+      }
+      cell = cell._next;
+    }
+  }
+
+  patch E get first {
+    if (_first == null) throw new StateError("No elements");
+    return _first._element;
+  }
+
+  patch E get last {
+    if (_last == null) throw new StateError("No elements");
+    return _last._element;
+  }
+
+  // Collection.
+  patch void add(E element) {
+    if (_isStringElement(element)) {
+      var strings = _strings;
+      if (strings == null) _strings = strings = _newHashTable();
+      _addHashTableEntry(strings, element);
+    } else if (_isNumericElement(element)) {
+      var nums = _nums;
+      if (nums == null) _nums = nums = _newHashTable();
+      _addHashTableEntry(nums, element);
+    } else {
+      var rest = _rest;
+      if (rest == null) _rest = rest = _newHashTable();
+      var hash = _computeHashCode(element);
+      var bucket = JS('var', '#[#]', rest, hash);
+      if (bucket == null) {
+        LinkedHashSetCell cell = _newLinkedCell(element);
+        _setTableEntry(rest, hash, JS('var', '[#]', cell));
+      } else {
+        int index = _findBucketIndex(bucket, element);
+        if (index >= 0) return;
+        LinkedHashSetCell cell = _newLinkedCell(element);
+        JS('void', '#.push(#)', bucket, cell);
+      }
+    }
+  }
+
+  patch void addAll(Iterable<E> objects) {
+    for (E object in objects) {
+      add(object);
+    }
+  }
+
+  patch bool remove(Object object) {
+    if (_isStringElement(object)) {
+      return _removeHashTableEntry(_strings, object);
+    } else if (_isNumericElement(object)) {
+      return _removeHashTableEntry(_nums, object);
+    } else {
+      var rest = _rest;
+      if (rest == null) return false;
+      var bucket = _getBucket(rest, object);
+      int index = _findBucketIndex(bucket, object);
+      if (index < 0) return false;
+      // Use splice to remove the [cell] element at the index and
+      // unlink it.
+      LinkedHashSetCell cell = JS('var', '#.splice(#, 1)[0]', bucket, index);
+      _unlinkCell(cell);
+      return true;
+    }
+  }
+
+  patch void removeAll(Iterable objectsToRemove) {
+    for (var each in objectsToRemove) {
+      remove(each);
+    }
+  }
+
+  patch void removeWhere(bool test(E element)) {
+    _filterWhere(test, true);
+  }
+
+  patch void retainWhere(bool test(E element)) {
+    _filterWhere(test, false);
+  }
+
+  void _filterWhere(bool test(E element), bool removeMatching) {
+    LinkedHashSetCell cell = _first;
+    while (cell != null) {
+      E element = cell._element;
+      LinkedHashSetCell next = cell._next;
+      int modifications = _modifications;
+      bool shouldRemove = (removeMatching == test(element));
+      if (modifications != _modifications) {
+        throw new ConcurrentModificationError(this);
+      }
+      if (shouldRemove) remove(element);
+      cell = next;
+    }
+  }
+
+  patch void clear() {
+    if (_length > 0) {
+      _strings = _nums = _rest = _first = _last = null;
+      _length = 0;
+      _modified();
+    }
+  }
+
+  void _addHashTableEntry(var table, E element) {
+    LinkedHashSetCell cell = _getTableEntry(table, element);
+    if (cell != null) return;
+    _setTableEntry(table, element, _newLinkedCell(element));
+  }
+
+  bool _removeHashTableEntry(var table, E element) {
+    if (table == null) return false;
+    LinkedHashSetCell cell = _getTableEntry(table, element);
+    if (cell == null) return false;
+    _unlinkCell(cell);
+    _deleteTableEntry(table, element);
+    return true;
+  }
+
+  void _modified() {
+    // Value cycles after 2^30 modifications. If you keep hold of an
+    // iterator for that long, you might miss a modification
+    // detection, and iteration can go sour. Don't do that.
+    _modifications = (_modifications + 1) & 0x3ffffff;
+  }
+
+  // Create a new cell and link it in as the last one in the list.
+  LinkedHashSetCell _newLinkedCell(E element) {
+    LinkedHashSetCell cell = new LinkedHashSetCell(element);
+    if (_first == null) {
+      _first = _last = cell;
+    } else {
+      LinkedHashSetCell last = _last;
+      cell._previous = last;
+      _last = last._next = cell;
+    }
+    _length++;
+    _modified();
+    return cell;
+  }
+
+  // Unlink the given cell from the linked list of cells.
+  void _unlinkCell(LinkedHashSetCell cell) {
+    LinkedHashSetCell previous = cell._previous;
+    LinkedHashSetCell next = cell._next;
+    if (previous == null) {
+      assert(cell == _first);
+      _first = next;
+    } else {
+      previous._next = next;
+    }
+    if (next == null) {
+      assert(cell == _last);
+      _last = previous;
+    } else {
+      next._previous = previous;
+    }
+    _length--;
+    _modified();
+  }
+
+  static bool _isStringElement(var element) {
+    return element is String && element != '__proto__';
+  }
+
+  static bool _isNumericElement(var element) {
+    // Only treat unsigned 30-bit integers as numeric elements. This
+    // way, we avoid converting them to strings when we use them as
+    // keys in the JavaScript hash table object.
+    return element is num &&
+        JS('bool', '(# & 0x3ffffff) === #', element, element);
+  }
+
+  static int _computeHashCode(var element) {
+    // We force the hash codes to be unsigned 30-bit integers to avoid
+    // issues with problematic elements like '__proto__'. Another
+    // option would be to throw an exception if the hash code isn't a
+    // number.
+    return JS('int', '# & 0x3ffffff', element.hashCode);
+  }
+
+  static _getTableEntry(var table, var key) {
+    return JS('var', '#[#]', table, key);
+  }
+
+  static void _setTableEntry(var table, var key, var value) {
+    assert(value != null);
+    JS('void', '#[#] = #', table, key, value);
+  }
+
+  static void _deleteTableEntry(var table, var key) {
+    JS('void', 'delete #[#]', table, key);
+  }
+
+  static List _getBucket(var table, var element) {
+    var hash = _computeHashCode(element);
+    return JS('var', '#[#]', table, hash);
+  }
+
+  static int _findBucketIndex(var bucket, var element) {
+    if (bucket == null) return -1;
+    int length = JS('int', '#.length', bucket);
+    for (int i = 0; i < length; i++) {
+      LinkedHashSetCell cell = JS('var', '#[#]', bucket, i);
+      if (cell._element == element) return i;
+    }
+    return -1;
+  }
+
+  static _newHashTable() {
+    // Create a new JavaScript object to be used as a hash table. Use
+    // Object.create to avoid the properties on Object.prototype
+    // showing up as entries.
+    var table = JS('var', 'Object.create(null)');
+    // Attempt to force the hash table into 'dictionary' mode by
+    // adding a property to it and deleting it again.
+    var temporaryKey = '<non-identifier-key>';
+    _setTableEntry(table, temporaryKey, table);
+    _deleteTableEntry(table, temporaryKey);
+    return table;
+  }
+}
+
+class LinkedHashSetCell {
+  final _element;
+
+  LinkedHashSetCell _next;
+  LinkedHashSetCell _previous;
+
+  LinkedHashSetCell(this._element);
+}
+
+// TODO(kasperl): Share this code with LinkedHashMapKeyIterator<E>?
+class LinkedHashSetIterator<E> implements Iterator<E> {
+  final _set;
+  final int _modifications;
+  LinkedHashSetCell _cell;
+  E _current;
+
+  LinkedHashSetIterator(this._set, this._modifications) {
+    _cell = _set._first;
+  }
+
+  E get current => _current;
+
+  bool moveNext() {
+    if (_modifications != _set._modifications) {
+      throw new ConcurrentModificationError(_set);
+    } else if (_cell == null) {
+      _current = null;
+      return false;
+    } else {
+      _current = _cell._element;
+      _cell = _cell._next;
+      return true;
+    }
+  }
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/compiler/implementation/lib/core_patch.dart b/sdk/lib/_internal/compiler/implementation/lib/core_patch.dart
index ec45708..6569d60 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/core_patch.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/core_patch.dart
@@ -298,3 +298,19 @@
     throw new UnsupportedError('stackTrace');
   }
 }
+
+patch class Symbol {
+  final String _name;
+
+  patch const Symbol(String name) :
+    this._name = name;
+
+  patch bool operator ==(other) {
+    return other is Symbol && _name == other._name;
+  }
+
+  patch int get hashCode {
+    const arbitraryPrime = 664597;
+    return 0x1fffffff & (arbitraryPrime * _name.hashCode);
+  }
+}
diff --git a/sdk/lib/_internal/compiler/implementation/lib/io_patch.dart b/sdk/lib/_internal/compiler/implementation/lib/io_patch.dart
index 6cd1b50..2702d9d 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/io_patch.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/io_patch.dart
@@ -78,6 +78,9 @@
   patch static _delete(String path) {
     throw new UnsupportedError("File._delete");
   }
+  patch static _deleteLink(String path) {
+    throw new UnsupportedError("File._deleteLink");
+  }
   patch static _directory(String path) {
     throw new UnsupportedError("File._directory");
   }
@@ -134,9 +137,9 @@
   }
 }
 
-patch class _HttpSessionManager {
-  patch static Uint8List _getRandomBytes(int count) {
-    throw new UnsupportedError("HttpSessionManager._getRandomBytes");
+patch class _IOCrypto {
+  patch static Uint8List getRandomBytes(int count) {
+    throw new UnsupportedError("_IOCrypto.getRandomBytes");
   }
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart
index 3016e78..22e13da 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart
@@ -24,7 +24,7 @@
   const CloseToken();
 }
 
-class JsIsolateSink extends StreamSink<dynamic> implements IsolateSink {
+class JsIsolateSink extends EventSink<dynamic> implements IsolateSink {
   bool _isClosed = false;
   final SendPort _port;
   JsIsolateSink.fromPort(this._port);
@@ -54,9 +54,10 @@
  * Called by the compiler to support switching
  * between isolates when we get a callback from the DOM.
  */
-void _callInIsolate(_IsolateContext isolate, Function function) {
-  isolate.eval(function);
+_callInIsolate(_IsolateContext isolate, Function function) {
+  var result = isolate.eval(function);
   _globalState.topEventLoop.run();
+  return result;
 }
 
 /**
@@ -449,7 +450,7 @@
     // such as d8 and jsshell. We should move this code to a helper
     // library that is only loaded when testing on those engines.
 
-    var stack = JS('String|Null', 'new Error().stack');
+    var stack = JS('String|Null', '(new Error()).stack');
     if (stack == null) {
       // According to Internet Explorer documentation, the stack
       // property is not set until the exception is thrown. The stack
@@ -584,7 +585,7 @@
    * but you should probably not count on this.
    */
   static String _getJSFunctionName(Function f) {
-    return JS("String|Null", r"(#.$name || #)", f, null);
+    return JS("String|Null", r"(#['$name'] || #)", f, null);
   }
 
   /** Create a new JavaScript object instance given its constructor. */
diff --git a/sdk/lib/_internal/compiler/implementation/lib/js_array.dart b/sdk/lib/_internal/compiler/implementation/lib/js_array.dart
index c57c15b..7a57e31 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/js_array.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/js_array.dart
@@ -52,14 +52,6 @@
     }
   }
 
-  void removeAll(Iterable elements) {
-    IterableMixinWorkaround.removeAllList(this, elements);
-  }
-
-  void retainAll(Iterable elements) {
-    IterableMixinWorkaround.retainAll(this, elements);
-  }
-
   void removeWhere(bool test(E element)) {
     // This could, and should, be optimized.
     IterableMixinWorkaround.removeWhereList(this, test);
@@ -96,8 +88,7 @@
     return IterableMixinWorkaround.mapList(this, f);
   }
 
-  String join([String separator]) {
-    if (separator == null) separator = "";
+  String join([String separator = ""]) {
     var list = new List(this.length);
     for (int i = 0; i < this.length; i++) {
       list[i] = "${this[i]}";
@@ -121,8 +112,8 @@
     return IterableMixinWorkaround.skipWhile(this, test);
   }
 
-  reduce(initialValue, combine(previousValue, E element)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  E reduce(E combine(E value, E element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
   fold(initialValue, combine(previousValue, E element)) {
@@ -165,8 +156,8 @@
   }
 
 
-  List<E> getRange(int start, int length) {
-    return sublist(start, start + length);
+  Iterable<E> getRange(int start, int end) {
+    return IterableMixinWorkaround.getRangeList(this, start, end);
   }
 
   void insertRange(int start, int length, [E initialValue]) {
@@ -213,10 +204,6 @@
     throw new StateError("More than one element");
   }
 
-  E min([int compare(E a, E b)]) => IterableMixinWorkaround.min(this, compare);
-
-  E max([int compare(E a, E b)]) => IterableMixinWorkaround.max(this, compare);
-
   void removeRange(int start, int length) {
     checkGrowable(this, 'removeRange');
     if (length == 0) {
@@ -275,7 +262,7 @@
 
   bool get isEmpty => length == 0;
 
-  String toString() => Collections.collectionToString(this);
+  String toString() => ToString.iterableToString(this);
 
   List<E> toList({ bool growable: true }) =>
       new List<E>.from(this, growable: growable);
diff --git a/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart
index badbb4d..b77092f 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart
@@ -614,7 +614,7 @@
  * The code in [unwrapException] deals with getting the original Dart
  * object out of the wrapper again.
  */
-$throw(ex) {
+wrapException(ex) {
   if (ex == null) ex = const NullThrownError();
   var wrapper = new DartError(ex);
 
@@ -622,18 +622,28 @@
     // Use V8 API for recording a "fast" stack trace (this installs a
     // "stack" property getter on [wrapper]).
     JS('void', r'Error.captureStackTrace(#, #)',
-       wrapper, RAW_DART_FUNCTION_REF($throw));
+       wrapper, RAW_DART_FUNCTION_REF(wrapException));
   } else {
     // Otherwise, produce a stack trace and record it in the wrapper.
     // This is a slower way to create a stack trace which works on
     // some browsers, but may simply evaluate to null.
-    String stackTrace = JS('', 'new Error().stack');
+    String stackTrace = JS('', '(new Error()).stack');
     JS('void', '#.stack = #', wrapper, stackTrace);
   }
   return wrapper;
 }
 
 /**
+ * This wraps the exception and does the throw.  It is possible to call this in
+ * a JS expression context, where the throw statement is not allowed.  Helpers
+ * are never inlined, so we don't risk inlining the throw statement into an
+ * expression context.
+ */
+throwExpression(ex) {
+  JS('void', 'throw #', wrapException(ex));
+}
+
+/**
  * Wrapper class for throwing exceptions.
  */
 class DartError {
@@ -652,8 +662,8 @@
 
   /**
    * V8/Chrome installs a property getter, "stack", when calling
-   * Error.captureStackTrace (see [$throw]). In [$throw], we make sure
-   * that this property is always set.
+   * Error.captureStackTrace (see [wrapException]). In [wrapException], we make
+   * sure that this property is always set.
    */
   String get stack => JS('', '#.stack', this);
 
@@ -663,7 +673,7 @@
    *
    * We only expect this method to be called (indirectly) by the
    * browser when an uncaught exception occurs. Instance of this class
-   * should never escape into Dart code (except for [$throw] above).
+   * should never escape into Dart code (except for [wrapException] above).
    */
   String toString() {
     // If Error.captureStackTrace is available, accessing stack from
@@ -715,7 +725,7 @@
 /**
  * Called from catch blocks in generated code to extract the Dart
  * exception from the thrown value. The thrown value may have been
- * created by [$throw] or it may be a 'native' JS exception.
+ * created by [wrapException] or it may be a 'native' JS exception.
  *
  * Some native exceptions are mapped to new Dart instances, others are
  * returned unmodified.
diff --git a/sdk/lib/_internal/compiler/implementation/lib/js_rti.dart b/sdk/lib/_internal/compiler/implementation/lib/js_rti.dart
index d84a6a2..b986503 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/js_rti.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/js_rti.dart
@@ -37,8 +37,7 @@
 
 String getRuntimeTypeAsString(List runtimeType) {
   String className = getConstructorName(runtimeType[0]);
-  if (runtimeType.length == 1) return className;
-  return '$className<${joinArguments(runtimeType, 1)}>';
+  return '$className${joinArguments(runtimeType, 1)}';
 }
 
 String getConstructorName(type) => JS('String', r'#.builtin$cls', type);
@@ -56,7 +55,9 @@
 }
 
 String joinArguments(var types, int startIndex) {
+  if (types == null) return '';
   bool firstArgument = true;
+  bool allDynamic = true;
   StringBuffer buffer = new StringBuffer();
   for (int index = startIndex; index < types.length; index++) {
     if (firstArgument) {
@@ -65,16 +66,18 @@
       buffer.write(', ');
     }
     var argument = types[index];
+    if (argument != null) {
+      allDynamic = false;
+    }
     buffer.write(runtimeTypeToString(argument));
   }
-  return buffer.toString();
+  return allDynamic ? '' : '<$buffer>';
 }
 
 String getRuntimeTypeString(var object) {
   String className = isJsArray(object) ? 'List' : getClassName(object);
   var typeInfo = JS('var', r'#.$builtinTypeInfo', object);
-  if (typeInfo == null) return className;
-  return "$className<${joinArguments(typeInfo, 0)}>";
+  return "$className${joinArguments(typeInfo, 0)}";
 }
 
 bool isJsFunction(var o) => JS('bool', r'typeof # == "function"', o);
diff --git a/sdk/lib/_internal/compiler/implementation/lib/js_string.dart b/sdk/lib/_internal/compiler/implementation/lib/js_string.dart
index 395f970..e6184c0 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/js_string.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/js_string.dart
@@ -137,7 +137,7 @@
     return JS('String', r'#.trim()', this);
   }
 
-  List<int> get codeUnits => new CodeUnits(this);
+  List<int> get codeUnits => new _CodeUnits(this);
 
   Runes get runes => new Runes(this);
 
@@ -211,3 +211,16 @@
     return JS('String', '#[#]', this, index);
   }
 }
+
+/**
+ * An [Iterable] of the UTF-16 code units of a [String] in index order.
+ */
+class _CodeUnits extends UnmodifiableListBase<int> {
+  /** The string that this is the code units of. */
+  String _string;
+
+  _CodeUnits(this._string);
+
+  int get length => _string.length;
+  int operator[](int i) => _string.codeUnitAt(i);
+}
diff --git a/sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart b/sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart
index 0baf9a8..a41e099 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart
@@ -68,9 +68,9 @@
     return mirror;
   }
 
-  Future<InstanceMirror> invoke(String memberName,
-                                List<Object> positionalArguments,
-                                [Map<String,Object> namedArguments]) {
+  Future<InstanceMirror> invokeAsync(String memberName,
+                                     List<Object> positionalArguments,
+                                     [Map<String,Object> namedArguments]) {
     if (namedArguments != null && !namedArguments.isEmpty) {
       throw new UnsupportedError('Named arguments are not implemented');
     }
diff --git a/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart
index 43e02e8..566fb58 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart
@@ -41,6 +41,7 @@
 String typeNameInFirefox(obj) {
   String name = JS('String', '#', constructorNameFallback(obj));
   if (name == 'Window') return 'DOMWindow';
+  if (name == 'BeforeUnloadEvent') return 'Event';
   if (name == 'CSS2Properties') return 'CSSStyleDeclaration';
   if (name == 'DataTransfer') return 'Clipboard';
   if (name == 'DragEvent') return 'MouseEvent';
@@ -62,6 +63,7 @@
     return 'HTMLDocument';
   }
   if (name == 'ApplicationCache') return 'DOMApplicationCache';
+  if (name == 'BeforeUnloadEvent') return 'Event';
   if (name == 'CanvasPixelArray') return 'Uint8ClampedArray';
   if (name == 'DataTransfer') return 'Clipboard';
   if (name == 'DragEvent') return 'MouseEvent';
diff --git a/sdk/lib/_internal/compiler/implementation/lib/typeddata_patch.dart b/sdk/lib/_internal/compiler/implementation/lib/typeddata_patch.dart
index 28d2233..ba50d05d6 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/typeddata_patch.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/typeddata_patch.dart
@@ -11,6 +11,10 @@
     throw new UnsupportedError('Int8List');
   }
 
+  patch factory Int8List.fromList(List<int> elements) {
+    throw new UnsupportedError('Int8List.fromList');
+  }
+
   patch factory Int8List.view(ByteBuffer buffer,
                               [int offsetInBytes = 0, int length]) {
     throw new UnsupportedError('Int8List.view');
@@ -23,6 +27,10 @@
     throw new UnsupportedError('Uint8List');
   }
 
+  patch factory Uint8List.fromList(List<int> elements) {
+    throw new UnsupportedError('Uint8List.fromList');
+  }
+
   patch factory Uint8List.view(ByteBuffer buffer,
                                [int offsetInBytes = 0, int length]) {
     throw new UnsupportedError('Uint8List.view');
@@ -35,6 +43,10 @@
     throw new UnsupportedError('Uint8ClampedList');
   }
 
+  patch factory Uint8ClampedList.fromList(List<int> elements) {
+    throw new UnsupportedError('Uint8ClampedList.fromList');
+  }
+
   patch factory Uint8ClampedList.view(ByteBuffer buffer,
                                       [int offsetInBytes = 0, int length]) {
     throw new UnsupportedError('Uint8ClampedList.view');
@@ -48,6 +60,10 @@
 
   }
 
+  patch factory Int16List.fromList(List<int> elements) {
+    throw new UnsupportedError('Int16List.fromList');
+  }
+
   patch factory Int16List.view(ByteBuffer buffer,
                                [int offsetInBytes = 0, int length]) {
     throw new UnsupportedError('Int16List.view');
@@ -60,6 +76,10 @@
     throw new UnsupportedError('Uint16List');
   }
 
+  patch factory Uint16List.fromList(List<int> elements) {
+    throw new UnsupportedError('Uint16List.fromList');
+  }
+
   patch factory Uint16List.view(ByteBuffer buffer,
                                 [int offsetInBytes = 0, int length]) {
     throw new UnsupportedError('Uint16List.view');
@@ -72,6 +92,10 @@
     throw new UnsupportedError('Int32List');
   }
 
+  patch factory Int32List.fromList(List<int> elements) {
+    throw new UnsupportedError('Int32List.fromList');
+  }
+
   patch factory Int32List.view(ByteBuffer buffer,
                                [int offsetInBytes = 0, int length]) {
     throw new UnsupportedError('Int32List.view');
@@ -84,6 +108,10 @@
     throw new UnsupportedError('Uint32List');
   }
 
+  patch factory Uint32List.fromList(List<int> elements) {
+    throw new UnsupportedError('Uint32List.fromList');
+  }
+
   patch factory Uint32List.view(ByteBuffer buffer,
                                 [int offsetInBytes = 0, int length]) {
     throw new UnsupportedError('Uint32List.view');
@@ -96,6 +124,10 @@
     throw new UnsupportedError('Int64List');
   }
 
+  patch factory Int64List.fromList(List<int> elements) {
+    throw new UnsupportedError('Int64List.fromList');
+  }
+
   patch factory Int64List.view(ByteBuffer buffer,
                                [int offsetInBytes = 0, int length]) {
     throw new UnsupportedError('Int64List.view');
@@ -108,6 +140,10 @@
     throw new UnsupportedError('Uint64List');
   }
 
+  patch factory Uint64List.fromList(List<int> elements) {
+    throw new UnsupportedError('Uint64List.fromList');
+  }
+
   patch factory Uint64List.view(ByteBuffer buffer,
                                 [int offsetInBytes = 0, int length]) {
     throw new UnsupportedError('Uint64List.view');
@@ -120,6 +156,10 @@
     throw new UnsupportedError('Float32List');
   }
 
+  patch factory Float32List.fromList(List<double> elements) {
+    throw new UnsupportedError('Float32List.fromList');
+  }
+
   patch factory Float32List.view(ByteBuffer buffer,
                                  [int offsetInBytes = 0, int length]) {
     throw new UnsupportedError('Float32List.view');
@@ -132,6 +172,10 @@
     throw new UnsupportedError('Float64List');
   }
 
+  patch factory Float64List.fromList(List<double> elements) {
+    throw new UnsupportedError('Float64List.fromList');
+  }
+
   patch factory Float64List.view(ByteBuffer buffer,
                                  [int offsetInBytes = 0, int length]) {
     throw new UnsupportedError('Float64List.view');
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
index 70114423..c86321f 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
@@ -87,7 +87,7 @@
   system.compiler.internalError("Unexpected type $type of kind ${type.kind}");
 }
 
-Collection<Dart2JsMemberMirror> _convertElementMemberToMemberMirrors(
+Iterable<Dart2JsMemberMirror> _convertElementMemberToMemberMirrors(
     Dart2JsContainerMirror library, Element element) {
   if (element.isSynthesized) {
     return const <Dart2JsMemberMirror>[];
@@ -216,10 +216,10 @@
         new FormattingDiagnosticHandler(provider).diagnosticHandler;
   }
   Uri scriptUri = cwd.resolve(script.toString());
-  Uri libraryUri = cwd.resolve('${libraryRoot}/');
+  Uri libraryUri = cwd.resolve(appendSlash('$libraryRoot'));
   Uri packageUri = null;
   if (packageRoot != null) {
-    packageUri = cwd.resolve('${packageRoot}/');
+    packageUri = cwd.resolve(appendSlash('$packageRoot'));
   }
   return api.compile(scriptUri, libraryUri, packageUri,
       provider.readStringFromUri, diagnosticHandler, options);
@@ -290,10 +290,10 @@
     diagnosticHandler =
         new FormattingDiagnosticHandler(provider).diagnosticHandler;
   }
-  Uri libraryUri = cwd.resolve('${libraryRoot}/');
+  Uri libraryUri = cwd.resolve(appendSlash('$libraryRoot'));
   Uri packageUri = null;
   if (packageRoot != null) {
-    packageUri = cwd.resolve('${packageRoot}/');
+    packageUri = cwd.resolve(appendSlash('$packageRoot'));
   }
   List<Uri> librariesUri = <Uri>[];
   for (Path library in libraries) {
@@ -1655,7 +1655,7 @@
 
   int get length => _constant.length;
 
-  Collection<String> get keys {
+  Iterable<String> get keys {
     // TODO(johnniwinther): Return an unmodifiable list instead.
     return new List<String>.from(_list);
   }
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart
index cec6c29..dd8c70f 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart
@@ -169,7 +169,7 @@
   /**
    * Returns a collection containing all the keys in the map.
    */
-  Collection<String> get keys;
+  Iterable<String> get keys;
 
   /**
    * Returns a future on the instance mirror of the value for the given key or
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/util.dart b/sdk/lib/_internal/compiler/implementation/mirrors/util.dart
index 3470211..7760da1 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/util.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/util.dart
@@ -45,13 +45,13 @@
     return found;
   }
 
-  Collection<K> get keys {
+  Iterable<K> get keys {
     var keys = <K>[];
     forEach((k,_) => keys.add(k));
     return keys;
   }
 
-  Collection<V> get values {
+  Iterable<V> get values {
     var values = <V>[];
     forEach((_,v) => values.add(v));
     return values;
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index e6fd478..c8598e8 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -15,9 +15,6 @@
   Selector getSelector(Send send);
   Selector getGetterSelectorInComplexSendSet(SendSet node);
   Selector getOperatorSelectorInComplexSendSet(SendSet node);
-  Selector getIteratorSelector(ForIn node);
-  Selector getMoveNextSelector(ForIn node);
-  Selector getCurrentSelector(ForIn node);
   DartType getType(Node node);
   bool isParameterChecked(Element element);
 
@@ -99,34 +96,6 @@
     return selectors[node.assignmentOperator];
   }
 
-  // The following methods set selectors on the "for in" node. Since
-  // we're using three selectors, we need to use children of the node,
-  // and we arbitrarily choose which ones.
-
-  Selector setIteratorSelector(ForIn node, Selector selector) {
-    selectors[node] = selector;
-  }
-
-  Selector getIteratorSelector(ForIn node) {
-    return selectors[node];
-  }
-
-  Selector setMoveNextSelector(ForIn node, Selector selector) {
-    selectors[node.forToken] = selector;
-  }
-
-  Selector getMoveNextSelector(ForIn node) {
-    return selectors[node.forToken];
-  }
-
-  Selector setCurrentSelector(ForIn node, Selector selector) {
-    selectors[node.inToken] = selector;
-  }
-
-  Selector getCurrentSelector(ForIn node) {
-    return selectors[node.inToken];
-  }
-
   bool isParameterChecked(Element element) {
     return checkedParameters.contains(element);
   }
@@ -1555,7 +1524,12 @@
           }
         }
       } else if (element.isTypeVariable()) {
-        if (enclosingElement.isInStaticMember()) {
+        Element outer = enclosingElement.getOutermostEnclosingMemberOrTopLevel();
+        bool isInFactoryConstructor = outer != null && outer.isFactoryConstructor();
+        if (!outer.isClass()
+	    && !outer.isTypedef()
+            && !isInFactoryConstructor
+            && Elements.isInStaticContext(enclosingElement)) {
           compiler.backend.registerThrowRuntimeError(
               // TODO(ahe): Get the TreeElements for the current element.
               compiler.globalDependencies);
@@ -2477,7 +2451,11 @@
     if (!inCatchBlock && node.expression == null) {
       error(node, MessageKind.THROW_WITHOUT_EXPRESSION);
     }
-    compiler.backend.registerThrow(mapping);
+    // We don't know ahead of time whether we will need the throw in a statement
+    // context or an expression context, so we register both here, even though
+    // we may not need ThrowExpression.
+    compiler.backend.registerWrapException(mapping);
+    compiler.backend.registerThrowExpression(mapping);
     visit(node.expression);
   }
 
@@ -2538,9 +2516,11 @@
     // and only declaration elements may be registered.
     world.registerStaticUse(constructor.declaration);
     ClassElement cls = constructor.getEnclosingClass();
-    // [cls] might be the implementation element and only declaration elements
-    // may be registered.
-    world.registerInstantiatedType(mapping.getType(node), mapping);
+    InterfaceType type = mapping.getType(node);
+    world.registerInstantiatedType(type, mapping);
+    if (constructor.isFactoryConstructor() && !type.typeArguments.isEmpty) {
+      world.registerFactoryWithTypeArguments(mapping);
+    }
     if (cls.isAbstract(compiler)) {
       compiler.backend.registerAbstractClassInstantiation(mapping);
     }
@@ -2616,8 +2596,10 @@
       listType = new InterfaceType(compiler.listClass,
                                    new Link<DartType>.fromList([typeArgument]));
     } else {
+      compiler.listClass.computeType(compiler);
       listType = compiler.listClass.rawType;
     }
+    mapping.setType(node, listType);
     world.registerInstantiatedType(listType, mapping);
     visit(node.elements);
   }
@@ -2707,37 +2689,61 @@
 
   visitForIn(ForIn node) {
     LibraryElement library = enclosingElement.getLibrary();
-    Selector iteratorSelector =
-        new Selector.getter(const SourceString('iterator'), library);
-    world.registerDynamicGetter(iteratorSelector.name, iteratorSelector);
-    mapping.setIteratorSelector(node, iteratorSelector);
-
-    Selector currentSelector =
-        new Selector.getter(const SourceString('current'), library);
-    world.registerDynamicGetter(currentSelector.name, currentSelector);
-    mapping.setCurrentSelector(node, currentSelector);
-
-    Selector moveNextSelector =
-        new Selector.call(const SourceString('moveNext'), library, 0);
-    world.registerDynamicInvocation(moveNextSelector.name, moveNextSelector);
-    mapping.setMoveNextSelector(node, moveNextSelector);
+    world.registerDynamicGetter(compiler.iteratorSelector.name,
+                                compiler.iteratorSelector);
+    world.registerDynamicGetter(compiler.currentSelector.name,
+                                compiler.currentSelector);
+    world.registerDynamicInvocation(compiler.moveNextSelector.name,
+                                    compiler.moveNextSelector);
 
     visit(node.expression);
     Scope blockScope = new BlockScope(scope);
     Node declaration = node.declaredIdentifier;
     visitIn(declaration, blockScope);
-    visitLoopBodyIn(node, node.body, blockScope);
 
-    // TODO(lrn): Also allow a single identifier.
-    if ((declaration is !Send || declaration.asSend().selector is !Identifier
-        || declaration.asSend().receiver != null)
-        && (declaration is !VariableDefinitions ||
-        !declaration.asVariableDefinitions().definitions.nodes.tail.isEmpty))
-    {
-      // The variable declaration is either not an identifier, not a
-      // declaration, or it's declaring more than one variable.
-      error(node.declaredIdentifier, MessageKind.INVALID_FOR_IN);
+    Send send = declaration.asSend();
+    VariableDefinitions variableDefinitions =
+        declaration.asVariableDefinitions();
+    Element loopVariable;
+    Selector loopVariableSelector;
+    if (send != null) {
+      loopVariable = mapping[send];
+      Identifier identifier = send.selector.asIdentifier();
+      if (identifier == null) {
+        compiler.reportErrorCode(send.selector, MessageKind.INVALID_FOR_IN);
+      } else {
+        loopVariableSelector = new Selector.setter(identifier.source, library);
+      }
+      if (send.receiver != null) {
+        compiler.reportErrorCode(send.receiver, MessageKind.INVALID_FOR_IN);
+      }
+    } else if (variableDefinitions != null) {
+      Link<Node> nodes = variableDefinitions.definitions.nodes;
+      if (!nodes.tail.isEmpty) {
+        compiler.reportErrorCode(nodes.tail.head, MessageKind.INVALID_FOR_IN);
+      }
+      Node first = nodes.head;
+      Identifier identifier = first.asIdentifier();
+      if (identifier == null) {
+        compiler.reportErrorCode(first, MessageKind.INVALID_FOR_IN);
+      } else {
+        loopVariableSelector = new Selector.setter(identifier.source, library);
+        loopVariable = mapping[identifier];
+      }
+    } else {
+      compiler.reportErrorCode(declaration, MessageKind.INVALID_FOR_IN);
     }
+    if (loopVariableSelector != null) {
+      mapping.setSelector(declaration, loopVariableSelector);
+    } else {
+      // The selector may only be null if we reported an error.
+      assert(invariant(declaration, compiler.compilationFailed));
+    }
+    if (loopVariable != null) {
+      // loopVariable may be null if it could not be resolved.
+      mapping[declaration] = loopVariable;
+    }
+    visitLoopBodyIn(node, node.body, blockScope);
   }
 
   visitLabel(Label node) {
@@ -2773,6 +2779,36 @@
   }
 
   visitLiteralMap(LiteralMap node) {
+    NodeList arguments = node.typeArguments;
+    DartType keyTypeArgument;
+    DartType valueTypeArgument;
+    if (arguments != null) {
+      Link<Node> nodes = arguments.nodes;
+      if (nodes.isEmpty) {
+        error(arguments, MessageKind.MISSING_TYPE_ARGUMENT);
+      } else {
+        keyTypeArgument = resolveTypeRequired(nodes.head);
+        nodes = nodes.tail;
+        if (nodes.isEmpty) {
+          error(arguments, MessageKind.MISSING_TYPE_ARGUMENT);
+        } else {
+          valueTypeArgument = resolveTypeRequired(nodes.head);
+          for (nodes = nodes.tail; !nodes.isEmpty; nodes = nodes.tail) {
+            error(nodes.head, MessageKind.ADDITIONAL_TYPE_ARGUMENT);
+            resolveTypeRequired(nodes.head);
+          }
+        }
+      }
+    }
+    DartType mapType;
+    if (valueTypeArgument != null) {
+      mapType = new InterfaceType(compiler.mapClass,
+          new Link<DartType>.fromList([keyTypeArgument, valueTypeArgument]));
+    } else {
+      compiler.mapClass.computeType(compiler);
+      mapType = compiler.mapClass.rawType;
+    }
+    mapping.setType(node, mapType);
     world.registerInstantiatedClass(compiler.mapClass, mapping);
     if (node.isConst()) {
       compiler.backend.registerConstantMap(mapping);
@@ -2968,17 +3004,30 @@
       if (typeNode.bound != null) {
         DartType boundType = typeResolver.resolveTypeAnnotation(
             typeNode.bound, scope, element, onFailure: warning);
-        if (boundType != null && boundType.element == variableElement) {
-          // TODO(johnniwinther): Check for more general cycles, like
-          // [: <A extends B, B extends C, C extends B> :].
-          warning(node, MessageKind.CYCLIC_TYPE_VARIABLE,
-                  {'typeVariableName': variableElement.name});
-        } else if (boundType != null) {
-          variableElement.bound = boundType;
-        } else {
-          // TODO(johnniwinther): Should be an erroneous type.
-          variableElement.bound = compiler.objectClass.computeType(compiler);
+        variableElement.bound = boundType;
+
+        void checkTypeVariableBound() {
+          Link<TypeVariableElement> seenTypeVariables =
+              const Link<TypeVariableElement>();
+          seenTypeVariables = seenTypeVariables.prepend(variableElement);
+          DartType bound = boundType;
+          while (bound.element.isTypeVariable()) {
+            TypeVariableElement element = bound.element;
+            if (seenTypeVariables.contains(element)) {
+              if (identical(element, variableElement)) {
+                // Only report an error on the checked type variable to avoid
+                // generating multiple errors for the same cyclicity.
+                warning(typeNode.name, MessageKind.CYCLIC_TYPE_VARIABLE,
+                    {'typeVariableName': variableElement.name});
+              }
+              break;
+            }
+            seenTypeVariables = seenTypeVariables.prepend(element);
+            bound = element.bound;
+          }
         }
+        compiler.enqueuer.resolution.addPostProcessAction(
+            element, checkTypeVariableBound);
       } else {
         variableElement.bound = compiler.objectClass.computeType(compiler);
       }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index 9eed786..d32bfb3 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -36,14 +36,14 @@
       SsaBuilder builder = new SsaBuilder(constantSystem, this, work);
       HGraph graph;
       ElementKind kind = element.kind;
-      if (identical(kind, ElementKind.GENERATIVE_CONSTRUCTOR)) {
+      if (kind == ElementKind.GENERATIVE_CONSTRUCTOR) {
         graph = compileConstructor(builder, work);
-      } else if (identical(kind, ElementKind.GENERATIVE_CONSTRUCTOR_BODY) ||
-                 identical(kind, ElementKind.FUNCTION) ||
-                 identical(kind, ElementKind.GETTER) ||
-                 identical(kind, ElementKind.SETTER)) {
+      } else if (kind == ElementKind.GENERATIVE_CONSTRUCTOR_BODY ||
+                 kind == ElementKind.FUNCTION ||
+                 kind == ElementKind.GETTER ||
+                 kind == ElementKind.SETTER) {
         graph = builder.buildMethod(element);
-      } else if (identical(kind, ElementKind.FIELD)) {
+      } else if (kind == ElementKind.FIELD) {
         graph = builder.buildLazyInitializer(element);
       } else {
         compiler.internalErrorOnElement(element,
@@ -110,6 +110,7 @@
   }
 }
 
+
 /**
  * Keeps track of locals (including parameters and phis) when building. The
  * 'this' reference is treated as parameter and hence handled by this class,
@@ -440,8 +441,9 @@
   }
 
   /**
-   * This function must be called before visiting any children of the loop. In
-   * particular it needs to be called before executing the initializers.
+   * This function, startLoop, must be called before visiting any children of
+   * the loop. In particular it needs to be called before executing the
+   * initializers.
    *
    * The [LocalsHandler] will make the boxes and updates at the right moment.
    * The builder just needs to call [enterLoopBody] and [enterLoopUpdates] (for
@@ -608,7 +610,7 @@
         new LinkedHashMap<Element,HInstruction>();
     HInstruction thisValue = null;
     directLocals.forEach((Element element, HInstruction instruction) {
-      if (!identical(element, closureData.thisElement)) {
+      if (element != closureData.thisElement) {
         HPhi phi = new HPhi.noInputs(element);
         joinedLocals[element] = phi;
         joinBlock.addPhi(phi);
@@ -631,7 +633,17 @@
       // If there was a "this" for the scope, add it to the new locals.
       joinedLocals[closureData.thisElement] = thisValue;
     }
-    directLocals = joinedLocals;
+
+    // Remove locals that are not in all handlers.
+    directLocals = new LinkedHashMap<Element, HInstruction>();
+    joinedLocals.forEach((element, instruction) {
+      if (instruction is HPhi
+          && instruction.inputs.length != localsHandlers.length) {
+        joinBlock.removePhi(instruction);
+      } else {
+        directLocals[element] = instruction;
+      }
+    });
     return this;
   }
 }
@@ -794,14 +806,28 @@
   // We build the Ssa graph by simulating a stack machine.
   List<HInstruction> stack;
 
-  // The current block to add instructions to. Might be null, if we are
-  // visiting dead code.
-  HBasicBlock current;
-  // The most recently opened block. Has the same value as [current] while
-  // the block is open, but unlike [current], it isn't cleared when the current
-  // block is closed.
+  /**
+   * The current block to add instructions to. Might be null, if we are
+   * visiting dead code, but see [isReachable].
+   */
+  HBasicBlock _current;
+
+  /**
+   * The most recently opened block. Has the same value as [_current] while
+   * the block is open, but unlike [_current], it isn't cleared when the
+   * current block is closed.
+   */
   HBasicBlock lastOpenedBlock;
 
+  /**
+   * Indicates whether the current block is dead (because it has a throw or a
+   * return further up).  If this is false, then [_current] may be null.  If the
+   * block is dead then it may also be aborted, but for simplicity we only
+   * abort on statement boundaries, not in the middle of expressions.  See
+   * isAborted.
+   */
+  bool isReachable = true;
+
   final List<Element> sourceElementStack;
 
   Element get currentElement => sourceElementStack.last.declaration;
@@ -831,6 +857,12 @@
   DartType returnType;
   bool inTryStatement = false;
 
+  HBasicBlock get current => _current;
+  void set current(c) {
+    isReachable = c != null;
+    _current = c;
+  }
+
   /**
    * Compiles compile-time constants. Never returns [:null:]. If the
    * initial value is not a compile-time constants, it reports an
@@ -908,9 +940,8 @@
                   parameter, graph.addConstantNull(constantSystem)));
             },
             () {
-              HReturn ret = new HReturn(
-                  graph.addConstantBool(false, constantSystem));
-              close(ret).addSuccessor(graph.exit);
+              closeAndGotoExit(new HReturn(
+                  graph.addConstantBool(false, constantSystem)));
             },
             null);
       }
@@ -927,7 +958,7 @@
     visit(link.head);
     HInstruction value = pop();
     value = potentiallyCheckType(value, variable.computeType(compiler));
-    close(new HReturn(value)).addSuccessor(graph.exit);
+    closeAndGotoExit(new HReturn(value));
     return closeFunction();
   }
 
@@ -1350,9 +1381,7 @@
               // closure to class mapper.
               compiler.closureToClassMapper.computeClosureToClassMapping(
                   member, node, elements);
-              sourceElementStack.add(member);
-              right.accept(this);
-              sourceElementStack.removeLast();
+              inlinedFrom(member, () => right.accept(this));
               elements = savedElements;
               value = pop();
             }
@@ -1506,7 +1535,7 @@
       invoke.element = body;
       add(invoke);
     }
-    close(new HReturn(newObject)).addSuccessor(graph.exit);
+    closeAndGotoExit(new HReturn(newObject));
     return closeFunction();
   }
 
@@ -1634,7 +1663,7 @@
 
   HGraph closeFunction() {
     // TODO(kasperl): Make this goto an implicit return.
-    if (!isAborted()) close(new HGoto()).addSuccessor(graph.exit);
+    if (!isAborted()) closeAndGotoExit(new HGoto());
     graph.finalize();
     return graph;
   }
@@ -1659,13 +1688,21 @@
     return result;
   }
 
+  HBasicBlock closeAndGotoExit(HControlFlow end) {
+    HBasicBlock result = current;
+    current.close(end);
+    current = null;
+    result.addSuccessor(graph.exit);
+    return result;
+  }
+
   void goto(HBasicBlock from, HBasicBlock to) {
     from.close(new HGoto());
     from.addSuccessor(to);
   }
 
   bool isAborted() {
-    return current == null;
+    return _current == null;
   }
 
   /**
@@ -1752,11 +1789,13 @@
   }
 
   visitBlock(Block node) {
+    assert(!isAborted());
+    if (!isReachable) return;  // This can only happen when inlining.
     for (Link<Node> link = node.statements.nodes;
          !link.isEmpty;
          link = link.tail) {
       visit(link.head);
-      if (isAborted()) {
+      if (!isReachable) {
         // The block has been aborted by a return or a throw.
         if (!stack.isEmpty) compiler.cancel('non-empty instruction stack');
         return;
@@ -1771,6 +1810,7 @@
   }
 
   visitExpressionStatement(ExpressionStatement node) {
+    assert(isReachable);
     visit(node.expression);
     pop();
   }
@@ -2049,6 +2089,7 @@
   }
 
   visitFor(For node) {
+    assert(isReachable);
     assert(node.body != null);
     void buildInitializer() {
       if (node.initializer == null) return;
@@ -2083,6 +2124,7 @@
   }
 
   visitWhile(While node) {
+    assert(isReachable);
     HInstruction buildCondition() {
       visit(node.condition);
       return popBoolified();
@@ -2095,6 +2137,7 @@
   }
 
   visitDoWhile(DoWhile node) {
+    assert(isReachable);
     LocalsHandler savedLocals = new LocalsHandler.from(localsHandler);
     localsHandler.startLoop(node);
     JumpHandler jumpHandler = beginLoopHeader(node);
@@ -2257,6 +2300,7 @@
   }
 
   visitFunctionDeclaration(FunctionDeclaration node) {
+    assert(isReachable);
     visit(node.function);
     localsHandler.updateLocal(elements[node], pop());
   }
@@ -2271,6 +2315,7 @@
   }
 
   visitIf(If node) {
+    assert(isReachable);
     handleIf(node,
              () => visit(node.condition),
              () => visit(node.thenPart),
@@ -2452,31 +2497,38 @@
 
   void generateInstanceSetterWithCompiledReceiver(Send send,
                                                   HInstruction receiver,
-                                                  HInstruction value) {
-    assert(Elements.isInstanceSend(send, elements));
-    Selector selector = elements.getSelector(send);
+                                                  HInstruction value,
+                                                  {Selector selector,
+                                                   Node location}) {
+    assert(send == null || Elements.isInstanceSend(send, elements));
+    if (selector == null) {
+      assert(send != null);
+      selector = elements.getSelector(send);
+    }
+    if (location == null) {
+      assert(send != null);
+      location = send;
+    }
     assert(selector.isSetter());
-    SourceString setterName = selector.name;
     bool hasSetter = compiler.world.hasAnyUserDefinedSetter(selector);
     Set<ClassElement> interceptedClasses =
-        backend.getInterceptedClassesOn(setterName);
+        backend.getInterceptedClassesOn(selector.name);
+    HInstruction instruction;
     if (interceptedClasses != null) {
       // If we're using an interceptor class, emit a call to the
       // getInterceptor method and then the actual dynamic call on the
       // interceptor object.
-      HInstruction instruction =
-          invokeInterceptor(interceptedClasses, receiver, send);
+      instruction = invokeInterceptor(interceptedClasses, receiver, send);
       instruction = new HInvokeDynamicSetter(
           selector, null, instruction, receiver, !hasSetter);
       // Add the value as an argument to the setter call on the
       // interceptor.
       instruction.inputs.add(value);
-      addWithPosition(instruction, send);
     } else {
-      addWithPosition(
-          new HInvokeDynamicSetter(selector, null, receiver, value, !hasSetter),
-          send);
+      instruction = new HInvokeDynamicSetter(
+          selector, null, receiver, value, !hasSetter);
     }
+    addWithPosition(instruction, location);
     stack.add(value);
   }
 
@@ -3028,7 +3080,7 @@
                       node: node.argumentsNode);
     }
     String constructorName = backend.namer.isolateName;
-    push(new HForeign(new DartString.literal("new $constructorName"),
+    push(new HForeign(new DartString.literal("new $constructorName()"),
                       HType.UNKNOWN,
                       <HInstruction>[]));
   }
@@ -3357,6 +3409,9 @@
       }
     }
 
+    if (constructor.isFactoryConstructor() && !type.typeArguments.isEmpty) {
+      compiler.enqueuer.codegen.registerFactoryWithTypeArguments(elements);
+    }
     HType elementType = computeType(constructor);
     HInstruction newInstance = new HInvokeStatic(inputs, elementType);
     pushWithPosition(newInstance, node);
@@ -3886,7 +3941,7 @@
     if (!inliningStack.isEmpty) {
       localsHandler.updateLocal(returnElement, value);
     } else {
-      close(attachPosition(new HReturn(value), node)).addSuccessor(graph.exit);
+      closeAndGotoExit(attachPosition(new HReturn(value), node));
     }
   }
 
@@ -3898,10 +3953,20 @@
         compiler.internalError(
             'rethrowableException should not be null', node: node);
       }
-      close(new HThrow(exception, isRethrow: true));
+      handleInTryStatement();
+      closeAndGotoExit(new HThrow(exception, isRethrow: true));
     } else {
       visit(node.expression);
-      close(new HThrow(pop()));
+      handleInTryStatement();
+      if (inliningStack.isEmpty) {
+        closeAndGotoExit(new HThrow(pop()));
+      } else if (isReachable) {
+        // We don't close the block when we are inlining, because we could be
+        // inside an expression, and it is rather complicated to close the
+        // block at an arbitrary place in an expression.
+        add(new HThrowExpression(pop()));
+        isReachable = false;
+      }
     }
   }
 
@@ -3911,6 +3976,7 @@
   }
 
   visitVariableDefinitions(VariableDefinitions node) {
+    assert(isReachable);
     for (Link<Node> link = node.definitions.nodes;
          !link.isEmpty;
          link = link.tail) {
@@ -4026,7 +4092,7 @@
     // The iterator is shared between initializer, condition and body.
     HInstruction iterator;
     void buildInitializer() {
-      Selector selector = elements.getIteratorSelector(node);
+      Selector selector = compiler.iteratorSelector;
       Set<ClassElement> interceptedClasses =
           backend.getInterceptedClassesOn(selector.name);
       visit(node.expression);
@@ -4047,28 +4113,34 @@
       add(iterator);
     }
     HInstruction buildCondition() {
-      Selector selector = elements.getMoveNextSelector(node);
+      Selector selector = compiler.moveNextSelector;
       push(new HInvokeDynamicMethod(selector, <HInstruction>[iterator]));
       return popBoolified();
     }
     void buildBody() {
-      Selector call = elements.getCurrentSelector(node);
+      Selector call = compiler.currentSelector;
       bool hasGetter = compiler.world.hasAnyUserDefinedGetter(call);
       push(new HInvokeDynamicGetter(call, null, iterator, !hasGetter));
 
-      Element variable;
-      if (node.declaredIdentifier.asSend() != null) {
-        variable = elements[node.declaredIdentifier];
-      } else {
-        assert(node.declaredIdentifier.asVariableDefinitions() != null);
-        VariableDefinitions variableDefinitions = node.declaredIdentifier;
-        variable = elements[variableDefinitions.definitions.nodes.head];
-      }
+      Element variable = elements[node.declaredIdentifier];
+      Selector selector = elements.getSelector(node.declaredIdentifier);
+
       HInstruction oldVariable = pop();
-      if (variable.isErroneous()) {
-        generateThrowNoSuchMethod(node,
-                                  getTargetName(variable, 'set'),
-                                  argumentValues: <HInstruction>[oldVariable]);
+      if (Elements.isUnresolved(variable)) {
+        if (Elements.isInStaticContext(currentElement)) {
+          generateThrowNoSuchMethod(
+              node.declaredIdentifier,
+              'set ${selector.name.slowToString()}',
+              argumentValues: <HInstruction>[oldVariable]);
+        } else {
+          // The setter may have been defined in a subclass.
+          generateInstanceSetterWithCompiledReceiver(
+              null,
+              localsHandler.readThis(),
+              oldVariable,
+              selector: selector,
+              location: node.declaredIdentifier);
+        }
         pop();
       } else {
         localsHandler.updateLocal(variable, oldVariable);
@@ -4313,7 +4385,7 @@
       if (!isAborted() && caseIterator.hasNext) {
         pushInvokeHelper0(getFallThroughErrorElement, HType.UNKNOWN);
         HInstruction error = pop();
-        close(new HThrow(error));
+        closeAndGotoExit(new HThrow(error));
       }
       statements.add(
           new HSubGraphBlockInformation(new SubGraph(block, lastOpenedBlock)));
@@ -4430,7 +4502,7 @@
             compiler.findHelper(const SourceString("getFallThroughError"));
         pushInvokeHelper0(element, HType.UNKNOWN);
         HInstruction error = pop();
-        close(new HThrow(error));
+        closeAndGotoExit(new HThrow(error));
       }
     }
 
@@ -4646,7 +4718,7 @@
 
       void visitElse() {
         if (link.isEmpty) {
-          close(new HThrow(exception, isRethrow: true));
+          closeAndGotoExit(new HThrow(exception, isRethrow: true));
         } else {
           CatchBlock newBlock = link.head;
           handleIf(node,
@@ -4688,9 +4760,6 @@
         var last = block.last;
         if (last is HExitTry) {
           block.addSuccessor(successor);
-        } else if (last is HTry) {
-          // Skip all blocks inside this nested try/catch.
-          i = last.joinBlock.id;
         }
       }
     }
@@ -4904,9 +4973,11 @@
     tooDifficult = true;
   }
 
-  void visitThrow(Node node) {
+  void visitThrow(Throw node) {
     if (!registerNode()) return;
-    tooDifficult = true;
+    // We can't inline rethrows and we don't want to handle throw after a return
+    // even if it is in an "if".
+    if (seenReturn || node.expression == null) tooDifficult = true;
   }
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index 42f055a..e201af0 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -337,11 +337,11 @@
     // Register return types to the backend.
     graph.exit.predecessors.forEach((HBasicBlock block) {
       HInstruction last = block.last;
-      assert(last is HGoto || last is HReturn);
+      assert(last is HGoto || last is HReturn || last is HThrow);
       if (last is HReturn) {
         backend.registerReturnType(
             work.element, last.inputs[0].instructionType);
-      } else {
+      } else if (last is HGoto) {
         backend.registerReturnType(work.element, HType.NULL);
       }
     });
@@ -1743,12 +1743,24 @@
       }
       pushStatement(new js.LiteralStatement(code), node);
     } else {
-      List<js.Expression> data = <js.Expression>[];
-      for (int i = 0; i < inputs.length; i++) {
-        use(inputs[i]);
-        data.add(pop());
+      // We can parse simple JS with the mini parser.  At the moment we can't
+      // handle expression interpolation with # and we can't handle JSON
+      // literals and function literals, both of which contain "{".
+      if (!code.contains("#") && !code.contains("{")) {
+        js.Expression codeAst = js.js(code);
+        push(codeAst, node);
+        if (!inputs.isEmpty) {
+          compiler.internalError("Too many arguments to JS expression",
+                                 instruction: node);
+        }
+      } else {
+        List<js.Expression> data = <js.Expression>[];
+        for (int i = 0; i < inputs.length; i++) {
+          use(inputs[i]);
+          data.add(pop());
+        }
+        push(new js.LiteralExpression.withData(code, data), node);
       }
-      push(new js.LiteralExpression.withData(code, data), node);
     }
     registerForeignType(node.instructionType);
     // TODO(sra): Tell world.nativeEnqueuer about the types created here.
@@ -1917,7 +1929,7 @@
       use(node.inputs[0]);
       pushStatement(new js.Throw(pop()), node);
     } else {
-      generateThrowWithHelper(r'$throw', node.inputs[0]);
+      generateThrowWithHelper('wrapException', node.inputs[0]);
     }
   }
 
@@ -1995,6 +2007,20 @@
     pushStatement(new js.Throw(value));
   }
 
+  visitThrowExpression(HThrowExpression node) {
+    HInstruction argument = node.inputs[0];
+    use(argument);
+
+    Element helper = compiler.findHelper(new SourceString("throwExpression"));
+    world.registerStaticUse(helper);
+
+    js.VariableUse jsHelper =
+        new js.VariableUse(backend.namer.isolateAccess(helper));
+    js.Call value = new js.Call(jsHelper, [pop()]);
+    attachLocation(value, argument);
+    push(value, node);
+  }
+
   void visitSwitch(HSwitch node) {
     // Switches are handled using [visitSwitchInfo].
   }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
index c1b9796..745f489 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
@@ -64,6 +64,7 @@
   R visitSwitch(HSwitch node);
   R visitThis(HThis node);
   R visitThrow(HThrow node);
+  R visitThrowExpression(HThrowExpression node);
   R visitTry(HTry node);
   R visitTypeGuard(HTypeGuard node);
   R visitTypeConversion(HTypeConversion node);
@@ -339,6 +340,7 @@
   visitStringify(HStringify node) => visitInstruction(node);
   visitThis(HThis node) => visitParameterValue(node);
   visitThrow(HThrow node) => visitControlFlow(node);
+  visitThrowExpression(HThrowExpression node) => visitInstruction(node);
   visitTry(HTry node) => visitControlFlow(node);
   visitTypeGuard(HTypeGuard node) => visitCheck(node);
   visitIs(HIs node) => visitInstruction(node);
@@ -2018,6 +2020,13 @@
   accept(HVisitor visitor) => visitor.visitReturn(this);
 }
 
+class HThrowExpression extends HInstruction {
+  HThrowExpression(value) : super(<HInstruction>[value]);
+  toString() => 'throw expression';
+  accept(HVisitor visitor) => visitor.visitThrowExpression(this);
+  bool canThrow() => true;
+}
+
 class HThrow extends HControlFlow {
   final bool isRethrow;
   HThrow(value, {this.isRethrow: false}) : super(<HInstruction>[value]);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
index a44058c..65a82ca 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
@@ -815,7 +815,9 @@
     TypeMask receiverMask = receiverType.computeMask(compiler);
     return interceptedClasses
         .where((cls) => cls != compiler.objectClass)
-        .map((cls) => new TypeMask.subclass(cls.rawType))
+        .map((cls) => backend.classesMixedIntoNativeClasses.contains(cls)
+            ? new TypeMask.subtype(cls.rawType)
+            : new TypeMask.subclass(cls.rawType))
         .every((mask) => receiverMask.intersection(mask, compiler).isEmpty);
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart b/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart
index ca58e8f..1dc573d 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart
@@ -479,6 +479,10 @@
 
   String visitThrow(HThrow node) => "Throw ${temporaryId(node.inputs[0])}";
 
+  String visitThrowExpression(HThrowExpression node) {
+    return "ThrowExpression ${temporaryId(node.inputs[0])}";
+  }
+
   String visitExitTry(HExitTry node) {
     return "Exit try";
   }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/validate.dart b/sdk/lib/_internal/compiler/implementation/ssa/validate.dart
index 8d98afe..16de943 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/validate.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/validate.dart
@@ -44,21 +44,17 @@
     if (block.last is HJump && block.successors.length != 1) {
       markInvalid("Break or continue node without one successor");
     }
-    if (block.last is HReturn &&
+    if ((block.last is HReturn || block.last is HThrow) &&
         (block.successors.length != 1 || !block.successors[0].isExitBlock())) {
-      markInvalid("Return node with > 1 succesor or not going to exit-block");
+      markInvalid("Return or throw node with > 1 successor "
+                  "or not going to exit-block");
     }
     if (block.last is HExit && !block.successors.isEmpty) {
       markInvalid("Exit block with successor");
     }
-    if (block.last is HThrow && !block.successors.isEmpty) {
-      markInvalid("Throw block with successor");
-    }
 
-    if (block.successors.isEmpty &&
-        block.last is !HThrow &&
-        !block.isExitBlock()) {
-      markInvalid("Non-exit or throw block without successor");
+    if (block.successors.isEmpty && !block.isExitBlock()) {
+      markInvalid("Non-exit block without successor");
     }
 
     // Check that successors ids are always higher than the current one.
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 f116845..4f265f0 100644
--- a/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
@@ -398,7 +398,7 @@
         if (baseType.isUnknown()) return false;
         if (baseType.isNull()) continue;
         ClassBaseType classType = baseType;
-        if (!types.isSubtype(new InterfaceType(classType.element),
+        if (!types.isSubtype(classType.element.rawType,
                              parameterType)) return false;
       }
       return true;
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 c61db0c..6c923c0 100644
--- a/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
@@ -179,11 +179,11 @@
    * of a field, these [Node] are initially discarded, and once the
    * type is computed, we make sure these constraints are satisfied
    * for that type. For example:
-   * 
+   *
    * [: field++ ], or [: field += 42 :], the constraint is on the
    * operator+, and we make sure that a typed selector with the found
    * type returns that type.
-   * 
+   *
    * [: field = other.field :], the constraint in on the [:field]
    * getter selector, and we make sure that the getter selector
    * returns that type.
@@ -265,7 +265,8 @@
         recompiles++;
         recomputeWatch.start();
       }
-      bool changed = analyze(element);
+      bool changed =
+          compiler.withCurrentElement(element, () => analyze(element));
       analyzed++;
       if (wasAnalyzed) {
         recomputeWatch.stop();
@@ -1199,7 +1200,7 @@
     if (analyzedElement.isField()) {
       return visit(node.asSendSet().arguments.head);
     }
-    
+
     FunctionElement function = analyzedElement;
     FunctionSignature signature = function.computeSignature(compiler);
     signature.forEachOptionalParameter((element) {
@@ -1532,46 +1533,9 @@
       }
     } else if (op == '=') {
       // [: foo = 42 :] or [: foo.bar = 42 :].
-      ArgumentsTypes arguments =  new ArgumentsTypes([rhsType], null);
-      if (Elements.isStaticOrTopLevelField(element)) {
-        handleStaticSend(node, setterSelector, element, arguments);
-      } else if (Elements.isUnresolved(element) || element.isSetter()) {
-        handleDynamicSend(node, setterSelector, receiverType, arguments);
-      } else if (element.isField()) {
-        if (element.modifiers.isFinal()) {
-          inferrer.recordFinalFieldType(
-              node, outermostElement, element, rhsType);
-        } else {
-          locals.updateField(element, rhsType);
-          if (visitingInitializers) {
-            inferrer.recordNonFinalFieldElementType(node, element, rhsType);
-          } else {
-            handleDynamicSend(node, setterSelector, receiverType, arguments);
-          }
-        }
-      } else if (Elements.isLocal(element)) {
-        locals.update(element, rhsType);
-      }
-
-      if (!Elements.isLocal(element)) {
-        // Recognize a constraint of the form [: field = other.field :].
-        // Note that we check if the right hand side is a local to
-        // recognize the situation [: var a = 42; this.a = a; :]. Our
-        // constraint mechanism only works with members or top level
-        // elements.
-        var rhs = node.arguments.head;
-        if (rhs.asSend() != null
-            && rhs.isPropertyAccess
-            && !Elements.isLocal(elements[rhs])
-            && rhs.selector.source == node.selector.asIdentifier().source) {
-          // TODO(ngeoffray): We should update selectors in the
-          // element tree and find out if the typed selector still
-          // applies to the receiver type.
-          Selector constraint = elements.getSelector(rhs);
-          inferrer.recordSetterConstraint(node, constraint);
-        }
-      }
-      return rhsType;
+      return handlePlainAssignment(
+          node, element, setterSelector, receiverType, rhsType,
+          node.arguments.head);
     } else {
       // [: foo++ :] or [: foo += 1 :].
       TypeMask getterType;
@@ -1622,6 +1586,55 @@
     }
   }
 
+  TypeMask handlePlainAssignment(Send node,
+                                 Element element,
+                                 Selector setterSelector,
+                                 TypeMask receiverType,
+                                 TypeMask rhsType,
+                                 Node rhs) {
+    ArgumentsTypes arguments = new ArgumentsTypes([rhsType], null);
+    if (Elements.isStaticOrTopLevelField(element)) {
+      handleStaticSend(node, setterSelector, element, arguments);
+    } else if (Elements.isUnresolved(element) || element.isSetter()) {
+      handleDynamicSend(node, setterSelector, receiverType, arguments);
+    } else if (element.isField()) {
+      if (element.modifiers.isFinal()) {
+        inferrer.recordFinalFieldType(
+            node, outermostElement, element, rhsType);
+      } else {
+        locals.updateField(element, rhsType);
+        if (visitingInitializers) {
+          inferrer.recordNonFinalFieldElementType(node, element, rhsType);
+        } else {
+          handleDynamicSend(node, setterSelector, receiverType, arguments);
+        }
+      }
+    } else if (Elements.isLocal(element)) {
+      locals.update(element, rhsType);
+    }
+
+    if (!Elements.isLocal(element)) {
+      // Recognize a constraint of the form [: field = other.field :].
+      // Note that we check if the right hand side is a local to
+      // recognize the situation [: var a = 42; this.a = a; :]. Our
+      // constraint mechanism only works with members or top level
+      // elements.
+      Send send = rhs.asSend();
+      if (send != null
+          && send.isPropertyAccess
+          && !Elements.isLocal(elements[rhs])
+          && send.selector.asIdentifier().source
+               == node.selector.asIdentifier().source) {
+        // TODO(ngeoffray): We should update selectors in the
+        // element tree and find out if the typed selector still
+        // applies to the receiver type.
+        Selector constraint = elements.getSelector(rhs);
+        inferrer.recordSetterConstraint(node, constraint);
+      }
+    }
+    return rhsType;
+  }
+
   TypeMask visitIdentifier(Identifier node) {
     if (node.isThis()) {
       return thisType;
@@ -2006,24 +2019,24 @@
     bool changed = false;
     visit(node.expression);
     if (!isThisExposed && node.expression.isThis()) {
-      Selector iteratorSelector = elements.getIteratorSelector(node);
+      Selector iteratorSelector = compiler.iteratorSelector;
       checkIfExposesThis(new TypedSelector(thisType, iteratorSelector));
       TypeMask iteratorType = inferrer.typeOfSelector(iteratorSelector);
 
       checkIfExposesThis(
-          new TypedSelector(iteratorType, elements.getMoveNextSelector(node)));
+          new TypedSelector(iteratorType, compiler.moveNextSelector));
       checkIfExposesThis(
-          new TypedSelector(iteratorType, elements.getCurrentSelector(node)));
+          new TypedSelector(iteratorType, compiler.currentSelector));
     }
-    Element variable;
-    if (node.declaredIdentifier.asSend() != null) {
-      variable = elements[node.declaredIdentifier];
+    Element variable = elements[node.declaredIdentifier];
+    Selector selector = elements.getSelector(node.declaredIdentifier);
+    if (!Elements.isUnresolved(variable)) {
+      locals.update(variable, inferrer.dynamicType);
     } else {
-      assert(node.declaredIdentifier.asVariableDefinitions() != null);
-      VariableDefinitions variableDefinitions = node.declaredIdentifier;
-      variable = elements[variableDefinitions.definitions.nodes.head];
+      handlePlainAssignment(new Send(), variable, selector,
+                            inferrer.dynamicType, inferrer.dynamicType,
+                            node.expression);
     }
-    locals.update(variable, inferrer.dynamicType);
     loopLevel++;
     do {
       LocalsHandler saved = new LocalsHandler.from(locals);
diff --git a/sdk/lib/_internal/compiler/implementation/universe/function_set.dart b/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
index dc30ef1..4375528 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
@@ -73,7 +73,7 @@
   // compact than a hash set. Once we get enough elements, we change
   // the representation to be a set to get faster contains checks.
   static const int MAX_ELEMENTS_IN_LIST = 8;
-  Collection<Element> elements = <Element>[];
+  var elements = <Element>[];
   bool isList = true;
 
   FunctionSetNode(this.name);
diff --git a/sdk/lib/_internal/compiler/implementation/universe/universe.dart b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
index c167c6f..76d4fb2 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/universe.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
@@ -50,6 +50,8 @@
   final Set<Element> fieldSetters;
   final Set<DartType> isChecks;
 
+  bool usingFactoryWithTypeArguments = false;
+
   Universe() : instantiatedClasses = new Set<ClassElement>(),
                instantiatedTypes = new Set<DartType>(),
                staticFunctionsNeedingGetter = new Set<FunctionElement>(),
@@ -89,41 +91,6 @@
   bool hasFieldSetter(Element member, Compiler compiler) {
     return fieldSetters.contains(member);
   }
-
-  /**
-   * Compute type arguments of classes that use one of their type variables in
-   * is-checks and add the is-checks that they imply.
-   *
-   * This function must be called after all is-checks have been registered.
-   *
-   * TODO(karlklose): move these computations into a function producing an
-   * immutable datastructure.
-   */
-  void addImplicitChecks(Iterable<ClassElement> classesUsingChecks) {
-    // If there are no classes that use their variables in checks, there is
-    // nothing to do.
-    if (classesUsingChecks.isEmpty) return;
-    // Find all instantiated types that are a subtype of a class that uses
-    // one of its type arguments in an is-check and add the arguments to the
-    // set of is-checks.
-    // TODO(karlklose): replace this with code that uses a subtype lookup
-    // datastructure in the world.
-    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) {
-          isChecks.add(argument);
-        }
-      }
-    }
-  }
 }
 
 class SelectorKind {
diff --git a/sdk/lib/_internal/compiler/implementation/warnings.dart b/sdk/lib/_internal/compiler/implementation/warnings.dart
index 2e377a4..49c112e 100644
--- a/sdk/lib/_internal/compiler/implementation/warnings.dart
+++ b/sdk/lib/_internal/compiler/implementation/warnings.dart
@@ -191,7 +191,7 @@
       "no default class on enclosing interface '#{interfaceName}'");
 
   static const CYCLIC_TYPE_VARIABLE = const MessageKind(
-      "cyclic reference to type variable #{typeVariableName}");
+      "type variable #{typeVariableName} is a supertype of itself");
 
   static const CLASS_NAME_EXPECTED = const MessageKind(
       "class name expected");
diff --git a/sdk/lib/_internal/dartdoc/bin/dartdoc.dart b/sdk/lib/_internal/dartdoc/bin/dartdoc.dart
index ec63c06..9190f31 100644
--- a/sdk/lib/_internal/dartdoc/bin/dartdoc.dart
+++ b/sdk/lib/_internal/dartdoc/bin/dartdoc.dart
@@ -18,9 +18,11 @@
 
 import 'dart:async';
 import 'dart:io';
+import 'dart:uri';
 
 // TODO(rnystrom): Use "package:" URL (#4968).
 import '../lib/dartdoc.dart';
+import '../lib/src/dartdoc/utils.dart';
 import 'package:args/args.dart';
 import 'package:pathos/path.dart' as path;
 
@@ -39,7 +41,7 @@
 
   final Path libPath = scriptDir.append('../../../../');
 
-  Path packageRoot;
+  String packageRoot;
 
   argParser.addFlag('no-code',
       help: 'Do not include source code in the documentation.',
@@ -166,7 +168,7 @@
         ' the entrypoint.',
       callback: (packageDir) {
         if(packageDir != null) {
-          packageRoot = new Path(packageDir);
+          packageRoot = packageDir;
         }
       });
 
@@ -175,7 +177,7 @@
       help: 'Deprecated: same as --package-root.',
       callback: (packageDir) {
         if(packageDir != null) {
-          packageRoot = new Path(packageDir);
+          packageRoot = packageDir;
         }
       });
 
@@ -188,21 +190,22 @@
     exit(1);
   }
 
-  final entrypoints = <Path>[];
+  final entrypoints = <Uri>[];
   try {
     final option = argParser.parse(args);
 
     // This checks to see if the root of all entrypoints is the same.
     // If it is not, then we display a warning, as package imports might fail.
     var entrypointRoot;
-    for(final arg in option.rest) {
-      var entrypoint = new Path(arg);
-      entrypoints.add(entrypoint);
+    for (final entrypoint in option.rest) {
+      var uri = Uri.parse(entrypoint);
+      if (uri.scheme == '') uri = pathToFileUri(entrypoint);
+      entrypoints.add(uri);
 
+      if (uri.scheme != 'file') continue;
       if (entrypointRoot == null) {
-        entrypointRoot = entrypoint.directoryPath;
-      } else if (entrypointRoot.toNativePath() !=
-          entrypoint.directoryPath.toNativePath()) {
+        entrypointRoot = path.dirname(entrypoint);
+      } else if (entrypointRoot != path.dirname(entrypoint)) {
         print('Warning: entrypoints are at different directories. "package:"'
             ' imports may fail.');
       }
@@ -220,40 +223,18 @@
     exit(1);
   }
 
-  if (packageRoot == null) {
-    // Check if there's a `packages` directory in the entry point directory.
-    var script = path.normalize(path.absolute(entrypoints[0].toNativePath()));
-    var dir = path.join(path.dirname(script), 'packages/');
-    if (new Directory(dir).existsSync()) {
-      // TODO(amouravski): convert all of dartdoc to use pathos.
-      packageRoot = new Path(dir);
-    } else {
-      // If there is not, then check if the entrypoint is somewhere in a `lib`
-      // directory.
-      dir = path.dirname(script);
-      var parts = path.split(dir);
-      var libDir = parts.lastIndexOf('lib');
-      if (libDir > 0) {
-        packageRoot = new Path(path.join(path.joinAll(parts.take(libDir)),
-              'packages'));
-      }
-    }
-  }
+  if (packageRoot == null) packageRoot = _getPackageRoot(entrypoints);
 
   cleanOutputDirectory(dartdoc.outputDir);
 
   // Start the analysis and documentation.
   dartdoc.documentLibraries(entrypoints, libPath, packageRoot)
-    .then((_) {
-      print('Copying static files...');
-      Future.wait([
-        // Prepare the dart2js script code and copy static resources.
-        // TODO(amouravski): move compileScript out and pre-generate the client
-        // scripts. This takes a long time and the js hardly ever changes.
-        compileScript(dartdoc.mode, dartdoc.outputDir, libPath),
-        copyDirectory(scriptDir.append('../static'), dartdoc.outputDir)
-      ]);
-    })
+    // Prepare the dart2js script code and copy static resources.
+    // TODO(amouravski): move compileScript out and pre-generate the client
+    // scripts. This takes a long time and the js hardly ever changes.
+    .then((_) => compileScript(dartdoc.mode, dartdoc.outputDir, libPath))
+    .then((_) => copyDirectory(scriptDir.append('../static'),
+          dartdoc.outputDir))
     .then((_) {
       print(dartdoc.status);
       if (dartdoc.totals == 0) {
@@ -267,3 +248,25 @@
     })
     .whenComplete(() => dartdoc.cleanup());
 }
+
+String _getPackageRoot(List<Uri> entrypoints) {
+  // Check if there's a `packages` directory in the entry point directory.
+  var fileEntrypoint = entrypoints.firstWhere(
+      (entrypoint) => entrypoint.scheme == 'file',
+      orElse: () => null);
+  if (fileEntrypoint == null) return;
+
+  var script = path.normalize(path.absolute(fileUriToPath(fileEntrypoint)));
+  var dir = path.join(path.dirname(script), 'packages/');
+  if (new Directory(dir).existsSync()) return dir;
+
+  // If there is not, then check if the entrypoint is somewhere in a `lib`
+  // directory.
+  var parts = path.split(path.dirname(script));
+  var libDir = parts.lastIndexOf('lib');
+  if (libDir > 0) {
+    return path.join(path.joinAll(parts.take(libDir)), 'packages');
+  } else {
+    return null;
+  }
+}
diff --git a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
index 42246b9..38d1706 100644
--- a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
+++ b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
@@ -18,15 +18,20 @@
 
 import 'dart:async';
 import 'dart:io';
+import 'dart:isolate';
 import 'dart:json' as json;
 import 'dart:math';
 import 'dart:uri';
 
+import 'package:pathos/path.dart' as pathos;
+
 import 'classify.dart';
 import 'markdown.dart' as md;
 import 'universe_serializer.dart';
 
 import 'src/dartdoc/nav.dart';
+import 'src/dartdoc/utils.dart';
+import 'src/export_map.dart';
 import 'src/json_serializer.dart' as json_serializer;
 
 // TODO(rnystrom): Use "package:" URL (#4968).
@@ -35,8 +40,6 @@
 import '../../compiler/implementation/mirrors/mirrors_util.dart';
 import '../../libraries.dart';
 
-part 'src/dartdoc/utils.dart';
-
 /**
  * Generates completely static HTML containing everything you need to browse
  * the docs. The only client side behavior is trivial stuff like syntax
@@ -107,6 +110,7 @@
  * event loop has had a chance to pump (i.e. after `main()` has returned).
  */
 Future copyDirectory(Path from, Path to) {
+  print('Copying static files...');
   final completer = new Completer();
   final fromDir = new Directory.fromPath(from);
   fromDir.list(recursive: false).listen(
@@ -131,16 +135,38 @@
  */
 Future compileScript(int mode, Path outputDir, Path libPath) {
   print('Compiling client JavaScript...');
-  var clientScript = (mode == MODE_STATIC) ? 'static' : 'live-nav';
-  var dartPath = libPath.append(
-      'lib/_internal/dartdoc/lib/src/client/client-$clientScript.dart');
-  var jsPath = outputDir.append('client-$clientScript.js');
 
-  return dart2js.compile(dartPath, libPath,
-      options: const <String>['--categories=Client,Server'])
-    .then((jsCode) {
-      writeString(new File.fromPath(jsPath), jsCode);
+  // TODO(nweiz): don't run this in an isolate when issue 9815 is fixed.
+  return spawnFunction(_compileScript).call({
+    'mode': mode,
+    'outputDir': outputDir.toNativePath(),
+    'libPath': libPath.toNativePath()
+  }).then((result) {
+    if (result.first == 'success') return;
+    throw new AsyncError(result[1], result[2]);
+  });
+}
+
+void _compileScript() {
+  port.receive((message, replyTo) {
+    new Future.of(() {
+      var clientScript = (message['mode'] == MODE_STATIC) ?
+          'static' : 'live-nav';
+      var dartPath = pathos.join(message['libPath'], 'lib', '_internal',
+          'dartdoc', 'lib', 'src', 'client', 'client-$clientScript.dart');
+      var jsPath = pathos.join(message['outputDir'], 'client-$clientScript.js');
+
+      return dart2js.compile(
+          new Path(dartPath), new Path(message['libPath']),
+          options: const <String>['--categories=Client,Server']).then((jsCode) {
+        writeString(new File(jsPath), jsCode);
+      });
+    }).then((_) {
+      replyTo.send(['success']);
+    }).catchError((e) {
+      replyTo.send(['error', e.error.toString(), e.stackTrace.toString()]);
     });
+  });
 }
 
 /**
@@ -261,11 +287,30 @@
   /** Set this to select the libraries to exclude from the documentation. */
   List<String> excludedLibraries = const <String>[];
 
+  /** The package root for `package:` imports. */
+  String _packageRoot;
+
+  /** The map containing all the exports for each library. */
+  ExportMap _exports;
+
   /**
    * This list contains the libraries sorted in by the library name.
    */
   List<LibraryMirror> _sortedLibraries;
 
+  /** A map from absolute paths of libraries to the libraries at those paths. */
+  Map<String, LibraryMirror> _librariesByPath;
+
+  /**
+   * A map from absolute paths of hidden libraries to lists of [Export]s that
+   * export those libraries from visible libraries. This is used to determine
+   * what public library any given entity belongs to.
+   *
+   * The lists of exports are sorted so that exports that hide the fewest number
+   * of members come first.
+   */
+  Map<String, List<Export>> _hiddenLibraryExports;
+
   /** The library that we're currently generating docs for. */
   LibraryMirror _currentLibrary;
 
@@ -403,16 +448,25 @@
     return content;
   }
 
-  Future documentEntryPoint(Path entrypoint, Path libPath, Path packageRoot) {
-    return documentLibraries(<Path>[entrypoint], libPath, packageRoot);
-  }
+  Future documentLibraries(List<Uri> libraryList, Path libPath,
+      String packageRoot) {
+    _packageRoot = packageRoot;
+    _exports = new ExportMap.parse(libraryList, packageRoot);
+    var librariesToAnalyze = _exports.allExportedFiles.toList();
+    librariesToAnalyze.addAll(libraryList.map((uri) {
+      if (uri.scheme == 'file') return fileUriToPath(uri);
+      // dart2js takes "dart:*" URIs as Path objects for some reason.
+      return uri.toString();
+    }));
 
-  Future documentLibraries(List<Path> libraryList, Path libPath, Path packageRoot) {
+    var packageRootPath = packageRoot == null ? null : new Path(packageRoot);
+
     // TODO(amouravski): make all of these print statements into logging
     // statements.
     print('Analyzing libraries...');
-    return dart2js.analyze(libraryList, libPath, packageRoot: packageRoot,
-        options: COMPILER_OPTIONS)
+    return dart2js.analyze(
+        librariesToAnalyze.map((path) => new Path(path)).toList(), libPath,
+        packageRoot: packageRootPath, options: COMPILER_OPTIONS)
       .then((MirrorSystem mirrors) {
         print('Generating documentation...');
         _document(mirrors);
@@ -430,6 +484,16 @@
           displayName(y).toUpperCase());
     });
 
+    _librariesByPath = <String, LibraryMirror>{};
+    for (var library in mirrors.libraries.values) {
+      var path = _libraryPath(library);
+      if (path == null) continue;
+      path = pathos.normalize(pathos.absolute(path));
+      _librariesByPath[path] = library;
+    }
+
+    _hiddenLibraryExports = _generateHiddenLibraryExports();
+
     // Generate the docs.
     if (mode == MODE_LIVE_NAV) {
       docNavigationJson();
@@ -446,6 +510,7 @@
       generateAppCacheManifest();
     }
 
+    // TODO(nweiz): properly handle exports when generating JSON.
     // TODO(jacobr): handle arbitrary pub packages rather than just the system
     // libraries.
     var revision = '0';
@@ -484,6 +549,63 @@
     _finished = true;
   }
 
+  /**
+   * Generate [_hiddenLibraryExports] from [_exports] and [_librariesByPath].
+   */
+  Map<String, List<Export>> _generateHiddenLibraryExports() {
+    // First generate a map `exported path => exporter path => Export`. The
+    // inner map makes it easier to merge multiple exports of the same library
+    // by the same exporter.
+    var hiddenLibraryExportMaps = <String, Map<String, Export>>{};
+    _exports.exports.forEach((exporter, exports) {
+      var library = _librariesByPath[exporter];
+      // TODO(nweiz): remove this check when issue 9645 is fixed.
+      if (library == null) return;
+      if (!shouldIncludeLibrary(library)) return;
+      for (var export in exports) {
+        var library = _librariesByPath[export.path];
+        // TODO(nweiz): remove this check when issue 9645 is fixed.
+        if (library == null) continue;
+        if (shouldIncludeLibrary(library)) continue;
+
+        var hiddenExports = _exports.transitiveExports(export.path)
+            .map((transitiveExport) => export.compose(transitiveExport))
+            .toList();
+        hiddenExports.add(export);
+
+        for (var hiddenExport in hiddenExports) {
+          var exportsByExporterPath = hiddenLibraryExportMaps
+              .putIfAbsent(hiddenExport.path, () => <String, Export>{});
+          addOrMergeExport(exportsByExporterPath, exporter, hiddenExport);
+        }
+      }
+    });
+
+    // Now sort the values of the inner maps of `hiddenLibraryExportMaps` to get
+    // the final value of `_hiddenLibraryExports`.
+    var hiddenLibraryExports = <String, List<Export>>{};
+    hiddenLibraryExportMaps.forEach((exporteePath, exportsByExporterPath) {
+      int rank(Export export) {
+        if (export.show.isEmpty && export.hide.isEmpty) return 0;
+        if (export.show.isEmpty) return export.hide.length;
+        // Multiply by 1000 to ensure this sorts after an export with hides.
+        return 1000 * export.show.length;
+      }
+
+      var exports = exportsByExporterPath.values.toList();
+      exports.sort((export1, export2) {
+        var comparison = Comparable.compare(rank(export1), rank(export2));
+        if (comparison != 0) return comparison;
+
+        var library1 = _librariesByPath[export1.exporter];
+        var library2 = _librariesByPath[export2.exporter];
+        return Comparable.compare(library1.displayName, library2.displayName);
+      });
+      hiddenLibraryExports[exporteePath] = exports;
+    });
+    return hiddenLibraryExports;
+  }
+
   MdnComment lookupMdnComment(Mirror mirror) => null;
 
   void startFile(String path) {
@@ -868,6 +990,9 @@
       writeln('<div class="doc">${comment.html}</div>');
     }
 
+    // Document the visible libraries exported by this library.
+    docExports(library);
+
     // Document the top-level members.
     docMembers(library);
 
@@ -878,7 +1003,8 @@
     final typedefs = <TypedefMirror>[];
     final exceptions = <ClassMirror>[];
 
-    for (ClassMirror type in orderByName(library.classes.values)) {
+    var allClasses = _libraryClasses(library);
+    for (ClassMirror type in orderByName(allClasses)) {
       if (!showPrivate && type.isPrivate) continue;
 
       if (isException(type)) {
@@ -907,7 +1033,7 @@
     writeFooter();
     endFile();
 
-    for (final type in library.classes.values) {
+    for (final type in allClasses) {
       if (!showPrivate && type.isPrivate) continue;
 
       docType(type);
@@ -955,8 +1081,9 @@
 
     final typeTitle =
       '${typeName(type)} ${kind}';
-    writeHeader('$typeTitle / ${displayName(type.library)} Library',
-        [displayName(type.library), libraryUrl(type.library),
+    var library = _libraryFor(type);
+    writeHeader('$typeTitle / ${displayName(library)} Library',
+        [displayName(library), libraryUrl(library),
          typeName(type), typeUrl(type)]);
     writeln(
         '''
@@ -1148,6 +1275,40 @@
     return map;
   }();
 
+  void docExports(LibraryMirror library) {
+    // TODO(nweiz): show `dart:` library exports.
+    var exportLinks = _exports.transitiveExports(_libraryPath(library))
+        .map((export) {
+      var library = _librariesByPath[export.path];
+      // TODO(nweiz): remove this check when issue 9645 is fixed.
+      if (library == null) return null;
+      // Only link to publically visible libraries.
+      if (!shouldIncludeLibrary(library)) return null;
+
+      var memberNames = export.show.isEmpty ? export.hide : export.show;
+      var memberLinks = memberNames.map((name) {
+        return md.renderToHtml([resolveNameReference(
+            name, currentLibrary: library)]);
+      }).join(', ');
+      var combinator = '';
+      if (!export.show.isEmpty) {
+        combinator = ' show $memberLinks';
+      } else if (!export.hide.isEmpty) {
+        combinator = ' hide $memberLinks';
+      }
+
+      return '<ul>${a(libraryUrl(library), displayName(library))}'
+        '$combinator</ul>';
+    }).where((link) => link != null);
+
+    if (!exportLinks.isEmpty) {
+      writeln('<h3>Exports</h3>');
+      writeln('<ul>');
+      writeln(exportLinks.join('\n'));
+      writeln('</ul>');
+    }
+  }
+
   void docMembers(ContainerMirror host) {
     // Collect the different kinds of members.
     final staticMethods = [];
@@ -1160,8 +1321,10 @@
     final instanceSetters = new Map<String,MemberMirror>();
     final constructors = [];
 
-    host.members.forEach((_, MemberMirror member) {
-      if (!showPrivate && member.isPrivate) return;
+    var hostMembers = host is LibraryMirror ?
+        _libraryMembers(host) : host.members.values;
+    for (var member in hostMembers) {
+      if (!showPrivate && member.isPrivate) continue;
       if (host is LibraryMirror || member.isStatic) {
         if (member is MethodMirror) {
           if (member.isGetter) {
@@ -1175,7 +1338,7 @@
           staticGetters[member.displayName] = member;
         }
       }
-    });
+    }
 
     if (host is ClassMirror) {
       var iterable = new HierarchyIterable(host, includeType: true);
@@ -1219,28 +1382,28 @@
       if (member is MethodMirror) {
         if (member.isGetter) {
           instanceGetters[member.displayName] = member;
-          if (member.owner == host) {
+          if (_ownerFor(member) == host) {
             allPropertiesInherited = false;
           }
         } else if (member.isSetter) {
           instanceSetters[member.displayName] = member;
-          if (member.owner == host) {
+          if (_ownerFor(member) == host) {
             allPropertiesInherited = false;
           }
         } else if (member.isOperator) {
           instanceOperators.add(member);
-          if (member.owner == host) {
+          if (_ownerFor(member) == host) {
             allOperatorsInherited = false;
           }
         } else {
           instanceMethods.add(member);
-          if (member.owner == host) {
+          if (_ownerFor(member) == host) {
             allMethodsInherited = false;
           }
         }
       } else if (member is VariableMirror) {
         instanceGetters[member.displayName] = member;
-        if (member.owner == host) {
+        if (_ownerFor(member) == host) {
           allPropertiesInherited = false;
         }
       }
@@ -1305,7 +1468,7 @@
       } else {
         DocComment getterComment = getMemberComment(getter);
         DocComment setterComment = getMemberComment(setter);
-        if (getter.owner != setter.owner ||
+        if (_ownerFor(getter) != _ownerFor(setter) ||
             getterComment != null && setterComment != null) {
           // Both have comments or are not declared in the same class
           // => Documents separately.
@@ -1376,7 +1539,7 @@
     }
 
     bool showCode = includeSource && !isAbstract;
-    bool inherited = host != member.owner;
+    bool inherited = host != member.owner && member.owner is! LibraryMirror;
 
     writeln('<div class="method${inherited ? ' inherited': ''}">'
             '<h4 id="${memberAnchor(member)}">');
@@ -1467,7 +1630,7 @@
     _totalMembers++;
     _currentMember = getter;
 
-    bool inherited = host != getter.owner;
+    bool inherited = host != getter.owner && getter.owner is! LibraryMirror;
 
     writeln('<div class="field${inherited ? ' inherited' : ''}">'
             '<h4 id="${memberAnchor(getter)}">');
@@ -1674,13 +1837,13 @@
     // Always get the generic type to strip off any type parameters or
     // arguments. If the type isn't generic, genericType returns `this`, so it
     // works for non-generic types too.
-    return '${sanitize(displayName(type.library))}/'
+    return '${sanitize(displayName(_libraryFor(type)))}/'
            '${type.originalDeclaration.simpleName}.html';
   }
 
   /** Gets the URL for the documentation for [member]. */
   String memberUrl(MemberMirror member) {
-    String url = typeUrl(member.owner);
+    String url = typeUrl(_ownerFor(member));
     return '$url#${memberAnchor(member)}';
   }
 
@@ -1705,7 +1868,7 @@
    */
   annotateDynamicType(ContainerMirror enclosingType,
                       TypeMirror type) {
-    annotateType(enclosingType, type, type.isDynamic ? 'dynamic' : null);
+    annotateType(enclosingType, type, type.isDynamic ? 'dynamic ' : null);
   }
 
   /**
@@ -1759,9 +1922,10 @@
     assert(type is ClassMirror);
 
     // Link to the type.
-    if (shouldLinkToPublicApi(type.library)) {
+    var library = _libraryFor(type);
+    if (shouldLinkToPublicApi(library)) {
       write('<a href="$API_LOCATION${typeUrl(type)}">${type.simpleName}</a>');
-    } else if (shouldIncludeLibrary(type.library)) {
+    } else if (shouldIncludeLibrary(library)) {
       write(a(typeUrl(type), type.simpleName));
     } else {
       write(type.simpleName);
@@ -1979,6 +2143,86 @@
     return type.simpleName.endsWith('Exception') ||
         type.simpleName.endsWith('Error');
   }
+
+  /**
+   * Returns the absolute path to [library] on the filesystem, or `null` if the
+   * library doesn't exist on the local filesystem.
+   */
+  String _libraryPath(LibraryMirror library) =>
+    importUriToPath(library.uri, packageRoot: _packageRoot);
+
+  /**
+   * Returns a list of classes in [library], including classes it exports from
+   * hidden libraries.
+   */
+  List<ClassMirror> _libraryClasses(LibraryMirror library) =>
+    _libraryContents(library, (lib) => lib.classes.values);
+
+  /**
+   * Returns a list of top-level members in [library], including members it
+   * exports from hidden libraries.
+   */
+  List<MemberMirror> _libraryMembers(LibraryMirror library) =>
+    _libraryContents(library, (lib) => lib.members.values);
+
+
+  /**
+   * Returns a list of elements in [library], including elements it exports from
+   * hidden libraries. [fn] should return the element list for a single library,
+   * which will then be merged across all exported libraries.
+   */
+  List<DeclarationMirror> _libraryContents(LibraryMirror library,
+      List<DeclarationMirror> fn(LibraryMirror)) {
+    var contents = fn(library).toList();
+    var path = _libraryPath(library);
+    if (path == null || _exports.exports[path] == null) return contents;
+
+
+    contents.addAll(_exports.exports[path].expand((export) {
+      var exportedLibrary = _librariesByPath[export.path];
+      // TODO(nweiz): remove this check when issue 9645 is fixed.
+      if (exportedLibrary == null) return [];
+      if (shouldIncludeLibrary(exportedLibrary)) return [];
+      return fn(exportedLibrary).where((declaration) =>
+          export.isMemberVisible(declaration.displayName));
+    }));
+    return contents;
+  }
+
+  /**
+   * Returns the library in which [type] was defined. If [type] was defined in a
+   * hidden library that was exported by another library, this returns the
+   * exporter.
+   */
+  LibraryMirror _libraryFor(TypeMirror type) =>
+    _visibleLibrary(type.library, type.displayName);
+
+  /**
+   * Returns the owner of [declaration]. If [declaration]'s owner is a hidden
+   * library that was exported by another library, this returns the exporter.
+   */
+  DeclarationMirror _ownerFor(DeclarationMirror declaration) {
+    var owner = declaration.owner;
+    if (owner is! LibraryMirror) return owner;
+    return _visibleLibrary(owner, declaration.displayName);
+  }
+
+  /**
+   * Returns the best visible library that exports [name] from [library]. If
+   * [library] is public, it will be returned.
+   */
+  LibraryMirror _visibleLibrary(LibraryMirror library, String name) {
+    if (library == null) return null;
+
+    var exports = _hiddenLibraryExports[_libraryPath(library)];
+    if (exports == null) return library;
+
+    var export = exports.firstWhere(
+        (exp) => exp.isMemberVisible(name),
+        orElse: () => null);
+    if (export == null) return library;
+    return _librariesByPath[export.exporter];
+  }
 }
 
 /**
diff --git a/sdk/lib/_internal/dartdoc/lib/src/dartdoc/utils.dart b/sdk/lib/_internal/dartdoc/lib/src/dartdoc/utils.dart
index 470c9f2..02b7de7 100644
--- a/sdk/lib/_internal/dartdoc/lib/src/dartdoc/utils.dart
+++ b/sdk/lib/_internal/dartdoc/lib/src/dartdoc/utils.dart
@@ -2,9 +2,18 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of dartdoc;
-
 // Generic utility functions.
+library utils;
+
+import 'dart:io';
+import 'dart:uri';
+import 'dart:math' as math;
+
+import 'package:pathos/path.dart' as pathos;
+
+import '../../../../compiler/implementation/mirrors/mirrors.dart';
+
+import '../export_map.dart';
 
 /** Turns [name] into something that's safe to use as a file name. */
 String sanitize(String name) => name.replaceAll(':', '_').replaceAll('/', '_');
@@ -40,7 +49,7 @@
 /** Removes up to [indentation] leading whitespace characters from [text]. */
 String unindent(String text, int indentation) {
   var start;
-  for (start = 0; start < min(indentation, text.length); start++) {
+  for (start = 0; start < math.min(indentation, text.length); start++) {
     // Stop if we hit a non-whitespace character.
     if (text[start] != ' ') break;
   }
@@ -77,3 +86,76 @@
   randomAccessFile.writeStringSync(text);
   randomAccessFile.closeSync();
 }
+
+/**
+ * Converts [uri], which should come from a Dart import or export, to a local
+ * filesystem path. [basePath] is the base directory to use when converting
+ * relative URIs; without it, relative URIs will not be converted. [packageRoot]
+ * is the `packages` directory to use when converting `package:` URIs; without
+ * it, `package:` URIs will not be converted.
+ *
+ * If a URI cannot be converted, this will return `null`.
+ */
+String importUriToPath(Uri uri, {String basePath, String packageRoot}) {
+  if (uri.scheme == 'file') return fileUriToPath(uri);
+
+  if (basePath != null && uri.scheme == '') {
+    return pathos.normalize(pathos.absolute(pathos.join(basePath, uri.path)));
+  }
+
+  if (packageRoot != null && uri.scheme == 'package') {
+    return pathos.normalize(pathos.absolute(
+        pathos.join(packageRoot, uri.path)));
+  }
+
+  // Ignore unsupported schemes.
+  return null;
+}
+
+/** Converts a `file:` [Uri] to a local path string. */
+String fileUriToPath(Uri uri) {
+  if (uri.scheme != 'file') {
+    throw new ArgumentError("Uri $uri must have scheme 'file:'.");
+  }
+  if (Platform.operatingSystem != 'windows') return pathos.normalize(uri.path);
+  return pathos.normalize(uri.path.replaceFirst("/", "").replaceAll("/", "\\"));
+}
+
+/** Converts a local path string to a `file:` [Uri]. */
+Uri pathToFileUri(String path) {
+  path = pathos.absolute(path);
+  if (Platform.operatingSystem != 'windows') {
+    return Uri.parse('file://$path');
+  } else {
+    return Uri.parse('file:///${path.replaceAll("\\", "/")}');
+  }
+}
+
+/**
+ * If [map] contains an [Export] under [key], this merges that with [export].
+ * Otherwise, it sets [key] to [export].
+ */
+void addOrMergeExport(Map<String, Export> map, String key, Export export) {
+  if (map.containsKey(key)) {
+    map[key] = map[key].merge(export);
+  } else {
+    map[key] = export;
+  }
+}
+
+/// A pair of values.
+class Pair<E, F> {
+  E first;
+  F last;
+
+  Pair(this.first, this.last);
+
+  String toString() => '($first, $last)';
+
+  bool operator==(other) {
+    if (other is! Pair) return false;
+    return other.first == first && other.last == last;
+  }
+
+  int get hashCode => first.hashCode ^ last.hashCode;
+}
diff --git a/sdk/lib/_internal/dartdoc/lib/src/export_map.dart b/sdk/lib/_internal/dartdoc/lib/src/export_map.dart
new file mode 100644
index 0000000..4e892cc
--- /dev/null
+++ b/sdk/lib/_internal/dartdoc/lib/src/export_map.dart
@@ -0,0 +1,342 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// This library uses the Dart analyzer to find the exports for a set of
+/// libraries. It stores these exports in an [ExportMap]. This is used to
+/// display exported members as part of the exporting library, since dart2js
+/// doesn't provide this information itself.
+library export_map;
+
+import 'dart:io';
+import 'dart:uri';
+
+import 'package:analyzer_experimental/src/generated/ast.dart';
+import 'package:analyzer_experimental/src/generated/error.dart';
+import 'package:analyzer_experimental/src/generated/parser.dart';
+import 'package:analyzer_experimental/src/generated/scanner.dart';
+import 'package:analyzer_experimental/src/generated/source.dart';
+import 'package:pathos/path.dart' as pathos;
+
+import 'dartdoc/utils.dart';
+
+/// A class that tracks which libraries export which other libraries.
+class ExportMap {
+  /// A map from libraries to their [Export]s.
+  ///
+  /// Each key is the absolute path of a library on the filesystem, and each
+  /// value is a list of [Export]s for that library. There's guaranteed to be
+  /// only one [Export] of a given library in a given list.
+  final Map<String, List<Export>> exports;
+
+  /// A cache of the transitive exports for each library. The keys are paths to
+  /// libraries. The values are maps from the exported path to the [Export]
+  /// objects, to make it easier to merge multiple exports of the same library.
+  final _transitiveExportsByPath = <String, Map<String, Export>>{};
+
+  /// Parse an export map from a set of [libraries], which should be Dart import
+  /// [Uri]s. [packageRoot] should be the path to the `packages` directory to
+  /// use when resolving `package:` imports and libraries. Libraries that are
+  /// not available on the local machine will be ignored.
+  ///
+  /// In addition to parsing the exports in [libraries], this will parse the
+  /// exports in all libraries transitively reachable from [libraries] via
+  /// `import` or `export`.
+  factory ExportMap.parse(Iterable<Uri> libraries, String packageRoot) {
+    var exports = <String, List<Export>>{};
+
+    void traverse(String path) {
+      if (exports.containsKey(path)) return;
+
+      var importsAndExports;
+      try {
+        importsAndExports = _importsAndExportsForFile(path, packageRoot);
+      } on FileIOException catch (_) {
+        // Ignore unreadable/nonexistent files.
+        return;
+      }
+
+      var exportsForLibrary = <String, Export>{};
+      for (var export in importsAndExports.last) {
+        addOrMergeExport(exportsForLibrary, export.path, export);
+      }
+      exports[path] = new List.from(exportsForLibrary.values);
+      exports[path].map((directive) => directive.path).forEach(traverse);
+      importsAndExports.first.forEach(traverse);
+    }
+
+    for (var library in libraries) {
+      var path = importUriToPath(library, packageRoot: packageRoot);
+      if (path != null) traverse(path);
+    }
+
+    return new ExportMap._(exports);
+  }
+
+  ExportMap._(this.exports);
+
+  /// Returns a list of all the paths of exported libraries that [this] is aware
+  /// of.
+  List<String> get allExportedFiles => exports.values.expand((e) => e)
+      .map((directive) => directive.path).toList();
+
+  /// Returns a list of all exports that [library] transitively exports. This
+  /// means that if [library] exports another library that in turn exports a
+  /// third, the third library will be included in the returned list.
+  ///
+  /// This will automatically handle nested `hide` and `show` directives on the
+  /// exports, as well as merging multiple exports of the same library.
+  List<Export> transitiveExports(String library) {
+    Map<String, Export> _getTransitiveExportsByPath(String path) {
+      if (_transitiveExportsByPath.containsKey(path)) {
+        return _transitiveExportsByPath[path];
+      }
+
+      var exportsByPath = <String, Export>{};
+      _transitiveExportsByPath[path] = exportsByPath;
+      if (exports[path] == null) return exportsByPath;
+
+      for (var export in exports[path]) {
+        exportsByPath[export.path] = export;
+      }
+
+      for (var export in exports[path]) {
+        for (var subExport in _getTransitiveExportsByPath(export.path).values) {
+          subExport = export.compose(subExport);
+          if (exportsByPath.containsKey(subExport.path)) {
+            subExport = subExport.merge(exportsByPath[subExport.path]);
+          }
+          exportsByPath[subExport.path] = subExport;
+        }
+      }
+      return exportsByPath;
+    }
+
+    var path = pathos.normalize(pathos.absolute(library));
+    return _getTransitiveExportsByPath(path).values.toList();
+  }
+}
+
+/// A class that represents one library exporting another.
+class Export {
+  /// The absolute path of the library that contains this export.
+  final String exporter;
+
+  /// The absolute path of the library being exported.
+  final String path;
+
+  /// The set of identifiers that are explicitly being exported. If this is
+  /// non-empty, no identifiers other than these will be visible.
+  ///
+  /// One or both of [show] and [hide] will always be empty.
+  Set<String> get show => _show;
+  Set<String> _show;
+
+  /// The set of identifiers that are not exported.
+  ///
+  /// One or both of [show] and [hide] will always be empty.
+  Set<String> get hide => _hide;
+  Set<String> _hide;
+
+  /// Whether or not members exported are hidden by default.
+  bool get _hideByDefault => !show.isEmpty;
+
+  /// Creates a new export.
+  ///
+  /// This will normalize [show] and [hide] so that if both are non-empty, only
+  /// [show] will be set.
+  Export(this.exporter, this.path, {Iterable<String> show,
+      Iterable<String> hide}) {
+    _show = new Set<String>.from(show == null ? [] : show);
+    _hide = new Set<String>.from(hide == null ? [] : hide);
+
+    if (!_show.isEmpty) {
+      _show.removeAll(_hide);
+      _hide = new Set<String>();
+    }
+  }
+
+  /// Returns a new [Export] that represents [this] composed with [nested], as
+  /// though [this] was used to export a library that in turn exported [nested].
+  Export compose(Export nested) {
+    var show = new Set<String>();
+    var hide = new Set<String>();
+
+    if (this._hideByDefault) {
+      show.addAll(this.show);
+      if (nested._hideByDefault) {
+        show.retainAll(nested.show);
+      } else {
+        show.removeAll(nested.hide);
+      }
+    } else if (nested._hideByDefault) {
+      show.addAll(nested.show);
+      show.removeAll(this.hide);
+    } else {
+      hide.addAll(this.hide);
+      hide.addAll(nested.hide);
+    }
+
+    return new Export(this.exporter, nested.path, show: show, hide: hide);
+  }
+
+  /// Returns a new [Export] that merges [this] with [nested], as though both
+  /// exports were included in the same library.
+  ///
+  /// [this] and [other] must have the same values for [exporter] and [path].
+  Export merge(Export other) {
+    if (this.path != other.path) {
+      throw new ArgumentError("Can't merge two Exports with different paths: "
+          "export '$path' from '$exporter' and export '${other.path}' from "
+          "'${other.exporter}'.");
+    } if (this.exporter != other.exporter) {
+      throw new ArgumentError("Can't merge two Exports with different "
+          "exporters: export '$path' from '$exporter' and export "
+          "'${other.path}' from '${other.exporter}'.");
+    }
+
+    var show = new Set<String>();
+    var hide = new Set<String>();
+
+    if (this._hideByDefault) {
+      if (other._hideByDefault) {
+        show.addAll(this.show);
+        show.addAll(other.show);
+      } else {
+        hide.addAll(other.hide);
+        hide.removeAll(this.show);
+      }
+    } else {
+      hide.addAll(this.hide);
+      if (other._hideByDefault) {
+        hide.removeAll(other.show);
+      } else {
+        hide.retainAll(other.hide);
+      }
+    }
+
+    return new Export(exporter, path, show: show, hide: hide);
+  }
+
+  /// Returns whether or not a member named [name] is visible through this
+  /// import, as goverend by [show] and [hide].
+  bool isMemberVisible(String name) =>
+    _hideByDefault ? show.contains(name) : !hide.contains(name);
+
+  bool operator==(other) => other is Export && other.exporter == exporter &&
+      other.path == path && show.containsAll(other.show) &&
+      other.show.containsAll(show) && hide.containsAll(other.hide) &&
+      other.hide.containsAll(hide);
+
+  int get hashCode {
+    var hashCode = exporter.hashCode ^ path.hashCode;
+    hashCode = show.reduce(hashCode, (hash, name) => hash ^ name.hashCode);
+    return hide.reduce(hashCode, (hash, name) => hash ^ name.hashCode);
+  }
+
+  String toString() {
+    var combinator = '';
+    if (!show.isEmpty) {
+      combinator = ' show ${show.join(', ')}';
+    } else if (!hide.isEmpty) {
+      combinator = ' hide ${hide.join(', ')}';
+    }
+    return "export '$path'$combinator (from $exporter)";
+  }
+}
+
+/// Returns a list of imports and a list of exports for the dart library at
+/// [file]. [packageRoot] is used to resolve `package:` URLs.
+///
+/// The imports are a list of absolute paths, while the exports are [Export]
+/// objects.
+Pair<List<String>, List<Export>> _importsAndExportsForFile(String file,
+    String packageRoot) {
+  var collector = new _ImportExportCollector();
+  _parseFile(file).accept(collector);
+
+  var imports = collector.imports.map((import) {
+    return _pathForDirective(import, pathos.dirname(file), packageRoot);
+  }).where((import) => import != null).toList();
+
+  var exports = collector.exports.map((export) {
+    var path = _pathForDirective(export, pathos.dirname(file), packageRoot);
+    if (path == null) return null;
+
+    path = pathos.normalize(pathos.absolute(path));
+    var show = export.combinators
+        .where((combinator) => combinator is ShowCombinator)
+        .expand((combinator) => combinator.shownNames.map((name) => name.name));
+    var hide = export.combinators
+        .where((combinator) => combinator is HideCombinator)
+        .expand((combinator) =>
+            combinator.hiddenNames.map((name) => name.name));
+
+    return new Export(file, path, show: show, hide: hide);
+  }).where((export) => export != null).toList();
+
+  return new Pair<List<String>, List<Export>>(imports, exports);
+}
+
+/// Returns the absolute path to the library imported by [directive], or `null`
+/// if it doesn't refer to a file on the local filesystem.
+///
+/// [basePath] is the path from which relative imports should be resolved.
+/// [packageRoot] is the path from which `package:` imports should be resolved.
+String _pathForDirective(NamespaceDirective directive, String basePath,
+    String packageRoot) {
+  var uri = Uri.parse(_stringLiteralToString(directive.uri));
+  var path = importUriToPath(uri, basePath: basePath, packageRoot: packageRoot);
+  if (path == null) return null;
+  return pathos.normalize(pathos.absolute(path));
+}
+
+/// Parses a Dart file into an AST.
+CompilationUnit _parseFile(String path) {
+  var contents = new File(path).readAsStringSync();
+  var errorCollector = new _ErrorCollector();
+  var scanner = new StringScanner(null, contents, errorCollector);
+  var token = scanner.tokenize();
+  var parser = new Parser(null, errorCollector);
+  var unit = parser.parseCompilationUnit(token);
+  unit.lineInfo = new LineInfo(scanner.lineStarts);
+
+  if (!errorCollector.errors.isEmpty) {
+    throw new FormatException(
+        errorCollector.errors.map((e) => e.toString()).join("\n"));
+  }
+
+  return unit;
+}
+
+/// A simple error listener that collects errors into a list.
+class _ErrorCollector extends AnalysisErrorListener {
+  final errors = <AnalysisError>[];
+
+  _ErrorCollector();
+
+  void onError(AnalysisError error) => errors.add(error);
+}
+
+/// A simple visitor that collects import and export nodes.
+class _ImportExportCollector extends GeneralizingASTVisitor {
+  final imports = <ImportDirective>[];
+  final exports = <ExportDirective>[];
+
+  _ImportExportCollector();
+
+  visitImportDirective(ImportDirective node) => imports.add(node);
+  visitExportDirective(ExportDirective node) => exports.add(node);
+}
+
+// TODO(nweiz): fold this into the analyzer (issue 9781).
+/// Converts an AST node representing a string literal into a [String].
+String _stringLiteralToString(StringLiteral literal) {
+  if (literal is AdjacentStrings) {
+    return literal.strings.map(_stringLiteralToString).join();
+  } else if (literal is SimpleStringLiteral) {
+    return literal.value;
+  } else {
+    throw new ArgumentError('Unknown string type for $literal');
+  }
+}
diff --git a/sdk/lib/_internal/dartdoc/lib/src/json_serializer.dart b/sdk/lib/_internal/dartdoc/lib/src/json_serializer.dart
index 882f6b2..e197b0b 100755
--- a/sdk/lib/_internal/dartdoc/lib/src/json_serializer.dart
+++ b/sdk/lib/_internal/dartdoc/lib/src/json_serializer.dart
@@ -54,7 +54,7 @@
   // TODO(jacobr): this code works only because futures for mirrors return
   // immediately.
   for(String memberName in members) {
-    var result = deprecatedFutureValue(mirror.getField(memberName));
+    var result = deprecatedFutureValue(mirror.getFieldAsync(memberName));
     _serialize(memberName, result.reflectee, printer);
   }
   printer.endObject();
diff --git a/sdk/lib/_internal/dartdoc/pubspec.yaml b/sdk/lib/_internal/dartdoc/pubspec.yaml
index b28d984..6614786 100644
--- a/sdk/lib/_internal/dartdoc/pubspec.yaml
+++ b/sdk/lib/_internal/dartdoc/pubspec.yaml
@@ -3,6 +3,7 @@
  Libraries for generating documentation from Dart source code.
 
 dependencies:
+  analyzer_experimental: ">=0.4.5 <1.0.0"
   args: ">=0.4.2 <1.0.0"
   pathos: ">=0.4.2 <1.0.0"
 
diff --git a/sdk/lib/_internal/dartdoc/test/dartdoc_search_test.dart b/sdk/lib/_internal/dartdoc/test/dartdoc_search_test.dart
index 017633f..7731a2b 100644
--- a/sdk/lib/_internal/dartdoc/test/dartdoc_search_test.dart
+++ b/sdk/lib/_internal/dartdoc/test/dartdoc_search_test.dart
@@ -5,6 +5,7 @@
 library dartdoc_search_test;
 
 // TODO(rnystrom): Use "package:" URL (#4968).
+import '../../../../../pkg/expect/lib/expect.dart';
 import '../lib/src/dartdoc/nav.dart';
 import '../lib/src/client/search.dart';
 
diff --git a/sdk/lib/_internal/dartdoc/test/dartdoc_test.dart b/sdk/lib/_internal/dartdoc/test/dartdoc_test.dart
index c32c47f..60eb3ac 100644
--- a/sdk/lib/_internal/dartdoc/test/dartdoc_test.dart
+++ b/sdk/lib/_internal/dartdoc/test/dartdoc_test.dart
@@ -17,42 +17,6 @@
 import 'markdown_test.dart';
 
 main() {
-  group('countOccurrences', () {
-    test('empty text returns 0', () {
-      expect(dd.countOccurrences('', 'needle'), equals(0));
-    });
-
-    test('one occurrence', () {
-      expect(dd.countOccurrences('bananarama', 'nara'), equals(1));
-    });
-
-    test('multiple occurrences', () {
-      expect(dd.countOccurrences('bananarama', 'a'), equals(5));
-    });
-
-    test('overlapping matches do not count', () {
-      expect(dd.countOccurrences('bananarama', 'ana'), equals(1));
-    });
-  });
-
-  group('repeat', () {
-    test('zero times returns an empty string', () {
-      expect(dd.repeat('ba', 0), isEmpty);
-    });
-
-    test('one time returns the string', () {
-      expect(dd.repeat('ba', 1), equals('ba'));
-    });
-
-    test('multiple times', () {
-      expect(dd.repeat('ba', 3), equals('bababa'));
-    });
-
-    test('multiple times with a separator', () {
-      expect(dd.repeat('ba', 3, separator: ' '), equals('ba ba ba'));
-    });
-  });
-
   group('isAbsolute', () {
     final doc = new dd.Dartdoc();
 
diff --git a/sdk/lib/_internal/dartdoc/test/export_map_test.dart b/sdk/lib/_internal/dartdoc/test/export_map_test.dart
new file mode 100644
index 0000000..9ac4288
--- /dev/null
+++ b/sdk/lib/_internal/dartdoc/test/export_map_test.dart
@@ -0,0 +1,400 @@
+// 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 'dart:io';
+import 'dart:uri';
+
+import 'package:pathos/path.dart' as pathos;
+import 'package:unittest/unittest.dart';
+
+import '../lib/src/export_map.dart';
+import '../lib/src/dartdoc/utils.dart';
+
+String tempDir;
+
+main() {
+  group('ExportMap', () {
+    setUp(createTempDir);
+    tearDown(deleteTempDir);
+
+    test('with an empty library', () {
+      createLibrary('lib.dart');
+      var map = parse(['lib.dart']);
+
+      var expectedExports = {};
+      expectedExports[libPath('lib.dart')] = [];
+      expect(map.exports, equals(expectedExports));
+      expect(map.allExportedFiles, isEmpty);
+      expect(map.transitiveExports(libPath('lib.dart')), isEmpty);
+      expect(map.transitiveExports(libPath('nonexistent.dart')), isEmpty);
+    });
+
+    test('with one library with one export', () {
+      createLibrary('a.dart', 'export "b.dart";');
+      createLibrary('b.dart');
+      var map = parse(['a.dart']);
+
+      expect(map.exports[libPath('a.dart')], unorderedEquals([
+        new Export(libPath('a.dart'), libPath('b.dart'))
+      ]));
+
+      expect(map.transitiveExports(libPath('a.dart')), unorderedEquals([
+        new Export(libPath('a.dart'), libPath('b.dart'))
+      ]));
+
+      expect(map.allExportedFiles, unorderedEquals([libPath('b.dart')]));
+
+      expect(map.exports[libPath('b.dart')], isEmpty);
+      expect(map.transitiveExports(libPath('b.dart')), isEmpty);
+    });
+
+    test('with one library with multiple exports', () {
+      createLibrary('a.dart', 'export "b.dart";\nexport "c.dart";');
+      createLibrary('b.dart');
+      createLibrary('c.dart');
+      var map = parse(['a.dart']);
+
+      expect(map.exports[libPath('a.dart')], unorderedEquals([
+        new Export(libPath('a.dart'), libPath('b.dart')),
+        new Export(libPath('a.dart'), libPath('c.dart'))
+      ]));
+
+      expect(map.transitiveExports(libPath('a.dart')), unorderedEquals([
+        new Export(libPath('a.dart'), libPath('b.dart')),
+        new Export(libPath('a.dart'), libPath('c.dart'))
+      ]));
+
+      expect(map.allExportedFiles, unorderedEquals([
+        libPath('b.dart'), libPath('c.dart')
+      ]));
+
+      expect(map.exports[libPath('b.dart')], isEmpty);
+      expect(map.transitiveExports(libPath('b.dart')), isEmpty);
+      expect(map.exports[libPath('c.dart')], isEmpty);
+      expect(map.transitiveExports(libPath('c.dart')), isEmpty);
+    });
+
+    test('with two libraries each with one export', () {
+      createLibrary('a.dart', 'export "a_export.dart";');
+      createLibrary('b.dart', 'export "b_export.dart";');
+      createLibrary('a_export.dart');
+      createLibrary('b_export.dart');
+      var map = parse(['a.dart', 'b.dart']);
+
+      expect(map.exports[libPath('a.dart')], unorderedEquals([
+        new Export(libPath('a.dart'), libPath('a_export.dart')),
+      ]));
+      expect(map.transitiveExports(libPath('a.dart')), unorderedEquals([
+        new Export(libPath('a.dart'), libPath('a_export.dart')),
+      ]));
+
+      expect(map.transitiveExports(libPath('b.dart')), unorderedEquals([
+        new Export(libPath('b.dart'), libPath('b_export.dart')),
+      ]));
+      expect(map.exports[libPath('b.dart')], unorderedEquals([
+        new Export(libPath('b.dart'), libPath('b_export.dart'))
+      ]));
+
+      expect(map.allExportedFiles, unorderedEquals([
+        libPath('a_export.dart'), libPath('b_export.dart')
+      ]));
+
+      expect(map.exports[libPath('a_export.dart')], isEmpty);
+      expect(map.transitiveExports(libPath('a_export.dart')), isEmpty);
+      expect(map.exports[libPath('b_export.dart')], isEmpty);
+      expect(map.transitiveExports(libPath('b_export.dart')), isEmpty);
+    });
+
+    test('with a transitive export', () {
+      createLibrary('a.dart', 'export "b.dart";');
+      createLibrary('b.dart', 'export "c.dart";');
+      createLibrary('c.dart');
+      var map = parse(['a.dart']);
+
+      expect(map.exports[libPath('a.dart')], unorderedEquals([
+        new Export(libPath('a.dart'), libPath('b.dart')),
+      ]));
+      expect(map.transitiveExports(libPath('a.dart')), unorderedEquals([
+        new Export(libPath('a.dart'), libPath('b.dart')),
+        new Export(libPath('a.dart'), libPath('c.dart')),
+      ]));
+
+      expect(map.exports[libPath('b.dart')], unorderedEquals([
+        new Export(libPath('b.dart'), libPath('c.dart')),
+      ]));
+      expect(map.transitiveExports(libPath('b.dart')), unorderedEquals([
+        new Export(libPath('b.dart'), libPath('c.dart')),
+      ]));
+
+      expect(map.allExportedFiles, unorderedEquals([
+        libPath('b.dart'), libPath('c.dart')
+      ]));
+
+      expect(map.exports[libPath('c.dart')], isEmpty);
+      expect(map.transitiveExports(libPath('c.dart')), isEmpty);
+    });
+
+    test('with an export through an import', () {
+      createLibrary('a.dart', 'import "b.dart";');
+      createLibrary('b.dart', 'export "c.dart";');
+      createLibrary('c.dart');
+      var map = parse(['a.dart']);
+
+      expect(map.exports[libPath('b.dart')], unorderedEquals([
+        new Export(libPath('b.dart'), libPath('c.dart')),
+      ]));
+      expect(map.transitiveExports(libPath('b.dart')), unorderedEquals([
+        new Export(libPath('b.dart'), libPath('c.dart')),
+      ]));
+
+      expect(map.allExportedFiles, unorderedEquals([libPath('c.dart')]));
+
+      expect(map.exports[libPath('a.dart')], isEmpty);
+      expect(map.exports[libPath('c.dart')], isEmpty);
+      expect(map.transitiveExports(libPath('a.dart')), isEmpty);
+      expect(map.transitiveExports(libPath('c.dart')), isEmpty);
+    });
+
+    test('with an export with a show combinator', () {
+      createLibrary('a.dart', 'export "b.dart" show x, y;');
+      createLibrary('b.dart');
+      var map = parse(['a.dart']);
+
+      expect(map.exports[libPath('a.dart')], unorderedEquals([
+        new Export(libPath('a.dart'), libPath('b.dart'), show: ['x', 'y'])
+      ]));
+    });
+
+    test('with an export with a hide combinator', () {
+      createLibrary('a.dart', 'export "b.dart" hide x, y;');
+      createLibrary('b.dart');
+      var map = parse(['a.dart']);
+
+      expect(map.exports[libPath('a.dart')], unorderedEquals([
+        new Export(libPath('a.dart'), libPath('b.dart'), hide: ['x', 'y'])
+      ]));
+    });
+
+    test('with an export with a show and a hide combinator', () {
+      createLibrary('a.dart', 'export "b.dart" show x, y hide y, z;');
+      createLibrary('b.dart');
+      var map = parse(['a.dart']);
+
+      expect(map.exports[libPath('a.dart')], unorderedEquals([
+        new Export(libPath('a.dart'), libPath('b.dart'), show: ['x'])
+      ]));
+    });
+
+    test('composes transitive exports', () {
+      createLibrary('a.dart', 'export "b.dart" hide x;');
+      createLibrary('b.dart', 'export "c.dart" hide y;');
+      createLibrary('c.dart');
+      var map = parse(['a.dart']);
+
+      expect(map.transitiveExports(libPath('a.dart')), unorderedEquals([
+        new Export(libPath('a.dart'), libPath('b.dart'), hide: ['x']),
+        new Export(libPath('a.dart'), libPath('c.dart'), hide: ['x', 'y'])
+      ]));
+    });
+
+    test('merges adjacent exports', () {
+      createLibrary('a.dart', '''
+          export "b.dart" show x, y;
+          export "b.dart" hide y, z;
+      ''');
+      createLibrary('b.dart');
+      var map = parse(['a.dart']);
+
+      expect(map.exports[libPath('a.dart')], unorderedEquals([
+        new Export(libPath('a.dart'), libPath('b.dart'), hide: ['z']),
+      ]));
+      expect(map.transitiveExports(libPath('a.dart')), unorderedEquals([
+        new Export(libPath('a.dart'), libPath('b.dart'), hide: ['z']),
+      ]));
+    });
+
+    test('merges adjacent exports transitively', () {
+      createLibrary('a.dart', 'export "b.dart";\nexport "c.dart";');
+      createLibrary('b.dart', 'export "d.dart" show x, y;');
+      createLibrary('c.dart', 'export "d.dart" hide y, z;');
+      createLibrary('d.dart');
+      var map = parse(['a.dart']);
+
+      expect(map.exports[libPath('a.dart')], unorderedEquals([
+        new Export(libPath('a.dart'), libPath('b.dart')),
+        new Export(libPath('a.dart'), libPath('c.dart')),
+      ]));
+      expect(map.transitiveExports(libPath('a.dart')), unorderedEquals([
+        new Export(libPath('a.dart'), libPath('b.dart')),
+        new Export(libPath('a.dart'), libPath('c.dart')),
+        new Export(libPath('a.dart'), libPath('d.dart'), hide: ['z']),
+      ]));
+    });
+
+    test('resolves package: exports', () {
+      createLibrary('a.dart', 'export "package:b/b.dart";');
+      var bPath = pathos.join('packages', 'b', 'b.dart');
+      createLibrary(bPath);
+      var map = parse(['a.dart']);
+
+      expect(map.exports[libPath('a.dart')], unorderedEquals([
+        new Export(libPath('a.dart'), libPath(bPath))
+      ]));
+    });
+
+    test('ignores dart: exports', () {
+      createLibrary('a.dart', 'export "dart:async";');
+      var map = parse(['a.dart']);
+      expect(map.exports[libPath('a.dart')], isEmpty);
+    });
+
+    test('.parse() resolves package: imports', () {
+      var aPath = pathos.join('packages', 'a', 'a.dart');
+      createLibrary(aPath, 'export "package:b/b.dart";');
+      var bPath = pathos.join('packages', 'b', 'b.dart');
+      createLibrary(bPath);
+      var map = new ExportMap.parse(
+          [Uri.parse('package:a/a.dart')],
+          pathos.join(tempDir, 'packages'));
+
+      expect(map.exports[libPath(aPath)], unorderedEquals([
+        new Export(libPath(aPath), libPath(bPath))
+      ]));
+    });
+
+    test('.parse() ignores dart: imports', () {
+      var map = new ExportMap.parse(
+          [Uri.parse('dart:async')],
+          pathos.join(tempDir, 'packages'));
+      expect(map.exports, isEmpty);
+    });
+  });
+
+  group('Export', () {
+    test('normalizes hide and show', () {
+      expect(new Export('', '', show: ['x', 'y'], hide: ['y', 'z']),
+          equals(new Export('', '', show: ['x'])));
+    });
+
+    test("doesn't care about the order of show or hide", () {
+      expect(new Export('', '', show: ['x', 'y']),
+          equals(new Export('', '', show: ['y', 'x'])));
+      expect(new Export('', '', hide: ['x', 'y']),
+          equals(new Export('', '', hide: ['y', 'x'])));
+    });
+
+    test('with no combinators considers anything visible', () {
+      var export = new Export('', '');
+      expect(export.isMemberVisible('x'), isTrue);
+      expect(export.isMemberVisible('y'), isTrue);
+      expect(export.isMemberVisible('z'), isTrue);
+    });
+
+    test('with hide combinators considers anything not hidden visible', () {
+      var export = new Export('', '', hide: ['x', 'y']);
+      expect(export.isMemberVisible('x'), isFalse);
+      expect(export.isMemberVisible('y'), isFalse);
+      expect(export.isMemberVisible('z'), isTrue);
+    });
+
+    test('with show combinators considers anything not shown invisible', () {
+      var export = new Export('', '', show: ['x', 'y']);
+      expect(export.isMemberVisible('x'), isTrue);
+      expect(export.isMemberVisible('y'), isTrue);
+      expect(export.isMemberVisible('z'), isFalse);
+    });
+
+    test('composing uses the parent exporter and child path', () {
+      expect(new Export('exporter1.dart', 'path1.dart')
+              .compose(new Export('exporter2.dart', 'path2.dart')),
+          equals(new Export('exporter1.dart', 'path2.dart')));
+    });
+
+    test('composing show . show takes the intersection', () {
+      expect(new Export('', '', show: ['x', 'y'])
+              .compose(new Export('', '', show: ['y', 'z'])),
+          equals(new Export('', '', show: ['y'])));
+    });
+
+    test('composing show . hide takes the difference', () {
+      expect(new Export('', '', show: ['x', 'y'])
+              .compose(new Export('', '', hide: ['y', 'z'])),
+          equals(new Export('', '', show: ['x'])));
+    });
+
+    test('composing hide . show takes the reverse difference', () {
+      expect(new Export('', '', hide: ['x', 'y'])
+              .compose(new Export('', '', show: ['y', 'z'])),
+          equals(new Export('', '', show: ['z'])));
+    });
+
+    test('composing hide . hide takes the union', () {
+      expect(new Export('', '', hide: ['x', 'y'])
+              .compose(new Export('', '', hide: ['y', 'z'])),
+          equals(new Export('', '', hide: ['x', 'y', 'z'])));
+    });
+
+    test('merging requires identical exporters and paths', () {
+      expect(() => new Export('exporter1.dart', '')
+              .merge(new Export('exporter2.dart', '')),
+          throwsA(isArgumentError));
+      expect(() => new Export('', 'path1.dart')
+              .merge(new Export('', 'path2.dart')),
+          throwsA(isArgumentError));
+      expect(new Export('', '').merge(new Export('', '')),
+          equals(new Export('', '')));
+    });
+
+    test('merging show + show takes the union', () {
+      expect(new Export('', '', show: ['x', 'y'])
+              .merge(new Export('', '', show: ['y', 'z'])),
+          equals(new Export('', '', show: ['x', 'y', 'z'])));
+    });
+
+    test('merging show + hide takes the difference', () {
+      expect(new Export('', '', show: ['x', 'y'])
+              .merge(new Export('', '', hide: ['y', 'z'])),
+          equals(new Export('', '', hide: ['z'])));
+    });
+
+    test('merging hide + show takes the difference', () {
+      expect(new Export('', '', hide: ['x', 'y'])
+              .merge(new Export('', '', show: ['y', 'z'])),
+          equals(new Export('', '', hide: ['x'])));
+    });
+
+    test('merging hide + hide takes the intersection', () {
+      expect(new Export('', '', hide: ['x', 'y'])
+              .merge(new Export('', '', hide: ['y', 'z'])),
+          equals(new Export('', '', hide: ['y'])));
+    });
+  });
+}
+
+ExportMap parse(List<String> libraries) {
+  return new ExportMap.parse(
+      libraries.map(libPath)
+          .map(pathToFileUri),
+      pathos.join(tempDir, 'packages'));
+}
+
+void createLibrary(String name, [String contents]) {
+  if (contents == null) contents = '';
+  new Directory(pathos.dirname(libPath(name))).createSync(recursive: true);
+  new File(libPath(name)).writeAsStringSync('''
+      library ${pathos.basename(name)};
+      $contents
+  ''');
+}
+
+String libPath(String name) => pathos.normalize(pathos.join(tempDir, name));
+
+void createTempDir() {
+  tempDir = new Directory('').createTempSync().path;
+  new Directory(pathos.join(tempDir, 'packages')).createSync();
+}
+
+void deleteTempDir() {
+  new Directory(tempDir).deleteSync(recursive: true);
+}
diff --git a/sdk/lib/_internal/dartdoc/test/utils_test.dart b/sdk/lib/_internal/dartdoc/test/utils_test.dart
new file mode 100644
index 0000000..fae4eec
--- /dev/null
+++ b/sdk/lib/_internal/dartdoc/test/utils_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:unittest/unittest.dart';
+
+import '../lib/src/dartdoc/utils.dart';
+
+void main() {
+  group('countOccurrences', () {
+    test('empty text returns 0', () {
+      expect(countOccurrences('', 'needle'), equals(0));
+    });
+
+    test('one occurrence', () {
+      expect(countOccurrences('bananarama', 'nara'), equals(1));
+    });
+
+    test('multiple occurrences', () {
+      expect(countOccurrences('bananarama', 'a'), equals(5));
+    });
+
+    test('overlapping matches do not count', () {
+      expect(countOccurrences('bananarama', 'ana'), equals(1));
+    });
+  });
+
+  group('repeat', () {
+    test('zero times returns an empty string', () {
+      expect(repeat('ba', 0), isEmpty);
+    });
+
+    test('one time returns the string', () {
+      expect(repeat('ba', 1), equals('ba'));
+    });
+
+    test('multiple times', () {
+      expect(repeat('ba', 3), equals('bababa'));
+    });
+
+    test('multiple times with a separator', () {
+      expect(repeat('ba', 3, separator: ' '), equals('ba ba ba'));
+    });
+  });
+}
diff --git a/sdk/lib/async/async.dart b/sdk/lib/async/async.dart
index c447440..7d22e8b 100644
--- a/sdk/lib/async/async.dart
+++ b/sdk/lib/async/async.dart
@@ -5,7 +5,6 @@
 library dart.async;
 
 part 'async_error.dart';
-part 'collection_sink.dart';
 part 'deferred_load.dart';
 part 'event_loop.dart';
 part 'future.dart';
diff --git a/sdk/lib/async/async_sources.gypi b/sdk/lib/async/async_sources.gypi
index a10ee93..b39435a 100644
--- a/sdk/lib/async/async_sources.gypi
+++ b/sdk/lib/async/async_sources.gypi
@@ -8,7 +8,6 @@
     'async.dart',
     # The above file needs to be first as it lists the parts below.
     'async_error.dart',
-    'collection_sink.dart',
     'deferred_load.dart',
     'event_loop.dart',
     'future.dart',
diff --git a/sdk/lib/async/collection_sink.dart b/sdk/lib/async/collection_sink.dart
deleted file mode 100644
index 4ecb831..0000000
--- a/sdk/lib/async/collection_sink.dart
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.async;
-
-typedef void _CollectionSinkCallback<T>(Collection<T> collection);
-typedef void _CollectionSinkErrorCallback(AsyncError error);
-
-/**
- * EventSink that stores incoming data in a collection.
- *
- * *Deprecated*.
- */
-class CollectionSink<T> extends StreamSink<T> {
-  // TODO(8997): Implement EventSink instead.
-  final Collection<T> collection;
-  final _CollectionSinkCallback<T> _callback;
-  final _CollectionSinkErrorCallback _errorCallback;
-  bool _isClosed = false;
-
-  /**
-   * Create a sink that stores incoming values in a collection.
-   *
-   * The [collection] is the collection to add the values to.
-   *
-   * If [callback] is provided, then it's called with the collection as arugment
-   * when the sink's [close] method is called.
-   */
-  CollectionSink(this.collection,
-                { void onClose(Collection<T> collection),
-                  void onError(AsyncError error) })
-      : this._callback = onClose,
-        this._errorCallback = onError;
-
-  add(T value) {
-    if (_isClosed) throw new StateError("Adding to closed sink");
-    collection.add(value);
-  }
-
-  void addError(AsyncError error) {
-    if (_isClosed) throw new StateError("Adding error to closed sink");
-    if (_errorCallback != null) _errorCallback(error);
-  }
-
-  void close() {
-    if (_isClosed) throw new StateError("Closing closed sink");
-    _isClosed = true;
-    if (_callback != null) _callback(collection);
-  }
-}
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index e7a5ab6..7da4451 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -132,7 +132,7 @@
           }
         },
         onSubscriptionStateChange: () {
-          if (controller.hasSubscribers) {
+          if (controller.hasListener) {
             watch.start();
             startPeriodicTimer();
           } else {
@@ -236,7 +236,7 @@
   /**
    * Binds this stream as the input of the provided [StreamConsumer].
    */
-  Future pipe(StreamConsumer<T, dynamic> streamConsumer) {
+  Future pipe(StreamConsumer<T> streamConsumer) {
     // TODO(floitsch): switch to:
     // streamConsumer.addStream(this).then((_) => streamConsumer.close());
     return streamConsumer.consume(this);
@@ -253,12 +253,36 @@
 
   /**
    * Reduces a sequence of values by repeatedly applying [combine].
-   *
-   * *WARNING UPCOMING API-CHANGE*: This method will be changed so that
-   * it doesn't take an initial value. Use [fold] instead.
    */
-  Future reduce(var initialValue, combine(var previous, T element)) {
-    return fold(initialValue, combine);
+  Future<T> reduce(T combine(T previous, T element)) {
+    _FutureImpl<T> result = new _FutureImpl<T>();
+    bool seenFirst = false;
+    T value;
+    StreamSubscription subscription;
+    subscription = this.listen(
+      // TODO(ahe): Restore type when feature is implemented in dart2js
+      // checked mode. http://dartbug.com/7733
+      (/* T */ element) {
+        if (seenFirst) {
+          _runUserCode(() => combine(value, element),
+                       (T newValue) { value = newValue; },
+                       _cancelAndError(subscription, result));
+        } else {
+          value = element;
+          seenFirst = true;
+        }
+      },
+      onError: result._setError,
+      onDone: () {
+        if (!seenFirst) {
+          result._setError(new AsyncError(new StateError("No elements")));
+        } else {
+          result._setValue(value);
+        }
+      },
+      unsubscribeOnError: true
+    );
+    return result;
   }
 
   /** Reduces a sequence of values by repeatedly applying [combine]. */
@@ -272,7 +296,7 @@
       (/*T*/ element) {
         _runUserCode(
           () => combine(value, element),
-          (result) { value = result; },
+          (newValue) { value = newValue; },
           _cancelAndError(subscription, result)
         );
       },
@@ -286,23 +310,6 @@
     return result;
   }
 
-  // Deprecated method, previously called 'pipe', retained for compatibility.
-  Future pipeInto(EventSink<T> sink,
-                  {void onError(AsyncError error),
-                   bool unsubscribeOnError}) {
-    _FutureImpl<T> result = new _FutureImpl<T>();
-    this.listen(
-        sink.add,
-        onError: sink.addError,
-        onDone: () {
-          sink.close();
-          result._setValue(null);
-        },
-        unsubscribeOnError: unsubscribeOnError);
-    return result;
-  }
-
-
   /**
    * Checks whether [match] occurs in the elements provided by this stream.
    *
@@ -414,98 +421,6 @@
     return future;
   }
 
-  /**
-   * Finds the least element in the stream.
-   *
-   * If the stream is empty, the result is [:null:].
-   * Otherwise the result is a value from the stream that is not greater
-   * than any other value from the stream (according to [compare], which must
-   * be a [Comparator]).
-   *
-   * If [compare] is omitted, it defaults to [Comparable.compare].
-   *
-   * *Deprecated*. Use [reduce] with a binary min method if needed.
-   */
-  Future<T> min([int compare(T a, T b)]) {
-    if (compare == null) {
-      var defaultCompare = Comparable.compare;
-      compare = defaultCompare;
-    }
-    _FutureImpl<T> future = new _FutureImpl<T>();
-    StreamSubscription subscription;
-    T min = null;
-    subscription = this.listen(
-      // TODO(ahe): Restore type when feature is implemented in dart2js
-      // checked mode. http://dartbug.com/7733
-      (/*T*/ value) {
-        min = value;
-        subscription.onData((T value) {
-          _runUserCode(
-            () => compare(min, value) > 0,
-            (bool foundSmaller) {
-              if (foundSmaller) {
-                min = value;
-              }
-            },
-            _cancelAndError(subscription, future)
-          );
-        });
-      },
-      onError: future._setError,
-      onDone: () {
-        future._setValue(min);
-      },
-      unsubscribeOnError: true
-    );
-    return future;
-  }
-
-  /**
-   * Finds the largest element in the stream.
-   *
-   * If the stream is empty, the result is [:null:].
-   * Otherwise the result is an value from the stream that is not smaller
-   * than any other value from the stream (according to [compare], which must
-   * be a [Comparator]).
-   *
-   * If [compare] is omitted, it defaults to [Comparable.compare].
-   *
-   * *Deprecated*. Use [reduce] with a binary max method if needed.
-   */
-  Future<T> max([int compare(T a, T b)]) {
-    if (compare == null)  {
-      var defaultCompare = Comparable.compare;
-      compare = defaultCompare;
-    }
-    _FutureImpl<T> future = new _FutureImpl<T>();
-    StreamSubscription subscription;
-    T max = null;
-    subscription = this.listen(
-      // TODO(ahe): Restore type when feature is implemented in dart2js
-      // checked mode. http://dartbug.com/7733
-      (/*T*/ value) {
-        max = value;
-        subscription.onData((T value) {
-          _runUserCode(
-            () => compare(max, value) < 0,
-            (bool foundGreater) {
-              if (foundGreater) {
-                max = value;
-              }
-            },
-            _cancelAndError(subscription, future)
-          );
-        });
-      },
-      onError: future._setError,
-      onDone: () {
-        future._setValue(max);
-      },
-      unsubscribeOnError: true
-    );
-    return future;
-  }
-
   /** Reports whether this stream contains any elements. */
   Future<bool> get isEmpty {
     _FutureImpl<bool> future = new _FutureImpl<bool>();
@@ -629,8 +544,8 @@
       // TODO(ahe): Restore type when feature is implemented in dart2js
       // checked mode. http://dartbug.com/7733
       (/*T*/ value) {
-        future._setValue(value);
         subscription.cancel();
+        future._setValue(value);
         return;
       },
       onError: future._setError,
@@ -685,10 +600,10 @@
       // checked mode. http://dartbug.com/7733
       (/*T*/ value) {
         if (foundResult) {
+          subscription.cancel();
           // This is the second element we get.
           Error error = new StateError("More than one element");
           future._setError(new AsyncError(error));
-          subscription.cancel();
           return;
         }
         foundResult = true;
@@ -857,8 +772,8 @@
       // checked mode. http://dartbug.com/7733
       (/*T*/ value) {
         if (index == 0) {
-          future._setValue(value);
           subscription.cancel();
+          future._setValue(value);
           return;
         }
         index -= 1;
@@ -921,16 +836,6 @@
 
 
 /**
- * *Deprecated*. Use [EventSink] instead.
- */
-abstract class StreamSink<T> extends EventSink<T>{
-  /* TODO(8997): Remove class.*/
-  /** *Deprecated*. Use [EventSink.addError] instead.*/
-  void signalError(AsyncError errorEvent) { addError(errorEvent); }
-}
-
-
-/**
  * An interface that abstracts creation or handling of [Stream] events.
  */
 abstract class EventSink<T> {
@@ -965,8 +870,7 @@
 /**
  * [EventSink] wrapper that only exposes the [EventSink] interface.
  */
-class EventSinkView<T> extends StreamSink<T> {
-  // TODO(8997): Implment EventSink instead.
+class EventSinkView<T> extends EventSink<T> {
   final EventSink<T> _sink;
 
   EventSinkView(this._sink);
@@ -984,10 +888,7 @@
  * the resulting [Future]. The pipe should complete the future when it's
  * done.
  */
-abstract class StreamConsumer<S, T> {
-  // TODO(floitsch): generic types.
-  // Currently not possible to add generic types, since they clash with other
-  // types that have already been used.
+abstract class StreamConsumer<S> {
   Future addStream(Stream<S> stream);
   Future close();
 
@@ -995,7 +896,7 @@
   /**
    * Consume is deprecated. Use [addStream] followed by [close] instead.
    */
-  Future<T> consume(Stream<S> stream);
+  Future consume(Stream<S> stream);
 }
 
 
@@ -1066,7 +967,30 @@
   const StreamEventTransformer();
 
   Stream<T> bind(Stream<S> source) {
-    return new EventTransformStream<S, T>(source, this);
+    // Hackish way of buffering data that goes out of the event-transformer.
+    // TODO(floitsch): replace this with a correct solution.
+    Stream transformingStream = new EventTransformStream<S, T>(source, this);
+    StreamController controller;
+    StreamSubscription subscription;
+    controller = new StreamController<T>(
+        onPauseStateChange: () {
+          if (controller.isPaused) {
+            subscription.pause();
+          } else {
+            subscription.resume();
+          }
+        },
+        onSubscriptionStateChange: () {
+          if (controller.hasListener) {
+            subscription = transformingStream.listen(
+                controller.add,
+                onError: controller.addError,
+                onDone: controller.close);
+          } else {
+            subscription.cancel();
+          }
+        });
+    return controller.stream;
   }
 
   /**
@@ -1135,6 +1059,8 @@
   final StreamEventTransformer<S, T> _transformer;
   /** Whether to unsubscribe when emitting an error. */
   final bool _unsubscribeOnError;
+  /** Whether this stream has sent a done event. */
+  bool _isClosed = false;
   /** Source of incoming events. */
   StreamSubscription<S> _subscription;
   /** Cached EventSink wrapper for this class. */
@@ -1153,19 +1079,24 @@
                                   onDone: _handleDone);
   }
 
+  /** Whether this subscription is still subscribed to its source. */
+  bool get _isSubscribed => _subscription != null;
+
   void pause([Future pauseSignal]) {
-    if (_subscription != null) _subscription.pause(pauseSignal);
+    if (_isSubscribed) _subscription.pause(pauseSignal);
   }
 
   void resume() {
-    if (_subscription != null) _subscription.resume();
+    if (_isSubscribed) _subscription.resume();
   }
 
   void cancel() {
-    if (_subscription != null) {
-      _subscription.cancel();
+    if (_isSubscribed) {
+      StreamSubscription subscription = _subscription;
       _subscription = null;
+      subscription.cancel();
     }
+    _isClosed = true;
   }
 
   void _handleData(S data) {
@@ -1185,8 +1116,8 @@
   }
 
   void _handleDone() {
-    _subscription = null;
     try {
+      _subscription = null;
       _transformer.handleDone(_sink);
     } catch (e, s) {
       _sendError(_asyncError(e, s));
@@ -1195,10 +1126,12 @@
 
   // EventOutputSink interface.
   void _sendData(T data) {
+    if (_isClosed) return;
     _onData(data);
   }
 
   void _sendError(AsyncError error) {
+    if (_isClosed) return;
     _onError(error);
     if (_unsubscribeOnError) {
       cancel();
@@ -1206,14 +1139,17 @@
   }
 
   void _sendDone() {
-    // It's ok to cancel even if we have been unsubscribed already.
-    cancel();
+    if (_isClosed) throw new StateError("Already closed.");
+    _isClosed = true;
+    if (_isSubscribed) {
+      _subscription.cancel();
+      _subscription = null;
+    }
     _onDone();
   }
 }
 
-/* TODO(8997): Implement EventSink instead, */
-class _EventOutputSinkWrapper<T> extends StreamSink<T> {
+class _EventOutputSinkWrapper<T> extends EventSink<T> {
   _EventOutputSink _sink;
   _EventOutputSinkWrapper(this._sink);
 
diff --git a/sdk/lib/async/stream_controller.dart b/sdk/lib/async/stream_controller.dart
index 5097da6..24a9999 100644
--- a/sdk/lib/async/stream_controller.dart
+++ b/sdk/lib/async/stream_controller.dart
@@ -46,8 +46,7 @@
  * the stream at all, and won't trigger callbacks. From the controller's point
  * of view, the stream is completely inert when has completed.
  */
-class StreamController<T> extends StreamSink<T> {
-  // TODO(8997): Implement EventSink instead.
+class StreamController<T> extends EventSink<T> {
   final _StreamImpl<T> stream;
 
   /**
@@ -59,7 +58,7 @@
    *
    * The [onSubscriptionStateChange] function is called when the stream
    * receives its first listener or loses its last. The current subscription
-   * state can be read from [hasSubscribers]. Ignored if [:null:].
+   * state can be read from [hasListener]. Ignored if [:null:].
    */
   StreamController.broadcast({void onPauseStateChange(),
                               void onSubscriptionStateChange()})
@@ -78,7 +77,7 @@
    *
    * The [onSubscriptionStateChange] function is called when the stream
    * receives its first listener or loses its last. The current subscription
-   * state can be read from [hasSubscribers]. Ignored if [:null:].
+   * state can be read from [hasListener]. Ignored if [:null:].
    */
   StreamController({void onPauseStateChange(),
                     void onSubscriptionStateChange()})
@@ -102,7 +101,7 @@
   bool get isPaused => stream._isInputPaused;
 
   /** Whether there are currently any subscribers on this [Stream]. */
-  bool get hasSubscribers => stream._hasSubscribers;
+  bool get hasListener => stream._hasListener;
 
   /**
    * Send or queue a data event.
diff --git a/sdk/lib/async/stream_impl.dart b/sdk/lib/async/stream_impl.dart
index e3ebd36..e6de3d7 100644
--- a/sdk/lib/async/stream_impl.dart
+++ b/sdk/lib/async/stream_impl.dart
@@ -226,7 +226,7 @@
       (_state & _STREAM_EVENT_ID ) >> _STREAM_EVENT_ID_SHIFT;
 
   /** Whether there is currently a subscriber on this [Stream]. */
-  bool get _hasSubscribers;
+  bool get _hasListener;
 
 
   /** Whether the state bits allow firing. */
@@ -286,7 +286,7 @@
   void _startFiring() {
     assert(!_isFiring);
     assert(!_isInCallback);
-    assert(_hasSubscribers);
+    assert(_hasListener);
     assert(!_isPaused);
     // This sets the _STREAM_FIRING bit and toggles the _STREAM_EVENT_ID
     // bit. All current subscribers will now have a _LISTENER_EVENT_ID
@@ -417,7 +417,7 @@
    * provided one. Repeats calling callbacks as long as the call changes
    * the state.
    */
-  void _checkCallbacks(bool hadSubscribers, bool wasPaused) {
+  void _checkCallbacks(bool hadListener, bool wasPaused) {
     assert(!_isFiring);
     // Will be handled after the current callback.
     if (_isInCallback) return;
@@ -426,9 +426,9 @@
     }
     _state |= _STREAM_CALLBACK;
     while (true) {
-      bool hasSubscribers = _hasSubscribers;
+      bool hasListener = _hasListener;
       bool isPaused = _isInputPaused;
-      if (hadSubscribers != hasSubscribers) {
+      if (hadListener != hasListener) {
         _onSubscriptionStateChange();
       } else if (isPaused != wasPaused) {
         _onPauseStateChange();
@@ -437,7 +437,7 @@
         return;
       }
       wasPaused = isPaused;
-      hadSubscribers = hasSubscribers;
+      hadListener = hasListener;
     }
   }
 
@@ -451,7 +451,7 @@
   /**
    * Called when the first listener subscribes or the last unsubscribes.
    *
-   * Read [hasSubscribers] to see what the new state is.
+   * Read [hasListener] to see what the new state is.
    */
   void _onSubscriptionStateChange() {}
 
@@ -489,7 +489,7 @@
   _sendData(T value) {
     assert(!_isPaused);
     assert(!_isComplete);
-    if (!_hasSubscribers) return;
+    if (!_hasListener) return;
     _forEachSubscriber((subscriber) {
       try {
         subscriber._sendData(value);
@@ -507,7 +507,7 @@
   void _sendError(AsyncError error) {
     assert(!_isPaused);
     assert(!_isComplete);
-    if (!_hasSubscribers) return;
+    if (!_hasListener) return;
     _forEachSubscriber((subscriber) {
       try {
         subscriber._sendError(error);
@@ -528,7 +528,7 @@
     assert(!_isPaused);
     assert(_isClosed);
     _setComplete();
-    if (!_hasSubscribers) return;
+    if (!_hasListener) return;
     _forEachSubscriber((subscriber) {
       _cancel(subscriber);
       try {
@@ -539,7 +539,7 @@
         new AsyncError(e, s).throwDelayed();
       }
     });
-    assert(!_hasSubscribers);
+    assert(!_hasListener);
   }
 }
 
@@ -567,7 +567,7 @@
  * * [_onSubscriberStateChange]: Called when receiving the first subscriber or
  *                               when losing the last subscriber.
  * * [_onPauseStateChange]: Called when entering or leaving paused mode.
- * * [_hasSubscribers]: Test whether there are currently any subscribers.
+ * * [_hasListener]: Test whether there are currently any subscribers.
  * * [_isInputPaused]: Test whether the stream is currently paused.
  * The user should not add new events while the stream is paused, but if it
  * happens anyway, the stream will enqueue the events just as when new events
@@ -577,7 +577,7 @@
   _StreamListener _subscriber = null;
 
   /** Whether there is currently a subscriber on this [Stream]. */
-  bool get _hasSubscribers => _subscriber != null;
+  bool get _hasListener => _subscriber != null;
 
   // -------------------------------------------------------------------
   // Internal implementation.
@@ -601,7 +601,7 @@
 
   void _addListener(_StreamListener subscription) {
     assert(!_isComplete);
-    if (_hasSubscribers) {
+    if (_hasListener) {
       throw new StateError("Stream already has subscriber.");
     }
     assert(_pauseCount == 1);
@@ -681,7 +681,7 @@
  * * [_onSubscriptionStateChange]: Called when receiving the first subscriber or
  *                                 when losing the last subscriber.
  * * [_onPauseStateChange]: Called when entering or leaving paused mode.
- * * [_hasSubscribers]: Test whether there are currently any subscribers.
+ * * [_hasListener]: Test whether there are currently any subscribers.
  * * [_isPaused]: Test whether the stream is currently paused.
  * The user should not add new events while the stream is paused, but if it
  * happens anyway, the stream will enqueue the events just as when new events
@@ -705,7 +705,7 @@
   // Helper functions that can be overridden in subclasses.
 
   /** Whether there are currently any subscribers on this [Stream]. */
-  bool get _hasSubscribers => !_InternalLinkList.isEmpty(this);
+  bool get _hasListener => !_InternalLinkList.isEmpty(this);
 
   /**
    * Create the new subscription object.
@@ -737,7 +737,7 @@
   void _forEachSubscriber(
       void action(_StreamListener<T> subscription)) {
     assert(!_isFiring);
-    if (!_hasSubscribers) return;
+    if (!_hasListener) return;
     bool wasInputPaused = _isInputPaused;
     _startFiring();
     _InternalLink cursor = this._nextLink;
@@ -758,9 +758,9 @@
 
   void _addListener(_StreamListener listener) {
     listener._setSubscribed(_currentEventIdBit);
-    bool hadSubscribers = _hasSubscribers;
+    bool hadListener = _hasListener;
     _InternalLinkList.add(this, listener);
-    if (!hadSubscribers && _isInactive) {
+    if (!hadListener && _isInactive) {
       _checkCallbacks(false, false);
       if (!_isPaused && _hasPendingEvent) {
         _schedulePendingEvents();
@@ -1323,7 +1323,7 @@
     * [_stream] has subscribers.
     */
   void _onSubscriptionStateChange() {
-    if (_hasSubscribers) {
+    if (_hasListener) {
       assert(_subscription == null);
       _subscription = _source.listen(this._add,
                                      onError: this._addError,
diff --git a/sdk/lib/async/stream_pipe.dart b/sdk/lib/async/stream_pipe.dart
index f3a8ea1..aa3da2a 100644
--- a/sdk/lib/async/stream_pipe.dart
+++ b/sdk/lib/async/stream_pipe.dart
@@ -25,6 +25,8 @@
     } else {
       onError(new AsyncError.withCause(e, s, cause));
     }
+    // onError is allowed to return. Don't execute the onSuccess below.
+    return;
   }
   onSuccess(result);
 }
diff --git a/sdk/lib/async/timer.dart b/sdk/lib/async/timer.dart
index b321e41..8a7fdb0 100644
--- a/sdk/lib/async/timer.dart
+++ b/sdk/lib/async/timer.dart
@@ -46,10 +46,7 @@
    * Runs the given [callback] asynchronously as soon as possible.
    */
   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) {
+    schedule() {
       new Timer(const Duration(milliseconds: 0), () {
         List runCallbacks = _runCallbacks;
         // Create new list to make sure we don't call newly added callbacks in
@@ -66,11 +63,17 @@
             _runCallbacks.addAll(
                 runCallbacks.sublist(i));
             _runCallbacks.addAll(newCallbacks);
+            if (!_runCallbacks.isEmpty) schedule();
             throw;
           }
         }
       });
     }
+
+    // Optimizing a group of Timer.run callbacks to be executed in the
+    // same Timer callback.
+    _runCallbacks.add(callback);
+    if (_runCallbacks.length == 1) schedule();
   }
 
   /**
diff --git a/sdk/lib/collection/collection.dart b/sdk/lib/collection/collection.dart
index 4d37c77..0bbd8f2 100644
--- a/sdk/lib/collection/collection.dart
+++ b/sdk/lib/collection/collection.dart
@@ -11,9 +11,8 @@
 part 'maps.dart';
 part 'queue.dart';
 part 'splay_tree.dart';
-part 'hash_table.dart';
 part 'hash_set.dart';
 part 'hash_map.dart';
-part 'linked_hash_table.dart';
+part 'list.dart';
 part 'linked_hash_set.dart';
 part 'linked_hash_map.dart';
diff --git a/sdk/lib/collection/collection_sources.gypi b/sdk/lib/collection/collection_sources.gypi
index 4531699..84259ef 100644
--- a/sdk/lib/collection/collection_sources.gypi
+++ b/sdk/lib/collection/collection_sources.gypi
@@ -10,11 +10,10 @@
     'collections.dart',
     'hash_map.dart',
     'hash_set.dart',
-    'hash_table.dart',
     'iterator.dart',
     'linked_hash_map.dart',
     'linked_hash_set.dart',
-    'linked_hash_table.dart',
+    'list.dart',
     'maps.dart',
     'queue.dart',
     'splay_tree.dart',
diff --git a/sdk/lib/collection/collections.dart b/sdk/lib/collection/collections.dart
index 8729452..400ce90 100644
--- a/sdk/lib/collection/collections.dart
+++ b/sdk/lib/collection/collections.dart
@@ -9,6 +9,7 @@
  *
  * Once Dart receives Mixins it will be replaced with mixin classes.
  */
+@deprecated
 class IterableMixinWorkaround {
   static bool contains(Iterable iterable, var element) {
     for (final e in iterable) {
@@ -38,9 +39,14 @@
   }
 
   static dynamic reduce(Iterable iterable,
-                        dynamic initialValue,
-                        dynamic combine(dynamic previousValue, element)) {
-    return fold(iterable, initialValue, combine);
+                        dynamic combine(previousValue, element)) {
+    Iterator iterator = iterable.iterator;
+    if (!iterator.moveNext()) throw new StateError("No elements");
+    var value = iterator.current;
+    while (iterator.moveNext()) {
+      value = combine(value, iterator.current);
+    }
+    return value;
   }
 
   static dynamic fold(Iterable iterable,
@@ -53,71 +59,6 @@
   }
 
   /**
-   * Simple implementation for [Collection.removeAll].
-   *
-   * This implementation assumes that [Collection.remove] on [collection]
-   * is efficient. The [:remove:] method on [List] objects is typically
-   * not efficient since it requires linear search to find an element.
-   */
-  static void removeAll(Collection collection, Iterable elementsToRemove) {
-    for (Object object in elementsToRemove) {
-      collection.remove(object);
-    }
-  }
-
-  /**
-   * Implementation of [Collection.removeAll] for lists.
-   *
-   * This implementation assumes that [Collection.remove] is not efficient
-   * (as it usually isn't on a [List]) and uses [Collection.removeMathcing]
-   * instead of just repeatedly calling remove.
-   */
-  static void removeAllList(Collection collection, Iterable elementsToRemove) {
-    Set setToRemove;
-    // Assume [contains] is efficient on a Set.
-    if (elementsToRemove is Set) {
-      setToRemove = elementsToRemove;
-    } else {
-      setToRemove = elementsToRemove.toSet();
-    }
-    collection.removeWhere(setToRemove.contains);
-  }
-
-  /**
-   * Simple implemenation for [Collection.retainAll].
-   *
-   * This implementation assumes that [Collecton.retainWhere] on [collection]
-   * is efficient.
-   */
-  static void retainAll(Collection collection, Iterable elementsToRetain) {
-    Set lookup;
-    if (elementsToRetain is Set) {
-      lookup = elementsToRetain;
-    } else {
-      lookup = elementsToRetain.toSet();
-    }
-    if (lookup.isEmpty) {
-      collection.clear();
-      return;
-    }
-    collection.retainWhere(lookup.contains);
-  }
-
-  /**
-   * Simple implemenation for [Collection.removeWhere].
-   *
-   * This implementation assumes that [Collecton.removeAll] on [collection] is
-   * efficient.
-   */
-  static void removeWhere(Collection collection, bool test(var element)) {
-    List elementsToRemove = [];
-    for (var element in collection) {
-      if (test(element)) elementsToRemove.add(element);
-    }
-    collection.removeAll(elementsToRemove);
-  }
-
-  /**
    * Removes elements matching [test] from [list].
    *
    * This is performed in two steps, to avoid exposing an inconsistent state
@@ -143,20 +84,6 @@
     }
   }
 
-  /**
-   * Simple implemenation for [Collection.retainWhere].
-   *
-   * This implementation assumes that [Collecton.removeAll] on [collection] is
-   * efficient.
-   */
-  static void retainWhere(Collection collection, bool test(var element)) {
-    List elementsToRemove = [];
-    for (var element in collection) {
-      if (!test(element)) elementsToRemove.add(element);
-    }
-    collection.removeAll(elementsToRemove);
-  }
-
   static bool isEmpty(Iterable iterable) {
     return !iterable.iterator.moveNext();
   }
@@ -181,32 +108,6 @@
     return result;
   }
 
-  static dynamic min(Iterable iterable, [int compare(var a, var b)]) {
-    if (compare == null) compare = Comparable.compare;
-    Iterator it = iterable.iterator;
-    if (!it.moveNext()) {
-      return null;
-    }
-    var min = it.current;
-    while (it.moveNext()) {
-      if (compare(min, it.current) > 0) min = it.current;
-    }
-    return min;
-  }
-
-  static dynamic max(Iterable iterable, [int compare(var a, var b)]) {
-    if (compare == null) compare = Comparable.compare;
-    Iterator it = iterable.iterator;
-    if (!it.moveNext()) {
-      return null;
-    }
-    var max = it.current;
-    while (it.moveNext()) {
-      if (compare(max, it.current) < 0) max = it.current;
-    }
-    return max;
-  }
-
   static dynamic single(Iterable iterable) {
     Iterator it = iterable.iterator;
     if (!it.moveNext()) throw new StateError("No elements");
@@ -281,7 +182,7 @@
 
   static String join(Iterable iterable, [String separator]) {
     StringBuffer buffer = new StringBuffer();
-    buffer.writeAll(iterable, separator == null ? "" : separator);
+    buffer.writeAll(iterable, separator);
     return buffer.toString();
   }
 
@@ -289,15 +190,15 @@
     if (list.isEmpty) return "";
     if (list.length == 1) return "${list[0]}";
     StringBuffer buffer = new StringBuffer();
-    if (separator == null || separator == "") {
+    if (separator.isEmpty) {
       for (int i = 0; i < list.length; i++) {
-        buffer.write("${list[i]}");
+        buffer.write(list[i]);
       }
     } else {
-      buffer.write("${list[0]}");
+      buffer.write(list[0]);
       for (int i = 1; i < list.length; i++) {
         buffer.write(separator);
-        buffer.write("${list[i]}");
+        buffer.write(list[i]);
       }
     }
     return buffer.toString();
@@ -321,7 +222,6 @@
 
   static Iterable takeList(List list, int n) {
     // The generic type is currently lost. It will be fixed with mixins.
-    // This is currently a List as well as an Iterable.
     return new SubListIterable(list, 0, n);
   }
 
@@ -332,7 +232,6 @@
 
   static Iterable skipList(List list, int n) {
     // The generic type is currently lost. It will be fixed with mixins.
-    // This is currently a List as well as an Iterable.
     return new SubListIterable(list, n, null);
   }
 
@@ -359,6 +258,17 @@
     return Arrays.lastIndexOf(list, element, start);
   }
 
+  static Iterable getRangeList(List list, int start, int end) {
+    if (start < 0 || start > list.length) {
+      throw new RangeError.range(start, 0, list.length);
+    }
+    if (end < start || end > list.length) {
+      throw new RangeError.range(end, start, list.length);
+    }
+    // The generic type is currently lost. It will be fixed with mixins.
+    return new SubListIterable(list, start, end);
+  }
+
   static void setRangeList(List list, int start, int length,
                            List from, int startFrom) {
     if (length == 0) return;
@@ -417,11 +327,6 @@
   }
 }
 
-class Collections {
-  static String collectionToString(Collection c)
-      => ToString.collectionToString(c);
-}
-
 /**
  * An unmodifiable [List] view of another List.
  *
diff --git a/sdk/lib/collection/hash_map.dart b/sdk/lib/collection/hash_map.dart
index 0fe3526..f5fcd85 100644
--- a/sdk/lib/collection/hash_map.dart
+++ b/sdk/lib/collection/hash_map.dart
@@ -4,22 +4,6 @@
 
 part of dart.collection;
 
-class _HashMapTable<K, V> extends _HashTable<K> {
-  static const int _INITIAL_CAPACITY = 8;
-  static const int _VALUE_INDEX = 1;
-
-  _HashMapTable() : super(_INITIAL_CAPACITY);
-
-  int get _entrySize => 2;
-
-  V _value(int offset) => _table[offset + _VALUE_INDEX];
-  void _setValue(int offset, V value) { _table[offset + _VALUE_INDEX] = value; }
-
-  _copyEntry(List fromTable, int fromOffset, int toOffset) {
-    _table[toOffset + _VALUE_INDEX] = fromTable[fromOffset + _VALUE_INDEX];
-  }
-}
-
 class HashMap<K, V> implements Map<K, V> {
   external HashMap();
 
diff --git a/sdk/lib/collection/hash_set.dart b/sdk/lib/collection/hash_set.dart
index 977dcff..f658b52 100644
--- a/sdk/lib/collection/hash_set.dart
+++ b/sdk/lib/collection/hash_set.dart
@@ -4,7 +4,59 @@
 
 part of dart.collection;
 
-class HashSet<E> extends Collection<E> implements Set<E> {
+/** Common parts of [HashSet] and [LinkedHashSet] implementations. */
+abstract class _HashSetBase<E> extends Iterable<E> implements Set<E> {
+  // Set.
+  bool containsAll(Iterable<E> other) {
+    for (E object in other) {
+      if (!this.contains(object)) return false;
+    }
+    return true;
+  }
+
+  /** Create a new Set of the same type as this. */
+  Set _newSet();
+
+  Set<E> intersection(Set<E> other) {
+    Set<E> result = _newSet();
+    if (other.length < this.length) {
+      for (E element in other) {
+        if (this.contains(element)) result.add(element);
+      }
+    } else {
+      for (E element in this) {
+        if (other.contains(element)) result.add(element);
+      }
+    }
+    return result;
+  }
+
+  Set<E> union(Set<E> other) {
+    return _newSet()..addAll(this)..addAll(other);
+  }
+
+  Set<E> difference(Set<E> other) {
+    HashSet<E> result = _newSet();
+    for (E element in this) {
+      if (!other.contains(element)) result.add(element);
+    }
+    return result;
+  }
+
+  void retainAll(Iterable objectsToRetain) {
+    Set retainSet;
+    if (objectsToRetain is Set) {
+      retainSet = objectsToRetain;
+    } else {
+      retainSet = objectsToRetain.toSet();
+    }
+    retainWhere(retainSet.contains);
+  }
+
+  String toString() => ToString.iterableToString(this);
+}
+
+class HashSet<E> extends _HashSetBase<E> {
   external HashSet();
 
   factory HashSet.from(Iterable<E> iterable) {
@@ -29,10 +81,6 @@
 
   external void removeAll(Iterable objectsToRemove);
 
-  void retainAll(Iterable objectsToRetain) {
-    IterableMixinWorkaround.retainAll(this, objectsToRetain);
-  }
-
   external void removeWhere(bool test(E element));
 
   external void retainWhere(bool test(E element));
@@ -40,33 +88,5 @@
   external void clear();
 
   // Set.
-  bool isSubsetOf(Collection<E> other) {
-    // Deprecated, and using old signature.
-    Set otherSet;
-    if (other is Set) {
-      otherSet = other;
-    } else {
-      otherSet = other.toSet();
-    }
-    return IterableMixinWorkaround.setContainsAll(otherSet, this);
-  }
-
-  bool containsAll(Iterable<E> other) {
-    return IterableMixinWorkaround.setContainsAll(this, other);
-  }
-
-  Set<E> intersection(Set<E> other) {
-    return IterableMixinWorkaround.setIntersection(
-        this, other, new HashSet<E>());
-  }
-
-  Set<E> union(Set<E> other) {
-    return IterableMixinWorkaround.setUnion(this, other, new HashSet<E>());
-  }
-
-  Set<E> difference(Set<E> other) {
-    return IterableMixinWorkaround.setDifference(this, other, new HashSet<E>());
-  }
-
-  String toString() => Collections.collectionToString(this);
+  Set<E> _newSet() => new HashSet<E>();
 }
diff --git a/sdk/lib/collection/hash_table.dart b/sdk/lib/collection/hash_table.dart
deleted file mode 100644
index ececc47..0000000
--- a/sdk/lib/collection/hash_table.dart
+++ /dev/null
@@ -1,404 +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 dart.collection;
-
-class _DeadEntry {
-  const _DeadEntry();
-}
-
-class _NullKey {
-  const _NullKey();
-  int get hashCode => null.hashCode;
-}
-
-const _TOMBSTONE = const _DeadEntry();
-const _NULL = const _NullKey();
-
-class _HashTable<K> {
-  /**
-   * Table of entries with [_entrySize] slots per entry.
-   *
-   * Capacity in entries must be factor of two.
-   */
-  List _table;
-  /** Current capacity. Always equal to [:_table.length ~/ _entrySize:]. */
-  int _capacity;
-  /** Count of occupied entries, including deleted ones. */
-  int _entryCount = 0;
-  /** Count of deleted entries. */
-  int _deletedCount = 0;
-  /** Counter incremented when table is modified. */
-  int _modificationCount = 0;
-  /** If set, used as the source object for [ConcurrentModificationError]s. */
-  Object _container;
-
-  _HashTable(int initialCapacity) : _capacity = initialCapacity {
-    _table = _createTable(initialCapacity);
-  }
-
-  /** Reads key from table. Converts _NULL marker to null. */
-  Object _key(offset) {
-    assert(!_isFree(_table[offset]));
-    Object key = _table[offset];
-    if (!identical(key, _NULL)) return key;
-    return null;
-  }
-
-  /** Writes key to table. Converts null to _NULL marker. */
-  void _setKey(int offset, Object key) {
-    if (key == null) key = _NULL;
-    _table[offset] = key;
-  }
-
-  int get _elementCount => _entryCount - _deletedCount;
-
-  /** Size of each entry. */
-  int get _entrySize => 1;
-
-  void _checkModification(int expectedModificationCount) {
-    if (_modificationCount != expectedModificationCount) {
-      throw new ConcurrentModificationError(_container);
-    }
-  }
-
-  void _recordModification() {
-    // Value cycles after 2^30 modifications. If you keep hold of an
-    // iterator for that long, you might miss a modification detection,
-    // and iteration can go sour. Don't do that.
-    _modificationCount = (_modificationCount + 1) & (0x3FFFFFFF);
-  }
-
-  /**
-   * Create an empty table.
-   */
-  List _createTable(int capacity) {
-    List table = new List(capacity * _entrySize);
-    return table;
-  }
-
-  /** First table probe. */
-  int _firstProbe(int hashCode, int capacity) {
-    return hashCode & (capacity - 1);
-  }
-
-  /** Following table probes. */
-  int _nextProbe(int previousIndex, int probeCount, int capacity) {
-    // When capacity is a power of 2, this probing algorithm (the triangular
-    // number sequence modulo capacity) is guaranteed to hit all indices exactly
-    // once before repeating.
-    return (previousIndex + probeCount) & (capacity - 1);
-  }
-
-  /** Whether an object is a free-marker (either tombstone or free). */
-  bool _isFree(Object marker) =>
-      marker == null || identical(marker, _TOMBSTONE);
-
-  /**
-   * Look up the offset for an object in the table.
-   *
-   * Finds the offset of the object in the table, if it is there,
-   * or the first free offset for its hashCode.
-   */
-  int _probeForAdd(int hashCode, Object object) {
-    int entrySize = _entrySize;
-    int index = _firstProbe(hashCode, _capacity);
-    int firstTombstone = -1;
-    int probeCount = 0;
-    while (true) {
-      int offset = index * entrySize;
-      Object entry = _table[offset];
-      if (identical(entry, _TOMBSTONE)) {
-        if (firstTombstone < 0) firstTombstone = offset;
-      } else if (entry == null) {
-        if (firstTombstone < 0) return offset;
-        return firstTombstone;
-      } else if (identical(_NULL, entry) ? _equals(null, object)
-                                         : _equals(entry, object)) {
-        return offset;
-      }
-      // The _nextProbe is designed so that it hits
-      // every index eventually.
-      index = _nextProbe(index, ++probeCount, _capacity);
-    }
-  }
-
-  /**
-   * Look up the offset for an object in the table.
-   *
-   * If the object is in the table, its offset is returned.
-   *
-   * If the object is not in the table, Otherwise a negative value is returned.
-   */
-  int _probeForLookup(int hashCode, Object object) {
-    int entrySize = _entrySize;
-    int index = _firstProbe(hashCode, _capacity);
-    int probeCount = 0;
-    while (true) {
-      int offset = index * entrySize;
-      Object entry = _table[offset];
-      if (entry == null) {
-        return -1;
-      } else if (!identical(_TOMBSTONE, entry)) {
-        if (identical(_NULL, entry) ? _equals(null, object)
-                                    : _equals(entry, object)) {
-          return offset;
-        }
-      }
-      // The _nextProbe is designed so that it hits
-      // every index eventually.
-      index = _nextProbe(index, ++probeCount, _capacity);
-    }
-  }
-
-  // Override the following two to change equality/hashCode computations
-
-  /**
-   * Compare two object for equality.
-   *
-   * The first object is the one already in the table,
-   * and the second is the one being searched for.
-   */
-  bool _equals(Object element, Object other) {
-    return element == other;
-  }
-
-  /**
-   * Compute hash-code for an object.
-   */
-  int _hashCodeOf(Object object) => object.hashCode;
-
-  /**
-   * Ensure that the table isn't too full for its own good.
-   *
-   * Call this after adding an element.
-   */
-  int _checkCapacity() {
-    // Compute everything in multiples of entrySize to avoid division.
-    int freeCount = _capacity - _entryCount;
-    if (freeCount * 4 < _capacity ||
-        freeCount < _deletedCount) {
-      // Less than 25% free or more deleted entries than free entries.
-      _grow(_entryCount - _deletedCount);
-    }
-  }
-
-  void _grow(int contentCount) {
-    int capacity = _capacity;
-    // Don't grow to less than twice the needed capacity.
-    int minCapacity = contentCount * 2;
-    while (capacity < minCapacity) {
-      capacity *= 2;
-    }
-    // Reset to another table and add all existing elements.
-    List oldTable = _table;
-    _table = _createTable(capacity);
-    _capacity = capacity;
-    _entryCount = 0;
-    _deletedCount = 0;
-    _addAllEntries(oldTable);
-    _recordModification();
-  }
-
-  /**
-   * Copies all non-free entries from the old table to the new empty table.
-   */
-  void _addAllEntries(List oldTable) {
-    for (int i = 0; i < oldTable.length; i += _entrySize) {
-      Object object = oldTable[i];
-      if (!_isFree(object)) {
-        int toOffset = _put(object);
-        _copyEntry(oldTable, i, toOffset);
-      }
-    }
-  }
-
-  /**
-   * Copies everything but the key element from one entry to another.
-   *
-   * Called while growing the base array.
-   *
-   * Override this if any non-key fields need copying.
-   */
-  void _copyEntry(List fromTable, int fromOffset, int toOffset) {}
-
-  // The following three methods are for simple get/set/remove operations.
-  // They only affect the key of an entry. The remaining fields must be
-  // filled by the caller.
-
-  /**
-   * Returns the offset of a key in [_table], or negative if it's not there.
-   */
-  int _get(K key) {
-    return _probeForLookup(_hashCodeOf(key), key);
-  }
-
-  /**
-   * Puts the key into the table and returns its offset into [_table].
-   *
-   * If [_entrySize] is greater than 1, the caller should fill the
-   * remaining fields.
-   *
-   * Remember to call [_checkCapacity] after using this method.
-   */
-  int _put(K key) {
-    int offset = _probeForAdd(_hashCodeOf(key), key);
-    Object oldEntry = _table[offset];
-    if (oldEntry == null) {
-      _entryCount++;
-    } else if (identical(oldEntry, _TOMBSTONE)) {
-      _deletedCount--;
-    } else {
-      return offset;
-    }
-    _setKey(offset, key);
-    _recordModification();
-    return offset;
-  }
-
-  /**
-   * Removes a key from the table and returns its offset into [_table].
-   *
-   * Returns null if the key was not in the table.
-   * If [_entrySize] is greater than 1, the caller should clean up the
-   * remaining fields.
-   */
-  int _remove(K key) {
-    int offset = _probeForLookup(_hashCodeOf(key), key);
-    if (offset >= 0) {
-      _deleteEntry(offset);
-    }
-    return offset;
-  }
-
-  /** Clears the table completely, leaving it empty. */
-  void _clear() {
-    if (_elementCount == 0) return;
-    for (int i = 0; i < _table.length; i++) {
-      _table[i] = null;
-    }
-    _entryCount = _deletedCount = 0;
-    _recordModification();
-  }
-
-  /** Clears an entry in the table. */
-  void _deleteEntry(int offset) {
-    assert(!_isFree(_table[offset]));
-    _setKey(offset, _TOMBSTONE);
-    _deletedCount++;
-    _recordModification();
-  }
-}
-
-/**
- * Generic iterable based on a [_HashTable].
- */
-abstract class _HashTableIterable<E> extends Iterable<E> {
-  final _HashTable _hashTable;
-  _HashTableIterable(this._hashTable);
-
-  Iterator<E> get iterator;
-
-  /**
-   * Return the iterated value for a given entry.
-   */
-  E _valueAt(int offset, Object key);
-
-  int get length => _hashTable._elementCount;
-
-  bool get isEmpty => _hashTable._elementCount == 0;
-
-  void forEach(void action(E element)) {
-    int entrySize = _hashTable._entrySize;
-    List table = _hashTable._table;
-    int modificationCount = _hashTable._modificationCount;
-    for (int offset = 0; offset < table.length; offset += entrySize) {
-      Object entry = table[offset];
-      if (!_hashTable._isFree(entry)) {
-        E value = _valueAt(offset, entry);
-        action(value);
-      }
-      _hashTable._checkModification(modificationCount);
-    }
-  }
-}
-
-abstract class _HashTableIterator<E> implements Iterator<E> {
-  final _HashTable _hashTable;
-  final int _modificationCount;
-  /** Location right after last found element. */
-  int _offset = 0;
-  E _current = null;
-
-  _HashTableIterator(_HashTable hashTable)
-      : _hashTable = hashTable,
-        _modificationCount = hashTable._modificationCount;
-
-  bool moveNext() {
-    _hashTable._checkModification(_modificationCount);
-
-    List table = _hashTable._table;
-    int entrySize = _hashTable._entrySize;
-
-    while (_offset < table.length) {
-      int currentOffset = _offset;
-      Object entry = table[currentOffset];
-      _offset = currentOffset + entrySize;
-      if (!_hashTable._isFree(entry)) {
-        _current = _valueAt(currentOffset, entry);
-        return true;
-      }
-    }
-    _current = null;
-    return false;
-  }
-
-  E get current => _current;
-
-  E _valueAt(int offset, Object key);
-}
-
-class _HashTableKeyIterable<K> extends _HashTableIterable<K> {
-  _HashTableKeyIterable(_HashTable<K> hashTable) : super(hashTable);
-
-  Iterator<K> get iterator => new _HashTableKeyIterator<K>(_hashTable);
-
-  K _valueAt(int offset, Object key) {
-    if (identical(key, _NULL)) return null;
-    return key;
-  }
-
-  bool contains(Object value) => _hashTable._get(value) >= 0;
-}
-
-class _HashTableKeyIterator<K> extends _HashTableIterator<K> {
-  _HashTableKeyIterator(_HashTable hashTable) : super(hashTable);
-
-  K _valueAt(int offset, Object key) {
-    if (identical(key, _NULL)) return null;
-    return key;
-  }
-}
-
-class _HashTableValueIterable<V> extends _HashTableIterable<V> {
-  final int _entryIndex;
-
-  _HashTableValueIterable(_HashTable hashTable, this._entryIndex)
-      : super(hashTable);
-
-  Iterator<V> get iterator {
-    return new _HashTableValueIterator<V>(_hashTable, _entryIndex);
-  }
-
-  V _valueAt(int offset, Object key) => _hashTable._table[offset + _entryIndex];
-}
-
-class _HashTableValueIterator<V> extends _HashTableIterator<V> {
-  final int _entryIndex;
-
-  _HashTableValueIterator(_HashTable hashTable, this._entryIndex)
-      : super(hashTable);
-
-  V _valueAt(int offset, Object key) => _hashTable._table[offset + _entryIndex];
-}
diff --git a/sdk/lib/collection/linked_hash_map.dart b/sdk/lib/collection/linked_hash_map.dart
index 4dcbc060..431f7fa 100644
--- a/sdk/lib/collection/linked_hash_map.dart
+++ b/sdk/lib/collection/linked_hash_map.dart
@@ -4,135 +4,40 @@
 
 part of dart.collection;
 
-class _LinkedHashMapTable<K, V> extends _LinkedHashTable<K> {
-  static const int _INITIAL_CAPACITY = 8;
-  static const int _VALUE_INDEX = 3;
-
-  int get _entrySize => 4;
-
-  _LinkedHashMapTable() : super(_INITIAL_CAPACITY);
-
-  V _value(int offset) => _table[offset + _VALUE_INDEX];
-  void _setValue(int offset, V value) { _table[offset + _VALUE_INDEX] = value; }
-
-  _copyEntry(List oldTable, int fromOffset, int toOffset) {
-    _table[toOffset + _VALUE_INDEX] = oldTable[fromOffset + _VALUE_INDEX];
-  }
-}
-
 /**
  * A hash-based map that iterates keys and values in key insertion order.
  */
 class LinkedHashMap<K, V> implements Map<K, V> {
-  final _LinkedHashMapTable _hashTable;
-
-  LinkedHashMap() : _hashTable = new _LinkedHashMapTable<K, V>() {
-    _hashTable._container = this;
-  }
+  external LinkedHashMap();
 
   factory LinkedHashMap.from(Map<K, V> other) {
     return new LinkedHashMap<K, V>()..addAll(other);
   }
 
-  bool containsKey(K key) {
-    return _hashTable._get(key) >= 0;
-  }
+  external bool containsKey(K key);
 
-  bool containsValue(V value) {
-    int modificationCount = _hashTable._modificationCount;
-    for (int offset = _hashTable._next(_LinkedHashTable._HEAD_OFFSET);
-         offset != _LinkedHashTable._HEAD_OFFSET;
-         offset = _hashTable._next(offset)) {
-      if (_hashTable._value(offset) == value) {
-        return true;
-      }
-      // The == call may modify the table.
-      _hashTable._checkModification(modificationCount);
-    }
-    return false;
-  }
+  external bool containsValue(V value);
 
-  void addAll(Map<K, V> other) {
-    other.forEach((K key, V value) {
-      int offset = _hashTable._put(key);
-      _hashTable._setValue(offset, value);
-      _hashTable._checkCapacity();
-    });
-  }
+  external void addAll(Map<K, V> other);
 
-  V operator [](K key) {
-    int offset = _hashTable._get(key);
-    if (offset >= 0) return _hashTable._value(offset);
-    return null;
-  }
+  external V operator [](K key);
 
-  void operator []=(K key, V value) {
-    int offset = _hashTable._put(key);
-    _hashTable._setValue(offset, value);
-    _hashTable._checkCapacity();
-  }
+  external void operator []=(K key, V value);
 
-  V putIfAbsent(K key, V ifAbsent()) {
-    int offset = _hashTable._probeForAdd(_hashTable._hashCodeOf(key), key);
-    Object entry = _hashTable._table[offset];
-    if (!_hashTable._isFree(entry)) {
-      return _hashTable._value(offset);
-    }
-    int modificationCount = _hashTable._modificationCount;
-    V value = ifAbsent();
-    if (modificationCount == _hashTable._modificationCount) {
-      _hashTable._setKey(offset, key);
-      _hashTable._setValue(offset, value);
-      _hashTable._linkLast(offset);
-      if (entry == null) {
-        _hashTable._entryCount++;
-        _hashTable._checkCapacity();
-      } else {
-        assert(identical(entry, _TOMBSTONE));
-        _hashTable._deletedCount--;
-      }
-      _hashTable._recordModification();
-    } else {
-      // The table might have changed, so we can't trust [offset] any more.
-      // Do another lookup before setting the value.
-      offset = _hashTable._put(key);
-      _hashTable._setValue(offset, value);
-      _hashTable._checkCapacity();
-    }
-    return value;
-  }
+  external V putIfAbsent(K key, V ifAbsent());
 
-  V remove(K key) {
-    int offset = _hashTable._remove(key);
-    if (offset < 0) return null;
-    Object oldValue = _hashTable._value(offset);
-    _hashTable._setValue(offset, null);
-    _hashTable._checkCapacity();
-    return oldValue;
-  }
+  external V remove(K key);
 
-  void clear() {
-    _hashTable._clear();
-  }
+  external void clear();
 
-  void forEach(void action (K key, V value)) {
-    int modificationCount = _hashTable._modificationCount;
-    for (int offset = _hashTable._next(_LinkedHashTable._HEAD_OFFSET);
-         offset != _LinkedHashTable._HEAD_OFFSET;
-         offset = _hashTable._next(offset)) {
-      action(_hashTable._key(offset), _hashTable._value(offset));
-      _hashTable._checkModification(modificationCount);
-    }
-  }
+  external void forEach(void action (K key, V value));
 
-  Iterable<K> get keys => new _LinkedHashTableKeyIterable<K>(_hashTable);
-  Iterable<V> get values =>
-      new _LinkedHashTableValueIterable<V>(_hashTable,
-                                           _LinkedHashMapTable._VALUE_INDEX);
+  external Iterable<K> get keys;
+  external Iterable<V> get values;
 
-  int get length => _hashTable._elementCount;
+  external int get length;
 
-  bool get isEmpty => _hashTable._elementCount == 0;
+  external bool get isEmpty;
 
   String toString() => Maps.mapToString(this);
 }
diff --git a/sdk/lib/collection/linked_hash_set.dart b/sdk/lib/collection/linked_hash_set.dart
index 8a4d566..e866b63 100644
--- a/sdk/lib/collection/linked_hash_set.dart
+++ b/sdk/lib/collection/linked_hash_set.dart
@@ -4,159 +4,50 @@
 
 part of dart.collection;
 
-class LinkedHashSet<E> extends Collection<E> implements Set<E> {
-  static const int _INITIAL_CAPACITY = 8;
-  _LinkedHashTable<E> _table;
+class LinkedHashSet<E> extends _HashSetBase<E> {
 
-  LinkedHashSet() : _table = new _LinkedHashTable(_INITIAL_CAPACITY) {
-    _table._container = this;
-  }
+  external LinkedHashSet();
 
   factory LinkedHashSet.from(Iterable<E> iterable) {
     return new LinkedHashSet<E>()..addAll(iterable);
   }
 
   // Iterable.
-  Iterator<E> get iterator => new _LinkedHashTableKeyIterator<E>(_table);
+  external Iterator<E> get iterator;
 
-  void forEach(void action(E element)) {
-    int offset = _table._next(_LinkedHashTable._HEAD_OFFSET);
-    int modificationCount = _table._modificationCount;
-    while (offset != _LinkedHashTable._HEAD_OFFSET) {
-      E key = _table._key(offset);
-      action(key);
-      _table._checkModification(modificationCount);
-      offset = _table._next(offset);
-    }
-  }
+  external int get length;
 
-  int get length => _table._elementCount;
+  external bool get isEmpty;
 
-  bool get isEmpty => _table._elementCount == 0;
+  external bool contains(Object object);
 
-  bool contains(Object object) => _table._get(object) >= 0;
+  external void forEach(void action(E element));
 
-  E get first {
-    int firstOffset = _table._next(_LinkedHashTable._HEAD_OFFSET);
-    if (firstOffset == _LinkedHashTable._HEAD_OFFSET) {
-      throw new StateError("No elements");
-    }
-    return _table._key(firstOffset);
-  }
+  external E get first;
 
-  E get last {
-    int lastOffset = _table._prev(_LinkedHashTable._HEAD_OFFSET);
-    if (lastOffset == _LinkedHashTable._HEAD_OFFSET) {
-      throw new StateError("No elements");
-    }
-    return _table._key(lastOffset);
-  }
+  external E get last;
 
   E get single {
-    int firstOffset = _table._next(_LinkedHashTable._HEAD_OFFSET);
-    if (firstOffset == _LinkedHashTable._HEAD_OFFSET) {
-      throw new StateError("No elements");
-    }
-    int lastOffset = _table._prev(_LinkedHashTable._HEAD_OFFSET);
-    if (lastOffset != firstOffset) {
-      throw new StateError("Too many elements");
-    }
-    return _table._key(firstOffset);
+    if (length == 1) return first;
+    var message = (length == 0) ? "No Elements" : "Too many elements";
+    throw new StateError(message);
   }
 
   // Collection.
-  void add(E element) {
-    _table._put(element);
-    _table._checkCapacity();
-  }
+  external void add(E element);
 
-  void addAll(Iterable<E> objects) {
-    for (E object in objects) {
-      _table._put(object);
-      _table._checkCapacity();
-    }
-  }
+  external void addAll(Iterable<E> objects);
 
-  bool remove(Object object) {
-    int offset = _table._remove(object);
-    if (offset >= 0) {
-      _table._checkCapacity();
-      return true;
-    }
-    return false;
-  }
+  external bool remove(Object object);
 
-  void removeAll(Iterable objectsToRemove) {
-    for (Object object in objectsToRemove) {
-      _table._remove(object);
-      _table._checkCapacity();
-    }
-  }
+  external void removeAll(Iterable objectsToRemove);
 
-  void retainAll(Iterable objectsToRemove) {
-    IterableMixinWorkaround.retainAll(this, objectsToRemove);
-  }
+  external void removeWhere(bool test(E element));
 
-  void _filterWhere(bool test(E element), bool removeMatching) {
-    int entrySize = _table._entrySize;
-    int length = _table._table.length;
-    int offset = _table._next(_LinkedHashTable._HEAD_OFFSET);
-    while (offset != _LinkedHashTable._HEAD_OFFSET) {
-      E key = _table._key(offset);
-      int nextOffset = _table._next(offset);
-      int modificationCount = _table._modificationCount;
-      bool shouldRemove = (removeMatching == test(key));
-      _table._checkModification(modificationCount);
-      if (shouldRemove) {
-        _table._deleteEntry(offset);
-      }
-      offset = nextOffset;
-    }
-    _table._checkCapacity();
-  }
+  external void retainWhere(bool test(E element));
 
-  void removeWhere(bool test(E element)) {
-    _filterWhere(test, true);
-  }
-
-  void retainWhere(bool test(E element)) {
-    _filterWhere(test, false);
-  }
-
-  void clear() {
-    _table._clear();
-  }
+  external void clear();
 
   // Set.
-  bool isSubsetOf(Collection<E> other) {
-    // Deprecated, and using old signature.
-    Set otherSet;
-    if (other is Set) {
-      otherSet = other;
-    } else {
-      otherSet = other.toSet();
-    }
-    return IterableMixinWorkaround.setContainsAll(otherSet, this);
-  }
-
-  bool containsAll(Iterable<E> other) {
-    return IterableMixinWorkaround.setContainsAll(this, other);
-  }
-
-  Set<E> intersection(Set<E> other) {
-    return IterableMixinWorkaround.setIntersection(
-        this, other, new LinkedHashSet<E>());
-  }
-
-  Set<E> union(Set<E> other) {
-    return IterableMixinWorkaround.setUnion(
-        this, other, new LinkedHashSet<E>());
-  }
-
-  Set<E> difference(Set<E> other) {
-    return IterableMixinWorkaround.setDifference(
-        this, other, new LinkedHashSet<E>());
-  }
-
-  String toString() => Collections.collectionToString(this);
+  Set<E> _newSet() => new LinkedHashSet<E>();
 }
diff --git a/sdk/lib/collection/linked_hash_table.dart b/sdk/lib/collection/linked_hash_table.dart
deleted file mode 100644
index 4b8b063..0000000
--- a/sdk/lib/collection/linked_hash_table.dart
+++ /dev/null
@@ -1,165 +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 dart.collection;
-
-/** Unique marker object for the head of a linked list of entries. */
-class _LinkedHashTableHeadMarker {
-  const _LinkedHashTableHeadMarker();
-}
-
-const _LinkedHashTableHeadMarker _HEAD_MARKER =
-    const _LinkedHashTableHeadMarker();
-
-class _LinkedHashTable<K> extends _HashTable<K> {
-  static const _NEXT_INDEX = 1;
-  static const _PREV_INDEX = 2;
-  static const _HEAD_OFFSET = 0;
-
-  _LinkedHashTable(int initialCapacity) : super(initialCapacity);
-
-  int get _entrySize => 3;
-
-  List _createTable(int capacity) {
-    List result = new List(capacity * _entrySize);
-    result[_HEAD_OFFSET] = _HEAD_MARKER;
-    result[_HEAD_OFFSET + _NEXT_INDEX] = _HEAD_OFFSET;
-    result[_HEAD_OFFSET + _PREV_INDEX] = _HEAD_OFFSET;
-    return result;
-  }
-
-  int _next(int offset) => _table[offset + _NEXT_INDEX];
-  void _setNext(int offset, int to) { _table[offset + _NEXT_INDEX] = to; }
-
-  int _prev(int offset) => _table[offset + _PREV_INDEX];
-  void _setPrev(int offset, int to) { _table[offset + _PREV_INDEX] = to; }
-
-  void _linkLast(int offset) {
-    // Add entry at offset at end of double-linked list.
-    int last = _prev(_HEAD_OFFSET);
-    _setNext(offset, _HEAD_OFFSET);
-    _setPrev(offset, last);
-    _setNext(last, offset);
-    _setPrev(_HEAD_OFFSET, offset);
-  }
-
-  void _unlink(int offset) {
-    assert(offset != _HEAD_OFFSET);
-    int next = _next(offset);
-    int prev = _prev(offset);
-    _setNext(offset, null);
-    _setPrev(offset, null);
-    _setNext(prev, next);
-    _setPrev(next, prev);
-  }
-
-  /**
-   * Copies all non-free entries from the old table to the new empty table.
-   */
-  void _addAllEntries(List oldTable) {
-    int offset = oldTable[_HEAD_OFFSET + _NEXT_INDEX];
-    while (offset != _HEAD_OFFSET) {
-      Object object = oldTable[offset];
-      int nextOffset = oldTable[offset + _NEXT_INDEX];
-      int toOffset = _put(object);
-      _copyEntry(oldTable, offset, toOffset);
-      offset = nextOffset;
-    }
-  }
-
-  void _clear() {
-    if (_elementCount == 0) return;
-    _setNext(_HEAD_OFFSET, _HEAD_OFFSET);
-    _setPrev(_HEAD_OFFSET, _HEAD_OFFSET);
-    for (int i = _entrySize; i < _table.length; i++) {
-      _table[i] = null;
-    }
-    _entryCount = _deletedCount = 0;
-    _recordModification();
-  }
-
-  int _put(K key) {
-    int offset = _probeForAdd(_hashCodeOf(key), key);
-    Object oldEntry = _table[offset];
-    if (identical(oldEntry, _TOMBSTONE)) {
-      _deletedCount--;
-    } else if (oldEntry == null) {
-      _entryCount++;
-    } else {
-      return offset;
-    }
-    _recordModification();
-    _setKey(offset, key);
-    _linkLast(offset);
-    return offset;
-  }
-
-  void _deleteEntry(int offset) {
-    _unlink(offset);
-    _setKey(offset, _TOMBSTONE);
-    _deletedCount++;
-    _recordModification();
-  }
-}
-
-class _LinkedHashTableKeyIterable<K> extends Iterable<K> {
-  final _LinkedHashTable<K> _table;
-  _LinkedHashTableKeyIterable(this._table);
-  Iterator<K> get iterator => new _LinkedHashTableKeyIterator<K>(_table);
-
-  bool contains(Object value) => _table._get(value) >= 0;
-
-  int get length => _table._elementCount;
-}
-
-class _LinkedHashTableKeyIterator<K> extends _LinkedHashTableIterator<K> {
-  _LinkedHashTableKeyIterator(_LinkedHashTable<K> hashTable): super(hashTable);
-
-  K _getCurrent(int offset) => _hashTable._key(offset);
-}
-
-class _LinkedHashTableValueIterable<V> extends Iterable<V> {
-  final _LinkedHashTable _hashTable;
-  final int _valueIndex;
-  _LinkedHashTableValueIterable(this._hashTable, this._valueIndex);
-  Iterator<V> get iterator =>
-      new _LinkedHashTableValueIterator<V>(_hashTable, _valueIndex);
-  int get length => _hashTable._elementCount;
-}
-
-class _LinkedHashTableValueIterator<V> extends _LinkedHashTableIterator<V> {
-  final int _valueIndex;
-
-  _LinkedHashTableValueIterator(_LinkedHashTable hashTable, this._valueIndex)
-      : super(hashTable);
-
-  V _getCurrent(int offset) => _hashTable._table[offset + _valueIndex];
-}
-
-abstract class _LinkedHashTableIterator<T> implements Iterator<T> {
-  final _LinkedHashTable _hashTable;
-  final int _modificationCount;
-  int _offset;
-  T _current;
-
-  _LinkedHashTableIterator(_LinkedHashTable table)
-      : _hashTable = table,
-        _modificationCount = table._modificationCount,
-        _offset = table._next(_LinkedHashTable._HEAD_OFFSET);
-
-  bool moveNext() {
-    _hashTable._checkModification(_modificationCount);
-    if (_offset == _LinkedHashTable._HEAD_OFFSET) {
-      _current = null;
-      return false;
-    }
-    _current = _getCurrent(_offset);
-    _offset = _hashTable._next(_offset);
-    return true;
-  }
-
-  T _getCurrent(int offset);
-
-  T get current => _current;
-}
diff --git a/sdk/lib/collection/list.dart b/sdk/lib/collection/list.dart
new file mode 100644
index 0000000..354e59e
--- /dev/null
+++ b/sdk/lib/collection/list.dart
@@ -0,0 +1,425 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of dart.collection;
+
+/**
+ * Abstract implementation of a list.
+ *
+ * All operations are defined in terms of `length`, `operator[]`,
+ * `operator[]=` and `length=`, which need to be implemented.
+ */
+typedef ListBase<E> = Object with ListMixin<E>;
+
+/**
+ * Base implementation of a [List] class.
+ *
+ * This class can be used as a mixin.
+ *
+ * This implements all read operations using only the `length` and
+ * `operator[]` members. It implements write operations using those and
+ * `length=` and `operator[]=`
+ *
+ * A fixed-length list should mix this class in, and the [FixedLengthListMixin]
+ * as well, in that order, to overwrite the methods that modify the length.
+ *
+ * An unmodifiable list should mix [UnmodifiableListMixin] on top of this
+ * mixin to prevent all modifications.
+ */
+abstract class ListMixin<E> implements List<E> {
+  // Iterable interface.
+  Iterator<E> get iterator => new ListIterator<E>(this);
+
+  E elementAt(int index) => this[index];
+
+  void forEach(void action(E element)) {
+    int length = this.length;
+    for (int i = 0; i < length; i++) {
+      action(this[i]);
+      if (length != this.length) {
+        throw new ConcurrentModificationError(this);
+      }
+    }
+  }
+
+  bool get isEmpty => length == 0;
+
+  E get first {
+    if (length == 0) throw new StateError("No elements");
+    return this[0];
+  }
+
+  E get last {
+    if (length == 0) throw new StateError("No elements");
+    return this[length - 1];
+  }
+
+  E get single {
+    if (length == 0) throw new StateError("No elements");
+    if (length > 1) throw new StateError("Too many elements");
+    return this[0];
+  }
+
+  bool contains(E element) {
+    int length = this.length;
+    for (int i = 0; i < length; i++) {
+      if (this[i] == element) return true;
+      if (length != this.length) {
+        throw new ConcurrentModificationError(this);
+      }
+    }
+    return false;
+  }
+
+  bool every(bool test(E element)) {
+    int length = this.length;
+    for (int i = 0; i < length; i++) {
+      if (!test(this[i])) return false;
+      if (length != this.length) {
+        throw new ConcurrentModificationError(this);
+      }
+    }
+    return true;
+  }
+
+  bool any(bool test(E element)) {
+    int length = this.length;
+    for (int i = 0; i < length; i++) {
+      if (test(this[i])) return true;
+      if (length != this.length) {
+        throw new ConcurrentModificationError(this);
+      }
+    }
+    return false;
+  }
+
+  E firstWhere(bool test(E element), { E orElse() }) {
+    int length = this.length;
+    for (int i = 0; i < length; i++) {
+      E element = this[i];
+      if (test(element)) return element;
+      if (length != this.length) {
+        throw new ConcurrentModificationError(this);
+      }
+    }
+    if (orElse != null) return orElse();
+    throw new StateError("No matching element");
+  }
+
+  E lastWhere(bool test(E element), { E orElse() }) {
+    int length = this.length;
+    for (int i = length - 1; i >= 0; i--) {
+      E element = this[i];
+      if (test(element)) return element;
+      if (length != this.length) {
+        throw new ConcurrentModificationError(this);
+      }
+    }
+    if (orElse != null) return orElse();
+    throw new StateError("No matching element");
+  }
+
+  E singleWhere(bool test(E element)) {
+    int length = this.length;
+    E match = null;
+    bool matchFound = false;
+    for (int i = 0; i < length; i++) {
+      E element = this[i];
+      if (test(element)) {
+        if (matchFound) {
+          throw new StateError("More than one matching element");
+        }
+        matchFound = true;
+        match = element;
+      }
+      if (length != this.length) {
+        throw new ConcurrentModificationError(this);
+      }
+    }
+    if (matchFound) return match;
+    throw new StateError("No matching element");
+  }
+
+  String join([String separator = ""]) {
+    int length = this.length;
+    if (!separator.isEmpty) {
+      if (length == 0) return "";
+      String first = "${this[0]}";
+      if (length != this.length) {
+        throw new ConcurrentModificationError(this);
+      }
+      StringBuffer buffer = new StringBuffer(first);
+      for (int i = 1; i < length; i++) {
+        buffer.write(separator);
+        buffer.write(this[i]);
+        if (length != this.length) {
+          throw new ConcurrentModificationError(this);
+        }
+      }
+      return buffer.toString();
+    } else {
+      StringBuffer buffer = new StringBuffer();
+      for (int i = 0; i < length; i++) {
+        buffer.write(this[i]);
+        if (length != this.length) {
+          throw new ConcurrentModificationError(this);
+        }
+      }
+      return buffer.toString();
+    }
+  }
+
+  Iterable<E> where(bool test(E element)) => new WhereIterable<E>(this, test);
+
+  Iterable map(f(E element)) => new MappedListIterable(this, f);
+
+  E reduce(E combine(E previousValue, E element)) {
+    if (length == 0) throw new StateError("No elements");
+    E value = this[0];
+    for (int i = 1; i < length; i++) {
+      value = combine(value, this[i]);
+    }
+    return value;
+  }
+
+  fold(var initialValue, combine(var previousValue, E element)) {
+    var value = initialValue;
+    int length = this.length;
+    for (int i = 0; i < length; i++) {
+      value = combine(value, this[i]);
+      if (length != this.length) {
+        throw new ConcurrentModificationError(this);
+      }
+    }
+    return value;
+  }
+
+  Iterable<E> skip(int count) => new SubListIterable(this, count, null);
+
+  Iterable<E> skipWhile(bool test(E element)) {
+    return new SkipWhileIterable<E>(this, test);
+  }
+
+  Iterable<E> take(int count) => new SubListIterable(this, 0, count);
+
+  Iterable<E> takeWhile(bool test(E element)) {
+    return new TakeWhileIterable<E>(this, test);
+  }
+
+  List<E> toList({ bool growable: true }) {
+    List<E> result;
+    if (growable) {
+      result = new List<E>()..length = length;
+    } else {
+      result = new List<E>(length);
+    }
+    for (int i = 0; i < length; i++) {
+      result[i] = this[i];
+    }
+    return result;
+  }
+
+  Set<E> toSet() {
+    Set<E> result = new Set<E>();
+    for (int i = 0; i < length; i++) {
+      result.add(this[i]);
+    }
+    return result;
+  }
+
+  // Collection interface.
+  void add(E element) {
+    this[this.length++] = element;
+  }
+
+  void addAll(Iterable<E> iterable) {
+    for (E element in iterable) {
+      this[this.length++] = element;
+    }
+  }
+
+  void remove(Object element) {
+    for (int i = 0; i < this.length; i++) {
+      if (this[i] == element) {
+        this.setRange(i, this.length - i - 1, this, i + 1);
+        this.length -= 1;
+        return;
+      }
+    }
+  }
+
+  void removeWhere(bool test(E element)) {
+    _filter(this, test, false);
+  }
+
+  void retainWhere(bool test(E element)) {
+    _filter(this, test, true);
+  }
+
+  static void _filter(List source,
+                      bool test(var element),
+                      bool retainMatching) {
+    List retained = [];
+    int length = source.length;
+    for (int i = 0; i < length; i++) {
+      var element = source[i];
+      if (test(element) == retainMatching) {
+        retained.add(element);
+      }
+      if (length != source.length) {
+        throw new ConcurrentModificationError(source);
+      }
+    }
+    if (retained.length != source.length) {
+      source.setRange(0, retained.length, retained);
+      source.length = retained.length;
+    }
+  }
+
+  void clear() { this.length = 0; }
+
+  // List interface.
+
+  E removeLast() {
+    if (length == 0) {
+      throw new StateError("No elements");
+    }
+    E result = this[length - 1];
+    length--;
+    return result;
+  }
+
+  void sort([Comparator<E> compare]) {
+    Sort.sort(this, compare);
+  }
+
+  Map<int, E> asMap() {
+    return new ListMapView(this);
+  }
+
+  List<E> sublist(int start, [int end]) {
+    if (end == null) end = length;
+    if (start < 0 || start > this.length) {
+      throw new RangeError.range(start, 0, this.length);
+    }
+    if (end < start || end > this.length) {
+      throw new RangeError.range(end, start, this.length);
+    }
+    int length = end - start;
+    List<E> result = new List<E>()..length = length;
+    for (int i = 0; i < length; i++) {
+      result[i] = this[start + i];
+    }
+    return result;
+  }
+
+  Iterable<E> getRange(int start, int end) {
+    if (start < 0 || start > this.length) {
+      throw new RangeError.range(start, 0, this.length);
+    }
+    if (end < start || end > this.length) {
+      throw new RangeError.range(end, start, this.length);
+    }
+    return new SubListIterable(this, start, end);
+  }
+
+  void insertRange(int start, int length, [E initialValue]) {
+    if (start < 0 || start > this.length) {
+      throw new RangeError.range(start, 0, this.length);
+    }
+    int oldLength = this.length;
+    int moveLength = oldLength - start;
+    this.length += length;
+    if (moveLength > 0) {
+      this.setRange(start + length, moveLength, this, start);
+    }
+    for (int i = 0; i < length; i++) {
+      this[start + i] = initialValue;
+    }
+  }
+
+  void removeRange(int start, int length) {
+    if (start < 0 || start > this.length) {
+      throw new RangeError.range(start, 0, this.length);
+    }
+    if (length < 0 || start + length > this.length) {
+      throw new RangeError.range(length, 0, this.length - start);
+    }
+    int end = start + length;
+    setRange(start, this.length - end, this, end);
+    this.length -= length;
+  }
+
+  void clearRange(int start, int length, [E fill]) {
+    for (int i = 0; i < length; i++) {
+      this[start + i] = fill;
+    }
+  }
+
+  void setRange(int start, int length, List<E> from, [int startFrom]) {
+    if (start < 0 || start > this.length) {
+      throw new RangeError.range(start, 0, this.length);
+    }
+    if (length < 0 || start + length > this.length) {
+      throw new RangeError.range(length, 0, this.length - start);
+    }
+    if (startFrom == null) {
+      startFrom = 0;
+    }
+    if (startFrom < 0 || startFrom + length > from.length) {
+      throw new RangeError.range(startFrom, 0, from.length - length);
+    }
+    if (startFrom < start) {
+      // Copy backwards to ensure correct copy if [from] is this.
+      for (int i = length - 1; i >= 0; i--) {
+        this[start + i] = from[startFrom + i];
+      }
+    } else {
+      for (int i = 0; i < length; i++) {
+        this[start + i] = from[startFrom + i];
+      }
+    }
+  }
+
+  int indexOf(E element, [int startIndex = 0]) {
+    if (startIndex >= this.length) {
+      return -1;
+    }
+    if (startIndex < 0) {
+      startIndex = 0;
+    }
+    for (int i = startIndex; i < this.length; i++) {
+      if (this[i] == element) {
+        return i;
+      }
+    }
+    return -1;
+  }
+
+  /**
+   * Returns the last index in the list [a] of the given [element], starting
+   * the search at index [startIndex] to 0.
+   * Returns -1 if [element] is not found.
+   */
+  int lastIndexOf(E element, [int startIndex]) {
+    if (startIndex == null) {
+      startIndex = this.length - 1;
+    } else {
+      if (startIndex < 0) {
+        return -1;
+      }
+      if (startIndex >= this.length) {
+        startIndex = this.length - 1;
+      }
+    }
+    for (int i = startIndex; i >= 0; i--) {
+      if (this[i] == element) {
+        return i;
+      }
+    }
+    return -1;
+  }
+
+  Iterable<E> get reversed => new ReversedListIterable(this);
+}
diff --git a/sdk/lib/collection/queue.dart b/sdk/lib/collection/queue.dart
index c6cca9f..85947d0 100644
--- a/sdk/lib/collection/queue.dart
+++ b/sdk/lib/collection/queue.dart
@@ -9,7 +9,7 @@
  * can iterate over the elements of a queue through [forEach] or with
  * an [Iterator].
  */
-abstract class Queue<E> implements Collection<E> {
+abstract class Queue<E> implements Iterable<E> {
 
   /**
    * Creates a queue.
@@ -160,7 +160,7 @@
  *
  * Can do [removeAll] and [retainAll] in linear time.
  */
-class DoubleLinkedQueue<E> extends Collection<E> implements Queue<E> {
+class DoubleLinkedQueue<E> extends Iterable<E> implements Queue<E> {
   _DoubleLinkedQueueEntrySentinel<E> _sentinel;
   int _elementCount = 0;
 
@@ -224,33 +224,42 @@
     }
   }
 
+  void retainAll(Iterable elements) {
+    _filterIterable(elements, true);
+  }
+
   void removeAll(Iterable elements) {
-    // Use this method when remove is slow and removeWhere more efficient.
-    IterableMixinWorkaround.removeAllList(this, elements);
+    _filterIterable(elements, false);
+  }
+
+  void _filterIterable(Iterable elements, bool retainMatching) {
+    Set elementSet;
+    if (elements is Set) {
+      elementSet = elements;
+    } else {
+      elementSet = elements.toSet();
+    }
+    _filter(elementSet.contains, retainMatching);
+  }
+
+  void _filter(bool test(E element), bool retainMatching) {
+    DoubleLinkedQueueEntry<E> entry = firstEntry();
+    while (!identical(entry, _sentinel)) {
+      DoubleLinkedQueueEntry<E> next = entry._next;
+      if (test(entry.element) != retainMatching) {
+        entry.remove();
+        _elementCount--;
+      }
+      entry = next;
+    }
   }
 
   void removeWhere(bool test(E element)) {
-    DoubleLinkedQueueEntry<E> entry = firstEntry();
-    while (!identical(entry, _sentinel)) {
-      DoubleLinkedQueueEntry<E> next = entry._next;
-      if (test(entry.element)) {
-        entry.remove();
-        _elementCount--;
-      }
-      entry = next;
-    }
+    _filter(test, false);
   }
 
   void retainWhere(bool test(E element)) {
-    DoubleLinkedQueueEntry<E> entry = firstEntry();
-    while (!identical(entry, _sentinel)) {
-      DoubleLinkedQueueEntry<E> next = entry._next;
-      if (!test(entry.element)) {
-        entry.remove();
-        _elementCount--;
-      }
-      entry = next;
-    }
+    _filter(test, true);
   }
 
   E get first {
@@ -301,7 +310,7 @@
   }
 
   String toString() {
-    return Collections.collectionToString(this);
+    return ToString.iterableToString(this);
   }
 }
 
@@ -342,10 +351,10 @@
  *
  * The structure is efficient for any queue or stack usage.
  *
- * Collection operations like [removeAll] and [removeWhere] are very
+ * Operations like [removeAll] and [removeWhere] are very
  * inefficient. If those are needed, use a [DoubleLinkedQueue] instead.
  */
-class ListQueue<E> extends Collection<E> implements Queue<E>{
+class ListQueue<E> extends Iterable<E> implements Queue<E>{
   static const int _INITIAL_CAPACITY = 8;
   List<E> _table;
   int _head;
@@ -481,14 +490,6 @@
     _modificationCount++;
   }
 
-  void removeAll(Iterable objectsToRemove) {
-    IterableMixinWorkaround.removeAllList(this, objectsToRemove);
-  }
-
-  void retainAll(Iterable objectsToRetain) {
-    IterableMixinWorkaround.retainAll(this, objectsToRetain);
-  }
-
   void _filterWhere(bool test(E element), bool removeMatching) {
     int index = _head;
     int modificationCount = _modificationCount;
@@ -537,7 +538,7 @@
   }
 
   String toString() {
-    return Collections.collectionToString(this);
+    return ToString.iterableToString(this);
   }
 
   // Queue interface.
diff --git a/sdk/lib/collection/splay_tree.dart b/sdk/lib/collection/splay_tree.dart
index 5a5db4d..3b83641 100644
--- a/sdk/lib/collection/splay_tree.dart
+++ b/sdk/lib/collection/splay_tree.dart
@@ -86,10 +86,10 @@
     _SplayTreeNode<K> current = _root;
     int comp;
     while (true) {
-      comp = current.key.compareTo(key);
+      comp = _compare(current.key, key);
       if (comp > 0) {
         if (current.left == null) break;
-        comp = current.left.key.compareTo(key);
+        comp = _compare(current.left.key, key);
         if (comp > 0) {
           // Rotate right.
           _SplayTreeNode<K> tmp = current.left;
@@ -104,7 +104,7 @@
         current = current.left;
       } else if (comp < 0) {
         if (current.right == null) break;
-        comp = current.right.key.compareTo(key);
+        comp = _compare(current.right.key, key);
         if (comp < 0) {
           // Rotate left.
           _SplayTreeNode<K> tmp = current.right;
@@ -256,15 +256,18 @@
     if (key == null) throw new ArgumentError(key);
     if (_root != null) {
       int comp = _splay(key);
-      if (comp == 0) return _root.value;
+      if (comp == 0) {
+        _SplayTreeMapNode mapRoot = _root;
+        return mapRoot.value;
+      }
     }
     return null;
   }
 
   V remove(Object key) {
     if (key is! K) return null;
-    _SplayTreeMapNode root = _remove(key);
-    if (root != null) return root.value;
+    _SplayTreeMapNode mapRoot = _remove(key);
+    if (mapRoot != null) return mapRoot.value;
     return null;
   }
 
@@ -274,7 +277,8 @@
     // the key to the root of the tree.
     int comp = _splay(key);
     if (comp == 0) {
-      _root.value = value;
+      _SplayTreeMapNode mapRoot = _root;
+      mapRoot.value = value;
       return;
     }
     _addNewRoot(new _SplayTreeMapNode(key, value), comp);
@@ -284,7 +288,10 @@
   V putIfAbsent(K key, V ifAbsent()) {
     if (key == null) throw new ArgumentError(key);
     int comp = _splay(key);
-    if (comp == 0) return _root.value;
+    if (comp == 0) {
+      _SplayTreeMapNode mapRoot = _root;
+      return mapRoot.value;
+    }
     int modificationCount = _modificationCount;
     int splayCount = _splayCount;
     V value = ifAbsent();
@@ -330,7 +337,7 @@
   bool containsValue(V value) {
     bool found = false;
     int initialSplayCount = _splayCount;
-    bool visit(_SplayTreeNode node) {
+    bool visit(_SplayTreeMapNode node) {
       while (node != null) {
         if (node.value == value) return true;
         if (initialSplayCount != _splayCount) {
diff --git a/sdk/lib/core/collection.dart b/sdk/lib/core/collection.dart
deleted file mode 100644
index 6a725a1..0000000
--- a/sdk/lib/core/collection.dart
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * A collection of individual elements.
- *
- * A [Collection] contains some elements in a structure optimized
- * for certain operations. Different collections are optimized for different
- * uses.
- *
- * A collection can be updated by adding or removing elements.
- *
- * Collections are [Iterable]. The order of iteration is defined by
- * each type of collection.
- *
- * *Deprecated*: This class is deprecated and will be removed soon.
- */
-abstract class Collection<E> extends Iterable<E> {
-  const Collection();
-
-  /**
-   * Adds an element to this collection.
-   */
-  void add(E element);
-
-  /**
-   * Adds all of [elements] to this collection.
-   *
-   * Equivalent to adding each element in [elements] using [add],
-   * but some collections may be able to optimize it.
-   */
-  void addAll(Iterable<E> elements) {
-    for (E element in elements) {
-      add(element);
-    }
-  }
-
-  /**
-   * Removes an instance of [element] from this collection.
-   *
-   * This removes only one instance of the element for collections that can
-   * contain the same element more than once (e.g., [List]). Which instance
-   * is removed is decided by the collection.
-   *
-   * Has no effect if the elements is not in this collection.
-   */
-  void remove(Object element);
-
-  /**
-   * Removes all of [elements] from this collection.
-   *
-   * Equivalent to calling [remove] once for each element in
-   * [elements], but may be faster for some collections.
-   */
-  void removeAll(Iterable elements) {
-    IterableMixinWorkaround.removeAll(this, elements);
-  }
-
-  /**
-   * Removes all elements of this collection that are not
-   * in [elements].
-   *
-   * For [Set]s, this is the intersection of the two original sets.
-   */
-  void retainAll(Iterable elements) {
-    IterableMixinWorkaround.retainAll(this, elements);
-  }
-
-  /**
-   * Removes all elements of this collection that satisfy [test].
-   *
-   * An elements [:e:] satisfies [test] if [:test(e):] is true.
-   */
-  void removeWhere(bool test(E element)) {
-    IterableMixinWorkaround.removeWhere(this, test);
-  }
-
-  /**
-   * Removes all elements of this collection that fail to satisfy [test].
-   *
-   * An elements [:e:] satisfies [test] if [:test(e):] is true.
-   */
-  void retainWhere(bool test(E element)) {
-    IterableMixinWorkaround.retainWhere(this, test);
-  }
-
-  /**
-   * Removes all elements of this collection.
-   */
-  void clear() {
-    IterableMixinWorkaround.removeWhere(this, (E e) => true);
-  }
-}
diff --git a/sdk/lib/core/core.dart b/sdk/lib/core/core.dart
index dd6ee8f..df5da14 100644
--- a/sdk/lib/core/core.dart
+++ b/sdk/lib/core/core.dart
@@ -8,7 +8,6 @@
 import "dart:_collection-dev";
 
 part "bool.dart";
-part "collection.dart";
 part "comparable.dart";
 part "date_time.dart";
 part "double.dart";
@@ -16,7 +15,6 @@
 part "errors.dart";
 part "exceptions.dart";
 part "expando.dart";
-part "expect.dart";
 part "function.dart";
 part "identical.dart";
 part "int.dart";
@@ -36,4 +34,5 @@
 part "string.dart";
 part "string_buffer.dart";
 part "string_sink.dart";
+part "symbol.dart";
 part "type.dart";
diff --git a/sdk/lib/core/corelib_sources.gypi b/sdk/lib/core/corelib_sources.gypi
index 290b507..10ae786 100644
--- a/sdk/lib/core/corelib_sources.gypi
+++ b/sdk/lib/core/corelib_sources.gypi
@@ -7,23 +7,21 @@
     'core.dart',
     # The above file needs to be first as it lists the parts below.
     'bool.dart',
-    'collection.dart',
     'comparable.dart',
     'date_time.dart',
     'double.dart',
     'duration.dart',
-    'exceptions.dart',
     'errors.dart',
+    'exceptions.dart',
     'expando.dart',
-    'expect.dart',
     'function.dart',
     'identical.dart',
     'int.dart',
     'invocation_mirror.dart',
     'iterable.dart',
     'iterator.dart',
-    'map.dart',
     'list.dart',
+    'map.dart',
     'num.dart',
     'object.dart',
     'pattern.dart',
@@ -35,6 +33,7 @@
     'string.dart',
     'string_buffer.dart',
     'string_sink.dart',
+    'symbol.dart',
     'type.dart',
   ],
 }
diff --git a/sdk/lib/core/date_time.dart b/sdk/lib/core/date_time.dart
index 5b26fc8..9902b82 100644
--- a/sdk/lib/core/date_time.dart
+++ b/sdk/lib/core/date_time.dart
@@ -15,28 +15,28 @@
  */
 class DateTime {
   // Weekday constants that are returned by [weekday] method:
-  static const int MON = 1;
-  static const int TUE = 2;
-  static const int WED = 3;
-  static const int THU = 4;
-  static const int FRI = 5;
-  static const int SAT = 6;
-  static const int SUN = 7;
+  static const int MONDAY = 1;
+  static const int TUESDAY = 2;
+  static const int WEDNESDAY = 3;
+  static const int THURSDAY = 4;
+  static const int FRIDAY = 5;
+  static const int SATURDAY = 6;
+  static const int SUNDAY = 7;
   static const int DAYS_IN_WEEK = 7;
 
   // Month constants that are returned by the [month] getter.
-  static const int JAN = 1;
-  static const int FEB = 2;
-  static const int MAR = 3;
-  static const int APR = 4;
+  static const int JANUARY = 1;
+  static const int FEBRUARY = 2;
+  static const int MARCH = 3;
+  static const int APRIL = 4;
   static const int MAY = 5;
-  static const int JUN = 6;
-  static const int JUL = 7;
-  static const int AUG = 8;
-  static const int SEP = 9;
-  static const int OCT = 10;
-  static const int NOV = 11;
-  static const int DEC = 12;
+  static const int JUNE = 6;
+  static const int JULY = 7;
+  static const int AUGUST = 8;
+  static const int SEPTEMBER = 9;
+  static const int OCTOBER = 10;
+  static const int NOVEMBER = 11;
+  static const int DECEMBER = 12;
 
   /**
    * The milliseconds since 1970-01-01T00:00:00Z (UTC). This value is
@@ -191,48 +191,6 @@
   /**
    * Returns true if [this] occurs before [other]. The comparison is independent
    * of whether the time is in UTC or in the local time zone.
-   *
-   * *Deprecated* Use [isBefore] instead.
-   */
-  @deprecated
-  bool operator <(DateTime other)
-      => millisecondsSinceEpoch < other.millisecondsSinceEpoch;
-
-  /**
-   * Returns true if [this] occurs at the same time or before [other]. The
-   * comparison is independent of whether the time is in UTC or in the local
-   * time zone.
-   *
-   * *Deprecated* Use [isAfter] instead ([:!isAfter:]).
-   */
-  @deprecated
-  bool operator <=(DateTime other)
-      => millisecondsSinceEpoch <= other.millisecondsSinceEpoch;
-
-  /**
-   * Returns true if [this] occurs after [other]. The comparison is independent
-   * of whether the time is in UTC or in the local time zone.
-   *
-   * *Deprecated* Use [isAfter] instead.
-   */
-  @deprecated
-  bool operator >(DateTime other)
-      => millisecondsSinceEpoch > other.millisecondsSinceEpoch;
-
-  /**
-   * Returns true if [this] occurs at the same time or after [other]. The
-   * comparison is independent of whether the time is in UTC or in the local
-   * time zone.
-   *
-   * *Deprecated* Use [isBefore] instead ([:!isBefore:]).
-   */
-  @deprecated
-  bool operator >=(DateTime other)
-      => millisecondsSinceEpoch >= other.millisecondsSinceEpoch;
-
-  /**
-   * Returns true if [this] occurs before [other]. The comparison is independent
-   * of whether the time is in UTC or in the local time zone.
    */
   bool isBefore(DateTime other) {
     return millisecondsSinceEpoch < other.millisecondsSinceEpoch;
diff --git a/sdk/lib/core/iterable.dart b/sdk/lib/core/iterable.dart
index 0fda6f1..d1583dc 100644
--- a/sdk/lib/core/iterable.dart
+++ b/sdk/lib/core/iterable.dart
@@ -93,22 +93,24 @@
   }
 
   /**
-   * Reduce a collection to a single value by iteratively combining each element
-   * of the collection with an existing value using the provided function.
-   * Use [initialValue] as the initial value, and the function [combine] to
-   * create a new value from the previous one and an element.
+   * Reduce a collection to a single value by iteratively combining elements
+   * of the collection using the provided function.
    *
    * Example of calculating the sum of an iterable:
    *
-   *   iterable.reduce((prev, element) => prev + element);
+   *     iterable.reduce((value, element) => value + element);
    *
-   * *UPCOMING API-CHANGE*: this method will soon be changed to not take
-   * an initial value: `iterable.reduce(min)`. Use [fold] instead.
    */
-  @deprecated
-  dynamic reduce(var initialValue,
-                 dynamic combine(var previousValue, E element)) {
-    return fold(initialValue, combine);
+  E reduce(E combine(E value, E element)) {
+    Iterator<E> iterator = this.iterator;
+    if (!iterator.moveNext()) {
+      throw new StateError("No elements");
+    }
+    E value = iterator.current;
+    while (iterator.moveNext()) {
+      value = combine(value, iterator.current);
+    }
+    return value;
   }
 
   /**
@@ -119,7 +121,8 @@
    *
    * Example of calculating the sum of an iterable:
    *
-   *   iterable.fold(0, (prev, element) => prev + element);
+   *     iterable.fold(0, (prev, element) => prev + element);
+   *
    */
   dynamic fold(var initialValue,
                dynamic combine(var previousValue, E element)) {
@@ -146,9 +149,9 @@
    * Then concatenates the strings, optionally separated by the [separator]
    * string.
    */
-  String join([String separator]) {
+  String join([String separator = ""]) {
     StringBuffer buffer = new StringBuffer();
-    buffer.writeAll(this, separator == null ? "" : separator);
+    buffer.writeAll(this, separator);
     return buffer.toString();
   }
 
@@ -183,58 +186,6 @@
   }
 
   /**
-   * Find the least element in the iterable.
-   *
-   * Returns null if the iterable is empty.
-   * Otherwise returns an element [:x:] of this [Iterable] so that
-   * [:x:] is not greater than [:y:] (that is, [:compare(x, y) <= 0:]) for all
-   * other elements [:y:] in the iterable.
-   *
-   * The [compare] function must be a proper [Comparator<T>]. If a function is
-   * not provided, [compare] defaults to [Comparable.compare].
-   *
-   * *Deprecated*. Use [reduce] with a binary min method if needed.
-   */
-  @deprecated
-  E min([int compare(E a, E b)]) {
-    if (compare == null) compare = Comparable.compare;
-    Iterator it = iterator;
-    if (!it.moveNext()) return null;
-    E min = it.current;
-    while (it.moveNext()) {
-      E current = it.current;
-      if (compare(min, current) > 0) min = current;
-    }
-    return min;
-  }
-
-  /**
-   * Find the largest element in the iterable.
-   *
-   * Returns null if the iterable is empty.
-   * Otherwise returns an element [:x:] of this [Iterable] so that
-   * [:x:] is not smaller than [:y:] (that is, [:compare(x, y) >= 0:]) for all
-   * other elements [:y:] in the iterable.
-   *
-   * The [compare] function must be a proper [Comparator<T>]. If a function is
-   * not provided, [compare] defaults to [Comparable.compare].
-   *
-   * *Deprecated*. Use [reduce] with a binary max method if needed.
-   */
-  @deprecated
-  E max([int compare(E a, E b)]) {
-    if (compare == null) compare = Comparable.compare;
-    Iterator it = iterator;
-    if (!it.moveNext()) return null;
-    E max = it.current;
-    while (it.moveNext()) {
-      E current = it.current;
-      if (compare(max, current) < 0) max = current;
-    }
-    return max;
-  }
-
-  /**
    * Returns true if there is no element in this collection.
    */
   bool get isEmpty => !iterator.moveNext();
diff --git a/sdk/lib/core/list.dart b/sdk/lib/core/list.dart
index f144782..27a857e 100644
--- a/sdk/lib/core/list.dart
+++ b/sdk/lib/core/list.dart
@@ -34,7 +34,7 @@
  *    unmodifiableList.add(499);  // throws
  *    unmodifiableList[0] = 87;  // throws.
  */
-abstract class List<E> implements Collection<E> {
+abstract class List<E> implements Iterable<E> {
   /**
    * Creates a list of the given [length].
    *
@@ -50,18 +50,6 @@
   external factory List.filled(int length, E fill);
 
   /**
-   * *Deprecated*: Use `new List(count)` instead.
-   */
-  @deprecated
-  factory List.fixedLength(int count, { E fill }) {
-    List<E> result = new List(count);
-    if (fill != null) {
-      for (int i = 0; i < count; i++) result[i] = fill;
-    }
-    return result;
-  }
-
-  /**
    * Creates an list with the elements of [other]. The order in
    * the list will be the order provided by the iterator of [other].
    *
@@ -118,6 +106,13 @@
   void operator []=(int index, E value);
 
   /**
+   * Returns the number of elements in the list.
+   *
+   * The valid indices for a list are 0 through `length - 1`.
+   */
+  int get length;
+
+  /**
    * Changes the length of the list. If [newLength] is greater than
    * the current [length], entries are initialized to [:null:]. Throws
    * an [UnsupportedError] if the list is not extendable.
@@ -194,6 +189,13 @@
   void insert(int index, E element);
 
   /**
+   * Removes [value] from the list. Returns true if [value] was
+   * in the list. Returns false otherwise. The method has no effect
+   * if [value] value was not in the list.
+   */
+  bool remove(Object value);
+
+  /**
    * Removes the element at position [index] from the list.
    *
    * This reduces the length of the list by one and moves all later elements
@@ -215,7 +217,21 @@
   E removeLast();
 
   /**
-   * Returns a new list containing the elemenst from [start] to [end].
+   * Removes all elements of this list that satisfy [test].
+   *
+   * An elements [:e:] satisfies [test] if [:test(e):] is true.
+   */
+  void removeWhere(bool test(E element));
+
+  /**
+   * Removes all elements of this list that fail to satisfy [test].
+   *
+   * An elements [:e:] satisfies [test] if [:test(e):] is true.
+   */
+  void retainWhere(bool test(E element));
+
+  /**
+   * Returns a new list containing the elements from [start] to [end].
    *
    * If [end] is omitted, the [length] of the list is used.
    *
@@ -225,10 +241,26 @@
   List<E> sublist(int start, [int end]);
 
   /**
-   * *Deprecated*. Use [sublist] instead.
+   * Returns an [Iterable] that iterators over the elements in the range
+   * [start] to [end] (exclusive). The result of this function is backed by
+   * `this`.
+   *
+   * It is an error if [end] is before [start].
+   *
+   * It is an error if the [start] and [end] are not valid ranges at the time
+   * of the call to this method. The returned [Iterable] behaves similar to
+   * `skip(start).take(end - start)`. That is, it will not throw exceptions
+   * if `this` changes size.
+   *
+   * Example:
+   *
+   *     var list = [1, 2, 3, 4, 5];
+   *     var range = list.getRange(1, 4);
+   *     print(range.join(', '));  // => 2, 3, 4
+   *     list.length = 3;
+   *     print(range.join(', '));  // => 2, 3
    */
-  @deprecated
-  List<E> getRange(int start, int length);
+  Iterable<E> getRange(int start, int end);
 
   /**
    * Copies [length] elements of [from], starting
diff --git a/sdk/lib/core/set.dart b/sdk/lib/core/set.dart
index 8856d41..1a8fd15 100644
--- a/sdk/lib/core/set.dart
+++ b/sdk/lib/core/set.dart
@@ -8,7 +8,7 @@
  * This class is the public interface of a set. A set is a collection
  * without duplicates.
  */
-abstract class Set<E> extends Collection<E> {
+abstract class Set<E> extends Iterable<E> {
   factory Set() => new HashSet<E>();
 
   /**
@@ -28,6 +28,14 @@
   void add(E value);
 
   /**
+   * Adds all of [elements] to this Set.
+   *
+   * Equivalent to adding each element in [elements] using [add],
+   * but some collections may be able to optimize it.
+   */
+  void addAll(Iterable<E> elements);
+
+  /**
    * Removes [value] from the set. Returns true if [value] was
    * in the set. Returns false otherwise. The method has no effect
    * if [value] value was not in the set.
@@ -35,13 +43,25 @@
   bool remove(Object value);
 
   /**
-   * Returns true if [other] contains all the elements of this Set.
-   *
-   * *Deprecated*. Use `other.containsAll(thisSet)` instead if [other]
-   * is a Set, and convert `other` to a Set if it isn't.
+   * Removes all of [elements] from this set.
    */
-  @deprecated
-  bool isSubsetOf(Iterable<E> other);
+  void removeAll(Iterable elements);
+
+  /**
+   * Removes all elements of this set that are not
+   * in [elements].
+   */
+  void retainAll(Iterable elements);
+
+  /**
+   * Removes all elements of this set that satisfy [test].
+   */
+  void removeWhere(bool test(E element));
+
+  /**
+   * Removes all elements of this set that fail to satisfy [test].
+   */
+  void retainWhere(bool test(E element));
 
   /**
    * Returns true if this Set contains all the elements of [other].
diff --git a/sdk/lib/core/string.dart b/sdk/lib/core/string.dart
index 34aafd1..36a2e60 100644
--- a/sdk/lib/core/string.dart
+++ b/sdk/lib/core/string.dart
@@ -139,12 +139,6 @@
   String operator +(String other);
 
   /**
-   * *Deprecated* Use [operator+] instead.
-   */
-  @deprecated
-  String concat(String other);
-
-  /**
    * Returns a slice of this string from [startIndex] to [endIndex].
    *
    * If [startIndex] is omitted, it defaults to the start of the string.
diff --git a/sdk/lib/core/string_buffer.dart b/sdk/lib/core/string_buffer.dart
index 6ecdc57..8ea4bf1 100644
--- a/sdk/lib/core/string_buffer.dart
+++ b/sdk/lib/core/string_buffer.dart
@@ -32,7 +32,7 @@
   void writeAll(Iterable objects, [String separator = ""]) {
     Iterator iterator = objects.iterator;
     if (!iterator.moveNext()) return;
-    if (separator == "") {
+    if (separator.isEmpty) {
       do {
         write(iterator.current);
       } while (iterator.moveNext());
diff --git a/sdk/lib/core/symbol.dart b/sdk/lib/core/symbol.dart
new file mode 100644
index 0000000..e2b686c
--- /dev/null
+++ b/sdk/lib/core/symbol.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of dart.core;
+
+/// Opaque name used by mirrors, invocations and [Function.apply].
+class Symbol {
+
+  /**
+   * Constructs a new Symbol.
+   *
+   * An [ArgumentError] is thrown if [name] starts with an underscore,
+   * or if [name] is not a [String].  An [ArgumentError] is thrown if
+   * [name] is not an empty string and is not a valid identifier
+   * optionally followed by [:'=':].
+   */
+  external const Symbol(String name);
+
+  external bool operator ==(other);
+
+  external int get hashCode;
+}
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index f46a08f..abb637f 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -38,7 +38,7 @@
 /**
  * The top-level Document object.
  */
-HtmlDocument get document => JS('Document', 'document');
+HtmlDocument get document => JS('HtmlDocument', 'document');
 
 Element query(String selector) => document.query(selector);
 List<Element> queryAll(String selector) => document.queryAll(selector);
@@ -684,10 +684,6 @@
 @DomName('HTMLBodyElement')
 class BodyElement extends Element native "*HTMLBodyElement" {
 
-  @DomName('HTMLBodyElement.beforeunloadEvent')
-  @DocsEditable
-  static const EventStreamProvider<Event> beforeUnloadEvent = const EventStreamProvider<Event>('beforeunload');
-
   @DomName('HTMLBodyElement.blurEvent')
   @DocsEditable
   static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
@@ -740,10 +736,6 @@
   @DocsEditable
   factory BodyElement() => document.$dom_createElement("body");
 
-  @DomName('HTMLBodyElement.onbeforeunload')
-  @DocsEditable
-  Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
-
   @DomName('HTMLBodyElement.onblur')
   @DocsEditable
   Stream<Event> get onBlur => blurEvent.forTarget(this);
@@ -949,7 +941,7 @@
    * Example usage:
    *
    *     CanvasElement canvas = new CanvasElement();
-   *     var ctx = canvas.context2d
+   *     var ctx = canvas.context2D
    *     ..fillStyle = "rgb(200,0,0)"
    *     ..fillRect(10, 10, 55, 50);
    *     var dataUrl = canvas.toDataURL("image/jpeg", 0.95);
@@ -974,7 +966,12 @@
   @DocsEditable
   String toDataUrl(String type, [num quality]) native;
 
-  CanvasRenderingContext2D get context2d => getContext('2d');
+  /** An API for drawing on this canvas. */
+  CanvasRenderingContext2D get context2D =>
+      JS('Null|CanvasRenderingContext2D', '#.getContext(#)', this, '2d');
+
+  @deprecated
+  CanvasRenderingContext2D get context2d => this.context2D;
 
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
@@ -1012,7 +1009,7 @@
  * Example usage:
  *
  *     var canvas = new CanvasElement(width: 600, height: 600);
- *     var ctx = canvas.context2d;
+ *     var ctx = canvas.context2D;
  *     ctx.clearRect(0, 0, 600, 600);
  *     ctx.save();
  *     // Create radial gradient.
@@ -1062,7 +1059,7 @@
  * Example usage:
  *
  *     var canvas = new CanvasElement(width: 600, height: 600);
- *     var ctx = canvas.context2d;
+ *     var ctx = canvas.context2D;
  *     var img = new ImageElement();
  *     // Image src needs to be loaded before pattern is applied.
  *     img.onLoad.listen((event) {
@@ -1485,7 +1482,7 @@
    * will allow, the image will be clipped to fit the available space.
    *
    *     CanvasElement canvas = new CanvasElement(width: 600, height: 600);
-   *     CanvasRenderingContext2D ctx = canvas.context2d;
+   *     CanvasRenderingContext2D ctx = canvas.context2D;
    *     ImageElement img = document.query('img');
    *     img.width = 100;
    *     img.height = 100;
@@ -1543,7 +1540,7 @@
    * available space.
    *
    *     CanvasElement canvas = new CanvasElement(width: 600, height: 600);
-   *     CanvasRenderingContext2D ctx = canvas.context2d;
+   *     CanvasRenderingContext2D ctx = canvas.context2D;
    *     ImageElement img = document.query('img');
    *
    *     ctx.drawImage(img, 100, 100);
@@ -1578,7 +1575,7 @@
    * will allow, the image will be clipped to fit the available space.
    *
    *     CanvasElement canvas = new CanvasElement(width: 600, height: 600);
-   *     CanvasRenderingContext2D ctx = canvas.context2d;
+   *     CanvasRenderingContext2D ctx = canvas.context2D;
    *     ImageElement img = document.query('img');
    *     img.width = 100;
    *     img.height = 100;
@@ -1920,27 +1917,6 @@
 
 
 @DocsEditable
-@DomName('Counter')
-class Counter native "*Counter" {
-
-  @DomName('Counter.identifier')
-  @DocsEditable
-  final String identifier;
-
-  @DomName('Counter.listStyle')
-  @DocsEditable
-  final String listStyle;
-
-  @DomName('Counter.separator')
-  @DocsEditable
-  final String separator;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
 @DomName('Crypto')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -2082,160 +2058,6 @@
 
 
 @DocsEditable
-@DomName('WebKitCSSMatrix')
-@SupportedBrowser(SupportedBrowser.CHROME)
-@SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental
-class CssMatrix native "*WebKitCSSMatrix" {
-
-  @DomName('WebKitCSSMatrix.WebKitCSSMatrix')
-  @DocsEditable
-  factory CssMatrix([String cssValue]) {
-    if (?cssValue) {
-      return CssMatrix._create_1(cssValue);
-    }
-    return CssMatrix._create_2();
-  }
-  static CssMatrix _create_1(cssValue) => JS('CssMatrix', 'new WebKitCSSMatrix(#)', cssValue);
-  static CssMatrix _create_2() => JS('CssMatrix', 'new WebKitCSSMatrix()');
-
-  /// Checks if this type is supported on the current platform.
-  static bool get supported => JS('bool', '!!(window.WebKitCSSMatrix)');
-
-  @DomName('WebKitCSSMatrix.a')
-  @DocsEditable
-  num a;
-
-  @DomName('WebKitCSSMatrix.b')
-  @DocsEditable
-  num b;
-
-  @DomName('WebKitCSSMatrix.c')
-  @DocsEditable
-  num c;
-
-  @DomName('WebKitCSSMatrix.d')
-  @DocsEditable
-  num d;
-
-  @DomName('WebKitCSSMatrix.e')
-  @DocsEditable
-  num e;
-
-  @DomName('WebKitCSSMatrix.f')
-  @DocsEditable
-  num f;
-
-  @DomName('WebKitCSSMatrix.m11')
-  @DocsEditable
-  num m11;
-
-  @DomName('WebKitCSSMatrix.m12')
-  @DocsEditable
-  num m12;
-
-  @DomName('WebKitCSSMatrix.m13')
-  @DocsEditable
-  num m13;
-
-  @DomName('WebKitCSSMatrix.m14')
-  @DocsEditable
-  num m14;
-
-  @DomName('WebKitCSSMatrix.m21')
-  @DocsEditable
-  num m21;
-
-  @DomName('WebKitCSSMatrix.m22')
-  @DocsEditable
-  num m22;
-
-  @DomName('WebKitCSSMatrix.m23')
-  @DocsEditable
-  num m23;
-
-  @DomName('WebKitCSSMatrix.m24')
-  @DocsEditable
-  num m24;
-
-  @DomName('WebKitCSSMatrix.m31')
-  @DocsEditable
-  num m31;
-
-  @DomName('WebKitCSSMatrix.m32')
-  @DocsEditable
-  num m32;
-
-  @DomName('WebKitCSSMatrix.m33')
-  @DocsEditable
-  num m33;
-
-  @DomName('WebKitCSSMatrix.m34')
-  @DocsEditable
-  num m34;
-
-  @DomName('WebKitCSSMatrix.m41')
-  @DocsEditable
-  num m41;
-
-  @DomName('WebKitCSSMatrix.m42')
-  @DocsEditable
-  num m42;
-
-  @DomName('WebKitCSSMatrix.m43')
-  @DocsEditable
-  num m43;
-
-  @DomName('WebKitCSSMatrix.m44')
-  @DocsEditable
-  num m44;
-
-  @DomName('WebKitCSSMatrix.inverse')
-  @DocsEditable
-  CssMatrix inverse() native;
-
-  @DomName('WebKitCSSMatrix.multiply')
-  @DocsEditable
-  CssMatrix multiply(CssMatrix secondMatrix) native;
-
-  @DomName('WebKitCSSMatrix.rotate')
-  @DocsEditable
-  CssMatrix rotate(num rotX, num rotY, num rotZ) native;
-
-  @DomName('WebKitCSSMatrix.rotateAxisAngle')
-  @DocsEditable
-  CssMatrix rotateAxisAngle(num x, num y, num z, num angle) native;
-
-  @DomName('WebKitCSSMatrix.scale')
-  @DocsEditable
-  CssMatrix scale(num scaleX, num scaleY, num scaleZ) native;
-
-  @DomName('WebKitCSSMatrix.setMatrixValue')
-  @DocsEditable
-  void setMatrixValue(String string) native;
-
-  @DomName('WebKitCSSMatrix.skewX')
-  @DocsEditable
-  CssMatrix skewX(num angle) native;
-
-  @DomName('WebKitCSSMatrix.skewY')
-  @DocsEditable
-  CssMatrix skewY(num angle) native;
-
-  @DomName('WebKitCSSMatrix.toString')
-  @DocsEditable
-  String toString() native;
-
-  @DomName('WebKitCSSMatrix.translate')
-  @DocsEditable
-  CssMatrix translate(num x, num y, num z) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
 @DomName('CSSMediaRule')
 class CssMediaRule extends CssRule native "*CSSMediaRule" {
 
@@ -2280,154 +2102,6 @@
 
 
 @DocsEditable
-@DomName('CSSPrimitiveValue')
-class CssPrimitiveValue extends CssValue native "*CSSPrimitiveValue" {
-
-  static const int CSS_ATTR = 22;
-
-  static const int CSS_CM = 6;
-
-  static const int CSS_COUNTER = 23;
-
-  static const int CSS_DEG = 11;
-
-  static const int CSS_DIMENSION = 18;
-
-  static const int CSS_EMS = 3;
-
-  static const int CSS_EXS = 4;
-
-  static const int CSS_GRAD = 13;
-
-  static const int CSS_HZ = 16;
-
-  static const int CSS_IDENT = 21;
-
-  static const int CSS_IN = 8;
-
-  static const int CSS_KHZ = 17;
-
-  static const int CSS_MM = 7;
-
-  static const int CSS_MS = 14;
-
-  static const int CSS_NUMBER = 1;
-
-  static const int CSS_PC = 10;
-
-  static const int CSS_PERCENTAGE = 2;
-
-  static const int CSS_PT = 9;
-
-  static const int CSS_PX = 5;
-
-  static const int CSS_RAD = 12;
-
-  static const int CSS_RECT = 24;
-
-  static const int CSS_RGBCOLOR = 25;
-
-  static const int CSS_S = 15;
-
-  static const int CSS_STRING = 19;
-
-  static const int CSS_UNKNOWN = 0;
-
-  static const int CSS_URI = 20;
-
-  static const int CSS_VH = 27;
-
-  static const int CSS_VMAX = 29;
-
-  static const int CSS_VMIN = 28;
-
-  static const int CSS_VW = 26;
-
-  @DomName('CSSPrimitiveValue.primitiveType')
-  @DocsEditable
-  final int primitiveType;
-
-  @DomName('CSSPrimitiveValue.getCounterValue')
-  @DocsEditable
-  Counter getCounterValue() native;
-
-  @DomName('CSSPrimitiveValue.getFloatValue')
-  @DocsEditable
-  num getFloatValue(int unitType) native;
-
-  @JSName('getRGBColorValue')
-  @DomName('CSSPrimitiveValue.getRGBColorValue')
-  @DocsEditable
-  CssRgbColor getRgbColorValue() native;
-
-  @DomName('CSSPrimitiveValue.getRectValue')
-  @DocsEditable
-  CssRect getRectValue() native;
-
-  @DomName('CSSPrimitiveValue.getStringValue')
-  @DocsEditable
-  String getStringValue() native;
-
-  @DomName('CSSPrimitiveValue.setFloatValue')
-  @DocsEditable
-  void setFloatValue(int unitType, num floatValue) native;
-
-  @DomName('CSSPrimitiveValue.setStringValue')
-  @DocsEditable
-  void setStringValue(int stringType, String stringValue) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
-@DomName('Rect')
-class CssRect native "*Rect" {
-
-  @DomName('Rect.bottom')
-  @DocsEditable
-  final CssPrimitiveValue bottom;
-
-  @DomName('Rect.left')
-  @DocsEditable
-  final CssPrimitiveValue left;
-
-  @DomName('Rect.right')
-  @DocsEditable
-  final CssPrimitiveValue right;
-
-  @DomName('Rect.top')
-  @DocsEditable
-  final CssPrimitiveValue top;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
-@DomName('RGBColor')
-class CssRgbColor native "*RGBColor" {
-
-  @DomName('RGBColor.blue')
-  @DocsEditable
-  final CssPrimitiveValue blue;
-
-  @DomName('RGBColor.green')
-  @DocsEditable
-  final CssPrimitiveValue green;
-
-  @DomName('RGBColor.red')
-  @DocsEditable
-  final CssPrimitiveValue red;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
 @DomName('CSSRule')
 class CssRule native "*CSSRule" {
 
@@ -2498,11 +2172,6 @@
   @DocsEditable
   String _getPropertyValue(String propertyName) native;
 
-  @JSName('getPropertyCSSValue')
-  @DomName('CSSStyleDeclaration.getPropertyCSSValue')
-  @DocsEditable
-  CssValue getPropertyCssValue(String propertyName) native;
-
   @DomName('CSSStyleDeclaration.getPropertyPriority')
   @DocsEditable
   String getPropertyPriority(String propertyName) native;
@@ -5774,61 +5443,6 @@
 
 
 @DocsEditable
-@DomName('WebKitCSSTransformValue')
-class CssTransformValue extends _CssValueList native "*WebKitCSSTransformValue" {
-
-  static const int CSS_MATRIX = 11;
-
-  static const int CSS_MATRIX3D = 21;
-
-  static const int CSS_PERSPECTIVE = 20;
-
-  static const int CSS_ROTATE = 4;
-
-  static const int CSS_ROTATE3D = 17;
-
-  static const int CSS_ROTATEX = 14;
-
-  static const int CSS_ROTATEY = 15;
-
-  static const int CSS_ROTATEZ = 16;
-
-  static const int CSS_SCALE = 5;
-
-  static const int CSS_SCALE3D = 19;
-
-  static const int CSS_SCALEX = 6;
-
-  static const int CSS_SCALEY = 7;
-
-  static const int CSS_SCALEZ = 18;
-
-  static const int CSS_SKEW = 8;
-
-  static const int CSS_SKEWX = 9;
-
-  static const int CSS_SKEWY = 10;
-
-  static const int CSS_TRANSLATE = 1;
-
-  static const int CSS_TRANSLATE3D = 13;
-
-  static const int CSS_TRANSLATEX = 2;
-
-  static const int CSS_TRANSLATEY = 3;
-
-  static const int CSS_TRANSLATEZ = 12;
-
-  @DomName('WebKitCSSTransformValue.operationType')
-  @DocsEditable
-  final int operationType;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
 @DomName('CSSUnknownRule')
 class CssUnknownRule extends CssRule native "*CSSUnknownRule" {
 }
@@ -5836,31 +5450,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
-@DocsEditable
-@DomName('CSSValue')
-class CssValue native "*CSSValue" {
-
-  static const int CSS_CUSTOM = 3;
-
-  static const int CSS_INHERIT = 0;
-
-  static const int CSS_PRIMITIVE_VALUE = 1;
-
-  static const int CSS_VALUE_LIST = 2;
-
-  @DomName('CSSValue.cssText')
-  @DocsEditable
-  String cssText;
-
-  @DomName('CSSValue.cssValueType')
-  @DocsEditable
-  final int cssValueType;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
 // WARNING: Do not edit - generated code.
 
 
@@ -5957,6 +5546,22 @@
   @DocsEditable
   void clearData([String type]) native;
 
+  /**
+   * Gets the data for the specified type.
+   *
+   * The data is only available from within a drop operation (such as an
+   * [Element.onDrop] event) and will return `null` before the event is
+   * triggered.
+   *
+   * Data transfer is prohibited across domains. If a drag originates
+   * from content from another domain or protocol (HTTP vs HTTPS) then the
+   * data cannot be accessed.
+   *
+   * The [type] can have values such as:
+   *
+   * * `'Text'`
+   * * `'URL'`
+   */
   @DomName('Clipboard.getData')
   @DocsEditable
   String getData(String type) native;
@@ -6132,44 +5737,6 @@
 
 
 @DocsEditable
-@DomName('DedicatedWorkerContext')
-class DedicatedWorkerContext extends WorkerContext native "*DedicatedWorkerContext" {
-
-  @DomName('DedicatedWorkerContext.messageEvent')
-  @DocsEditable
-  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
-
-  @DomName('DedicatedWorkerContext.postMessage')
-  @DocsEditable
-  void postMessage(/*any*/ message, [List messagePorts]) {
-    if (?messagePorts) {
-      var message_1 = convertDartToNative_SerializedScriptValue(message);
-      _postMessage_1(message_1, messagePorts);
-      return;
-    }
-    var message_2 = convertDartToNative_SerializedScriptValue(message);
-    _postMessage_2(message_2);
-    return;
-  }
-  @JSName('postMessage')
-  @DomName('DedicatedWorkerContext.postMessage')
-  @DocsEditable
-  void _postMessage_1(message, List messagePorts) native;
-  @JSName('postMessage')
-  @DomName('DedicatedWorkerContext.postMessage')
-  @DocsEditable
-  void _postMessage_2(message) native;
-
-  @DomName('DedicatedWorkerContext.onmessage')
-  @DocsEditable
-  Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
 @DomName('HTMLDetailsElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -6411,45 +5978,6 @@
 
 
 @DocsEditable
-@DomName('DirectoryEntrySync')
-class DirectoryEntrySync extends EntrySync native "*DirectoryEntrySync" {
-
-  @DomName('DirectoryEntrySync.createReader')
-  @DocsEditable
-  DirectoryReaderSync createReader() native;
-
-  @DomName('DirectoryEntrySync.getDirectory')
-  @DocsEditable
-  DirectoryEntrySync getDirectory(String path, Map flags) {
-    var flags_1 = convertDartToNative_Dictionary(flags);
-    return _getDirectory_1(path, flags_1);
-  }
-  @JSName('getDirectory')
-  @DomName('DirectoryEntrySync.getDirectory')
-  @DocsEditable
-  DirectoryEntrySync _getDirectory_1(path, flags) native;
-
-  @DomName('DirectoryEntrySync.getFile')
-  @DocsEditable
-  FileEntrySync getFile(String path, Map flags) {
-    var flags_1 = convertDartToNative_Dictionary(flags);
-    return _getFile_1(path, flags_1);
-  }
-  @JSName('getFile')
-  @DomName('DirectoryEntrySync.getFile')
-  @DocsEditable
-  FileEntrySync _getFile_1(path, flags) native;
-
-  @DomName('DirectoryEntrySync.removeRecursively')
-  @DocsEditable
-  void removeRecursively() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
 @DomName('DirectoryReader')
 class DirectoryReader native "*DirectoryReader" {
 
@@ -6475,21 +6003,6 @@
 
 
 @DocsEditable
-@DomName('DirectoryReaderSync')
-class DirectoryReaderSync native "*DirectoryReaderSync" {
-
-  @DomName('DirectoryReaderSync.readEntries')
-  @DocsEditable
-  @Returns('_EntryArraySync')
-  @Creates('_EntryArraySync')
-  List<EntrySync> readEntries() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
 /**
  * Represents an HTML <div> element.
  *
@@ -6620,6 +6133,10 @@
   @DocsEditable
   final String $dom_referrer;
 
+  @DomName('Document.securityPolicy')
+  @DocsEditable
+  final DomSecurityPolicy securityPolicy;
+
   @JSName('selectedStylesheetSet')
   @DomName('Document.selectedStylesheetSet')
   @DocsEditable
@@ -7325,11 +6842,12 @@
     return new FixedSizeListIterator<DomMimeType>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, DomMimeType)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  DomMimeType reduce(DomMimeType combine(DomMimeType value, DomMimeType element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, DomMimeType)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, DomMimeType element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -7337,7 +6855,7 @@
 
   void forEach(void f(DomMimeType element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(DomMimeType element)) =>
@@ -7439,12 +6957,6 @@
     throw new StateError("More than one element");
   }
 
-  DomMimeType min([int compare(DomMimeType a, DomMimeType b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  DomMimeType max([int compare(DomMimeType a, DomMimeType b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, DomMimeType element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -7461,14 +6973,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(DomMimeType element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -7489,17 +6993,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<DomMimeType> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<DomMimeType> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <DomMimeType>[]);
   }
 
-  List<DomMimeType> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, DomMimeType> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<DomMimeType> mixins.
 
   @DomName('DOMMimeTypeArray.item')
@@ -7593,11 +7104,12 @@
     return new FixedSizeListIterator<DomPlugin>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, DomPlugin)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  DomPlugin reduce(DomPlugin combine(DomPlugin value, DomPlugin element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, DomPlugin)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, DomPlugin element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -7605,7 +7117,7 @@
 
   void forEach(void f(DomPlugin element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(DomPlugin element)) =>
@@ -7707,12 +7219,6 @@
     throw new StateError("More than one element");
   }
 
-  DomPlugin min([int compare(DomPlugin a, DomPlugin b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  DomPlugin max([int compare(DomPlugin a, DomPlugin b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, DomPlugin element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -7729,14 +7235,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(DomPlugin element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -7757,17 +7255,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<DomPlugin> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<DomPlugin> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <DomPlugin>[]);
   }
 
-  List<DomPlugin> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, DomPlugin> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<DomPlugin> mixins.
 
   @DomName('DOMPluginArray.item')
@@ -7788,29 +7293,70 @@
 
 
 @DocsEditable
-@DomName('WebKitPoint')
-@SupportedBrowser(SupportedBrowser.CHROME)
-@SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental
-class DomPoint native "*WebKitPoint" {
+@DomName('SecurityPolicy')
+class DomSecurityPolicy native "*SecurityPolicy" {
 
-  @DomName('WebKitPoint.WebKitPoint')
+  @DomName('DOMSecurityPolicy.allowsEval')
   @DocsEditable
-  factory DomPoint(num x, num y) {
-    return DomPoint._create_1(x, y);
-  }
-  static DomPoint _create_1(x, y) => JS('DomPoint', 'new WebKitPoint(#,#)', x, y);
+  final bool allowsEval;
 
-  /// Checks if this type is supported on the current platform.
-  static bool get supported => JS('bool', '!!(window.WebKitPoint)');
-
-  @DomName('WebKitPoint.x')
+  @DomName('DOMSecurityPolicy.allowsInlineScript')
   @DocsEditable
-  num x;
+  final bool allowsInlineScript;
 
-  @DomName('WebKitPoint.y')
+  @DomName('DOMSecurityPolicy.allowsInlineStyle')
   @DocsEditable
-  num y;
+  final bool allowsInlineStyle;
+
+  @DomName('DOMSecurityPolicy.isActive')
+  @DocsEditable
+  final bool isActive;
+
+  @DomName('DOMSecurityPolicy.reportURIs')
+  @DocsEditable
+  @Returns('DomStringList')
+  @Creates('DomStringList')
+  final List<String> reportURIs;
+
+  @DomName('DOMSecurityPolicy.allowsConnectionTo')
+  @DocsEditable
+  bool allowsConnectionTo(String url) native;
+
+  @DomName('DOMSecurityPolicy.allowsFontFrom')
+  @DocsEditable
+  bool allowsFontFrom(String url) native;
+
+  @DomName('DOMSecurityPolicy.allowsFormAction')
+  @DocsEditable
+  bool allowsFormAction(String url) native;
+
+  @DomName('DOMSecurityPolicy.allowsFrameFrom')
+  @DocsEditable
+  bool allowsFrameFrom(String url) native;
+
+  @DomName('DOMSecurityPolicy.allowsImageFrom')
+  @DocsEditable
+  bool allowsImageFrom(String url) native;
+
+  @DomName('DOMSecurityPolicy.allowsMediaFrom')
+  @DocsEditable
+  bool allowsMediaFrom(String url) native;
+
+  @DomName('DOMSecurityPolicy.allowsObjectFrom')
+  @DocsEditable
+  bool allowsObjectFrom(String url) native;
+
+  @DomName('DOMSecurityPolicy.allowsPluginType')
+  @DocsEditable
+  bool allowsPluginType(String type) native;
+
+  @DomName('DOMSecurityPolicy.allowsScriptFrom')
+  @DocsEditable
+  bool allowsScriptFrom(String url) native;
+
+  @DomName('DOMSecurityPolicy.allowsStyleFrom')
+  @DocsEditable
+  bool allowsStyleFrom(String url) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -7968,11 +7514,12 @@
     return new FixedSizeListIterator<String>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, String)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  String reduce(String combine(String value, String element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, String)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, String element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -7980,7 +7527,7 @@
 
   void forEach(void f(String element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(String element)) =>
@@ -8082,12 +7629,6 @@
     throw new StateError("More than one element");
   }
 
-  String min([int compare(String a, String b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  String max([int compare(String a, String b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, String element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -8104,14 +7645,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(String element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -8132,17 +7665,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<String> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<String> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <String>[]);
   }
 
-  List<String> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, String> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<String> mixins.
 
   @DomName('DOMStringList.contains')
@@ -8197,7 +7737,7 @@
 
 // TODO(jacobr): use _Lists.dart to remove some of the duplicated
 // functionality.
-class _ChildrenElementList implements List {
+class _ChildrenElementList extends ListBase<Element> {
   // Raw Element.
   final Element _element;
   final HtmlCollection _childElements;
@@ -8254,20 +7794,20 @@
     return false;
   }
 
-  String join([String separator]) {
-    return IterableMixinWorkaround.joinList(this, separator);
+  String join([String separator = ""]) {
+    return _childElements.join(separator);
   }
 
   Iterable map(f(Element element)) {
-    return IterableMixinWorkaround.mapList(this, f);
+    return _childElements.map(f);
   }
 
   Iterable<Element> where(bool f(Element element)) {
-    return IterableMixinWorkaround.where(this, f);
+    return _childElements.where(f);
   }
 
   Iterable expand(Iterable f(Element element)) {
-    return IterableMixinWorkaround.expand(this, f);
+    return _childElements.expand(f);
   }
 
   bool get isEmpty {
@@ -8275,31 +7815,31 @@
   }
 
   Iterable<Element> take(int n) {
-    return IterableMixinWorkaround.takeList(this, n);
+    return _childElements.take(n);
   }
 
   Iterable<Element> takeWhile(bool test(Element value)) {
-    return IterableMixinWorkaround.takeWhile(this, test);
+    return _childElements.takeWhile(test);
   }
 
   Iterable<Element> skip(int n) {
-    return IterableMixinWorkaround.skipList(this, n);
+    return _childElements.skip(n);
   }
 
   Iterable<Element> skipWhile(bool test(Element value)) {
-    return IterableMixinWorkaround.skipWhile(this, test);
+    return _childElements.skipWhile(test);
   }
 
   Element firstWhere(bool test(Element value), {Element orElse()}) {
-    return IterableMixinWorkaround.firstWhere(this, test, orElse);
+    return _childElements.firstWhere(test, orElse: orElse);
   }
 
   Element lastWhere(bool test(Element value), {Element orElse()}) {
-    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
+    return _childElements.lastWhere(test, orElse: orElse);
   }
 
   Element singleWhere(bool test(Element value)) {
-    return IterableMixinWorkaround.singleWhere(this, test);
+    return _childElements.singleWhere(test);
   }
 
   Element elementAt(int index) {
@@ -8341,24 +7881,24 @@
   }
 
   Iterable<Element> get reversed {
-    return IterableMixinWorkaround.reversedList(this);
+    return _childElements.reversed;
   }
 
   void sort([int compare(Element a, Element b)]) {
     throw new UnsupportedError('TODO(jacobr): should we impl?');
   }
 
-  dynamic reduce(dynamic initialValue,
-      dynamic combine(dynamic previousValue, Element element)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Element reduce(Element combine(Element value, Element element)) {
+    return _childElements.reduce(combine);
   }
 
   dynamic fold(dynamic initialValue,
       dynamic combine(dynamic previousValue, Element element)) {
-    return IterableMixinWorkaround.fold(this, initialValue, combine);
+    return _childElements.fold(initialValue, combine);
   }
 
-  void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
+  void setRange(int start, int rangeLength, List from,
+                [int startFrom = 0]) {
     throw new UnimplementedError();
   }
 
@@ -8371,20 +7911,12 @@
     }
   }
 
-  void removeAll(Iterable elements) {
-    IterableMixinWorkaround.removeAll(this, elements);
-  }
-
-  void retainAll(Iterable elements) {
-    IterableMixinWorkaround.retainAll(this, elements);
-  }
-
   void removeWhere(bool test(Element element)) {
-    IterableMixinWorkaround.removeWhere(this, test);
+    _childElements.removeWhere(test);
   }
 
   void retainWhere(bool test(Element element)) {
-    IterableMixinWorkaround.retainWhere(this, test);
+    _childElements.retainWhere(test);
   }
 
   void removeRange(int start, int rangeLength) {
@@ -8395,14 +7927,15 @@
     throw new UnimplementedError();
   }
 
+  Iterable getRange(int start, int end)  {
+    throw new UnimplementedError();
+  }
+
   List sublist(int start, [int end]) {
     if (end == null) end = length;
     return new _FrozenElementList._wrap(Lists.getRange(this, start, end, []));
   }
 
-  List getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   int indexOf(Element element, [int start = 0]) {
     return Lists.indexOf(this, element, start, this.length);
   }
@@ -8462,16 +7995,15 @@
     return first;
   }
 
-  Element min([int compare(Element a, Element b)]) {
-    return IterableMixinWorkaround.min(this, compare);
-  }
-
-  Element max([int compare(Element a, Element b)]) {
-    return IterableMixinWorkaround.max(this, compare);
-  }
-
   Map<int, Element> asMap() {
-    return IterableMixinWorkaround.asMapList(this);
+    return _childElements.asMap();
+  }
+
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
   }
 }
 
@@ -8479,96 +8011,11 @@
 // a better option given that we cannot quite force NodeList to be an
 // ElementList as there are valid cases where a NodeList JavaScript object
 // contains Node objects that are not Elements.
-class _FrozenElementList implements List {
+class _FrozenElementList extends ListBase {
   final List<Node> _nodeList;
 
   _FrozenElementList._wrap(this._nodeList);
 
-  bool contains(Element element) {
-    for (Element el in this) {
-      if (el == element) return true;
-    }
-    return false;
-  }
-
-  void forEach(void f(Element element)) {
-    for (Element el in this) {
-      f(el);
-    }
-  }
-
-  String join([String separator]) {
-    return IterableMixinWorkaround.joinList(this, separator);
-  }
-
-  Iterable map(f(Element element)) {
-    return IterableMixinWorkaround.mapList(this, f);
-  }
-
-  Iterable<Element> where(bool f(Element element)) {
-    return IterableMixinWorkaround.where(this, f);
-  }
-
-  Iterable expand(Iterable f(Element element)) {
-    return IterableMixinWorkaround.expand(this, f);
-  }
-
-  bool every(bool f(Element element)) {
-    for(Element element in this) {
-      if (!f(element)) {
-        return false;
-      }
-    };
-    return true;
-  }
-
-  bool any(bool f(Element element)) {
-    for(Element element in this) {
-      if (f(element)) {
-        return true;
-      }
-    };
-    return false;
-  }
-
-  List<Element> toList({ bool growable: true }) =>
-      new List<Element>.from(this, growable: growable);
-  Set<Element> toSet() => new Set<Element>.from(this);
-
-  Iterable<Element> take(int n) {
-    return IterableMixinWorkaround.takeList(this, n);
-  }
-
-  Iterable<Element> takeWhile(bool test(Element value)) {
-    return IterableMixinWorkaround.takeWhile(this, test);
-  }
-
-  Iterable<Element> skip(int n) {
-    return IterableMixinWorkaround.skipList(this, n);
-  }
-
-  Iterable<Element> skipWhile(bool test(Element value)) {
-    return IterableMixinWorkaround.skipWhile(this, test);
-  }
-
-  Element firstWhere(bool test(Element value), {Element orElse()}) {
-    return IterableMixinWorkaround.firstWhere(this, test, orElse);
-  }
-
-  Element lastWhere(bool test(Element value), {Element orElse()}) {
-    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
-  }
-
-  Element singleWhere(bool test(Element value)) {
-    return IterableMixinWorkaround.singleWhere(this, test);
-  }
-
-  Element elementAt(int index) {
-    return this[index];
-  }
-
-  bool get isEmpty => _nodeList.isEmpty;
-
   int get length => _nodeList.length;
 
   Element operator [](int index) => _nodeList[index];
@@ -8585,31 +8032,16 @@
     throw new UnsupportedError('');
   }
 
-  Iterator<Element> get iterator => new _FrozenElementListIterator(this);
-
   void addAll(Iterable<Element> iterable) {
     throw new UnsupportedError('');
   }
 
-  Iterable<Element> get reversed {
-    return IterableMixinWorkaround.reversedList(this);
-  }
-
   void sort([int compare(Element a, Element b)]) {
     throw new UnsupportedError('');
   }
 
-  dynamic reduce(dynamic initialValue,
-      dynamic combine(dynamic previousValue, Element element)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
-  }
-
-  dynamic fold(dynamic initialValue,
-      dynamic combine(dynamic previousValue, Element element)) {
-    return IterableMixinWorkaround.fold(this, initialValue, combine);
-  }
-
-  void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
+  void setRange(int start, int rangeLength, List from,
+                [int startFrom = 0]) {
     throw new UnsupportedError('');
   }
 
@@ -8625,15 +8057,6 @@
     return new _FrozenElementList._wrap(_nodeList.sublist(start, end));
   }
 
-  List<Element> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
-  int indexOf(Element element, [int start = 0]) =>
-    _nodeList.indexOf(element, start);
-
-  int lastIndexOf(Element element, [int start = null]) =>
-    _nodeList.lastIndexOf(element, start);
-
   void clear() {
     throw new UnsupportedError('');
   }
@@ -8650,14 +8073,6 @@
     throw new UnsupportedError('');
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError('');
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError('');
-  }
-
   void removeWhere(bool test(Element element)) {
     throw new UnsupportedError('');
   }
@@ -8672,49 +8087,12 @@
 
   Element get single => _nodeList.single;
 
-  Element min([int compare(Element a, Element b)]) {
-    return IterableMixinWorkaround.min(this, compare);
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
   }
-
-  Element max([int compare(Element a, Element b)]) {
-    return IterableMixinWorkaround.max(this, compare);
-  }
-
-  Map<int, Element> asMap() {
-    return IterableMixinWorkaround.asMapList(this);
-  }
-}
-
-class _FrozenElementListIterator implements Iterator<Element> {
-  final _FrozenElementList _list;
-  int _index = -1;
-  Element _current;
-
-  _FrozenElementListIterator(this._list);
-
-  /**
-   * Moves to the next element. Returns true if the iterator is positioned
-   * at an element. Returns false if it is positioned after the last element.
-   */
-  bool moveNext() {
-    int nextIndex = _index + 1;
-    if (nextIndex < _list.length) {
-      _current = _list[nextIndex];
-      _index = nextIndex;
-      return true;
-    }
-    _index = _list.length;
-    _current = null;
-    return false;
-  }
-
-  /**
-   * Returns the element the [Iterator] is positioned at.
-   *
-   * Return [:null:] if the iterator is positioned before the first, or
-   * after the last element.
-   */
-  Element get current => _current;
 }
 
 class _ElementCssClassSet extends CssClassSet {
@@ -8853,7 +8231,7 @@
    */
   CssClassSet get classes => new _ElementCssClassSet(this);
 
-  void set classes(Collection<String> value) {
+  void set classes(Iterable<String> value) {
     CssClassSet classSet = classes;
     classSet.clear();
     classSet.addAll(value);
@@ -10247,60 +9625,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
-@DocsEditable
-@DomName('EntrySync')
-class EntrySync native "*EntrySync" {
-
-  @DomName('EntrySync.filesystem')
-  @DocsEditable
-  final FileSystemSync filesystem;
-
-  @DomName('EntrySync.fullPath')
-  @DocsEditable
-  final String fullPath;
-
-  @DomName('EntrySync.isDirectory')
-  @DocsEditable
-  final bool isDirectory;
-
-  @DomName('EntrySync.isFile')
-  @DocsEditable
-  final bool isFile;
-
-  @DomName('EntrySync.name')
-  @DocsEditable
-  final String name;
-
-  @DomName('EntrySync.copyTo')
-  @DocsEditable
-  EntrySync copyTo(DirectoryEntrySync parent, String name) native;
-
-  @DomName('EntrySync.getMetadata')
-  @DocsEditable
-  Metadata getMetadata() native;
-
-  @DomName('EntrySync.getParent')
-  @DocsEditable
-  EntrySync getParent() native;
-
-  @DomName('EntrySync.moveTo')
-  @DocsEditable
-  EntrySync moveTo(DirectoryEntrySync parent, String name) native;
-
-  @DomName('EntrySync.remove')
-  @DocsEditable
-  void remove() native;
-
-  @JSName('toURL')
-  @DomName('EntrySync.toURL')
-  @DocsEditable
-  String toUrl() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
 // WARNING: Do not edit - generated code.
 
 
@@ -10437,10 +9761,6 @@
   @DocsEditable
   final int eventPhase;
 
-  @DomName('Event.returnValue')
-  @DocsEditable
-  bool returnValue;
-
   EventTarget get target => _convertNativeToDart_EventTarget(this._get_target);
   @JSName('target')
   @DomName('Event.target')
@@ -10808,23 +10128,6 @@
 
 
 @DocsEditable
-@DomName('FileEntrySync')
-class FileEntrySync extends EntrySync native "*FileEntrySync" {
-
-  @DomName('FileEntrySync.createWriter')
-  @DocsEditable
-  FileWriterSync createWriter() native;
-
-  @DomName('FileEntrySync.file')
-  @DocsEditable
-  File file() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
 @DomName('FileError')
 class FileError native "*FileError" {
 
@@ -10935,11 +10238,12 @@
     return new FixedSizeListIterator<File>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, File)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  File reduce(File combine(File value, File element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, File)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, File element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -10947,7 +10251,7 @@
 
   void forEach(void f(File element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(File element)) =>
@@ -11049,12 +10353,6 @@
     throw new StateError("More than one element");
   }
 
-  File min([int compare(File a, File b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  File max([int compare(File a, File b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, File element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -11071,14 +10369,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(File element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -11099,17 +10389,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<File> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<File> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <File>[]);
   }
 
-  List<File> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, File> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<File> mixins.
 
   @DomName('FileList.item')
@@ -11240,41 +10537,6 @@
 
 
 @DocsEditable
-@DomName('FileReaderSync')
-class FileReaderSync native "*FileReaderSync" {
-
-  @DomName('FileReaderSync.FileReaderSync')
-  @DocsEditable
-  factory FileReaderSync() {
-    return FileReaderSync._create_1();
-  }
-  static FileReaderSync _create_1() => JS('FileReaderSync', 'new FileReaderSync()');
-
-  @DomName('FileReaderSync.readAsArrayBuffer')
-  @DocsEditable
-  @Creates('ArrayBuffer')
-  @Returns('ArrayBuffer|Null')
-  dynamic readAsArrayBuffer(Blob blob) native;
-
-  @DomName('FileReaderSync.readAsBinaryString')
-  @DocsEditable
-  String readAsBinaryString(Blob blob) native;
-
-  @JSName('readAsDataURL')
-  @DomName('FileReaderSync.readAsDataURL')
-  @DocsEditable
-  String readAsDataUrl(Blob blob) native;
-
-  @DomName('FileReaderSync.readAsText')
-  @DocsEditable
-  String readAsText(Blob blob, [String encoding]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
 @DomName('DOMFileSystem')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
@@ -11305,25 +10567,6 @@
 
 
 @DocsEditable
-@DomName('DOMFileSystemSync')
-@SupportedBrowser(SupportedBrowser.CHROME)
-@Experimental
-class FileSystemSync native "*DOMFileSystemSync" {
-
-  @DomName('DOMFileSystemSync.name')
-  @DocsEditable
-  final String name;
-
-  @DomName('DOMFileSystemSync.root')
-  @DocsEditable
-  final DirectoryEntrySync root;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
 @DomName('FileWriter')
 class FileWriter extends EventTarget native "*FileWriter" {
 
@@ -11441,35 +10684,6 @@
 
 
 @DocsEditable
-@DomName('FileWriterSync')
-class FileWriterSync native "*FileWriterSync" {
-
-  @DomName('FileWriterSync.length')
-  @DocsEditable
-  final int length;
-
-  @DomName('FileWriterSync.position')
-  @DocsEditable
-  final int position;
-
-  @DomName('FileWriterSync.seek')
-  @DocsEditable
-  void seek(int position) native;
-
-  @DomName('FileWriterSync.truncate')
-  @DocsEditable
-  void truncate(int size) native;
-
-  @DomName('FileWriterSync.write')
-  @DocsEditable
-  void write(Blob data) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
 @DomName('Float32Array')
 class Float32Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<double> native "*Float32Array" {
 
@@ -11508,11 +10722,12 @@
     return new FixedSizeListIterator<num>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, num)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  num reduce(num combine(num value, num element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, num)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, num element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -11520,7 +10735,7 @@
 
   void forEach(void f(num element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(num element)) =>
@@ -11622,12 +10837,6 @@
     throw new StateError("More than one element");
   }
 
-  num min([int compare(num a, num b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  num max([int compare(num a, num b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, num element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -11644,14 +10853,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(num element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -11672,17 +10873,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<num> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<num> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <num>[]);
   }
 
-  List<num> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, num> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<num> mixins.
 
   @JSName('set')
@@ -11740,11 +10948,12 @@
     return new FixedSizeListIterator<num>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, num)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  num reduce(num combine(num value, num element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, num)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, num element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -11752,7 +10961,7 @@
 
   void forEach(void f(num element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(num element)) =>
@@ -11854,12 +11063,6 @@
     throw new StateError("More than one element");
   }
 
-  num min([int compare(num a, num b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  num max([int compare(num a, num b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, num element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -11876,14 +11079,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(num element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -11904,17 +11099,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<num> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<num> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <num>[]);
   }
 
-  List<num> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, num> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<num> mixins.
 
   @JSName('set')
@@ -12125,7 +11327,7 @@
     var controller;
     controller = new StreamController<Geoposition>(
       onSubscriptionStateChange: () {
-        if (controller.hasSubscribers) {
+        if (controller.hasListener) {
           assert(watchId == null);
           watchId = $dom_watchPosition(
               (position) {
@@ -12392,11 +11594,12 @@
     return new FixedSizeListIterator<Node>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Node reduce(Node combine(Node value, Node element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Node)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Node element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -12404,7 +11607,7 @@
 
   void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Node element)) =>
@@ -12506,12 +11709,6 @@
     throw new StateError("More than one element");
   }
 
-  Node min([int compare(Node a, Node b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Node max([int compare(Node a, Node b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Node element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -12528,14 +11725,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Node element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -12556,17 +11745,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Node> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Node> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Node>[]);
   }
 
-  List<Node> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Node> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Node> mixins.
 
   @DomName('HTMLAllCollection.item')
@@ -12613,11 +11809,12 @@
     return new FixedSizeListIterator<Node>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Node reduce(Node combine(Node value, Node element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Node)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Node element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -12625,7 +11822,7 @@
 
   void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Node element)) =>
@@ -12727,12 +11924,6 @@
     throw new StateError("More than one element");
   }
 
-  Node min([int compare(Node a, Node b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Node max([int compare(Node a, Node b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Node element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -12749,14 +11940,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Node element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -12777,17 +11960,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Node> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Node> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Node>[]);
   }
 
-  List<Node> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Node> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Node> mixins.
 
   @DomName('HTMLCollection.item')
@@ -12812,22 +12002,18 @@
   @DocsEditable
   final Element activeElement;
 
-  @DomName('Document.body')
-  BodyElement get body => document.$dom_body;
 
   @DomName('Document.body')
-  void set body(BodyElement value) {
-    document.$dom_body = value;
-  }
+  BodyElement body;
 
   @DomName('Document.caretRangeFromPoint')
   Range caretRangeFromPoint(int x, int y) {
-    return document.$dom_caretRangeFromPoint(x, y);
+    return $dom_caretRangeFromPoint(x, y);
   }
 
   @DomName('Document.elementFromPoint')
   Element elementFromPoint(int x, int y) {
-    return document.$dom_elementFromPoint(x, y);
+    return $dom_elementFromPoint(x, y);
   }
 
   /**
@@ -12867,36 +12053,36 @@
   @DomName('Document.getCSSCanvasContext')
   CanvasRenderingContext getCssCanvasContext(String contextId, String name,
       int width, int height) {
-    return document.$dom_getCssCanvasContext(contextId, name, width, height);
+    return $dom_getCssCanvasContext(contextId, name, width, height);
   }
 
   @DomName('Document.head')
-  HeadElement get head => document.$dom_head;
+  HeadElement get head => $dom_head;
 
   @DomName('Document.lastModified')
-  String get lastModified => document.$dom_lastModified;
+  String get lastModified => $dom_lastModified;
 
   @DomName('Document.preferredStylesheetSet')
-  String get preferredStylesheetSet => document.$dom_preferredStylesheetSet;
+  String get preferredStylesheetSet => $dom_preferredStylesheetSet;
 
   @DomName('Document.referrer')
-  String get referrer => document.$dom_referrer;
+  String get referrer => $dom_referrer;
 
   @DomName('Document.selectedStylesheetSet')
-  String get selectedStylesheetSet => document.$dom_selectedStylesheetSet;
+  String get selectedStylesheetSet => $dom_selectedStylesheetSet;
   void set selectedStylesheetSet(String value) {
-    document.$dom_selectedStylesheetSet = value;
+    $dom_selectedStylesheetSet = value;
   }
 
   @DomName('Document.styleSheets')
-  List<StyleSheet> get styleSheets => document.$dom_styleSheets;
+  List<StyleSheet> get styleSheets => $dom_styleSheets;
 
   @DomName('Document.title')
-  String get title => document.$dom_title;
+  String get title => $dom_title;
 
   @DomName('Document.title')
   void set title(String value) {
-    document.$dom_title = value;
+    $dom_title = value;
   }
 
   @DomName('Document.webkitCancelFullScreen')
@@ -12904,7 +12090,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
   void cancelFullScreen() {
-    document.$dom_webkitCancelFullScreen();
+    $dom_webkitCancelFullScreen();
   }
 
   @DomName('Document.webkitExitFullscreen')
@@ -12912,7 +12098,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
   void exitFullscreen() {
-    document.$dom_webkitExitFullscreen();
+    $dom_webkitExitFullscreen();
   }
 
   @DomName('Document.webkitExitPointerLock')
@@ -12920,45 +12106,45 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
   void exitPointerLock() {
-    document.$dom_webkitExitPointerLock();
+    $dom_webkitExitPointerLock();
   }
 
   @DomName('Document.webkitFullscreenElement')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  Element get fullscreenElement => document.$dom_webkitFullscreenElement;
+  Element get fullscreenElement => $dom_webkitFullscreenElement;
 
   @DomName('Document.webkitFullscreenEnabled')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  bool get fullscreenEnabled => document.$dom_webkitFullscreenEnabled;
+  bool get fullscreenEnabled => $dom_webkitFullscreenEnabled;
 
   @DomName('Document.webkitHidden')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  bool get hidden => document.$dom_webkitHidden;
+  bool get hidden => $dom_webkitHidden;
 
   @DomName('Document.webkitIsFullScreen')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  bool get isFullScreen => document.$dom_webkitIsFullScreen;
+  bool get isFullScreen => $dom_webkitIsFullScreen;
 
   @DomName('Document.webkitPointerLockElement')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
   Element get pointerLockElement =>
-      document.$dom_webkitPointerLockElement;
+      $dom_webkitPointerLockElement;
 
   @DomName('Document.webkitVisibilityState')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  String get visibilityState => document.$dom_webkitVisibilityState;
+  String get visibilityState => $dom_webkitVisibilityState;
 }
 // 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
@@ -13640,6 +12826,10 @@
   @DocsEditable
   String sandbox;
 
+  @DomName('HTMLIFrameElement.seamless')
+  @DocsEditable
+  bool seamless;
+
   @DomName('HTMLIFrameElement.src')
   @DocsEditable
   String src;
@@ -14657,11 +13847,12 @@
     return new FixedSizeListIterator<int>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  int reduce(int combine(int value, int element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, int)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, int element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -14669,7 +13860,7 @@
 
   void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(int element)) =>
@@ -14771,12 +13962,6 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  int max([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, int element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -14793,14 +13978,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(int element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -14821,17 +13998,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<int> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<int> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <int>[]);
   }
 
-  List<int> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, int> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<int> mixins.
 
   @JSName('set')
@@ -14889,11 +14073,12 @@
     return new FixedSizeListIterator<int>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  int reduce(int combine(int value, int element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, int)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, int element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -14901,7 +14086,7 @@
 
   void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(int element)) =>
@@ -15003,12 +14188,6 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  int max([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, int element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -15025,14 +14204,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(int element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -15053,17 +14224,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<int> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<int> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <int>[]);
   }
 
-  List<int> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, int> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<int> mixins.
 
   @JSName('set')
@@ -15121,11 +14299,12 @@
     return new FixedSizeListIterator<int>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  int reduce(int combine(int value, int element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, int)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, int element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -15133,7 +14312,7 @@
 
   void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(int element)) =>
@@ -15235,12 +14414,6 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  int max([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, int element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -15257,14 +14430,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(int element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -15285,17 +14450,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<int> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<int> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <int>[]);
   }
 
-  List<int> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, int> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<int> mixins.
 
   @JSName('set')
@@ -17585,7 +16757,7 @@
  * the actual child nodes of an element until strictly necessary greatly
  * improving performance for the typical cases where it is not required.
  */
-class _ChildNodeListLazy implements List {
+class _ChildNodeListLazy extends ListBase<Node> {
   final Node _this;
 
   _ChildNodeListLazy(this._this);
@@ -17608,14 +16780,6 @@
     return JS('Node|Null', '#.firstChild', _this);
   }
 
-  Node min([int compare(Node a, Node b)]) {
-    return IterableMixinWorkaround.min(this, compare);
-  }
-
-  Node max([int compare(Node a, Node b)]) {
-    return IterableMixinWorkaround.max(this, compare);
-  }
-
   void add(Node value) {
     _this.append(value);
   }
@@ -17670,20 +16834,26 @@
     _this.$dom_removeChild(node);
   }
 
-  void removeAll(Iterable elements) {
-    IterableMixinWorkaround.removeAll(this, elements);
-  }
-
-  void retainAll(Iterable elements) {
-    IterableMixinWorkaround.retainAll(this, elements);
+  void _filter(bool test(Node node), bool removeMatching) {
+    // This implementation of removeWhere/retainWhere is more efficient
+    // than the default in ListBase. Child nodes can be removed in constant
+    // time.
+    Node child = _this.$dom_firstChild;
+    while (child != null) {
+      Node nextChild = child.nextSibling;
+      if (test(child) == removeMatching) {
+        _this.$dom_removeChild(child);
+      }
+      child = nextChild;
+    }
   }
 
   void removeWhere(bool test(Node node)) {
-    IterableMixinWorkaround.removeWhere(this, test);
+    _filter(test, true);
   }
 
   void retainWhere(bool test(Node node)) {
-    IterableMixinWorkaround.retainWhere(this, test);
+    _filter(test, false);
   }
 
   void clear() {
@@ -17696,42 +16866,6 @@
 
   Iterator<Node> get iterator => _this.$dom_childNodes.iterator;
 
-  // TODO(jacobr): We can implement these methods much more efficiently by
-  // looking up the nodeList only once instead of once per iteration.
-  bool contains(Node element) => IterableMixinWorkaround.contains(this, element);
-
-  void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
-
-  dynamic reduce(dynamic initialValue,
-      dynamic combine(dynamic previousValue, Node element)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
-  }
-
-  dynamic fold(dynamic initialValue,
-      dynamic combine(dynamic previousValue, Node element)) {
-    return IterableMixinWorkaround.fold(this, initialValue, combine);
-  }
-
-  String join([String separator]) {
-    return IterableMixinWorkaround.joinList(this, separator);
-  }
-
-  Iterable map(f(Node element)) {
-    return IterableMixinWorkaround.mapList(this, f);
-  }
-
-  Iterable<Node> where(bool f(Node element)) {
-    return IterableMixinWorkaround.where(this, f);
-  }
-
-  Iterable expand(Iterable f(Node element)) {
-    return IterableMixinWorkaround.expand(this, f);
-  }
-
-  bool every(bool f(Node element)) => IterableMixinWorkaround.every(this, f);
-
-  bool any(bool f(Node element)) => IterableMixinWorkaround.any(this, f);
-
   List<Node> toList({ bool growable: true }) =>
       new List<Node>.from(this, growable: growable);
   Set<Node> toSet() => new Set<Node>.from(this);
@@ -17740,54 +16874,12 @@
 
   // From List<Node>:
 
-  Iterable<Node> take(int n) {
-    return IterableMixinWorkaround.takeList(this, n);
-  }
-
-  Iterable<Node> takeWhile(bool test(Node value)) {
-    return IterableMixinWorkaround.takeWhile(this, test);
-  }
-
-  Iterable<Node> skip(int n) {
-    return IterableMixinWorkaround.skipList(this, n);
-  }
-
-  Iterable<Node> skipWhile(bool test(Node value)) {
-    return IterableMixinWorkaround.skipWhile(this, test);
-  }
-
-  Node firstWhere(bool test(Node value), {Node orElse()}) {
-    return IterableMixinWorkaround.firstWhere(this, test, orElse);
-  }
-
-  Node lastWhere(bool test(Node value), {Node orElse()}) {
-    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
-  }
-
-  Node singleWhere(bool test(Node value)) {
-    return IterableMixinWorkaround.singleWhere(this, test);
-  }
-
-  Node elementAt(int index) {
-    return this[index];
-  }
-
-  Iterable<Node> get reversed {
-    return IterableMixinWorkaround.reversedList(this);
-  }
-
   // TODO(jacobr): this could be implemented for child node lists.
   // The exception we throw here is misleading.
   void sort([int compare(Node a, Node b)]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(Node element, [int start = 0]) =>
-      Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(Node element, [int start = 0]) =>
-      Lists.lastIndexOf(this, element, start);
-
   // FIXME: implement these.
   void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
     throw new UnsupportedError(
@@ -17801,14 +16893,22 @@
     throw new UnsupportedError(
         "Cannot insertRange on immutable List.");
   }
+
+  Iterable<Node> getRange(int start, int end) {
+    throw new UnimplementedError("NodeList.getRange");
+  }
+
   List<Node> sublist(int start, [int end]) {
     if (end == null) end == length;
     return Lists.getRange(this, start, end, <Node>[]);
   }
 
-  List<Node> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
   // -- end List<Node> mixins.
 
   // TODO(jacobr): benchmark whether this is more efficient or whether caching
@@ -17821,8 +16921,6 @@
   }
 
   Node operator[](int index) => _this.$dom_childNodes[index];
-
-  Map<int, Node> asMap() => IterableMixinWorkaround.asMapList(this);
 }
 
 @DomName('Node')
@@ -17831,7 +16929,7 @@
     return new _ChildNodeListLazy(this);
   }
 
-  void set nodes(Collection<Node> value) {
+  void set nodes(Iterable<Node> value) {
     // Copy list first since we don't want liveness during iteration.
     // TODO(jacobr): there is a better way to do this.
     List copy = new List.from(value);
@@ -17974,6 +17072,12 @@
     return _modelChangedStream.stream;
   }
 
+  /**
+   * Print out a String representation of this Node.
+   */
+  String toString() => localName == null ?
+      (nodeValue == null ? super.toString() : nodeValue) : localName;
+
 
   @JSName('childNodes')
   @DomName('Node.childNodes')
@@ -17992,10 +17096,9 @@
   @DocsEditable
   final Node $dom_lastChild;
 
-  @JSName('localName')
   @DomName('Node.localName')
   @DocsEditable
-  final String $dom_localName;
+  final String localName;
 
   @JSName('namespaceURI')
   @DomName('Node.namespaceURI')
@@ -18206,11 +17309,12 @@
     return new FixedSizeListIterator<Node>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Node reduce(Node combine(Node value, Node element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Node)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Node element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -18218,7 +17322,7 @@
 
   void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Node element)) =>
@@ -18320,12 +17424,6 @@
     throw new StateError("More than one element");
   }
 
-  Node min([int compare(Node a, Node b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Node max([int compare(Node a, Node b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Node element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -18342,14 +17440,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Node element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -18370,17 +17460,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Node> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Node> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Node>[]);
   }
 
-  List<Node> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Node> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Node> mixins.
 
   @JSName('item')
@@ -19596,6 +18693,10 @@
 @DomName('RTCDTMFSender')
 class RtcDtmfSender extends EventTarget native "*RTCDTMFSender" {
 
+  @DomName('RTCDTMFSender.tonechangeEvent')
+  @DocsEditable
+  static const EventStreamProvider<RtcDtmfToneChangeEvent> toneChangeEvent = const EventStreamProvider<RtcDtmfToneChangeEvent>('tonechange');
+
   @JSName('canInsertDTMF')
   @DomName('RTCDTMFSender.canInsertDTMF')
   @DocsEditable
@@ -19635,6 +18736,10 @@
   @DomName('RTCDTMFSender.removeEventListener')
   @DocsEditable
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('RTCDTMFSender.ontonechange')
+  @DocsEditable
+  Stream<RtcDtmfToneChangeEvent> get onToneChange => toneChangeEvent.forTarget(this);
 }
 // 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
@@ -19754,6 +18859,10 @@
   @DocsEditable
   static const EventStreamProvider<RtcIceCandidateEvent> iceCandidateEvent = const EventStreamProvider<RtcIceCandidateEvent>('icecandidate');
 
+  @DomName('RTCPeerConnection.iceconnectionstatechangeEvent')
+  @DocsEditable
+  static const EventStreamProvider<Event> iceConnectionStateChangeEvent = const EventStreamProvider<Event>('iceconnectionstatechange');
+
   @DomName('RTCPeerConnection.negotiationneededEvent')
   @DocsEditable
   static const EventStreamProvider<Event> negotiationNeededEvent = const EventStreamProvider<Event>('negotiationneeded');
@@ -19762,6 +18871,10 @@
   @DocsEditable
   static const EventStreamProvider<MediaStreamEvent> removeStreamEvent = const EventStreamProvider<MediaStreamEvent>('removestream');
 
+  @DomName('RTCPeerConnection.signalingstatechangeEvent')
+  @DocsEditable
+  static const EventStreamProvider<Event> signalingStateChangeEvent = const EventStreamProvider<Event>('signalingstatechange');
+
   @DomName('RTCPeerConnection.iceConnectionState')
   @DocsEditable
   final String iceConnectionState;
@@ -19981,6 +19094,10 @@
   @DocsEditable
   Stream<RtcIceCandidateEvent> get onIceCandidate => iceCandidateEvent.forTarget(this);
 
+  @DomName('RTCPeerConnection.oniceconnectionstatechange')
+  @DocsEditable
+  Stream<Event> get onIceConnectionStateChange => iceConnectionStateChangeEvent.forTarget(this);
+
   @DomName('RTCPeerConnection.onnegotiationneeded')
   @DocsEditable
   Stream<Event> get onNegotiationNeeded => negotiationNeededEvent.forTarget(this);
@@ -19989,6 +19106,10 @@
   @DocsEditable
   Stream<MediaStreamEvent> get onRemoveStream => removeStreamEvent.forTarget(this);
 
+  @DomName('RTCPeerConnection.onsignalingstatechange')
+  @DocsEditable
+  Stream<Event> get onSignalingStateChange => signalingStateChangeEvent.forTarget(this);
+
 }
 
 
@@ -20160,6 +19281,10 @@
   @DocsEditable
   String htmlFor;
 
+  @DomName('HTMLScriptElement.nonce')
+  @DocsEditable
+  String nonce;
+
   @DomName('HTMLScriptElement.src')
   @DocsEditable
   String src;
@@ -20244,6 +19369,49 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+@DocsEditable
+@DomName('SecurityPolicyViolationEvent')
+class SecurityPolicyViolationEvent extends Event native "*SecurityPolicyViolationEvent" {
+
+  @JSName('blockedURI')
+  @DomName('SecurityPolicyViolationEvent.blockedURI')
+  @DocsEditable
+  final String blockedUri;
+
+  @JSName('documentURI')
+  @DomName('SecurityPolicyViolationEvent.documentURI')
+  @DocsEditable
+  final String documentUri;
+
+  @DomName('SecurityPolicyViolationEvent.effectiveDirective')
+  @DocsEditable
+  final String effectiveDirective;
+
+  @DomName('SecurityPolicyViolationEvent.lineNumber')
+  @DocsEditable
+  final int lineNumber;
+
+  @DomName('SecurityPolicyViolationEvent.originalPolicy')
+  @DocsEditable
+  final String originalPolicy;
+
+  @DomName('SecurityPolicyViolationEvent.referrer')
+  @DocsEditable
+  final String referrer;
+
+  @DomName('SecurityPolicyViolationEvent.sourceFile')
+  @DocsEditable
+  final String sourceFile;
+
+  @DomName('SecurityPolicyViolationEvent.violatedDirective')
+  @DocsEditable
+  final String violatedDirective;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
 @DomName('HTMLSelectElement')
 class SelectElement extends Element native "*HTMLSelectElement" {
 
@@ -20436,51 +19604,6 @@
 
 
 @DocsEditable
-@DomName('SharedWorker')
-class SharedWorker extends AbstractWorker native "*SharedWorker" {
-
-  @DomName('SharedWorker.SharedWorker')
-  @DocsEditable
-  factory SharedWorker(String scriptURL, [String name]) {
-    if (?name) {
-      return SharedWorker._create_1(scriptURL, name);
-    }
-    return SharedWorker._create_2(scriptURL);
-  }
-  static SharedWorker _create_1(scriptURL, name) => JS('SharedWorker', 'new SharedWorker(#,#)', scriptURL, name);
-  static SharedWorker _create_2(scriptURL) => JS('SharedWorker', 'new SharedWorker(#)', scriptURL);
-
-  @DomName('SharedWorker.port')
-  @DocsEditable
-  final MessagePort port;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
-@DomName('SharedWorkerContext')
-class SharedWorkerContext extends WorkerContext native "*SharedWorkerContext" {
-
-  @DomName('SharedWorkerContext.connectEvent')
-  @DocsEditable
-  static const EventStreamProvider<Event> connectEvent = const EventStreamProvider<Event>('connect');
-
-  @DomName('SharedWorkerContext.name')
-  @DocsEditable
-  final String name;
-
-  @DomName('SharedWorkerContext.onconnect')
-  @DocsEditable
-  Stream<Event> get onConnect => connectEvent.forTarget(this);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
 @DomName('SourceBuffer')
 class SourceBuffer native "*SourceBuffer" {
 
@@ -20530,11 +19653,12 @@
     return new FixedSizeListIterator<SourceBuffer>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SourceBuffer)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  SourceBuffer reduce(SourceBuffer combine(SourceBuffer value, SourceBuffer element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, SourceBuffer)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, SourceBuffer element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -20542,7 +19666,7 @@
 
   void forEach(void f(SourceBuffer element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(SourceBuffer element)) =>
@@ -20644,12 +19768,6 @@
     throw new StateError("More than one element");
   }
 
-  SourceBuffer min([int compare(SourceBuffer a, SourceBuffer b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  SourceBuffer max([int compare(SourceBuffer a, SourceBuffer b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, SourceBuffer element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -20666,14 +19784,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(SourceBuffer element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -20694,17 +19804,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<SourceBuffer> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<SourceBuffer> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <SourceBuffer>[]);
   }
 
-  List<SourceBuffer> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, SourceBuffer> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<SourceBuffer> mixins.
 
   @JSName('addEventListener')
@@ -20824,11 +19941,12 @@
     return new FixedSizeListIterator<SpeechGrammar>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SpeechGrammar)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  SpeechGrammar reduce(SpeechGrammar combine(SpeechGrammar value, SpeechGrammar element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, SpeechGrammar)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, SpeechGrammar element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -20836,7 +19954,7 @@
 
   void forEach(void f(SpeechGrammar element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(SpeechGrammar element)) =>
@@ -20938,12 +20056,6 @@
     throw new StateError("More than one element");
   }
 
-  SpeechGrammar min([int compare(SpeechGrammar a, SpeechGrammar b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  SpeechGrammar max([int compare(SpeechGrammar a, SpeechGrammar b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, SpeechGrammar element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -20960,14 +20072,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(SpeechGrammar element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -20988,17 +20092,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<SpeechGrammar> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<SpeechGrammar> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <SpeechGrammar>[]);
   }
 
-  List<SpeechGrammar> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, SpeechGrammar> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<SpeechGrammar> mixins.
 
   @DomName('SpeechGrammarList.addFromString')
@@ -21348,13 +20459,13 @@
     }
   }
 
-  Collection<String> get keys {
+  Iterable<String> get keys {
     final keys = [];
     forEach((k, v) => keys.add(k));
     return keys;
   }
 
-  Collection<String> get values {
+  Iterable<String> get values {
     final values = [];
     forEach((k, v) => values.add(v));
     return values;
@@ -22281,11 +21392,12 @@
     return new FixedSizeListIterator<TextTrackCue>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, TextTrackCue)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  TextTrackCue reduce(TextTrackCue combine(TextTrackCue value, TextTrackCue element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, TextTrackCue)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, TextTrackCue element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -22293,7 +21405,7 @@
 
   void forEach(void f(TextTrackCue element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(TextTrackCue element)) =>
@@ -22395,12 +21507,6 @@
     throw new StateError("More than one element");
   }
 
-  TextTrackCue min([int compare(TextTrackCue a, TextTrackCue b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  TextTrackCue max([int compare(TextTrackCue a, TextTrackCue b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, TextTrackCue element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -22417,14 +21523,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(TextTrackCue element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -22445,17 +21543,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<TextTrackCue> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<TextTrackCue> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <TextTrackCue>[]);
   }
 
-  List<TextTrackCue> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, TextTrackCue> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<TextTrackCue> mixins.
 
   @DomName('TextTrackCueList.getCueById')
@@ -22500,11 +21605,12 @@
     return new FixedSizeListIterator<TextTrack>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, TextTrack)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  TextTrack reduce(TextTrack combine(TextTrack value, TextTrack element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, TextTrack)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, TextTrack element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -22512,7 +21618,7 @@
 
   void forEach(void f(TextTrack element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(TextTrack element)) =>
@@ -22614,12 +21720,6 @@
     throw new StateError("More than one element");
   }
 
-  TextTrack min([int compare(TextTrack a, TextTrack b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  TextTrack max([int compare(TextTrack a, TextTrack b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, TextTrack element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -22636,14 +21736,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(TextTrack element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -22664,17 +21756,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<TextTrack> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<TextTrack> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <TextTrack>[]);
   }
 
-  List<TextTrack> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, TextTrack> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<TextTrack> mixins.
 
   @JSName('addEventListener')
@@ -22945,11 +22044,12 @@
     return new FixedSizeListIterator<Touch>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Touch)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Touch reduce(Touch combine(Touch value, Touch element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Touch)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Touch element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -22957,7 +22057,7 @@
 
   void forEach(void f(Touch element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Touch element)) =>
@@ -23059,12 +22159,6 @@
     throw new StateError("More than one element");
   }
 
-  Touch min([int compare(Touch a, Touch b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Touch max([int compare(Touch a, Touch b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Touch element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -23081,14 +22175,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Touch element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -23109,17 +22195,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Touch> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Touch> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Touch>[]);
   }
 
-  List<Touch> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Touch> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Touch> mixins.
 
   @DomName('TouchList.item')
@@ -23427,11 +22520,12 @@
     return new FixedSizeListIterator<int>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  int reduce(int combine(int value, int element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, int)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, int element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -23439,7 +22533,7 @@
 
   void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(int element)) =>
@@ -23541,12 +22635,6 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  int max([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, int element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -23563,14 +22651,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(int element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -23591,17 +22671,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<int> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<int> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <int>[]);
   }
 
-  List<int> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, int> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<int> mixins.
 
   @JSName('set')
@@ -23659,11 +22746,12 @@
     return new FixedSizeListIterator<int>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  int reduce(int combine(int value, int element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, int)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, int element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -23671,7 +22759,7 @@
 
   void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(int element)) =>
@@ -23773,12 +22861,6 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  int max([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, int element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -23795,14 +22877,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(int element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -23823,17 +22897,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<int> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<int> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <int>[]);
   }
 
-  List<int> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, int> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<int> mixins.
 
   @JSName('set')
@@ -23891,11 +22972,12 @@
     return new FixedSizeListIterator<int>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  int reduce(int combine(int value, int element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, int)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, int element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -23903,7 +22985,7 @@
 
   void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(int element)) =>
@@ -24005,12 +23087,6 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  int max([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, int element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -24027,14 +23103,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(int element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -24055,17 +23123,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<int> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<int> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <int>[]);
   }
 
-  List<int> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, int> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<int> mixins.
 
   @JSName('set')
@@ -24120,11 +23195,12 @@
     return new FixedSizeListIterator<int>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  int reduce(int combine(int value, int element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, int)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, int element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -24132,7 +23208,7 @@
 
   void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(int element)) =>
@@ -24234,12 +23310,6 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  int max([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, int element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -24256,14 +23326,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(int element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -24284,17 +23346,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<int> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<int> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <int>[]);
   }
 
-  List<int> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, int> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<int> mixins.
 
   @JSName('set')
@@ -24508,52 +23577,6 @@
 
 
 @DocsEditable
-@DomName('WebKitCSSFilterValue')
-class WebKitCssFilterValue extends _CssValueList native "*WebKitCSSFilterValue" {
-
-  static const int CSS_FILTER_BLUR = 10;
-
-  static const int CSS_FILTER_BRIGHTNESS = 8;
-
-  static const int CSS_FILTER_CONTRAST = 9;
-
-  static const int CSS_FILTER_CUSTOM = 12;
-
-  static const int CSS_FILTER_DROP_SHADOW = 11;
-
-  static const int CSS_FILTER_GRAYSCALE = 2;
-
-  static const int CSS_FILTER_HUE_ROTATE = 5;
-
-  static const int CSS_FILTER_INVERT = 6;
-
-  static const int CSS_FILTER_OPACITY = 7;
-
-  static const int CSS_FILTER_REFERENCE = 1;
-
-  static const int CSS_FILTER_SATURATE = 4;
-
-  static const int CSS_FILTER_SEPIA = 3;
-
-  @DomName('WebKitCSSFilterValue.operationType')
-  @DocsEditable
-  final int operationType;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
-@DomName('WebKitCSSMixFunctionValue')
-class WebKitCssMixFunctionValue extends _CssValueList native "*WebKitCSSMixFunctionValue" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
 @DomName('WebKitNamedFlow')
 class WebKitNamedFlow extends EventTarget native "*WebKitNamedFlow" {
 
@@ -25211,20 +24234,42 @@
    * lasting storage. This storage cannot be freed without the user's
    * permission. Returns a [Future] whose value stores a reference to the
    * sandboxed file system for use. Because the file system is sandboxed,
-   * applications cannot access file systems created in other web pages. 
+   * applications cannot access file systems created in other web pages.
    */
   Future<FileSystem> requestFileSystem(int size, {bool persistent: false}) {
     return _requestFileSystem(persistent? 1 : 0, size);
   }
 
+  @DomName('DOMWindow.convertPointFromNodeToPage')
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental
+  Point convertPointFromNodeToPage(Node node, Point point) {
+    var result = _convertPointFromNodeToPage(node,
+        new _DomPoint(point.x, point.y));
+    return new Point(result.x, result.y);
+  }
+
+  @DomName('DOMWindow.convertPointFromPageToNode')
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental
+  Point convertPointFromPageToNode(Node node, Point point) {
+    var result = _convertPointFromPageToNode(node,
+        new _DomPoint(point.x, point.y));
+    return new Point(result.x, result.y);
+  }
+
+  /**
+   * Checks whether [convertPointFromNodeToPage] and
+   * [convertPointFromPageToNode] are supported on the current platform.
+   */
+  static bool get supportsPointConversions => _DomPoint.supported;
+
   @DomName('DOMWindow.DOMContentLoadedEvent')
   @DocsEditable
   static const EventStreamProvider<Event> contentLoadedEvent = const EventStreamProvider<Event>('DOMContentLoaded');
 
-  @DomName('DOMWindow.beforeunloadEvent')
-  @DocsEditable
-  static const EventStreamProvider<Event> beforeUnloadEvent = const EventStreamProvider<Event>('beforeunload');
-
   @DomName('DOMWindow.devicemotionEvent')
   @DocsEditable
   static const EventStreamProvider<DeviceMotionEvent> deviceMotionEvent = const EventStreamProvider<DeviceMotionEvent>('devicemotion');
@@ -25582,7 +24627,6 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
   @Creates('SqlDatabase')
-  @Creates('SqlDatabaseSync')
   SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native;
 
   @DomName('DOMWindow.postMessage')
@@ -25663,7 +24707,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  DomPoint convertPointFromNodeToPage(Node node, DomPoint p) native;
+  _DomPoint _convertPointFromNodeToPage(Node node, _DomPoint p) native;
 
   @JSName('webkitConvertPointFromPageToNode')
   @DomName('DOMWindow.webkitConvertPointFromPageToNode')
@@ -25671,7 +24715,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  DomPoint convertPointFromPageToNode(Node node, DomPoint p) native;
+  _DomPoint _convertPointFromPageToNode(Node node, _DomPoint p) native;
 
   @JSName('webkitRequestFileSystem')
   @DomName('DOMWindow.webkitRequestFileSystem')
@@ -25721,10 +24765,6 @@
   @DocsEditable
   Stream<Event> get onAbort => Element.abortEvent.forTarget(this);
 
-  @DomName('DOMWindow.onbeforeunload')
-  @DocsEditable
-  Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
-
   @DomName('DOMWindow.onblur')
   @DocsEditable
   Stream<Event> get onBlur => Element.blurEvent.forTarget(this);
@@ -25929,6 +24969,70 @@
   @DocsEditable
   Stream<TransitionEvent> get onTransitionEnd => Element.transitionEndEvent.forTarget(this);
 
+
+  @DomName('DOMWindow.beforeunloadEvent')
+  @DocsEditable
+  static const EventStreamProvider<BeforeUnloadEvent> beforeUnloadEvent =
+      const _BeforeUnloadEventStreamProvider('beforeunload');
+
+  @DomName('DOMWindow.onbeforeunload')
+  @DocsEditable
+  Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
+}
+
+/**
+ * Event object that is fired before the window is closed.
+ *
+ * The standard window close behavior can be prevented by setting the
+ * [returnValue]. This will display a dialog to the user confirming that they
+ * want to close the page.
+ */
+abstract class BeforeUnloadEvent implements Event {
+  /**
+   * If set to a non-null value, a dialog will be presented to the user
+   * confirming that they want to close the page.
+   */
+  String returnValue;
+}
+
+class _BeforeUnloadEvent extends _WrappedEvent implements BeforeUnloadEvent {
+  String _returnValue;
+
+  _BeforeUnloadEvent(Event base): super(base);
+
+  String get returnValue => _returnValue;
+
+  void set returnValue(String value) {
+    _returnValue = value;
+    // FF and IE use the value as the return value, Chrome will return this from
+    // the event callback function.
+    if (JS('bool', '("returnValue" in #)', _base)) {
+      JS('void', '#.returnValue = #', _base, value);
+    }
+  }
+}
+
+class _BeforeUnloadEventStreamProvider implements
+    EventStreamProvider<BeforeUnloadEvent> {
+  final String _eventType;
+
+  const _BeforeUnloadEventStreamProvider(this._eventType);
+
+  Stream<BeforeUnloadEvent> forTarget(EventTarget e, {bool useCapture: false}) {
+    var controller = new StreamController.broadcast();
+    var stream = new _EventStream(e, _eventType, useCapture);
+    stream.listen((event) {
+      var wrapped = new _BeforeUnloadEvent(event);
+      controller.add(wrapped);
+      return wrapped.returnValue;
+    });
+
+    return controller.stream;
+  }
+
+  String getEventType(EventTarget target) {
+    return _eventType;
+  }
 }
 // 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
@@ -25937,6 +25041,10 @@
 
 @DocsEditable
 @DomName('Worker')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.FIREFOX)
+@SupportedBrowser(SupportedBrowser.IE, '10')
+@SupportedBrowser(SupportedBrowser.SAFARI)
 class Worker extends AbstractWorker native "*Worker" {
 
   @DomName('Worker.messageEvent')
@@ -25950,26 +25058,12 @@
   }
   static Worker _create_1(scriptUrl) => JS('Worker', 'new Worker(#)', scriptUrl);
 
+  /// Checks if this type is supported on the current platform.
+  static bool get supported => JS('bool', '(typeof window.Worker != "undefined")');
+
   @DomName('Worker.postMessage')
   @DocsEditable
-  void postMessage(/*SerializedScriptValue*/ message, [List messagePorts]) {
-    if (?messagePorts) {
-      var message_1 = convertDartToNative_SerializedScriptValue(message);
-      _postMessage_1(message_1, messagePorts);
-      return;
-    }
-    var message_2 = convertDartToNative_SerializedScriptValue(message);
-    _postMessage_2(message_2);
-    return;
-  }
-  @JSName('postMessage')
-  @DomName('Worker.postMessage')
-  @DocsEditable
-  void _postMessage_1(message, List messagePorts) native;
-  @JSName('postMessage')
-  @DomName('Worker.postMessage')
-  @DocsEditable
-  void _postMessage_2(message) native;
+  void postMessage(/*SerializedScriptValue*/ message, [List messagePorts]) native;
 
   @DomName('Worker.terminate')
   @DocsEditable
@@ -25979,313 +25073,6 @@
   @DocsEditable
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 }
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DomName('WorkerContext')
-class WorkerContext extends EventTarget native "*WorkerContext" {
-  /**
-   * Gets an instance of the Indexed DB factory to being using Indexed DB.
-   *
-   * Use [IdbFactory.supported] to check if Indexed DB is supported on the
-   * current platform.
-   */
-  @SupportedBrowser(SupportedBrowser.CHROME, '23.0')
-  @SupportedBrowser(SupportedBrowser.FIREFOX, '15.0')
-  @SupportedBrowser(SupportedBrowser.IE, '10.0')
-  @Experimental
-  IdbFactory get indexedDB =>
-      JS('IdbFactory',
-         '#.indexedDB || #.webkitIndexedDB || #.mozIndexedDB',
-         this, this, this);
-
-  /**
-   * Access a sandboxed file system of the specified `size`. If `persistent` is
-   * true, the application will request permission from the user to create
-   * lasting storage. This storage cannot be freed without the user's
-   * permission. Returns a [Future] whose value stores a reference to the
-   * sandboxed file system for use. Because the file system is sandboxed,
-   * applications cannot access file systems created in other web pages. 
-   */
-  @DomName('WorkerContext.webkitRequestFileSystem')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental
-  Future<FileSystem> requestFileSystem(int size, {bool persistent: false}) {
-    return _requestFileSystem(persistent? 1 : 0, size);
-  }
-
-  /**
-   * Access a sandboxed file system of the specified `size`. If `persistent` is
-   * true, the application will request permission from the user to create
-   * lasting storage. This storage cannot be freed without the user's
-   * permission. This call will block until a reference to the synchronous file 
-   * system API has been obtained. Because the file system is sandboxed,
-   * applications cannot access file systems created in other web pages. 
-   */
-  @DomName('WorkerContext.webkitRequestFileSystemSync')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental
-  FileSystemSync requestFileSystemSync(int size, {bool persistent: false}) {
-    return _requestFileSystemSync(persistent? 1 : 0, size);
-  }
-
-  @DomName('WorkerContext.errorEvent')
-  @DocsEditable
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
-
-  static const int PERSISTENT = 1;
-
-  static const int TEMPORARY = 0;
-
-  @DomName('WorkerContext.location')
-  @DocsEditable
-  final WorkerLocation location;
-
-  @DomName('WorkerContext.navigator')
-  @DocsEditable
-  final WorkerNavigator navigator;
-
-  @DomName('WorkerContext.self')
-  @DocsEditable
-  final WorkerContext self;
-
-  @JSName('webkitNotifications')
-  @DomName('WorkerContext.webkitNotifications')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental
-  final NotificationCenter notifications;
-
-  @JSName('addEventListener')
-  @DomName('WorkerContext.addEventListener')
-  @DocsEditable
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
-
-  @DomName('WorkerContext.clearInterval')
-  @DocsEditable
-  void clearInterval(int handle) native;
-
-  @DomName('WorkerContext.clearTimeout')
-  @DocsEditable
-  void clearTimeout(int handle) native;
-
-  @DomName('WorkerContext.close')
-  @DocsEditable
-  void close() native;
-
-  @DomName('WorkerContext.dispatchEvent')
-  @DocsEditable
-  bool dispatchEvent(Event evt) native;
-
-  @DomName('WorkerContext.importScripts')
-  @DocsEditable
-  void importScripts() native;
-
-  @DomName('WorkerContext.openDatabase')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental
-  SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native;
-
-  @DomName('WorkerContext.openDatabaseSync')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental
-  SqlDatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native;
-
-  @JSName('removeEventListener')
-  @DomName('WorkerContext.removeEventListener')
-  @DocsEditable
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
-
-  @DomName('WorkerContext.setInterval')
-  @DocsEditable
-  int setInterval(Object handler, int timeout) native;
-
-  @DomName('WorkerContext.setTimeout')
-  @DocsEditable
-  int setTimeout(Object handler, int timeout) native;
-
-  @JSName('webkitRequestFileSystem')
-  /**
-   * Access a sandboxed file system of the specified `size`. If `persistent` is
-   * true, the application will request permission from the user to create
-   * lasting storage. This storage cannot be freed without the user's
-   * permission. Returns a [Future] whose value stores a reference to the
-   * sandboxed file system for use. Because the file system is sandboxed,
-   * applications cannot access file systems created in other web pages. 
-   */
-  @DomName('WorkerContext.webkitRequestFileSystem')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental
-  void __requestFileSystem(int type, int size, [_FileSystemCallback successCallback, _ErrorCallback errorCallback]) native;
-
-  @JSName('webkitRequestFileSystem')
-  /**
-   * Access a sandboxed file system of the specified `size`. If `persistent` is
-   * true, the application will request permission from the user to create
-   * lasting storage. This storage cannot be freed without the user's
-   * permission. Returns a [Future] whose value stores a reference to the
-   * sandboxed file system for use. Because the file system is sandboxed,
-   * applications cannot access file systems created in other web pages. 
-   */
-  @DomName('WorkerContext.webkitRequestFileSystem')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental
-  Future<FileSystem> _requestFileSystem(int type, int size) {
-    var completer = new Completer<FileSystem>();
-    __requestFileSystem(type, size,
-        (value) { completer.complete(value); },
-        (error) { completer.completeError(error); });
-    return completer.future;
-  }
-
-  @JSName('webkitRequestFileSystemSync')
-  /**
-   * Access a sandboxed file system of the specified `size`. If `persistent` is
-   * true, the application will request permission from the user to create
-   * lasting storage. This storage cannot be freed without the user's
-   * permission. This call will block until a reference to the synchronous file 
-   * system API has been obtained. Because the file system is sandboxed,
-   * applications cannot access file systems created in other web pages. 
-   */
-  @DomName('WorkerContext.webkitRequestFileSystemSync')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental
-  FileSystemSync _requestFileSystemSync(int type, int size) native;
-
-  @JSName('webkitResolveLocalFileSystemSyncURL')
-  @DomName('WorkerContext.webkitResolveLocalFileSystemSyncURL')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental
-  EntrySync resolveLocalFileSystemSyncUrl(String url) native;
-
-  @JSName('webkitResolveLocalFileSystemURL')
-  @DomName('WorkerContext.webkitResolveLocalFileSystemURL')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental
-  void _resolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) native;
-
-  @JSName('webkitResolveLocalFileSystemURL')
-  @DomName('WorkerContext.webkitResolveLocalFileSystemURL')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental
-  Future<Entry> resolveLocalFileSystemUrl(String url) {
-    var completer = new Completer<Entry>();
-    _resolveLocalFileSystemUrl(url,
-        (value) { completer.complete(value); },
-        (error) { completer.completeError(error); });
-    return completer.future;
-  }
-
-  @DomName('WorkerContext.onerror')
-  @DocsEditable
-  Stream<Event> get onError => errorEvent.forTarget(this);
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
-@DomName('WorkerLocation')
-class WorkerLocation native "*WorkerLocation" {
-
-  @DomName('WorkerLocation.hash')
-  @DocsEditable
-  final String hash;
-
-  @DomName('WorkerLocation.host')
-  @DocsEditable
-  final String host;
-
-  @DomName('WorkerLocation.hostname')
-  @DocsEditable
-  final String hostname;
-
-  @DomName('WorkerLocation.href')
-  @DocsEditable
-  final String href;
-
-  @DomName('WorkerLocation.pathname')
-  @DocsEditable
-  final String pathname;
-
-  @DomName('WorkerLocation.port')
-  @DocsEditable
-  final String port;
-
-  @DomName('WorkerLocation.protocol')
-  @DocsEditable
-  final String protocol;
-
-  @DomName('WorkerLocation.search')
-  @DocsEditable
-  final String search;
-
-  @DomName('WorkerLocation.toString')
-  @DocsEditable
-  String toString() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
-@DomName('WorkerNavigator')
-class WorkerNavigator native "*WorkerNavigator" {
-
-  @DomName('WorkerNavigator.appName')
-  @DocsEditable
-  final String appName;
-
-  @DomName('WorkerNavigator.appVersion')
-  @DocsEditable
-  final String appVersion;
-
-  @DomName('WorkerNavigator.onLine')
-  @DocsEditable
-  final bool onLine;
-
-  @DomName('WorkerNavigator.platform')
-  @DocsEditable
-  final String platform;
-
-  @DomName('WorkerNavigator.userAgent')
-  @DocsEditable
-  final String userAgent;
-
-  @JSName('webkitPersistentStorage')
-  @DomName('WorkerNavigator.webkitPersistentStorage')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental
-  final StorageQuota persistentStorage;
-
-  @JSName('webkitTemporaryStorage')
-  @DomName('WorkerNavigator.webkitTemporaryStorage')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental
-  final StorageQuota temporaryStorage;
-}
 // 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.
@@ -26509,6 +25296,24 @@
   @DocsEditable
   DocumentFragment transformToFragment(Node source, Document docVal) native;
 }
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('CSSPrimitiveValue')
+abstract class _CSSPrimitiveValue extends _CSSValue native "*CSSPrimitiveValue" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('CSSValue')
+abstract class _CSSValue native "*CSSValue" {
+}
 // 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.
@@ -26664,11 +25469,12 @@
     return new FixedSizeListIterator<Rect>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Rect)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Rect reduce(Rect combine(Rect value, Rect element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Rect)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Rect element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -26676,7 +25482,7 @@
 
   void forEach(void f(Rect element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Rect element)) =>
@@ -26778,12 +25584,6 @@
     throw new StateError("More than one element");
   }
 
-  Rect min([int compare(Rect a, Rect b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Rect max([int compare(Rect a, Rect b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Rect element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -26800,14 +25600,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Rect element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -26828,17 +25620,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Rect> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Rect> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Rect>[]);
   }
 
-  List<Rect> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Rect> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Rect> mixins.
 
   @DomName('ClientRectList.item')
@@ -26851,6 +25650,15 @@
 
 
 @DocsEditable
+@DomName('Counter')
+abstract class _Counter native "*Counter" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
 @DomName('CSSRuleList')
 class _CssRuleList implements JavaScriptIndexingBehavior, List<CssRule> native "*CSSRuleList" {
 
@@ -26875,11 +25683,12 @@
     return new FixedSizeListIterator<CssRule>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, CssRule)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  CssRule reduce(CssRule combine(CssRule value, CssRule element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, CssRule)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, CssRule element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -26887,7 +25696,7 @@
 
   void forEach(void f(CssRule element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(CssRule element)) =>
@@ -26989,12 +25798,6 @@
     throw new StateError("More than one element");
   }
 
-  CssRule min([int compare(CssRule a, CssRule b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  CssRule max([int compare(CssRule a, CssRule b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, CssRule element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -27011,14 +25814,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(CssRule element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -27039,17 +25834,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<CssRule> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<CssRule> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <CssRule>[]);
   }
 
-  List<CssRule> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, CssRule> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<CssRule> mixins.
 
   @DomName('CSSRuleList.item')
@@ -27063,103 +25865,104 @@
 
 @DocsEditable
 @DomName('CSSValueList')
-class _CssValueList extends CssValue implements List<CssValue>, JavaScriptIndexingBehavior native "*CSSValueList" {
+class _CssValueList extends _CSSValue implements JavaScriptIndexingBehavior, List<_CSSValue> native "*CSSValueList" {
 
   @DomName('CSSValueList.length')
   @DocsEditable
   int get length => JS("int", "#.length", this);
 
-  CssValue operator[](int index) => JS("CssValue", "#[#]", this, index);
+  _CSSValue operator[](int index) => JS("_CSSValue", "#[#]", this, index);
 
-  void operator[]=(int index, CssValue value) {
+  void operator[]=(int index, _CSSValue value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
-  // -- start List<CssValue> mixins.
-  // CssValue is the element type.
+  // -- start List<_CSSValue> mixins.
+  // _CSSValue is the element type.
 
-  // From Iterable<CssValue>:
+  // From Iterable<_CSSValue>:
 
-  Iterator<CssValue> get iterator {
+  Iterator<_CSSValue> get iterator {
     // Note: NodeLists are not fixed size. And most probably length shouldn't
     // be cached in both iterator _and_ forEach method. For now caching it
     // for consistency.
-    return new FixedSizeListIterator<CssValue>(this);
+    return new FixedSizeListIterator<_CSSValue>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, CssValue)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  _CSSValue reduce(_CSSValue combine(_CSSValue value, _CSSValue element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, CssValue)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, _CSSValue element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
-  bool contains(CssValue element) => IterableMixinWorkaround.contains(this, element);
+  bool contains(_CSSValue element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(CssValue element)) => IterableMixinWorkaround.forEach(this, f);
+  void forEach(void f(_CSSValue element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
-  Iterable map(f(CssValue element)) =>
+  Iterable map(f(_CSSValue element)) =>
       IterableMixinWorkaround.mapList(this, f);
 
-  Iterable<CssValue> where(bool f(CssValue element)) =>
+  Iterable<_CSSValue> where(bool f(_CSSValue element)) =>
       IterableMixinWorkaround.where(this, f);
 
-  Iterable expand(Iterable f(CssValue element)) =>
+  Iterable expand(Iterable f(_CSSValue element)) =>
       IterableMixinWorkaround.expand(this, f);
 
-  bool every(bool f(CssValue element)) => IterableMixinWorkaround.every(this, f);
+  bool every(bool f(_CSSValue element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(CssValue element)) => IterableMixinWorkaround.any(this, f);
+  bool any(bool f(_CSSValue element)) => IterableMixinWorkaround.any(this, f);
 
-  List<CssValue> toList({ bool growable: true }) =>
-      new List<CssValue>.from(this, growable: growable);
+  List<_CSSValue> toList({ bool growable: true }) =>
+      new List<_CSSValue>.from(this, growable: growable);
 
-  Set<CssValue> toSet() => new Set<CssValue>.from(this);
+  Set<_CSSValue> toSet() => new Set<_CSSValue>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  Iterable<CssValue> take(int n) => IterableMixinWorkaround.takeList(this, n);
+  Iterable<_CSSValue> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
-  Iterable<CssValue> takeWhile(bool test(CssValue value)) {
+  Iterable<_CSSValue> takeWhile(bool test(_CSSValue value)) {
     return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  Iterable<CssValue> skip(int n) => IterableMixinWorkaround.skipList(this, n);
+  Iterable<_CSSValue> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
-  Iterable<CssValue> skipWhile(bool test(CssValue value)) {
+  Iterable<_CSSValue> skipWhile(bool test(_CSSValue value)) {
     return IterableMixinWorkaround.skipWhile(this, test);
   }
 
-  CssValue firstWhere(bool test(CssValue value), { CssValue orElse() }) {
+  _CSSValue firstWhere(bool test(_CSSValue value), { _CSSValue orElse() }) {
     return IterableMixinWorkaround.firstWhere(this, test, orElse);
   }
 
-  CssValue lastWhere(bool test(CssValue value), {CssValue orElse()}) {
+  _CSSValue lastWhere(bool test(_CSSValue value), {_CSSValue orElse()}) {
     return IterableMixinWorkaround.lastWhereList(this, test, orElse);
   }
 
-  CssValue singleWhere(bool test(CssValue value)) {
+  _CSSValue singleWhere(bool test(_CSSValue value)) {
     return IterableMixinWorkaround.singleWhere(this, test);
   }
 
-  CssValue elementAt(int index) {
+  _CSSValue elementAt(int index) {
     return this[index];
   }
 
-  // From Collection<CssValue>:
+  // From Collection<_CSSValue>:
 
-  void add(CssValue value) {
+  void add(_CSSValue value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addAll(Iterable<CssValue> iterable) {
+  void addAll(Iterable<_CSSValue> iterable) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  // From List<CssValue>:
+  // From List<_CSSValue>:
   void set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -27168,53 +25971,47 @@
     throw new UnsupportedError("Cannot clear immutable List.");
   }
 
-  Iterable<CssValue> get reversed {
+  Iterable<_CSSValue> get reversed {
     return IterableMixinWorkaround.reversedList(this);
   }
 
-  void sort([int compare(CssValue a, CssValue b)]) {
+  void sort([int compare(_CSSValue a, _CSSValue b)]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(CssValue element, [int start = 0]) =>
+  int indexOf(_CSSValue element, [int start = 0]) =>
       Lists.indexOf(this, element, start, this.length);
 
-  int lastIndexOf(CssValue element, [int start]) {
+  int lastIndexOf(_CSSValue element, [int start]) {
     if (start == null) start = length - 1;
     return Lists.lastIndexOf(this, element, start);
   }
 
-  CssValue get first {
+  _CSSValue get first {
     if (this.length > 0) return this[0];
     throw new StateError("No elements");
   }
 
-  CssValue get last {
+  _CSSValue get last {
     if (this.length > 0) return this[this.length - 1];
     throw new StateError("No elements");
   }
 
-  CssValue get single {
+  _CSSValue get single {
     if (length == 1) return this[0];
     if (length == 0) throw new StateError("No elements");
     throw new StateError("More than one element");
   }
 
-  CssValue min([int compare(CssValue a, CssValue b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  CssValue max([int compare(CssValue a, CssValue b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
-  void insert(int index, CssValue element) {
+  void insert(int index, _CSSValue element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  CssValue removeAt(int pos) {
+  _CSSValue removeAt(int pos) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  CssValue removeLast() {
+  _CSSValue removeLast() {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
@@ -27222,23 +26019,15 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
+  void removeWhere(bool test(_CSSValue element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void retainAll(Iterable elements) {
+  void retainWhere(bool test(_CSSValue element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeWhere(bool test(CssValue element)) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainWhere(bool test(CssValue element)) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<CssValue> from, [int startFrom]) {
+  void setRange(int start, int rangeLength, List<_CSSValue> from, [int startFrom]) {
     throw new UnsupportedError("Cannot setRange on immutable List.");
   }
 
@@ -27246,26 +26035,101 @@
     throw new UnsupportedError("Cannot removeRange on immutable List.");
   }
 
-  void insertRange(int start, int rangeLength, [CssValue initialValue]) {
+  void insertRange(int start, int rangeLength, [_CSSValue initialValue]) {
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
-  List<CssValue> sublist(int start, [int end]) {
+  Iterable<_CSSValue> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
+  List<_CSSValue> sublist(int start, [int end]) {
     if (end == null) end = length;
-    return Lists.getRange(this, start, end, <CssValue>[]);
+    return Lists.getRange(this, start, end, <_CSSValue>[]);
   }
 
-  List<CssValue> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
-  Map<int, CssValue> asMap() =>
+  Map<int, _CSSValue> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
-  // -- end List<CssValue> mixins.
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
+  // -- end List<_CSSValue> mixins.
 
   @DomName('CSSValueList.item')
   @DocsEditable
-  CssValue item(int index) native;
+  _CSSValue item(int index) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('DOMFileSystemSync')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@Experimental
+abstract class _DOMFileSystemSync native "*DOMFileSystemSync" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('DedicatedWorkerContext')
+abstract class _DedicatedWorkerContext extends _WorkerContext native "*DedicatedWorkerContext" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('DirectoryEntrySync')
+abstract class _DirectoryEntrySync extends _EntrySync native "*DirectoryEntrySync" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('DirectoryReaderSync')
+abstract class _DirectoryReaderSync native "*DirectoryReaderSync" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('WebKitPoint')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.SAFARI)
+@Experimental
+class _DomPoint native "*WebKitPoint" {
+
+  @DomName('WebKitPoint.WebKitPoint')
+  @DocsEditable
+  factory _DomPoint(num x, num y) {
+    return _DomPoint._create_1(x, y);
+  }
+  static _DomPoint _create_1(x, y) => JS('_DomPoint', 'new WebKitPoint(#,#)', x, y);
+
+  /// Checks if this type is supported on the current platform.
+  static bool get supported => JS('bool', '!!(window.WebKitPoint)');
+
+  @DomName('WebKitPoint.x')
+  @DocsEditable
+  num x;
+
+  @DomName('WebKitPoint.y')
+  @DocsEditable
+  num y;
 }
 // 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
@@ -27297,11 +26161,12 @@
     return new FixedSizeListIterator<Entry>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Entry)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Entry reduce(Entry combine(Entry value, Entry element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Entry)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Entry element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -27309,7 +26174,7 @@
 
   void forEach(void f(Entry element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Entry element)) =>
@@ -27411,12 +26276,6 @@
     throw new StateError("More than one element");
   }
 
-  Entry min([int compare(Entry a, Entry b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Entry max([int compare(Entry a, Entry b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Entry element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -27433,14 +26292,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Entry element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -27461,17 +26312,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Entry> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Entry> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Entry>[]);
   }
 
-  List<Entry> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Entry> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Entry> mixins.
 
   @DomName('EntryArray.item')
@@ -27485,103 +26343,104 @@
 
 @DocsEditable
 @DomName('EntryArraySync')
-class _EntryArraySync implements JavaScriptIndexingBehavior, List<EntrySync> native "*EntryArraySync" {
+class _EntryArraySync implements JavaScriptIndexingBehavior, List<_EntrySync> native "*EntryArraySync" {
 
   @DomName('EntryArraySync.length')
   @DocsEditable
   int get length => JS("int", "#.length", this);
 
-  EntrySync operator[](int index) => JS("EntrySync", "#[#]", this, index);
+  _EntrySync operator[](int index) => JS("_EntrySync", "#[#]", this, index);
 
-  void operator[]=(int index, EntrySync value) {
+  void operator[]=(int index, _EntrySync value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
-  // -- start List<EntrySync> mixins.
-  // EntrySync is the element type.
+  // -- start List<_EntrySync> mixins.
+  // _EntrySync is the element type.
 
-  // From Iterable<EntrySync>:
+  // From Iterable<_EntrySync>:
 
-  Iterator<EntrySync> get iterator {
+  Iterator<_EntrySync> get iterator {
     // Note: NodeLists are not fixed size. And most probably length shouldn't
     // be cached in both iterator _and_ forEach method. For now caching it
     // for consistency.
-    return new FixedSizeListIterator<EntrySync>(this);
+    return new FixedSizeListIterator<_EntrySync>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, EntrySync)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  _EntrySync reduce(_EntrySync combine(_EntrySync value, _EntrySync element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, EntrySync)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, _EntrySync element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
-  bool contains(EntrySync element) => IterableMixinWorkaround.contains(this, element);
+  bool contains(_EntrySync element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(EntrySync element)) => IterableMixinWorkaround.forEach(this, f);
+  void forEach(void f(_EntrySync element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
-  Iterable map(f(EntrySync element)) =>
+  Iterable map(f(_EntrySync element)) =>
       IterableMixinWorkaround.mapList(this, f);
 
-  Iterable<EntrySync> where(bool f(EntrySync element)) =>
+  Iterable<_EntrySync> where(bool f(_EntrySync element)) =>
       IterableMixinWorkaround.where(this, f);
 
-  Iterable expand(Iterable f(EntrySync element)) =>
+  Iterable expand(Iterable f(_EntrySync element)) =>
       IterableMixinWorkaround.expand(this, f);
 
-  bool every(bool f(EntrySync element)) => IterableMixinWorkaround.every(this, f);
+  bool every(bool f(_EntrySync element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(EntrySync element)) => IterableMixinWorkaround.any(this, f);
+  bool any(bool f(_EntrySync element)) => IterableMixinWorkaround.any(this, f);
 
-  List<EntrySync> toList({ bool growable: true }) =>
-      new List<EntrySync>.from(this, growable: growable);
+  List<_EntrySync> toList({ bool growable: true }) =>
+      new List<_EntrySync>.from(this, growable: growable);
 
-  Set<EntrySync> toSet() => new Set<EntrySync>.from(this);
+  Set<_EntrySync> toSet() => new Set<_EntrySync>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  Iterable<EntrySync> take(int n) => IterableMixinWorkaround.takeList(this, n);
+  Iterable<_EntrySync> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
-  Iterable<EntrySync> takeWhile(bool test(EntrySync value)) {
+  Iterable<_EntrySync> takeWhile(bool test(_EntrySync value)) {
     return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  Iterable<EntrySync> skip(int n) => IterableMixinWorkaround.skipList(this, n);
+  Iterable<_EntrySync> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
-  Iterable<EntrySync> skipWhile(bool test(EntrySync value)) {
+  Iterable<_EntrySync> skipWhile(bool test(_EntrySync value)) {
     return IterableMixinWorkaround.skipWhile(this, test);
   }
 
-  EntrySync firstWhere(bool test(EntrySync value), { EntrySync orElse() }) {
+  _EntrySync firstWhere(bool test(_EntrySync value), { _EntrySync orElse() }) {
     return IterableMixinWorkaround.firstWhere(this, test, orElse);
   }
 
-  EntrySync lastWhere(bool test(EntrySync value), {EntrySync orElse()}) {
+  _EntrySync lastWhere(bool test(_EntrySync value), {_EntrySync orElse()}) {
     return IterableMixinWorkaround.lastWhereList(this, test, orElse);
   }
 
-  EntrySync singleWhere(bool test(EntrySync value)) {
+  _EntrySync singleWhere(bool test(_EntrySync value)) {
     return IterableMixinWorkaround.singleWhere(this, test);
   }
 
-  EntrySync elementAt(int index) {
+  _EntrySync elementAt(int index) {
     return this[index];
   }
 
-  // From Collection<EntrySync>:
+  // From Collection<_EntrySync>:
 
-  void add(EntrySync value) {
+  void add(_EntrySync value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addAll(Iterable<EntrySync> iterable) {
+  void addAll(Iterable<_EntrySync> iterable) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  // From List<EntrySync>:
+  // From List<_EntrySync>:
   void set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -27590,53 +26449,47 @@
     throw new UnsupportedError("Cannot clear immutable List.");
   }
 
-  Iterable<EntrySync> get reversed {
+  Iterable<_EntrySync> get reversed {
     return IterableMixinWorkaround.reversedList(this);
   }
 
-  void sort([int compare(EntrySync a, EntrySync b)]) {
+  void sort([int compare(_EntrySync a, _EntrySync b)]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(EntrySync element, [int start = 0]) =>
+  int indexOf(_EntrySync element, [int start = 0]) =>
       Lists.indexOf(this, element, start, this.length);
 
-  int lastIndexOf(EntrySync element, [int start]) {
+  int lastIndexOf(_EntrySync element, [int start]) {
     if (start == null) start = length - 1;
     return Lists.lastIndexOf(this, element, start);
   }
 
-  EntrySync get first {
+  _EntrySync get first {
     if (this.length > 0) return this[0];
     throw new StateError("No elements");
   }
 
-  EntrySync get last {
+  _EntrySync get last {
     if (this.length > 0) return this[this.length - 1];
     throw new StateError("No elements");
   }
 
-  EntrySync get single {
+  _EntrySync get single {
     if (length == 1) return this[0];
     if (length == 0) throw new StateError("No elements");
     throw new StateError("More than one element");
   }
 
-  EntrySync min([int compare(EntrySync a, EntrySync b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  EntrySync max([int compare(EntrySync a, EntrySync b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
-  void insert(int index, EntrySync element) {
+  void insert(int index, _EntrySync element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  EntrySync removeAt(int pos) {
+  _EntrySync removeAt(int pos) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  EntrySync removeLast() {
+  _EntrySync removeLast() {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
@@ -27644,23 +26497,15 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
+  void removeWhere(bool test(_EntrySync element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void retainAll(Iterable elements) {
+  void retainWhere(bool test(_EntrySync element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeWhere(bool test(EntrySync element)) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainWhere(bool test(EntrySync element)) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<EntrySync> from, [int startFrom]) {
+  void setRange(int start, int rangeLength, List<_EntrySync> from, [int startFrom]) {
     throw new UnsupportedError("Cannot setRange on immutable List.");
   }
 
@@ -27668,26 +26513,76 @@
     throw new UnsupportedError("Cannot removeRange on immutable List.");
   }
 
-  void insertRange(int start, int rangeLength, [EntrySync initialValue]) {
+  void insertRange(int start, int rangeLength, [_EntrySync initialValue]) {
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
-  List<EntrySync> sublist(int start, [int end]) {
+  Iterable<_EntrySync> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
+  List<_EntrySync> sublist(int start, [int end]) {
     if (end == null) end = length;
-    return Lists.getRange(this, start, end, <EntrySync>[]);
+    return Lists.getRange(this, start, end, <_EntrySync>[]);
   }
 
-  List<EntrySync> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
-  Map<int, EntrySync> asMap() =>
+  Map<int, _EntrySync> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
-  // -- end List<EntrySync> mixins.
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
+  // -- end List<_EntrySync> mixins.
 
   @DomName('EntryArraySync.item')
   @DocsEditable
-  EntrySync item(int index) native;
+  _EntrySync item(int index) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('EntrySync')
+abstract class _EntrySync native "*EntrySync" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('FileEntrySync')
+abstract class _FileEntrySync extends _EntrySync native "*FileEntrySync" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('FileReaderSync')
+abstract class _FileReaderSync native "*FileReaderSync" {
+
+  @DomName('FileReaderSync.FileReaderSync')
+  @DocsEditable
+  factory _FileReaderSync() {
+    return _FileReaderSync._create_1();
+  }
+  static _FileReaderSync _create_1() => JS('_FileReaderSync', 'new FileReaderSync()');
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('FileWriterSync')
+abstract class _FileWriterSync native "*FileWriterSync" {
 }
 // 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
@@ -27719,11 +26614,12 @@
     return new FixedSizeListIterator<Gamepad>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Gamepad)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Gamepad reduce(Gamepad combine(Gamepad value, Gamepad element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Gamepad)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Gamepad element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -27731,7 +26627,7 @@
 
   void forEach(void f(Gamepad element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Gamepad element)) =>
@@ -27833,12 +26729,6 @@
     throw new StateError("More than one element");
   }
 
-  Gamepad min([int compare(Gamepad a, Gamepad b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Gamepad max([int compare(Gamepad a, Gamepad b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Gamepad element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -27855,14 +26745,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Gamepad element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -27883,17 +26765,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Gamepad> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Gamepad> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Gamepad>[]);
   }
 
-  List<Gamepad> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Gamepad> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Gamepad> mixins.
 
   @DomName('GamepadList.item')
@@ -27907,7 +26796,7 @@
 
 @DocsEditable
 @DomName('HTMLAppletElement')
-class _HTMLAppletElement extends Element native "*HTMLAppletElement" {
+abstract class _HTMLAppletElement extends Element native "*HTMLAppletElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27916,7 +26805,7 @@
 
 @DocsEditable
 @DomName('HTMLBaseFontElement')
-class _HTMLBaseFontElement extends Element native "*HTMLBaseFontElement" {
+abstract class _HTMLBaseFontElement extends Element native "*HTMLBaseFontElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27925,7 +26814,7 @@
 
 @DocsEditable
 @DomName('HTMLDirectoryElement')
-class _HTMLDirectoryElement extends Element native "*HTMLDirectoryElement" {
+abstract class _HTMLDirectoryElement extends Element native "*HTMLDirectoryElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27934,7 +26823,7 @@
 
 @DocsEditable
 @DomName('HTMLFontElement')
-class _HTMLFontElement extends Element native "*HTMLFontElement" {
+abstract class _HTMLFontElement extends Element native "*HTMLFontElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27943,7 +26832,7 @@
 
 @DocsEditable
 @DomName('HTMLFrameElement')
-class _HTMLFrameElement extends Element native "*HTMLFrameElement" {
+abstract class _HTMLFrameElement extends Element native "*HTMLFrameElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27952,7 +26841,7 @@
 
 @DocsEditable
 @DomName('HTMLFrameSetElement')
-class _HTMLFrameSetElement extends Element native "*HTMLFrameSetElement" {
+abstract class _HTMLFrameSetElement extends Element native "*HTMLFrameSetElement" {
 }
 // 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
@@ -27961,7 +26850,7 @@
 
 @DocsEditable
 @DomName('HTMLMarqueeElement')
-class _HTMLMarqueeElement extends Element native "*HTMLMarqueeElement" {
+abstract class _HTMLMarqueeElement extends Element native "*HTMLMarqueeElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27993,11 +26882,12 @@
     return new FixedSizeListIterator<Node>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Node reduce(Node combine(Node value, Node element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Node)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Node element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -28005,7 +26895,7 @@
 
   void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Node element)) =>
@@ -28107,12 +26997,6 @@
     throw new StateError("More than one element");
   }
 
-  Node min([int compare(Node a, Node b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Node max([int compare(Node a, Node b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Node element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -28129,14 +27013,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Node element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -28157,17 +27033,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Node> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Node> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Node>[]);
   }
 
-  List<Node> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Node> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Node> mixins.
 
   @DomName('NamedNodeMap.getNamedItem')
@@ -28204,6 +27087,53 @@
 
 
 @DocsEditable
+@DomName('RGBColor')
+abstract class _RGBColor native "*RGBColor" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('Rect')
+abstract class _Rect native "*Rect" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('SharedWorker')
+abstract class _SharedWorker extends AbstractWorker native "*SharedWorker" {
+
+  @DomName('SharedWorker.SharedWorker')
+  @DocsEditable
+  factory _SharedWorker(String scriptURL, [String name]) {
+    if (?name) {
+      return _SharedWorker._create_1(scriptURL, name);
+    }
+    return _SharedWorker._create_2(scriptURL);
+  }
+  static _SharedWorker _create_1(scriptURL, name) => JS('_SharedWorker', 'new SharedWorker(#,#)', scriptURL, name);
+  static _SharedWorker _create_2(scriptURL) => JS('_SharedWorker', 'new SharedWorker(#)', scriptURL);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('SharedWorkerContext')
+abstract class _SharedWorkerContext extends _WorkerContext native "*SharedWorkerContext" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
 @DomName('SpeechInputResultList')
 class _SpeechInputResultList implements JavaScriptIndexingBehavior, List<SpeechInputResult> native "*SpeechInputResultList" {
 
@@ -28228,11 +27158,12 @@
     return new FixedSizeListIterator<SpeechInputResult>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SpeechInputResult)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  SpeechInputResult reduce(SpeechInputResult combine(SpeechInputResult value, SpeechInputResult element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, SpeechInputResult)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, SpeechInputResult element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -28240,7 +27171,7 @@
 
   void forEach(void f(SpeechInputResult element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(SpeechInputResult element)) =>
@@ -28342,12 +27273,6 @@
     throw new StateError("More than one element");
   }
 
-  SpeechInputResult min([int compare(SpeechInputResult a, SpeechInputResult b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  SpeechInputResult max([int compare(SpeechInputResult a, SpeechInputResult b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, SpeechInputResult element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -28364,14 +27289,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(SpeechInputResult element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -28392,17 +27309,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<SpeechInputResult> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<SpeechInputResult> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <SpeechInputResult>[]);
   }
 
-  List<SpeechInputResult> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, SpeechInputResult> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<SpeechInputResult> mixins.
 
   @DomName('SpeechInputResultList.item')
@@ -28439,11 +27363,12 @@
     return new FixedSizeListIterator<SpeechRecognitionResult>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SpeechRecognitionResult)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  SpeechRecognitionResult reduce(SpeechRecognitionResult combine(SpeechRecognitionResult value, SpeechRecognitionResult element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, SpeechRecognitionResult)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, SpeechRecognitionResult element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -28451,7 +27376,7 @@
 
   void forEach(void f(SpeechRecognitionResult element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(SpeechRecognitionResult element)) =>
@@ -28553,12 +27478,6 @@
     throw new StateError("More than one element");
   }
 
-  SpeechRecognitionResult min([int compare(SpeechRecognitionResult a, SpeechRecognitionResult b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  SpeechRecognitionResult max([int compare(SpeechRecognitionResult a, SpeechRecognitionResult b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, SpeechRecognitionResult element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -28575,14 +27494,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(SpeechRecognitionResult element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -28603,17 +27514,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<SpeechRecognitionResult> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<SpeechRecognitionResult> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <SpeechRecognitionResult>[]);
   }
 
-  List<SpeechRecognitionResult> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, SpeechRecognitionResult> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<SpeechRecognitionResult> mixins.
 
   @DomName('SpeechRecognitionResultList.item')
@@ -28650,11 +27568,12 @@
     return new FixedSizeListIterator<StyleSheet>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, StyleSheet)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  StyleSheet reduce(StyleSheet combine(StyleSheet value, StyleSheet element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, StyleSheet)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, StyleSheet element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -28662,7 +27581,7 @@
 
   void forEach(void f(StyleSheet element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(StyleSheet element)) =>
@@ -28764,12 +27683,6 @@
     throw new StateError("More than one element");
   }
 
-  StyleSheet min([int compare(StyleSheet a, StyleSheet b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  StyleSheet max([int compare(StyleSheet a, StyleSheet b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, StyleSheet element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -28786,14 +27699,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(StyleSheet element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -28814,17 +27719,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<StyleSheet> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<StyleSheet> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <StyleSheet>[]);
   }
 
-  List<StyleSheet> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, StyleSheet> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<StyleSheet> mixins.
 
   @DomName('StyleSheetList.item')
@@ -28836,6 +27748,56 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+@DocsEditable
+@DomName('WebKitCSSFilterValue')
+abstract class _WebKitCSSFilterValue extends _CssValueList native "*WebKitCSSFilterValue" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('WebKitCSSMatrix')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.SAFARI)
+@Experimental
+abstract class _WebKitCSSMatrix native "*WebKitCSSMatrix" {
+
+  @DomName('WebKitCSSMatrix.WebKitCSSMatrix')
+  @DocsEditable
+  factory _WebKitCSSMatrix([String cssValue]) {
+    if (?cssValue) {
+      return _WebKitCSSMatrix._create_1(cssValue);
+    }
+    return _WebKitCSSMatrix._create_2();
+  }
+  static _WebKitCSSMatrix _create_1(cssValue) => JS('_WebKitCSSMatrix', 'new WebKitCSSMatrix(#)', cssValue);
+  static _WebKitCSSMatrix _create_2() => JS('_WebKitCSSMatrix', 'new WebKitCSSMatrix()');
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('WebKitCSSMixFunctionValue')
+abstract class _WebKitCSSMixFunctionValue extends _CssValueList native "*WebKitCSSMixFunctionValue" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('WebKitCSSTransformValue')
+abstract class _WebKitCSSTransformValue extends _CssValueList native "*WebKitCSSTransformValue" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
 // This class maps WebKitTransitionEvent to TransitionEvent for older Chrome
 // browser versions.
 @DomName('WebKitTransitionEvent')
@@ -28858,6 +27820,33 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+@DocsEditable
+@DomName('WorkerContext')
+abstract class _WorkerContext extends EventTarget native "*WorkerContext" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('WorkerLocation')
+abstract class _WorkerLocation native "*WorkerLocation" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('WorkerNavigator')
+abstract class _WorkerNavigator native "*WorkerNavigator" {
+}
+// 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.
+
+
 abstract class _AttributeMap implements Map<String, String> {
   final Element _element;
 
@@ -28892,19 +27881,19 @@
     }
   }
 
-  Collection<String> get keys {
+  Iterable<String> get keys {
     // TODO: generate a lazy collection instead.
     var attributes = _element.$dom_attributes;
     var keys = new List<String>();
     for (int i = 0, len = attributes.length; i < len; i++) {
       if (_matches(attributes[i])) {
-        keys.add(attributes[i].$dom_localName);
+        keys.add(attributes[i].localName);
       }
     }
     return keys;
   }
 
-  Collection<String> get values {
+  Iterable<String> get values {
     // TODO: generate a lazy collection instead.
     var attributes = _element.$dom_attributes;
     var values = new List<String>();
@@ -29045,7 +28034,7 @@
     });
   }
 
-  Collection<String> get keys {
+  Iterable<String> get keys {
     final keys = new List<String>();
     $dom_attributes.forEach((String key, String value) {
       if (_matches(key)) {
@@ -29055,7 +28044,7 @@
     return keys;
   }
 
-  Collection<String> get values {
+  Iterable<String> get values {
     final values = new List<String>();
     $dom_attributes.forEach((String key, String value) {
       if (_matches(key)) {
@@ -29280,7 +28269,7 @@
     readClasses().forEach(f);
   }
 
-  String join([String separator]) => readClasses().join(separator);
+  String join([String separator = ""]) => readClasses().join(separator);
 
   Iterable map(f(String element)) => readClasses().map(f);
 
@@ -29296,9 +28285,8 @@
 
   int get length => readClasses().length;
 
-  dynamic reduce(dynamic initialValue,
-      dynamic combine(dynamic previousValue, String element)) {
-    return readClasses().reduce(initialValue, combine);
+  String reduce(String combine(String value, String element)) {
+    return readClasses().reduce(combine);
   }
 
   dynamic fold(dynamic initialValue,
@@ -29387,9 +28375,6 @@
     _modify((s) => s.retainWhere(test));
   }
 
-  bool isSubsetOf(Collection<String> collection) =>
-    readClasses().isSubsetOf(collection);
-
   bool containsAll(Iterable<String> collection) =>
     readClasses().containsAll(collection);
 
@@ -29408,10 +28393,6 @@
   List<String> toList({ bool growable: true }) =>
       readClasses().toList(growable: growable);
   Set<String> toSet() => readClasses().toSet();
-  String min([int compare(String a, String b)]) =>
-      readClasses().min(compare);
-  String max([int compare(String a, String b)]) =>
-      readClasses().max(compare);
   Iterable<String> take(int n) => readClasses().take(n);
   Iterable<String> takeWhile(bool test(String value)) =>
       readClasses().takeWhile(test);
@@ -29465,7 +28446,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-typedef void EventListener(Event event);
+typedef EventListener(Event event);
 // 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.
@@ -31703,6 +30684,59 @@
 
 
 /**
+ * Helper class to implement custom events which wrap DOM events.
+ */
+class _WrappedEvent implements Event {
+  final Event wrapped;
+  _WrappedEvent(this.wrapped);
+
+  bool get bubbles => wrapped.bubbles;
+
+  bool get cancelBubble => wrapped.bubbles;
+  void set cancelBubble(bool value) {
+    wrapped.cancelBubble = value;
+  }
+
+  bool get cancelable => wrapped.cancelable;
+
+  DataTransfer get clipboardData => wrapped.clipboardData;
+
+  EventTarget get currentTarget => wrapped.currentTarget;
+
+  bool get defaultPrevented => wrapped.defaultPrevented;
+
+  int get eventPhase => wrapped.eventPhase;
+
+  EventTarget get target => wrapped.target;
+
+  int get timeStamp => wrapped.timeStamp;
+
+  String get type => wrapped.type;
+
+  void $dom_initEvent(String eventTypeArg, bool canBubbleArg,
+      bool cancelableArg) {
+    throw new UnsupportedError(
+        'Cannot initialize this Event.');
+  }
+
+  void preventDefault() {
+    wrapped.preventDefault();
+  }
+
+  void stopImmediatePropagation() {
+    wrapped.stopImmediatePropagation();
+  }
+
+  void stopPropagation() {
+    wrapped.stopPropagation();
+  }
+}
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/**
  * A list which just wraps another list, for either intercepting list calls or
  * retyping the list (for example, from List<A> to List<B> where B extends A).
  */
@@ -31725,15 +30759,15 @@
 
   void forEach(void f(E element)) { _list.forEach(f); }
 
-  dynamic reduce(initialValue, combine(previousValue, E element)) =>
-      _list.reduce(initialValue, combine);
+  E reduce(E combine(E value, E element)) =>
+      _list.reduce(combine);
 
   dynamic fold(initialValue, combine(previousValue, E element)) =>
       _list.fold(initialValue, combine);
 
   bool every(bool f(E element)) => _list.every(f);
 
-  String join([String separator]) => _list.join(separator);
+  String join([String separator = ""]) => _list.join(separator);
 
   bool any(bool f(E element)) => _list.any(f);
 
@@ -31744,10 +30778,6 @@
 
   int get length => _list.length;
 
-  E min([int compare(E a, E b)]) => _list.min(compare);
-
-  E max([int compare(E a, E b)]) => _list.max(compare);
-
   bool get isEmpty => _list.isEmpty;
 
   Iterable<E> take(int n) => _list.take(n);
@@ -31782,10 +30812,6 @@
 
   void remove(Object element) { _list.remove(element); }
 
-  void removeAll(Iterable elements) { _list.removeAll(elements); }
-
-  void retainAll(Iterable elements) { _list.retainAll(elements); }
-
   void removeWhere(bool test(E element)) { _list.removeWhere(test); }
 
   void retainWhere(bool test(E element)) { _list.retainWhere(test); }
@@ -31816,7 +30842,7 @@
 
   List<E> sublist(int start, [int end]) => _list.sublist(start, end);
 
-  List<E> getRange(int start, int length) => sublist(start, start + length);
+  Iterable<E> getRange(int start, int end) => _list.getRange(start, end);
 
   void setRange(int start, int length, List<E> from, [int startFrom]) {
     _list.setRange(start, length, from, startFrom);
@@ -31828,7 +30854,14 @@
     _list.insertRange(start, length, fill);
   }
 
-  Map<int, E> asMap() => IterableMixinWorkaround.asMapList(_list);
+  Map<int, E> asMap() => _list.asMap();
+
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
 }
 
 /**
@@ -32096,7 +31129,7 @@
  * on how we can make this class work with as many international keyboards as
  * possible. Bugs welcome!
  */
-class KeyEvent implements KeyboardEvent {
+class KeyEvent extends _WrappedEvent implements KeyboardEvent {
   /** The parent KeyboardEvent that this KeyEvent is wrapping and "fixing". */
   KeyboardEvent _parent;
 
@@ -32131,7 +31164,7 @@
   bool get _realAltKey => JS('int', '#.altKey', _parent);
 
   /** Construct a KeyEvent with [parent] as the event we're emulating. */
-  KeyEvent(KeyboardEvent parent) {
+  KeyEvent(KeyboardEvent parent): super(parent) {
     _parent = parent;
     _shadowAltKey = _realAltKey;
     _shadowCharCode = _realCharCode;
@@ -32152,22 +31185,11 @@
 
   /** True if the altGraphKey is pressed during this event. */
   bool get altGraphKey => _parent.altGraphKey;
-  bool get bubbles => _parent.bubbles;
-  /** True if this event can be cancelled. */
-  bool get cancelable => _parent.cancelable;
-  bool get cancelBubble => _parent.cancelBubble;
-  void set cancelBubble(bool cancel) {
-    _parent.cancelBubble = cancel;
-  }
   /** Accessor to the clipboardData available for this event. */
   DataTransfer get clipboardData => _parent.clipboardData;
   /** True if the ctrl key is pressed during this event. */
   bool get ctrlKey => _parent.ctrlKey;
-  /** Accessor to the target this event is listening to for changes. */
-  EventTarget get currentTarget => _parent.currentTarget;
-  bool get defaultPrevented => _parent.defaultPrevented;
   int get detail => _parent.detail;
-  int get eventPhase => _parent.eventPhase;
   /**
    * Accessor to the part of the keyboard that the key was pressed from (one of
    * KeyLocation.STANDARD, KeyLocation.RIGHT, KeyLocation.LEFT,
@@ -32178,35 +31200,17 @@
   /** True if the Meta (or Mac command) key is pressed during this event. */
   bool get metaKey => _parent.metaKey;
   Point get page => _parent.page;
-  bool get returnValue => _parent.returnValue;
-  void set returnValue(bool value) {
-    _parent.returnValue = value;
-  }
   /** True if the shift key was pressed during this event. */
   bool get shiftKey => _parent.shiftKey;
-  int get timeStamp => _parent.timeStamp;
-  /**
-   * The type of key event that occurred. One of "keydown", "keyup", or
-   * "keypress".
-   */
-  String get type => _parent.type;
   Window get view => _parent.view;
-  void preventDefault() => _parent.preventDefault();
-  void stopImmediatePropagation() => _parent.stopImmediatePropagation();
-  void stopPropagation() => _parent.stopPropagation();
   void $dom_initUIEvent(String type, bool canBubble, bool cancelable,
       Window view, int detail) {
     throw new UnsupportedError("Cannot initialize a UI Event from a KeyEvent.");
   }
-  void $dom_initEvent(String eventTypeArg, bool canBubbleArg,
-      bool cancelableArg) {
-    throw new UnsupportedError("Cannot initialize an Event from a KeyEvent.");
-  }
   String get _shadowKeyIdentifier => JS('String', '#.keyIdentifier', _parent);
 
   int get $dom_charCode => charCode;
   int get $dom_keyCode => keyCode;
-  EventTarget get target => _parent.target;
   String get $dom_keyIdentifier {
     throw new UnsupportedError("keyIdentifier is unsupported.");
   }
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index c2165db..181104f 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -829,10 +829,6 @@
 class BodyElement extends _Element_Merged {
   BodyElement.internal() : super.internal();
 
-  @DomName('HTMLBodyElement.beforeunloadEvent')
-  @DocsEditable
-  static const EventStreamProvider<Event> beforeUnloadEvent = const EventStreamProvider<Event>('beforeunload');
-
   @DomName('HTMLBodyElement.blurEvent')
   @DocsEditable
   static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
@@ -885,10 +881,6 @@
   @DocsEditable
   factory BodyElement() => document.$dom_createElement("body");
 
-  @DomName('HTMLBodyElement.onbeforeunload')
-  @DocsEditable
-  Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
-
   @DomName('HTMLBodyElement.onblur')
   @DocsEditable
   Stream<Event> get onBlur => blurEvent.forTarget(this);
@@ -1137,7 +1129,7 @@
    * Example usage:
    *
    *     CanvasElement canvas = new CanvasElement();
-   *     var ctx = canvas.context2d
+   *     var ctx = canvas.context2D
    *     ..fillStyle = "rgb(200,0,0)"
    *     ..fillRect(10, 10, 55, 50);
    *     var dataUrl = canvas.toDataURL("image/jpeg", 0.95);
@@ -1162,7 +1154,11 @@
   @DocsEditable
   String toDataUrl(String type, [num quality]) native "HTMLCanvasElement_toDataURL_Callback";
 
-  CanvasRenderingContext2D get context2d => getContext('2d');
+  /** An API for drawing on this canvas. */
+  CanvasRenderingContext2D get context2D => getContext('2d');
+
+  @deprecated
+  CanvasRenderingContext2D get context2d => this.context2D;
 
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
@@ -1202,7 +1198,7 @@
  * Example usage:
  *
  *     var canvas = new CanvasElement(width: 600, height: 600);
- *     var ctx = canvas.context2d;
+ *     var ctx = canvas.context2D;
  *     ctx.clearRect(0, 0, 600, 600);
  *     ctx.save();
  *     // Create radial gradient.
@@ -1256,7 +1252,7 @@
  * Example usage:
  *
  *     var canvas = new CanvasElement(width: 600, height: 600);
- *     var ctx = canvas.context2d;
+ *     var ctx = canvas.context2D;
  *     var img = new ImageElement();
  *     // Image src needs to be loaded before pattern is applied.
  *     img.onLoad.listen((event) {
@@ -1871,7 +1867,7 @@
    * will allow, the image will be clipped to fit the available space.
    *
    *     CanvasElement canvas = new CanvasElement(width: 600, height: 600);
-   *     CanvasRenderingContext2D ctx = canvas.context2d;
+   *     CanvasRenderingContext2D ctx = canvas.context2D;
    *     ImageElement img = document.query('img');
    *     img.width = 100;
    *     img.height = 100;
@@ -1929,7 +1925,7 @@
    * available space.
    *
    *     CanvasElement canvas = new CanvasElement(width: 600, height: 600);
-   *     CanvasRenderingContext2D ctx = canvas.context2d;
+   *     CanvasRenderingContext2D ctx = canvas.context2D;
    *     ImageElement img = document.query('img');
    *
    *     ctx.drawImage(img, 100, 100);
@@ -1965,7 +1961,7 @@
    * will allow, the image will be clipped to fit the available space.
    *
    *     CanvasElement canvas = new CanvasElement(width: 600, height: 600);
-   *     CanvasRenderingContext2D ctx = canvas.context2d;
+   *     CanvasRenderingContext2D ctx = canvas.context2D;
    *     ImageElement img = document.query('img');
    *     img.width = 100;
    *     img.height = 100;
@@ -2336,31 +2332,6 @@
 
 
 @DocsEditable
-@DomName('Counter')
-class Counter extends NativeFieldWrapperClass1 {
-  Counter.internal();
-
-  @DomName('Counter.identifier')
-  @DocsEditable
-  String get identifier native "Counter_identifier_Getter";
-
-  @DomName('Counter.listStyle')
-  @DocsEditable
-  String get listStyle native "Counter_listStyle_Getter";
-
-  @DomName('Counter.separator')
-  @DocsEditable
-  String get separator native "Counter_separator_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
 @DomName('Crypto')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -2536,250 +2507,6 @@
 
 
 @DocsEditable
-@DomName('WebKitCSSMatrix')
-@SupportedBrowser(SupportedBrowser.CHROME)
-@SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental
-class CssMatrix extends NativeFieldWrapperClass1 {
-  CssMatrix.internal();
-
-  @DomName('WebKitCSSMatrix.WebKitCSSMatrix')
-  @DocsEditable
-  factory CssMatrix([String cssValue]) {
-    return CssMatrix._create_1(cssValue);
-  }
-
-  @DocsEditable
-  static CssMatrix _create_1(cssValue) native "WebKitCSSMatrix__create_1constructorCallback";
-
-  /// Checks if this type is supported on the current platform.
-  static bool get supported => true;
-
-  @DomName('WebKitCSSMatrix.a')
-  @DocsEditable
-  num get a native "WebKitCSSMatrix_a_Getter";
-
-  @DomName('WebKitCSSMatrix.a')
-  @DocsEditable
-  void set a(num value) native "WebKitCSSMatrix_a_Setter";
-
-  @DomName('WebKitCSSMatrix.b')
-  @DocsEditable
-  num get b native "WebKitCSSMatrix_b_Getter";
-
-  @DomName('WebKitCSSMatrix.b')
-  @DocsEditable
-  void set b(num value) native "WebKitCSSMatrix_b_Setter";
-
-  @DomName('WebKitCSSMatrix.c')
-  @DocsEditable
-  num get c native "WebKitCSSMatrix_c_Getter";
-
-  @DomName('WebKitCSSMatrix.c')
-  @DocsEditable
-  void set c(num value) native "WebKitCSSMatrix_c_Setter";
-
-  @DomName('WebKitCSSMatrix.d')
-  @DocsEditable
-  num get d native "WebKitCSSMatrix_d_Getter";
-
-  @DomName('WebKitCSSMatrix.d')
-  @DocsEditable
-  void set d(num value) native "WebKitCSSMatrix_d_Setter";
-
-  @DomName('WebKitCSSMatrix.e')
-  @DocsEditable
-  num get e native "WebKitCSSMatrix_e_Getter";
-
-  @DomName('WebKitCSSMatrix.e')
-  @DocsEditable
-  void set e(num value) native "WebKitCSSMatrix_e_Setter";
-
-  @DomName('WebKitCSSMatrix.f')
-  @DocsEditable
-  num get f native "WebKitCSSMatrix_f_Getter";
-
-  @DomName('WebKitCSSMatrix.f')
-  @DocsEditable
-  void set f(num value) native "WebKitCSSMatrix_f_Setter";
-
-  @DomName('WebKitCSSMatrix.m11')
-  @DocsEditable
-  num get m11 native "WebKitCSSMatrix_m11_Getter";
-
-  @DomName('WebKitCSSMatrix.m11')
-  @DocsEditable
-  void set m11(num value) native "WebKitCSSMatrix_m11_Setter";
-
-  @DomName('WebKitCSSMatrix.m12')
-  @DocsEditable
-  num get m12 native "WebKitCSSMatrix_m12_Getter";
-
-  @DomName('WebKitCSSMatrix.m12')
-  @DocsEditable
-  void set m12(num value) native "WebKitCSSMatrix_m12_Setter";
-
-  @DomName('WebKitCSSMatrix.m13')
-  @DocsEditable
-  num get m13 native "WebKitCSSMatrix_m13_Getter";
-
-  @DomName('WebKitCSSMatrix.m13')
-  @DocsEditable
-  void set m13(num value) native "WebKitCSSMatrix_m13_Setter";
-
-  @DomName('WebKitCSSMatrix.m14')
-  @DocsEditable
-  num get m14 native "WebKitCSSMatrix_m14_Getter";
-
-  @DomName('WebKitCSSMatrix.m14')
-  @DocsEditable
-  void set m14(num value) native "WebKitCSSMatrix_m14_Setter";
-
-  @DomName('WebKitCSSMatrix.m21')
-  @DocsEditable
-  num get m21 native "WebKitCSSMatrix_m21_Getter";
-
-  @DomName('WebKitCSSMatrix.m21')
-  @DocsEditable
-  void set m21(num value) native "WebKitCSSMatrix_m21_Setter";
-
-  @DomName('WebKitCSSMatrix.m22')
-  @DocsEditable
-  num get m22 native "WebKitCSSMatrix_m22_Getter";
-
-  @DomName('WebKitCSSMatrix.m22')
-  @DocsEditable
-  void set m22(num value) native "WebKitCSSMatrix_m22_Setter";
-
-  @DomName('WebKitCSSMatrix.m23')
-  @DocsEditable
-  num get m23 native "WebKitCSSMatrix_m23_Getter";
-
-  @DomName('WebKitCSSMatrix.m23')
-  @DocsEditable
-  void set m23(num value) native "WebKitCSSMatrix_m23_Setter";
-
-  @DomName('WebKitCSSMatrix.m24')
-  @DocsEditable
-  num get m24 native "WebKitCSSMatrix_m24_Getter";
-
-  @DomName('WebKitCSSMatrix.m24')
-  @DocsEditable
-  void set m24(num value) native "WebKitCSSMatrix_m24_Setter";
-
-  @DomName('WebKitCSSMatrix.m31')
-  @DocsEditable
-  num get m31 native "WebKitCSSMatrix_m31_Getter";
-
-  @DomName('WebKitCSSMatrix.m31')
-  @DocsEditable
-  void set m31(num value) native "WebKitCSSMatrix_m31_Setter";
-
-  @DomName('WebKitCSSMatrix.m32')
-  @DocsEditable
-  num get m32 native "WebKitCSSMatrix_m32_Getter";
-
-  @DomName('WebKitCSSMatrix.m32')
-  @DocsEditable
-  void set m32(num value) native "WebKitCSSMatrix_m32_Setter";
-
-  @DomName('WebKitCSSMatrix.m33')
-  @DocsEditable
-  num get m33 native "WebKitCSSMatrix_m33_Getter";
-
-  @DomName('WebKitCSSMatrix.m33')
-  @DocsEditable
-  void set m33(num value) native "WebKitCSSMatrix_m33_Setter";
-
-  @DomName('WebKitCSSMatrix.m34')
-  @DocsEditable
-  num get m34 native "WebKitCSSMatrix_m34_Getter";
-
-  @DomName('WebKitCSSMatrix.m34')
-  @DocsEditable
-  void set m34(num value) native "WebKitCSSMatrix_m34_Setter";
-
-  @DomName('WebKitCSSMatrix.m41')
-  @DocsEditable
-  num get m41 native "WebKitCSSMatrix_m41_Getter";
-
-  @DomName('WebKitCSSMatrix.m41')
-  @DocsEditable
-  void set m41(num value) native "WebKitCSSMatrix_m41_Setter";
-
-  @DomName('WebKitCSSMatrix.m42')
-  @DocsEditable
-  num get m42 native "WebKitCSSMatrix_m42_Getter";
-
-  @DomName('WebKitCSSMatrix.m42')
-  @DocsEditable
-  void set m42(num value) native "WebKitCSSMatrix_m42_Setter";
-
-  @DomName('WebKitCSSMatrix.m43')
-  @DocsEditable
-  num get m43 native "WebKitCSSMatrix_m43_Getter";
-
-  @DomName('WebKitCSSMatrix.m43')
-  @DocsEditable
-  void set m43(num value) native "WebKitCSSMatrix_m43_Setter";
-
-  @DomName('WebKitCSSMatrix.m44')
-  @DocsEditable
-  num get m44 native "WebKitCSSMatrix_m44_Getter";
-
-  @DomName('WebKitCSSMatrix.m44')
-  @DocsEditable
-  void set m44(num value) native "WebKitCSSMatrix_m44_Setter";
-
-  @DomName('WebKitCSSMatrix.inverse')
-  @DocsEditable
-  CssMatrix inverse() native "WebKitCSSMatrix_inverse_Callback";
-
-  @DomName('WebKitCSSMatrix.multiply')
-  @DocsEditable
-  CssMatrix multiply(CssMatrix secondMatrix) native "WebKitCSSMatrix_multiply_Callback";
-
-  @DomName('WebKitCSSMatrix.rotate')
-  @DocsEditable
-  CssMatrix rotate(num rotX, num rotY, num rotZ) native "WebKitCSSMatrix_rotate_Callback";
-
-  @DomName('WebKitCSSMatrix.rotateAxisAngle')
-  @DocsEditable
-  CssMatrix rotateAxisAngle(num x, num y, num z, num angle) native "WebKitCSSMatrix_rotateAxisAngle_Callback";
-
-  @DomName('WebKitCSSMatrix.scale')
-  @DocsEditable
-  CssMatrix scale(num scaleX, num scaleY, num scaleZ) native "WebKitCSSMatrix_scale_Callback";
-
-  @DomName('WebKitCSSMatrix.setMatrixValue')
-  @DocsEditable
-  void setMatrixValue(String string) native "WebKitCSSMatrix_setMatrixValue_Callback";
-
-  @DomName('WebKitCSSMatrix.skewX')
-  @DocsEditable
-  CssMatrix skewX(num angle) native "WebKitCSSMatrix_skewX_Callback";
-
-  @DomName('WebKitCSSMatrix.skewY')
-  @DocsEditable
-  CssMatrix skewY(num angle) native "WebKitCSSMatrix_skewY_Callback";
-
-  @DomName('WebKitCSSMatrix.toString')
-  @DocsEditable
-  String toString() native "WebKitCSSMatrix_toString_Callback";
-
-  @DomName('WebKitCSSMatrix.translate')
-  @DocsEditable
-  CssMatrix translate(num x, num y, num z) native "WebKitCSSMatrix_translate_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
 @DomName('CSSMediaRule')
 class CssMediaRule extends CssRule {
   CssMediaRule.internal() : super.internal();
@@ -2834,165 +2561,6 @@
 
 
 @DocsEditable
-@DomName('CSSPrimitiveValue')
-class CssPrimitiveValue extends CssValue {
-  CssPrimitiveValue.internal() : super.internal();
-
-  static const int CSS_ATTR = 22;
-
-  static const int CSS_CM = 6;
-
-  static const int CSS_COUNTER = 23;
-
-  static const int CSS_DEG = 11;
-
-  static const int CSS_DIMENSION = 18;
-
-  static const int CSS_EMS = 3;
-
-  static const int CSS_EXS = 4;
-
-  static const int CSS_GRAD = 13;
-
-  static const int CSS_HZ = 16;
-
-  static const int CSS_IDENT = 21;
-
-  static const int CSS_IN = 8;
-
-  static const int CSS_KHZ = 17;
-
-  static const int CSS_MM = 7;
-
-  static const int CSS_MS = 14;
-
-  static const int CSS_NUMBER = 1;
-
-  static const int CSS_PC = 10;
-
-  static const int CSS_PERCENTAGE = 2;
-
-  static const int CSS_PT = 9;
-
-  static const int CSS_PX = 5;
-
-  static const int CSS_RAD = 12;
-
-  static const int CSS_RECT = 24;
-
-  static const int CSS_RGBCOLOR = 25;
-
-  static const int CSS_S = 15;
-
-  static const int CSS_STRING = 19;
-
-  static const int CSS_UNKNOWN = 0;
-
-  static const int CSS_URI = 20;
-
-  static const int CSS_VH = 27;
-
-  static const int CSS_VMAX = 29;
-
-  static const int CSS_VMIN = 28;
-
-  static const int CSS_VW = 26;
-
-  @DomName('CSSPrimitiveValue.primitiveType')
-  @DocsEditable
-  int get primitiveType native "CSSPrimitiveValue_primitiveType_Getter";
-
-  @DomName('CSSPrimitiveValue.getCounterValue')
-  @DocsEditable
-  Counter getCounterValue() native "CSSPrimitiveValue_getCounterValue_Callback";
-
-  @DomName('CSSPrimitiveValue.getFloatValue')
-  @DocsEditable
-  num getFloatValue(int unitType) native "CSSPrimitiveValue_getFloatValue_Callback";
-
-  @DomName('CSSPrimitiveValue.getRGBColorValue')
-  @DocsEditable
-  CssRgbColor getRgbColorValue() native "CSSPrimitiveValue_getRGBColorValue_Callback";
-
-  @DomName('CSSPrimitiveValue.getRectValue')
-  @DocsEditable
-  CssRect getRectValue() native "CSSPrimitiveValue_getRectValue_Callback";
-
-  @DomName('CSSPrimitiveValue.getStringValue')
-  @DocsEditable
-  String getStringValue() native "CSSPrimitiveValue_getStringValue_Callback";
-
-  @DomName('CSSPrimitiveValue.setFloatValue')
-  @DocsEditable
-  void setFloatValue(int unitType, num floatValue) native "CSSPrimitiveValue_setFloatValue_Callback";
-
-  @DomName('CSSPrimitiveValue.setStringValue')
-  @DocsEditable
-  void setStringValue(int stringType, String stringValue) native "CSSPrimitiveValue_setStringValue_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('Rect')
-class CssRect extends NativeFieldWrapperClass1 {
-  CssRect.internal();
-
-  @DomName('Rect.bottom')
-  @DocsEditable
-  CssPrimitiveValue get bottom native "Rect_bottom_Getter";
-
-  @DomName('Rect.left')
-  @DocsEditable
-  CssPrimitiveValue get left native "Rect_left_Getter";
-
-  @DomName('Rect.right')
-  @DocsEditable
-  CssPrimitiveValue get right native "Rect_right_Getter";
-
-  @DomName('Rect.top')
-  @DocsEditable
-  CssPrimitiveValue get top native "Rect_top_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('RGBColor')
-class CssRgbColor extends NativeFieldWrapperClass1 {
-  CssRgbColor.internal();
-
-  @DomName('RGBColor.blue')
-  @DocsEditable
-  CssPrimitiveValue get blue native "RGBColor_blue_Getter";
-
-  @DomName('RGBColor.green')
-  @DocsEditable
-  CssPrimitiveValue get green native "RGBColor_green_Getter";
-
-  @DomName('RGBColor.red')
-  @DocsEditable
-  CssPrimitiveValue get red native "RGBColor_red_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
 @DomName('CSSRule')
 class CssRule extends NativeFieldWrapperClass1 {
   CssRule.internal();
@@ -3073,10 +2641,6 @@
   @DocsEditable
   String _getPropertyValue(String propertyName) native "CSSStyleDeclaration__getPropertyValue_Callback";
 
-  @DomName('CSSStyleDeclaration.getPropertyCSSValue')
-  @DocsEditable
-  CssValue getPropertyCssValue(String propertyName) native "CSSStyleDeclaration_getPropertyCSSValue_Callback";
-
   @DomName('CSSStyleDeclaration.getPropertyPriority')
   @DocsEditable
   String getPropertyPriority(String propertyName) native "CSSStyleDeclaration_getPropertyPriority_Callback";
@@ -6356,65 +5920,6 @@
 
 
 @DocsEditable
-@DomName('WebKitCSSTransformValue')
-class CssTransformValue extends _CssValueList {
-  CssTransformValue.internal() : super.internal();
-
-  static const int CSS_MATRIX = 11;
-
-  static const int CSS_MATRIX3D = 21;
-
-  static const int CSS_PERSPECTIVE = 20;
-
-  static const int CSS_ROTATE = 4;
-
-  static const int CSS_ROTATE3D = 17;
-
-  static const int CSS_ROTATEX = 14;
-
-  static const int CSS_ROTATEY = 15;
-
-  static const int CSS_ROTATEZ = 16;
-
-  static const int CSS_SCALE = 5;
-
-  static const int CSS_SCALE3D = 19;
-
-  static const int CSS_SCALEX = 6;
-
-  static const int CSS_SCALEY = 7;
-
-  static const int CSS_SCALEZ = 18;
-
-  static const int CSS_SKEW = 8;
-
-  static const int CSS_SKEWX = 9;
-
-  static const int CSS_SKEWY = 10;
-
-  static const int CSS_TRANSLATE = 1;
-
-  static const int CSS_TRANSLATE3D = 13;
-
-  static const int CSS_TRANSLATEX = 2;
-
-  static const int CSS_TRANSLATEY = 3;
-
-  static const int CSS_TRANSLATEZ = 12;
-
-  @DomName('WebKitCSSTransformValue.operationType')
-  @DocsEditable
-  int get operationType native "WebKitCSSTransformValue_operationType_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
 @DomName('CSSUnknownRule')
 class CssUnknownRule extends CssRule {
   CssUnknownRule.internal() : super.internal();
@@ -6427,39 +5932,6 @@
 // WARNING: Do not edit - generated code.
 
 
-@DocsEditable
-@DomName('CSSValue')
-class CssValue extends NativeFieldWrapperClass1 {
-  CssValue.internal();
-
-  static const int CSS_CUSTOM = 3;
-
-  static const int CSS_INHERIT = 0;
-
-  static const int CSS_PRIMITIVE_VALUE = 1;
-
-  static const int CSS_VALUE_LIST = 2;
-
-  @DomName('CSSValue.cssText')
-  @DocsEditable
-  String get cssText native "CSSValue_cssText_Getter";
-
-  @DomName('CSSValue.cssText')
-  @DocsEditable
-  void set cssText(String value) native "CSSValue_cssText_Setter";
-
-  @DomName('CSSValue.cssValueType')
-  @DocsEditable
-  int get cssValueType native "CSSValue_cssValueType_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
 @DomName('CustomEvent')
 class CustomEvent extends Event {
   factory CustomEvent(String type,
@@ -6570,6 +6042,22 @@
   @DocsEditable
   void clearData([String type]) native "Clipboard_clearData_Callback";
 
+  /**
+   * Gets the data for the specified type.
+   *
+   * The data is only available from within a drop operation (such as an
+   * [Element.onDrop] event) and will return `null` before the event is
+   * triggered.
+   *
+   * Data transfer is prohibited across domains. If a drag originates
+   * from content from another domain or protocol (HTTP vs HTTPS) then the
+   * data cannot be accessed.
+   *
+   * The [type] can have values such as:
+   *
+   * * `'Text'`
+   * * `'URL'`
+   */
   @DomName('Clipboard.getData')
   @DocsEditable
   String getData(String type) native "Clipboard_getData_Callback";
@@ -6904,31 +6392,6 @@
 
 
 @DocsEditable
-@DomName('DedicatedWorkerContext')
-class DedicatedWorkerContext extends WorkerContext {
-  DedicatedWorkerContext.internal() : super.internal();
-
-  @DomName('DedicatedWorkerContext.messageEvent')
-  @DocsEditable
-  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
-
-  @DomName('DedicatedWorkerContext.postMessage')
-  @DocsEditable
-  void postMessage(Object message, [List messagePorts]) native "DedicatedWorkerContext_postMessage_Callback";
-
-  @DomName('DedicatedWorkerContext.onmessage')
-  @DocsEditable
-  Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
 @DomName('HTMLDetailsElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -7105,35 +6568,6 @@
 
 
 @DocsEditable
-@DomName('DirectoryEntrySync')
-class DirectoryEntrySync extends EntrySync {
-  DirectoryEntrySync.internal() : super.internal();
-
-  @DomName('DirectoryEntrySync.createReader')
-  @DocsEditable
-  DirectoryReaderSync createReader() native "DirectoryEntrySync_createReader_Callback";
-
-  @DomName('DirectoryEntrySync.getDirectory')
-  @DocsEditable
-  DirectoryEntrySync getDirectory(String path, Map flags) native "DirectoryEntrySync_getDirectory_Callback";
-
-  @DomName('DirectoryEntrySync.getFile')
-  @DocsEditable
-  FileEntrySync getFile(String path, Map flags) native "DirectoryEntrySync_getFile_Callback";
-
-  @DomName('DirectoryEntrySync.removeRecursively')
-  @DocsEditable
-  void removeRecursively() native "DirectoryEntrySync_removeRecursively_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
 @DomName('DirectoryReader')
 class DirectoryReader extends NativeFieldWrapperClass1 {
   DirectoryReader.internal();
@@ -7159,23 +6593,6 @@
 
 
 @DocsEditable
-@DomName('DirectoryReaderSync')
-class DirectoryReaderSync extends NativeFieldWrapperClass1 {
-  DirectoryReaderSync.internal();
-
-  @DomName('DirectoryReaderSync.readEntries')
-  @DocsEditable
-  List<EntrySync> readEntries() native "DirectoryReaderSync_readEntries_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
 /**
  * Represents an HTML <div> element.
  *
@@ -7313,6 +6730,10 @@
   @DocsEditable
   String get $dom_referrer native "Document_referrer_Getter";
 
+  @DomName('Document.securityPolicy')
+  @DocsEditable
+  DomSecurityPolicy get securityPolicy native "Document_securityPolicy_Getter";
+
   @DomName('Document.selectedStylesheetSet')
   @DocsEditable
   String get $dom_selectedStylesheetSet native "Document_selectedStylesheetSet_Getter";
@@ -7992,11 +7413,12 @@
     return new FixedSizeListIterator<DomMimeType>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, DomMimeType)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  DomMimeType reduce(DomMimeType combine(DomMimeType value, DomMimeType element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, DomMimeType)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, DomMimeType element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -8004,7 +7426,7 @@
 
   void forEach(void f(DomMimeType element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(DomMimeType element)) =>
@@ -8106,12 +7528,6 @@
     throw new StateError("More than one element");
   }
 
-  DomMimeType min([int compare(DomMimeType a, DomMimeType b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  DomMimeType max([int compare(DomMimeType a, DomMimeType b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, DomMimeType element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -8128,14 +7544,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(DomMimeType element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -8156,17 +7564,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<DomMimeType> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<DomMimeType> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <DomMimeType>[]);
   }
 
-  List<DomMimeType> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, DomMimeType> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<DomMimeType> mixins.
 
   @DomName('DOMMimeTypeArray.item')
@@ -8274,11 +7689,12 @@
     return new FixedSizeListIterator<DomPlugin>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, DomPlugin)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  DomPlugin reduce(DomPlugin combine(DomPlugin value, DomPlugin element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, DomPlugin)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, DomPlugin element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -8286,7 +7702,7 @@
 
   void forEach(void f(DomPlugin element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(DomPlugin element)) =>
@@ -8388,12 +7804,6 @@
     throw new StateError("More than one element");
   }
 
-  DomPlugin min([int compare(DomPlugin a, DomPlugin b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  DomPlugin max([int compare(DomPlugin a, DomPlugin b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, DomPlugin element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -8410,14 +7820,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(DomPlugin element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -8438,17 +7840,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<DomPlugin> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<DomPlugin> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <DomPlugin>[]);
   }
 
-  List<DomPlugin> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, DomPlugin> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<DomPlugin> mixins.
 
   @DomName('DOMPluginArray.item')
@@ -8472,35 +7881,69 @@
 
 
 @DocsEditable
-@DomName('WebKitPoint')
-@SupportedBrowser(SupportedBrowser.CHROME)
-@SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental
-class DomPoint extends NativeFieldWrapperClass1 {
-  DomPoint.internal();
-  factory DomPoint(num x, num y) => _create(x, y);
+@DomName('SecurityPolicy')
+class DomSecurityPolicy extends NativeFieldWrapperClass1 {
+  DomSecurityPolicy.internal();
 
+  @DomName('DOMSecurityPolicy.allowsEval')
   @DocsEditable
-  static DomPoint _create(x, y) native "WebKitPoint_constructorCallback";
+  bool get allowsEval native "DOMSecurityPolicy_allowsEval_Getter";
 
-  /// Checks if this type is supported on the current platform.
-  static bool get supported => true;
-
-  @DomName('WebKitPoint.x')
+  @DomName('DOMSecurityPolicy.allowsInlineScript')
   @DocsEditable
-  num get x native "WebKitPoint_x_Getter";
+  bool get allowsInlineScript native "DOMSecurityPolicy_allowsInlineScript_Getter";
 
-  @DomName('WebKitPoint.x')
+  @DomName('DOMSecurityPolicy.allowsInlineStyle')
   @DocsEditable
-  void set x(num value) native "WebKitPoint_x_Setter";
+  bool get allowsInlineStyle native "DOMSecurityPolicy_allowsInlineStyle_Getter";
 
-  @DomName('WebKitPoint.y')
+  @DomName('DOMSecurityPolicy.isActive')
   @DocsEditable
-  num get y native "WebKitPoint_y_Getter";
+  bool get isActive native "DOMSecurityPolicy_isActive_Getter";
 
-  @DomName('WebKitPoint.y')
+  @DomName('DOMSecurityPolicy.reportURIs')
   @DocsEditable
-  void set y(num value) native "WebKitPoint_y_Setter";
+  List<String> get reportURIs native "DOMSecurityPolicy_reportURIs_Getter";
+
+  @DomName('DOMSecurityPolicy.allowsConnectionTo')
+  @DocsEditable
+  bool allowsConnectionTo(String url) native "DOMSecurityPolicy_allowsConnectionTo_Callback";
+
+  @DomName('DOMSecurityPolicy.allowsFontFrom')
+  @DocsEditable
+  bool allowsFontFrom(String url) native "DOMSecurityPolicy_allowsFontFrom_Callback";
+
+  @DomName('DOMSecurityPolicy.allowsFormAction')
+  @DocsEditable
+  bool allowsFormAction(String url) native "DOMSecurityPolicy_allowsFormAction_Callback";
+
+  @DomName('DOMSecurityPolicy.allowsFrameFrom')
+  @DocsEditable
+  bool allowsFrameFrom(String url) native "DOMSecurityPolicy_allowsFrameFrom_Callback";
+
+  @DomName('DOMSecurityPolicy.allowsImageFrom')
+  @DocsEditable
+  bool allowsImageFrom(String url) native "DOMSecurityPolicy_allowsImageFrom_Callback";
+
+  @DomName('DOMSecurityPolicy.allowsMediaFrom')
+  @DocsEditable
+  bool allowsMediaFrom(String url) native "DOMSecurityPolicy_allowsMediaFrom_Callback";
+
+  @DomName('DOMSecurityPolicy.allowsObjectFrom')
+  @DocsEditable
+  bool allowsObjectFrom(String url) native "DOMSecurityPolicy_allowsObjectFrom_Callback";
+
+  @DomName('DOMSecurityPolicy.allowsPluginType')
+  @DocsEditable
+  bool allowsPluginType(String type) native "DOMSecurityPolicy_allowsPluginType_Callback";
+
+  @DomName('DOMSecurityPolicy.allowsScriptFrom')
+  @DocsEditable
+  bool allowsScriptFrom(String url) native "DOMSecurityPolicy_allowsScriptFrom_Callback";
+
+  @DomName('DOMSecurityPolicy.allowsStyleFrom')
+  @DocsEditable
+  bool allowsStyleFrom(String url) native "DOMSecurityPolicy_allowsStyleFrom_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8674,11 +8117,12 @@
     return new FixedSizeListIterator<String>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, String)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  String reduce(String combine(String value, String element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, String)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, String element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -8686,7 +8130,7 @@
 
   void forEach(void f(String element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(String element)) =>
@@ -8788,12 +8232,6 @@
     throw new StateError("More than one element");
   }
 
-  String min([int compare(String a, String b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  String max([int compare(String a, String b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, String element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -8810,14 +8248,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(String element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -8838,17 +8268,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<String> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<String> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <String>[]);
   }
 
-  List<String> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, String> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<String> mixins.
 
   @DomName('DOMStringList.contains')
@@ -8924,7 +8361,7 @@
 
 // TODO(jacobr): use _Lists.dart to remove some of the duplicated
 // functionality.
-class _ChildrenElementList implements List {
+class _ChildrenElementList extends ListBase<Element> {
   // Raw Element.
   final Element _element;
   final HtmlCollection _childElements;
@@ -8981,20 +8418,20 @@
     return false;
   }
 
-  String join([String separator]) {
-    return IterableMixinWorkaround.joinList(this, separator);
+  String join([String separator = ""]) {
+    return _childElements.join(separator);
   }
 
   Iterable map(f(Element element)) {
-    return IterableMixinWorkaround.mapList(this, f);
+    return _childElements.map(f);
   }
 
   Iterable<Element> where(bool f(Element element)) {
-    return IterableMixinWorkaround.where(this, f);
+    return _childElements.where(f);
   }
 
   Iterable expand(Iterable f(Element element)) {
-    return IterableMixinWorkaround.expand(this, f);
+    return _childElements.expand(f);
   }
 
   bool get isEmpty {
@@ -9002,31 +8439,31 @@
   }
 
   Iterable<Element> take(int n) {
-    return IterableMixinWorkaround.takeList(this, n);
+    return _childElements.take(n);
   }
 
   Iterable<Element> takeWhile(bool test(Element value)) {
-    return IterableMixinWorkaround.takeWhile(this, test);
+    return _childElements.takeWhile(test);
   }
 
   Iterable<Element> skip(int n) {
-    return IterableMixinWorkaround.skipList(this, n);
+    return _childElements.skip(n);
   }
 
   Iterable<Element> skipWhile(bool test(Element value)) {
-    return IterableMixinWorkaround.skipWhile(this, test);
+    return _childElements.skipWhile(test);
   }
 
   Element firstWhere(bool test(Element value), {Element orElse()}) {
-    return IterableMixinWorkaround.firstWhere(this, test, orElse);
+    return _childElements.firstWhere(test, orElse: orElse);
   }
 
   Element lastWhere(bool test(Element value), {Element orElse()}) {
-    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
+    return _childElements.lastWhere(test, orElse: orElse);
   }
 
   Element singleWhere(bool test(Element value)) {
-    return IterableMixinWorkaround.singleWhere(this, test);
+    return _childElements.singleWhere(test);
   }
 
   Element elementAt(int index) {
@@ -9068,24 +8505,24 @@
   }
 
   Iterable<Element> get reversed {
-    return IterableMixinWorkaround.reversedList(this);
+    return _childElements.reversed;
   }
 
   void sort([int compare(Element a, Element b)]) {
     throw new UnsupportedError('TODO(jacobr): should we impl?');
   }
 
-  dynamic reduce(dynamic initialValue,
-      dynamic combine(dynamic previousValue, Element element)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Element reduce(Element combine(Element value, Element element)) {
+    return _childElements.reduce(combine);
   }
 
   dynamic fold(dynamic initialValue,
       dynamic combine(dynamic previousValue, Element element)) {
-    return IterableMixinWorkaround.fold(this, initialValue, combine);
+    return _childElements.fold(initialValue, combine);
   }
 
-  void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
+  void setRange(int start, int rangeLength, List from,
+                [int startFrom = 0]) {
     throw new UnimplementedError();
   }
 
@@ -9098,20 +8535,12 @@
     }
   }
 
-  void removeAll(Iterable elements) {
-    IterableMixinWorkaround.removeAll(this, elements);
-  }
-
-  void retainAll(Iterable elements) {
-    IterableMixinWorkaround.retainAll(this, elements);
-  }
-
   void removeWhere(bool test(Element element)) {
-    IterableMixinWorkaround.removeWhere(this, test);
+    _childElements.removeWhere(test);
   }
 
   void retainWhere(bool test(Element element)) {
-    IterableMixinWorkaround.retainWhere(this, test);
+    _childElements.retainWhere(test);
   }
 
   void removeRange(int start, int rangeLength) {
@@ -9122,14 +8551,15 @@
     throw new UnimplementedError();
   }
 
+  Iterable getRange(int start, int end)  {
+    throw new UnimplementedError();
+  }
+
   List sublist(int start, [int end]) {
     if (end == null) end = length;
     return new _FrozenElementList._wrap(Lists.getRange(this, start, end, []));
   }
 
-  List getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   int indexOf(Element element, [int start = 0]) {
     return Lists.indexOf(this, element, start, this.length);
   }
@@ -9189,16 +8619,15 @@
     return first;
   }
 
-  Element min([int compare(Element a, Element b)]) {
-    return IterableMixinWorkaround.min(this, compare);
-  }
-
-  Element max([int compare(Element a, Element b)]) {
-    return IterableMixinWorkaround.max(this, compare);
-  }
-
   Map<int, Element> asMap() {
-    return IterableMixinWorkaround.asMapList(this);
+    return _childElements.asMap();
+  }
+
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
   }
 }
 
@@ -9206,96 +8635,11 @@
 // a better option given that we cannot quite force NodeList to be an
 // ElementList as there are valid cases where a NodeList JavaScript object
 // contains Node objects that are not Elements.
-class _FrozenElementList implements List {
+class _FrozenElementList extends ListBase {
   final List<Node> _nodeList;
 
   _FrozenElementList._wrap(this._nodeList);
 
-  bool contains(Element element) {
-    for (Element el in this) {
-      if (el == element) return true;
-    }
-    return false;
-  }
-
-  void forEach(void f(Element element)) {
-    for (Element el in this) {
-      f(el);
-    }
-  }
-
-  String join([String separator]) {
-    return IterableMixinWorkaround.joinList(this, separator);
-  }
-
-  Iterable map(f(Element element)) {
-    return IterableMixinWorkaround.mapList(this, f);
-  }
-
-  Iterable<Element> where(bool f(Element element)) {
-    return IterableMixinWorkaround.where(this, f);
-  }
-
-  Iterable expand(Iterable f(Element element)) {
-    return IterableMixinWorkaround.expand(this, f);
-  }
-
-  bool every(bool f(Element element)) {
-    for(Element element in this) {
-      if (!f(element)) {
-        return false;
-      }
-    };
-    return true;
-  }
-
-  bool any(bool f(Element element)) {
-    for(Element element in this) {
-      if (f(element)) {
-        return true;
-      }
-    };
-    return false;
-  }
-
-  List<Element> toList({ bool growable: true }) =>
-      new List<Element>.from(this, growable: growable);
-  Set<Element> toSet() => new Set<Element>.from(this);
-
-  Iterable<Element> take(int n) {
-    return IterableMixinWorkaround.takeList(this, n);
-  }
-
-  Iterable<Element> takeWhile(bool test(Element value)) {
-    return IterableMixinWorkaround.takeWhile(this, test);
-  }
-
-  Iterable<Element> skip(int n) {
-    return IterableMixinWorkaround.skipList(this, n);
-  }
-
-  Iterable<Element> skipWhile(bool test(Element value)) {
-    return IterableMixinWorkaround.skipWhile(this, test);
-  }
-
-  Element firstWhere(bool test(Element value), {Element orElse()}) {
-    return IterableMixinWorkaround.firstWhere(this, test, orElse);
-  }
-
-  Element lastWhere(bool test(Element value), {Element orElse()}) {
-    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
-  }
-
-  Element singleWhere(bool test(Element value)) {
-    return IterableMixinWorkaround.singleWhere(this, test);
-  }
-
-  Element elementAt(int index) {
-    return this[index];
-  }
-
-  bool get isEmpty => _nodeList.isEmpty;
-
   int get length => _nodeList.length;
 
   Element operator [](int index) => _nodeList[index];
@@ -9312,31 +8656,16 @@
     throw new UnsupportedError('');
   }
 
-  Iterator<Element> get iterator => new _FrozenElementListIterator(this);
-
   void addAll(Iterable<Element> iterable) {
     throw new UnsupportedError('');
   }
 
-  Iterable<Element> get reversed {
-    return IterableMixinWorkaround.reversedList(this);
-  }
-
   void sort([int compare(Element a, Element b)]) {
     throw new UnsupportedError('');
   }
 
-  dynamic reduce(dynamic initialValue,
-      dynamic combine(dynamic previousValue, Element element)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
-  }
-
-  dynamic fold(dynamic initialValue,
-      dynamic combine(dynamic previousValue, Element element)) {
-    return IterableMixinWorkaround.fold(this, initialValue, combine);
-  }
-
-  void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
+  void setRange(int start, int rangeLength, List from,
+                [int startFrom = 0]) {
     throw new UnsupportedError('');
   }
 
@@ -9352,15 +8681,6 @@
     return new _FrozenElementList._wrap(_nodeList.sublist(start, end));
   }
 
-  List<Element> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
-  int indexOf(Element element, [int start = 0]) =>
-    _nodeList.indexOf(element, start);
-
-  int lastIndexOf(Element element, [int start = null]) =>
-    _nodeList.lastIndexOf(element, start);
-
   void clear() {
     throw new UnsupportedError('');
   }
@@ -9377,14 +8697,6 @@
     throw new UnsupportedError('');
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError('');
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError('');
-  }
-
   void removeWhere(bool test(Element element)) {
     throw new UnsupportedError('');
   }
@@ -9399,49 +8711,12 @@
 
   Element get single => _nodeList.single;
 
-  Element min([int compare(Element a, Element b)]) {
-    return IterableMixinWorkaround.min(this, compare);
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
   }
-
-  Element max([int compare(Element a, Element b)]) {
-    return IterableMixinWorkaround.max(this, compare);
-  }
-
-  Map<int, Element> asMap() {
-    return IterableMixinWorkaround.asMapList(this);
-  }
-}
-
-class _FrozenElementListIterator implements Iterator<Element> {
-  final _FrozenElementList _list;
-  int _index = -1;
-  Element _current;
-
-  _FrozenElementListIterator(this._list);
-
-  /**
-   * Moves to the next element. Returns true if the iterator is positioned
-   * at an element. Returns false if it is positioned after the last element.
-   */
-  bool moveNext() {
-    int nextIndex = _index + 1;
-    if (nextIndex < _list.length) {
-      _current = _list[nextIndex];
-      _index = nextIndex;
-      return true;
-    }
-    _index = _list.length;
-    _current = null;
-    return false;
-  }
-
-  /**
-   * Returns the element the [Iterator] is positioned at.
-   *
-   * Return [:null:] if the iterator is positioned before the first, or
-   * after the last element.
-   */
-  Element get current => _current;
 }
 
 class _ElementCssClassSet extends CssClassSet {
@@ -9580,7 +8855,7 @@
    */
   CssClassSet get classes => new _ElementCssClassSet(this);
 
-  void set classes(Collection<String> value) {
+  void set classes(Iterable<String> value) {
     CssClassSet classSet = classes;
     classSet.clear();
     classSet.addAll(value);
@@ -10883,63 +10158,6 @@
 // WARNING: Do not edit - generated code.
 
 
-@DocsEditable
-@DomName('EntrySync')
-class EntrySync extends NativeFieldWrapperClass1 {
-  EntrySync.internal();
-
-  @DomName('EntrySync.filesystem')
-  @DocsEditable
-  FileSystemSync get filesystem native "EntrySync_filesystem_Getter";
-
-  @DomName('EntrySync.fullPath')
-  @DocsEditable
-  String get fullPath native "EntrySync_fullPath_Getter";
-
-  @DomName('EntrySync.isDirectory')
-  @DocsEditable
-  bool get isDirectory native "EntrySync_isDirectory_Getter";
-
-  @DomName('EntrySync.isFile')
-  @DocsEditable
-  bool get isFile native "EntrySync_isFile_Getter";
-
-  @DomName('EntrySync.name')
-  @DocsEditable
-  String get name native "EntrySync_name_Getter";
-
-  @DomName('EntrySync.copyTo')
-  @DocsEditable
-  EntrySync copyTo(DirectoryEntrySync parent, String name) native "EntrySync_copyTo_Callback";
-
-  @DomName('EntrySync.getMetadata')
-  @DocsEditable
-  Metadata getMetadata() native "EntrySync_getMetadata_Callback";
-
-  @DomName('EntrySync.getParent')
-  @DocsEditable
-  EntrySync getParent() native "EntrySync_getParent_Callback";
-
-  @DomName('EntrySync.moveTo')
-  @DocsEditable
-  EntrySync moveTo(DirectoryEntrySync parent, String name) native "EntrySync_moveTo_Callback";
-
-  @DomName('EntrySync.remove')
-  @DocsEditable
-  void remove() native "EntrySync_remove_Callback";
-
-  @DomName('EntrySync.toURL')
-  @DocsEditable
-  String toUrl() native "EntrySync_toURL_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
 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
@@ -11078,14 +10296,6 @@
   @DocsEditable
   int get eventPhase native "Event_eventPhase_Getter";
 
-  @DomName('Event.returnValue')
-  @DocsEditable
-  bool get returnValue native "Event_returnValue_Getter";
-
-  @DomName('Event.returnValue')
-  @DocsEditable
-  void set returnValue(bool value) native "Event_returnValue_Setter";
-
   @DomName('Event.target')
   @DocsEditable
   EventTarget get target native "Event_target_Getter";
@@ -11459,27 +10669,6 @@
 
 
 @DocsEditable
-@DomName('FileEntrySync')
-class FileEntrySync extends EntrySync {
-  FileEntrySync.internal() : super.internal();
-
-  @DomName('FileEntrySync.createWriter')
-  @DocsEditable
-  FileWriterSync createWriter() native "FileEntrySync_createWriter_Callback";
-
-  @DomName('FileEntrySync.file')
-  @DocsEditable
-  File file() native "FileEntrySync_file_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
 @DomName('FileError')
 class FileError extends NativeFieldWrapperClass1 {
   FileError.internal();
@@ -11599,11 +10788,12 @@
     return new FixedSizeListIterator<File>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, File)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  File reduce(File combine(File value, File element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, File)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, File element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -11611,7 +10801,7 @@
 
   void forEach(void f(File element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(File element)) =>
@@ -11713,12 +10903,6 @@
     throw new StateError("More than one element");
   }
 
-  File min([int compare(File a, File b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  File max([int compare(File a, File b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, File element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -11735,14 +10919,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(File element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -11763,17 +10939,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<File> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<File> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <File>[]);
   }
 
-  List<File> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, File> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<File> mixins.
 
   @DomName('FileList.item')
@@ -11922,55 +11105,6 @@
 
 
 @DocsEditable
-@DomName('FileReaderSync')
-class FileReaderSync extends NativeFieldWrapperClass1 {
-  FileReaderSync.internal();
-
-  @DomName('FileReaderSync.FileReaderSync')
-  @DocsEditable
-  factory FileReaderSync() {
-    return FileReaderSync._create_1();
-  }
-
-  @DocsEditable
-  static FileReaderSync _create_1() native "FileReaderSync__create_1constructorCallback";
-
-  @DomName('FileReaderSync.readAsArrayBuffer')
-  @DocsEditable
-  dynamic readAsArrayBuffer(Blob blob) native "FileReaderSync_readAsArrayBuffer_Callback";
-
-  @DomName('FileReaderSync.readAsBinaryString')
-  @DocsEditable
-  String readAsBinaryString(Blob blob) native "FileReaderSync_readAsBinaryString_Callback";
-
-  @DomName('FileReaderSync.readAsDataURL')
-  @DocsEditable
-  String readAsDataUrl(Blob blob) native "FileReaderSync_readAsDataURL_Callback";
-
-  String readAsText(Blob blob, [String encoding]) {
-    if (?encoding) {
-      return _readAsText_1(blob, encoding);
-    }
-    return _readAsText_2(blob);
-  }
-
-  @DomName('FileReaderSync._readAsText_1')
-  @DocsEditable
-  String _readAsText_1(blob, encoding) native "FileReaderSync__readAsText_1_Callback";
-
-  @DomName('FileReaderSync._readAsText_2')
-  @DocsEditable
-  String _readAsText_2(blob) native "FileReaderSync__readAsText_2_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
 @DomName('DOMFileSystem')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental
@@ -12005,29 +11139,6 @@
 
 
 @DocsEditable
-@DomName('DOMFileSystemSync')
-@SupportedBrowser(SupportedBrowser.CHROME)
-@Experimental
-class FileSystemSync extends NativeFieldWrapperClass1 {
-  FileSystemSync.internal();
-
-  @DomName('DOMFileSystemSync.name')
-  @DocsEditable
-  String get name native "DOMFileSystemSync_name_Getter";
-
-  @DomName('DOMFileSystemSync.root')
-  @DocsEditable
-  DirectoryEntrySync get root native "DOMFileSystemSync_root_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
 @DomName('FileWriter')
 class FileWriter extends EventTarget {
   FileWriter.internal() : super.internal();
@@ -12147,39 +11258,6 @@
 
 
 @DocsEditable
-@DomName('FileWriterSync')
-class FileWriterSync extends NativeFieldWrapperClass1 {
-  FileWriterSync.internal();
-
-  @DomName('FileWriterSync.length')
-  @DocsEditable
-  int get length native "FileWriterSync_length_Getter";
-
-  @DomName('FileWriterSync.position')
-  @DocsEditable
-  int get position native "FileWriterSync_position_Getter";
-
-  @DomName('FileWriterSync.seek')
-  @DocsEditable
-  void seek(int position) native "FileWriterSync_seek_Callback";
-
-  @DomName('FileWriterSync.truncate')
-  @DocsEditable
-  void truncate(int size) native "FileWriterSync_truncate_Callback";
-
-  @DomName('FileWriterSync.write')
-  @DocsEditable
-  void write(Blob data) native "FileWriterSync_write_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
 @DomName('Float32Array')
 class Float32Array extends ArrayBufferView implements List<double> {
   Float32Array.internal() : super.internal();
@@ -12224,11 +11302,12 @@
     return new FixedSizeListIterator<num>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, num)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  num reduce(num combine(num value, num element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, num)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, num element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -12236,7 +11315,7 @@
 
   void forEach(void f(num element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(num element)) =>
@@ -12338,12 +11417,6 @@
     throw new StateError("More than one element");
   }
 
-  num min([int compare(num a, num b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  num max([int compare(num a, num b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, num element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -12360,14 +11433,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(num element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -12388,17 +11453,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<num> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<num> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <num>[]);
   }
 
-  List<num> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, num> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<num> mixins.
 
   @DomName('Float32Array.setElements')
@@ -12473,11 +11545,12 @@
     return new FixedSizeListIterator<num>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, num)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  num reduce(num combine(num value, num element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, num)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, num element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -12485,7 +11558,7 @@
 
   void forEach(void f(num element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(num element)) =>
@@ -12587,12 +11660,6 @@
     throw new StateError("More than one element");
   }
 
-  num min([int compare(num a, num b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  num max([int compare(num a, num b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, num element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -12609,14 +11676,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(num element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -12637,17 +11696,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<num> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<num> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <num>[]);
   }
 
-  List<num> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, num> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<num> mixins.
 
   @DomName('Float64Array.setElements')
@@ -12910,7 +11976,7 @@
     var controller;
     controller = new StreamController<Geoposition>(
       onSubscriptionStateChange: () {
-        if (controller.hasSubscribers) {
+        if (controller.hasListener) {
           assert(watchId == null);
           watchId = $dom_watchPosition(
               (position) {
@@ -13171,11 +12237,12 @@
     return new FixedSizeListIterator<Node>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Node reduce(Node combine(Node value, Node element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Node)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Node element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -13183,7 +12250,7 @@
 
   void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Node element)) =>
@@ -13285,12 +12352,6 @@
     throw new StateError("More than one element");
   }
 
-  Node min([int compare(Node a, Node b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Node max([int compare(Node a, Node b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Node element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -13307,14 +12368,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Node element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -13335,17 +12388,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Node> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Node> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Node>[]);
   }
 
-  List<Node> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Node> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Node> mixins.
 
   @DomName('HTMLAllCollection.item')
@@ -13394,11 +12454,12 @@
     return new FixedSizeListIterator<Node>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Node reduce(Node combine(Node value, Node element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Node)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Node element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -13406,7 +12467,7 @@
 
   void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Node element)) =>
@@ -13508,12 +12569,6 @@
     throw new StateError("More than one element");
   }
 
-  Node min([int compare(Node a, Node b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Node max([int compare(Node a, Node b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Node element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -13530,14 +12585,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Node element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -13558,17 +12605,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Node> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Node> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Node>[]);
   }
 
-  List<Node> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Node> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Node> mixins.
 
   @DomName('HTMLCollection.item')
@@ -13595,22 +12649,23 @@
   @DocsEditable
   Element get activeElement native "HTMLDocument_activeElement_Getter";
 
+
   @DomName('Document.body')
-  BodyElement get body => document.$dom_body;
+  BodyElement get body => $dom_body;
 
   @DomName('Document.body')
   void set body(BodyElement value) {
-    document.$dom_body = value;
+    $dom_body = value;
   }
 
   @DomName('Document.caretRangeFromPoint')
   Range caretRangeFromPoint(int x, int y) {
-    return document.$dom_caretRangeFromPoint(x, y);
+    return $dom_caretRangeFromPoint(x, y);
   }
 
   @DomName('Document.elementFromPoint')
   Element elementFromPoint(int x, int y) {
-    return document.$dom_elementFromPoint(x, y);
+    return $dom_elementFromPoint(x, y);
   }
 
   /**
@@ -13649,36 +12704,36 @@
   @DomName('Document.getCSSCanvasContext')
   CanvasRenderingContext getCssCanvasContext(String contextId, String name,
       int width, int height) {
-    return document.$dom_getCssCanvasContext(contextId, name, width, height);
+    return $dom_getCssCanvasContext(contextId, name, width, height);
   }
 
   @DomName('Document.head')
-  HeadElement get head => document.$dom_head;
+  HeadElement get head => $dom_head;
 
   @DomName('Document.lastModified')
-  String get lastModified => document.$dom_lastModified;
+  String get lastModified => $dom_lastModified;
 
   @DomName('Document.preferredStylesheetSet')
-  String get preferredStylesheetSet => document.$dom_preferredStylesheetSet;
+  String get preferredStylesheetSet => $dom_preferredStylesheetSet;
 
   @DomName('Document.referrer')
-  String get referrer => document.$dom_referrer;
+  String get referrer => $dom_referrer;
 
   @DomName('Document.selectedStylesheetSet')
-  String get selectedStylesheetSet => document.$dom_selectedStylesheetSet;
+  String get selectedStylesheetSet => $dom_selectedStylesheetSet;
   void set selectedStylesheetSet(String value) {
-    document.$dom_selectedStylesheetSet = value;
+    $dom_selectedStylesheetSet = value;
   }
 
   @DomName('Document.styleSheets')
-  List<StyleSheet> get styleSheets => document.$dom_styleSheets;
+  List<StyleSheet> get styleSheets => $dom_styleSheets;
 
   @DomName('Document.title')
-  String get title => document.$dom_title;
+  String get title => $dom_title;
 
   @DomName('Document.title')
   void set title(String value) {
-    document.$dom_title = value;
+    $dom_title = value;
   }
 
   @DomName('Document.webkitCancelFullScreen')
@@ -13686,7 +12741,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
   void cancelFullScreen() {
-    document.$dom_webkitCancelFullScreen();
+    $dom_webkitCancelFullScreen();
   }
 
   @DomName('Document.webkitExitFullscreen')
@@ -13694,7 +12749,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
   void exitFullscreen() {
-    document.$dom_webkitExitFullscreen();
+    $dom_webkitExitFullscreen();
   }
 
   @DomName('Document.webkitExitPointerLock')
@@ -13702,45 +12757,45 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
   void exitPointerLock() {
-    document.$dom_webkitExitPointerLock();
+    $dom_webkitExitPointerLock();
   }
 
   @DomName('Document.webkitFullscreenElement')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  Element get fullscreenElement => document.$dom_webkitFullscreenElement;
+  Element get fullscreenElement => $dom_webkitFullscreenElement;
 
   @DomName('Document.webkitFullscreenEnabled')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  bool get fullscreenEnabled => document.$dom_webkitFullscreenEnabled;
+  bool get fullscreenEnabled => $dom_webkitFullscreenEnabled;
 
   @DomName('Document.webkitHidden')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  bool get hidden => document.$dom_webkitHidden;
+  bool get hidden => $dom_webkitHidden;
 
   @DomName('Document.webkitIsFullScreen')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  bool get isFullScreen => document.$dom_webkitIsFullScreen;
+  bool get isFullScreen => $dom_webkitIsFullScreen;
 
   @DomName('Document.webkitPointerLockElement')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
   Element get pointerLockElement =>
-      document.$dom_webkitPointerLockElement;
+      $dom_webkitPointerLockElement;
 
   @DomName('Document.webkitVisibilityState')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  String get visibilityState => document.$dom_webkitVisibilityState;
+  String get visibilityState => $dom_webkitVisibilityState;
 }
 // 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
@@ -14479,6 +13534,14 @@
   @DocsEditable
   void set sandbox(String value) native "HTMLIFrameElement_sandbox_Setter";
 
+  @DomName('HTMLIFrameElement.seamless')
+  @DocsEditable
+  bool get seamless native "HTMLIFrameElement_seamless_Getter";
+
+  @DomName('HTMLIFrameElement.seamless')
+  @DocsEditable
+  void set seamless(bool value) native "HTMLIFrameElement_seamless_Setter";
+
   @DomName('HTMLIFrameElement.src')
   @DocsEditable
   String get src native "HTMLIFrameElement_src_Getter";
@@ -15764,11 +14827,12 @@
     return new FixedSizeListIterator<int>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  int reduce(int combine(int value, int element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, int)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, int element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -15776,7 +14840,7 @@
 
   void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(int element)) =>
@@ -15878,12 +14942,6 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  int max([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, int element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -15900,14 +14958,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(int element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -15928,17 +14978,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<int> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<int> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <int>[]);
   }
 
-  List<int> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, int> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<int> mixins.
 
   @DomName('Int16Array.setElements')
@@ -16013,11 +15070,12 @@
     return new FixedSizeListIterator<int>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  int reduce(int combine(int value, int element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, int)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, int element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -16025,7 +15083,7 @@
 
   void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(int element)) =>
@@ -16127,12 +15185,6 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  int max([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, int element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -16149,14 +15201,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(int element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -16177,17 +15221,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<int> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<int> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <int>[]);
   }
 
-  List<int> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, int> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<int> mixins.
 
   @DomName('Int32Array.setElements')
@@ -16262,11 +15313,12 @@
     return new FixedSizeListIterator<int>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  int reduce(int combine(int value, int element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, int)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, int element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -16274,7 +15326,7 @@
 
   void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(int element)) =>
@@ -16376,12 +15428,6 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  int max([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, int element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -16398,14 +15444,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(int element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -16426,17 +15464,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<int> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<int> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <int>[]);
   }
 
-  List<int> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, int> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<int> mixins.
 
   @DomName('Int8Array.setElements')
@@ -19020,7 +18065,7 @@
  * the actual child nodes of an element until strictly necessary greatly
  * improving performance for the typical cases where it is not required.
  */
-class _ChildNodeListLazy implements List {
+class _ChildNodeListLazy extends ListBase<Node> {
   final Node _this;
 
   _ChildNodeListLazy(this._this);
@@ -19043,14 +18088,6 @@
     return _this.$dom_firstChild;
   }
 
-  Node min([int compare(Node a, Node b)]) {
-    return IterableMixinWorkaround.min(this, compare);
-  }
-
-  Node max([int compare(Node a, Node b)]) {
-    return IterableMixinWorkaround.max(this, compare);
-  }
-
   void add(Node value) {
     _this.append(value);
   }
@@ -19105,20 +18142,26 @@
     _this.$dom_removeChild(node);
   }
 
-  void removeAll(Iterable elements) {
-    IterableMixinWorkaround.removeAll(this, elements);
-  }
-
-  void retainAll(Iterable elements) {
-    IterableMixinWorkaround.retainAll(this, elements);
+  void _filter(bool test(Node node), bool removeMatching) {
+    // This implementation of removeWhere/retainWhere is more efficient
+    // than the default in ListBase. Child nodes can be removed in constant
+    // time.
+    Node child = _this.$dom_firstChild;
+    while (child != null) {
+      Node nextChild = child.nextSibling;
+      if (test(child) == removeMatching) {
+        _this.$dom_removeChild(child);
+      }
+      child = nextChild;
+    }
   }
 
   void removeWhere(bool test(Node node)) {
-    IterableMixinWorkaround.removeWhere(this, test);
+    _filter(test, true);
   }
 
   void retainWhere(bool test(Node node)) {
-    IterableMixinWorkaround.retainWhere(this, test);
+    _filter(test, false);
   }
 
   void clear() {
@@ -19131,42 +18174,6 @@
 
   Iterator<Node> get iterator => _this.$dom_childNodes.iterator;
 
-  // TODO(jacobr): We can implement these methods much more efficiently by
-  // looking up the nodeList only once instead of once per iteration.
-  bool contains(Node element) => IterableMixinWorkaround.contains(this, element);
-
-  void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
-
-  dynamic reduce(dynamic initialValue,
-      dynamic combine(dynamic previousValue, Node element)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
-  }
-
-  dynamic fold(dynamic initialValue,
-      dynamic combine(dynamic previousValue, Node element)) {
-    return IterableMixinWorkaround.fold(this, initialValue, combine);
-  }
-
-  String join([String separator]) {
-    return IterableMixinWorkaround.joinList(this, separator);
-  }
-
-  Iterable map(f(Node element)) {
-    return IterableMixinWorkaround.mapList(this, f);
-  }
-
-  Iterable<Node> where(bool f(Node element)) {
-    return IterableMixinWorkaround.where(this, f);
-  }
-
-  Iterable expand(Iterable f(Node element)) {
-    return IterableMixinWorkaround.expand(this, f);
-  }
-
-  bool every(bool f(Node element)) => IterableMixinWorkaround.every(this, f);
-
-  bool any(bool f(Node element)) => IterableMixinWorkaround.any(this, f);
-
   List<Node> toList({ bool growable: true }) =>
       new List<Node>.from(this, growable: growable);
   Set<Node> toSet() => new Set<Node>.from(this);
@@ -19175,54 +18182,12 @@
 
   // From List<Node>:
 
-  Iterable<Node> take(int n) {
-    return IterableMixinWorkaround.takeList(this, n);
-  }
-
-  Iterable<Node> takeWhile(bool test(Node value)) {
-    return IterableMixinWorkaround.takeWhile(this, test);
-  }
-
-  Iterable<Node> skip(int n) {
-    return IterableMixinWorkaround.skipList(this, n);
-  }
-
-  Iterable<Node> skipWhile(bool test(Node value)) {
-    return IterableMixinWorkaround.skipWhile(this, test);
-  }
-
-  Node firstWhere(bool test(Node value), {Node orElse()}) {
-    return IterableMixinWorkaround.firstWhere(this, test, orElse);
-  }
-
-  Node lastWhere(bool test(Node value), {Node orElse()}) {
-    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
-  }
-
-  Node singleWhere(bool test(Node value)) {
-    return IterableMixinWorkaround.singleWhere(this, test);
-  }
-
-  Node elementAt(int index) {
-    return this[index];
-  }
-
-  Iterable<Node> get reversed {
-    return IterableMixinWorkaround.reversedList(this);
-  }
-
   // TODO(jacobr): this could be implemented for child node lists.
   // The exception we throw here is misleading.
   void sort([int compare(Node a, Node b)]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(Node element, [int start = 0]) =>
-      Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(Node element, [int start = 0]) =>
-      Lists.lastIndexOf(this, element, start);
-
   // FIXME: implement these.
   void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
     throw new UnsupportedError(
@@ -19236,14 +18201,22 @@
     throw new UnsupportedError(
         "Cannot insertRange on immutable List.");
   }
+
+  Iterable<Node> getRange(int start, int end) {
+    throw new UnimplementedError("NodeList.getRange");
+  }
+
   List<Node> sublist(int start, [int end]) {
     if (end == null) end == length;
     return Lists.getRange(this, start, end, <Node>[]);
   }
 
-  List<Node> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
   // -- end List<Node> mixins.
 
   // TODO(jacobr): benchmark whether this is more efficient or whether caching
@@ -19256,8 +18229,6 @@
   }
 
   Node operator[](int index) => _this.$dom_childNodes[index];
-
-  Map<int, Node> asMap() => IterableMixinWorkaround.asMapList(this);
 }
 
 @DomName('Node')
@@ -19266,7 +18237,7 @@
     return new _ChildNodeListLazy(this);
   }
 
-  void set nodes(Collection<Node> value) {
+  void set nodes(Iterable<Node> value) {
     // Copy list first since we don't want liveness during iteration.
     // TODO(jacobr): there is a better way to do this.
     List copy = new List.from(value);
@@ -19408,6 +18379,12 @@
     return _modelChangedStream.stream;
   }
 
+  /**
+   * Print out a String representation of this Node.
+   */
+  String toString() => localName == null ?
+      (nodeValue == null ? super.toString() : nodeValue) : localName;
+
   Node.internal() : super.internal();
 
   @DomName('Node.childNodes')
@@ -19424,7 +18401,7 @@
 
   @DomName('Node.localName')
   @DocsEditable
-  String get $dom_localName native "Node_localName_Getter";
+  String get localName native "Node_localName_Getter";
 
   @DomName('Node.namespaceURI')
   @DocsEditable
@@ -19638,11 +18615,12 @@
     return new FixedSizeListIterator<Node>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Node reduce(Node combine(Node value, Node element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Node)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Node element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -19650,7 +18628,7 @@
 
   void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Node element)) =>
@@ -19752,12 +18730,6 @@
     throw new StateError("More than one element");
   }
 
-  Node min([int compare(Node a, Node b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Node max([int compare(Node a, Node b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Node element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -19774,14 +18746,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Node element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -19802,17 +18766,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Node> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Node> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Node>[]);
   }
 
-  List<Node> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Node> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Node> mixins.
 
   @DomName('NodeList.item')
@@ -21258,6 +20229,10 @@
 class RtcDtmfSender extends EventTarget {
   RtcDtmfSender.internal() : super.internal();
 
+  @DomName('RTCDTMFSender.tonechangeEvent')
+  @DocsEditable
+  static const EventStreamProvider<RtcDtmfToneChangeEvent> toneChangeEvent = const EventStreamProvider<RtcDtmfToneChangeEvent>('tonechange');
+
   @DomName('RTCDTMFSender.canInsertDTMF')
   @DocsEditable
   bool get canInsertDtmf native "RTCDTMFSender_canInsertDTMF_Getter";
@@ -21315,6 +20290,10 @@
   @DocsEditable
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDTMFSender_removeEventListener_Callback";
 
+  @DomName('RTCDTMFSender.ontonechange')
+  @DocsEditable
+  Stream<RtcDtmfToneChangeEvent> get onToneChange => toneChangeEvent.forTarget(this);
+
 }
 // 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
@@ -21430,6 +20409,10 @@
   @DocsEditable
   static const EventStreamProvider<RtcIceCandidateEvent> iceCandidateEvent = const EventStreamProvider<RtcIceCandidateEvent>('icecandidate');
 
+  @DomName('RTCPeerConnection.iceconnectionstatechangeEvent')
+  @DocsEditable
+  static const EventStreamProvider<Event> iceConnectionStateChangeEvent = const EventStreamProvider<Event>('iceconnectionstatechange');
+
   @DomName('RTCPeerConnection.negotiationneededEvent')
   @DocsEditable
   static const EventStreamProvider<Event> negotiationNeededEvent = const EventStreamProvider<Event>('negotiationneeded');
@@ -21438,6 +20421,10 @@
   @DocsEditable
   static const EventStreamProvider<MediaStreamEvent> removeStreamEvent = const EventStreamProvider<MediaStreamEvent>('removestream');
 
+  @DomName('RTCPeerConnection.signalingstatechangeEvent')
+  @DocsEditable
+  static const EventStreamProvider<Event> signalingStateChangeEvent = const EventStreamProvider<Event>('signalingstatechange');
+
   @DomName('RTCPeerConnection.RTCPeerConnection')
   @DocsEditable
   factory RtcPeerConnection(Map rtcIceServers, [Map mediaConstraints]) {
@@ -21567,6 +20554,10 @@
   @DocsEditable
   Stream<RtcIceCandidateEvent> get onIceCandidate => iceCandidateEvent.forTarget(this);
 
+  @DomName('RTCPeerConnection.oniceconnectionstatechange')
+  @DocsEditable
+  Stream<Event> get onIceConnectionStateChange => iceConnectionStateChangeEvent.forTarget(this);
+
   @DomName('RTCPeerConnection.onnegotiationneeded')
   @DocsEditable
   Stream<Event> get onNegotiationNeeded => negotiationNeededEvent.forTarget(this);
@@ -21575,6 +20566,10 @@
   @DocsEditable
   Stream<MediaStreamEvent> get onRemoveStream => removeStreamEvent.forTarget(this);
 
+  @DomName('RTCPeerConnection.onsignalingstatechange')
+  @DocsEditable
+  Stream<Event> get onSignalingStateChange => signalingStateChangeEvent.forTarget(this);
+
 }
 
 
@@ -21793,6 +20788,14 @@
   @DocsEditable
   void set htmlFor(String value) native "HTMLScriptElement_htmlFor_Setter";
 
+  @DomName('HTMLScriptElement.nonce')
+  @DocsEditable
+  String get nonce native "HTMLScriptElement_nonce_Getter";
+
+  @DomName('HTMLScriptElement.nonce')
+  @DocsEditable
+  void set nonce(String value) native "HTMLScriptElement_nonce_Setter";
+
   @DomName('HTMLScriptElement.src')
   @DocsEditable
   String get src native "HTMLScriptElement_src_Getter";
@@ -21892,6 +20895,51 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('SecurityPolicyViolationEvent')
+class SecurityPolicyViolationEvent extends Event {
+  SecurityPolicyViolationEvent.internal() : super.internal();
+
+  @DomName('SecurityPolicyViolationEvent.blockedURI')
+  @DocsEditable
+  String get blockedUri native "SecurityPolicyViolationEvent_blockedURI_Getter";
+
+  @DomName('SecurityPolicyViolationEvent.documentURI')
+  @DocsEditable
+  String get documentUri native "SecurityPolicyViolationEvent_documentURI_Getter";
+
+  @DomName('SecurityPolicyViolationEvent.effectiveDirective')
+  @DocsEditable
+  String get effectiveDirective native "SecurityPolicyViolationEvent_effectiveDirective_Getter";
+
+  @DomName('SecurityPolicyViolationEvent.lineNumber')
+  @DocsEditable
+  int get lineNumber native "SecurityPolicyViolationEvent_lineNumber_Getter";
+
+  @DomName('SecurityPolicyViolationEvent.originalPolicy')
+  @DocsEditable
+  String get originalPolicy native "SecurityPolicyViolationEvent_originalPolicy_Getter";
+
+  @DomName('SecurityPolicyViolationEvent.referrer')
+  @DocsEditable
+  String get referrer native "SecurityPolicyViolationEvent_referrer_Getter";
+
+  @DomName('SecurityPolicyViolationEvent.sourceFile')
+  @DocsEditable
+  String get sourceFile native "SecurityPolicyViolationEvent_sourceFile_Getter";
+
+  @DomName('SecurityPolicyViolationEvent.violatedDirective')
+  @DocsEditable
+  String get violatedDirective native "SecurityPolicyViolationEvent_violatedDirective_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 
 @DomName('HTMLSelectElement')
 class SelectElement extends _Element_Merged {
@@ -22136,57 +21184,6 @@
 
 
 @DocsEditable
-@DomName('SharedWorker')
-class SharedWorker extends AbstractWorker {
-  SharedWorker.internal() : super.internal();
-
-  @DomName('SharedWorker.SharedWorker')
-  @DocsEditable
-  factory SharedWorker(String scriptURL, [String name]) {
-    return SharedWorker._create_1(scriptURL, name);
-  }
-
-  @DocsEditable
-  static SharedWorker _create_1(scriptURL, name) native "SharedWorker__create_1constructorCallback";
-
-  @DomName('SharedWorker.port')
-  @DocsEditable
-  MessagePort get port native "SharedWorker_port_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('SharedWorkerContext')
-class SharedWorkerContext extends WorkerContext {
-  SharedWorkerContext.internal() : super.internal();
-
-  @DomName('SharedWorkerContext.connectEvent')
-  @DocsEditable
-  static const EventStreamProvider<Event> connectEvent = const EventStreamProvider<Event>('connect');
-
-  @DomName('SharedWorkerContext.name')
-  @DocsEditable
-  String get name native "SharedWorkerContext_name_Getter";
-
-  @DomName('SharedWorkerContext.onconnect')
-  @DocsEditable
-  Stream<Event> get onConnect => connectEvent.forTarget(this);
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
 @DomName('SourceBuffer')
 class SourceBuffer extends NativeFieldWrapperClass1 {
   SourceBuffer.internal();
@@ -22245,11 +21242,12 @@
     return new FixedSizeListIterator<SourceBuffer>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SourceBuffer)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  SourceBuffer reduce(SourceBuffer combine(SourceBuffer value, SourceBuffer element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, SourceBuffer)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, SourceBuffer element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -22257,7 +21255,7 @@
 
   void forEach(void f(SourceBuffer element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(SourceBuffer element)) =>
@@ -22359,12 +21357,6 @@
     throw new StateError("More than one element");
   }
 
-  SourceBuffer min([int compare(SourceBuffer a, SourceBuffer b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  SourceBuffer max([int compare(SourceBuffer a, SourceBuffer b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, SourceBuffer element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -22381,14 +21373,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(SourceBuffer element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -22409,17 +21393,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<SourceBuffer> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<SourceBuffer> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <SourceBuffer>[]);
   }
 
-  List<SourceBuffer> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, SourceBuffer> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<SourceBuffer> mixins.
 
   @DomName('SourceBufferList.addEventListener')
@@ -22577,11 +21568,12 @@
     return new FixedSizeListIterator<SpeechGrammar>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SpeechGrammar)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  SpeechGrammar reduce(SpeechGrammar combine(SpeechGrammar value, SpeechGrammar element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, SpeechGrammar)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, SpeechGrammar element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -22589,7 +21581,7 @@
 
   void forEach(void f(SpeechGrammar element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(SpeechGrammar element)) =>
@@ -22691,12 +21683,6 @@
     throw new StateError("More than one element");
   }
 
-  SpeechGrammar min([int compare(SpeechGrammar a, SpeechGrammar b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  SpeechGrammar max([int compare(SpeechGrammar a, SpeechGrammar b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, SpeechGrammar element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -22713,14 +21699,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(SpeechGrammar element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -22741,17 +21719,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<SpeechGrammar> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<SpeechGrammar> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <SpeechGrammar>[]);
   }
 
-  List<SpeechGrammar> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, SpeechGrammar> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<SpeechGrammar> mixins.
 
   void addFromString(String string, [num weight]) {
@@ -23175,13 +22160,13 @@
     }
   }
 
-  Collection<String> get keys {
+  Iterable<String> get keys {
     final keys = [];
     forEach((k, v) => keys.add(k));
     return keys;
   }
 
-  Collection<String> get values {
+  Iterable<String> get values {
     final values = [];
     forEach((k, v) => values.add(v));
     return values;
@@ -24324,11 +23309,12 @@
     return new FixedSizeListIterator<TextTrackCue>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, TextTrackCue)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  TextTrackCue reduce(TextTrackCue combine(TextTrackCue value, TextTrackCue element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, TextTrackCue)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, TextTrackCue element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -24336,7 +23322,7 @@
 
   void forEach(void f(TextTrackCue element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(TextTrackCue element)) =>
@@ -24438,12 +23424,6 @@
     throw new StateError("More than one element");
   }
 
-  TextTrackCue min([int compare(TextTrackCue a, TextTrackCue b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  TextTrackCue max([int compare(TextTrackCue a, TextTrackCue b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, TextTrackCue element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -24460,14 +23440,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(TextTrackCue element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -24488,17 +23460,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<TextTrackCue> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<TextTrackCue> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <TextTrackCue>[]);
   }
 
-  List<TextTrackCue> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, TextTrackCue> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<TextTrackCue> mixins.
 
   @DomName('TextTrackCueList.getCueById')
@@ -24547,11 +23526,12 @@
     return new FixedSizeListIterator<TextTrack>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, TextTrack)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  TextTrack reduce(TextTrack combine(TextTrack value, TextTrack element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, TextTrack)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, TextTrack element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -24559,7 +23539,7 @@
 
   void forEach(void f(TextTrack element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(TextTrack element)) =>
@@ -24661,12 +23641,6 @@
     throw new StateError("More than one element");
   }
 
-  TextTrack min([int compare(TextTrack a, TextTrack b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  TextTrack max([int compare(TextTrack a, TextTrack b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, TextTrack element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -24683,14 +23657,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(TextTrack element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -24711,17 +23677,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<TextTrack> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<TextTrack> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <TextTrack>[]);
   }
 
-  List<TextTrack> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, TextTrack> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<TextTrack> mixins.
 
   @DomName('TextTrackList.addEventListener')
@@ -24987,11 +23960,12 @@
     return new FixedSizeListIterator<Touch>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Touch)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Touch reduce(Touch combine(Touch value, Touch element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Touch)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Touch element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -24999,7 +23973,7 @@
 
   void forEach(void f(Touch element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Touch element)) =>
@@ -25101,12 +24075,6 @@
     throw new StateError("More than one element");
   }
 
-  Touch min([int compare(Touch a, Touch b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Touch max([int compare(Touch a, Touch b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Touch element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -25123,14 +24091,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Touch element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -25151,17 +24111,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Touch> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Touch> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Touch>[]);
   }
 
-  List<Touch> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Touch> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Touch> mixins.
 
   @DomName('TouchList.item')
@@ -25510,11 +24477,12 @@
     return new FixedSizeListIterator<int>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  int reduce(int combine(int value, int element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, int)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, int element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -25522,7 +24490,7 @@
 
   void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(int element)) =>
@@ -25624,12 +24592,6 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  int max([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, int element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -25646,14 +24608,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(int element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -25674,17 +24628,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<int> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<int> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <int>[]);
   }
 
-  List<int> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, int> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<int> mixins.
 
   @DomName('Uint16Array.setElements')
@@ -25759,11 +24720,12 @@
     return new FixedSizeListIterator<int>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  int reduce(int combine(int value, int element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, int)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, int element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -25771,7 +24733,7 @@
 
   void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(int element)) =>
@@ -25873,12 +24835,6 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  int max([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, int element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -25895,14 +24851,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(int element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -25923,17 +24871,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<int> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<int> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <int>[]);
   }
 
-  List<int> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, int> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<int> mixins.
 
   @DomName('Uint32Array.setElements')
@@ -26008,11 +24963,12 @@
     return new FixedSizeListIterator<int>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  int reduce(int combine(int value, int element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, int)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, int element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -26020,7 +24976,7 @@
 
   void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(int element)) =>
@@ -26122,12 +25078,6 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  int max([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, int element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -26144,14 +25094,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(int element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -26172,17 +25114,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<int> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<int> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <int>[]);
   }
 
-  List<int> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, int> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<int> mixins.
 
   @DomName('Uint8Array.setElements')
@@ -26255,11 +25204,12 @@
     return new FixedSizeListIterator<int>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  int reduce(int combine(int value, int element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, int)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, int element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -26267,7 +25217,7 @@
 
   void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(int element)) =>
@@ -26369,12 +25319,6 @@
     throw new StateError("More than one element");
   }
 
-  int min([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  int max([int compare(int a, int b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, int element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -26391,14 +25335,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(int element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -26419,17 +25355,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<int> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<int> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <int>[]);
   }
 
-  List<int> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, int> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<int> mixins.
 
   @DomName('Uint8ClampedArray.setElements')
@@ -26695,60 +25638,6 @@
 
 
 @DocsEditable
-@DomName('WebKitCSSFilterValue')
-class WebKitCssFilterValue extends _CssValueList {
-  WebKitCssFilterValue.internal() : super.internal();
-
-  static const int CSS_FILTER_BLUR = 10;
-
-  static const int CSS_FILTER_BRIGHTNESS = 8;
-
-  static const int CSS_FILTER_CONTRAST = 9;
-
-  static const int CSS_FILTER_CUSTOM = 12;
-
-  static const int CSS_FILTER_DROP_SHADOW = 11;
-
-  static const int CSS_FILTER_GRAYSCALE = 2;
-
-  static const int CSS_FILTER_HUE_ROTATE = 5;
-
-  static const int CSS_FILTER_INVERT = 6;
-
-  static const int CSS_FILTER_OPACITY = 7;
-
-  static const int CSS_FILTER_REFERENCE = 1;
-
-  static const int CSS_FILTER_SATURATE = 4;
-
-  static const int CSS_FILTER_SEPIA = 3;
-
-  @DomName('WebKitCSSFilterValue.operationType')
-  @DocsEditable
-  int get operationType native "WebKitCSSFilterValue_operationType_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('WebKitCSSMixFunctionValue')
-class WebKitCssMixFunctionValue extends _CssValueList {
-  WebKitCssMixFunctionValue.internal() : super.internal();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
 @DomName('WebKitNamedFlow')
 class WebKitNamedFlow extends EventTarget {
   WebKitNamedFlow.internal() : super.internal();
@@ -27151,21 +26040,43 @@
    * lasting storage. This storage cannot be freed without the user's
    * permission. Returns a [Future] whose value stores a reference to the
    * sandboxed file system for use. Because the file system is sandboxed,
-   * applications cannot access file systems created in other web pages. 
+   * applications cannot access file systems created in other web pages.
    */
   Future<FileSystem> requestFileSystem(int size, {bool persistent: false}) {
     return _requestFileSystem(persistent? 1 : 0, size);
   }
+
+  @DomName('DOMWindow.convertPointFromNodeToPage')
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental
+  Point convertPointFromNodeToPage(Node node, Point point) {
+    var result = _convertPointFromNodeToPage(node,
+        new _DomPoint(point.x, point.y));
+    return new Point(result.x, result.y);
+  }
+
+  @DomName('DOMWindow.convertPointFromPageToNode')
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental
+  Point convertPointFromPageToNode(Node node, Point point) {
+    var result = _convertPointFromPageToNode(node,
+        new _DomPoint(point.x, point.y));
+    return new Point(result.x, result.y);
+  }
+
+  /**
+   * Checks whether [convertPointFromNodeToPage] and
+   * [convertPointFromPageToNode] are supported on the current platform.
+   */
+  static bool get supportsPointConversions => _DomPoint.supported;
   Window.internal() : super.internal();
 
   @DomName('DOMWindow.DOMContentLoadedEvent')
   @DocsEditable
   static const EventStreamProvider<Event> contentLoadedEvent = const EventStreamProvider<Event>('DOMContentLoaded');
 
-  @DomName('DOMWindow.beforeunloadEvent')
-  @DocsEditable
-  static const EventStreamProvider<Event> beforeUnloadEvent = const EventStreamProvider<Event>('beforeunload');
-
   @DomName('DOMWindow.devicemotionEvent')
   @DocsEditable
   static const EventStreamProvider<DeviceMotionEvent> deviceMotionEvent = const EventStreamProvider<DeviceMotionEvent>('devicemotion');
@@ -27604,14 +26515,14 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  DomPoint convertPointFromNodeToPage(Node node, DomPoint p) native "DOMWindow_webkitConvertPointFromNodeToPage_Callback";
+  _DomPoint _convertPointFromNodeToPage(Node node, _DomPoint p) native "DOMWindow_webkitConvertPointFromNodeToPage_Callback";
 
   @DomName('DOMWindow.webkitConvertPointFromPageToNode')
   @DocsEditable
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  DomPoint convertPointFromPageToNode(Node node, DomPoint p) native "DOMWindow_webkitConvertPointFromPageToNode_Callback";
+  _DomPoint _convertPointFromPageToNode(Node node, _DomPoint p) native "DOMWindow_webkitConvertPointFromPageToNode_Callback";
 
   @DomName('DOMWindow.webkitRequestFileSystem')
   @DocsEditable
@@ -27649,10 +26560,6 @@
   @DocsEditable
   Stream<Event> get onAbort => Element.abortEvent.forTarget(this);
 
-  @DomName('DOMWindow.onbeforeunload')
-  @DocsEditable
-  Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
-
   @DomName('DOMWindow.onblur')
   @DocsEditable
   Stream<Event> get onBlur => Element.blurEvent.forTarget(this);
@@ -27857,6 +26764,65 @@
   @DocsEditable
   Stream<TransitionEvent> get onTransitionEnd => Element.transitionEndEvent.forTarget(this);
 
+
+  @DomName('DOMWindow.beforeunloadEvent')
+  @DocsEditable
+  static const EventStreamProvider<BeforeUnloadEvent> beforeUnloadEvent =
+      const _BeforeUnloadEventStreamProvider('beforeunload');
+
+  @DomName('DOMWindow.onbeforeunload')
+  @DocsEditable
+  Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
+}
+
+/**
+ * Event object that is fired before the window is closed.
+ *
+ * The standard window close behavior can be prevented by setting the
+ * [returnValue]. This will display a dialog to the user confirming that they
+ * want to close the page.
+ */
+abstract class BeforeUnloadEvent implements Event {
+  /**
+   * If set to a non-null value, a dialog will be presented to the user
+   * confirming that they want to close the page.
+   */
+  String returnValue;
+}
+
+class _BeforeUnloadEvent extends _WrappedEvent implements BeforeUnloadEvent {
+  String _returnValue;
+
+  _BeforeUnloadEvent(Event base): super(base);
+
+  String get returnValue => _returnValue;
+
+  void set returnValue(String value) {
+    _returnValue = value;
+  }
+}
+
+class _BeforeUnloadEventStreamProvider implements
+    EventStreamProvider<BeforeUnloadEvent> {
+  final String _eventType;
+
+  const _BeforeUnloadEventStreamProvider(this._eventType);
+
+  Stream<BeforeUnloadEvent> forTarget(EventTarget e, {bool useCapture: false}) {
+    var controller = new StreamController.broadcast();
+    var stream = new _EventStream(e, _eventType, useCapture);
+    stream.listen((event) {
+      var wrapped = new _BeforeUnloadEvent(event);
+      controller.add(wrapped);
+      return wrapped.returnValue;
+    });
+
+    return controller.stream;
+  }
+
+  String getEventType(EventTarget target) {
+    return _eventType;
+  }
 }
 // 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
@@ -27867,6 +26833,10 @@
 
 @DocsEditable
 @DomName('Worker')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.FIREFOX)
+@SupportedBrowser(SupportedBrowser.IE, '10')
+@SupportedBrowser(SupportedBrowser.SAFARI)
 class Worker extends AbstractWorker {
   Worker.internal() : super.internal();
 
@@ -27883,6 +26853,9 @@
   @DocsEditable
   static Worker _create_1(scriptUrl) native "Worker__create_1constructorCallback";
 
+  /// Checks if this type is supported on the current platform.
+  static bool get supported => true;
+
   @DomName('Worker.postMessage')
   @DocsEditable
   void postMessage(/*SerializedScriptValue*/ message, [List messagePorts]) native "Worker_postMessage_Callback";
@@ -27896,289 +26869,6 @@
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
 }
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DomName('WorkerContext')
-class WorkerContext extends EventTarget {
-
-  /**
-   * Access a sandboxed file system of the specified `size`. If `persistent` is
-   * true, the application will request permission from the user to create
-   * lasting storage. This storage cannot be freed without the user's
-   * permission. Returns a [Future] whose value stores a reference to the
-   * sandboxed file system for use. Because the file system is sandboxed,
-   * applications cannot access file systems created in other web pages. 
-   */
-  @DomName('WorkerContext.webkitRequestFileSystem')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental
-  Future<FileSystem> requestFileSystem(int size, {bool persistent: false}) {
-    return _requestFileSystem(persistent? 1 : 0, size);
-  }
-
-  /**
-   * Access a sandboxed file system of the specified `size`. If `persistent` is
-   * true, the application will request permission from the user to create
-   * lasting storage. This storage cannot be freed without the user's
-   * permission. This call will block until a reference to the synchronous file 
-   * system API has been obtained. Because the file system is sandboxed,
-   * applications cannot access file systems created in other web pages. 
-   */
-  @DomName('WorkerContext.webkitRequestFileSystemSync')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental
-  FileSystemSync requestFileSystemSync(int size, {bool persistent: false}) {
-    return _requestFileSystemSync(persistent? 1 : 0, size);
-  }
-  WorkerContext.internal() : super.internal();
-
-  @DomName('WorkerContext.errorEvent')
-  @DocsEditable
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
-
-  static const int PERSISTENT = 1;
-
-  static const int TEMPORARY = 0;
-
-  @DomName('WorkerContext.indexedDB')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.FIREFOX, '15')
-  @SupportedBrowser(SupportedBrowser.IE, '10')
-  @Experimental
-  IdbFactory get indexedDB native "WorkerContext_indexedDB_Getter";
-
-  @DomName('WorkerContext.location')
-  @DocsEditable
-  WorkerLocation get location native "WorkerContext_location_Getter";
-
-  @DomName('WorkerContext.navigator')
-  @DocsEditable
-  WorkerNavigator get navigator native "WorkerContext_navigator_Getter";
-
-  @DomName('WorkerContext.self')
-  @DocsEditable
-  WorkerContext get self native "WorkerContext_self_Getter";
-
-  @DomName('WorkerContext.webkitNotifications')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental
-  NotificationCenter get notifications native "WorkerContext_webkitNotifications_Getter";
-
-  @DomName('WorkerContext.addEventListener')
-  @DocsEditable
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WorkerContext_addEventListener_Callback";
-
-  @DomName('WorkerContext.clearInterval')
-  @DocsEditable
-  void clearInterval(int handle) native "WorkerContext_clearInterval_Callback";
-
-  @DomName('WorkerContext.clearTimeout')
-  @DocsEditable
-  void clearTimeout(int handle) native "WorkerContext_clearTimeout_Callback";
-
-  @DomName('WorkerContext.close')
-  @DocsEditable
-  void close() native "WorkerContext_close_Callback";
-
-  @DomName('WorkerContext.dispatchEvent')
-  @DocsEditable
-  bool dispatchEvent(Event evt) native "WorkerContext_dispatchEvent_Callback";
-
-  @DomName('WorkerContext.importScripts')
-  @DocsEditable
-  void importScripts() native "WorkerContext_importScripts_Callback";
-
-  @DomName('WorkerContext.openDatabase')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental
-  SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "WorkerContext_openDatabase_Callback";
-
-  @DomName('WorkerContext.openDatabaseSync')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental
-  SqlDatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "WorkerContext_openDatabaseSync_Callback";
-
-  @DomName('WorkerContext.removeEventListener')
-  @DocsEditable
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WorkerContext_removeEventListener_Callback";
-
-  @DomName('WorkerContext.setInterval')
-  @DocsEditable
-  int setInterval(Object handler, int timeout) native "WorkerContext_setInterval_Callback";
-
-  @DomName('WorkerContext.setTimeout')
-  @DocsEditable
-  int setTimeout(Object handler, int timeout) native "WorkerContext_setTimeout_Callback";
-
-  /**
-   * Access a sandboxed file system of the specified `size`. If `persistent` is
-   * true, the application will request permission from the user to create
-   * lasting storage. This storage cannot be freed without the user's
-   * permission. Returns a [Future] whose value stores a reference to the
-   * sandboxed file system for use. Because the file system is sandboxed,
-   * applications cannot access file systems created in other web pages. 
-   */
-  @DomName('WorkerContext.webkitRequestFileSystem')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental
-  void __requestFileSystem(int type, int size, [_FileSystemCallback successCallback, _ErrorCallback errorCallback]) native "WorkerContext_webkitRequestFileSystem_Callback";
-
-  Future<FileSystem> _requestFileSystem(int type, int size) {
-    var completer = new Completer<FileSystem>();
-    __requestFileSystem(type, size,
-        (value) { completer.complete(value); },
-        (error) { completer.completeError(error); });
-    return completer.future;
-  }
-
-  /**
-   * Access a sandboxed file system of the specified `size`. If `persistent` is
-   * true, the application will request permission from the user to create
-   * lasting storage. This storage cannot be freed without the user's
-   * permission. This call will block until a reference to the synchronous file 
-   * system API has been obtained. Because the file system is sandboxed,
-   * applications cannot access file systems created in other web pages. 
-   */
-  @DomName('WorkerContext.webkitRequestFileSystemSync')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental
-  FileSystemSync _requestFileSystemSync(int type, int size) native "WorkerContext_webkitRequestFileSystemSync_Callback";
-
-  @DomName('WorkerContext.webkitResolveLocalFileSystemSyncURL')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental
-  EntrySync resolveLocalFileSystemSyncUrl(String url) native "WorkerContext_webkitResolveLocalFileSystemSyncURL_Callback";
-
-  @DomName('WorkerContext.webkitResolveLocalFileSystemURL')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental
-  void _resolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) native "WorkerContext_webkitResolveLocalFileSystemURL_Callback";
-
-  Future<Entry> resolveLocalFileSystemUrl(String url) {
-    var completer = new Completer<Entry>();
-    _resolveLocalFileSystemUrl(url,
-        (value) { completer.complete(value); },
-        (error) { completer.completeError(error); });
-    return completer.future;
-  }
-
-  @DomName('WorkerContext.onerror')
-  @DocsEditable
-  Stream<Event> get onError => errorEvent.forTarget(this);
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('WorkerLocation')
-class WorkerLocation extends NativeFieldWrapperClass1 {
-  WorkerLocation.internal();
-
-  @DomName('WorkerLocation.hash')
-  @DocsEditable
-  String get hash native "WorkerLocation_hash_Getter";
-
-  @DomName('WorkerLocation.host')
-  @DocsEditable
-  String get host native "WorkerLocation_host_Getter";
-
-  @DomName('WorkerLocation.hostname')
-  @DocsEditable
-  String get hostname native "WorkerLocation_hostname_Getter";
-
-  @DomName('WorkerLocation.href')
-  @DocsEditable
-  String get href native "WorkerLocation_href_Getter";
-
-  @DomName('WorkerLocation.pathname')
-  @DocsEditable
-  String get pathname native "WorkerLocation_pathname_Getter";
-
-  @DomName('WorkerLocation.port')
-  @DocsEditable
-  String get port native "WorkerLocation_port_Getter";
-
-  @DomName('WorkerLocation.protocol')
-  @DocsEditable
-  String get protocol native "WorkerLocation_protocol_Getter";
-
-  @DomName('WorkerLocation.search')
-  @DocsEditable
-  String get search native "WorkerLocation_search_Getter";
-
-  @DomName('WorkerLocation.toString')
-  @DocsEditable
-  String toString() native "WorkerLocation_toString_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('WorkerNavigator')
-class WorkerNavigator extends NativeFieldWrapperClass1 {
-  WorkerNavigator.internal();
-
-  @DomName('WorkerNavigator.appName')
-  @DocsEditable
-  String get appName native "WorkerNavigator_appName_Getter";
-
-  @DomName('WorkerNavigator.appVersion')
-  @DocsEditable
-  String get appVersion native "WorkerNavigator_appVersion_Getter";
-
-  @DomName('WorkerNavigator.onLine')
-  @DocsEditable
-  bool get onLine native "WorkerNavigator_onLine_Getter";
-
-  @DomName('WorkerNavigator.platform')
-  @DocsEditable
-  String get platform native "WorkerNavigator_platform_Getter";
-
-  @DomName('WorkerNavigator.userAgent')
-  @DocsEditable
-  String get userAgent native "WorkerNavigator_userAgent_Getter";
-
-  @DomName('WorkerNavigator.webkitPersistentStorage')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental
-  StorageQuota get persistentStorage native "WorkerNavigator_webkitPersistentStorage_Getter";
-
-  @DomName('WorkerNavigator.webkitTemporaryStorage')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental
-  StorageQuota get temporaryStorage native "WorkerNavigator_webkitTemporaryStorage_Getter";
-
-}
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
@@ -28435,6 +27125,32 @@
   DocumentFragment transformToFragment(Node source, Document docVal) native "XSLTProcessor_transformToFragment_Callback";
 
 }
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('CSSPrimitiveValue')
+abstract class _CSSPrimitiveValue extends _CSSValue {
+  _CSSPrimitiveValue.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('CSSValue')
+abstract class _CSSValue extends NativeFieldWrapperClass1 {
+  _CSSValue.internal();
+
+}
 // 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.
@@ -28594,11 +27310,12 @@
     return new FixedSizeListIterator<Rect>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Rect)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Rect reduce(Rect combine(Rect value, Rect element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Rect)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Rect element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -28606,7 +27323,7 @@
 
   void forEach(void f(Rect element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Rect element)) =>
@@ -28708,12 +27425,6 @@
     throw new StateError("More than one element");
   }
 
-  Rect min([int compare(Rect a, Rect b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Rect max([int compare(Rect a, Rect b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Rect element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -28730,14 +27441,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Rect element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -28758,17 +27461,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Rect> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Rect> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Rect>[]);
   }
 
-  List<Rect> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Rect> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Rect> mixins.
 
   @DomName('ClientRectList.item')
@@ -28784,6 +27494,19 @@
 
 
 @DocsEditable
+@DomName('Counter')
+abstract class _Counter extends NativeFieldWrapperClass1 {
+  _Counter.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
 @DomName('CSSRuleList')
 class _CssRuleList extends NativeFieldWrapperClass1 implements List<CssRule> {
   _CssRuleList.internal();
@@ -28809,11 +27532,12 @@
     return new FixedSizeListIterator<CssRule>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, CssRule)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  CssRule reduce(CssRule combine(CssRule value, CssRule element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, CssRule)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, CssRule element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -28821,7 +27545,7 @@
 
   void forEach(void f(CssRule element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(CssRule element)) =>
@@ -28923,12 +27647,6 @@
     throw new StateError("More than one element");
   }
 
-  CssRule min([int compare(CssRule a, CssRule b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  CssRule max([int compare(CssRule a, CssRule b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, CssRule element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -28945,14 +27663,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(CssRule element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -28973,17 +27683,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<CssRule> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<CssRule> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <CssRule>[]);
   }
 
-  List<CssRule> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, CssRule> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<CssRule> mixins.
 
   @DomName('CSSRuleList.item')
@@ -29000,104 +27717,105 @@
 
 @DocsEditable
 @DomName('CSSValueList')
-class _CssValueList extends CssValue implements List<CssValue> {
+class _CssValueList extends _CSSValue implements List<_CSSValue> {
   _CssValueList.internal() : super.internal();
 
   @DomName('CSSValueList.length')
   @DocsEditable
   int get length native "CSSValueList_length_Getter";
 
-  CssValue operator[](int index) native "CSSValueList_item_Callback";
+  _CSSValue operator[](int index) native "CSSValueList_item_Callback";
 
-  void operator[]=(int index, CssValue value) {
+  void operator[]=(int index, _CSSValue value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
-  // -- start List<CssValue> mixins.
-  // CssValue is the element type.
+  // -- start List<_CSSValue> mixins.
+  // _CSSValue is the element type.
 
-  // From Iterable<CssValue>:
+  // From Iterable<_CSSValue>:
 
-  Iterator<CssValue> get iterator {
+  Iterator<_CSSValue> get iterator {
     // Note: NodeLists are not fixed size. And most probably length shouldn't
     // be cached in both iterator _and_ forEach method. For now caching it
     // for consistency.
-    return new FixedSizeListIterator<CssValue>(this);
+    return new FixedSizeListIterator<_CSSValue>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, CssValue)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  _CSSValue reduce(_CSSValue combine(_CSSValue value, _CSSValue element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, CssValue)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, _CSSValue element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
-  bool contains(CssValue element) => IterableMixinWorkaround.contains(this, element);
+  bool contains(_CSSValue element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(CssValue element)) => IterableMixinWorkaround.forEach(this, f);
+  void forEach(void f(_CSSValue element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
-  Iterable map(f(CssValue element)) =>
+  Iterable map(f(_CSSValue element)) =>
       IterableMixinWorkaround.mapList(this, f);
 
-  Iterable<CssValue> where(bool f(CssValue element)) =>
+  Iterable<_CSSValue> where(bool f(_CSSValue element)) =>
       IterableMixinWorkaround.where(this, f);
 
-  Iterable expand(Iterable f(CssValue element)) =>
+  Iterable expand(Iterable f(_CSSValue element)) =>
       IterableMixinWorkaround.expand(this, f);
 
-  bool every(bool f(CssValue element)) => IterableMixinWorkaround.every(this, f);
+  bool every(bool f(_CSSValue element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(CssValue element)) => IterableMixinWorkaround.any(this, f);
+  bool any(bool f(_CSSValue element)) => IterableMixinWorkaround.any(this, f);
 
-  List<CssValue> toList({ bool growable: true }) =>
-      new List<CssValue>.from(this, growable: growable);
+  List<_CSSValue> toList({ bool growable: true }) =>
+      new List<_CSSValue>.from(this, growable: growable);
 
-  Set<CssValue> toSet() => new Set<CssValue>.from(this);
+  Set<_CSSValue> toSet() => new Set<_CSSValue>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  Iterable<CssValue> take(int n) => IterableMixinWorkaround.takeList(this, n);
+  Iterable<_CSSValue> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
-  Iterable<CssValue> takeWhile(bool test(CssValue value)) {
+  Iterable<_CSSValue> takeWhile(bool test(_CSSValue value)) {
     return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  Iterable<CssValue> skip(int n) => IterableMixinWorkaround.skipList(this, n);
+  Iterable<_CSSValue> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
-  Iterable<CssValue> skipWhile(bool test(CssValue value)) {
+  Iterable<_CSSValue> skipWhile(bool test(_CSSValue value)) {
     return IterableMixinWorkaround.skipWhile(this, test);
   }
 
-  CssValue firstWhere(bool test(CssValue value), { CssValue orElse() }) {
+  _CSSValue firstWhere(bool test(_CSSValue value), { _CSSValue orElse() }) {
     return IterableMixinWorkaround.firstWhere(this, test, orElse);
   }
 
-  CssValue lastWhere(bool test(CssValue value), {CssValue orElse()}) {
+  _CSSValue lastWhere(bool test(_CSSValue value), {_CSSValue orElse()}) {
     return IterableMixinWorkaround.lastWhereList(this, test, orElse);
   }
 
-  CssValue singleWhere(bool test(CssValue value)) {
+  _CSSValue singleWhere(bool test(_CSSValue value)) {
     return IterableMixinWorkaround.singleWhere(this, test);
   }
 
-  CssValue elementAt(int index) {
+  _CSSValue elementAt(int index) {
     return this[index];
   }
 
-  // From Collection<CssValue>:
+  // From Collection<_CSSValue>:
 
-  void add(CssValue value) {
+  void add(_CSSValue value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addAll(Iterable<CssValue> iterable) {
+  void addAll(Iterable<_CSSValue> iterable) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  // From List<CssValue>:
+  // From List<_CSSValue>:
   void set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -29106,53 +27824,47 @@
     throw new UnsupportedError("Cannot clear immutable List.");
   }
 
-  Iterable<CssValue> get reversed {
+  Iterable<_CSSValue> get reversed {
     return IterableMixinWorkaround.reversedList(this);
   }
 
-  void sort([int compare(CssValue a, CssValue b)]) {
+  void sort([int compare(_CSSValue a, _CSSValue b)]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(CssValue element, [int start = 0]) =>
+  int indexOf(_CSSValue element, [int start = 0]) =>
       Lists.indexOf(this, element, start, this.length);
 
-  int lastIndexOf(CssValue element, [int start]) {
+  int lastIndexOf(_CSSValue element, [int start]) {
     if (start == null) start = length - 1;
     return Lists.lastIndexOf(this, element, start);
   }
 
-  CssValue get first {
+  _CSSValue get first {
     if (this.length > 0) return this[0];
     throw new StateError("No elements");
   }
 
-  CssValue get last {
+  _CSSValue get last {
     if (this.length > 0) return this[this.length - 1];
     throw new StateError("No elements");
   }
 
-  CssValue get single {
+  _CSSValue get single {
     if (length == 1) return this[0];
     if (length == 0) throw new StateError("No elements");
     throw new StateError("More than one element");
   }
 
-  CssValue min([int compare(CssValue a, CssValue b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  CssValue max([int compare(CssValue a, CssValue b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
-  void insert(int index, CssValue element) {
+  void insert(int index, _CSSValue element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  CssValue removeAt(int pos) {
+  _CSSValue removeAt(int pos) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  CssValue removeLast() {
+  _CSSValue removeLast() {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
@@ -29160,23 +27872,15 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
+  void removeWhere(bool test(_CSSValue element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void retainAll(Iterable elements) {
+  void retainWhere(bool test(_CSSValue element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeWhere(bool test(CssValue element)) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainWhere(bool test(CssValue element)) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<CssValue> from, [int startFrom]) {
+  void setRange(int start, int rangeLength, List<_CSSValue> from, [int startFrom]) {
     throw new UnsupportedError("Cannot setRange on immutable List.");
   }
 
@@ -29184,26 +27888,126 @@
     throw new UnsupportedError("Cannot removeRange on immutable List.");
   }
 
-  void insertRange(int start, int rangeLength, [CssValue initialValue]) {
+  void insertRange(int start, int rangeLength, [_CSSValue initialValue]) {
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
-  List<CssValue> sublist(int start, [int end]) {
+  Iterable<_CSSValue> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
+  List<_CSSValue> sublist(int start, [int end]) {
     if (end == null) end = length;
-    return Lists.getRange(this, start, end, <CssValue>[]);
+    return Lists.getRange(this, start, end, <_CSSValue>[]);
   }
 
-  List<CssValue> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
-  Map<int, CssValue> asMap() =>
+  Map<int, _CSSValue> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
-  // -- end List<CssValue> mixins.
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
+  // -- end List<_CSSValue> mixins.
 
   @DomName('CSSValueList.item')
   @DocsEditable
-  CssValue item(int index) native "CSSValueList_item_Callback";
+  _CSSValue item(int index) native "CSSValueList_item_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('DOMFileSystemSync')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@Experimental
+abstract class _DOMFileSystemSync extends NativeFieldWrapperClass1 {
+  _DOMFileSystemSync.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('DedicatedWorkerContext')
+abstract class _DedicatedWorkerContext extends _WorkerContext {
+  _DedicatedWorkerContext.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('DirectoryEntrySync')
+abstract class _DirectoryEntrySync extends _EntrySync {
+  _DirectoryEntrySync.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('DirectoryReaderSync')
+abstract class _DirectoryReaderSync extends NativeFieldWrapperClass1 {
+  _DirectoryReaderSync.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('WebKitPoint')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.SAFARI)
+@Experimental
+class _DomPoint extends NativeFieldWrapperClass1 {
+  _DomPoint.internal();
+  factory _DomPoint(num x, num y) => _create(x, y);
+
+  @DocsEditable
+  static _DomPoint _create(x, y) native "WebKitPoint_constructorCallback";
+
+  /// Checks if this type is supported on the current platform.
+  static bool get supported => true;
+
+  @DomName('WebKitPoint.x')
+  @DocsEditable
+  num get x native "WebKitPoint_x_Getter";
+
+  @DomName('WebKitPoint.x')
+  @DocsEditable
+  void set x(num value) native "WebKitPoint_x_Setter";
+
+  @DomName('WebKitPoint.y')
+  @DocsEditable
+  num get y native "WebKitPoint_y_Getter";
+
+  @DomName('WebKitPoint.y')
+  @DocsEditable
+  void set y(num value) native "WebKitPoint_y_Setter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29382,11 +28186,12 @@
     return new FixedSizeListIterator<Entry>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Entry)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Entry reduce(Entry combine(Entry value, Entry element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Entry)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Entry element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -29394,7 +28199,7 @@
 
   void forEach(void f(Entry element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Entry element)) =>
@@ -29496,12 +28301,6 @@
     throw new StateError("More than one element");
   }
 
-  Entry min([int compare(Entry a, Entry b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Entry max([int compare(Entry a, Entry b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Entry element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -29518,14 +28317,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Entry element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -29546,17 +28337,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Entry> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Entry> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Entry>[]);
   }
 
-  List<Entry> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Entry> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Entry> mixins.
 
   @DomName('EntryArray.item')
@@ -29573,104 +28371,105 @@
 
 @DocsEditable
 @DomName('EntryArraySync')
-class _EntryArraySync extends NativeFieldWrapperClass1 implements List<EntrySync> {
+class _EntryArraySync extends NativeFieldWrapperClass1 implements List<_EntrySync> {
   _EntryArraySync.internal();
 
   @DomName('EntryArraySync.length')
   @DocsEditable
   int get length native "EntryArraySync_length_Getter";
 
-  EntrySync operator[](int index) native "EntryArraySync_item_Callback";
+  _EntrySync operator[](int index) native "EntryArraySync_item_Callback";
 
-  void operator[]=(int index, EntrySync value) {
+  void operator[]=(int index, _EntrySync value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
-  // -- start List<EntrySync> mixins.
-  // EntrySync is the element type.
+  // -- start List<_EntrySync> mixins.
+  // _EntrySync is the element type.
 
-  // From Iterable<EntrySync>:
+  // From Iterable<_EntrySync>:
 
-  Iterator<EntrySync> get iterator {
+  Iterator<_EntrySync> get iterator {
     // Note: NodeLists are not fixed size. And most probably length shouldn't
     // be cached in both iterator _and_ forEach method. For now caching it
     // for consistency.
-    return new FixedSizeListIterator<EntrySync>(this);
+    return new FixedSizeListIterator<_EntrySync>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, EntrySync)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  _EntrySync reduce(_EntrySync combine(_EntrySync value, _EntrySync element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, EntrySync)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, _EntrySync element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
-  bool contains(EntrySync element) => IterableMixinWorkaround.contains(this, element);
+  bool contains(_EntrySync element) => IterableMixinWorkaround.contains(this, element);
 
-  void forEach(void f(EntrySync element)) => IterableMixinWorkaround.forEach(this, f);
+  void forEach(void f(_EntrySync element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
-  Iterable map(f(EntrySync element)) =>
+  Iterable map(f(_EntrySync element)) =>
       IterableMixinWorkaround.mapList(this, f);
 
-  Iterable<EntrySync> where(bool f(EntrySync element)) =>
+  Iterable<_EntrySync> where(bool f(_EntrySync element)) =>
       IterableMixinWorkaround.where(this, f);
 
-  Iterable expand(Iterable f(EntrySync element)) =>
+  Iterable expand(Iterable f(_EntrySync element)) =>
       IterableMixinWorkaround.expand(this, f);
 
-  bool every(bool f(EntrySync element)) => IterableMixinWorkaround.every(this, f);
+  bool every(bool f(_EntrySync element)) => IterableMixinWorkaround.every(this, f);
 
-  bool any(bool f(EntrySync element)) => IterableMixinWorkaround.any(this, f);
+  bool any(bool f(_EntrySync element)) => IterableMixinWorkaround.any(this, f);
 
-  List<EntrySync> toList({ bool growable: true }) =>
-      new List<EntrySync>.from(this, growable: growable);
+  List<_EntrySync> toList({ bool growable: true }) =>
+      new List<_EntrySync>.from(this, growable: growable);
 
-  Set<EntrySync> toSet() => new Set<EntrySync>.from(this);
+  Set<_EntrySync> toSet() => new Set<_EntrySync>.from(this);
 
   bool get isEmpty => this.length == 0;
 
-  Iterable<EntrySync> take(int n) => IterableMixinWorkaround.takeList(this, n);
+  Iterable<_EntrySync> take(int n) => IterableMixinWorkaround.takeList(this, n);
 
-  Iterable<EntrySync> takeWhile(bool test(EntrySync value)) {
+  Iterable<_EntrySync> takeWhile(bool test(_EntrySync value)) {
     return IterableMixinWorkaround.takeWhile(this, test);
   }
 
-  Iterable<EntrySync> skip(int n) => IterableMixinWorkaround.skipList(this, n);
+  Iterable<_EntrySync> skip(int n) => IterableMixinWorkaround.skipList(this, n);
 
-  Iterable<EntrySync> skipWhile(bool test(EntrySync value)) {
+  Iterable<_EntrySync> skipWhile(bool test(_EntrySync value)) {
     return IterableMixinWorkaround.skipWhile(this, test);
   }
 
-  EntrySync firstWhere(bool test(EntrySync value), { EntrySync orElse() }) {
+  _EntrySync firstWhere(bool test(_EntrySync value), { _EntrySync orElse() }) {
     return IterableMixinWorkaround.firstWhere(this, test, orElse);
   }
 
-  EntrySync lastWhere(bool test(EntrySync value), {EntrySync orElse()}) {
+  _EntrySync lastWhere(bool test(_EntrySync value), {_EntrySync orElse()}) {
     return IterableMixinWorkaround.lastWhereList(this, test, orElse);
   }
 
-  EntrySync singleWhere(bool test(EntrySync value)) {
+  _EntrySync singleWhere(bool test(_EntrySync value)) {
     return IterableMixinWorkaround.singleWhere(this, test);
   }
 
-  EntrySync elementAt(int index) {
+  _EntrySync elementAt(int index) {
     return this[index];
   }
 
-  // From Collection<EntrySync>:
+  // From Collection<_EntrySync>:
 
-  void add(EntrySync value) {
+  void add(_EntrySync value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addAll(Iterable<EntrySync> iterable) {
+  void addAll(Iterable<_EntrySync> iterable) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  // From List<EntrySync>:
+  // From List<_EntrySync>:
   void set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -29679,53 +28478,47 @@
     throw new UnsupportedError("Cannot clear immutable List.");
   }
 
-  Iterable<EntrySync> get reversed {
+  Iterable<_EntrySync> get reversed {
     return IterableMixinWorkaround.reversedList(this);
   }
 
-  void sort([int compare(EntrySync a, EntrySync b)]) {
+  void sort([int compare(_EntrySync a, _EntrySync b)]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(EntrySync element, [int start = 0]) =>
+  int indexOf(_EntrySync element, [int start = 0]) =>
       Lists.indexOf(this, element, start, this.length);
 
-  int lastIndexOf(EntrySync element, [int start]) {
+  int lastIndexOf(_EntrySync element, [int start]) {
     if (start == null) start = length - 1;
     return Lists.lastIndexOf(this, element, start);
   }
 
-  EntrySync get first {
+  _EntrySync get first {
     if (this.length > 0) return this[0];
     throw new StateError("No elements");
   }
 
-  EntrySync get last {
+  _EntrySync get last {
     if (this.length > 0) return this[this.length - 1];
     throw new StateError("No elements");
   }
 
-  EntrySync get single {
+  _EntrySync get single {
     if (length == 1) return this[0];
     if (length == 0) throw new StateError("No elements");
     throw new StateError("More than one element");
   }
 
-  EntrySync min([int compare(EntrySync a, EntrySync b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  EntrySync max([int compare(EntrySync a, EntrySync b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
-  void insert(int index, EntrySync element) {
+  void insert(int index, _EntrySync element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  EntrySync removeAt(int pos) {
+  _EntrySync removeAt(int pos) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  EntrySync removeLast() {
+  _EntrySync removeLast() {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
@@ -29733,23 +28526,15 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
+  void removeWhere(bool test(_EntrySync element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void retainAll(Iterable elements) {
+  void retainWhere(bool test(_EntrySync element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeWhere(bool test(EntrySync element)) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainWhere(bool test(EntrySync element)) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<EntrySync> from, [int startFrom]) {
+  void setRange(int start, int rangeLength, List<_EntrySync> from, [int startFrom]) {
     throw new UnsupportedError("Cannot setRange on immutable List.");
   }
 
@@ -29757,26 +28542,94 @@
     throw new UnsupportedError("Cannot removeRange on immutable List.");
   }
 
-  void insertRange(int start, int rangeLength, [EntrySync initialValue]) {
+  void insertRange(int start, int rangeLength, [_EntrySync initialValue]) {
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
-  List<EntrySync> sublist(int start, [int end]) {
+  Iterable<_EntrySync> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
+  List<_EntrySync> sublist(int start, [int end]) {
     if (end == null) end = length;
-    return Lists.getRange(this, start, end, <EntrySync>[]);
+    return Lists.getRange(this, start, end, <_EntrySync>[]);
   }
 
-  List<EntrySync> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
-  Map<int, EntrySync> asMap() =>
+  Map<int, _EntrySync> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
-  // -- end List<EntrySync> mixins.
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
+  // -- end List<_EntrySync> mixins.
 
   @DomName('EntryArraySync.item')
   @DocsEditable
-  EntrySync item(int index) native "EntryArraySync_item_Callback";
+  _EntrySync item(int index) native "EntryArraySync_item_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('EntrySync')
+abstract class _EntrySync extends NativeFieldWrapperClass1 {
+  _EntrySync.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('FileEntrySync')
+abstract class _FileEntrySync extends _EntrySync {
+  _FileEntrySync.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('FileReaderSync')
+abstract class _FileReaderSync extends NativeFieldWrapperClass1 {
+  _FileReaderSync.internal();
+
+  @DomName('FileReaderSync.FileReaderSync')
+  @DocsEditable
+  factory _FileReaderSync() {
+    return _FileReaderSync._create_1();
+  }
+
+  @DocsEditable
+  static _FileReaderSync _create_1() native "FileReaderSync__create_1constructorCallback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('FileWriterSync')
+abstract class _FileWriterSync extends NativeFieldWrapperClass1 {
+  _FileWriterSync.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29812,11 +28665,12 @@
     return new FixedSizeListIterator<Gamepad>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Gamepad)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Gamepad reduce(Gamepad combine(Gamepad value, Gamepad element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Gamepad)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Gamepad element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -29824,7 +28678,7 @@
 
   void forEach(void f(Gamepad element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Gamepad element)) =>
@@ -29926,12 +28780,6 @@
     throw new StateError("More than one element");
   }
 
-  Gamepad min([int compare(Gamepad a, Gamepad b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Gamepad max([int compare(Gamepad a, Gamepad b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Gamepad element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -29948,14 +28796,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Gamepad element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -29976,17 +28816,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Gamepad> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Gamepad> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Gamepad>[]);
   }
 
-  List<Gamepad> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Gamepad> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Gamepad> mixins.
 
   @DomName('GamepadList.item')
@@ -30003,7 +28850,7 @@
 
 @DocsEditable
 @DomName('HTMLAppletElement')
-class _HTMLAppletElement extends _Element_Merged {
+abstract class _HTMLAppletElement extends _Element_Merged {
   _HTMLAppletElement.internal() : super.internal();
 
 }
@@ -30016,7 +28863,7 @@
 
 @DocsEditable
 @DomName('HTMLBaseFontElement')
-class _HTMLBaseFontElement extends _Element_Merged {
+abstract class _HTMLBaseFontElement extends _Element_Merged {
   _HTMLBaseFontElement.internal() : super.internal();
 
 }
@@ -30029,7 +28876,7 @@
 
 @DocsEditable
 @DomName('HTMLDirectoryElement')
-class _HTMLDirectoryElement extends _Element_Merged {
+abstract class _HTMLDirectoryElement extends _Element_Merged {
   _HTMLDirectoryElement.internal() : super.internal();
 
 }
@@ -30042,7 +28889,7 @@
 
 @DocsEditable
 @DomName('HTMLFontElement')
-class _HTMLFontElement extends _Element_Merged {
+abstract class _HTMLFontElement extends _Element_Merged {
   _HTMLFontElement.internal() : super.internal();
 
 }
@@ -30055,7 +28902,7 @@
 
 @DocsEditable
 @DomName('HTMLFrameElement')
-class _HTMLFrameElement extends _Element_Merged {
+abstract class _HTMLFrameElement extends _Element_Merged {
   _HTMLFrameElement.internal() : super.internal();
 
 }
@@ -30068,7 +28915,7 @@
 
 @DocsEditable
 @DomName('HTMLFrameSetElement')
-class _HTMLFrameSetElement extends _Element_Merged {
+abstract class _HTMLFrameSetElement extends _Element_Merged {
   _HTMLFrameSetElement.internal() : super.internal();
 
 }
@@ -30081,7 +28928,7 @@
 
 @DocsEditable
 @DomName('HTMLMarqueeElement')
-class _HTMLMarqueeElement extends _Element_Merged {
+abstract class _HTMLMarqueeElement extends _Element_Merged {
   _HTMLMarqueeElement.internal() : super.internal();
 
 }
@@ -30118,11 +28965,12 @@
     return new FixedSizeListIterator<Node>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Node reduce(Node combine(Node value, Node element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Node)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Node element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -30130,7 +28978,7 @@
 
   void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Node element)) =>
@@ -30232,12 +29080,6 @@
     throw new StateError("More than one element");
   }
 
-  Node min([int compare(Node a, Node b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Node max([int compare(Node a, Node b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Node element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -30254,14 +29096,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Node element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -30282,17 +29116,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Node> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Node> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Node>[]);
   }
 
-  List<Node> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Node> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Node> mixins.
 
   @DomName('NamedNodeMap.getNamedItem')
@@ -30332,6 +29173,67 @@
 
 
 @DocsEditable
+@DomName('RGBColor')
+abstract class _RGBColor extends NativeFieldWrapperClass1 {
+  _RGBColor.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('Rect')
+abstract class _Rect extends NativeFieldWrapperClass1 {
+  _Rect.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('SharedWorker')
+abstract class _SharedWorker extends AbstractWorker {
+  _SharedWorker.internal() : super.internal();
+
+  @DomName('SharedWorker.SharedWorker')
+  @DocsEditable
+  factory _SharedWorker(String scriptURL, [String name]) {
+    return _SharedWorker._create_1(scriptURL, name);
+  }
+
+  @DocsEditable
+  static _SharedWorker _create_1(scriptURL, name) native "SharedWorker__create_1constructorCallback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('SharedWorkerContext')
+abstract class _SharedWorkerContext extends _WorkerContext {
+  _SharedWorkerContext.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
 @DomName('SpeechInputResultList')
 class _SpeechInputResultList extends NativeFieldWrapperClass1 implements List<SpeechInputResult> {
   _SpeechInputResultList.internal();
@@ -30357,11 +29259,12 @@
     return new FixedSizeListIterator<SpeechInputResult>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SpeechInputResult)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  SpeechInputResult reduce(SpeechInputResult combine(SpeechInputResult value, SpeechInputResult element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, SpeechInputResult)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, SpeechInputResult element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -30369,7 +29272,7 @@
 
   void forEach(void f(SpeechInputResult element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(SpeechInputResult element)) =>
@@ -30471,12 +29374,6 @@
     throw new StateError("More than one element");
   }
 
-  SpeechInputResult min([int compare(SpeechInputResult a, SpeechInputResult b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  SpeechInputResult max([int compare(SpeechInputResult a, SpeechInputResult b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, SpeechInputResult element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -30493,14 +29390,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(SpeechInputResult element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -30521,17 +29410,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<SpeechInputResult> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<SpeechInputResult> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <SpeechInputResult>[]);
   }
 
-  List<SpeechInputResult> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, SpeechInputResult> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<SpeechInputResult> mixins.
 
   @DomName('SpeechInputResultList.item')
@@ -30572,11 +29468,12 @@
     return new FixedSizeListIterator<SpeechRecognitionResult>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SpeechRecognitionResult)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  SpeechRecognitionResult reduce(SpeechRecognitionResult combine(SpeechRecognitionResult value, SpeechRecognitionResult element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, SpeechRecognitionResult)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, SpeechRecognitionResult element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -30584,7 +29481,7 @@
 
   void forEach(void f(SpeechRecognitionResult element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(SpeechRecognitionResult element)) =>
@@ -30686,12 +29583,6 @@
     throw new StateError("More than one element");
   }
 
-  SpeechRecognitionResult min([int compare(SpeechRecognitionResult a, SpeechRecognitionResult b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  SpeechRecognitionResult max([int compare(SpeechRecognitionResult a, SpeechRecognitionResult b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, SpeechRecognitionResult element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -30708,14 +29599,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(SpeechRecognitionResult element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -30736,17 +29619,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<SpeechRecognitionResult> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<SpeechRecognitionResult> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <SpeechRecognitionResult>[]);
   }
 
-  List<SpeechRecognitionResult> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, SpeechRecognitionResult> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<SpeechRecognitionResult> mixins.
 
   @DomName('SpeechRecognitionResultList.item')
@@ -30787,11 +29677,12 @@
     return new FixedSizeListIterator<StyleSheet>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, StyleSheet)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  StyleSheet reduce(StyleSheet combine(StyleSheet value, StyleSheet element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, StyleSheet)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, StyleSheet element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -30799,7 +29690,7 @@
 
   void forEach(void f(StyleSheet element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(StyleSheet element)) =>
@@ -30901,12 +29792,6 @@
     throw new StateError("More than one element");
   }
 
-  StyleSheet min([int compare(StyleSheet a, StyleSheet b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  StyleSheet max([int compare(StyleSheet a, StyleSheet b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, StyleSheet element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -30923,14 +29808,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(StyleSheet element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -30951,17 +29828,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<StyleSheet> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<StyleSheet> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <StyleSheet>[]);
   }
 
-  List<StyleSheet> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, StyleSheet> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<StyleSheet> mixins.
 
   @DomName('StyleSheetList.item')
@@ -30973,6 +29857,70 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('WebKitCSSFilterValue')
+abstract class _WebKitCSSFilterValue extends _CssValueList {
+  _WebKitCSSFilterValue.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('WebKitCSSMatrix')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.SAFARI)
+@Experimental
+abstract class _WebKitCSSMatrix extends NativeFieldWrapperClass1 {
+  _WebKitCSSMatrix.internal();
+
+  @DomName('WebKitCSSMatrix.WebKitCSSMatrix')
+  @DocsEditable
+  factory _WebKitCSSMatrix([String cssValue]) {
+    return _WebKitCSSMatrix._create_1(cssValue);
+  }
+
+  @DocsEditable
+  static _WebKitCSSMatrix _create_1(cssValue) native "WebKitCSSMatrix__create_1constructorCallback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('WebKitCSSMixFunctionValue')
+abstract class _WebKitCSSMixFunctionValue extends _CssValueList {
+  _WebKitCSSMixFunctionValue.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('WebKitCSSTransformValue')
+abstract class _WebKitCSSTransformValue extends _CssValueList {
+  _WebKitCSSTransformValue.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 
 // This class maps WebKitTransitionEvent to TransitionEvent for older Chrome
 // browser versions.
@@ -30996,6 +29944,45 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('WorkerContext')
+abstract class _WorkerContext extends EventTarget {
+  _WorkerContext.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('WorkerLocation')
+abstract class _WorkerLocation extends NativeFieldWrapperClass1 {
+  _WorkerLocation.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('WorkerNavigator')
+abstract class _WorkerNavigator extends NativeFieldWrapperClass1 {
+  _WorkerNavigator.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 
 abstract class _AttributeMap implements Map<String, String> {
   final Element _element;
@@ -31031,19 +30018,19 @@
     }
   }
 
-  Collection<String> get keys {
+  Iterable<String> get keys {
     // TODO: generate a lazy collection instead.
     var attributes = _element.$dom_attributes;
     var keys = new List<String>();
     for (int i = 0, len = attributes.length; i < len; i++) {
       if (_matches(attributes[i])) {
-        keys.add(attributes[i].$dom_localName);
+        keys.add(attributes[i].localName);
       }
     }
     return keys;
   }
 
-  Collection<String> get values {
+  Iterable<String> get values {
     // TODO: generate a lazy collection instead.
     var attributes = _element.$dom_attributes;
     var values = new List<String>();
@@ -31184,7 +30171,7 @@
     });
   }
 
-  Collection<String> get keys {
+  Iterable<String> get keys {
     final keys = new List<String>();
     $dom_attributes.forEach((String key, String value) {
       if (_matches(key)) {
@@ -31194,7 +30181,7 @@
     return keys;
   }
 
-  Collection<String> get values {
+  Iterable<String> get values {
     final values = new List<String>();
     $dom_attributes.forEach((String key, String value) {
       if (_matches(key)) {
@@ -31419,7 +30406,7 @@
     readClasses().forEach(f);
   }
 
-  String join([String separator]) => readClasses().join(separator);
+  String join([String separator = ""]) => readClasses().join(separator);
 
   Iterable map(f(String element)) => readClasses().map(f);
 
@@ -31435,9 +30422,8 @@
 
   int get length => readClasses().length;
 
-  dynamic reduce(dynamic initialValue,
-      dynamic combine(dynamic previousValue, String element)) {
-    return readClasses().reduce(initialValue, combine);
+  String reduce(String combine(String value, String element)) {
+    return readClasses().reduce(combine);
   }
 
   dynamic fold(dynamic initialValue,
@@ -31526,9 +30512,6 @@
     _modify((s) => s.retainWhere(test));
   }
 
-  bool isSubsetOf(Collection<String> collection) =>
-    readClasses().isSubsetOf(collection);
-
   bool containsAll(Iterable<String> collection) =>
     readClasses().containsAll(collection);
 
@@ -31547,10 +30530,6 @@
   List<String> toList({ bool growable: true }) =>
       readClasses().toList(growable: growable);
   Set<String> toSet() => readClasses().toSet();
-  String min([int compare(String a, String b)]) =>
-      readClasses().min(compare);
-  String max([int compare(String a, String b)]) =>
-      readClasses().max(compare);
   Iterable<String> take(int n) => readClasses().take(n);
   Iterable<String> takeWhile(bool test(String value)) =>
       readClasses().takeWhile(test);
@@ -31604,7 +30583,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-typedef void EventListener(Event event);
+typedef EventListener(Event event);
 // 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.
@@ -33260,6 +32239,59 @@
 
 
 /**
+ * Helper class to implement custom events which wrap DOM events.
+ */
+class _WrappedEvent implements Event {
+  final Event wrapped;
+  _WrappedEvent(this.wrapped);
+
+  bool get bubbles => wrapped.bubbles;
+
+  bool get cancelBubble => wrapped.bubbles;
+  void set cancelBubble(bool value) {
+    wrapped.cancelBubble = value;
+  }
+
+  bool get cancelable => wrapped.cancelable;
+
+  DataTransfer get clipboardData => wrapped.clipboardData;
+
+  EventTarget get currentTarget => wrapped.currentTarget;
+
+  bool get defaultPrevented => wrapped.defaultPrevented;
+
+  int get eventPhase => wrapped.eventPhase;
+
+  EventTarget get target => wrapped.target;
+
+  int get timeStamp => wrapped.timeStamp;
+
+  String get type => wrapped.type;
+
+  void $dom_initEvent(String eventTypeArg, bool canBubbleArg,
+      bool cancelableArg) {
+    throw new UnsupportedError(
+        'Cannot initialize this Event.');
+  }
+
+  void preventDefault() {
+    wrapped.preventDefault();
+  }
+
+  void stopImmediatePropagation() {
+    wrapped.stopImmediatePropagation();
+  }
+
+  void stopPropagation() {
+    wrapped.stopPropagation();
+  }
+}
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/**
  * A list which just wraps another list, for either intercepting list calls or
  * retyping the list (for example, from List<A> to List<B> where B extends A).
  */
@@ -33282,15 +32314,15 @@
 
   void forEach(void f(E element)) { _list.forEach(f); }
 
-  dynamic reduce(initialValue, combine(previousValue, E element)) =>
-      _list.reduce(initialValue, combine);
+  E reduce(E combine(E value, E element)) =>
+      _list.reduce(combine);
 
   dynamic fold(initialValue, combine(previousValue, E element)) =>
       _list.fold(initialValue, combine);
 
   bool every(bool f(E element)) => _list.every(f);
 
-  String join([String separator]) => _list.join(separator);
+  String join([String separator = ""]) => _list.join(separator);
 
   bool any(bool f(E element)) => _list.any(f);
 
@@ -33301,10 +32333,6 @@
 
   int get length => _list.length;
 
-  E min([int compare(E a, E b)]) => _list.min(compare);
-
-  E max([int compare(E a, E b)]) => _list.max(compare);
-
   bool get isEmpty => _list.isEmpty;
 
   Iterable<E> take(int n) => _list.take(n);
@@ -33339,10 +32367,6 @@
 
   void remove(Object element) { _list.remove(element); }
 
-  void removeAll(Iterable elements) { _list.removeAll(elements); }
-
-  void retainAll(Iterable elements) { _list.retainAll(elements); }
-
   void removeWhere(bool test(E element)) { _list.removeWhere(test); }
 
   void retainWhere(bool test(E element)) { _list.retainWhere(test); }
@@ -33373,7 +32397,7 @@
 
   List<E> sublist(int start, [int end]) => _list.sublist(start, end);
 
-  List<E> getRange(int start, int length) => sublist(start, start + length);
+  Iterable<E> getRange(int start, int end) => _list.getRange(start, end);
 
   void setRange(int start, int length, List<E> from, [int startFrom]) {
     _list.setRange(start, length, from, startFrom);
@@ -33385,7 +32409,14 @@
     _list.insertRange(start, length, fill);
   }
 
-  Map<int, E> asMap() => IterableMixinWorkaround.asMapList(_list);
+  Map<int, E> asMap() => _list.asMap();
+
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
 }
 
 /**
@@ -33492,7 +32523,7 @@
  * on how we can make this class work with as many international keyboards as
  * possible. Bugs welcome!
  */
-class KeyEvent implements KeyboardEvent {
+class KeyEvent extends _WrappedEvent implements KeyboardEvent {
   /** The parent KeyboardEvent that this KeyEvent is wrapping and "fixing". */
   KeyboardEvent _parent;
 
@@ -33527,7 +32558,7 @@
   bool get _realAltKey => _parent.altKey;
 
   /** Construct a KeyEvent with [parent] as the event we're emulating. */
-  KeyEvent(KeyboardEvent parent) {
+  KeyEvent(KeyboardEvent parent): super(parent) {
     _parent = parent;
     _shadowAltKey = _realAltKey;
     _shadowCharCode = _realCharCode;
@@ -33546,22 +32577,9 @@
 
   /** True if the altGraphKey is pressed during this event. */
   bool get altGraphKey => _parent.altGraphKey;
-  bool get bubbles => _parent.bubbles;
-  /** True if this event can be cancelled. */
-  bool get cancelable => _parent.cancelable;
-  bool get cancelBubble => _parent.cancelBubble;
-  void set cancelBubble(bool cancel) {
-    _parent.cancelBubble = cancel;
-  }
-  /** Accessor to the clipboardData available for this event. */
-  DataTransfer get clipboardData => _parent.clipboardData;
   /** True if the ctrl key is pressed during this event. */
   bool get ctrlKey => _parent.ctrlKey;
-  /** Accessor to the target this event is listening to for changes. */
-  EventTarget get currentTarget => _parent.currentTarget;
-  bool get defaultPrevented => _parent.defaultPrevented;
   int get detail => _parent.detail;
-  int get eventPhase => _parent.eventPhase;
   /**
    * Accessor to the part of the keyboard that the key was pressed from (one of
    * KeyLocation.STANDARD, KeyLocation.RIGHT, KeyLocation.LEFT,
@@ -33572,35 +32590,17 @@
   /** True if the Meta (or Mac command) key is pressed during this event. */
   bool get metaKey => _parent.metaKey;
   Point get page => _parent.page;
-  bool get returnValue => _parent.returnValue;
-  void set returnValue(bool value) {
-    _parent.returnValue = value;
-  }
   /** True if the shift key was pressed during this event. */
   bool get shiftKey => _parent.shiftKey;
-  int get timeStamp => _parent.timeStamp;
-  /**
-   * The type of key event that occurred. One of "keydown", "keyup", or
-   * "keypress".
-   */
-  String get type => _parent.type;
   Window get view => _parent.view;
-  void preventDefault() => _parent.preventDefault();
-  void stopImmediatePropagation() => _parent.stopImmediatePropagation();
-  void stopPropagation() => _parent.stopPropagation();
   void $dom_initUIEvent(String type, bool canBubble, bool cancelable,
       Window view, int detail) {
     throw new UnsupportedError("Cannot initialize a UI Event from a KeyEvent.");
   }
-  void $dom_initEvent(String eventTypeArg, bool canBubbleArg,
-      bool cancelableArg) {
-    throw new UnsupportedError("Cannot initialize an Event from a KeyEvent.");
-  }
   String get _shadowKeyIdentifier => _parent.$dom_keyIdentifier;
 
   int get $dom_charCode => charCode;
   int get $dom_keyCode => keyCode;
-  EventTarget get target => _parent.target;
   String get $dom_keyIdentifier {
     throw new UnsupportedError("keyIdentifier is unsupported.");
   }
@@ -34472,8 +33472,8 @@
   String remove(String key) native "DOMStringMap_remove_Callback";
   void clear() => Maps.clear(this);
   void forEach(void f(String key, String value)) => Maps.forEach(this, f);
-  Collection<String> get keys native "DOMStringMap_getKeys_Callback";
-  Collection<String> get values => Maps.getValues(this);
+  Iterable<String> get keys native "DOMStringMap_getKeys_Callback";
+  Iterable<String> get values => Maps.getValues(this);
   int get length => Maps.length(this);
   bool get isEmpty => Maps.isEmpty(this);
 }
diff --git a/sdk/lib/html/html_common/filtered_element_list.dart b/sdk/lib/html/html_common/filtered_element_list.dart
index 43d004d..bb253e6 100644
--- a/sdk/lib/html/html_common/filtered_element_list.dart
+++ b/sdk/lib/html/html_common/filtered_element_list.dart
@@ -8,7 +8,7 @@
  * An indexable collection of a node's descendants in the document tree,
  * filtered so that only elements are in the collection.
  */
-class FilteredElementList implements List {
+class FilteredElementList extends ListBase<Element> {
   final Node _node;
   final List<Node> _childNodes;
 
@@ -49,7 +49,7 @@
     removeRange(newLength, len - newLength);
   }
 
-  String join([String separator]) => _filtered.join(separator);
+  String join([String separator = ""]) => _filtered.join(separator);
 
   void add(Element value) {
     _childNodes.add(value);
@@ -122,33 +122,14 @@
     }
   }
 
-  // Operations defined in terms of [Collections]' [remove].
 
-  void removeAll(Iterable elements) {
-    // This should be optimized to not use [remove] directly.
-    IterableMixinWorkaround.removeAll(this, elements);
-  }
-
-  void retainAll(Iterable elements) {
-    IterableMixinWorkaround.retainAll(this, elements);
-  }
-
-  void removeWhere(bool test(Element element)) {
-    IterableMixinWorkaround.removeWhere(this, test);
-  }
-
-  void retainWhere(bool test(Element element)) {
-    IterableMixinWorkaround.retainWhere(this, test);
-  }
-
-  dynamic reduce(dynamic initialValue,
-      dynamic combine(dynamic previousValue, Element element)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Element reduce(Element combine(Element value, Element element)) {
+    return _filtered.reduce(combine);
   }
 
   dynamic fold(dynamic initialValue,
       dynamic combine(dynamic previousValue, Element element)) {
-    return IterableMixinWorkaround.fold(this, initialValue, combine);
+    return _filtered.fold(initialValue, combine);
   }
 
   bool every(bool f(Element element)) => _filtered.every(f);
@@ -178,8 +159,8 @@
   Iterator<Element> get iterator => _filtered.iterator;
   List<Element> sublist(int start, [int end]) =>
     _filtered.sublist(start, end);
-  List<Element> getRange(int start, int rangeLength) =>
-    sublist(start, start + rangeLength);
+  Iterable<Element> getRange(int start, int end) =>
+    _filtered.getRange(start, end);
   int indexOf(Element element, [int start = 0]) =>
     _filtered.indexOf(element, start);
 
diff --git a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
index 79a467c..a6d84a6 100644
--- a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
+++ b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
@@ -1014,7 +1014,7 @@
         controller.close();
       } else {
         controller.add(cursor);
-        if (autoAdvance == true && controller.hasSubscribers) {
+        if (autoAdvance == true && controller.hasListener) {
           cursor.next();
         }
       }
@@ -1243,5 +1243,5 @@
 
 @DocsEditable
 @DomName('IDBAny')
-class _IDBAny native "*IDBAny" {
+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 0c150df..6fad318 100644
--- a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
+++ b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
@@ -1073,7 +1073,7 @@
         controller.close();
       } else {
         controller.add(cursor);
-        if (autoAdvance == true && controller.hasSubscribers) {
+        if (autoAdvance == true && controller.hasListener) {
           cursor.next();
         }
       }
@@ -1307,7 +1307,7 @@
 
 @DocsEditable
 @DomName('IDBAny')
-class _IDBAny extends NativeFieldWrapperClass1 {
+abstract class _IDBAny extends NativeFieldWrapperClass1 {
   _IDBAny.internal();
 
 }
diff --git a/sdk/lib/io/common.dart b/sdk/lib/io/common.dart
index d74105b..f4d6907 100644
--- a/sdk/lib/io/common.dart
+++ b/sdk/lib/io/common.dart
@@ -97,3 +97,7 @@
   // a user defined List type.
   external static bool _isBuiltinList(List buffer);
 }
+
+class _IOCrypto {
+  external static Uint8List getRandomBytes(int count);
+}
diff --git a/sdk/lib/io/directory.dart b/sdk/lib/io/directory.dart
index f9bcff5..8c0ad5a 100644
--- a/sdk/lib/io/directory.dart
+++ b/sdk/lib/io/directory.dart
@@ -87,10 +87,16 @@
   /**
    * Deletes this directory.
    *
-   * If [recursive] is false, the directory must be empty.
+   * If [recursive] is false, the directory must be empty.  Only directories
+   * and links to directories will be deleted.
    *
    * If [recursive] is true, this directory and all sub-directories
-   * and files in the directories are deleted.
+   * and files in the directories are deleted. Links are not followed
+   * when deleting recursively. Only the link is deleted, not its target.
+   *
+   * If [recursive] is true, the target is deleted even if it is a file, or
+   * a link to a file, not only if it is a directory.  This behavior allows
+   * [delete] to be used to unconditionally delete any file system object.
    *
    * Returns a [:Future<Directory>:] that completes with this
    * directory when the deletion is done. If the directory cannot be
@@ -104,7 +110,12 @@
    * If [recursive] is false, the directory must be empty.
    *
    * If [recursive] is true, this directory and all sub-directories
-   * and files in the directories are deleted.
+   * and files in the directories are deleted. Links are not followed
+   * when deleting recursively. Only the link is deleted, not its target.
+   *
+   * If [recursive] is true, the target is deleted even if it is a file, or
+   * a link to a file, not only if it is a directory.  This behavior allows
+   * [delete] to be used to unconditionally delete any file system object.
    *
    * Throws an exception if the directory cannot be deleted.
    */
@@ -135,9 +146,18 @@
    * Optionally recurses into sub-directories.
    *
    * If [followLinks] is false, then any symbolic links found
-   * are reported as links, rather than as directories or files,
+   * are reported as [Link] objects, rather than as directories or files,
    * and are not recursed into.
    *
+   * If [followLinks] is true, then working links are reported as
+   * directories or files, depending on
+   * their type, and links to directories are recursed into.
+   * Broken links are reported as [Link] objects.
+   * If a symbolic link makes a loop in the file system, then a recursive
+   * listing will not follow a link twice in the
+   * same recursive descent, but will report it as a [Link]
+   * the second time it is seen.
+   *
    * The result is a stream of [FileSystemEntity] objects
    * for the directories, files, and links.
    */
@@ -149,9 +169,18 @@
    * Optionally recurses into sub-directories.
    *
    * If [followLinks] is false, then any symbolic links found
-   * are reported as links, rather than as directories or files,
+   * are reported as [Link] objects, rather than as directories or files,
    * and are not recursed into.
    *
+   * If [followLinks] is true, then working links are reported as
+   * directories or files, depending on
+   * their type, and links to directories are recursed into.
+   * Broken links are reported as [Link] objects.
+   * If a link makes a loop in the file system, then a recursive
+   * listing will not follow a link twice in the
+   * same recursive descent, but will report it as a [Link]
+   * the second time it is seen.
+   *
    * Returns a [List] containing [FileSystemEntity] objects for the
    * directories, files, and links.
    */
diff --git a/sdk/lib/io/file.dart b/sdk/lib/io/file.dart
index 85aa1b3..4ebaa70 100644
--- a/sdk/lib/io/file.dart
+++ b/sdk/lib/io/file.dart
@@ -15,6 +15,9 @@
   final int _mode;
 }
 
+const READ = FileMode.READ;
+const WRITE = FileMode.WRITE;
+const APPEND = FileMode.APPEND;
 
 /**
  * [File] objects are references to files.
@@ -76,12 +79,14 @@
 
   /**
    * Delete the file. Returns a [:Future<File>:] that completes with
-   * the file when it has been deleted.
+   * the file when it has been deleted. Only a file or a link to a file
+   * can be deleted with this method, not a directory or a broken link.
    */
   Future<File> delete();
 
   /**
-   * Synchronously delete the file.
+   * Synchronously delete the file. Only a file or a link to a file
+   * can be deleted with this method, not a directory or a broken link.
    *
    * Throws a [FileIOException] if the operation fails.
    */
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index 57b8cd1..65f7adf 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -130,7 +130,7 @@
   }
 
   void _onSubscriptionStateChange() {
-    if (_controller.hasSubscribers) {
+    if (_controller.hasListener) {
       _start();
     } else {
       _unsubscribed = true;
@@ -147,11 +147,10 @@
   }
 }
 
-class _FileStreamConsumer extends StreamConsumer<List<int>, File> {
+class _FileStreamConsumer extends StreamConsumer<List<int>> {
   File _file;
   Future<RandomAccessFile> _openFuture;
   StreamSubscription _subscription;
-  
 
   _FileStreamConsumer(File this._file, FileMode mode) {
     _openFuture = _file.open(mode: mode);
@@ -220,6 +219,8 @@
 const int _READ_REQUEST = 16;
 const int _READ_LIST_REQUEST = 17;
 const int _WRITE_LIST_REQUEST = 18;
+const int _CREATE_LINK_REQUEST = 19;
+const int _DELETE_LINK_REQUEST = 20;
 
 // Base class for _File and _RandomAccessFile with shared functions.
 class _FileBase {
@@ -324,6 +325,8 @@
 
   external static _delete(String path);
 
+  external static _deleteLink(String path);
+
   void deleteSync() {
     var result = _delete(_path);
     throwIfError(result, "Cannot delete file '$_path'");
@@ -554,7 +557,7 @@
                             {FileMode mode: FileMode.WRITE}) {
     try {
       IOSink<File> sink = openWrite(mode: mode);
-      sink.writeBytes(bytes);
+      sink.add(bytes);
       sink.close();
       return sink.done.then((_) => this);;
     } catch (e) {
diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart
index 9a54af2..72fd67c 100644
--- a/sdk/lib/io/http.dart
+++ b/sdk/lib/io/http.dart
@@ -688,17 +688,17 @@
  * will be determined from the "charset" parameter of the
  * "Content-Type" header.
  *
- *   HttpResponse response = ...
- *   response.headers.contentType
- *       = new ContentType("application", "json", charset: "utf-8");
- *   response.write(...);  // Strings written will be UTF-8 encoded.
+ *     HttpResponse response = ...
+ *     response.headers.contentType
+ *         = new ContentType("application", "json", charset: "utf-8");
+ *     response.write(...);  // Strings written will be UTF-8 encoded.
  *
  * If no charset is provided the default of ISO-8859-1 (Latin 1) will
  * be used.
  *
- *   HttpResponse response = ...
- *   response.headers.add(HttpHeaders.CONTENT_TYPE, "text/plain");
- *   response.write(...);  // Strings written will be ISO-8859-1 encoded.
+ *     HttpResponse response = ...
+ *     response.headers.add(HttpHeaders.CONTENT_TYPE, "text/plain");
+ *     response.write(...);  // Strings written will be ISO-8859-1 encoded.
  *
  * If an unsupported encoding is used an exception will be thrown if
  * using one of the write methods taking a string.
@@ -762,13 +762,59 @@
 
 
 /**
- * HTTP client factory. The [HttpClient] handles all the sockets associated
- * with the [HttpClientConnection]s and when the endpoint supports it, it will
- * try to reuse opened sockets for several requests to support HTTP 1.1
- * persistent connections. This means that sockets will be kept open for some
- * time after a requests have completed, unless HTTP procedures indicate that it
- * must be closed as part of completing the request. Use [:HttpClient.close:]
- * to force close the idle sockets.
+ * The [HttpClient] class implements the client side of the HTTP
+ * protocol. It contains a number of methods to send a HTTP request
+ * to a HTTP server and receive a HTTP response back.
+ *
+ * This is a two-step process, triggered by two futures. When the
+ * first future completes with a [HttpClientRequest] the underlying
+ * network connection has been established, but no data has yet been
+ * sent. The HTTP headers and body can be set on the request, and
+ * [:close:] is called to sent it to the server.
+ *
+ * The second future, which is returned by [:close:], completes with
+ * an [HttpClientResponse] object when the response is received from
+ * the server. This object contains the headers and body of the
+ * response.
+
+ * The future for [HttpClientRequest] is created by methods such as
+ * [getUrl] and [open].
+ *
+ * When the HTTP response is ready a [HttpClientResponse] object is
+ * provided which provides access to the headers and body of the response.
+ *
+ *     HttpClient client = new HttpClient();
+ *     client.getUrl(new Uri.fromString("http://www.example.com/"))
+ *         .then((HttpClientRequest request) {
+ *           // Prepare the request then call close on it to send it.
+ *           return request.close();
+ *         })
+ *         .then((HttpClientResponse response) {
+ *          // Process the response.
+ *         });
+ *
+ * All [HttpClient] requests set the following header by default:
+ *
+ *     Accept-Encoding: gzip
+ *
+ * This allows the HTTP server to use gzip compression for the body if
+ * possible. If this behavior is not desired set the
+ * "Accept-Encoding" header to something else.
+ *
+ * The [HttpClient] supports persistent connections and caches network
+ * connections to reuse then for multiple requests whenever
+ * possible. This means that network connections can be kept open for
+ * some time after a request have completed. Use [:HttpClient.close:]
+ * to force shut down the [HttpClient] object and close the idle
+ * network connections.
+ *
+ * By default the HttpClient uses the proxy configuration available
+ * from the environment, see [findProxyFromEnvironment]. To turn off
+ * the use of proxies all together set the [findProxy] property to
+ * [:null:].
+ *
+ *     HttpClient client = new HttpClient();
+ *     client.findProxy = null;
  */
 abstract class HttpClient {
   static const int DEFAULT_HTTP_PORT = 80;
@@ -906,17 +952,17 @@
    * To activate this way of resolving proxies assign this function to
    * the [findProxy] property on the [HttpClient].
    *
-   *   HttpClient client = new HttpClient();
-   *   client.findProxy = HttpClient.findProxyFromEnvironment;
+   *     HttpClient client = new HttpClient();
+   *     client.findProxy = HttpClient.findProxyFromEnvironment;
    *
    * If you don't want to use the system environment you can use a
    * different one by wrapping the function.
    *
-   *   HttpClient client = new HttpClient();
-   *   client.findProxy = (url) {
-   *     return HttpClient.findProxyFromEnvironment(
-   *         url, {"http_proxy": ..., "no_proxy": ...});
-   *   }
+   *     HttpClient client = new HttpClient();
+   *     client.findProxy = (url) {
+   *       return HttpClient.findProxyFromEnvironment(
+   *           url, {"http_proxy": ..., "no_proxy": ...});
+   *     }
    */
   static String findProxyFromEnvironment(Uri url,
                                          {Map<String, String> environment}) {
@@ -951,23 +997,23 @@
  * encoding used will be determined from the "charset" parameter of
  * the "Content-Type" header.
  *
- *   HttpClientRequest request = ...
- *   request.headers.contentType
- *       = new ContentType("application", "json", charset: "utf-8");
- *   request.write(...);  // Strings written will be UTF-8 encoded.
+ *     HttpClientRequest request = ...
+ *     request.headers.contentType
+ *         = new ContentType("application", "json", charset: "utf-8");
+ *     request.write(...);  // Strings written will be UTF-8 encoded.
  *
  * If no charset is provided the default of ISO-8859-1 (Latin 1) will
  * be used.
  *
- *   HttpClientRequest request = ...
- *   request.headers.add(HttpHeaders.CONTENT_TYPE, "text/plain");
- *   request.write(...);  // Strings written will be ISO-8859-1 encoded.
+ *     HttpClientRequest request = ...
+ *     request.headers.add(HttpHeaders.CONTENT_TYPE, "text/plain");
+ *     request.write(...);  // Strings written will be ISO-8859-1 encoded.
  *
  * If an unsupported encoding is used an exception will be thrown if
  * using one of the write methods taking a string.
  */
 abstract class HttpClientRequest
-    implements IOSink<HttpClientRequest> {
+    implements IOSink<HttpClientResponse> {
   /**
    * Gets and sets the content length of the request. If the size of
    * the request is not known in advance set content length to -1,
@@ -996,10 +1042,10 @@
    * available. If an error occurs before the response is available, this
    * future will complete with an error.
    */
-  Future<HttpClientResponse> get response;
+  Future<HttpClientResponse> get done;
 
   /**
-   * Close the request for input. Returns the value of [response].
+   * Close the request for input. Returns the value of [done].
    */
   Future<HttpClientResponse> close();
 
diff --git a/sdk/lib/io/http_body.dart b/sdk/lib/io/http_body.dart
new file mode 100644
index 0000000..809075e
--- /dev/null
+++ b/sdk/lib/io/http_body.dart
@@ -0,0 +1,139 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of dart.io;
+
+
+/**
+ * [HttpBodyHandler] is a helper class for parsing and collecting HTTP message
+ * data in an easy-to-use [HttpBody] object. The content body is parsed,
+ * depending on the 'Content-Type' header field.
+ *
+ * To use with the [HttpServer] for request messages, [HttpBodyHandler] can be
+ * used as either a [StreamTransformer] or as a per-request handler (see
+ * [processRequest]).
+ *
+ *     HttpServer server = ...
+ *     server.transform(new HttpBodyHandler())
+ *         .listen((HttpRequestBody body) {
+ *           ...
+ *         });
+ *
+ * To use with the [HttpClient] for response messages, [HttpBodyHandler] can be
+ * used as a per-request handler (see [processResponse]).
+ *
+ *     HttpClient client = ...
+ *     client.get(...)
+ *         .then((HttpClientRequest response) => response.close())
+ *         .then(HttpBodyHandler.processResponse)
+ *         .then((HttpClientResponseBody body) {
+ *           ...
+ *         });
+ *
+ * The following mime-types will be handled specially:
+ *   - text/\*
+ *   - application/json
+ *
+ * All other mime-types will be returned as [List<int>].
+ */
+class HttpBodyHandler
+    implements StreamTransformer<HttpRequest, HttpRequestBody> {
+  factory HttpBodyHandler() => new _HttpBodyHandler();
+
+  /**
+   * Process and parse an incoming [HttpRequest]. The returned [HttpRequestBody]
+   * contains a [response] field for accessing the [HttpResponse].
+   */
+  static Future<HttpRequestBody> processRequest(HttpRequest request) {
+    return _HttpBodyHandler.processRequest(request);
+  }
+
+  /**
+   * Process and parse an incoming [HttpClientResponse].
+   */
+  static Future<HttpClientResponseBody> processResponse(
+      HttpClientResponse response) {
+    return _HttpBodyHandler.processResponse(response);
+  }
+}
+
+
+/**
+ * A HTTP content body produced by [HttpBodyHandler] for either [HttpRequest]
+ * or [HttpClientResponse].
+ */
+abstract class HttpBody {
+  /**
+   * The content type e.g. application/json, application/octet-stream,
+   * application/x-www-form-urlencoded, text/plain.
+   */
+  String get mimeType;
+
+  /**
+   * A high-level type value, that reflects how the body was parsed, e.g.
+   * "text", "binary" and "json".
+   */
+  String get type;
+
+  /**
+   * The actual body. The type depends on [type].
+   */
+  dynamic get body;
+}
+
+
+/**
+ * The [HttpBody] of a [HttpClientResponse] will be of type
+ * [HttpClientResponseBody]. It contains the [HttpClientResponse] object
+ * for access to the headers.
+ */
+abstract class HttpClientResponseBody extends HttpBody {
+  /**
+   * Returns the status code.
+   */
+  int get statusCode;
+
+  /**
+   * Returns the reason phrase associated with the status code.
+   */
+  String get reasonPhrase;
+
+  /**
+   * Returns the response headers.
+   */
+  HttpHeaders get headers;
+
+  /**
+   * The [HttpClientResponse] of the HTTP body.
+   */
+  HttpClientResponse get response;
+}
+
+
+/**
+ * The [HttpBody] of a [HttpRequest] will be of type [HttpRequestBody]. It
+ * contains the fields used to read all request header information and
+ * responding to the client.
+ */
+abstract class HttpRequestBody extends HttpBody {
+  /**
+   * Returns the method for the request.
+   */
+  String get method;
+
+  /**
+   * Returns the URI for the request.
+   */
+  Uri get uri;
+
+  /**
+   * Returns the request headers.
+   */
+  HttpHeaders get headers;
+
+  /**
+   * The [HttpResponse] used for responding to the client.
+   */
+  HttpResponse get response;
+}
diff --git a/sdk/lib/io/http_body_impl.dart b/sdk/lib/io/http_body_impl.dart
new file mode 100644
index 0000000..4bd9f81
--- /dev/null
+++ b/sdk/lib/io/http_body_impl.dart
@@ -0,0 +1,119 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of dart.io;
+
+class _HttpBodyHandlerTransformer
+    extends StreamEventTransformer<HttpRequest, HttpRequestBody> {
+  void handleData(HttpRequest request, EventSink<HttpRequestBody> sink) {
+    HttpBodyHandler.processRequest(request)
+        .then(sink.add, onError: sink.addError);
+  }
+}
+
+class _HttpBodyHandler implements HttpBodyHandler {
+  Stream<HttpRequestBody> bind(Stream<HttpRequest> stream) {
+    return new _HttpBodyHandlerTransformer().bind(stream);
+  }
+
+  static Future<HttpRequestBody> processRequest(HttpRequest request) {
+    return process(request, request.headers)
+        .then((body) => new _HttpRequestBody(request, body),
+              onError: (error) {
+                // Try to send BAD_REQUEST response.
+                request.response.statusCode = HttpStatus.BAD_REQUEST;
+                request.response.close();
+                request.response.done.catchError((_) {});
+                throw error;
+              });
+  }
+
+  static Future<HttpClientResponseBody> processResponse(
+      HttpClientResponse response) {
+    return process(response, response.headers)
+        .then((body) => new _HttpClientResponseBody(response, body));
+  }
+
+  static Future<HttpBody> process(Stream<List<int>> stream,
+                                  HttpHeaders headers) {
+    return stream.fold(
+        new _BufferList(),
+        (buffer, data) {
+          // TODO(ajohnsen): Add limit for POST data.
+          buffer.add(data);
+          return buffer;
+        })
+        .then((list) {
+          dynamic content = list.readBytes();
+          String type = "binary";
+          String mimeType = headers.contentType.toString();
+          String asText(Encoding defaultEncoding) {
+            var encoding;
+            var charset = headers.contentType.charset;
+            if (charset != null) encoding = Encoding.fromName(charset);
+            if (encoding == null) encoding = defaultEncoding;
+            return _decodeString(content, encoding);
+          }
+          switch (headers.contentType.primaryType) {
+            case "text":
+              type = "text";
+              content = asText(Encoding.ASCII);
+              break;
+
+            case "application":
+              switch (headers.contentType.subType) {
+                case "json":
+                  content = JSON.parse(asText(Encoding.UTF_8));
+                  type = "json";
+                  break;
+
+                default:
+                  break;
+              }
+              break;
+
+            default:
+              break;
+          }
+          return new _HttpBody(mimeType, type, content);
+        });
+  }
+}
+
+class _HttpBody implements HttpBody {
+  final String mimeType;
+  final String type;
+  final dynamic body;
+
+  _HttpBody(String this.mimeType,
+            String this.type,
+            dynamic this.body);
+}
+
+class _HttpRequestBody extends _HttpBody implements HttpRequestBody {
+  final String method;
+  final Uri uri;
+  final HttpHeaders headers;
+  final HttpResponse response;
+
+  _HttpRequestBody(HttpRequest request, HttpBody body)
+      : super(body.mimeType, body.type, body.body),
+        method = request.method,
+        uri = request.uri,
+        headers = request.headers,
+        response = request.response;
+}
+
+class _HttpClientResponseBody
+    extends _HttpBody implements HttpClientResponseBody {
+  final int statusCode;
+  final String reasonPhrase;
+  final HttpHeaders headers;
+
+  _HttpClientResponseBody(HttpClientResponse response, HttpBody body)
+      : super(body.mimeType, body.type, body.body),
+        statusCode = response.statusCode,
+        reasonPhrase = response.reasonPhrase,
+        headers = response.headers;
+}
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index 6fc339a..cea3e11 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -234,10 +234,14 @@
                                        {void onError(AsyncError error),
                                         void onDone(),
                                         bool unsubscribeOnError}) {
-    return _incoming.listen(onData,
-                            onError: onError,
-                            onDone: onDone,
-                            unsubscribeOnError: unsubscribeOnError);
+    var stream = _incoming;
+    if (headers.value(HttpHeaders.CONTENT_ENCODING) == "gzip") {
+      stream = stream.transform(new ZLibInflater());
+    }
+    return stream.listen(onData,
+                         onError: onError,
+                         onDone: onDone,
+                         unsubscribeOnError: unsubscribeOnError);
   }
 
   Future<Socket> detachSocket() {
@@ -381,7 +385,7 @@
       if (isFirst) {
         isFirst = false;
       } else {
-        if (separator != "") write(separator);
+        if (!separator.isEmpty) write(separator);
       }
       write(obj);
     }
@@ -396,10 +400,15 @@
     write(new String.fromCharCode(charCode));
   }
 
-  void writeBytes(List<int> data) {
+  void add(List<int> data) {
     _writeHeaders();
     if (data.length == 0) return;
-    _ioSink.writeBytes(data);
+    _ioSink.add(data);
+  }
+
+  void addError(AsyncError error) {
+    _writeHeaders();
+    _ioSink.addError(error);
   }
 
   Future<T> consume(Stream<List<int>> stream) {
@@ -623,7 +632,7 @@
     // Write headers.
     headers._write(buffer);
     writeCRLF();
-    _ioSink.writeBytes(buffer.readBytes());
+    _ioSink.add(buffer.readBytes());
   }
 
   String _findReasonPhrase(int statusCode) {
@@ -683,7 +692,7 @@
 }
 
 
-class _HttpClientRequest extends _HttpOutboundMessage<HttpClientRequest>
+class _HttpClientRequest extends _HttpOutboundMessage<HttpClientResponse>
     implements HttpClientRequest {
   final String method;
   final Uri uri;
@@ -698,6 +707,8 @@
 
   final bool _usingProxy;
 
+  Future<HttpClientResponse> _response;
+
   // TODO(ajohnsen): Get default value from client?
   bool _followRedirects = true;
 
@@ -718,11 +729,22 @@
     }
   }
 
-  Future<HttpClientResponse> get response => _responseCompleter.future;
+  Future<HttpClientResponse> get done {
+    if (_response == null) {
+      _response = Future.wait([_responseCompleter.future, super.done])
+        .then((list) => list[0]);
+    }
+    return _response;
+  }
+
+  Future<HttpClientResponse> consume(Stream<List<int>> stream) {
+    super.consume(stream);
+    return done;
+  }
 
   Future<HttpClientResponse> close() {
     super.close();
-    return response;
+    return done;
   }
 
   int get maxRedirects => _maxRedirects;
@@ -815,7 +837,7 @@
     // Write headers.
     headers._write(buffer);
     writeCRLF();
-    _ioSink.writeBytes(buffer.readBytes());
+    _ioSink.add(buffer.readBytes());
   }
 }
 
@@ -890,7 +912,7 @@
 
 
 // Extends StreamConsumer as this is an internal type, only used to pipe to.
-class _HttpOutgoing implements StreamConsumer<List<int>, dynamic> {
+class _HttpOutgoing implements StreamConsumer<List<int>> {
   Function _onStream;
   final Completer _consumeCompleter = new Completer();
 
@@ -971,6 +993,7 @@
                                          this);
     request.headers.host = uri.domain;
     request.headers.port = port;
+    request.headers.set(HttpHeaders.ACCEPT_ENCODING, "gzip");
     if (uri.userInfo != null && !uri.userInfo.isEmpty) {
       // If the URL contains user information use that for basic
       // authorization
@@ -988,51 +1011,47 @@
     // data).
     _httpParser.responseToMethod = method;
     _streamFuture = outgoing.onStream((stream) {
-        // Sending request, set up response completer.
-        _nextResponseCompleter = new Completer();
+        return _socket.writeStream(stream)
+            .then((s) {
+              // Request sent, set up response completer.
+              _nextResponseCompleter = new Completer();
 
-        var requestFuture = _socket.writeStream(stream)
-            .catchError((e) {
-              destroy();
-              throw e;
-            });
-
-        // Listen for response.
-        _nextResponseCompleter.future
-            .then((incoming) {
-              incoming.dataDone.then((_) {
-                if (incoming.headers.persistentConnection &&
-                    request.persistentConnection) {
-                  // Be sure we have written the full request.
-                  requestFuture
-                      .then((_) {
+              // Listen for response.
+              _nextResponseCompleter.future
+                  .then((incoming) {
+                    incoming.dataDone.then((_) {
+                      if (incoming.headers.persistentConnection &&
+                          request.persistentConnection) {
                         // Return connection, now we are done.
                         _httpClient._returnConnection(this);
                         _subscription.resume();
-                      },
-                      onError: (_) {
-                        // Already handled.
-                      });
-                } else {
-                  destroy();
-                }
-              });
-              request._onIncoming(incoming);
-            })
-            // If we see a state error, we failed to get the 'first' element.
-            // Transform the error to a HttpParserException, for consistency.
-            .catchError((error) {
-              throw new HttpParserException(
-                  "Connection closed before data was received");
-            }, test: (error) => error is StateError)
-            .catchError((error) {
-              // We are done with the socket.
+                      } else {
+                        destroy();
+                      }
+                    });
+                    request._onIncoming(incoming);
+                  })
+                  // If we see a state error, we failed to get the 'first'
+                  // element.
+                  // Transform the error to a HttpParserException, for
+                  // consistency.
+                  .catchError((error) {
+                    throw new HttpParserException(
+                        "Connection closed before data was received");
+                  }, test: (error) => error is StateError)
+                  .catchError((error) {
+                    // We are done with the socket.
+                    destroy();
+                    request._onError(error);
+                  });
+
+              // Resume the parser now we have a handler.
+              _subscription.resume();
+              return s;
+            }, onError: (e) {
               destroy();
-              request._onError(error);
+              throw e;
             });
-        // Resume the parser now we have a handler.
-        _subscription.resume();
-        return requestFuture;
     });
     return request;
   }
@@ -1071,13 +1090,13 @@
   static const int DEFAULT_EVICTION_TIMEOUT = 60000;
   bool _closing = false;
 
-  final Map<String, Queue<_HttpClientConnection>> _idleConnections
-      = new Map<String, Queue<_HttpClientConnection>>();
+  final Map<String, Set<_HttpClientConnection>> _idleConnections
+      = new Map<String, Set<_HttpClientConnection>>();
   final Set<_HttpClientConnection> _activeConnections
       = new Set<_HttpClientConnection>();
   final List<_Credentials> _credentials = [];
   Function _authenticate;
-  Function _findProxy;
+  Function _findProxy = HttpClient.findProxyFromEnvironment;
 
   Future<HttpClientRequest> open(String method,
                                  String host,
@@ -1210,9 +1229,9 @@
     }
     // TODO(ajohnsen): Listen for socket close events.
     if (!_idleConnections.containsKey(connection.key)) {
-      _idleConnections[connection.key] = new Queue();
+      _idleConnections[connection.key] = new Set();
     }
-    _idleConnections[connection.key].addLast(connection);
+    _idleConnections[connection.key].add(connection);
   }
 
   // Remove a closed connnection from the active set.
@@ -1241,7 +1260,8 @@
       int port = proxy.isDirect ? uriPort: proxy.port;
       String key = isSecure ? "ssh:$host:$port" : "$host:$port";
       if (_idleConnections.containsKey(key)) {
-        var connection = _idleConnections[key].removeFirst();
+        var connection = _idleConnections[key].first;
+        _idleConnections[key].remove(connection);
         if (_idleConnections[key].isEmpty) {
           _idleConnections.remove(key);
         }
@@ -1667,7 +1687,9 @@
     _socket.writeAll(objects, separator);
   }
 
-  void writeBytes(List<int> bytes) => _socket.writeBytes(bytes);
+  void add(List<int> bytes) => _socket.add(bytes);
+
+  void addError(AsyncError error) => _socket.addError(error);
 
   Future<Socket> consume(Stream<List<int>> stream) {
     return _socket.consume(stream);
diff --git a/sdk/lib/io/http_parser.dart b/sdk/lib/io/http_parser.dart
index 7d098d0..dd55494 100644
--- a/sdk/lib/io/http_parser.dart
+++ b/sdk/lib/io/http_parser.dart
@@ -166,7 +166,7 @@
   }
 
   void onSubscriptionStateChange() {
-    if (controller.hasSubscribers) {
+    if (controller.hasListener) {
       resume();
     } else {
       subscription.cancel();
@@ -197,7 +197,7 @@
  */
 class _HttpParser
     extends Stream<_HttpIncoming>
-    implements StreamConsumer<List<int>, _HttpParser> {
+    implements StreamConsumer<List<int>> {
 
   factory _HttpParser.requestParser() {
     return new _HttpParser._(true);
@@ -912,7 +912,7 @@
   }
 
   void _bodySubscriptionStateChange() {
-    if (_incoming != null && !_bodyController.hasSubscribers) {
+    if (_incoming != null && !_bodyController.hasListener) {
       _closeIncoming();
     } else {
       _updateParsePauseState();
@@ -921,13 +921,13 @@
 
   void _updateParsePauseState() {
     if (_bodyController != null) {
-      if (_bodyController.hasSubscribers && !_bodyController.isPaused) {
+      if (_bodyController.hasListener && !_bodyController.isPaused) {
         _continueParsing();
       } else {
         _pauseParsing();
       }
     } else {
-      if (_controller.hasSubscribers && !_controller.isPaused) {
+      if (_controller.hasListener && !_controller.isPaused) {
         _continueParsing();
       } else {
         _pauseParsing();
diff --git a/sdk/lib/io/http_session.dart b/sdk/lib/io/http_session.dart
index 4cde1be..2b7e164 100644
--- a/sdk/lib/io/http_session.dart
+++ b/sdk/lib/io/http_session.dart
@@ -72,7 +72,7 @@
 
   String createSessionId() {
     const int _KEY_LENGTH = 16;  // 128 bits.
-    var data = _getRandomBytes(_KEY_LENGTH);
+    var data = _IOCrypto.getRandomBytes(_KEY_LENGTH);
     return CryptoUtils.bytesToHex(data);
   }
 
@@ -172,7 +172,5 @@
   _HttpSession _head;
   _HttpSession _tail;
   Timer _timer;
-
-  external static Uint8List _getRandomBytes(int count);
 }
 
diff --git a/sdk/lib/io/io.dart b/sdk/lib/io/io.dart
index 9b1c418..ecaf427 100644
--- a/sdk/lib/io/io.dart
+++ b/sdk/lib/io/io.dart
@@ -18,6 +18,7 @@
                               DoubleLinkedQueueEntry;
 import 'dart:crypto';
 import 'dart:isolate';
+import 'dart:json' as JSON;
 import 'dart:math';
 import 'dart:uri';
 import 'dart:utf';
diff --git a/sdk/lib/io/io_sink.dart b/sdk/lib/io/io_sink.dart
index 4ee7b4f..df3a7da 100644
--- a/sdk/lib/io/io_sink.dart
+++ b/sdk/lib/io/io_sink.dart
@@ -5,18 +5,19 @@
 part of dart.io;
 
 /**
- * Helper class to wrap a [StreamConsumer<List<int>, T>] and provide
+ * Helper class to wrap a [StreamConsumer<List<int>>] and provide
  * utility functions for writing to the StreamConsumer directly. The
  * [IOSink] buffers the input given by [write], [writeAll], [writeln],
- * [writeCharCode] and [writeBytes] and will delay a [consume] or
+ * [writeCharCode] and [add] and will delay a [consume] or
  * [writeStream] until the buffer is flushed.
  *
  * When the [IOSink] is bound to a stream (through either [consume]
  * or [writeStream]) any call to the [IOSink] will throw a
  * [StateError].
  */
-abstract class IOSink<T> implements StreamConsumer<List<int>, T>, StringSink {
-  factory IOSink(StreamConsumer<List<int>, T> target,
+abstract class IOSink<T>
+    implements StreamConsumer<List<int>>, StringSink, EventSink<List<int>> {
+  factory IOSink(StreamConsumer<List<int>> target,
                  {Encoding encoding: Encoding.UTF_8})
       => new _IOSinkImpl(target, encoding);
 
@@ -29,7 +30,12 @@
   /**
    * Writes the bytes uninterpreted to the consumer.
    */
-  void writeBytes(List<int> data);
+  void add(List<int> data);
+
+  /**
+   * Writes an error to the consumer.
+   */
+  void addError(AsyncError error);
 
   /**
    * Provide functionality for piping to the [IOSink].
@@ -64,7 +70,7 @@
 
 
 class _IOSinkImpl<T> implements IOSink<T> {
-  final StreamConsumer<List<int>, T> _target;
+  final StreamConsumer<List<int>> _target;
 
   Completer _writeStreamCompleter;
   StreamController<List<int>> _controllerInstance;
@@ -73,7 +79,7 @@
   bool _paused = true;
   bool _encodingMutable = true;
 
-  _IOSinkImpl(StreamConsumer<List<int>, T> this._target, this._encoding);
+  _IOSinkImpl(StreamConsumer<List<int>> this._target, this._encoding);
 
   Encoding _encoding;
 
@@ -100,13 +106,13 @@
       }
     }
     if (string.isEmpty) return;
-    writeBytes(_encodeString(string, _encoding));
+    add(_encodeString(string, _encoding));
   }
 
   void writeAll(Iterable objects, [String separator = ""]) {
     Iterator iterator = objects.iterator;
     if (!iterator.moveNext()) return;
-    if (separator == "") {
+    if (separator.isEmpty) {
       do {
         write(iterator.current);
       } while (iterator.moveNext());
@@ -128,13 +134,20 @@
     write(new String.fromCharCode(charCode));
   }
 
-  void writeBytes(List<int> data) {
+  void add(List<int> data) {
     if (_isBound) {
       throw new StateError("IOSink is already bound to a stream");
     }
     _controller.add(data);
   }
 
+  void addError(AsyncError error) {
+    if (_isBound) {
+      throw new StateError("IOSink is already bound to a stream");
+    }
+    _controller.addError(error);
+  }
+
   Future<T> consume(Stream<List<int>> stream) {
     if (_isBound) {
       throw new StateError("IOSink is already bound to a stream");
@@ -223,7 +236,7 @@
   }
 
   void _onSubscriptionStateChange() {
-    if (_controller.hasSubscribers) {
+    if (_controller.hasListener) {
       _paused = false;
       _resume();
     } else {
diff --git a/sdk/lib/io/iolib_sources.gypi b/sdk/lib/io/iolib_sources.gypi
index 5f5692a..f2d61f5 100644
--- a/sdk/lib/io/iolib_sources.gypi
+++ b/sdk/lib/io/iolib_sources.gypi
@@ -15,6 +15,8 @@
     'file_impl.dart',
     'file_system_entity.dart',
     'http.dart',
+    'http_body.dart',
+    'http_body_impl.dart',
     'http_headers.dart',
     'http_impl.dart',
     'http_parser.dart',
diff --git a/sdk/lib/io/link.dart b/sdk/lib/io/link.dart
index fee4f97..347ae1f 100644
--- a/sdk/lib/io/link.dart
+++ b/sdk/lib/io/link.dart
@@ -34,13 +34,17 @@
 
   /**
    * Creates a symbolic link. Returns a [:Future<Link>:] that completes with
-   * the link when it has been created. If the link exists, the function
+   * the link when it has been created. If the link exists,
    * the future will complete with an error.
    *
    * On the Windows platform, this will only work with directories, and the
    * target directory must exist. The link will be created as a Junction.
    * Only absolute links will be created, and relative paths to the target
    * will be converted to absolute paths.
+   *
+   * On other platforms, the posix symlink() call is used to make a symbolic
+   * link containing the string [target].  If [target] is a relative path,
+   * it will be interpreted relative to the directory containing the link.
    */
   Future<Link> create(String target);
 
@@ -52,6 +56,10 @@
    * target directory must exist. The link will be created as a Junction.
    * Only absolute links will be created, and relative paths to the target
    * will be converted to absolute paths.
+   *
+   * On other platforms, the posix symlink() call is used to make a symbolic
+   * link containing the string [target].  If [target] is a relative path,
+   * it will be interpreted relative to the directory containing the link.
    */
   void createSync(String target);
 
@@ -70,14 +78,18 @@
 
   /**
    * Deletes the link. Returns a [:Future<Link>:] that completes with
-   * the link when it has been deleted.  This does not delete, or otherwise
-   * affect, the target of the link.
+   * the link when it has been deleted. This does not delete, or otherwise
+   * affect, the target of the link. It also works on broken links, but if
+   * the link does not exist or is not actually a link, it completes the
+   * future with a LinkIOException.
    */
   Future<Link> delete();
 
   /**
    * Synchronously deletes the link. This does not delete, or otherwise
-   * affect, the target of the link.
+   * affect, the target of the link.  It also works on broken links, but if
+   * the link does not exist or is not actually a link, it throws a
+   * LinkIOException.
    */
   void deleteSync();
 
@@ -108,6 +120,8 @@
 class _Link extends FileSystemEntity implements Link {
   final String path;
 
+  SendPort _fileService;
+
   _Link(String this.path);
 
   _Link.fromPath(Path inputPath) : path = inputPath.toNativePath();
@@ -122,9 +136,19 @@
   bool existsSync() => FileSystemEntity.isLinkSync(path);
 
   Future<Link> create(String target) {
-    // TODO(whesse): Replace with asynchronous version.
-    return new Future.of(() {
-      createSync(target);
+    _ensureFileService();
+    if (Platform.operatingSystem == 'windows') {
+      target = _makeWindowsLinkTarget(target);
+    }
+    List request = new List(3);
+    request[0] = _CREATE_LINK_REQUEST;
+    request[1] = path;
+    request[2] = target;
+    return _fileService.call(request).then((response) {
+      if (_isErrorResponse(response)) {
+        throw _exceptionFromResponse(response,
+            "Cannot create link '$path' to target '$target'");
+      }
       return this;
     });
   }
@@ -134,9 +158,7 @@
       target = _makeWindowsLinkTarget(target);
     }
     var result = _File._createLink(path, target);
-    if (result is OSError) {
-      throw new LinkIOException("Error in Link.createSync", result);
-    }
+    throwIfError(result, "Cannot create link '$path'");
   }
 
   // Put target into the form "\??\C:\my\target\dir".
@@ -164,11 +186,21 @@
   }
 
   Future<Link> delete() {
-    return new File(path).delete().then((_) => this);
+    _ensureFileService();
+    List request = new List(2);
+    request[0] = _DELETE_LINK_REQUEST;
+    request[1] = path;
+    return _fileService.call(request).then((response) {
+      if (_isErrorResponse(response)) {
+        throw _exceptionFromResponse(response, "Cannot delete link '$path'");
+      }
+      return this;
+    });
   }
 
   void deleteSync() {
-    new File(path).deleteSync();
+    var result = _File._deleteLink(path);
+    throwIfError(result, "Cannot delete link '$path'");
   }
 
   Future<String> target() {
@@ -178,11 +210,39 @@
 
   String targetSync() {
     var result = _File._linkTarget(path);
-    if (result is OSError) {
-      throw new LinkIOException("Error in Link.targetSync", result);
-    }
+    throwIfError(result, "Cannot read link '$path'");
     return result;
   }
+
+  static throwIfError(Object result, String msg) {
+    if (result is OSError) {
+      throw new LinkIOException(msg, result);
+    }
+  }
+
+  bool _isErrorResponse(response) {
+    return response is List && response[0] != _SUCCESS_RESPONSE;
+  }
+
+  void _ensureFileService() {
+    if (_fileService == null) {
+      _fileService = _FileUtils._newServicePort();
+    }
+  }
+
+  _exceptionFromResponse(response, String message) {
+    assert(_isErrorResponse(response));
+    switch (response[_ERROR_RESPONSE_ERROR_TYPE]) {
+      case _ILLEGAL_ARGUMENT_RESPONSE:
+        return new ArgumentError();
+      case _OSERROR_RESPONSE:
+        var err = new OSError(response[_OSERROR_RESPONSE_MESSAGE],
+                              response[_OSERROR_RESPONSE_ERROR_CODE]);
+        return new LinkIOException(message, err);
+      default:
+        return new Exception("Unknown error");
+    }
+  }
 }
 
 
diff --git a/sdk/lib/io/process.dart b/sdk/lib/io/process.dart
index 8ceb41d..1c9fddb 100644
--- a/sdk/lib/io/process.dart
+++ b/sdk/lib/io/process.dart
@@ -46,7 +46,11 @@
  * in a isolate while it is blocked in a [sleep] call.
  */
 void sleep(Duration duration) {
-  _ProcessUtils._sleep(duration.inMilliseconds);
+  int milliseconds = duration.inMilliseconds;
+  if (milliseconds < 0) {
+    throw new ArgumentError("sleep: duration cannot be negative");
+  }
+  _ProcessUtils._sleep(milliseconds);
 }
 
 /**
diff --git a/sdk/lib/io/secure_server_socket.dart b/sdk/lib/io/secure_server_socket.dart
index bcbc731..166b0f2 100644
--- a/sdk/lib/io/secure_server_socket.dart
+++ b/sdk/lib/io/secure_server_socket.dart
@@ -222,7 +222,7 @@
   }
 
   void _onSubscriptionStateChange() {
-    if (_controller.hasSubscribers) {
+    if (_controller.hasListener) {
       _subscription = _socket.listen(_onData,
                                      onDone: _onDone,
                                      onError: _onError);
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index 41fdf59..197e87d 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -391,7 +391,7 @@
 
   void set writeEventsEnabled(bool value) {
     if (value &&
-        _controller.hasSubscribers &&
+        _controller.hasListener &&
         _secureFilter != null &&
         _secureFilter.buffers[WRITE_PLAINTEXT].free > 0) {
       Timer.run(() => _controller.add(RawSocketEvent.WRITE));
@@ -501,7 +501,7 @@
         _secureHandshake();
       } catch (e) { _reportError(e, "RawSecureSocket error"); }
     } else if (_status == CONNECTED &&
-               _controller.hasSubscribers &&
+               _controller.hasListener &&
                _writeEventsEnabled &&
                _secureFilter.buffers[WRITE_PLAINTEXT].free > 0) {
       // Reset the one-shot handler.
@@ -628,7 +628,7 @@
   }
 
   void _onSubscriptionStateChange() {
-    if (_controller.hasSubscribers) {
+    if (_controller.hasListener) {
       // TODO(ajohnsen): Do something here?
     }
   }
diff --git a/sdk/lib/io/socket.dart b/sdk/lib/io/socket.dart
index 1680f6b..ac3444c 100644
--- a/sdk/lib/io/socket.dart
+++ b/sdk/lib/io/socket.dart
@@ -125,7 +125,7 @@
  */
 abstract class RawSocket implements Stream<RawSocketEvent> {
   /**
-   * Creats a new socket connection to the host and port and returns a [Future]
+   * Creates a new socket connection to the host and port and returns a [Future]
    * that will complete with either a [RawSocket] once connected or an error
    * if the host-lookup or connection failed.
    */
@@ -216,7 +216,7 @@
                                  IOSink<Socket> {
   /**
    * Creats a new socket connection to the host and port and returns a [Future]
-   * that will complete with either a [RawSocket] once connected or an error
+   * that will complete with either a [Socket] once connected or an error
    * if the host-lookup or connection failed.
    */
   external static Future<Socket> connect(String host, int port);
diff --git a/sdk/lib/io/stdio.dart b/sdk/lib/io/stdio.dart
index 1ed157e..5cad1f0 100644
--- a/sdk/lib/io/stdio.dart
+++ b/sdk/lib/io/stdio.dart
@@ -10,6 +10,44 @@
 const int _STDIO_HANDLE_TYPE_SOCKET = 3;
 const int _STDIO_HANDLE_TYPE_OTHER = 4;
 
+class _StdStream extends Stream<List<int>> {
+  final Stream<List<int>> _stream;
+
+  _StdStream(Stream<List<int>> this._stream);
+
+  StreamSubscription<List<int>> listen(void onData(List<int> event),
+                                       {void onError(AsyncError error),
+                                        void onDone(),
+                                        bool unsubscribeOnError}) {
+    return _stream.listen(
+        onData,
+        onError: onError,
+        onDone: onDone,
+        unsubscribeOnError: unsubscribeOnError);
+  }
+}
+
+class _StdSink implements IOSink {
+  final IOSink _sink;
+
+  _StdSink(IOSink this._sink);
+
+  Encoding get encoding => _sink.encoding;
+  void set encoding(Encoding encoding) {
+    _sink.encoding = encoding;
+  }
+  void write(object) => _sink.write(object);
+  void writeln([object = "" ]) => _sink.writeln(object);
+  void writeAll(objects, [sep = ""]) => _sink.writeAll(objects, sep);
+  void add(List<int> data) => _sink.add(data);
+  void addError(AsyncError error) => _sink.addError(error);
+  void writeCharCode(int charCode) => _sink.writeCharCode(charCode);
+  Future consume(Stream<List<int>> stream) => _sink.consume(stream);
+  Future addStream(Stream<List<int>> stream) => _sink.addStream(stream);
+  Future writeStream(Stream<List<int>> stream) => _sink.writeStream(stream);
+  Future close() => _sink.close();
+  Future get done => _sink.done;
+}
 
 class StdioType {
   static const StdioType TERMINAL = const StdioType._("terminal");
@@ -52,6 +90,11 @@
 
 
 StdioType stdioType(object) {
+  if (object is _StdStream) {
+    object = object._stream;
+  } else if (object is _StdSink) {
+    object = object._sink;
+  }
   if (object is _FileStream) {
     return StdioType.FILE;
   }
diff --git a/sdk/lib/io/string_transformer.dart b/sdk/lib/io/string_transformer.dart
index 7cc9bc0..4a70f44 100644
--- a/sdk/lib/io/string_transformer.dart
+++ b/sdk/lib/io/string_transformer.dart
@@ -12,6 +12,12 @@
   static const Encoding ISO_8859_1 = const Encoding._internal("iso-8859-1");
   static const Encoding ASCII = const Encoding._internal("us-ascii");
 
+  /**
+   * SYSTEM encoding is the current code page on Windows and UTF-8 on
+   * Linux and Mac.
+   */
+  static const Encoding SYSTEM = const Encoding._internal("system");
+
   // All aliasses (in lowercase) of supported encoding from
   // http://www.iana.org/assignments/character-sets/character-sets.xml.
   static Map<String, Encoding> _nameToEncoding = <String, Encoding> {
@@ -67,14 +73,12 @@
    */
   final String name;
 
-  /**
-   * SYSTEM encoding is the current code page on Windows and UTF-8 on
-   * Linux and Mac.
-   */
-  static const Encoding SYSTEM = const Encoding._internal("system");
   const Encoding._internal(String this.name);
 }
 
+const UTF_8 = Encoding.UTF_8;
+const ISO_8859_1 = Encoding.ISO_8859_1;
+const ASCII = Encoding.ASCII;
 
 /**
  * Stream transformer that can decode a stream of bytes into a stream of
diff --git a/sdk/lib/io/websocket_impl.dart b/sdk/lib/io/websocket_impl.dart
index fcbe1ca..bd21220 100644
--- a/sdk/lib/io/websocket_impl.dart
+++ b/sdk/lib/io/websocket_impl.dart
@@ -50,7 +50,9 @@
   static const int CLOSED = 5;
   static const int FAILURE = 6;
 
-  _WebSocketProtocolTransformer() {
+  bool _serverSide;
+
+  _WebSocketProtocolTransformer([bool this._serverSide = false]) {
     _prepareForNextFrame();
     _currentMessageType = _WebSocketMessageType.NONE;
   }
@@ -223,9 +225,15 @@
 
   void _lengthDone(EventSink sink) {
     if (_masked) {
+      if (!_serverSide) {
+        throw new WebSocketException("Received masked frame from server");
+      }
       _state = MASK;
       _remainingMaskingKeyBytes = 4;
     } else {
+      if (_serverSide) {
+        throw new WebSocketException("Received unmasked frame from client");
+      }
       _remainingPayloadBytes = _len;
       _startPayload(sink);
     }
@@ -392,7 +400,7 @@
     response.headers.add("Sec-WebSocket-Accept", accept);
     response.headers.contentLength = 0;
     return response.detachSocket()
-        .then((socket) => new _WebSocketImpl._fromSocket(socket));
+        .then((socket) => new _WebSocketImpl._fromSocket(socket, true));
   }
 
   static bool _isUpgradeRequest(HttpRequest request) {
@@ -428,6 +436,7 @@
   final StreamController _controller = new StreamController();
 
   final Socket _socket;
+  final bool _serverSide;
   int _readyState = WebSocket.CONNECTING;
   bool _writeClosed = false;
   int _closeCode;
@@ -505,11 +514,12 @@
       });
   }
 
-  _WebSocketImpl._fromSocket(Socket this._socket) {
+  _WebSocketImpl._fromSocket(Socket this._socket,
+                             [bool this._serverSide = false]) {
     _readyState = WebSocket.OPEN;
 
     bool closed = false;
-    var transformer = new _WebSocketProtocolTransformer();
+    var transformer = new _WebSocketProtocolTransformer(_serverSide);
     _socket.transform(transformer).listen(
         (data) {
           _controller.add(data);
@@ -631,7 +641,7 @@
 
   void _sendFrame(int opcode, [List<int> data]) {
     if (_writeClosed) return;
-    bool mask = false;  // Masking not implemented for server.
+    bool mask = !_serverSide;  // Masking not implemented for server.
     int dataLength = data == null ? 0 : data.length;
     // Determine the header size.
     int headerSize = (mask) ? 6 : 2;
@@ -658,11 +668,24 @@
     for (int i = 0; i < lengthBytes; i++) {
       header[index++] = dataLength >> (((lengthBytes - 1) - i) * 8) & 0xFF;
     }
+    if (mask) {
+      header[1] |= 1 << 7;
+      var maskBytes = _IOCrypto.getRandomBytes(4);
+      header.setRange(index, 4, maskBytes);
+      index += 4;
+      if (data != null) {
+        var list = new Uint8List(data.length);
+        for (int i = 0; i < data.length; i++) {
+          list[i] = data[i] ^ maskBytes[i % 4];
+        }
+        data = list;
+      }
+    }
     assert(index == headerSize);
     try {
-      _socket.writeBytes(header);
+      _socket.add(header);
       if (data != null) {
-        _socket.writeBytes(data);
+        _socket.add(data);
       }
     } catch (_) {
       // The socket can be closed before _socket.done have a chance
diff --git a/sdk/lib/isolate/isolate_stream.dart b/sdk/lib/isolate/isolate_stream.dart
index a48c44d..37db4e5 100644
--- a/sdk/lib/isolate/isolate_stream.dart
+++ b/sdk/lib/isolate/isolate_stream.dart
@@ -38,7 +38,7 @@
 class IsolateStream extends Stream<dynamic> {
   bool _isClosed = false;
   final ReceivePort _port;
-  StreamController _controller = new StreamController.broadcast();
+  StreamController _controller = new StreamController();
 
   IsolateStream._fromOriginalReceivePort(this._port) {
     _port.receive((message, replyTo) {
@@ -94,8 +94,7 @@
  *
  * [IsolateSink]s can be transmitted to other isolates.
  */
-abstract class IsolateSink extends StreamSink<dynamic> {
-  // TODO(8997): Implement EventSink instead.
+abstract class IsolateSink extends EventSink<dynamic> {
   // TODO(floitsch): Actually it should be a StreamSink (being able to flow-
   // control).
 
diff --git a/sdk/lib/mirrors/mirrors.dart b/sdk/lib/mirrors/mirrors.dart
index 70c523e..9813a0d 100644
--- a/sdk/lib/mirrors/mirrors.dart
+++ b/sdk/lib/mirrors/mirrors.dart
@@ -174,32 +174,34 @@
 abstract class ObjectMirror implements Mirror {
   /**
    * Invokes the named function and returns a mirror on the result.
-   *
-   * TODO(turnidge): Properly document.
+   * The arguments must be instances of [InstanceMirror], [num], 
+   * [String] or [bool].
+   */
+  /* TODO(turnidge): Properly document.
    * TODO(turnidge): Handle ambiguous names.
    * TODO(turnidge): Handle optional & named arguments.
    */
-  Future<InstanceMirror> invoke(String memberName,
-                                List<Object> positionalArguments,
-                                [Map<String,Object> namedArguments]);
+  Future<InstanceMirror> invokeAsync(String memberName,
+                                     List<Object> positionalArguments,
+                                     [Map<String,Object> namedArguments]);
 
   /**
    * Invokes a getter and returns a mirror on the result. The getter
    * can be the implicit getter for a field or a user-defined getter
    * method.
-   *
-   * TODO(turnidge): Handle ambiguous names.
    */
-  Future<InstanceMirror> getField(String fieldName);
+  /* TODO(turnidge): Handle ambiguous names.*/
+  Future<InstanceMirror> getFieldAsync(String fieldName);
 
   /**
    * Invokes a setter and returns a mirror on the result. The setter
    * may be either the implicit setter for a non-final field or a
    * user-defined setter method.
-   *
-   * TODO(turnidge): Handle ambiguous names.
+   * The argument must be an instance of either [InstanceMirror], [num], 
+   * [String] or [bool].
    */
-  Future<InstanceMirror> setField(String fieldName, Object value);
+  /* TODO(turnidge): Handle ambiguous names.*/
+  Future<InstanceMirror> setFieldAsync(String fieldName, Object value);
 }
 
 /**
@@ -256,17 +258,12 @@
   String get source;
 
   /**
-   * Executes the closure. The arguments given in the descriptor need to
-   * be InstanceMirrors or simple values.
-   *
-   * A value is simple if one of the following holds:
-   *  - the value is null
-   *  - the value is of type [num]
-   *  - the value is of type [bool]
-   *  - the value is of type [String]
+   * Executes the closure.
+   * The arguments must be instances of [InstanceMirror], [num], 
+   * [String] or [bool]. 
    */
-  Future<InstanceMirror> apply(List<Object> positionalArguments,
-                               [Map<String,Object> namedArguments]);
+  Future<InstanceMirror> applyAsync(List<Object> positionalArguments,
+                                    [Map<String,Object> namedArguments]);
 
   /**
    * Looks up the value of a name in the scope of the closure. The
@@ -436,12 +433,12 @@
 
   /**
    * Invokes the named constructor and returns a mirror on the result.
-   *
-   * TODO(turnidge): Properly document.
+   * The arguments must be instances of [InstanceMirror], [num], 
    */
-  Future<InstanceMirror> newInstance(String constructorName,
-                                     List<Object> positionalArguments,
-                                     [Map<String,Object> namedArguments]);
+  /* TODO(turnidge): Properly document.*/
+  Future<InstanceMirror> newInstanceAsync(String constructorName,
+                                          List<Object> positionalArguments,
+                                          [Map<String,Object> namedArguments]);
 
   /**
    * Does this mirror represent a class?
diff --git a/sdk/lib/svg/dart2js/svg_dart2js.dart b/sdk/lib/svg/dart2js/svg_dart2js.dart
index feeb745..570e29c 100644
--- a/sdk/lib/svg/dart2js/svg_dart2js.dart
+++ b/sdk/lib/svg/dart2js/svg_dart2js.dart
@@ -738,45 +738,6 @@
 
 
 @DocsEditable
-@DomName('SVGColor')
-class Color extends CssValue native "*SVGColor" {
-
-  static const int SVG_COLORTYPE_CURRENTCOLOR = 3;
-
-  static const int SVG_COLORTYPE_RGBCOLOR = 1;
-
-  static const int SVG_COLORTYPE_RGBCOLOR_ICCCOLOR = 2;
-
-  static const int SVG_COLORTYPE_UNKNOWN = 0;
-
-  @DomName('SVGColor.colorType')
-  @DocsEditable
-  final int colorType;
-
-  @DomName('SVGColor.rgbColor')
-  @DocsEditable
-  final CssRgbColor rgbColor;
-
-  @DomName('SVGColor.setColor')
-  @DocsEditable
-  void setColor(int colorType, String rgbColor, String iccColor) native;
-
-  @JSName('setRGBColor')
-  @DomName('SVGColor.setRGBColor')
-  @DocsEditable
-  void setRgbColor(String rgbColor) native;
-
-  @JSName('setRGBColorICCColor')
-  @DomName('SVGColor.setRGBColorICCColor')
-  @DocsEditable
-  void setRgbColorIccColor(String rgbColor, String iccColor) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
 @DomName('SVGDefsElement')
 class DefsElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace native "*SVGDefsElement" {
 
@@ -3069,11 +3030,12 @@
 
   // SVG Collections expose numberOfItems rather than length.
   int get length => numberOfItems;
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Length)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Length reduce(Length combine(Length value, Length element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Length)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Length element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -3081,7 +3043,7 @@
 
   void forEach(void f(Length element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Length element)) =>
@@ -3181,12 +3143,6 @@
     throw new StateError("More than one element");
   }
 
-  Length min([int compare(Length a, Length b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Length max([int compare(Length a, Length b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Length element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -3203,14 +3159,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Length element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -3231,17 +3179,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Length> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Length> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Length>[]);
   }
 
-  List<Length> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Length> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Length> mixins.
 
   @DomName('SVGLengthList.appendItem')
@@ -3376,7 +3331,7 @@
 
 @DocsEditable
 @DomName('SVGLinearGradientElement')
-class LinearGradientElement extends _SVGGradientElement native "*SVGLinearGradientElement" {
+class LinearGradientElement extends _GradientElement native "*SVGLinearGradientElement" {
 
   @DomName('SVGLinearGradientElement.SVGLinearGradientElement')
   @DocsEditable
@@ -3707,11 +3662,12 @@
 
   // SVG Collections expose numberOfItems rather than length.
   int get length => numberOfItems;
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Number)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Number reduce(Number combine(Number value, Number element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Number)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Number element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -3719,7 +3675,7 @@
 
   void forEach(void f(Number element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Number element)) =>
@@ -3819,12 +3775,6 @@
     throw new StateError("More than one element");
   }
 
-  Number min([int compare(Number a, Number b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Number max([int compare(Number a, Number b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Number element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -3841,14 +3791,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Number element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -3869,17 +3811,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Number> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Number> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Number>[]);
   }
 
-  List<Number> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Number> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Number> mixins.
 
   @DomName('SVGNumberList.appendItem')
@@ -3916,51 +3865,6 @@
 
 
 @DocsEditable
-@DomName('SVGPaint')
-class Paint extends Color native "*SVGPaint" {
-
-  static const int SVG_PAINTTYPE_CURRENTCOLOR = 102;
-
-  static const int SVG_PAINTTYPE_NONE = 101;
-
-  static const int SVG_PAINTTYPE_RGBCOLOR = 1;
-
-  static const int SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR = 2;
-
-  static const int SVG_PAINTTYPE_UNKNOWN = 0;
-
-  static const int SVG_PAINTTYPE_URI = 107;
-
-  static const int SVG_PAINTTYPE_URI_CURRENTCOLOR = 104;
-
-  static const int SVG_PAINTTYPE_URI_NONE = 103;
-
-  static const int SVG_PAINTTYPE_URI_RGBCOLOR = 105;
-
-  static const int SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR = 106;
-
-  @DomName('SVGPaint.paintType')
-  @DocsEditable
-  final int paintType;
-
-  @DomName('SVGPaint.uri')
-  @DocsEditable
-  final String uri;
-
-  @DomName('SVGPaint.setPaint')
-  @DocsEditable
-  void setPaint(int paintType, String uri, String rgbColor, String iccColor) native;
-
-  @DomName('SVGPaint.setUri')
-  @DocsEditable
-  void setUri(String uri) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
 @DomName('SVGPathElement')
 class PathElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace native "*SVGPathElement" {
 
@@ -4621,11 +4525,12 @@
 
   // SVG Collections expose numberOfItems rather than length.
   int get length => numberOfItems;
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, PathSeg)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  PathSeg reduce(PathSeg combine(PathSeg value, PathSeg element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, PathSeg)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, PathSeg element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -4633,7 +4538,7 @@
 
   void forEach(void f(PathSeg element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(PathSeg element)) =>
@@ -4733,12 +4638,6 @@
     throw new StateError("More than one element");
   }
 
-  PathSeg min([int compare(PathSeg a, PathSeg b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  PathSeg max([int compare(PathSeg a, PathSeg b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, PathSeg element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -4755,14 +4654,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(PathSeg element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -4783,17 +4674,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<PathSeg> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<PathSeg> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <PathSeg>[]);
   }
 
-  List<PathSeg> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, PathSeg> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<PathSeg> mixins.
 
   @DomName('SVGPathSegList.appendItem')
@@ -5241,7 +5139,7 @@
 
 @DocsEditable
 @DomName('SVGRadialGradientElement')
-class RadialGradientElement extends _SVGGradientElement native "*SVGRadialGradientElement" {
+class RadialGradientElement extends _GradientElement native "*SVGRadialGradientElement" {
 
   @DomName('SVGRadialGradientElement.SVGRadialGradientElement')
   @DocsEditable
@@ -5520,11 +5418,12 @@
 
   // SVG Collections expose numberOfItems rather than length.
   int get length => numberOfItems;
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, String)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  String reduce(String combine(String value, String element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, String)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, String element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -5532,7 +5431,7 @@
 
   void forEach(void f(String element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(String element)) =>
@@ -5632,12 +5531,6 @@
     throw new StateError("More than one element");
   }
 
-  String min([int compare(String a, String b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  String max([int compare(String a, String b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, String element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -5654,14 +5547,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(String element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -5682,17 +5567,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<String> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<String> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <String>[]);
   }
 
-  List<String> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, String> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<String> mixins.
 
   @DomName('SVGStringList.appendItem')
@@ -5779,10 +5671,6 @@
 
   // Use implementation from Element.
   // final CssStyleDeclaration style;
-
-  @DomName('SVGStyledElement.getPresentationAttribute')
-  @DocsEditable
-  CssValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -6696,11 +6584,12 @@
 
   // SVG Collections expose numberOfItems rather than length.
   int get length => numberOfItems;
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Transform)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Transform reduce(Transform combine(Transform value, Transform element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Transform)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Transform element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -6708,7 +6597,7 @@
 
   void forEach(void f(Transform element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Transform element)) =>
@@ -6808,12 +6697,6 @@
     throw new StateError("More than one element");
   }
 
-  Transform min([int compare(Transform a, Transform b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Transform max([int compare(Transform a, Transform b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Transform element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -6830,14 +6713,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Transform element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -6858,17 +6733,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Transform> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Transform> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Transform>[]);
   }
 
-  List<Transform> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Transform> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Transform> mixins.
 
   @DomName('SVGTransformList.appendItem')
@@ -7227,11 +7109,12 @@
     return new FixedSizeListIterator<ElementInstance>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, ElementInstance)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  ElementInstance reduce(ElementInstance combine(ElementInstance value, ElementInstance element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, ElementInstance)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, ElementInstance element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -7239,7 +7122,7 @@
 
   void forEach(void f(ElementInstance element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(ElementInstance element)) =>
@@ -7341,12 +7224,6 @@
     throw new StateError("More than one element");
   }
 
-  ElementInstance min([int compare(ElementInstance a, ElementInstance b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  ElementInstance max([int compare(ElementInstance a, ElementInstance b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, ElementInstance element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -7363,14 +7240,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(ElementInstance element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -7391,17 +7260,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<ElementInstance> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<ElementInstance> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <ElementInstance>[]);
   }
 
-  List<ElementInstance> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, ElementInstance> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<ElementInstance> mixins.
 
   @DomName('SVGElementInstanceList.item')
@@ -7414,300 +7290,8 @@
 
 
 @DocsEditable
-@DomName('SVGAltGlyphDefElement')
-class _SVGAltGlyphDefElement extends SvgElement native "*SVGAltGlyphDefElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
-@DomName('SVGAltGlyphItemElement')
-class _SVGAltGlyphItemElement extends SvgElement native "*SVGAltGlyphItemElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
-@DomName('SVGAnimateColorElement')
-class _SVGAnimateColorElement extends AnimationElement native "*SVGAnimateColorElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
-@DomName('SVGComponentTransferFunctionElement')
-class _SVGComponentTransferFunctionElement extends SvgElement native "*SVGComponentTransferFunctionElement" {
-
-  static const int SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE = 3;
-
-  static const int SVG_FECOMPONENTTRANSFER_TYPE_GAMMA = 5;
-
-  static const int SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY = 1;
-
-  static const int SVG_FECOMPONENTTRANSFER_TYPE_LINEAR = 4;
-
-  static const int SVG_FECOMPONENTTRANSFER_TYPE_TABLE = 2;
-
-  static const int SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN = 0;
-
-  @DomName('SVGComponentTransferFunctionElement.amplitude')
-  @DocsEditable
-  final AnimatedNumber amplitude;
-
-  @DomName('SVGComponentTransferFunctionElement.exponent')
-  @DocsEditable
-  final AnimatedNumber exponent;
-
-  @DomName('SVGComponentTransferFunctionElement.intercept')
-  @DocsEditable
-  final AnimatedNumber intercept;
-
-  @JSName('offset')
-  @DomName('SVGComponentTransferFunctionElement.offset')
-  @DocsEditable
-  final AnimatedNumber gradientOffset;
-
-  @DomName('SVGComponentTransferFunctionElement.slope')
-  @DocsEditable
-  final AnimatedNumber slope;
-
-  @DomName('SVGComponentTransferFunctionElement.tableValues')
-  @DocsEditable
-  final AnimatedNumberList tableValues;
-
-  @DomName('SVGComponentTransferFunctionElement.type')
-  @DocsEditable
-  final AnimatedEnumeration type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
-@DomName('SVGCursorElement')
-class _SVGCursorElement extends SvgElement implements UriReference, Tests, ExternalResourcesRequired native "*SVGCursorElement" {
-
-  @DomName('SVGCursorElement.SVGCursorElement')
-  @DocsEditable
-  factory _SVGCursorElement() => _SvgElementFactoryProvider.createSvgElement_tag("cursor");
-
-  /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('cursor') && (new SvgElement.tag('cursor') is _SVGCursorElement);
-
-  @DomName('SVGCursorElement.x')
-  @DocsEditable
-  final AnimatedLength x;
-
-  @DomName('SVGCursorElement.y')
-  @DocsEditable
-  final AnimatedLength y;
-
-  // From SVGExternalResourcesRequired
-
-  @DomName('SVGCursorElement.externalResourcesRequired')
-  @DocsEditable
-  final AnimatedBoolean externalResourcesRequired;
-
-  // From SVGTests
-
-  @DomName('SVGCursorElement.requiredExtensions')
-  @DocsEditable
-  final StringList requiredExtensions;
-
-  @DomName('SVGCursorElement.requiredFeatures')
-  @DocsEditable
-  final StringList requiredFeatures;
-
-  @DomName('SVGCursorElement.systemLanguage')
-  @DocsEditable
-  final StringList systemLanguage;
-
-  @DomName('SVGCursorElement.hasExtension')
-  @DocsEditable
-  bool hasExtension(String extension) native;
-
-  // From SVGURIReference
-
-  @DomName('SVGCursorElement.href')
-  @DocsEditable
-  final AnimatedString href;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
-@DomName('SVGFEDropShadowElement')
-class _SVGFEDropShadowElement extends StyledElement implements FilterPrimitiveStandardAttributes native "*SVGFEDropShadowElement" {
-
-  @DomName('SVGFEDropShadowElement.dx')
-  @DocsEditable
-  final AnimatedNumber dx;
-
-  @DomName('SVGFEDropShadowElement.dy')
-  @DocsEditable
-  final AnimatedNumber dy;
-
-  @DomName('SVGFEDropShadowElement.in1')
-  @DocsEditable
-  final AnimatedString in1;
-
-  @DomName('SVGFEDropShadowElement.stdDeviationX')
-  @DocsEditable
-  final AnimatedNumber stdDeviationX;
-
-  @DomName('SVGFEDropShadowElement.stdDeviationY')
-  @DocsEditable
-  final AnimatedNumber stdDeviationY;
-
-  @DomName('SVGFEDropShadowElement.setStdDeviation')
-  @DocsEditable
-  void setStdDeviation(num stdDeviationX, num stdDeviationY) native;
-
-  // From SVGFilterPrimitiveStandardAttributes
-
-  @DomName('SVGFEDropShadowElement.height')
-  @DocsEditable
-  final AnimatedLength height;
-
-  @DomName('SVGFEDropShadowElement.result')
-  @DocsEditable
-  final AnimatedString result;
-
-  @DomName('SVGFEDropShadowElement.width')
-  @DocsEditable
-  final AnimatedLength width;
-
-  @DomName('SVGFEDropShadowElement.x')
-  @DocsEditable
-  final AnimatedLength x;
-
-  @DomName('SVGFEDropShadowElement.y')
-  @DocsEditable
-  final AnimatedLength y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
-@DomName('SVGFontElement')
-class _SVGFontElement extends SvgElement native "*SVGFontElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
-@DomName('SVGFontFaceElement')
-class _SVGFontFaceElement extends SvgElement native "*SVGFontFaceElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
-@DomName('SVGFontFaceFormatElement')
-class _SVGFontFaceFormatElement extends SvgElement native "*SVGFontFaceFormatElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
-@DomName('SVGFontFaceNameElement')
-class _SVGFontFaceNameElement extends SvgElement native "*SVGFontFaceNameElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
-@DomName('SVGFontFaceSrcElement')
-class _SVGFontFaceSrcElement extends SvgElement native "*SVGFontFaceSrcElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
-@DomName('SVGFontFaceUriElement')
-class _SVGFontFaceUriElement extends SvgElement native "*SVGFontFaceUriElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
-@DomName('SVGGlyphElement')
-class _SVGGlyphElement extends SvgElement native "*SVGGlyphElement" {
-
-  @DomName('SVGGlyphElement.SVGGlyphElement')
-  @DocsEditable
-  factory _SVGGlyphElement() => _SvgElementFactoryProvider.createSvgElement_tag("glyph");
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
-@DomName('SVGGlyphRefElement')
-class _SVGGlyphRefElement extends StyledElement implements UriReference native "*SVGGlyphRefElement" {
-
-  @DomName('SVGGlyphRefElement.dx')
-  @DocsEditable
-  num dx;
-
-  @DomName('SVGGlyphRefElement.dy')
-  @DocsEditable
-  num dy;
-
-  @DomName('SVGGlyphRefElement.format')
-  @DocsEditable
-  String format;
-
-  @DomName('SVGGlyphRefElement.glyphRef')
-  @DocsEditable
-  String glyphRef;
-
-  @DomName('SVGGlyphRefElement.x')
-  @DocsEditable
-  num x;
-
-  @DomName('SVGGlyphRefElement.y')
-  @DocsEditable
-  num y;
-
-  // From SVGURIReference
-
-  @DomName('SVGGlyphRefElement.href')
-  @DocsEditable
-  final AnimatedString href;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
 @DomName('SVGGradientElement')
-class _SVGGradientElement extends StyledElement implements UriReference, ExternalResourcesRequired native "*SVGGradientElement" {
+class _GradientElement extends StyledElement implements UriReference, ExternalResourcesRequired native "*SVGGradientElement" {
 
   static const int SVG_SPREADMETHOD_PAD = 1;
 
@@ -7747,8 +7331,167 @@
 
 
 @DocsEditable
+@DomName('SVGAltGlyphDefElement')
+abstract class _SVGAltGlyphDefElement extends SvgElement native "*SVGAltGlyphDefElement" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('SVGAltGlyphItemElement')
+abstract class _SVGAltGlyphItemElement extends SvgElement native "*SVGAltGlyphItemElement" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('SVGAnimateColorElement')
+abstract class _SVGAnimateColorElement extends AnimationElement native "*SVGAnimateColorElement" {
+}
+// 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.
+
+
+// Hack because the baseclass is private in dart:html, and we want to omit this
+// type entirely but can't.
+@DocsEditable
+@DomName('SVGColor')
+class _SVGColor native "*SVGColor" {
+  _SVGColor.internal();
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('SVGComponentTransferFunctionElement')
+abstract class _SVGComponentTransferFunctionElement extends SvgElement native "*SVGComponentTransferFunctionElement" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('SVGCursorElement')
+abstract class _SVGCursorElement extends SvgElement implements UriReference, Tests, ExternalResourcesRequired native "*SVGCursorElement" {
+
+  @DomName('SVGCursorElement.SVGCursorElement')
+  @DocsEditable
+  factory _SVGCursorElement() => _SvgElementFactoryProvider.createSvgElement_tag("cursor");
+
+  /// Checks if this type is supported on the current platform.
+  static bool get supported => SvgElement.isTagSupported('cursor') && (new SvgElement.tag('cursor') is _SVGCursorElement);
+
+  // From SVGExternalResourcesRequired
+
+  // From SVGTests
+
+  // From SVGURIReference
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('SVGFEDropShadowElement')
+abstract class _SVGFEDropShadowElement extends StyledElement implements FilterPrimitiveStandardAttributes native "*SVGFEDropShadowElement" {
+
+  // From SVGFilterPrimitiveStandardAttributes
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('SVGFontElement')
+abstract class _SVGFontElement extends SvgElement native "*SVGFontElement" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('SVGFontFaceElement')
+abstract class _SVGFontFaceElement extends SvgElement native "*SVGFontFaceElement" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('SVGFontFaceFormatElement')
+abstract class _SVGFontFaceFormatElement extends SvgElement native "*SVGFontFaceFormatElement" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('SVGFontFaceNameElement')
+abstract class _SVGFontFaceNameElement extends SvgElement native "*SVGFontFaceNameElement" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('SVGFontFaceSrcElement')
+abstract class _SVGFontFaceSrcElement extends SvgElement native "*SVGFontFaceSrcElement" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('SVGFontFaceUriElement')
+abstract class _SVGFontFaceUriElement extends SvgElement native "*SVGFontFaceUriElement" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('SVGGlyphElement')
+abstract class _SVGGlyphElement extends SvgElement native "*SVGGlyphElement" {
+
+  @DomName('SVGGlyphElement.SVGGlyphElement')
+  @DocsEditable
+  factory _SVGGlyphElement() => _SvgElementFactoryProvider.createSvgElement_tag("glyph");
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('SVGGlyphRefElement')
+abstract class _SVGGlyphRefElement extends StyledElement implements UriReference native "*SVGGlyphRefElement" {
+
+  // From SVGURIReference
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
 @DomName('SVGHKernElement')
-class _SVGHKernElement extends SvgElement native "*SVGHKernElement" {
+abstract class _SVGHKernElement extends SvgElement native "*SVGHKernElement" {
 
   @DomName('SVGHKernElement.SVGHKernElement')
   @DocsEditable
@@ -7761,7 +7504,7 @@
 
 @DocsEditable
 @DomName('SVGMPathElement')
-class _SVGMPathElement extends SvgElement implements UriReference, ExternalResourcesRequired native "*SVGMPathElement" {
+abstract class _SVGMPathElement extends SvgElement implements UriReference, ExternalResourcesRequired native "*SVGMPathElement" {
 
   @DomName('SVGMPathElement.SVGMPathElement')
   @DocsEditable
@@ -7769,15 +7512,7 @@
 
   // From SVGExternalResourcesRequired
 
-  @DomName('SVGMPathElement.externalResourcesRequired')
-  @DocsEditable
-  final AnimatedBoolean externalResourcesRequired;
-
   // From SVGURIReference
-
-  @DomName('SVGMPathElement.href')
-  @DocsEditable
-  final AnimatedString href;
 }
 // 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
@@ -7786,7 +7521,16 @@
 
 @DocsEditable
 @DomName('SVGMissingGlyphElement')
-class _SVGMissingGlyphElement extends StyledElement native "*SVGMissingGlyphElement" {
+abstract class _SVGMissingGlyphElement extends StyledElement native "*SVGMissingGlyphElement" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
+@DomName('SVGPaint')
+abstract class _SVGPaint extends _SVGColor native "*SVGPaint" {
 }
 // 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
@@ -7795,17 +7539,13 @@
 
 @DocsEditable
 @DomName('SVGTRefElement')
-class _SVGTRefElement extends TextPositioningElement implements UriReference native "*SVGTRefElement" {
+abstract class _SVGTRefElement extends TextPositioningElement implements UriReference native "*SVGTRefElement" {
 
   @DomName('SVGTRefElement.SVGTRefElement')
   @DocsEditable
   factory _SVGTRefElement() => _SvgElementFactoryProvider.createSvgElement_tag("tref");
 
   // From SVGURIReference
-
-  @DomName('SVGTRefElement.href')
-  @DocsEditable
-  final AnimatedString href;
 }
 // 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
@@ -7814,7 +7554,7 @@
 
 @DocsEditable
 @DomName('SVGVKernElement')
-class _SVGVKernElement extends SvgElement native "*SVGVKernElement" {
+abstract class _SVGVKernElement extends SvgElement native "*SVGVKernElement" {
 
   @DomName('SVGVKernElement.SVGVKernElement')
   @DocsEditable
diff --git a/sdk/lib/svg/dartium/svg_dartium.dart b/sdk/lib/svg/dartium/svg_dartium.dart
index a665e68..e9532a9 100644
--- a/sdk/lib/svg/dartium/svg_dartium.dart
+++ b/sdk/lib/svg/dartium/svg_dartium.dart
@@ -839,47 +839,6 @@
 
 
 @DocsEditable
-@DomName('SVGColor')
-class Color extends CssValue {
-  Color.internal() : super.internal();
-
-  static const int SVG_COLORTYPE_CURRENTCOLOR = 3;
-
-  static const int SVG_COLORTYPE_RGBCOLOR = 1;
-
-  static const int SVG_COLORTYPE_RGBCOLOR_ICCCOLOR = 2;
-
-  static const int SVG_COLORTYPE_UNKNOWN = 0;
-
-  @DomName('SVGColor.colorType')
-  @DocsEditable
-  int get colorType native "SVGColor_colorType_Getter";
-
-  @DomName('SVGColor.rgbColor')
-  @DocsEditable
-  CssRgbColor get rgbColor native "SVGColor_rgbColor_Getter";
-
-  @DomName('SVGColor.setColor')
-  @DocsEditable
-  void setColor(int colorType, String rgbColor, String iccColor) native "SVGColor_setColor_Callback";
-
-  @DomName('SVGColor.setRGBColor')
-  @DocsEditable
-  void setRgbColor(String rgbColor) native "SVGColor_setRGBColor_Callback";
-
-  @DomName('SVGColor.setRGBColorICCColor')
-  @DocsEditable
-  void setRgbColorIccColor(String rgbColor, String iccColor) native "SVGColor_setRGBColorICCColor_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
 @DomName('SVGDefsElement')
 class DefsElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace {
   DefsElement.internal() : super.internal();
@@ -3332,11 +3291,12 @@
 
   // SVG Collections expose numberOfItems rather than length.
   int get length => numberOfItems;
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Length)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Length reduce(Length combine(Length value, Length element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Length)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Length element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -3344,7 +3304,7 @@
 
   void forEach(void f(Length element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Length element)) =>
@@ -3444,12 +3404,6 @@
     throw new StateError("More than one element");
   }
 
-  Length min([int compare(Length a, Length b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Length max([int compare(Length a, Length b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Length element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -3466,14 +3420,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Length element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -3494,17 +3440,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Length> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Length> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Length>[]);
   }
 
-  List<Length> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Length> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Length> mixins.
 
   @DomName('SVGLengthList.appendItem')
@@ -3642,7 +3595,7 @@
 
 @DocsEditable
 @DomName('SVGLinearGradientElement')
-class LinearGradientElement extends _SVGGradientElement {
+class LinearGradientElement extends _GradientElement {
   LinearGradientElement.internal() : super.internal();
 
   @DomName('SVGLinearGradientElement.SVGLinearGradientElement')
@@ -4047,11 +4000,12 @@
 
   // SVG Collections expose numberOfItems rather than length.
   int get length => numberOfItems;
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Number)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Number reduce(Number combine(Number value, Number element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Number)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Number element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -4059,7 +4013,7 @@
 
   void forEach(void f(Number element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Number element)) =>
@@ -4159,12 +4113,6 @@
     throw new StateError("More than one element");
   }
 
-  Number min([int compare(Number a, Number b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Number max([int compare(Number a, Number b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Number element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -4181,14 +4129,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Number element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -4209,17 +4149,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Number> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Number> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Number>[]);
   }
 
-  List<Number> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Number> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Number> mixins.
 
   @DomName('SVGNumberList.appendItem')
@@ -4259,55 +4206,6 @@
 
 
 @DocsEditable
-@DomName('SVGPaint')
-class Paint extends Color {
-  Paint.internal() : super.internal();
-
-  static const int SVG_PAINTTYPE_CURRENTCOLOR = 102;
-
-  static const int SVG_PAINTTYPE_NONE = 101;
-
-  static const int SVG_PAINTTYPE_RGBCOLOR = 1;
-
-  static const int SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR = 2;
-
-  static const int SVG_PAINTTYPE_UNKNOWN = 0;
-
-  static const int SVG_PAINTTYPE_URI = 107;
-
-  static const int SVG_PAINTTYPE_URI_CURRENTCOLOR = 104;
-
-  static const int SVG_PAINTTYPE_URI_NONE = 103;
-
-  static const int SVG_PAINTTYPE_URI_RGBCOLOR = 105;
-
-  static const int SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR = 106;
-
-  @DomName('SVGPaint.paintType')
-  @DocsEditable
-  int get paintType native "SVGPaint_paintType_Getter";
-
-  @DomName('SVGPaint.uri')
-  @DocsEditable
-  String get uri native "SVGPaint_uri_Getter";
-
-  @DomName('SVGPaint.setPaint')
-  @DocsEditable
-  void setPaint(int paintType, String uri, String rgbColor, String iccColor) native "SVGPaint_setPaint_Callback";
-
-  @DomName('SVGPaint.setUri')
-  @DocsEditable
-  void setUri(String uri) native "SVGPaint_setUri_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
 @DomName('SVGPathElement')
 class PathElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace {
   PathElement.internal() : super.internal();
@@ -5238,11 +5136,12 @@
 
   // SVG Collections expose numberOfItems rather than length.
   int get length => numberOfItems;
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, PathSeg)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  PathSeg reduce(PathSeg combine(PathSeg value, PathSeg element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, PathSeg)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, PathSeg element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -5250,7 +5149,7 @@
 
   void forEach(void f(PathSeg element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(PathSeg element)) =>
@@ -5350,12 +5249,6 @@
     throw new StateError("More than one element");
   }
 
-  PathSeg min([int compare(PathSeg a, PathSeg b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  PathSeg max([int compare(PathSeg a, PathSeg b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, PathSeg element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -5372,14 +5265,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(PathSeg element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -5400,17 +5285,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<PathSeg> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<PathSeg> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <PathSeg>[]);
   }
 
-  List<PathSeg> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, PathSeg> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<PathSeg> mixins.
 
   @DomName('SVGPathSegList.appendItem')
@@ -5915,7 +5807,7 @@
 
 @DocsEditable
 @DomName('SVGRadialGradientElement')
-class RadialGradientElement extends _SVGGradientElement {
+class RadialGradientElement extends _GradientElement {
   RadialGradientElement.internal() : super.internal();
 
   @DomName('SVGRadialGradientElement.SVGRadialGradientElement')
@@ -6234,11 +6126,12 @@
 
   // SVG Collections expose numberOfItems rather than length.
   int get length => numberOfItems;
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, String)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  String reduce(String combine(String value, String element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, String)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, String element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -6246,7 +6139,7 @@
 
   void forEach(void f(String element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(String element)) =>
@@ -6346,12 +6239,6 @@
     throw new StateError("More than one element");
   }
 
-  String min([int compare(String a, String b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  String max([int compare(String a, String b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, String element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -6368,14 +6255,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(String element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -6396,17 +6275,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<String> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<String> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <String>[]);
   }
 
-  List<String> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, String> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<String> mixins.
 
   @DomName('SVGStringList.appendItem')
@@ -6523,10 +6409,6 @@
   @DocsEditable
   CssStyleDeclaration get style native "SVGStyledElement_style_Getter";
 
-  @DomName('SVGStyledElement.getPresentationAttribute')
-  @DocsEditable
-  CssValue getPresentationAttribute(String name) native "SVGStyledElement_getPresentationAttribute_Callback";
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -7499,11 +7381,12 @@
 
   // SVG Collections expose numberOfItems rather than length.
   int get length => numberOfItems;
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Transform)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Transform reduce(Transform combine(Transform value, Transform element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Transform)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Transform element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -7511,7 +7394,7 @@
 
   void forEach(void f(Transform element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Transform element)) =>
@@ -7611,12 +7494,6 @@
     throw new StateError("More than one element");
   }
 
-  Transform min([int compare(Transform a, Transform b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Transform max([int compare(Transform a, Transform b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Transform element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -7633,14 +7510,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Transform element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -7661,17 +7530,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Transform> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Transform> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Transform>[]);
   }
 
-  List<Transform> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Transform> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Transform> mixins.
 
   @DomName('SVGTransformList.appendItem')
@@ -8084,11 +7960,12 @@
     return new FixedSizeListIterator<ElementInstance>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, ElementInstance)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  ElementInstance reduce(ElementInstance combine(ElementInstance value, ElementInstance element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, ElementInstance)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, ElementInstance element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -8096,7 +7973,7 @@
 
   void forEach(void f(ElementInstance element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(ElementInstance element)) =>
@@ -8198,12 +8075,6 @@
     throw new StateError("More than one element");
   }
 
-  ElementInstance min([int compare(ElementInstance a, ElementInstance b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  ElementInstance max([int compare(ElementInstance a, ElementInstance b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, ElementInstance element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -8220,14 +8091,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(ElementInstance element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -8248,17 +8111,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<ElementInstance> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<ElementInstance> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <ElementInstance>[]);
   }
 
-  List<ElementInstance> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, ElementInstance> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<ElementInstance> mixins.
 
   @DomName('SVGElementInstanceList.item')
@@ -8274,370 +8144,9 @@
 
 
 @DocsEditable
-@DomName('SVGAltGlyphDefElement')
-class _SVGAltGlyphDefElement extends SvgElement {
-  _SVGAltGlyphDefElement.internal() : super.internal();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('SVGAltGlyphItemElement')
-class _SVGAltGlyphItemElement extends SvgElement {
-  _SVGAltGlyphItemElement.internal() : super.internal();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('SVGAnimateColorElement')
-class _SVGAnimateColorElement extends AnimationElement {
-  _SVGAnimateColorElement.internal() : super.internal();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('SVGComponentTransferFunctionElement')
-class _SVGComponentTransferFunctionElement extends SvgElement {
-  _SVGComponentTransferFunctionElement.internal() : super.internal();
-
-  static const int SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE = 3;
-
-  static const int SVG_FECOMPONENTTRANSFER_TYPE_GAMMA = 5;
-
-  static const int SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY = 1;
-
-  static const int SVG_FECOMPONENTTRANSFER_TYPE_LINEAR = 4;
-
-  static const int SVG_FECOMPONENTTRANSFER_TYPE_TABLE = 2;
-
-  static const int SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN = 0;
-
-  @DomName('SVGComponentTransferFunctionElement.amplitude')
-  @DocsEditable
-  AnimatedNumber get amplitude native "SVGComponentTransferFunctionElement_amplitude_Getter";
-
-  @DomName('SVGComponentTransferFunctionElement.exponent')
-  @DocsEditable
-  AnimatedNumber get exponent native "SVGComponentTransferFunctionElement_exponent_Getter";
-
-  @DomName('SVGComponentTransferFunctionElement.intercept')
-  @DocsEditable
-  AnimatedNumber get intercept native "SVGComponentTransferFunctionElement_intercept_Getter";
-
-  @DomName('SVGComponentTransferFunctionElement.offset')
-  @DocsEditable
-  AnimatedNumber get gradientOffset native "SVGComponentTransferFunctionElement_offset_Getter";
-
-  @DomName('SVGComponentTransferFunctionElement.slope')
-  @DocsEditable
-  AnimatedNumber get slope native "SVGComponentTransferFunctionElement_slope_Getter";
-
-  @DomName('SVGComponentTransferFunctionElement.tableValues')
-  @DocsEditable
-  AnimatedNumberList get tableValues native "SVGComponentTransferFunctionElement_tableValues_Getter";
-
-  @DomName('SVGComponentTransferFunctionElement.type')
-  @DocsEditable
-  AnimatedEnumeration get type native "SVGComponentTransferFunctionElement_type_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('SVGCursorElement')
-class _SVGCursorElement extends SvgElement implements UriReference, Tests, ExternalResourcesRequired {
-  _SVGCursorElement.internal() : super.internal();
-
-  @DomName('SVGCursorElement.SVGCursorElement')
-  @DocsEditable
-  factory _SVGCursorElement() => _SvgElementFactoryProvider.createSvgElement_tag("cursor");
-
-  /// Checks if this type is supported on the current platform.
-  static bool get supported => true;
-
-  @DomName('SVGCursorElement.x')
-  @DocsEditable
-  AnimatedLength get x native "SVGCursorElement_x_Getter";
-
-  @DomName('SVGCursorElement.y')
-  @DocsEditable
-  AnimatedLength get y native "SVGCursorElement_y_Getter";
-
-  @DomName('SVGCursorElement.externalResourcesRequired')
-  @DocsEditable
-  AnimatedBoolean get externalResourcesRequired native "SVGCursorElement_externalResourcesRequired_Getter";
-
-  @DomName('SVGCursorElement.requiredExtensions')
-  @DocsEditable
-  StringList get requiredExtensions native "SVGCursorElement_requiredExtensions_Getter";
-
-  @DomName('SVGCursorElement.requiredFeatures')
-  @DocsEditable
-  StringList get requiredFeatures native "SVGCursorElement_requiredFeatures_Getter";
-
-  @DomName('SVGCursorElement.systemLanguage')
-  @DocsEditable
-  StringList get systemLanguage native "SVGCursorElement_systemLanguage_Getter";
-
-  @DomName('SVGCursorElement.hasExtension')
-  @DocsEditable
-  bool hasExtension(String extension) native "SVGCursorElement_hasExtension_Callback";
-
-  @DomName('SVGCursorElement.href')
-  @DocsEditable
-  AnimatedString get href native "SVGCursorElement_href_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('SVGFEDropShadowElement')
-class _SVGFEDropShadowElement extends StyledElement implements FilterPrimitiveStandardAttributes {
-  _SVGFEDropShadowElement.internal() : super.internal();
-
-  @DomName('SVGFEDropShadowElement.dx')
-  @DocsEditable
-  AnimatedNumber get dx native "SVGFEDropShadowElement_dx_Getter";
-
-  @DomName('SVGFEDropShadowElement.dy')
-  @DocsEditable
-  AnimatedNumber get dy native "SVGFEDropShadowElement_dy_Getter";
-
-  @DomName('SVGFEDropShadowElement.in1')
-  @DocsEditable
-  AnimatedString get in1 native "SVGFEDropShadowElement_in1_Getter";
-
-  @DomName('SVGFEDropShadowElement.stdDeviationX')
-  @DocsEditable
-  AnimatedNumber get stdDeviationX native "SVGFEDropShadowElement_stdDeviationX_Getter";
-
-  @DomName('SVGFEDropShadowElement.stdDeviationY')
-  @DocsEditable
-  AnimatedNumber get stdDeviationY native "SVGFEDropShadowElement_stdDeviationY_Getter";
-
-  @DomName('SVGFEDropShadowElement.setStdDeviation')
-  @DocsEditable
-  void setStdDeviation(num stdDeviationX, num stdDeviationY) native "SVGFEDropShadowElement_setStdDeviation_Callback";
-
-  @DomName('SVGFEDropShadowElement.height')
-  @DocsEditable
-  AnimatedLength get height native "SVGFEDropShadowElement_height_Getter";
-
-  @DomName('SVGFEDropShadowElement.result')
-  @DocsEditable
-  AnimatedString get result native "SVGFEDropShadowElement_result_Getter";
-
-  @DomName('SVGFEDropShadowElement.width')
-  @DocsEditable
-  AnimatedLength get width native "SVGFEDropShadowElement_width_Getter";
-
-  @DomName('SVGFEDropShadowElement.x')
-  @DocsEditable
-  AnimatedLength get x native "SVGFEDropShadowElement_x_Getter";
-
-  @DomName('SVGFEDropShadowElement.y')
-  @DocsEditable
-  AnimatedLength get y native "SVGFEDropShadowElement_y_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('SVGFontElement')
-class _SVGFontElement extends SvgElement {
-  _SVGFontElement.internal() : super.internal();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('SVGFontFaceElement')
-class _SVGFontFaceElement extends SvgElement {
-  _SVGFontFaceElement.internal() : super.internal();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('SVGFontFaceFormatElement')
-class _SVGFontFaceFormatElement extends SvgElement {
-  _SVGFontFaceFormatElement.internal() : super.internal();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('SVGFontFaceNameElement')
-class _SVGFontFaceNameElement extends SvgElement {
-  _SVGFontFaceNameElement.internal() : super.internal();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('SVGFontFaceSrcElement')
-class _SVGFontFaceSrcElement extends SvgElement {
-  _SVGFontFaceSrcElement.internal() : super.internal();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('SVGFontFaceUriElement')
-class _SVGFontFaceUriElement extends SvgElement {
-  _SVGFontFaceUriElement.internal() : super.internal();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('SVGGlyphElement')
-class _SVGGlyphElement extends SvgElement {
-  _SVGGlyphElement.internal() : super.internal();
-
-  @DomName('SVGGlyphElement.SVGGlyphElement')
-  @DocsEditable
-  factory _SVGGlyphElement() => _SvgElementFactoryProvider.createSvgElement_tag("glyph");
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('SVGGlyphRefElement')
-class _SVGGlyphRefElement extends StyledElement implements UriReference {
-  _SVGGlyphRefElement.internal() : super.internal();
-
-  @DomName('SVGGlyphRefElement.dx')
-  @DocsEditable
-  num get dx native "SVGGlyphRefElement_dx_Getter";
-
-  @DomName('SVGGlyphRefElement.dx')
-  @DocsEditable
-  void set dx(num value) native "SVGGlyphRefElement_dx_Setter";
-
-  @DomName('SVGGlyphRefElement.dy')
-  @DocsEditable
-  num get dy native "SVGGlyphRefElement_dy_Getter";
-
-  @DomName('SVGGlyphRefElement.dy')
-  @DocsEditable
-  void set dy(num value) native "SVGGlyphRefElement_dy_Setter";
-
-  @DomName('SVGGlyphRefElement.format')
-  @DocsEditable
-  String get format native "SVGGlyphRefElement_format_Getter";
-
-  @DomName('SVGGlyphRefElement.format')
-  @DocsEditable
-  void set format(String value) native "SVGGlyphRefElement_format_Setter";
-
-  @DomName('SVGGlyphRefElement.glyphRef')
-  @DocsEditable
-  String get glyphRef native "SVGGlyphRefElement_glyphRef_Getter";
-
-  @DomName('SVGGlyphRefElement.glyphRef')
-  @DocsEditable
-  void set glyphRef(String value) native "SVGGlyphRefElement_glyphRef_Setter";
-
-  @DomName('SVGGlyphRefElement.x')
-  @DocsEditable
-  num get x native "SVGGlyphRefElement_x_Getter";
-
-  @DomName('SVGGlyphRefElement.x')
-  @DocsEditable
-  void set x(num value) native "SVGGlyphRefElement_x_Setter";
-
-  @DomName('SVGGlyphRefElement.y')
-  @DocsEditable
-  num get y native "SVGGlyphRefElement_y_Getter";
-
-  @DomName('SVGGlyphRefElement.y')
-  @DocsEditable
-  void set y(num value) native "SVGGlyphRefElement_y_Setter";
-
-  @DomName('SVGGlyphRefElement.href')
-  @DocsEditable
-  AnimatedString get href native "SVGGlyphRefElement_href_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
 @DomName('SVGGradientElement')
-class _SVGGradientElement extends StyledElement implements UriReference, ExternalResourcesRequired {
-  _SVGGradientElement.internal() : super.internal();
+class _GradientElement extends StyledElement implements UriReference, ExternalResourcesRequired {
+  _GradientElement.internal() : super.internal();
 
   static const int SVG_SPREADMETHOD_PAD = 1;
 
@@ -8676,8 +8185,213 @@
 
 
 @DocsEditable
+@DomName('SVGAltGlyphDefElement')
+abstract class _SVGAltGlyphDefElement extends SvgElement {
+  _SVGAltGlyphDefElement.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('SVGAltGlyphItemElement')
+abstract class _SVGAltGlyphItemElement extends SvgElement {
+  _SVGAltGlyphItemElement.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('SVGAnimateColorElement')
+abstract class _SVGAnimateColorElement extends AnimationElement {
+  _SVGAnimateColorElement.internal() : super.internal();
+
+}
+// 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.
+
+
+// Hack because the baseclass is private in dart:html, and we want to omit this
+// type entirely but can't.
+@DocsEditable
+@DomName('SVGColor')
+class _SVGColor {
+  _SVGColor.internal();
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('SVGComponentTransferFunctionElement')
+abstract class _SVGComponentTransferFunctionElement extends SvgElement {
+  _SVGComponentTransferFunctionElement.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('SVGCursorElement')
+abstract class _SVGCursorElement extends SvgElement implements UriReference, Tests, ExternalResourcesRequired {
+  _SVGCursorElement.internal() : super.internal();
+
+  @DomName('SVGCursorElement.SVGCursorElement')
+  @DocsEditable
+  factory _SVGCursorElement() => _SvgElementFactoryProvider.createSvgElement_tag("cursor");
+
+  /// Checks if this type is supported on the current platform.
+  static bool get supported => true;
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('SVGFEDropShadowElement')
+abstract class _SVGFEDropShadowElement extends StyledElement implements FilterPrimitiveStandardAttributes {
+  _SVGFEDropShadowElement.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('SVGFontElement')
+abstract class _SVGFontElement extends SvgElement {
+  _SVGFontElement.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('SVGFontFaceElement')
+abstract class _SVGFontFaceElement extends SvgElement {
+  _SVGFontFaceElement.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('SVGFontFaceFormatElement')
+abstract class _SVGFontFaceFormatElement extends SvgElement {
+  _SVGFontFaceFormatElement.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('SVGFontFaceNameElement')
+abstract class _SVGFontFaceNameElement extends SvgElement {
+  _SVGFontFaceNameElement.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('SVGFontFaceSrcElement')
+abstract class _SVGFontFaceSrcElement extends SvgElement {
+  _SVGFontFaceSrcElement.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('SVGFontFaceUriElement')
+abstract class _SVGFontFaceUriElement extends SvgElement {
+  _SVGFontFaceUriElement.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('SVGGlyphElement')
+abstract class _SVGGlyphElement extends SvgElement {
+  _SVGGlyphElement.internal() : super.internal();
+
+  @DomName('SVGGlyphElement.SVGGlyphElement')
+  @DocsEditable
+  factory _SVGGlyphElement() => _SvgElementFactoryProvider.createSvgElement_tag("glyph");
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
+@DomName('SVGGlyphRefElement')
+abstract class _SVGGlyphRefElement extends StyledElement implements UriReference {
+  _SVGGlyphRefElement.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
 @DomName('SVGHKernElement')
-class _SVGHKernElement extends SvgElement {
+abstract class _SVGHKernElement extends SvgElement {
   _SVGHKernElement.internal() : super.internal();
 
   @DomName('SVGHKernElement.SVGHKernElement')
@@ -8694,21 +8408,13 @@
 
 @DocsEditable
 @DomName('SVGMPathElement')
-class _SVGMPathElement extends SvgElement implements UriReference, ExternalResourcesRequired {
+abstract class _SVGMPathElement extends SvgElement implements UriReference, ExternalResourcesRequired {
   _SVGMPathElement.internal() : super.internal();
 
   @DomName('SVGMPathElement.SVGMPathElement')
   @DocsEditable
   factory _SVGMPathElement() => _SvgElementFactoryProvider.createSvgElement_tag("mpath");
 
-  @DomName('SVGMPathElement.externalResourcesRequired')
-  @DocsEditable
-  AnimatedBoolean get externalResourcesRequired native "SVGMPathElement_externalResourcesRequired_Getter";
-
-  @DomName('SVGMPathElement.href')
-  @DocsEditable
-  AnimatedString get href native "SVGMPathElement_href_Getter";
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -8719,7 +8425,7 @@
 
 @DocsEditable
 @DomName('SVGMissingGlyphElement')
-class _SVGMissingGlyphElement extends StyledElement {
+abstract class _SVGMissingGlyphElement extends StyledElement {
   _SVGMissingGlyphElement.internal() : super.internal();
 
 }
@@ -8731,18 +8437,27 @@
 
 
 @DocsEditable
+@DomName('SVGPaint')
+abstract class _SVGPaint extends _SVGColor {
+  _SVGPaint.internal() : super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
 @DomName('SVGTRefElement')
-class _SVGTRefElement extends TextPositioningElement implements UriReference {
+abstract class _SVGTRefElement extends TextPositioningElement implements UriReference {
   _SVGTRefElement.internal() : super.internal();
 
   @DomName('SVGTRefElement.SVGTRefElement')
   @DocsEditable
   factory _SVGTRefElement() => _SvgElementFactoryProvider.createSvgElement_tag("tref");
 
-  @DomName('SVGTRefElement.href')
-  @DocsEditable
-  AnimatedString get href native "SVGTRefElement_href_Getter";
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -8753,7 +8468,7 @@
 
 @DocsEditable
 @DomName('SVGVKernElement')
-class _SVGVKernElement extends SvgElement {
+abstract class _SVGVKernElement extends SvgElement {
   _SVGVKernElement.internal() : super.internal();
 
   @DomName('SVGVKernElement.SVGVKernElement')
diff --git a/sdk/lib/typeddata/typeddata.dart b/sdk/lib/typeddata/typeddata.dart
index 773d3cc..7a39f22 100644
--- a/sdk/lib/typeddata/typeddata.dart
+++ b/sdk/lib/typeddata/typeddata.dart
@@ -5,6 +5,7 @@
 library dart.typeddata;
 
 import 'dart:collection';
+import 'dart:_collection-dev';
 
 /**
  * A sequence of bytes underlying a typed data object.
@@ -327,6 +328,12 @@
   external factory Int8List(int length);
 
   /**
+   * Creates a [Int8List] with the same size as the [elements] list
+   * and copies over the elements.
+   */
+  external factory Int8List.fromList(List<int> elements);
+
+  /**
    * Creates an [Int8List] _view_ of the specified region in the specified
    * byte buffer. Changes in the [Int8List] will be visible in the byte
    * buffer and vice versa. If the [offsetInBytes] index of the region is not
@@ -358,6 +365,12 @@
   external factory Uint8List(int length);
 
   /**
+   * Creates a [Uint8List] with the same size as the [elements] list
+   * and copies over the elements.
+   */
+  external factory Uint8List.fromList(List<int> elements);
+
+  /**
    * Creates a [Uint8List] _view_ of the specified region in the specified
    * byte buffer. Changes in the [Uint8List] will be visible in the byte
    * buffer and vice versa. If the [offsetInBytes] index of the region is not
@@ -390,6 +403,12 @@
   external factory Uint8ClampedList(int length);
 
   /**
+   * Creates a [Uint8ClampedList] of the same size as the [elements]
+   * list and copies over the values clamping when needed.
+   */
+  external factory Uint8ClampedList.fromList(List<int> elements);
+
+  /**
    * Creates a [Uint8ClampedList] _view_ of the specified region in the
    * specified byte [buffer]. Changes in the [Uint8List] will be visible in the
    * byte buffer and vice versa. If the [offsetInBytes] index of the region is
@@ -421,6 +440,12 @@
   external factory Int16List(int length);
 
   /**
+   * Creates a [Int16List] with the same size as the [elements] list
+   * and copies over the elements.
+   */
+  external factory Int16List.fromList(List<int> elements);
+
+  /**
    * Creates an [Int16List] _view_ of the specified region in the specified
    * byte buffer. Changes in the [Int16List] will be visible in the byte
    * buffer and vice versa. If the [offsetInBytes] index of the region is not
@@ -455,6 +480,12 @@
   external factory Uint16List(int length);
 
   /**
+   * Creates a [Uint16List] with the same size as the [elements] list
+   * and copies over the elements.
+   */
+  external factory Uint16List.fromList(List<int> elements);
+
+  /**
    * Creates a [Uint16List] _view_ of the specified region in
    * the specified byte buffer. Changes in the [Uint16List] will be
    * visible in the byte buffer and vice versa. If the [offsetInBytes] index
@@ -489,6 +520,12 @@
   external factory Int32List(int length);
 
   /**
+   * Creates a [Int32List] with the same size as the [elements] list
+   * and copies over the elements.
+   */
+  external factory Int32List.fromList(List<int> elements);
+
+  /**
    * Creates an [Int32List] _view_ of the specified region in the specified
    * byte buffer. Changes in the [Int32List] will be visible in the byte
    * buffer and vice versa. If the [offsetInBytes] index of the region is not
@@ -523,6 +560,12 @@
   external factory Uint32List(int length);
 
   /**
+   * Creates a [Uint32List] with the same size as the [elements] list
+   * and copies over the elements.
+   */
+  external factory Uint32List.fromList(List<int> elements);
+
+  /**
    * Creates a [Uint32List] _view_ of the specified region in
    * the specified byte buffer. Changes in the [Uint32] will be
    * visible in the byte buffer and vice versa. If the [offsetInBytes] index
@@ -557,6 +600,12 @@
   external factory Int64List(int length);
 
   /**
+   * Creates a [Int64List] with the same size as the [elements] list
+   * and copies over the elements.
+   */
+  external factory Int64List.fromList(List<int> elements);
+
+  /**
    * Creates an [Int64List] _view_ of the specified region in the specified
    * byte buffer. Changes in the [Int64List] will be visible in the byte buffer
    * and vice versa. If the [offsetInBytes] index of the region is not
@@ -591,6 +640,12 @@
   external factory Uint64List(int length);
 
   /**
+   * Creates a [Uint64List] with the same size as the [elements] list
+   * and copies over the elements.
+   */
+  external factory Uint64List.fromList(List<int> elements);
+
+  /**
    * Creates an [Uint64List] _view_ of the specified region in
    * the specified byte buffer. Changes in the [Uint64List] will be
    * visible in the byte buffer and vice versa. If the [offsetInBytes]
@@ -627,6 +682,12 @@
   external factory Float32List(int length);
 
   /**
+   * Creates a [Float32List] with the same size as the [elements] list
+   * and copies over the elements.
+   */
+  external factory Float32List.fromList(List<double> elements);
+
+  /**
    * Creates a [Float32List] _view_ of the specified region in the specified
    * byte buffer. Changes in the [Float32List] will be visible in the byte
    * buffer and vice versa. If the [offsetInBytes] index of the region is not
@@ -662,6 +723,12 @@
   external factory Float64List(int length);
 
   /**
+   * Creates a [Float64List] with the same size as the [elements] list
+   * and copies over the elements.
+   */
+  external factory Float64List.fromList(List<double> elements);
+
+  /**
    * Creates a [Float64List] _view_ of the specified region in the specified
    * byte buffer. Changes in the [Float64List] will be visible in the byte
    * buffer and vice versa. If the [offsetInBytes] index of the region is not
diff --git a/sdk/lib/utf/utf.dart b/sdk/lib/utf/utf.dart
index 2031e62..1c8c95c 100644
--- a/sdk/lib/utf/utf.dart
+++ b/sdk/lib/utf/utf.dart
@@ -21,6 +21,8 @@
 
 /**
  * Generate a string from the provided Unicode codepoints.
+ *
+ * *Deprecated* Use [String.fromCharCodes] instead.
  */
 String codepointsToString(List<int> codepoints) {
   return new String.fromCharCodes(codepoints);
diff --git a/sdk/lib/utf/utf32.dart b/sdk/lib/utf/utf32.dart
index 1e43f01..5ddf7a7 100644
--- a/sdk/lib/utf/utf32.dart
+++ b/sdk/lib/utf/utf32.dart
@@ -57,7 +57,7 @@
  */
 String decodeUtf32(List<int> bytes, [int offset = 0, int length,
     int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
-  return codepointsToString((new Utf32BytesDecoder(bytes, offset, length,
+  return new String.fromCharCodes((new Utf32BytesDecoder(bytes, offset, length,
       replacementCodepoint)).decodeRest());
 }
 /**
@@ -70,8 +70,8 @@
 String decodeUtf32be(
     List<int> bytes, [int offset = 0, int length, bool stripBom = true,
     int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) =>
-  codepointsToString((new Utf32beBytesDecoder(bytes, offset, length, stripBom,
-      replacementCodepoint)).decodeRest());
+  new String.fromCharCodes((new Utf32beBytesDecoder(bytes, offset, length, 
+    stripBom, replacementCodepoint)).decodeRest());
 
 /**
  * Produce a String from a sequence of UTF-32LE encoded bytes. The parameters
@@ -83,8 +83,8 @@
 String decodeUtf32le(
     List<int> bytes, [int offset = 0, int length, bool stripBom = true,
     int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) =>
-    codepointsToString((new Utf32leBytesDecoder(bytes, offset, length, stripBom,
-        replacementCodepoint)).decodeRest());
+    new String.fromCharCodes((new Utf32leBytesDecoder(bytes, offset, length,
+      stripBom, replacementCodepoint)).decodeRest());
 
 /**
  * Produce a list of UTF-32 encoded bytes. This method prefixes the resulting
diff --git a/sdk/lib/utf/utf8.dart b/sdk/lib/utf/utf8.dart
index b44cbe4..893cf0f 100644
--- a/sdk/lib/utf/utf8.dart
+++ b/sdk/lib/utf/utf8.dart
@@ -43,7 +43,7 @@
  */
 String decodeUtf8(List<int> bytes, [int offset = 0, int length,
     int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
-  return codepointsToString(
+  return new String.fromCharCodes(
       (new Utf8Decoder(bytes, offset, length, replacementCodepoint))
       .decodeRest());
 }
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index ee3553b..1a36a9f 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -827,7 +827,7 @@
     if (_eventStream == null) {
       var controller = new StreamController();
       var callback = (audioData) { 
-          if (controller.hasSubscribers) {
+          if (controller.hasListener) {
             // This stream is a strange combination of broadcast and single
             // subscriber streams. We only allow one listener, but if there is
             // no listener, we don't queue up events, we just drop them on the
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index 4b410d1..3743a5d 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -1096,7 +1096,7 @@
     if (_eventStream == null) {
       var controller = new StreamController();
       var callback = (audioData) { 
-          if (controller.hasSubscribers) {
+          if (controller.hasListener) {
             // This stream is a strange combination of broadcast and single
             // subscriber streams. We only allow one listener, but if there is
             // no listener, we don't queue up events, we just drop them on the
diff --git a/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart b/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
index 00a5947..eee01a0 100644
--- a/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
+++ b/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
@@ -67,14 +67,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
-
-
-typedef void SqlTransactionSyncCallback(SqlTransactionSync 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
-// BSD-style license that can be found in the LICENSE file.
-
 
 @DocsEditable
 @DomName('Database')
@@ -120,38 +112,6 @@
 
 
 @DocsEditable
-@DomName('DatabaseSync')
-@SupportedBrowser(SupportedBrowser.CHROME)
-@SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental
-class SqlDatabaseSync native "*DatabaseSync" {
-
-  @DomName('DatabaseSync.lastErrorMessage')
-  @DocsEditable
-  final String lastErrorMessage;
-
-  @DomName('DatabaseSync.version')
-  @DocsEditable
-  final String version;
-
-  @DomName('DatabaseSync.changeVersion')
-  @DocsEditable
-  void changeVersion(String oldVersion, String newVersion, [SqlTransactionSyncCallback callback]) native;
-
-  @DomName('DatabaseSync.readTransaction')
-  @DocsEditable
-  void readTransaction(SqlTransactionSyncCallback callback) native;
-
-  @DomName('DatabaseSync.transaction')
-  @DocsEditable
-  void transaction(SqlTransactionSyncCallback callback) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
 @DomName('SQLError')
 class SqlError native "*SQLError" {
 
@@ -263,11 +223,12 @@
     return new FixedSizeListIterator<Map>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Map)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Map reduce(Map combine(Map value, Map element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Map)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Map element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -275,7 +236,7 @@
 
   void forEach(void f(Map element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Map element)) =>
@@ -377,12 +338,6 @@
     throw new StateError("More than one element");
   }
 
-  Map min([int compare(Map a, Map b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Map max([int compare(Map a, Map b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Map element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -399,14 +354,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Map element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -427,17 +374,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Map> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Map> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Map>[]);
   }
 
-  List<Map> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Map> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Map> mixins.
 
   @DomName('SQLResultSetRowList.item')
@@ -474,13 +428,21 @@
 
 
 @DocsEditable
+@DomName('DatabaseSync')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.SAFARI)
+@Experimental
+abstract class _DatabaseSync native "*DatabaseSync" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable
 @DomName('SQLTransactionSync')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
-class SqlTransactionSync native "*SQLTransactionSync" {
-
-  @DomName('SQLTransactionSync.executeSql')
-  @DocsEditable
-  SqlResultSet executeSql(String sqlStatement, List arguments) native;
+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 2fca22d..2a71887 100644
--- a/sdk/lib/web_sql/dartium/web_sql_dartium.dart
+++ b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
@@ -69,14 +69,6 @@
 // WARNING: Do not edit - generated code.
 
 
-typedef void SqlTransactionSyncCallback(SqlTransactionSync 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
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
 @DocsEditable
 @DomName('Database')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -125,42 +117,6 @@
 
 
 @DocsEditable
-@DomName('DatabaseSync')
-@SupportedBrowser(SupportedBrowser.CHROME)
-@SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental
-class SqlDatabaseSync extends NativeFieldWrapperClass1 {
-  SqlDatabaseSync.internal();
-
-  @DomName('DatabaseSync.lastErrorMessage')
-  @DocsEditable
-  String get lastErrorMessage native "DatabaseSync_lastErrorMessage_Getter";
-
-  @DomName('DatabaseSync.version')
-  @DocsEditable
-  String get version native "DatabaseSync_version_Getter";
-
-  @DomName('DatabaseSync.changeVersion')
-  @DocsEditable
-  void changeVersion(String oldVersion, String newVersion, [SqlTransactionSyncCallback callback]) native "DatabaseSync_changeVersion_Callback";
-
-  @DomName('DatabaseSync.readTransaction')
-  @DocsEditable
-  void readTransaction(SqlTransactionSyncCallback callback) native "DatabaseSync_readTransaction_Callback";
-
-  @DomName('DatabaseSync.transaction')
-  @DocsEditable
-  void transaction(SqlTransactionSyncCallback callback) native "DatabaseSync_transaction_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
 @DomName('SQLError')
 class SqlError extends NativeFieldWrapperClass1 {
   SqlError.internal();
@@ -285,11 +241,12 @@
     return new FixedSizeListIterator<Map>(this);
   }
 
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Map)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Map reduce(Map combine(Map value, Map element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, Map)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, Map element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -297,7 +254,7 @@
 
   void forEach(void f(Map element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f(Map element)) =>
@@ -399,12 +356,6 @@
     throw new StateError("More than one element");
   }
 
-  Map min([int compare(Map a, Map b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  Map max([int compare(Map a, Map b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, Map element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -421,14 +372,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test(Map element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -449,17 +392,24 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<Map> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<Map> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <Map>[]);
   }
 
-  List<Map> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, Map> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<Map> mixins.
 
   @DomName('SQLResultSetRowList.item')
@@ -495,15 +445,27 @@
 
 
 @DocsEditable
+@DomName('DatabaseSync')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.SAFARI)
+@Experimental
+abstract class _DatabaseSync extends NativeFieldWrapperClass1 {
+  _DatabaseSync.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable
 @DomName('SQLTransactionSync')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
-class SqlTransactionSync extends NativeFieldWrapperClass1 {
-  SqlTransactionSync.internal();
-
-  @DomName('SQLTransactionSync.executeSql')
-  @DocsEditable
-  SqlResultSet executeSql(String sqlStatement, List arguments) native "SQLTransactionSync_executeSql_Callback";
+abstract class _SQLTransactionSync extends NativeFieldWrapperClass1 {
+  _SQLTransactionSync.internal();
 
 }
diff --git a/tests/benchmark_smoke/benchmark_smoke_test.dart b/tests/benchmark_smoke/benchmark_smoke_test.dart
index 2e45827..53b1dac 100644
--- a/tests/benchmark_smoke/benchmark_smoke_test.dart
+++ b/tests/benchmark_smoke/benchmark_smoke_test.dart
@@ -8,6 +8,7 @@
 import 'benchmark_lib.dart';
 import 'dart:async';
 import 'dart:html';
+import '../../pkg/expect/lib/expect.dart';
 import '../../pkg/unittest/lib/unittest.dart';
 import '../../pkg/unittest/lib/html_config.dart';
 
diff --git a/tests/co19/co19-compiler.status b/tests/co19/co19-compiler.status
index e6f59d8..fa01ccd 100644
--- a/tests/co19/co19-compiler.status
+++ b/tests/co19/co19-compiler.status
@@ -168,6 +168,50 @@
 LibTest/core/Date/weekday_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
 LibTest/core/Date/year_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
 
+Language/15_Reference/1_Lexical_Rules/2_Comments_A04_t03: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A02_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/Date/compareTo_A03_t01: Fail # Uses deprecated Expect class, issue 398
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A17_t04: Fail # Uses deprecated Expect class, issue 398
+Language/07_Classes/6_Constructors/2_Factories_A06_t01: Fail # Uses deprecated Expect class, issue 398
+Language/07_Classes/6_Constructors/2_Factories_A06_t02: Fail # Uses deprecated Expect class, issue 398
+Language/07_Classes/6_Constructors/2_Factories_A06_t03: Fail # Uses deprecated Expect class, issue 398
+Language/07_Classes/6_Constructors/2_Factories_A06_t04: Fail # Uses deprecated Expect class, issue 398
+Language/09_Generics/09_Generics_A05_t01: Fail # Uses deprecated Expect class, issue 398
+Language/09_Generics/09_Generics_A05_t02: Fail # Uses deprecated Expect class, issue 398
+Language/11_Expressions/04_Booleans/1_Boolean_Conversion_A01_t01: Fail # Uses deprecated Expect class, issue 398
+Language/11_Expressions/04_Booleans/1_Boolean_Conversion_A02_t01: Fail # Uses deprecated Expect class, issue 398
+Language/11_Expressions/06_Lists_A09_t01: Fail # Uses deprecated Expect class, issue 398
+Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A02_t01: Fail # Uses deprecated Expect class, issue 398
+Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A03_t01: Fail # Uses deprecated Expect class, issue 398
+Language/11_Expressions/18_Assignment_A02_t01: Fail # Uses deprecated Expect class, issue 398
+Language/11_Expressions/18_Assignment_A04_t06: Fail # Uses deprecated Expect class, issue 398
+Language/11_Expressions/18_Assignment_A06_t01: Fail # Uses deprecated Expect class, issue 398
+Language/11_Expressions/19_Conditional_A02_t03: Fail # Uses deprecated Expect class, issue 398
+Language/11_Expressions/19_Conditional_A02_t04: Fail # Uses deprecated Expect class, issue 398
+Language/11_Expressions/19_Conditional_A04_t03: Fail # Uses deprecated Expect class, issue 398
+Language/11_Expressions/27_Unary_Expressions_A02_t03: Fail # Uses deprecated Expect class, issue 398
+Language/12_Statements/03_Variable_Declaration_A01_t01: Fail # Uses deprecated Expect class, issue 398
+Language/12_Statements/03_Variable_Declaration_A01_t02: Fail # Uses deprecated Expect class, issue 398
+Language/12_Statements/05_If_A02_t01: Fail # Uses deprecated Expect class, issue 398
+Language/12_Statements/05_If_A02_t02: Fail # Uses deprecated Expect class, issue 398
+Language/12_Statements/10_Try_A01_t01: Fail # Uses deprecated Expect class, issue 398
+Language/12_Statements/11_Return_A03_t02: Fail # Uses deprecated Expect class, issue 398
+Language/12_Statements/11_Return_A04_t01: Fail # Uses deprecated Expect class, issue 398
+Language/12_Statements/15_Assert_A03_t03: Fail # Uses deprecated Expect class, issue 398
+Language/12_Statements/15_Assert_A03_t08: Fail # Uses deprecated Expect class, issue 398
+Language/12_Statements/15_Assert_A03_t09: Fail # Uses deprecated Expect class, issue 398
+Language/12_Statements/15_Assert_A04_t02: Fail # Uses deprecated Expect class, issue 398
+Language/14_Types/2_Dynamic_Type_System_A01_t01: Fail # Uses deprecated Expect class, issue 398
+Language/14_Types/7_Type_Void_A04_t02: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/AssertionError/toString_A01_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/List/every_A01_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/List/getRange_A06_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/List/indexOf_A06_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/List/insertRange_A08_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/List/operator_subscript_A03_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/List/operator_subscripted_assignment_A03_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/Map/putIfAbsent_A01_t04: Fail # Uses deprecated Expect class, issue 398
+
 LibTest/core/int/operator_division_A01_t01: Fail # truncate/ceil/floor/round returns ints, issue 389
 
 Language/11_Expressions/06_Lists_A06_t01: Fail # Issue 397
@@ -177,5 +221,28 @@
 LibTest/core/List/addLast_A02_t01: Fail # Issue 397
 LibTest/core/List/filter_A03_t01: Fail # Issue 397
 
+LibTest/collection/Queue/Queue.from_A01_t01: fail # Issue 400
+LibTest/core/List/List.from_A01_t01: fail # Issue 400
+LibTest/core/List/operator_subscript_A01_t02: fail # Issue 400
+LibTest/core/Match/pattern_A01_t01: fail # Issue 400
+LibTest/core/Match/str_A01_t01: fail # Issue 400
+LibTest/core/RegExp/allMatches_A01_t01: fail # Issue 400
+LibTest/core/Set/intersection_A01_t02: fail # Issue 400
+LibTest/core/String/String_class_A01_t01: fail # Issue 400
+LibTest/core/String/concat_A01_t01: fail # Issue 400
+LibTest/core/String/concat_A02_t01: fail # Issue 400
+LibTest/core/String/hashCode_A01_t01: fail # Issue 400
+LibTest/core/List/List.fixedLength_A01_t01: fail # Issue 400
+LibTest/core/List/addAll_A02_t01: fail # Issue 400
+LibTest/core/List/add_A02_t01: fail # Issue 400
+LibTest/core/List/clear_A02_t01: fail # Issue 400
+LibTest/core/List/insertRange_A02_t01: fail # Issue 400
+LibTest/core/List/length_A04_t01: fail # Issue 400
+LibTest/core/List/removeLast_A02_t01: fail # Issue 400
+LibTest/core/List/removeRange_A02_t01: fail # Issue 400
+LibTest/core/Set/isSubsetOf_A01_t01: fail # Issue 400
+LibTest/core/Set/isSubsetOf_A01_t02: fail # Issue 400
+LibTest/core/List/operator_subscript_A01_t02: Fail # getRange now takes end-argument and returns Iterable. Issue 399
+
 [ $runtime == drt && $compiler == none ]
 *: Skip
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index f3f373d..49253a8 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -333,7 +333,6 @@
 Language/12_Statements/04_Local_Function_Declaration_A01_t01: Fail # Inherited from dart2js
 Language/12_Statements/04_Local_Function_Declaration_A02_t02: Fail # Inherited from dart2js
 Language/12_Statements/06_For_A01_t11: Fail # Inherited from dart2js
-Language/12_Statements/06_For_A01_t12: Fail # Inherited from dart2js
 Language/12_Statements/09_Switch_A01_t02: Fail # Inherited from VM (switch case with several labels).
 Language/12_Statements/09_Switch_A02_t01: Fail # Inherited from dart2js
 Language/12_Statements/09_Switch_A02_t02: Fail # Inherited from dart2js
@@ -399,6 +398,7 @@
 LibTest/core/int/toRadixString_A01_t01: Fail # inherited from VM
 LibTest/isolate/ReceivePort/receive_A01_t02: Fail, OK # co19 issue 276
 LibTest/isolate/isolate_api/port_A01_t01: Skip # Times out.
+LibTest/isolate/isolate_api/spawnFunction_A02_t01: Fail  # Inherited from VM.
 LibTest/isolate/isolate_api/spawnUri_A01_t01: Fail, OK # Problems with the test: encoded file name
 LibTest/isolate/isolate_api/spawnUri_A01_t02: Fail, OK # Problems with the test: encoded file name
 LibTest/isolate/isolate_api/spawnUri_A01_t03: Fail, OK # Problems with the test: encoded file name
@@ -509,6 +509,14 @@
 Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
 Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
 
+Language/15_Reference/1_Lexical_Rules/2_Comments_A04_t03: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A02_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/Date/Date.fromString_A04_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/Date/add_A06_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/Date/compareTo_A03_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/Date/difference_A03_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/Date/subtract_A06_t01: Fail # Uses deprecated Expect class, issue 398
+
 LibTest/core/double/ceil_A01_t03: Fail # truncate/ceil/floor/round returns ints, issue 389
 LibTest/core/double/ceil_A01_t04: Fail # truncate/ceil/floor/round returns ints, issue 389
 LibTest/core/double/floor_A01_t03: Fail # truncate/ceil/floor/round returns ints, issue 389
@@ -518,7 +526,10 @@
 LibTest/core/double/truncate_A01_t03: Fail # truncate/ceil/floor/round returns ints, issue 389
 LibTest/core/double/truncate_A01_t04: Fail # truncate/ceil/floor/round returns ints, issue 389
 
-LibTest/core/List/getRange_A02_t01: Fail # issue 391
+LibTest/core/List/getRange_A02_t01: Fail # issue 391, and Issue 399
+LibTest/core/List/getRange_A01_t01: Fail # getRange now takes end-argument and returns Iterable. Issue 399
+LibTest/core/List/getRange_A04_t01: Fail # getRange now takes end-argument and returns Iterable. Issue 399
+LibTest/core/List/operator_subscript_A01_t02: Fail # getRange now takes end-argument and returns Iterable. Issue 399
 
 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
@@ -529,3 +540,14 @@
 LibTest/core/List/addLast_A01_t01: Fail # Issue 397
 LibTest/core/List/addLast_A01_t03: Fail # Issue 397
 LibTest/core/List/addLast_A02_t01: Fail # Issue 397
+
+LibTest/core/List/List.fixedLength_A01_t01: Fail # Issue 400
+LibTest/core/List/addAll_A02_t01: Fail # Issue 400
+LibTest/core/List/add_A02_t01: Fail # Issue 400
+LibTest/core/List/clear_A02_t01: Fail # Issue 400
+LibTest/core/List/insertRange_A02_t01: Fail # Issue 400
+LibTest/core/List/length_A04_t01: Fail # Issue 400
+LibTest/core/List/removeLast_A02_t01: Fail # Issue 400
+LibTest/core/List/removeRange_A02_t01: Fail # Issue 400
+LibTest/core/Set/isSubsetOf_A01_t01: Fail # Issue 400
+LibTest/core/Set/isSubsetOf_A01_t02: Fail # Issue 400
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index ccd55df..91c422c 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -82,8 +82,6 @@
 Language/12_Statements/03_Variable_Declaration_A04_t08: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/04_Local_Function_Declaration_A01_t01: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/04_Local_Function_Declaration_A02_t02: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/06_For_A01_t11: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/06_For_A01_t12: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/09_Switch_A02_t01: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/09_Switch_A02_t02: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/09_Switch_A03_t01: Fail # TODO(ahe): Please triage this failure.
@@ -295,8 +293,6 @@
 
 Language/11_Expressions/11_Instance_Creation/1_New_A12_t02: Fail # http://dartbug.com/3970
 
-Language/13_Libraries_and_Scripts/3_Parts_A02_t03: Fail # http://dartbug.com/5022
-Language/13_Libraries_and_Scripts/3_Parts_A03_t01: Fail # http://dartbug.com/5022
 Language/14_Types/3_Type_Declarations/1_Typedef_A01_t01: Fail # http://dartbug.com/5022
 
 LibTest/core/List/operator_subscript_A03_t01: Fail # http://dartbug.com/9228
@@ -369,6 +365,17 @@
 # can understand so he can file a bug later.
 #
 [ $compiler == dart2js ]
+LibTest/core/List/List.fixedLength_A01_t01: fail # Issue 400
+LibTest/core/List/addAll_A02_t01: fail # Issue 400
+LibTest/core/List/add_A02_t01: fail # Issue 400
+LibTest/core/List/clear_A02_t01: fail # Issue 400
+LibTest/core/List/insertRange_A02_t01: fail # Issue 400
+LibTest/core/List/length_A04_t01: fail # Issue 400
+LibTest/core/List/removeLast_A02_t01: fail # Issue 400
+LibTest/core/List/removeRange_A02_t01: fail # Issue 400
+LibTest/core/Set/isSubsetOf_A01_t01: fail # Issue 400
+LibTest/core/Set/isSubsetOf_A01_t02: fail # Issue 400
+
 Language/11_Expressions/11_Instance_Creation/1_New_A01_t04: Fail, OK # co19 issue 241
 
 Language/11_Expressions/22_Equality_A01_t01: Fail, OK # Function declaration takes precedence over function expression.
@@ -461,6 +468,14 @@
 Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
 Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
 
+Language/15_Reference/1_Lexical_Rules/2_Comments_A04_t03: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A02_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/Date/Date.fromString_A04_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/Date/add_A06_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/Date/compareTo_A03_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/Date/difference_A03_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/Date/subtract_A06_t01: Fail # Uses deprecated Expect class, issue 398
+
 LibTest/core/double/ceil_A01_t03: Fail # truncate/ceil/floor/round returns ints, issue 389
 LibTest/core/double/ceil_A01_t04: Fail # truncate/ceil/floor/round returns ints, issue 389
 LibTest/core/double/floor_A01_t03: Fail # truncate/ceil/floor/round returns ints, issue 389
@@ -470,8 +485,6 @@
 LibTest/core/double/truncate_A01_t03: Fail # truncate/ceil/floor/round returns ints, issue 389
 LibTest/core/double/truncate_A01_t04: Fail # truncate/ceil/floor/round returns ints, issue 389
 
-LibTest/core/List/getRange_A02_t01: Fail # issue 391
-
 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
 Language/11_Expressions/11_Instance_Creation/1_New_A08_t01: Fail # Issue 397
@@ -482,12 +495,23 @@
 LibTest/core/List/addLast_A01_t03: Fail # Issue 397
 LibTest/core/List/addLast_A02_t01: Fail # Issue 397
 
+LibTest/core/List/getRange_A02_t01: Fail # issue 391, and Issue 399
+LibTest/core/List/getRange_A01_t01: Fail # getRange now takes end-argument and returns Iterable. Issue 399
+LibTest/core/List/getRange_A04_t01: Fail # getRange now takes end-argument and returns Iterable. Issue 399
+LibTest/core/List/operator_subscript_A01_t02: Fail # getRange now takes end-argument and returns Iterable. Issue 399
+
 
 # Issues with co19 test suite in checked mode.
 [ $compiler == dart2js && $checked ]
 LibTest/core/Set/intersection_A01_t01: Fail # issue 390
 LibTest/core/Set/intersection_A01_t02: Fail # issue 390
 LibTest/core/Set/intersection_A01_t03: Fail # issue 390
+LibTest/core/List/List.from_A01_t01: fail # Issue 400
+LibTest/core/List/every_A01_t01: fail # Issue 400
+LibTest/collection/Queue/Queue.from_A01_t01: Fail # Issue 400
+LibTest/collection/Queue/Queue.from_A01_t02: Fail # Issue 400
+
+
 
 # Issues with co19 test suite in browsers.
 [ $compiler == dart2js && $browser ]
@@ -546,6 +570,9 @@
 Language/11_Expressions/22_Equality_A05_t01: Fail # != cannot be called on super
 Language/11_Expressions/30_Identifier_Reference_A02_t01: Fail # Pseudo keyword "abstract".
 
+Language/12_Statements/06_For_A01_t11: Fail # http://dartbug.com/9824
+
+
 [ $compiler == dart2js && $jscl ]
 LibTest/core/Date/Date.fromString_A03_t01: Pass # Issue co19 - 121 (currently passing due to co19 issues 373 and 374)
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: Fail # IllegalJSRegExpException: '\c(' 'SyntaxError: Invalid regular expression: /\c(/: Unterminated group'
@@ -556,6 +583,8 @@
 Language/11_Expressions/06_Lists_A07_t02: Fail # generic type information is lost during canonicalization.
 Language/11_Expressions/07_Maps_A06_t02: Fail # generic type information is lost during canonicalization.
 
+
+
 #
 # The following tests may be broken, but require further review.
 #
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index c1845be..caf1431 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -2,11 +2,9 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-
 [ $runtime == vm ]
 Language/11_Expressions/33_Argument_Definition_Test_A02_t02: Crash, Pass # http://dartbug.com/9597
 
-
 [ $compiler == none && $runtime == vm && $unchecked ]
 Language/11_Expressions/11_Instance_Creation_A05_t02: Fail # TODO(vm-team): Please triage this failure.
 
@@ -188,6 +186,14 @@
 LibTest/core/double/round_A01_t02: Fail # truncate/ceil/floor/round returns ints, issue 389
 LibTest/core/double/round_A01_t04: Fail # truncate/ceil/floor/round returns ints, issue 389
 
+Language/15_Reference/1_Lexical_Rules/2_Comments_A04_t03: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A02_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/Date/Date.fromString_A04_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/Date/add_A06_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/Date/compareTo_A03_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/Date/difference_A03_t01: Fail # Uses deprecated Expect class, issue 398
+LibTest/core/Date/subtract_A06_t01: Fail # Uses deprecated Expect class, issue 398
+
 LibTest/core/Date/operator_equality_A01_t01: Fail # DateTime.== now looks at timezone, co19 issue 379
 
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t03: Fail # issue 6085
@@ -308,6 +314,9 @@
 Language/07_Classes/07_Classes_A02_t31: Fail
 Language/11_Expressions/05_Strings_A20_t01: Fail
 LibTest/isolate/ReceivePort/receive_A01_t02: Fail
+LibTest/isolate/isolate_api/spawnFunction_A02_t01: Fail
+LibTest/isolate/isolate_api/spawnUri_A02_t02: Fail
+LibTest/isolate/isolate_api/spawnUri_A02_t03: Fail
 
 LibTest/core/StringBuffer/isEmpty_A01_t01:  Fail, OK # co19 issue 355
 
@@ -395,8 +404,6 @@
 Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
 Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
 
-LibTest/core/List/getRange_A02_t01: Fail # issue 391
-
 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
 Language/11_Expressions/11_Instance_Creation/1_New_A08_t01: Fail # Issue 397
@@ -407,11 +414,32 @@
 LibTest/core/List/addLast_A01_t03: Fail # Issue 397
 LibTest/core/List/addLast_A02_t01: Fail # Issue 397
 
+LibTest/core/List/getRange_A02_t01: Fail # issue 391, and Issue 399
+LibTest/core/List/getRange_A01_t01: Fail # getRange now takes end-argument and returns Iterable. Issue 399
+LibTest/core/List/getRange_A04_t01: Fail # getRange now takes end-argument and returns Iterable. Issue 399
+LibTest/core/List/operator_subscript_A01_t02: Fail # getRange now takes end-argument and returns Iterable. Issue 399
+LibTest/core/List/List.fixedLength_A01_t01: fail # Issue 400
+LibTest/core/List/addAll_A02_t01: fail # Issue 400
+LibTest/core/List/add_A02_t01: fail # Issue 400
+LibTest/core/List/clear_A02_t01: fail # Issue 400
+LibTest/core/List/insertRange_A02_t01: fail # Issue 400
+LibTest/core/List/length_A04_t01: fail # Issue 400
+LibTest/core/List/removeLast_A02_t01: fail # Issue 400
+LibTest/core/List/removeRange_A02_t01: fail # Issue 400
+LibTest/core/Set/isSubsetOf_A01_t01: fail # Issue 400
+LibTest/core/Set/isSubsetOf_A01_t02: fail # Issue 400
 
 [ $compiler == none && $runtime == vm && $checked ]
 LibTest/core/Set/intersection_A01_t01: Fail # issue 390
 LibTest/core/Set/intersection_A01_t02: Fail # issue 390
 LibTest/core/Set/intersection_A01_t03: Fail # issue 390
+LibTest/collection/Queue/Queue.from_A01_t01: fail # Issue 400
+LibTest/collection/Queue/Queue.from_A01_t02: fail # Issue 400
+LibTest/core/List/List.from_A01_t01: fail # Issue 400
+LibTest/core/List/every_A01_t01: fail # Issue 400
+LibTest/core/Match/pattern_A01_t01: fail # Issue 400
+LibTest/core/Match/str_A01_t01: fail # Issue 400
+LibTest/core/RegExp/allMatches_A01_t01: fail # Issue 400
 
 
 [ $compiler == none && $arch == simarm ]
diff --git a/tests/compiler/dart2js/analyze_all_test.dart b/tests/compiler/dart2js/analyze_all_test.dart
index c972f82..439019d 100644
--- a/tests/compiler/dart2js/analyze_all_test.dart
+++ b/tests/compiler/dart2js/analyze_all_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String SOURCE = """
diff --git a/tests/compiler/dart2js/analyze_api_test.dart b/tests/compiler/dart2js/analyze_api_test.dart
index 7c086a5..3c92012 100644
--- a/tests/compiler/dart2js/analyze_api_test.dart
+++ b/tests/compiler/dart2js/analyze_api_test.dart
@@ -4,6 +4,7 @@
 
 library analyze_api;
 
+import "package:expect/expect.dart";
 import 'dart:uri';
 import 'dart:io';
 import '../../../sdk/lib/_internal/compiler/compiler.dart' as api;
diff --git a/tests/compiler/dart2js/analyze_only_test.dart b/tests/compiler/dart2js/analyze_only_test.dart
index ffbc7a5..394fe0d 100644
--- a/tests/compiler/dart2js/analyze_only_test.dart
+++ b/tests/compiler/dart2js/analyze_only_test.dart
@@ -5,6 +5,7 @@
 // Smoke test of the dart2js compiler API.
 library analyze_only;
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:uri';
 
diff --git a/tests/compiler/dart2js/array_static_intercept_test.dart b/tests/compiler/dart2js/array_static_intercept_test.dart
index a5b343a..ca50ccf 100644
--- a/tests/compiler/dart2js/array_static_intercept_test.dart
+++ b/tests/compiler/dart2js/array_static_intercept_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
diff --git a/tests/compiler/dart2js/backend_htype_list_test.dart b/tests/compiler/dart2js/backend_htype_list_test.dart
index 93d37a4..7b44059 100644
--- a/tests/compiler/dart2js/backend_htype_list_test.dart
+++ b/tests/compiler/dart2js/backend_htype_list_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:expect/expect.dart";
 import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart';
 
diff --git a/tests/compiler/dart2js/bad_loop_test.dart b/tests/compiler/dart2js/bad_loop_test.dart
new file mode 100644
index 0000000..aedbfc0
--- /dev/null
+++ b/tests/compiler/dart2js/bad_loop_test.dart
@@ -0,0 +1,66 @@
+// 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';
+import 'memory_source_file_helper.dart';
+
+import '../../../sdk/lib/_internal/compiler/compiler.dart'
+       show Diagnostic;
+
+main() {
+  Uri cwd = getCurrentDirectory();
+  Uri script = cwd.resolve(nativeToUriPath(new Options().script));
+  Uri libraryRoot = script.resolve('../../../sdk/');
+  Uri packageRoot = script.resolve('./packages/');
+
+  MemorySourceFileProvider.MEMORY_SOURCE_FILES = MEMORY_SOURCE_FILES;
+  var provider = new MemorySourceFileProvider();
+  int warningCount = 0;
+  int errorCount = 0;
+  void diagnosticHandler(Uri uri, int begin, int end,
+                         String message, Diagnostic kind) {
+    if (kind == Diagnostic.VERBOSE_INFO) {
+      return;
+    }
+    if (kind == Diagnostic.ERROR) {
+      errorCount++;
+    } else if (kind == Diagnostic.WARNING) {
+      warningCount++;
+    } else {
+      throw 'unexpected diagnostic $kind: $message';
+    }
+  }
+
+  Compiler compiler = new Compiler(provider.readStringFromUri,
+                                   (name, extension) => null,
+                                   diagnosticHandler,
+                                   libraryRoot,
+                                   packageRoot,
+                                   ['--analyze-only']);
+  compiler.run(new Uri('memory:main.dart'));
+  Expect.isTrue(compiler.compilationFailed);
+  Expect.equals(5, errorCount);
+  Expect.equals(1, warningCount);
+}
+
+const Map MEMORY_SOURCE_FILES = const {
+  'main.dart': """
+main() {
+  for (var x, y in []) {
+  }
+
+  for (var x = 10 in []) {
+  }
+
+  for (x.y in []) { // Also causes a warning "x unresolved".
+  }
+
+  for ((){}() in []) {
+  }
+
+  for (1 in []) {
+  }
+}
+"""
+};
diff --git a/tests/compiler/dart2js/begin_end_token_test.dart b/tests/compiler/dart2js/begin_end_token_test.dart
index b5af596..fe8c910 100644
--- a/tests/compiler/dart2js/begin_end_token_test.dart
+++ b/tests/compiler/dart2js/begin_end_token_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:expect/expect.dart";
 import 'parser_helper.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
 
diff --git a/tests/compiler/dart2js/boolified_operator_test.dart b/tests/compiler/dart2js/boolified_operator_test.dart
index 1758146..5ec4c83 100644
--- a/tests/compiler/dart2js/boolified_operator_test.dart
+++ b/tests/compiler/dart2js/boolified_operator_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library boolified_operator_test;
+import "package:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST_EQUAL = r"""
diff --git a/tests/compiler/dart2js/boolify_test.dart b/tests/compiler/dart2js/boolify_test.dart
index a1db3bb..d029379 100644
--- a/tests/compiler/dart2js/boolify_test.dart
+++ b/tests/compiler/dart2js/boolify_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library boolified_operator_test;
+import "package:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST = r"""
diff --git a/tests/compiler/dart2js/builtin_equals_test.dart b/tests/compiler/dart2js/builtin_equals_test.dart
index a2e7cda..3b1807a 100644
--- a/tests/compiler/dart2js/builtin_equals_test.dart
+++ b/tests/compiler/dart2js/builtin_equals_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST = r"""
diff --git a/tests/compiler/dart2js/builtin_interceptor_test.dart b/tests/compiler/dart2js/builtin_interceptor_test.dart
index 219da55..d26f97f 100644
--- a/tests/compiler/dart2js/builtin_interceptor_test.dart
+++ b/tests/compiler/dart2js/builtin_interceptor_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
diff --git a/tests/compiler/dart2js/call_site_simple_type_inferer_test.dart b/tests/compiler/dart2js/call_site_simple_type_inferer_test.dart
index 50be62e..b9c2b23 100644
--- a/tests/compiler/dart2js/call_site_simple_type_inferer_test.dart
+++ b/tests/compiler/dart2js/call_site_simple_type_inferer_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:expect/expect.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
     show TypeMask;
 
diff --git a/tests/compiler/dart2js/call_site_type_inferer_static_test.dart b/tests/compiler/dart2js/call_site_type_inferer_static_test.dart
index cd049c8..2081157 100644
--- a/tests/compiler/dart2js/call_site_type_inferer_static_test.dart
+++ b/tests/compiler/dart2js/call_site_type_inferer_static_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:expect/expect.dart";
 import "../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart";
 import "../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart";
 
diff --git a/tests/compiler/dart2js/call_site_type_inferer_test.dart b/tests/compiler/dart2js/call_site_type_inferer_test.dart
index 483ff78..5587405 100644
--- a/tests/compiler/dart2js/call_site_type_inferer_test.dart
+++ b/tests/compiler/dart2js/call_site_type_inferer_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:expect/expect.dart";
 import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart';
 
diff --git a/tests/compiler/dart2js/class_codegen2_test.dart b/tests/compiler/dart2js/class_codegen2_test.dart
index 730a59a..99e329d 100644
--- a/tests/compiler/dart2js/class_codegen2_test.dart
+++ b/tests/compiler/dart2js/class_codegen2_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that parameters keep their names in the output.
 
+import "package:expect/expect.dart";
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
 
diff --git a/tests/compiler/dart2js/class_codegen_test.dart b/tests/compiler/dart2js/class_codegen_test.dart
index 7a978ff..676682e 100644
--- a/tests/compiler/dart2js/class_codegen_test.dart
+++ b/tests/compiler/dart2js/class_codegen_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that parameters keep their names in the output.
 
+import "package:expect/expect.dart";
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
 
diff --git a/tests/compiler/dart2js/class_order_test.dart b/tests/compiler/dart2js/class_order_test.dart
index fcdf17a..a4cc29e 100644
--- a/tests/compiler/dart2js/class_order_test.dart
+++ b/tests/compiler/dart2js/class_order_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that parameters keep their names in the output.
 
+import "package:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
diff --git a/tests/compiler/dart2js/closure_codegen_test.dart b/tests/compiler/dart2js/closure_codegen_test.dart
index 944446b..b4399a8 100644
--- a/tests/compiler/dart2js/closure_codegen_test.dart
+++ b/tests/compiler/dart2js/closure_codegen_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that parameters keep their names in the output.
 
+import "package:expect/expect.dart";
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
 
diff --git a/tests/compiler/dart2js/code_motion_test.dart b/tests/compiler/dart2js/code_motion_test.dart
index d14cc69..0259492 100644
--- a/tests/compiler/dart2js/code_motion_test.dart
+++ b/tests/compiler/dart2js/code_motion_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index c816160..fff3a5b 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -5,6 +5,7 @@
 
 library compiler_helper;
 
+import "package:expect/expect.dart";
 import 'dart:uri';
 export 'dart:uri' show Uri;
 
@@ -77,9 +78,12 @@
 
 MockCompiler compilerFor(String code, Uri uri,
                          {bool analyzeAll: false,
+                          bool analyzeOnly: false,
                           String coreSource: DEFAULT_CORELIB}) {
   MockCompiler compiler = new MockCompiler(
-      analyzeAll: analyzeAll, coreSource: coreSource);
+      analyzeAll: analyzeAll,
+      analyzeOnly: analyzeOnly,
+      coreSource: coreSource);
   compiler.sourceFiles[uri.toString()] = new SourceFile(uri.toString(), code);
   return compiler;
 }
diff --git a/tests/compiler/dart2js/compiler_test.dart b/tests/compiler/dart2js/compiler_test.dart
index 642f7be..e9ba024 100644
--- a/tests/compiler/dart2js/compiler_test.dart
+++ b/tests/compiler/dart2js/compiler_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:expect/expect.dart";
 import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
 import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart";
 import "../../../sdk/lib/_internal/compiler/implementation/resolution/resolution.dart";
diff --git a/tests/compiler/dart2js/concrete_type_inference_test.dart b/tests/compiler/dart2js/concrete_type_inference_test.dart
index b2a83d5..6a748c6 100644
--- a/tests/compiler/dart2js/concrete_type_inference_test.dart
+++ b/tests/compiler/dart2js/concrete_type_inference_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:expect/expect.dart";
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
 
diff --git a/tests/compiler/dart2js/constant_folding_test.dart b/tests/compiler/dart2js/constant_folding_test.dart
index 0721bbd..44f2e06 100644
--- a/tests/compiler/dart2js/constant_folding_test.dart
+++ b/tests/compiler/dart2js/constant_folding_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test constant folding on numbers.
 
+import "package:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String NUMBER_FOLDING = """
diff --git a/tests/compiler/dart2js/constant_namer_test.dart b/tests/compiler/dart2js/constant_namer_test.dart
index 0816c8b..dd78c63 100644
--- a/tests/compiler/dart2js/constant_namer_test.dart
+++ b/tests/compiler/dart2js/constant_namer_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:expect/expect.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
diff --git a/tests/compiler/dart2js/cpa_inference_test.dart b/tests/compiler/dart2js/cpa_inference_test.dart
index 922bc50..98d743e 100644
--- a/tests/compiler/dart2js/cpa_inference_test.dart
+++ b/tests/compiler/dart2js/cpa_inference_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:expect/expect.dart";
 import '../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/types/types.dart';
@@ -162,7 +163,7 @@
     E operator [](int index);
     void operator []=(int index, E value);
   }
-  abstract class Map {}
+  abstract class Map<K, V> {}
   class Closure {}
   class Null {}
   class Type {}
@@ -1087,16 +1088,16 @@
       // we don't create any D on purpose
       new B(); new BB(); new C();
 
-      var a = JS('', '');
-      var b = JS('Object', '');
-      var c = JS('=List', '');
-      var d = JS('String', '');
-      var e = JS('int', '');
-      var f = JS('double', '');
-      var g = JS('num', '');
-      var h = JS('bool', '');
-      var i = JS('A', '');
-      var j = JS('X', '');
+      var a = JS('', '1');
+      var b = JS('Object', '1');
+      var c = JS('=List', '1');
+      var d = JS('String', '1');
+      var e = JS('int', '1');
+      var f = JS('double', '1');
+      var g = JS('num', '1');
+      var h = JS('bool', '1');
+      var i = JS('A', '1');
+      var j = JS('X', '1');
       a; b; c; d; e; f; g; h; i; j;
     }
     """;
diff --git a/tests/compiler/dart2js/dart_backend_test.dart b/tests/compiler/dart2js/dart_backend_test.dart
index 23f830d..3a4c2fc 100644
--- a/tests/compiler/dart2js/dart_backend_test.dart
+++ b/tests/compiler/dart2js/dart_backend_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:expect/expect.dart";
 import 'dart:async';
 import 'dart:uri';
 import 'parser_helper.dart';
diff --git a/tests/compiler/dart2js/dead_bailout_target_test.dart b/tests/compiler/dart2js/dead_bailout_target_test.dart
index c4d55db..d482467 100644
--- a/tests/compiler/dart2js/dead_bailout_target_test.dart
+++ b/tests/compiler/dart2js/dead_bailout_target_test.dart
@@ -5,6 +5,7 @@
 // This unit test of dart2js checks that a SSA bailout target
 // instruction gets removed from the graph when it's not used.
 
+import "package:expect/expect.dart";
 import 'compiler_helper.dart';
 
 String TEST = r'''
diff --git a/tests/compiler/dart2js/dead_phi_eliminator_test.dart b/tests/compiler/dart2js/dead_phi_eliminator_test.dart
index 8ba3387..4551e34 100644
--- a/tests/compiler/dart2js/dead_phi_eliminator_test.dart
+++ b/tests/compiler/dart2js/dead_phi_eliminator_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
diff --git a/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart b/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart
index 61a1e65..20d6e90 100644
--- a/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart
+++ b/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart
@@ -6,46 +6,19 @@
 // to determine which elements can be deferred and which libraries
 // much be included in the initial download (loaded eagerly).
 
-import 'dart:async' show Future;
-import 'dart:uri' show Uri;
-import 'dart:io';
-
-import '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart'
-       show Compiler;
+import 'package:expect/expect.dart';
+import 'memory_source_file_helper.dart';
 
 import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
        as dart2js;
 
-import '../../../sdk/lib/_internal/compiler/implementation/filenames.dart'
-       show getCurrentDirectory, nativeToUriPath;
-
-import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart'
-       show SourceFile;
-
-import '../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart'
-       show FormattingDiagnosticHandler,
-            SourceFileProvider;
-
-class MemorySourceFileProvider extends SourceFileProvider {
-  Future<String> readStringFromUri(Uri resourceUri) {
-    if (resourceUri.scheme != 'memory') {
-      return super.readStringFromUri(resourceUri);
-    }
-    String source = MEMORY_SOURCE_FILES[resourceUri.path];
-    // TODO(ahe): Return new Future.immediateError(...) ?
-    if (source == null) throw 'No such file $resourceUri';
-    String resourceName = '$resourceUri';
-    this.sourceFiles[resourceName] = new SourceFile(resourceName, source);
-    return new Future.immediate(source);
-  }
-}
-
 void main() {
   Uri cwd = getCurrentDirectory();
   Uri script = cwd.resolve(nativeToUriPath(new Options().script));
   Uri libraryRoot = script.resolve('../../../sdk/');
   Uri packageRoot = script.resolve('./packages/');
 
+  MemorySourceFileProvider.MEMORY_SOURCE_FILES = MEMORY_SOURCE_FILES;
   var provider = new MemorySourceFileProvider();
   var handler = new FormattingDiagnosticHandler(provider);
 
@@ -86,7 +59,7 @@
 
 main() {
   lazy.load().then((_) {
-    Expect.equals(42, new MyClass().foo(87));
+    if (42 != new MyClass().foo(87)) throw "not equal";
   });
 }
 
diff --git a/tests/compiler/dart2js/deprecated_features_test.dart b/tests/compiler/dart2js/deprecated_features_test.dart
index b2aafa2..bb884bf 100644
--- a/tests/compiler/dart2js/deprecated_features_test.dart
+++ b/tests/compiler/dart2js/deprecated_features_test.dart
@@ -4,6 +4,7 @@
 
 // Test that deprecated language features are diagnosed correctly.
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:uri';
 
diff --git a/tests/compiler/dart2js/emit_const_fields_test.dart b/tests/compiler/dart2js/emit_const_fields_test.dart
index 290c50a..d539d89 100644
--- a/tests/compiler/dart2js/emit_const_fields_test.dart
+++ b/tests/compiler/dart2js/emit_const_fields_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that unused static consts are not emitted.
 
+import "package:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST_GUIDE = r"""
diff --git a/tests/compiler/dart2js/erroneous_element_test.dart b/tests/compiler/dart2js/erroneous_element_test.dart
index 97078356..4a588e1 100644
--- a/tests/compiler/dart2js/erroneous_element_test.dart
+++ b/tests/compiler/dart2js/erroneous_element_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:expect/expect.dart";
 import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart';
 import 'parser_helper.dart';
 
diff --git a/tests/compiler/dart2js/field_codegen_test.dart b/tests/compiler/dart2js/field_codegen_test.dart
index 948b4cd..d9a8aec 100644
--- a/tests/compiler/dart2js/field_codegen_test.dart
+++ b/tests/compiler/dart2js/field_codegen_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that parameters keep their names in the output.
 
+import "package:expect/expect.dart";
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
 
diff --git a/tests/compiler/dart2js/field_type_inferer_test.dart b/tests/compiler/dart2js/field_type_inferer_test.dart
index ee5cb28..901b06e 100644
--- a/tests/compiler/dart2js/field_type_inferer_test.dart
+++ b/tests/compiler/dart2js/field_type_inferer_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:expect/expect.dart";
 import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart';
diff --git a/tests/compiler/dart2js/field_type_simple_inferer_test.dart b/tests/compiler/dart2js/field_type_simple_inferer_test.dart
index 47dc130..eae9261 100644
--- a/tests/compiler/dart2js/field_type_simple_inferer_test.dart
+++ b/tests/compiler/dart2js/field_type_simple_inferer_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:expect/expect.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
     show TypeMask;
 
diff --git a/tests/compiler/dart2js/find_my_name_test.dart b/tests/compiler/dart2js/find_my_name_test.dart
index 605524f..1c24d17 100644
--- a/tests/compiler/dart2js/find_my_name_test.dart
+++ b/tests/compiler/dart2js/find_my_name_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:expect/expect.dart";
 import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart";
 import "mock_compiler.dart";
 import "parser_helper.dart";
diff --git a/tests/compiler/dart2js/for_in_test.dart b/tests/compiler/dart2js/for_in_test.dart
index edf59b2..4ded809 100644
--- a/tests/compiler/dart2js/for_in_test.dart
+++ b/tests/compiler/dart2js/for_in_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
diff --git a/tests/compiler/dart2js/gvn_dynamic_field_get_test.dart b/tests/compiler/dart2js/gvn_dynamic_field_get_test.dart
index 9d42462..739645b 100644
--- a/tests/compiler/dart2js/gvn_dynamic_field_get_test.dart
+++ b/tests/compiler/dart2js/gvn_dynamic_field_get_test.dart
@@ -4,6 +4,7 @@
 // Test that dart2js gvns dynamic getters that don't have side
 // effects.
 
+import "package:expect/expect.dart";
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
 
diff --git a/tests/compiler/dart2js/identity_test.dart b/tests/compiler/dart2js/identity_test.dart
index 1e47d58..50c768b5 100644
--- a/tests/compiler/dart2js/identity_test.dart
+++ b/tests/compiler/dart2js/identity_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
diff --git a/tests/compiler/dart2js/interceptor_test.dart b/tests/compiler/dart2js/interceptor_test.dart
index cc965b1..5f7caa6 100644
--- a/tests/compiler/dart2js/interceptor_test.dart
+++ b/tests/compiler/dart2js/interceptor_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
diff --git a/tests/compiler/dart2js/interpolation_folding_test.dart b/tests/compiler/dart2js/interpolation_folding_test.dart
index 3734fd9..1cfc4af 100644
--- a/tests/compiler/dart2js/interpolation_folding_test.dart
+++ b/tests/compiler/dart2js/interpolation_folding_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:expect/expect.dart';
 import 'compiler_helper.dart';
 
 // Tests for
diff --git a/tests/compiler/dart2js/is_inference2_test.dart b/tests/compiler/dart2js/is_inference2_test.dart
index 36e39ba..2ce07d5 100644
--- a/tests/compiler/dart2js/is_inference2_test.dart
+++ b/tests/compiler/dart2js/is_inference2_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST_IF_BOOL_FIRST_INSTRUCTION = r"""
diff --git a/tests/compiler/dart2js/is_inference_test.dart b/tests/compiler/dart2js/is_inference_test.dart
index e282a86..7bb12fb 100644
--- a/tests/compiler/dart2js/is_inference_test.dart
+++ b/tests/compiler/dart2js/is_inference_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST_IF = r"""
diff --git a/tests/compiler/dart2js/js_parser_test.dart b/tests/compiler/dart2js/js_parser_test.dart
index 3bd6559..0bfc6bc 100644
--- a/tests/compiler/dart2js/js_parser_test.dart
+++ b/tests/compiler/dart2js/js_parser_test.dart
@@ -2,12 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:expect/expect.dart';
 import 'mock_compiler.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/js/js.dart' as jsAst;
 import '../../../sdk/lib/_internal/compiler/implementation/js/js.dart' show js;
 
 void testExpression(String expression, [String expect = ""]) {
-  jsAst.Node node = js[expression];
+  jsAst.Node node = js(expression);
   MockCompiler compiler = new MockCompiler();
   String jsText =
       jsAst.prettyPrint(node,
@@ -25,7 +26,7 @@
     Expect.isTrue(exception.toString().contains(expect));
     return true;
   }
-  Expect.throws(() => js[expression], doCheck);
+  Expect.throws(() => js(expression), doCheck);
 }
     
 
@@ -36,9 +37,14 @@
   testExpression('var a = ""');
   // Parse and print will normalize whitespace.
   testExpression(' var  a  =  "" ', 'var a = ""');
-  // *We don't do operator prescedence.
-  testError('x = a + b * c', 'Mixed + and *');
-  // But we can chain binary operators (with left associativity).
+  // Operator precedence.
+  testExpression('x = a + b * c');
+  testExpression('x = a * b + c');
+  testExpression('x = a + b * c + d');
+  testExpression('x = a * b + c * d');
+  testExpression('remaining = (remaining / 88) | 0',
+                 'remaining = remaining / 88 | 0');
+  // Binary operators have left associativity.
   testExpression('x = a + b + c');
   // We can cope with relational operators and non-relational.
   testExpression('a + b == c + d');
@@ -47,8 +53,13 @@
   // We can handle () for calls.
   testExpression('foo(bar)');
   testExpression('foo(bar, baz)');
-  // *But we can't handle chained calls without parentheses.
-  testError('foo(bar)(baz)');
+  // Chained calls without parentheses.
+  testExpression('foo(bar)(baz)');
+  // Chaned calls with and without new.
+  testExpression('new foo(bar)(baz)');
+  testExpression('new foo.bar(bar)(baz)');
+  testExpression('foo.bar(bar)(baz)');
+  testExpression('constructor = new Function(str)()');
   // The prettyprinter understands chained calls without extra parentheses.
   testExpression('(foo(bar))(baz)', 'foo(bar)(baz)');
   // Chains of dotting and calls.
@@ -65,6 +76,10 @@
   testExpression('new Foo()');
   // New with dotted access.
   testExpression('new Frobinator.frobinate()');
+  // *We don't handle dot after 'new' because we group 'new' with regular calls
+  // instead of having it together with the dot operator but with opposite
+  // associativity.
+  testError('new Frobinator().frobinate()', "DOT");
   // The prettyprinter is smarter than we are.
   testExpression('(new Frobinator()).frobinate()',
                  'new Frobinator().frobinate()');
@@ -77,8 +92,8 @@
   testError('a <=> b', 'Unknown operator');
   // Typeof.
   testExpression('typeof foo == "number"');
-  // *Strange relation.
-  testError('a < b < c', 'RELATION');
+  // Strange relation.
+  testExpression('a < b < c');
   // Chained var.
   testExpression('var x = 0, y = 1.2, z = 42');
   // Empty object literal.
@@ -90,7 +105,8 @@
   // *We should really throw here.
   testExpression('var false = 42');
   testExpression('var new = 42');
-  testExpression('var typeof = 42');
+  // Bad keyword.
+  testError('var typeof = 42', "Expected ALPHA");
   // Malformed decimal
   testError('var x = 42.', "Unparseable number");
   testError('var x = 1.1.1', "Unparseable number");
@@ -100,10 +116,15 @@
   testExpression('var foo = void 0');
   testExpression('delete foo.bar');
   testExpression('delete foo');
+  testExpression('x in y');
+  testExpression('x instanceof y');
+  testExpression('a * b in c * d');
+  testExpression('a * b instanceof c * d');
   testError('x typeof y', 'Unparsed junk');
   testExpression('x &= ~mask');
   // Adjacent tokens.
   testExpression('foo[x[bar]]');
+  testExpression('foo[[bar]]');
   // Prefix ++ etc.
   testExpression("++x");
   testExpression("++foo.bar");
@@ -123,9 +144,10 @@
   testExpression("++foo.bar++");
   testExpression("--x--");
   testExpression("--foo.bar--");
-  // *We can't handle stacked unary operators.
+  // *We can't handle stacked unary operators (apart from !).
   testError("x++ ++");
   testError("++ typeof x");
+  testExpression(r"var $supportsProtoName = !!{}.__proto__");
   // ++ used as a binary operator.
   testError("x++ ++ 42");
   // Shift operators.
diff --git a/tests/compiler/dart2js/link_test.dart b/tests/compiler/dart2js/link_test.dart
index b050ee8..55d6ae3 100644
--- a/tests/compiler/dart2js/link_test.dart
+++ b/tests/compiler/dart2js/link_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:expect/expect.dart";
 import '../../../sdk/lib/_internal/compiler/implementation/util/util.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/util/util_implementation.dart';
 
diff --git a/tests/compiler/dart2js/literal_list_test.dart b/tests/compiler/dart2js/literal_list_test.dart
index 105790e..efb146d 100644
--- a/tests/compiler/dart2js/literal_list_test.dart
+++ b/tests/compiler/dart2js/literal_list_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
diff --git a/tests/compiler/dart2js/literal_map_test.dart b/tests/compiler/dart2js/literal_map_test.dart
index 88be94d..0e30d4e 100644
--- a/tests/compiler/dart2js/literal_map_test.dart
+++ b/tests/compiler/dart2js/literal_map_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:expect/expect.dart';
 import "compiler_helper.dart";
 
 const String TEST = """
diff --git a/tests/compiler/dart2js/loop_test.dart b/tests/compiler/dart2js/loop_test.dart
index 0412b10..9be7195 100644
--- a/tests/compiler/dart2js/loop_test.dart
+++ b/tests/compiler/dart2js/loop_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
diff --git a/tests/compiler/dart2js/memory_source_file_helper.dart b/tests/compiler/dart2js/memory_source_file_helper.dart
new file mode 100644
index 0000000..16cccf3
--- /dev/null
+++ b/tests/compiler/dart2js/memory_source_file_helper.dart
@@ -0,0 +1,41 @@
+// 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 dart2js.test.memory_source_file_helper;
+
+import 'dart:async' show Future;
+import 'dart:uri' show Uri;
+export 'dart:uri' show Uri;
+import 'dart:io';
+export 'dart:io' show Options;
+
+export '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart'
+       show Compiler;
+
+export '../../../sdk/lib/_internal/compiler/implementation/filenames.dart'
+       show getCurrentDirectory, nativeToUriPath;
+
+import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart'
+       show SourceFile;
+
+import '../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart'
+       show SourceFileProvider;
+
+export '../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart'
+       show FormattingDiagnosticHandler;
+
+class MemorySourceFileProvider extends SourceFileProvider {
+  static Map MEMORY_SOURCE_FILES;
+  Future<String> readStringFromUri(Uri resourceUri) {
+    if (resourceUri.scheme != 'memory') {
+      return super.readStringFromUri(resourceUri);
+    }
+    String source = MEMORY_SOURCE_FILES[resourceUri.path];
+    // TODO(ahe): Return new Future.immediateError(...) ?
+    if (source == null) throw 'No such file $resourceUri';
+    String resourceName = '$resourceUri';
+    this.sourceFiles[resourceName] = new SourceFile(resourceName, source);
+    return new Future.immediate(source);
+  }
+}
diff --git a/tests/compiler/dart2js/metadata_test.dart b/tests/compiler/dart2js/metadata_test.dart
index c0a521c..c40d9a7 100644
--- a/tests/compiler/dart2js/metadata_test.dart
+++ b/tests/compiler/dart2js/metadata_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:expect/expect.dart";
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
 
diff --git a/tests/compiler/dart2js/minify_many_locals_test.dart b/tests/compiler/dart2js/minify_many_locals_test.dart
index dadd15c..5252816 100644
--- a/tests/compiler/dart2js/minify_many_locals_test.dart
+++ b/tests/compiler/dart2js/minify_many_locals_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that parameters keep their names in the output.
 
+import "package:expect/expect.dart";
 import 'compiler_helper.dart';
 
 main() {
diff --git a/tests/compiler/dart2js/mirrors_metadata_test.dart b/tests/compiler/dart2js/mirrors_metadata_test.dart
index 7fd8589..5b42947 100644
--- a/tests/compiler/dart2js/mirrors_metadata_test.dart
+++ b/tests/compiler/dart2js/mirrors_metadata_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:expect/expect.dart';
 import 'dart:async';
 import 'dart:io';
 import 'dart:uri';
diff --git a/tests/compiler/dart2js/mirrors_test.dart b/tests/compiler/dart2js/mirrors_test.dart
index f32e36e..2c056ba 100644
--- a/tests/compiler/dart2js/mirrors_test.dart
+++ b/tests/compiler/dart2js/mirrors_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:expect/expect.dart";
 import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart';
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index f340a47..5a7952e 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -4,6 +4,7 @@
 
 library mock_compiler;
 
+import "package:expect/expect.dart";
 import 'dart:collection';
 import 'dart:uri';
 
@@ -38,7 +39,7 @@
 }
 
 const String DEFAULT_HELPERLIB = r'''
-  $throw(x) { return x; }
+  wrapException(x) { return x; }
   iae(x) { throw x; } ioore(x) { throw x; }
   guard$array(x) { return x; }
   guard$num(x) { return x; }
@@ -235,7 +236,8 @@
   }
 
   void reportWarning(Node node, var message) {
-    warnings.add(new WarningMessage(node, message.message));
+    if (message is! Message) message = message.message;
+    warnings.add(new WarningMessage(node, message));
   }
 
   void reportError(Node node, var message) {
@@ -243,7 +245,8 @@
       // TODO(ahe): Fix the MockCompiler to not have this problem.
       return;
     }
-    errors.add(new WarningMessage(node, message.message));
+    if (message is! Message) message = message.message;
+    errors.add(new WarningMessage(node, message));
   }
 
   void reportMessage(SourceSpan span, var message, api.Diagnostic kind) {
diff --git a/tests/compiler/dart2js/no_constructor_body_test.dart b/tests/compiler/dart2js/no_constructor_body_test.dart
index 4d25d01..0036e24 100644
--- a/tests/compiler/dart2js/no_constructor_body_test.dart
+++ b/tests/compiler/dart2js/no_constructor_body_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST = r"""
diff --git a/tests/compiler/dart2js/null_type_test.dart b/tests/compiler/dart2js/null_type_test.dart
index 0abc65f..a413027 100644
--- a/tests/compiler/dart2js/null_type_test.dart
+++ b/tests/compiler/dart2js/null_type_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
diff --git a/tests/compiler/dart2js/parser_helper.dart b/tests/compiler/dart2js/parser_helper.dart
index dd797ca..ec96f0e 100644
--- a/tests/compiler/dart2js/parser_helper.dart
+++ b/tests/compiler/dart2js/parser_helper.dart
@@ -4,6 +4,7 @@
 
 library parser_helper;
 
+import "package:expect/expect.dart";
 import "dart:uri";
 
 import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart";
diff --git a/tests/compiler/dart2js/parser_test.dart b/tests/compiler/dart2js/parser_test.dart
index bb78175..d70fcb4 100644
--- a/tests/compiler/dart2js/parser_test.dart
+++ b/tests/compiler/dart2js/parser_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:expect/expect.dart";
 import 'parser_helper.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
 
diff --git a/tests/compiler/dart2js/part_of_test.dart b/tests/compiler/dart2js/part_of_test.dart
index d80b8dc..aec3c73 100644
--- a/tests/compiler/dart2js/part_of_test.dart
+++ b/tests/compiler/dart2js/part_of_test.dart
@@ -4,6 +4,7 @@
 
 library part_of_test;
 
+import "package:expect/expect.dart";
 import 'dart:uri';
 import 'mock_compiler.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
diff --git a/tests/compiler/dart2js/partial_parser_test.dart b/tests/compiler/dart2js/partial_parser_test.dart
index 0539dfd..120b6a6 100644
--- a/tests/compiler/dart2js/partial_parser_test.dart
+++ b/tests/compiler/dart2js/partial_parser_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:expect/expect.dart";
 import 'parser_helper.dart';
 
 void main() {
diff --git a/tests/compiler/dart2js/patch_test.dart b/tests/compiler/dart2js/patch_test.dart
index 529c716..42bfc60 100644
--- a/tests/compiler/dart2js/patch_test.dart
+++ b/tests/compiler/dart2js/patch_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:expect/expect.dart";
 import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
 import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart";
 import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart";
diff --git a/tests/compiler/dart2js/pretty_parameter_test.dart b/tests/compiler/dart2js/pretty_parameter_test.dart
index 28c8d1f..ffd8cd4 100644
--- a/tests/compiler/dart2js/pretty_parameter_test.dart
+++ b/tests/compiler/dart2js/pretty_parameter_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that parameters keep their names in the output.
 
+import "package:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String FOO = r"""
diff --git a/tests/compiler/dart2js/redundant_phi_eliminator_test.dart b/tests/compiler/dart2js/redundant_phi_eliminator_test.dart
index 63d8b8b..de35f7e 100644
--- a/tests/compiler/dart2js/redundant_phi_eliminator_test.dart
+++ b/tests/compiler/dart2js/redundant_phi_eliminator_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
diff --git a/tests/compiler/dart2js/reexport_handled_test.dart b/tests/compiler/dart2js/reexport_handled_test.dart
index 766d1a7..8a1ca82 100644
--- a/tests/compiler/dart2js/reexport_handled_test.dart
+++ b/tests/compiler/dart2js/reexport_handled_test.dart
@@ -4,6 +4,7 @@
 
 library reexport_handled_test;
 
+import "package:expect/expect.dart";
 import 'dart:uri';
 import 'mock_compiler.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart'
diff --git a/tests/compiler/dart2js/resolution_test.dart b/tests/compiler/dart2js/resolution_test.dart
index cd588bd..9382159 100644
--- a/tests/compiler/dart2js/resolution_test.dart
+++ b/tests/compiler/dart2js/resolution_test.dart
@@ -5,6 +5,7 @@
 // Test that resolution does not resolve things we know will not be
 // needed by the backend.
 
+import 'package:expect/expect.dart';
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
 
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index e1cbda1..01e0205 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_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:expect/expect.dart";
 import 'dart:collection';
 
 import "../../../sdk/lib/_internal/compiler/implementation/resolution/resolution.dart";
diff --git a/tests/compiler/dart2js/return_type_inferer_test.dart b/tests/compiler/dart2js/return_type_inferer_test.dart
index ae7ce7e..7f50c98 100644
--- a/tests/compiler/dart2js/return_type_inferer_test.dart
+++ b/tests/compiler/dart2js/return_type_inferer_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:expect/expect.dart";
 import '../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart';
 
 import 'compiler_helper.dart';
diff --git a/tests/compiler/dart2js/scanner_offset_length_test.dart b/tests/compiler/dart2js/scanner_offset_length_test.dart
index bf22baf..6f8db24 100644
--- a/tests/compiler/dart2js/scanner_offset_length_test.dart
+++ b/tests/compiler/dart2js/scanner_offset_length_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:expect/expect.dart";
 import '../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/scanner/scanner_implementation.dart';
 
diff --git a/tests/compiler/dart2js/scanner_test.dart b/tests/compiler/dart2js/scanner_test.dart
index 72401f2..28c01b0 100644
--- a/tests/compiler/dart2js/scanner_test.dart
+++ b/tests/compiler/dart2js/scanner_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:expect/expect.dart";
 import 'dart:utf';
 import '../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/scanner/scanner_implementation.dart';
diff --git a/tests/compiler/dart2js/simple_inferrer_and_or_test.dart b/tests/compiler/dart2js/simple_inferrer_and_or_test.dart
index 8b34146..ae7cfd3 100644
--- a/tests/compiler/dart2js/simple_inferrer_and_or_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_and_or_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:expect/expect.dart';
 import 'compiler_helper.dart';
 
 const String TEST = """
diff --git a/tests/compiler/dart2js/simple_inferrer_closure_test.dart b/tests/compiler/dart2js/simple_inferrer_closure_test.dart
index c3f9a9a..c54bdce 100644
--- a/tests/compiler/dart2js/simple_inferrer_closure_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_closure_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:expect/expect.dart';
 import 'compiler_helper.dart';
 
 const String TEST = """
diff --git a/tests/compiler/dart2js/simple_inferrer_final_field2_test.dart b/tests/compiler/dart2js/simple_inferrer_final_field2_test.dart
index 92e80e49..e563e16 100644
--- a/tests/compiler/dart2js/simple_inferrer_final_field2_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_final_field2_test.dart
@@ -5,6 +5,7 @@
 // Test that a non-used generative constructor does not prevent
 // infering types for fields.
 
+import 'package:expect/expect.dart';
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
 
diff --git a/tests/compiler/dart2js/simple_inferrer_final_field3_test.dart b/tests/compiler/dart2js/simple_inferrer_final_field3_test.dart
index de30794..6853374 100644
--- a/tests/compiler/dart2js/simple_inferrer_final_field3_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_final_field3_test.dart
@@ -4,6 +4,7 @@
 
 // Test that we are analyzing field parameters correctly.
 
+import 'package:expect/expect.dart';
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
 
diff --git a/tests/compiler/dart2js/simple_inferrer_final_field_test.dart b/tests/compiler/dart2js/simple_inferrer_final_field_test.dart
index b525e3f..d3b6107 100644
--- a/tests/compiler/dart2js/simple_inferrer_final_field_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_final_field_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:expect/expect.dart';
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
 
diff --git a/tests/compiler/dart2js/simple_inferrer_postfix_prefix_test.dart b/tests/compiler/dart2js/simple_inferrer_postfix_prefix_test.dart
index 6e029f6..4a15908 100644
--- a/tests/compiler/dart2js/simple_inferrer_postfix_prefix_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_postfix_prefix_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:expect/expect.dart';
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
 
diff --git a/tests/compiler/dart2js/simple_inferrer_test.dart b/tests/compiler/dart2js/simple_inferrer_test.dart
index 3e1e86f..35efedb 100644
--- a/tests/compiler/dart2js/simple_inferrer_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_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:expect/expect.dart';
 import
     '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
     show TypeMask;
diff --git a/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart b/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart
index 3370dbe..257bdd3 100644
--- a/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_try_catch_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:expect/expect.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
     show TypeMask;
 
diff --git a/tests/compiler/dart2js/size_test.dart b/tests/compiler/dart2js/size_test.dart
index 9b39765..ccf0556 100644
--- a/tests/compiler/dart2js/size_test.dart
+++ b/tests/compiler/dart2js/size_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:expect/expect.dart';
 import "compiler_helper.dart";
 
 const String TEST = "main() => [];";
diff --git a/tests/compiler/dart2js/source_mapping_test.dart b/tests/compiler/dart2js/source_mapping_test.dart
index fea3363..043665f 100644
--- a/tests/compiler/dart2js/source_mapping_test.dart
+++ b/tests/compiler/dart2js/source_mapping_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:expect/expect.dart";
 import 'dart:uri';
 
 import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
diff --git a/tests/compiler/dart2js/static_closure_test.dart b/tests/compiler/dart2js/static_closure_test.dart
index 75a412e..cbb53e1 100644
--- a/tests/compiler/dart2js/static_closure_test.dart
+++ b/tests/compiler/dart2js/static_closure_test.dart
@@ -4,6 +4,7 @@
 
 // Test that static functions are closurized as expected.
 
+import "package:expect/expect.dart";
 import 'compiler_helper.dart';
 
 main() {
diff --git a/tests/compiler/dart2js/string_escapes_test.dart b/tests/compiler/dart2js/string_escapes_test.dart
index d62dbf6..d47f7f1 100644
--- a/tests/compiler/dart2js/string_escapes_test.dart
+++ b/tests/compiler/dart2js/string_escapes_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 // Test that the compiler handles string literals containing line terminators.
diff --git a/tests/compiler/dart2js/string_interpolation_test.dart b/tests/compiler/dart2js/string_interpolation_test.dart
index 1fa3a33..f6e3bca 100644
--- a/tests/compiler/dart2js/string_interpolation_test.dart
+++ b/tests/compiler/dart2js/string_interpolation_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 main() {
diff --git a/tests/compiler/dart2js/strip_comment_test.dart b/tests/compiler/dart2js/strip_comment_test.dart
index c233ba8..3808ad8 100644
--- a/tests/compiler/dart2js/strip_comment_test.dart
+++ b/tests/compiler/dart2js/strip_comment_test.dart
@@ -4,6 +4,7 @@
 
 library strip_comment_test;
 
+import "package:expect/expect.dart";
 import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart';
 
 testComment(String strippedText, String commentText) {
diff --git a/tests/compiler/dart2js/subtype_test.dart b/tests/compiler/dart2js/subtype_test.dart
index 11534ce..db53398 100644
--- a/tests/compiler/dart2js/subtype_test.dart
+++ b/tests/compiler/dart2js/subtype_test.dart
@@ -4,6 +4,7 @@
 
 library subtype_test;
 
+import 'package:expect/expect.dart';
 import 'type_test_helper.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
 import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
@@ -18,6 +19,7 @@
   testTypedefSubtypingOptional();
   testFunctionSubtypingNamed();
   testTypedefSubtypingNamed();
+  testTypeVariableSubtype();
 }
 
 void testInterfaceSubtype() {
@@ -492,3 +494,220 @@
   // Test ({int a,int b,int c})->void <: ({int c})->void.
   expect(true, 'void___a_int_b_int_c_int', 'void___c_int');
 }
+
+void testTypeVariableSubtype() {
+  var env = new TypeEnvironment(r"""
+      class A<T> {}
+      class B<T extends Object> {}
+      class C<T extends num> {}
+      class D<T extends int> {}
+      class E<T extends S, S extends num> {}
+      class F<T extends num, S extends T> {}
+      class G<T extends T> {}
+      class H<T extends S, S extends T> {}
+      class I<T extends S, S extends U, U extends T> {}
+      class J<T extends S, S extends U, U extends S> {}
+      """);
+
+  void expect(bool value, DartType T, DartType S) {
+    Expect.equals(value, env.isSubtype(T, S), '$T <: $S');
+  }
+
+  ClassElement A = env.getElement('A');
+  TypeVariableType A_T = A.thisType.typeArguments.head;
+  ClassElement B = env.getElement('B');
+  TypeVariableType B_T = B.thisType.typeArguments.head;
+  ClassElement C = env.getElement('C');
+  TypeVariableType C_T = C.thisType.typeArguments.head;
+  ClassElement D = env.getElement('D');
+  TypeVariableType D_T = D.thisType.typeArguments.head;
+  ClassElement E = env.getElement('E');
+  TypeVariableType E_T = E.thisType.typeArguments.head;
+  TypeVariableType E_S = E.thisType.typeArguments.tail.head;
+  ClassElement F = env.getElement('F');
+  TypeVariableType F_T = F.thisType.typeArguments.head;
+  TypeVariableType F_S = F.thisType.typeArguments.tail.head;
+  ClassElement G = env.getElement('G');
+  TypeVariableType G_T = G.thisType.typeArguments.head;
+  ClassElement H = env.getElement('H');
+  TypeVariableType H_T = H.thisType.typeArguments.head;
+  TypeVariableType H_S = H.thisType.typeArguments.tail.head;
+  ClassElement I = env.getElement('I');
+  TypeVariableType I_T = I.thisType.typeArguments.head;
+  TypeVariableType I_S = I.thisType.typeArguments.tail.head;
+  TypeVariableType I_U = I.thisType.typeArguments.tail.tail.head;
+  ClassElement J = env.getElement('J');
+  TypeVariableType J_T = J.thisType.typeArguments.head;
+  TypeVariableType J_S = J.thisType.typeArguments.tail.head;
+  TypeVariableType J_U = J.thisType.typeArguments.tail.tail.head;
+
+  DartType Object_ = env['Object'];
+  DartType num_ = env['num'];
+  DartType int_ = env['int'];
+  DartType String_ = env['String'];
+  DartType dynamic_ = env['dynamic'];
+
+  // class A<T> {}
+  expect(true, A_T, Object_);
+  expect(false, A_T, num_);
+  expect(false, A_T, int_);
+  expect(false, A_T, String_);
+  expect(true, A_T, dynamic_);
+  expect(true, A_T, A_T);
+  expect(false, A_T, B_T);
+
+  // class B<T extends Object> {}
+  expect(true, B_T, Object_);
+  expect(false, B_T, num_);
+  expect(false, B_T, int_);
+  expect(false, B_T, String_);
+  expect(true, B_T, dynamic_);
+  expect(true, B_T, B_T);
+  expect(false, B_T, A_T);
+
+  // class C<T extends num> {}
+  expect(true, C_T, Object_);
+  expect(true, C_T, num_);
+  expect(false, C_T, int_);
+  expect(false, C_T, String_);
+  expect(true, C_T, dynamic_);
+  expect(true, C_T, C_T);
+  expect(false, C_T, A_T);
+
+  // class D<T extends int> {}
+  expect(true, D_T, Object_);
+  expect(true, D_T, num_);
+  expect(true, D_T, int_);
+  expect(false, D_T, String_);
+  expect(true, D_T, dynamic_);
+  expect(true, D_T, D_T);
+  expect(false, D_T, A_T);
+
+  // class E<T extends S, S extends num> {}
+  expect(true, E_T, Object_);
+  expect(true, E_T, num_);
+  expect(false, E_T, int_);
+  expect(false, E_T, String_);
+  expect(true, E_T, dynamic_);
+  expect(true, E_T, E_T);
+  expect(true, E_T, E_S);
+  expect(false, E_T, A_T);
+
+  expect(true, E_S, Object_);
+  expect(true, E_S, num_);
+  expect(false, E_S, int_);
+  expect(false, E_S, String_);
+  expect(true, E_S, dynamic_);
+  expect(false, E_S, E_T);
+  expect(true, E_S, E_S);
+  expect(false, E_S, A_T);
+
+  // class F<T extends num, S extends T> {}
+  expect(true, F_T, Object_);
+  expect(true, F_T, num_);
+  expect(false, F_T, int_);
+  expect(false, F_T, String_);
+  expect(true, F_T, dynamic_);
+  expect(false, F_T, F_S);
+  expect(true, F_T, F_T);
+  expect(false, F_T, A_T);
+
+  expect(true, F_S, Object_);
+  expect(true, F_S, num_);
+  expect(false, F_S, int_);
+  expect(false, F_S, String_);
+  expect(true, F_S, dynamic_);
+  expect(true, F_S, F_S);
+  expect(true, F_S, F_T);
+  expect(false, F_S, A_T);
+
+  // class G<T extends T> {}
+  expect(true, G_T, Object_);
+  expect(false, G_T, num_);
+  expect(false, G_T, int_);
+  expect(false, G_T, String_);
+  expect(true, G_T, dynamic_);
+  expect(true, G_T, G_T);
+  expect(false, G_T, A_T);
+
+  // class H<T extends S, S extends T> {}
+  expect(true, H_T, Object_);
+  expect(false, H_T, num_);
+  expect(false, H_T, int_);
+  expect(false, H_T, String_);
+  expect(true, H_T, dynamic_);
+  expect(true, H_T, H_T);
+  expect(true, H_T, H_S);
+  expect(false, H_T, A_T);
+
+  expect(true, H_S, Object_);
+  expect(false, H_S, num_);
+  expect(false, H_S, int_);
+  expect(false, H_S, String_);
+  expect(true, H_S, dynamic_);
+  expect(true, H_S, H_T);
+  expect(true, H_S, H_S);
+  expect(false, H_S, A_T);
+
+  // class I<T extends S, S extends U, U extends T> {}
+  expect(true, I_T, Object_);
+  expect(false, I_T, num_);
+  expect(false, I_T, int_);
+  expect(false, I_T, String_);
+  expect(true, I_T, dynamic_);
+  expect(true, I_T, I_T);
+  expect(true, I_T, I_S);
+  expect(true, I_T, I_U);
+  expect(false, I_T, A_T);
+
+  expect(true, I_S, Object_);
+  expect(false, I_S, num_);
+  expect(false, I_S, int_);
+  expect(false, I_S, String_);
+  expect(true, I_S, dynamic_);
+  expect(true, I_S, I_T);
+  expect(true, I_S, I_S);
+  expect(true, I_S, I_U);
+  expect(false, I_S, A_T);
+
+  expect(true, I_U, Object_);
+  expect(false, I_U, num_);
+  expect(false, I_U, int_);
+  expect(false, I_U, String_);
+  expect(true, I_U, dynamic_);
+  expect(true, I_U, I_T);
+  expect(true, I_U, I_S);
+  expect(true, I_U, I_U);
+  expect(false, I_U, A_T);
+
+  // class J<T extends S, S extends U, U extends S> {}
+  expect(true, J_T, Object_);
+  expect(false, J_T, num_);
+  expect(false, J_T, int_);
+  expect(false, J_T, String_);
+  expect(true, J_T, dynamic_);
+  expect(true, J_T, J_T);
+  expect(true, J_T, J_S);
+  expect(true, J_T, J_U);
+  expect(false, J_T, A_T);
+
+  expect(true, J_S, Object_);
+  expect(false, J_S, num_);
+  expect(false, J_S, int_);
+  expect(false, J_S, String_);
+  expect(true, J_S, dynamic_);
+  expect(false, J_S, J_T);
+  expect(true, J_S, J_S);
+  expect(true, J_S, J_U);
+  expect(false, J_S, A_T);
+
+  expect(true, J_U, Object_);
+  expect(false, J_U, num_);
+  expect(false, J_U, int_);
+  expect(false, J_U, String_);
+  expect(true, J_U, dynamic_);
+  expect(false, J_U, J_T);
+  expect(true, J_U, J_S);
+  expect(true, J_U, J_U);
+  expect(false, J_U, A_T);
+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/tag_mapping_test.dart b/tests/compiler/dart2js/tag_mapping_test.dart
index c9b5a82..a669a20 100644
--- a/tests/compiler/dart2js/tag_mapping_test.dart
+++ b/tests/compiler/dart2js/tag_mapping_test.dart
@@ -4,6 +4,7 @@
 
 // Test of import tag to library mapping.
 
+import 'package:expect/expect.dart';
 import 'compiler_helper.dart';
 
 const MAIN_CODE = """
diff --git a/tests/compiler/dart2js/tree_shaking_test.dart b/tests/compiler/dart2js/tree_shaking_test.dart
index 1517258..5158015 100644
--- a/tests/compiler/dart2js/tree_shaking_test.dart
+++ b/tests/compiler/dart2js/tree_shaking_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST = r"""
diff --git a/tests/compiler/dart2js/type_checker_test.dart b/tests/compiler/dart2js/type_checker_test.dart
index b6200eb..855a865 100644
--- a/tests/compiler/dart2js/type_checker_test.dart
+++ b/tests/compiler/dart2js/type_checker_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:expect/expect.dart";
 import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/util/util.dart';
diff --git a/tests/compiler/dart2js/type_combination_test.dart b/tests/compiler/dart2js/type_combination_test.dart
index 246a7fa..8a23071 100644
--- a/tests/compiler/dart2js/type_combination_test.dart
+++ b/tests/compiler/dart2js/type_combination_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:expect/expect.dart";
 import "compiler_helper.dart";
 import "parser_helper.dart";
 import "../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart";
diff --git a/tests/compiler/dart2js/type_equals_test.dart b/tests/compiler/dart2js/type_equals_test.dart
index 4da86a6..adf43c0 100644
--- a/tests/compiler/dart2js/type_equals_test.dart
+++ b/tests/compiler/dart2js/type_equals_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:expect/expect.dart";
 import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
 import "compiler_helper.dart";
 import "parser_helper.dart";
@@ -84,7 +85,8 @@
 
       void main() {}
       """,
-      uri);
+      uri,
+      analyzeAll: true, analyzeOnly: true);
   compiler.runCompiler(uri);
 
   test(compiler, "void1", "void2", expect: true);
diff --git a/tests/compiler/dart2js/type_guard_unuser_test.dart b/tests/compiler/dart2js/type_guard_unuser_test.dart
index c4922ab..d26d8c6 100644
--- a/tests/compiler/dart2js/type_guard_unuser_test.dart
+++ b/tests/compiler/dart2js/type_guard_unuser_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
diff --git a/tests/compiler/dart2js/type_inference3_test.dart b/tests/compiler/dart2js/type_inference3_test.dart
index 0cec9cd..e3fcf5a 100644
--- a/tests/compiler/dart2js/type_inference3_test.dart
+++ b/tests/compiler/dart2js/type_inference3_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
diff --git a/tests/compiler/dart2js/type_inference4_test.dart b/tests/compiler/dart2js/type_inference4_test.dart
index 2ef4404..92e51d1 100644
--- a/tests/compiler/dart2js/type_inference4_test.dart
+++ b/tests/compiler/dart2js/type_inference4_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
diff --git a/tests/compiler/dart2js/type_inference5_test.dart b/tests/compiler/dart2js/type_inference5_test.dart
index 1d9af41..647ea7d 100644
--- a/tests/compiler/dart2js/type_inference5_test.dart
+++ b/tests/compiler/dart2js/type_inference5_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
diff --git a/tests/compiler/dart2js/type_inference_test.dart b/tests/compiler/dart2js/type_inference_test.dart
index 4ab87ad..cf3f59f 100644
--- a/tests/compiler/dart2js/type_inference_test.dart
+++ b/tests/compiler/dart2js/type_inference_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
diff --git a/tests/compiler/dart2js/type_representation_test.dart b/tests/compiler/dart2js/type_representation_test.dart
index 2edf644..132d3a7 100644
--- a/tests/compiler/dart2js/type_representation_test.dart
+++ b/tests/compiler/dart2js/type_representation_test.dart
@@ -4,6 +4,7 @@
 
 library subtype_test;
 
+import 'package:expect/expect.dart';
 import 'type_test_helper.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart'
diff --git a/tests/compiler/dart2js/type_substitution_test.dart b/tests/compiler/dart2js/type_substitution_test.dart
index e54b628..7f2d9df 100644
--- a/tests/compiler/dart2js/type_substitution_test.dart
+++ b/tests/compiler/dart2js/type_substitution_test.dart
@@ -4,6 +4,7 @@
 
 library type_substitution_test;
 
+import "package:expect/expect.dart";
 import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
 import "compiler_helper.dart";
 import "parser_helper.dart";
diff --git a/tests/compiler/dart2js/type_test_helper.dart b/tests/compiler/dart2js/type_test_helper.dart
index 586af02..c253aa9 100644
--- a/tests/compiler/dart2js/type_test_helper.dart
+++ b/tests/compiler/dart2js/type_test_helper.dart
@@ -4,6 +4,7 @@
 
 library type_test_helper;
 
+import "package:expect/expect.dart";
 import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
 import "parser_helper.dart" show SourceString;
 import "compiler_helper.dart";
@@ -26,7 +27,9 @@
     MockCompiler compiler = compilerFor('''
         main() {}
         $source''',
-        uri);
+        uri,
+        analyzeAll: true,
+        analyzeOnly: true);
     compiler.runCompiler(uri);
     return new TypeEnvironment._(compiler);
   }
diff --git a/tests/compiler/dart2js/type_variable_bound_test.dart b/tests/compiler/dart2js/type_variable_bound_test.dart
new file mode 100644
index 0000000..6dd38a8
--- /dev/null
+++ b/tests/compiler/dart2js/type_variable_bound_test.dart
@@ -0,0 +1,116 @@
+// 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 'compiler_helper.dart';
+import "package:expect/expect.dart";
+
+compile(String source) {
+  Uri uri = new Uri('test:code');
+  var compiler = compilerFor(source, uri);
+  compiler.runCompiler(uri);
+  return compiler;
+}
+
+test1() {
+  var compiler = compile(r"""
+class A<T extends T> {}
+
+void main() {
+  new A();
+}
+""");
+
+  Expect.isFalse(compiler.compilationFailed);
+  Expect.isTrue(compiler.errors.isEmpty,
+                'unexpected errors: ${compiler.errors}');
+  Expect.equals(1, compiler.warnings.length,
+                'expected exactly one warning, but got ${compiler.warnings}');
+
+  Expect.equals(MessageKind.CYCLIC_TYPE_VARIABLE,
+                compiler.warnings[0].message.kind);
+  Expect.equals("T", compiler.warnings[0].node.toString());
+}
+
+test2() {
+  var compiler = compile(r"""
+class B<T extends S, S extends T> {}
+
+void main() {
+  new B();
+}
+""");
+
+  Expect.isFalse(compiler.compilationFailed);
+  print(compiler.errors);
+  Expect.isTrue(compiler.errors.isEmpty, 'unexpected errors');
+  Expect.equals(2, compiler.warnings.length,
+                'expected exactly one error, but got ${compiler.warnings}');
+
+  Expect.equals(MessageKind.CYCLIC_TYPE_VARIABLE,
+                compiler.warnings[0].message.kind);
+  Expect.equals("T", compiler.warnings[0].node.toString());
+
+  Expect.equals(MessageKind.CYCLIC_TYPE_VARIABLE,
+                compiler.warnings[1].message.kind);
+  Expect.equals("S", compiler.warnings[1].node.toString());
+}
+
+test3() {
+  var compiler = compile(r"""
+class C<T extends S, S extends U, U extends T> {}
+
+void main() {
+  new C();
+}
+""");
+
+  Expect.isFalse(compiler.compilationFailed);
+  print(compiler.errors);
+  Expect.isTrue(compiler.errors.isEmpty, 'unexpected errors');
+  Expect.equals(3, compiler.warnings.length,
+                'expected exactly one error, but got ${compiler.warnings}');
+
+  Expect.equals(MessageKind.CYCLIC_TYPE_VARIABLE,
+                compiler.warnings[0].message.kind);
+  Expect.equals("T", compiler.warnings[0].node.toString());
+
+  Expect.equals(MessageKind.CYCLIC_TYPE_VARIABLE,
+                compiler.warnings[1].message.kind);
+  Expect.equals("S", compiler.warnings[1].node.toString());
+
+  Expect.equals(MessageKind.CYCLIC_TYPE_VARIABLE,
+                compiler.warnings[2].message.kind);
+  Expect.equals("U", compiler.warnings[2].node.toString());
+}
+
+test4() {
+  var compiler = compile(r"""
+class D<T extends S, S extends U, U extends S> {}
+
+void main() {
+  new D();
+}
+""");
+
+  Expect.isFalse(compiler.compilationFailed);
+  print(compiler.errors);
+  Expect.isTrue(compiler.errors.isEmpty, 'unexpected errors');
+  Expect.equals(2, compiler.warnings.length,
+                'expected exactly one error, but got ${compiler.warnings}');
+
+  Expect.equals(MessageKind.CYCLIC_TYPE_VARIABLE,
+                compiler.warnings[0].message.kind);
+  Expect.equals("S", compiler.warnings[0].node.toString());
+
+  Expect.equals(MessageKind.CYCLIC_TYPE_VARIABLE,
+                compiler.warnings[1].message.kind);
+  Expect.equals("U", compiler.warnings[1].node.toString());
+}
+
+main() {
+  test1();
+  test2();
+  test3();
+  test4();
+}
diff --git a/tests/compiler/dart2js/type_variable_occurrence_test.dart b/tests/compiler/dart2js/type_variable_occurrence_test.dart
index 51f6282..c9a28b9 100644
--- a/tests/compiler/dart2js/type_variable_occurrence_test.dart
+++ b/tests/compiler/dart2js/type_variable_occurrence_test.dart
@@ -4,6 +4,7 @@
 
 library subtype_test;
 
+import 'package:expect/expect.dart';
 import 'type_test_helper.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
 import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
diff --git a/tests/compiler/dart2js/types_of_captured_variables_test.dart b/tests/compiler/dart2js/types_of_captured_variables_test.dart
index 77c9e25..3376b65 100644
--- a/tests/compiler/dart2js/types_of_captured_variables_test.dart
+++ b/tests/compiler/dart2js/types_of_captured_variables_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:expect/expect.dart';
 import 'compiler_helper.dart';
 
 const String TEST1 = r"""
diff --git a/tests/compiler/dart2js/unparser2_test.dart b/tests/compiler/dart2js/unparser2_test.dart
index 78bb05f..e2eb006 100644
--- a/tests/compiler/dart2js/unparser2_test.dart
+++ b/tests/compiler/dart2js/unparser2_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:expect/expect.dart";
 import "../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart";
 import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart";
 
diff --git a/tests/compiler/dart2js/unparser_test.dart b/tests/compiler/dart2js/unparser_test.dart
index a6bb634..936b60e 100644
--- a/tests/compiler/dart2js/unparser_test.dart
+++ b/tests/compiler/dart2js/unparser_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:expect/expect.dart";
 import 'dart:uri';
 import 'parser_helper.dart';
 import 'mock_compiler.dart';
diff --git a/tests/compiler/dart2js/uri_extras_test.dart b/tests/compiler/dart2js/uri_extras_test.dart
index ed20990..0d224bc0 100644
--- a/tests/compiler/dart2js/uri_extras_test.dart
+++ b/tests/compiler/dart2js/uri_extras_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:expect/expect.dart";
 import 'dart:uri';
 
 import '../../../sdk/lib/_internal/compiler/implementation/util/uri_extras.dart';
diff --git a/tests/compiler/dart2js/value_range2_test.dart b/tests/compiler/dart2js/value_range2_test.dart
index 1c24f97..7b8cc8b 100644
--- a/tests/compiler/dart2js/value_range2_test.dart
+++ b/tests/compiler/dart2js/value_range2_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:expect/expect.dart";
 import "../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart";
 import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
 import "../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart";
diff --git a/tests/compiler/dart2js/value_range_test.dart b/tests/compiler/dart2js/value_range_test.dart
index 1f03e88..5913d94 100644
--- a/tests/compiler/dart2js/value_range_test.dart
+++ b/tests/compiler/dart2js/value_range_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:expect/expect.dart";
 import 'compiler_helper.dart';
 
 const int REMOVED = 0;
diff --git a/tests/compiler/dart2js_extra/bailout_aborting_if_test.dart b/tests/compiler/dart2js_extra/bailout_aborting_if_test.dart
index 5eac791..9020f26 100644
--- a/tests/compiler/dart2js_extra/bailout_aborting_if_test.dart
+++ b/tests/compiler/dart2js_extra/bailout_aborting_if_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:expect/expect.dart";
+
 bar() => {'bar' : 21};
 foo() => 'bar';
 
diff --git a/tests/compiler/dart2js_extra/bailout_on_break_test.dart b/tests/compiler/dart2js_extra/bailout_on_break_test.dart
index d73f935..ff09790 100644
--- a/tests/compiler/dart2js_extra/bailout_on_break_test.dart
+++ b/tests/compiler/dart2js_extra/bailout_on_break_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:expect/expect.dart";
+
 class A {
   operator+(arg) => 42;
 }
diff --git a/tests/compiler/dart2js_extra/bailout_on_continue_test.dart b/tests/compiler/dart2js_extra/bailout_on_continue_test.dart
index 917f353..ca0377a 100644
--- a/tests/compiler/dart2js_extra/bailout_on_continue_test.dart
+++ b/tests/compiler/dart2js_extra/bailout_on_continue_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:expect/expect.dart";
+
 class A {
   operator+(arg) => 42;
 }
diff --git a/tests/compiler/dart2js_extra/bailout_test.dart b/tests/compiler/dart2js_extra/bailout_test.dart
index cbc42ae..52b02a1 100644
--- a/tests/compiler/dart2js_extra/bailout_test.dart
+++ b/tests/compiler/dart2js_extra/bailout_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:expect/expect.dart";
+
 var myString;
 
 String ifBailout(test) {
diff --git a/tests/compiler/dart2js_extra/break_test.dart b/tests/compiler/dart2js_extra/break_test.dart
index 34895a1..96b0481 100644
--- a/tests/compiler/dart2js_extra/break_test.dart
+++ b/tests/compiler/dart2js_extra/break_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:expect/expect.dart";
+
 break1(int x, int y, int ew, int ez) {
   int w = 1;
   int z = 0;
diff --git a/tests/compiler/dart2js_extra/checked_accessor_test.dart b/tests/compiler/dart2js_extra/checked_accessor_test.dart
index f20091f..38e4b38 100644
--- a/tests/compiler/dart2js_extra/checked_accessor_test.dart
+++ b/tests/compiler/dart2js_extra/checked_accessor_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:expect/expect.dart";
+
 class E {
   missingType field;
 }
diff --git a/tests/compiler/dart2js_extra/closure2_test.dart b/tests/compiler/dart2js_extra/closure2_test.dart
index a6a2b7d..942f324 100644
--- a/tests/compiler/dart2js_extra/closure2_test.dart
+++ b/tests/compiler/dart2js_extra/closure2_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:expect/expect.dart";
+
 closure0() {
   // A closure will be implemented as a class. Make sure everything is set up
   // correctly when no other class is generated. In particular we need
diff --git a/tests/compiler/dart2js_extra/closure3_test.dart b/tests/compiler/dart2js_extra/closure3_test.dart
index 119bcb6..cab801f 100644
--- a/tests/compiler/dart2js_extra/closure3_test.dart
+++ b/tests/compiler/dart2js_extra/closure3_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:expect/expect.dart";
+
 main() {
   var f = fun({a: 3, b: 8}) {
     return a + b;
diff --git a/tests/compiler/dart2js_extra/closure4_test.dart b/tests/compiler/dart2js_extra/closure4_test.dart
index f52a858..6ef0c8c 100644
--- a/tests/compiler/dart2js_extra/closure4_test.dart
+++ b/tests/compiler/dart2js_extra/closure4_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:expect/expect.dart";
+
 closure0() {
   var f = fib(i) {
     if (i < 2) return i;
diff --git a/tests/compiler/dart2js_extra/closure5_test.dart b/tests/compiler/dart2js_extra/closure5_test.dart
index b88f5ef..f135346 100644
--- a/tests/compiler/dart2js_extra/closure5_test.dart
+++ b/tests/compiler/dart2js_extra/closure5_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:expect/expect.dart";
+
 class A {
   foo() => 499;
   bar({a: 1, b: 7, c: 99}) => a + b + c;
diff --git a/tests/compiler/dart2js_extra/closure6_test.dart b/tests/compiler/dart2js_extra/closure6_test.dart
index fd63888..a49b187 100644
--- a/tests/compiler/dart2js_extra/closure6_test.dart
+++ b/tests/compiler/dart2js_extra/closure6_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:expect/expect.dart";
+
 class A {
   var foo;
   bar() => foo(3, 99);
diff --git a/tests/compiler/dart2js_extra/closure7_test.dart b/tests/compiler/dart2js_extra/closure7_test.dart
index 6003c43..f7b966d 100644
--- a/tests/compiler/dart2js_extra/closure7_test.dart
+++ b/tests/compiler/dart2js_extra/closure7_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:expect/expect.dart";
+
 var foo;
 bar() => foo(3, 99);
 gee(f) => foo(fun: f);
diff --git a/tests/compiler/dart2js_extra/closure_capture2_test.dart b/tests/compiler/dart2js_extra/closure_capture2_test.dart
index 21f91e4..6c13143 100644
--- a/tests/compiler/dart2js_extra/closure_capture2_test.dart
+++ b/tests/compiler/dart2js_extra/closure_capture2_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:expect/expect.dart";
+
 closure0() {
   // f and g will both capture a variable named 'x'. If we use the original
   // name in the (shared) box then there will be troubles.
diff --git a/tests/compiler/dart2js_extra/closure_capture3_test.dart b/tests/compiler/dart2js_extra/closure_capture3_test.dart
index d38b715..6044a2a 100644
--- a/tests/compiler/dart2js_extra/closure_capture3_test.dart
+++ b/tests/compiler/dart2js_extra/closure_capture3_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:expect/expect.dart";
+
 class Closure {
   var x;
   Closure(val) : this.x = val;
diff --git a/tests/compiler/dart2js_extra/closure_capture4_test.dart b/tests/compiler/dart2js_extra/closure_capture4_test.dart
index 7a4a170..e19a37b 100644
--- a/tests/compiler/dart2js_extra/closure_capture4_test.dart
+++ b/tests/compiler/dart2js_extra/closure_capture4_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:expect/expect.dart";
+
 closure0() {
   var input = [1, 2, 3];
   var fs = [];
diff --git a/tests/compiler/dart2js_extra/closure_capture5_test.dart b/tests/compiler/dart2js_extra/closure_capture5_test.dart
index df387bb..8689cdc 100644
--- a/tests/compiler/dart2js_extra/closure_capture5_test.dart
+++ b/tests/compiler/dart2js_extra/closure_capture5_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:expect/expect.dart";
+
 closure0() {
   var fs = [];
   for (var x = 1; x <= 3; x++) {
diff --git a/tests/compiler/dart2js_extra/closure_capture_test.dart b/tests/compiler/dart2js_extra/closure_capture_test.dart
index 5ead071..f76b024 100644
--- a/tests/compiler/dart2js_extra/closure_capture_test.dart
+++ b/tests/compiler/dart2js_extra/closure_capture_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:expect/expect.dart";
+
 closure0() {
   var x = 499;
   // TODO(floitsch): remove name from functions.
diff --git a/tests/compiler/dart2js_extra/closure_test.dart b/tests/compiler/dart2js_extra/closure_test.dart
index d5d5519..fad942f 100644
--- a/tests/compiler/dart2js_extra/closure_test.dart
+++ b/tests/compiler/dart2js_extra/closure_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:expect/expect.dart";
+
 closure0() {
   // TODO(floitsch): remove name from functions.
   var f = fun() { return 499; };
diff --git a/tests/compiler/dart2js_extra/compile_time_constant4_test.dart b/tests/compiler/dart2js_extra/compile_time_constant4_test.dart
index bcdfaa7..2a7e55a 100644
--- a/tests/compiler/dart2js_extra/compile_time_constant4_test.dart
+++ b/tests/compiler/dart2js_extra/compile_time_constant4_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:expect/expect.dart";
+
 const x = "foo";
 const y = "foo";
 const g1 = x
diff --git a/tests/compiler/dart2js_extra/compound_operator_index_test.dart b/tests/compiler/dart2js_extra/compound_operator_index_test.dart
index e4d108f..67d30d0 100644
--- a/tests/compiler/dart2js_extra/compound_operator_index_test.dart
+++ b/tests/compiler/dart2js_extra/compound_operator_index_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:expect/expect.dart";
+
 class A {
   List<int> list;
   A(int a, int b) : list = <int>[a, b];
diff --git a/tests/compiler/dart2js_extra/conditional_test.dart b/tests/compiler/dart2js_extra/conditional_test.dart
index 6ecb67b..c1e30b9 100644
--- a/tests/compiler/dart2js_extra/conditional_test.dart
+++ b/tests/compiler/dart2js_extra/conditional_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:expect/expect.dart";
+
 getZero() { return 0; }
 
 main() {
diff --git a/tests/compiler/dart2js_extra/conflict_index_test.dart b/tests/compiler/dart2js_extra/conflict_index_test.dart
index 22cf620..46c74ea 100644
--- a/tests/compiler/dart2js_extra/conflict_index_test.dart
+++ b/tests/compiler/dart2js_extra/conflict_index_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:expect/expect.dart";
+
 main() {
   foo(true, [0]);
   foo(false, "bar");
diff --git a/tests/compiler/dart2js_extra/constant_fold_number_dart2_j_s_test.dart b/tests/compiler/dart2js_extra/constant_fold_number_dart2_j_s_test.dart
index c80d54b..aab61d7 100644
--- a/tests/compiler/dart2js_extra/constant_fold_number_dart2_j_s_test.dart
+++ b/tests/compiler/dart2js_extra/constant_fold_number_dart2_j_s_test.dart
@@ -4,6 +4,8 @@
 // This test is making sure we don't try to constant fold numbers
 // where the semantics differ at compile-time (Dart) and runtime (JS).
 
+import "package:expect/expect.dart";
+
 foo() => 0.0;
 bar() => 0;
 
diff --git a/tests/compiler/dart2js_extra/constant_javascript_semantics2_test.dart b/tests/compiler/dart2js_extra/constant_javascript_semantics2_test.dart
index 5790fe3..13f0a93 100644
--- a/tests/compiler/dart2js_extra/constant_javascript_semantics2_test.dart
+++ b/tests/compiler/dart2js_extra/constant_javascript_semantics2_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:expect/expect.dart";
+
 // Make sure we use JavaScript semantics when compiling compile-time constants.
 // In this case we test that the value-range analysis uses JavaScript semantics
 // too.
diff --git a/tests/compiler/dart2js_extra/constant_javascript_semantics3_test.dart b/tests/compiler/dart2js_extra/constant_javascript_semantics3_test.dart
index 0fba325..4fd4128 100644
--- a/tests/compiler/dart2js_extra/constant_javascript_semantics3_test.dart
+++ b/tests/compiler/dart2js_extra/constant_javascript_semantics3_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:expect/expect.dart";
+
 // Make sure we use JavaScript semantics when compiling compile-time constants.
 // In this case we test that the value-range analysis uses JavaScript semantics
 // too.
diff --git a/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart b/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart
index dbea323..49dcb36 100644
--- a/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart
+++ b/tests/compiler/dart2js_extra/constant_javascript_semantics_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:expect/expect.dart";
+
 // Make sure we use JavaScript semantics when compiling compile-time constants.
 
 const x = 12345678901234567891;
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index b95b7af..181014f 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -31,6 +31,7 @@
 
 [ $compiler == dart2js && $minified ]
 to_string_test: Fail # Issue 7179.
+runtime_type_test: Fail, OK # Tests extected output of Type.toString().
 
 # Mirrors do not work with minification.
 mirror_test: Fail  # Issue 6490.
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_class_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_class_test.dart
index 1486e75..4eaa40d 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_class_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_class_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:expect/expect.dart";
 import 'dart:async';
 
 @lazy import 'deferred_class_library.dart';
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_constant_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_constant_test.dart
index 0cbe262..f27bf45 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_constant_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_constant_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:expect/expect.dart";
 import 'dart:async';
 
 @lazy import 'deferred_class_library.dart';
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart
index 08eb6ac..c5980fb 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart
@@ -5,6 +5,7 @@
 // Test that loading of a library (with top-level functions only) can
 // be deferred.
 
+import "package:expect/expect.dart";
 import 'dart:async';
 @lazy import 'deferred_function_library.dart';
 
diff --git a/tests/compiler/dart2js_extra/do_test.dart b/tests/compiler/dart2js_extra/do_test.dart
index 84327f1..04d8d87 100644
--- a/tests/compiler/dart2js_extra/do_test.dart
+++ b/tests/compiler/dart2js_extra/do_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:expect/expect.dart";
+
 void do1() {
   bool cond = true;
   var result = 0;
diff --git a/tests/compiler/dart2js_extra/factory_test.dart b/tests/compiler/dart2js_extra/factory_test.dart
index 0a10399..0d3e59b 100644
--- a/tests/compiler/dart2js_extra/factory_test.dart
+++ b/tests/compiler/dart2js_extra/factory_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:expect/expect.dart";
+
 class A {
   factory A() {
     return 1;
diff --git a/tests/compiler/dart2js_extra/field_in_constructor_test.dart b/tests/compiler/dart2js_extra/field_in_constructor_test.dart
index 6b2f13c..29d1d66 100644
--- a/tests/compiler/dart2js_extra/field_in_constructor_test.dart
+++ b/tests/compiler/dart2js_extra/field_in_constructor_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:expect/expect.dart";
+
 class A {
   var a;
   A() {
diff --git a/tests/compiler/dart2js_extra/field_initializer_test.dart b/tests/compiler/dart2js_extra/field_initializer_test.dart
index 655298e..43dbe3a 100644
--- a/tests/compiler/dart2js_extra/field_initializer_test.dart
+++ b/tests/compiler/dart2js_extra/field_initializer_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:expect/expect.dart";
+
 class A {
   static var a;
   static var b = c;
diff --git a/tests/compiler/dart2js_extra/fields_test.dart b/tests/compiler/dart2js_extra/fields_test.dart
index 2c01a3b..0debb28 100644
--- a/tests/compiler/dart2js_extra/fields_test.dart
+++ b/tests/compiler/dart2js_extra/fields_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:expect/expect.dart";
+
 class A {
   A() {
   }
diff --git a/tests/compiler/dart2js_extra/first_class_types_hashcode_test.dart b/tests/compiler/dart2js_extra/first_class_types_hashcode_test.dart
index 26b5c13..06e43bd 100644
--- a/tests/compiler/dart2js_extra/first_class_types_hashcode_test.dart
+++ b/tests/compiler/dart2js_extra/first_class_types_hashcode_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:expect/expect.dart";
+
 // Check that Type instances work with maps. This behavior is not required by
 // the specification.
 
diff --git a/tests/compiler/dart2js_extra/for_in_test.dart b/tests/compiler/dart2js_extra/for_in_test.dart
index 6aa8c51..39d45d9 100644
--- a/tests/compiler/dart2js_extra/for_in_test.dart
+++ b/tests/compiler/dart2js_extra/for_in_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:expect/expect.dart";
+
 // Test foreach (aka. for-in) functionality.
 
 testIterator(List expect, Iterable input) {
diff --git a/tests/compiler/dart2js_extra/for_test.dart b/tests/compiler/dart2js_extra/for_test.dart
index 6f97f91..068b4b4 100644
--- a/tests/compiler/dart2js_extra/for_test.dart
+++ b/tests/compiler/dart2js_extra/for_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:expect/expect.dart";
+
 void for1() {
   var cond = true;
   var result = 0;
diff --git a/tests/compiler/dart2js_extra/generics_factories_test.dart b/tests/compiler/dart2js_extra/generics_factories_test.dart
index 2de7501..5ca2d59 100644
--- a/tests/compiler/dart2js_extra/generics_factories_test.dart
+++ b/tests/compiler/dart2js_extra/generics_factories_test.dart
@@ -4,6 +4,8 @@
 
 // Test that factories are marked as needing rti.
 
+import "package:expect/expect.dart";
+
 class A<T> {
   foo(o) => o is T;
   factory A.c() => new B<T>();
diff --git a/tests/compiler/dart2js_extra/generics_is_check1_test.dart b/tests/compiler/dart2js_extra/generics_is_check1_test.dart
index c616c7c..24d01e5 100644
--- a/tests/compiler/dart2js_extra/generics_is_check1_test.dart
+++ b/tests/compiler/dart2js_extra/generics_is_check1_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:expect/expect.dart";
+
 class Hest<X> {}
 
 main() {
diff --git a/tests/compiler/dart2js_extra/getter_element_test.dart b/tests/compiler/dart2js_extra/getter_element_test.dart
index 284395c..9238e8f 100644
--- a/tests/compiler/dart2js_extra/getter_element_test.dart
+++ b/tests/compiler/dart2js_extra/getter_element_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:expect/expect.dart";
+
 class A {
   static main() {
     testOther();
diff --git a/tests/compiler/dart2js_extra/getters_setters_test.dart b/tests/compiler/dart2js_extra/getters_setters_test.dart
index fcca96c..2e41649 100644
--- a/tests/compiler/dart2js_extra/getters_setters_test.dart
+++ b/tests/compiler/dart2js_extra/getters_setters_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:expect/expect.dart";
+
 class GettersSettersTest {
 
   static int foo;
diff --git a/tests/compiler/dart2js_extra/hash_code_test.dart b/tests/compiler/dart2js_extra/hash_code_test.dart
index 869c60b..6e25fed 100644
--- a/tests/compiler/dart2js_extra/hash_code_test.dart
+++ b/tests/compiler/dart2js_extra/hash_code_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:expect/expect.dart";
+
 // dart2js specific test to make sure hashCode on intercepted types behaves as
 // intended.
 
diff --git a/tests/compiler/dart2js_extra/if_in_loop.dart b/tests/compiler/dart2js_extra/if_in_loop.dart
index 03977427..2eef63d 100644
--- a/tests/compiler/dart2js_extra/if_in_loop.dart
+++ b/tests/compiler/dart2js_extra/if_in_loop.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:expect/expect.dart";
+
 // Test for bug in code generation of if-with-aborting-branch-inside-loop.
 
 foo(p, q) {
diff --git a/tests/compiler/dart2js_extra/if_test.dart b/tests/compiler/dart2js_extra/if_test.dart
index fcc4fc6..d2c8ad8 100644
--- a/tests/compiler/dart2js_extra/if_test.dart
+++ b/tests/compiler/dart2js_extra/if_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:expect/expect.dart";
+
 int if1() {
   if (true) {
     return 499;
diff --git a/tests/compiler/dart2js_extra/index_test.dart b/tests/compiler/dart2js_extra/index_test.dart
index 74dad76..890d71a 100644
--- a/tests/compiler/dart2js_extra/index_test.dart
+++ b/tests/compiler/dart2js_extra/index_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:expect/expect.dart";
+
 main() {
   var a = [0];
   Expect.equals(0, a[0]);
diff --git a/tests/compiler/dart2js_extra/interface_type_optimization_test.dart b/tests/compiler/dart2js_extra/interface_type_optimization_test.dart
index a031447..0beb4f4 100644
--- a/tests/compiler/dart2js_extra/interface_type_optimization_test.dart
+++ b/tests/compiler/dart2js_extra/interface_type_optimization_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:expect/expect.dart";
+
 main() {
   var a = new A();
   Expect.equals(42, a.foo(42));
diff --git a/tests/compiler/dart2js_extra/invoke_dynamic_test.dart b/tests/compiler/dart2js_extra/invoke_dynamic_test.dart
index a3558fd..b76c59b 100644
--- a/tests/compiler/dart2js_extra/invoke_dynamic_test.dart
+++ b/tests/compiler/dart2js_extra/invoke_dynamic_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:expect/expect.dart";
+
 class A {
   foo() { return 499; }
   bar(x) { return x + 499; }
diff --git a/tests/compiler/dart2js_extra/is_operator_test.dart b/tests/compiler/dart2js_extra/is_operator_test.dart
index d59fc02..e3a88ca 100644
--- a/tests/compiler/dart2js_extra/is_operator_test.dart
+++ b/tests/compiler/dart2js_extra/is_operator_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:expect/expect.dart";
+
 class A {
 }
 
diff --git a/tests/compiler/dart2js_extra/list_factory_test.dart b/tests/compiler/dart2js_extra/list_factory_test.dart
index e774573..b58c925 100644
--- a/tests/compiler/dart2js_extra/list_factory_test.dart
+++ b/tests/compiler/dart2js_extra/list_factory_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:expect/expect.dart";
+
 main() {
   var a = new List(4);
   Expect.equals(4, a.length);
diff --git a/tests/compiler/dart2js_extra/literal_string_juxtaposition_test.dart b/tests/compiler/dart2js_extra/literal_string_juxtaposition_test.dart
index a4b6e4c..03d4725 100644
--- a/tests/compiler/dart2js_extra/literal_string_juxtaposition_test.dart
+++ b/tests/compiler/dart2js_extra/literal_string_juxtaposition_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:expect/expect.dart";
+
 main() {
   {
     // Generates identical compile time constants.
diff --git a/tests/compiler/dart2js_extra/logical_and_test.dart b/tests/compiler/dart2js_extra/logical_and_test.dart
index 5e9a111..6337969 100644
--- a/tests/compiler/dart2js_extra/logical_and_test.dart
+++ b/tests/compiler/dart2js_extra/logical_and_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:expect/expect.dart";
+
 void and1() {
   var b = true;
   b = b && b;
diff --git a/tests/compiler/dart2js_extra/logical_or_test.dart b/tests/compiler/dart2js_extra/logical_or_test.dart
index 7d9fffd..c7848bc 100644
--- a/tests/compiler/dart2js_extra/logical_or_test.dart
+++ b/tests/compiler/dart2js_extra/logical_or_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:expect/expect.dart";
+
 void or1() {
   var b = true;
   b = b || b;
diff --git a/tests/compiler/dart2js_extra/loop_if_phi_test.dart b/tests/compiler/dart2js_extra/loop_if_phi_test.dart
index ed76859..044c40a 100644
--- a/tests/compiler/dart2js_extra/loop_if_phi_test.dart
+++ b/tests/compiler/dart2js_extra/loop_if_phi_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:expect/expect.dart";
+
 void main() {
   var prev = -1;
   for (int i = 0; i < 2; i++) {
diff --git a/tests/compiler/dart2js_extra/math_lib_prefix_test.dart b/tests/compiler/dart2js_extra/math_lib_prefix_test.dart
index 7d8720b..e8b63ef 100644
--- a/tests/compiler/dart2js_extra/math_lib_prefix_test.dart
+++ b/tests/compiler/dart2js_extra/math_lib_prefix_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library math_lib_prefix_test;
+import "package:expect/expect.dart";
 import 'dart:math' as foo;
 
 main() {
diff --git a/tests/compiler/dart2js_extra/math_lib_test.dart b/tests/compiler/dart2js_extra/math_lib_test.dart
index aec45b8..14fd022 100644
--- a/tests/compiler/dart2js_extra/math_lib_test.dart
+++ b/tests/compiler/dart2js_extra/math_lib_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library math_lib_test;
+import "package:expect/expect.dart";
 import 'dart:math';
 
 main() {
diff --git a/tests/compiler/dart2js_extra/member_namespace_test.dart b/tests/compiler/dart2js_extra/member_namespace_test.dart
index 3b310db..ff65d20 100644
--- a/tests/compiler/dart2js_extra/member_namespace_test.dart
+++ b/tests/compiler/dart2js_extra/member_namespace_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:expect/expect.dart";
+
 class A {
   static int a;
   A();
diff --git a/tests/compiler/dart2js_extra/mirror_test.dart b/tests/compiler/dart2js_extra/mirror_test.dart
index 0cc6b01..79de2b8 100644
--- a/tests/compiler/dart2js_extra/mirror_test.dart
+++ b/tests/compiler/dart2js_extra/mirror_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:expect/expect.dart";
 import 'dart:mirrors';
 
 import 'async_helper.dart';
@@ -13,8 +14,8 @@
   print('mirror.type: ${mirror.type}');
   print('now.toUtc(): ${now.toUtc()}');
 
-  mirror.invoke("toUtc", []).then((value) {
-    print('mirror.invoke("toUtc", []): $value');
+  mirror.invokeAsync("toUtc", []).then((value) {
+    print('mirror.invokeAsync("toUtc", []): $value');
     Expect.isTrue(value.hasReflectee);
     Expect.equals(now.toUtc(), value.reflectee);
     onDone(true);
diff --git a/tests/compiler/dart2js_extra/named_parameter_for_static_test.dart b/tests/compiler/dart2js_extra/named_parameter_for_static_test.dart
index 252c6ad..4efa524 100644
--- a/tests/compiler/dart2js_extra/named_parameter_for_static_test.dart
+++ b/tests/compiler/dart2js_extra/named_parameter_for_static_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:expect/expect.dart";
+
 oneOptionalArgument(a, {b}) {
   Expect.equals(1, a);
   Expect.equals(2, b);
diff --git a/tests/compiler/dart2js_extra/named_parameter_test.dart b/tests/compiler/dart2js_extra/named_parameter_test.dart
index af09e39..a5f0cf8 100644
--- a/tests/compiler/dart2js_extra/named_parameter_test.dart
+++ b/tests/compiler/dart2js_extra/named_parameter_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:expect/expect.dart";
+
 class A {
   foo({a, b}) {
     Expect.equals(0, a);
diff --git a/tests/compiler/dart2js_extra/nan_negate_test.dart b/tests/compiler/dart2js_extra/nan_negate_test.dart
index 1d86387..f5acd16 100644
--- a/tests/compiler/dart2js_extra/nan_negate_test.dart
+++ b/tests/compiler/dart2js_extra/nan_negate_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:expect/expect.dart";
+
 // Don't convert !(a op b) to (a neg-op b) when a or b might be NaN.
 test(double n) {
   // Force known type to double, preserves NaN.
diff --git a/tests/compiler/dart2js_extra/no_such_method_test.dart b/tests/compiler/dart2js_extra/no_such_method_test.dart
index 0a0ac6b..dc28e07 100644
--- a/tests/compiler/dart2js_extra/no_such_method_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_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:expect/expect.dart";
+
 class NoSuchMethodInfo {
   Object receiver;
   String name;
diff --git a/tests/compiler/dart2js_extra/not_test.dart b/tests/compiler/dart2js_extra/not_test.dart
index 0f6d97f..e75f2ca 100644
--- a/tests/compiler/dart2js_extra/not_test.dart
+++ b/tests/compiler/dart2js_extra/not_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:expect/expect.dart";
+
 void not1() {
   var x = !true;
   Expect.equals(false, x);
diff --git a/tests/compiler/dart2js_extra/null_test.dart b/tests/compiler/dart2js_extra/null_test.dart
index bfec4df..317c124 100644
--- a/tests/compiler/dart2js_extra/null_test.dart
+++ b/tests/compiler/dart2js_extra/null_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:expect/expect.dart";
+
 null1() {
   return;  // implicit null;
 }
diff --git a/tests/compiler/dart2js_extra/operator2_test.dart b/tests/compiler/dart2js_extra/operator2_test.dart
index 32abdca..34f2a60 100644
--- a/tests/compiler/dart2js_extra/operator2_test.dart
+++ b/tests/compiler/dart2js_extra/operator2_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:expect/expect.dart";
+
 int zero() { return 0; }
 int one() { return 1; }
 int minus1() { return 0 - 1; }
diff --git a/tests/compiler/dart2js_extra/operator3_test.dart b/tests/compiler/dart2js_extra/operator3_test.dart
index 00926e9..5ad4460 100644
--- a/tests/compiler/dart2js_extra/operator3_test.dart
+++ b/tests/compiler/dart2js_extra/operator3_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:expect/expect.dart";
+
 int zero() { return 0; }
 int one() { return 1; }
 int minus1() { return 0 - 1; }
diff --git a/tests/compiler/dart2js_extra/operator_equals_test.dart b/tests/compiler/dart2js_extra/operator_equals_test.dart
index 0368271..becbdd3 100644
--- a/tests/compiler/dart2js_extra/operator_equals_test.dart
+++ b/tests/compiler/dart2js_extra/operator_equals_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:expect/expect.dart";
+
 class AlwaysTrue {
   operator ==(a) => true;
 }
diff --git a/tests/compiler/dart2js_extra/operator_test.dart b/tests/compiler/dart2js_extra/operator_test.dart
index bda18f8..225976f 100644
--- a/tests/compiler/dart2js_extra/operator_test.dart
+++ b/tests/compiler/dart2js_extra/operator_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:expect/expect.dart";
+
 int zero() { return 0; }
 int one() { return 1; }
 int minus1() { return 0 - 1; }
diff --git a/tests/compiler/dart2js_extra/optional_parameter_test.dart b/tests/compiler/dart2js_extra/optional_parameter_test.dart
index 4fd5ac8..bb9ac6f 100644
--- a/tests/compiler/dart2js_extra/optional_parameter_test.dart
+++ b/tests/compiler/dart2js_extra/optional_parameter_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:expect/expect.dart";
+
 class A {
   foo([a]) {
     return a;
diff --git a/tests/compiler/dart2js_extra/panda_test.dart b/tests/compiler/dart2js_extra/panda_test.dart
index 3b39953..793a5ab 100644
--- a/tests/compiler/dart2js_extra/panda_test.dart
+++ b/tests/compiler/dart2js_extra/panda_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library panda_test;
+import "package:expect/expect.dart";
 import 'panda_lib.dart' as p;
 
 void main() {
diff --git a/tests/compiler/dart2js_extra/phi_elimination_test.dart b/tests/compiler/dart2js_extra/phi_elimination_test.dart
index 5e6430a..ed2fb07 100644
--- a/tests/compiler/dart2js_extra/phi_elimination_test.dart
+++ b/tests/compiler/dart2js_extra/phi_elimination_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:expect/expect.dart";
+
 void bar() {
   var a = 0;
   var c = 0;
diff --git a/tests/compiler/dart2js_extra/phi_gvn_test.dart b/tests/compiler/dart2js_extra/phi_gvn_test.dart
index 81511d3..703834f 100644
--- a/tests/compiler/dart2js_extra/phi_gvn_test.dart
+++ b/tests/compiler/dart2js_extra/phi_gvn_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:expect/expect.dart";
+
 foo(x) { }
 
 main() {
diff --git a/tests/compiler/dart2js_extra/phi_test.dart b/tests/compiler/dart2js_extra/phi_test.dart
index 23c10be..14ca2be 100644
--- a/tests/compiler/dart2js_extra/phi_test.dart
+++ b/tests/compiler/dart2js_extra/phi_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:expect/expect.dart";
+
 void phi1() {
   var x = 42;
   if (true) {
diff --git a/tests/compiler/dart2js_extra/regress/4492_test.dart b/tests/compiler/dart2js_extra/regress/4492_test.dart
index f77d29d..a80ae98 100644
--- a/tests/compiler/dart2js_extra/regress/4492_test.dart
+++ b/tests/compiler/dart2js_extra/regress/4492_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:expect/expect.dart";
+
 class A {
   x(p1, p2) {
     print(p1 * p2);
diff --git a/tests/compiler/dart2js_extra/regress/4515_1_test.dart b/tests/compiler/dart2js_extra/regress/4515_1_test.dart
index 6d8b136..8c758b0 100644
--- a/tests/compiler/dart2js_extra/regress/4515_1_test.dart
+++ b/tests/compiler/dart2js_extra/regress/4515_1_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:expect/expect.dart";
+
 class A {
   a(x) => x + 1;
 }
diff --git a/tests/compiler/dart2js_extra/regress/4515_2_test.dart b/tests/compiler/dart2js_extra/regress/4515_2_test.dart
index 8ddc8de..3411648 100644
--- a/tests/compiler/dart2js_extra/regress/4515_2_test.dart
+++ b/tests/compiler/dart2js_extra/regress/4515_2_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:expect/expect.dart";
+
 class A {
   a(x) => x + 1;
 }
diff --git a/tests/compiler/dart2js_extra/regress/4515_3_test.dart b/tests/compiler/dart2js_extra/regress/4515_3_test.dart
index 319eb0c..f224d70 100644
--- a/tests/compiler/dart2js_extra/regress/4515_3_test.dart
+++ b/tests/compiler/dart2js_extra/regress/4515_3_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:expect/expect.dart";
+
 class A {
   a(x) => x + 1;
 }
diff --git a/tests/compiler/dart2js_extra/regress/4639_test.dart b/tests/compiler/dart2js_extra/regress/4639_test.dart
index cc6c5be..2aa9308 100644
--- a/tests/compiler/dart2js_extra/regress/4639_test.dart
+++ b/tests/compiler/dart2js_extra/regress/4639_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:expect/expect.dart";
+
 class A {
   bool contains(x, y) => true;
 }
diff --git a/tests/compiler/dart2js_extra/regress/4740_test.dart b/tests/compiler/dart2js_extra/regress/4740_test.dart
index f04c711..a32a7b9 100644
--- a/tests/compiler/dart2js_extra/regress/4740_test.dart
+++ b/tests/compiler/dart2js_extra/regress/4740_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:expect/expect.dart";
+
 import '4740_library.dart';
 
 main() {
diff --git a/tests/compiler/dart2js_extra/regression_2913_test.dart b/tests/compiler/dart2js_extra/regression_2913_test.dart
index 0099a6a..85b0916 100644
--- a/tests/compiler/dart2js_extra/regression_2913_test.dart
+++ b/tests/compiler/dart2js_extra/regression_2913_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:expect/expect.dart";
+
 main() {
   var a = 10;
   var b = 11;
diff --git a/tests/compiler/dart2js_extra/return_setter_test.dart b/tests/compiler/dart2js_extra/return_setter_test.dart
index bc2192f..a938b71 100644
--- a/tests/compiler/dart2js_extra/return_setter_test.dart
+++ b/tests/compiler/dart2js_extra/return_setter_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:expect/expect.dart";
+
 class A {
   int foo;
 
diff --git a/tests/compiler/dart2js_extra/runtime_type_int_test.dart b/tests/compiler/dart2js_extra/runtime_type_int_test.dart
index efb3861..d98484a 100644
--- a/tests/compiler/dart2js_extra/runtime_type_int_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_int_test.dart
@@ -5,6 +5,8 @@
 // Test that in dart2js, the constant system matches the runtime
 // handling of numbers.
 
+import "package:expect/expect.dart";
+
 main() {
   var x = 10000000000000000;
   var y = [x][0];
diff --git a/tests/compiler/dart2js_extra/runtime_type_isolate.dart b/tests/compiler/dart2js_extra/runtime_type_isolate.dart
index 9be80f5..75815b8 100644
--- a/tests/compiler/dart2js_extra/runtime_type_isolate.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_isolate.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:expect/expect.dart";
 import 'dart:isolate';
 
 class Bar {}
diff --git a/tests/compiler/dart2js_extra/runtime_type_test.dart b/tests/compiler/dart2js_extra/runtime_type_test.dart
new file mode 100644
index 0000000..8f0b0f4
--- /dev/null
+++ b/tests/compiler/dart2js_extra/runtime_type_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that Type.toString returns nice strings for native classes with
+// reserved names and for raw types.
+
+import "package:expect/expect.dart";
+
+class C<T> {}
+
+class D<X, Y, Z> {}
+
+class Class$With$Dollar {}
+
+void main() {
+  Expect.equals('C', new C().runtimeType.toString());
+  Expect.equals('C<int>', new C<int>().runtimeType.toString());
+  Expect.equals('C<double>', new C<double>().runtimeType.toString());
+  Expect.equals('C<num>', new C<num>().runtimeType.toString());
+  Expect.equals('C<bool>', new C<bool>().runtimeType.toString());
+  Expect.equals('D', new D().runtimeType.toString());
+  Expect.equals('D<dynamic, int, dynamic>',
+                new D<dynamic, int, dynamic>().runtimeType.toString());
+  D d = new D<dynamic, D, D<dynamic, dynamic, int>>();
+  Expect.equals('D<dynamic, D, D<dynamic, dynamic, int>>',
+                d.runtimeType.toString());
+  Expect.equals(r'C<Class$With$Dollar>',
+                new C<Class$With$Dollar>().runtimeType.toString());
+}
diff --git a/tests/compiler/dart2js_extra/simple_string_constant_test.dart b/tests/compiler/dart2js_extra/simple_string_constant_test.dart
index d1de74a..746e4d2 100644
--- a/tests/compiler/dart2js_extra/simple_string_constant_test.dart
+++ b/tests/compiler/dart2js_extra/simple_string_constant_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:expect/expect.dart";
+
 const String m = "\u{21}";
 
 main() {
diff --git a/tests/compiler/dart2js_extra/static_field2_test.dart b/tests/compiler/dart2js_extra/static_field2_test.dart
index 337e74b..d2f5cc7 100644
--- a/tests/compiler/dart2js_extra/static_field2_test.dart
+++ b/tests/compiler/dart2js_extra/static_field2_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:expect/expect.dart";
+
 class A {
   static int b;
 }
diff --git a/tests/compiler/dart2js_extra/static_field_test.dart b/tests/compiler/dart2js_extra/static_field_test.dart
index 12214f9..63c96af 100644
--- a/tests/compiler/dart2js_extra/static_field_test.dart
+++ b/tests/compiler/dart2js_extra/static_field_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:expect/expect.dart";
+
 class A {
   static int b;
 
diff --git a/tests/compiler/dart2js_extra/static_method2_test.dart b/tests/compiler/dart2js_extra/static_method2_test.dart
index 49b2518..ab6517f 100644
--- a/tests/compiler/dart2js_extra/static_method2_test.dart
+++ b/tests/compiler/dart2js_extra/static_method2_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:expect/expect.dart";
+
 class A {
   static foo(res) {
     return res;
diff --git a/tests/compiler/dart2js_extra/static_method_test.dart b/tests/compiler/dart2js_extra/static_method_test.dart
index 5f0a4f0..a65e0b6 100644
--- a/tests/compiler/dart2js_extra/static_method_test.dart
+++ b/tests/compiler/dart2js_extra/static_method_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:expect/expect.dart";
+
 class A {
   static foo(res) {
     return res;
diff --git a/tests/compiler/dart2js_extra/static_var_no_initializer_test.dart b/tests/compiler/dart2js_extra/static_var_no_initializer_test.dart
index 58def5c..e6cb720 100644
--- a/tests/compiler/dart2js_extra/static_var_no_initializer_test.dart
+++ b/tests/compiler/dart2js_extra/static_var_no_initializer_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:expect/expect.dart";
+
 int one;
 int x;
 
diff --git a/tests/compiler/dart2js_extra/static_var_test.dart b/tests/compiler/dart2js_extra/static_var_test.dart
index 3144a9b..1b3a9fc 100644
--- a/tests/compiler/dart2js_extra/static_var_test.dart
+++ b/tests/compiler/dart2js_extra/static_var_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:expect/expect.dart";
+
 int one = 1;
 int x = 5;
 
diff --git a/tests/compiler/dart2js_extra/string_escape_test.dart b/tests/compiler/dart2js_extra/string_escape_test.dart
index 6094469..04bd109 100644
--- a/tests/compiler/dart2js_extra/string_escape_test.dart
+++ b/tests/compiler/dart2js_extra/string_escape_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:expect/expect.dart";
+
 // Test that string escapes work correctly.
 
 testSingleCharacterEscapes() {
diff --git a/tests/compiler/dart2js_extra/string_interpolation_test.dart b/tests/compiler/dart2js_extra/string_interpolation_test.dart
index 70357dc..7552214 100644
--- a/tests/compiler/dart2js_extra/string_interpolation_test.dart
+++ b/tests/compiler/dart2js_extra/string_interpolation_test.dart
Binary files differ
diff --git a/tests/compiler/dart2js_extra/super_call_test.dart b/tests/compiler/dart2js_extra/super_call_test.dart
index 7c28f44..c9f777f 100644
--- a/tests/compiler/dart2js_extra/super_call_test.dart
+++ b/tests/compiler/dart2js_extra/super_call_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:expect/expect.dart";
+
 class A {
   foo() => "A.foo${baz()}";
   baz() => "A.baz";
diff --git a/tests/compiler/dart2js_extra/super_constructor1_test.dart b/tests/compiler/dart2js_extra/super_constructor1_test.dart
index 49ce5c5..c6fcb01 100644
--- a/tests/compiler/dart2js_extra/super_constructor1_test.dart
+++ b/tests/compiler/dart2js_extra/super_constructor1_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:expect/expect.dart";
+
 String message;
 
 class A {
diff --git a/tests/compiler/dart2js_extra/super_constructor2_test.dart b/tests/compiler/dart2js_extra/super_constructor2_test.dart
index 4c5f302..73ac20a 100644
--- a/tests/compiler/dart2js_extra/super_constructor2_test.dart
+++ b/tests/compiler/dart2js_extra/super_constructor2_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:expect/expect.dart";
+
 class A {
   int x;
   A() : x = 27;
diff --git a/tests/compiler/dart2js_extra/switch_test.dart b/tests/compiler/dart2js_extra/switch_test.dart
index 7d0876b..c6190e4 100644
--- a/tests/compiler/dart2js_extra/switch_test.dart
+++ b/tests/compiler/dart2js_extra/switch_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:expect/expect.dart";
+
 switcher(val) {
   var x = 0;
   switch (val) {
diff --git a/tests/compiler/dart2js_extra/this_phi_elimination_test.dart b/tests/compiler/dart2js_extra/this_phi_elimination_test.dart
index f678b8f..80f7bb0 100644
--- a/tests/compiler/dart2js_extra/this_phi_elimination_test.dart
+++ b/tests/compiler/dart2js_extra/this_phi_elimination_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:expect/expect.dart";
+
 class A {
   foo(a) {
     while (false) {
diff --git a/tests/compiler/dart2js_extra/this_redirecting_constructor_test.dart b/tests/compiler/dart2js_extra/this_redirecting_constructor_test.dart
index 6962716..068d62f 100644
--- a/tests/compiler/dart2js_extra/this_redirecting_constructor_test.dart
+++ b/tests/compiler/dart2js_extra/this_redirecting_constructor_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:expect/expect.dart";
+
 // Confirm that redirecting named constructors are properly resolved.
 //
 // Note that this test may become invalid due to http://dartbug.com/5940.
@@ -16,4 +18,4 @@
 main() {
   var c = new C.redirecting();
   Expect.equals(c.x, 2);
-}
\ No newline at end of file
+}
diff --git a/tests/compiler/dart2js_extra/this_test.dart b/tests/compiler/dart2js_extra/this_test.dart
index e979497..18cf323 100644
--- a/tests/compiler/dart2js_extra/this_test.dart
+++ b/tests/compiler/dart2js_extra/this_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:expect/expect.dart";
+
 class A {
   int x;
   getX() => this.x;
diff --git a/tests/compiler/dart2js_extra/to_string_test.dart b/tests/compiler/dart2js_extra/to_string_test.dart
index 0227534..6324a78 100644
--- a/tests/compiler/dart2js_extra/to_string_test.dart
+++ b/tests/compiler/dart2js_extra/to_string_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:expect/expect.dart";
+
 class A extends Object {
 }
 
diff --git a/tests/compiler/dart2js_extra/type_argument_factory_crash_test.dart b/tests/compiler/dart2js_extra/type_argument_factory_crash_test.dart
index e49f4d6..2ed0db6 100644
--- a/tests/compiler/dart2js_extra/type_argument_factory_crash_test.dart
+++ b/tests/compiler/dart2js_extra/type_argument_factory_crash_test.dart
@@ -4,6 +4,7 @@
 
 // A regression test for a dart2js crash.
 library type.argument.factory.crash.test;
+import "package:expect/expect.dart";
 import 'dart:collection' show LinkedHashMap;
 
 void main() {
diff --git a/tests/compiler/dart2js_extra/type_argument_factory_nocrash_test.dart b/tests/compiler/dart2js_extra/type_argument_factory_nocrash_test.dart
index 975a067..7ddb90c 100644
--- a/tests/compiler/dart2js_extra/type_argument_factory_nocrash_test.dart
+++ b/tests/compiler/dart2js_extra/type_argument_factory_nocrash_test.dart
@@ -4,6 +4,7 @@
 
 // A regression test for a dart2js crash.
 library type.argument.factory.nocrash.test;
+import "package:expect/expect.dart";
 import 'dart:collection' show LinkedHashMap;
 
 void main() {
diff --git a/tests/compiler/dart2js_extra/typevariable_factory_test.dart b/tests/compiler/dart2js_extra/typevariable_factory_test.dart
index 5618cae..2f977cf 100644
--- a/tests/compiler/dart2js_extra/typevariable_factory_test.dart
+++ b/tests/compiler/dart2js_extra/typevariable_factory_test.dart
@@ -4,6 +4,8 @@
 
 // Regression test to ensure that we can use type variable in factories.
 
+import "package:expect/expect.dart";
+
 class A<T> {
   factory A.foo(o) {
     Expect.isTrue(o is A<T>);
diff --git a/tests/compiler/dart2js_extra/typevariable_substitution_test.dart b/tests/compiler/dart2js_extra/typevariable_substitution_test.dart
index 8a40a82..dd5e75f 100644
--- a/tests/compiler/dart2js_extra/typevariable_substitution_test.dart
+++ b/tests/compiler/dart2js_extra/typevariable_substitution_test.dart
@@ -4,6 +4,8 @@
 
 // Regression test to ensure that we substitute type variables in is-tests.
 
+import "package:expect/expect.dart";
+
 class A<T> {
   A.foo(o) {
     Expect.isTrue(o is A<T>);
diff --git a/tests/compiler/dart2js_extra/while_test.dart b/tests/compiler/dart2js_extra/while_test.dart
index c41d7ca..4ac3ec3 100644
--- a/tests/compiler/dart2js_extra/while_test.dart
+++ b/tests/compiler/dart2js_extra/while_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:expect/expect.dart";
+
 void while1() {
   bool cond = true;
   var result = 0;
diff --git a/tests/compiler/dart2js_foreign/foreign_test.dart b/tests/compiler/dart2js_foreign/foreign_test.dart
index a23e1e2..1e7dddb 100644
--- a/tests/compiler/dart2js_foreign/foreign_test.dart
+++ b/tests/compiler/dart2js_foreign/foreign_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:expect/expect.dart";
 import 'native_metadata.dart';
 
 foreign1(var a, var b) {
diff --git a/tests/compiler/dart2js_foreign/native_call_arity1_test.dart b/tests/compiler/dart2js_foreign/native_call_arity1_test.dart
index 2ae3917..1476be5 100644
--- a/tests/compiler/dart2js_foreign/native_call_arity1_test.dart
+++ b/tests/compiler/dart2js_foreign/native_call_arity1_test.dart
@@ -10,6 +10,7 @@
 // * Named arguments are passed in the correct position, so require preceding
 // arguments to be passed.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_call_arity2_test.dart b/tests/compiler/dart2js_foreign/native_call_arity2_test.dart
index b28e99e..acb0f71 100644
--- a/tests/compiler/dart2js_foreign/native_call_arity2_test.dart
+++ b/tests/compiler/dart2js_foreign/native_call_arity2_test.dart
@@ -5,6 +5,7 @@
 // This is a similar test to NativeCallArity1FrogTest, but makes sure
 // that subclasses also get the right number of arguments.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_call_arity3_test.dart b/tests/compiler/dart2js_foreign/native_call_arity3_test.dart
index fb2e00b..172119c 100644
--- a/tests/compiler/dart2js_foreign/native_call_arity3_test.dart
+++ b/tests/compiler/dart2js_foreign/native_call_arity3_test.dart
@@ -6,6 +6,7 @@
 // parameters set to null. These parameters should be treated as if they
 // do not have a default value for the native methods.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_checked_arguments1_test.dart b/tests/compiler/dart2js_foreign/native_checked_arguments1_test.dart
index f6e169b..29bbefe 100644
--- a/tests/compiler/dart2js_foreign/native_checked_arguments1_test.dart
+++ b/tests/compiler/dart2js_foreign/native_checked_arguments1_test.dart
@@ -4,6 +4,7 @@
 
 // Test that type checks occur on native methods.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_checked_fields_test.dart b/tests/compiler/dart2js_foreign/native_checked_fields_test.dart
index 15851b8..91406f3 100644
--- a/tests/compiler/dart2js_foreign/native_checked_fields_test.dart
+++ b/tests/compiler/dart2js_foreign/native_checked_fields_test.dart
@@ -4,6 +4,7 @@
 
 // Test that type checks occur on assignment to fields of native methods.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_class_avoids_hidden_name_test.dart b/tests/compiler/dart2js_foreign/native_class_avoids_hidden_name_test.dart
index 170d6e2..7ff5cb1 100644
--- a/tests/compiler/dart2js_foreign/native_class_avoids_hidden_name_test.dart
+++ b/tests/compiler/dart2js_foreign/native_class_avoids_hidden_name_test.dart
@@ -4,6 +4,7 @@
 
 // Test that hidden native class names are not used by generated code.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*B")
diff --git a/tests/compiler/dart2js_foreign/native_class_inheritance1_test.dart b/tests/compiler/dart2js_foreign/native_class_inheritance1_test.dart
index 0aae881..b3d9632 100644
--- a/tests/compiler/dart2js_foreign/native_class_inheritance1_test.dart
+++ b/tests/compiler/dart2js_foreign/native_class_inheritance1_test.dart
@@ -7,6 +7,7 @@
 // superclass caches the method in the prototype, so shadowing the dispatcher
 // stored on Object.prototype.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 // Version 1: It might be possible to call foo directly.
diff --git a/tests/compiler/dart2js_foreign/native_class_inheritance2_test.dart b/tests/compiler/dart2js_foreign/native_class_inheritance2_test.dart
index 77f24c3..da23d5f 100644
--- a/tests/compiler/dart2js_foreign/native_class_inheritance2_test.dart
+++ b/tests/compiler/dart2js_foreign/native_class_inheritance2_test.dart
@@ -7,6 +7,7 @@
 // superclass caches the method in the prototype, so shadowing the dispatcher
 // stored on Object.prototype.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_class_inheritance3_test.dart b/tests/compiler/dart2js_foreign/native_class_inheritance3_test.dart
index c3a085f..73794c8 100644
--- a/tests/compiler/dart2js_foreign/native_class_inheritance3_test.dart
+++ b/tests/compiler/dart2js_foreign/native_class_inheritance3_test.dart
@@ -6,6 +6,7 @@
 // interferes with subsequent resolving of the method.  This might happen if the
 // noSuchMethod is cached on Object.prototype.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A1")
diff --git a/tests/compiler/dart2js_foreign/native_class_inheritance4_test.dart b/tests/compiler/dart2js_foreign/native_class_inheritance4_test.dart
index b7a8c67..f128515 100644
--- a/tests/compiler/dart2js_foreign/native_class_inheritance4_test.dart
+++ b/tests/compiler/dart2js_foreign/native_class_inheritance4_test.dart
@@ -6,6 +6,7 @@
 // inheritance, the superclass method must not be reached by a call on the
 // subclass.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_class_is_check1_test.dart b/tests/compiler/dart2js_foreign/native_class_is_check1_test.dart
index ee73eae..5c4ca64 100644
--- a/tests/compiler/dart2js_foreign/native_class_is_check1_test.dart
+++ b/tests/compiler/dart2js_foreign/native_class_is_check1_test.dart
@@ -4,6 +4,7 @@
 
 // Test for correct simple is-checks on hidden native classes.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 interface I {
diff --git a/tests/compiler/dart2js_foreign/native_class_is_check3_test.dart b/tests/compiler/dart2js_foreign/native_class_is_check3_test.dart
index 464e593..b6e63bb 100644
--- a/tests/compiler/dart2js_foreign/native_class_is_check3_test.dart
+++ b/tests/compiler/dart2js_foreign/native_class_is_check3_test.dart
@@ -4,6 +4,7 @@
 
 // Test for correct simple is-checks on hidden native classes.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 interface J {
diff --git a/tests/compiler/dart2js_foreign/native_class_with_dart_methods_test.dart b/tests/compiler/dart2js_foreign/native_class_with_dart_methods_test.dart
index 963263e..09ec690 100644
--- a/tests/compiler/dart2js_foreign/native_class_with_dart_methods_test.dart
+++ b/tests/compiler/dart2js_foreign/native_class_with_dart_methods_test.dart
@@ -4,6 +4,7 @@
 
 // Additional Dart code may be 'placed on' hidden native classes.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_closure_identity_test.dart b/tests/compiler/dart2js_foreign/native_closure_identity_test.dart
index 1ba6c2f..cca3588 100644
--- a/tests/compiler/dart2js_foreign/native_closure_identity_test.dart
+++ b/tests/compiler/dart2js_foreign/native_closure_identity_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:expect/expect.dart";
 import 'native_metadata.dart';
 
 typedef void MyFunctionType();
diff --git a/tests/compiler/dart2js_foreign/native_exceptions1_test.dart b/tests/compiler/dart2js_foreign/native_exceptions1_test.dart
index 40f5b9e..25ca222 100644
--- a/tests/compiler/dart2js_foreign/native_exceptions1_test.dart
+++ b/tests/compiler/dart2js_foreign/native_exceptions1_test.dart
@@ -13,6 +13,7 @@
 // is no place in the Dart language to communicate (3).  So we use the following
 // fake body technique.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 // The exception type.
diff --git a/tests/compiler/dart2js_foreign/native_field_rename_1_test.dart b/tests/compiler/dart2js_foreign/native_field_rename_1_test.dart
index e8ae45c..a7b7f51 100644
--- a/tests/compiler/dart2js_foreign/native_field_rename_1_test.dart
+++ b/tests/compiler/dart2js_foreign/native_field_rename_1_test.dart
@@ -6,6 +6,7 @@
 // fields.  However, native fields keep their name.  The implication: a getter
 // for the field must be based on the field's name, not the field's jsname.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_field_rename_2_test.dart b/tests/compiler/dart2js_foreign/native_field_rename_2_test.dart
index 34eaacb..55efc6c 100644
--- a/tests/compiler/dart2js_foreign/native_field_rename_2_test.dart
+++ b/tests/compiler/dart2js_foreign/native_field_rename_2_test.dart
@@ -6,6 +6,7 @@
 // fields.  However, native fields keep their name.  The implication: a getter
 // for the field must be based on the field's name, not the field's jsname.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 interface I {
diff --git a/tests/compiler/dart2js_foreign/native_library_same_name_used_test.dart b/tests/compiler/dart2js_foreign/native_library_same_name_used_test.dart
index c3bddda..90ad5d2 100644
--- a/tests/compiler/dart2js_foreign/native_library_same_name_used_test.dart
+++ b/tests/compiler/dart2js_foreign/native_library_same_name_used_test.dart
@@ -5,6 +5,7 @@
 // Test for correct hidden native class when interface has same name.
 
 library main;
+import "package:expect/expect.dart";
 import 'native_library_same_name_used_lib1.dart';
 import 'native_metadata.dart';
 
diff --git a/tests/compiler/dart2js_foreign/native_literal_class_test.dart b/tests/compiler/dart2js_foreign/native_literal_class_test.dart
index 86e9fd0..9bb3ec2 100644
--- a/tests/compiler/dart2js_foreign/native_literal_class_test.dart
+++ b/tests/compiler/dart2js_foreign/native_literal_class_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:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("= {log: function() { return 42 } }")
diff --git a/tests/compiler/dart2js_foreign/native_method_rename1_test.dart b/tests/compiler/dart2js_foreign/native_method_rename1_test.dart
index 485fb5f5..9e229a8 100644
--- a/tests/compiler/dart2js_foreign/native_method_rename1_test.dart
+++ b/tests/compiler/dart2js_foreign/native_method_rename1_test.dart
@@ -4,6 +4,7 @@
 
 // Test the feature where the native string declares the native method's name.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_method_rename2_test.dart b/tests/compiler/dart2js_foreign/native_method_rename2_test.dart
index 767f61b..9258aa6 100644
--- a/tests/compiler/dart2js_foreign/native_method_rename2_test.dart
+++ b/tests/compiler/dart2js_foreign/native_method_rename2_test.dart
@@ -4,6 +4,7 @@
 
 // Test the feature where the native string declares the native method's name.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_method_rename3_test.dart b/tests/compiler/dart2js_foreign/native_method_rename3_test.dart
index bceaf9f..e0f5c71 100644
--- a/tests/compiler/dart2js_foreign/native_method_rename3_test.dart
+++ b/tests/compiler/dart2js_foreign/native_method_rename3_test.dart
@@ -5,6 +5,7 @@
 // Test the feature where the native string declares the native method's name.
 // #3. The name does not get
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_method_with_keyword_name_test.dart b/tests/compiler/dart2js_foreign/native_method_with_keyword_name_test.dart
index 6a15512..3786647 100644
--- a/tests/compiler/dart2js_foreign/native_method_with_keyword_name_test.dart
+++ b/tests/compiler/dart2js_foreign/native_method_with_keyword_name_test.dart
@@ -4,6 +4,7 @@
 
 // Make sure we can have a native with a name that is a JavaScript keyword.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_missing_method1_test.dart b/tests/compiler/dart2js_foreign/native_missing_method1_test.dart
index f81b9a8..d87878f 100644
--- a/tests/compiler/dart2js_foreign/native_missing_method1_test.dart
+++ b/tests/compiler/dart2js_foreign/native_missing_method1_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:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_missing_method2_test.dart b/tests/compiler/dart2js_foreign/native_missing_method2_test.dart
index fb99986..bd6bae4 100644
--- a/tests/compiler/dart2js_foreign/native_missing_method2_test.dart
+++ b/tests/compiler/dart2js_foreign/native_missing_method2_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:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_named_constructors2_test.dart b/tests/compiler/dart2js_foreign/native_named_constructors2_test.dart
index 4c6704b..d00a779 100644
--- a/tests/compiler/dart2js_foreign/native_named_constructors2_test.dart
+++ b/tests/compiler/dart2js_foreign/native_named_constructors2_test.dart
@@ -4,6 +4,7 @@
 
 // Hidden native class wwith named constructors and static methods.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_named_constructors3_test.dart b/tests/compiler/dart2js_foreign/native_named_constructors3_test.dart
index 18bba8e..0921f6e 100644
--- a/tests/compiler/dart2js_foreign/native_named_constructors3_test.dart
+++ b/tests/compiler/dart2js_foreign/native_named_constructors3_test.dart
@@ -5,6 +5,7 @@
 // Hidden native class with factory constructors and NO static methods.
 // Regression test.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_no_such_method_exception2_test.dart b/tests/compiler/dart2js_foreign/native_no_such_method_exception2_test.dart
index 65f9517..894a462 100644
--- a/tests/compiler/dart2js_foreign/native_no_such_method_exception2_test.dart
+++ b/tests/compiler/dart2js_foreign/native_no_such_method_exception2_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:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_no_such_method_exception3_test.dart b/tests/compiler/dart2js_foreign/native_no_such_method_exception3_test.dart
index 4aadd1b..1c50a0a 100644
--- a/tests/compiler/dart2js_foreign/native_no_such_method_exception3_test.dart
+++ b/tests/compiler/dart2js_foreign/native_no_such_method_exception3_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:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_no_such_method_exception4_test.dart b/tests/compiler/dart2js_foreign/native_no_such_method_exception4_test.dart
index b68e078..182cbc6 100644
--- a/tests/compiler/dart2js_foreign/native_no_such_method_exception4_test.dart
+++ b/tests/compiler/dart2js_foreign/native_no_such_method_exception4_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:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_no_such_method_exception5_test.dart b/tests/compiler/dart2js_foreign/native_no_such_method_exception5_test.dart
index abb3961..15c9cad 100644
--- a/tests/compiler/dart2js_foreign/native_no_such_method_exception5_test.dart
+++ b/tests/compiler/dart2js_foreign/native_no_such_method_exception5_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:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_no_such_method_exception_test.dart b/tests/compiler/dart2js_foreign/native_no_such_method_exception_test.dart
index ee9d30e..7459441 100644
--- a/tests/compiler/dart2js_foreign/native_no_such_method_exception_test.dart
+++ b/tests/compiler/dart2js_foreign/native_no_such_method_exception_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:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_null_closure_test.dart b/tests/compiler/dart2js_foreign/native_null_closure_test.dart
index 7762d1c..b6ac177 100644
--- a/tests/compiler/dart2js_foreign/native_null_closure_test.dart
+++ b/tests/compiler/dart2js_foreign/native_null_closure_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:expect/expect.dart";
 import 'native_metadata.dart';
 
 typedef void MyFunctionType();
diff --git a/tests/compiler/dart2js_foreign/native_null_test.dart b/tests/compiler/dart2js_foreign/native_null_test.dart
index 77db080..540d994 100644
--- a/tests/compiler/dart2js_foreign/native_null_test.dart
+++ b/tests/compiler/dart2js_foreign/native_null_test.dart
@@ -5,6 +5,7 @@
 // Test that parameters in native methods are not mangled. This test is needed
 // until we change all libraries to using the JS foreign element.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_parameter_names_test.dart b/tests/compiler/dart2js_foreign/native_parameter_names_test.dart
index 466b226..4bf7084 100644
--- a/tests/compiler/dart2js_foreign/native_parameter_names_test.dart
+++ b/tests/compiler/dart2js_foreign/native_parameter_names_test.dart
@@ -5,6 +5,7 @@
 // Test that parameters in native methods are not mangled. This test is needed
 // until we change all libraries to using the JS foreign element.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_property_test.dart b/tests/compiler/dart2js_foreign/native_property_test.dart
index 4aa85ea..e7abbda8 100644
--- a/tests/compiler/dart2js_foreign/native_property_test.dart
+++ b/tests/compiler/dart2js_foreign/native_property_test.dart
@@ -4,6 +4,7 @@
 
 // Properties on hidden native classes.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_to_string_test.dart b/tests/compiler/dart2js_foreign/native_to_string_test.dart
index 959b2ca..69bcc8b 100644
--- a/tests/compiler/dart2js_foreign/native_to_string_test.dart
+++ b/tests/compiler/dart2js_foreign/native_to_string_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:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*A")
diff --git a/tests/compiler/dart2js_foreign/native_use_native_name_in_table_test.dart b/tests/compiler/dart2js_foreign/native_use_native_name_in_table_test.dart
index b57e267..cc1d668 100644
--- a/tests/compiler/dart2js_foreign/native_use_native_name_in_table_test.dart
+++ b/tests/compiler/dart2js_foreign/native_use_native_name_in_table_test.dart
@@ -5,6 +5,7 @@
 // Test that we put native names and not Dart names into the dynamic
 // dispatch table.
 
+import "package:expect/expect.dart";
 import 'native_metadata.dart';
 
 @Native("*NativeA")
diff --git a/tests/compiler/dart2js_foreign/native_window1_test.dart b/tests/compiler/dart2js_foreign/native_window1_test.dart
index ecd0b8e..1f1ee85 100644
--- a/tests/compiler/dart2js_foreign/native_window1_test.dart
+++ b/tests/compiler/dart2js_foreign/native_window1_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:expect/expect.dart";
 import 'native_metadata.dart';
 
 interface Window {
diff --git a/tests/compiler/dart2js_foreign/native_window2_test.dart b/tests/compiler/dart2js_foreign/native_window2_test.dart
index 414ede5..328601b 100644
--- a/tests/compiler/dart2js_foreign/native_window2_test.dart
+++ b/tests/compiler/dart2js_foreign/native_window2_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:expect/expect.dart";
 import 'native_metadata.dart';
 
 interface Window {
diff --git a/tests/compiler/dart2js_foreign/native_wrapping_function2_test.dart b/tests/compiler/dart2js_foreign/native_wrapping_function2_test.dart
index a123a1f..90e8caa 100644
--- a/tests/compiler/dart2js_foreign/native_wrapping_function2_test.dart
+++ b/tests/compiler/dart2js_foreign/native_wrapping_function2_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:expect/expect.dart";
 import 'native_metadata.dart';
 
 typedef void Callback0();
diff --git a/tests/compiler/dart2js_foreign/native_wrapping_function3_test.dart b/tests/compiler/dart2js_foreign/native_wrapping_function3_test.dart
index e341171..3b994d0 100644
--- a/tests/compiler/dart2js_foreign/native_wrapping_function3_test.dart
+++ b/tests/compiler/dart2js_foreign/native_wrapping_function3_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:expect/expect.dart";
 import 'native_metadata.dart';
 
 typedef void Callback0();
diff --git a/tests/compiler/dart2js_foreign/native_wrapping_function_test.dart b/tests/compiler/dart2js_foreign/native_wrapping_function_test.dart
index 5da4248..ec2057e 100644
--- a/tests/compiler/dart2js_foreign/native_wrapping_function_test.dart
+++ b/tests/compiler/dart2js_foreign/native_wrapping_function_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:expect/expect.dart";
 import 'native_metadata.dart';
 
 typedef void Callback0();
diff --git a/tests/compiler/dart2js_native/core_type_check_native_test.dart b/tests/compiler/dart2js_native/core_type_check_native_test.dart
index 17a6a438..cdfc737 100644
--- a/tests/compiler/dart2js_native/core_type_check_native_test.dart
+++ b/tests/compiler/dart2js_native/core_type_check_native_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:expect/expect.dart";
+
 check(value, expectComparable, expectPattern) {
   Expect.equals(expectComparable, value is Comparable);
   Expect.equals(expectPattern, value is Pattern);
diff --git a/tests/compiler/dart2js_native/dart2js_native.status b/tests/compiler/dart2js_native/dart2js_native.status
index a69582f..9af392c 100644
--- a/tests/compiler/dart2js_native/dart2js_native.status
+++ b/tests/compiler/dart2js_native/dart2js_native.status
@@ -7,8 +7,5 @@
 
 [ $compiler == dart2js ]
 native_null_closure_frog_test: Fail
-native_mixin_test: Fail           # Issue 9629
-native_mixin_field_test: Fail     # Issue 9629
-native_mixin_multiple_test: Fail  # Issue 9629
 native_no_such_method_exception4_frog_test: Fail  # Issue 9631
 native_no_such_method_exception5_frog_test: Fail  # Issue 9631
diff --git a/tests/compiler/dart2js_native/downcast_test.dart b/tests/compiler/dart2js_native/downcast_test.dart
index c2960bf..31202055 100644
--- a/tests/compiler/dart2js_native/downcast_test.dart
+++ b/tests/compiler/dart2js_native/downcast_test.dart
@@ -4,6 +4,8 @@
 
 // Test for downcasts on native classes.
 
+import "package:expect/expect.dart";
+
 interface J {
 }
 
diff --git a/tests/compiler/dart2js_native/field_type_test.dart b/tests/compiler/dart2js_native/field_type_test.dart
index 9de1cfb..0ea5711 100644
--- a/tests/compiler/dart2js_native/field_type_test.dart
+++ b/tests/compiler/dart2js_native/field_type_test.dart
@@ -6,6 +6,8 @@
 // This regression test verifies that compiler accounts for hidden constructor
 // when analysing field values.
 
+import "package:expect/expect.dart";
+
 class Node native "*Node" {
 
   final Node parentNode;
diff --git a/tests/compiler/dart2js_native/foreign_test.dart b/tests/compiler/dart2js_native/foreign_test.dart
index f7fd7c6d..dcefa26 100644
--- a/tests/compiler/dart2js_native/foreign_test.dart
+++ b/tests/compiler/dart2js_native/foreign_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:expect/expect.dart";
 import 'dart:_foreign_helper' show JS;
 
 foreign1(var a, var b) {
diff --git a/tests/compiler/dart2js_native/hash_code_test.dart b/tests/compiler/dart2js_native/hash_code_test.dart
index 0c50d21..1cd9da7 100644
--- a/tests/compiler/dart2js_native/hash_code_test.dart
+++ b/tests/compiler/dart2js_native/hash_code_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:expect/expect.dart";
+
 class A native "*A" {}
 makeA() native;
 
diff --git a/tests/compiler/dart2js_native/is_check_test.dart b/tests/compiler/dart2js_native/is_check_test.dart
index f0ae311..0f70722 100644
--- a/tests/compiler/dart2js_native/is_check_test.dart
+++ b/tests/compiler/dart2js_native/is_check_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:expect/expect.dart";
+
 class A native "*A" {}
 
 main() {
diff --git a/tests/compiler/dart2js_native/issue9182_test.dart b/tests/compiler/dart2js_native/issue9182_test.dart
index 8cbd17a..b8ae713 100644
--- a/tests/compiler/dart2js_native/issue9182_test.dart
+++ b/tests/compiler/dart2js_native/issue9182_test.dart
@@ -5,6 +5,8 @@
 // Regression test for Issue 9182.  The generative constructor body function
 // should not have the interceptor calling convention.
 
+import "package:expect/expect.dart";
+
 class Foo native "*A" {
   factory Foo() => makeA();
   // Ensure the instance method 'Bar' uses interceptor convention.
diff --git a/tests/compiler/dart2js_native/native_call_arity1_frog_test.dart b/tests/compiler/dart2js_native/native_call_arity1_frog_test.dart
index 8558b22..6f398b4 100644
--- a/tests/compiler/dart2js_native/native_call_arity1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_call_arity1_frog_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:expect/expect.dart";
+
 // Test that native methods with unnamed* optional arguments are called with the
 // number of arguments in the call site.  This is necessary because native
 // methods can dispatch on the number of arguments.  Passing null or undefined
diff --git a/tests/compiler/dart2js_native/native_call_arity2_frog_test.dart b/tests/compiler/dart2js_native/native_call_arity2_frog_test.dart
index f292ad1..0014b00 100644
--- a/tests/compiler/dart2js_native/native_call_arity2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_call_arity2_frog_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:expect/expect.dart";
+
 // This is a similar test to NativeCallArity1FrogTest, but makes sure
 // that subclasses also get the right number of arguments.
 
diff --git a/tests/compiler/dart2js_native/native_call_arity3_frog_test.dart b/tests/compiler/dart2js_native/native_call_arity3_frog_test.dart
index 8a45c05..ff59e31 100644
--- a/tests/compiler/dart2js_native/native_call_arity3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_call_arity3_frog_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:expect/expect.dart";
+
 // Test similar to NativeCallArity1FrogTest, but with default values to
 // parameters set to null. These parameters should be treated as if they
 // do not have a default value for the native methods.
diff --git a/tests/compiler/dart2js_native/native_checked_arguments1_frog_test.dart b/tests/compiler/dart2js_native/native_checked_arguments1_frog_test.dart
index 9922665..7874dcd 100644
--- a/tests/compiler/dart2js_native/native_checked_arguments1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_checked_arguments1_frog_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:expect/expect.dart";
+
 // Test that type checks occur on native methods.
 
 class A native "*A" {
diff --git a/tests/compiler/dart2js_native/native_checked_fields_frog_test.dart b/tests/compiler/dart2js_native/native_checked_fields_frog_test.dart
index 0b08f46..a63674c 100644
--- a/tests/compiler/dart2js_native/native_checked_fields_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_checked_fields_frog_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:expect/expect.dart";
+
 // Test that type checks occur on assignment to fields of native methods.
 
 class A native "*A" {
diff --git a/tests/compiler/dart2js_native/native_class_avoids_hidden_name_frog_test.dart b/tests/compiler/dart2js_native/native_class_avoids_hidden_name_frog_test.dart
index ff4be42..dc7877f 100644
--- a/tests/compiler/dart2js_native/native_class_avoids_hidden_name_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_avoids_hidden_name_frog_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:expect/expect.dart";
+
 // Test that hidden native class names are not used by generated code.
 
 class A native "*B" {
diff --git a/tests/compiler/dart2js_native/native_class_fields_2_test.dart b/tests/compiler/dart2js_native/native_class_fields_2_test.dart
index 1612371..00ca28b 100644
--- a/tests/compiler/dart2js_native/native_class_fields_2_test.dart
+++ b/tests/compiler/dart2js_native/native_class_fields_2_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:expect/expect.dart";
+
 // Verify that methods are not renamed to clash with native field names
 // that are known from the DOM (like x, y, z).
 class A native "*A" {
diff --git a/tests/compiler/dart2js_native/native_class_fields_3_test.dart b/tests/compiler/dart2js_native/native_class_fields_3_test.dart
index a884dbf..1af5d67 100644
--- a/tests/compiler/dart2js_native/native_class_fields_3_test.dart
+++ b/tests/compiler/dart2js_native/native_class_fields_3_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:expect/expect.dart";
+
 // Verify that we can have fields with names that start with g and s even
 // though those names are reserved for getters and setters in minified mode.
 
@@ -84,4 +86,3 @@
   Expect.equals(6, foo.gettersCalled);
   Expect.equals(6, foo.settersCalled);
 }
-
diff --git a/tests/compiler/dart2js_native/native_class_fields_test.dart b/tests/compiler/dart2js_native/native_class_fields_test.dart
index 8221eec..4bd0aa6 100644
--- a/tests/compiler/dart2js_native/native_class_fields_test.dart
+++ b/tests/compiler/dart2js_native/native_class_fields_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:expect/expect.dart";
+
 // Verify that native fields on classes are not renamed by the minifier.
 class A native "*A" {
   int myLongPropertyName;
diff --git a/tests/compiler/dart2js_native/native_class_inheritance1_frog_test.dart b/tests/compiler/dart2js_native/native_class_inheritance1_frog_test.dart
index 07a8ff1..9c37eba 100644
--- a/tests/compiler/dart2js_native/native_class_inheritance1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_inheritance1_frog_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:expect/expect.dart";
+
 // Test to see if resolving a hidden native class's method interferes with
 // subsequent resolving the subclass's method.  This might happen if the
 // superclass caches the method in the prototype, so shadowing the dispatcher
diff --git a/tests/compiler/dart2js_native/native_class_inheritance2_frog_test.dart b/tests/compiler/dart2js_native/native_class_inheritance2_frog_test.dart
index 9dec57b..27819c4 100644
--- a/tests/compiler/dart2js_native/native_class_inheritance2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_inheritance2_frog_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:expect/expect.dart";
+
 // Test to see if resolving a hidden native class's method interferes with
 // subsequent resolving the subclass's method.  This might happen if the
 // superclass caches the method in the prototype, so shadowing the dispatcher
diff --git a/tests/compiler/dart2js_native/native_class_inheritance3_frog_test.dart b/tests/compiler/dart2js_native/native_class_inheritance3_frog_test.dart
index 5b7dd69..2f93bd2 100644
--- a/tests/compiler/dart2js_native/native_class_inheritance3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_inheritance3_frog_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:expect/expect.dart";
+
 // Test to see if resolving a hidden native class's method to noSuchMethod
 // interferes with subsequent resolving of the method.  This might happen if the
 // noSuchMethod is cached on Object.prototype.
diff --git a/tests/compiler/dart2js_native/native_class_inheritance4_frog_test.dart b/tests/compiler/dart2js_native/native_class_inheritance4_frog_test.dart
index 4e77ffe..70f2282 100644
--- a/tests/compiler/dart2js_native/native_class_inheritance4_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_inheritance4_frog_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:expect/expect.dart";
+
 // Additional Dart code may be 'placed on' hidden native classes.  With
 // inheritance, the superclass method must not be reached by a call on the
 // subclass.
diff --git a/tests/compiler/dart2js_native/native_class_is_check1_frog_test.dart b/tests/compiler/dart2js_native/native_class_is_check1_frog_test.dart
index 535dcec..49dde38 100644
--- a/tests/compiler/dart2js_native/native_class_is_check1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_is_check1_frog_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:expect/expect.dart";
+
 // Test for correct simple is-checks on hidden native classes.
 
 interface I {
diff --git a/tests/compiler/dart2js_native/native_class_is_check3_frog_test.dart b/tests/compiler/dart2js_native/native_class_is_check3_frog_test.dart
index afd6e32..b1f5f64 100644
--- a/tests/compiler/dart2js_native/native_class_is_check3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_is_check3_frog_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:expect/expect.dart";
+
 // Test for correct simple is-checks on hidden native classes.
 
 interface J {
diff --git a/tests/compiler/dart2js_native/native_class_with_dart_methods_frog_test.dart b/tests/compiler/dart2js_native/native_class_with_dart_methods_frog_test.dart
index 17dc60e..e595936 100644
--- a/tests/compiler/dart2js_native/native_class_with_dart_methods_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_with_dart_methods_frog_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:expect/expect.dart";
+
 // Additional Dart code may be 'placed on' hidden native classes.
 
 class A native "*A" {
diff --git a/tests/compiler/dart2js_native/native_closure_identity_frog_test.dart b/tests/compiler/dart2js_native/native_closure_identity_frog_test.dart
index 26c7d4e..0f699b8 100644
--- a/tests/compiler/dart2js_native/native_closure_identity_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_closure_identity_frog_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:expect/expect.dart";
+
 typedef void MyFunctionType();
 
 class A native "*A" {
diff --git a/tests/compiler/dart2js_native/native_constructor_name_test.dart b/tests/compiler/dart2js_native/native_constructor_name_test.dart
index bbf8b5c..9ea1b2d 100644
--- a/tests/compiler/dart2js_native/native_constructor_name_test.dart
+++ b/tests/compiler/dart2js_native/native_constructor_name_test.dart
@@ -8,6 +8,8 @@
 // This could be done by renaming the Dart constructor or by being able to check
 // that objects are Dart classes.
 
+import "package:expect/expect.dart";
+
 class A {
 }
 
diff --git a/tests/compiler/dart2js_native/native_equals_frog_test.dart b/tests/compiler/dart2js_native/native_equals_frog_test.dart
index bc38935..58829c8 100644
--- a/tests/compiler/dart2js_native/native_equals_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_equals_frog_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:expect/expect.dart";
+
 class A native "*A" {}
 makeA() native;
 
diff --git a/tests/compiler/dart2js_native/native_exceptions1_frog_test.dart b/tests/compiler/dart2js_native/native_exceptions1_frog_test.dart
index b2d978b..2d17069 100644
--- a/tests/compiler/dart2js_native/native_exceptions1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_exceptions1_frog_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:expect/expect.dart";
+
 // Test that hidden native exception classes can be marked as existing.
 //
 // To infer which native hidden types exist, we need
diff --git a/tests/compiler/dart2js_native/native_field_name_test.dart b/tests/compiler/dart2js_native/native_field_name_test.dart
index 5d1e7bc..e73df5c 100644
--- a/tests/compiler/dart2js_native/native_field_name_test.dart
+++ b/tests/compiler/dart2js_native/native_field_name_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:expect/expect.dart";
+
 // Check that native fields are not incorrectly renamed.
 
 class A native "*A" {
diff --git a/tests/compiler/dart2js_native/native_field_rename_1_frog_test.dart b/tests/compiler/dart2js_native/native_field_rename_1_frog_test.dart
index 4d70d50..6bd1fc0 100644
--- a/tests/compiler/dart2js_native/native_field_rename_1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_field_rename_1_frog_test.dart
@@ -6,6 +6,7 @@
 // fields.  However, native fields keep their name.  The implication: a getter
 // for the field must be based on the field's name, not the field's jsname.
 
+import "package:expect/expect.dart";
 import 'dart:_js_helper' show JSName;
 
 class A native "*A" {
diff --git a/tests/compiler/dart2js_native/native_field_rename_2_frog_test.dart b/tests/compiler/dart2js_native/native_field_rename_2_frog_test.dart
index 4b27c16..a26dd1c 100644
--- a/tests/compiler/dart2js_native/native_field_rename_2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_field_rename_2_frog_test.dart
@@ -6,6 +6,7 @@
 // fields.  However, native fields keep their name.  The implication: a getter
 // for the field must be based on the field's name, not the field's jsname.
 
+import "package:expect/expect.dart";
 import 'dart:_js_helper' show JSName;
 
 interface I {
diff --git a/tests/compiler/dart2js_native/native_library_same_name_used_frog_test.dart b/tests/compiler/dart2js_native/native_library_same_name_used_frog_test.dart
index 1480dfe..4909259 100644
--- a/tests/compiler/dart2js_native/native_library_same_name_used_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_library_same_name_used_frog_test.dart
@@ -5,6 +5,7 @@
 // Test for correct hidden native class when interface has same name.
 
 library main;
+import "package:expect/expect.dart";
 import 'native_library_same_name_used_lib1.dart';
 
 void setup() native """
diff --git a/tests/compiler/dart2js_native/native_method_inlining_test.dart b/tests/compiler/dart2js_native/native_method_inlining_test.dart
index f9d34e8..b6da43a 100644
--- a/tests/compiler/dart2js_native/native_method_inlining_test.dart
+++ b/tests/compiler/dart2js_native/native_method_inlining_test.dart
@@ -5,6 +5,8 @@
 // Test that native methods with unnamed optional arguments are called with the
 // number of arguments in the call site AND the call site is inlined.
 
+import "package:expect/expect.dart";
+
 class A native "*A" {
   int foo([x, y, z]) native;
 }
diff --git a/tests/compiler/dart2js_native/native_method_rename1_frog_test.dart b/tests/compiler/dart2js_native/native_method_rename1_frog_test.dart
index 93724f4..08df659 100644
--- a/tests/compiler/dart2js_native/native_method_rename1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_method_rename1_frog_test.dart
@@ -4,6 +4,7 @@
 
 // Test the feature where the native string declares the native method's name.
 
+import "package:expect/expect.dart";
 import 'dart:_js_helper' show JSName;
 
 class A native "*A" {
diff --git a/tests/compiler/dart2js_native/native_method_rename2_frog_test.dart b/tests/compiler/dart2js_native/native_method_rename2_frog_test.dart
index c9908b9..b79f91b 100644
--- a/tests/compiler/dart2js_native/native_method_rename2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_method_rename2_frog_test.dart
@@ -4,6 +4,7 @@
 
 // Test the feature where the native string declares the native method's name.
 
+import "package:expect/expect.dart";
 import 'dart:_js_helper' show JSName;
 
 class A native "*A" {
diff --git a/tests/compiler/dart2js_native/native_method_rename3_frog_test.dart b/tests/compiler/dart2js_native/native_method_rename3_frog_test.dart
index 10aa736..28329c4 100644
--- a/tests/compiler/dart2js_native/native_method_rename3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_method_rename3_frog_test.dart
@@ -5,6 +5,7 @@
 // Test the feature where the native string declares the native method's name.
 // #3. The name does not get
 
+import "package:expect/expect.dart";
 import 'dart:_js_helper' show JSName;
 
 class A native "*A" {
diff --git a/tests/compiler/dart2js_native/native_method_with_keyword_name_test.dart b/tests/compiler/dart2js_native/native_method_with_keyword_name_test.dart
index 3e9ac55..b9a8975 100644
--- a/tests/compiler/dart2js_native/native_method_with_keyword_name_test.dart
+++ b/tests/compiler/dart2js_native/native_method_with_keyword_name_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:expect/expect.dart";
+
 // Make sure we can have a native with a name that is a JavaScript keyword.
 
 class A native "*A" {
diff --git a/tests/compiler/dart2js_native/native_missing_method1_frog_test.dart b/tests/compiler/dart2js_native/native_missing_method1_frog_test.dart
index af8e24b..6f58acd 100644
--- a/tests/compiler/dart2js_native/native_missing_method1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_missing_method1_frog_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:expect/expect.dart";
+
 class A native "*A" {
 }
 
diff --git a/tests/compiler/dart2js_native/native_missing_method2_frog_test.dart b/tests/compiler/dart2js_native/native_missing_method2_frog_test.dart
index 89b51dd..fa28fce 100644
--- a/tests/compiler/dart2js_native/native_missing_method2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_missing_method2_frog_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:expect/expect.dart";
+
 class A native "*A" {
 }
 
diff --git a/tests/compiler/dart2js_native/native_mixin_field_test.dart b/tests/compiler/dart2js_native/native_mixin_field_test.dart
index 4cf361e..d17ff62 100644
--- a/tests/compiler/dart2js_native/native_mixin_field_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_field_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:expect/expect.dart";
+
 // Test that native classes can use ordinary Dart classes with fields
 // as mixins.
 
diff --git a/tests/compiler/dart2js_native/native_mixin_multiple_test.dart b/tests/compiler/dart2js_native/native_mixin_multiple_test.dart
index bd917cb..fa38c52 100644
--- a/tests/compiler/dart2js_native/native_mixin_multiple_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_multiple_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:expect/expect.dart";
+
 // Test that native classes can use ordinary Dart classes as mixins.
 
 class A native "*A" {
diff --git a/tests/compiler/dart2js_native/native_mixin_test.dart b/tests/compiler/dart2js_native/native_mixin_test.dart
index 7dfdd5d..ba36b32 100644
--- a/tests/compiler/dart2js_native/native_mixin_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_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:expect/expect.dart";
+
 // Test that native classes can use ordinary Dart classes as mixins.
 
 class A native "*A" {
diff --git a/tests/compiler/dart2js_native/native_mixin_with_plain_test.dart b/tests/compiler/dart2js_native/native_mixin_with_plain_test.dart
new file mode 100644
index 0000000..da38cb4
--- /dev/null
+++ b/tests/compiler/dart2js_native/native_mixin_with_plain_test.dart
@@ -0,0 +1,105 @@
+// 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";
+
+// Test that native classes and ordinary Dart classes can both use the same
+// ordinary Dart classes as a mixin.
+
+class A native "*A" {
+  final String aa;
+  foo() => "A-foo $aa";
+  baz() => "A-baz $aa";
+}
+
+class B extends A with M native "*B" {
+  bar() => 'B-bar -> ${baz()}';
+  get mm => 'B.mm($aa)';
+}
+
+class M {
+  foo() => "M-foo ${this.mm}";
+  bar() => "M-bar ${this.mm}";
+  get mm => 'M.mm';
+}
+
+class C {
+  final String cc = 'cc';
+  foo() => 'C-foo $cc';
+  baz() => 'C-baz $cc';
+}
+
+class D extends C with M {
+  bar() => 'D-bar -> ${baz()}';
+  get mm => 'D.mm($cc)';
+}
+
+
+makeA() native;
+makeB() native;
+
+void setup() native """
+function A() {this.aa = 'aa'}
+function B() {this.aa = 'bb'}
+makeA = function(){return new A;};
+makeB = function(){return new B;};
+""";
+
+main() {
+  setup();
+  var things = [makeA, makeB, () => new C(), () => new D(), () => new M()]
+      .map((f)=>f())
+      .toList();
+  var a = things[0];
+  var b = things[1];
+  var c = things[2];
+  var d = things[3];
+  var m = things[4];
+
+  Expect.equals("M-foo M.mm", m.foo());
+  Expect.equals("M-bar M.mm", m.bar());
+  Expect.throws(() => m.baz(), (error) => error is NoSuchMethodError);
+  Expect.isFalse(m is A);
+  Expect.isFalse(m is B);
+  Expect.isFalse(m is C);
+  Expect.isFalse(m is D);
+  Expect.isTrue(m is M);
+
+  Expect.equals("A-foo aa", a.foo());
+  Expect.throws(() => a.bar(), (error) => error is NoSuchMethodError);
+  Expect.equals("A-baz aa", a.baz());
+  Expect.isTrue(a is A);
+  Expect.isFalse(a is B);
+  Expect.isFalse(a is C);
+  Expect.isFalse(a is D);
+  Expect.isFalse(a is M);
+
+  Expect.equals("M-foo B.mm(bb)", b.foo());
+  Expect.equals("B-bar -> A-baz bb", b.bar());
+  Expect.equals("A-baz bb", b.baz());
+  Expect.isTrue(b is A);
+  Expect.isTrue(b is B);
+  Expect.isFalse(b is C);
+  Expect.isFalse(b is D);
+  Expect.isTrue(b is M);
+
+  Expect.equals("C-foo cc", c.foo());
+  Expect.throws(() => c.bar(), (error) => error is NoSuchMethodError);
+  Expect.equals("C-baz cc", c.baz());
+  Expect.isFalse(c is A);
+  Expect.isFalse(c is B);
+  Expect.isTrue(c is C);
+  Expect.isFalse(c is D);
+  Expect.isFalse(c is M);
+
+  Expect.equals("M-foo D.mm(cc)", d.foo());
+  Expect.equals("D-bar -> C-baz cc", d.bar());
+  Expect.equals("C-baz cc", d.baz());
+  Expect.isFalse(d is A);
+  Expect.isFalse(d is B);
+  Expect.isTrue(d is C);
+  Expect.isTrue(d is D);
+  Expect.isTrue(d is M);
+
+}
diff --git a/tests/compiler/dart2js_native/native_named_constructors2_frog_test.dart b/tests/compiler/dart2js_native/native_named_constructors2_frog_test.dart
index 964b5c7..f3926d5 100644
--- a/tests/compiler/dart2js_native/native_named_constructors2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_named_constructors2_frog_test.dart
@@ -2,7 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// Native class wwith named constructors and static methods.
+import "package:expect/expect.dart";
+
+// Native class with named constructors and static methods.
+
 
 
 class A native "*A" {
diff --git a/tests/compiler/dart2js_native/native_named_constructors3_frog_test.dart b/tests/compiler/dart2js_native/native_named_constructors3_frog_test.dart
index 8148db3..1312f60 100644
--- a/tests/compiler/dart2js_native/native_named_constructors3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_named_constructors3_frog_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:expect/expect.dart";
+
 // Hidden native class with factory constructors and NO static methods.
 // Regression test.
 
diff --git a/tests/compiler/dart2js_native/native_no_such_method_exception2_frog_test.dart b/tests/compiler/dart2js_native/native_no_such_method_exception2_frog_test.dart
index 439efb7..9b980fd 100644
--- a/tests/compiler/dart2js_native/native_no_such_method_exception2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_no_such_method_exception2_frog_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:expect/expect.dart";
+
 class A native "*A" {
 }
 
diff --git a/tests/compiler/dart2js_native/native_no_such_method_exception3_frog_test.dart b/tests/compiler/dart2js_native/native_no_such_method_exception3_frog_test.dart
index bdae2c8..1ea9de0 100644
--- a/tests/compiler/dart2js_native/native_no_such_method_exception3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_no_such_method_exception3_frog_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:expect/expect.dart";
+
 class GetName {
   foo(x, y, [z]) => "foo";
 }
diff --git a/tests/compiler/dart2js_native/native_no_such_method_exception4_frog_test.dart b/tests/compiler/dart2js_native/native_no_such_method_exception4_frog_test.dart
index e9621bb..aff196e 100644
--- a/tests/compiler/dart2js_native/native_no_such_method_exception4_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_no_such_method_exception4_frog_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:expect/expect.dart";
+
 class GetName {
   foo(x, y) => "foo";
   baz(x, y, z) => "baz";
diff --git a/tests/compiler/dart2js_native/native_no_such_method_exception5_frog_test.dart b/tests/compiler/dart2js_native/native_no_such_method_exception5_frog_test.dart
index 2a44809..26fe5c8 100644
--- a/tests/compiler/dart2js_native/native_no_such_method_exception5_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_no_such_method_exception5_frog_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:expect/expect.dart";
+
 class GetName {
   foo(x, [y]) => "foo";
   baz(x, y, z) => "baz";
diff --git a/tests/compiler/dart2js_native/native_no_such_method_exception_frog_test.dart b/tests/compiler/dart2js_native/native_no_such_method_exception_frog_test.dart
index f9be7de..952a4ac 100644
--- a/tests/compiler/dart2js_native/native_no_such_method_exception_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_no_such_method_exception_frog_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:expect/expect.dart";
+
 class A native "*A" {
   bar() => 42;
 }
diff --git a/tests/compiler/dart2js_native/native_novel_html_test.dart b/tests/compiler/dart2js_native/native_novel_html_test.dart
index 485d2f6..5a29c8f 100644
--- a/tests/compiler/dart2js_native/native_novel_html_test.dart
+++ b/tests/compiler/dart2js_native/native_novel_html_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:expect/expect.dart";
+
 // Test to see if novel HTML tags are interpreted as HTMLElement.
 
 class Element native "*HTMLElement" {
diff --git a/tests/compiler/dart2js_native/native_null_closure_frog_test.dart b/tests/compiler/dart2js_native/native_null_closure_frog_test.dart
index 53ac384..fbd5d0d 100644
--- a/tests/compiler/dart2js_native/native_null_closure_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_null_closure_frog_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:expect/expect.dart";
+
 typedef void MyFunctionType();
 
 class A native "*A" {
diff --git a/tests/compiler/dart2js_native/native_null_frog_test.dart b/tests/compiler/dart2js_native/native_null_frog_test.dart
index 71066b6..8dde95e 100644
--- a/tests/compiler/dart2js_native/native_null_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_null_frog_test.dart
@@ -2,8 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import "package:expect/expect.dart";
+
 // Test for values of some basic types.
 
+
 class A native "*A" {
   returnNull() native;
   returnUndefined() native;
diff --git a/tests/compiler/dart2js_native/native_property_frog_test.dart b/tests/compiler/dart2js_native/native_property_frog_test.dart
index cf076b3..e3a647a 100644
--- a/tests/compiler/dart2js_native/native_property_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_property_frog_test.dart
@@ -4,6 +4,7 @@
 
 // Properties on hidden native classes.
 
+import "package:expect/expect.dart";
 import 'dart:_foreign_helper' show JS;
 
 class A native "*A" {
diff --git a/tests/compiler/dart2js_native/native_to_string_frog_test.dart b/tests/compiler/dart2js_native/native_to_string_frog_test.dart
index a21ff2e..1931ed6 100644
--- a/tests/compiler/dart2js_native/native_to_string_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_to_string_frog_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:expect/expect.dart";
+
 class A native "*A" {}
 makeA() native;
 
diff --git a/tests/compiler/dart2js_native/native_use_native_name_in_table_frog_test.dart b/tests/compiler/dart2js_native/native_use_native_name_in_table_frog_test.dart
index d3a81bd..e24cef3 100644
--- a/tests/compiler/dart2js_native/native_use_native_name_in_table_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_use_native_name_in_table_frog_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:expect/expect.dart";
+
 // Test that we put native names and not Dart names into the dynamic
 // dispatch table.
 
diff --git a/tests/compiler/dart2js_native/native_window1_frog_test.dart b/tests/compiler/dart2js_native/native_window1_frog_test.dart
index e2cdf6e..553f924 100644
--- a/tests/compiler/dart2js_native/native_window1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_window1_frog_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:expect/expect.dart";
+
 interface Window {
   final int document;
 }
diff --git a/tests/compiler/dart2js_native/native_window2_frog_test.dart b/tests/compiler/dart2js_native/native_window2_frog_test.dart
index bf0d6f0..a58450c 100644
--- a/tests/compiler/dart2js_native/native_window2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_window2_frog_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:expect/expect.dart";
+
 interface Window {
   final int document;
 }
diff --git a/tests/compiler/dart2js_native/native_wrapping_function3_frog_test.dart b/tests/compiler/dart2js_native/native_wrapping_function3_frog_test.dart
index 335dc01..5350048 100644
--- a/tests/compiler/dart2js_native/native_wrapping_function3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_wrapping_function3_frog_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:expect/expect.dart";
+
 typedef void Callback0();
 typedef void Callback1(arg1);
 typedef void Callback2(arg1, arg2);
diff --git a/tests/compiler/dart2js_native/native_wrapping_function_frog_test.dart b/tests/compiler/dart2js_native/native_wrapping_function_frog_test.dart
index 0495a5a..b89d515 100644
--- a/tests/compiler/dart2js_native/native_wrapping_function_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_wrapping_function_frog_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:expect/expect.dart";
+
 typedef void Callback0();
 typedef void Callback1(arg1);
 typedef void Callback2(arg1, arg2);
diff --git a/tests/compiler/dart2js_native/undefined_bailout_test.dart b/tests/compiler/dart2js_native/undefined_bailout_test.dart
index d55fe7d..8819be1 100644
--- a/tests/compiler/dart2js_native/undefined_bailout_test.dart
+++ b/tests/compiler/dart2js_native/undefined_bailout_test.dart
@@ -18,6 +18,7 @@
 // comparison does not work for undefined, which the DOM sometimes
 // returns.
 
+import "package:expect/expect.dart";
 import 'dart:_foreign_helper' show JS;
 
 var a = 42;
diff --git a/tests/corelib/apply2_test.dart b/tests/corelib/apply2_test.dart
index 71c1488..e733a24 100644
--- a/tests/corelib/apply2_test.dart
+++ b/tests/corelib/apply2_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:expect/expect.dart";
+
 apply(Function function, ArgumentDescriptor args) {
   return Function.apply(
       function, args.positionalArguments, args.namedArguments);
diff --git a/tests/corelib/apply_test.dart b/tests/corelib/apply_test.dart
index 060d432..71e87b9 100644
--- a/tests/corelib/apply_test.dart
+++ b/tests/corelib/apply_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:expect/expect.dart";
+
 // Testing Function.apply calls correctly.
 // This test is not testing error handling, only that correct parameters
 // cause a correct call.
diff --git a/tests/corelib/big_integer_vm_test.dart b/tests/corelib/big_integer_vm_test.dart
index 02ee00a..12be55e 100644
--- a/tests/corelib/big_integer_vm_test.dart
+++ b/tests/corelib/big_integer_vm_test.dart
@@ -5,6 +5,7 @@
 // TODO(srdjan): Make sure the numbers are Bigint and not Mint or Smi.
 
 library big_integer_test;
+import "package:expect/expect.dart";
 
 class BigIntegerTest {
 
diff --git a/tests/corelib/bool_hashcode_test.dart b/tests/corelib/bool_hashcode_test.dart
index 63dbcb5..d33b14a 100644
--- a/tests/corelib/bool_hashcode_test.dart
+++ b/tests/corelib/bool_hashcode_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:expect/expect.dart";
+
 class BoolHashCodeTest {
   static testMain() {
     Expect.notEquals(true.hashCode, false.hashCode);
diff --git a/tests/corelib/collection_from_test.dart b/tests/corelib/collection_from_test.dart
index 75dbe71..2766887 100644
--- a/tests/corelib/collection_from_test.dart
+++ b/tests/corelib/collection_from_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library collection.from.test;
+import "package:expect/expect.dart";
 import 'dart:collection' show Queue;
 
 class CollectionFromTest {
@@ -20,7 +21,7 @@
   }
 
 
-  static check(Collection initial, Collection other) {
+  static check(Iterable initial, Iterable other) {
     Expect.equals(3, initial.length);
     Expect.equals(initial.length, other.length);
 
diff --git a/tests/corelib/collection_length_test.dart b/tests/corelib/collection_length_test.dart
index 487884a..01a8061 100644
--- a/tests/corelib/collection_length_test.dart
+++ b/tests/corelib/collection_length_test.dart
@@ -33,7 +33,7 @@
   testLength(map.values, n);
 }
 
-void testCollection(Collection collection, n) {
+void testCollection(var collection, n) {
   for (int i = 0; i < n; i++) {
     collection.add(i);
   }
diff --git a/tests/corelib/collection_removes_test.dart b/tests/corelib/collection_removes_test.dart
index 7d04483..47e143d 100644
--- a/tests/corelib/collection_removes_test.dart
+++ b/tests/corelib/collection_removes_test.dart
@@ -2,7 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-testRemove(Collection base) {
+import 'dart:collection';
+import "package:expect/expect.dart";
+
+testRemove(base) {
   int length = base.length;
   for (int i = 0; i < length; i++) {
     Expect.isFalse(base.isEmpty);
@@ -11,7 +14,7 @@
   Expect.isTrue(base.isEmpty);
 }
 
-testRemoveAll(Collection base, Iterable removes) {
+testRemoveAll(base, Iterable removes) {
   Set retained = new Set();
   for (var element in base) {
     if (!removes.contains(element)) {
@@ -28,7 +31,7 @@
   }
 }
 
-testRetainAll(Collection base, Iterable retains) {
+testRetainAll(base, Iterable retains) {
   Set retained = new Set();
   for (var element in base) {
     if (retains.contains(element)) {
@@ -45,7 +48,7 @@
   }
 }
 
-testRemoveWhere(Collection base, bool test(value)) {
+testRemoveWhere(base, bool test(value)) {
   Set retained = new Set();
   for (var element in base) {
     if (!test(element)) {
@@ -62,7 +65,7 @@
   }
 }
 
-testRetainWhere(Collection base, bool test(value)) {
+testRetainWhere(base, bool test(value)) {
   Set retained = new Set();
   for (var element in base) {
     if (test(element)) {
@@ -90,13 +93,9 @@
       testRemove(base.toSet());
 
       var deltaSet = delta.toSet();
-      testRemoveAll(base.toList(), delta);
-      testRemoveAll(base.toList(), deltaSet);
-      testRetainAll(base.toList(), delta);
-      testRetainAll(base.toList(), deltaSet);
       testRemoveWhere(base.toList(), deltaSet.contains);
       testRetainWhere(base.toList(),
-                         (e) => !deltaSet.contains(e));
+                      (e) => !deltaSet.contains(e));
 
       testRemoveAll(base.toSet(), delta);
       testRemoveAll(base.toSet(), deltaSet);
@@ -104,7 +103,21 @@
       testRetainAll(base.toSet(), deltaSet);
       testRemoveWhere(base.toSet(), deltaSet.contains);
       testRetainWhere(base.toSet(), (e) => !deltaSet.contains(e));
+
+      // Test the ListBase class's List implementation.
+      testRemoveWhere(new MyList(base.toList()), deltaSet.contains);
+      testRetainWhere(new MyList(base.toList()),
+                      (e) => !deltaSet.contains(e));
+
     }
   }
 }
 
+class MyList<E> extends ListBase<E> {
+  List<E> _source;
+  MyList(this._source);
+  int get length => _source.length;
+  void set length(int length) { _source.length = length; }
+  E operator[](int index) => _source[index];
+  void operator[]=(int index, E value) { _source[index] = value; }
+}
diff --git a/tests/corelib/collection_test.dart b/tests/corelib/collection_test.dart
index 86f1114..680e20a 100644
--- a/tests/corelib/collection_test.dart
+++ b/tests/corelib/collection_test.dart
@@ -4,16 +4,17 @@
 
 library collection_test;
 
+import "package:expect/expect.dart";
 import 'dart:collection' show Queue;
 
 class CollectionTest {
-  CollectionTest(Collection collection) {
-    testFold(collection);
+  CollectionTest(Iterable iterable) {
+    testFold(iterable);
   }
 
-  void testFold(Collection collection) {
-    Expect.equals(28, collection.fold(0, (prev, element) => prev + element));
-    Expect.equals(3024, collection.fold(1, (prev, element) => prev * element));
+  void testFold(Iterable iterable) {
+    Expect.equals(28, iterable.fold(0, (prev, element) => prev + element));
+    Expect.equals(3024, iterable.fold(1, (prev, element) => prev * element));
   }
 }
 
diff --git a/tests/corelib/collection_to_string_test.dart b/tests/corelib/collection_to_string_test.dart
index cbac852..35fd8f3 100644
--- a/tests/corelib/collection_to_string_test.dart
+++ b/tests/corelib/collection_to_string_test.dart
@@ -8,6 +8,7 @@
 
 library collection_to_string;
 
+import "package:expect/expect.dart";
 import 'dart:collection' show Queue, LinkedHashMap;
 import 'dart:math' as Math;
 
@@ -206,8 +207,8 @@
  * and will not contain a collection with ill-defined iteration order
  * (i.e., a HashSet or HashMap).
  */
-Collection populateRandomCollection(int size, bool exact,
-    StringBuffer stringRep, List beingMade, Collection coll) {
+populateRandomCollection(int size, bool exact,
+    StringBuffer stringRep, List beingMade, var coll) {
   beingMade.add(coll);
   stringRep.write(coll is List ? '[' : '{');
 
diff --git a/tests/corelib/compare_to2_test.dart b/tests/corelib/compare_to2_test.dart
index 3d1353c..9946b3f 100644
--- a/tests/corelib/compare_to2_test.dart
+++ b/tests/corelib/compare_to2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for testing Math.min and Math.max.
 
+import "package:expect/expect.dart";
+
 negate(x) => -x;
 
 main() {
diff --git a/tests/corelib/compare_to_test.dart b/tests/corelib/compare_to_test.dart
index 9c10cf6..35d8f63 100644
--- a/tests/corelib/compare_to_test.dart
+++ b/tests/corelib/compare_to_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for testing Math.min and Math.max.
 
+import "package:expect/expect.dart";
+
 negate(x) => -x;
 
 main() {
diff --git a/tests/corelib/const_list_literal_test.dart b/tests/corelib/const_list_literal_test.dart
index 31e859e..918503d 100644
--- a/tests/corelib/const_list_literal_test.dart
+++ b/tests/corelib/const_list_literal_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:expect/expect.dart";
+
 // Test that a final list literal is not expandable nor modifiable.
 
 class ConstListLiteralTest {
diff --git a/tests/corelib/const_list_remove_range_test.dart b/tests/corelib/const_list_remove_range_test.dart
index db38336..cff8a47 100644
--- a/tests/corelib/const_list_remove_range_test.dart
+++ b/tests/corelib/const_list_remove_range_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:expect/expect.dart";
+
 main() {
   testImmutable(const []);
   testImmutable(const [1]);
diff --git a/tests/corelib/const_list_set_range_test.dart b/tests/corelib/const_list_set_range_test.dart
index 08062c6..5523844 100644
--- a/tests/corelib/const_list_set_range_test.dart
+++ b/tests/corelib/const_list_set_range_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:expect/expect.dart";
+
 main() {
   testImmutable(const []);
   testImmutable(const [1]);
diff --git a/tests/corelib/core_runtime_types_test.dart b/tests/corelib/core_runtime_types_test.dart
index 4c06009..a86b800 100644
--- a/tests/corelib/core_runtime_types_test.dart
+++ b/tests/corelib/core_runtime_types_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:expect/expect.dart";
+
 /**
  * A test of simple runtime behavior on numbers, strings and lists with
  * a focus on both correct behavior and runtime errors.
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 9bc31d7..f83568c 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -9,6 +9,11 @@
 *dartc_test: Skip
 compare_to2_test: Fail    # Bug 4018
 
+symbol_test/01: Fail
+symbol_test/02: Fail
+symbol_test/03: Fail
+
+
 [ $runtime == ff || $runtime == ie9 || $runtime == jsshell ]
 unicode_test: Fail
 
@@ -49,6 +54,15 @@
 
 string_replace_func_test: Skip # Bug 6554 - doesn't terminate.
 
+symbol_test/none: Fail
+symbol_test/02: Fail
+symbol_test/03: Fail
+
+
+[ $compiler == dart2js && $unchecked ]
+symbol_test/01: Fail # This passes for the wrong reason in checked mode.
+
+
 [ $compiler == dart2js && $runtime == none ]
 *: Fail, Pass # TODO(ahe): Triage these tests.
 
@@ -61,6 +75,11 @@
 compare_to2_test: Fail # inherited from VM
 unicode_test: Fail # inherited from VM
 
+symbol_test/01: Fail
+symbol_test/02: Fail
+symbol_test/03: Fail
+
+
 # Library changes
 [ $compiler == none || $compiler == dart2js || $compiler == dart2dart ]
 map_keys2_test: Fail # Generic types aren't right.
@@ -74,6 +93,12 @@
 iterable_to_list_test: Fail
 iterable_to_set_test: Fail
 
+[ $compiler == dartc || $compiler == dartanalyzer ]
+symbol_test/01: Fail
+symbol_test/02: Fail
+symbol_test/03: Fail
+
+
 [ $arch == arm ]
 *: Skip
 
diff --git a/tests/corelib/date_time2_test.dart b/tests/corelib/date_time2_test.dart
index f179e4d..6a0bb87 100644
--- a/tests/corelib/date_time2_test.dart
+++ b/tests/corelib/date_time2_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:expect/expect.dart";
+
 // Dart test program for DateTime's hashCode.
 
 main() {
diff --git a/tests/corelib/date_time3_test.dart b/tests/corelib/date_time3_test.dart
index c61363f..557eede 100644
--- a/tests/corelib/date_time3_test.dart
+++ b/tests/corelib/date_time3_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:expect/expect.dart";
+
 // At some point dart was emitting a bad padding 0 for Dates where the ms were
 // ending with 10.
 
diff --git a/tests/corelib/date_time4_test.dart b/tests/corelib/date_time4_test.dart
index d536037..7e936ff 100644
--- a/tests/corelib/date_time4_test.dart
+++ b/tests/corelib/date_time4_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:expect/expect.dart";
+
 // Test fromString with 6 digits after the decimal point.
 
 main() {
diff --git a/tests/corelib/date_time5_test.dart b/tests/corelib/date_time5_test.dart
index 10448e9..abf893d 100644
--- a/tests/corelib/date_time5_test.dart
+++ b/tests/corelib/date_time5_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:expect/expect.dart";
+
 // Test DateTime constructor with optional arguments.
 
 main() {
diff --git a/tests/corelib/date_time6_test.dart b/tests/corelib/date_time6_test.dart
index 0b6418c..c065705 100644
--- a/tests/corelib/date_time6_test.dart
+++ b/tests/corelib/date_time6_test.dart
@@ -2,28 +2,30 @@
 // for 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";
+
 // Test DateTime comparison operators.
 
 main() {
   var d = new DateTime.fromMillisecondsSinceEpoch(0, isUtc: true);
   var d2 = new DateTime.fromMillisecondsSinceEpoch(1, isUtc: true);
-  Expect.isTrue(d < d2);
-  Expect.isTrue(d <= d2);
-  Expect.isTrue(d2 > d);
-  Expect.isTrue(d2 >= d);
-  Expect.isFalse(d2 < d);
-  Expect.isFalse(d2 <= d);
-  Expect.isFalse(d > d2);
-  Expect.isFalse(d >= d2);
+  Expect.isTrue(d.isBefore(d2));
+  Expect.isTrue(!d.isAfter(d2));
+  Expect.isTrue(d2.isAfter(d));
+  Expect.isTrue(!d2.isBefore(d));
+  Expect.isFalse(d2.isBefore(d));
+  Expect.isFalse(!d2.isAfter(d));
+  Expect.isFalse(d.isAfter(d2));
+  Expect.isFalse(!d.isBefore(d2));
 
   d = new DateTime.fromMillisecondsSinceEpoch(-1, isUtc: true);
   d2 = new DateTime.fromMillisecondsSinceEpoch(0, isUtc: true);
-  Expect.isTrue(d < d2);
-  Expect.isTrue(d <= d2);
-  Expect.isTrue(d2 > d);
-  Expect.isTrue(d2 >= d);
-  Expect.isFalse(d2 < d);
-  Expect.isFalse(d2 <= d);
-  Expect.isFalse(d > d2);
-  Expect.isFalse(d >= d2);
+  Expect.isTrue(d.isBefore(d2));
+  Expect.isTrue(!d.isAfter(d2));
+  Expect.isTrue(d2.isAfter(d));
+  Expect.isTrue(!d2.isBefore(d));
+  Expect.isFalse(d2.isBefore(d));
+  Expect.isFalse(!d2.isAfter(d));
+  Expect.isFalse(d.isAfter(d2));
+  Expect.isFalse(!d.isBefore(d2));
 }
diff --git a/tests/corelib/date_time7_test.dart b/tests/corelib/date_time7_test.dart
index 1be867d..b14eb7d 100644
--- a/tests/corelib/date_time7_test.dart
+++ b/tests/corelib/date_time7_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:expect/expect.dart";
+
 // Test DateTime timeZoneName and timeZoneOffset getters.
 
 testUtc() {
diff --git a/tests/corelib/date_time8_test.dart b/tests/corelib/date_time8_test.dart
index 2e9ac98..85d573f 100644
--- a/tests/corelib/date_time8_test.dart
+++ b/tests/corelib/date_time8_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:expect/expect.dart";
+
 // Make sure the year 0 is correctly printed.
 
 testUtc() {
diff --git a/tests/corelib/date_time_parse_test.dart b/tests/corelib/date_time_parse_test.dart
index 0df517a..9f0ad76 100644
--- a/tests/corelib/date_time_parse_test.dart
+++ b/tests/corelib/date_time_parse_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:expect/expect.dart";
+
 check(DateTime expected, String str) {
   DateTime actual = DateTime.parse(str);
   Expect.equals(expected, actual);  // Only checks if they are at the same time.
diff --git a/tests/corelib/date_time_test.dart b/tests/corelib/date_time_test.dart
index 6150065..805d5c6 100644
--- a/tests/corelib/date_time_test.dart
+++ b/tests/corelib/date_time_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:expect/expect.dart";
+
 // Dart test program for DateTime.
 
 class DateTest {
@@ -780,32 +782,32 @@
   static void testWeekday() {
     // 2011-10-06 is Summertime.
     var d = new DateTime(2011, 10, 6, 0, 45, 37, 0);
-    Expect.equals(DateTime.THU, d.weekday);
+    Expect.equals(DateTime.THURSDAY, d.weekday);
     d = new DateTime.utc(2011, 10, 6, 0, 45, 37, 0);
-    Expect.equals(DateTime.THU, d.weekday);
+    Expect.equals(DateTime.THURSDAY, d.weekday);
     d = new DateTime(2011, 10, 5, 23, 45, 37, 0);
-    Expect.equals(DateTime.WED, d.weekday);
+    Expect.equals(DateTime.WEDNESDAY, d.weekday);
     d = new DateTime.utc(2011, 10, 5, 23, 45, 37, 0);
-    Expect.equals(DateTime.WED, d.weekday);
+    Expect.equals(DateTime.WEDNESDAY, d.weekday);
     // 1970-01-01 is Wintertime.
     d = new DateTime(1970, 1, 1, 0, 0, 0, 1);
-    Expect.equals(DateTime.THU, d.weekday);
+    Expect.equals(DateTime.THURSDAY, d.weekday);
     d = new DateTime.utc(1970, 1, 1, 0, 0, 0, 1);
-    Expect.equals(DateTime.THU, d.weekday);
+    Expect.equals(DateTime.THURSDAY, d.weekday);
     d = new DateTime.utc(1969, 12, 31, 23, 59, 59, 999);
-    Expect.equals(DateTime.WED, d.weekday);
+    Expect.equals(DateTime.WEDNESDAY, d.weekday);
     d = new DateTime(1969, 12, 31, 23, 59, 59, 999);
-    Expect.equals(DateTime.WED, d.weekday);
+    Expect.equals(DateTime.WEDNESDAY, d.weekday);
     d = new DateTime(2011, 10, 4, 23, 45, 37, 0);
-    Expect.equals(DateTime.TUE, d.weekday);
+    Expect.equals(DateTime.TUESDAY, d.weekday);
     d = new DateTime(2011, 10, 3, 23, 45, 37, 0);
-    Expect.equals(DateTime.MON, d.weekday);
+    Expect.equals(DateTime.MONDAY, d.weekday);
     d = new DateTime(2011, 10, 2, 23, 45, 37, 0);
-    Expect.equals(DateTime.SUN, d.weekday);
+    Expect.equals(DateTime.SUNDAY, d.weekday);
     d = new DateTime(2011, 10, 1, 23, 45, 37, 0);
-    Expect.equals(DateTime.SAT, d.weekday);
+    Expect.equals(DateTime.SATURDAY, d.weekday);
     d = new DateTime(2011, 9, 30, 23, 45, 37, 0);
-    Expect.equals(DateTime.FRI, d.weekday);
+    Expect.equals(DateTime.FRIDAY, d.weekday);
   }
 
   static void testMain() {
diff --git a/tests/corelib/double_ceil2_test.dart b/tests/corelib/double_ceil2_test.dart
index 12d4412..eab3dca 100644
--- a/tests/corelib/double_ceil2_test.dart
+++ b/tests/corelib/double_ceil2_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:expect/expect.dart';
+
 main() {
   Expect.throws(() => double.INFINITY.ceil(), (e) => e is UnsupportedError);
   Expect.throws(() => double.NEGATIVE_INFINITY.ceil(),
diff --git a/tests/corelib/double_ceil_test.dart b/tests/corelib/double_ceil_test.dart
index cb52287..66e83c2 100644
--- a/tests/corelib/double_ceil_test.dart
+++ b/tests/corelib/double_ceil_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:expect/expect.dart';
+
 main() {
   Expect.equals(0, 0.0.ceil());
   Expect.equals(1, double.MIN_POSITIVE.ceil());
diff --git a/tests/corelib/double_ceil_to_double_test.dart b/tests/corelib/double_ceil_to_double_test.dart
index 40b2c7d..7400464 100644
--- a/tests/corelib/double_ceil_to_double_test.dart
+++ b/tests/corelib/double_ceil_to_double_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:expect/expect.dart';
+
 main() {
   Expect.equals(0.0, 0.0.ceilToDouble());
   Expect.equals(1.0, double.MIN_POSITIVE.ceilToDouble());
diff --git a/tests/corelib/double_compare_test.dart b/tests/corelib/double_compare_test.dart
index 32d50ae..287baac 100644
--- a/tests/corelib/double_compare_test.dart
+++ b/tests/corelib/double_compare_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:expect/expect.dart";
+
 // Dart test program for testing 'compare' on doubles.
 
 void main() {
diff --git a/tests/corelib/double_floor2_test.dart b/tests/corelib/double_floor2_test.dart
index b17a375..417d465 100644
--- a/tests/corelib/double_floor2_test.dart
+++ b/tests/corelib/double_floor2_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:expect/expect.dart';
+
 main() {
   Expect.throws(() => double.INFINITY.floor(), (e) => e is UnsupportedError);
   Expect.throws(() => double.NEGATIVE_INFINITY.floor(),
diff --git a/tests/corelib/double_floor_test.dart b/tests/corelib/double_floor_test.dart
index cafc159..c59f411 100644
--- a/tests/corelib/double_floor_test.dart
+++ b/tests/corelib/double_floor_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:expect/expect.dart';
+
 main() {
   Expect.equals(0, 0.0.floor());
   Expect.equals(0, double.MIN_POSITIVE.floor());
diff --git a/tests/corelib/double_floor_to_double_test.dart b/tests/corelib/double_floor_to_double_test.dart
index cfcc908..e87f6e2 100644
--- a/tests/corelib/double_floor_to_double_test.dart
+++ b/tests/corelib/double_floor_to_double_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:expect/expect.dart';
+
 main() {
   Expect.equals(0.0, 0.0.floorToDouble());
   Expect.equals(0.0, double.MIN_POSITIVE.floorToDouble());
diff --git a/tests/corelib/double_round2_test.dart b/tests/corelib/double_round2_test.dart
index 09978ab..2135191 100644
--- a/tests/corelib/double_round2_test.dart
+++ b/tests/corelib/double_round2_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:expect/expect.dart';
+
 main() {
   Expect.throws(() => double.INFINITY.round(), (e) => e is UnsupportedError);
   Expect.throws(() => double.NEGATIVE_INFINITY.round(),
diff --git a/tests/corelib/double_round3_test.dart b/tests/corelib/double_round3_test.dart
index cd1b0a6..5564640 100644
--- a/tests/corelib/double_round3_test.dart
+++ b/tests/corelib/double_round3_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:expect/expect.dart';
+
 main() {
   Expect.equals(0, 0.49999999999999994.round());
   Expect.equals(0, (-0.49999999999999994).round());
diff --git a/tests/corelib/double_round4_test.dart b/tests/corelib/double_round4_test.dart
index ab546ae..4818bae 100644
--- a/tests/corelib/double_round4_test.dart
+++ b/tests/corelib/double_round4_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:expect/expect.dart';
+
 main() {
   // The following numbers are on the border of 52 bits.
   // For example: 4503599627370499 + 0.5 => 4503599627370500.
diff --git a/tests/corelib/double_round_test.dart b/tests/corelib/double_round_test.dart
index b63887c..ae7fe94 100644
--- a/tests/corelib/double_round_test.dart
+++ b/tests/corelib/double_round_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:expect/expect.dart';
+
 main() {
   Expect.equals(0, 0.0.round());
   Expect.equals(0, double.MIN_POSITIVE.round());
diff --git a/tests/corelib/double_round_to_double2_test.dart b/tests/corelib/double_round_to_double2_test.dart
index 9d5d11e..e2ed44a 100644
--- a/tests/corelib/double_round_to_double2_test.dart
+++ b/tests/corelib/double_round_to_double2_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:expect/expect.dart';
+
 main() {
   Expect.equals(0.0, 0.49999999999999994.roundToDouble());
   Expect.equals(0.0, (-0.49999999999999994).roundToDouble());
diff --git a/tests/corelib/double_round_to_double3_test.dart b/tests/corelib/double_round_to_double3_test.dart
index 6183ed0..660c7b6 100644
--- a/tests/corelib/double_round_to_double3_test.dart
+++ b/tests/corelib/double_round_to_double3_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:expect/expect.dart';
+
 main() {
   // The following numbers are on the border of 52 bits.
   // For example: 4503599627370499 + 0.5 => 4503599627370500.
diff --git a/tests/corelib/double_round_to_double_test.dart b/tests/corelib/double_round_to_double_test.dart
index a678248..bedfe18 100644
--- a/tests/corelib/double_round_to_double_test.dart
+++ b/tests/corelib/double_round_to_double_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:expect/expect.dart';
+
 main() {
   Expect.equals(0.0, 0.0.roundToDouble());
   Expect.equals(0.0, double.MIN_POSITIVE.roundToDouble());
diff --git a/tests/corelib/double_truncate2_test.dart b/tests/corelib/double_truncate2_test.dart
index 08355b4..675980a 100644
--- a/tests/corelib/double_truncate2_test.dart
+++ b/tests/corelib/double_truncate2_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:expect/expect.dart';
+
 main() {
   Expect.throws(() => double.INFINITY.truncate(), (e) => e is UnsupportedError);
   Expect.throws(() => double.NEGATIVE_INFINITY.truncate(),
diff --git a/tests/corelib/double_truncate_test.dart b/tests/corelib/double_truncate_test.dart
index 8a27ff5..f4f0e79 100644
--- a/tests/corelib/double_truncate_test.dart
+++ b/tests/corelib/double_truncate_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:expect/expect.dart';
+
 main() {
   Expect.equals(0, 0.0.truncate());
   Expect.equals(0, double.MIN_POSITIVE.truncate());
diff --git a/tests/corelib/double_truncate_to_double_test.dart b/tests/corelib/double_truncate_to_double_test.dart
index 5689aba..34f0179 100644
--- a/tests/corelib/double_truncate_to_double_test.dart
+++ b/tests/corelib/double_truncate_to_double_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:expect/expect.dart';
+
 main() {
   Expect.equals(0.0, 0.0.truncateToDouble());
   Expect.equals(0.0, double.MIN_POSITIVE.truncateToDouble());
diff --git a/tests/corelib/duration_test.dart b/tests/corelib/duration_test.dart
index 51d65c3..6111615 100644
--- a/tests/corelib/duration_test.dart
+++ b/tests/corelib/duration_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:expect/expect.dart";
+
 main() {
   Duration d;
   d = new Duration(days: 1);
diff --git a/tests/corelib/exception_implementation_test.dart b/tests/corelib/exception_implementation_test.dart
index d30a392..5df26a7 100644
--- a/tests/corelib/exception_implementation_test.dart
+++ b/tests/corelib/exception_implementation_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library exception_implementation_test;
+import "package:expect/expect.dart";
 
 main() {
   final msg = 1;
diff --git a/tests/corelib/expando_test.dart b/tests/corelib/expando_test.dart
index c6b65d8..3bff957 100644
--- a/tests/corelib/expando_test.dart
+++ b/tests/corelib/expando_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:expect/expect.dart";
+
 class ExpandoTest {
   static Expando<int> visits;
 
diff --git a/tests/corelib/expression_test.dart b/tests/corelib/expression_test.dart
index 910a0c2..8a9ced6 100644
--- a/tests/corelib/expression_test.dart
+++ b/tests/corelib/expression_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:expect/expect.dart";
+
 // Tests basic expressions. Does not attempt to validate the details of arithmetic, coercion, and
 // so forth.
 class ExpressionTest {
diff --git a/tests/corelib/for_in_test.dart b/tests/corelib/for_in_test.dart
index ea53727..82ea7b9 100644
--- a/tests/corelib/for_in_test.dart
+++ b/tests/corelib/for_in_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:expect/expect.dart";
+
 class ForInTest {
   static testMain() {
     testSimple();
diff --git a/tests/corelib/has_next_iterator_test.dart b/tests/corelib/has_next_iterator_test.dart
index 299e11d..bd8a0f3 100644
--- a/tests/corelib/has_next_iterator_test.dart
+++ b/tests/corelib/has_next_iterator_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library hasNextIterator.test;
+import "package:expect/expect.dart";
 import 'dart:collection';
 
 main() {
diff --git a/tests/corelib/hash_map2_test.dart b/tests/corelib/hash_map2_test.dart
index 9f81c9f..cc4ed3e 100644
--- a/tests/corelib/hash_map2_test.dart
+++ b/tests/corelib/hash_map2_test.dart
@@ -6,6 +6,7 @@
 // modification errors.
 
 library hash_map2_test;
+import "package:expect/expect.dart";
 import 'dart:collection';
 
 testMap(Map newMap(), Map newMapFrom(Map map)) {
diff --git a/tests/corelib/hash_map_test.dart b/tests/corelib/hash_map_test.dart
index 8d92047..1bdc7be 100644
--- a/tests/corelib/hash_map_test.dart
+++ b/tests/corelib/hash_map_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:expect/expect.dart";
+
 // Test program for the HashMap class.
 
 class HashMapTest {
diff --git a/tests/corelib/hash_set_test.dart b/tests/corelib/hash_set_test.dart
index 68a0844..ee4bd16 100644
--- a/tests/corelib/hash_set_test.dart
+++ b/tests/corelib/hash_set_test.dart
@@ -6,6 +6,7 @@
 // modification errors.
 
 library hash_map2_test;
+import "package:expect/expect.dart";
 import 'dart:collection';
 
 testSet(Set newSet(), Set newSetFrom(Set from)) {
@@ -187,6 +188,34 @@
     Expect.equals(127, set.length);
     Expect.isFalse(set.contains(null));
   }
+
+  {  // Check that addAll and clear works.
+    Set set = newSet();
+    set.addAll([]);
+    Expect.isTrue(set.isEmpty);
+    set.addAll([1, 3, 2]);
+    Expect.equals(3, set.length);
+    Expect.isTrue(set.contains(1));
+    Expect.isTrue(set.contains(3));
+    Expect.isTrue(set.contains(2));
+    Expect.isFalse(set.contains(4));
+    set.clear();
+    Expect.isTrue(set.isEmpty);
+  }
+
+  {  // Check that removeWhere and retainWhere work.
+    Set set = newSetFrom([1, 2, 3]);
+    set.removeWhere((each) => each == 2);
+    Expect.equals(2, set.length);
+    Expect.isTrue(set.contains(1));
+    Expect.isFalse(set.contains(2));
+    Expect.isTrue(set.contains(3));
+    set.retainWhere((each) => each == 3);
+    Expect.equals(1, set.length);
+    Expect.isFalse(set.contains(1));
+    Expect.isFalse(set.contains(2));
+    Expect.isTrue(set.contains(3));
+  }
 }
 
 void main() {
diff --git a/tests/corelib/indexed_list_access_test.dart b/tests/corelib/indexed_list_access_test.dart
index 2feab1e..4cbc645 100644
--- a/tests/corelib/indexed_list_access_test.dart
+++ b/tests/corelib/indexed_list_access_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:expect/expect.dart";
+
 // Check that indexed access to lists throws correct exception if index
 // is not int.
 
diff --git a/tests/corelib/int_ceil_test.dart b/tests/corelib/int_ceil_test.dart
index ab10766..9b6a4de 100644
--- a/tests/corelib/int_ceil_test.dart
+++ b/tests/corelib/int_ceil_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:expect/expect.dart';
+
 main() {
   Expect.equals(0, 0.ceil());
   Expect.equals(1, 1.ceil());
diff --git a/tests/corelib/int_ceil_to_double_test.dart b/tests/corelib/int_ceil_to_double_test.dart
index 0c0e097..c5220e6 100644
--- a/tests/corelib/int_ceil_to_double_test.dart
+++ b/tests/corelib/int_ceil_to_double_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:expect/expect.dart';
+
 main() {
   Expect.equals(0.0, 0.ceilToDouble());
   Expect.equals(1.0, 1.ceilToDouble());
diff --git a/tests/corelib/int_floor_test.dart b/tests/corelib/int_floor_test.dart
index 2f6bc53..3e0cf21 100644
--- a/tests/corelib/int_floor_test.dart
+++ b/tests/corelib/int_floor_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:expect/expect.dart';
+
 main() {
   Expect.equals(0, 0.floor());
   Expect.equals(1, 1.floor());
diff --git a/tests/corelib/int_floor_to_double_test.dart b/tests/corelib/int_floor_to_double_test.dart
index 506092a..478e0e6 100644
--- a/tests/corelib/int_floor_to_double_test.dart
+++ b/tests/corelib/int_floor_to_double_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:expect/expect.dart';
+
 main() {
   Expect.equals(0.0, 0.floorToDouble());
   Expect.equals(1.0, 1.floorToDouble());
diff --git a/tests/corelib/int_parse_radix_test.dart b/tests/corelib/int_parse_radix_test.dart
index a59ee60..e934651 100644
--- a/tests/corelib/int_parse_radix_test.dart
+++ b/tests/corelib/int_parse_radix_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:expect/expect.dart";
+
 void main() {
   bool checkedMode = false;
   assert(checkedMode = true);
diff --git a/tests/corelib/int_round_test.dart b/tests/corelib/int_round_test.dart
index c2edc73..df71b3c 100644
--- a/tests/corelib/int_round_test.dart
+++ b/tests/corelib/int_round_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:expect/expect.dart';
+
 main() {
   Expect.equals(0, 0.round());
   Expect.equals(1, 1.round());
diff --git a/tests/corelib/int_round_to_double_test.dart b/tests/corelib/int_round_to_double_test.dart
index 39122a4..cc2a4ca 100644
--- a/tests/corelib/int_round_to_double_test.dart
+++ b/tests/corelib/int_round_to_double_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:expect/expect.dart';
+
 main() {
   Expect.equals(0.0, 0.roundToDouble());
   Expect.equals(1.0, 1.roundToDouble());
diff --git a/tests/corelib/int_to_int_test.dart b/tests/corelib/int_to_int_test.dart
index 7a16e4a..4e7e93b 100644
--- a/tests/corelib/int_to_int_test.dart
+++ b/tests/corelib/int_to_int_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:expect/expect.dart';
+
 main() {
   Expect.equals(0, 0.toInt());
   Expect.equals(1, 1.toInt());
diff --git a/tests/corelib/int_truncate_test.dart b/tests/corelib/int_truncate_test.dart
index 67bdef6..9610253 100644
--- a/tests/corelib/int_truncate_test.dart
+++ b/tests/corelib/int_truncate_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:expect/expect.dart';
+
 main() {
   Expect.equals(0, 0.truncate());
   Expect.equals(1, 1.truncate());
diff --git a/tests/corelib/int_truncate_to_double_test.dart b/tests/corelib/int_truncate_to_double_test.dart
index 628fa8a..3ec2d61 100644
--- a/tests/corelib/int_truncate_to_double_test.dart
+++ b/tests/corelib/int_truncate_to_double_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:expect/expect.dart';
+
 main() {
   Expect.equals(0.0, 0.truncateToDouble());
   Expect.equals(1.0, 1.truncateToDouble());
diff --git a/tests/corelib/integer_to_radix_string_test.dart b/tests/corelib/integer_to_radix_string_test.dart
index a8cafb5..34db6fb 100644
--- a/tests/corelib/integer_to_radix_string_test.dart
+++ b/tests/corelib/integer_to_radix_string_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:expect/expect.dart";
+
 main() {
   // Test that we accept radix 2 to 36 and that we use lower-case
   // letters.
diff --git a/tests/corelib/is_operator_basic_types_test.dart b/tests/corelib/is_operator_basic_types_test.dart
index 662b2a4..4c0aea9 100644
--- a/tests/corelib/is_operator_basic_types_test.dart
+++ b/tests/corelib/is_operator_basic_types_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for the "is" type test operator.
 
+import "package:expect/expect.dart";
+
 check(args) {
   var list = args[0];
   var string = args[1];
@@ -10,14 +12,12 @@
 
   Expect.isTrue(list is Object);
   Expect.isTrue(list is List);
-  Expect.isTrue(list is Collection);
   Expect.isTrue(list is Iterable);
   Expect.isFalse(list is Comparable);
   Expect.isFalse(list is Pattern);
   Expect.isFalse(list is String);
 
   Expect.isFalse(list is !List);
-  Expect.isFalse(list is !Collection);
   Expect.isFalse(list is !Iterable);
   Expect.isTrue(list is !Comparable);
   Expect.isTrue(list is !Pattern);
@@ -25,14 +25,12 @@
 
   Expect.isTrue(string is Object);
   Expect.isFalse(string is List);
-  Expect.isFalse(string is Collection);
   Expect.isFalse(string is Iterable);
   Expect.isTrue(string is Comparable);
   Expect.isTrue(string is Pattern);
   Expect.isTrue(string is String);
 
   Expect.isTrue(string is !List);
-  Expect.isTrue(string is !Collection);
   Expect.isTrue(string is !Iterable);
   Expect.isFalse(string is !Comparable);
   Expect.isFalse(string is !Pattern);
@@ -40,14 +38,12 @@
 
   Expect.isTrue(nullObject is Object);
   Expect.isFalse(nullObject is List);
-  Expect.isFalse(nullObject is Collection);
   Expect.isFalse(nullObject is Iterable);
   Expect.isFalse(nullObject is Comparable);
   Expect.isFalse(nullObject is Pattern);
   Expect.isFalse(nullObject is String);
 
   Expect.isTrue(nullObject is !List);
-  Expect.isTrue(nullObject is !Collection);
   Expect.isTrue(nullObject is !Iterable);
   Expect.isTrue(nullObject is !Comparable);
   Expect.isTrue(nullObject is !Pattern);
diff --git a/tests/corelib/collection_contains_test.dart b/tests/corelib/iterable_contains_test.dart
similarity index 97%
rename from tests/corelib/collection_contains_test.dart
rename to tests/corelib/iterable_contains_test.dart
index 168855b..bfb7038 100644
--- a/tests/corelib/collection_contains_test.dart
+++ b/tests/corelib/iterable_contains_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:expect/expect.dart";
+
 // Tests for the contains methods on lists.
 
 test(list, notInList) {
diff --git a/tests/corelib/iterable_element_at_test.dart b/tests/corelib/iterable_element_at_test.dart
index 2dd6920..5f46958 100644
--- a/tests/corelib/iterable_element_at_test.dart
+++ b/tests/corelib/iterable_element_at_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:expect/expect.dart";
+
 main() {
   List<int> list1 = <int>[1, 2, 3];
   List<int> list2 = const <int>[4, 5, 6];
diff --git a/tests/corelib/iterable_expand_test.dart b/tests/corelib/iterable_expand_test.dart
index 67aaf5b..5737a9b 100644
--- a/tests/corelib/iterable_expand_test.dart
+++ b/tests/corelib/iterable_expand_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:expect/expect.dart";
+
 main() {
   test(expectation, iterable) {
     Expect.listEquals(expectation, iterable.toList());
diff --git a/tests/corelib/iterable_first_test.dart b/tests/corelib/iterable_first_test.dart
index 44945a5..0ccd036 100644
--- a/tests/corelib/iterable_first_test.dart
+++ b/tests/corelib/iterable_first_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:expect/expect.dart";
+
 main() {
   List<int> list1 = <int>[1, 2, 3];
   List<int> list2 = const <int>[4, 5];
diff --git a/tests/corelib/iterable_first_where_test.dart b/tests/corelib/iterable_first_where_test.dart
index 2b70053..d8ee32c 100644
--- a/tests/corelib/iterable_first_where_test.dart
+++ b/tests/corelib/iterable_first_where_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:expect/expect.dart';
+
 main() {
   List<int> list1 = <int>[1, 2, 3];
   List<int> list2 = const <int>[4, 5];
diff --git a/tests/corelib/iterable_join_test.dart b/tests/corelib/iterable_join_test.dart
index 96922a9..e374be4 100644
--- a/tests/corelib/iterable_join_test.dart
+++ b/tests/corelib/iterable_join_test.dart
@@ -2,13 +2,19 @@
 // for 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 IC {
   int count = 0;
   String toString() => "${count++}";
 }
 
-testJoin(String expect, Iterable iterable, [String separator]) {
-  Expect.equals(expect, iterable.join(separator));
+testJoin(String expect, Iterable iterable, [String separator = ""]) {
+  if (?separator) {
+    Expect.equals(expect, iterable.join(separator));
+  } else {
+    Expect.equals(expect, iterable.join());
+  }
 }
 
 testCollections() {
diff --git a/tests/corelib/iterable_last_test.dart b/tests/corelib/iterable_last_test.dart
index 24539bf..dd9f0da 100644
--- a/tests/corelib/iterable_last_test.dart
+++ b/tests/corelib/iterable_last_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:expect/expect.dart";
+
 main() {
   List<int> list1 = <int>[1, 2, 3];
   List<int> list2 = const <int>[4, 5];
diff --git a/tests/corelib/iterable_last_where_test.dart b/tests/corelib/iterable_last_where_test.dart
index 5544cd3..98c3daf 100644
--- a/tests/corelib/iterable_last_where_test.dart
+++ b/tests/corelib/iterable_last_where_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:expect/expect.dart';
+
 main() {
   List<int> list1 = <int>[1, 2, 3];
   List<int> list2 = const <int>[4, 5, 6];
diff --git a/tests/corelib/iterable_length_test.dart b/tests/corelib/iterable_length_test.dart
index e70f82f..225d398 100644
--- a/tests/corelib/iterable_length_test.dart
+++ b/tests/corelib/iterable_length_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:expect/expect.dart";
+
 class A extends Iterable {
   int count;
   A(this.count);
diff --git a/tests/corelib/iterable_mapping_test.dart b/tests/corelib/iterable_mapping_test.dart
index eae0a2d..0830a7d 100644
--- a/tests/corelib/iterable_mapping_test.dart
+++ b/tests/corelib/iterable_mapping_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:expect/expect.dart";
+
 main() {
   List<int> list1 = <int>[1, 2, 3];
   List<int> list2 = const <int>[4, 5];
diff --git a/tests/corelib/iterable_min_max_test.dart b/tests/corelib/iterable_min_max_test.dart
deleted file mode 100644
index 1a8c4fd..0000000
--- a/tests/corelib/iterable_min_max_test.dart
+++ /dev/null
@@ -1,80 +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 iterable_min_max_test;
-
-import "dart:collection";
-
-class C {
-  final x;
-  const C(this.x);
-  int get hashCode => x.hashCode;
-  bool operator==(var other) => other is C && x == other.x;
-}
-
-const inf = double.INFINITY;
-
-var intList = const [0, 1, -1, -5, 5, -1000, 1000, -7, 7];
-var doubleList = const [-0.0, 0.0, -1.0, 1.0, -1000.0, 1000.0, -inf, inf];
-var stringList = const ["bbb", "bba", "bab", "abb", "bbc", "bcb", "cbb", "bb"];
-var cList = const [const C(5), const C(3), const C(8),
-                   const C(0), const C(10), const C(6)];
-int compareC(C a, C b) => a.x.compareTo(b.x);
-
-
-testMinMax(iterable, min, max) {
-  Expect.equals(min, iterable.min());
-  Expect.equals(min, iterable.min(Comparable.compare));
-  Expect.equals(min, IterableMixinWorkaround.min(iterable));
-  Expect.equals(min, IterableMixinWorkaround.min(iterable, Comparable.compare));
-  Expect.equals(max, iterable.min((a, b) => Comparable.compare(b, a)));
-
-  Expect.equals(max, iterable.max());
-  Expect.equals(max, iterable.max(Comparable.compare));
-  Expect.equals(max, IterableMixinWorkaround.max(iterable));
-  Expect.equals(max, IterableMixinWorkaround.max(iterable, Comparable.compare));
-  Expect.equals(min, iterable.max((a, b) => Comparable.compare(b, a)));
-}
-
-
-main() {
-  testMinMax(const [], null, null);
-  testMinMax([], null, null);
-  testMinMax(new Set(), null, null);
-
-  testMinMax(intList, -1000, 1000);  // Const list.
-  testMinMax(new List.from(intList), -1000, 1000);  // Non-const list.
-  testMinMax(new Set.from(intList), -1000, 1000);  // Set.
-
-  testMinMax(doubleList, -inf, inf);
-  testMinMax(new List.from(doubleList), -inf, inf);
-  testMinMax(new Set.from(doubleList), -inf, inf);
-
-  testMinMax(stringList, "abb", "cbb");
-  testMinMax(new List.from(stringList), "abb", "cbb");
-  testMinMax(new Set.from(stringList), "abb", "cbb");
-
-  // Objects that are not Comparable.
-  Expect.equals(const C(0), cList.min(compareC));
-  Expect.equals(const C(0), IterableMixinWorkaround.min(cList, compareC));
-  Expect.equals(const C(0), new List.from(cList).min(compareC));
-  Expect.equals(const C(0), IterableMixinWorkaround.min(new List.from(cList), compareC));
-  Expect.equals(const C(0), new Set.from(cList).min(compareC));
-  Expect.equals(const C(0), IterableMixinWorkaround.min(new Set.from(cList), compareC));
-
-  Expect.equals(const C(10), cList.max(compareC));
-  Expect.equals(const C(10), IterableMixinWorkaround.max(cList, compareC));
-  Expect.equals(const C(10), new List.from(cList).max(compareC));
-  Expect.equals(const C(10), IterableMixinWorkaround.max(new List.from(cList), compareC));
-  Expect.equals(const C(10), new Set.from(cList).max(compareC));
-  Expect.equals(const C(10), IterableMixinWorkaround.max(new Set.from(cList), compareC));
-
-  bool checkedMode = false;
-  assert(checkedMode = true);
-  Expect.throws(cList.min, (e) => checkedMode ? e is TypeError
-                                              : e is NoSuchMethodError);
-  Expect.throws(cList.max, (e) => checkedMode ? e is TypeError
-                                              : e is NoSuchMethodError);
-}
-
diff --git a/tests/corelib/iterable_single_test.dart b/tests/corelib/iterable_single_test.dart
index 9c3b09a..7efe645 100644
--- a/tests/corelib/iterable_single_test.dart
+++ b/tests/corelib/iterable_single_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:expect/expect.dart";
+
 main() {
   List<int> list1a = <int>[1];
   List<int> list1b = <int>[1, 2, 3];
diff --git a/tests/corelib/iterable_single_where_test.dart b/tests/corelib/iterable_single_where_test.dart
index ded576b..e6fe7d9 100644
--- a/tests/corelib/iterable_single_where_test.dart
+++ b/tests/corelib/iterable_single_where_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:expect/expect.dart';
+
 main() {
   List<int> list1 = <int>[1, 2, 3];
   List<int> list2 = const <int>[4, 5, 6];
diff --git a/tests/corelib/iterable_skip_test.dart b/tests/corelib/iterable_skip_test.dart
index b02e72a..2910d3b 100644
--- a/tests/corelib/iterable_skip_test.dart
+++ b/tests/corelib/iterable_skip_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:expect/expect.dart";
+
 main() {
   List<int> list1 = <int>[1, 2, 3];
   List<int> list2 = const <int>[4, 5];
diff --git a/tests/corelib/iterable_skip_while_test.dart b/tests/corelib/iterable_skip_while_test.dart
index 4ddc5fa..d812300 100644
--- a/tests/corelib/iterable_skip_while_test.dart
+++ b/tests/corelib/iterable_skip_while_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:expect/expect.dart";
+
 main() {
   List<int> list1 = <int>[1, 2, 3];
   List<int> list2 = const <int>[4, 5];
diff --git a/tests/corelib/iterable_take_test.dart b/tests/corelib/iterable_take_test.dart
index 3910769..eda953a 100644
--- a/tests/corelib/iterable_take_test.dart
+++ b/tests/corelib/iterable_take_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:expect/expect.dart";
+
 main() {
   List<int> list1 = <int>[1, 2, 3];
   List<int> list2 = const <int>[4, 5];
diff --git a/tests/corelib/iterable_take_while_test.dart b/tests/corelib/iterable_take_while_test.dart
index 6fbc08d..3fb615e 100644
--- a/tests/corelib/iterable_take_while_test.dart
+++ b/tests/corelib/iterable_take_while_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:expect/expect.dart";
+
 main() {
   List<int> list1 = <int>[1, 2, 3];
   List<int> list2 = const <int>[4, 5];
diff --git a/tests/corelib/iterable_test.dart b/tests/corelib/iterable_test.dart
index 6b8fe13..51e363d 100644
--- a/tests/corelib/iterable_test.dart
+++ b/tests/corelib/iterable_test.dart
@@ -5,6 +5,8 @@
 // Regression test for dart2js where [List.addAll] was not typed
 // correctly.
 
+import "package:expect/expect.dart";
+
 class MyIterable implements Iterable {
   get iterator => [].iterator;
 }
diff --git a/tests/corelib/iterable_to_list_test.dart b/tests/corelib/iterable_to_list_test.dart
index 6cb3c52..6a5c454 100644
--- a/tests/corelib/iterable_to_list_test.dart
+++ b/tests/corelib/iterable_to_list_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:expect/expect.dart";
+
 main() {
   List<int> list1 = <int>[1, 2, 3];
   List<int> list2 = const <int>[4, 5];
diff --git a/tests/corelib/iterable_to_set_test.dart b/tests/corelib/iterable_to_set_test.dart
index a8188b8..ee1bcfd 100644
--- a/tests/corelib/iterable_to_set_test.dart
+++ b/tests/corelib/iterable_to_set_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:expect/expect.dart";
+
 main() {
   List<int> list1 = <int>[1, 2, 3];
   List<int> list2 = const <int>[4, 4];
diff --git a/tests/corelib/json_test.dart b/tests/corelib/json_test.dart
index 5a36d99..f22cb98 100644
--- a/tests/corelib/json_test.dart
+++ b/tests/corelib/json_test.dart
@@ -4,6 +4,7 @@
 
 library json_test;
 
+import "package:expect/expect.dart";
 import "dart:json";
 
 bool badFormat(e) => e is FormatException;
diff --git a/tests/corelib/linked_hash_map_test.dart b/tests/corelib/linked_hash_map_test.dart
index 54eddeb..dfefca4 100644
--- a/tests/corelib/linked_hash_map_test.dart
+++ b/tests/corelib/linked_hash_map_test.dart
@@ -4,6 +4,7 @@
 
 // Dart test for linked hash-maps.
 library linkedHashMap.test;
+import "package:expect/expect.dart";
 import 'dart:collection' show LinkedHashMap;
 
 class LinkedHashMapTest {
diff --git a/tests/corelib/list_as_map_test.dart b/tests/corelib/list_as_map_test.dart
index 03f5540..51e637f 100644
--- a/tests/corelib/list_as_map_test.dart
+++ b/tests/corelib/list_as_map_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:expect/expect.dart";
+
 void testListMapCorrespondence(List list, Map map) {
   Expect.equals(list.length, map.length);
   for (int i = 0; i < list.length; i++) {
diff --git a/tests/corelib/list_first_test.dart b/tests/corelib/list_first_test.dart
index c0795a4..74be981 100644
--- a/tests/corelib/list_first_test.dart
+++ b/tests/corelib/list_first_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:expect/expect.dart";
+
 void test(List list) {
   if (list.isEmpty) {
     Expect.throws(() => list.first, (e) => e is StateError);
diff --git a/tests/corelib/list_fixed_test.dart b/tests/corelib/list_fixed_test.dart
index c29d8ea..5950ec3 100644
--- a/tests/corelib/list_fixed_test.dart
+++ b/tests/corelib/list_fixed_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:expect/expect.dart";
+
 main() {
   var a;
 
diff --git a/tests/corelib/list_get_range_test.dart b/tests/corelib/list_get_range_test.dart
index 07ffa56..221931c 100644
--- a/tests/corelib/list_get_range_test.dart
+++ b/tests/corelib/list_get_range_test.dart
@@ -2,55 +2,71 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-main() {
-  Expect.listEquals([], [].sublist(0, 0));
-  Expect.listEquals([], const [].sublist(0, 0));
+import "package:expect/expect.dart";
 
+testGetRange(list, start, end, bool isModifiable) {
+  expectRE(() { list.getRange(-1, 0); });
+  expectRE(() { list.getRange(0, -1); });
+  expectRE(() { list.getRange(1, 0); });
+  expectRE(() { list.getRange(0, list.length + 1); });
+  expectRE(() { list.getRange(list.length + 1, list.length + 1); });
+  Iterable iterable = list.getRange(start, end);
+  Expect.isFalse(iterable is List);
+  if (start == end) {
+    Expect.isTrue(iterable.isEmpty);
+    return;
+  }
 
-  Expect.listEquals([1, 2], [1, 2].sublist(0, 2));
-  Expect.listEquals([1, 2], const [1, 2].sublist(0, 2));
+  var iterator = iterable.iterator;
+  for (int i = start; i < end; i++) {
+    Expect.isTrue(iterator.moveNext());
+    Expect.equals(iterator.current, list[i]);
+  }
+  Expect.isFalse(iterator.moveNext());
 
-  Expect.listEquals([1], [1, 2].sublist(0, 1));
-  Expect.listEquals([1], const [1, 2].sublist(0, 1));
+  if (isModifiable) {
+    for (int i = 0; i < list.length; i++) {
+      list[i]++;
+    }
 
-  Expect.listEquals([2], [1, 2].sublist(1, 2));
-  Expect.listEquals([2], const [1, 2].sublist(1, 2));
-
-  Expect.listEquals([], [1, 2].sublist(0, 0));
-  Expect.listEquals([], const [1, 2].sublist(0, 0));
-
-  Expect.listEquals([2, 3], [1, 2, 3, 4].sublist(1, 3));
-  Expect.listEquals([2, 3], const [1, 2, 3, 4].sublist(1, 3));
-
-  Expect.listEquals([2, 3], [1, 2, 3, 4].sublist(1, 3));
-  Expect.listEquals([2, 3], const [1, 2, 3, 4].sublist(1, 3));
-
-  expectAE(() => [].sublist(-1, null));
-  expectAE(() => const [].sublist(-1, null));
-  expectAE(() => [].sublist(-1, 0));
-  expectAE(() => const [].sublist(-1, 0));
-  expectAE(() => [].sublist(-1, -1));
-  expectAE(() => const [].sublist(-1, -1));
-  expectAE(() => [].sublist(-1, 1));
-  expectAE(() => const [].sublist(-1, 1));
-  expectAE(() => [].sublist(0, -1));
-  expectAE(() => const [].sublist(0, -1));
-  expectAE(() => [].sublist(0, 1));
-  expectAE(() => const [].sublist(0, 1));
-  expectAE(() => [].sublist(1, null));
-  expectAE(() => const [].sublist(1, null));
-  expectAE(() => [].sublist(1, 0));
-  expectAE(() => const [].sublist(1, 0));
-  expectAE(() => [].sublist(1, -1));
-  expectAE(() => const [].sublist(1, -1));
-  expectAE(() => [].sublist(1, 1));
-  expectAE(() => const [].sublist(1, 1));
-
-  expectAE(() => [1].sublist(0, 2));
-  expectAE(() => [1].sublist(1, 2));
-  expectAE(() => [1].sublist(1, 0));
+    iterator = iterable.iterator;
+    for (int i = start; i < end; i++) {
+      Expect.isTrue(iterator.moveNext());
+      Expect.equals(iterator.current, list[i]);
+    }
+  }
 }
 
-void expectAE(Function f) {
-  Expect.throws(f, (e) => e is ArgumentError);
+main() {
+  testGetRange([1, 2], 0, 1, true);
+  testGetRange([], 0, 0, true);
+  testGetRange([1, 2, 3], 0, 0, true);
+  testGetRange([1, 2, 3], 1, 3, true);
+  testGetRange(const [1, 2], 0, 1, false);
+  testGetRange(const [], 0, 0, false);
+  testGetRange(const [1, 2, 3], 0, 0, false);
+  testGetRange(const [1, 2, 3], 1, 3, false);
+  testGetRange("abcd".codeUnits, 0, 1, false);
+  testGetRange("abcd".codeUnits, 0, 0, false);
+  testGetRange("abcd".codeUnits, 1, 3, false);
+
+  expectRE(() => [1].getRange(-1, 1));
+  expectRE(() => [3].getRange(0, -1));
+  expectRE(() => [4].getRange(1, 0));
+
+  var list = [1, 2, 3, 4];
+  var iterable = list.getRange(1, 3);
+  Expect.equals(2, iterable.first);
+  Expect.equals(3, iterable.last);
+  list.length = 1;
+  Expect.isTrue(iterable.isEmpty);
+  list.add(99);
+  Expect.equals(99, iterable.single);
+  list.add(499);
+  Expect.equals(499, iterable.last);
+  Expect.equals(2, iterable.length);
+}
+
+void expectRE(Function f) {
+  Expect.throws(f, (e) => e is RangeError);
 }
diff --git a/tests/corelib/list_growable_test.dart b/tests/corelib/list_growable_test.dart
index 563f187..7ce723e 100644
--- a/tests/corelib/list_growable_test.dart
+++ b/tests/corelib/list_growable_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:expect/expect.dart";
+
 main() {
   var a;
   a = new List();
diff --git a/tests/corelib/list_index_of_test.dart b/tests/corelib/list_index_of_test.dart
index ca8ab4c..4641adc 100644
--- a/tests/corelib/list_index_of_test.dart
+++ b/tests/corelib/list_index_of_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:expect/expect.dart";
+
 class ListIndexOfTest {
   static testMain() {
     test(new List<int>(5));
diff --git a/tests/corelib/list_insert_range_test.dart b/tests/corelib/list_insert_range_test.dart
index 26e48cf..8670c62 100644
--- a/tests/corelib/list_insert_range_test.dart
+++ b/tests/corelib/list_insert_range_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:expect/expect.dart";
+
 main() {
   var list = [];
   list.insertRange(-1, 0);
diff --git a/tests/corelib/list_insert_test.dart b/tests/corelib/list_insert_test.dart
index 7d3a722..adfd677 100644
--- a/tests/corelib/list_insert_test.dart
+++ b/tests/corelib/list_insert_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:expect/expect.dart';
+
 void main() {
   // Normal modifiable list.
   var l1 = [0, 1, 2, 3, 4];
diff --git a/tests/corelib/list_iterators_test.dart b/tests/corelib/list_iterators_test.dart
index e7ed128..092082e 100644
--- a/tests/corelib/list_iterators_test.dart
+++ b/tests/corelib/list_iterators_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:expect/expect.dart";
+
 class ListIteratorsTest {
   static void checkListIterator(List a) {
     Iterator it = a.iterator;
diff --git a/tests/corelib/list_last_test.dart b/tests/corelib/list_last_test.dart
index 4d9b53a..0733335 100644
--- a/tests/corelib/list_last_test.dart
+++ b/tests/corelib/list_last_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:expect/expect.dart";
+
 void test(List list) {
   if (list.isEmpty) {
     Expect.throws(() => list.last, (e) => e is StateError);
diff --git a/tests/corelib/list_literal_is_growable_test.dart b/tests/corelib/list_literal_is_growable_test.dart
index 5721eb7..061a72d 100644
--- a/tests/corelib/list_literal_is_growable_test.dart
+++ b/tests/corelib/list_literal_is_growable_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:expect/expect.dart";
+
 main() {
   var l = [];
   l.add(1);
diff --git a/tests/corelib/list_literal_test.dart b/tests/corelib/list_literal_test.dart
index 9a4f1bc..c333b8f 100644
--- a/tests/corelib/list_literal_test.dart
+++ b/tests/corelib/list_literal_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:expect/expect.dart";
+
 // Test that a list literal is expandable and modifiable.
 
 class ListLiteralTest {
diff --git a/tests/corelib/list_map_test.dart b/tests/corelib/list_map_test.dart
index 31d3439..8bd05eb 100644
--- a/tests/corelib/list_map_test.dart
+++ b/tests/corelib/list_map_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:expect/expect.dart";
 
 main() {
   testOperations();
@@ -113,9 +114,7 @@
     testOp((i) => i.any((n) => n < 10), "any<10");
     testOp((i) => i.every((n) => n < 5), "every<5");
     testOp((i) => i.every((n) => n < 10), "every<10");
-    testOp((i) => i.max(), "max");
-    testOp((i) => i.min(), "min");
-    testOp((i) => i.reduce(0, (a, b) => a + b), "reduce-sum");
+    testOp((i) => i.reduce((a, b) => a + b), "reduce-sum");
     testOp((i) => i.fold(0, (a, b) => a + b), "fold-sum");
     testOp((i) => i.join("-"), "join-");
     testOp((i) => i.join(""), "join");
diff --git a/tests/corelib/list_remove_range_test.dart b/tests/corelib/list_remove_range_test.dart
index 4e41ef6..b4fa04f 100644
--- a/tests/corelib/list_remove_range_test.dart
+++ b/tests/corelib/list_remove_range_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:expect/expect.dart";
+
 main() {
   var list = [];
   list.removeRange(0, 0);
diff --git a/tests/corelib/list_removeat_test.dart b/tests/corelib/list_removeat_test.dart
index d6a9b28..d8dbf88 100644
--- a/tests/corelib/list_removeat_test.dart
+++ b/tests/corelib/list_removeat_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:expect/expect.dart";
+
 void main() {
   // Normal modifiable list.
   var l1 = [0, 1, 2, 3, 4];
diff --git a/tests/corelib/list_reversed_test.dart b/tests/corelib/list_reversed_test.dart
index 99f7b99..ea1e780 100644
--- a/tests/corelib/list_reversed_test.dart
+++ b/tests/corelib/list_reversed_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:expect/expect.dart";
+
 
 main() {
   testOperations();
@@ -104,9 +106,7 @@
     testOp((i) => i.any((n) => n < 10), "any<10");
     testOp((i) => i.every((n) => n < 5), "every<5");
     testOp((i) => i.every((n) => n < 10), "every<10");
-    testOp((i) => i.max(), "max");
-    testOp((i) => i.min(), "min");
-    testOp((i) => i.reduce(0, (a, b) => a + b), "reduce-sum");
+    testOp((i) => i.reduce((a, b) => a + b), "reduce-sum");
     testOp((i) => i.fold(0, (a, b) => a + b), "fold-sum");
     testOp((i) => i.join("-"), "join-");
     testOp((i) => i.join(""), "join");
diff --git a/tests/corelib/list_set_range_test.dart b/tests/corelib/list_set_range_test.dart
index f96ede5..a693584 100644
--- a/tests/corelib/list_set_range_test.dart
+++ b/tests/corelib/list_set_range_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:expect/expect.dart";
+
 main() {
   var list = [];
   list.setRange(0, 0, const []);
diff --git a/tests/corelib/list_sublist_test.dart b/tests/corelib/list_sublist_test.dart
new file mode 100644
index 0000000..0581473
--- /dev/null
+++ b/tests/corelib/list_sublist_test.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+main() {
+  Expect.listEquals([], [].sublist(0, 0));
+  Expect.listEquals([], const [].sublist(0, 0));
+
+
+  Expect.listEquals([1, 2], [1, 2].sublist(0, 2));
+  Expect.listEquals([1, 2], const [1, 2].sublist(0, 2));
+
+  Expect.listEquals([1], [1, 2].sublist(0, 1));
+  Expect.listEquals([1], const [1, 2].sublist(0, 1));
+
+  Expect.listEquals([2], [1, 2].sublist(1, 2));
+  Expect.listEquals([2], const [1, 2].sublist(1, 2));
+
+  Expect.listEquals([], [1, 2].sublist(0, 0));
+  Expect.listEquals([], const [1, 2].sublist(0, 0));
+
+  Expect.listEquals([2, 3], [1, 2, 3, 4].sublist(1, 3));
+  Expect.listEquals([2, 3], const [1, 2, 3, 4].sublist(1, 3));
+
+  Expect.listEquals([2, 3], [1, 2, 3, 4].sublist(1, 3));
+  Expect.listEquals([2, 3], const [1, 2, 3, 4].sublist(1, 3));
+
+  expectAE(() => [].sublist(-1, null));
+  expectAE(() => const [].sublist(-1, null));
+  expectAE(() => [].sublist(-1, 0));
+  expectAE(() => const [].sublist(-1, 0));
+  expectAE(() => [].sublist(-1, -1));
+  expectAE(() => const [].sublist(-1, -1));
+  expectAE(() => [].sublist(-1, 1));
+  expectAE(() => const [].sublist(-1, 1));
+  expectAE(() => [].sublist(0, -1));
+  expectAE(() => const [].sublist(0, -1));
+  expectAE(() => [].sublist(0, 1));
+  expectAE(() => const [].sublist(0, 1));
+  expectAE(() => [].sublist(1, null));
+  expectAE(() => const [].sublist(1, null));
+  expectAE(() => [].sublist(1, 0));
+  expectAE(() => const [].sublist(1, 0));
+  expectAE(() => [].sublist(1, -1));
+  expectAE(() => const [].sublist(1, -1));
+  expectAE(() => [].sublist(1, 1));
+  expectAE(() => const [].sublist(1, 1));
+
+  expectAE(() => [1].sublist(0, 2));
+  expectAE(() => [1].sublist(1, 2));
+  expectAE(() => [1].sublist(1, 0));
+}
+
+void expectAE(Function f) {
+  Expect.throws(f, (e) => e is ArgumentError);
+}
diff --git a/tests/corelib/list_test.dart b/tests/corelib/list_test.dart
index 9a88a9f..932d4ca 100644
--- a/tests/corelib/list_test.dart
+++ b/tests/corelib/list_test.dart
@@ -2,151 +2,160 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-class ListTest {
+import "dart:collection";
+import "package:expect/expect.dart";
 
-  static testMain() {
-    testList();
-    testExpandableList();
+void main() {
+  testFixedLengthList(new List(4));
+  // ListBase implementation of List.
+  testFixedLengthList(new MyFixedList(new List(4)));
+
+  testGrowableList(new List());
+  testGrowableList([]);
+  testGrowableList(new MyList([]));
+}
+
+void expectValues(list, val1, val2, val3, val4) {
+  Expect.isFalse(list.isEmpty);
+  Expect.equals(4, list.length);
+  Expect.equals(list[0], val1);
+  Expect.equals(list[1], val2);
+  Expect.equals(list[2], val3);
+  Expect.equals(list[3], val4);
+}
+
+void testClosures(List list) {
+  testMap(val) {return val * 2 + 10; }
+  List mapped = list.map(testMap).toList();
+  Expect.equals(mapped.length, list.length);
+  for (var i = 0; i < list.length; i++) {
+    Expect.equals(mapped[i], list[i]*2 + 10);
   }
 
-  static void expectValues(list, val1, val2, val3, val4) {
-    Expect.equals(true, list.length == 4);
-    Expect.equals(true, list.length == 4);
-    Expect.equals(true, !list.isEmpty);
-    Expect.equals(list[0], val1);
-    Expect.equals(list[1], val2);
-    Expect.equals(list[2], val3);
-    Expect.equals(list[3], val4);
+  testFilter(val) { return val == 3; }
+  Iterable filtered = list.where(testFilter);
+  Expect.equals(filtered.length, 1);
+
+  testEvery(val) { return val != 11; }
+  bool test = list.every(testEvery);
+  Expect.isTrue(test);
+
+  testSome(val) { return val == 1; }
+  test = list.any(testSome);
+  Expect.isTrue(test);
+
+  testSomeFirst(val) { return val == 0; }
+  test = list.any(testSomeFirst);
+  Expect.isTrue(test);
+
+  testSomeLast(val) { return val == (list.length - 1); }
+  test = list.any(testSomeLast);
+  Expect.isTrue(test);
+}
+
+void testFixedLengthList(List list) {
+  Expect.equals(list.length, 4);
+  list[0] = 4;
+  expectValues(list, 4, null, null, null);
+  String val = "fisk";
+  list[1] = val;
+  expectValues(list, 4, val, null, null);
+  double d = 2.0;
+  list[3] = d;
+  expectValues(list, 4, val, null, d);
+
+  for (int i = 0; i < list.length; i++) {
+    list[i] = i;
   }
 
-  static void testClosures(List list) {
-    testMap(val) {return val * 2 + 10; }
-    List mapped = list.map(testMap).toList();
-    Expect.equals(mapped.length, list.length);
-    for (var i = 0; i < list.length; i++) {
-      Expect.equals(mapped[i], list[i]*2 + 10);
-    }
-
-    testFilter(val) { return val == 3; }
-    Iterable filtered = list.where(testFilter);
-    Expect.equals(filtered.length, 1);
-
-    testEvery(val) { return val != 11; }
-    bool test = list.every(testEvery);
-    Expect.equals(true, test);
-
-    testSome(val) { return val == 1; }
-    test = list.any(testSome);
-    Expect.equals(true, test);
-
-    testSomeFirst(val) { return val == 0; }
-    test = list.any(testSomeFirst);
-    Expect.equals(true, test);
-
-    testSomeLast(val) { return val == (list.length - 1); }
-    test = list.any(testSomeLast);
-    Expect.equals(true, test);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, list[i]);
+    Expect.equals(i, list.indexOf(i));
+    Expect.equals(i, list.lastIndexOf(i));
   }
 
-  static void testList() {
-    List list = new List(4);
-    Expect.equals(list.length, 4);
-    list[0] = 4;
-    expectValues(list, 4, null, null, null);
-    String val = "fisk";
-    list[1] = val;
-    expectValues(list, 4, val, null, null);
-    double d = 2.0;
-    list[3] = d;
-    expectValues(list, 4, val, null, d);
+  Expect.equals(-1, list.indexOf(100));
+  Expect.equals(-1, list.lastIndexOf(100));
+  list[2] = new Yes();
+  Expect.equals(2, list.indexOf(100));
+  Expect.equals(2, list.lastIndexOf(100));
+  list[3] = new Yes();
+  Expect.equals(2, list.indexOf(100));
+  Expect.equals(3, list.lastIndexOf(100));
+  list[2] = 2;
+  Expect.equals(3, list.indexOf(100));
+  Expect.equals(3, list.lastIndexOf(100));
+  list[3] = 3;
+  Expect.equals(-1, list.indexOf(100));
+  Expect.equals(-1, list.lastIndexOf(100));
 
-    for (int i = 0; i < list.length; i++) {
-      list[i] = i;
-    }
+  testClosures(list);
 
-    for (int i = 0; i < 4; i++) {
-      Expect.equals(i, list[i]);
-      Expect.equals(i, list.indexOf(i));
-      Expect.equals(i, list.lastIndexOf(i));
-    }
+  Expect.throws(list.clear, (e) => e is UnsupportedError);
+}
 
-    Expect.equals(-1, list.indexOf(100));
-    Expect.equals(-1, list.lastIndexOf(100));
-    list[2] = new Yes();
-    Expect.equals(2, list.indexOf(100));
-    Expect.equals(2, list.lastIndexOf(100));
-    list[3] = new Yes();
-    Expect.equals(2, list.indexOf(100));
-    Expect.equals(3, list.lastIndexOf(100));
-    list[2] = 2;
-    Expect.equals(3, list.indexOf(100));
-    Expect.equals(3, list.lastIndexOf(100));
-    list[3] = 3;
-    Expect.equals(-1, list.indexOf(100));
-    Expect.equals(-1, list.lastIndexOf(100));
+void testGrowableList(List list) {
+  Expect.isTrue(list.isEmpty);
+  Expect.equals(list.length, 0);
+  list.add(4);
+  Expect.equals(1, list.length);
+  Expect.isTrue(!list.isEmpty);
+  Expect.equals(list.length, 1);
+  Expect.equals(list.length, 1);
+  Expect.equals(list.removeLast(), 4);
 
-    testClosures(list);
-
-    var exception = null;
-    try {
-      list.clear();
-    } on UnsupportedError catch (e) {
-      exception = e;
-    }
-    Expect.equals(true, exception != null);
+  for (int i = 0; i < 10; i++) {
+    list.add(i);
   }
 
-  static void testExpandableList() {
-    List list = new List();
-    Expect.equals(true, list.isEmpty);
-    Expect.equals(list.length, 0);
-    list.add(4);
-    Expect.equals(1, list.length);
-    Expect.equals(true, !list.isEmpty);
-    Expect.equals(list.length, 1);
-    Expect.equals(list.length, 1);
-    Expect.equals(list.removeLast(), 4);
-
-    for (int i = 0; i < 10; i++) {
-      list.add(i);
-    }
-
-    Expect.equals(list.length, 10);
-    for (int i = 0; i < 10; i++) {
-      Expect.equals(i, list[i]);
-      Expect.equals(i, list.indexOf(i));
-      Expect.equals(i, list.lastIndexOf(i));
-    }
-
-    Expect.equals(-1, list.indexOf(100));
-    Expect.equals(-1, list.lastIndexOf(100));
-    list[2] = new Yes();
-    Expect.equals(2, list.indexOf(100));
-    Expect.equals(2, list.lastIndexOf(100));
-    list[3] = new Yes();
-    Expect.equals(2, list.indexOf(100));
-    Expect.equals(3, list.lastIndexOf(100));
-    list[2] = 2;
-    Expect.equals(3, list.indexOf(100));
-    Expect.equals(3, list.lastIndexOf(100));
-    list[3] = 3;
-    Expect.equals(-1, list.indexOf(100));
-    Expect.equals(-1, list.lastIndexOf(100));
-
-    testClosures(list);
-
-    Expect.equals(list.removeLast(), 9);
-    list.clear();
-    Expect.equals(list.length, 0);
-    Expect.equals(list.length, 0);
-    Expect.equals(true, list.isEmpty);
+  Expect.equals(list.length, 10);
+  for (int i = 0; i < 10; i++) {
+    Expect.equals(i, list[i]);
+    Expect.equals(i, list.indexOf(i));
+    Expect.equals(i, list.lastIndexOf(i));
   }
+
+  Expect.equals(-1, list.indexOf(100));
+  Expect.equals(-1, list.lastIndexOf(100));
+  list[2] = new Yes();
+  Expect.equals(2, list.indexOf(100));
+  Expect.equals(2, list.lastIndexOf(100));
+  list[3] = new Yes();
+  Expect.equals(2, list.indexOf(100));
+  Expect.equals(3, list.lastIndexOf(100));
+  list[2] = 2;
+  Expect.equals(3, list.indexOf(100));
+  Expect.equals(3, list.lastIndexOf(100));
+  list[3] = 3;
+  Expect.equals(-1, list.indexOf(100));
+  Expect.equals(-1, list.lastIndexOf(100));
+
+  testClosures(list);
+
+  Expect.equals(9, list.removeLast());
+  list.clear();
+  Expect.equals(0, list.length);
+  Expect.isTrue(list.isEmpty);
 }
 
 class Yes {
   operator ==(var other) => true;
 }
 
-main() {
-  ListTest.testMain();
+class MyList<E> extends ListBase<E> {
+  List<E> _source;
+  MyList(this._source);
+  int get length => _source.length;
+  void set length(int length) { _source.length = length; }
+  E operator[](int index) => _source[index];
+  void operator[]=(int index, E value) { _source[index] = value; }
+}
+
+class MyFixedList<E> extends ListBase<E> {
+  List<E> _source;
+  MyFixedList(this._source);
+  int get length => _source.length;
+  void set length(int length) { throw new UnsupportedError("Fixed length!"); }
+  E operator[](int index) => _source[index];
+  void operator[]=(int index, E value) { _source[index] = value; }
 }
diff --git a/tests/corelib/map_from_test.dart b/tests/corelib/map_from_test.dart
index b43a45d..21597fb 100644
--- a/tests/corelib/map_from_test.dart
+++ b/tests/corelib/map_from_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library map.from.test;
+import "package:expect/expect.dart";
 import 'dart:collection';
 
 main() {
diff --git a/tests/corelib/map_keys2_test.dart b/tests/corelib/map_keys2_test.dart
index 5cb051f..8d623eb 100644
--- a/tests/corelib/map_keys2_test.dart
+++ b/tests/corelib/map_keys2_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:expect/expect.dart";
+
 main() {
   var map1 = { "foo": 42, "bar": 499 };
   var map2 = {};
diff --git a/tests/corelib/map_keys_test.dart b/tests/corelib/map_keys_test.dart
index 8b3a833..5e02336 100644
--- a/tests/corelib/map_keys_test.dart
+++ b/tests/corelib/map_keys_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:expect/expect.dart";
+
 main() {
   var map1 = { "foo": 42, "bar": 499 };
   var map2 = {};
diff --git a/tests/corelib/map_test.dart b/tests/corelib/map_test.dart
index 9fb2bca..a5bbbda7f 100644
--- a/tests/corelib/map_test.dart
+++ b/tests/corelib/map_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library map_test;
+import "package:expect/expect.dart";
 import 'dart:collection';
 
 void main() {
diff --git a/tests/corelib/map_values2_test.dart b/tests/corelib/map_values2_test.dart
index 08b426a..8efc532 100644
--- a/tests/corelib/map_values2_test.dart
+++ b/tests/corelib/map_values2_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:expect/expect.dart";
+
 main() {
   var map1 = <String, int>{ "foo": 42, "bar": 499 };
   var map2 = <String, int>{};
diff --git a/tests/corelib/map_values_test.dart b/tests/corelib/map_values_test.dart
index dee7e23..cd3f366 100644
--- a/tests/corelib/map_values_test.dart
+++ b/tests/corelib/map_values_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:expect/expect.dart";
+
 main() {
   var map1 = { "foo": 42, "bar": 499 };
   var map2 = {};
diff --git a/tests/corelib/maps_test.dart b/tests/corelib/maps_test.dart
index 6d51939..91849a8 100644
--- a/tests/corelib/maps_test.dart
+++ b/tests/corelib/maps_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library maps_test;
+import "package:expect/expect.dart";
 import 'dart:collection';
 
 main() {
diff --git a/tests/corelib/nan_infinity_test.dart b/tests/corelib/nan_infinity_test.dart
index 35bad82..83e9455 100644
--- a/tests/corelib/nan_infinity_test.dart
+++ b/tests/corelib/nan_infinity_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:expect/expect.dart";
+
 // Dart test program for testing NaN and Infinity.
 
 void main() {
diff --git a/tests/corelib/null_nosuchmethod_test.dart b/tests/corelib/null_nosuchmethod_test.dart
index 7ae7540..57cda7f 100644
--- a/tests/corelib/null_nosuchmethod_test.dart
+++ b/tests/corelib/null_nosuchmethod_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:expect/expect.dart";
+
 // Test that Null's noSuchMethod can be closurized and called directly.
 
 main() {
diff --git a/tests/corelib/null_test.dart b/tests/corelib/null_test.dart
index 8f30e6c..994ca40 100644
--- a/tests/corelib/null_test.dart
+++ b/tests/corelib/null_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:expect/expect.dart";
+
 // Test that Null inherits properties from Object.
 
 main() {
diff --git a/tests/corelib/num_clamp_test.dart b/tests/corelib/num_clamp_test.dart
index 662cab8..f848677f8 100644
--- a/tests/corelib/num_clamp_test.dart
+++ b/tests/corelib/num_clamp_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test num.clamp.
 
+import "package:expect/expect.dart";
+
 testIntClamp() {
   Expect.equals(2, 2.clamp(1, 3));
   Expect.equals(1, 0.clamp(1, 3));
diff --git a/tests/corelib/queue_first_test.dart b/tests/corelib/queue_first_test.dart
index 93bc265..15664d2 100644
--- a/tests/corelib/queue_first_test.dart
+++ b/tests/corelib/queue_first_test.dart
@@ -4,6 +4,7 @@
 
 library queue.first.test;
 
+import "package:expect/expect.dart";
 import 'dart:collection' show Queue;
 
 main() {
diff --git a/tests/corelib/queue_iterator_test.dart b/tests/corelib/queue_iterator_test.dart
index 3b7e3a9..af0458b 100644
--- a/tests/corelib/queue_iterator_test.dart
+++ b/tests/corelib/queue_iterator_test.dart
@@ -4,6 +4,7 @@
 
 library queue.iterator.test;
 
+import "package:expect/expect.dart";
 import 'dart:collection' show Queue;
 
 class QueueIteratorTest {
diff --git a/tests/corelib/queue_last_test.dart b/tests/corelib/queue_last_test.dart
index 58096d9..3361395 100644
--- a/tests/corelib/queue_last_test.dart
+++ b/tests/corelib/queue_last_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library queue.last.test;
+import "package:expect/expect.dart";
 import 'dart:collection' show Queue;
 
 main() {
diff --git a/tests/corelib/queue_single_test.dart b/tests/corelib/queue_single_test.dart
index 533cde6..22f8048 100644
--- a/tests/corelib/queue_single_test.dart
+++ b/tests/corelib/queue_single_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library queue.single.test;
+import "package:expect/expect.dart";
 import 'dart:collection' show Queue;
 
 main() {
diff --git a/tests/corelib/queue_test.dart b/tests/corelib/queue_test.dart
index 51356e7..e36ab42 100644
--- a/tests/corelib/queue_test.dart
+++ b/tests/corelib/queue_test.dart
@@ -4,6 +4,7 @@
 
 library queue.test;
 
+import "package:expect/expect.dart";
 import 'dart:collection';
 
 abstract class QueueTest {
@@ -224,19 +225,15 @@
     queue.remove(10);
     testLength(29, queue);
 
-    queue.removeAll([4, 6]);
-    testLength(23, queue);
-
-    queue.retainAll([1, 3, 5, 7, 9, 10]);  // Remove 2 and 8.
-    testLength(17, queue);
-
     queue.removeWhere((x) => x == 7);
-    testLength(14, queue);
+    testLength(26, queue);
 
     queue.retainWhere((x) => x != 3);
-    testLength(11, queue);
+    testLength(23, queue);
 
-    Expect.listEquals([9, 1, 5, 9, 10, 1, 5, 9, 10, 1, 5], queue.toList());
+    Expect.listEquals(
+        [6, 8, 9, 1, 2, 4, 5, 6, 8, 9, 10, 1, 2, 4, 5, 6, 8, 9, 10, 1, 2, 4, 5],
+        queue.toList());
   }
 
   void testLarge() {
@@ -270,13 +267,10 @@
     }
     Expect.equals(N - 1000, queue.length);
 
-    queue.retainAll(set);
-    Expect.equals(N - 1000, queue.length);
-
     queue.remove(N >> 1);
     Expect.equals(N - 1001, queue.length);
 
-    queue.removeAll(set);
+    queue.clear();
     Expect.equals(0, queue.length);
     Expect.isTrue(queue.isEmpty);
 
diff --git a/tests/corelib/range_error_test.dart b/tests/corelib/range_error_test.dart
index e83bd30..2fdf90f 100644
--- a/tests/corelib/range_error_test.dart
+++ b/tests/corelib/range_error_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:expect/expect.dart";
+
 // Dart test for testing out of range exceptions on arrays.
 
 class RangeErrorTest {
diff --git a/tests/corelib/reg_exp1_test.dart b/tests/corelib/reg_exp1_test.dart
index 50cd4af..88e3b0a 100644
--- a/tests/corelib/reg_exp1_test.dart
+++ b/tests/corelib/reg_exp1_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for testing regular expressions in Dart.
 
+import "package:expect/expect.dart";
+
 class RegExp1Test {
   static testMain() {
     RegExp exp1 = new RegExp("bar|foo");
diff --git a/tests/corelib/reg_exp4_test.dart b/tests/corelib/reg_exp4_test.dart
index bef3397..f8f63c1 100644
--- a/tests/corelib/reg_exp4_test.dart
+++ b/tests/corelib/reg_exp4_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for testing regular expressions in Dart.
 
+import "package:expect/expect.dart";
+
 main() {
   try {
     RegExp ex = new RegExp(null);
diff --git a/tests/corelib/reg_exp5_test.dart b/tests/corelib/reg_exp5_test.dart
index 3a1aa7f..f67cd6d 100644
--- a/tests/corelib/reg_exp5_test.dart
+++ b/tests/corelib/reg_exp5_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for testing regular expressions in Dart.
 
+import "package:expect/expect.dart";
+
 main() {
   String str = "";
   try {
diff --git a/tests/corelib/reg_exp_all_matches_test.dart b/tests/corelib/reg_exp_all_matches_test.dart
index 3e85114..72a2344 100644
--- a/tests/corelib/reg_exp_all_matches_test.dart
+++ b/tests/corelib/reg_exp_all_matches_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:expect/expect.dart";
+
 // Dart test program for RegExp.allMatches.
 
 class RegExpAllMatchesTest {
diff --git a/tests/corelib/reg_exp_first_match_test.dart b/tests/corelib/reg_exp_first_match_test.dart
index 23a0f3b..40e38fa 100644
--- a/tests/corelib/reg_exp_first_match_test.dart
+++ b/tests/corelib/reg_exp_first_match_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:expect/expect.dart";
+
 // Dart test program for RegExp.firstMatch.
 
 class RegExpFirstMatchTest {
diff --git a/tests/corelib/reg_exp_group_test.dart b/tests/corelib/reg_exp_group_test.dart
index a335e44..1bf4af3 100644
--- a/tests/corelib/reg_exp_group_test.dart
+++ b/tests/corelib/reg_exp_group_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:expect/expect.dart";
+
 // Dart test program for RegExp.group.
 
 class RegExpGroupTest {
diff --git a/tests/corelib/reg_exp_groups_test.dart b/tests/corelib/reg_exp_groups_test.dart
index 549b690..70386d0 100644
--- a/tests/corelib/reg_exp_groups_test.dart
+++ b/tests/corelib/reg_exp_groups_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:expect/expect.dart";
+
 // Dart test program for RegExp.groups.
 
 class RegExpGroupsTest {
diff --git a/tests/corelib/reg_exp_has_match_test.dart b/tests/corelib/reg_exp_has_match_test.dart
index 9cd3caa..6ff2744 100644
--- a/tests/corelib/reg_exp_has_match_test.dart
+++ b/tests/corelib/reg_exp_has_match_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:expect/expect.dart";
+
 // Dart test program for RegExp.hasMatch.
 
 class RegExpHasMatchTest {
diff --git a/tests/corelib/reg_exp_start_end_test.dart b/tests/corelib/reg_exp_start_end_test.dart
index 18a7337..e905275a 100644
--- a/tests/corelib/reg_exp_start_end_test.dart
+++ b/tests/corelib/reg_exp_start_end_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:expect/expect.dart";
+
 main() {
   var matches =
       new RegExp("(a(b)((c|de)+))").allMatches("abcde abcde abcde");
diff --git a/tests/corelib/reg_exp_string_match_test.dart b/tests/corelib/reg_exp_string_match_test.dart
index fa4efa7..05978dd 100644
--- a/tests/corelib/reg_exp_string_match_test.dart
+++ b/tests/corelib/reg_exp_string_match_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:expect/expect.dart";
+
 // Dart test program for RegExp.stringMatch.
 
 class RegExpStringMatchTest {
diff --git a/tests/corelib/safe_to_string_test.dart b/tests/corelib/safe_to_string_test.dart
index dd80be1..10be1f7 100644
--- a/tests/corelib/safe_to_string_test.dart
+++ b/tests/corelib/safe_to_string_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:expect/expect.dart";
+
 main() {
   Expect.stringEquals('1', Error.safeToString(1));
   Expect.stringEquals('0.5', Error.safeToString(0.5));
diff --git a/tests/corelib/set_iterator_test.dart b/tests/corelib/set_iterator_test.dart
index d6ec16e..d2193ad 100644
--- a/tests/corelib/set_iterator_test.dart
+++ b/tests/corelib/set_iterator_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:expect/expect.dart";
+
 class FixedHashCode {
   final int _hashCode;
   const FixedHashCode(this._hashCode);
diff --git a/tests/corelib/set_test.dart b/tests/corelib/set_test.dart
index 940e427..5acb8a5 100644
--- a/tests/corelib/set_test.dart
+++ b/tests/corelib/set_test.dart
@@ -4,6 +4,8 @@
 
 library set_test;
 
+
+import 'package:expect/expect.dart';
 import "dart:collection";
 
 void testMain(Set create()) {
@@ -45,7 +47,6 @@
   set.forEach(testForEach);
   Expect.equals(10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1, sum);
 
-  Expect.isTrue(set.isSubsetOf(set));
   Expect.isTrue(set.containsAll(set));
 
   // Test Set.map.
@@ -96,7 +97,6 @@
   Expect.equals(1 + 3 + 5 + 7 + 9, sum);
 
   Expect.isTrue(set.containsAll(filtered));
-  Expect.isTrue(filtered.isSubsetOf(set));
 
   // Test Set.every.
   testEvery(int val) {
@@ -136,8 +136,6 @@
 
   Expect.isTrue(set.containsAll(intersection));
   Expect.isTrue(filtered.containsAll(intersection));
-  Expect.isTrue(intersection.isSubsetOf(set));
-  Expect.isTrue(intersection.isSubsetOf(filtered));
 
   // Test Set.union.
   Set twice = create()..addAll([0, 2, 4, 6, 8, 10, 12, 14]);
@@ -157,7 +155,7 @@
   Expect.isTrue(twice.difference(thrice).difference(twice).isEmpty);
 
   // Test Set.addAll.
-  List list = new List.fixedLength(10);
+  List list = new List(10);
   for (int i = 0; i < 10; i++) {
     list[i] = i + 10;
   }
diff --git a/tests/corelib/sort_helper.dart b/tests/corelib/sort_helper.dart
index e378097..23f45cf 100644
--- a/tests/corelib/sort_helper.dart
+++ b/tests/corelib/sort_helper.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library sort_helper;
+import "package:expect/expect.dart";
 
 class SortHelper {
 
diff --git a/tests/corelib/sort_test.dart b/tests/corelib/sort_test.dart
index a421e2b..9327363 100644
--- a/tests/corelib/sort_test.dart
+++ b/tests/corelib/sort_test.dart
@@ -4,6 +4,7 @@
 
 // Dart test for sort routines.
 library sort_test;
+import "package:expect/expect.dart";
 import 'sort_helper.dart';
 
 main() {
diff --git a/tests/corelib/splay_tree_test.dart b/tests/corelib/splay_tree_test.dart
index 337cf8c..ae112d4 100644
--- a/tests/corelib/splay_tree_test.dart
+++ b/tests/corelib/splay_tree_test.dart
@@ -4,6 +4,7 @@
 
 // Dart test for Splaytrees.
 library splay_tree_test;
+import "package:expect/expect.dart";
 import 'dart:collection';
 
 
diff --git a/tests/corelib/stopwatch2_test.dart b/tests/corelib/stopwatch2_test.dart
index 25d1120..a95db46 100644
--- a/tests/corelib/stopwatch2_test.dart
+++ b/tests/corelib/stopwatch2_test.dart
@@ -4,6 +4,8 @@
 
 // Dart test program for elapsed getters in stopwatch support.
 
+import "package:expect/expect.dart";
+
 main() {
   Stopwatch sw = new Stopwatch()..start();
   while (sw.elapsedMilliseconds < 2) {
diff --git a/tests/corelib/stopwatch_test.dart b/tests/corelib/stopwatch_test.dart
index 535b495..28ec48b 100644
--- a/tests/corelib/stopwatch_test.dart
+++ b/tests/corelib/stopwatch_test.dart
@@ -5,6 +5,7 @@
 // Dart test program for testing stopwatch support.
 
 library stopwatch_test;
+import "package:expect/expect.dart";
 
 class StopwatchTest {
   static bool checkTicking(Stopwatch sw) {
diff --git a/tests/corelib/string_base_vm_test.dart b/tests/corelib/string_base_vm_test.dart
index 5e6f682..e8922fe9 100644
--- a/tests/corelib/string_base_vm_test.dart
+++ b/tests/corelib/string_base_vm_test.dart
@@ -4,6 +4,7 @@
 // Dart test program for testing class 'StringBase' (currently VM specific).
 
 library string_base_test;
+import "package:expect/expect.dart";
 
 class StringBaseTest {
 
diff --git a/tests/corelib/string_buffer_test.dart b/tests/corelib/string_buffer_test.dart
index 68c5301..093c7ad 100644
--- a/tests/corelib/string_buffer_test.dart
+++ b/tests/corelib/string_buffer_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:expect/expect.dart";
+
 // TODO(srdjan): Move StringBuffer to visible names.
 
 void testConstructor() {
diff --git a/tests/corelib/string_case_test.dart b/tests/corelib/string_case_test.dart
index ba2f07d..6ba535c 100644
--- a/tests/corelib/string_case_test.dart
+++ b/tests/corelib/string_case_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:expect/expect.dart";
+
 class StringCaseTest {
 
   static testMain() {
diff --git a/tests/corelib/string_codeunits_test.dart b/tests/corelib/string_codeunits_test.dart
index 28b9df4..46db21f 100644
--- a/tests/corelib/string_codeunits_test.dart
+++ b/tests/corelib/string_codeunits_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:expect/expect.dart";
+
 main() {
   test(String s) {
     Iterable<int> units = s.codeUnits;
diff --git a/tests/corelib/string_from_list_test.dart b/tests/corelib/string_from_list_test.dart
index e58b677..de6b1f7 100644
--- a/tests/corelib/string_from_list_test.dart
+++ b/tests/corelib/string_from_list_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:expect/expect.dart";
+
 void main() {
   Expect.equals("", new String.fromCharCodes(new List(0)));
   Expect.equals("", new String.fromCharCodes([]));
diff --git a/tests/corelib/string_fromcharcode_test.dart b/tests/corelib/string_fromcharcode_test.dart
index 7f0fd20..c653fa8 100644
--- a/tests/corelib/string_fromcharcode_test.dart
+++ b/tests/corelib/string_fromcharcode_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:expect/expect.dart";
+
 main() {
   Expect.equals("A", new String.fromCharCode(65));
   Expect.equals("B", new String.fromCharCode(66));
diff --git a/tests/corelib/string_pattern_test.dart b/tests/corelib/string_pattern_test.dart
index 6ab5e95..46b4e75 100644
--- a/tests/corelib/string_pattern_test.dart
+++ b/tests/corelib/string_pattern_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for testing String.allMatches.
 
+import "package:expect/expect.dart";
+
 String str = "this is a string with hello here and hello there";
 
 main() {
diff --git a/tests/corelib/string_replace_all_test.dart b/tests/corelib/string_replace_all_test.dart
index ab24657..299d56a 100644
--- a/tests/corelib/string_replace_all_test.dart
+++ b/tests/corelib/string_replace_all_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:expect/expect.dart";
+
 testReplaceAll() {
   Expect.equals(
       "aXXcaXXdae", "abcabdae".replaceAll("b", "XX"));
diff --git a/tests/corelib/string_replace_dollar_test.dart b/tests/corelib/string_replace_dollar_test.dart
index 107821c..6a684f0 100644
--- a/tests/corelib/string_replace_dollar_test.dart
+++ b/tests/corelib/string_replace_dollar_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:expect/expect.dart";
+
 main() {
   String jsText = r"""'$'
 """;
diff --git a/tests/corelib/string_replace_test.dart b/tests/corelib/string_replace_test.dart
index 171af37..136cc96 100644
--- a/tests/corelib/string_replace_test.dart
+++ b/tests/corelib/string_replace_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:expect/expect.dart";
+
 class StringReplaceTest {
   static testMain() {
     Expect.equals(
diff --git a/tests/corelib/string_runes_test.dart b/tests/corelib/string_runes_test.dart
index 9929581..f0dbd54 100644
--- a/tests/corelib/string_runes_test.dart
+++ b/tests/corelib/string_runes_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:expect/expect.dart";
+
 main() {
   test(String s, List<int> expectedRunes) {
     Runes runes = s.runes;
diff --git a/tests/corelib/string_slice_test.dart b/tests/corelib/string_slice_test.dart
index 5f0f4a3..b003a42 100644
--- a/tests/corelib/string_slice_test.dart
+++ b/tests/corelib/string_slice_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:expect/expect.dart";
+
 // Short string.
 var s = "0123456789";
 // Long string.
diff --git a/tests/corelib/string_split_reg_exp_test.dart b/tests/corelib/string_split_reg_exp_test.dart
index bd52cf7..f742128 100644
--- a/tests/corelib/string_split_reg_exp_test.dart
+++ b/tests/corelib/string_split_reg_exp_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:expect/expect.dart";
+
 main() {
   var list = "a b c".split(new RegExp(" "));
   Expect.equals(3, list.length);
diff --git a/tests/corelib/string_split_test.dart b/tests/corelib/string_split_test.dart
index 7cacc7c..9eee525 100644
--- a/tests/corelib/string_split_test.dart
+++ b/tests/corelib/string_split_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:expect/expect.dart";
+
 class StringSplitTest {
   static testMain() {
     var list = "a b c".split(" ");
diff --git a/tests/corelib/string_substring_test.dart b/tests/corelib/string_substring_test.dart
index 0cdac66..7fd9091 100644
--- a/tests/corelib/string_substring_test.dart
+++ b/tests/corelib/string_substring_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:expect/expect.dart";
+
 main() {
   // Test that not providing an optional argument goes to the end.
   Expect.equals("".substring(0), "");
diff --git a/tests/corelib/string_test.dart b/tests/corelib/string_test.dart
index d0879bd..fd73fea 100644
--- a/tests/corelib/string_test.dart
+++ b/tests/corelib/string_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:expect/expect.dart";
+
 // TODO(ngeoffray): test String methods with null arguments.
 class StringTest {
 
diff --git a/tests/corelib/string_trim_test.dart b/tests/corelib/string_trim_test.dart
index ab54484..6049af9 100644
--- a/tests/corelib/string_trim_test.dart
+++ b/tests/corelib/string_trim_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:expect/expect.dart";
+
 class StringTrimTest {
   static testMain() {
     Expect.equals("", " ".trim());
diff --git a/tests/corelib/strings_test.dart b/tests/corelib/strings_test.dart
index 16630f2..11490d2 100644
--- a/tests/corelib/strings_test.dart
+++ b/tests/corelib/strings_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:expect/expect.dart";
+
 // Dart test program for testing class 'Strings'.
 
 class StringsTest {
diff --git a/tests/corelib/symbol_test.dart b/tests/corelib/symbol_test.dart
new file mode 100644
index 0000000..b3604c4
--- /dev/null
+++ b/tests/corelib/symbol_test.dart
@@ -0,0 +1,86 @@
+// 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.
+
+// Basic test of Symbol class.
+
+main() {
+  var x;
+  print(x = const Symbol('fisk'));
+
+  try {
+    print(const Symbol(0)); /// 01: compile-time error
+  } on ArgumentError {
+    print('Caught ArgumentError');
+  } on TypeError {
+    print('Caught TypeError');
+  }
+
+  try {
+    print(const Symbol('0')); /// 02: compile-time error
+  } on ArgumentError catch (e) {
+    print('Caught $e');
+  }
+
+  try {
+    print(const Symbol('_')); /// 03: compile-time error
+  } on ArgumentError catch (e) {
+    print('Caught $e');
+  }
+
+  try {
+    var y = 0;
+    print(new Symbol(y));
+    throw 'Expected an ArgumentError or a TypeError';
+  } on ArgumentError {
+    print('Caught ArgumentError');
+  } on TypeError {
+    print('Caught TypeError');
+  }
+
+  try {
+    print(new Symbol('0'));
+    throw 'Expected an ArgumentError';
+  } on ArgumentError catch (e) {
+    print('Caught $e');
+  }
+
+  try {
+    print(new Symbol('_'));
+    throw 'Expected an ArgumentError';
+  } on ArgumentError catch (e) {
+    print('Caught $e');
+  }
+
+  if (!identical(const Symbol('fisk'), x)) {
+    throw 'Symbol constant is not canonicalized';
+  }
+
+  if (const Symbol('fisk') != x) {
+    throw 'Symbol constant is not equal to itself';
+  }
+
+  if (const Symbol('fisk') != new Symbol('fisk')) {
+    throw 'Symbol constant is not equal to its non-const equivalent';
+  }
+
+  if (new Symbol('fisk') != new Symbol('fisk')) {
+    throw 'new Symbol is not equal to its equivalent';
+  }
+
+  if (new Symbol('fisk') == new Symbol('hest')) {
+    throw 'unrelated Symbols are equal';
+  }
+
+  if (new Symbol('fisk') == new Object()) {
+    throw 'unrelated objects are equal';
+  }
+
+  x.hashCode as int;
+
+  new Symbol('fisk').hashCode as int;
+
+  if (new Symbol('fisk').hashCode != x.hashCode) {
+    throw "non-const Symbol's hashCode not equal to its const equivalent";
+  }
+}
diff --git a/tests/corelib/unicode_test.dart b/tests/corelib/unicode_test.dart
index ea420f9..32cddb5 100644
--- a/tests/corelib/unicode_test.dart
+++ b/tests/corelib/unicode_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:expect/expect.dart";
+
 class UnicodeTest {
 
   static testMain() {
diff --git a/tests/html/canvas_test.dart b/tests/html/canvas_test.dart
index 6d95d3a..f343b32 100644
--- a/tests/html/canvas_test.dart
+++ b/tests/html/canvas_test.dart
@@ -12,7 +12,7 @@
   canvas = new CanvasElement(width:width, height:height);
   document.body.nodes.add(canvas);
 
-  context = canvas.context2d;
+  context = canvas.context2D;
 
   useHtmlConfiguration();
   test('CreateImageData', () {
@@ -30,7 +30,7 @@
 
   test('toDataUrl', () {
     var canvas = new CanvasElement(width: 100, height: 100);
-    var context = canvas.context2d;
+    var context = canvas.context2D;
     context.fillStyle = 'red';
     context.fill();
 
diff --git a/tests/html/canvasrenderingcontext2d_test.dart b/tests/html/canvasrenderingcontext2d_test.dart
index 7e82241..8de0001 100644
--- a/tests/html/canvasrenderingcontext2d_test.dart
+++ b/tests/html/canvasrenderingcontext2d_test.dart
@@ -26,14 +26,14 @@
   canvas.width = 100;
   canvas.height = 100;
 
-  context = canvas.context2d;
+  context = canvas.context2D;
 }
 
 void createOtherCanvas() {
   otherCanvas = new CanvasElement();
   otherCanvas.width = 10;
   otherCanvas.height = 10;
-  otherContext = otherCanvas.context2d;
+  otherContext = otherCanvas.context2D;
   otherContext.fillStyle = "red";
   otherContext.fillRect(0, 0, otherCanvas.width, otherCanvas.height);
 }
diff --git a/tests/html/css_test.dart b/tests/html/css_test.dart
index 13418f3..b335d65 100644
--- a/tests/html/css_test.dart
+++ b/tests/html/css_test.dart
@@ -6,33 +6,16 @@
 main() {
   useHtmlIndividualConfiguration();
 
-  group('supported_CssMatrix', () {
+  group('supportsPointConversions', () {
     test('supported', () {
-      expect(CssMatrix.supported, true);
-    });
-  });
-
-  group('supported_DomPoint', () {
-    test('supported', () {
-      expect(DomPoint.supported, true);
+      expect(Window.supportsPointConversions, true);
     });
   });
 
   group('functional', () {
-    test('CssMatrix', () {
-      var expectation = CssMatrix.supported ? returnsNormally : throws;
-      expect(() {
-        CssMatrix matrix1 = new CssMatrix();
-        expect(matrix1.m11.round(), equals(1));
-        expect(matrix1.m12.round(), isZero);
-
-        CssMatrix matrix2 = new CssMatrix('matrix(1, 0, 0, 1, -835, 0)');
-        expect(matrix2.a.round(), equals(1));
-        expect(matrix2.e.round(), equals(-835));
-      }, expectation);
-    });
     test('DomPoint', () {
-      var expectation = DomPoint.supported ? returnsNormally : throws;
+      var expectation = Window.supportsPointConversions ?
+          returnsNormally : throws;
       expect(() {
         Element element = new Element.tag('div');
         element.attributes['style'] =
@@ -47,10 +30,10 @@
           ''';
         document.body.nodes.add(element);
 
-        DomPoint point = new DomPoint(5, 2);
+        Point point = new Point(5, 2);
         checkPoint(5, 2, point);
         checkPoint(255, 102, window.convertPointFromNodeToPage(element, point));
-        point.y = 100;
+        point = new Point(5, 100);
         checkPoint(5, 100, point);
         checkPoint(255, 200, window.convertPointFromNodeToPage(element, point));
       }, expectation);
@@ -58,7 +41,7 @@
   });
 }
 
-void checkPoint(expectedX, expectedY, DomPoint point) {
+void checkPoint(expectedX, expectedY, Point point) {
   expect(point.x.round(), equals(expectedX), reason: 'Wrong point.x');
   expect(point.y.round(), equals(expectedY), reason: 'Wrong point.y');
 }
diff --git a/tests/html/documentfragment_test.dart b/tests/html/documentfragment_test.dart
index 326fa41..8146e1f 100644
--- a/tests/html/documentfragment_test.dart
+++ b/tests/html/documentfragment_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library DocumentFragmentTest;
+import "package:expect/expect.dart";
 import '../../pkg/unittest/lib/unittest.dart';
 import '../../pkg/unittest/lib/html_config.dart';
 import 'util.dart';
diff --git a/tests/html/element_classes_test.dart b/tests/html/element_classes_test.dart
index f499916c..83bb86c 100644
--- a/tests/html/element_classes_test.dart
+++ b/tests/html/element_classes_test.dart
@@ -150,13 +150,6 @@
     expect(classes, orderedEquals(['baz', 'qux', 'quux']));
   });
 
-  test('isSubsetOf', () {
-    final classes = makeClassSet();
-    expect(classes.isSubsetOf(['foo', 'bar', 'baz'].toSet()), isTrue);
-    expect(classes.isSubsetOf(['foo', 'bar', 'baz', 'qux'].toSet()), isTrue);
-    expect(classes.isSubsetOf(['foo', 'bar', 'qux'].toSet()), isFalse);
-  });
-
   test('containsAll', () {
     final classes = makeClassSet();
     expect(classes.containsAll(['foo', 'baz'].toSet()), isTrue);
diff --git a/tests/html/element_test.dart b/tests/html/element_test.dart
index 53a743c..449a0b8 100644
--- a/tests/html/element_test.dart
+++ b/tests/html/element_test.dart
@@ -616,6 +616,13 @@
   });
 
   group('functional', () {
+    test('toString', () {
+      final elems = makeElementWithChildren().children;
+      expect(elems.toString(), "[br, img, input]");
+      final elem = makeElement().children;
+      expect(elem.toString(), '[]');
+    });
+
     test('scrollIntoView', () {
       var child = new DivElement();
       document.body.append(child);
diff --git a/tests/html/event_customevent_test.dart b/tests/html/event_customevent_test.dart
index 4e0ed48..73ae1d9 100644
--- a/tests/html/event_customevent_test.dart
+++ b/tests/html/event_customevent_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library EventCustomEventTest;
+import "package:expect/expect.dart";
 import '../../pkg/unittest/lib/unittest.dart';
 import '../../pkg/unittest/lib/html_config.dart';
 import 'dart:html';
diff --git a/tests/html/event_test.dart b/tests/html/event_test.dart
index c196e64..df0fe1c 100644
--- a/tests/html/event_test.dart
+++ b/tests/html/event_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library EventTest;
+import "package:expect/expect.dart";
 import '../../pkg/unittest/lib/unittest.dart';
 import '../../pkg/unittest/lib/html_config.dart';
 import 'dart:html';
diff --git a/tests/html/html.status b/tests/html/html.status
index 8d0d460..dde8605 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -59,18 +59,19 @@
 native_gc_test: Fail, Pass # BUG(7774): Untriaged.
 serialized_script_value_test: Fail
 storage_test: Fail, Pass
+transferables_test: Fail # Issue 9846
 websocket_test/websocket: Fail # TODO(efortuna): Issue 7875.
 window_open_test: Skip
 canvasrenderingcontext2d_test/drawImage_video_element: Fail # IE does not support drawImage w/ video element
 canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Fail # IE does not support drawImage w/ video element
+worker_test/functional: Fail # IE uses incorrect security context for Blob URIs.
 
 # IE10 Feature support statuses-
 # All changes should be accompanied by platform support annotation changes.
 audiobuffersourcenode_test/supported: Fail
 audiocontext_test/supported: Fail
 crypto_test/supported: Fail
-css_test/supported_CssMatrix: Fail
-css_test/supported_DomPoint: Fail
+css_test/supportsPointConversions: Fail
 document_test/supports_cssCanvasContext: Fail
 element_types_test/supported_content: Fail
 element_types_test/supported_details: Fail
@@ -130,8 +131,7 @@
 audiocontext_test/supported: Fail
 cache_test/supported: Fail
 crypto_test/supported: Fail
-css_test/supported_CssMatrix: Fail
-css_test/supported_DomPoint: Fail
+css_test/supportsPointConversions: Fail
 document_test/supports_cssCanvasContext: Fail
 element_types_test/supported_content: Fail
 element_types_test/supported_datalist: Fail
@@ -203,6 +203,7 @@
 webgl_1_test/supported: Fail
 websocket_test/supported: Fail
 websql_test/supported: Fail
+worker_test/supported: Fail
 xhr_cross_origin_test/supported: Fail
 xhr_test/supported_HttpRequestProgressEvent: Fail
 xhr_test/supported_onLoadEnd: Fail
@@ -274,8 +275,7 @@
 audiobuffersourcenode_test/supported: Fail
 audiocontext_test/supported: Fail
 crypto_test/supported: Fail
-css_test/supported_CssMatrix: Fail
-css_test/supported_DomPoint: Fail
+css_test/supportsPointConversions: Fail
 document_test/supports_cssCanvasContext: Fail
 indexeddb_1_test/supported: Fail
 indexeddb_1_test/supportsDatabaseNames: Fail
@@ -299,8 +299,7 @@
 audiobuffersourcenode_test/supported: Fail
 audiocontext_test/supported: Fail
 crypto_test/supported: Fail
-css_test/supported_CssMatrix: Fail
-css_test/supported_DomPoint: Fail
+css_test/supportsPointConversions: Fail
 document_test/supports_cssCanvasContext: Fail
 element_types_test/supported_content: Fail
 element_types_test/supported_details: Fail
diff --git a/tests/html/node_test.dart b/tests/html/node_test.dart
index 7b4b17d..b2c8399 100644
--- a/tests/html/node_test.dart
+++ b/tests/html/node_test.dart
@@ -26,6 +26,15 @@
       predicate((x) => x is InputElement, 'is an InputElement');
 
   group('functional', () {
+    test('toString', () {
+      final nodes = makeNodeWithChildren();
+      // TODO(efortuna): Update this test when you have actual toString methods
+      // for the items in the node List as well.
+      expect(nodes.nodes.toString(), "[Foo, br, baz]");
+      final node = makeNode();
+      expect(node.nodes.toString(), '[]');
+    });
+
     test('replaceWith', () {
       final node = makeNodeWithChildren();
       final subnode = node.nodes[1];
diff --git a/tests/html/streams_test.dart b/tests/html/streams_test.dart
index 3d3f16c..b0feb5e 100644
--- a/tests/html/streams_test.dart
+++ b/tests/html/streams_test.dart
@@ -191,7 +191,7 @@
   });
 
   test('reduce', () {
-    stream.reduce(null, (a, b) => null).then((_) {});
+    stream.reduce((a, b) => null).then((_) {});
   });
 
   test('fold', () {
@@ -214,14 +214,6 @@
     stream.length.then((_) {});
   });
 
-  test('min', () {
-    stream.min((a, b) => 0).then((_) {});
-  });
-
-  test('max', () {
-    stream.max((a, b) => 0).then((_) {});
-  });
-
   test('isEmpty', () {
     stream.isEmpty.then((_) {});
   });
diff --git a/tests/html/svg_test.dart b/tests/html/svg_test.dart
index 0c60712..ee327bf 100644
--- a/tests/html/svg_test.dart
+++ b/tests/html/svg_test.dart
@@ -153,7 +153,6 @@
             'is an svg.AnimatedTransformList');
     var isCssStyleDeclaration =
         predicate((x) => x is CssStyleDeclaration, 'is a CssStyleDeclaration');
-    var isCssValue = predicate((x) => x is CssValue, 'is a CssValue');
 
     /// Verifies that [e] supports the operations on the svg.Tests interface.
     checkSvgTests(e) {
diff --git a/tests/html/svgelement_test.dart b/tests/html/svgelement_test.dart
index 52787a2..c5134cf 100644
--- a/tests/html/svgelement_test.dart
+++ b/tests/html/svgelement_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library SvgElementTest;
+import "package:expect/expect.dart";
 import '../../pkg/unittest/lib/unittest.dart';
 import '../../pkg/unittest/lib/html_individual_config.dart';
 import 'dart:html';
@@ -14,7 +15,7 @@
   var isSvgSvgElement =
       predicate((x) => x is svg.SvgSvgElement, 'is a SvgSvgElement');
 
-  Collection<String> _nodeStrings(Collection<Node> input) {
+  List<String> _nodeStrings(Iterable<Node> input) {
     final out = new List<String>();
     for (Node n in input) {
       if (n is Element) {
diff --git a/tests/html/url_test.dart b/tests/html/url_test.dart
index fec1d44..a4d8e4d 100644
--- a/tests/html/url_test.dart
+++ b/tests/html/url_test.dart
@@ -15,7 +15,7 @@
     canvas.width = 100;
     canvas.height = 100;
 
-    var context = canvas.context2d;
+    var context = canvas.context2D;
     context.fillStyle = 'red';
     context.fillRect(0, 0, canvas.width, canvas.height);
 
diff --git a/tests/html/window_nosuchmethod_test.dart b/tests/html/window_nosuchmethod_test.dart
index 7b8c0ef..0027d1e 100644
--- a/tests/html/window_nosuchmethod_test.dart
+++ b/tests/html/window_nosuchmethod_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library WindowNSMETest;
+import "package:expect/expect.dart";
 import '../../pkg/unittest/lib/unittest.dart';
 import '../../pkg/unittest/lib/html_config.dart';
 import 'dart:html' as dom;
diff --git a/tests/html/worker_test.dart b/tests/html/worker_test.dart
new file mode 100644
index 0000000..81b8558
--- /dev/null
+++ b/tests/html/worker_test.dart
@@ -0,0 +1,46 @@
+// 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 worker_test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_individual_config.dart';
+import 'dart:html';
+
+main() {
+  useHtmlIndividualConfiguration();
+
+  group('supported', () {
+    test('supported', () {
+      expect(Worker.supported, isTrue);
+    });
+  });
+
+  var workerScript = '''postMessage('WorkerMessage');''';
+
+  group('functional', () {
+
+    test('unsupported', () {
+      var expectation = Worker.supported ? returnsNormally : throws;
+
+      expect(() {
+        new Worker('worker.js');
+      }, expectation);
+    });
+
+    if (!Worker.supported) {
+      return;
+    }
+
+    test('works', () {
+      // Use Blob to make a local URL so we don't have to have a separate file.
+      var blob = new Blob([workerScript], 'text/javascript');
+      var url = Url.createObjectUrl(blob);
+      var worker = new Worker(url);
+      return worker.onMessage.first.then((e) {
+        expect(e.data, 'WorkerMessage');
+      });
+    });
+  });
+}
+
diff --git a/tests/isolate/global_error_handler2_test.dart b/tests/isolate/global_error_handler2_test.dart
index 7b6e876..72f0d6d 100644
--- a/tests/isolate/global_error_handler2_test.dart
+++ b/tests/isolate/global_error_handler2_test.dart
@@ -4,6 +4,7 @@
 
 library test;
 
+import 'package:expect/expect.dart';
 import 'dart:async';
 import 'dart:isolate';
 
diff --git a/tests/isolate/global_error_handler_stream2_test.dart b/tests/isolate/global_error_handler_stream2_test.dart
index db07be7..ef079d0 100644
--- a/tests/isolate/global_error_handler_stream2_test.dart
+++ b/tests/isolate/global_error_handler_stream2_test.dart
@@ -4,6 +4,7 @@
 
 library test;
 
+import 'package:expect/expect.dart';
 import 'dart:async';
 import 'dart:isolate';
 
diff --git a/tests/isolate/global_error_handler_stream_test.dart b/tests/isolate/global_error_handler_stream_test.dart
index 5c09487..4fcd8bf 100644
--- a/tests/isolate/global_error_handler_stream_test.dart
+++ b/tests/isolate/global_error_handler_stream_test.dart
@@ -19,7 +19,7 @@
   }
 }
 
-void startTest(StreamSink finishSink) {
+void startTest(EventSink finishSink) {
   firstFunction = () { throw new RuntimeError("ignore exception"); };
   finishFunction = () { finishSink.add("done"); finishSink.close(); };
   new Timer(Duration.ZERO, runFunctions);
@@ -36,7 +36,7 @@
 main() {
   var box = new MessageBox();
   var timer;
-  StreamSink otherIsolate = streamSpawnFunction(runTest, globalErrorHandler);
+  EventSink otherIsolate = streamSpawnFunction(runTest, globalErrorHandler);
   otherIsolate.add(box.sink);
   otherIsolate.close();
   box.stream.single.then((msg) {
diff --git a/tests/isolate/illegal_msg_stream_test.dart b/tests/isolate/illegal_msg_stream_test.dart
index 663572b..bcc9135 100644
--- a/tests/isolate/illegal_msg_stream_test.dart
+++ b/tests/isolate/illegal_msg_stream_test.dart
@@ -4,6 +4,7 @@
 
 library test;
 
+import 'package:expect/expect.dart';
 import 'dart:isolate';
 
 funcFoo(x) => x + 2;
diff --git a/tests/isolate/illegal_msg_test.dart b/tests/isolate/illegal_msg_test.dart
index 51b442c..434edc3 100644
--- a/tests/isolate/illegal_msg_test.dart
+++ b/tests/isolate/illegal_msg_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library illegal_msg_tests;
+import "package:expect/expect.dart";
 import 'dart:isolate';
 
 funcFoo(x) => x + 2;
diff --git a/tests/isolate/isolate_negative_test.dart b/tests/isolate/isolate_negative_test.dart
index 5fe9e30..7f753f2 100644
--- a/tests/isolate/isolate_negative_test.dart
+++ b/tests/isolate/isolate_negative_test.dart
@@ -5,6 +5,7 @@
 // Dart test program for testing that isolates are spawned.
 
 library IsolateNegativeTest;
+import "package:expect/expect.dart";
 import 'dart:isolate';
 import '../../pkg/unittest/lib/unittest.dart';
 
diff --git a/tests/isolate/port_test.dart b/tests/isolate/port_test.dart
index 8799af7..1de2c3c 100644
--- a/tests/isolate/port_test.dart
+++ b/tests/isolate/port_test.dart
@@ -7,6 +7,7 @@
 // here. To keep things simple, we don't use the unittest library here.
 
 library PortTest;
+import "package:expect/expect.dart";
 import 'dart:isolate';
 import '../../pkg/unittest/lib/matcher.dart';
 
diff --git a/tests/isolate/serialization_test.dart b/tests/isolate/serialization_test.dart
index c69042d..8a8cc25 100644
--- a/tests/isolate/serialization_test.dart
+++ b/tests/isolate/serialization_test.dart
@@ -9,6 +9,7 @@
 // Serialization test.
 // ---------------------------------------------------------------------------
 library SerializationTest;
+import "package:expect/expect.dart";
 import 'dart:isolate';
 
 main() {
diff --git a/tests/isolate/stream_mangling_test.dart b/tests/isolate/stream_mangling_test.dart
index 824d3ae..232a084 100644
--- a/tests/isolate/stream_mangling_test.dart
+++ b/tests/isolate/stream_mangling_test.dart
@@ -4,6 +4,7 @@
 
 library stream_mangling_test;
 
+import "package:expect/expect.dart";
 import 'dart:isolate';
 import '../../pkg/unittest/lib/unittest.dart';
 
diff --git a/tests/json/json_test.dart b/tests/json/json_test.dart
index 1fe74e5..af68004 100644
--- a/tests/json/json_test.dart
+++ b/tests/json/json_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library json_tests;
+import "package:expect/expect.dart";
 import 'dart:json' as json;
 import 'dart:html';
 import '../../pkg/unittest/lib/unittest.dart';
diff --git a/tests/language/abstract_getter_test.dart b/tests/language/abstract_getter_test.dart
index a745e35..7befb6c 100644
--- a/tests/language/abstract_getter_test.dart
+++ b/tests/language/abstract_getter_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:expect/expect.dart";
+
 // Test to ensure that an abstract getter is not mistaken for a field.
 
 class Foo {
diff --git a/tests/language/abstract_runtime_error_test.dart b/tests/language/abstract_runtime_error_test.dart
index ceb973c..c408ec8 100644
--- a/tests/language/abstract_runtime_error_test.dart
+++ b/tests/language/abstract_runtime_error_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:expect/expect.dart";
+
 // Test various conditions around instantiating an abstract class.
 
 // From The Dart Programming Langauge Specification, 11.11.1 "New":
diff --git a/tests/language/abstract_syntax_test.dart b/tests/language/abstract_syntax_test.dart
index b3f0a20..531b0ef2 100644
--- a/tests/language/abstract_syntax_test.dart
+++ b/tests/language/abstract_syntax_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:expect/expect.dart";
+
 main() {
   var b = new B();
   Expect.equals(42, b.foo());
diff --git a/tests/language/ackermann_test.dart b/tests/language/ackermann_test.dart
index 4d95f810..69fab1b 100644
--- a/tests/language/ackermann_test.dart
+++ b/tests/language/ackermann_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart version of two-argument Ackermann-Peter function.
 
+import "package:expect/expect.dart";
+
 class AckermannTest {
   static ack(m, n) {
     return m == 0 ?
diff --git a/tests/language/adjacent_const_string_literals_test.dart b/tests/language/adjacent_const_string_literals_test.dart
index 6a7eb81..3111c29 100644
--- a/tests/language/adjacent_const_string_literals_test.dart
+++ b/tests/language/adjacent_const_string_literals_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:expect/expect.dart";
+
 
 class Conster {
   const Conster(this.value);
diff --git a/tests/language/adjacent_string_literals_test.dart b/tests/language/adjacent_string_literals_test.dart
index 9c1efcf..dacdc81 100644
--- a/tests/language/adjacent_string_literals_test.dart
+++ b/tests/language/adjacent_string_literals_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:expect/expect.dart";
+
 main() {
   testEmpty();
   testInterpolation();
diff --git a/tests/language/allocate_large_object_test.dart b/tests/language/allocate_large_object_test.dart
index 54347ce..1cd7016 100644
--- a/tests/language/allocate_large_object_test.dart
+++ b/tests/language/allocate_large_object_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:expect/expect.dart";
+
 class A {
   int a;
   double d1;
diff --git a/tests/language/allocate_test.dart b/tests/language/allocate_test.dart
index db62167..1f2fce2 100644
--- a/tests/language/allocate_test.dart
+++ b/tests/language/allocate_test.dart
@@ -1,6 +1,9 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
 class MyAllocate {
   const MyAllocate([int value = 0]) : value_ = value;
   int getValue() { return value_; }
diff --git a/tests/language/argument_definition2_test.dart b/tests/language/argument_definition2_test.dart
index c59b061..cd458f0 100644
--- a/tests/language/argument_definition2_test.dart
+++ b/tests/language/argument_definition2_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:expect/expect.dart";
+
 test1(bool passed, [a = 42]) {
   if (passed) {
     Expect.equals(54, a);
diff --git a/tests/language/argument_definition3_test.dart b/tests/language/argument_definition3_test.dart
index be74835..0f9a125 100644
--- a/tests/language/argument_definition3_test.dart
+++ b/tests/language/argument_definition3_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:expect/expect.dart";
+
 main() {
   new Param.test1(false);
   new Param.test1(true, 42);
diff --git a/tests/language/argument_definition4_test.dart b/tests/language/argument_definition4_test.dart
index f58157f..69ed794 100644
--- a/tests/language/argument_definition4_test.dart
+++ b/tests/language/argument_definition4_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:expect/expect.dart";
+
 test1(bool passed, {a: 42}) {
   if (passed) {
     Expect.equals(54, a);
diff --git a/tests/language/argument_definition5_test.dart b/tests/language/argument_definition5_test.dart
index 331499a..ae8af0a 100644
--- a/tests/language/argument_definition5_test.dart
+++ b/tests/language/argument_definition5_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:expect/expect.dart";
+
 var x = "";
 
 test(String str, [onError(String)]) {
diff --git a/tests/language/argument_definition6_test.dart b/tests/language/argument_definition6_test.dart
index 5dc8748..5ac86b4 100644
--- a/tests/language/argument_definition6_test.dart
+++ b/tests/language/argument_definition6_test.dart
@@ -7,6 +7,7 @@
 // Parameters used to be passed in the wrong order in a constructor in the
 // presence of parameter checks.
 
+import 'package:expect/expect.dart';
 
 class A {
   A(expect1, expect2, value1, value2, {layers, serviceUrl}) {
diff --git a/tests/language/argument_definition_test.dart b/tests/language/argument_definition_test.dart
index 14d7e6d..31d8431d 100644
--- a/tests/language/argument_definition_test.dart
+++ b/tests/language/argument_definition_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing argument definition test.
 
+import "package:expect/expect.dart";
+
 int test(int a, {int b: 2, int c: 3}) {
   int result = 0;
   ?b;
diff --git a/tests/language/arithmetic2_test.dart b/tests/language/arithmetic2_test.dart
index b0715e0..0952f2b 100644
--- a/tests/language/arithmetic2_test.dart
+++ b/tests/language/arithmetic2_test.dart
@@ -4,6 +4,8 @@
 // Dart test program to test arithmetic operations.
 // @static-clean
 
+import "package:expect/expect.dart";
+
 class A {
   static foo() => 499;
 }
diff --git a/tests/language/arithmetic_canonicalization_test.dart b/tests/language/arithmetic_canonicalization_test.dart
index cf87e9e..cc0f795 100644
--- a/tests/language/arithmetic_canonicalization_test.dart
+++ b/tests/language/arithmetic_canonicalization_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test canonicalization of simple arithmetic equivalences.
 
+import "package:expect/expect.dart";
+
 main() {
   for (var i = 0; i < 5000; i++) {
     Expect.isTrue(mul1double(i) is double);
diff --git a/tests/language/arithmetic_test.dart b/tests/language/arithmetic_test.dart
index f6abde7..e28ab716 100644
--- a/tests/language/arithmetic_test.dart
+++ b/tests/language/arithmetic_test.dart
@@ -4,6 +4,7 @@
 // Dart test program to test arithmetic operations.
 
 library arithmetic_test;
+import "package:expect/expect.dart";
 import 'dart:math';
 
 class ArithmeticTest {
diff --git a/tests/language/assertion_test.dart b/tests/language/assertion_test.dart
index 8761bd6..68bdf04 100644
--- a/tests/language/assertion_test.dart
+++ b/tests/language/assertion_test.dart
@@ -5,6 +5,8 @@
 //
 // Dart test program testing assert statements.
 
+import "package:expect/expect.dart";
+
 class AssertionTest {
   static testTrue() {
     int i = 0;
diff --git a/tests/language/assign_op_test.dart b/tests/language/assign_op_test.dart
index 440eaa8..00378c7 100644
--- a/tests/language/assign_op_test.dart
+++ b/tests/language/assign_op_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing assign operators.
 
+import "package:expect/expect.dart";
+
 
 class AssignOpTest {
   AssignOpTest() {}
diff --git a/tests/language/assign_top_method_test.dart b/tests/language/assign_top_method_test.dart
index eb85481..923d9e0 100644
--- a/tests/language/assign_top_method_test.dart
+++ b/tests/language/assign_top_method_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:expect/expect.dart";
+
 method() { return 0; }
 
 main() {
diff --git a/tests/language/bad_initializer2_negative_test.dart b/tests/language/bad_initializer2_negative_test.dart
index c554002..3f0fce0 100644
--- a/tests/language/bad_initializer2_negative_test.dart
+++ b/tests/language/bad_initializer2_negative_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Variable initializer must not reference the initialized variable.
 
+import "package:expect/expect.dart";
+
 class BadInitializer2NegativeTest {
   static testMain() {
    var foo = (int n) {
diff --git a/tests/language/bad_named_parameters2_test.dart b/tests/language/bad_named_parameters2_test.dart
index 03450a1..1d0a273 100644
--- a/tests/language/bad_named_parameters2_test.dart
+++ b/tests/language/bad_named_parameters2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing bad named parameters.
 
+import "package:expect/expect.dart";
+
 
 class BadNamedParameters2Test {
 
diff --git a/tests/language/bad_named_parameters_test.dart b/tests/language/bad_named_parameters_test.dart
index 99a82b8..bbe9b28 100644
--- a/tests/language/bad_named_parameters_test.dart
+++ b/tests/language/bad_named_parameters_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing bad named parameters.
 
+import "package:expect/expect.dart";
+
 
 class BadNamedParametersTest {
 
diff --git a/tests/language/bailout2_test.dart b/tests/language/bailout2_test.dart
index 085c1d8..4a2b5607 100644
--- a/tests/language/bailout2_test.dart
+++ b/tests/language/bailout2_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:expect/expect.dart";
+
 var a;
 
 main() {
diff --git a/tests/language/bailout3_test.dart b/tests/language/bailout3_test.dart
index 16cc121..ca8441e 100644
--- a/tests/language/bailout3_test.dart
+++ b/tests/language/bailout3_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:expect/expect.dart";
+
 // Test that the return type of a method is being registered for both
 // its bailout and optimized version in dart2js.
 
diff --git a/tests/language/bailout4_test.dart b/tests/language/bailout4_test.dart
index 52e9713..54c2f3f 100644
--- a/tests/language/bailout4_test.dart
+++ b/tests/language/bailout4_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:expect/expect.dart";
+
 // Test that dart2s computes the right bailout environment in presence
 // of nested loops.
 
diff --git a/tests/language/bailout5_test.dart b/tests/language/bailout5_test.dart
index 157e1ca..fee2b81 100644
--- a/tests/language/bailout5_test.dart
+++ b/tests/language/bailout5_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:expect/expect.dart";
+
 // Test to make sure the bailout environment in dart2js is correct.
 
 var global;
diff --git a/tests/language/bailout6_test.dart b/tests/language/bailout6_test.dart
index 5227f65..38b84db 100644
--- a/tests/language/bailout6_test.dart
+++ b/tests/language/bailout6_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:expect/expect.dart";
+
 // Test for dart2js to make sure the computed bailout environment is
 // correct.
 
diff --git a/tests/language/bailout7_test.dart b/tests/language/bailout7_test.dart
index e61d688..033a47a 100644
--- a/tests/language/bailout7_test.dart
+++ b/tests/language/bailout7_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:expect/expect.dart";
+
 // Test to make sure the do/while loop exit condition is generated.
 
 var global;
diff --git a/tests/language/bailout_test.dart b/tests/language/bailout_test.dart
index e5e5653..a88780d 100644
--- a/tests/language/bailout_test.dart
+++ b/tests/language/bailout_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:expect/expect.dart";
+
 // Test that a call to a bailout method in dart2js resolves to the
 // right method.
 
diff --git a/tests/language/bind_test.dart b/tests/language/bind_test.dart
index e73f68e..3617af3 100644
--- a/tests/language/bind_test.dart
+++ b/tests/language/bind_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:expect/expect.dart";
+
 class Bound {
   run() {
     return 42;
diff --git a/tests/language/bit_operations_test.dart b/tests/language/bit_operations_test.dart
index a28b9ab..f4d58dd 100644
--- a/tests/language/bit_operations_test.dart
+++ b/tests/language/bit_operations_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for testing bitwise operations.
 
+import "package:expect/expect.dart";
+
 class BitOperationsTest {
   static testMain() {
     for (int i = 0; i < 4; i++) {
diff --git a/tests/language/bit_shift_test.dart b/tests/language/bit_shift_test.dart
index edbd1eb..3032736 100644
--- a/tests/language/bit_shift_test.dart
+++ b/tests/language/bit_shift_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:expect/expect.dart";
+
 constants() {
   Expect.equals(0, 499 >> 33);
   Expect.equals(0, (499 << 33) & 0xFFFFFFFF);
diff --git a/tests/language/block_scope_test.dart b/tests/language/block_scope_test.dart
index 6ae0495..cc19981 100644
--- a/tests/language/block_scope_test.dart
+++ b/tests/language/block_scope_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:expect/expect.dart";
+
 foo() => 123;
 
 void testShadowingScope1() {
diff --git a/tests/language/bool_test.dart b/tests/language/bool_test.dart
index 6f1e562..4015c18 100644
--- a/tests/language/bool_test.dart
+++ b/tests/language/bool_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:expect/expect.dart";
+
 // Dart test program for testing basic boolean properties.
 // @static-clean
 
diff --git a/tests/language/branch_canonicalization_test.dart b/tests/language/branch_canonicalization_test.dart
index 0735076..a317d42 100644
--- a/tests/language/branch_canonicalization_test.dart
+++ b/tests/language/branch_canonicalization_test.dart
@@ -5,6 +5,8 @@
 // Test that branch fusion correctly sets branch environment for comparisons
 // that require unboxing and does not fuse branches that can deoptimize.
 
+import "package:expect/expect.dart";
+
 var sideEffect = true;
 
 barDouble(a, b) {
diff --git a/tests/language/branches_test.dart b/tests/language/branches_test.dart
index d893cbc..31fee90 100644
--- a/tests/language/branches_test.dart
+++ b/tests/language/branches_test.dart
@@ -4,6 +4,8 @@
 // Dart test for branches. Make sure that shortcuts work, even if they have
 // to jump over several expressions.
 
+import "package:expect/expect.dart";
+
 class BranchesTest {
   static bool f() {
     Expect.equals("Never reached", 0);
diff --git a/tests/language/break_test.dart b/tests/language/break_test.dart
index 68cd63c..672ffff 100644
--- a/tests/language/break_test.dart
+++ b/tests/language/break_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for breaks in for, do/while and while loops.
 
+import "package:expect/expect.dart";
+
 class BreakTest {
   static testMain() {
     int i;
diff --git a/tests/language/built_in_identifier_prefix_test.dart b/tests/language/built_in_identifier_prefix_test.dart
index cb08c87..de995c9 100644
--- a/tests/language/built_in_identifier_prefix_test.dart
+++ b/tests/language/built_in_identifier_prefix_test.dart
@@ -26,6 +26,7 @@
 // abstract<dynamic> foo;" is not illegal because "abstract" is used
 // as a typeName.
 
+import "package:expect/expect.dart";
 import 'built_in_identifier_prefix_library_abstract.dart' as abstract;
 import 'built_in_identifier_prefix_library_as.dart' as as;
 import 'built_in_identifier_prefix_library_dynamic.dart' as dynamic;
diff --git a/tests/language/call_constructor_on_unresolvable_class_test.dart b/tests/language/call_constructor_on_unresolvable_class_test.dart
index 4c0ab7f..9e02d7d 100644
--- a/tests/language/call_constructor_on_unresolvable_class_test.dart
+++ b/tests/language/call_constructor_on_unresolvable_class_test.dart
@@ -5,6 +5,7 @@
 // Check that calling a constructor of a class that cannot be resolved causes
 // a runtime error.
 
+import "package:expect/expect.dart";
 import 'dart:math';
 
 never() {
diff --git a/tests/language/call_nonexistent_constructor_test.dart b/tests/language/call_nonexistent_constructor_test.dart
index 5e3bdf4..1e661a7 100644
--- a/tests/language/call_nonexistent_constructor_test.dart
+++ b/tests/language/call_nonexistent_constructor_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:expect/expect.dart";
+
 // When attempting to call a nonexistent constructor, check that a
 // NoSuchMethodError is thrown.
 
diff --git a/tests/language/call_nonexistent_static_test.dart b/tests/language/call_nonexistent_static_test.dart
index f114be9..dd2835f 100644
--- a/tests/language/call_nonexistent_static_test.dart
+++ b/tests/language/call_nonexistent_static_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:expect/expect.dart";
+
 // When attempting to call a nonexistent static method, getter or setter, check
 // that a NoSuchMethodError is thrown.
 
diff --git a/tests/language/call_operator_test.dart b/tests/language/call_operator_test.dart
index c3e2858..ecaefb5 100644
--- a/tests/language/call_operator_test.dart
+++ b/tests/language/call_operator_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:expect/expect.dart";
+
 
 // simple test with no types in signature
 class A1 {
diff --git a/tests/language/call_property_test.dart b/tests/language/call_property_test.dart
index 27a658d..fbab146 100644
--- a/tests/language/call_property_test.dart
+++ b/tests/language/call_property_test.dart
@@ -5,6 +5,8 @@
 // Test that a class with a [call] property does not implement [Function] or
 // a typedef of function type.
 
+import 'package:expect/expect.dart';
+
 class Call {
   int get call => 0;
 }
diff --git a/tests/language/call_test.dart b/tests/language/call_test.dart
index 6e87507..bd6d24f 100644
--- a/tests/language/call_test.dart
+++ b/tests/language/call_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:expect/expect.dart";
+
 main() {
   bar(a) {
     return a is String;
diff --git a/tests/language/call_this_test.dart b/tests/language/call_this_test.dart
new file mode 100644
index 0000000..55e7ccd
--- /dev/null
+++ b/tests/language/call_this_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that dart2js treats [:this():] as a closure send.
+
+import "package:expect/expect.dart";
+
+class A {
+  call() => 42;
+  test1() => this();
+  test2() => (this)();
+}
+
+main() {
+  Expect.equals(42, (new A()).test1());
+  Expect.equals(42, (new A()).test2());
+}
diff --git a/tests/language/call_through_getter_test.dart b/tests/language/call_through_getter_test.dart
index fc24d4d..79ad94eff 100644
--- a/tests/language/call_through_getter_test.dart
+++ b/tests/language/call_through_getter_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:expect/expect.dart";
+
 // Tests that we can call functions through getters.
 
 const TOP_LEVEL_CONST = 1;
diff --git a/tests/language/call_through_null_getter_test.dart b/tests/language/call_through_null_getter_test.dart
index 24edb03..6ef59ed 100644
--- a/tests/language/call_through_null_getter_test.dart
+++ b/tests/language/call_through_null_getter_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:expect/expect.dart";
+
 // Tests that we can call functions through getters which return null.
 
 const TOP_LEVEL_NULL = null;
diff --git a/tests/language/canonical_const2_test.dart b/tests/language/canonical_const2_test.dart
index 3508885..25a350e 100644
--- a/tests/language/canonical_const2_test.dart
+++ b/tests/language/canonical_const2_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:expect/expect.dart";
+
 // Check that compile-time constants are correctly canonicalized.
 
 main() {
diff --git a/tests/language/canonical_const_test.dart b/tests/language/canonical_const_test.dart
index 4c91baa..8a04a3f 100644
--- a/tests/language/canonical_const_test.dart
+++ b/tests/language/canonical_const_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Check that initializers of static const fields are compile time constants.
 
+import "package:expect/expect.dart";
+
 class CanonicalConstTest {
   static const A = const C1();
   static const B = const C2();
diff --git a/tests/language/cascade_2_test.dart b/tests/language/cascade_2_test.dart
index 2675f61..4e5cdbc 100644
--- a/tests/language/cascade_2_test.dart
+++ b/tests/language/cascade_2_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:expect/expect.dart";
+
 // Test cascades, issues 7494 (vm), 7689 (dart2js).
 
 main() {
diff --git a/tests/language/cascade_in_expression_function_test.dart b/tests/language/cascade_in_expression_function_test.dart
index 2c5852f..5c8c83d 100644
--- a/tests/language/cascade_in_expression_function_test.dart
+++ b/tests/language/cascade_in_expression_function_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing throw statement
 
+import "package:expect/expect.dart";
+
 makeMap() => new Map()..[3] = 4 ..[0] = 11;
 
 class MyClass {
diff --git a/tests/language/cascade_in_initializer_list_test.dart b/tests/language/cascade_in_initializer_list_test.dart
index 99f2261..8e7e9ee 100644
--- a/tests/language/cascade_in_initializer_list_test.dart
+++ b/tests/language/cascade_in_initializer_list_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:expect/expect.dart";
+
 class A {
   foo() {}
   bar() {}
diff --git a/tests/language/cascade_precedence_test.dart b/tests/language/cascade_precedence_test.dart
index de39f02..acbb373 100644
--- a/tests/language/cascade_precedence_test.dart
+++ b/tests/language/cascade_precedence_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:expect/expect.dart";
+
 
 class A {
   int value;
diff --git a/tests/language/cascade_test.dart b/tests/language/cascade_test.dart
index c962fda..757ad22 100644
--- a/tests/language/cascade_test.dart
+++ b/tests/language/cascade_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:expect/expect.dart";
+
 // Test cascades.
 
 class A {
diff --git a/tests/language/cast_test.dart b/tests/language/cast_test.dart
index 6b8eaba..39d7f04 100644
--- a/tests/language/cast_test.dart
+++ b/tests/language/cast_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for constructors and initializers.
 
+import "package:expect/expect.dart";
+
 // Test 'expression as Type' casts.
 
 class C {
diff --git a/tests/language/char_escape_test.dart b/tests/language/char_escape_test.dart
index 23c95ca..7b87fbe 100644
--- a/tests/language/char_escape_test.dart
+++ b/tests/language/char_escape_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for reading escape sequences in string literals
 
+import "package:expect/expect.dart";
+
 class CharEscapeTest {
   static testMain() {
     var x00 = "\x00";
diff --git a/tests/language/checked_null_test.dart b/tests/language/checked_null_test.dart
index cd95d61..0f2a200f 100644
--- a/tests/language/checked_null_test.dart
+++ b/tests/language/checked_null_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:expect/expect.dart";
+
 class A {
   Map a;
   Comparator b;
diff --git a/tests/language/class_codegen_test.dart b/tests/language/class_codegen_test.dart
index 1b1c738..bfec70f 100644
--- a/tests/language/class_codegen_test.dart
+++ b/tests/language/class_codegen_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:expect/expect.dart";
+
 class A {
   A() : x = 3;
   foo() => x;
diff --git a/tests/language/class_cycle_test.dart b/tests/language/class_cycle_test.dart
index e41181e..4c8a382 100644
--- a/tests/language/class_cycle_test.dart
+++ b/tests/language/class_cycle_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Check fail because of cycles in super class relationship.
 
+import "package:expect/expect.dart";
+
 class Foo implements Bar {
 }
 
diff --git a/tests/language/class_literal_test.dart b/tests/language/class_literal_test.dart
index 21bc0fc..246f99c 100644
--- a/tests/language/class_literal_test.dart
+++ b/tests/language/class_literal_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:expect/expect.dart";
+
 // Test class literal expressions.
 
 class Class {
diff --git a/tests/language/class_test.dart b/tests/language/class_test.dart
index 10a00f5..7a03fb1 100644
--- a/tests/language/class_test.dart
+++ b/tests/language/class_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:expect/expect.dart";
+
 // Tests basic classes and methods.
 class ClassTest {
   ClassTest() {}
diff --git a/tests/language/closure2_test.dart b/tests/language/closure2_test.dart
index b600518..bf3cf01 100644
--- a/tests/language/closure2_test.dart
+++ b/tests/language/closure2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for closures.
 
+import "package:expect/expect.dart";
+
 bounce(fn) {
   return fn();
 }
diff --git a/tests/language/closure3_test.dart b/tests/language/closure3_test.dart
index c01bfc1..358a78a 100644
--- a/tests/language/closure3_test.dart
+++ b/tests/language/closure3_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:expect/expect.dart";
+
 // Test that a NoSuchMethodError is thrown even when an expression
 // seems to be free of side-effects.
 
diff --git a/tests/language/closure4_test.dart b/tests/language/closure4_test.dart
index abc8bb1..a1b0996 100644
--- a/tests/language/closure4_test.dart
+++ b/tests/language/closure4_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:expect/expect.dart";
+
 // Dart2js failed when a declared function was captured inside itself.
 
 foo(f) => f(499);
diff --git a/tests/language/closure5_test.dart b/tests/language/closure5_test.dart
index 5aebb1e..4ce0744 100644
--- a/tests/language/closure5_test.dart
+++ b/tests/language/closure5_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:expect/expect.dart";
+
 // Dart2js failed when a declared function was captured inside itself.
 
 foo(f) => f(499);
diff --git a/tests/language/closure6_test.dart b/tests/language/closure6_test.dart
index e88852b..774aa0d 100644
--- a/tests/language/closure6_test.dart
+++ b/tests/language/closure6_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:expect/expect.dart";
+
 // Test that captured final variables are correctly mangled.
 
 class A {
diff --git a/tests/language/closure7_test.dart b/tests/language/closure7_test.dart
index 491cb20..58c7131 100644
--- a/tests/language/closure7_test.dart
+++ b/tests/language/closure7_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:expect/expect.dart";
+
 // Test that implicitly bound closures work correctly
 
 class A {
diff --git a/tests/language/closure_break1_test.dart b/tests/language/closure_break1_test.dart
index 5f5ead7..e1fdcac 100644
--- a/tests/language/closure_break1_test.dart
+++ b/tests/language/closure_break1_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for closures.
 
+import "package:expect/expect.dart";
+
 class ClosureBreak1 {
   ClosureBreak1(this.field);
   int field;
diff --git a/tests/language/closure_break2_test.dart b/tests/language/closure_break2_test.dart
index 38b1c85..5f05890 100644
--- a/tests/language/closure_break2_test.dart
+++ b/tests/language/closure_break2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for closures.
 
+import "package:expect/expect.dart";
+
 class ClosureBreak2 {
   ClosureBreak2(this.field);
   int field;
diff --git a/tests/language/closure_break_test.dart b/tests/language/closure_break_test.dart
index 0aca644..e21717b 100644
--- a/tests/language/closure_break_test.dart
+++ b/tests/language/closure_break_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for closures.
 
+import "package:expect/expect.dart";
+
 class ClosureBreak {
   ClosureBreak(this.field);
   int field;
diff --git a/tests/language/closure_in_constructor_test.dart b/tests/language/closure_in_constructor_test.dart
index d8fc8d3..1975cdc 100644
--- a/tests/language/closure_in_constructor_test.dart
+++ b/tests/language/closure_in_constructor_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:expect/expect.dart";
+
 class A<T> {
   var closure;
 
diff --git a/tests/language/closure_in_field_initializer_test.dart b/tests/language/closure_in_field_initializer_test.dart
index 88ca236..bf0198a 100644
--- a/tests/language/closure_in_field_initializer_test.dart
+++ b/tests/language/closure_in_field_initializer_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:expect/expect.dart";
+
 class Foo {
   var closures = {
     'a': (x, y) => x + y
diff --git a/tests/language/closure_in_initializer2_test.dart b/tests/language/closure_in_initializer2_test.dart
index 3c1e1bd..b44b0c7 100644
--- a/tests/language/closure_in_initializer2_test.dart
+++ b/tests/language/closure_in_initializer2_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:expect/expect.dart";
+
 class S {
   S() {
     Expect.equals(2, this.f());
diff --git a/tests/language/closure_in_initializer_test.dart b/tests/language/closure_in_initializer_test.dart
index 607553c..04f1033 100644
--- a/tests/language/closure_in_initializer_test.dart
+++ b/tests/language/closure_in_initializer_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:expect/expect.dart";
+
 class A {
   var f;
   var g;
diff --git a/tests/language/closure_parameter_types_test.dart b/tests/language/closure_parameter_types_test.dart
index a9fa956..2c1f7bc 100644
--- a/tests/language/closure_parameter_types_test.dart
+++ b/tests/language/closure_parameter_types_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:expect/expect.dart";
+
 // Regression test for dart2js, where the optimizer was too agressive
 // about parameter types of closures.
 
diff --git a/tests/language/closure_shared_state_test.dart b/tests/language/closure_shared_state_test.dart
index 99dda76..8a063a1 100644
--- a/tests/language/closure_shared_state_test.dart
+++ b/tests/language/closure_shared_state_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:expect/expect.dart";
+
 // Tests for closures sharing mutable bindings.
 
 var f;
diff --git a/tests/language/closure_test.dart b/tests/language/closure_test.dart
index 0d7220b..9dc3a90 100644
--- a/tests/language/closure_test.dart
+++ b/tests/language/closure_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for closures.
 
+import "package:expect/expect.dart";
+
 class A {
   var field;
   A(this.field) {}
diff --git a/tests/language/closure_type_test.dart b/tests/language/closure_type_test.dart
index 8908de7..59d11de 100644
--- a/tests/language/closure_type_test.dart
+++ b/tests/language/closure_type_test.dart
@@ -5,6 +5,7 @@
 // time.
 
 library closure_type_test;
+import "package:expect/expect.dart";
 import 'dart:math' as math;
 
 class Math {
diff --git a/tests/language/closure_type_variable_test.dart b/tests/language/closure_type_variable_test.dart
index 4f73267..2ed61c2 100644
--- a/tests/language/closure_type_variable_test.dart
+++ b/tests/language/closure_type_variable_test.dart
@@ -4,6 +4,8 @@
 
 // Test that the type argument is available inside a closure.
 
+import "package:expect/expect.dart";
+
 class A<T> {
   foo() {
     bar() => T;
diff --git a/tests/language/closure_type_variables_test.dart b/tests/language/closure_type_variables_test.dart
index f870588..79c6703 100644
--- a/tests/language/closure_type_variables_test.dart
+++ b/tests/language/closure_type_variables_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:expect/expect.dart";
+
 // Test that type variables are available in closures.
 
 class A<T> {
diff --git a/tests/language/closure_with_super_field_test.dart b/tests/language/closure_with_super_field_test.dart
index ff64fa2..67f75d1 100644
--- a/tests/language/closure_with_super_field_test.dart
+++ b/tests/language/closure_with_super_field_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:expect/expect.dart";
+
 class A {
   int a;
   A(): a = 42;
diff --git a/tests/language/closure_with_super_send_test.dart b/tests/language/closure_with_super_send_test.dart
index 7e86616..bcaae49 100644
--- a/tests/language/closure_with_super_send_test.dart
+++ b/tests/language/closure_with_super_send_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:expect/expect.dart";
+
 // Test a closurized super send.
 
 class Super {
diff --git a/tests/language/closures_with_complex_params_test.dart b/tests/language/closures_with_complex_params_test.dart
index 8e1ddc7..bf20e49 100644
--- a/tests/language/closures_with_complex_params_test.dart
+++ b/tests/language/closures_with_complex_params_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:expect/expect.dart";
+
 // Tests for parsing closures with complex parameter types.
 
 main() {
diff --git a/tests/language/code_after_try_is_executed_test.dart b/tests/language/code_after_try_is_executed_test.dart
index 76ccbf6..010cc6a 100644
--- a/tests/language/code_after_try_is_executed_test.dart
+++ b/tests/language/code_after_try_is_executed_test.dart
@@ -5,6 +5,8 @@
 // test cannot use Expect.throws, because Expect.throws uses the same
 // pattern.
 
+import "package:expect/expect.dart";
+
 main() {
   var exception;
   try {
diff --git a/tests/language/comparison_test.dart b/tests/language/comparison_test.dart
index 4a19920..2df0fd5 100644
--- a/tests/language/comparison_test.dart
+++ b/tests/language/comparison_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing comparison operators.
 
+import "package:expect/expect.dart";
+
 class Helper {
   static bool STRICT_EQ(a, b) {
     return identical(a, b);
diff --git a/tests/language/compile_time_constant10_test.dart b/tests/language/compile_time_constant10_test.dart
index 5902fd2..a2d1a02 100644
--- a/tests/language/compile_time_constant10_test.dart
+++ b/tests/language/compile_time_constant10_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:expect/expect.dart";
+
 // Test that 'identical(a,b)' is a compile-time constant.
 
 class C {
diff --git a/tests/language/compile_time_constant2_test.dart b/tests/language/compile_time_constant2_test.dart
index 1df0b92..132a93b 100644
--- a/tests/language/compile_time_constant2_test.dart
+++ b/tests/language/compile_time_constant2_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:expect/expect.dart";
+
 const x = 19;
 const y = 3;
 const z = -5;
diff --git a/tests/language/compile_time_constant3_test.dart b/tests/language/compile_time_constant3_test.dart
index 1c14c80..1723086 100644
--- a/tests/language/compile_time_constant3_test.dart
+++ b/tests/language/compile_time_constant3_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:expect/expect.dart";
+
 const x = 19.5;
 const y = 3.3;
 const g1 = x + y;
diff --git a/tests/language/compile_time_constant5_test.dart b/tests/language/compile_time_constant5_test.dart
index 8357a48..5136b29 100644
--- a/tests/language/compile_time_constant5_test.dart
+++ b/tests/language/compile_time_constant5_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:expect/expect.dart";
+
 const x = true;
 const g1 = !true;
 const g2 = !g1;
diff --git a/tests/language/compile_time_constant6_test.dart b/tests/language/compile_time_constant6_test.dart
index 38c8729..b30b2b6 100644
--- a/tests/language/compile_time_constant6_test.dart
+++ b/tests/language/compile_time_constant6_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:expect/expect.dart";
+
 const g1 = true;
 const g2 = 499;
 const g3 = "foo";
diff --git a/tests/language/compile_time_constant7_test.dart b/tests/language/compile_time_constant7_test.dart
index 25bf20d..4780b47 100644
--- a/tests/language/compile_time_constant7_test.dart
+++ b/tests/language/compile_time_constant7_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:expect/expect.dart";
+
 class A {
   const A();
   toString() => "a";
diff --git a/tests/language/compile_time_constant8_test.dart b/tests/language/compile_time_constant8_test.dart
index f82c158..e39d7f2 100644
--- a/tests/language/compile_time_constant8_test.dart
+++ b/tests/language/compile_time_constant8_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:expect/expect.dart";
+
 class A<T> {
   const A();
   toString() => "a";
diff --git a/tests/language/compile_time_constant9_test.dart b/tests/language/compile_time_constant9_test.dart
index 0b0b082..96cf41a 100644
--- a/tests/language/compile_time_constant9_test.dart
+++ b/tests/language/compile_time_constant9_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:expect/expect.dart";
+
 class B {
   const B();
 }
diff --git a/tests/language/compile_time_constant_a_test.dart b/tests/language/compile_time_constant_a_test.dart
index 73ff7de..576939f 100644
--- a/tests/language/compile_time_constant_a_test.dart
+++ b/tests/language/compile_time_constant_a_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:expect/expect.dart";
+
 const m1 = const { 'a': 400 + 99 };
 const m2 = const { 'a': 499, 'b': 42 };
 const m3 = const { 'm1': m1, 'm2': m2 };
diff --git a/tests/language/compile_time_constant_b_test.dart b/tests/language/compile_time_constant_b_test.dart
index 49e48f9..212dd2f 100644
--- a/tests/language/compile_time_constant_b_test.dart
+++ b/tests/language/compile_time_constant_b_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:expect/expect.dart";
+
 const m1 = const { '__proto__': 400 + 99 };
 const m2 = const { 'a': 499, 'b': 42 };
 const m3 = const { '__proto__': 499 };
diff --git a/tests/language/compile_time_constant_d_test.dart b/tests/language/compile_time_constant_d_test.dart
index 6695fbe..e56415f 100644
--- a/tests/language/compile_time_constant_d_test.dart
+++ b/tests/language/compile_time_constant_d_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:expect/expect.dart";
+
 class A {
   final x;
   final y;
diff --git a/tests/language/compile_time_constant_e_test.dart b/tests/language/compile_time_constant_e_test.dart
index 48fd9e2..9a91f3c 100644
--- a/tests/language/compile_time_constant_e_test.dart
+++ b/tests/language/compile_time_constant_e_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:expect/expect.dart";
+
 class A {
   final x;
   final y;
diff --git a/tests/language/compile_time_constant_f_test.dart b/tests/language/compile_time_constant_f_test.dart
index 7684178..21c215e 100644
--- a/tests/language/compile_time_constant_f_test.dart
+++ b/tests/language/compile_time_constant_f_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:expect/expect.dart";
+
 class A {
   final x;
   const A(this.x);
diff --git a/tests/language/compile_time_constant_g_test.dart b/tests/language/compile_time_constant_g_test.dart
index 469aa62..1be8936 100644
--- a/tests/language/compile_time_constant_g_test.dart
+++ b/tests/language/compile_time_constant_g_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:expect/expect.dart";
+
 class A {
   final x;
   const A(this.x);
diff --git a/tests/language/compile_time_constant_h_test.dart b/tests/language/compile_time_constant_h_test.dart
index 9c3bd98..3409882 100644
--- a/tests/language/compile_time_constant_h_test.dart
+++ b/tests/language/compile_time_constant_h_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:expect/expect.dart";
+
 class A implements B {
   final x;
   const A(this.x);
diff --git a/tests/language/compile_time_constant_i_test.dart b/tests/language/compile_time_constant_i_test.dart
index c3d3939..7095598 100644
--- a/tests/language/compile_time_constant_i_test.dart
+++ b/tests/language/compile_time_constant_i_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:expect/expect.dart";
+
 class A {
   final x;
   const A(this.x);
diff --git a/tests/language/compile_time_constant_j_test.dart b/tests/language/compile_time_constant_j_test.dart
index 9715662..8a5ed24 100644
--- a/tests/language/compile_time_constant_j_test.dart
+++ b/tests/language/compile_time_constant_j_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:expect/expect.dart";
+
 class A {
   final field;
   const A() : field = 499;
diff --git a/tests/language/compile_time_constant_k_test.dart b/tests/language/compile_time_constant_k_test.dart
index 2071587..f4260a3 100644
--- a/tests/language/compile_time_constant_k_test.dart
+++ b/tests/language/compile_time_constant_k_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:expect/expect.dart";
+
 const x = const { 'a': 3, 'a': 4 };
 const y = const { 'a': 10, 'b': 11, 'a': 12, 'b': 13, 'a': 14 };
 const z = const { '__proto__': 496,
diff --git a/tests/language/compile_time_constant_l_test.dart b/tests/language/compile_time_constant_l_test.dart
index d8f8a86..1f6bc50 100644
--- a/tests/language/compile_time_constant_l_test.dart
+++ b/tests/language/compile_time_constant_l_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:expect/expect.dart";
+
 class A {
   final x;
   const A([x = 499]) : this.x = x;
diff --git a/tests/language/compile_time_constant_m_test.dart b/tests/language/compile_time_constant_m_test.dart
index b43eb82..0ae096ea 100644
--- a/tests/language/compile_time_constant_m_test.dart
+++ b/tests/language/compile_time_constant_m_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:expect/expect.dart";
+
 class A {
   const A();
   foo([x = const A()]) => x;
diff --git a/tests/language/compile_time_constant_n_test.dart b/tests/language/compile_time_constant_n_test.dart
index af2c5f1..3f621b2 100644
--- a/tests/language/compile_time_constant_n_test.dart
+++ b/tests/language/compile_time_constant_n_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:expect/expect.dart";
+
 class A {
   const A();
   operator ==(x) => x == 499;
diff --git a/tests/language/compile_time_constant_o_test.dart b/tests/language/compile_time_constant_o_test.dart
index 8fc4c40..6af0826 100644
--- a/tests/language/compile_time_constant_o_test.dart
+++ b/tests/language/compile_time_constant_o_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test compile-time constants with string-interpolation.
 
+import "package:expect/expect.dart";
+
 const str = "foo";
 const m1 = const { "foo": 499 };
 const m2 = const { "$str": 499 };
diff --git a/tests/language/compile_time_constant_p_test.dart b/tests/language/compile_time_constant_p_test.dart
index a0ff240..d833ff2 100644
--- a/tests/language/compile_time_constant_p_test.dart
+++ b/tests/language/compile_time_constant_p_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:expect/expect.dart";
+
 class A {
   const A(
     this.x  /// 01: compile-time error
diff --git a/tests/language/compound_assignment_operator_test.dart b/tests/language/compound_assignment_operator_test.dart
index e875af1..c8a54ab 100644
--- a/tests/language/compound_assignment_operator_test.dart
+++ b/tests/language/compound_assignment_operator_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Tests that lhs of a compound assignement is executed only once.
 
+import "package:expect/expect.dart";
+
 
 class Indexed {
   Indexed() : _f = new List(10), count = 0 {
diff --git a/tests/language/cond_expr_test.dart b/tests/language/cond_expr_test.dart
index 26766bc..8e458cd 100644
--- a/tests/language/cond_expr_test.dart
+++ b/tests/language/cond_expr_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Check that conditional expressions can contain assignment expressions.
 
+import "package:expect/expect.dart";
+
 
 var e1, e2;
 
diff --git a/tests/language/condition_bailout_test.dart b/tests/language/condition_bailout_test.dart
index 60329a5..738d9d7 100644
--- a/tests/language/condition_bailout_test.dart
+++ b/tests/language/condition_bailout_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program testing closures.
 
+import "package:expect/expect.dart";
+
 class A {
   operator -() => this;
 
diff --git a/tests/language/const_constructor_test.dart b/tests/language/const_constructor_test.dart
index 3eafee8..94dbaee 100644
--- a/tests/language/const_constructor_test.dart
+++ b/tests/language/const_constructor_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:expect/expect.dart";
+
 class A<T> {
   final int x;
   const A.named() : x = 42;
diff --git a/tests/language/const_counter_negative_test.dart b/tests/language/const_counter_negative_test.dart
index 38ba11e..ad4d835 100644
--- a/tests/language/const_counter_negative_test.dart
+++ b/tests/language/const_counter_negative_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Bug: 4254106 Constant constructors must have (implicit) const parameters.
 
+import "package:expect/expect.dart";
+
 class ConstCounter {
   // Incorrect assignment of a non const function to a final field.
   const ConstCounter(int i) : nextValue_ = (() => i++);
diff --git a/tests/language/const_escape_frog_test.dart b/tests/language/const_escape_frog_test.dart
index 776ea8e..ea39cc3 100644
--- a/tests/language/const_escape_frog_test.dart
+++ b/tests/language/const_escape_frog_test.dart
@@ -1,3 +1,11 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Test division by power of two.
+// Test that results before and after optimization are the same.
+
+import "package:expect/expect.dart";
+
 class Foo {
   const Bar<Foo> bar = const Bar/* comment here use to trigger bug 323 */();
 }
diff --git a/tests/language/const_factory_redirection_test.dart b/tests/language/const_factory_redirection_test.dart
index 01390a8..3d2fdea 100644
--- a/tests/language/const_factory_redirection_test.dart
+++ b/tests/language/const_factory_redirection_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:expect/expect.dart";
+
 // Test that factory redirections work for compile-time constants, and
 // that abstract classes can redirect.
 
diff --git a/tests/language/const_init_test.dart b/tests/language/const_init_test.dart
index 78e01f3..3f18dc1 100644
--- a/tests/language/const_init_test.dart
+++ b/tests/language/const_init_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Check that initializers of static const fields are compile time constants.
 
+import "package:expect/expect.dart";
+
 class Point {
   final x_;
   final y_;
diff --git a/tests/language/const_list_test.dart b/tests/language/const_list_test.dart
index e05f7a7..e8f95f2 100644
--- a/tests/language/const_list_test.dart
+++ b/tests/language/const_list_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:expect/expect.dart";
+
 class ConstListTest {
 
   static testMain() {
diff --git a/tests/language/const_locals_test.dart b/tests/language/const_locals_test.dart
index 4c57168..8261b15 100644
--- a/tests/language/const_locals_test.dart
+++ b/tests/language/const_locals_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:expect/expect.dart";
+
 // Test of compile time constant local variables.
 
 const N = 8;
diff --git a/tests/language/const_named_test.dart b/tests/language/const_named_test.dart
index 919551a..94b5598 100644
--- a/tests/language/const_named_test.dart
+++ b/tests/language/const_named_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Check that const constructors work with named arguments.
 
+import "package:expect/expect.dart";
+
 main() {
   var d = const Duration(milliseconds: 499);
   Expect.equals(499, d.inMilliseconds);
diff --git a/tests/language/const_nested_test.dart b/tests/language/const_nested_test.dart
index 962c1eb..d78e626 100644
--- a/tests/language/const_nested_test.dart
+++ b/tests/language/const_nested_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:expect/expect.dart";
+
 // Test of compile time constant local variables in outer function levels.
 
 const N = 8;
diff --git a/tests/language/const_objects_are_immutable_test.dart b/tests/language/const_objects_are_immutable_test.dart
index 6dd2ac7..c3f6d21 100644
--- a/tests/language/const_objects_are_immutable_test.dart
+++ b/tests/language/const_objects_are_immutable_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Check that const objects (including literals) are immutable.
 
+import "package:expect/expect.dart";
+
 class A {
   const A(this.x, this.y);
   final num x, y;
diff --git a/tests/language/const_string_test.dart b/tests/language/const_string_test.dart
index feecc88..4736ca4 100644
--- a/tests/language/const_string_test.dart
+++ b/tests/language/const_string_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:expect/expect.dart";
+
 // Exercises compile-time string constants
 
 main() {
diff --git a/tests/language/const_syntax_test.dart b/tests/language/const_syntax_test.dart
index 7540709..668bb9f 100644
--- a/tests/language/const_syntax_test.dart
+++ b/tests/language/const_syntax_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:expect/expect.dart";
+
 main() {
   const f0 = 42;
   const f1; /// 01: compile-time error
diff --git a/tests/language/const_test.dart b/tests/language/const_test.dart
index 966bda7..e34eb0d 100644
--- a/tests/language/const_test.dart
+++ b/tests/language/const_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Check const classes.
 
+import "package:expect/expect.dart";
+
 class AConst {
   const AConst() : b_ = 3 ;
   final int b_;
diff --git a/tests/language/constant_fold_equals_test.dart b/tests/language/constant_fold_equals_test.dart
index b69c1e7..48a11d1 100644
--- a/tests/language/constant_fold_equals_test.dart
+++ b/tests/language/constant_fold_equals_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:expect/expect.dart";
+
 main() {
   var a = 'foo';
   for (int i = 0; i < 10; i++) {
diff --git a/tests/language/constant_propagation_phis_test.dart b/tests/language/constant_propagation_phis_test.dart
index 50b84b7..80359f5 100644
--- a/tests/language/constant_propagation_phis_test.dart
+++ b/tests/language/constant_propagation_phis_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:expect/expect.dart";
+
 // Test that constant propagation correctly updates phis when predecessor's
 // reachability changes.
 
diff --git a/tests/language/constructor2_test.dart b/tests/language/constructor2_test.dart
index c4e9f37..f6050a5 100644
--- a/tests/language/constructor2_test.dart
+++ b/tests/language/constructor2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for constructors and initializers.
 
+import "package:expect/expect.dart";
+
 // Expect the initializer expressions E(i) to be evaluated
 // in the order 1, 2, 3, ...
 // Each expression must be evaluated exactly once.
diff --git a/tests/language/constructor3_test.dart b/tests/language/constructor3_test.dart
index c8916e0..0c5eb51 100644
--- a/tests/language/constructor3_test.dart
+++ b/tests/language/constructor3_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for constructors and initializers.
 
+import "package:expect/expect.dart";
+
 // Expect the initializer expressions E(i) to be evaluated
 // in the order 1, 2, 3, ...
 // Each expression must be evaluated exactly once.
diff --git a/tests/language/constructor4_test.dart b/tests/language/constructor4_test.dart
index ad16fb3..b4df9b0 100644
--- a/tests/language/constructor4_test.dart
+++ b/tests/language/constructor4_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for constructors and initializers.
 
+import "package:expect/expect.dart";
+
 // Expect the initializer expressions E(i) to be evaluated
 // in the order 1, 2, 3, ...
 // Each expression must be evaluated exactly once.
diff --git a/tests/language/constructor5_test.dart b/tests/language/constructor5_test.dart
index c087840..77ecd94 100644
--- a/tests/language/constructor5_test.dart
+++ b/tests/language/constructor5_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for constructors and initializers.
 
+import "package:expect/expect.dart";
+
 // Super initializer and super constructor body are executed in with the same
 // bindings.
 
diff --git a/tests/language/constructor6_test.dart b/tests/language/constructor6_test.dart
index ff105e8..2f6c991 100644
--- a/tests/language/constructor6_test.dart
+++ b/tests/language/constructor6_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for constructors and initializers.
 
+import "package:expect/expect.dart";
+
 // Super initializer and super constructor body are executed in with the same
 // bindings.
 
diff --git a/tests/language/constructor7_test.dart b/tests/language/constructor7_test.dart
index 25468f8..432fe29 100644
--- a/tests/language/constructor7_test.dart
+++ b/tests/language/constructor7_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for constructors and initializers.
 
+import "package:expect/expect.dart";
+
 // Expect the initializer expressions E(i) to be evaluated
 // in the order 1, 2, 3, ...
 // This test has no inheritance but many fields to flush out issues with
diff --git a/tests/language/constructor8_test.dart b/tests/language/constructor8_test.dart
index 0cfcc76..9f05e14 100644
--- a/tests/language/constructor8_test.dart
+++ b/tests/language/constructor8_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:expect/expect.dart";
+
 // Regression test for dart2js that used to crash on this program.
 
 class A {
diff --git a/tests/language/constructor_body_test.dart b/tests/language/constructor_body_test.dart
index e365855..d64d61f 100644
--- a/tests/language/constructor_body_test.dart
+++ b/tests/language/constructor_body_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for constructors without function bodies.
 
+import "package:expect/expect.dart";
+
 // Test a non-const constructor works without a body.
 class First {
   First(int this.value);
diff --git a/tests/language/constructor_default_test.dart b/tests/language/constructor_default_test.dart
index 9154ed4..a8fc22e 100644
--- a/tests/language/constructor_default_test.dart
+++ b/tests/language/constructor_default_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for default constructors.
 
+import "package:expect/expect.dart";
+
 class A {
   A() : a = 499;
 
diff --git a/tests/language/constructor_initializer_test.dart b/tests/language/constructor_initializer_test.dart
index a752ecd..fd328b6 100644
--- a/tests/language/constructor_initializer_test.dart
+++ b/tests/language/constructor_initializer_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:expect/expect.dart";
+
 class A {
   var _x, _y;
   A(x, [y = 10]): _x = x++, _y = y++ {
diff --git a/tests/language/constructor_named_arguments_test.dart b/tests/language/constructor_named_arguments_test.dart
index c320179..63e5e34 100644
--- a/tests/language/constructor_named_arguments_test.dart
+++ b/tests/language/constructor_named_arguments_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for default constructors.
 
+import "package:expect/expect.dart";
+
 String message;
 
 foo() {
diff --git a/tests/language/constructor_redirect_test.dart b/tests/language/constructor_redirect_test.dart
index fe79274..1667493 100644
--- a/tests/language/constructor_redirect_test.dart
+++ b/tests/language/constructor_redirect_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for redirection constructors.
 
+import "package:expect/expect.dart";
+
 class A {
   var x;
   A(this.x) {}
diff --git a/tests/language/constructor_return_test.dart b/tests/language/constructor_return_test.dart
index 0e49400..8f30645 100644
--- a/tests/language/constructor_return_test.dart
+++ b/tests/language/constructor_return_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:expect/expect.dart";
+
 // Dart spec 0.03, section 11.10 - generative constructors can only have return
 // statements in the form 'return;'.
 class A {
diff --git a/tests/language/constructor_test.dart b/tests/language/constructor_test.dart
index 4ca57b1..eb7239c 100644
--- a/tests/language/constructor_test.dart
+++ b/tests/language/constructor_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for constructors and initializers.
 
+import "package:expect/expect.dart";
+
 class A extends B {
   A(x, y) : super(y), a = x { }
 
diff --git a/tests/language/context2_test.dart b/tests/language/context2_test.dart
index 44550b8..1b4d683 100644
--- a/tests/language/context2_test.dart
+++ b/tests/language/context2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for capturing.
 
+import "package:expect/expect.dart";
+
 // Regression test for issue 5991015.
 // @static-clean
 
diff --git a/tests/language/context_args_with_defaults_test.dart b/tests/language/context_args_with_defaults_test.dart
index 272efc9..7557026 100644
--- a/tests/language/context_args_with_defaults_test.dart
+++ b/tests/language/context_args_with_defaults_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:expect/expect.dart";
+
 class ContextArgsWithDefaultsTest {
   static void testMain() {
     crasher(1, 'foo')();
diff --git a/tests/language/context_test.dart b/tests/language/context_test.dart
index ec59c94..2cff404 100644
--- a/tests/language/context_test.dart
+++ b/tests/language/context_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for capturing.
 
+import "package:expect/expect.dart";
+
 class ContextTest {
   static foo(Function f) {
     return f();
diff --git a/tests/language/continue_test.dart b/tests/language/continue_test.dart
index bba2bbe..576c4fe 100644
--- a/tests/language/continue_test.dart
+++ b/tests/language/continue_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for continue in for, do/while and while loops.
 
+import "package:expect/expect.dart";
+
 class ContinueTest {
   static testMain() {
     int i;
diff --git a/tests/language/core_type_check_test.dart b/tests/language/core_type_check_test.dart
index 4c8c861..86f525b 100644
--- a/tests/language/core_type_check_test.dart
+++ b/tests/language/core_type_check_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:expect/expect.dart";
+
 check(value, expectComparable, expectPattern) {
   Expect.equals(expectComparable, value is Comparable);
   Expect.equals(expectPattern, value is Pattern);
diff --git a/tests/language/crash_6725_test.dart b/tests/language/crash_6725_test.dart
new file mode 100644
index 0000000..f9cbb18
--- /dev/null
+++ b/tests/language/crash_6725_test.dart
@@ -0,0 +1,71 @@
+// 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.
+
+// Regression test for a crash in dart2js.
+
+class Fisk {
+  it1(x) {
+    // "key" is unresolved and caused a crash in dart2js.
+    // This is the original example the user reported.
+    for (key in x) {
+      print(key);
+    }
+  }
+
+  it2(x) {
+    // "length" is "intercepted" and handled differently from other
+    // names when an instance of list is observed.
+    for (length in x) {
+      print(length);
+    }
+  }
+
+  it3(x) {
+    // We're pretty sure that there's no "fisk" that is "intercepted".
+    for (fisk in x) {
+      print(fisk);
+    }
+  }
+}
+
+class SubFisk extends Fisk {
+  var key;
+  var length;
+  var fisk;
+}
+
+main() {
+  Fisk f = new SubFisk();
+  var m = (x) {
+    for (undeclared in x) {
+      print(undeclared);
+    }
+  };
+  if (new DateTime.now().millisecondsSinceEpoch == 42) {
+    f = null;
+    m = (x) {};
+  }
+
+  f.it1([87, 42]);
+  if (f.key != 42) {
+    throw 'f.key != 42 (${f.key})';
+  }
+
+  f.it2([87, 42]);
+  if (f.length != 42) {
+    throw 'f.length != 42 (${f.length})';
+  }
+
+  f.it3([87, 42]);
+  if (f.fisk != 42) {
+    throw 'f.fisk != 42 (${f.fisk})';
+  }
+
+  try {
+    m([87, 42]);
+    throw 'NoSuchMethodError expected';
+  } on NoSuchMethodError {
+    // Expected.
+  }
+}
diff --git a/tests/language/ct_const3_test.dart b/tests/language/ct_const3_test.dart
index cc4c91d..0758057 100644
--- a/tests/language/ct_const3_test.dart
+++ b/tests/language/ct_const3_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Check that initializers of const fields can be declared out of order.
 
+import "package:expect/expect.dart";
+
 const P = 2 * (O - N);
 const N = 1;
 const O = 1 + 3;
diff --git a/tests/language/ct_const4_test.dart b/tests/language/ct_const4_test.dart
index 0c58e52..d7ab8db 100644
--- a/tests/language/ct_const4_test.dart
+++ b/tests/language/ct_const4_test.dart
@@ -4,6 +4,7 @@
 // Check compile-time constant library references with prefixes
 
 library CTConst4Test;
+import "package:expect/expect.dart";
 import "ct_const4_lib.dart" as mylib;
 
 const A = mylib.B;
diff --git a/tests/language/ct_const_test.dart b/tests/language/ct_const_test.dart
index 3374ea0..f0098f1 100644
--- a/tests/language/ct_const_test.dart
+++ b/tests/language/ct_const_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // All things regarding compile time constant expressions.
 
+import "package:expect/expect.dart";
+
 abstract class Roman {
   static const I = 1;
   static const II = 2;
diff --git a/tests/language/dangling_else_test.dart b/tests/language/dangling_else_test.dart
index d6d3bdb..84bdec8 100644
--- a/tests/language/dangling_else_test.dart
+++ b/tests/language/dangling_else_test.dart
@@ -4,6 +4,8 @@
 // Tests dangling else. The VM should not have any problems, but dart2js or
 // dart2dart could get this wrong.
 
+import "package:expect/expect.dart";
+
 nestedIf1(notTrue) {
   if (notTrue) return 'bad input';
   if (notTrue) {
diff --git a/tests/language/default_class_implicit_constructor_test.dart b/tests/language/default_class_implicit_constructor_test.dart
index 72e9132..0a00a80 100644
--- a/tests/language/default_class_implicit_constructor_test.dart
+++ b/tests/language/default_class_implicit_constructor_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:expect/expect.dart";
+
 // An abstract class with a redirecting factory to a class with no declared
 // constructor should use the implicit default constructor.
 
diff --git a/tests/language/default_factory_library_test.dart b/tests/language/default_factory_library_test.dart
index ec3c231..92a44f4 100644
--- a/tests/language/default_factory_library_test.dart
+++ b/tests/language/default_factory_library_test.dart
@@ -5,6 +5,7 @@
 // Dart test program for testing factories defined across libraries
 
 library test;
+import "package:expect/expect.dart";
 import "default_factory_library.dart" as lib;
 
 class B implements lib.A, C {
diff --git a/tests/language/default_factory_test.dart b/tests/language/default_factory_test.dart
index aee33f7..bc4ce60 100644
--- a/tests/language/default_factory_test.dart
+++ b/tests/language/default_factory_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:expect/expect.dart";
+
 // Dart test program for testing default factories.
 
 abstract class Vehicle {
diff --git a/tests/language/default_implementation_test.dart b/tests/language/default_implementation_test.dart
index 6d6da4f..74a797d 100644
--- a/tests/language/default_implementation_test.dart
+++ b/tests/language/default_implementation_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test to verify that factory classes are working.
 
+import "package:expect/expect.dart";
+
 // @static-clean
 
 abstract class Point {
diff --git a/tests/language/default_init_test.dart b/tests/language/default_init_test.dart
index 4192585..63c9be8 100644
--- a/tests/language/default_init_test.dart
+++ b/tests/language/default_init_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:expect/expect.dart";
+
 // Tests static and instance fields initialization.
 class DefaultInitTest {
   static testMain() {
diff --git a/tests/language/deopt_hoisted_smi_check_vm_test.dart b/tests/language/deopt_hoisted_smi_check_vm_test.dart
index 6fab79c..0eef995 100644
--- a/tests/language/deopt_hoisted_smi_check_vm_test.dart
+++ b/tests/language/deopt_hoisted_smi_check_vm_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test deoptimization on an optimistically hoisted smi check.
 
+import 'package:expect/expect.dart';
+
 sum(a, b) {
   var sum = 0;
   for (var j = 1; j < 10; j++) {
diff --git a/tests/language/deopt_inlined_function_lazy_test.dart b/tests/language/deopt_inlined_function_lazy_test.dart
index 362631e..59e8930 100644
--- a/tests/language/deopt_inlined_function_lazy_test.dart
+++ b/tests/language/deopt_inlined_function_lazy_test.dart
@@ -4,6 +4,8 @@
 // Test lazy deoptimization from within an inlined function.
 // VMOptions=--deoptimize_alot
 
+import "package:expect/expect.dart";
+
 call_native(x) {
   // Wrap in try to avoid inlining.
   // Use a large int so the intrinsifier does not fire.
diff --git a/tests/language/deopt_inlined_function_test.dart b/tests/language/deopt_inlined_function_test.dart
index b0d8844..d35b5ed 100644
--- a/tests/language/deopt_inlined_function_test.dart
+++ b/tests/language/deopt_inlined_function_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test deoptimization from within an inlined function.
 
+import "package:expect/expect.dart";
+
 class A {
   deopt_here() => 1;
 }
diff --git a/tests/language/deopt_no_feedback_test.dart b/tests/language/deopt_no_feedback_test.dart
index f307e77..a10e406 100644
--- a/tests/language/deopt_no_feedback_test.dart
+++ b/tests/language/deopt_no_feedback_test.dart
@@ -4,6 +4,8 @@
 // Test deoptimization caused by running code that did not collect type
 // feedback before.
 
+import "package:expect/expect.dart";
+
 testStoreIndexed() {
   test(a, i, v, flag) {
     if (flag) {
diff --git a/tests/language/deopt_smi_op_test.dart b/tests/language/deopt_smi_op_test.dart
index 7ad01c6..90e918b 100644
--- a/tests/language/deopt_smi_op_test.dart
+++ b/tests/language/deopt_smi_op_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:expect/expect.dart";
+
 // Test hoisted (loop-invariant) smi operations with deoptimization.
 
 test_mul(h)  {
diff --git a/tests/language/deoptimized_function_on_stack_test.dart b/tests/language/deoptimized_function_on_stack_test.dart
index 9071f1c..f03b916 100644
--- a/tests/language/deoptimized_function_on_stack_test.dart
+++ b/tests/language/deoptimized_function_on_stack_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:expect/expect.dart";
+
 // This is a test for deoptimization infrastructure and to reproduce the
 // failure from bug 5442338.
 
diff --git a/tests/language/disable_privacy_test.dart b/tests/language/disable_privacy_test.dart
index 8d0348d..6e774e9 100644
--- a/tests/language/disable_privacy_test.dart
+++ b/tests/language/disable_privacy_test.dart
@@ -6,6 +6,7 @@
 // Dart test program checking that library privacy can be disabled.
 
 library DisablePrivacyTest;
+import "package:expect/expect.dart";
 import "disable_privacy_lib.dart";
 
 main() {
diff --git a/tests/language/div_by_zero_test.dart b/tests/language/div_by_zero_test.dart
index 8f0ec10..f98c4bf 100644
--- a/tests/language/div_by_zero_test.dart
+++ b/tests/language/div_by_zero_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program to test integer div by zero.
 
+import "package:expect/expect.dart";
+
 class DivByZeroTest {
 
   static double divBy(int a, int b) {
diff --git a/tests/language/div_with_power_of_two_test.dart b/tests/language/div_with_power_of_two_test.dart
index fbd3151..6b50749 100644
--- a/tests/language/div_with_power_of_two_test.dart
+++ b/tests/language/div_with_power_of_two_test.dart
@@ -4,6 +4,8 @@
 // Test division by power of two.
 // Test that results before and after optimization are the same.
 
+import "package:expect/expect.dart";
+
 // [function, [list of tuples argument/result]].
 var expectedResults =
   [ [divBy1,
diff --git a/tests/language/do_while2_test.dart b/tests/language/do_while2_test.dart
index c6cae30..9243e94 100644
--- a/tests/language/do_while2_test.dart
+++ b/tests/language/do_while2_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:expect/expect.dart";
+
 var a = 42;
 
 foo1() {
diff --git a/tests/language/do_while3_test.dart b/tests/language/do_while3_test.dart
index 615ebd1..4026ec9 100644
--- a/tests/language/do_while3_test.dart
+++ b/tests/language/do_while3_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:expect/expect.dart";
+
 // Test that a condition is only evaluated once in a loop.
 
 main() {
diff --git a/tests/language/do_while4_test.dart b/tests/language/do_while4_test.dart
new file mode 100644
index 0000000..9b7115a
--- /dev/null
+++ b/tests/language/do_while4_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for dart2js that used to crash in the presence of
+// do/while, break and a local variable declared after the break.
+
+import "package:expect/expect.dart";
+
+var a = false;
+main() {
+  do {
+    if (!a) break;
+    var c = main();
+    a = true;
+  } while (true);
+  Expect.isFalse(a);
+}
diff --git a/tests/language/do_while_test.dart b/tests/language/do_while_test.dart
index d4edf86..42195ad 100644
--- a/tests/language/do_while_test.dart
+++ b/tests/language/do_while_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing do while statement.
 
+import "package:expect/expect.dart";
+
 class Helper {
   static int f1(bool b) {
     do return 1;
diff --git a/tests/language/double_int_addition_test.dart b/tests/language/double_int_addition_test.dart
index 8319df1..9f748e2 100644
--- a/tests/language/double_int_addition_test.dart
+++ b/tests/language/double_int_addition_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:expect/expect.dart";
+
 // Test that optimized code does not silently convert integers to doubles.
 
 
diff --git a/tests/language/double_int_to_string_test.dart b/tests/language/double_int_to_string_test.dart
index 96dbe0e..7ba8e27 100644
--- a/tests/language/double_int_to_string_test.dart
+++ b/tests/language/double_int_to_string_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test basic integer operations.
 
+import "package:expect/expect.dart";
+
 main() {
   Expect.equals("0.0", (0.0).toString());
   Expect.equals("9.0", (9.0).toString());
diff --git a/tests/language/double_modulo_test.dart b/tests/language/double_modulo_test.dart
index 6a9a15a..d2b90ca 100644
--- a/tests/language/double_modulo_test.dart
+++ b/tests/language/double_modulo_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test optimization of modulo operator on Double.
 
+import "package:expect/expect.dart";
+
 main() {
   double k = -0.33333;
   double firstResPos = doMod(k, 1.0);
diff --git a/tests/language/double_to_string_as_exponential2_test.dart b/tests/language/double_to_string_as_exponential2_test.dart
index 9c085a4..f5030ca 100644
--- a/tests/language/double_to_string_as_exponential2_test.dart
+++ b/tests/language/double_to_string_as_exponential2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test basic integer operations.
 
+import "package:expect/expect.dart";
+
 main() {
   Expect.throws(() => (1.0).toStringAsExponential(-1),
                 (e) => e is RangeError);
diff --git a/tests/language/double_to_string_as_exponential3_test.dart b/tests/language/double_to_string_as_exponential3_test.dart
index daaa069..7530033 100644
--- a/tests/language/double_to_string_as_exponential3_test.dart
+++ b/tests/language/double_to_string_as_exponential3_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test basic integer operations.
 
+import "package:expect/expect.dart";
+
 main() {
 
   Expect.equals("1.00000000000000000000e+0", (1.0).toStringAsExponential(20));
diff --git a/tests/language/double_to_string_as_exponential_test.dart b/tests/language/double_to_string_as_exponential_test.dart
index 9827109..c44bbd1 100644
--- a/tests/language/double_to_string_as_exponential_test.dart
+++ b/tests/language/double_to_string_as_exponential_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test basic integer operations.
 
+import "package:expect/expect.dart";
+
 main() {
   Expect.equals("1e+0", (1.0).toStringAsExponential());
   Expect.equals("1.1e+1", (11.0).toStringAsExponential());
diff --git a/tests/language/double_to_string_as_fixed2_test.dart b/tests/language/double_to_string_as_fixed2_test.dart
index f43418c..4da08a4 100644
--- a/tests/language/double_to_string_as_fixed2_test.dart
+++ b/tests/language/double_to_string_as_fixed2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test basic integer operations.
 
+import "package:expect/expect.dart";
+
 main() {
   Expect.throws(() => 0.0.toStringAsFixed(-1),
                 (e) => e is RangeError);
diff --git a/tests/language/double_to_string_as_fixed_test.dart b/tests/language/double_to_string_as_fixed_test.dart
index 80dda0c..bc15175 100644
--- a/tests/language/double_to_string_as_fixed_test.dart
+++ b/tests/language/double_to_string_as_fixed_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test basic integer operations.
 
+import "package:expect/expect.dart";
+
 class ToStringAsFixedTest {
   static void testMain() {
     Expect.equals("2.000", 2.0.toStringAsFixed(3));
diff --git a/tests/language/double_to_string_as_precision2_test.dart b/tests/language/double_to_string_as_precision2_test.dart
index ef04587..a2f78f0 100644
--- a/tests/language/double_to_string_as_precision2_test.dart
+++ b/tests/language/double_to_string_as_precision2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test basic integer operations.
 
+import "package:expect/expect.dart";
+
 main() {
   Expect.throws(() => 0.0.toStringAsPrecision(0),
                 (e) => e is RangeError);
diff --git a/tests/language/double_to_string_as_precision3_test.dart b/tests/language/double_to_string_as_precision3_test.dart
index b2d4e32..a208f10 100644
--- a/tests/language/double_to_string_as_precision3_test.dart
+++ b/tests/language/double_to_string_as_precision3_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test basic integer operations.
 
+import "package:expect/expect.dart";
+
 main() {
   Expect.equals("0.000555000000000000046248",
                 (0.000555).toStringAsPrecision(21));
diff --git a/tests/language/double_to_string_as_precision_test.dart b/tests/language/double_to_string_as_precision_test.dart
index ac91aff..4f159f9 100644
--- a/tests/language/double_to_string_as_precision_test.dart
+++ b/tests/language/double_to_string_as_precision_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test basic integer operations.
 
+import "package:expect/expect.dart";
+
 main() {
   Expect.equals("NaN", (double.NAN).toStringAsPrecision(1));
   Expect.equals("Infinity", (double.INFINITY).toStringAsPrecision(2));
diff --git a/tests/language/double_to_string_test.dart b/tests/language/double_to_string_test.dart
index ce30f50..a7c1061 100644
--- a/tests/language/double_to_string_test.dart
+++ b/tests/language/double_to_string_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test basic integer operations.
 
+import "package:expect/expect.dart";
+
 main() {
   Expect.equals("NaN", (double.NAN).toString());
   Expect.equals("Infinity", (1/0).toString());
diff --git a/tests/language/duplicate_interface_test.dart b/tests/language/duplicate_interface_test.dart
index 5553a5e..887cd30 100644
--- a/tests/language/duplicate_interface_test.dart
+++ b/tests/language/duplicate_interface_test.dart
@@ -5,6 +5,7 @@
 
 library duplicateInterfaceTest;
 
+import 'package:expect/expect.dart';
 import "duplicate_interface_lib.dart" as alib;
 
 class InterfB { }
diff --git a/tests/language/dynamic2_test.dart b/tests/language/dynamic2_test.dart
new file mode 100644
index 0000000..82c9074
--- /dev/null
+++ b/tests/language/dynamic2_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Test the prohibited use of 'dynamic' in extending and implementing classes.
+
+class A
+  extends dynamic  /// 00: compile-time error
+  implements dynamic  /// 01: compile-time error
+{
+}
+
+main() {
+  new A();
+}
diff --git a/tests/language/dynamic_call_test.dart b/tests/language/dynamic_call_test.dart
index 07cf6ff..f7a760c 100644
--- a/tests/language/dynamic_call_test.dart
+++ b/tests/language/dynamic_call_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing dynamic calls.
 
+import "package:expect/expect.dart";
+
 class Helper {
   Helper() {}
   int foo(int i) {
diff --git a/tests/language/dynamic_field_test.dart b/tests/language/dynamic_field_test.dart
index eb4d662..db77ea3 100644
--- a/tests/language/dynamic_field_test.dart
+++ b/tests/language/dynamic_field_test.dart
@@ -4,6 +4,8 @@
 //
 // Test that ensures that fields can be accessed dynamically.
 
+import "package:expect/expect.dart";
+
 class A extends C {
   var a;
   var b;
diff --git a/tests/language/dynamic_test.dart b/tests/language/dynamic_test.dart
index e7641de..9b1cc77 100644
--- a/tests/language/dynamic_test.dart
+++ b/tests/language/dynamic_test.dart
@@ -5,6 +5,8 @@
 // Dart test program testing the use of 'dynamic' in generic types.
 // @static-clean
 
+import "package:expect/expect.dart";
+
 abstract class Iface<K,V> {
 }
 
diff --git a/tests/language/emit_const_fields_test.dart b/tests/language/emit_const_fields_test.dart
index 17e5ab5..61e09d6 100644
--- a/tests/language/emit_const_fields_test.dart
+++ b/tests/language/emit_const_fields_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that used static consts are emitted.
 
+import "package:expect/expect.dart";
+
 class Guide {
   static const LTUAE = 42;
   static const TITLE = "Life, the Universe and Everything";
diff --git a/tests/language/empty_block_case_test.dart b/tests/language/empty_block_case_test.dart
index 6aeb6cf..085ce70 100644
--- a/tests/language/empty_block_case_test.dart
+++ b/tests/language/empty_block_case_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:expect/expect.dart";
+
 // Test that a case with an empty block does not fall through.
 
 class EmptyBlockCaseTest {
diff --git a/tests/language/equality_test.dart b/tests/language/equality_test.dart
index 6efe953..4e47521 100644
--- a/tests/language/equality_test.dart
+++ b/tests/language/equality_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:expect/expect.dart";
+
 
 class A {
   bool _result;
diff --git a/tests/language/example_constructor_test.dart b/tests/language/example_constructor_test.dart
index 6ae7b48..612bb18 100644
--- a/tests/language/example_constructor_test.dart
+++ b/tests/language/example_constructor_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for testing order of constructor invocation.
 
+import "package:expect/expect.dart";
+
 var trace = "";
 
 int rec(int i) {
diff --git a/tests/language/exception_identity_test.dart b/tests/language/exception_identity_test.dart
index c6b7168..2b16607 100644
--- a/tests/language/exception_identity_test.dart
+++ b/tests/language/exception_identity_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:expect/expect.dart";
+
 // Test that an object when thrown stays the same.
 
 class A {
diff --git a/tests/language/exception_test.dart b/tests/language/exception_test.dart
index 0876c5c..2cdab5e 100644
--- a/tests/language/exception_test.dart
+++ b/tests/language/exception_test.dart
@@ -1,6 +1,9 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
 class ExceptionTest {
   static testMain() {
     int i = 0;
diff --git a/tests/language/execute_finally10_test.dart b/tests/language/execute_finally10_test.dart
new file mode 100644
index 0000000..4591908
--- /dev/null
+++ b/tests/language/execute_finally10_test.dart
@@ -0,0 +1,46 @@
+// 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.
+
+// Regression test for dart2js that used to not treat the finally
+// block as a successor of a catch block that throws.
+
+import "package:expect/expect.dart";
+ 
+class A {
+  var field;
+  start() {}
+  stop() { field = 42; }
+}
+
+class B {
+  var totalCompileTime = new A();
+  var runCompiler = new Object();
+
+  run() {
+    totalCompileTime.start();
+    try {
+      throw 'foo';
+    } catch (exception) {
+      // Use [runCompiler] twice to ensure it will have a local
+      // variable.
+      runCompiler.toString();
+      runCompiler.toString();
+      throw;
+    } finally {
+      totalCompileTime.stop();
+    }
+  }
+}
+
+main() {
+  var b = new B();
+  try {
+    b.run();
+    throw 'Expected exception';
+  } catch (exception) {
+    // Expected exception.
+  }
+
+  Expect.equals(42, b.totalCompileTime.field);
+}
diff --git a/tests/language/execute_finally11_test.dart b/tests/language/execute_finally11_test.dart
new file mode 100644
index 0000000..093d7dc
--- /dev/null
+++ b/tests/language/execute_finally11_test.dart
@@ -0,0 +1,49 @@
+// 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.
+
+// Regression test for dart2js that used to not treat the finally
+// block as a successor of a nested try block.
+
+import "package:expect/expect.dart";
+ 
+class A {
+  var field;
+  start() {}
+  stop() { field = 42; }
+}
+
+class B {
+  var totalCompileTime = new A();
+  var runCompiler = new Object();
+
+  run() {
+    totalCompileTime.start();
+    try {
+      throw 'foo';
+    } catch (exception) {
+      try {
+        // Use [runCompiler] twice to ensure it will have a local
+        // variable.
+        runCompiler.toString();
+        runCompiler.toString();
+      } catch (exception) {
+      }
+      throw;
+    } finally {
+      totalCompileTime.stop();
+    }
+  }
+}
+
+main() {
+  var b = new B();
+  try {
+    b.run();
+    throw 'Expected exception';
+  } catch (exception) {
+    // Expected exception.
+  }
+
+  Expect.equals(42, b.totalCompileTime.field);
+}
diff --git a/tests/language/execute_finally12_test.dart b/tests/language/execute_finally12_test.dart
new file mode 100644
index 0000000..edce516
--- /dev/null
+++ b/tests/language/execute_finally12_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for dart2js that used to not treat the finally
+// block as a successor of a nested try block.
+
+import "package:expect/expect.dart";
+
+var a;
+
+foo() {
+  var b = a == 8; // This should not be GVN'ed.
+  while (!b) {
+    try {
+      try {
+      } finally {
+        a = 8;
+        break;
+      }
+    } finally {
+      return a == 8;
+    }
+  }
+}
+
+main() {
+  Expect.isTrue(foo());
+}
diff --git a/tests/language/execute_finally1_test.dart b/tests/language/execute_finally1_test.dart
index 946f3bb..ee2ac09 100644
--- a/tests/language/execute_finally1_test.dart
+++ b/tests/language/execute_finally1_test.dart
@@ -4,6 +4,8 @@
 // Dart test program for testing execution of finally blocks on
 // control flow breaks because of 'return', 'continue' etc.
 
+import "package:expect/expect.dart";
+
 
 class Helper {
   Helper() : i = 0 { }
diff --git a/tests/language/execute_finally2_test.dart b/tests/language/execute_finally2_test.dart
index ab7e93a..7eaec3e 100644
--- a/tests/language/execute_finally2_test.dart
+++ b/tests/language/execute_finally2_test.dart
@@ -4,6 +4,8 @@
 // Dart test program for testing execution of finally blocks on
 // control flow breaks because of 'return', 'continue' etc.
 
+import "package:expect/expect.dart";
+
 
 class Helper {
   Helper() : i = 0 { }
diff --git a/tests/language/execute_finally3_test.dart b/tests/language/execute_finally3_test.dart
index 122402a..1da7b6f 100644
--- a/tests/language/execute_finally3_test.dart
+++ b/tests/language/execute_finally3_test.dart
@@ -4,6 +4,8 @@
 // Dart test program for testing execution of finally blocks on
 // control flow breaks because of 'return', 'continue' etc.
 
+import "package:expect/expect.dart";
+
 
 class Helper {
   Helper() : i = 0 { }
diff --git a/tests/language/execute_finally4_test.dart b/tests/language/execute_finally4_test.dart
index fedf2f0..ab0d023 100644
--- a/tests/language/execute_finally4_test.dart
+++ b/tests/language/execute_finally4_test.dart
@@ -4,6 +4,8 @@
 // Dart test program for testing execution of finally blocks on
 // control flow breaks because of 'return', 'continue' etc.
 
+import "package:expect/expect.dart";
+
 
 class Helper {
   Helper() : i = 0 { }
diff --git a/tests/language/execute_finally5_test.dart b/tests/language/execute_finally5_test.dart
index dbdb016..37fa316 100644
--- a/tests/language/execute_finally5_test.dart
+++ b/tests/language/execute_finally5_test.dart
@@ -4,6 +4,8 @@
 // Dart test program for testing execution of finally blocks on
 // control flow breaks because of 'return', 'continue' etc.
 
+import "package:expect/expect.dart";
+
 
 class Helper {
   Helper() : i = 0 { }
diff --git a/tests/language/execute_finally6_test.dart b/tests/language/execute_finally6_test.dart
index dae478b..ff2e6e7 100644
--- a/tests/language/execute_finally6_test.dart
+++ b/tests/language/execute_finally6_test.dart
@@ -4,6 +4,8 @@
 // Dart test program for testing execution of finally blocks on
 // control flow breaks because of 'return', 'continue' etc.
 
+import "package:expect/expect.dart";
+
 
 class Helper {
   Helper() : i = 0 { }
diff --git a/tests/language/execute_finally7_test.dart b/tests/language/execute_finally7_test.dart
index 265e4c1..7ba11aa 100644
--- a/tests/language/execute_finally7_test.dart
+++ b/tests/language/execute_finally7_test.dart
@@ -4,6 +4,8 @@
 // Dart test program for testing execution of finally blocks after an exception
 // is thrown from inside a local function capturing a variable.
 
+import "package:expect/expect.dart";
+
 
 class MyException {
   const MyException(String message) : message_ = message;
diff --git a/tests/language/execute_finally8_test.dart b/tests/language/execute_finally8_test.dart
index 8ab2a34..f597c68 100644
--- a/tests/language/execute_finally8_test.dart
+++ b/tests/language/execute_finally8_test.dart
@@ -4,6 +4,8 @@
 // This test ensures that the finally block executes correctly when
 // there are throw, break and return statements in the finally block.
 
+import "package:expect/expect.dart";
+
 class Hello {
  static var sum;
 
diff --git a/tests/language/execute_finally9_test.dart b/tests/language/execute_finally9_test.dart
index 19108da..ac53600 100644
--- a/tests/language/execute_finally9_test.dart
+++ b/tests/language/execute_finally9_test.dart
@@ -4,6 +4,8 @@
 // This test ensures that the finally block executes correctly when
 // there are throw, break and return statements in the finally block.
 
+import "package:expect/expect.dart";
+
 class Hello {
  static var sum;
 
diff --git a/tests/language/expect_test.dart b/tests/language/expect_test.dart
index 13453f3..ee24d6d 100644
--- a/tests/language/expect_test.dart
+++ b/tests/language/expect_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Testing the Expect class.
 
+import "package:expect/expect.dart";
+
 class ExpectTest {
 
   static testEquals(a) {
diff --git a/tests/language/f_bounded_quantification_test.dart b/tests/language/f_bounded_quantification_test.dart
index 928b71e..133fd19 100644
--- a/tests/language/f_bounded_quantification_test.dart
+++ b/tests/language/f_bounded_quantification_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:expect/expect.dart";
+
 // Test for F-Bounded Quantification.
 
 class FBound<F extends FBound<F>> {}
diff --git a/tests/language/factory_arrow_test.dart b/tests/language/factory_arrow_test.dart
index 02d3392..d2cf528 100644
--- a/tests/language/factory_arrow_test.dart
+++ b/tests/language/factory_arrow_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:expect/expect.dart";
+
 class A {
   A.foo() {}
   factory A() => new A.foo();
diff --git a/tests/language/factory_implementation_test.dart b/tests/language/factory_implementation_test.dart
index 0f7e2f6..c21bda6 100644
--- a/tests/language/factory_implementation_test.dart
+++ b/tests/language/factory_implementation_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:expect/expect.dart";
+
 abstract class A {
   factory A(int x, int y) = B;
 }
diff --git a/tests/language/factory_redirection2_test.dart b/tests/language/factory_redirection2_test.dart
index b4592d8..0884930 100644
--- a/tests/language/factory_redirection2_test.dart
+++ b/tests/language/factory_redirection2_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:expect/expect.dart";
+
 // Test that it is a compile-time error to have a redirection in a
 // non-factory constructor.
 
diff --git a/tests/language/factory_redirection_test.dart b/tests/language/factory_redirection_test.dart
index fb3ceb6..2fcc27c8 100644
--- a/tests/language/factory_redirection_test.dart
+++ b/tests/language/factory_redirection_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:expect/expect.dart";
+
 class A<T> {
   A() : x = null;
 
diff --git a/tests/language/factory_test.dart b/tests/language/factory_test.dart
index 5176eba..b0441ea 100644
--- a/tests/language/factory_test.dart
+++ b/tests/language/factory_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing factories.
 
+import "package:expect/expect.dart";
+
 class A {
   factory A(n) {
     return new A.internal(n);
diff --git a/tests/language/factory_type_parameter2_test.dart b/tests/language/factory_type_parameter2_test.dart
new file mode 100644
index 0000000..6536be8
--- /dev/null
+++ b/tests/language/factory_type_parameter2_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that type variables are correctly set in instances created by factories.
+
+import 'package:expect/expect.dart';
+
+var p;
+bool done = false;
+
+class D {}
+
+abstract class I<T> {
+  factory I.name() {
+    return new C<T>.name();
+  }
+}
+
+class C<T> implements I<T> {
+  C.name() {
+    Expect.isTrue(p is T);
+    done = true;
+  }
+}
+
+main() {
+  p = new D();
+  new I<D>.name();
+  Expect.equals(true, done);
+}
diff --git a/tests/language/factory_type_parameter_test.dart b/tests/language/factory_type_parameter_test.dart
index fe6b0fa..c9e7a0b 100644
--- a/tests/language/factory_type_parameter_test.dart
+++ b/tests/language/factory_type_parameter_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:expect/expect.dart";
+
 class A<T> {
   factory A.factory() {
     return new B<T>();
diff --git a/tests/language/fannkuch_test.dart b/tests/language/fannkuch_test.dart
index 356f20f..ffde845 100644
--- a/tests/language/fannkuch_test.dart
+++ b/tests/language/fannkuch_test.dart
@@ -6,6 +6,8 @@
 // Ported from JavaScript contributed by Isaac Gouy.
 // Description: Repeatedly acccess a tiny integer-sequence.
 
+import "package:expect/expect.dart";
+
 class FannkuchTest {
   static fannkuch(n) {
     var p = new List(n), q = new List(n), s = new List(n);
diff --git a/tests/language/fast_method_extraction_test.dart b/tests/language/fast_method_extraction_test.dart
index 22177c7..e562b60 100644
--- a/tests/language/fast_method_extraction_test.dart
+++ b/tests/language/fast_method_extraction_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that fast method extraction returns correct closure.
 
+import "package:expect/expect.dart";
+
 class A {
   var f;
   A(this.f);
diff --git a/tests/language/fauxverride_test.dart b/tests/language/fauxverride_test.dart
index 3ac1d5d..4bc2d36 100644
--- a/tests/language/fauxverride_test.dart
+++ b/tests/language/fauxverride_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:expect/expect.dart";
+
 // Test the semantics of static members mixed with instance members.
 
 // Following are relevant quotes from Dart Programming Language
diff --git a/tests/language/fibo_test.dart b/tests/language/fibo_test.dart
index 28e3eae..e6f13bd 100644
--- a/tests/language/fibo_test.dart
+++ b/tests/language/fibo_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program calculating the Fibonacci sequence.
 
+import "package:expect/expect.dart";
+
 class Helper {
   static int fibonacci(int n) {
     int a = 0, b = 1, i = 0;
diff --git a/tests/language/field3_negative_test.dart b/tests/language/field3_negative_test.dart
index 6973128..4ee13ba 100644
--- a/tests/language/field3_negative_test.dart
+++ b/tests/language/field3_negative_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test to catch error reporting bugs in class fields declarations.
 
+import "package:expect/expect.dart";
+
 class C {
   final var a = 0;  // illegal: var cannot follow final.
 }
diff --git a/tests/language/field3a_negative_test.dart b/tests/language/field3a_negative_test.dart
index d0706f6..f42779b 100644
--- a/tests/language/field3a_negative_test.dart
+++ b/tests/language/field3a_negative_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test to catch error reporting bugs in class fields declarations.
 
+import "package:expect/expect.dart";
+
 class C {
   final a;  // illegal field declaration - must be initialized
 }
diff --git a/tests/language/field_increment_bailout_test.dart b/tests/language/field_increment_bailout_test.dart
index 8ea2caa..2dc2fe6 100644
--- a/tests/language/field_increment_bailout_test.dart
+++ b/tests/language/field_increment_bailout_test.dart
@@ -4,6 +4,8 @@
 
 // dart2js regression test for issue 8781.
 
+import "package:expect/expect.dart";
+
 class N {
   var outgoing;
   var incoming;
diff --git a/tests/language/field_initialization_order_test.dart b/tests/language/field_initialization_order_test.dart
index 3bf24b6..92fd3df 100644
--- a/tests/language/field_initialization_order_test.dart
+++ b/tests/language/field_initialization_order_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:expect/expect.dart";
+
 // Test that field initializers are evaluated in the right order.
 
 int counter = 0;
diff --git a/tests/language/field_optimization2_test.dart b/tests/language/field_optimization2_test.dart
index d8b6ec3..870d4ed 100644
--- a/tests/language/field_optimization2_test.dart
+++ b/tests/language/field_optimization2_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:expect/expect.dart";
+
 // Dart test program to test type-based optimization on fields.
 
 
diff --git a/tests/language/field_optimization3_test.dart b/tests/language/field_optimization3_test.dart
index 1f11c10..bb551f7 100644
--- a/tests/language/field_optimization3_test.dart
+++ b/tests/language/field_optimization3_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:expect/expect.dart";
+
 // Dart test program to test type-based optimization on fields.
 
 class A {
diff --git a/tests/language/field_optimization_test.dart b/tests/language/field_optimization_test.dart
index 9dea38b..1d1ba3c 100644
--- a/tests/language/field_optimization_test.dart
+++ b/tests/language/field_optimization_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:expect/expect.dart";
+
 // Dart test program to test type-based optimization on fields.
 
 
diff --git a/tests/language/field_override2_test.dart b/tests/language/field_override2_test.dart
index 0a08402..620667eb 100644
--- a/tests/language/field_override2_test.dart
+++ b/tests/language/field_override2_test.dart
@@ -5,6 +5,8 @@
 // Test that we are accessing the right field in a method of a super
 // class, when that field is overridden.
 
+import "package:expect/expect.dart";
+
 class A {
   final a = [42];
   foo() => a[0];
diff --git a/tests/language/field_override_test.dart b/tests/language/field_override_test.dart
index 399fc65..2d3bc5a 100644
--- a/tests/language/field_override_test.dart
+++ b/tests/language/field_override_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test overriding of fields.
 
+import "package:expect/expect.dart";
+
 
 class A {}
 class B1 extends A {}
diff --git a/tests/language/field_parameter_test.dart b/tests/language/field_parameter_test.dart
index 80037f5..8363eb0 100644
--- a/tests/language/field_parameter_test.dart
+++ b/tests/language/field_parameter_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing setting/getting of instance fields.
 
+import "package:expect/expect.dart";
+
 class A {
   var x = 4;
   A(this.x);
diff --git a/tests/language/field_test.dart b/tests/language/field_test.dart
index 6a87019..6a1937f 100644
--- a/tests/language/field_test.dart
+++ b/tests/language/field_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing setting/getting of instance fields.
 
+import "package:expect/expect.dart";
+
 class First {
   First() {}
   var a;
diff --git a/tests/language/final_field_initialization_order_test.dart b/tests/language/final_field_initialization_order_test.dart
index 8735046..7c87dfbc 100644
--- a/tests/language/final_field_initialization_order_test.dart
+++ b/tests/language/final_field_initialization_order_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:expect/expect.dart";
+
 // Test that initializers for final fields are evaluated in the right
 // order.
 
diff --git a/tests/language/final_is_not_const_test.dart b/tests/language/final_is_not_const_test.dart
index 597ff7a..ab0d7b0 100644
--- a/tests/language/final_is_not_const_test.dart
+++ b/tests/language/final_is_not_const_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:expect/expect.dart";
+
 final F0 = 42;
 const C0 = F0;  /// 01: compile-time error
 
diff --git a/tests/language/final_syntax_test.dart b/tests/language/final_syntax_test.dart
index 78a540e..3ac879d 100644
--- a/tests/language/final_syntax_test.dart
+++ b/tests/language/final_syntax_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:expect/expect.dart";
+
 main() {
   final f0 = 42;
   final f1; /// 01: compile-time error
diff --git a/tests/language/final_used_in_try_test.dart b/tests/language/final_used_in_try_test.dart
index 9da3e17..3fbfddf 100644
--- a/tests/language/final_used_in_try_test.dart
+++ b/tests/language/final_used_in_try_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:expect/expect.dart";
+
 main() {
   while (true) {
     final a = 'fff'.substring(1, 2);
diff --git a/tests/language/finally_test.dart b/tests/language/finally_test.dart
index d71dab6..9277416 100644
--- a/tests/language/finally_test.dart
+++ b/tests/language/finally_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:expect/expect.dart";
+
 // Test for a bug in dart2js where the update of a field in a try
 // block would not be seen by the finally block. See dartbug.com/5517.
 
diff --git a/tests/language/first_class_types_constants_test.dart b/tests/language/first_class_types_constants_test.dart
index 6a4c4d4..5dfa136 100644
--- a/tests/language/first_class_types_constants_test.dart
+++ b/tests/language/first_class_types_constants_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:expect/expect.dart";
+
 class C<T> {
   final T t;
   const C(this.t);
diff --git a/tests/language/first_class_types_libraries_test.dart b/tests/language/first_class_types_libraries_test.dart
index db6442f..734be65 100644
--- a/tests/language/first_class_types_libraries_test.dart
+++ b/tests/language/first_class_types_libraries_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library firstClassLibrariestest;
+import "package:expect/expect.dart";
 import 'first_class_types_lib1.dart' as lib1;
 import 'first_class_types_lib2.dart' as lib2;
 
diff --git a/tests/language/first_class_types_literals_test.dart b/tests/language/first_class_types_literals_test.dart
index 31724b6..896ba5d 100644
--- a/tests/language/first_class_types_literals_test.dart
+++ b/tests/language/first_class_types_literals_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:expect/expect.dart";
+
 class C<T, U, V> {}
 
 class D {}
diff --git a/tests/language/first_class_types_test.dart b/tests/language/first_class_types_test.dart
index 95090d6..6b65f5a 100644
--- a/tests/language/first_class_types_test.dart
+++ b/tests/language/first_class_types_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:expect/expect.dart";
+
 class C<T> {}
 
 sameType(a, b) {
diff --git a/tests/language/fixed_length_test.dart b/tests/language/fixed_length_test.dart
index 0e8ab56..6d0d85d 100644
--- a/tests/language/fixed_length_test.dart
+++ b/tests/language/fixed_length_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:expect/expect.dart";
+
 // Regression test for https://code.google.com/p/dart/issues/detail?id=7994.
 
 void main() {
diff --git a/tests/language/for2_test.dart b/tests/language/for2_test.dart
index 7477565..52686e2 100644
--- a/tests/language/for2_test.dart
+++ b/tests/language/for2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing for statement which captures loop variable.
 
+import "package:expect/expect.dart";
+
 var f;
 
 main() {
diff --git a/tests/language/for_in_test.dart b/tests/language/for_in_test.dart
index 0f910eb..4360a489 100644
--- a/tests/language/for_in_test.dart
+++ b/tests/language/for_in_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:expect/expect.dart";
+
 // Dart test for testing for in on a list literal.
 
 class ForInTest {
diff --git a/tests/language/for_test.dart b/tests/language/for_test.dart
index 3aed595..8576acb 100644
--- a/tests/language/for_test.dart
+++ b/tests/language/for_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing for statement.
 
+import "package:expect/expect.dart";
+
 class Helper {
   static int f1() {
     for (;;) return 1;
diff --git a/tests/language/for_without_condition_test.dart b/tests/language/for_without_condition_test.dart
index a0860b7..b63739d 100644
--- a/tests/language/for_without_condition_test.dart
+++ b/tests/language/for_without_condition_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:expect/expect.dart";
+
 main() {
   int i = 0;
   for (;; i++) {
diff --git a/tests/language/full_stacktrace1_test.dart b/tests/language/full_stacktrace1_test.dart
index 37ac2bc..4bef00e 100644
--- a/tests/language/full_stacktrace1_test.dart
+++ b/tests/language/full_stacktrace1_test.dart
@@ -1,3 +1,9 @@
+// (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";
+
 void func1() {
   throw new Exception("Test peanut gallery request for Full stacktrace");
 }
diff --git a/tests/language/full_stacktrace2_test.dart b/tests/language/full_stacktrace2_test.dart
index 93625c9..7f45706 100644
--- a/tests/language/full_stacktrace2_test.dart
+++ b/tests/language/full_stacktrace2_test.dart
@@ -1,3 +1,9 @@
+// (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";
+
 void func1() {
   throw new Exception("Test peanut gallery request for Full stacktrace");
 }
diff --git a/tests/language/full_stacktrace3_test.dart b/tests/language/full_stacktrace3_test.dart
index 64abc93..4bacd04 100644
--- a/tests/language/full_stacktrace3_test.dart
+++ b/tests/language/full_stacktrace3_test.dart
@@ -1,3 +1,9 @@
+// (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";
+
 void func1() {
   throw new Exception("Test peanut gallery request for Full stacktrace");
 }
diff --git a/tests/language/function_argument_test.dart b/tests/language/function_argument_test.dart
index f718965..b0cb5bb 100644
--- a/tests/language/function_argument_test.dart
+++ b/tests/language/function_argument_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for function passing.
 
+import "package:expect/expect.dart";
+
 class FunctionArgumentTest {
   static testMe(Function f) {
     return f();
diff --git a/tests/language/function_field_test.dart b/tests/language/function_field_test.dart
index 8c44b17..7b0966e 100644
--- a/tests/language/function_field_test.dart
+++ b/tests/language/function_field_test.dart
@@ -5,6 +5,8 @@
 //
 // Test of calling Function, which is field of some class.
 
+import "package:expect/expect.dart";
+
 class Wrapper {
   Function f;
 }
diff --git a/tests/language/function_getter_test.dart b/tests/language/function_getter_test.dart
index d927a04..efc483e 100644
--- a/tests/language/function_getter_test.dart
+++ b/tests/language/function_getter_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:expect/expect.dart";
+
 class A {
   a() => 42;
 }
diff --git a/tests/language/function_literals2_test.dart b/tests/language/function_literals2_test.dart
index 420892b..3572cbe 100644
--- a/tests/language/function_literals2_test.dart
+++ b/tests/language/function_literals2_test.dart
@@ -4,6 +4,8 @@
 //
 // Dart test for new function type alias.
 
+import "package:expect/expect.dart";
+
 class FunctionLiteralsTest {
 
   static void testMain() {
diff --git a/tests/language/function_literals_test.dart b/tests/language/function_literals_test.dart
index 2f321ee..92c2ee2 100644
--- a/tests/language/function_literals_test.dart
+++ b/tests/language/function_literals_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:expect/expect.dart";
+
 /**
  * Test various forms of function literals.
  */
diff --git a/tests/language/function_malformed_result_type_test.dart b/tests/language/function_malformed_result_type_test.dart
index c41936e..d010be7 100644
--- a/tests/language/function_malformed_result_type_test.dart
+++ b/tests/language/function_malformed_result_type_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for a function with a malformed result type.
 
+import "package:expect/expect.dart";
+
 class C<T, U> {}
 
 isCheckedMode() {
diff --git a/tests/language/function_syntax_test.dart b/tests/language/function_syntax_test.dart
index 4fc4ac3..ff96445 100644
--- a/tests/language/function_syntax_test.dart
+++ b/tests/language/function_syntax_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:expect/expect.dart";
+
 // Tests function statement and expression syntax.
 
 class FunctionSyntaxTest {
diff --git a/tests/language/function_test.dart b/tests/language/function_test.dart
index f917531..243eb4b 100644
--- a/tests/language/function_test.dart
+++ b/tests/language/function_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:expect/expect.dart";
+
 // Tests function statements and expressions.
 
 class Bug4089219 {
diff --git a/tests/language/function_type_alias2_test.dart b/tests/language/function_type_alias2_test.dart
index f2c03c5..bce01b0 100644
--- a/tests/language/function_type_alias2_test.dart
+++ b/tests/language/function_type_alias2_test.dart
@@ -5,6 +5,8 @@
 //
 // Dart test for function type alias with optional parameters.
 
+import "package:expect/expect.dart";
+
 typedef int f1<T>([int a, int b, T c]);
 typedef int f2<T>([int a, int b, T d]);
 typedef int f3<T>({int a, int b, T c});
diff --git a/tests/language/function_type_alias3_test.dart b/tests/language/function_type_alias3_test.dart
index fe61988..043c02e 100644
--- a/tests/language/function_type_alias3_test.dart
+++ b/tests/language/function_type_alias3_test.dart
@@ -6,6 +6,7 @@
 // to have the same name as a type parameter.
 
 library main;
+import "package:expect/expect.dart";
 import "library11.dart" as lib11;
 
 typedef lib11.Library111<Library111>
diff --git a/tests/language/function_type_alias4_test.dart b/tests/language/function_type_alias4_test.dart
index 465f0a7..b517423 100644
--- a/tests/language/function_type_alias4_test.dart
+++ b/tests/language/function_type_alias4_test.dart
@@ -4,6 +4,8 @@
 //
 // Dart test for function type alias with a type parameter as result type.
 
+import "package:expect/expect.dart";
+
 typedef bool F<bool>(bool a);  // 'bool' is not the boolean type.
 
 bool bar(bool a) {
diff --git a/tests/language/function_type_alias6_test.dart b/tests/language/function_type_alias6_test.dart
index 15fe9b6..59e78af 100644
--- a/tests/language/function_type_alias6_test.dart
+++ b/tests/language/function_type_alias6_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for legally self referencing function type alias.
 
+import "package:expect/expect.dart";
+
 typedef F(List<F> x);
 
 typedef D C();
diff --git a/tests/language/function_type_alias_test.dart b/tests/language/function_type_alias_test.dart
index e1bf33b..c52700f 100644
--- a/tests/language/function_type_alias_test.dart
+++ b/tests/language/function_type_alias_test.dart
@@ -5,6 +5,8 @@
 //
 // Dart test for function type alias.
 
+import "package:expect/expect.dart";
+
 typedef Fun(a, b);
 
 typedef int IntFun(a, b);
diff --git a/tests/language/function_type_parameter2_test.dart b/tests/language/function_type_parameter2_test.dart
index 77d3d21..ce3d014 100644
--- a/tests/language/function_type_parameter2_test.dart
+++ b/tests/language/function_type_parameter2_test.dart
@@ -4,6 +4,8 @@
 // Test to check that we can parse closure type formal parameters with
 // default value.
 
+import "package:expect/expect.dart";
+
 class FunctionTypeParameterTest {
 
   static var formatter;
diff --git a/tests/language/function_type_parameter_test.dart b/tests/language/function_type_parameter_test.dart
index 3f23daf..7ffe052 100644
--- a/tests/language/function_type_parameter_test.dart
+++ b/tests/language/function_type_parameter_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:expect/expect.dart";
+
 // Test to check that we can parse closure type formal parameters with
 // default value.
 
diff --git a/tests/language/function_type_test.dart b/tests/language/function_type_test.dart
index 4beb620..b58c9a4 100644
--- a/tests/language/function_type_test.dart
+++ b/tests/language/function_type_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for a function type test that cannot be eliminated at compile time.
 
+import "package:expect/expect.dart";
+
 isCheckedMode() {
   try {
     var i = 1;
diff --git a/tests/language/function_type_this_parameter_test.dart b/tests/language/function_type_this_parameter_test.dart
index cb7d6c5..4ce65c7 100644
--- a/tests/language/function_type_this_parameter_test.dart
+++ b/tests/language/function_type_this_parameter_test.dart
@@ -4,6 +4,8 @@
 // Check that function types are accepted for constructor arguments that
 // initialize fields.
 
+import "package:expect/expect.dart";
+
 class A {
   Function f;
   A(int this.f());
diff --git a/tests/language/generic2_test.dart b/tests/language/generic2_test.dart
index 9048978..00cf5e6 100644
--- a/tests/language/generic2_test.dart
+++ b/tests/language/generic2_test.dart
@@ -4,6 +4,8 @@
 
 // Test is-tests with type variables.
 
+import "package:expect/expect.dart";
+
 class A<T> {
   foo(o) => o is T;
 }
diff --git a/tests/language/generic_creation_test.dart b/tests/language/generic_creation_test.dart
index 4bfd4d4..8086f89 100644
--- a/tests/language/generic_creation_test.dart
+++ b/tests/language/generic_creation_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:expect/expect.dart";
+
 class A<X, Y, Z> {
   shift() => new A<Z, X, Y>();
   swap() => new A<Z, Y, X>();
diff --git a/tests/language/generic_deep_test.dart b/tests/language/generic_deep_test.dart
index 73e018c..d3ee241 100644
--- a/tests/language/generic_deep_test.dart
+++ b/tests/language/generic_deep_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:expect/expect.dart";
+
 // Dart test for deeply nested generic types.
 
 /** A natural number aka Peano number. */
diff --git a/tests/language/generic_inheritance_test.dart b/tests/language/generic_inheritance_test.dart
index 487c9ca..fec8adb 100644
--- a/tests/language/generic_inheritance_test.dart
+++ b/tests/language/generic_inheritance_test.dart
@@ -5,6 +5,8 @@
 // Test verifying that the type argument vector of subclasses are properly
 // initialized by the class finalizer.
 
+import "package:expect/expect.dart";
+
 class A<T> { A(); }
 class B extends A<Object> { B(); }
 class C extends B { C(); }
diff --git a/tests/language/generic_instanceof2_test.dart b/tests/language/generic_instanceof2_test.dart
index bb4d45f..38fdbcd 100644
--- a/tests/language/generic_instanceof2_test.dart
+++ b/tests/language/generic_instanceof2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that instanceof works correctly with type variables.
 
+import "package:expect/expect.dart";
+
 // Test that partially typed generic instances are correctly constructed.
 
 // Test factory case.
diff --git a/tests/language/generic_instanceof3_test.dart b/tests/language/generic_instanceof3_test.dart
index 27938f3..293880f 100644
--- a/tests/language/generic_instanceof3_test.dart
+++ b/tests/language/generic_instanceof3_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing the instanceof operation.
 
+import "package:expect/expect.dart";
+
 // Tests involving generics.
 
 abstract class I<T> {
diff --git a/tests/language/generic_instanceof_test.dart b/tests/language/generic_instanceof_test.dart
index 64a40aa..597651b 100644
--- a/tests/language/generic_instanceof_test.dart
+++ b/tests/language/generic_instanceof_test.dart
@@ -4,6 +4,7 @@
 // Test that instanceof works correctly with type variables.
 
 library GenericInstanceofTest.dart;
+import "package:expect/expect.dart";
 part "generic_instanceof.dart";
 
 main() {
diff --git a/tests/language/generic_is_check_test.dart b/tests/language/generic_is_check_test.dart
index 4e13c1f..810964c 100644
--- a/tests/language/generic_is_check_test.dart
+++ b/tests/language/generic_is_check_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:expect/expect.dart";
+
 class A<T> {
   foo() => this is A<int>;
 }
diff --git a/tests/language/generic_native_test.dart b/tests/language/generic_native_test.dart
index 53e4c78..80eb8fe 100644
--- a/tests/language/generic_native_test.dart
+++ b/tests/language/generic_native_test.dart
@@ -4,6 +4,8 @@
 
 // Test is-tests with type variables on native subclasses.
 
+import "package:expect/expect.dart";
+
 class A<T> {
   foo(o) => o is T;
 }
@@ -16,9 +18,6 @@
   Expect.isTrue(new A<Iterable<B>>().foo(new List<B>()));
   Expect.isFalse(new A<Iterable<C>>().foo(new List<B>()));
 
-  Expect.isTrue(new A<Collection<B>>().foo(new List<B>()));
-  Expect.isFalse(new A<Collection<C>>().foo(new List<B>()));
-
   Expect.isTrue(new A<Pattern>().foo('hest'));
 
   Expect.isTrue(new A<Comparable<String>>().foo('hest'));
diff --git a/tests/language/generic_parameterized_extends_test.dart b/tests/language/generic_parameterized_extends_test.dart
index bef0d71..e275dd3 100644
--- a/tests/language/generic_parameterized_extends_test.dart
+++ b/tests/language/generic_parameterized_extends_test.dart
@@ -4,6 +4,8 @@
 //
 // Test verifying that generic extends are processed correctly.
 
+import "package:expect/expect.dart";
+
 class A<T> {}
 class B<T1, T2 extends A<T1>> {}
 class C<T1 extends A<T2>, T2> {}
diff --git a/tests/language/generic_syntax_test.dart b/tests/language/generic_syntax_test.dart
index 9b2273e..bb8850a 100644
--- a/tests/language/generic_syntax_test.dart
+++ b/tests/language/generic_syntax_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:expect/expect.dart";
+
 // Dart test verifying that the parser does not confuse parameterized types with
 // boolean expressions, since both contain '<'.
 
diff --git a/tests/language/generic_test.dart b/tests/language/generic_test.dart
index 6b4236e..55c6d41 100644
--- a/tests/language/generic_test.dart
+++ b/tests/language/generic_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // VMOptions=--checked
-//
 // Dart test program testing generic type allocations and generic type tests.
+import "package:expect/expect.dart";
 
 class A {
   const A();
diff --git a/tests/language/generics_test.dart b/tests/language/generics_test.dart
index a077b98..dc240bd 100644
--- a/tests/language/generics_test.dart
+++ b/tests/language/generics_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for generic types.
 
+import "package:expect/expect.dart";
+
 class GenericsTest<T,V> implements Map<int, int> {
   static int myFunc(bool a, bool b) {
     Expect.equals(true, a);
diff --git a/tests/language/getter_closure_execution_order_test.dart b/tests/language/getter_closure_execution_order_test.dart
index 05011f6..ad5daaf 100644
--- a/tests/language/getter_closure_execution_order_test.dart
+++ b/tests/language/getter_closure_execution_order_test.dart
@@ -5,6 +5,8 @@
 // Test that a getter is evaluated after the arguments, when a getter is
 // for invoking a method. See chapter 'Method Invocation' in specification.
 
+import "package:expect/expect.dart";
+
 var counter = 0;
 
 class Test1 {
diff --git a/tests/language/getter_no_setter2_test.dart b/tests/language/getter_no_setter2_test.dart
index c7b8859..62444b7 100644
--- a/tests/language/getter_no_setter2_test.dart
+++ b/tests/language/getter_no_setter2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Verifies behavior with a static getter, but no field and no setter.
 
+import "package:expect/expect.dart";
+
 class Example {
   static int _var = 1;
   static int get nextVar => _var++;
diff --git a/tests/language/getter_no_setter_test.dart b/tests/language/getter_no_setter_test.dart
index eb8075a..d48864f 100644
--- a/tests/language/getter_no_setter_test.dart
+++ b/tests/language/getter_no_setter_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Verifies behavior with a static getter, but no field and no setter.
 
+import "package:expect/expect.dart";
+
 class Example {
   static int _var = 1;
   static int get nextVar => _var++;
diff --git a/tests/language/getter_setter_in_lib_test.dart b/tests/language/getter_setter_in_lib_test.dart
index 968d6fe..deba2ba 100644
--- a/tests/language/getter_setter_in_lib_test.dart
+++ b/tests/language/getter_setter_in_lib_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library GetterSetterInLibTest;
+import "package:expect/expect.dart";
 import 'getter_setter_in_lib.dart';
 
 main() {
diff --git a/tests/language/getter_setter_interceptor_test.dart b/tests/language/getter_setter_interceptor_test.dart
index 8423fab..1e55875 100644
--- a/tests/language/getter_setter_interceptor_test.dart
+++ b/tests/language/getter_setter_interceptor_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:expect/expect.dart";
+
 class A {
   int length = 0;
 }
diff --git a/tests/language/getter_setter_order_test.dart b/tests/language/getter_setter_order_test.dart
index 0805df8..feada29 100644
--- a/tests/language/getter_setter_order_test.dart
+++ b/tests/language/getter_setter_order_test.dart
@@ -4,6 +4,8 @@
 
 // Test for the evaluation order of getters and setters.
 
+import 'package:expect/expect.dart';
+
 var trace;
 
 class X {
diff --git a/tests/language/getters_setters2_test.dart b/tests/language/getters_setters2_test.dart
index 3807597..8f62f05 100644
--- a/tests/language/getters_setters2_test.dart
+++ b/tests/language/getters_setters2_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:expect/expect.dart";
+
 // Tests classes with getters and setters that do not have the same type.
 
 class A {
diff --git a/tests/language/getters_setters_test.dart b/tests/language/getters_setters_test.dart
index 010855b..1511e77 100644
--- a/tests/language/getters_setters_test.dart
+++ b/tests/language/getters_setters_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:expect/expect.dart";
+
 class GettersSettersTest {
 
   static int foo;
diff --git a/tests/language/getters_setters_type2_test.dart b/tests/language/getters_setters_type2_test.dart
index dbf0316..22a3264 100644
--- a/tests/language/getters_setters_type2_test.dart
+++ b/tests/language/getters_setters_type2_test.dart
@@ -5,6 +5,8 @@
 // two types are assignable.
 // @static-clean
 
+import "package:expect/expect.dart";
+
 int bar = 499;
 
 int get foo => bar;
diff --git a/tests/language/getters_setters_type3_test.dart b/tests/language/getters_setters_type3_test.dart
index 25d4888..aaa8b35 100644
--- a/tests/language/getters_setters_type3_test.dart
+++ b/tests/language/getters_setters_type3_test.dart
@@ -5,6 +5,8 @@
 // two types are assignable.
 // @static-clean
 
+import "package:expect/expect.dart";
+
 int bar = 499;
 
 get foo => bar;
diff --git a/tests/language/getters_setters_type_test.dart b/tests/language/getters_setters_type_test.dart
index 39b84ae..547a74c 100644
--- a/tests/language/getters_setters_type_test.dart
+++ b/tests/language/getters_setters_type_test.dart
@@ -4,6 +4,8 @@
 // Getters and setters can have different types, but it is a warning if the
 // two types are not assignable.
 
+import "package:expect/expect.dart";
+
 int bar = 499;
 
 int  /// 01: static type warning
diff --git a/tests/language/gvn_field_access_test.dart b/tests/language/gvn_field_access_test.dart
index 79359f2..cf124b1 100644
--- a/tests/language/gvn_field_access_test.dart
+++ b/tests/language/gvn_field_access_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:expect/expect.dart";
+
 class A {
   var y = 0;
   foo(x) {
diff --git a/tests/language/gvn_interceptor_test.dart b/tests/language/gvn_interceptor_test.dart
index 9e75f20..d638a23 100644
--- a/tests/language/gvn_interceptor_test.dart
+++ b/tests/language/gvn_interceptor_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:expect/expect.dart";
+
 foo(a, index) {
   if (a.length < index) {
    for (int i = a.length; i <= index; i++) a.add(i);
diff --git a/tests/language/gvn_test.dart b/tests/language/gvn_test.dart
index b4859bf..a52944d 100644
--- a/tests/language/gvn_test.dart
+++ b/tests/language/gvn_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:expect/expect.dart";
+
 class A {
   int x = 0;
 
diff --git a/tests/language/hash_code_mangling_test.dart b/tests/language/hash_code_mangling_test.dart
index 07b01a4..615da7b 100644
--- a/tests/language/hash_code_mangling_test.dart
+++ b/tests/language/hash_code_mangling_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:expect/expect.dart";
+
 class Foo {
   var $identityHash;
 }
diff --git a/tests/language/hello_script_lib.dart b/tests/language/hello_script_lib.dart
index 95ed82e..92a0976 100644
--- a/tests/language/hello_script_lib.dart
+++ b/tests/language/hello_script_lib.dart
@@ -6,6 +6,7 @@
 // This file contains the library.
 
 library HelloScriptLib;
+import "package:expect/expect.dart";
 part "hello_script_lib_source.dart";
 
 class HelloLib {
diff --git a/tests/language/hello_script_test.dart b/tests/language/hello_script_test.dart
index b81e697..e5ab7c4 100644
--- a/tests/language/hello_script_test.dart
+++ b/tests/language/hello_script_test.dart
@@ -7,6 +7,7 @@
 // This file contains the script (aka root library).
 
 library HelloScriptTest.dart;
+import "package:expect/expect.dart";
 import "hello_script_lib.dart";
 
 main() {
diff --git a/tests/language/identical_closure2_test.dart b/tests/language/identical_closure2_test.dart
index 1217ad5..94c956a 100644
--- a/tests/language/identical_closure2_test.dart
+++ b/tests/language/identical_closure2_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:expect/expect.dart";
+
 var myIdentical = identical;
 
 class Point {
diff --git a/tests/language/identical_closure_test.dart b/tests/language/identical_closure_test.dart
index 2ce5373..fc1a556e3 100644
--- a/tests/language/identical_closure_test.dart
+++ b/tests/language/identical_closure_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:expect/expect.dart";
+
 var myIdentical = identical;
 
 class Point {
diff --git a/tests/language/identical_test.dart b/tests/language/identical_test.dart
index 1533890..8a3887e 100644
--- a/tests/language/identical_test.dart
+++ b/tests/language/identical_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test efficient and correct implementation of !identical(a, b).
 
+import 'package:expect/expect.dart';
+
 notIdenticalTest1(a) {
   if (!identical("ho", a)) {
     return 2;
diff --git a/tests/language/if_and_test.dart b/tests/language/if_and_test.dart
index 0b0cc84..55c28da 100644
--- a/tests/language/if_and_test.dart
+++ b/tests/language/if_and_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:expect/expect.dart";
+
 // The "if (negative) res2 |= 3" below can be emitted as negative && (res2 |= 3)
 // in JavaScript. Dart2js produced the wrong output.
 
diff --git a/tests/language/if_conversion_vm_test.dart b/tests/language/if_conversion_vm_test.dart
new file mode 100644
index 0000000..22e6203
--- /dev/null
+++ b/tests/language/if_conversion_vm_test.dart
@@ -0,0 +1,92 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test if-convertion pass in the optimizing compiler.
+
+import "package:expect/expect.dart";
+
+f1(i) => (i == 0) ? 0 : 1;
+f2(i) => (i == 0) ? 2 : 3;
+f3(i) => (i == null) ? 0 : 1;
+f4(i) => (i == null) ? 2 : 3;
+
+f5(i) => (i != 0) ? 0 : 1;
+f6(i) => (i != 0) ? 2 : 3;
+f7(i) => (i != null) ? 0 : 1;
+f8(i) => (i != null) ? 2 : 3;
+
+f9(i) => identical(i, 0) ? 0 : 1;
+f10(i) => identical(i, 0) ? 2 : 3;
+f11(i) => identical(i, null) ? 0 : 1;
+f12(i) => identical(i, null) ? 2 : 3;
+
+f13(i) => !identical(i, 0) ? 0 : 1;
+f14(i) => !identical(i, 0) ? 2 : 3;
+f15(i) => !identical(i, null) ? 0 : 1;
+f16(i) => !identical(i, null) ? 2 : 3;
+
+const POWER_OF_2 = 0x1000000000;
+
+bigPower(i) => (i == 11) ? 0 : POWER_OF_2;
+
+main() {
+  for (var i = 0; i < 10000; i++) {
+    f1(i);
+    f2(i);
+    f3(i);
+    f4(i);
+    f5(i);
+    f6(i);
+    f7(i);
+    f8(i);
+    f9(i);
+    f10(i);
+    f11(i);
+    f12(i);
+    f13(i);
+    f14(i);
+    f15(i);
+    f16(i);
+    bigPower(i);
+  }
+
+  Expect.equals(0, f1(0));
+  Expect.equals(1, f1(44));
+  Expect.equals(2, f2(0));
+  Expect.equals(3, f2(44));
+  Expect.equals(0, f3(null));
+  Expect.equals(1, f3(44));
+  Expect.equals(2, f4(null));
+  Expect.equals(3, f4(44));
+
+  Expect.equals(1, f5(0));
+  Expect.equals(0, f5(44));
+  Expect.equals(3, f6(0));
+  Expect.equals(2, f6(44));
+  Expect.equals(1, f7(null));
+  Expect.equals(0, f7(44));
+  Expect.equals(3, f8(null));
+  Expect.equals(2, f8(44));
+
+  Expect.equals(0, f9(0));
+  Expect.equals(1, f9(44));
+  Expect.equals(2, f10(0));
+  Expect.equals(3, f10(44));
+  Expect.equals(0, f11(null));
+  Expect.equals(1, f11(44));
+  Expect.equals(2, f12(null));
+  Expect.equals(3, f12(44));
+
+  Expect.equals(1, f13(0));
+  Expect.equals(0, f13(44));
+  Expect.equals(3, f14(0));
+  Expect.equals(2, f14(44));
+  Expect.equals(1, f15(null));
+  Expect.equals(0, f15(44));
+  Expect.equals(3, f16(null));
+  Expect.equals(2, f16(44));
+
+  Expect.equals(0, bigPower(11));
+  Expect.equals(POWER_OF_2, bigPower(12));
+}
\ No newline at end of file
diff --git a/tests/language/if_test.dart b/tests/language/if_test.dart
index ebf32a8..1a64faf 100644
--- a/tests/language/if_test.dart
+++ b/tests/language/if_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing if statement.
 
+import "package:expect/expect.dart";
+
 class Helper {
   static int f0(bool b) {
     if (b);
diff --git a/tests/language/implicit_closure2_test.dart b/tests/language/implicit_closure2_test.dart
index 40c47be..104154a 100644
--- a/tests/language/implicit_closure2_test.dart
+++ b/tests/language/implicit_closure2_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:expect/expect.dart";
+
 class B {
   foo(i) => 499 + i;
 }
diff --git a/tests/language/implicit_closure_test.dart b/tests/language/implicit_closure_test.dart
index 3c61714..b5f8b8b 100644
--- a/tests/language/implicit_closure_test.dart
+++ b/tests/language/implicit_closure_test.dart
@@ -5,6 +5,8 @@
 // VMOptions=
 // VMOptions=--use_slow_path
 
+import "package:expect/expect.dart";
+
 class First {
   First(this.i) {}
   var b;
diff --git a/tests/language/implicit_scope_test.dart b/tests/language/implicit_scope_test.dart
index 3446fb2..26cb13c 100644
--- a/tests/language/implicit_scope_test.dart
+++ b/tests/language/implicit_scope_test.dart
@@ -4,6 +4,8 @@
 // Test that if, while etc create an implicit scope if the body
 // is not a compound statement.
 
+import "package:expect/expect.dart";
+
 class ImplicitScopeTest {
   static bool alwaysTrue() {
     return 1 + 1 == 2;
diff --git a/tests/language/implicit_this_test.dart b/tests/language/implicit_this_test.dart
index f6ebd58..490e7e1 100644
--- a/tests/language/implicit_this_test.dart
+++ b/tests/language/implicit_this_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:expect/expect.dart";
+
 abstract class Interface {
   final x;
 }
diff --git a/tests/language/implied_interface_test.dart b/tests/language/implied_interface_test.dart
index 93d0d6e..36acb25 100644
--- a/tests/language/implied_interface_test.dart
+++ b/tests/language/implied_interface_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:expect/expect.dart";
+
 class BaseClass {
   var foo;
   BaseClass() { foo = 0; }
diff --git a/tests/language/import_combinators_test.dart b/tests/language/import_combinators_test.dart
index 0d91356..e975fb3 100644
--- a/tests/language/import_combinators_test.dart
+++ b/tests/language/import_combinators_test.dart
@@ -5,6 +5,7 @@
 // Dart test program importing with show/hide combinators.
 
 library importCombinatorsTest;
+import "package:expect/expect.dart";
 import "import1_lib.dart" show hide, show hide ugly;
 import "export1_lib.dart";
 import "dart:math" as M show E;
diff --git a/tests/language/import_core_prefix_test.dart b/tests/language/import_core_prefix_test.dart
index a3a7c93..ec237ff 100644
--- a/tests/language/import_core_prefix_test.dart
+++ b/tests/language/import_core_prefix_test.dart
@@ -4,6 +4,7 @@
 // Test explicit import of dart:core in the source code..
 
 library ImportCorePrefixTest.dart;
+import "package:expect/expect.dart";
 import "dart:core" as mycore;
 
 class Object {
@@ -30,6 +31,6 @@
 
   var greenwich = new Map(51, 0);
   var kpao = new Map(37, -122);
-  mycore.Expect.isTrue(greenwich.isPrimeMeridian);
-  mycore.Expect.isFalse(kpao.isPrimeMeridian);
+  Expect.isTrue(greenwich.isPrimeMeridian);
+  Expect.isFalse(kpao.isPrimeMeridian);
 }
diff --git a/tests/language/incr_op_test.dart b/tests/language/incr_op_test.dart
index be772e7..9050a41 100644
--- a/tests/language/incr_op_test.dart
+++ b/tests/language/incr_op_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing increment operator.
 
+import "package:expect/expect.dart";
+
 class A {
   static var yy;
   static set y(v) {
diff --git a/tests/language/index_test.dart b/tests/language/index_test.dart
index 9e1c634..2fd48d1 100644
--- a/tests/language/index_test.dart
+++ b/tests/language/index_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing index operators.
 
+import "package:expect/expect.dart";
+
 class Helper {
   static int fibonacci(int n) {
     int a = 0, b = 1, i = 0;
diff --git a/tests/language/infinity_test.dart b/tests/language/infinity_test.dart
index 7ac9f31..c7b0272 100644
--- a/tests/language/infinity_test.dart
+++ b/tests/language/infinity_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:expect/expect.dart";
+
 int inscrutable(int x) => x == 0 ? 0 : x | inscrutable(x & (x - 1));
 
 main() {
diff --git a/tests/language/inline_argument_test.dart b/tests/language/inline_argument_test.dart
index a04786f..61761c5 100644
--- a/tests/language/inline_argument_test.dart
+++ b/tests/language/inline_argument_test.dart
@@ -4,6 +4,8 @@
 // Test that when inlining A.foo, we're not evaluating the argument
 // twice.
 
+import "package:expect/expect.dart";
+
 class A {
   var field = 0;
 
diff --git a/tests/language/inline_closure_with_constant_arguments_test.dart b/tests/language/inline_closure_with_constant_arguments_test.dart
index 0182453..b5e8eba 100644
--- a/tests/language/inline_closure_with_constant_arguments_test.dart
+++ b/tests/language/inline_closure_with_constant_arguments_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:expect/expect.dart";
+
 // Test inlining of a closure call with constant propagation.
 primeForSmis(bool b) {
   smi_op(a, b) => a + b;
diff --git a/tests/language/inline_effect_context_test.dart b/tests/language/inline_effect_context_test.dart
index 73fd50a..fcb5dbd 100644
--- a/tests/language/inline_effect_context_test.dart
+++ b/tests/language/inline_effect_context_test.dart
@@ -5,6 +5,8 @@
 // Optimize function foo with instance of A and inlined function bar. Call later
 // with instance of B and cause deoptimization.
 
+import "package:expect/expect.dart";
+
 class A {
   var x = 1;
 }
diff --git a/tests/language/inline_getter_test.dart b/tests/language/inline_getter_test.dart
index eb671f9..27322c8 100644
--- a/tests/language/inline_getter_test.dart
+++ b/tests/language/inline_getter_test.dart
@@ -5,6 +5,8 @@
 // Three classes access always the same field. Optimize method foo and inline
 // getter for classes 'A' and 'B'. Call later via 'C' and cause deoptimization.
 
+import "package:expect/expect.dart";
+
 class A {
   int f;
   A(this.f) {}
diff --git a/tests/language/inline_super_field_test.dart b/tests/language/inline_super_field_test.dart
index 2daa34d..a3dc029 100644
--- a/tests/language/inline_super_field_test.dart
+++ b/tests/language/inline_super_field_test.dart
@@ -7,6 +7,7 @@
 
 library inline_super_field_test;
 
+import 'package:expect/expect.dart';
 import "inline_super_field_lib.dart";
 
 class S {
diff --git a/tests/language/inline_super_test.dart b/tests/language/inline_super_test.dart
index 9305984..7ed155b 100644
--- a/tests/language/inline_super_test.dart
+++ b/tests/language/inline_super_test.dart
@@ -5,6 +5,7 @@
 // Regression test for dart2js issue 6639.
 
 library inline_super_test;
+import "package:expect/expect.dart";
 
 part 'inline_super_part.dart';
 
diff --git a/tests/language/inline_test_context_test.dart b/tests/language/inline_test_context_test.dart
index 7692bff..5ec00d6 100644
--- a/tests/language/inline_test_context_test.dart
+++ b/tests/language/inline_test_context_test.dart
@@ -5,6 +5,8 @@
 // Optimize function foo with instance of A and inlined function bar. Call later
 // with instance of B and cause deoptimization.
 
+import "package:expect/expect.dart";
+
 class A {
   var x = 1;
 }
diff --git a/tests/language/inline_value_context_test.dart b/tests/language/inline_value_context_test.dart
index 8d8e3c1..46cde91 100644
--- a/tests/language/inline_value_context_test.dart
+++ b/tests/language/inline_value_context_test.dart
@@ -5,6 +5,8 @@
 // Optimize function foo with instance of A and inlined function bar. Call later
 // with instance of B and cause deoptimization.
 
+import "package:expect/expect.dart";
+
 class A {
   var x = 1;
 }
diff --git a/tests/language/inlined_throw_test.dart b/tests/language/inlined_throw_test.dart
index 1b1afe1..4394949 100644
--- a/tests/language/inlined_throw_test.dart
+++ b/tests/language/inlined_throw_test.dart
@@ -5,6 +5,8 @@
 // Dart test program to test check that we don't fail to compile when an
 // inlinable method contains a throw.
 
+import 'package:expect/expect.dart';
+
 var x = false;
 
 bool called;
@@ -71,6 +73,12 @@
 yo() {
   throw kast("yo");
 }
+bin() {
+  return 5 * kast("bin");
+}
+binCallThrow() {
+  return callMe() * kast("binct");
+}
 hoo() {
   x[kast("hoo")] = 0;
   x[kast("hoo")];
@@ -85,6 +93,26 @@
   }
 }
 
+class ThrowConstructor {
+  ThrowConstructor() :
+    foo = callMeTrue(),
+    bar = kast("ThrowConstructor") {
+    called = false;
+  }
+
+  bool foo;
+  var bar;
+}
+
+throwConstructor() {
+  called = false;
+  return new ThrowConstructor();
+}
+
+cascade() {
+  return new List()..add(callMeTrue())..add(kast("cascade"));
+}
+
 interpole() => "inter${kast('tada!')}pole";
 interpoleCallThrow() => "inter${callMeTrue()}...${kast('tada!')}pole";
 
@@ -140,6 +168,81 @@
   return(x);
 }
 
+dovileBreakContinue(x) {
+  do {
+    callMe();
+    if (x == 1) break;
+    continue;
+  } while (kast("vile"));
+  return(x);
+}
+
+faar1() {
+  callMe();
+  for (kast("faar"); called = false; called = false) {
+    called = false;
+  }
+}
+
+faar2() {
+  for (callMe(); kast("faar"); called = false) {
+    called = false;
+  }
+}
+
+faar3() {
+  for (; true; kast("faar")) {
+    callMe();
+  }
+  called = false;
+}
+
+faar4() {
+  callMe();
+  for (kast("faar"); called = false; called = false) {
+    called = false;
+    continue;
+  }
+}
+
+faar5() {
+  for (callMe(); kast("faar"); called = false) {
+    called = false;
+    continue;
+  }
+}
+
+faar6() {
+  for (; true; kast("faar")) {
+    callMe();
+    continue;
+  }
+  called = false;
+}
+
+faar7() {
+  callMe();
+  for (kast("faar"); called = false; called = false) {
+    called = false;
+    break;
+  }
+}
+
+faar8() {
+  for (callMe(); kast("faar"); called = false) {
+    called = false;
+    break;
+  }
+}
+
+faar9() {
+  for (; true; kast("faar")) {
+    callMe();
+    break;
+    called = false;
+  }
+}
+
 main() {
   Expect.throws(hest);
   Expect.throws(hest2);
@@ -159,6 +262,8 @@
   Expect.throws(unary);
   testCallThenThrow(boo);
   Expect.throws(yo);
+  Expect.throws(bin);
+  testCallThenThrow(binCallThrow);
   Expect.throws(hoo);
   Expect.throws(switcheroo);
   Expect.throws(interpole);
@@ -176,4 +281,16 @@
   testCallThenThrow(dovile);
   testCall(dovileBreak);
   testCallThenThrow(dovileContinue);
+  testCallThenThrow(throwConstructor);
+  testCallThenThrow(cascade);
+  dovileBreakContinue(1);
+  testCallThenThrow(faar1);
+  testCallThenThrow(faar2);
+  testCallThenThrow(faar3);
+  testCallThenThrow(faar4);
+  testCallThenThrow(faar5);
+  testCallThenThrow(faar6);
+  testCallThenThrow(faar7);
+  testCallThenThrow(faar8);
+  testCall(faar9);
 }
diff --git a/tests/language/inst_field_initializer_test.dart b/tests/language/inst_field_initializer_test.dart
index 43a2c51..6368b8d 100644
--- a/tests/language/inst_field_initializer_test.dart
+++ b/tests/language/inst_field_initializer_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test for instance field initializer expressions.
 
+import "package:expect/expect.dart";
+
 class Cheese {
   static const mild = 1;
   static const stinky = 2;
diff --git a/tests/language/instance_compound_assignment_operator_test.dart b/tests/language/instance_compound_assignment_operator_test.dart
index a69cbe6..bbbb834 100644
--- a/tests/language/instance_compound_assignment_operator_test.dart
+++ b/tests/language/instance_compound_assignment_operator_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test correct instance compound assignment operator.
 
+import "package:expect/expect.dart";
+
 class A {
   A() : f = 2 {}
   var f;
diff --git a/tests/language/instance_field_initializer_test.dart b/tests/language/instance_field_initializer_test.dart
index 20f11ca..1cb5c93 100644
--- a/tests/language/instance_field_initializer_test.dart
+++ b/tests/language/instance_field_initializer_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:expect/expect.dart";
+
 class A {
   int x = 1;
   A() {}
diff --git a/tests/language/instance_incr_deopt_test.dart b/tests/language/instance_incr_deopt_test.dart
index c0e0ffd..b7152e3 100644
--- a/tests/language/instance_incr_deopt_test.dart
+++ b/tests/language/instance_incr_deopt_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:expect/expect.dart";
+
 // Check correct deoptimization of instance field increment.
 
 
diff --git a/tests/language/instance_inline_test.dart b/tests/language/instance_inline_test.dart
index fefdf21..a13d93a 100644
--- a/tests/language/instance_inline_test.dart
+++ b/tests/language/instance_inline_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:expect/expect.dart";
+
 // Test inlining of assignments in parameter passing. If [StringScanner.charAt]
 // is inlined, the argument expresion [: ++byteOffset :] should not be
 // duplicated.
diff --git a/tests/language/instanceof2_test.dart b/tests/language/instanceof2_test.dart
index f93c0b3..2fb30ba 100644
--- a/tests/language/instanceof2_test.dart
+++ b/tests/language/instanceof2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing the instanceof operation.
 
+import "package:expect/expect.dart";
+
 abstract class I { }
 
 abstract class AI implements I { }
diff --git a/tests/language/instanceof3_test.dart b/tests/language/instanceof3_test.dart
index 4921a181..5075840 100644
--- a/tests/language/instanceof3_test.dart
+++ b/tests/language/instanceof3_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing the instanceof operation.
 
+import "package:expect/expect.dart";
+
 // In the type test 'e is T', it is a run-time error if T does not denote a type
 // available in the current lexical scope.
 
diff --git a/tests/language/instanceof4_test.dart b/tests/language/instanceof4_test.dart
index 9fcb54e..489ad2d 100644
--- a/tests/language/instanceof4_test.dart
+++ b/tests/language/instanceof4_test.dart
@@ -4,6 +4,8 @@
 // Dart test program for testing the instanceof operation.
 // Regression test for issue 5216.
 
+import "package:expect/expect.dart";
+
 class Foo<T> {
   bool isT() => "a string" is T;
   bool isNotT() => "a string" is! T;
diff --git a/tests/language/instanceof_test.dart b/tests/language/instanceof_test.dart
index 7233e3c..73bc640 100644
--- a/tests/language/instanceof_test.dart
+++ b/tests/language/instanceof_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:expect/expect.dart";
+
 class InstanceofTest {
 
   InstanceofTest() {}
diff --git a/tests/language/int_test.dart b/tests/language/int_test.dart
index 298f716..f91f90d 100644
--- a/tests/language/int_test.dart
+++ b/tests/language/int_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test basic integer operations.
 
+import "package:expect/expect.dart";
+
 class IntTest {
   static void testMain() {
     Expect.equals(0, 0 + 0);
diff --git a/tests/language/interceptor2_test.dart b/tests/language/interceptor2_test.dart
index 3cff1be..64e0e59 100644
--- a/tests/language/interceptor2_test.dart
+++ b/tests/language/interceptor2_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:expect/expect.dart";
+
 // Regression test for issue http://dartbug.com/6903: dart2js used to
 // not generate an interceptor forwarder when a getter call and a
 // method call on an intercepted method were both used.
diff --git a/tests/language/interceptor3_test.dart b/tests/language/interceptor3_test.dart
index ec9cc6d..a121721 100644
--- a/tests/language/interceptor3_test.dart
+++ b/tests/language/interceptor3_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:expect/expect.dart";
+
 // Test that code motion in the presence of interceptors work in dart2js.
 
 main() {
diff --git a/tests/language/interceptor4_test.dart b/tests/language/interceptor4_test.dart
index 2a7d030..00bac28 100644
--- a/tests/language/interceptor4_test.dart
+++ b/tests/language/interceptor4_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:expect/expect.dart";
+
 // Test that dart2js gets the right interceptor for an int.
 
 main() {
diff --git a/tests/language/interceptor5_test.dart b/tests/language/interceptor5_test.dart
index a74da66..41b76e9 100644
--- a/tests/language/interceptor5_test.dart
+++ b/tests/language/interceptor5_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:expect/expect.dart";
+
 get X => [() => 123];
 
 main() {
diff --git a/tests/language/interceptor6_test.dart b/tests/language/interceptor6_test.dart
index 35f4bd3..208a59d 100644
--- a/tests/language/interceptor6_test.dart
+++ b/tests/language/interceptor6_test.dart
@@ -5,6 +5,8 @@
 // Check that an intercepted call on a method that does not exist does
 // not crash the compiler.
 
+import "package:expect/expect.dart";
+
 main() {
   Expect.throws(() => 42.clamp(), (e) => e is NoSuchMethodError);
 }
diff --git a/tests/language/interceptor7_test.dart b/tests/language/interceptor7_test.dart
index 853523a..965ddfc 100644
--- a/tests/language/interceptor7_test.dart
+++ b/tests/language/interceptor7_test.dart
@@ -5,6 +5,8 @@
 // Test that dart2js uses the right interceptor when call a method on
 // something that has type number.
 
+import 'package:expect/expect.dart';
+
 var array = [];
 
 main() {
diff --git a/tests/language/interceptor_test.dart b/tests/language/interceptor_test.dart
index 2fe247e..cbca9f9 100644
--- a/tests/language/interceptor_test.dart
+++ b/tests/language/interceptor_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:expect/expect.dart";
+
 // Test that interceptors (that is, methods in classes implemented as
 // JavaScript primitives) in dart2js work.
 
diff --git a/tests/language/interface_constants_test.dart b/tests/language/interface_constants_test.dart
index 62875fc..5654066 100644
--- a/tests/language/interface_constants_test.dart
+++ b/tests/language/interface_constants_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:expect/expect.dart";
+
 abstract class Constants {
   static const int FIVE = 5;
 }
diff --git a/tests/language/interface_injection1_negative_test.dart b/tests/language/interface_injection1_negative_test.dart
index 3c6c697..474a27e 100644
--- a/tests/language/interface_injection1_negative_test.dart
+++ b/tests/language/interface_injection1_negative_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:expect/expect.dart";
+
 abstract class S { }
 abstract class I { }
 abstract class I implements S;
diff --git a/tests/language/interface_injection2_negative_test.dart b/tests/language/interface_injection2_negative_test.dart
index fdb7275..29540f3 100644
--- a/tests/language/interface_injection2_negative_test.dart
+++ b/tests/language/interface_injection2_negative_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:expect/expect.dart";
+
 abstract class S { }
 class C { }
 class C implements S;
diff --git a/tests/language/intrinsified_methods_test.dart b/tests/language/intrinsified_methods_test.dart
index 464c4fa..c7792ee 100644
--- a/tests/language/intrinsified_methods_test.dart
+++ b/tests/language/intrinsified_methods_test.dart
@@ -4,6 +4,7 @@
 // Dart test program for testing the instanceof operation.
 
 library intrinsified_methods_test;
+import "package:expect/expect.dart";
 import 'dart:math';
 
 testIsNegative() {
diff --git a/tests/language/invocation_mirror2_test.dart b/tests/language/invocation_mirror2_test.dart
index e320835..f93ac1e 100644
--- a/tests/language/invocation_mirror2_test.dart
+++ b/tests/language/invocation_mirror2_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:expect/expect.dart";
+
 class GetName {
   set flif(_) => "flif=";
 }
diff --git a/tests/language/invocation_mirror_invoke_on2_test.dart b/tests/language/invocation_mirror_invoke_on2_test.dart
index 0e4deac..3b1fc9f 100644
--- a/tests/language/invocation_mirror_invoke_on2_test.dart
+++ b/tests/language/invocation_mirror_invoke_on2_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:expect/expect.dart";
+
 class Proxy {
   final proxied;
   Proxy(this.proxied);
diff --git a/tests/language/invocation_mirror_invoke_on_test.dart b/tests/language/invocation_mirror_invoke_on_test.dart
index f03726c..030fee6 100644
--- a/tests/language/invocation_mirror_invoke_on_test.dart
+++ b/tests/language/invocation_mirror_invoke_on_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:expect/expect.dart";
+
 // Testing InvocationMirror.invokeOn method; test of issue 7227.
 
 var reachedSetX = 0;
diff --git a/tests/language/invocation_mirror_test.dart b/tests/language/invocation_mirror_test.dart
index bb573a4..5c5a91b 100644
--- a/tests/language/invocation_mirror_test.dart
+++ b/tests/language/invocation_mirror_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:expect/expect.dart";
+
 // InvocationMirror and noSuchMethod testing.
 
 /** Class with noSuchMethod that returns the mirror */
diff --git a/tests/language/is_function_test.dart b/tests/language/is_function_test.dart
index 0dce0bb..24e3a8b 100644
--- a/tests/language/is_function_test.dart
+++ b/tests/language/is_function_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:expect/expect.dart";
+
 var staticClosure;
 staticMethod() => 42;
 
diff --git a/tests/language/is_interfaces2_test.dart b/tests/language/is_interfaces2_test.dart
index ce20575..d14f9fa 100644
--- a/tests/language/is_interfaces2_test.dart
+++ b/tests/language/is_interfaces2_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:expect/expect.dart";
+
 class A {
 }
 
diff --git a/tests/language/is_interfaces_test.dart b/tests/language/is_interfaces_test.dart
index 1301c23..dbdfa5d 100644
--- a/tests/language/is_interfaces_test.dart
+++ b/tests/language/is_interfaces_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:expect/expect.dart";
+
 class A {
 }
 
diff --git a/tests/language/is_nan_test.dart b/tests/language/is_nan_test.dart
index 3edfebd..7dcc805 100644
--- a/tests/language/is_nan_test.dart
+++ b/tests/language/is_nan_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:expect/expect.dart";
+
 class A {
   bool get isNaN => false;
 }
diff --git a/tests/language/is_object_test.dart b/tests/language/is_object_test.dart
index 1a47bb2..7dc6574 100644
--- a/tests/language/is_object_test.dart
+++ b/tests/language/is_object_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for the "is" type test operator.
 
+import "package:expect/expect.dart";
+
 testTryCatch(x) {
   try {
     throw x;
diff --git a/tests/language/is_operator_test.dart b/tests/language/is_operator_test.dart
index 406d6bf..e5b0792 100644
--- a/tests/language/is_operator_test.dart
+++ b/tests/language/is_operator_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for the "is" type test operator.
 
+import "package:expect/expect.dart";
+
 abstract class I { }
 
 abstract class AI implements I { }
diff --git a/tests/language/issue4515170_test.dart b/tests/language/issue4515170_test.dart
index c735893..b187204 100644
--- a/tests/language/issue4515170_test.dart
+++ b/tests/language/issue4515170_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:expect/expect.dart";
+
 class Issue4515170Test {
   static const VAL = 3;
   static int defaultVal([int a = VAL]) {
diff --git a/tests/language/issue7513_test.dart b/tests/language/issue7513_test.dart
index 4d503c3..02efb67 100644
--- a/tests/language/issue7513_test.dart
+++ b/tests/language/issue7513_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:expect/expect.dart";
+
 // Regression test for issue 7513.
 
 foo(a, b) {
diff --git a/tests/language/issue7525_test.dart b/tests/language/issue7525_test.dart
index c2b44d5..0ba650b 100644
--- a/tests/language/issue7525_test.dart
+++ b/tests/language/issue7525_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:expect/expect.dart";
+
 // Regression test for issue 7525.
 
 foo() {
diff --git a/tests/language/js_properties_test.dart b/tests/language/js_properties_test.dart
index 6303730..fdca010 100644
--- a/tests/language/js_properties_test.dart
+++ b/tests/language/js_properties_test.dart
@@ -4,6 +4,8 @@
 // Test that JavaScript properties on Object can still be classes in
 // Dart.
 
+import "package:expect/expect.dart";
+
 void main() {
   Expect.equals(42, new __defineGetter__().hello());
   Expect.equals(42, new __defineSetter__().hello());
diff --git a/tests/language/label_test.dart b/tests/language/label_test.dart
index e9affb2..2d524e1 100644
--- a/tests/language/label_test.dart
+++ b/tests/language/label_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program to test check that we can parse labels.
 
+import "package:expect/expect.dart";
+
 
 class Helper {
 
diff --git a/tests/language/language.status b/tests/language/language.status
index f937659..13347e4 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -71,6 +71,9 @@
 super_getter_setter_test: Fail # Issue 8917
 super_operator_index7_test: Fail # Issue 8918
 
+execute_finally10_test: Fail # Issue 430
+execute_finally11_test: Fail # Issue 430
+
 [ $compiler == none && ($system == macos || $system == linux) && $arch == ia32 && $checked ]
 gc_test: Skip  # Issue 1487, flaky.
 
@@ -547,6 +550,9 @@
 super_getter_setter_test: Fail # VM bug: issue 8917
 super_operator_index7_test: Fail # VM bug: issue 8918
 
+execute_finally10_test: Fail # VM bug: issue 430
+execute_finally11_test: Fail # VM bug: issue 430
+
 [ $compiler == dart2dart && $minified ]
 
 # TODO(tball): Assign proper bug numbers.
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 9f28309..10d7d8d 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -342,8 +342,6 @@
 
 
 [ $compiler == dart2js && $runtime == safari ]
-execute_finally8_test: Fail # Issue: 7414
-execute_finally9_test: Fail # Issue: 7414
 null_pointer_exception_test: Fail # Uncaught error: Instance of 'TypeError'
 string_interpolate_npe_test: Fail # Uncaught error: Instance of 'TypeError'
 arithmetic_test: Fail # Issue: 7414
diff --git a/tests/language/lazy_map_test.dart b/tests/language/lazy_map_test.dart
index f1ff770..65fb19b 100644
--- a/tests/language/lazy_map_test.dart
+++ b/tests/language/lazy_map_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:expect/expect.dart";
+
 var data = { 'a': 'a' };
 main() {
   Expect.equals('a', data['a']);
diff --git a/tests/language/lazy_static2_test.dart b/tests/language/lazy_static2_test.dart
index b06db04..72010f0 100644
--- a/tests/language/lazy_static2_test.dart
+++ b/tests/language/lazy_static2_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:expect/expect.dart";
+
 final x = (t) => t + 1;
 
 main() {
diff --git a/tests/language/lazy_static3_test.dart b/tests/language/lazy_static3_test.dart
index aa6c801..76186f6 100644
--- a/tests/language/lazy_static3_test.dart
+++ b/tests/language/lazy_static3_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:expect/expect.dart";
+
 final x = foo();
 var x2 = foo2();
 var x3 = foo3();
diff --git a/tests/language/lazy_static4_test.dart b/tests/language/lazy_static4_test.dart
index 558b388..4e532c9 100644
--- a/tests/language/lazy_static4_test.dart
+++ b/tests/language/lazy_static4_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:expect/expect.dart";
+
 final x = foo(499);
 final y = foo(41) + 1;
 
diff --git a/tests/language/lazy_static5_test.dart b/tests/language/lazy_static5_test.dart
index 00b30bb..66b9b61 100644
--- a/tests/language/lazy_static5_test.dart
+++ b/tests/language/lazy_static5_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:expect/expect.dart";
+
 final x = (t) => (u) => t + u;
 
 main() {
diff --git a/tests/language/lazy_static6_test.dart b/tests/language/lazy_static6_test.dart
index 5e1b2c3..2810e52 100644
--- a/tests/language/lazy_static6_test.dart
+++ b/tests/language/lazy_static6_test.dart
@@ -2,4 +2,5 @@
 // for 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 lazy_static6_test;
+import "package:expect/expect.dart";
 part "lazy_static6_src.dart";
diff --git a/tests/language/lazy_static_test.dart b/tests/language/lazy_static_test.dart
index 0f51770..5c582d9 100644
--- a/tests/language/lazy_static_test.dart
+++ b/tests/language/lazy_static_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:expect/expect.dart";
+
 final x = foo();
 final y = y2(y3);
 final y2 = incrementCreator();
diff --git a/tests/language/left_shift_test.dart b/tests/language/left_shift_test.dart
index 9cca5d3..7f151b1 100644
--- a/tests/language/left_shift_test.dart
+++ b/tests/language/left_shift_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:expect/expect.dart";
+
 main() {
   for (int i = 0; i < 80; i++) {
     var a = -1 << i;
diff --git a/tests/language/library10.dart b/tests/language/library10.dart
index ebcd114..3af75b6 100644
--- a/tests/language/library10.dart
+++ b/tests/language/library10.dart
@@ -6,6 +6,7 @@
 library library10.dart;
 
 import "library11.dart" as lib11;
+import "package:expect/expect.dart";
 
 class Library10 {
   Library10(this.fld);
diff --git a/tests/language/library1_negative_test.dart b/tests/language/library1_negative_test.dart
index 7af4786..aa5f869 100644
--- a/tests/language/library1_negative_test.dart
+++ b/tests/language/library1_negative_test.dart
@@ -6,6 +6,7 @@
 // which define the same top level name foo, and we are referring to the name.
 
 library Library1NegativeTest.dart;
+import "package:expect/expect.dart";
 import "library1.dart";  // Defines top level variable 'foo'
 import "library2.dart";  // Defines top level variable 'foo'
 
diff --git a/tests/language/library1_test.dart b/tests/language/library1_test.dart
index 297b1a6..fb5bf7d 100644
--- a/tests/language/library1_test.dart
+++ b/tests/language/library1_test.dart
@@ -4,6 +4,7 @@
 // Dart test program for testing libraries.
 
 library Library1Test.dart;
+import "package:expect/expect.dart";
 import "library1_lib.lib";
 
 main() {
diff --git a/tests/language/library5_test.dart b/tests/language/library5_test.dart
index dbc2dc7..d3a45b0 100644
--- a/tests/language/library5_test.dart
+++ b/tests/language/library5_test.dart
@@ -4,6 +4,7 @@
 //
 
 library Library5Test.dart;
+import "package:expect/expect.dart";
 import "library5a.dart" as lib5a;
 import "library5b.dart" as lib5b;
 
diff --git a/tests/language/library_juxtaposition_test.dart b/tests/language/library_juxtaposition_test.dart
index 880d2c8..aad08ac 100644
--- a/tests/language/library_juxtaposition_test.dart
+++ b/tests/language/library_juxtaposition_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:expect/expect.dart";
 import "library_" "juxtaposition_" "lib.dart";
 export "library_" "juxtaposition_" "lib.dart";
 
diff --git a/tests/language/library_prefixes_test.dart b/tests/language/library_prefixes_test.dart
index da739e1..80714da 100644
--- a/tests/language/library_prefixes_test.dart
+++ b/tests/language/library_prefixes_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library LibraryPrefixesTest.dart;
+import "package:expect/expect.dart";
 import "library_prefixes.lib";
 
 class LibraryPrefixesTest {
diff --git a/tests/language/library_private_in_constructor_test.dart b/tests/language/library_private_in_constructor_test.dart
index 37a1b83..ce6b3db 100644
--- a/tests/language/library_private_in_constructor_test.dart
+++ b/tests/language/library_private_in_constructor_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library LibraryPrivateInConstructor;
+import "package:expect/expect.dart";
 import "library_private_in_constructor_a.dart";
 import "library_private_in_constructor_b.dart";
 
diff --git a/tests/language/library_same_name_used_test.dart b/tests/language/library_same_name_used_test.dart
index 33568b9..6ed7aec 100644
--- a/tests/language/library_same_name_used_test.dart
+++ b/tests/language/library_same_name_used_test.dart
@@ -6,6 +6,7 @@
 // abstract class in lib2.  Use of import prefixes should allow this.
 
 library main;
+import "package:expect/expect.dart";
 import "library_same_name_used_lib1.dart";
 
 main() {
diff --git a/tests/language/licm_test.dart b/tests/language/licm_test.dart
index 67fea65..e058e8e 100644
--- a/tests/language/licm_test.dart
+++ b/tests/language/licm_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:expect/expect.dart";
+
 var sum = 0;
 var foo = 0;
 var bar = 1;
diff --git a/tests/language/list_double_index_in_loop2_test.dart b/tests/language/list_double_index_in_loop2_test.dart
index 59e0ddd..5a4454d 100644
--- a/tests/language/list_double_index_in_loop2_test.dart
+++ b/tests/language/list_double_index_in_loop2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing arrays.
 
+import "package:expect/expect.dart";
+
 bar() => true;
 
 tata() => 1.5;
diff --git a/tests/language/list_double_index_in_loop_test.dart b/tests/language/list_double_index_in_loop_test.dart
index 89725cc..708fb4b 100644
--- a/tests/language/list_double_index_in_loop_test.dart
+++ b/tests/language/list_double_index_in_loop_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing arrays.
 
+import "package:expect/expect.dart";
+
 bar() => true;
 
 // The type propagation in Dart2Js wrongly took the intersection of all incoming
diff --git a/tests/language/list_is_test.dart b/tests/language/list_is_test.dart
index 147ab33..8df30bd 100644
--- a/tests/language/list_is_test.dart
+++ b/tests/language/list_is_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:expect/expect.dart";
+
 class A<T> {
   bar() => new List<T>();
 }
diff --git a/tests/language/list_literal2_test.dart b/tests/language/list_literal2_test.dart
index 5157c36..49dc1af 100644
--- a/tests/language/list_literal2_test.dart
+++ b/tests/language/list_literal2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test program for array literals.
 
+import "package:expect/expect.dart";
+
 class ArrayLiteral2Test {
   static const int LAUREL = 1965;
   static const int HARDY = 1957;
diff --git a/tests/language/list_literal3_test.dart b/tests/language/list_literal3_test.dart
index 1d657e3..d6151ce 100644
--- a/tests/language/list_literal3_test.dart
+++ b/tests/language/list_literal3_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Check that arrays from const array literals are immutable.
 
+import "package:expect/expect.dart";
+
 class ListLiteral3Test {
 
   static const List<String> canonicalJoke = const ["knock", "knock"];
diff --git a/tests/language/list_literal4_test.dart b/tests/language/list_literal4_test.dart
index 92935f5..9f85220 100644
--- a/tests/language/list_literal4_test.dart
+++ b/tests/language/list_literal4_test.dart
@@ -5,6 +5,8 @@
 //
 // Dart test program testing type checks in list literals.
 
+import "package:expect/expect.dart";
+
 class ListLiteral4Test<T> {
   test() {
     int result = 0;
diff --git a/tests/language/list_literal_syntax_test.dart b/tests/language/list_literal_syntax_test.dart
index 01554f7..83f23a9 100644
--- a/tests/language/list_literal_syntax_test.dart
+++ b/tests/language/list_literal_syntax_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:expect/expect.dart";
+
 abstract class I {}
 
 void main() {
diff --git a/tests/language/list_literal_test.dart b/tests/language/list_literal_test.dart
index 7b85971..ccfa1c5 100644
--- a/tests/language/list_literal_test.dart
+++ b/tests/language/list_literal_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test program for array literals.
 
+import "package:expect/expect.dart";
+
 class ListLiteralTest {
 
   static const LAUREL = 1;
diff --git a/tests/language/list_test.dart b/tests/language/list_test.dart
index 58000c7..a0a12ec 100644
--- a/tests/language/list_test.dart
+++ b/tests/language/list_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing arrays.
 
+import "package:expect/expect.dart";
+
 class ListTest {
   static void TestIterator() {
     List<int> a = new List<int>(10);
diff --git a/tests/language/liveness_test.dart b/tests/language/liveness_test.dart
index 08d84e7..61e6284 100644
--- a/tests/language/liveness_test.dart
+++ b/tests/language/liveness_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program testing closures.
 
+import "package:expect/expect.dart";
+
 foo(x) {
   var y = x;
   for (int i = 0; i < 10; i++) x++;
diff --git a/tests/language/load_to_load_forwarding_test.dart b/tests/language/load_to_load_forwarding_test.dart
index 5738263..6c7d8b4 100644
--- a/tests/language/load_to_load_forwarding_test.dart
+++ b/tests/language/load_to_load_forwarding_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test correctness of side effects tracking used by load to load forwarding.
 
+import "package:expect/expect.dart";
+
 class A {
   var x, y;
   A(this.x, this.y);
diff --git a/tests/language/local_export_test.dart b/tests/language/local_export_test.dart
index ce2ca1d..2d3efc8 100644
--- a/tests/language/local_export_test.dart
+++ b/tests/language/local_export_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library localExportTest;
+import "package:expect/expect.dart";
 import 'local_export_a.dart';
 
 void main() {
diff --git a/tests/language/local_function2_test.dart b/tests/language/local_function2_test.dart
index 5aaf7f5..1ccf9c1 100644
--- a/tests/language/local_function2_test.dart
+++ b/tests/language/local_function2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program testing closures.
 
+import "package:expect/expect.dart";
+
 typedef T F<T>(T t);
 
 class Parameterized<T> {
diff --git a/tests/language/local_function3_test.dart b/tests/language/local_function3_test.dart
index c3282c3..501510e 100644
--- a/tests/language/local_function3_test.dart
+++ b/tests/language/local_function3_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program testing closures.
 
+import "package:expect/expect.dart";
+
 class LocalFunction3Test {
   static testExceptions() {
     var f = (int n) { return n + 1; };
diff --git a/tests/language/local_function_test.dart b/tests/language/local_function_test.dart
index 104319f..8051fe2 100644
--- a/tests/language/local_function_test.dart
+++ b/tests/language/local_function_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program testing closures.
 
+import "package:expect/expect.dart";
+
 class LocalFunctionTest {
   LocalFunctionTest() : field1 = 100, field2_ = 200  { }
   static int f(int n) {
diff --git a/tests/language/loop_exchange2_test.dart b/tests/language/loop_exchange2_test.dart
index 98c97a3..576c5af 100644
--- a/tests/language/loop_exchange2_test.dart
+++ b/tests/language/loop_exchange2_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:expect/expect.dart";
+
 // This program tripped dart2js.
 main() {
   var a = 1;
diff --git a/tests/language/loop_exchange3_test.dart b/tests/language/loop_exchange3_test.dart
index 5b85005..d0cbb0f 100644
--- a/tests/language/loop_exchange3_test.dart
+++ b/tests/language/loop_exchange3_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:expect/expect.dart";
+
 // This program tripped dart2js.
 main() {
   int foo;
diff --git a/tests/language/loop_exchange4_test.dart b/tests/language/loop_exchange4_test.dart
index 9c1f459..089e93d 100644
--- a/tests/language/loop_exchange4_test.dart
+++ b/tests/language/loop_exchange4_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:expect/expect.dart";
+
 // This program tripped dart2js.
 main() {
   var count = 0;
diff --git a/tests/language/loop_exchange_test.dart b/tests/language/loop_exchange_test.dart
index 9b06a17..da2e5ad 100644
--- a/tests/language/loop_exchange_test.dart
+++ b/tests/language/loop_exchange_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:expect/expect.dart";
+
 // This program tripped dart2js.
 main() {
   var x = 1;
diff --git a/tests/language/loop_hoist_test.dart b/tests/language/loop_hoist_test.dart
index a4024af..628d635 100644
--- a/tests/language/loop_hoist_test.dart
+++ b/tests/language/loop_hoist_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:expect/expect.dart";
+
 class A {
   num x;
   A() : this.x = 0;
diff --git a/tests/language/many_calls_test.dart b/tests/language/many_calls_test.dart
index c59b90f..12a59f2 100644
--- a/tests/language/many_calls_test.dart
+++ b/tests/language/many_calls_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test megamorphic calls.
 
+import "package:expect/expect.dart";
+
 class A {
   A() {}
   f1() { return 1; }
diff --git a/tests/language/many_generic_instanceof_test.dart b/tests/language/many_generic_instanceof_test.dart
index b3be553..5f92367 100644
--- a/tests/language/many_generic_instanceof_test.dart
+++ b/tests/language/many_generic_instanceof_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library ManyGenericInstanceofTest.dart;
+import "package:expect/expect.dart";
 part "generic_instanceof.dart";
 
 class ManyGenericInstanceofTest {
diff --git a/tests/language/many_overridden_no_such_method_test.dart b/tests/language/many_overridden_no_such_method_test.dart
index 76a847a..cb9416c 100644
--- a/tests/language/many_overridden_no_such_method_test.dart
+++ b/tests/language/many_overridden_no_such_method_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library ManyOverriddenNoSuchMethodTest.dart;
+import "package:expect/expect.dart";
 part "overridden_no_such_method.dart";
 
 class ManyOverriddenNoSuchMethodTest {
diff --git a/tests/language/map_literal2_test.dart b/tests/language/map_literal2_test.dart
index 6361f89..c510f35 100644
--- a/tests/language/map_literal2_test.dart
+++ b/tests/language/map_literal2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test program for map literals.
 
+import "package:expect/expect.dart";
+
 int nextValCtr;
 
 get nextVal {
diff --git a/tests/language/map_literal3_test.dart b/tests/language/map_literal3_test.dart
index 0e571e8..3a11f76 100644
--- a/tests/language/map_literal3_test.dart
+++ b/tests/language/map_literal3_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test program for map literals.
 
+import "package:expect/expect.dart";
+
 class MapLiteralTest {
 
   static testMain() {
diff --git a/tests/language/map_literal4_test.dart b/tests/language/map_literal4_test.dart
index 35a3f97..ce922fe 100644
--- a/tests/language/map_literal4_test.dart
+++ b/tests/language/map_literal4_test.dart
@@ -5,6 +5,8 @@
 //
 // Dart test program testing type checks in map literals.
 
+import "package:expect/expect.dart";
+
 class MapLiteral4Test<T> {
   test() {
     int result = 0;
diff --git a/tests/language/map_literal_syntax_test.dart b/tests/language/map_literal_syntax_test.dart
index 464081a..1f537b4 100644
--- a/tests/language/map_literal_syntax_test.dart
+++ b/tests/language/map_literal_syntax_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:expect/expect.dart";
+
 class Foo {
   var x;
   var y;
diff --git a/tests/language/map_literal_test.dart b/tests/language/map_literal_test.dart
index 1f2b8d7..48fa0d8 100644
--- a/tests/language/map_literal_test.dart
+++ b/tests/language/map_literal_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:expect/expect.dart";
+
 // Tests map literals.
 
 class MapLiteralTest {
diff --git a/tests/language/map_test.dart b/tests/language/map_test.dart
index a055f76..347bb9a 100644
--- a/tests/language/map_test.dart
+++ b/tests/language/map_test.dart
@@ -4,6 +4,8 @@
 // A subtest of the larger MapTest. Will eliminate once the full
 // test is running.
 
+import "package:expect/expect.dart";
+
 class MapTest {
 
   static void testDeletedElement(Map map) {
diff --git a/tests/language/math_vm_test.dart b/tests/language/math_vm_test.dart
index 96e88bc..ad71888 100644
--- a/tests/language/math_vm_test.dart
+++ b/tests/language/math_vm_test.dart
@@ -6,6 +6,7 @@
 
 library math_vm_test;
 
+import "package:expect/expect.dart";
 import 'dart:math';
 
 class FakeNumber {
diff --git a/tests/language/mega_load_test.dart b/tests/language/mega_load_test.dart
index 8c933f2..a5d4591 100644
--- a/tests/language/mega_load_test.dart
+++ b/tests/language/mega_load_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test megamorphic, but single target field load.
 
+import "package:expect/expect.dart";
+
 class Base {
   var f;
 }
diff --git a/tests/language/megamorphic_no_such_method_test.dart b/tests/language/megamorphic_no_such_method_test.dart
index 56c3287..8d7976a 100644
--- a/tests/language/megamorphic_no_such_method_test.dart
+++ b/tests/language/megamorphic_no_such_method_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test program for correct optimizations related to types fo allocated lists.
 
+import "package:expect/expect.dart";
+
 // Classes to induce polymorphism of degree 10.
 class A0 {
   test() => 0;
diff --git a/tests/language/metadata_syntax_test.dart b/tests/language/metadata_syntax_test.dart
index ed8d22f..dc3ff8c 100644
--- a/tests/language/metadata_syntax_test.dart
+++ b/tests/language/metadata_syntax_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:expect/expect.dart";
+
 // Test that is is an error to use type arguments in metadata without
 // parens.
 
diff --git a/tests/language/metadata_test.dart b/tests/language/metadata_test.dart
index fcd70b1..dc901c2 100644
--- a/tests/language/metadata_test.dart
+++ b/tests/language/metadata_test.dart
@@ -6,6 +6,7 @@
 // test cases with illegal metadata annotations.
 
 library metadata_test.dart;
+import "package:expect/expect.dart";
 import "metadata_lib.dart" as Meta;
 
 class Tag {
diff --git a/tests/language/method_binding_test.dart b/tests/language/method_binding_test.dart
index e540116..454d8f1 100644
--- a/tests/language/method_binding_test.dart
+++ b/tests/language/method_binding_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:expect/expect.dart";
+
 // Bind a method to a variable that can be invoked as a function
 
 class A {
diff --git a/tests/language/method_invocation_test.dart b/tests/language/method_invocation_test.dart
index 44c9da2..393d2a6 100644
--- a/tests/language/method_invocation_test.dart
+++ b/tests/language/method_invocation_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:expect/expect.dart";
+
 // Testing method invocation.
 // Currently testing only NoSuchMethodError.
 
diff --git a/tests/language/method_name_test.dart b/tests/language/method_name_test.dart
index b6e2acb..b0199cf 100644
--- a/tests/language/method_name_test.dart
+++ b/tests/language/method_name_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:expect/expect.dart";
+
 // Tests that methods with names "get", "set" and "operator" don't
 // cause fatal problems.
 
diff --git a/tests/language/method_override_test.dart b/tests/language/method_override_test.dart
index 514f7fc..b1a8b1d 100644
--- a/tests/language/method_override_test.dart
+++ b/tests/language/method_override_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:expect/expect.dart";
+
 // Checks that a method with an instantiated return type can override a method
 // with a generic return type.
 
diff --git a/tests/language/methods_as_constants2_test.dart b/tests/language/methods_as_constants2_test.dart
index b850a71..fa52f64 100644
--- a/tests/language/methods_as_constants2_test.dart
+++ b/tests/language/methods_as_constants2_test.dart
@@ -4,6 +4,8 @@
 // Test that a function only used by compile-time constants is being
 // generated.
 
+import "package:expect/expect.dart";
+
 topLevelMethod() => 42;
 
 class A {
diff --git a/tests/language/methods_as_constants_test.dart b/tests/language/methods_as_constants_test.dart
index b9aee07..98468e9 100644
--- a/tests/language/methods_as_constants_test.dart
+++ b/tests/language/methods_as_constants_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:expect/expect.dart";
+
 topLevelMethod() => 't';
 
 const topLevelFieldForTopLevelMethod = topLevelMethod;
diff --git a/tests/language/mint_arithmetic_test.dart b/tests/language/mint_arithmetic_test.dart
index 0e05d92..18b532a 100644
--- a/tests/language/mint_arithmetic_test.dart
+++ b/tests/language/mint_arithmetic_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:expect/expect.dart";
+
 // Test arithmetic on 64-bit integers.
 
 test_and_1() {
diff --git a/tests/language/mint_compares_test.dart b/tests/language/mint_compares_test.dart
index fea302e..acbacab 100644
--- a/tests/language/mint_compares_test.dart
+++ b/tests/language/mint_compares_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:expect/expect.dart";
+
 // Test compares on 64-bit integers.
 
 compareTest() {
diff --git a/tests/language/mixin_extends_field_test.dart b/tests/language/mixin_extends_field_test.dart
index eafc0e8..dce8fe5 100644
--- a/tests/language/mixin_extends_field_test.dart
+++ b/tests/language/mixin_extends_field_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:expect/expect.dart";
+
 class S {
   var foo = "S-foo";
 }
diff --git a/tests/language/mixin_extends_is_test.dart b/tests/language/mixin_extends_is_test.dart
index 4f08849..dacdd3c 100644
--- a/tests/language/mixin_extends_is_test.dart
+++ b/tests/language/mixin_extends_is_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:expect/expect.dart";
+
 class S { }
 class M1 { }
 class M2 { }
diff --git a/tests/language/mixin_extends_method_test.dart b/tests/language/mixin_extends_method_test.dart
index e9423e4..f80b16e 100644
--- a/tests/language/mixin_extends_method_test.dart
+++ b/tests/language/mixin_extends_method_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:expect/expect.dart";
+
 class S {
   foo() => "S-foo";
   baz() => "S-baz";
diff --git a/tests/language/mixin_field_initializer_test.dart b/tests/language/mixin_field_initializer_test.dart
index c179684..f3d75c3 100644
--- a/tests/language/mixin_field_initializer_test.dart
+++ b/tests/language/mixin_field_initializer_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing throw statement
 
+import 'package:expect/expect.dart';
+
 class S {
   var s1 = good_stuff();
   static good_stuff() => "Speyburn";
diff --git a/tests/language/mixin_field_test.dart b/tests/language/mixin_field_test.dart
index 251aa50..99f68e4 100644
--- a/tests/language/mixin_field_test.dart
+++ b/tests/language/mixin_field_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:expect/expect.dart";
+
 class S {
   var foo = "S-foo";
 }
diff --git a/tests/language/mixin_getter_regression_test.dart b/tests/language/mixin_getter_regression_test.dart
index 52603c6..f3a7bcd 100644
--- a/tests/language/mixin_getter_regression_test.dart
+++ b/tests/language/mixin_getter_regression_test.dart
@@ -5,6 +5,8 @@
 // Regression test case for dart2js bug where the getter for y wasn't
 // properly mixed in.
 
+import "package:expect/expect.dart";
+
 class C {
   int x;
   int get y => x;
diff --git a/tests/language/mixin_illegal_static_access_test.dart b/tests/language/mixin_illegal_static_access_test.dart
index 46390c2..81b032b 100644
--- a/tests/language/mixin_illegal_static_access_test.dart
+++ b/tests/language/mixin_illegal_static_access_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:expect/expect.dart";
+
 class S {
   static foo() => 42;
 }
diff --git a/tests/language/mixin_illegal_super_use_test.dart b/tests/language/mixin_illegal_super_use_test.dart
index 414b2f2..7f12e4d 100644
--- a/tests/language/mixin_illegal_super_use_test.dart
+++ b/tests/language/mixin_illegal_super_use_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:expect/expect.dart";
+
 class M {
 }
 
diff --git a/tests/language/mixin_implements_test.dart b/tests/language/mixin_implements_test.dart
index 8df1d9e..3eaad79 100644
--- a/tests/language/mixin_implements_test.dart
+++ b/tests/language/mixin_implements_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:expect/expect.dart";
+
 abstract class I0 {
   foo();
 }
diff --git a/tests/language/mixin_is_test.dart b/tests/language/mixin_is_test.dart
index 2d61ab9..7e8d080 100644
--- a/tests/language/mixin_is_test.dart
+++ b/tests/language/mixin_is_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:expect/expect.dart";
+
 class S { }
 class M1 { }
 class M2 { }
diff --git a/tests/language/mixin_lib_extends_field_test.dart b/tests/language/mixin_lib_extends_field_test.dart
index b58c44a..5edafd3 100644
--- a/tests/language/mixin_lib_extends_field_test.dart
+++ b/tests/language/mixin_lib_extends_field_test.dart
@@ -4,6 +4,7 @@
 
 library mixin_lib_extends_field_test;
 
+import 'package:expect/expect.dart';
 import "mixin_lib_extends_field_lib.dart" as L;
 
 class S {
diff --git a/tests/language/mixin_lib_extends_method_test.dart b/tests/language/mixin_lib_extends_method_test.dart
index b43e0e0..25ade93 100644
--- a/tests/language/mixin_lib_extends_method_test.dart
+++ b/tests/language/mixin_lib_extends_method_test.dart
@@ -4,6 +4,7 @@
 
 library mixin_lib_extends_method_test;
 
+import "package:expect/expect.dart";
 import "mixin_lib_extends_method_lib.dart" as L;
 
 class S {
diff --git a/tests/language/mixin_method_test.dart b/tests/language/mixin_method_test.dart
index d5643f7..a7bd09b 100644
--- a/tests/language/mixin_method_test.dart
+++ b/tests/language/mixin_method_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:expect/expect.dart";
+
 class S {
   foo() => "S-foo";
   baz() => "S-baz";
diff --git a/tests/language/mixin_mixin_test.dart b/tests/language/mixin_mixin_test.dart
index f6d2f35..cd234b4 100644
--- a/tests/language/mixin_mixin_test.dart
+++ b/tests/language/mixin_mixin_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:expect/expect.dart";
+
 class M1 { foo() => 42; }
 typedef M2 = Object with M1;
 
diff --git a/tests/language/mixin_naming_test.dart b/tests/language/mixin_naming_test.dart
index b3b4a9c..7e2476b 100644
--- a/tests/language/mixin_naming_test.dart
+++ b/tests/language/mixin_naming_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:expect/expect.dart";
+
 class S { }
 class M1 { }
 class M2 { }
diff --git a/tests/language/mixin_override_regression_test.dart b/tests/language/mixin_override_regression_test.dart
index bbc9b89..2470da3 100644
--- a/tests/language/mixin_override_regression_test.dart
+++ b/tests/language/mixin_override_regression_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:expect/expect.dart";
+
 class C0 {
   int m1() => 5;
   int m2() => m1();
diff --git a/tests/language/mixin_this_use_test.dart b/tests/language/mixin_this_use_test.dart
index 1619a76..7398391 100644
--- a/tests/language/mixin_this_use_test.dart
+++ b/tests/language/mixin_this_use_test.dart
@@ -5,6 +5,8 @@
 // Test that [:this:] in a class A used as a mixin in class D knows it can be an
 // instance of D.
 
+import "package:expect/expect.dart";
+
 class A {
   foo() => bar(); // Implicit use of [:this:]
   bar() => 42;
diff --git a/tests/language/mixin_type_parameters_mixin_extends_test.dart b/tests/language/mixin_type_parameters_mixin_extends_test.dart
index 6db5188..72952ba 100644
--- a/tests/language/mixin_type_parameters_mixin_extends_test.dart
+++ b/tests/language/mixin_type_parameters_mixin_extends_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:expect/expect.dart";
+
 class M<T> {
   bool matches(o) {
     bool isChecked = checkUsingIs(o);
diff --git a/tests/language/mixin_type_parameters_mixin_test.dart b/tests/language/mixin_type_parameters_mixin_test.dart
index fa9e49b..1e8df1d 100644
--- a/tests/language/mixin_type_parameters_mixin_test.dart
+++ b/tests/language/mixin_type_parameters_mixin_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:expect/expect.dart";
+
 class M<T> {
   bool matches(o) {
     bool isChecked = checkUsingIs(o);
diff --git a/tests/language/mixin_type_parameters_super_extends_test.dart b/tests/language/mixin_type_parameters_super_extends_test.dart
index d05fd7a..0ad3fe6 100644
--- a/tests/language/mixin_type_parameters_super_extends_test.dart
+++ b/tests/language/mixin_type_parameters_super_extends_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:expect/expect.dart";
+
 class S<T> {
   bool matches(o) {
     bool isChecked = checkUsingIs(o);
diff --git a/tests/language/mixin_type_parameters_super_test.dart b/tests/language/mixin_type_parameters_super_test.dart
index 5c4b660..0202219 100644
--- a/tests/language/mixin_type_parameters_super_test.dart
+++ b/tests/language/mixin_type_parameters_super_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:expect/expect.dart";
+
 class S<T> {
   bool matches(o) {
     bool isChecked = checkUsingIs(o);
diff --git a/tests/language/modulo_test.dart b/tests/language/modulo_test.dart
index 7fac3bc..8ac27c0 100644
--- a/tests/language/modulo_test.dart
+++ b/tests/language/modulo_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test optimization of modulo operator on Smi.
 
+import "package:expect/expect.dart";
+
 
 main() {
   for (int i = -3000; i < 3000; i++) {
diff --git a/tests/language/multi_assign_test.dart b/tests/language/multi_assign_test.dart
index 8dc8933..1697f3b 100644
--- a/tests/language/multi_assign_test.dart
+++ b/tests/language/multi_assign_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program testing multiple assignment.
 
+import "package:expect/expect.dart";
+
 
 class MultiAssignTest {
   static testMain() {
diff --git a/tests/language/multi_pass2_test.dart b/tests/language/multi_pass2_test.dart
index da1c7eb..4e67d98 100644
--- a/tests/language/multi_pass2_test.dart
+++ b/tests/language/multi_pass2_test.dart
@@ -5,6 +5,7 @@
 // Same as MultiPassTest, except that the file order is reversed.
 
 library MultiPass2Test.dart;
+import "package:expect/expect.dart";
 part "multi_pass_a.dart";
 part "multi_pass_b.dart";
 
diff --git a/tests/language/multi_pass_test.dart b/tests/language/multi_pass_test.dart
index 8ece81a..8a2fdd1 100644
--- a/tests/language/multi_pass_test.dart
+++ b/tests/language/multi_pass_test.dart
@@ -4,6 +4,7 @@
 // Dart test for loading several dart files and resolving superclasses lazily.
 
 library MultiPassTest.dart;
+import "package:expect/expect.dart";
 part "multi_pass_a.dart";
 part "multi_pass_b.dart";
 
diff --git a/tests/language/named_argument_in_const_creation_test.dart b/tests/language/named_argument_in_const_creation_test.dart
index 797525d..e7dbb5f 100644
--- a/tests/language/named_argument_in_const_creation_test.dart
+++ b/tests/language/named_argument_in_const_creation_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:expect/expect.dart";
+
 class A {
   final x;
   final y;
diff --git a/tests/language/named_argument_test.dart b/tests/language/named_argument_test.dart
index a6a2d39..0514c2d 100644
--- a/tests/language/named_argument_test.dart
+++ b/tests/language/named_argument_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:expect/expect.dart";
+
 main() {
   var c1 = ({b, a}) => 'a: $a b: $b';
   var c2 = ({a, b}) => 'a: $a b: $b';
diff --git a/tests/language/named_parameters2_test.dart b/tests/language/named_parameters2_test.dart
index e6c037d..22ae603 100644
--- a/tests/language/named_parameters2_test.dart
+++ b/tests/language/named_parameters2_test.dart
@@ -4,6 +4,8 @@
 // Dart test program for testing named parameters.
 // You may not provide the same parameter as both a positional and a named argument.
 
+import "package:expect/expect.dart";
+
 int test(int a, [int b]) {
   return a;
 }
diff --git a/tests/language/named_parameters3_test.dart b/tests/language/named_parameters3_test.dart
index 13c679c..d738ad7 100644
--- a/tests/language/named_parameters3_test.dart
+++ b/tests/language/named_parameters3_test.dart
@@ -4,6 +4,8 @@
 // Dart test program for testing named parameters.
 // Specifying named argument for not existing named parameter is run time error.
 
+import "package:expect/expect.dart";
+
 int test(int a, [int b]) {
   return a;
 }
diff --git a/tests/language/named_parameters4_test.dart b/tests/language/named_parameters4_test.dart
index ca41dec..2547364 100644
--- a/tests/language/named_parameters4_test.dart
+++ b/tests/language/named_parameters4_test.dart
@@ -4,6 +4,8 @@
 // Dart test program for testing named parameters.
 // Specifying named argument for not existing named parameter is run time error.
 
+import "package:expect/expect.dart";
+
 // This test is very similar to NamedParameters3Test, but exersizes a
 // different corner case in the frog compiler. frog wasn't detecting unused
 // named arguments when no other arguments were expected. So, this test
diff --git a/tests/language/named_parameters_aggregated_test.dart b/tests/language/named_parameters_aggregated_test.dart
index 6de5407..4e61963 100644
--- a/tests/language/named_parameters_aggregated_test.dart
+++ b/tests/language/named_parameters_aggregated_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing named parameters.
 
+import "package:expect/expect.dart";
+
 
 class TypeTester<T> {}
 
diff --git a/tests/language/named_parameters_named_count_test.dart b/tests/language/named_parameters_named_count_test.dart
index 711eee3..56434d8 100644
--- a/tests/language/named_parameters_named_count_test.dart
+++ b/tests/language/named_parameters_named_count_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:expect/expect.dart";
+
 // Test for named parameter called 'count'.
 
 
diff --git a/tests/language/named_parameters_passing_false_test.dart b/tests/language/named_parameters_passing_false_test.dart
index f11d020..1866ff9 100644
--- a/tests/language/named_parameters_passing_false_test.dart
+++ b/tests/language/named_parameters_passing_false_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:expect/expect.dart";
+
 // Dart test program for testing named parameters with 'false' passed as an
 // argument.
 
diff --git a/tests/language/named_parameters_passing_falsy_test.dart b/tests/language/named_parameters_passing_falsy_test.dart
index 696f329..faa1fce 100644
--- a/tests/language/named_parameters_passing_falsy_test.dart
+++ b/tests/language/named_parameters_passing_falsy_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:expect/expect.dart";
+
 // Dart test program for testing named parameters with various values that might
 // be implemented as 'falsy' values in a JavaScript implementation.
 
diff --git a/tests/language/named_parameters_passing_null_test.dart b/tests/language/named_parameters_passing_null_test.dart
index 3f33a9e..aeb21cd 100644
--- a/tests/language/named_parameters_passing_null_test.dart
+++ b/tests/language/named_parameters_passing_null_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:expect/expect.dart";
+
 // Dart test program for testing named parameters with 'null' passed as an
 // argument.
 
diff --git a/tests/language/named_parameters_passing_zero_test.dart b/tests/language/named_parameters_passing_zero_test.dart
index 1f6d896..42ea649 100644
--- a/tests/language/named_parameters_passing_zero_test.dart
+++ b/tests/language/named_parameters_passing_zero_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:expect/expect.dart";
+
 // Dart test program for testing named parameters with zero passed as an
 // argument.
 
diff --git a/tests/language/named_parameters_test.dart b/tests/language/named_parameters_test.dart
index 04e939a..10e5f1a 100644
--- a/tests/language/named_parameters_test.dart
+++ b/tests/language/named_parameters_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing named parameters.
 
+import "package:expect/expect.dart";
+
 
 class NamedParametersTest {
 
diff --git a/tests/language/named_parameters_type_test.dart b/tests/language/named_parameters_type_test.dart
index 33841fb..304cbed 100644
--- a/tests/language/named_parameters_type_test.dart
+++ b/tests/language/named_parameters_type_test.dart
@@ -5,6 +5,8 @@
 //
 // Dart test program for testing optional named parameters in type tests.
 
+import "package:expect/expect.dart";
+
 class NamedParametersTypeTest {
   static int testMain() {
     int result = 0;
diff --git a/tests/language/named_parameters_with_conversions_test.dart b/tests/language/named_parameters_with_conversions_test.dart
index 4436383..cbf3888 100644
--- a/tests/language/named_parameters_with_conversions_test.dart
+++ b/tests/language/named_parameters_with_conversions_test.dart
@@ -5,6 +5,8 @@
 // Test named arguments work as expected regardless of whether the function or
 // method is called via function call syntax or method call syntax.
 
+import "package:expect/expect.dart";
+
 
 Validate(tag, a, b) {
   // tag encodes which parameters are passed in with values a: 111, b: 222.
diff --git a/tests/language/named_parameters_with_dollars_test.dart b/tests/language/named_parameters_with_dollars_test.dart
index e4f0f27..cc28cd6 100644
--- a/tests/language/named_parameters_with_dollars_test.dart
+++ b/tests/language/named_parameters_with_dollars_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:expect/expect.dart";
+
 // Test to stress Frog's named parameter scheme.
 
 main() {
diff --git a/tests/language/named_parameters_with_object_property_names_test.dart b/tests/language/named_parameters_with_object_property_names_test.dart
index 2f6c03c..e291bc8 100644
--- a/tests/language/named_parameters_with_object_property_names_test.dart
+++ b/tests/language/named_parameters_with_object_property_names_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:expect/expect.dart";
+
 // Test for named parameter with the name of a JavaScript property found on
 // 'Object'.  For such a NAME, foo.NAME may exist in an empty map, i.e.
 //    'toString' in {} --> true.
diff --git a/tests/language/namer2_test.dart b/tests/language/namer2_test.dart
index 1f911b82..81a7de4 100644
--- a/tests/language/namer2_test.dart
+++ b/tests/language/namer2_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:expect/expect.dart";
+
 // Test that user field names cannot clash with internal names of the
 // dart2js compiler.
 
diff --git a/tests/language/namer_test.dart b/tests/language/namer_test.dart
index 67fa633..d9ad7d8 100644
--- a/tests/language/namer_test.dart
+++ b/tests/language/namer_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:expect/expect.dart";
+
 // Regression test for a bug in dart2js where global names could
 // collide.
 
diff --git a/tests/language/naming2_test.dart b/tests/language/naming2_test.dart
index 934fa70..f9c0800 100644
--- a/tests/language/naming2_test.dart
+++ b/tests/language/naming2_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:expect/expect.dart";
+
 class A {
   var function;
   A(function) : function = function;
diff --git a/tests/language/naming3_test.dart b/tests/language/naming3_test.dart
index 2d9dbf8..7299df1 100644
--- a/tests/language/naming3_test.dart
+++ b/tests/language/naming3_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:expect/expect.dart";
+
 class A {
   var __PROTO__ = 499;
   var constructor = 1;
diff --git a/tests/language/naming_test.dart b/tests/language/naming_test.dart
index 1edfb9d..9130914 100644
--- a/tests/language/naming_test.dart
+++ b/tests/language/naming_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:expect/expect.dart";
+
 class A {
   A() { NamingTest.count++; }
   foo(a, b) {
diff --git a/tests/language/native_test.dart b/tests/language/native_test.dart
index 93f435a..01d62d1 100644
--- a/tests/language/native_test.dart
+++ b/tests/language/native_test.dart
@@ -4,6 +4,8 @@
 // Dart test program which shows how to write self verifying tests
 // and how to print dart objects if needed.
 
+import "package:expect/expect.dart";
+
 class Helper {
   static int foo(int i) {
     return i + 10;
diff --git a/tests/language/nested_comments_test.dart b/tests/language/nested_comments_test.dart
index 10bba58..48d07ba 100644
--- a/tests/language/nested_comments_test.dart
+++ b/tests/language/nested_comments_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program testing nested comments
 
+import "package:expect/expect.dart";
+
 // /* nested comment */
 /*// nested comment */
 /*/* nested comment */*/
diff --git a/tests/language/nested_if_test.dart b/tests/language/nested_if_test.dart
index 34b486a..41c7d34 100644
--- a/tests/language/nested_if_test.dart
+++ b/tests/language/nested_if_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart2Js had problems with nested ifs inside loops.
 
+import "package:expect/expect.dart";
+
 foo(x, a) {
   /*---------------------------------------------*/
   /*---------------------------------------------*/
diff --git a/tests/language/new_statement_test.dart b/tests/language/new_statement_test.dart
index 5e00f4d..fea8cb6 100644
--- a/tests/language/new_statement_test.dart
+++ b/tests/language/new_statement_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test a new statement by itself.
 
+import "package:expect/expect.dart";
+
 class A {
   int a;
   int b;
diff --git a/tests/language/no_such_method2_test.dart b/tests/language/no_such_method2_test.dart
index f30ae45..bd0b6a8 100644
--- a/tests/language/no_such_method2_test.dart
+++ b/tests/language/no_such_method2_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:expect/expect.dart";
+
 // Regression test for https://code.google.com/p/dart/issues/detail?id=7697.
 // dart2js used to optimize [noSuchMethod] based on the user-provided
 // argument, and forget that the runtime might call it with its own
diff --git a/tests/language/no_such_method_test.dart b/tests/language/no_such_method_test.dart
index e23ca5b..5e154d2 100644
--- a/tests/language/no_such_method_test.dart
+++ b/tests/language/no_such_method_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program testing that NoSuchMethod is properly called.
 
+import "package:expect/expect.dart";
+
 class GetName {
   foo({a, b}) => "foo";
   moo({b}) => "moo";
diff --git a/tests/language/non_const_constructor_without_body_test.dart b/tests/language/non_const_constructor_without_body_test.dart
index 7e8fdc2..13ef775 100644
--- a/tests/language/non_const_constructor_without_body_test.dart
+++ b/tests/language/non_const_constructor_without_body_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:expect/expect.dart";
+
 class NonConstConstructorWithoutBodyTest {
   int x;
 
diff --git a/tests/language/non_dominating_loop_test.dart b/tests/language/non_dominating_loop_test.dart
index e924e01..ac16396 100644
--- a/tests/language/non_dominating_loop_test.dart
+++ b/tests/language/non_dominating_loop_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:expect/expect.dart";
+
 int calls = 0;
 
 void callMeOnce() {
diff --git a/tests/language/null_access_error_test.dart b/tests/language/null_access_error_test.dart
index f36a9f3..cef7bce 100644
--- a/tests/language/null_access_error_test.dart
+++ b/tests/language/null_access_error_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:expect/expect.dart";
+
 class NullAccessTest {
 
   static void testNullVariable() {
diff --git a/tests/language/null_is_test.dart b/tests/language/null_is_test.dart
index 8b49793..395d474 100644
--- a/tests/language/null_is_test.dart
+++ b/tests/language/null_is_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:expect/expect.dart";
+
 main() {
   Expect.isTrue(null is Object);
   Expect.isFalse(null is int);
diff --git a/tests/language/null_method_test.dart b/tests/language/null_method_test.dart
index 97befa1..bf5b51f 100644
--- a/tests/language/null_method_test.dart
+++ b/tests/language/null_method_test.dart
@@ -5,6 +5,8 @@
 // Regression test for dart2js that used to not compile null methods
 // in the presence of typed selectors.
 
+import "package:expect/expect.dart";
+
 class C {
   foo(s) {
     return s.hashCode;
diff --git a/tests/language/null_no_such_method_test.dart b/tests/language/null_no_such_method_test.dart
index adfab89..a9514cd 100644
--- a/tests/language/null_no_such_method_test.dart
+++ b/tests/language/null_no_such_method_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:expect/expect.dart";
+
 var array = [1];
 
 main() {
diff --git a/tests/language/null_test.dart b/tests/language/null_test.dart
index e52a06d..6ce22ee 100644
--- a/tests/language/null_test.dart
+++ b/tests/language/null_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Second dart test program.
 
+import "package:expect/expect.dart";
+
 class NullTest {
   static int foo(var obj) {
     Expect.equals(null, obj);
diff --git a/tests/language/null_to_string2_test.dart b/tests/language/null_to_string2_test.dart
index 2a087b9..a56e705 100644
--- a/tests/language/null_to_string2_test.dart
+++ b/tests/language/null_to_string2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test correct handling of NULL object in invocation and implicit closures.
 
+import "package:expect/expect.dart";
+
 class A {}
 
 A foo() => null;
diff --git a/tests/language/null_to_string_test.dart b/tests/language/null_to_string_test.dart
index 19eef3a..08bb56a 100644
--- a/tests/language/null_to_string_test.dart
+++ b/tests/language/null_to_string_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test correct handling of NULL object in invocation and implicit closures.
 
+import "package:expect/expect.dart";
+
 main() {
   var nullObj = null;
   var x = nullObj.toString();
diff --git a/tests/language/number_constant_folding1_test.dart b/tests/language/number_constant_folding1_test.dart
index 1d48f7b..dfcba75 100644
--- a/tests/language/number_constant_folding1_test.dart
+++ b/tests/language/number_constant_folding1_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:expect/expect.dart";
+
 // On frogsh constant folded hex literals of large magnitude were truncated on
 // constant folding - Issue 636 is 'fixed', remaining concerns at Issue 638.
 
diff --git a/tests/language/number_identity2_test.dart b/tests/language/number_identity2_test.dart
index 883049b..c10ce04 100644
--- a/tests/language/number_identity2_test.dart
+++ b/tests/language/number_identity2_test.dart
@@ -6,6 +6,8 @@
 // Contains test that is failing on dart2js. Merge this test with
 // 'number_identity_test.dart' once fixed.
 
+import "package:expect/expect.dart";
+
 main() {
   for (int i = 0; i < 1000; i++) testNumberIdentity();
 }
diff --git a/tests/language/number_identity_test.dart b/tests/language/number_identity_test.dart
index 9f475e7..2173342 100644
--- a/tests/language/number_identity_test.dart
+++ b/tests/language/number_identity_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing params.
 
+import "package:expect/expect.dart";
+
 main() {
   for (int i = 0; i < 1000; i++) testNumberIdentity();
 }
diff --git a/tests/language/number_syntax_test.dart b/tests/language/number_syntax_test.dart
index 7ec4e24..d06aeee 100644
--- a/tests/language/number_syntax_test.dart
+++ b/tests/language/number_syntax_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:expect/expect.dart";
+
 class NumberSyntaxTest {
 
   static void testMain() {
diff --git a/tests/language/numbers_test.dart b/tests/language/numbers_test.dart
index 97301d8..2565910 100644
--- a/tests/language/numbers_test.dart
+++ b/tests/language/numbers_test.dart
@@ -4,6 +4,7 @@
 // Test number types.
 
 library NumbersTest.dart;
+import "package:expect/expect.dart";
 
 class NumbersTest {
   static double testMain() {
diff --git a/tests/language/operator2_test.dart b/tests/language/operator2_test.dart
index f6e48f3..66d0ba5 100644
--- a/tests/language/operator2_test.dart
+++ b/tests/language/operator2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Operator dart test program.
 
+import "package:expect/expect.dart";
+
 class Helper {
   int i;
   Helper(int val) : i = val { }
diff --git a/tests/language/operator3_test.dart b/tests/language/operator3_test.dart
index e024c90..98e9571 100644
--- a/tests/language/operator3_test.dart
+++ b/tests/language/operator3_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:expect/expect.dart";
+
 class A {
   operator -() => this;
   toString() => "5";
diff --git a/tests/language/operator4_test.dart b/tests/language/operator4_test.dart
index b937d4f..e203a16 100644
--- a/tests/language/operator4_test.dart
+++ b/tests/language/operator4_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:expect/expect.dart";
+
 class A {
   operator <(other) => 1;
 }
diff --git a/tests/language/operator5_test.dart b/tests/language/operator5_test.dart
index 3afb2eb..8c2f800 100644
--- a/tests/language/operator5_test.dart
+++ b/tests/language/operator5_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:expect/expect.dart";
+
 class A {
   operator ==(other) => 1;
   operator <(other) => null;
diff --git a/tests/language/operator6_test.dart b/tests/language/operator6_test.dart
index 69ae0b3..87fae7d 100644
--- a/tests/language/operator6_test.dart
+++ b/tests/language/operator6_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:expect/expect.dart";
+
 class OperatorTest {
   static int i1, i2;
 
diff --git a/tests/language/operator_equals_test.dart b/tests/language/operator_equals_test.dart
index 1f0d720..0e2e5e4 100644
--- a/tests/language/operator_equals_test.dart
+++ b/tests/language/operator_equals_test.dart
@@ -5,6 +5,8 @@
 // Regression test for dart2js that used to infer [:super == null:]
 // always returns an int.
 
+import 'package:expect/expect.dart';
+
 class A {
   operator==(other) => 42;
 }
diff --git a/tests/language/operator_index_evaluation_order_test.dart b/tests/language/operator_index_evaluation_order_test.dart
index 9f8182e..023d027 100644
--- a/tests/language/operator_index_evaluation_order_test.dart
+++ b/tests/language/operator_index_evaluation_order_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:expect/expect.dart";
+
 class B {
   int value;
   List trace;
diff --git a/tests/language/operator_negate_and_method_negate_test.dart b/tests/language/operator_negate_and_method_negate_test.dart
index 83a19e4..cc7c4a6 100644
--- a/tests/language/operator_negate_and_method_negate_test.dart
+++ b/tests/language/operator_negate_and_method_negate_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:expect/expect.dart";
+
 // This checks that it is possible to have a method named negate as
 // well as unary- operator.
 
diff --git a/tests/language/operator_test.dart b/tests/language/operator_test.dart
index b692400..bd240e1 100644
--- a/tests/language/operator_test.dart
+++ b/tests/language/operator_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:expect/expect.dart";
+
 class OperatorTest {
   static int i1, i2;
 
diff --git a/tests/language/optimization_test.dart b/tests/language/optimization_test.dart
index c399754..0dbbcf5 100644
--- a/tests/language/optimization_test.dart
+++ b/tests/language/optimization_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test various optimizations and deoptimizations of optimizing compiler..
 
+import "package:expect/expect.dart";
+
 addThem(a, b) {
   return a + b;
 }
diff --git a/tests/language/optimize_redundant_array_load_test.dart b/tests/language/optimize_redundant_array_load_test.dart
index ae4bb59..d490f31 100644
--- a/tests/language/optimize_redundant_array_load_test.dart
+++ b/tests/language/optimize_redundant_array_load_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:expect/expect.dart";
+
 // Test optimization of redundant array loads.
 
 var A = [0,2,3];
diff --git a/tests/language/optimized_constant_array_string_access_test.dart b/tests/language/optimized_constant_array_string_access_test.dart
index 391d971..d8f6a80 100644
--- a/tests/language/optimized_constant_array_string_access_test.dart
+++ b/tests/language/optimized_constant_array_string_access_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:expect/expect.dart";
+
 // Test optimized constant string and constant array access.
 
 int testConstantStringAndIndexCodeUnitAt() {
diff --git a/tests/language/optimized_hoisting_checked_mode_assert_test.dart b/tests/language/optimized_hoisting_checked_mode_assert_test.dart
index 2f67833..23e2654 100644
--- a/tests/language/optimized_hoisting_checked_mode_assert_test.dart
+++ b/tests/language/optimized_hoisting_checked_mode_assert_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:expect/expect.dart";
+
 // Test checked mode assertions inside loops.
 
 int foo(x, n)  {
diff --git a/tests/language/optimized_lists_test.dart b/tests/language/optimized_lists_test.dart
index cc3b862..a2406ae 100644
--- a/tests/language/optimized_lists_test.dart
+++ b/tests/language/optimized_lists_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test program for correct optimizations related to types fo allocated lists.
 
+import "package:expect/expect.dart";
+
 main() {
   // Trigger optimization of 'test' method.
   for (int i = 0; i < 1000; i++) {
diff --git a/tests/language/optimized_setter_test.dart b/tests/language/optimized_setter_test.dart
index 1a87139..099be16 100644
--- a/tests/language/optimized_setter_test.dart
+++ b/tests/language/optimized_setter_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test various setter situations, testing special cases in optimizing compiler.
 
+import "package:expect/expect.dart";
+
 class A {
   int field = 0;
 }
diff --git a/tests/language/optimized_string_charat_test.dart b/tests/language/optimized_string_charat_test.dart
index b11c672..5f2e6e4 100644
--- a/tests/language/optimized_string_charat_test.dart
+++ b/tests/language/optimized_string_charat_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:expect/expect.dart";
+
 // Test optimized [] on strings.
 
 var a = "abc";
diff --git a/tests/language/optimized_string_charcodeat_test.dart b/tests/language/optimized_string_charcodeat_test.dart
index e4747f2..88a08de 100644
--- a/tests/language/optimized_string_charcodeat_test.dart
+++ b/tests/language/optimized_string_charcodeat_test.dart
@@ -4,6 +4,9 @@
 
 // Test optimized CodeUnitAt and array access.
 
+import "package:expect/expect.dart";
+
+
 String one_byte = "hest";
 String two_byte = "høns";
 
diff --git a/tests/language/optional_named_parameters_test.dart b/tests/language/optional_named_parameters_test.dart
index c2a771c..70b770a 100644
--- a/tests/language/optional_named_parameters_test.dart
+++ b/tests/language/optional_named_parameters_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing optional named parameters.
 
+import "package:expect/expect.dart";
+
 
 class OptionalNamedParametersTest {
 
diff --git a/tests/language/ordered_maps_test.dart b/tests/language/ordered_maps_test.dart
index e375877..1b845c9 100644
--- a/tests/language/ordered_maps_test.dart
+++ b/tests/language/ordered_maps_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:expect/expect.dart";
+
 // Tests that map literals are ordered.
 
 class OrderedMapsTest {
diff --git a/tests/language/overridden_no_such_method_test.dart b/tests/language/overridden_no_such_method_test.dart
index f3eb3df..3aa37be 100644
--- a/tests/language/overridden_no_such_method_test.dart
+++ b/tests/language/overridden_no_such_method_test.dart
@@ -4,6 +4,8 @@
 // Dart test program testing overridden messageNotUnderstood.
 
 library OverriddenNoSuchMethodTest.dart;
+
+import "package:expect/expect.dart";
 part "overridden_no_such_method.dart";
 
 main() {
diff --git a/tests/language/override_method_with_field_test.dart b/tests/language/override_method_with_field_test.dart
index f277baa..77bd565 100644
--- a/tests/language/override_method_with_field_test.dart
+++ b/tests/language/override_method_with_field_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:expect/expect.dart";
+
 // Test overriding a method with a field.
 
 class Super {
diff --git a/tests/language/param2_test.dart b/tests/language/param2_test.dart
index fce72ba..375a2c5 100644
--- a/tests/language/param2_test.dart
+++ b/tests/language/param2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing function type parameters.
 
+import "package:expect/expect.dart";
+
 
 class Param2Test {
 
diff --git a/tests/language/param_test.dart b/tests/language/param_test.dart
index 43abf50f..4b5c033 100644
--- a/tests/language/param_test.dart
+++ b/tests/language/param_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing params.
 
+import "package:expect/expect.dart";
+
 class Helper {
   static int foo(int i) {
     var b;
diff --git a/tests/language/parameter_initializer2_test.dart b/tests/language/parameter_initializer2_test.dart
index 4f303c9..7897f93 100644
--- a/tests/language/parameter_initializer2_test.dart
+++ b/tests/language/parameter_initializer2_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:expect/expect.dart";
+
 // Test Parameter Intializer.
 
 
diff --git a/tests/language/parameter_initializer6_negative_test.dart b/tests/language/parameter_initializer6_negative_test.dart
index 3c4e0337..40a2231 100644
--- a/tests/language/parameter_initializer6_negative_test.dart
+++ b/tests/language/parameter_initializer6_negative_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:expect/expect.dart";
+
 // It is a compile-time error if a named formal parameter begins with an '_'
 
 class Foo {
diff --git a/tests/language/parameter_initializer_test.dart b/tests/language/parameter_initializer_test.dart
index d285581..23d1bc8 100644
--- a/tests/language/parameter_initializer_test.dart
+++ b/tests/language/parameter_initializer_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:expect/expect.dart";
+
 class ParameterInitializerTest {
 
   static testMain() {
diff --git a/tests/language/parameter_name_conflict_test.dart b/tests/language/parameter_name_conflict_test.dart
index 5c2465b..3f238da 100644
--- a/tests/language/parameter_name_conflict_test.dart
+++ b/tests/language/parameter_name_conflict_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:expect/expect.dart";
+
 foo(t0) {
   var a = t0, b = baz(), c = bar();
   if (t0 == 'foo') {
diff --git a/tests/language/parameter_types_specialization_test.dart b/tests/language/parameter_types_specialization_test.dart
index 110a714..532a7a7 100644
--- a/tests/language/parameter_types_specialization_test.dart
+++ b/tests/language/parameter_types_specialization_test.dart
@@ -4,6 +4,8 @@
 // Test that we invalidate parameter type optimization in the presence
 // of optional parameters.
 
+import "package:expect/expect.dart";
+
 class A {
   void foo(bool firstInvocation, [a = 42, b = 'foo']) {
     if (firstInvocation) {
diff --git a/tests/language/parse_types_test.dart b/tests/language/parse_types_test.dart
index bc30665..665759d 100644
--- a/tests/language/parse_types_test.dart
+++ b/tests/language/parse_types_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for testing parsing of "standard" types.
 
+import "package:expect/expect.dart";
+
 class ParseTypesTest {
   static bool callBool1() {
     return true;
diff --git a/tests/language/partial_min_test.dart b/tests/language/partial_min_test.dart
index f6c5e17..754549a 100644
--- a/tests/language/partial_min_test.dart
+++ b/tests/language/partial_min_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:expect/expect.dart";
+
 // This test triggered an NPE in dart2js.
 // The bug needed:
 // - double usage of the same variable in one expression ("b != b").
diff --git a/tests/language/patch_test.dart b/tests/language/patch_test.dart
index cd2f17e..2815cbf 100644
--- a/tests/language/patch_test.dart
+++ b/tests/language/patch_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:expect/expect.dart";
+
 patch() {
   return 12;
 }
diff --git a/tests/language/positional_parameters_type_test.dart b/tests/language/positional_parameters_type_test.dart
index 7a23761..db26b84 100644
--- a/tests/language/positional_parameters_type_test.dart
+++ b/tests/language/positional_parameters_type_test.dart
@@ -5,6 +5,8 @@
 //
 // Dart test program for testing optional positional parameters in type tests.
 
+import "package:expect/expect.dart";
+
 class NamedParametersTypeTest {
   static int testMain() {
     int result = 0;
diff --git a/tests/language/positive_bit_operations_test.dart b/tests/language/positive_bit_operations_test.dart
index 86af1a1..9663db2 100644
--- a/tests/language/positive_bit_operations_test.dart
+++ b/tests/language/positive_bit_operations_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:expect/expect.dart";
+
 constants() {
   Expect.equals(0x80000000, 0x80000000 | 0);
   Expect.equals(0x80000001, 0x80000000 | 1);
diff --git a/tests/language/prefix101_test.dart b/tests/language/prefix101_test.dart
index 834d754..b6e72b1 100644
--- a/tests/language/prefix101_test.dart
+++ b/tests/language/prefix101_test.dart
@@ -7,6 +7,7 @@
 
 library Prefix101Test.dart;
 
+import "package:expect/expect.dart";
 import "library10.dart" as lib101;
 import "library11.dart" as lib101;
 
diff --git a/tests/language/prefix10_negative_test.dart b/tests/language/prefix10_negative_test.dart
index 1f97272..1f0ff83 100644
--- a/tests/language/prefix10_negative_test.dart
+++ b/tests/language/prefix10_negative_test.dart
@@ -6,6 +6,7 @@
 // Type parameters can shadow a library prefix.
 
 library Prefix10NegativeTest.dart;
+import "package:expect/expect.dart";
 import "library10.dart" as T;
 
 class P<T> {
diff --git a/tests/language/prefix10_test.dart b/tests/language/prefix10_test.dart
index b3c2c9d..d01aeee 100644
--- a/tests/language/prefix10_test.dart
+++ b/tests/language/prefix10_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library Prefix10Test.dart;
+import "package:expect/expect.dart";
 import "library10.dart" as lib10;
 import "library11.dart" as lib11;
 
diff --git a/tests/language/prefix11_test.dart b/tests/language/prefix11_test.dart
index 43f5c95..11fb620 100644
--- a/tests/language/prefix11_test.dart
+++ b/tests/language/prefix11_test.dart
@@ -4,6 +4,7 @@
 //
 
 library Prefix11Test.dart;
+import "package:expect/expect.dart";
 import "library10.dart";
 import "library11.dart" as lib11;
 
diff --git a/tests/language/prefix12_test.dart b/tests/language/prefix12_test.dart
index 1fb4cb3..e2c90b3 100644
--- a/tests/language/prefix12_test.dart
+++ b/tests/language/prefix12_test.dart
@@ -4,6 +4,7 @@
 //
 
 library Prefix12Test.dart;
+import "package:expect/expect.dart";
 import "library11.dart" as lib11;
 
 class Prefix12Test {
diff --git a/tests/language/prefix14_test.dart b/tests/language/prefix14_test.dart
index 4d66818..a7cec0a 100644
--- a/tests/language/prefix14_test.dart
+++ b/tests/language/prefix14_test.dart
@@ -5,6 +5,7 @@
 // Use qualified symbols at various places.
 
 library Prefix14Test.dart;
+import "package:expect/expect.dart";
 import "library12.dart" as lib12;
 
 typedef lib12.Library12 myFunc(lib12.Library12 param);
diff --git a/tests/language/prefix15_test.dart b/tests/language/prefix15_test.dart
index 09f72ae..fe86fc4 100644
--- a/tests/language/prefix15_test.dart
+++ b/tests/language/prefix15_test.dart
@@ -5,6 +5,7 @@
 // Use qualified symbols with generics at various places.
 
 library Prefix15Test.dart;
+import "package:expect/expect.dart";
 import "library12.dart" as lib12;
 
 typedef T myFunc<T>(T param);
diff --git a/tests/language/prefix16_test.dart b/tests/language/prefix16_test.dart
index 91449f4..4fca6b0 100644
--- a/tests/language/prefix16_test.dart
+++ b/tests/language/prefix16_test.dart
@@ -9,6 +9,7 @@
 // In production, no assignment type checks are performed.
 
 library Prefix16NegativeTest.dart;
+import "package:expect/expect.dart";
 import "library12.dart" as lib12;
 
 typedef lib12.Library13 myFunc(lib12.Library13 param);
diff --git a/tests/language/prefix21_test.dart b/tests/language/prefix21_test.dart
index 26e9c34..2c1e347 100644
--- a/tests/language/prefix21_test.dart
+++ b/tests/language/prefix21_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library Prefix21;
+import "package:expect/expect.dart";
 import "prefix21_good_lib.dart" as good;
 import "prefix21_bad_lib.dart" as bad;
 
diff --git a/tests/language/prefix4_negative_test.dart b/tests/language/prefix4_negative_test.dart
index c11f2f3..0b49e0d 100644
--- a/tests/language/prefix4_negative_test.dart
+++ b/tests/language/prefix4_negative_test.dart
@@ -4,6 +4,7 @@
 //
 
 library Prefix4NegativeTest.dart;
+import "package:expect/expect.dart";
 import "library10.dart";
 
 class Prefix4NegativeTest {
diff --git a/tests/language/prefix5_negative_test.dart b/tests/language/prefix5_negative_test.dart
index ba15fc0..ae76bd9 100644
--- a/tests/language/prefix5_negative_test.dart
+++ b/tests/language/prefix5_negative_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library Prefix5NegativeTest.dart;
+import "package:expect/expect.dart";
 import "library10.dart";
 
 class Prefix5NegativeTest {
diff --git a/tests/language/prefix8_negative_test.dart b/tests/language/prefix8_negative_test.dart
index 93e3477..5878046 100644
--- a/tests/language/prefix8_negative_test.dart
+++ b/tests/language/prefix8_negative_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 //
 
+import "package:expect/expect.dart";
+
 // Local variables can shadow class names and hence should result in an
 // error.
 
diff --git a/tests/language/prefix9_negative_test.dart b/tests/language/prefix9_negative_test.dart
index 1d8d918..51df506 100644
--- a/tests/language/prefix9_negative_test.dart
+++ b/tests/language/prefix9_negative_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 //
 
+import "package:expect/expect.dart";
+
 // Local variables can shadow type parameters and hence should result in an
 // error.
 
diff --git a/tests/language/prefix_new_test.dart b/tests/language/prefix_new_test.dart
index 91c8103..8271082 100644
--- a/tests/language/prefix_new_test.dart
+++ b/tests/language/prefix_new_test.dart
@@ -4,6 +4,7 @@
 
 library PrefixTest;
 
+import "package:expect/expect.dart";
 import "prefix_test1.dart";
 
 
diff --git a/tests/language/prefix_test.dart b/tests/language/prefix_test.dart
index 5a63efc..ec3208e 100644
--- a/tests/language/prefix_test.dart
+++ b/tests/language/prefix_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library PrefixTest.dart;
+import "package:expect/expect.dart";
 import "prefix_test1.dart";
 
 class PrefixTest {
diff --git a/tests/language/private3_test.dart b/tests/language/private3_test.dart
index 23527d0..655db6f 100644
--- a/tests/language/private3_test.dart
+++ b/tests/language/private3_test.dart
@@ -4,6 +4,7 @@
 // Dart test for testing access to private fields.
 
 library Private3Test.dart;
+import "package:expect/expect.dart";
 import "private_lib";
 
 part "private_main.dart";
diff --git a/tests/language/private4_test.dart b/tests/language/private4_test.dart
index 226eba3..3f64b2f 100644
--- a/tests/language/private4_test.dart
+++ b/tests/language/private4_test.dart
@@ -6,6 +6,7 @@
 
 library private4_test;
 
+import "package:expect/expect.dart";
 import 'other_library.dart';
 
 main() {
diff --git a/tests/language/private_mixin2_test.dart b/tests/language/private_mixin2_test.dart
index f01a2c9..0bc0645 100644
--- a/tests/language/private_mixin2_test.dart
+++ b/tests/language/private_mixin2_test.dart
@@ -6,6 +6,7 @@
 
 library private_mixin2;
 
+import 'package:expect/expect.dart';
 import 'private_other_mixin2.lib';
 
 void main() {
diff --git a/tests/language/private_selector_test.dart b/tests/language/private_selector_test.dart
index 53dca839..5d00c94 100644
--- a/tests/language/private_selector_test.dart
+++ b/tests/language/private_selector_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library private_selector_test;
-
+import "package:expect/expect.dart";
 import 'private_selector_lib.dart';
 
 class B extends A {
diff --git a/tests/language/private_test.dart b/tests/language/private_test.dart
index 87e735e..161cb65 100644
--- a/tests/language/private_test.dart
+++ b/tests/language/private_test.dart
@@ -5,6 +5,8 @@
 // Dart test for testing access to private fields.
 
 library PrivateTest.dart;
+
+import "package:expect/expect.dart";
 import "private_other.lib";
 part "private1.dart";
 part "private2.dart";
diff --git a/tests/language/propagated_argument_type_check_test.dart b/tests/language/propagated_argument_type_check_test.dart
index f4bb713..d6923f3 100644
--- a/tests/language/propagated_argument_type_check_test.dart
+++ b/tests/language/propagated_argument_type_check_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:expect/expect.dart";
+
 main() {
   Expect.equals("str", foo("str"));
 }
diff --git a/tests/language/property_field_override_test.dart b/tests/language/property_field_override_test.dart
index 50f64cb9..a1dc8ed 100644
--- a/tests/language/property_field_override_test.dart
+++ b/tests/language/property_field_override_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:expect/expect.dart";
+
 // Test overriding a getter property with a field.
 class A {
   int get v;  // Abstract.
diff --git a/tests/language/pseudo_kw_test.dart b/tests/language/pseudo_kw_test.dart
index 2c9614d..0e55cc1 100644
--- a/tests/language/pseudo_kw_test.dart
+++ b/tests/language/pseudo_kw_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Check that we can use pseudo keywords as names in function level code.
 
+import "package:expect/expect.dart";
+
 
 class PseudoKWTest {
   static testMain() {
diff --git a/tests/language/range_analysis_test.dart b/tests/language/range_analysis_test.dart
index a8b0203..4be7414 100644
--- a/tests/language/range_analysis_test.dart
+++ b/tests/language/range_analysis_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for constructors and initializers.
 
+import "package:expect/expect.dart";
+
 // Check that range analysis does not enter infinite loop trying to propagate
 // ranges through dependant phis.
 bar() {
diff --git a/tests/language/raw_string_test.dart b/tests/language/raw_string_test.dart
index 9cdb383..ee5365b 100644
--- a/tests/language/raw_string_test.dart
+++ b/tests/language/raw_string_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:expect/expect.dart";
+
 class RawStringTest {
   static testMain() {
     Expect.equals("abcd", r"abcd");
diff --git a/tests/language/recursive_loop_phis_test.dart b/tests/language/recursive_loop_phis_test.dart
index 430fb8d..36fa4f2 100644
--- a/tests/language/recursive_loop_phis_test.dart
+++ b/tests/language/recursive_loop_phis_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:expect/expect.dart";
+
 // This program tripped dart2js.
 
 foo(bool b) {
diff --git a/tests/language/reexport_core_test.dart b/tests/language/reexport_core_test.dart
index cbdc15b..23964c4 100644
--- a/tests/language/reexport_core_test.dart
+++ b/tests/language/reexport_core_test.dart
@@ -11,6 +11,7 @@
 
 library reexport_core_test;
 
+import "package:expect/expect.dart";
 import 'reexport_core_helper.dart' as core;
 
 void main() {
diff --git a/tests/language/reg_exp2_test.dart b/tests/language/reg_exp2_test.dart
index 489d917..7859fe5 100644
--- a/tests/language/reg_exp2_test.dart
+++ b/tests/language/reg_exp2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for testing regular expressions in Dart.
 
+import "package:expect/expect.dart";
+
 class RegExp2Test {
   static String findImageTag_(String text, String extensions) {
     final re = new RegExp('src="(http://\\S+\\.(${extensions}))"');
diff --git a/tests/language/reg_exp3_test.dart b/tests/language/reg_exp3_test.dart
index b0410ed..6c2d68b 100644
--- a/tests/language/reg_exp3_test.dart
+++ b/tests/language/reg_exp3_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for testing regular expressions in Dart.
 
+import "package:expect/expect.dart";
+
 class RegExp3Test {
   static testMain() {
     var i = 2000;
diff --git a/tests/language/reg_exp_test.dart b/tests/language/reg_exp_test.dart
index aa3fe39..631cfda 100644
--- a/tests/language/reg_exp_test.dart
+++ b/tests/language/reg_exp_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for testing regular expressions in Dart.
 
+import "package:expect/expect.dart";
+
 class RegExpTest {
   static test1() {
     RegExp exp = new RegExp("(\\w+)");
diff --git a/tests/language/resolution_test.dart b/tests/language/resolution_test.dart
index aed286b..e9c1dc7 100644
--- a/tests/language/resolution_test.dart
+++ b/tests/language/resolution_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:expect/expect.dart";
+
 int get foo => 499;
 
 class CompileError {
diff --git a/tests/language/resolve_test.dart b/tests/language/resolve_test.dart
index 5276158..4c0e319 100644
--- a/tests/language/resolve_test.dart
+++ b/tests/language/resolve_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for testing resolving of dynamic and static calls.
 
+import "package:expect/expect.dart";
+
 class A {
   static staticCall() { return 4; }
   dynamicCall() { return 5; }
diff --git a/tests/language/rethrow_test.dart b/tests/language/rethrow_test.dart
index 60c055c..7c3bf04 100644
--- a/tests/language/rethrow_test.dart
+++ b/tests/language/rethrow_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing throw statement
 
+import "package:expect/expect.dart";
+
 class MyException {
   const MyException();
 }
diff --git a/tests/language/return_in_loop_test.dart b/tests/language/return_in_loop_test.dart
index a960ba6..b4393b2 100644
--- a/tests/language/return_in_loop_test.dart
+++ b/tests/language/return_in_loop_test.dart
@@ -4,6 +4,8 @@
 // Test for a dart2js bug where the live environment was not computed
 // right.
 
+import "package:expect/expect.dart";
+
 class A {
   foo() {
     var x = 0;
diff --git a/tests/language/return_this_type_test.dart b/tests/language/return_this_type_test.dart
index b97e382..d7ad739 100644
--- a/tests/language/return_this_type_test.dart
+++ b/tests/language/return_this_type_test.dart
@@ -4,6 +4,8 @@
 
 // Make sure the engine does not infer the wrong type for [:A.foo:].
 
+import "package:expect/expect.dart";
+
 class A {
   foo() => this;
 }
diff --git a/tests/language/return_type_test.dart b/tests/language/return_type_test.dart
index 462282d..a2137bb 100644
--- a/tests/language/return_type_test.dart
+++ b/tests/language/return_type_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:expect/expect.dart";
+
 isCheckedMode() {
   try {
     var i = 1;
diff --git a/tests/language/runtime_type_test.dart b/tests/language/runtime_type_test.dart
index 1a3f1c8..03c4576 100644
--- a/tests/language/runtime_type_test.dart
+++ b/tests/language/runtime_type_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:expect/expect.dart";
+
 class A {
   get className => runtimeType;
 }
diff --git a/tests/language/savannah_test.dart b/tests/language/savannah_test.dart
index fea178e..449f2c2 100644
--- a/tests/language/savannah_test.dart
+++ b/tests/language/savannah_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test using an identity hash.
 
+import "package:expect/expect.dart";
+
 abstract class BigGame {
   String get name;
 }
diff --git a/tests/language/scope_variable_test.dart b/tests/language/scope_variable_test.dart
index 86716d0..d3bca7c 100644
--- a/tests/language/scope_variable_test.dart
+++ b/tests/language/scope_variable_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:expect/expect.dart";
+
 class ScopeVariableTest {
 
   static void testSimpleScope() {
diff --git a/tests/language/scoped_variables_try_catch_test.dart b/tests/language/scoped_variables_try_catch_test.dart
index 137cf03..575dbc5 100644
--- a/tests/language/scoped_variables_try_catch_test.dart
+++ b/tests/language/scoped_variables_try_catch_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:expect/expect.dart";
+
 // Test that try/catch does not shadow a variable at runtime.
 
 main() {
diff --git a/tests/language/second_test.dart b/tests/language/second_test.dart
index a60941d..5ceb940 100644
--- a/tests/language/second_test.dart
+++ b/tests/language/second_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Second dart test program.
 
+import "package:expect/expect.dart";
+
 class Helper {
   static empty() { }
   static int foo() { return 42; }
diff --git a/tests/language/setter0_test.dart b/tests/language/setter0_test.dart
index e14c651..8eebd0d 100644
--- a/tests/language/setter0_test.dart
+++ b/tests/language/setter0_test.dart
@@ -4,6 +4,8 @@
 // Dart test program for testing setting/getting of fields when
 // only getter/setter methods are specified.
 
+import "package:expect/expect.dart";
+
 class First {
   First(int val) : a_ = val { }
   int a_;
diff --git a/tests/language/setter1_test.dart b/tests/language/setter1_test.dart
index 270351c..5f8b4a4 100644
--- a/tests/language/setter1_test.dart
+++ b/tests/language/setter1_test.dart
@@ -4,6 +4,8 @@
 // Dart test program for testing setting/getting of fields when
 // only getter/setter methods are specified.
 
+import "package:expect/expect.dart";
+
 class First {
   First(int val) : a_ = val { }
 
diff --git a/tests/language/setter2_test.dart b/tests/language/setter2_test.dart
index bdfc8a6..e6d0c62 100644
--- a/tests/language/setter2_test.dart
+++ b/tests/language/setter2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing use of 'this' in an instance method.
 
+import "package:expect/expect.dart";
+
 class Nested {
   Nested(int val) : a = val { }
   int a;
diff --git a/tests/language/setter_no_getter_call_test.dart b/tests/language/setter_no_getter_call_test.dart
index c7b467b..b789d60 100644
--- a/tests/language/setter_no_getter_call_test.dart
+++ b/tests/language/setter_no_getter_call_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:expect/expect.dart";
+
 var topLevelClosure;
 
 /*    /// 01: runtime error
diff --git a/tests/language/setter_no_getter_test.dart b/tests/language/setter_no_getter_test.dart
index f504a30..661b753 100644
--- a/tests/language/setter_no_getter_test.dart
+++ b/tests/language/setter_no_getter_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:expect/expect.dart";
+
 /*    /// 01: runtime error
 get topLevel => 42;
 */   /// 01: continued
diff --git a/tests/language/side_effect_throw_test.dart b/tests/language/side_effect_throw_test.dart
index 82c9cdd..484b762 100644
--- a/tests/language/side_effect_throw_test.dart
+++ b/tests/language/side_effect_throw_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:expect/expect.dart";
+
 class B {
   static var x;
   operator <<(other) {
diff --git a/tests/language/skip_expression_test.dart b/tests/language/skip_expression_test.dart
index bbadada..ad9d685 100644
--- a/tests/language/skip_expression_test.dart
+++ b/tests/language/skip_expression_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:expect/expect.dart";
+
 class OneArg<A> {
   OneArg<A> get foo => new OneArg<A>();
   OneArg<A> get bar {
diff --git a/tests/language/stack_overflow_stacktrace_test.dart b/tests/language/stack_overflow_stacktrace_test.dart
index 3bef1d6..8e85037 100644
--- a/tests/language/stack_overflow_stacktrace_test.dart
+++ b/tests/language/stack_overflow_stacktrace_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart program testing stack overflow.
 
+import "package:expect/expect.dart";
+
 class StackOverflowTest {
 
   static void curseTheRecurse(a, b, c) {
diff --git a/tests/language/stack_overflow_test.dart b/tests/language/stack_overflow_test.dart
index a8e400f..fa3bd7e 100644
--- a/tests/language/stack_overflow_test.dart
+++ b/tests/language/stack_overflow_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart program testing stack overflow.
 
+import "package:expect/expect.dart";
+
 class StackOverflowTest {
 
   static void curseTheRecurse(a, b, c) {
diff --git a/tests/language/stack_trace_test.dart b/tests/language/stack_trace_test.dart
index 87c5815..665313f 100644
--- a/tests/language/stack_trace_test.dart
+++ b/tests/language/stack_trace_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing throw statement
 
+import "package:expect/expect.dart";
+
 class MyException {
   const MyException(String message) : message_ = message;
   final String message_;
diff --git a/tests/language/stacktrace_test.dart b/tests/language/stacktrace_test.dart
index 98e644e..e39f151 100644
--- a/tests/language/stacktrace_test.dart
+++ b/tests/language/stacktrace_test.dart
@@ -4,6 +4,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // Test that a stack trace is properly terminated (issue 8850).
+
+import "package:expect/expect.dart";
+
 void main() {
   var ex = new Exception("fail");
   try {
diff --git a/tests/language/state_mangling2_test.dart b/tests/language/state_mangling2_test.dart
index 637df3e..9467d79 100644
--- a/tests/language/state_mangling2_test.dart
+++ b/tests/language/state_mangling2_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:expect/expect.dart";
+
 foo(state) {
   if (state == null) return 0;
   var sum = 0;
diff --git a/tests/language/state_mangling3_test.dart b/tests/language/state_mangling3_test.dart
index 195a2dd..05e3c50 100644
--- a/tests/language/state_mangling3_test.dart
+++ b/tests/language/state_mangling3_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:expect/expect.dart";
+
 foo(state0) {
   if (state0 == null) return 0;
   var sum = 0;
diff --git a/tests/language/state_mangling4_test.dart b/tests/language/state_mangling4_test.dart
index b6aab91..58c18d1 100644
--- a/tests/language/state_mangling4_test.dart
+++ b/tests/language/state_mangling4_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:expect/expect.dart";
+
 foo(env1) {
   if (env1 == null) return 0;
   var env0 = 0;
diff --git a/tests/language/state_mangling_test.dart b/tests/language/state_mangling_test.dart
index 02df690..84d697b 100644
--- a/tests/language/state_mangling_test.dart
+++ b/tests/language/state_mangling_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:expect/expect.dart";
+
 foo(state) {
   if (state == null) return 0;
   var sum = 0;
diff --git a/tests/language/statement_test.dart b/tests/language/statement_test.dart
index 17d611b..ca11da9 100644
--- a/tests/language/statement_test.dart
+++ b/tests/language/statement_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:expect/expect.dart";
+
 // Tests all statement types. Not an exhaustive test of all statement semantics.
 class StatementTest {
 
diff --git a/tests/language/static_const_field_test.dart b/tests/language/static_const_field_test.dart
index 510f08c..0d2a188 100644
--- a/tests/language/static_const_field_test.dart
+++ b/tests/language/static_const_field_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing static const fields.
 
+import "package:expect/expect.dart";
+
 abstract class Spain {
   static const AG = "Antoni Gaudi";
   static const SD = "Salvador Dali";
diff --git a/tests/language/static_field_test.dart b/tests/language/static_field_test.dart
index b7018fa..3261aed 100644
--- a/tests/language/static_field_test.dart
+++ b/tests/language/static_field_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing setting/getting/initializing static fields.
 
+import "package:expect/expect.dart";
+
 class First {
   First() {}
   static var a;
diff --git a/tests/language/static_implicit_closure_test.dart b/tests/language/static_implicit_closure_test.dart
index 5835a26..b73050e 100644
--- a/tests/language/static_implicit_closure_test.dart
+++ b/tests/language/static_implicit_closure_test.dart
@@ -5,6 +5,8 @@
 // VMOptions=
 // VMOptions=--use_slow_path
 
+import "package:expect/expect.dart";
+
 class First {
   First() {}
   static int get a {
diff --git a/tests/language/static_initializer_type_error_test.dart b/tests/language/static_initializer_type_error_test.dart
index 3d9e1af..d8f668a 100644
--- a/tests/language/static_initializer_type_error_test.dart
+++ b/tests/language/static_initializer_type_error_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:expect/expect.dart";
+
 int x = "milou";
 bool inCheckedMode = false;
 
diff --git a/tests/language/static_inline_test.dart b/tests/language/static_inline_test.dart
index 5163b3d..cad3bf6 100644
--- a/tests/language/static_inline_test.dart
+++ b/tests/language/static_inline_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:expect/expect.dart";
+
 // Test inlining of assignments in parameter passing. If [StringScanner.charAt]
 // is inlined, the argument expresion [: ++byteOffset :] should not be
 // duplicated.
diff --git a/tests/language/static_postfix_operator_test.dart b/tests/language/static_postfix_operator_test.dart
index f55eda1..f8c26cd 100644
--- a/tests/language/static_postfix_operator_test.dart
+++ b/tests/language/static_postfix_operator_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:expect/expect.dart";
+
 int a = 0;
 int b = 0;
 
diff --git a/tests/language/strict_equal_test.dart b/tests/language/strict_equal_test.dart
index 1cd00a9..7a31d93 100644
--- a/tests/language/strict_equal_test.dart
+++ b/tests/language/strict_equal_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:expect/expect.dart";
+
 
 main() {
   for (int i = 0; i < 6000; i++) {
diff --git a/tests/language/string_escapes_test.dart b/tests/language/string_escapes_test.dart
index 6e80214..3261363 100644
--- a/tests/language/string_escapes_test.dart
+++ b/tests/language/string_escapes_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:expect/expect.dart";
+
 class StringEscapesTest {
 
   static testMain() {
diff --git a/tests/language/string_interpolate2_test.dart b/tests/language/string_interpolate2_test.dart
index fe4e6a8..6cf88a97 100644
--- a/tests/language/string_interpolate2_test.dart
+++ b/tests/language/string_interpolate2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program testing string interpolation of expressions.
 
+import "package:expect/expect.dart";
+
 
 class StringInterpolate2Test {
 
diff --git a/tests/language/string_interpolate_null_test.dart b/tests/language/string_interpolate_null_test.dart
index c8aff4a..a06427a 100644
--- a/tests/language/string_interpolate_null_test.dart
+++ b/tests/language/string_interpolate_null_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program testing NPE within string interpolation.
 
+import "package:expect/expect.dart";
+
 class A {
   A(String this.name) {}
   String name;
diff --git a/tests/language/string_interpolate_test.dart b/tests/language/string_interpolate_test.dart
index f8960c9..ae9b0f0 100644
--- a/tests/language/string_interpolate_test.dart
+++ b/tests/language/string_interpolate_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program testing string interpolation.
 
+import "package:expect/expect.dart";
+
 
 class WhatchamaCallIt {
   WhatchamaCallIt() { }
diff --git a/tests/language/string_interpolation7_test.dart b/tests/language/string_interpolation7_test.dart
index a750804..6f558d4 100644
--- a/tests/language/string_interpolation7_test.dart
+++ b/tests/language/string_interpolation7_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:expect/expect.dart";
+
 // Dart test program testing string interpolation with toString on custom
 // classes and on null.
 
diff --git a/tests/language/string_interpolation8_test.dart b/tests/language/string_interpolation8_test.dart
index 8999daf..a3c09bc 100644
--- a/tests/language/string_interpolation8_test.dart
+++ b/tests/language/string_interpolation8_test.dart
@@ -4,6 +4,8 @@
 //
 // Allow assignment of string interpolation to a static const field
 
+import "package:expect/expect.dart";
+
 class A {
   static const x = 1;
   static const y = "Two is greater than ${x}";
diff --git a/tests/language/string_interpolation_test.dart b/tests/language/string_interpolation_test.dart
index ed8b796..5a4f897 100644
--- a/tests/language/string_interpolation_test.dart
+++ b/tests/language/string_interpolation_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:expect/expect.dart";
+
 // Tests for string interpolation
 class StringInterpolationTest {
 
diff --git a/tests/language/string_intrinsics_test.dart b/tests/language/string_intrinsics_test.dart
index de3e3f0..d90ff7a 100644
--- a/tests/language/string_intrinsics_test.dart
+++ b/tests/language/string_intrinsics_test.dart
@@ -4,6 +4,8 @@
 // Replace with shared test once interface issues clarified.
 // Test various String intrinsics
 
+import "package:expect/expect.dart";
+
 main() {
   var oneByte = "Hello world";
   var empty = "";
diff --git a/tests/language/string_join_test.dart b/tests/language/string_join_test.dart
index c98b79fa..eb576d8 100644
--- a/tests/language/string_join_test.dart
+++ b/tests/language/string_join_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Regression test ensuring that only ObjectArrays are handed to the VM code.
 
+import "package:expect/expect.dart";
+
 class StringJoinTest {
   static testMain() {
     List<String> ga = new List<String>();
diff --git a/tests/language/string_supertype_checked_test.dart b/tests/language/string_supertype_checked_test.dart
index 171e31a..75a2a6b 100644
--- a/tests/language/string_supertype_checked_test.dart
+++ b/tests/language/string_supertype_checked_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:expect/expect.dart";
+
 // This tests a bug in dart2js which caused the compiler to emit bad
 // type assertions for supertypes of String.
 
diff --git a/tests/language/string_test.dart b/tests/language/string_test.dart
index bbeb91c..70e77cf 100644
--- a/tests/language/string_test.dart
+++ b/tests/language/string_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Replace with shared test once interface issues clarified.
 
+import "package:expect/expect.dart";
+
 class StringTest {
 
   static testMain() {
diff --git a/tests/language/sub/sub.dart b/tests/language/sub/sub.dart
index 3e9691f..d7f2d20 100644
--- a/tests/language/sub/sub.dart
+++ b/tests/language/sub/sub.dart
@@ -1,5 +1,6 @@
 library sub;
 import '../cyclic_import_test.dart';
+import 'package:expect/expect.dart';
 
 subMain() {
   Expect.equals(42, value);
diff --git a/tests/language/super_all_named_constructor_test.dart b/tests/language/super_all_named_constructor_test.dart
index d33e4c9..37b15d7 100644
--- a/tests/language/super_all_named_constructor_test.dart
+++ b/tests/language/super_all_named_constructor_test.dart
@@ -4,6 +4,8 @@
 // Dart test for testing implicit invocation of super constructor with all
 // named parameters.
 
+import "package:expect/expect.dart";
+
 var res = 0;
 
 class A {
diff --git a/tests/language/super_assign_test.dart b/tests/language/super_assign_test.dart
index 84f8146..39a42d2 100644
--- a/tests/language/super_assign_test.dart
+++ b/tests/language/super_assign_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:expect/expect.dart";
+
 class A {
   int x;
 }
diff --git a/tests/language/super_call3_test.dart b/tests/language/super_call3_test.dart
index 178f4f8..81b19c1 100644
--- a/tests/language/super_call3_test.dart
+++ b/tests/language/super_call3_test.dart
@@ -4,6 +4,8 @@
 // Dart test for testing implicit super calls with bad arguments or no default
 // constructor in super class.
 
+import "package:expect/expect.dart";
+
 class A {
   A(
     this.x  /// 01: compile-time error
diff --git a/tests/language/super_call4_test.dart b/tests/language/super_call4_test.dart
index 0093bda..4d68a19 100644
--- a/tests/language/super_call4_test.dart
+++ b/tests/language/super_call4_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:expect/expect.dart";
+
 // Checks that noSuchMethod is resolved in the super class and not in the
 // current class.
 
diff --git a/tests/language/super_call_test.dart b/tests/language/super_call_test.dart
index 1f56c1c..57e1707 100644
--- a/tests/language/super_call_test.dart
+++ b/tests/language/super_call_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for testing super calls
 
+import "package:expect/expect.dart";
+
 class A {
   A() : field = 0 {}
   int field;
diff --git a/tests/language/super_closure_test.dart b/tests/language/super_closure_test.dart
index c7ba932..ad159ce 100644
--- a/tests/language/super_closure_test.dart
+++ b/tests/language/super_closure_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:expect/expect.dart";
+
 // Dart test program for testing access to super from closure.
 
 class Super {
diff --git a/tests/language/super_field_access_test.dart b/tests/language/super_field_access_test.dart
index ff87b19..38129e8 100644
--- a/tests/language/super_field_access_test.dart
+++ b/tests/language/super_field_access_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:expect/expect.dart";
+
 class A {
   int foo;
   A(this.foo);
diff --git a/tests/language/super_field_test.dart b/tests/language/super_field_test.dart
index 7245d4c..5d51cb2 100644
--- a/tests/language/super_field_test.dart
+++ b/tests/language/super_field_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for testing super field access.
 
+import "package:expect/expect.dart";
+
 
 class A {
   A() {
diff --git a/tests/language/super_first_constructor_test.dart b/tests/language/super_first_constructor_test.dart
index 5954b59..e6cdee1 100644
--- a/tests/language/super_first_constructor_test.dart
+++ b/tests/language/super_first_constructor_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:expect/expect.dart";
+
 // Test that the constructor body of a superclass is invoked.
 
 class Super {
diff --git a/tests/language/super_getter_setter_test.dart b/tests/language/super_getter_setter_test.dart
index 80ac380..ea923e8 100644
--- a/tests/language/super_getter_setter_test.dart
+++ b/tests/language/super_getter_setter_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:expect/expect.dart";
+
 class A {
   var missingSetterField;
   var missingGetterField;
diff --git a/tests/language/super_implicit_closure_test.dart b/tests/language/super_implicit_closure_test.dart
index b25bf04..584d795 100644
--- a/tests/language/super_implicit_closure_test.dart
+++ b/tests/language/super_implicit_closure_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing invocation of implicit closures.
 
+import "package:expect/expect.dart";
+
 class BaseClass {
   BaseClass(this._i) {}
   int foo() { return _i; }
diff --git a/tests/language/super_operator_index2_test.dart b/tests/language/super_operator_index2_test.dart
index 47cf16d..29ff893 100644
--- a/tests/language/super_operator_index2_test.dart
+++ b/tests/language/super_operator_index2_test.dart
@@ -4,6 +4,8 @@
 
 // Test for super indexing operations.
 
+import "package:expect/expect.dart";
+
 class A {
   var map = new Map();
   operator[]=(a, b) { map[a] = b; }
diff --git a/tests/language/super_operator_index3_test.dart b/tests/language/super_operator_index3_test.dart
index f456ba7..405bfc1 100644
--- a/tests/language/super_operator_index3_test.dart
+++ b/tests/language/super_operator_index3_test.dart
@@ -4,6 +4,8 @@
 
 // Test for operator[]= resolved in super class.
 
+import "package:expect/expect.dart";
+
 class A {
   var indexField = new List(2);
   operator[]=(index, value) { indexField[index] = value; }
diff --git a/tests/language/super_operator_index4_test.dart b/tests/language/super_operator_index4_test.dart
index bb31116..8a82959 100644
--- a/tests/language/super_operator_index4_test.dart
+++ b/tests/language/super_operator_index4_test.dart
@@ -4,6 +4,8 @@
 
 // Test for operator[] resolved in the super class.
 
+import "package:expect/expect.dart";
+
 class A {
   var indexField = new List(2);
   operator[](index) => indexField[index];
diff --git a/tests/language/super_operator_index5_test.dart b/tests/language/super_operator_index5_test.dart
index ca14bb7..6842709 100644
--- a/tests/language/super_operator_index5_test.dart
+++ b/tests/language/super_operator_index5_test.dart
@@ -4,6 +4,8 @@
 
 // Test for unresolved super[]=.
 
+import "package:expect/expect.dart";
+
 class A {
   var indexField = new List(2);
   operator[](index) => indexField[index];
diff --git a/tests/language/super_operator_index6_test.dart b/tests/language/super_operator_index6_test.dart
index 70e2bcb..9fb942f 100644
--- a/tests/language/super_operator_index6_test.dart
+++ b/tests/language/super_operator_index6_test.dart
@@ -4,6 +4,8 @@
 
 // Test for unresolved super[].
 
+import "package:expect/expect.dart";
+
 class A {
   var indexField = new List(2);
   operator[]=(index, value) { indexField[index] = value; }
diff --git a/tests/language/super_operator_index7_test.dart b/tests/language/super_operator_index7_test.dart
index 112d882..b77b06f 100644
--- a/tests/language/super_operator_index7_test.dart
+++ b/tests/language/super_operator_index7_test.dart
@@ -4,6 +4,8 @@
 
 // Test for unresolved super[] and super[]=.
 
+import "package:expect/expect.dart";
+
 class A {
   var indexField = new List(2);
 
diff --git a/tests/language/super_operator_test.dart b/tests/language/super_operator_test.dart
index eea7545..d47eb54 100644
--- a/tests/language/super_operator_test.dart
+++ b/tests/language/super_operator_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for testing super operator calls
 
+import "package:expect/expect.dart";
+
 
 class A {
   String val = "";
diff --git a/tests/language/super_setter_interceptor_test.dart b/tests/language/super_setter_interceptor_test.dart
index d9ef157..32b5062 100644
--- a/tests/language/super_setter_interceptor_test.dart
+++ b/tests/language/super_setter_interceptor_test.dart
@@ -4,6 +4,8 @@
 
 // Test that we correctly intercept super getter and setter calls.
 
+import "package:expect/expect.dart";
+
 var expected;
 
 class A {
diff --git a/tests/language/super_setter_test.dart b/tests/language/super_setter_test.dart
index 22baa40..7683d78 100644
--- a/tests/language/super_setter_test.dart
+++ b/tests/language/super_setter_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for testing super setters and getters.
 
+import "package:expect/expect.dart";
+
 class Base {
   Base() {}
   String value_;
diff --git a/tests/language/super_test.dart b/tests/language/super_test.dart
index f4bd085..4a4c8d1 100644
--- a/tests/language/super_test.dart
+++ b/tests/language/super_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:expect/expect.dart";
+
 int i = 0;
 
 // Tests super calls and constructors.
diff --git a/tests/language/switch6_test.dart b/tests/language/switch6_test.dart
index a4d9dd3..231adfc 100644
--- a/tests/language/switch6_test.dart
+++ b/tests/language/switch6_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // The break is in the right scope, http://b/3428700 was agreed upon.
 
+import "package:expect/expect.dart";
+
 class Switch6Test {
 
   static testMain() {
diff --git a/tests/language/switch_fallthru_test.dart b/tests/language/switch_fallthru_test.dart
index 49085e1..a3c8504 100644
--- a/tests/language/switch_fallthru_test.dart
+++ b/tests/language/switch_fallthru_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Check that FallThroughError is thrown if switch clause does not terminate.
 
+import "package:expect/expect.dart";
+
 class SwitchFallthruTest {
   static String test(int n) {
     String result = "foo";
diff --git a/tests/language/switch_label_test.dart b/tests/language/switch_label_test.dart
index 56c3d5d..9bb5e9e 100644
--- a/tests/language/switch_label_test.dart
+++ b/tests/language/switch_label_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test switch statement using labels.
 
+import "package:expect/expect.dart";
+
 class Switcher {
 
   Switcher() { }
diff --git a/tests/language/switch_scope_test.dart b/tests/language/switch_scope_test.dart
index fc297ca..dbba94b 100644
--- a/tests/language/switch_scope_test.dart
+++ b/tests/language/switch_scope_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that a new scope is introduced for each switch case.
 
+import "package:expect/expect.dart";
+
 class SwitchScopeTest {
   static testMain() {
     switch(1) {
diff --git a/tests/language/switch_test.dart b/tests/language/switch_test.dart
index a79a3e6..0ff8e9a 100644
--- a/tests/language/switch_test.dart
+++ b/tests/language/switch_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test switch statement.
 
+import "package:expect/expect.dart";
+
 class Switcher {
 
   Switcher() { }
diff --git a/tests/language/temp_mangling_test.dart b/tests/language/temp_mangling_test.dart
index 3031891..29f26ee 100644
--- a/tests/language/temp_mangling_test.dart
+++ b/tests/language/temp_mangling_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:expect/expect.dart";
+
 main() {
   testOne();
   testTwo();
diff --git a/tests/language/ternary_test.dart b/tests/language/ternary_test.dart
index 52b4450..6549990 100644
--- a/tests/language/ternary_test.dart
+++ b/tests/language/ternary_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for testing the ternary operator.
 
+import "package:expect/expect.dart";
+
 class TernaryTest {
   static true_cond() { return true; }
   static false_cond() { return false; }
diff --git a/tests/language/third_test.dart b/tests/language/third_test.dart
index 1e0b91d..04fc19a 100644
--- a/tests/language/third_test.dart
+++ b/tests/language/third_test.dart
@@ -4,6 +4,8 @@
 // Third dart test program.
 // @static-clean
 
+import "package:expect/expect.dart";
+
 class A extends B {
   var a;
   static var s;
diff --git a/tests/language/throw1_test.dart b/tests/language/throw1_test.dart
index ba18e06..088eb0e 100644
--- a/tests/language/throw1_test.dart
+++ b/tests/language/throw1_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing throw statement
 
+import "package:expect/expect.dart";
+
 abstract class TestException {
   String getMessage();
 }
diff --git a/tests/language/throw2_test.dart b/tests/language/throw2_test.dart
index a706b3a..b25e340 100644
--- a/tests/language/throw2_test.dart
+++ b/tests/language/throw2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing throw statement
 
+import "package:expect/expect.dart";
+
 abstract class TestException {
   String getMessage();
 }
diff --git a/tests/language/throw3_test.dart b/tests/language/throw3_test.dart
index 49d184f..111404c 100644
--- a/tests/language/throw3_test.dart
+++ b/tests/language/throw3_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing throw statement
 
+import "package:expect/expect.dart";
+
 class MyException {
   const MyException([String message = ""]) : message_ = message;
   final String message_;
diff --git a/tests/language/throw4_test.dart b/tests/language/throw4_test.dart
index 6b4a36d..5b82a80 100644
--- a/tests/language/throw4_test.dart
+++ b/tests/language/throw4_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing throw statement
 
+import "package:expect/expect.dart";
+
 class MyException1 {
   const MyException1([String message = "1"]) : message_ = message;
   final String message_;
diff --git a/tests/language/throw5_test.dart b/tests/language/throw5_test.dart
index d742cf4..349ade7 100644
--- a/tests/language/throw5_test.dart
+++ b/tests/language/throw5_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing throw statement
 
+import "package:expect/expect.dart";
+
 class MyException1 {
   const MyException1([String message = "1"]) : message_ = message;
   final String message_;
diff --git a/tests/language/throw6_test.dart b/tests/language/throw6_test.dart
index b6a4ac7..014f677 100644
--- a/tests/language/throw6_test.dart
+++ b/tests/language/throw6_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing throw statement
 
+import "package:expect/expect.dart";
+
 class MyException1 {
   const MyException1([String message = "1"]) : message_ = message;
   final String message_;
diff --git a/tests/language/throw_expr_test.dart b/tests/language/throw_expr_test.dart
index 901a9f5..f844771 100644
--- a/tests/language/throw_expr_test.dart
+++ b/tests/language/throw_expr_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:expect/expect.dart";
+
 // Dart test program for testing throw expressions.
 
 void test1() {
diff --git a/tests/language/throw_test.dart b/tests/language/throw_test.dart
index 24ec9d1..0c864cc 100644
--- a/tests/language/throw_test.dart
+++ b/tests/language/throw_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing throw statement
 
+import "package:expect/expect.dart";
+
 class MyException {
   const MyException(String this.message_);
   final String message_;
diff --git a/tests/language/top_level_func_test.dart b/tests/language/top_level_func_test.dart
index c26f8e4..1871b90c 100644
--- a/tests/language/top_level_func_test.dart
+++ b/tests/language/top_level_func_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program testing top-level variables.
 
+import "package:expect/expect.dart";
+
 
 class TopLevelFuncTest {
   static testMain() {
diff --git a/tests/language/top_level_getter_arrow_syntax_test.dart b/tests/language/top_level_getter_arrow_syntax_test.dart
index 44c0689..990c0ad 100644
--- a/tests/language/top_level_getter_arrow_syntax_test.dart
+++ b/tests/language/top_level_getter_arrow_syntax_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:expect/expect.dart";
+
 get getter => 42;
 
 List<int> get lgetter => null;
diff --git a/tests/language/top_level_in_initializer_test.dart b/tests/language/top_level_in_initializer_test.dart
index 4c379bf..a037081 100644
--- a/tests/language/top_level_in_initializer_test.dart
+++ b/tests/language/top_level_in_initializer_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:expect/expect.dart";
+
 // Test that constructor initializers can access top level elements.
 
 const topLevelField = 1;
diff --git a/tests/language/top_level_method_test.dart b/tests/language/top_level_method_test.dart
index a86b776..ea3ce0f 100644
--- a/tests/language/top_level_method_test.dart
+++ b/tests/language/top_level_method_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:expect/expect.dart";
+
 untypedTopLevel() {
   return 1;
 }
diff --git a/tests/language/top_level_multiple_files_test.dart b/tests/language/top_level_multiple_files_test.dart
index f9c835a..b6dd4b5 100644
--- a/tests/language/top_level_multiple_files_test.dart
+++ b/tests/language/top_level_multiple_files_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library TopLevelMultipleFilesTest.dart;
+
+import "package:expect/expect.dart";
 part 'top_level_file1.dart';
 part 'top_level_file2.dart';
 
diff --git a/tests/language/top_level_non_prefixed_library_test.dart b/tests/language/top_level_non_prefixed_library_test.dart
index 689eb97..5a3995c 100644
--- a/tests/language/top_level_non_prefixed_library_test.dart
+++ b/tests/language/top_level_non_prefixed_library_test.dart
@@ -3,5 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library TopLevelNonPrefixLibraryTest.dart;
+
+import "package:expect/expect.dart";
 import 'top_level_prefixed_library_test.lib';
 part 'top_level_file1.dart';
diff --git a/tests/language/top_level_prefixed_declaration_test.dart b/tests/language/top_level_prefixed_declaration_test.dart
index 7bdad68..c1c765a 100644
--- a/tests/language/top_level_prefixed_declaration_test.dart
+++ b/tests/language/top_level_prefixed_declaration_test.dart
@@ -5,6 +5,7 @@
 // Dart test for top level declarations involving an imported type.
 
 library main;
+import "package:expect/expect.dart";
 import "library11.dart" as lib11;
 
 lib11.Library11 variable = null;
diff --git a/tests/language/top_level_var_test.dart b/tests/language/top_level_var_test.dart
index 9bd029a..91806ae 100644
--- a/tests/language/top_level_var_test.dart
+++ b/tests/language/top_level_var_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program testing top-level variables.
 
+import "package:expect/expect.dart";
+
 
 var a, b;
 
diff --git a/tests/language/tree_shake_typed_selector_test.dart b/tests/language/tree_shake_typed_selector_test.dart
index fa02e08..480c846 100644
--- a/tests/language/tree_shake_typed_selector_test.dart
+++ b/tests/language/tree_shake_typed_selector_test.dart
@@ -4,6 +4,8 @@
 // Check that dart2js emits code for classes that implement another
 // class.
 
+import "package:expect/expect.dart";
+
 class A {
   factory A() => new B();
   foo() => 0;
diff --git a/tests/language/try_catch2_test.dart b/tests/language/try_catch2_test.dart
index 908e4ce..fea2de8 100644
--- a/tests/language/try_catch2_test.dart
+++ b/tests/language/try_catch2_test.dart
@@ -4,6 +4,8 @@
 // Dart test program for testing try/catch statement without any exceptions
 // being thrown. (Nested try/catch blocks).
 
+import "package:expect/expect.dart";
+
 abstract class TestException {
   String getMessage();
 }
diff --git a/tests/language/try_catch3_test.dart b/tests/language/try_catch3_test.dart
index 115714e..d679a4b 100644
--- a/tests/language/try_catch3_test.dart
+++ b/tests/language/try_catch3_test.dart
@@ -4,6 +4,8 @@
 // Dart test program for testing try/catch statement without any exceptions
 // being thrown.
 
+import "package:expect/expect.dart";
+
 abstract class TestException {
   String getMessage();
 }
diff --git a/tests/language/try_catch4_test.dart b/tests/language/try_catch4_test.dart
index 16a0457..9ee40f5 100644
--- a/tests/language/try_catch4_test.dart
+++ b/tests/language/try_catch4_test.dart
@@ -4,6 +4,8 @@
 // Check that our SSA graph does have the try body a predecessor of a
 // try/finally.
 
+import "package:expect/expect.dart";
+
 var a;
 
 foo1() {
diff --git a/tests/language/try_catch5_test.dart b/tests/language/try_catch5_test.dart
index cf74a47..1b0e421 100644
--- a/tests/language/try_catch5_test.dart
+++ b/tests/language/try_catch5_test.dart
@@ -4,6 +4,8 @@
 // Check that our SSA graph does have the try body a predecessor of a
 // try/finally.
 
+import "package:expect/expect.dart";
+
 var a;
 
 foo1() {
diff --git a/tests/language/try_catch_on_syntax_test.dart b/tests/language/try_catch_on_syntax_test.dart
index e62f00f..cf79fdd7 100644
--- a/tests/language/try_catch_on_syntax_test.dart
+++ b/tests/language/try_catch_on_syntax_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:expect/expect.dart";
+
 class MyException { }
 
 class MyException1 extends MyException { }
diff --git a/tests/language/try_catch_test.dart b/tests/language/try_catch_test.dart
index c3da133..ff3d6d6 100644
--- a/tests/language/try_catch_test.dart
+++ b/tests/language/try_catch_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:expect/expect.dart";
+
 class MyException { }
 
 class MyException1 extends MyException { }
diff --git a/tests/language/type_cast_vm_test.dart b/tests/language/type_cast_vm_test.dart
index d61f036..90bb522 100644
--- a/tests/language/type_cast_vm_test.dart
+++ b/tests/language/type_cast_vm_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // VMOptions=--no_show_internal_names
-//
 // Dart test program testing type casts.
+import "package:expect/expect.dart";
 
 checkTopFunction(String expected, StackTrace stacktrace) {
   var topLine = stacktrace.toString().split("\n")[0];
diff --git a/tests/language/type_checks_in_factory_method_test.dart b/tests/language/type_checks_in_factory_method_test.dart
index b0056d7..4402fd6 100644
--- a/tests/language/type_checks_in_factory_method_test.dart
+++ b/tests/language/type_checks_in_factory_method_test.dart
@@ -4,6 +4,8 @@
 // VMOptions=--enable_checked_mode
 // Tests the type checking when passing code into closure from inside a factory method
 
+import "package:expect/expect.dart";
+
 abstract class Foo<T> {
   factory Foo.from() = Bar<T>.from;
 }
diff --git a/tests/language/type_error_test.dart b/tests/language/type_error_test.dart
index c1eca89..b41ad07 100644
--- a/tests/language/type_error_test.dart
+++ b/tests/language/type_error_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:expect/expect.dart";
+
 // Test that various type errors doesn't invoke user-defined code
 // during error reporting.
 
diff --git a/tests/language/type_guard_conversion_test.dart b/tests/language/type_guard_conversion_test.dart
index a008b62..c931108 100644
--- a/tests/language/type_guard_conversion_test.dart
+++ b/tests/language/type_guard_conversion_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:expect/expect.dart";
+
 foo() => 'bar';
 
 main() {
diff --git a/tests/language/type_intersection_test.dart b/tests/language/type_intersection_test.dart
index a6e2603..dc548b4 100644
--- a/tests/language/type_intersection_test.dart
+++ b/tests/language/type_intersection_test.dart
@@ -5,6 +5,8 @@
 // Regression test for dart2js that used to consider that the
 // intersection of [Comparable] and [num] is conflicting.
 
+import "package:expect/expect.dart";
+
 class A {
   foo(a, Comparable b) => a == b;
   bar(a, Comparable b) => b == a;
diff --git a/tests/language/type_parameter_literal_test.dart b/tests/language/type_parameter_literal_test.dart
index 64d95eb..452b535 100644
--- a/tests/language/type_parameter_literal_test.dart
+++ b/tests/language/type_parameter_literal_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:expect/expect.dart";
+
 // Test type parameter literal expressions.
 
 class D<T> {
diff --git a/tests/language/type_parameter_test.dart b/tests/language/type_parameter_test.dart
index 7244c43..e1a03d3 100644
--- a/tests/language/type_parameter_test.dart
+++ b/tests/language/type_parameter_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:expect/expect.dart";
+
 class A<T> {
   Function closure;
   A._(this.closure);
diff --git a/tests/language/type_propagation_in_for_update_test.dart b/tests/language/type_propagation_in_for_update_test.dart
index 2a41e0c..058518e 100644
--- a/tests/language/type_propagation_in_for_update_test.dart
+++ b/tests/language/type_propagation_in_for_update_test.dart
@@ -4,6 +4,8 @@
 // Check that phi type computation in the Dart2Js compiler does the
 // correct thing.
 
+import "package:expect/expect.dart";
+
 bar() => 'foo';
 
 main() {
diff --git a/tests/language/type_propagation_phi_test.dart b/tests/language/type_propagation_phi_test.dart
index b64cfa7..8154ffc 100644
--- a/tests/language/type_propagation_phi_test.dart
+++ b/tests/language/type_propagation_phi_test.dart
@@ -4,6 +4,8 @@
 // Check that phi type computation in the Dart2Js compiler does the
 // correct thing.
 
+import "package:expect/expect.dart";
+
 bar() => 490;
 bar2() => 0;
 
diff --git a/tests/language/type_variable_bounds2_test.dart b/tests/language/type_variable_bounds2_test.dart
index d5ce7c7..1a23beb 100644
--- a/tests/language/type_variable_bounds2_test.dart
+++ b/tests/language/type_variable_bounds2_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:expect/expect.dart";
+
 // Test of parameterized types with invalid bounds.
 
 abstract class J<T> { }
diff --git a/tests/language/type_variable_field_initializer_closure_test.dart b/tests/language/type_variable_field_initializer_closure_test.dart
index e4da4a5..a3e3e47 100644
--- a/tests/language/type_variable_field_initializer_closure_test.dart
+++ b/tests/language/type_variable_field_initializer_closure_test.dart
@@ -5,6 +5,8 @@
 // Check that an inlined field closure has access to the enclosing
 // type variables.
 
+import "package:expect/expect.dart";
+
 class A<T> {
   var c = (() => new List<T>())();
 }
diff --git a/tests/language/type_variable_field_initializer_test.dart b/tests/language/type_variable_field_initializer_test.dart
index 5519409..cc0ba50 100644
--- a/tests/language/type_variable_field_initializer_test.dart
+++ b/tests/language/type_variable_field_initializer_test.dart
@@ -5,6 +5,8 @@
 // Check that an inlined field initializer has access to the enclosing
 // type variables.
 
+import "package:expect/expect.dart";
+
 class A<T> {
   var c = new List<T>();
 }
diff --git a/tests/language/type_variable_initializer_test.dart b/tests/language/type_variable_initializer_test.dart
index 721be03..e7b1ddf 100644
--- a/tests/language/type_variable_initializer_test.dart
+++ b/tests/language/type_variable_initializer_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:expect/expect.dart";
+
 // Regression test for dart2js where the reference to [:this:] in a
 // constructor was not propagated to the super initializers.
 
diff --git a/tests/language/type_variable_nested_test.dart b/tests/language/type_variable_nested_test.dart
index 5611ea74..eee0be0 100644
--- a/tests/language/type_variable_nested_test.dart
+++ b/tests/language/type_variable_nested_test.dart
@@ -5,6 +5,8 @@
 // Regression test for
 // http://code.google.com/p/dart/issues/detail?id=9050.
 
+import 'package:expect/expect.dart';
+
 class A<T> {
 }
 
diff --git a/tests/language/type_variable_scope2_test.dart b/tests/language/type_variable_scope2_test.dart
index 5c018a6..569daee 100644
--- a/tests/language/type_variable_scope2_test.dart
+++ b/tests/language/type_variable_scope2_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:expect/expect.dart";
+
 // Test that malformed type arguments are reported in checked mode.
 
 isCheckedMode() {
diff --git a/tests/language/type_vm_test.dart b/tests/language/type_vm_test.dart
index 7b525a1..29f7aff 100644
--- a/tests/language/type_vm_test.dart
+++ b/tests/language/type_vm_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // VMOptions=--enable_type_checks --no_show_internal_names
-//
 // Dart test program testing type checks.
+import "package:expect/expect.dart";
 
 class TypeTest {
   static test() {
diff --git a/tests/language/typed_message_test.dart b/tests/language/typed_message_test.dart
index 4c23387..0904fae 100644
--- a/tests/language/typed_message_test.dart
+++ b/tests/language/typed_message_test.dart
@@ -6,6 +6,7 @@
 // VMOptions=--checked
 
 library TypedMessageTest;
+import "package:expect/expect.dart";
 import "dart:isolate";
 
 void logMessages() {
diff --git a/tests/language/typed_selector_test.dart b/tests/language/typed_selector_test.dart
index 8624528..676dcad 100644
--- a/tests/language/typed_selector_test.dart
+++ b/tests/language/typed_selector_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:expect/expect.dart";
+
 // Regression test for http://dartbug.com/6259. This test used to fail
 // on dart2js because class A does not know [A.document] is a target for
 // the call [:obj.document:] in the [main] method. Therefore, dart2js
diff --git a/tests/language/typedef_is_test.dart b/tests/language/typedef_is_test.dart
index 768eb4c..43b9456 100644
--- a/tests/language/typedef_is_test.dart
+++ b/tests/language/typedef_is_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:expect/expect.dart";
+
 // Test is-test of typedefs with optional and named parameters.
 
 typedef int Func1(int a);
diff --git a/tests/language/unary2_test.dart b/tests/language/unary2_test.dart
index 550cb48..81d3335 100644
--- a/tests/language/unary2_test.dart
+++ b/tests/language/unary2_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for testing binary operations.
 
+import "package:expect/expect.dart";
+
 class UnaryTest {
   static foo() { return -4; }
   static moo() { return +5; }
diff --git a/tests/language/unary_test.dart b/tests/language/unary_test.dart
index 109aa7f..a4001e7 100644
--- a/tests/language/unary_test.dart
+++ b/tests/language/unary_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:expect/expect.dart";
+
 // Dart test for testing binary operations.
 
 class UnaryTest {
diff --git a/tests/language/unnamed_closure_test.dart b/tests/language/unnamed_closure_test.dart
index 49fb684..cb4a075 100644
--- a/tests/language/unnamed_closure_test.dart
+++ b/tests/language/unnamed_closure_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:expect/expect.dart";
+
 getNonArray() => new A();
 
 class A {
diff --git a/tests/language/unqual_name_test.dart b/tests/language/unqual_name_test.dart
index 57a178c..ec51947 100644
--- a/tests/language/unqual_name_test.dart
+++ b/tests/language/unqual_name_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program to check that we can resolve unqualified identifiers
 
+import "package:expect/expect.dart";
+
 
 class B {
   B(x, y) : b = y { }
diff --git a/tests/language/value_range2_test.dart b/tests/language/value_range2_test.dart
index 6e45cc1..539af35 100644
--- a/tests/language/value_range2_test.dart
+++ b/tests/language/value_range2_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:expect/expect.dart";
+
 int inscrutable(int x) => x == 0 ? 0 : x | inscrutable(x & (x - 1));
 
 foo() {
diff --git a/tests/language/value_range3_test.dart b/tests/language/value_range3_test.dart
index 6b5e169..7180938 100644
--- a/tests/language/value_range3_test.dart
+++ b/tests/language/value_range3_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:expect/expect.dart';
+
 class A {
   copy(array, index1, index2) {
     if (index1 < index2 + index2) {
diff --git a/tests/language/value_range_test.dart b/tests/language/value_range_test.dart
index 5f4abb7..52892ce 100644
--- a/tests/language/value_range_test.dart
+++ b/tests/language/value_range_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:expect/expect.dart";
+
 int inscrutable(int x) => x == 0 ? 0 : x | inscrutable(x & (x - 1));
 
 foo() {
diff --git a/tests/language/var_init_test.dart b/tests/language/var_init_test.dart
index 562d592..61ffd9b 100644
--- a/tests/language/var_init_test.dart
+++ b/tests/language/var_init_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Testing correct initialization of variables in scopes.
 
+import "package:expect/expect.dart";
+
 class VarInitTest {
   static void testMain() {
     for (int i = 0; i < 10; i++) {
diff --git a/tests/language/void_type_test.dart b/tests/language/void_type_test.dart
index 5d52f0b..92ccd4d 100644
--- a/tests/language/void_type_test.dart
+++ b/tests/language/void_type_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test for type checks involving the void type.
 
+import "package:expect/expect.dart";
+
 isCheckedMode() {
   try {
     var i = 1;
diff --git a/tests/language/while_test.dart b/tests/language/while_test.dart
index 378048a..5263d75 100644
--- a/tests/language/while_test.dart
+++ b/tests/language/while_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing while statement.
 
+import "package:expect/expect.dart";
+
 class Helper {
   static int f1(bool b) {
     while (b)
diff --git a/tests/language/wrong_number_type_arguments_test.dart b/tests/language/wrong_number_type_arguments_test.dart
index f04f438..8d84160 100644
--- a/tests/language/wrong_number_type_arguments_test.dart
+++ b/tests/language/wrong_number_type_arguments_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:expect/expect.dart";
+
 // Map takes 2 type arguments.
 Map
 <String> /// 00: static type warning
diff --git a/tests/lib/async/deferred/deferred_api_test.dart b/tests/lib/async/deferred/deferred_api_test.dart
index a144468..7c6d390 100644
--- a/tests/lib/async/deferred/deferred_api_test.dart
+++ b/tests/lib/async/deferred/deferred_api_test.dart
@@ -8,6 +8,7 @@
 // makes it possible to pass this test without having implemented
 // deferred loading correctly.
 
+import "package:expect/expect.dart";
 import 'dart:async';
 
 @lazy
diff --git a/tests/lib/async/first_regression_test.dart b/tests/lib/async/first_regression_test.dart
new file mode 100644
index 0000000..a8a512d
--- /dev/null
+++ b/tests/lib/async/first_regression_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for http://dartbug.com/7964
+
+library first_regression_test;
+import 'dart:async';
+import '../../../pkg/unittest/lib/unittest.dart';
+
+class DoubleTransformer<T> extends StreamEventTransformer<T, T> {
+  void handleData(T data, EventSink<T> sink) {
+    sink.add(data);
+    sink.add(data);
+  }
+}
+
+main() {
+  test("Double event before first", () {
+    // This should not crash. Did crash by trying to complete future more
+    // than once.
+    new Stream.fromIterable([1, 2])
+        .transform(new DoubleTransformer())
+        .first
+        .then(expectAsync1((e) {}));
+  });
+}
diff --git a/tests/lib/async/future_delayed_error_test.dart b/tests/lib/async/future_delayed_error_test.dart
index a17343e..8d444c2 100644
--- a/tests/lib/async/future_delayed_error_test.dart
+++ b/tests/lib/async/future_delayed_error_test.dart
@@ -4,6 +4,7 @@
 
 library future_delayed_error_test;
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:isolate';
 
diff --git a/tests/lib/async/future_test.dart b/tests/lib/async/future_test.dart
index af4a5dd..6feffe1 100644
--- a/tests/lib/async/future_test.dart
+++ b/tests/lib/async/future_test.dart
@@ -4,6 +4,7 @@
 
 library future_test;
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:isolate';
 
diff --git a/tests/lib/async/futures_test.dart b/tests/lib/async/futures_test.dart
index e694134..7ae1d7e 100644
--- a/tests/lib/async/futures_test.dart
+++ b/tests/lib/async/futures_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library futures_test;
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:isolate';
 
diff --git a/tests/lib/async/run_async2_test.dart b/tests/lib/async/run_async2_test.dart
index 0343c79..96a7c7b 100644
--- a/tests/lib/async/run_async2_test.dart
+++ b/tests/lib/async/run_async2_test.dart
@@ -4,6 +4,7 @@
 
 library run_async_test;
 
+import 'package:expect/expect.dart';
 import 'dart:async';
 import '../../../pkg/unittest/lib/unittest.dart';
 
diff --git a/tests/lib/async/run_async5_test.dart b/tests/lib/async/run_async5_test.dart
index 4565282..7bfdf26 100644
--- a/tests/lib/async/run_async5_test.dart
+++ b/tests/lib/async/run_async5_test.dart
@@ -4,6 +4,7 @@
 
 library run_async_test;
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import '../../../pkg/unittest/lib/unittest.dart';
 
diff --git a/tests/lib/async/slow_consumer2_test.dart b/tests/lib/async/slow_consumer2_test.dart
index 25dbf95..d4865c4 100644
--- a/tests/lib/async/slow_consumer2_test.dart
+++ b/tests/lib/async/slow_consumer2_test.dart
@@ -6,6 +6,7 @@
 
 library slow_consumer2_test;
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:isolate';
 
diff --git a/tests/lib/async/slow_consumer3_test.dart b/tests/lib/async/slow_consumer3_test.dart
index 8dde399..18842c0 100644
--- a/tests/lib/async/slow_consumer3_test.dart
+++ b/tests/lib/async/slow_consumer3_test.dart
@@ -6,6 +6,7 @@
 
 library slow_consumer3_test;
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:isolate';
 
diff --git a/tests/lib/async/slow_consumer_test.dart b/tests/lib/async/slow_consumer_test.dart
index b8ae7f9..c07f8ac 100644
--- a/tests/lib/async/slow_consumer_test.dart
+++ b/tests/lib/async/slow_consumer_test.dart
@@ -6,6 +6,7 @@
 
 library slow_consumer_test;
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:isolate';
 
diff --git a/tests/lib/async/stream_controller_async_test.dart b/tests/lib/async/stream_controller_async_test.dart
index 98fd749..dca28e1 100644
--- a/tests/lib/async/stream_controller_async_test.dart
+++ b/tests/lib/async/stream_controller_async_test.dart
@@ -5,6 +5,7 @@
 // Test the basic StreamController and StreamController.singleSubscription.
 library stream_controller_async_test;
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:isolate';
 import '../../../pkg/unittest/lib/unittest.dart';
@@ -31,22 +32,6 @@
      .catchError(expectAsync1((e) { Expect.equals("Fnyf!", e.error); }));
     c.add(42);
   });
-
-  test("StreamController.pipeInto", () {
-    StreamController c = new StreamController.broadcast();
-    var list = <int>[];
-    Stream stream = c.stream;
-    stream.pipeInto(new CollectionSink<int>(list))
-     .whenComplete(expectAsync0(() {
-        Expect.listEquals(<int>[1,2,9,3,9], list);
-      }));
-    c.add(1);
-    c.add(2);
-    c.add(9);
-    c.add(3);
-    c.add(9);
-    c.close();
-  });
 }
 
 testSingleController() {
@@ -68,22 +53,6 @@
     c.add(42);
   });
 
-  test("Single-subscription StreamController.pipeInto", () {
-    StreamController c = new StreamController();
-    var list = <int>[];
-    Stream stream = c.stream;
-    stream.pipeInto(new CollectionSink<int>(list))
-     .whenComplete(expectAsync0(() {
-        Expect.listEquals(<int>[1,2,9,3,9], list);
-      }));
-    c.add(1);
-    c.add(2);
-    c.add(9);
-    c.add(3);
-    c.add(9);
-    c.close();
-  });
-
   test("Single-subscription StreamController subscription changes", () {
     StreamController c = new StreamController();
     EventSink sink = c.sink;
@@ -431,7 +400,7 @@
       Future f = streamValueTransform(c.stream, (v) { throw error; });
       f.then((v) { Expect.fail("unreachable"); },
              onError: expectAsync1((e) { Expect.identical(error, e); }));
-      // Need two values to trigger compare for min/max.
+      // Need two values to trigger compare for reduce.
       c.add(0);
       c.add(1);
       c.close();
@@ -446,9 +415,7 @@
   testStreamError("handleTest", (s, act) => s.handleError((v) {}, test: act));
   testFuture("every", (s, act) => s.every(act));
   testFuture("any", (s, act) => s.any(act));
-  testFuture("min", (s, act) => s.min((a, b) => act(b)));
-  testFuture("max", (s, act) => s.max((a, b) => act(b)));
-  testFuture("reduce", (s, act) => s.reduce(0, (a,b) => act(b)));
+  testFuture("reduce", (s, act) => s.reduce((a,b) => act(b)));
   testFuture("fold", (s, act) => s.fold(0, (a,b) => act(b)));
 }
 
diff --git a/tests/lib/async/stream_controller_test.dart b/tests/lib/async/stream_controller_test.dart
index 20a05fd..7eba3c1 100644
--- a/tests/lib/async/stream_controller_test.dart
+++ b/tests/lib/async/stream_controller_test.dart
@@ -5,6 +5,7 @@
 // Test the basic StreamController and StreamController.singleSubscription.
 library stream_controller_test;
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'event_helper.dart';
 
@@ -97,8 +98,11 @@
           handleData: (v, s) { s.addError(new AsyncError(v)); },
           handleError: (e, s) { s.add(e.error); },
           handleDone: (s) {
+
             s.add("foo");
+
             s.close();
+
           })));
   sentEvents.replay(c);
   Expect.listEquals(expectedEvents.events, actualEvents.events);
@@ -228,18 +232,6 @@
   sentEvents.replay(c);
   Expect.listEquals(expectedEvents.events, actualEvents.events);
 
-  // pipe is tested asynchronously and therefore not in this file.
-  c = new StreamController();
-  var list = <int>[];
-  c.stream.pipeInto(new CollectionSink<int>(list))
-   .whenComplete(() { Expect.listEquals(<int>[1,2,9,3,9], list); });
-  c.add(1);
-  c.add(2);
-  c.add(9);
-  c.add(3);
-  c.add(9);
-  c.close();
-
   // test contains.
   {
     c = new StreamController();
@@ -372,6 +364,7 @@
   sentEvents.replay(c);
   Expect.listEquals(expectedEvents.events, actualEvents.events);
 
+
   c = new StreamController();
   sentEvents = new Events()
       ..add(1)..add(1)..add(2)..add(1)..add(2)..add(2)..add(2)..close();
@@ -381,6 +374,7 @@
   sentEvents.replay(c);
   Expect.listEquals(expectedEvents.events, actualEvents.events);
 
+
   c = new StreamController();
   sentEvents = new Events()
       ..add(5)..add(6)..add(4)..add(6)..add(8)..add(3)..add(4)..add(1)..close();
diff --git a/tests/lib/async/stream_event_transform_test.dart b/tests/lib/async/stream_event_transform_test.dart
index 1f79f99..78c79cd 100644
--- a/tests/lib/async/stream_event_transform_test.dart
+++ b/tests/lib/async/stream_event_transform_test.dart
@@ -4,6 +4,7 @@
 
 library stream_event_transform_test;
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import '../../../pkg/unittest/lib/unittest.dart';
 import 'event_helper.dart';
diff --git a/tests/lib/async/stream_from_iterable_test.dart b/tests/lib/async/stream_from_iterable_test.dart
index 0af493d..ab7d543 100644
--- a/tests/lib/async/stream_from_iterable_test.dart
+++ b/tests/lib/async/stream_from_iterable_test.dart
@@ -5,6 +5,7 @@
 // Test merging streams.
 library dart.test.stream_from_iterable;
 
+import "package:expect/expect.dart";
 import "dart:async";
 import '../../../pkg/unittest/lib/unittest.dart';
 import 'event_helper.dart';
diff --git a/tests/lib/async/stream_min_max_test.dart b/tests/lib/async/stream_min_max_test.dart
deleted file mode 100644
index 67c9f01..0000000
--- a/tests/lib/async/stream_min_max_test.dart
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library stream_min_max_test;
-
-import 'dart:async';
-import 'dart:isolate';
-import '../../../pkg/unittest/lib/unittest.dart';
-import 'event_helper.dart';
-
-const int big = 1000000;
-const double inf = double.INFINITY;
-List intList = const [-0, 0, -1, 1, -10, 10, -big, big];
-List doubleList = const [-0.0, 0.0, -1.0, 1.0, -10.0, 10.0, -inf, inf];
-
-main() {
-  testMinMax(name, iterable, min, max, [int compare(a, b)]) {
-    test("$name-min", () {
-      StreamController c = new StreamController();
-      Future f = c.stream.min(compare);
-      f.then(expectAsync1((v) { Expect.equals(min, v);}));
-      new Events.fromIterable(iterable).replay(c);
-    });
-    test("$name-max", () {
-      StreamController c = new StreamController();
-      Future f = c.stream.max(compare);
-      f.then(expectAsync1((v) { Expect.equals(max, v);}));
-      new Events.fromIterable(iterable).replay(c);
-    });
-  }
-
-  testMinMax("const-int", intList, -big, big);
-  testMinMax("list-int", intList.toList(), -big, big);
-  testMinMax("set-int", intList.toSet(), -big, big);
-
-  testMinMax("const-double", doubleList, -inf, inf);
-  testMinMax("list-double", doubleList.toList(), -inf, inf);
-  testMinMax("set-double", doubleList.toSet(), -inf, inf);
-
-  int reverse(a, b) => b.compareTo(a);
-  testMinMax("rev-int", intList, big, -big, reverse);
-  testMinMax("rev-double", doubleList, inf, -inf, reverse);
-}
diff --git a/tests/lib/async/stream_single_test.dart b/tests/lib/async/stream_single_test.dart
index a3348b5..3bc889a 100644
--- a/tests/lib/async/stream_single_test.dart
+++ b/tests/lib/async/stream_single_test.dart
@@ -5,6 +5,7 @@
 // Test the Stream.single method.
 library stream_single_test;
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:isolate';
 import '../../../pkg/unittest/lib/unittest.dart';
diff --git a/tests/lib/async/stream_single_to_multi_subscriber_test.dart b/tests/lib/async/stream_single_to_multi_subscriber_test.dart
index 2b814b7..8424cb2 100644
--- a/tests/lib/async/stream_single_to_multi_subscriber_test.dart
+++ b/tests/lib/async/stream_single_to_multi_subscriber_test.dart
@@ -5,6 +5,7 @@
 // Test the basic StreamController and StreamController.singleSubscription.
 library stream_single_test;
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:isolate';
 import '../../../pkg/unittest/lib/unittest.dart';
diff --git a/tests/lib/async/stream_state_helper.dart b/tests/lib/async/stream_state_helper.dart
index 8f9b33f..b982d9d 100644
--- a/tests/lib/async/stream_state_helper.dart
+++ b/tests/lib/async/stream_state_helper.dart
@@ -105,7 +105,7 @@
     _withNextExpectation((Event expect) {
       if (!expect.matchSubscriptionChange(_controller)) {
         _fail("Expected: $expect\n"
-              "Found: [Subscribed:${_controller.hasSubscribers}, "
+              "Found: [Has listener:${_controller.hasListener}, "
                       "Paused:${_controller.isPaused}]");
       }
     });
@@ -159,12 +159,12 @@
     }
     _expectations.add(new PauseCallbackEvent(isPaused, action));
   }
-  void expectSubscription(bool hasSubscribers, bool isPaused, [void action()]) {
+  void expectSubscription(bool hasListener, bool isPaused, [void action()]) {
     if (_onComplete == null) {
       _fail("Adding expectation after completing");
     }
     _expectations.add(
-          new SubscriptionCallbackEvent(hasSubscribers, isPaused, action));
+          new SubscriptionCallbackEvent(hasListener, isPaused, action));
   }
 
   void _fail(String message) {
@@ -252,14 +252,14 @@
 }
 
 class SubscriptionCallbackEvent extends Event {
-  final bool hasSubscribers;
+  final bool hasListener;
   final bool isPaused;
-  SubscriptionCallbackEvent(this.hasSubscribers, this.isPaused, void action())
+  SubscriptionCallbackEvent(this.hasListener, this.isPaused, void action())
       : super(action);
   bool _testSubscribe(StreamController c) {
-    return hasSubscribers == c.hasSubscribers && isPaused == c.isPaused;
+    return hasListener == c.hasListener && isPaused == c.isPaused;
   }
-  String toString() => "[Subscribers:$hasSubscribers, Paused:$isPaused]";
+  String toString() => "[Has listener:$hasListener, Paused:$isPaused]";
 }
 
 
@@ -283,7 +283,7 @@
     return true;
   }
   bool _testSubcribe(StreamController c) {
-    _actual = "*[Subscribers:${c.hasSubscribers}, Paused:${c.isPaused}]";
+    _actual = "*[Has listener:${c.hasListener}, Paused:${c.isPaused}]";
     return true;
   }
 
diff --git a/tests/lib/async/stream_transform_test.dart b/tests/lib/async/stream_transform_test.dart
index 6bc4db8..414c02c 100644
--- a/tests/lib/async/stream_transform_test.dart
+++ b/tests/lib/async/stream_transform_test.dart
@@ -4,6 +4,7 @@
 
 library stream_transform_test;
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import '../../../pkg/unittest/lib/unittest.dart';
 import 'event_helper.dart';
diff --git a/tests/lib/async/timer_not_available_test.dart b/tests/lib/async/timer_not_available_test.dart
index d0efd1f..0e55107 100644
--- a/tests/lib/async/timer_not_available_test.dart
+++ b/tests/lib/async/timer_not_available_test.dart
@@ -4,6 +4,7 @@
 
 library timerNotAvailable;
 
+import 'package:expect/expect.dart';
 import 'dart:async';
 
 main() {
diff --git a/tests/lib/crypto/base64_test.dart b/tests/lib/crypto/base64_test.dart
index ff53c9e..663e067 100644
--- a/tests/lib/crypto/base64_test.dart
+++ b/tests/lib/crypto/base64_test.dart
@@ -5,6 +5,7 @@
 // Library tag to allow the test to run on Dartium.
 library base64_test;
 
+import "package:expect/expect.dart";
 import 'dart:crypto';
 import 'dart:math';
 
diff --git a/tests/lib/crypto/hmac_md5_test.dart b/tests/lib/crypto/hmac_md5_test.dart
index 2973147..8f9e768 100644
--- a/tests/lib/crypto/hmac_md5_test.dart
+++ b/tests/lib/crypto/hmac_md5_test.dart
@@ -5,6 +5,7 @@
 // Library tag to allow the test to run on Dartium.
 library hmac_md5_test;
 
+import "package:expect/expect.dart";
 import 'dart:crypto';
 
 // Data from http://tools.ietf.org/html/rfc2202.
diff --git a/tests/lib/crypto/hmac_sha1_test.dart b/tests/lib/crypto/hmac_sha1_test.dart
index 8a87ceb..12e0c00 100644
--- a/tests/lib/crypto/hmac_sha1_test.dart
+++ b/tests/lib/crypto/hmac_sha1_test.dart
@@ -5,6 +5,7 @@
 // Library tag to allow the test to run on Dartium.
 library hmac_sha1_test;
 
+import "package:expect/expect.dart";
 import 'dart:crypto';
 
 part 'hmac_sha1_test_vectors.dart';
diff --git a/tests/lib/crypto/hmac_sha256_test.dart b/tests/lib/crypto/hmac_sha256_test.dart
index bfd85b2..1d52efd 100644
--- a/tests/lib/crypto/hmac_sha256_test.dart
+++ b/tests/lib/crypto/hmac_sha256_test.dart
@@ -5,6 +5,7 @@
 // Library tag to allow the test to run on Dartium.
 library hmac_sha256_test;
 
+import "package:expect/expect.dart";
 import 'dart:crypto';
 
 part 'hmac_sha256_test_vectors.dart';
diff --git a/tests/lib/crypto/sha1_test.dart b/tests/lib/crypto/sha1_test.dart
index d977230..1254dc8 100644
--- a/tests/lib/crypto/sha1_test.dart
+++ b/tests/lib/crypto/sha1_test.dart
@@ -5,6 +5,7 @@
 // Library tag to allow dartium to run the test.
 library sha1_test;
 
+import "package:expect/expect.dart";
 import 'dart:crypto';
 
 part 'sha1_long_test_vectors.dart';
diff --git a/tests/lib/crypto/sha256_test.dart b/tests/lib/crypto/sha256_test.dart
index 767812a..f42a3f2 100644
--- a/tests/lib/crypto/sha256_test.dart
+++ b/tests/lib/crypto/sha256_test.dart
@@ -5,6 +5,7 @@
 // Library tag to allow Dartium to run the tests.
 library sha256_test;
 
+import "package:expect/expect.dart";
 import 'dart:crypto';
 
 part 'sha256_long_test_vectors.dart';
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 00a3fc5..b7f3acb 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -20,7 +20,7 @@
 async/run_async3_test: Fail # _enqueueImmediate runs after Timer. http://dartbug.com/9002
 async/run_async4_test: Pass, Fail # no global exception handler in isolates. http://dartbug.com/9012
 
-[ $compiler == dart2js && $runtime == chrome && ($system == macos || $system == windows)]
+[ $compiler == dart2js && ( $runtime == chrome || $runtime == drt ) && ($system == macos || $system == windows)]
 crypto/hmac_sha1_test: Fail # Issue 9471
 
 [ $compiler == dart2js && $checked ]
diff --git a/tests/lib/math/coin_test.dart b/tests/lib/math/coin_test.dart
index c5dcb16..0da9aed 100644
--- a/tests/lib/math/coin_test.dart
+++ b/tests/lib/math/coin_test.dart
@@ -7,6 +7,7 @@
 // Library tag to allow Dartium to run the test.
 library coin_test;
 
+import "package:expect/expect.dart";
 import 'dart:math';
 
 main() {
diff --git a/tests/lib/math/low_test.dart b/tests/lib/math/low_test.dart
index cb261d0..31f0e8a 100644
--- a/tests/lib/math/low_test.dart
+++ b/tests/lib/math/low_test.dart
@@ -8,6 +8,7 @@
 // Library tag to allow Dartium to run the test.
 library low_test;
 
+import "package:expect/expect.dart";
 import 'dart:math';
 
 void main() {
diff --git a/tests/lib/math/math2_test.dart b/tests/lib/math/math2_test.dart
index fb3c804..2f741d4 100644
--- a/tests/lib/math/math2_test.dart
+++ b/tests/lib/math/math2_test.dart
@@ -6,6 +6,7 @@
 // class. This can easily be simplified once we get rid of the Math
 // class entirely.
 library math_test;
+import "package:expect/expect.dart";
 import 'dart:math' as math;
 
 class MathLibraryTest {
diff --git a/tests/lib/math/math_parse_double_test.dart b/tests/lib/math/math_parse_double_test.dart
index fb6b3fa..af77f6b 100644
--- a/tests/lib/math/math_parse_double_test.dart
+++ b/tests/lib/math/math_parse_double_test.dart
@@ -6,6 +6,7 @@
 // class. This can easily be simplified once we get rid of the Math
 // class entirely.
 library math_parse_double_test;
+import "package:expect/expect.dart";
 
 void parseDoubleThrowsFormatException(str) {
   Expect.throws(() => double.parse(str), (e) => e is FormatException);
diff --git a/tests/lib/math/math_test.dart b/tests/lib/math/math_test.dart
index cfd2af6..2bc7741 100644
--- a/tests/lib/math/math_test.dart
+++ b/tests/lib/math/math_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library math_test;
+import "package:expect/expect.dart";
 import 'dart:math';
 
 class MathTest {
diff --git a/tests/lib/math/min_max_test.dart b/tests/lib/math/min_max_test.dart
index 42c9730..3bf864c 100644
--- a/tests/lib/math/min_max_test.dart
+++ b/tests/lib/math/min_max_test.dart
@@ -4,6 +4,7 @@
 // Dart test for testing Math.min and Math.max.
 
 library min_max_test;
+import "package:expect/expect.dart";
 import 'dart:math';
 
 testMin() {
diff --git a/tests/lib/math/pi_test.dart b/tests/lib/math/pi_test.dart
index c042b4b..deb58fd 100644
--- a/tests/lib/math/pi_test.dart
+++ b/tests/lib/math/pi_test.dart
@@ -8,6 +8,7 @@
 // Library tag to allow Dartium to run the test.
 library pi_test;
 
+import "package:expect/expect.dart";
 import 'dart:math';
 
 void main() {
diff --git a/tests/lib/math/random_test.dart b/tests/lib/math/random_test.dart
index 88b67a9..f06fa2b 100644
--- a/tests/lib/math/random_test.dart
+++ b/tests/lib/math/random_test.dart
@@ -7,6 +7,7 @@
 // Library tag to allow Dartium to run the test.
 library random_test;
 
+import "package:expect/expect.dart";
 import 'dart:math';
 
 main() {
diff --git a/tests/lib/mirrors/mirrors_test.dart b/tests/lib/mirrors/mirrors_test.dart
index 14ab436..33c57ac 100644
--- a/tests/lib/mirrors/mirrors_test.dart
+++ b/tests/lib/mirrors/mirrors_test.dart
@@ -25,22 +25,22 @@
   var classMirror = libMirror.classes["Class"];
   var instMirror = reflect(instance);
 
-  libMirror.setField('topLevelField', 42);
-  var future = libMirror.getField('topLevelField');
+  libMirror.setFieldAsync('topLevelField', 42);
+  var future = libMirror.getFieldAsync('topLevelField');
   future.then(expectAsync1((resultMirror) {
     expect(resultMirror.reflectee, equals(42));
     expect(topLevelField, equals(42));   
   }));
   
-  classMirror.setField('staticField', 43);
-  future = classMirror.getField('staticField');
+  classMirror.setFieldAsync('staticField', 43);
+  future = classMirror.getFieldAsync('staticField');
   future.then(expectAsync1((resultMirror) {
     expect(resultMirror.reflectee, equals(43));
     expect(Class.staticField, equals(43)); 
   }));
 
-  instMirror.setField('field', 44);
-  future = instMirror.getField('field');
+  instMirror.setFieldAsync('field', 44);
+  future = instMirror.getFieldAsync('field');
   future.then(expectAsync1((resultMirror) {
     expect(resultMirror.reflectee, equals(44));
     expect(instance.field, equals(44)); 
@@ -57,7 +57,7 @@
   expect(funcMirror is MethodMirror, equals(true));
   expect(funcMirror.parameters.length, equals(3));
 
-  var future = mirror.apply([2, 4, 8]);
+  var future = mirror.applyAsync([2, 4, 8]);
   future.then(expectAsync1((resultMirror) {
     expect(resultMirror.reflectee, equals(14));
   }));
@@ -67,14 +67,14 @@
   var libMirror = mirrors.libraries["MirrorsTest"];
   var classMirror = libMirror.classes["Class"];
   
-  var future = classMirror.newInstance('', []);
+  var future = classMirror.newInstanceAsync('', []);
   future.then(expectAsync1((resultMirror) {
     var instance = resultMirror.reflectee;
     expect(instance is Class, equals(true));
     expect(instance.field, equals("default value"));
   }));
 
-  future = classMirror.newInstance('withInitialValue', [45]);
+  future = classMirror.newInstanceAsync('withInitialValue', [45]);
   future.then(expectAsync1((resultMirror) {
     var instance = resultMirror.reflectee;
     expect(instance is Class, equals(true));
diff --git a/tests/lib/typeddata/float32x4_list_test.dart b/tests/lib/typeddata/float32x4_list_test.dart
index 3fffde0..055b652 100644
--- a/tests/lib/typeddata/float32x4_list_test.dart
+++ b/tests/lib/typeddata/float32x4_list_test.dart
@@ -1,10 +1,12 @@
 // 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.
+// VMOptions=--deoptimization_counter_threshold=1000
 
 // Library tag to be able to run in html test framework.
 library float32x4_list_test;
 
+import 'package:expect/expect.dart';
 import 'dart:typeddata';
 
 testLoadStore(array) {
@@ -27,6 +29,72 @@
   Expect.equals(4.0, array[1].w);
 }
 
+testLoadStoreDeopt(array, index, value) {
+  array[index] = value;
+  Expect.equals(value.x, array[index].x);
+  Expect.equals(value.y, array[index].y);
+  Expect.equals(value.z, array[index].z);
+  Expect.equals(value.w, array[index].w);
+}
+
+testLoadStoreDeoptDriver() {
+  Float32x4List list = new Float32x4List(4);
+  Float32x4 value = new Float32x4(1.0, 2.0, 3.0, 4.0);
+  for (int i = 0; i < 3000; i++) {
+    testLoadStoreDeopt(list, 0, value);
+  }
+  try {
+    // Invalid index.
+    testLoadStoreDeopt(list, 5, value);
+  } catch (_) {}
+  for (int i = 0; i < 3000; i++) {
+    testLoadStoreDeopt(list, 0, value);
+  }
+  try {
+    // null list.
+    testLoadStoreDeopt(null, 0, value);
+  } catch (_) {}
+  for (int i = 0; i < 3000; i++) {
+    testLoadStoreDeopt(list, 0, value);
+  }
+  try {
+    // null value.
+    testLoadStoreDeopt(list, 0, null);
+  } catch (_) {}
+  for (int i = 0; i < 3000; i++) {
+    testLoadStoreDeopt(list, 0, value);
+  }
+  try {
+    // non-smi index.
+    testLoadStoreDeopt(list, 3.14159, value);
+  } catch (_) {}
+  for (int i = 0; i < 3000; i++) {
+    testLoadStoreDeopt(list, 0, value);
+  }
+  try {
+    // non-Float32x4 value.
+    testLoadStoreDeopt(list, 0, 4.toDouble());
+  } catch (_) {}
+  for (int i = 0; i < 3000; i++) {
+    testLoadStoreDeopt(list, 0, value);
+  }
+  try {
+    // non-Float32x4List list.
+    testLoadStoreDeopt([new Float32x4(2.0, 3.0, 4.0, 5.0)], 0, value);
+  } catch (_) {}
+  for (int i = 0; i < 3000; i++) {
+    testLoadStoreDeopt(list, 0, value);
+  }
+}
+
+testListZero() {
+  Float32x4List list = new Float32x4List(1);
+  Expect.equals(0.0, list[0].x);
+  Expect.equals(0.0, list[0].y);
+  Expect.equals(0.0, list[0].z);
+  Expect.equals(0.0, list[0].w);
+}
+
 testView(array) {
   Expect.equals(8, array.length);
   Expect.isTrue(array is List<Float32x4>);
@@ -63,4 +131,8 @@
   for (int i = 0; i < 3000; i++) {
     testLoadStore(list);
   }
+  for (int i = 0; i < 3000; i++) {
+    testListZero();
+  }
+  testLoadStoreDeoptDriver();
 }
diff --git a/tests/lib/typeddata/float32x4_test.dart b/tests/lib/typeddata/float32x4_test.dart
index deb0ce8..490009a 100644
--- a/tests/lib/typeddata/float32x4_test.dart
+++ b/tests/lib/typeddata/float32x4_test.dart
@@ -5,6 +5,7 @@
 // Library tag to be able to run in html test framework.
 library float32x4_test;
 
+import "package:expect/expect.dart";
 import 'dart:typeddata';
 
 testAdd() {
diff --git a/tests/lib/typeddata/float32x4_unbox_regress_test.dart b/tests/lib/typeddata/float32x4_unbox_regress_test.dart
new file mode 100644
index 0000000..48563e2
--- /dev/null
+++ b/tests/lib/typeddata/float32x4_unbox_regress_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Library tag to be able to run in html test framework.
+library float32x4_unbox_regress_test;
+
+import 'package:expect/expect.dart';
+import 'dart:typeddata';
+
+testListStore(array, index, value) {
+  array[index] = value;
+}
+
+main() {
+  var list;
+  var value = new Float32x4(1.0, 2.0, 3.0, 4.0);
+  var smi = 12;
+  list = new Float32x4List(8);
+  for (int i = 0; i < 3000; i++) {
+    testListStore(list, 0, value);
+  }
+
+  try {
+    // Without a proper check for SMI in the Float32x4 unbox instruction
+    // this might trigger a crash.
+    testListStore(list, 0, smi);
+  } catch (_) { }
+}
diff --git a/tests/utils/utf8_test.dart b/tests/lib/utf/utf8_test.dart
similarity index 97%
rename from tests/utils/utf8_test.dart
rename to tests/lib/utf/utf8_test.dart
index b92d5aaa..3fdd8a8 100644
--- a/tests/utils/utf8_test.dart
+++ b/tests/lib/utf/utf8_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library utf8_test;
+import "package:expect/expect.dart";
 import 'dart:utf';
 
 String decode(List<int> bytes) => decodeUtf8(bytes);
diff --git a/tests/utils/utf_test.dart b/tests/lib/utf/utf_test.dart
similarity index 84%
rename from tests/utils/utf_test.dart
rename to tests/lib/utf/utf_test.dart
index 10401a3..85a8564 100644
--- a/tests/utils/utf_test.dart
+++ b/tests/lib/utf/utf_test.dart
@@ -3,10 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library utf_test;
+import "package:expect/expect.dart";
 import 'dart:utf';
 
 main() {
-  String str = codepointsToString([0x1d537]);
+  String str = new String.fromCharCodes([0x1d537]);
   // String.codeUnits gives 16-bit code units, but stringToCodepoints gives
   // back the original code points.
   Expect.listEquals([0xd835, 0xdd37], str.codeUnits);
diff --git a/tests/standalone/assert_test.dart b/tests/standalone/assert_test.dart
index ae841bd..af63a68 100644
--- a/tests/standalone/assert_test.dart
+++ b/tests/standalone/assert_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // VMOptions=--enable_asserts
-//
 // Dart test program testing assert statements.
+import "package:expect/expect.dart";
 
 class AssertTest {
   static test() {
diff --git a/tests/standalone/byte_array_view_optimized_test.dart b/tests/standalone/byte_array_view_optimized_test.dart
index 9f3b0be..6699d0b 100644
--- a/tests/standalone/byte_array_view_optimized_test.dart
+++ b/tests/standalone/byte_array_view_optimized_test.dart
@@ -7,6 +7,7 @@
 // Library tag to be able to run in html test framework.
 library ByteArrayViewOptimizedTest;
 
+import "package:expect/expect.dart";
 import "dart:typeddata";
 
 li16(v) => v[0];
diff --git a/tests/standalone/constant_left_shift_test.dart b/tests/standalone/constant_left_shift_test.dart
index 3385a24..229bc38 100644
--- a/tests/standalone/constant_left_shift_test.dart
+++ b/tests/standalone/constant_left_shift_test.dart
@@ -4,6 +4,8 @@
 //
 // Dart test program for testing left shifts of a constant.
 
+import "package:expect/expect.dart";
+
 shiftLeft0(c) => 0 << c;
 shiftLeft1(c) => 1 << c;
 shiftLeft8448(c) => 8448 << c;
diff --git a/tests/standalone/crypto/base64_test.dart b/tests/standalone/crypto/base64_test.dart
index 36546d4..55546f0 100644
--- a/tests/standalone/crypto/base64_test.dart
+++ b/tests/standalone/crypto/base64_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:expect/expect.dart";
+
 part "../../../sdk/lib/io/base64.dart";
 
 void main() {
diff --git a/tests/standalone/debugger/debug_lib.dart b/tests/standalone/debugger/debug_lib.dart
index 7d3b8ec..bc1f246 100644
--- a/tests/standalone/debugger/debug_lib.dart
+++ b/tests/standalone/debugger/debug_lib.dart
@@ -11,9 +11,6 @@
 import "dart:utf";
 import "dart:json" as JSON;
 
-// Whether or not to print debug target process on the console.
-var showDebuggeeOutput = true;
-
 // Whether or not to print the debugger wire messages on the console.
 var verboseWire = false;
 
@@ -49,7 +46,22 @@
     return msg;
   }
 
-  // Returns the character length of the newxt json message in the
+  bool haveGarbage() {
+    if (buffer == null || buffer.length == 0) return false;
+    var i = 0, char = " ";
+    while (i < buffer.length) {
+      char = buffer[i];
+      if (char != " " && char != "\n" && char != "\r" && char != "\t") break;
+      i++;
+    }
+    if (i >= buffer.length) {
+      return false;
+    } else { 
+      return char != "{";
+    }
+  }
+
+  // Returns the character length of the next json message in the
   // buffer, or 0 if there is only a partial message in the buffer.
   // The object value must start with '{' and continues to the
   // matching '}'. No attempt is made to otherwise validate the contents
@@ -293,24 +305,23 @@
   int isolateId = 0;
   bool isPaused = false;
 
-  Debugger(this.targetProcess, this.portNumber) {
+  Debugger(this.targetProcess, this.portNumber, this.script) {
     stdin.listen((_) {});
     var stdoutStringStream = targetProcess.stdout
         .transform(new StringDecoder())
         .transform(new LineTransformer());
     stdoutStringStream.listen((line) {
-      if (showDebuggeeOutput) {
-        print("TARG: $line");
+      if (line == "Debugger initialized") {
+        openConnection();
       }
+      print("TARG: $line");
     });
 
     var stderrStringStream = targetProcess.stderr
         .transform(new StringDecoder())
         .transform(new LineTransformer());
     stderrStringStream.listen((line) {
-      if (showDebuggeeOutput) {
-        print("TARG: $line");
-      }
+      print("TARG: $line");
     });
   }
 
@@ -380,6 +391,12 @@
     var msg = responses.getNextMessage();
     while (msg != null) {
       if (verboseWire) print("RECV: $msg");
+      if (responses.haveGarbage()) {
+        error("Error: leftover text after message: '${responses.buffer}'");
+        error("Previous message may be malformed, was: '$msg'");
+        close(killDebugee: true);
+        return;
+      }
       var msgObj = JSON.parse(msg);
       handleMessage(msgObj);
       if (errorsDetected) {
@@ -445,7 +462,7 @@
           });
       },
       onError: (asyncErr) {
-        print("Error while connecting to debugee: $asyncErr");
+        error("Error while connecting to debugee: $asyncErr");
         close(killDebugee: true);
       });
   }
@@ -459,7 +476,7 @@
       targetProcess.kill();
       print("Target process killed");
     }
-    Expect.isTrue(!errorsDetected);
+    if (errorsDetected) throw "Errors detected";
     exit(errors.length);
   }
 }
@@ -470,8 +487,6 @@
   if (options.arguments.contains("--debuggee")) {
     return false;
   }
-  // The default is to show debugging output.
-  showDebuggeeOutput = !options.arguments.contains("--non-verbose");
   verboseWire = options.arguments.contains("--wire");
   
   // Pick a port in the upper half of the port number range.
@@ -482,19 +497,22 @@
   ServerSocket.bind('127.0.0.1', debugPort).then((ServerSocket s) {
       s.close();
       var targetOpts = [ "--debug:$debugPort" ];
-      if (showDebuggeeOutput) targetOpts.add("--verbose_debug");
+      // --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(" ")}');
 
       Process.start(options.executable, targetOpts).then((Process process) {
         print("Debug target process started");
         process.stdin.close();
         process.exitCode.then((int exitCode) {
-          Expect.equals(0, exitCode);
+          if (exitCode != 0) throw "bad exit code: $exitCode";
           print("Debug target process exited with exit code $exitCode");
         });
-        var debugger = new Debugger(process, debugPort);
-        debugger.runScript(script);
+        var debugger =
+            new Debugger(process, debugPort, new DebugScript(script));
       });
     },
     onError: (e) {
diff --git a/tests/standalone/deoptimization_test.dart b/tests/standalone/deoptimization_test.dart
index b357126..8b68c11 100644
--- a/tests/standalone/deoptimization_test.dart
+++ b/tests/standalone/deoptimization_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test deoptimization.
 
+import "package:expect/expect.dart";
+
 class SmiCompares {
   // Test deoptimization when one argument is known to be Smi.
   static bool smiCompareLessThan2(a) {
diff --git a/tests/standalone/double_temp_test.dart b/tests/standalone/double_temp_test.dart
index cfda808..cec3c9e 100644
--- a/tests/standalone/double_temp_test.dart
+++ b/tests/standalone/double_temp_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test correct usage of inlined double temporary objects.
 
+import "package:expect/expect.dart";
+
 main() {
   for (int i = 0; i < 2000; i++) {
     testBinaryOp();
diff --git a/tests/standalone/double_to_int_test.dart b/tests/standalone/double_to_int_test.dart
index 0386644..282c187 100644
--- a/tests/standalone/double_to_int_test.dart
+++ b/tests/standalone/double_to_int_test.dart
@@ -6,6 +6,8 @@
 // unless we encounter a non-Smi result, in which case we deoptimize and
 // optimize it later to DoubleToInt.
 
+import "package:expect/expect.dart";
+
 
 main() {
   for (int i = 0; i < 600; i++) {
diff --git a/tests/standalone/float_array_test.dart b/tests/standalone/float_array_test.dart
index 085593a..d8c9ebb 100644
--- a/tests/standalone/float_array_test.dart
+++ b/tests/standalone/float_array_test.dart
@@ -7,6 +7,7 @@
 // Library tag to be able to run in html test framework.
 library FloatArrayTest;
 
+import "package:expect/expect.dart";
 import 'dart:typeddata';
 
 void testCreateFloat32Array() {
diff --git a/tests/standalone/int_array_load_elimination_test.dart b/tests/standalone/int_array_load_elimination_test.dart
index 55997a9..c3792b0 100644
--- a/tests/standalone/int_array_load_elimination_test.dart
+++ b/tests/standalone/int_array_load_elimination_test.dart
@@ -7,6 +7,7 @@
 // TODO: remove once bug 2264 fixed.
 library int_array_load_elimination;
 
+import "package:expect/expect.dart";
 import 'dart:typeddata';
 
 void testUint16() {
diff --git a/tests/standalone/int_array_test.dart b/tests/standalone/int_array_test.dart
index bebc2ef..3712a42 100644
--- a/tests/standalone/int_array_test.dart
+++ b/tests/standalone/int_array_test.dart
@@ -7,6 +7,7 @@
 // Library tag to be able to run in html test framework.
 library IntArrayTest;
 
+import "package:expect/expect.dart";
 import 'dart:typeddata';
 
 void testInt16() {
diff --git a/tests/standalone/io/dart_std_io_pipe_script.dart b/tests/standalone/io/dart_std_io_pipe_script.dart
index 1299645..76402d6 100644
--- a/tests/standalone/io/dart_std_io_pipe_script.dart
+++ b/tests/standalone/io/dart_std_io_pipe_script.dart
@@ -27,8 +27,8 @@
       stdin.pipe(stderr);
     } else if (options.arguments[0] == "2") {
       stdin.listen((data) {
-        stdout.writeBytes(data);
-        stderr.writeBytes(data);
+        stdout.add(data);
+        stderr.add(data);
       });
     }
   }
diff --git a/tests/standalone/io/dart_std_io_pipe_test.dart b/tests/standalone/io/dart_std_io_pipe_test.dart
index 4310d78..bdbffeb 100644
--- a/tests/standalone/io/dart_std_io_pipe_test.dart
+++ b/tests/standalone/io/dart_std_io_pipe_test.dart
@@ -10,6 +10,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:io";
 import "process_test_util.dart";
 
diff --git a/tests/standalone/io/delete_symlink_test.dart b/tests/standalone/io/delete_symlink_test.dart
index 3161eb4..ad10a48 100644
--- a/tests/standalone/io/delete_symlink_test.dart
+++ b/tests/standalone/io/delete_symlink_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:expect/expect.dart";
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/standalone/io/directory_create_race_test.dart b/tests/standalone/io/directory_create_race_test.dart
index 50b5ff2..e743a76 100644
--- a/tests/standalone/io/directory_create_race_test.dart
+++ b/tests/standalone/io/directory_create_race_test.dart
@@ -7,6 +7,7 @@
 // issue https://code.google.com/p/dart/issues/detail?id=7679 in revisions
 // without the fix for this issue.
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone/io/directory_error_test.dart b/tests/standalone/io/directory_error_test.dart
index 6a8ebe9..33418ef 100644
--- a/tests/standalone/io/directory_error_test.dart
+++ b/tests/standalone/io/directory_error_test.dart
@@ -4,6 +4,7 @@
 //
 // Dart test program for testing error handling in directory I/O.
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
@@ -94,13 +95,8 @@
   Expect.isTrue(e is DirectoryIOException);
   Expect.isTrue(e.osError != null);
   Expect.isTrue(e.toString().indexOf("Deletion failed") != -1);
-  if (Platform.operatingSystem == "linux") {
-    Expect.equals(2, e.osError.errorCode);
-  } else if (Platform.operatingSystem == "macos") {
-    Expect.equals(2, e.osError.errorCode);
-  } else if (Platform.operatingSystem == "windows") {
-    Expect.equals(3, e.osError.errorCode);
-  }
+  // File not not found has error code 2 on all supported platforms.
+  Expect.equals(2, e.osError.errorCode);
 
   return true;
 }
diff --git a/tests/standalone/io/directory_invalid_arguments_test.dart b/tests/standalone/io/directory_invalid_arguments_test.dart
index 54cdfda..29f96c8 100644
--- a/tests/standalone/io/directory_invalid_arguments_test.dart
+++ b/tests/standalone/io/directory_invalid_arguments_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:expect/expect.dart";
 import "dart:io";
 import "dart:isolate";
 
diff --git a/tests/standalone/io/directory_list_nonexistent_test.dart b/tests/standalone/io/directory_list_nonexistent_test.dart
index 3ee62ac..1e58f63 100644
--- a/tests/standalone/io/directory_list_nonexistent_test.dart
+++ b/tests/standalone/io/directory_list_nonexistent_test.dart
@@ -7,6 +7,7 @@
 // TODO(7157): Merge this test into directory_test.dart testListNonExistent()
 // when it no longer crashes on Windows, when issue 7157 is resolved.
 
+import "package:expect/expect.dart";
 import "dart:io";
 import "dart:isolate";
 
diff --git a/tests/standalone/io/directory_non_ascii_sync_test.dart b/tests/standalone/io/directory_non_ascii_sync_test.dart
index 3932731..f73225f 100644
--- a/tests/standalone/io/directory_non_ascii_sync_test.dart
+++ b/tests/standalone/io/directory_non_ascii_sync_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:expect/expect.dart";
 import 'dart:io';
 
 main() {
diff --git a/tests/standalone/io/directory_non_ascii_test.dart b/tests/standalone/io/directory_non_ascii_test.dart
index 2745086..9fe3ef0 100644
--- a/tests/standalone/io/directory_non_ascii_test.dart
+++ b/tests/standalone/io/directory_non_ascii_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:expect/expect.dart";
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/standalone/io/directory_test.dart b/tests/standalone/io/directory_test.dart
index db5903d..decf05d 100644
--- a/tests/standalone/io/directory_test.dart
+++ b/tests/standalone/io/directory_test.dart
@@ -4,6 +4,7 @@
 //
 // Directory listing test.
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone/io/echo_server_stream_test.dart b/tests/standalone/io/echo_server_stream_test.dart
index 6cd0f37..dfd264d 100644
--- a/tests/standalone/io/echo_server_stream_test.dart
+++ b/tests/standalone/io/echo_server_stream_test.dart
@@ -11,6 +11,7 @@
 
 library ServerTest;
 
+import "package:expect/expect.dart";
 import "dart:io";
 import "dart:isolate";
 part "testing_server.dart";
@@ -63,7 +64,7 @@
       _socket.listen(onData,
                      onError: errorHandler,
                      onDone: onClosed);
-      _socket.writeBytes(_buffer);
+      _socket.add(_buffer);
       _socket.close();
       data = new List<int>(MSGSIZE);
     }
@@ -120,7 +121,7 @@
           Expect.equals(EchoServerGame.FIRSTCHAR + i, buffer[i]);
         }
         if (offset == MSGSIZE) {
-          connection.writeBytes(buffer);
+          connection.add(buffer);
           connection.close();
         }
       }
diff --git a/tests/standalone/io/file_constructor_test.dart b/tests/standalone/io/file_constructor_test.dart
index f347b70..4ed7bb7 100644
--- a/tests/standalone/io/file_constructor_test.dart
+++ b/tests/standalone/io/file_constructor_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:expect/expect.dart";
 import 'dart:io';
 
 void main() {
diff --git a/tests/standalone/io/file_error_test.dart b/tests/standalone/io/file_error_test.dart
index f026d16..e1741fd 100644
--- a/tests/standalone/io/file_error_test.dart
+++ b/tests/standalone/io/file_error_test.dart
@@ -4,6 +4,7 @@
 //
 // Dart test program for testing error handling in file I/O.
 
+import "package:expect/expect.dart";
 import "dart:io";
 import "dart:isolate";
 
diff --git a/tests/standalone/io/file_input_stream_test.dart b/tests/standalone/io/file_input_stream_test.dart
index b25bfc1..93c9deb 100644
--- a/tests/standalone/io/file_input_stream_test.dart
+++ b/tests/standalone/io/file_input_stream_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Testing file input stream, VM-only, standalone test.
 
+import "package:expect/expect.dart";
 import "dart:io";
 import "dart:isolate";
 
diff --git a/tests/standalone/io/file_invalid_arguments_test.dart b/tests/standalone/io/file_invalid_arguments_test.dart
index 515271c..1406290 100644
--- a/tests/standalone/io/file_invalid_arguments_test.dart
+++ b/tests/standalone/io/file_invalid_arguments_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:expect/expect.dart";
 import "dart:io";
 import "dart:isolate";
 
diff --git a/tests/standalone/io/file_non_ascii_sync_test.dart b/tests/standalone/io/file_non_ascii_sync_test.dart
index 19bf7aa..23290e3 100644
--- a/tests/standalone/io/file_non_ascii_sync_test.dart
+++ b/tests/standalone/io/file_non_ascii_sync_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:expect/expect.dart";
 import 'dart:io';
 
 main() {
diff --git a/tests/standalone/io/file_non_ascii_test.dart b/tests/standalone/io/file_non_ascii_test.dart
index 98b8336..3bdc939 100644
--- a/tests/standalone/io/file_non_ascii_test.dart
+++ b/tests/standalone/io/file_non_ascii_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:expect/expect.dart";
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/standalone/io/file_output_stream_test.dart b/tests/standalone/io/file_output_stream_test.dart
index b1d81fc..f71c962 100644
--- a/tests/standalone/io/file_output_stream_test.dart
+++ b/tests/standalone/io/file_output_stream_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Testing file input stream, VM-only, standalone test.
 
+import "package:expect/expect.dart";
 import "dart:io";
 import "dart:isolate";
 
@@ -21,7 +22,7 @@
   file.createSync();
   IOSink x = file.openWrite();
   var data = [65, 66, 67];
-  x.writeBytes(data);
+  x.add(data);
   x.close();
   x.done.then((_) {
     Expect.listEquals(file.readAsBytesSync(), data);
diff --git a/tests/standalone/io/file_read_special_device_test.dart b/tests/standalone/io/file_read_special_device_test.dart
index 3855395..1ea10e9 100644
--- a/tests/standalone/io/file_read_special_device_test.dart
+++ b/tests/standalone/io/file_read_special_device_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:expect/expect.dart';
 import 'dart:io';
 
 void openAndWriteScript(String script) {
diff --git a/tests/standalone/io/file_read_stdio_script.dart b/tests/standalone/io/file_read_stdio_script.dart
index 0c58343..b2043ff 100644
--- a/tests/standalone/io/file_read_stdio_script.dart
+++ b/tests/standalone/io/file_read_stdio_script.dart
@@ -7,5 +7,7 @@
 void main() {
   var expected = new File(new Options().script).readAsStringSync();
   var stdin = new File('/dev/fd/0').readAsStringSync();
-  Expect.equals(expected, stdin);
+  if (expected != stdin) {
+    throw "stdin not equal expected file";
+  }
 }
diff --git a/tests/standalone/io/file_system_delete_test.dart b/tests/standalone/io/file_system_delete_test.dart
new file mode 100644
index 0000000..84847bf
--- /dev/null
+++ b/tests/standalone/io/file_system_delete_test.dart
@@ -0,0 +1,407 @@
+// 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";
+import "dart:async";
+import "dart:io";
+
+Future throws(callback()) {
+  return new Future.immediate(null)
+    .then((_) => callback())
+    .then((_) { throw "Expected error"; },
+          onError: (_) {});
+}
+
+void testDeleteFileSync() {
+  var tmp = new Directory("").createTempSync();
+  var path = "${tmp.path}${Platform.pathSeparator}";
+
+  var file = new File("${path}myFile");
+
+  file.createSync();
+
+  Expect.isTrue(file.existsSync());
+  new File(file.path).deleteSync();
+  Expect.isFalse(file.existsSync());
+
+  file.createSync();
+
+  Expect.isTrue(file.existsSync());
+  new Directory(file.path).deleteSync(recursive: true);
+  Expect.isFalse(file.existsSync());
+
+  file.createSync();
+
+  Expect.isTrue(file.existsSync());
+  Expect.throws(() => new Directory(file.path).deleteSync());
+  Expect.isTrue(file.existsSync());
+
+  Expect.isTrue(file.existsSync());
+  Expect.throws(() => new Link(file.path).deleteSync());
+  Expect.isTrue(file.existsSync());
+
+  file.deleteSync();
+  Expect.isFalse(file.existsSync());
+
+  tmp.deleteSync();
+}
+
+void testDeleteFile() {
+  new Directory("").createTemp().then((tmp) {
+    var path = "${tmp.path}${Platform.pathSeparator}";
+    var file = new File("${path}myFile");
+    return file.create()
+      .then((_) => file.exists().then(Expect.isTrue))
+      .then((_) => new File(file.path).delete())
+      .then((_) => file.exists().then(Expect.isFalse))
+
+      .then((_) => file.create())
+
+      .then((_) => file.exists().then(Expect.isTrue))
+      .then((_) => new Directory(file.path).delete(recursive: true))
+      .then((_) => file.exists().then(Expect.isFalse))
+
+      .then((_) => file.create())
+
+      .then((_) => file.exists().then(Expect.isTrue))
+      .then((_) => throws(() => new Directory(file.path).delete()))
+      .then((_) => file.exists().then(Expect.isTrue))
+
+      .then((_) => file.exists().then(Expect.isTrue))
+      .then((_) => throws(() => new Link(file.path).delete()))
+      .then((_) => file.exists().then(Expect.isTrue))
+
+      .then((_) => file.delete())
+      .then((_) => tmp.delete());
+  });
+}
+
+void testDeleteDirectorySync() {
+  var tmp = new Directory("").createTempSync();
+  var path = "${tmp.path}${Platform.pathSeparator}";
+
+  var dir = new Directory("${path}myDirectory");
+
+  dir.createSync();
+
+  Expect.isTrue(dir.existsSync());
+  new Directory(dir.path).deleteSync();
+  Expect.isFalse(dir.existsSync());
+
+  dir.createSync();
+
+  Expect.isTrue(dir.existsSync());
+  new Directory(dir.path).deleteSync(recursive: true);
+  Expect.isFalse(dir.existsSync());
+
+  dir.createSync();
+
+  Expect.isTrue(dir.existsSync());
+  Expect.throws(() => new File(dir.path).deleteSync());
+  Expect.isTrue(dir.existsSync());
+
+  Expect.isTrue(dir.existsSync());
+  Expect.throws(() => new Link(dir.path).deleteSync());
+  Expect.isTrue(dir.existsSync());
+
+  dir.deleteSync();
+  Expect.isFalse(dir.existsSync());
+
+  tmp.deleteSync();
+}
+
+void testDeleteDirectory() {
+  new Directory("").createTemp().then((tmp) {
+    var path = "${tmp.path}${Platform.pathSeparator}";
+    var dir = new Directory("${path}myDirectory");
+    return dir.create()
+      .then((_) => dir.exists().then(Expect.isTrue))
+      .then((_) => new Directory(dir.path).delete())
+      .then((_) => dir.exists().then(Expect.isFalse))
+
+      .then((_) => dir.create())
+
+      .then((_) => dir.exists().then(Expect.isTrue))
+      .then((_) => new Directory(dir.path).delete(recursive: true))
+      .then((_) => dir.exists().then(Expect.isFalse))
+
+      .then((_) => dir.create())
+
+      .then((_) => dir.exists().then(Expect.isTrue))
+      .then((_) => throws(() => new File(dir.path).delete()))
+      .then((_) => dir.exists().then(Expect.isTrue))
+
+      .then((_) => dir.exists().then(Expect.isTrue))
+      .then((_) => throws(() => new Link(dir.path).delete()))
+      .then((_) => dir.exists().then(Expect.isTrue))
+
+      .then((_) => dir.delete())
+      .then((_) => tmp.delete());
+  });
+}
+
+void testDeleteFileLinkSync() {
+  var tmp = new Directory("").createTempSync();
+  var path = "${tmp.path}${Platform.pathSeparator}";
+
+  var file = new File("${path}myFile");
+  file.createSync();
+
+  var link = new Link("${path}myLink");
+
+  link.createSync(file.path);
+
+  Expect.isTrue(link.existsSync());
+  new File(link.path).deleteSync();
+  Expect.isFalse(link.existsSync());
+
+  link.createSync(file.path);
+
+  Expect.isTrue(link.existsSync());
+  new Link(link.path).deleteSync();
+  Expect.isFalse(link.existsSync());
+
+  link.createSync(file.path);
+
+  Expect.isTrue(link.existsSync());
+  new Directory(link.path).deleteSync(recursive: true);
+  Expect.isFalse(link.existsSync());
+
+  link.createSync(file.path);
+
+  Expect.isTrue(link.existsSync());
+  Expect.throws(() => new Directory(link.path).deleteSync());
+  Expect.isTrue(link.existsSync());
+
+  link.deleteSync();
+  Expect.isFalse(link.existsSync());
+
+  Expect.isTrue(file.existsSync());
+  file.deleteSync();
+  Expect.isFalse(file.existsSync());
+
+  tmp.deleteSync();
+}
+
+void testDeleteFileLink() {
+  new Directory("").createTemp().then((tmp) {
+    var path = "${tmp.path}${Platform.pathSeparator}";
+    var file = new File("${path}myFile");
+    var link = new Link("${path}myLink");
+    return file.create()
+      .then((_) => link.create(file.path))
+
+      .then((_) => link.exists().then(Expect.isTrue))
+      .then((_) => new File(link.path).delete())
+      .then((_) => link.exists().then(Expect.isFalse))
+
+      .then((_) => link.create(file.path))
+
+      .then((_) => link.exists().then(Expect.isTrue))
+      .then((_) => new Link(link.path).delete())
+      .then((_) => link.exists().then(Expect.isFalse))
+
+      .then((_) => link.create(file.path))
+
+      .then((_) => link.exists().then(Expect.isTrue))
+      .then((_) => new Directory(link.path).delete(recursive: true))
+      .then((_) => link.exists().then(Expect.isFalse))
+
+      .then((_) => link.create(file.path))
+
+      .then((_) => link.exists().then(Expect.isTrue))
+      .then((_) => throws(() => new Directory(link.path).delete()))
+      .then((_) => link.exists().then(Expect.isTrue))
+
+      .then((_) => link.deleteSync())
+      .then((_) => link.exists().then(Expect.isFalse))
+
+      .then((_) => file.exists().then(Expect.isTrue))
+      .then((_) => file.delete())
+      .then((_) => file.exists().then(Expect.isFalse))
+
+      .then((_) => tmp.delete());
+  });
+}
+
+void testDeleteDirectoryLinkSync() {
+  var tmp = new Directory("").createTempSync();
+  var path = "${tmp.path}${Platform.pathSeparator}";
+
+  var directory = new Directory("${path}myDirectory");
+  directory.createSync();
+
+  var link = new Link("${path}myLink");
+
+  link.createSync(directory.path);
+
+  Expect.isTrue(link.existsSync());
+  new Link(link.path).deleteSync();
+  Expect.isFalse(link.existsSync());
+
+  link.createSync(directory.path);
+
+  Expect.isTrue(link.existsSync());
+  new Directory(link.path).deleteSync();
+  Expect.isFalse(link.existsSync());
+
+  link.createSync(directory.path);
+
+  Expect.isTrue(link.existsSync());
+  new Directory(link.path).deleteSync(recursive: true);
+  Expect.isFalse(link.existsSync());
+
+  link.createSync(directory.path);
+
+  Expect.isTrue(link.existsSync());
+  Expect.throws(() => new File(link.path).deleteSync());
+  Expect.isTrue(link.existsSync());
+
+  link.deleteSync();
+  Expect.isFalse(link.existsSync());
+
+  Expect.isTrue(directory.existsSync());
+  directory.deleteSync();
+  Expect.isFalse(directory.existsSync());
+
+  tmp.deleteSync();
+}
+
+void testDeleteDirectoryLink() {
+  new Directory("").createTemp().then((tmp) {
+    var path = "${tmp.path}${Platform.pathSeparator}";
+    var dir = new Directory("${path}myDir");
+    var link = new Link("${path}myLink");
+    return dir.create()
+      .then((_) => link.create(dir.path))
+
+      .then((_) => link.exists().then(Expect.isTrue))
+      .then((_) => new Directory(link.path).delete())
+      .then((_) => link.exists().then(Expect.isFalse))
+
+      .then((_) => link.create(dir.path))
+
+      .then((_) => link.exists().then(Expect.isTrue))
+      .then((_) => new Directory(link.path).delete(recursive: true))
+      .then((_) => link.exists().then(Expect.isFalse))
+
+      .then((_) => link.create(dir.path))
+
+      .then((_) => link.exists().then(Expect.isTrue))
+      .then((_) => new Link(link.path).delete())
+      .then((_) => link.exists().then(Expect.isFalse))
+
+      .then((_) => link.create(dir.path))
+
+      .then((_) => link.exists().then(Expect.isTrue))
+      .then((_) => throws(() => new File(link.path).delete()))
+      .then((_) => link.exists().then(Expect.isTrue))
+
+      .then((_) => link.deleteSync())
+      .then((_) => link.exists().then(Expect.isFalse))
+
+      .then((_) => dir.exists().then(Expect.isTrue))
+      .then((_) => dir.delete())
+      .then((_) => dir.exists().then(Expect.isFalse))
+
+      .then((_) => tmp.delete());
+  });
+}
+
+void testDeleteBrokenLinkSync() {
+  var tmp = new Directory("").createTempSync();
+  var path = "${tmp.path}${Platform.pathSeparator}";
+
+  var directory = new Directory("${path}myDirectory");
+  directory.createSync();
+
+  var link = new Link("${path}myLink");
+
+  link.createSync(directory.path);
+  directory.deleteSync();
+
+  Expect.isTrue(link.existsSync());
+  new Link(link.path).deleteSync();
+  Expect.isFalse(link.existsSync());
+
+  directory.createSync();
+  link.createSync(directory.path);
+  directory.deleteSync();
+
+  Expect.isTrue(link.existsSync());
+  new Directory(link.path).deleteSync(recursive: true);
+  Expect.isFalse(link.existsSync());
+
+  directory.createSync();
+  link.createSync(directory.path);
+  directory.deleteSync();
+
+  Expect.isTrue(link.existsSync());
+  Expect.throws(() => new Directory(link.path).deleteSync());
+  Expect.isTrue(link.existsSync());
+
+  Expect.isTrue(link.existsSync());
+  Expect.throws(() => new File(link.path).deleteSync());
+  Expect.isTrue(link.existsSync());
+
+  link.deleteSync();
+  Expect.isFalse(link.existsSync());
+
+  tmp.deleteSync();
+}
+
+void testDeleteBrokenLink() {
+  new Directory("").createTemp().then((tmp) {
+    var path = "${tmp.path}${Platform.pathSeparator}";
+    var dir = new Directory("${path}myDir");
+    var link = new Link("${path}myLink");
+    return dir.create()
+      .then((_) => link.create(dir.path))
+      .then((_) => dir.delete())
+
+      .then((_) => link.exists().then(Expect.isTrue))
+      .then((_) => new Link(link.path).delete())
+      .then((_) => link.exists().then(Expect.isFalse))
+
+      .then((_) => dir.create())
+      .then((_) => link.create(dir.path))
+      .then((_) => dir.delete())
+
+      .then((_) => link.exists().then(Expect.isTrue))
+      .then((_) => new Directory(link.path).delete(recursive: true))
+      .then((_) => link.exists().then(Expect.isFalse))
+
+      .then((_) => dir.create())
+      .then((_) => link.create(dir.path))
+      .then((_) => dir.delete())
+
+      .then((_) => link.exists().then(Expect.isTrue))
+      .then((_) => throws(() => new Directory(link.path).delete()))
+      .then((_) => link.exists().then(Expect.isTrue))
+
+      .then((_) => link.exists().then(Expect.isTrue))
+      .then((_) => throws(() => new File(link.path).delete()))
+      .then((_) => link.exists().then(Expect.isTrue))
+
+      .then((_) => link.deleteSync())
+      .then((_) => link.exists().then(Expect.isFalse))
+
+      .then((_) => tmp.delete());
+  });
+}
+
+void main() {
+  testDeleteFileSync();
+  testDeleteFile();
+  testDeleteDirectorySync();
+  testDeleteDirectory();
+  if (Platform.operatingSystem != 'windows') {
+    testDeleteFileLinkSync();
+    testDeleteFileLink();
+  }
+  testDeleteDirectoryLinkSync();
+  testDeleteDirectoryLink();
+  testDeleteBrokenLinkSync();
+  testDeleteBrokenLink();
+}
diff --git a/tests/standalone/io/file_system_exists_test.dart b/tests/standalone/io/file_system_exists_test.dart
new file mode 100644
index 0000000..a87bdd1
--- /dev/null
+++ b/tests/standalone/io/file_system_exists_test.dart
@@ -0,0 +1,205 @@
+// 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";
+import "dart:io";
+
+void testFileExistsSync() {
+  var tmp = new Directory("").createTempSync();
+  var path = "${tmp.path}${Platform.pathSeparator}";
+
+  var file = new File("${path}myFile");
+  file.createSync();
+
+  Expect.isTrue(new File(file.path).existsSync());
+  Expect.isFalse(new Directory(file.path).existsSync());
+  Expect.isFalse(new Link(file.path).existsSync());
+
+  file.deleteSync();
+  Expect.isFalse(file.existsSync());
+
+  tmp.deleteSync();
+}
+
+void testFileExists() {
+  new Directory("").createTemp().then((tmp) {
+    var path = "${tmp.path}${Platform.pathSeparator}";
+    var file = new File("${path}myFile");
+    return file.create()
+      .then((_) => new File(file.path).exists().then(Expect.isTrue))
+      .then((_) => new Directory(file.path).exists().then(Expect.isFalse))
+      .then((_) => new Link(file.path).exists().then(Expect.isFalse))
+
+      .then((_) => file.delete())
+      .then((_) => tmp.delete());
+  });
+}
+
+void testDirectoryExistsSync() {
+  var tmp = new Directory("").createTempSync();
+  var path = "${tmp.path}${Platform.pathSeparator}";
+
+  var dir = new Directory("${path}myDirectory");
+  dir.createSync();
+
+  Expect.isFalse(new File(dir.path).existsSync());
+  Expect.isTrue(new Directory(dir.path).existsSync());
+  Expect.isFalse(new Link(dir.path).existsSync());
+
+  dir.deleteSync();
+  Expect.isFalse(dir.existsSync());
+
+  tmp.deleteSync();
+}
+
+void testDirectoryExists() {
+  new Directory("").createTemp().then((tmp) {
+    var path = "${tmp.path}${Platform.pathSeparator}";
+    var dir = new Directory("${path}myDirectory");
+    return dir.create()
+      .then((_) => new File(dir.path).exists().then(Expect.isFalse))
+      .then((_) => new Directory(dir.path).exists().then(Expect.isTrue))
+      .then((_) => new Link(dir.path).exists().then(Expect.isFalse))
+
+      .then((_) => dir.delete())
+      .then((_) => tmp.delete());
+  });
+}
+
+void testFileLinkExistsSync() {
+  var tmp = new Directory("").createTempSync();
+  var path = "${tmp.path}${Platform.pathSeparator}";
+
+  var file = new File("${path}myFile");
+  file.createSync();
+
+  var link = new Link("${path}myLink");
+  link.createSync(file.path);
+
+  Expect.isTrue(new File(link.path).existsSync());
+  Expect.isFalse(new Directory(link.path).existsSync());
+  Expect.isTrue(new Link(link.path).existsSync());
+
+  link.deleteSync();
+  Expect.isFalse(link.existsSync());
+
+  file.deleteSync();
+  Expect.isFalse(file.existsSync());
+
+  tmp.deleteSync();
+}
+
+void testFileLinkExists() {
+  new Directory("").createTemp().then((tmp) {
+    var path = "${tmp.path}${Platform.pathSeparator}";
+    var file = new File("${path}myFile");
+    var link = new Link("${path}myLink");
+    return file.create()
+      .then((_) => link.create(file.path))
+
+      .then((_) => new File(link.path).exists().then(Expect.isTrue))
+      .then((_) => new Directory(link.path).exists().then(Expect.isFalse))
+      .then((_) => new Link(link.path).exists().then(Expect.isTrue))
+
+      .then((_) => link.delete())
+      .then((_) => file.delete())
+      .then((_) => tmp.delete());
+  });
+}
+
+void testDirectoryLinkExistsSync() {
+  var tmp = new Directory("").createTempSync();
+  var path = "${tmp.path}${Platform.pathSeparator}";
+
+  var directory = new Directory("${path}myDirectory");
+  directory.createSync();
+
+  var link = new Link("${path}myLink");
+  link.createSync(directory.path);
+
+  Expect.isFalse(new File(link.path).existsSync());
+  Expect.isTrue(new Directory(link.path).existsSync());
+  Expect.isTrue(new Link(link.path).existsSync());
+
+  link.deleteSync();
+  Expect.isFalse(link.existsSync());
+
+  directory.deleteSync();
+  Expect.isFalse(directory.existsSync());
+
+  tmp.deleteSync();
+}
+
+void testDirectoryLinkExists() {
+  new Directory("").createTemp().then((tmp) {
+    var path = "${tmp.path}${Platform.pathSeparator}";
+    var dir = new Directory("${path}myDir");
+    var link = new Link("${path}myLink");
+    return dir.create()
+      .then((_) => link.create(dir.path))
+
+      .then((_) => new File(link.path).exists().then(Expect.isFalse))
+      .then((_) => new Directory(link.path).exists().then(Expect.isTrue))
+      .then((_) => new Link(link.path).exists().then(Expect.isTrue))
+
+      .then((_) => link.delete())
+      .then((_) => dir.delete())
+      .then((_) => tmp.delete());
+  });
+}
+
+void testBrokenLinkExistsSync() {
+  var tmp = new Directory("").createTempSync();
+  var path = "${tmp.path}${Platform.pathSeparator}";
+
+  var directory = new Directory("${path}myDirectory");
+  directory.createSync();
+
+  var link = new Link("${path}myLink");
+  link.createSync(directory.path);
+  directory.deleteSync();
+
+  Expect.isFalse(new File(link.path).existsSync());
+  Expect.isFalse(new Directory(link.path).existsSync());
+  Expect.isTrue(new Link(link.path).existsSync());
+
+  link.deleteSync();
+  Expect.isFalse(link.existsSync());
+
+  tmp.deleteSync();
+}
+
+void testBrokenLinkExists() {
+  new Directory("").createTemp().then((tmp) {
+    var path = "${tmp.path}${Platform.pathSeparator}";
+    var dir = new Directory("${path}myDir");
+    var link = new Link("${path}myLink");
+    return dir.create()
+      .then((_) => link.create(dir.path))
+      .then((_) => dir.delete())
+
+      .then((_) => new File(link.path).exists().then(Expect.isFalse))
+      .then((_) => new Directory(link.path).exists().then(Expect.isFalse))
+      .then((_) => new Link(link.path).exists().then(Expect.isTrue))
+
+      .then((_) => link.delete())
+      .then((_) => tmp.delete());
+  });
+}
+
+void main() {
+  testFileExistsSync();
+  testFileExists();
+  testDirectoryExistsSync();
+  testDirectoryExists();
+  if (Platform.operatingSystem != 'windows') {
+    testFileLinkExistsSync();
+    testFileLinkExists();
+  }
+  testDirectoryLinkExistsSync();
+  testDirectoryLinkExists();
+  testBrokenLinkExistsSync();
+  testBrokenLinkExists();
+}
+
diff --git a/tests/standalone/io/file_system_links_test.dart b/tests/standalone/io/file_system_links_test.dart
index 7c3cdc7..2230c07 100644
--- a/tests/standalone/io/file_system_links_test.dart
+++ b/tests/standalone/io/file_system_links_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:expect/expect.dart";
 import "dart:io";
 import "dart:isolate";
 
@@ -57,7 +58,7 @@
                   FileSystemEntity.typeSync(x, followLinks: false));
     Expect.equals(x, new Link(y).targetSync());
 
-    new File(y).deleteSync();
+    new Link(y).deleteSync();
     Expect.isFalse(FileSystemEntity.isLinkSync(y));
     Expect.isFalse(FileSystemEntity.isLinkSync(x));
     Expect.equals(FileSystemEntityType.NOT_FOUND, FileSystemEntity.typeSync(y));
@@ -100,7 +101,7 @@
   createLink(x, y, () {
     var data = "asdf".codeUnits;
     var output = new File(y).openWrite(mode: FileMode.WRITE);
-    output.writeBytes(data);
+    output.add(data);
     output.close();
     output.done.then((_) {
       var read = new File(y).readAsBytesSync();
diff --git a/tests/standalone/io/file_test.dart b/tests/standalone/io/file_test.dart
index 1583d7f..a4dc4ec 100644
--- a/tests/standalone/io/file_test.dart
+++ b/tests/standalone/io/file_test.dart
@@ -4,6 +4,7 @@
 //
 // Dart test program for testing file I/O.
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:io';
 import 'dart:isolate';
@@ -91,7 +92,7 @@
             tempDirectory.path + "/out_read_write_stream";
         var file2 = new File(outFilename);
         var output = file2.openWrite();
-        output.writeBytes(buffer);
+        output.add(buffer);
         output.close();
         output.done.then((_) {
           // Now read the contents of the file just written.
@@ -129,8 +130,8 @@
         tempDirectory.path + "/out_read_write_stream_large_file";
     File file = new File(filename);
     IOSink output = file.openWrite();
-    output.writeBytes(buffer);
-    output.writeBytes(buffer);
+    output.add(buffer);
+    output.add(buffer);
     output.close();
     output.done.then((_) {
       Stream input = file.openRead();
@@ -200,7 +201,7 @@
     // Read a file and check part of it's contents.
     String filename = getFilename("bin/file_test.cc");
     File file = new File(filename);
-    file.open(mode: FileMode.READ).then((RandomAccessFile file) {
+    file.open(mode: READ).then((RandomAccessFile file) {
       List<int> buffer = new List<int>(10);
       file.readList(buffer, 0, 5).then((bytes_read) {
         Expect.equals(5, bytes_read);
@@ -262,7 +263,7 @@
     // Read a file.
     String inFilename = getFilename("tests/vm/data/fixed_length_file");
     final File file = new File(inFilename);
-    file.open(mode: FileMode.READ).then((openedFile) {
+    file.open(mode: READ).then((openedFile) {
       List<int> buffer1 = new List<int>(42);
       openedFile.readList(buffer1, 0, 42).then((bytes_read) {
         Expect.equals(42, bytes_read);
@@ -276,12 +277,12 @@
               if (s[0] != '/' && s[0] != '\\' && s[1] != ':') {
                 Expect.fail("Not a full path");
               }
-              file2.open(mode: FileMode.WRITE).then((openedFile2) {
+              file2.open(mode: WRITE).then((openedFile2) {
                 openedFile2.writeList(buffer1, 0, bytes_read).then((ignore) {
                   openedFile2.close().then((ignore) {
                     List<int> buffer2 = new List<int>(bytes_read);
                     final File file3 = new File(outFilename);
-                    file3.open(mode: FileMode.READ).then((openedFile3) {
+                    file3.open(mode: READ).then((openedFile3) {
                       openedFile3.readList(buffer2, 0, 42).then((bytes_read) {
                         Expect.equals(42, bytes_read);
                         openedFile3.close().then((ignore) {
@@ -320,17 +321,17 @@
     file.createSync();
     Expect.isTrue(new File(filename).existsSync());
     List<int> buffer = content.codeUnits;
-    RandomAccessFile openedFile = file.openSync(mode: FileMode.WRITE);
+    RandomAccessFile openedFile = file.openSync(mode: WRITE);
     openedFile.writeListSync(buffer, 0, buffer.length);
     openedFile.closeSync();
     // Reopen the file in write mode to ensure that we overwrite the content.
-    openedFile = (new File(filename)).openSync(mode: FileMode.WRITE);
+    openedFile = (new File(filename)).openSync(mode: WRITE);
     openedFile.writeListSync(buffer, 0, buffer.length);
     Expect.equals(content.length, openedFile.lengthSync());
     openedFile.closeSync();
     // Open the file in append mode and ensure that we do not overwrite
     // the existing content.
-    openedFile = (new File(filename)).openSync(mode: FileMode.APPEND);
+    openedFile = (new File(filename)).openSync(mode: APPEND);
     openedFile.writeListSync(buffer, 0, buffer.length);
     Expect.equals(content.length * 2, openedFile.lengthSync());
     openedFile.closeSync();
@@ -344,16 +345,16 @@
     file.createSync();
     List<int> buffer = content.codeUnits;
     var output = file.openWrite();
-    output.writeBytes(buffer);
+    output.add(buffer);
     output.close();
     output.done.then((_) {
       File file2 = new File(filename);
-      var appendingOutput = file2.openWrite(mode: FileMode.APPEND);
-      appendingOutput.writeBytes(buffer);
+      var appendingOutput = file2.openWrite(mode: APPEND);
+      appendingOutput.add(buffer);
       appendingOutput.close();
       appendingOutput.done.then((_) {
         File file3 = new File(filename);
-        file3.open(mode: FileMode.READ).then((RandomAccessFile openedFile) {
+        file3.open(mode: READ).then((RandomAccessFile openedFile) {
           openedFile.length().then((int length) {
             Expect.equals(content.length * 2, length);
             openedFile.close().then((ignore) {
@@ -377,13 +378,13 @@
     List<int> buffer = content.codeUnits;
     var output = file.openWrite();
     output.write("abcdABCD");
-    output.encoding = Encoding.UTF_8;
+    output.encoding = UTF_8;
     output.write("abcdABCD");
-    output.encoding = Encoding.ISO_8859_1;
+    output.encoding = ISO_8859_1;
     output.write("abcdABCD");
-    output.encoding = Encoding.ASCII;
+    output.encoding = ASCII;
     output.write("abcdABCD");
-    output.encoding = Encoding.UTF_8;
+    output.encoding = UTF_8;
     output.write("æøå");
     output.close();
     output.done.then((_) {
@@ -416,7 +417,7 @@
       Expect.fail("Not a full path");
     }
     Expect.isTrue(new File(path).existsSync());
-    RandomAccessFile openedFile = outFile.openSync(mode: FileMode.WRITE);
+    RandomAccessFile openedFile = outFile.openSync(mode: WRITE);
     openedFile.writeListSync(buffer1, 0, bytes_read);
     openedFile.closeSync();
     // Now read the contents of the file just written.
@@ -450,7 +451,7 @@
     File file = new File(fileName);
     asyncTestStarted();
     file.create().then((ignore) {
-      file.open(mode: FileMode.READ).then((RandomAccessFile openedFile) {
+      file.open(mode: READ).then((RandomAccessFile openedFile) {
         var readByteFuture = openedFile.readByte();
         readByteFuture.then((int byte) {
           Expect.equals(-1, byte);
@@ -468,7 +469,7 @@
     final String fileName = "${tempDirectory.path}/testWriteVariousLists";
     final File file = new File(fileName);
     file.create().then((ignore) {
-      file.open(mode: FileMode.WRITE).then((RandomAccessFile openedFile) {
+      file.open(mode: WRITE).then((RandomAccessFile openedFile) {
         // Write bytes from 0 to 7.
         openedFile.writeList([0], 0, 1);
         openedFile.writeList(const [1], 0, 1);
@@ -629,7 +630,7 @@
   static void testTruncate() {
     File file = new File(tempDirectory.path + "/out_truncate");
     List buffer = const [65, 65, 65, 65, 65, 65, 65, 65, 65, 65];
-    file.open(mode: FileMode.WRITE).then((RandomAccessFile openedFile) {
+    file.open(mode: WRITE).then((RandomAccessFile openedFile) {
       openedFile.writeList(buffer, 0, 10).then((ignore) {
         openedFile.length().then((length) {
           Expect.equals(10, length);
@@ -655,7 +656,7 @@
   static void testTruncateSync() {
     File file = new File(tempDirectory.path + "/out_truncate_sync");
     List buffer = const [65, 65, 65, 65, 65, 65, 65, 65, 65, 65];
-    RandomAccessFile openedFile = file.openSync(mode: FileMode.WRITE);
+    RandomAccessFile openedFile = file.openSync(mode: WRITE);
     openedFile.writeListSync(buffer, 0, 10);
     Expect.equals(10, openedFile.lengthSync());
     openedFile.truncateSync(5);
@@ -670,7 +671,7 @@
     bool exceptionCaught = false;
     bool wrongExceptionCaught = false;
     File input = new File(tempDirectory.path + "/out_close_exception");
-    RandomAccessFile openedFile = input.openSync(mode: FileMode.WRITE);
+    RandomAccessFile openedFile = input.openSync(mode: WRITE);
     openedFile.closeSync();
     try {
       openedFile.readByteSync();
@@ -765,7 +766,7 @@
     file.createSync();
     var output = file.openWrite();
     output.close();
-    Expect.throws(() => output.writeBytes(buffer));
+    Expect.throws(() => output.add(buffer));
     output.done.then((_) {
       file.deleteSync();
       asyncTestDone("testCloseExceptionStream");
@@ -778,7 +779,7 @@
     bool wrongExceptionCaught = false;
     File file =
         new File(tempDirectory.path + "/out_buffer_out_of_bounds");
-    RandomAccessFile openedFile = file.openSync(mode: FileMode.WRITE);
+    RandomAccessFile openedFile = file.openSync(mode: WRITE);
     try {
       List<int> buffer = new List<int>(10);
       openedFile.readListSync(buffer, 0, 12);
@@ -872,7 +873,7 @@
 
   static void testOpenDirectoryAsFile() {
     var f = new File('.');
-    var future = f.open(mode: FileMode.READ);
+    var future = f.open(mode: READ);
     future.then((r) => Expect.fail('Directory opened as file'))
           .catchError((e) {});
   }
@@ -947,20 +948,20 @@
     });
     var name = getFilename("tests/vm/data/fixed_length_file");
     var f = new File(name);
-    f.readAsString(encoding: Encoding.UTF_8).then((text) {
+    f.readAsString(encoding: UTF_8).then((text) {
       Expect.isTrue(text.endsWith("42 bytes."));
       Expect.equals(42, text.length);
       var name = getDataFilename("tests/standalone/io/read_as_text.dat");
       var f = new File(name);
-      f.readAsString(encoding: Encoding.UTF_8).then((text) {
+      f.readAsString(encoding: UTF_8).then((text) {
         Expect.equals(6, text.length);
         var expected = [955, 120, 46, 32, 120, 10];
         Expect.listEquals(expected, text.codeUnits);
-        f.readAsString(encoding: Encoding.ISO_8859_1).then((text) {
+        f.readAsString(encoding: ISO_8859_1).then((text) {
           Expect.equals(7, text.length);
           var expected = [206, 187, 120, 46, 32, 120, 10];
           Expect.listEquals(expected, text.codeUnits);
-          var readAsStringFuture = f.readAsString(encoding: Encoding.ASCII);
+          var readAsStringFuture = f.readAsString(encoding: ASCII);
           readAsStringFuture.then((text) {
             Expect.fail("Non-ascii char should cause error");
           }).catchError((e) {
@@ -979,7 +980,7 @@
     });
     var name = getFilename("tests/vm/data/empty_file");
     var f = new File(name);
-    f.readAsString(encoding: Encoding.UTF_8).then((text) {
+    f.readAsString(encoding: UTF_8).then((text) {
       port.toSendPort().send(text.length);
       return true;
     });
@@ -995,11 +996,11 @@
     Expect.equals(6, text.length);
     var expected = [955, 120, 46, 32, 120, 10];
     Expect.listEquals(expected, text.codeUnits);
-    text = new File(name).readAsStringSync(encoding: Encoding.ASCII);
+    text = new File(name).readAsStringSync(encoding: ASCII);
     // Default replacement character is '?', char code 63.
     expected = [63, 63, 120, 46, 32, 120, 10];
     Expect.listEquals(expected, text.codeUnits);
-    text = new File(name).readAsStringSync(encoding: Encoding.ISO_8859_1);
+    text = new File(name).readAsStringSync(encoding: ISO_8859_1);
     expected = [206, 187, 120, 46, 32, 120, 10];
     Expect.equals(7, text.length);
     Expect.listEquals(expected, text.codeUnits);
@@ -1019,7 +1020,7 @@
     });
     var name = getFilename("tests/vm/data/fixed_length_file");
     var f = new File(name);
-    f.readAsLines(encoding: Encoding.UTF_8).then((lines) {
+    f.readAsLines(encoding: UTF_8).then((lines) {
       Expect.equals(1, lines.length);
       var line = lines[0];
       Expect.isTrue(line.endsWith("42 bytes."));
@@ -1053,10 +1054,10 @@
     var readAsBytesFuture = f.readAsBytes();
     readAsBytesFuture.then((bytes) => Expect.fail("no bytes expected"))
     .catchError((e) {
-      var readAsStringFuture = f.readAsString(encoding: Encoding.UTF_8);
+      var readAsStringFuture = f.readAsString(encoding: UTF_8);
       readAsStringFuture.then((text) => Expect.fail("no text expected"))
       .catchError((e) {
-        var readAsLinesFuture = f.readAsLines(encoding: Encoding.UTF_8);
+        var readAsLinesFuture = f.readAsLines(encoding: UTF_8);
         readAsLinesFuture.then((lines) => Expect.fail("no lines expected"))
         .catchError((e) {
           port.toSendPort().send(1);
@@ -1069,7 +1070,7 @@
     var port = new ReceivePort();
     new File(new Options().executable).lastModified().then((modified) {
       Expect.isTrue(modified is DateTime);
-      Expect.isTrue(modified < new DateTime.now());
+      Expect.isTrue(modified.isBefore(new DateTime.now()));
       port.close();
     });
   }
@@ -1077,17 +1078,17 @@
   static void testLastModifiedSync() {
     var modified = new File(new Options().executable).lastModifiedSync();
     Expect.isTrue(modified is DateTime);
-    Expect.isTrue(modified < new DateTime.now());
+    Expect.isTrue(modified.isBefore(new DateTime.now()));
   }
 
   // Test that opens the same file for writing then for appending to test
   // that the file is not truncated when opened for appending.
   static void testAppend() {
     var file = new File('${tempDirectory.path}/out_append');
-    file.open(mode: FileMode.WRITE).then((openedFile) {
+    file.open(mode: WRITE).then((openedFile) {
       openedFile.writeString("asdf").then((ignore) {
         openedFile.close().then((ignore) {
-          file.open(mode: FileMode.APPEND).then((openedFile) {
+          file.open(mode: APPEND).then((openedFile) {
             openedFile.length().then((length) {
               Expect.equals(4, length);
               openedFile.writeString("asdf").then((ignore) {
@@ -1113,11 +1114,11 @@
 
   static void testAppendSync() {
     var file = new File('${tempDirectory.path}/out_append_sync');
-    var openedFile = file.openSync(mode: FileMode.WRITE);
+    var openedFile = file.openSync(mode: WRITE);
     openedFile.writeStringSync("asdf");
     Expect.equals(4, openedFile.lengthSync());
     openedFile.closeSync();
-    openedFile = file.openSync(mode: FileMode.WRITE);
+    openedFile = file.openSync(mode: WRITE);
     openedFile.setPositionSync(4);
     openedFile.writeStringSync("asdf");
     Expect.equals(8, openedFile.lengthSync());
@@ -1129,12 +1130,12 @@
   static void testWriteStringUtf8() {
     var file = new File('${tempDirectory.path}/out_write_string');
     var string = new String.fromCharCodes([0x192]);
-    file.open(mode: FileMode.WRITE).then((openedFile) {
+    file.open(mode: WRITE).then((openedFile) {
       openedFile.writeString(string).then((_) {
         openedFile.length().then((l) {
           Expect.equals(2, l);
           openedFile.close().then((_) {
-            file.open(mode: FileMode.APPEND).then((openedFile) {
+            file.open(mode: APPEND).then((openedFile) {
               openedFile.setPosition(2).then((_) {
                 openedFile.writeString(string).then((_) {
                   openedFile.length().then((l) {
@@ -1164,11 +1165,11 @@
   static void testWriteStringUtf8Sync() {
     var file = new File('${tempDirectory.path}/out_write_string_sync');
     var string = new String.fromCharCodes([0x192]);
-    var openedFile = file.openSync(mode: FileMode.WRITE);
+    var openedFile = file.openSync(mode: WRITE);
     openedFile.writeStringSync(string);
     Expect.equals(2, openedFile.lengthSync());
     openedFile.closeSync();
-    openedFile = file.openSync(mode: FileMode.APPEND);
+    openedFile = file.openSync(mode: APPEND);
     openedFile.setPositionSync(2);
     openedFile.writeStringSync(string);
     Expect.equals(4, openedFile.lengthSync());
diff --git a/tests/standalone/io/file_typed_data_test.dart b/tests/standalone/io/file_typed_data_test.dart
new file mode 100644
index 0000000..027c191
--- /dev/null
+++ b/tests/standalone/io/file_typed_data_test.dart
@@ -0,0 +1,42 @@
+// 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.
+//
+// Dart test program for testing file I/O.
+
+import "package:expect/expect.dart";
+import 'dart:async';
+import 'dart:io';
+import 'dart:isolate';
+import 'dart:typeddata';
+
+void testWriteUint8ListAndView() {
+  ReceivePort port = new ReceivePort();
+  Uint8List list = new Uint8List(8);
+  for (int i = 0; i < 8; i++) list[i] = i;
+  var view = new Uint8List.view(list.buffer, 2, 4);
+
+  new Directory('').createTemp().then((temp) {
+    var file = new File("${temp.path}/test");
+    file.open(mode: FileMode.WRITE).then((raf) {
+      return raf.writeList(list, 0, 8);
+    }).then((raf) {
+      return raf.writeList(view, 0, 4);
+    }).then((raf) {
+      return raf.close();
+    }).then((_) {
+      var expected = [];
+      expected.addAll(list);
+      expected.addAll(view);
+      var content = file.readAsBytesSync();
+      Expect.listEquals(expected, content);
+      temp.deleteSync(recursive: true);
+      port.close();
+    });
+  });
+}
+
+
+main() {
+  testWriteUint8ListAndView();
+}
diff --git a/tests/standalone/io/file_write_as_test.dart b/tests/standalone/io/file_write_as_test.dart
index 1932b70..3178bfe 100644
--- a/tests/standalone/io/file_write_as_test.dart
+++ b/tests/standalone/io/file_write_as_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:expect/expect.dart";
 import 'dart:async';
 import 'dart:io';
 import 'dart:isolate';
diff --git a/tests/standalone/io/fuzz_support.dart b/tests/standalone/io/fuzz_support.dart
index e6caa12..e3a874e 100644
--- a/tests/standalone/io/fuzz_support.dart
+++ b/tests/standalone/io/fuzz_support.dart
@@ -4,6 +4,7 @@
 
 library fuzz_support;
 
+import 'package:expect/expect.dart';
 import 'dart:async';
 import 'dart:io';
 
diff --git a/tests/standalone/io/http_10_test.dart b/tests/standalone/io/http_10_test.dart
index bf88a9a..0c79981 100644
--- a/tests/standalone/io/http_10_test.dart
+++ b/tests/standalone/io/http_10_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:isolate";
 import "dart:io";
 
diff --git a/tests/standalone/io/http_advanced_test.dart b/tests/standalone/io/http_advanced_test.dart
index 56b51e8..1d4ca89 100644
--- a/tests/standalone/io/http_advanced_test.dart
+++ b/tests/standalone/io/http_advanced_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:io';
 import 'dart:isolate';
@@ -123,7 +124,7 @@
   // Set the "Expires" header using the expires property.
   void _expires1Handler(HttpRequest request) {
     var response = request.response;
-    DateTime date = new DateTime.utc(1999, DateTime.JUN, 11, 18, 46, 53, 0);
+    DateTime date = new DateTime.utc(1999, DateTime.JUNE, 11, 18, 46, 53, 0);
     response.headers.expires = date;
     Expect.equals(date, response.headers.expires);
     response.close();
@@ -133,7 +134,7 @@
   void _expires2Handler(HttpRequest request) {
     var response = request.response;
     response.headers.set("Expires", "Fri, 11 Jun 1999 18:46:53 GMT");
-    DateTime date = new DateTime.utc(1999, DateTime.JUN, 11, 18, 46, 53, 0);
+    DateTime date = new DateTime.utc(1999, DateTime.JUNE, 11, 18, 46, 53, 0);
     Expect.equals(date, response.headers.expires);
     response.close();
   }
@@ -169,7 +170,7 @@
     Expect.equals(0, request.cookies.length);
 
     Cookie cookie1 = new Cookie("name1", "value1");
-    DateTime date = new DateTime.utc(2014, DateTime.JAN, 5, 23, 59, 59, 0);
+    DateTime date = new DateTime.utc(2014, DateTime.JANUARY, 5, 23, 59, 59, 0);
     cookie1.expires = date;
     cookie1.domain = "www.example.com";
     cookie1.httpOnly = true;
@@ -292,7 +293,7 @@
       Expect.equals(HttpStatus.OK, response.statusCode);
       Expect.equals("Fri, 11 Jun 1999 18:46:53 GMT",
                     response.headers["expires"][0]);
-      Expect.equals(new DateTime.utc(1999, DateTime.JUN, 11, 18, 46, 53, 0),
+      Expect.equals(new DateTime.utc(1999, DateTime.JUNE, 11, 18, 46, 53, 0),
                     response.headers.expires);
       response.listen((_) { },
                       onDone: () {
@@ -379,7 +380,7 @@
             if (cookie.name == "name1") {
               Expect.equals("value1", cookie.value);
               DateTime date =
-                  new DateTime.utc(2014, DateTime.JAN, 5, 23, 59, 59, 0);
+                  new DateTime.utc(2014, DateTime.JANUARY, 5, 23, 59, 59, 0);
               Expect.equals(date, cookie.expires);
               Expect.equals("www.example.com", cookie.domain);
               Expect.isTrue(cookie.httpOnly);
diff --git a/tests/standalone/io/http_auth_test.dart b/tests/standalone/io/http_auth_test.dart
index d1a706a..bd5e2c0 100644
--- a/tests/standalone/io/http_auth_test.dart
+++ b/tests/standalone/io/http_auth_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:expect/expect.dart";
 import 'dart:async';
 import 'dart:crypto';
 import 'dart:io';
diff --git a/tests/standalone/io/http_basic_test.dart b/tests/standalone/io/http_basic_test.dart
index 670a649..9ebb389 100644
--- a/tests/standalone/io/http_basic_test.dart
+++ b/tests/standalone/io/http_basic_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:isolate";
 import "dart:io";
 
diff --git a/tests/standalone/io/http_body_test.dart b/tests/standalone/io/http_body_test.dart
new file mode 100644
index 0000000..c25406e
--- /dev/null
+++ b/tests/standalone/io/http_body_test.dart
@@ -0,0 +1,161 @@
+// 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 'dart:io';
+import 'dart:utf';
+
+import 'package:expect/expect.dart';
+
+void testHttpClientResponseBody() {
+  new HttpBodyHandler();
+  void test(String mimeType,
+            List<int> content,
+            dynamic expectedBody,
+            String type,
+            [bool shouldFail = false]) {
+    HttpServer.bind().then((server) {
+      server.listen((request) {
+        request.listen(
+            (_) {},
+            onDone: () {
+              request.response.headers.contentType =
+                  new ContentType.fromString(mimeType);
+              request.response.add(content);
+              request.response.close();
+            });
+      });
+
+      var client = new HttpClient();
+      client.get("127.0.0.1", server.port, "/")
+          .then((request) => request.close())
+          .then(HttpBodyHandler.processResponse)
+          .then((body) {
+            if (shouldFail) Expect.fail("Error expected");
+            Expect.equals(type, body.type);
+            switch (type) {
+              case "text":
+                Expect.equals(expectedBody, body.body);
+                break;
+
+              case "json":
+                Expect.mapEquals(expectedBody, body.body);
+                break;
+
+              default:
+                Expect.fail("bad body type");
+            }
+          }, onError: (error) {
+            if (!shouldFail) Expect.fail("Error unexpected");
+          })
+          .whenComplete(() {
+            client.close();
+            server.close();
+          });
+    });
+  }
+  test("text/plain", "body".codeUnits, "body", "text");
+  test("text/plain; charset=utf-8",
+       "body".codeUnits,
+       "body",
+       "text");
+  test("text/plain; charset=iso-8859-1",
+       "body".codeUnits,
+       "body",
+       "text");
+  test("text/plain; charset=us-ascii",
+       "body".codeUnits,
+       "body",
+       "text");
+  test("text/plain; charset=utf-8", [42], "*", "text");
+  test("text/plain; charset=us-ascii", [142], "?", "text");
+  test("text/plain; charset=utf-8",
+       [142],
+       new String.fromCharCodes([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]),
+       "text");
+
+  test("application/json",
+       '{"val": 5}'.codeUnits,
+       { "val" : 5 },
+       "json");
+  test("application/json",
+       '{ bad json }'.codeUnits,
+       null,
+       "json",
+       true);
+}
+
+void testHttpServerRequestBody() {
+  void test(String mimeType,
+            List<int> content,
+            dynamic expectedBody,
+            String type,
+            [bool shouldFail = false]) {
+    HttpServer.bind().then((server) {
+      server.transform(new HttpBodyHandler())
+          .listen((body) {
+            if (shouldFail) Expect.fail("Error expected");
+            Expect.equals(type, body.type);
+            switch (type) {
+              case "text":
+                Expect.equals(expectedBody, body.body);
+                break;
+
+              case "json":
+                Expect.mapEquals(expectedBody, body.body);
+                break;
+
+              default:
+                Expect.fail("bad body type");
+            }
+            body.response.close();
+          }, onError: (error) {
+            if (!shouldFail) Expect.fail("Error unexpected");
+          });
+
+      var client = new HttpClient();
+      client.post("127.0.0.1", server.port, "/")
+          .then((request) {
+            request.headers.contentType =
+                new ContentType.fromString(mimeType);
+            request.add(content);
+            return request.close();
+          })
+          .then((response) {
+            if (shouldFail) {
+              Expect.equals(HttpStatus.BAD_REQUEST, response.statusCode);
+            }
+            response.fold(null, (x, y) {});
+            client.close();
+            server.close();
+          });
+    });
+  }
+  test("text/plain", "body".codeUnits, "body", "text");
+  test("text/plain; charset=utf-8",
+       "body".codeUnits,
+       "body",
+       "text");
+  test("text/plain; charset=utf-8", [42], "*", "text");
+  test("text/plain; charset=us-ascii", [142], "?", "text");
+  test("text/plain; charset=utf-8",
+       [142],
+       new String.fromCharCodes([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]),
+       "text");
+
+  test("application/json",
+       '{"val": 5}'.codeUnits,
+       { "val" : 5 },
+       "json");
+  test("application/json",
+       '{ bad json }'.codeUnits,
+       null,
+       "json",
+       true);
+}
+
+
+void main() {
+  testHttpClientResponseBody();
+  testHttpServerRequestBody();
+}
diff --git a/tests/standalone/io/http_client_connect_test.dart b/tests/standalone/io/http_client_connect_test.dart
index 3f466dd..9c18e75 100644
--- a/tests/standalone/io/http_client_connect_test.dart
+++ b/tests/standalone/io/http_client_connect_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:io';
 import 'dart:isolate';
@@ -32,7 +33,7 @@
   HttpServer.bind().then((server) {
     var data = "lalala".codeUnits;
     server.listen((request) {
-      request.response.writeBytes(data);
+      request.response.add(data);
       request.pipe(request.response);
     });
 
diff --git a/tests/standalone/io/http_client_exception_test.dart b/tests/standalone/io/http_client_exception_test.dart
index 65c0a41..0d2f1e3 100644
--- a/tests/standalone/io/http_client_exception_test.dart
+++ b/tests/standalone/io/http_client_exception_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 //
 
+import "package:expect/expect.dart";
 import "dart:io";
 import "dart:isolate";
 import "dart:uri";
diff --git a/tests/standalone/io/http_client_request_test.dart b/tests/standalone/io/http_client_request_test.dart
index b762a78..a9434d3 100644
--- a/tests/standalone/io/http_client_request_test.dart
+++ b/tests/standalone/io/http_client_request_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:expect/expect.dart";
 import "dart:io";
 import "dart:isolate";
 import "dart:typeddata";
@@ -28,17 +29,18 @@
       .catchError((error) {
         server.close();
         client.close();
-      }, test: (e) => e is HttpParserException);
+      });
   });
 }
 
 void testResponseDone() {
   testClientRequest((request) {
-    request.close();
-    request.done.then((req) {
-      Expect.equals(request, req);
+    request.close().then((res1) {
+      request.done.then((res2) {
+        Expect.equals(res1, res2);
+      });
     });
-    return request.response;
+    return request.done;
   });
 }
 
@@ -46,37 +48,37 @@
   testClientRequest((request) {
     var port = new ReceivePort();
     request.contentLength = 0;
-    request.writeBytes([0]);
+    request.add([0]);
     request.close();
     request.done.catchError((error) {
       port.close();
     }, test: (e) => e is HttpException);
-    return request.response;
+    return request.done;
   });
 
   testClientRequest((request) {
     var port = new ReceivePort();
     request.contentLength = 5;
-    request.writeBytes([0, 0, 0]);
-    request.writeBytes([0, 0, 0]);
+    request.add([0, 0, 0]);
+    request.add([0, 0, 0]);
     request.close();
     request.done.catchError((error) {
       port.close();
     }, test: (e) => e is HttpException);
-    return request.response;
+    return request.done;
   });
 
   testClientRequest((request) {
     var port = new ReceivePort();
     request.contentLength = 0;
-    request.writeBytes(new Uint8List(64 * 1024));
-    request.writeBytes(new Uint8List(64 * 1024));
-    request.writeBytes(new Uint8List(64 * 1024));
+    request.add(new Uint8List(64 * 1024));
+    request.add(new Uint8List(64 * 1024));
+    request.add(new Uint8List(64 * 1024));
     request.close();
     request.done.catchError((error) {
       port.close();
     }, test: (e) => e is HttpException);
-    return request.response;
+    return request.done;
   });
 }
 
@@ -88,18 +90,18 @@
     request.done.catchError((error) {
       port.close();
     }, test: (e) => e is HttpException);
-    return request.response;
+    return request.done;
   });
 
   testClientRequest((request) {
     var port = new ReceivePort();
     request.contentLength = 5;
-    request.writeBytes([0]);
+    request.add([0]);
     request.close();
     request.done.catchError((error) {
       port.close();
     }, test: (e) => e is HttpException);
-    return request.response;
+    return request.done;
   });
 }
 
diff --git a/tests/standalone/io/http_close_test.dart b/tests/standalone/io/http_close_test.dart
index 43bde37..cc9fd62 100644
--- a/tests/standalone/io/http_close_test.dart
+++ b/tests/standalone/io/http_close_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:typeddata";
@@ -68,47 +69,6 @@
 }
 
 
-void testClientCloseDelayed(int connections) {
-  HttpServer.bind().then((server) {
-    int closed = 0;
-    void check() {
-      closed++;
-      // Wait for both server and client to see the connections as closed.
-      if (closed == connections * 2) {
-        Expect.equals(0, server.connectionsInfo().active);
-        Expect.equals(server.connectionsInfo().total,
-                      server.connectionsInfo().idle);
-        server.close();
-      }
-    }
-    server.listen((request) {
-      request.pipe(request.response)
-          .then((_) => check());
-    });
-    var client = new HttpClient();
-    for (int i = 0; i < connections; i++) {
-      var req;
-      client.post("localhost", server.port, "/")
-          .then((request) {
-            req = request;
-            request.writeBytes(new Uint8List(1024));
-            return request.response;
-          })
-          .then((response) {
-            req.close();
-            // Ensure we don't accept the response until we have send the entire
-            // request.
-            response.listen(
-                (_) {},
-                onDone: () {
-                  check();
-                });
-          });
-    }
-  });
-}
-
-
 void testClientCloseSendingResponse(int connections) {
   HttpServer.bind().then((server) {
     int closed = 0;
@@ -124,7 +84,7 @@
     }
     server.listen((request) {
       var timer = new Timer.periodic(const Duration(milliseconds: 20), (_) {
-        request.response.writeBytes(new Uint8List(16 * 1024));
+        request.response.add(new Uint8List(16 * 1024));
       });
       request.response.done
           .catchError((_) {})
@@ -154,7 +114,6 @@
 void main() {
   testClientAndServerCloseNoListen(10);
   testClientCloseServerListen(10);
-  testClientCloseDelayed(10);
   testClientCloseSendingResponse(10);
 }
 
diff --git a/tests/standalone/io/http_compression_test.dart b/tests/standalone/io/http_compression_test.dart
index c347023..8bec0a2 100644
--- a/tests/standalone/io/http_compression_test.dart
+++ b/tests/standalone/io/http_compression_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import 'package:expect/expect.dart';
 import 'dart:io';
 import 'dart:typeddata';
 
@@ -14,7 +15,7 @@
   void test(List<int> data) {
     HttpServer.bind().then((server) {
       server.listen((request) {
-        request.response.writeBytes(data);
+        request.response.add(data);
         request.response.close();
       });
       var client = new HttpClient();
@@ -27,7 +28,6 @@
             Expect.equals("gzip",
                           response.headers.value(HttpHeaders.CONTENT_ENCODING));
             response
-                .transform(new ZLibInflater())
                 .fold([], (list, b) {
                   list.addAll(b);
                   return list;
diff --git a/tests/standalone/io/http_connection_close_test.dart b/tests/standalone/io/http_connection_close_test.dart
index 7225ef7..5a22540 100644
--- a/tests/standalone/io/http_connection_close_test.dart
+++ b/tests/standalone/io/http_connection_close_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 //
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:uri";
diff --git a/tests/standalone/io/http_connection_header_test.dart b/tests/standalone/io/http_connection_header_test.dart
index b7966a2..9d43624 100644
--- a/tests/standalone/io/http_connection_header_test.dart
+++ b/tests/standalone/io/http_connection_header_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 //
 
+import "package:expect/expect.dart";
 import "dart:isolate";
 import "dart:io";
 
diff --git a/tests/standalone/io/http_connection_info_test.dart b/tests/standalone/io/http_connection_info_test.dart
index 54c0628..0d4caa4 100644
--- a/tests/standalone/io/http_connection_info_test.dart
+++ b/tests/standalone/io/http_connection_info_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:expect/expect.dart";
 import "dart:io";
 
 void testHttpConnectionInfo() {
diff --git a/tests/standalone/io/http_content_length_test.dart b/tests/standalone/io/http_content_length_test.dart
index cbe04ea..c42b8d3 100644
--- a/tests/standalone/io/http_content_length_test.dart
+++ b/tests/standalone/io/http_content_length_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:expect/expect.dart";
 import "dart:isolate";
 import "dart:io";
 
diff --git a/tests/standalone/io/http_date_test.dart b/tests/standalone/io/http_date_test.dart
index 8f2ee60..df88afe 100644
--- a/tests/standalone/io/http_date_test.dart
+++ b/tests/standalone/io/http_date_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:expect/expect.dart";
 import "dart:async";
 import "dart:math";
 
@@ -14,18 +15,18 @@
 
 void testParseHttpDate() {
   DateTime date;
-  date = new DateTime.utc(1999, DateTime.JUN, 11, 18, 46, 53, 0);
+  date = new DateTime.utc(1999, DateTime.JUNE, 11, 18, 46, 53, 0);
   Expect.equals(date, _HttpUtils.parseDate("Fri, 11 Jun 1999 18:46:53 GMT"));
   Expect.equals(date, _HttpUtils.parseDate("Friday, 11-Jun-1999 18:46:53 GMT"));
   Expect.equals(date, _HttpUtils.parseDate("Fri Jun 11 18:46:53 1999"));
 
-  date = new DateTime.utc(1970, DateTime.JAN, 1, 0, 0, 0, 0);
+  date = new DateTime.utc(1970, DateTime.JANUARY, 1, 0, 0, 0, 0);
   Expect.equals(date, _HttpUtils.parseDate("Thu, 1 Jan 1970 00:00:00 GMT"));
   Expect.equals(date,
                 _HttpUtils.parseDate("Thursday, 1-Jan-1970 00:00:00 GMT"));
   Expect.equals(date, _HttpUtils.parseDate("Thu Jan  1 00:00:00 1970"));
 
-  date = new DateTime.utc(2012, DateTime.MAR, 5, 23, 59, 59, 0);
+  date = new DateTime.utc(2012, DateTime.MARCH, 5, 23, 59, 59, 0);
   Expect.equals(date, _HttpUtils.parseDate("Mon, 5 Mar 2012 23:59:59 GMT"));
   Expect.equals(date, _HttpUtils.parseDate("Monday, 5-Mar-2012 23:59:59 GMT"));
   Expect.equals(date, _HttpUtils.parseDate("Mon Mar  5 23:59:59 2012"));
@@ -47,9 +48,9 @@
     Expect.equals(date, _HttpUtils.parseDate(formatted));
   }
 
-  test(1999, DateTime.JUN, 11, 18, 46, 53, "Fri, 11 Jun 1999 18:46:53 GMT");
-  test(1970, DateTime.JAN, 1, 0, 0, 0, "Thu, 1 Jan 1970 00:00:00 GMT");
-  test(2012, DateTime.MAR, 5, 23, 59, 59, "Mon, 5 Mar 2012 23:59:59 GMT");
+  test(1999, DateTime.JUNE, 11, 18, 46, 53, "Fri, 11 Jun 1999 18:46:53 GMT");
+  test(1970, DateTime.JANUARY, 1, 0, 0, 0, "Thu, 1 Jan 1970 00:00:00 GMT");
+  test(2012, DateTime.MARCH, 5, 23, 59, 59, "Mon, 5 Mar 2012 23:59:59 GMT");
 }
 
 void testParseHttpDateFailures() {
@@ -97,11 +98,11 @@
     Expect.equals(date, _HttpUtils.parseCookieDate(formatted));
   }
 
-  test(2012, DateTime.JUN, 19, 14, 15, 01, "tue, 19-jun-12 14:15:01 gmt");
-  test(2021, DateTime.JUN, 09, 10, 18, 14, "Wed, 09-Jun-2021 10:18:14 GMT");
-  test(2021, DateTime.JAN, 13, 22, 23, 01, "Wed, 13-Jan-2021 22:23:01 GMT");
-  test(2013, DateTime.JAN, 15, 21, 47, 38, "Tue, 15-Jan-2013 21:47:38 GMT");
-  test(1970, DateTime.JAN, 01, 00, 00, 01, "Thu, 01-Jan-1970 00:00:01 GMT");
+  test(2012, DateTime.JUNE, 19, 14, 15, 01, "tue, 19-jun-12 14:15:01 gmt");
+  test(2021, DateTime.JUNE, 09, 10, 18, 14, "Wed, 09-Jun-2021 10:18:14 GMT");
+  test(2021, DateTime.JANUARY, 13, 22, 23, 01, "Wed, 13-Jan-2021 22:23:01 GMT");
+  test(2013, DateTime.JANUARY, 15, 21, 47, 38, "Tue, 15-Jan-2013 21:47:38 GMT");
+  test(1970, DateTime.JANUARY, 01, 00, 00, 01, "Thu, 01-Jan-1970 00:00:01 GMT");
 }
 
 void main() {
diff --git a/tests/standalone/io/http_detach_socket_test.dart b/tests/standalone/io/http_detach_socket_test.dart
index 9c6f8c3..7d14b37 100644
--- a/tests/standalone/io/http_detach_socket_test.dart
+++ b/tests/standalone/io/http_detach_socket_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:io";
 import "dart:isolate";
 
@@ -29,8 +30,8 @@
 
     Socket.connect("127.0.0.1", server.port).then((socket) {
       socket.write("GET / HTTP/1.1\r\n"
-                       "content-length: 0\r\n\r\n"
-                       "Some data");
+                   "content-length: 0\r\n\r\n"
+                   "Some data");
       var body = new StringBuffer();
       socket.listen(
         (data) => body.write(new String.fromCharCodes(data)),
@@ -58,7 +59,7 @@
 
     Socket.connect("127.0.0.1", server.port).then((socket) {
       socket.write("GET / HTTP/1.1\r\n"
-                       "content-length: 0\r\n\r\n");
+                   "content-length: 0\r\n\r\n");
       socket.listen((_) {}, onDone: () {
           socket.close();
         });
@@ -77,6 +78,7 @@
         (data) => body.write(new String.fromCharCodes(data)),
         onDone: () {
           Expect.equals("GET / HTTP/1.1\r\n"
+                        "accept-encoding: gzip\r\n"
                         "content-length: 0\r\n"
                         "host: 127.0.0.1:${server.port}\r\n\r\n"
                         "Some data",
diff --git a/tests/standalone/io/http_head_test.dart b/tests/standalone/io/http_head_test.dart
index bb33ad3..ea5974b 100644
--- a/tests/standalone/io/http_head_test.dart
+++ b/tests/standalone/io/http_head_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:expect/expect.dart";
 import "dart:io";
 
 void testHEAD(int totalConnections) {
@@ -14,15 +15,15 @@
         } else if (request.uri.path == "/test200") {
           response.contentLength = 200;
           List<int> data = new List<int>.filled(200, 0);
-          response.writeBytes(data);
+          response.add(data);
           response.close();
         } else if (request.uri.path == "/testChunked100") {
           List<int> data = new List<int>.filled(100, 0);
-          response.writeBytes(data);
+          response.add(data);
           response.close();
         } else if (request.uri.path == "/testChunked200") {
           List<int> data = new List<int>.filled(200, 0);
-          response.writeBytes(data);
+          response.add(data);
           response.close();
         } else {
           assert(false);
diff --git a/tests/standalone/io/http_headers_state_test.dart b/tests/standalone/io/http_headers_state_test.dart
index a685eb6..db4cdc1 100644
--- a/tests/standalone/io/http_headers_state_test.dart
+++ b/tests/standalone/io/http_headers_state_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 //
 
+import "package:expect/expect.dart";
 import "dart:isolate";
 import "dart:io";
 
@@ -52,7 +53,7 @@
           // Cannot mutate request headers when data has been sent.
           Expect.throws(() => request.headers.add("X-Request-Header", "value3"),
                         (e) => e is HttpException);
-          return request.response;
+          return request.done;
         })
         .then((HttpClientResponse response) {
           // Cannot mutate response headers.
diff --git a/tests/standalone/io/http_headers_test.dart b/tests/standalone/io/http_headers_test.dart
index 5d94173..111379c 100644
--- a/tests/standalone/io/http_headers_test.dart
+++ b/tests/standalone/io/http_headers_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:expect/expect.dart";
 import 'dart:async';
 import 'dart:math';
 
@@ -51,9 +52,9 @@
 }
 
 void testDate() {
-  DateTime date1 = new DateTime.utc(1999, DateTime.JUN, 11, 18, 46, 53, 0);
+  DateTime date1 = new DateTime.utc(1999, DateTime.JUNE, 11, 18, 46, 53, 0);
   String httpDate1 = "Fri, 11 Jun 1999 18:46:53 GMT";
-  DateTime date2 = new DateTime.utc(2000, DateTime.AUG, 16, 12, 34, 56, 0);
+  DateTime date2 = new DateTime.utc(2000, DateTime.AUGUST, 16, 12, 34, 56, 0);
   String httpDate2 = "Wed, 16 Aug 2000 12:34:56 GMT";
 
   _HttpHeaders headers = new _HttpHeaders("1.1");
@@ -77,9 +78,9 @@
 }
 
 void testExpires() {
-  DateTime date1 = new DateTime.utc(1999, DateTime.JUN, 11, 18, 46, 53, 0);
+  DateTime date1 = new DateTime.utc(1999, DateTime.JUNE, 11, 18, 46, 53, 0);
   String httpDate1 = "Fri, 11 Jun 1999 18:46:53 GMT";
-  DateTime date2 = new DateTime.utc(2000, DateTime.AUG, 16, 12, 34, 56, 0);
+  DateTime date2 = new DateTime.utc(2000, DateTime.AUGUST, 16, 12, 34, 56, 0);
   String httpDate2 = "Wed, 16 Aug 2000 12:34:56 GMT";
 
   _HttpHeaders headers = new _HttpHeaders("1.1");
@@ -103,9 +104,9 @@
 }
 
 void testIfModifiedSince() {
-  DateTime date1 = new DateTime.utc(1999, DateTime.JUN, 11, 18, 46, 53, 0);
+  DateTime date1 = new DateTime.utc(1999, DateTime.JUNE, 11, 18, 46, 53, 0);
   String httpDate1 = "Fri, 11 Jun 1999 18:46:53 GMT";
-  DateTime date2 = new DateTime.utc(2000, DateTime.AUG, 16, 12, 34, 56, 0);
+  DateTime date2 = new DateTime.utc(2000, DateTime.AUGUST, 16, 12, 34, 56, 0);
   String httpDate2 = "Wed, 16 Aug 2000 12:34:56 GMT";
 
   _HttpHeaders headers = new _HttpHeaders("1.1");
@@ -329,7 +330,7 @@
   Cookie cookie;
   cookie = new Cookie("name", "value");
   Expect.equals("name=value", cookie.toString());
-  DateTime date = new DateTime.utc(2014, DateTime.JAN, 5, 23, 59, 59, 0);
+  DateTime date = new DateTime.utc(2014, DateTime.JANUARY, 5, 23, 59, 59, 0);
   cookie.expires = date;
   checkCookie(cookie, "name=value"
                       "; Expires=Sun, 5 Jan 2014 23:59:59 GMT");
diff --git a/tests/standalone/io/http_keep_alive_test.dart b/tests/standalone/io/http_keep_alive_test.dart
index ad20ea8..c2160d3 100644
--- a/tests/standalone/io/http_keep_alive_test.dart
+++ b/tests/standalone/io/http_keep_alive_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 
@@ -28,7 +29,7 @@
       int length = int.parse(request.queryParameters["length"]);
       var buffer = new List<int>.filled(length, 0);
       if (!chunked) request.response.contentLength = length;
-      request.response.writeBytes(buffer);
+      request.response.add(buffer);
       request.response.close();
     });
     return server;
diff --git a/tests/standalone/io/http_parser_test.dart b/tests/standalone/io/http_parser_test.dart
index 87abee3..00d5b8e 100644
--- a/tests/standalone/io/http_parser_test.dart
+++ b/tests/standalone/io/http_parser_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:expect/expect.dart";
 import 'dart:async';
 import 'dart:math';
 import 'dart:typeddata';
diff --git a/tests/standalone/io/http_proxy_configuration_test.dart b/tests/standalone/io/http_proxy_configuration_test.dart
index b5016ee..568b47c 100644
--- a/tests/standalone/io/http_proxy_configuration_test.dart
+++ b/tests/standalone/io/http_proxy_configuration_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:expect/expect.dart";
 import "dart:io";
 import "dart:uri";
 
diff --git a/tests/standalone/io/http_proxy_test.dart b/tests/standalone/io/http_proxy_test.dart
index 173c3c0..3f2d0cf 100644
--- a/tests/standalone/io/http_proxy_test.dart
+++ b/tests/standalone/io/http_proxy_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:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:uri";
@@ -103,8 +104,7 @@
             clientRequest.headers.add(
                 HttpHeaders.VIA, "${viaPrefix}1.1 localhost:$port");
             // Copy all content.
-            request.pipe(clientRequest);
-            return clientRequest.response;
+            return request.pipe(clientRequest);
           })
           .then((HttpClientResponse clientResponse) {
             clientResponse.pipe(request.response);
diff --git a/tests/standalone/io/http_read_test.dart b/tests/standalone/io/http_read_test.dart
index 32226c6..e9f9cfc 100644
--- a/tests/standalone/io/http_read_test.dart
+++ b/tests/standalone/io/http_read_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:isolate";
 import "dart:io";
 
@@ -174,7 +175,7 @@
               request.write(data.substring(10, data.length));
             } else {
               request.contentLength = data.length;
-              request.writeBytes(data.codeUnits);
+              request.add(data.codeUnits);
             }
             return request.close();
           })
diff --git a/tests/standalone/io/http_redirect_test.dart b/tests/standalone/io/http_redirect_test.dart
index 3209496..f146083 100644
--- a/tests/standalone/io/http_redirect_test.dart
+++ b/tests/standalone/io/http_redirect_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 //
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:uri";
diff --git a/tests/standalone/io/http_request_pipeling_test.dart b/tests/standalone/io/http_request_pipeling_test.dart
index b12cb48..152fd15 100644
--- a/tests/standalone/io/http_request_pipeling_test.dart
+++ b/tests/standalone/io/http_request_pipeling_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:io";
 import "dart:uri";
 
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 8573f93..5a58899 100644
--- a/tests/standalone/io/http_server_early_client_close_test.dart
+++ b/tests/standalone/io/http_server_early_client_close_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:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
@@ -11,7 +12,7 @@
     socket.listen((data) {
         Expect.fail("No data response was expected");
       });
-    socket.writeBytes(data);
+    socket.add(data);
     socket.close();
     socket.done.then((_) {
       socket.destroy();
diff --git a/tests/standalone/io/http_server_early_server_close_test.dart b/tests/standalone/io/http_server_early_server_close_test.dart
index 79f1254..d5de5d9 100644
--- a/tests/standalone/io/http_server_early_server_close_test.dart
+++ b/tests/standalone/io/http_server_early_server_close_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:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone/io/http_server_response_test.dart b/tests/standalone/io/http_server_response_test.dart
index db3888f..51ad60d 100644
--- a/tests/standalone/io/http_server_response_test.dart
+++ b/tests/standalone/io/http_server_response_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:typeddata";
@@ -87,7 +88,7 @@
 void testBadResponseAdd() {
   testServerRequest((server, request) {
     request.response.contentLength = 0;
-    request.response.writeBytes([0]);
+    request.response.add([0]);
     request.response.close();
     request.response.done.catchError((error) {
       server.close();
@@ -96,8 +97,8 @@
 
   testServerRequest((server, request) {
     request.response.contentLength = 5;
-    request.response.writeBytes([0, 0, 0]);
-    request.response.writeBytes([0, 0, 0]);
+    request.response.add([0, 0, 0]);
+    request.response.add([0, 0, 0]);
     request.response.close();
     request.response.done.catchError((error) {
       server.close();
@@ -106,9 +107,9 @@
 
   testServerRequest((server, request) {
     request.response.contentLength = 0;
-    request.response.writeBytes(new Uint8List(64 * 1024));
-    request.response.writeBytes(new Uint8List(64 * 1024));
-    request.response.writeBytes(new Uint8List(64 * 1024));
+    request.response.add(new Uint8List(64 * 1024));
+    request.response.add(new Uint8List(64 * 1024));
+    request.response.add(new Uint8List(64 * 1024));
     request.response.close();
     request.response.done.catchError((error) {
       server.close();
@@ -127,7 +128,7 @@
 
   testServerRequest((server, request) {
     request.response.contentLength = 5;
-    request.response.writeBytes([0]);
+    request.response.add([0]);
     request.response.close();
     request.response.done.catchError((error) {
       server.close();
diff --git a/tests/standalone/io/http_server_test.dart b/tests/standalone/io/http_server_test.dart
index dd6eeac..4724467 100644
--- a/tests/standalone/io/http_server_test.dart
+++ b/tests/standalone/io/http_server_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:expect/expect.dart";
 import "dart:io";
 import "dart:isolate";
 
diff --git a/tests/standalone/io/http_session_test.dart b/tests/standalone/io/http_session_test.dart
index 5648bd059..6c9d565 100644
--- a/tests/standalone/io/http_session_test.dart
+++ b/tests/standalone/io/http_session_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:expect/expect.dart";
 import 'dart:async';
 import 'dart:io';
 
diff --git a/tests/standalone/io/http_shutdown_test.dart b/tests/standalone/io/http_shutdown_test.dart
index 6c3612a..1cf4803 100644
--- a/tests/standalone/io/http_shutdown_test.dart
+++ b/tests/standalone/io/http_shutdown_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 
@@ -164,7 +165,7 @@
     for (int i = 0; i < totalConnections; i++) {
       client.post("127.0.0.1", server.port, "/")
         .then((request) {
-            request.writeBytes([0]);
+            request.add([0]);
             // TODO(sgjesse): Make this test work with
             //request.response instead of request.close() return
             //return request.response;
diff --git a/tests/standalone/io/https_client_certificate_test.dart b/tests/standalone/io/https_client_certificate_test.dart
index 62144046..720f0c6 100644
--- a/tests/standalone/io/https_client_certificate_test.dart
+++ b/tests/standalone/io/https_client_certificate_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:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:uri";
diff --git a/tests/standalone/io/https_client_exception_test.dart b/tests/standalone/io/https_client_exception_test.dart
index 22c743c..a49c51a 100644
--- a/tests/standalone/io/https_client_exception_test.dart
+++ b/tests/standalone/io/https_client_exception_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:expect/expect.dart";
 import "dart:io";
 import "dart:isolate";
 import "dart:uri";
diff --git a/tests/standalone/io/https_server_test.dart b/tests/standalone/io/https_server_test.dart
index e4e86e8..490152e 100644
--- a/tests/standalone/io/https_server_test.dart
+++ b/tests/standalone/io/https_server_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:expect/expect.dart";
 import "dart:io";
 import "dart:uri";
 import "dart:isolate";
diff --git a/tests/standalone/io/link_test.dart b/tests/standalone/io/link_test.dart
index 8d467d4..0562cb3b 100644
--- a/tests/standalone/io/link_test.dart
+++ b/tests/standalone/io/link_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:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
@@ -132,11 +133,47 @@
     }
   }
   Future.wait(futures).then((_) {
+    new Directory(target).deleteSync(recursive: true);
+    for (bool recursive in [true, false]) {
+      for (bool followLinks in [true, false]) {
+        var result = baseDir.listSync(recursive: recursive,
+                                      followLinks: followLinks);
+        Expect.equals(1, result.length);
+        Expect.isTrue(result[0] is Link);
+      }
+    }
     baseDir.deleteSync(recursive: true);
   });
 }
 
+testCreateLoopingLink() {
+  Path base = new Path(new Directory('').createTempSync().path);
+  new Directory.fromPath(base.append('a/b/c')).create(recursive: true)
+  .then((_) =>
+    new Link.fromPath(base.append('a/b/c/d'))
+        .create(base.append('a/b').toNativePath()))
+  .then((_) =>
+    new Link.fromPath(base.append('a/b/c/e'))
+        .create(base.append('a').toNativePath()))
+  .then((_) =>
+    new Directory.fromPath(base.append('a'))
+        .list(recursive: true, followLinks: false)
+        .last)
+  .then((_) =>
+    // This directory listing must terminate, even though it contains loops.
+    new Directory.fromPath(base.append('a'))
+        .list(recursive: true, followLinks: true)
+        .last)
+  .then((_) =>
+    // This directory listing must terminate, even though it contains loops.
+    new Directory.fromPath(base.append('a/b/c'))
+        .list(recursive: true, followLinks: true)
+        .last)
+  .then((_) =>
+    new Directory.fromPath(base).delete(recursive: true));
+}
 
 main() {
   testCreateSync();
+  testCreateLoopingLink();
 }
diff --git a/tests/standalone/io/mime_multipart_parser_test.dart b/tests/standalone/io/mime_multipart_parser_test.dart
index 506a46e..e8635aa 100644
--- a/tests/standalone/io/mime_multipart_parser_test.dart
+++ b/tests/standalone/io/mime_multipart_parser_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:expect/expect.dart";
 import 'dart:async';
 import 'dart:math';
 
diff --git a/tests/standalone/io/options_test.dart b/tests/standalone/io/options_test.dart
index 5963046..cad7d91 100644
--- a/tests/standalone/io/options_test.dart
+++ b/tests/standalone/io/options_test.dart
@@ -4,6 +4,7 @@
 // Stress test isolate generation.
 // DartOptions=tests/standalone/io/options_test.dart 10 options_test 20
 
+import "package:expect/expect.dart";
 import "dart:math";
 import "dart:io";
 
diff --git a/tests/standalone/io/path_test.dart b/tests/standalone/io/path_test.dart
index 99756cb..5e972f5 100644
--- a/tests/standalone/io/path_test.dart
+++ b/tests/standalone/io/path_test.dart
@@ -4,6 +4,7 @@
 //
 // Test the Path class in dart:io.
 
+import "package:expect/expect.dart";
 import "dart:io";
 
 void main() {
@@ -322,6 +323,7 @@
   var C2Path = new Path(r'C:\a\b\d');
   var C3Path = new Path(r'C:\a\b');
   var C4Path = new Path(r'C:\');
+  var c4Path = new Path(r'c:\');
   var DPath = new Path(r'D:\a\b\d\e');
   var NoPath = new Path(r'\a\b\c\.');
 
@@ -337,4 +339,5 @@
   Expect.equals('d', cPath.relativeTo(C3Path).toString());
   Expect.equals('a/b/d', cPath.relativeTo(C4Path).toString());
   Expect.equals('../../../', C4Path.relativeTo(cPath).toString());
+  Expect.equals('a/b', C3Path.relativeTo(c4Path).toString());
 }
diff --git a/tests/standalone/io/pipe_server_test.dart b/tests/standalone/io/pipe_server_test.dart
index 6fa9f62..d86e5f5 100644
--- a/tests/standalone/io/pipe_server_test.dart
+++ b/tests/standalone/io/pipe_server_test.dart
@@ -9,6 +9,7 @@
 
 library ServerTest;
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone/io/platform_test.dart b/tests/standalone/io/platform_test.dart
index 96839e3..4a42683a 100644
--- a/tests/standalone/io/platform_test.dart
+++ b/tests/standalone/io/platform_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:expect/expect.dart";
 import "dart:io";
 
 main() {
diff --git a/tests/standalone/io/process_broken_pipe_test.dart b/tests/standalone/io/process_broken_pipe_test.dart
index 4db19ac9..01451bf 100644
--- a/tests/standalone/io/process_broken_pipe_test.dart
+++ b/tests/standalone/io/process_broken_pipe_test.dart
@@ -4,6 +4,7 @@
 //
 // Process test program to test closed stdin from child process.
 
+import "package:expect/expect.dart";
 import "dart:io";
 import "dart:isolate";
 
@@ -24,7 +25,7 @@
     // Write to the stdin after the process is terminated to test
     // writing to a broken pipe.
     process.exitCode.then((code) {
-      process.stdin.writeBytes([0]);
+      process.stdin.add([0]);
     });
   });
 }
diff --git a/tests/standalone/io/process_check_arguments_script.dart b/tests/standalone/io/process_check_arguments_script.dart
index de5df11..4e933b9 100644
--- a/tests/standalone/io/process_check_arguments_script.dart
+++ b/tests/standalone/io/process_check_arguments_script.dart
@@ -7,6 +7,20 @@
 import "dart:math";
 import "dart:io";
 
+class Expect {
+  static void isTrue(x) {
+    if (!x) {
+      throw new Error("Not true");
+    }
+  }
+
+  static void equals(x, y) {
+    if (x != y) {
+      throw new Error("Not equal");
+    }
+  }
+}
+
 main() {
   var options = new Options();
   Expect.isTrue(options.script.endsWith('process_check_arguments_script.dart'));
diff --git a/tests/standalone/io/process_check_arguments_test.dart b/tests/standalone/io/process_check_arguments_test.dart
index 22ccde4..68da4a2 100644
--- a/tests/standalone/io/process_check_arguments_test.dart
+++ b/tests/standalone/io/process_check_arguments_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:expect/expect.dart";
 import "dart:io";
 import "process_test_util.dart";
 
diff --git a/tests/standalone/io/process_environment_test.dart b/tests/standalone/io/process_environment_test.dart
index c0aaa68..30e523b 100644
--- a/tests/standalone/io/process_environment_test.dart
+++ b/tests/standalone/io/process_environment_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:expect/expect.dart";
 import "dart:io";
 import "dart:isolate";
 import "process_test_util.dart";
diff --git a/tests/standalone/io/process_exit_test.dart b/tests/standalone/io/process_exit_test.dart
index 060bb14..8e09ae9 100644
--- a/tests/standalone/io/process_exit_test.dart
+++ b/tests/standalone/io/process_exit_test.dart
@@ -5,6 +5,7 @@
 // Process test program to test process communication.
 
 library ProcessExitTest;
+import "package:expect/expect.dart";
 import "dart:io";
 import "process_test_util.dart";
 
diff --git a/tests/standalone/io/process_invalid_arguments_test.dart b/tests/standalone/io/process_invalid_arguments_test.dart
index c58d131..8dc60d1 100644
--- a/tests/standalone/io/process_invalid_arguments_test.dart
+++ b/tests/standalone/io/process_invalid_arguments_test.dart
@@ -4,6 +4,7 @@
 //
 // Process test program to test that invalid arguments throw exceptions.
 
+import "package:expect/expect.dart";
 import "dart:io";
 
 void main() {
diff --git a/tests/standalone/io/process_kill_test.dart b/tests/standalone/io/process_kill_test.dart
index 733724f..6739336 100644
--- a/tests/standalone/io/process_kill_test.dart
+++ b/tests/standalone/io/process_kill_test.dart
@@ -5,6 +5,7 @@
 // Process test program to test process communication.
 
 library ProcessKillTest;
+import "package:expect/expect.dart";
 import "dart:io";
 import "process_test_util.dart";
 
diff --git a/tests/standalone/io/process_non_ascii_test.dart b/tests/standalone/io/process_non_ascii_test.dart
index 88291be..020b07e 100644
--- a/tests/standalone/io/process_non_ascii_test.dart
+++ b/tests/standalone/io/process_non_ascii_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:expect/expect.dart";
 import 'dart:io';
 import 'dart:isolate';
 
@@ -17,7 +18,9 @@
 import 'dart:io';
 
 main() {
-  Expect.equals('æøå', new File('æøå.txt').readAsStringSync());
+  if ('æøå' != new File('æøå.txt').readAsStringSync()) {
+    throw new RuntimeError("not equal");
+  }
 }
 """);
   var nonAsciiTxtFile = new File('${nonAsciiDir.path}/æøå.txt');
diff --git a/tests/standalone/io/process_path_environment_test.dart b/tests/standalone/io/process_path_environment_test.dart
index 3cd4cf6..72f5165 100644
--- a/tests/standalone/io/process_path_environment_test.dart
+++ b/tests/standalone/io/process_path_environment_test.dart
@@ -5,6 +5,7 @@
 // Test that the executable is looked up on the user's PATH when spawning a
 // process and environment variables are passed in.
 
+import "package:expect/expect.dart";
 import "dart:io";
 
 main() {
diff --git a/tests/standalone/io/process_path_test.dart b/tests/standalone/io/process_path_test.dart
index 3ce0713..e517d9e 100644
--- a/tests/standalone/io/process_path_test.dart
+++ b/tests/standalone/io/process_path_test.dart
@@ -5,6 +5,7 @@
 // Test that the executable is looked up on the user's PATH when spawning a
 // process.
 
+import "package:expect/expect.dart";
 import "dart:io";
 
 main() {
diff --git a/tests/standalone/io/process_run_output_test.dart b/tests/standalone/io/process_run_output_test.dart
index bc5a4e3..5dd731b 100644
--- a/tests/standalone/io/process_run_output_test.dart
+++ b/tests/standalone/io/process_run_output_test.dart
@@ -5,6 +5,7 @@
 // Test script for testing that output is handled correctly for
 // non-interactive processes started with Process.run.
 
+import "package:expect/expect.dart";
 import "dart:io";
 import "process_test_util.dart";
 
diff --git a/tests/standalone/io/process_segfault_test.dart b/tests/standalone/io/process_segfault_test.dart
index 5c278d2..3308139 100644
--- a/tests/standalone/io/process_segfault_test.dart
+++ b/tests/standalone/io/process_segfault_test.dart
@@ -5,6 +5,7 @@
 // Process test program to test process communication.
 
 library ProcessSegfaultTest;
+import "package:expect/expect.dart";
 import "dart:io";
 import "process_test_util.dart";
 
diff --git a/tests/standalone/io/process_set_exit_code_test.dart b/tests/standalone/io/process_set_exit_code_test.dart
index 29baed7..1b0f767 100644
--- a/tests/standalone/io/process_set_exit_code_test.dart
+++ b/tests/standalone/io/process_set_exit_code_test.dart
@@ -6,6 +6,7 @@
 
 library ProcessSetExitCodeTest;
 
+import "package:expect/expect.dart";
 import "dart:io";
 
 main() {
diff --git a/tests/standalone/io/process_start_exception_test.dart b/tests/standalone/io/process_start_exception_test.dart
index a75b131..f7a0a66 100644
--- a/tests/standalone/io/process_start_exception_test.dart
+++ b/tests/standalone/io/process_start_exception_test.dart
@@ -4,6 +4,7 @@
 //
 // Process test program to errors during startup of the process.
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:io';
 
diff --git a/tests/standalone/io/process_std_io_script.dart b/tests/standalone/io/process_std_io_script.dart
index 4ca28f4..7e55c8d 100644
--- a/tests/standalone/io/process_std_io_script.dart
+++ b/tests/standalone/io/process_std_io_script.dart
@@ -15,8 +15,8 @@
       stdin.pipe(stderr);
     } else if (options.arguments[0] == "2") {
       stdin.listen((data) {
-        stdout.writeBytes(data);
-        stderr.writeBytes(data);
+        stdout.add(data);
+        stderr.add(data);
       });
     }
   }
diff --git a/tests/standalone/io/process_stderr_test.dart b/tests/standalone/io/process_stderr_test.dart
index 38e47f4..8292b99 100644
--- a/tests/standalone/io/process_stderr_test.dart
+++ b/tests/standalone/io/process_stderr_test.dart
@@ -9,6 +9,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:io';
 import 'dart:math';
@@ -46,7 +47,7 @@
     }
 
     process.stdout.listen((_) {});
-    process.stdin.writeBytes(data);
+    process.stdin.add(data);
     process.stdin.close();
     process.stderr.listen(readData);
   });
diff --git a/tests/standalone/io/process_stdin_transform_unsubscribe_test.dart b/tests/standalone/io/process_stdin_transform_unsubscribe_test.dart
index 23736f7..94085a4 100644
--- a/tests/standalone/io/process_stdin_transform_unsubscribe_test.dart
+++ b/tests/standalone/io/process_stdin_transform_unsubscribe_test.dart
@@ -9,6 +9,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:io';
 import 'dart:math';
diff --git a/tests/standalone/io/process_stdout_test.dart b/tests/standalone/io/process_stdout_test.dart
index 15b124d..0bce7aa 100644
--- a/tests/standalone/io/process_stdout_test.dart
+++ b/tests/standalone/io/process_stdout_test.dart
@@ -9,6 +9,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:io';
 import 'dart:math';
@@ -46,7 +47,7 @@
     }
 
     process.stderr.listen((_) {});
-    process.stdin.writeBytes(data);
+    process.stdin.add(data);
     process.stdin.close();
     process.stdout.listen(readData);
   });
diff --git a/tests/standalone/io/process_working_directory_test.dart b/tests/standalone/io/process_working_directory_test.dart
index 714d2a4..9bc1d0c 100644
--- a/tests/standalone/io/process_working_directory_test.dart
+++ b/tests/standalone/io/process_working_directory_test.dart
@@ -5,6 +5,7 @@
 // Process working directory test.
 
 library ProcessWorkingDirectoryTest;
+import "package:expect/expect.dart";
 import "dart:io";
 import "process_test_util.dart";
 
diff --git a/tests/standalone/io/raw_secure_server_closing_test.dart b/tests/standalone/io/raw_secure_server_closing_test.dart
index 0fa8121..51e1ab2 100644
--- a/tests/standalone/io/raw_secure_server_closing_test.dart
+++ b/tests/standalone/io/raw_secure_server_closing_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone/io/raw_secure_server_socket_test.dart b/tests/standalone/io/raw_secure_server_socket_test.dart
index b12b87a..3b3079c 100644
--- a/tests/standalone/io/raw_secure_server_socket_test.dart
+++ b/tests/standalone/io/raw_secure_server_socket_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone/io/raw_secure_socket_pause_test.dart b/tests/standalone/io/raw_secure_socket_pause_test.dart
index b5081f5..d703112 100644
--- a/tests/standalone/io/raw_secure_socket_pause_test.dart
+++ b/tests/standalone/io/raw_secure_socket_pause_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
@@ -23,7 +24,7 @@
         onDone: () {
           request.response.contentLength = 100;
           for (int i = 0; i < 10; i++) {
-            request.response.writeBytes([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
+            request.response.add([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
           }
           request.response.close();
         });
diff --git a/tests/standalone/io/raw_secure_socket_test.dart b/tests/standalone/io/raw_secure_socket_test.dart
index 7375161..02254b4 100644
--- a/tests/standalone/io/raw_secure_socket_test.dart
+++ b/tests/standalone/io/raw_secure_socket_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
@@ -23,7 +24,7 @@
         onDone: () {
           request.response.contentLength = 100;
           for (int i = 0; i < 10; i++) {
-            request.response.writeBytes([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
+            request.response.add([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
           }
           request.response.close();
         });
diff --git a/tests/standalone/io/raw_socket_test.dart b/tests/standalone/io/raw_socket_test.dart
index 01e8e71..b619668 100644
--- a/tests/standalone/io/raw_socket_test.dart
+++ b/tests/standalone/io/raw_socket_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone/io/raw_socket_write_destroy_test.dart b/tests/standalone/io/raw_socket_write_destroy_test.dart
index d7dc0d8..13ecaf3 100644
--- a/tests/standalone/io/raw_socket_write_destroy_test.dart
+++ b/tests/standalone/io/raw_socket_write_destroy_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone/io/read_into_const_list_test.dart b/tests/standalone/io/read_into_const_list_test.dart
index 576cc3f..e1ed587 100644
--- a/tests/standalone/io/read_into_const_list_test.dart
+++ b/tests/standalone/io/read_into_const_list_test.dart
@@ -5,6 +5,7 @@
 // Regression test for missing immutability check in the ListSet
 // methods in the API. This allowed overwriting const Lists.
 
+import "package:expect/expect.dart";
 import "dart:io";
 
 String getFilename(String path) =>
diff --git a/tests/standalone/io/regress_6521_test.dart b/tests/standalone/io/regress_6521_test.dart
deleted file mode 100644
index aa8a964..0000000
--- a/tests/standalone/io/regress_6521_test.dart
+++ /dev/null
@@ -1,40 +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.
-//
-// Regression test for http://code.google.com/p/dart/issues/detail?id=6393.
-
-import "dart:io";
-import "dart:uri";
-
-var client = new HttpClient();
-var clientRequest;
-
-void main() {
-  HttpServer.bind("127.0.0.1", 0)
-      .then((server) {
-        server.listen(
-            (req) {
-              req.pipe(req.response);
-            });
-
-        client.openUrl("POST", Uri.parse("http://localhost:${server.port}/"))
-            .then((request) {
-              // Keep a reference to the client request object.
-              clientRequest = request;
-              request.writeBytes([0]);
-              return request.response;
-            })
-            .then((response) {
-              // Wait with closing the client request until the response headers
-              // are done.
-              clientRequest.close();
-              response.listen(
-                  (_) {},
-                  onDone: () {
-                    client.close();
-                    server.close();
-                  });
-            });
-      });
-}
diff --git a/tests/standalone/io/regress_7191_script.dart b/tests/standalone/io/regress_7191_script.dart
index 1b047f1..7bc7a3e 100644
--- a/tests/standalone/io/regress_7191_script.dart
+++ b/tests/standalone/io/regress_7191_script.dart
@@ -17,9 +17,8 @@
       p.stderr.listen((_) { });
       // When receiving data again, kill sub-process and exit.
       subscription.onData((data) {
-        Expect.listEquals([0], data);
         p.kill();
-        p.exitCode.then(exit);
+        p.exitCode.then((_) => exit(0));
       });
       // Close stdout. If handles are incorrectly inherited this will
       // not actually close stdout and the test will hang.
diff --git a/tests/standalone/io/regress_7191_test.dart b/tests/standalone/io/regress_7191_test.dart
index 3d46cfa..8c56fb3 100644
--- a/tests/standalone/io/regress_7191_test.dart
+++ b/tests/standalone/io/regress_7191_test.dart
@@ -19,10 +19,13 @@
   var scriptDir = new Path(options.script).directoryPath;
   var script = scriptDir.append('regress_7191_script.dart').toNativePath();
   Process.start(executable, [script]).then((process) {
-    process.stdin.writeBytes([0]);
-      process.stdout.listen((_) { },
-                            onDone: () { process.stdin.writeBytes([0]); });
+    process.stdin.add([0]);
+    process.stdout.listen((_) { },
+                           onDone: () { process.stdin.add([0]); });
     process.stderr.listen((_) { });
-    process.exitCode.then((exitCode) => port.close());
+    process.exitCode.then((exitCode) {
+      port.close();
+      if (exitCode != 0) throw "Bad exit code";
+    });
   });
 }
diff --git a/tests/standalone/io/regress_7679_test.dart b/tests/standalone/io/regress_7679_test.dart
index b13c249..dba91ed 100644
--- a/tests/standalone/io/regress_7679_test.dart
+++ b/tests/standalone/io/regress_7679_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:expect/expect.dart";
 import 'dart:io';
 
 main() {
@@ -10,6 +11,14 @@
   script.writeAsStringSync("""
 import 'dart:io';
 
+class Expect {
+  static void isTrue(var x) {
+    if (!identical(x, true)) {
+      throw new Error("Not identical");
+    }
+  }
+}
+
 main() {
   Directory d = new Directory('a');
   d.create(recursive: true).then((_) {
diff --git a/tests/standalone/io/regress_8828_test.dart b/tests/standalone/io/regress_8828_test.dart
index 258d7a6..7842be5 100644
--- a/tests/standalone/io/regress_8828_test.dart
+++ b/tests/standalone/io/regress_8828_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import 'dart:io';
 
 void main() {
diff --git a/tests/standalone/io/regress_9194_test.dart b/tests/standalone/io/regress_9194_test.dart
index 32e8851..0b686e0 100644
--- a/tests/standalone/io/regress_9194_test.dart
+++ b/tests/standalone/io/regress_9194_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:expect/expect.dart";
 import 'dart:io';
 
 void main() {
diff --git a/tests/standalone/io/secure_client_raw_server_test.dart b/tests/standalone/io/secure_client_raw_server_test.dart
index 7b63775..a00e27b 100644
--- a/tests/standalone/io/secure_client_raw_server_test.dart
+++ b/tests/standalone/io/secure_client_raw_server_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone/io/secure_client_server_test.dart b/tests/standalone/io/secure_client_server_test.dart
index 75cdd77..6681c11 100644
--- a/tests/standalone/io/secure_client_server_test.dart
+++ b/tests/standalone/io/secure_client_server_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
@@ -22,7 +23,7 @@
     server.listen((SecureSocket client) {
       client.fold(<int>[], (message, data) => message..addAll(data))
           .then((message) {
-            client.writeBytes(message);
+            client.add(message);
             client.close();
           });
     });
diff --git a/tests/standalone/io/secure_multiple_client_server_test.dart b/tests/standalone/io/secure_multiple_client_server_test.dart
index 4700fcd..dc6720f 100644
--- a/tests/standalone/io/secure_multiple_client_server_test.dart
+++ b/tests/standalone/io/secure_multiple_client_server_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
@@ -25,7 +26,7 @@
             String received = new String.fromCharCodes(message);
             Expect.isTrue(received.contains("Hello from client "));
             String name = received.substring(received.indexOf("client ") + 7);
-            client.writeBytes("Welcome, client $name".codeUnits);
+            client.add("Welcome, client $name".codeUnits);
             client.close();
           });
     });
@@ -35,7 +36,7 @@
 
 Future testClient(server, name) {
   return SecureSocket.connect(HOST_NAME, server.port).then((socket) {
-    socket.writeBytes("Hello from client $name".codeUnits);
+    socket.add("Hello from client $name".codeUnits);
     socket.close();
     return socket.fold(<int>[], (message, data) => message..addAll(data))
         .then((message) {
diff --git a/tests/standalone/io/secure_no_builtin_roots_database_test.dart b/tests/standalone/io/secure_no_builtin_roots_database_test.dart
new file mode 100644
index 0000000..078ba70
--- /dev/null
+++ b/tests/standalone/io/secure_no_builtin_roots_database_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+import "dart:io";
+import "dart:uri";
+import "dart:isolate";
+import "dart:async";
+
+void testGoogleUrl() {
+  ReceivePort keepAlive = new ReceivePort();
+  HttpClient client = new HttpClient();
+  client.getUrl(Uri.parse('https://www.google.com'))
+      .then((request) => request.close())
+      .then((response) => Expect.fail("Unexpected successful connection"))
+      .catchError((error) {
+        Expect.isTrue(error is AsyncError);
+        Expect.isTrue(error.error is SocketIOException);
+        keepAlive.close();
+        client.close();
+      });
+}
+
+void InitializeSSL() {
+  // If the built-in root certificates aren't loaded, the connection
+  // should signal an error.  Even when an external database is loaded,
+  // they should not be loaded.
+  Path scriptDir = new Path(new Options().script).directoryPath;
+  Path certificateDatabase = scriptDir.append('pkcert');
+  SecureSocket.initialize(database: certificateDatabase.toNativePath(),
+                          password: 'dartdart',
+                          useBuiltinRoots: false);
+}
+
+void main() {
+  InitializeSSL();
+  testGoogleUrl();
+}
diff --git a/tests/standalone/io/secure_no_builtin_roots_test.dart b/tests/standalone/io/secure_no_builtin_roots_test.dart
index 9b6f489..a93404c 100644
--- a/tests/standalone/io/secure_no_builtin_roots_test.dart
+++ b/tests/standalone/io/secure_no_builtin_roots_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:expect/expect.dart";
 import "dart:io";
 import "dart:uri";
 import "dart:isolate";
diff --git a/tests/standalone/io/secure_server_client_certificate_test.dart b/tests/standalone/io/secure_server_client_certificate_test.dart
index 24e72a0..4d24783 100644
--- a/tests/standalone/io/secure_server_client_certificate_test.dart
+++ b/tests/standalone/io/secure_server_client_certificate_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:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone/io/secure_server_closing_test.dart b/tests/standalone/io/secure_server_closing_test.dart
index fde898c..29f3a1b 100644
--- a/tests/standalone/io/secure_server_closing_test.dart
+++ b/tests/standalone/io/secure_server_closing_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone/io/secure_server_socket_test.dart b/tests/standalone/io/secure_server_socket_test.dart
index ad5f4d3..da71e0d 100644
--- a/tests/standalone/io/secure_server_socket_test.dart
+++ b/tests/standalone/io/secure_server_socket_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
@@ -170,7 +171,7 @@
           bytesRead += buffer.length;
           if (bytesRead == data.length) {
             verifyTestData(data);
-            client.writeBytes(data);
+            client.add(data);
             client.close();
           }
         },
@@ -184,7 +185,7 @@
       int bytesWritten = 0;
       List<int> dataSent = createTestData();
       List<int> dataReceived = new List<int>(dataSent.length);
-      socket.writeBytes(dataSent);
+      socket.add(dataSent);
       socket.close();  // Can also be delayed.
       socket.listen(
         (List<int> buffer) {
diff --git a/tests/standalone/io/secure_session_resume_test.dart b/tests/standalone/io/secure_session_resume_test.dart
index 83ec1cc..6e5f48b 100644
--- a/tests/standalone/io/secure_session_resume_test.dart
+++ b/tests/standalone/io/secure_session_resume_test.dart
@@ -16,6 +16,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone/io/secure_socket_argument_test.dart b/tests/standalone/io/secure_socket_argument_test.dart
index 7fda4a4..5e59c06 100644
--- a/tests/standalone/io/secure_socket_argument_test.dart
+++ b/tests/standalone/io/secure_socket_argument_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:expect/expect.dart";
 import "dart:io";
 
 void main() {
diff --git a/tests/standalone/io/secure_socket_bad_certificate_test.dart b/tests/standalone/io/secure_socket_bad_certificate_test.dart
index 5cb4145..658d560 100644
--- a/tests/standalone/io/secure_socket_bad_certificate_test.dart
+++ b/tests/standalone/io/secure_socket_bad_certificate_test.dart
@@ -10,6 +10,7 @@
 // www.google.dk.  Add this to the test when we have secure server sockets.
 // See TODO below.
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:isolate";
 import "dart:io";
@@ -39,8 +40,8 @@
 
   bool badCertificateCallback(X509Certificate certificate) {
     Expect.isTrue(certificate.subject.contains("O=Google Inc"));
-    Expect.isTrue(certificate.startValidity < new DateTime.now());
-    Expect.isTrue(certificate.endValidity > new DateTime.now());
+    Expect.isTrue(certificate.startValidity.isBefore(new DateTime.now()));
+    Expect.isTrue(certificate.endValidity.isAfter(new DateTime.now()));
     return acceptCertificate;
   };
 
diff --git a/tests/standalone/io/secure_socket_test.dart b/tests/standalone/io/secure_socket_test.dart
index 0fe4c55..09a5852 100644
--- a/tests/standalone/io/secure_socket_test.dart
+++ b/tests/standalone/io/secure_socket_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 
@@ -22,7 +23,7 @@
         onDone: () {
           request.response.contentLength = 100;
           for (int i = 0; i < 10; i++) {
-            request.response.writeBytes([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
+            request.response.add([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
           }
           request.response.close();
         });
diff --git a/tests/standalone/io/skipping_dart2js_compilations_test.dart b/tests/standalone/io/skipping_dart2js_compilations_test.dart
index a142ab3..2dd7bf2 100644
--- a/tests/standalone/io/skipping_dart2js_compilations_test.dart
+++ b/tests/standalone/io/skipping_dart2js_compilations_test.dart
@@ -14,6 +14,7 @@
  * output (+deps file), dart application)
  */
 
+import 'package:expect/expect.dart';
 import 'dart:async';
 import 'dart:io';
 import 'dart:uri';
diff --git a/tests/standalone/io/sleep_test.dart b/tests/standalone/io/sleep_test.dart
index d953bf9..795de81 100644
--- a/tests/standalone/io/sleep_test.dart
+++ b/tests/standalone/io/sleep_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:expect/expect.dart";
 import "dart:io";
 
 test(int milliseconds) {
@@ -13,7 +14,10 @@
 }
 
 main() {
+  test(0);
   test(1);
   test(10);
   test(100);
+  Expect.throws(() => sleep(new Duration(milliseconds: -1)),
+                (e) => e is ArgumentError);
 }
diff --git a/tests/standalone/io/socket_close_test.dart b/tests/standalone/io/socket_close_test.dart
index a48f5e8..8022fcd 100644
--- a/tests/standalone/io/socket_close_test.dart
+++ b/tests/standalone/io/socket_close_test.dart
@@ -9,6 +9,7 @@
 //
 // Test socket close events.
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:io';
 import 'dart:isolate';
diff --git a/tests/standalone/io/socket_exception_test.dart b/tests/standalone/io/socket_exception_test.dart
index 3b83564..c82f3fb 100644
--- a/tests/standalone/io/socket_exception_test.dart
+++ b/tests/standalone/io/socket_exception_test.dart
@@ -4,6 +4,7 @@
 //
 // Tests socket exceptions.
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:isolate";
 import "dart:io";
@@ -88,7 +89,7 @@
         Expect.isFalse(wrongExceptionCaught);
         try {
           List<int> buffer = new List<int>(10);
-          client.writeBytes(buffer);
+          client.add(buffer);
         } on StateError catch (ex) {
           exceptionCaught = true;
         } catch (ex) {
@@ -121,7 +122,7 @@
       });
       Socket.connect("127.0.0.1", server.port).then((client) {
         client.listen((data) {}, onDone: server.close);
-        client.writeBytes(new List.filled(1024 * 1024, 0));
+        client.add(new List.filled(1024 * 1024, 0));
         client.destroy();
       });
     });
@@ -143,7 +144,7 @@
               Expect.equals(SIZE, count);
               server.close();
             });
-        client.writeBytes(new List.filled(SIZE, 0));
+        client.add(new List.filled(SIZE, 0));
         client.close();
         // Start piping now.
         completer.complete(null);
@@ -174,7 +175,7 @@
               Expect.isTrue(errors <= 1);
               server.close();
             });
-        client.writeBytes(new List.filled(SIZE, 0));
+        client.add(new List.filled(SIZE, 0));
         // Destroy other socket now.
         completer.complete(null);
         var port = new ReceivePort();
@@ -199,7 +200,7 @@
       Socket.connect("127.0.0.1", server.port).then((client) {
         const int SIZE = 1024 * 1024;
         int errors = 0;
-        client.writeBytes(new List.filled(SIZE, 0));
+        client.add(new List.filled(SIZE, 0));
         client.close();
         client.done.catchError((error) {
           server.close();
diff --git a/tests/standalone/io/socket_info_test.dart b/tests/standalone/io/socket_info_test.dart
index f3b675f..f626d66 100644
--- a/tests/standalone/io/socket_info_test.dart
+++ b/tests/standalone/io/socket_info_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:expect/expect.dart";
 import "dart:io";
 
 void testHostAndPort() {
diff --git a/tests/standalone/io/socket_invalid_arguments_test.dart b/tests/standalone/io/socket_invalid_arguments_test.dart
index b0378a6..61d526d 100644
--- a/tests/standalone/io/socket_invalid_arguments_test.dart
+++ b/tests/standalone/io/socket_invalid_arguments_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:expect/expect.dart";
 import "dart:io";
 import "dart:isolate";
 
@@ -39,7 +40,7 @@
             socket.destroy();
             server.close();
           });
-      socket.writeBytes(buffer);
+      socket.add(buffer);
     });
   });
 }
diff --git a/tests/standalone/io/socket_many_connections_test.dart b/tests/standalone/io/socket_many_connections_test.dart
index 49aa34d..b10ad71 100644
--- a/tests/standalone/io/socket_many_connections_test.dart
+++ b/tests/standalone/io/socket_many_connections_test.dart
@@ -5,6 +5,7 @@
 // Test creating a large number of socket connections.
 library ServerTest;
 
+import "package:expect/expect.dart";
 import "dart:io";
 import "dart:isolate";
 part "testing_server.dart";
diff --git a/tests/standalone/io/socket_port_test.dart b/tests/standalone/io/socket_port_test.dart
index 009a522..d3c0179 100644
--- a/tests/standalone/io/socket_port_test.dart
+++ b/tests/standalone/io/socket_port_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:expect/expect.dart";
 import "dart:io";
 
 void testPort() {
diff --git a/tests/standalone/io/socket_test.dart b/tests/standalone/io/socket_test.dart
index 8e757c8..a405c05 100644
--- a/tests/standalone/io/socket_test.dart
+++ b/tests/standalone/io/socket_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
@@ -113,7 +114,7 @@
   ServerSocket.bind().then((server) {
     server.listen((_) { });
     Socket.connect("127.0.0.1", server.port).then((socket) {
-      socket.writeBytes([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
+      socket.add([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
       socket.close();
       socket.done.then((_) {
         socket.destroy();
@@ -155,7 +156,7 @@
   ServerSocket.bind().then((server) {
     server.listen(
         (client) {
-          client.writeBytes(sendData);
+          client.add(sendData);
           if (useDestroy) {
             client.destroy();
           } else {
@@ -171,7 +172,7 @@
                         Expect.isFalse(onDoneCalled);
                         onDoneCalled = true;
                         if (!useDestroy) Expect.listEquals(sendData, data);
-                        socket.writeBytes([0]);
+                        socket.add([0]);
                         socket.close();
                         server.close();
                         port.close();
@@ -186,7 +187,7 @@
   ServerSocket.bind().then((server) {
     server.listen(
         (client) {
-          client.writeBytes(sendData);
+          client.add(sendData);
           if (useDestroy) {
             client.destroy();
           } else {
diff --git a/tests/standalone/io/status_file_parser_test.dart b/tests/standalone/io/status_file_parser_test.dart
index aaf9604..0369d49 100644
--- a/tests/standalone/io/status_file_parser_test.dart
+++ b/tests/standalone/io/status_file_parser_test.dart
@@ -4,6 +4,7 @@
 
 library StatusFileParserTest;
 
+import "package:expect/expect.dart";
 import "dart:io";
 import "../../../tools/testing/dart/status_file_parser.dart";
 
diff --git a/tests/standalone/io/stdout_bad_argument_test.dart b/tests/standalone/io/stdout_bad_argument_test.dart
index 481691f..24b2965 100644
--- a/tests/standalone/io/stdout_bad_argument_test.dart
+++ b/tests/standalone/io/stdout_bad_argument_test.dart
@@ -5,7 +5,7 @@
 import "dart:io";
 
 main() {
-  stdout.writeBytes("Hello\n");
+  stdout.add("Hello\n");
   stdout.done.catchError((e) {
     exit(0);
   });
diff --git a/tests/standalone/io/stdout_stderr_test.dart b/tests/standalone/io/stdout_stderr_test.dart
index 8929ea8..4775891 100644
--- a/tests/standalone/io/stdout_stderr_test.dart
+++ b/tests/standalone/io/stdout_stderr_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:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 
@@ -13,7 +14,7 @@
   sink.writeln("Hello");
   sink.writeAll(["H", "e", "l", "lo\n"]);
   sink.writeCharCode(72);
-  sink.writeBytes([101, 108, 108, 111, 10]);
+  sink.add([101, 108, 108, 111, 10]);
 
   var controller = new StreamController();
   sink.writeStream(controller.stream);
diff --git a/tests/standalone/io/stream_pipe_test.dart b/tests/standalone/io/stream_pipe_test.dart
index 4e77cdf..c029e0b 100644
--- a/tests/standalone/io/stream_pipe_test.dart
+++ b/tests/standalone/io/stream_pipe_test.dart
@@ -8,6 +8,7 @@
 // VMOptions=--short_socket_read --short_socket_write
 library ServerTest;
 
+import "package:expect/expect.dart";
 import "dart:io";
 import "dart:isolate";
 
@@ -100,7 +101,7 @@
   dstFile.createSync();
   var output = dstFile.openWrite();
   output.writeStream(srcStream).then((_) {
-    output.writeBytes([32]);
+    output.add([32]);
     output.close();
     output.done.then((_) {
       var src = srcFile.openSync();
diff --git a/tests/standalone/io/string_decoder_test.dart b/tests/standalone/io/string_decoder_test.dart
index f2ff9e00..d5c3da1 100644
--- a/tests/standalone/io/string_decoder_test.dart
+++ b/tests/standalone/io/string_decoder_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:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 
diff --git a/tests/standalone/io/string_transformer_test.dart b/tests/standalone/io/string_transformer_test.dart
index d65fb33..a15633d 100644
--- a/tests/standalone/io/string_transformer_test.dart
+++ b/tests/standalone/io/string_transformer_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:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone/io/test_extension_fail_test.dart b/tests/standalone/io/test_extension_fail_test.dart
index 7109416..0c721a5 100644
--- a/tests/standalone/io/test_extension_fail_test.dart
+++ b/tests/standalone/io/test_extension_fail_test.dart
@@ -17,7 +17,8 @@
     case 'windows':
       return Process.run('cmd.exe', ['/C', 'copy $src $dst']);
     default:
-      Expect.fail('Unknown operating system ${Platform.operatingSystem}');
+      throw new RuntimeError(
+          'Unknown operating system ${Platform.operatingSystem}');
   }
 }
 
@@ -30,7 +31,8 @@
     case 'windows':
       return buildDirectory.append('test_extension.dll');
     default:
-      Expect.fail('Unknown operating system ${Platform.operatingSystem}');
+      throw new RuntimeError(
+          'Unknown operating system ${Platform.operatingSystem}');
   }
 }
 
@@ -58,8 +60,14 @@
   }).then((ProcessResult result) {
     print("ERR: ${result.stderr}\n\n");
     print("OUT: ${result.stdout}\n\n");
-    Expect.equals(255, result.exitCode);
-    Expect.isTrue(result.stderr.contains("Unhandled exception:"));
-    Expect.isTrue(result.stderr.contains("ball"));
+    if (result.exitCode != 255) {
+      throw new RuntimeError("bad exit code");
+    }
+    if (!result.stderr.contains("Unhandled exception:")) {
+      throw new RuntimeError("stderr doesn't contain unhandled exception.");
+    }
+    if (!result.stderr.contains("ball")) {
+      throw new RuntimeError("stderr doesn't contain 'ball'.");
+    }
   }).whenComplete(() => tempDirectory.deleteSync(recursive: true));
 }
diff --git a/tests/standalone/io/test_extension_fail_tester.dart b/tests/standalone/io/test_extension_fail_tester.dart
index 7ce00e2..aa8daae 100644
--- a/tests/standalone/io/test_extension_fail_tester.dart
+++ b/tests/standalone/io/test_extension_fail_tester.dart
@@ -12,7 +12,7 @@
   try {
     Cat.throwMeTheBall("ball");
   } on String catch (e) {
-    Expect.equals("ball", e);
+    if (e != "ball") throw new RuntimeError("exception not equal to 'ball'");
   }
   // Make sure the exception is thrown out to the event handler from C++ code.
   // The harness expects the string "ball" to be thrown and the process to
diff --git a/tests/standalone/io/test_extension_test.dart b/tests/standalone/io/test_extension_test.dart
index 0f5662e..9961daf 100644
--- a/tests/standalone/io/test_extension_test.dart
+++ b/tests/standalone/io/test_extension_test.dart
@@ -4,6 +4,7 @@
 //
 // Dart test program for testing native extensions.
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:io';
 import 'dart:isolate';
diff --git a/tests/standalone/io/test_extension_tester.dart b/tests/standalone/io/test_extension_tester.dart
index deacbaa..7077717 100644
--- a/tests/standalone/io/test_extension_tester.dart
+++ b/tests/standalone/io/test_extension_tester.dart
@@ -6,6 +6,22 @@
 
 import "test_extension.dart";
 
+class Expect {
+  static void equals(expected, actual, [msg]) {
+    if (expected != actual) {
+      if (msg == null) msg = "Expected: $expected. Actual: $actual";
+      throw new RuntimeError(msg);
+    }
+  }
+
+  static void isNull(x, [msg]) {
+    if (x != null) {
+      if (msg != null) msg = "$x not null";
+      throw new RuntimeError(msg);
+    }
+  }
+}
+
 main() {
   Expect.equals('cat 13', new Cat(13).toString(), 'new Cat(13).toString()');
 
diff --git a/tests/standalone/io/test_runner_test.dart b/tests/standalone/io/test_runner_test.dart
index b9ad2c6..f4a975d 100644
--- a/tests/standalone/io/test_runner_test.dart
+++ b/tests/standalone/io/test_runner_test.dart
@@ -24,14 +24,21 @@
     numCompletedTests++;
     CommandOutput output = testCase.lastCommandOutput;
     if (testCase.displayName == "fail-unexpected") {
-      Expect.isTrue(output.unexpectedOutput);
+      if (!output.unexpectedOutput) {
+        throw "Expected fail-unexpected";
+      }
     } else {
-      Expect.isFalse(output.unexpectedOutput);
+      if (output.unexpectedOutput) {
+        throw "Unexpected fail";
+      }
     }
   }
 
   static void finished() {
-    Expect.equals(numTests, numCompletedTests);
+    if (numTests != numCompletedTests) {
+      throw "bad completion count. "
+            "expected: $numTests, actual: $numCompletedTests";
+    }
   }
 }
 
@@ -111,7 +118,7 @@
         return;
       case 'fail-unexpected':
       case 'fail':
-        Expect.fail("This test always fails, to test the test scripts.");
+        throw "This test always fails, to test the test scripts.";
         break;
       case 'timeout':
         // Run for 10 seconds, then exit.  This tests a 2 second timeout.
diff --git a/tests/standalone/io/url_encoding_test.dart b/tests/standalone/io/url_encoding_test.dart
index 788dfb1..c99346a 100644
--- a/tests/standalone/io/url_encoding_test.dart
+++ b/tests/standalone/io/url_encoding_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:expect/expect.dart";
 import "dart:async";
 import "dart:utf";
 
diff --git a/tests/standalone/io/web_socket_protocol_processor_test.dart b/tests/standalone/io/web_socket_protocol_processor_test.dart
index c762ae4..54a7c12 100644
--- a/tests/standalone/io/web_socket_protocol_processor_test.dart
+++ b/tests/standalone/io/web_socket_protocol_processor_test.dart
@@ -2,11 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import "package:expect/expect.dart";
 import "dart:utf";
 import "dart:math";
 import "dart:async";
 import "dart:collection";
 import "dart:typeddata";
+import "dart:isolate";
 
 part "../../../sdk/lib/io/http.dart";
 part "../../../sdk/lib/io/buffer_list.dart";
@@ -225,7 +227,22 @@
   Expect.equals(0, mc.closeCount);
 }
 
+void testUnmaskedMessage() {
+  var transformer = new _WebSocketProtocolTransformer(true);
+  var controller = new StreamController();
+  var port = new ReceivePort();
+  controller.stream.transform(transformer).listen((_) {}, onError: (e) {
+    port.close();
+  });
+  var message = new Uint8List(10);
+  List<int> frame = createFrame(
+      true, FRAME_OPCODE_BINARY, null, message, 0, message.length);
+  controller.add(frame);
+}
+
+
 void main() {
   testFullMessages();
   testFragmentedMessages();
+  testUnmaskedMessage();
 }
diff --git a/tests/standalone/io/web_socket_test.dart b/tests/standalone/io/web_socket_test.dart
index 94cd01d..9a126f4 100644
--- a/tests/standalone/io/web_socket_test.dart
+++ b/tests/standalone/io/web_socket_test.dart
@@ -7,6 +7,7 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone/io/windows_environment_script.dart b/tests/standalone/io/windows_environment_script.dart
index d0fce49..f142163 100644
--- a/tests/standalone/io/windows_environment_script.dart
+++ b/tests/standalone/io/windows_environment_script.dart
@@ -6,9 +6,9 @@
 
 main() {
   var scriptDir = Platform.environment['SCRIPTDIR'];
-  Expect.isTrue(scriptDir.contains('å'));
+  if (!scriptDir.contains('å')) throw "scriptDir not containing character å";
   scriptDir = Platform.environment['ScriptDir'];
-  Expect.isTrue(scriptDir.contains('å'));
+  if (!scriptDir.contains('å')) throw "scriptDir not containing character å";
   var str = new File('$scriptDir/funky.bat').readAsStringSync();
-  Expect.isTrue(str.contains('%~dp0'));
+  if (!str.contains('%~dp0')) throw "str not containing dp0";
 }
diff --git a/tests/standalone/io/windows_environment_test.dart b/tests/standalone/io/windows_environment_test.dart
index dfe5af6..6508da8 100644
--- a/tests/standalone/io/windows_environment_test.dart
+++ b/tests/standalone/io/windows_environment_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:expect/expect.dart';
 import "dart:io";
 
 main() {
@@ -21,7 +22,7 @@
   var script = scriptDir.append('windows_environment_script.dart');
   Process.run('cmd',
               ['/c', funkyFile.path, dart, script.toNativePath()]).then((p) {
-    Expect.equals(0, p.exitCode);
+    if (0 != p.exitCode) throw "Exit code not 0";
     tempDir.deleteSync(recursive: true);
   });
 }
diff --git a/tests/standalone/io/windows_file_system_links_test.dart b/tests/standalone/io/windows_file_system_links_test.dart
index f161b0e..7775be8 100644
--- a/tests/standalone/io/windows_file_system_links_test.dart
+++ b/tests/standalone/io/windows_file_system_links_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:expect/expect.dart';
 import "dart:io";
 import "dart:isolate";
 
@@ -30,13 +31,13 @@
 
     // Test Junction pointing to a missing directory.
     new Directory(x).deleteSync();
-    Expect.isTrue(new Directory(y).existsSync());
+    Expect.isTrue(new Link(y).existsSync());
     Expect.isFalse(new Directory(x).existsSync());
     Expect.isTrue(FileSystemEntity.isLinkSync(y));
     Expect.isFalse(FileSystemEntity.isLinkSync(x));
     Expect.isFalse(FileSystemEntity.isDirectorySync(y));
     Expect.isFalse(FileSystemEntity.isDirectorySync(x));
-    Expect.equals(FileSystemEntityType.NOT_FOUND,
+    Expect.equals(FileSystemEntityType.LINK,
                   FileSystemEntity.typeSync(y));
     Expect.equals(FileSystemEntityType.NOT_FOUND,
                   FileSystemEntity.typeSync(x));
@@ -47,7 +48,7 @@
     Expect.equals(x, new Link(y).targetSync());
 
     // Delete Junction pointing to a missing directory.
-    new Directory(y).deleteSync();
+    new Link(y).deleteSync();
     Expect.isFalse(FileSystemEntity.isLinkSync(y));
     Expect.equals(FileSystemEntityType.NOT_FOUND,
                   FileSystemEntity.typeSync(y));
diff --git a/tests/standalone/io/zlib_test.dart b/tests/standalone/io/zlib_test.dart
index 0c50fc3..1e83af9 100644
--- a/tests/standalone/io/zlib_test.dart
+++ b/tests/standalone/io/zlib_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:expect/expect.dart";
 import 'dart:async';
 import 'dart:io';
 import 'dart:isolate';
diff --git a/tests/standalone/left_shift_bit_and_op_test.dart b/tests/standalone/left_shift_bit_and_op_test.dart
index c9e142a..490881a 100644
--- a/tests/standalone/left_shift_bit_and_op_test.dart
+++ b/tests/standalone/left_shift_bit_and_op_test.dart
@@ -4,6 +4,8 @@
 //
 // Tests optimizing (a << b) & c if c is a Smi constant.
 
+import "package:expect/expect.dart";
+
 main() {
   checkshiftAnd32();
   checkShiftAnd64();
diff --git a/tests/standalone/medium_integer_test.dart b/tests/standalone/medium_integer_test.dart
index 579f721..6f826ca 100644
--- a/tests/standalone/medium_integer_test.dart
+++ b/tests/standalone/medium_integer_test.dart
@@ -5,6 +5,7 @@
 // as Smi's would be used to represent many of the numbers.
 
 library MediumIntegerTest;
+import "package:expect/expect.dart";
 
 
 class MediumIntegerTest {
diff --git a/tests/standalone/number_identity_test.dart b/tests/standalone/number_identity_test.dart
index 4336e81..4e83e46 100644
--- a/tests/standalone/number_identity_test.dart
+++ b/tests/standalone/number_identity_test.dart
@@ -6,6 +6,8 @@
 // Tests 'identical' for cases that not supported in dart2js (bigint,
 // disambiguation int/double).
 
+import "package:expect/expect.dart";
+
 main() {
   for (int i = 0; i < 1000; i++) testNumberIdentity();
 }
diff --git a/tests/standalone/out_of_memory_test.dart b/tests/standalone/out_of_memory_test.dart
index 1fb36f9..91e7c27 100644
--- a/tests/standalone/out_of_memory_test.dart
+++ b/tests/standalone/out_of_memory_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:expect/expect.dart";
+
 void main() {
   var number_of_ints = 134000000;
   var exception_thrown = false;
diff --git a/tests/standalone/package/package_test.dart b/tests/standalone/package/package_test.dart
index c71d54d..b606a23 100644
--- a/tests/standalone/package/package_test.dart
+++ b/tests/standalone/package/package_test.dart
@@ -15,5 +15,7 @@
   lib1();
 
   // Make sure they were all reached successfully.
-  Expect.equals(output, 'main|lib1|lib2|lib3');
+  if (output != 'main|lib1|lib2|lib3') {
+    throw new Error("libraries were not reached successfully");
+  }
 }
diff --git a/tests/standalone/package/packages/package1.dart b/tests/standalone/package/packages/package1.dart
index c409ec5..d0a6081 100644
--- a/tests/standalone/package/packages/package1.dart
+++ b/tests/standalone/package/packages/package1.dart
@@ -9,6 +9,10 @@
 import 'package:package2.dart' as p3;
 
 main() {
-  Expect.identical(p1.x, p2.x);
-  Expect.identical(p1.x, p3.x);
+  if (!identical(p1.x, p2.x)) {
+    throw new Error("Not identical");
+  }
+  if (!identical(p1.x, p3.x)) {
+    throw new Error("Not identical");
+  }
 }
diff --git a/tests/standalone/pow_test.dart b/tests/standalone/pow_test.dart
index 02ad5a3..01f7506 100644
--- a/tests/standalone/pow_test.dart
+++ b/tests/standalone/pow_test.dart
@@ -6,6 +6,7 @@
 
 library pow_test;
 
+import "package:expect/expect.dart";
 import 'dart:math';
 
 var expectedResults =
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 4872967..f17fa0f 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -11,7 +11,6 @@
 [ $runtime == vm ]
 package/package_isolate_test: Fail # http://dartbug.com/7520.
 io/raw_server_socket_cancel_test: Pass, Fail, Timeout # Issue 8675
-debugger/basic_debugger_test: Skip # Issue 8232.
 
 [ $runtime == vm && $checked ]
 # These tests have type errors on purpose.
@@ -26,8 +25,6 @@
 io/directory_fuzz_test: Skip
 
 [ $runtime == vm && $system == macos ]
-io/regress_7191_test: Pass, Timeout # http://dartbug.com/8091
-
 # This test fails with "Too many open files" on the Mac OS buildbot.
 # This is expected as MacOS by default runs with a very low number
 # of allowed open files ('ulimit -n' says something like 256).
diff --git a/tests/standalone/status_expression_test.dart b/tests/standalone/status_expression_test.dart
index 2c6da43..03be619 100644
--- a/tests/standalone/status_expression_test.dart
+++ b/tests/standalone/status_expression_test.dart
@@ -4,6 +4,7 @@
 
 library StatusExpressionTest;
 
+import "package:expect/expect.dart";
 import "../../tools/testing/dart/status_expression.dart";
 
 
@@ -64,7 +65,8 @@
     } on Exception catch (e) {
       thrown = e;
     }
-    Expect.equals("Syntax error in '$input'", thrown.toString());
+    Expect.equals("FormatException: Syntax error in '$input'",
+                  thrown.toString());
   }
 
   static void test4() {
@@ -77,7 +79,8 @@
     } on Exception catch (e) {
       thrown = e;
     }
-    Expect.equals("Syntax error in '$input'", thrown.toString());
+    Expect.equals("FormatException: Syntax error in '$input'",
+                  thrown.toString());
   }
 
   static void test5() {
diff --git a/tests/standalone/typed_array_test.dart b/tests/standalone/typed_array_test.dart
index 4532ee1..007f9ec 100644
--- a/tests/standalone/typed_array_test.dart
+++ b/tests/standalone/typed_array_test.dart
@@ -6,6 +6,7 @@
 
 // Library tag to be able to run in html test framework.
 library TypedArray;
+import "package:expect/expect.dart";
 import 'dart:isolate';
 import 'dart:typeddata';
 
diff --git a/tests/standalone/typed_data_test.dart b/tests/standalone/typed_data_test.dart
index cdbf3bf..62c4425 100644
--- a/tests/standalone/typed_data_test.dart
+++ b/tests/standalone/typed_data_test.dart
@@ -7,6 +7,7 @@
 // Library tag to be able to run in html test framework.
 library TypedDataTest;
 
+import "package:expect/expect.dart";
 import 'dart:typeddata';
 
 void testCreateUint8TypedData() {
@@ -313,6 +314,31 @@
   Expect.equals(5, bytes.where((v) => v > 0).length);
 }
 
+testCreationFromList() {
+  var intList =
+    [-10000000000000000000, -255, -127, 0, 128, 256, 1000000000000000000000];
+  var intLists = [];
+  intLists.add(new Int8List.fromList(intList));
+  intLists.add(new Int16List.fromList(intList));
+  intLists.add(new Int32List.fromList(intList));
+  intLists.add(new Int64List.fromList(intList));
+  intLists.add(new Uint8List.fromList(intList));
+  intLists.add(new Uint16List.fromList(intList));
+  intLists.add(new Uint32List.fromList(intList));
+  intLists.add(new Uint64List.fromList(intList));
+  var doubleList =
+    [-123123123123.123123123123, -123.0, 0.0, 123.0, 123123123123.123123123];
+  var doubleLists = [];
+  doubleLists.add(new Float32List.fromList(doubleList));
+  doubleLists.add(new Float64List.fromList(doubleList));
+  for (var ints in intLists) {
+    for (var doubles in doubleLists) {
+      Expect.throws(() => ints[0] = doubles[0]);
+      Expect.throws(() => doubles[0] = ints[0]);
+    }
+  }
+}
+
 main() {
   for (int i = 0; i < 2000; i++) {
     testCreateUint8TypedData();
@@ -371,5 +397,6 @@
   testExternalClampedUnsignedTypedDataRange(true);
   testViewCreation();
   testWhere();
+  testCreationFromList();
 }
 
diff --git a/tests/standalone/typed_data_view_test.dart b/tests/standalone/typed_data_view_test.dart
index 4ac855b..5e046ec 100644
--- a/tests/standalone/typed_data_view_test.dart
+++ b/tests/standalone/typed_data_view_test.dart
@@ -7,6 +7,7 @@
 // Library tag to be able to run in html test framework.
 library TypedDataTest;
 
+import "package:expect/expect.dart";
 import 'dart:typeddata';
 
 validate(TypedData list, num expected) {
diff --git a/tests/utils/json_test.dart b/tests/utils/json_test.dart
index f4b6521..7d350e3 100644
--- a/tests/utils/json_test.dart
+++ b/tests/utils/json_test.dart
@@ -4,6 +4,7 @@
 
 library jsonTest;
 
+import "package:expect/expect.dart";
 import 'dart:json';
 
 main() {
diff --git a/tests/utils/recursive_import_test.dart b/tests/utils/recursive_import_test.dart
index b3020c5..2c707e7 100644
--- a/tests/utils/recursive_import_test.dart
+++ b/tests/utils/recursive_import_test.dart
@@ -4,6 +4,7 @@
 
 // Test of "recursive" imports using the dart2js compiler API.
 
+import "package:expect/expect.dart";
 import 'dart:async';
 import '../../sdk/lib/_internal/compiler/compiler.dart';
 import 'dart:uri';
diff --git a/tests/utils/uri_test.dart b/tests/utils/uri_test.dart
index a5f0c23..3653d2a 100644
--- a/tests/utils/uri_test.dart
+++ b/tests/utils/uri_test.dart
@@ -4,6 +4,7 @@
 
 library uriTest;
 
+import "package:expect/expect.dart";
 import 'dart:utf';
 import 'dart:uri';
 
diff --git a/tests/utils/utils.status b/tests/utils/utils.status
index efd167c..376aa7e 100644
--- a/tests/utils/utils.status
+++ b/tests/utils/utils.status
@@ -6,7 +6,7 @@
 dummy_compiler_test: Slow, Pass
 recursive_import_test: Slow, Pass
 
-[ $compiler == dart2js && $checked ]
+[ $compiler == dart2js && $checked]
 dummy_compiler_test: Slow, Fail # http://dartbug.com/9687
 
 [ $compiler == none && $runtime == drt ]
diff --git a/tools/VERSION b/tools/VERSION
index 96004c7..e4e6452 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 0
 MINOR 4
-BUILD 5
-PATCH 3
+BUILD 6
+PATCH 0
diff --git a/tools/bots/compiler.py b/tools/bots/compiler.py
index ff1eb33..3de5b93 100644
--- a/tools/bots/compiler.py
+++ b/tools/bots/compiler.py
@@ -210,7 +210,9 @@
     # The dart2js compiler isn't self-hosted (yet) so we run its
     # unit tests on the VM. We avoid doing this on the builders
     # that run the browser tests to cut down on the cycle time.
-    TestStep("dart2js_unit", mode, system, 'none', 'vm', ['dart2js'], flags)
+    TestStep("dart2js_unit", mode, system, 'none', 'vm', ['dart2js'],
+             # Run the unit tests in checked mode (the VM's checked mode).
+             ['--checked'])
 
   if system.startswith('win') and runtime.startswith('ie10'):
     TestStep("dart2js", mode, system, 'dart2js', runtime, ['html'], flags)
@@ -220,7 +222,13 @@
 
     # TODO(kasperl): Consider running peg and css tests too.
     extras = ['dart2js_extra', 'dart2js_native', 'dart2js_foreign']
-    TestStep("dart2js_extra", mode, system, 'dart2js', runtime, extras, flags)
+    extras_flags = flags
+    if system == 'linux' and runtime == 'd8':
+      # Run the extra tests in checked mode, but only on linux/d8.
+      # Other systems have less resources and tend to time out.
+      extras_flags = extras_flags + ['--host-checked']
+    TestStep("dart2js_extra", mode, system, 'dart2js', runtime, extras,
+             extras_flags)
 
 
 def _DeleteTempWebdriverProfiles(directory):
diff --git a/tools/build.py b/tools/build.py
index 414f980..2ee32d6 100755
--- a/tools/build.py
+++ b/tools/build.py
@@ -7,6 +7,7 @@
 
 import optparse
 import os
+import re
 import shutil
 import subprocess
 import sys
@@ -267,21 +268,30 @@
     # The capability "clr_eol" means clear the line from cursor to end
     # of line.  See man pages for tput and terminfo.
     try:
-      clr_eol = subprocess.check_output(['tput', '-T' + term, 'el'],
-                                        stderr=subprocess.STDOUT)
+      with open('/dev/null', 'a') as dev_null:
+        clr_eol = subprocess.check_output(['tput', '-T' + term, 'el'],
+                                          stderr=dev_null)
       if clr_eol:
         is_fancy_tty = True
     except subprocess.CalledProcessError:
       is_fancy_tty = False
     except AttributeError:
       is_fancy_tty = False
+  pattern = re.compile(r'=== BUILD .* TARGET (.*) OF PROJECT (.*) WITH ' +
+                       r'CONFIGURATION (.*) ===')
+  has_interesting_info = False
   for line in unbuffered(process.stdout.readline):
     line = line.rstrip()
     if line.startswith('=== BUILD ') or line.startswith('** BUILD '):
-      if not is_empty_chunk(chunk):
-        print '\n'.join(chunk)
+      has_interesting_info = False
       section = line
       if is_fancy_tty:
+        match = re.match(pattern, section)
+        if match:
+          section = '%s/%s/%s' % (
+            match.group(3), match.group(2), match.group(1))
+        # Truncate to avoid extending beyond 80 columns.
+        section = section[:80]
         # If stdout is a terminal, emit "progress" information.  The
         # progress information is the first line of the current chunk.
         # After printing the line, move the cursor back to the
@@ -293,10 +303,19 @@
         # overwrites a longer line.
         print '%s%s\r' % (clr_eol, section),
       chunk = []
-    if not section:
+    if not section or has_interesting_info:
       print line
     else:
-      chunk.append(line)
+      length = len(chunk)
+      if length == 1 and line != 'Check dependencies':
+        has_interesting_info = True
+      elif (length == 2 or length == 3) and line:
+        has_interesting_info = True
+      if has_interesting_info:
+        print '\n'.join(chunk)
+        chunk = []
+      else:
+        chunk.append(line)
   if not is_empty_chunk(chunk):
     print '\n'.join(chunk)
 
@@ -325,6 +344,7 @@
   for target_os in options.os:
     for mode in options.mode:
       for arch in options.arch:
+        os.environ['DART_BUILD_MODE'] = mode
         build_config = utils.GetBuildConf(mode, arch)
         if HOST_OS == 'macos':
           filter_xcodebuild_output = True
diff --git a/tools/create_sdk.py b/tools/create_sdk.py
index c3aeed9..942b57c 100755
--- a/tools/create_sdk.py
+++ b/tools/create_sdk.py
@@ -18,6 +18,8 @@
 # ......dart2js
 # ......dart_analyzer
 # ......pub
+# ......snapshots/
+# ........utils_wrapper.dart.snapshot
 # ....include/
 # ......dart_api.h
 # ......dart_debugger_api.h
@@ -53,7 +55,7 @@
 # ......(more will come here)
 
 
-
+import optparse
 import os
 import re
 import sys
@@ -69,6 +71,16 @@
 # TODO(dgrove): Only import modules following Google style guide.
 from shutil import copyfile, copymode, copytree, ignore_patterns, rmtree, move
 
+
+def GetOptions():
+  options = optparse.OptionParser(usage='usage: %prog [options]')
+  options.add_option("--sdk_output_dir",
+      help='Where to output the sdk')
+  options.add_option("--utils_snapshot_location",
+      help='Location of the utils snapshot.')
+  return options.parse_args()
+
+
 def ReplaceInFiles(paths, subs):
   '''Reads a series of files, applies a series of substitutions to each, and
      saves them back out. subs should by a list of (pattern, replace) tuples.'''
@@ -99,33 +111,28 @@
   Copy(src, dest)
 
 
-def CopyDartScripts(home, build_dir, sdk_root, version):
-  if version:
-    ReplaceInFiles([os.path.join(sdk_root, 'lib', '_internal', 'compiler',
-                                 'implementation', 'compiler.dart')],
-                   [(r"BUILD_ID = 'build number could not be determined'",
-                     r"BUILD_ID = '%s'" % version)])
+def CopyDartScripts(home, sdk_root):
   # TODO(dgrove) - add pub once issue 6619 is fixed
   for executable in ['dart2js', 'dartdoc']:
     CopyShellScript(os.path.join(home, 'sdk', 'bin', executable),
                     os.path.join(sdk_root, 'bin'))
 
-  subprocess.call([os.path.join(build_dir, 'dart'),
-                   '--generate-script-snapshot=%s' %
-                   os.path.join(sdk_root, 'lib', '_internal', 'compiler',
-                                'implementation', 'dart2js.dart.snapshot'),
-                   os.path.join(sdk_root, 'lib', '_internal', 'compiler',
-                                'implementation', 'dart2js.dart')])
 
+def CopySnapshots(snapshot, sdk_root):
+  copyfile(snapshot, join(sdk_root, 'bin', 'snapshots', basename(snapshot)))
 
 
 def Main(argv):
-  # Pull in all of the gpyi files which will be munged into the sdk.
+  # Pull in all of the gypi files which will be munged into the sdk.
   HOME = dirname(dirname(realpath(__file__)))
 
-  SDK = argv[1]
+  (options, args) = GetOptions()
+
+  SDK = options.sdk_output_dir
   SDK_tmp = '%s.tmp' % SDK
 
+  SNAPSHOT = options.utils_snapshot_location
+
   # TODO(dgrove) - deal with architectures that are not ia32.
 
   if exists(SDK):
@@ -140,11 +147,13 @@
   BIN = join(SDK_tmp, 'bin')
   os.makedirs(BIN)
 
+  os.makedirs(join(BIN, 'snapshots'))
+
   # Copy the Dart VM binary and the Windows Dart VM link library
   # into sdk/bin.
   #
   # TODO(dgrove) - deal with architectures that are not ia32.
-  build_dir = os.path.dirname(argv[1])
+  build_dir = os.path.dirname(SDK)
   dart_file_extension = ''
   analyzer_file_extension = ''
   if HOST_OS == 'win32':
@@ -199,7 +208,9 @@
   #
 
   os.makedirs(join(LIB, 'html'))
-  for library in ['_internal', 'async', 'collection', '_collection_dev', 'core',
+
+  for library in ['_internal',
+                  'async', 'collection', '_collection_dev', 'core',
                   'crypto', 'io', 'isolate',
                   join('chrome', 'dart2js'), join('chrome', 'dartium'),
                   join('html', 'dart2js'), join('html', 'dartium'),
@@ -214,7 +225,6 @@
     copytree(join(HOME, 'sdk', 'lib', library), join(LIB, library),
              ignore=ignore_patterns('*.svn', 'doc', '*.py', '*.gypi', '*.sh'))
 
-
   # Create and copy packages.
   PACKAGES = join(SDK_tmp, 'packages')
   os.makedirs(PACKAGES)
@@ -224,7 +234,7 @@
   #
 
   for library in ['args', 'http', 'intl', 'logging', 'meta', 'oauth2', 'pathos',
-                  'serialization', 'unittest', 'yaml']:
+                  'serialization', 'unittest', 'yaml', 'analyzer_experimental']:
 
     copytree(join(HOME, 'pkg', library, 'lib'), join(PACKAGES, library),
              ignore=ignore_patterns('*.svn'))
@@ -269,12 +279,12 @@
        "7zip/7za.exe"),
     ])
 
-  version = utils.GetVersion()
-
   # Copy dart2js/dartdoc/pub.
-  CopyDartScripts(HOME, build_dir, SDK_tmp, version)
+  CopyDartScripts(HOME, SDK_tmp)
+  CopySnapshots(SNAPSHOT, SDK_tmp)
 
   # Write the 'version' file
+  version = utils.GetVersion()
   versionFile = open(os.path.join(SDK_tmp, 'version'), 'w')
   versionFile.write(version + '\n')
   versionFile.close()
diff --git a/tools/ddbg.dart b/tools/ddbg.dart
index c92174c..e79e294 100644
--- a/tools/ddbg.dart
+++ b/tools/ddbg.dart
@@ -15,18 +15,16 @@
 
 Socket vmSock;
 String vmData;
-StreamSubscription<String> streamSubscription;
+var stdinSubscription;
+var vmSubscription;
 int seqNum = 0;
 int isolate_id = -1;
 
-bool verbose = false;
+final verbose = false;
+final printMessages = false;
 
-// The current stack trace, while the VM is paused. It's a list
-// of activation frames.
-List stackTrace;
-
-// The current activation frame, while the VM is paused.
-Map curFrame;
+// The location of the last paused event.
+Map pausedLocation = null;
 
 
 void printHelp() {
@@ -48,6 +46,7 @@
   pg <id> Print all global variables visible within given library id
   ls <lib_id> List loaded scripts in library
   gs <lib_id> <script_url> Get source text of script in library
+  tok <lib_id> <script_url> Get line and token table of script in library
   epi <none|all|unhandled>  Set exception pause info
   i <id> Interrupt execution of given isolate id
   h   Print help
@@ -56,9 +55,9 @@
 
 
 void quitShell() {
-  streamSubscription.cancel();
+  vmSubscription.cancel();
   vmSock.close();
-  stdin.close();
+  stdinSubscription.cancel();
 }
 
 
@@ -88,7 +87,6 @@
                 "command": simple_commands[command],
                 "params": { "isolateId" : isolate_id } };
     sendCmd(cmd).then((result) => handleGenericResponse(result));
-    stackTrace = curFrame = null;
   } else if (command == "bt") {
     var cmd = { "id": seqNum,
                 "command": "getStackTrace",
@@ -101,8 +99,9 @@
     sendCmd(cmd).then((result) => handleGetLibraryResponse(result));
   } else if (command == "sbp" && args.length >= 2) {
     var url, line;
-    if (args.length == 2) {
-      url = stackTrace[0]["location"]["url"];
+    if (args.length == 2 && pausedLocation != null) {
+      url = pausedLocation["url"];
+      assert(url != null);
       line = int.parse(args[1]);
     } else {
       url = args[1];
@@ -181,6 +180,13 @@
                             "libraryId": int.parse(args[1]),
                             "url": args[2] } };
     sendCmd(cmd).then((result) => handleGetSourceResponse(result));
+  } else if (command == "tok" && args.length == 3) {
+    var cmd = { "id": seqNum,
+                "command":  "getLineNumberTable",
+                "params": { "isolateId" : isolate_id,
+                            "libraryId": int.parse(args[1]),
+                            "url": args[2] } };
+    sendCmd(cmd).then((result) => handleGetLineTableResponse(result));
   } else if (command == "epi" && args.length == 2) {
     var cmd = { "id": seqNum,
                 "command":  "setPauseOnException",
@@ -324,6 +330,13 @@
 }
 
 
+handleGetLineTableResponse(response) {
+  Map result = response["result"];
+  var info = result["lines"];
+  print("Line info table:\n$info");
+}
+
+
 void handleGetLibraryResponse(response) {
   Map result = response["result"];
   List libs = result["libraries"];
@@ -391,13 +404,13 @@
 void handlePausedEvent(msg) {
   assert(msg["params"] != null);
   var reason = msg["params"]["reason"];
-  isolate_id = msg["params"]["id"];
-  stackTrace = msg["params"]["callFrames"];
-  assert(stackTrace != null);
-  assert(stackTrace.length >= 1);
-  curFrame = stackTrace[0];
+  isolate_id = msg["params"]["isolateId"];
+  assert(isolate_id != null);
+  pausedLocation = msg["params"]["location"];
+  assert(pausedLocation != null);
   if (reason == "breakpoint") {
     print("Isolate $isolate_id paused on breakpoint");
+    print("location: $pausedLocation");
   } else if (reason == "interrupted") {
     print("Isolate $isolate_id paused due to an interrupt");
   } else {
@@ -406,8 +419,6 @@
     print("Isolate $isolate_id paused on exception");
     print(remoteObject(excObj));
   }
-  print("Stack trace:");
-  printStackTrace(stackTrace);
 }
 
 
@@ -448,14 +459,32 @@
   }
 }
 
+bool haveGarbageVmData() {
+  if (vmData == null || vmData.length == 0) return false;
+  var i = 0, char = " ";
+  while (i < vmData.length) {
+    char = vmData[i];
+    if (char != " " && char != "\n" && char != "\r" && char != "\t") break;
+    i++;
+  }
+  if (i >= vmData.length) {
+    return false;
+  } else { 
+    return char != "{";
+  }
+}
+
 
 void processVmData(String data) {
-  final printMessages = false;
   if (vmData == null || vmData.length == 0) {
     vmData = data;
   } else {
     vmData = vmData + data;
   }
+  if (haveGarbageVmData()) {
+    print("Error: have garbage data from VM: '$vmData'");
+    return;
+  }
   int msg_len = jsonObjectLength(vmData);
   if (printMessages && msg_len == 0) {
     print("have partial or illegal json message"
@@ -472,8 +501,13 @@
     if (printMessages) { print("at least one message: '$vmData'"); }
     var msg = vmData.substring(0, msg_len);
     if (printMessages) { print("first message: $msg"); }
-    processVmMessage(msg);
     vmData = vmData.substring(msg_len);
+    if (haveGarbageVmData()) {
+      print("Error: garbage data after previous message: '$vmData'");
+      print("Previous message was: '$msg'");
+      return;
+    }
+    processVmMessage(msg);
     msg_len = jsonObjectLength(vmData);
   }
   if (printMessages) { print("leftover vm data '$vmData'"); }
@@ -530,8 +564,8 @@
   outstandingCommands = new Map<int, Completer>();
   Socket.connect("127.0.0.1", 5858).then((s) {
     vmSock = s;
-    Stream<String> stringStream = vmSock.transform(new StringDecoder());
-    streamSubscription = stringStream.listen(
+    var stringStream = vmSock.transform(new StringDecoder());
+    vmSubscription = stringStream.listen(
         (String data) {
           processVmData(data);
         },
@@ -543,9 +577,9 @@
           print("Error in debug connection: $err");
           quitShell();
         });
-    stdin.transform(new StringDecoder())
-        .transform(new LineTransformer())
-        .listen((String line) => processCommand(line));
+    stdinSubscription = stdin.transform(new StringDecoder())
+                             .transform(new LineTransformer())
+                             .listen((String line) => processCommand(line));
   });
 }
 
diff --git a/tools/dom/docs/docs.json b/tools/dom/docs/docs.json
index 568e824..4b67a76 100644
--- a/tools/dom/docs/docs.json
+++ b/tools/dom/docs/docs.json
@@ -11,7 +11,7 @@
         " * Example usage:",
         " *",
         " *     var canvas = new CanvasElement(width: 600, height: 600);",
-        " *     var ctx = canvas.context2d;",
+        " *     var ctx = canvas.context2D;",
         " *     ctx.clearRect(0, 0, 600, 600);",
         " *     ctx.save();",
         " *     // Create radial gradient.",
@@ -56,7 +56,7 @@
         " * Example usage:",
         " *",
         " *     var canvas = new CanvasElement(width: 600, height: 600);",
-        " *     var ctx = canvas.context2d;",
+        " *     var ctx = canvas.context2D;",
         " *     var img = new ImageElement();",
         " *     // Image src needs to be loaded before pattern is applied.",
         " *     img.onLoad.listen((event) {",
@@ -92,6 +92,28 @@
         ]
       }
     },
+    "Clipboard": {
+      "members": {
+        "getData": [
+          "/**",
+          "   * Gets the data for the specified type.",
+          "   *",
+          "   * The data is only available from within a drop operation (such as an",
+          "   * [Element.onDrop] event) and will return `null` before the event is",
+          "   * triggered.",
+          "   *",
+          "   * Data transfer is prohibited across domains. If a drag originates",
+          "   * from content from another domain or protocol (HTTP vs HTTPS) then the",
+          "   * data cannot be accessed.",
+          "   *",
+          "   * The [type] can have values such as:",
+          "   *",
+          "   * * `'Text'`",
+          "   * * `'URL'`",
+          "   */"
+        ]
+      }
+    },
     "Document": {
       "members": {
         "body": [
@@ -232,7 +254,7 @@
           "   * Example usage:",
           "   *",
           "   *     CanvasElement canvas = new CanvasElement();",
-          "   *     var ctx = canvas.context2d",
+          "   *     var ctx = canvas.context2D",
           "   *     ..fillStyle = \"rgb(200,0,0)\"",
           "   *     ..fillRect(10, 10, 55, 50);",
           "   *     var dataUrl = canvas.toDataURL(\"image/jpeg\", 0.95);",
@@ -343,30 +365,6 @@
         " */"
       ]
     },
-    "WorkerContext": {
-      "members": {
-        "webkitRequestFileSystem": [
-          "/**",
-          "   * Access a sandboxed file system of the specified `size`. If `persistent` is",
-          "   * true, the application will request permission from the user to create",
-          "   * lasting storage. This storage cannot be freed without the user's",
-          "   * permission. Returns a [Future] whose value stores a reference to the",
-          "   * sandboxed file system for use. Because the file system is sandboxed,",
-          "   * applications cannot access file systems created in other web pages. ",
-          "   */"
-        ],
-        "webkitRequestFileSystemSync": [
-          "/**",
-          "   * Access a sandboxed file system of the specified `size`. If `persistent` is",
-          "   * true, the application will request permission from the user to create",
-          "   * lasting storage. This storage cannot be freed without the user's",
-          "   * permission. This call will block until a reference to the synchronous file ",
-          "   * system API has been obtained. Because the file system is sandboxed,",
-          "   * applications cannot access file systems created in other web pages. ",
-          "   */"
-        ]
-      }
-    },
     "XMLHttpRequest": {
       "members": {
         "abort": [
diff --git a/tools/dom/scripts/dartdomgenerator.py b/tools/dom/scripts/dartdomgenerator.py
index 149ae86..6af0d7d 100755
--- a/tools/dom/scripts/dartdomgenerator.py
+++ b/tools/dom/scripts/dartdomgenerator.py
@@ -20,7 +20,8 @@
 from htmleventgenerator import HtmlEventGenerator
 from htmlrenamer import HtmlRenamer
 from systemhtml import DartLibraryEmitter, Dart2JSBackend,\
-                       HtmlDartInterfaceGenerator, DartLibrary, DartLibraries
+                       HtmlDartInterfaceGenerator, DartLibrary, DartLibraries,\
+                       HTML_LIBRARY_NAMES
 from systemnative import CPPLibraryEmitter, DartiumBackend
 from templateloader import TemplateLoader
 
@@ -29,9 +30,6 @@
 
 _logger = logging.getLogger('dartdomgenerator')
 
-_libraries = ['chrome', 'html', 'indexed_db', 'svg', 'web_audio', 'web_gl',
-    'web_sql']
-
 class GeneratorOptions(object):
   def __init__(self, templates, database, type_registry, renamer):
     self.templates = templates
@@ -102,7 +100,7 @@
 
     dart_output_dir = os.path.join(dart2js_output_dir, 'dart')
     dart_libraries = DartLibraries(
-        _libraries, template_loader, 'dart2js', dart2js_output_dir)
+        HTML_LIBRARY_NAMES, template_loader, 'dart2js', dart2js_output_dir)
 
     RunGenerator(dart_libraries, dart_output_dir,
         template_loader, backend_factory)
@@ -121,7 +119,7 @@
 
     dart_output_dir = os.path.join(dartium_output_dir, 'dart')
     dart_libraries = DartLibraries(
-        _libraries, template_loader, 'dartium', dartium_output_dir)
+        HTML_LIBRARY_NAMES, template_loader, 'dartium', dartium_output_dir)
 
     RunGenerator(dart_libraries, dart_output_dir,
                  template_loader, backend_factory)
@@ -195,13 +193,13 @@
 
   if 'htmldart2js' in systems:
     _logger.info('Generating dart2js single files.')
-    for library_name in _libraries:
+    for library_name in HTML_LIBRARY_NAMES:
       GenerateSingleFile(
           os.path.join(dart2js_output_dir, '%s_dart2js.dart' % library_name),
           os.path.join('..', '..', '..', 'sdk', 'lib', library_name, 'dart2js'))
   if 'htmldartium' in systems:
     _logger.info('Generating dartium single files.')
-    for library_name in _libraries:
+    for library_name in HTML_LIBRARY_NAMES:
       GenerateSingleFile(
           os.path.join(dartium_output_dir, '%s_dartium.dart' % library_name),
           os.path.join('..', '..', '..', 'sdk', 'lib', library_name, 'dartium'))
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index 2258962..1ab6c53 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -493,10 +493,8 @@
     'any set IDBCursor.update': _serialize_SSV,
 
     # postMessage
-    'any set DedicatedWorkerContext.postMessage': _serialize_SSV,
     'any set MessagePort.postMessage': _serialize_SSV,
     'SerializedScriptValue set DOMWindow.postMessage': _serialize_SSV,
-    'SerializedScriptValue set Worker.postMessage': _serialize_SSV,
 
     # receiving message via MessageEvent
     '* get MessageEvent.data':
@@ -594,7 +592,6 @@
 
     'DOMWindow.openDatabase': [
       "@Creates('SqlDatabase')",
-      "@Creates('SqlDatabaseSync')",
     ],
 
     # To be in callback with the browser-created Event, we had to have called
@@ -898,13 +895,7 @@
   'WebKitCSSMatrix': _webkit_experimental_annotations,
   'WebKitPoint': _webkit_experimental_annotations,
   'WebSocket': _all_but_ie9_annotations,
-  'WorkerContext.indexedDB': _indexed_db_annotations,
-  'WorkerContext.openDatabase': _web_sql_annotations,
-  'WorkerContext.openDatabaseSync': _web_sql_annotations,
-  'WorkerContext.webkitRequestFileSystem': _file_system_annotations,
-  'WorkerContext.webkitRequestFileSystemSync': _file_system_annotations,
-  'WorkerContext.webkitResolveLocalFileSystemSyncURL': _file_system_annotations,
-  'WorkerContext.webkitResolveLocalFileSystemURL': _file_system_annotations,
+  'Worker': _all_but_ie9_annotations,
   'XMLHttpRequest.onloadend': _all_but_ie9_annotations,
   'XMLHttpRequest.onprogress': _all_but_ie9_annotations,
   'XMLHttpRequest.response': _all_but_ie9_annotations,
@@ -1454,8 +1445,6 @@
         suppress_interface=True),
     'HTMLAllCollection': TypeData(clazz='Interface', item_type='Node'),
     'HTMLCollection': TypeData(clazz='Interface', item_type='Node'),
-    'MediaStreamList': TypeData(clazz='Interface',
-        item_type='MediaStream', suppress_interface=True),
     'NamedNodeMap': TypeData(clazz='Interface', item_type='Node'),
     'NodeList': TypeData(clazz='Interface', item_type='Node',
                          suppress_interface=False, dart_type='List<Node>'),
diff --git a/tools/dom/scripts/htmleventgenerator.py b/tools/dom/scripts/htmleventgenerator.py
index 64063b3..7f64f1b 100644
--- a/tools/dom/scripts/htmleventgenerator.py
+++ b/tools/dom/scripts/htmleventgenerator.py
@@ -161,16 +161,16 @@
   'Notification.close': ('close', 'Event'),
   'Notification.display': ('display', 'Event'),
   'Notification.show': ('show', 'Event'),
+  'RTCDTMFSender.tonechange': ('toneChange', 'RtcDtmfToneChangeEvent'),
   'RTCDataChannel.close': ('close', 'Event'),
   'RTCDataChannel.open': ('open', 'Event'),
   'RTCPeerConnection.addstream': ('addStream', 'MediaStreamEvent'),
   'RTCPeerConnection.datachannel': ('dataChannel', 'RtcDataChannelEvent'),
   'RTCPeerConnection.icecandidate': ('iceCandidate', 'RtcIceCandidateEvent'),
-  'RTCPeerConnection.icechange': ('iceChange', 'Event'),
-  'RTCPeerConnection.gatheringchange': ('gatheringChange', 'Event'),
+  'RTCPeerConnection.iceconnectionstatechange': ('iceConnectionStateChange', 'Event'),
   'RTCPeerConnection.negotiationneeded': ('negotiationNeeded', 'Event'),
   'RTCPeerConnection.removestream': ('removeStream', 'MediaStreamEvent'),
-  'RTCPeerConnection.statechange': ('stateChange', 'Event'),
+  'RTCPeerConnection.signalingstatechange': ('signalingStateChange', 'Event'),
   'SharedWorkerContext.connect': ('connect', 'Event'),
   'SpeechRecognition.audioend': ('audioEnd', 'Event'),
   'SpeechRecognition.audiostart': ('audioStart', 'Event'),
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index 8b696d6..2604dd9 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -14,7 +14,6 @@
     'DOMApplicationCache': 'ApplicationCache',
     'DOMCoreException': 'DomException',
     'DOMFileSystem': 'FileSystem',
-    'DOMFileSystemSync': 'FileSystemSync',
     'DOMFormData': 'FormData',
     'DOMURL': 'Url',
     'DOMWindow': 'Window',
@@ -32,26 +31,22 @@
     'NotificationPermissionCallback': '_NotificationPermissionCallback',
     'PositionCallback': '_PositionCallback',
     'PositionErrorCallback': '_PositionErrorCallback',
-    'Rect': 'CssRect',
-    'RGBColor': 'CssRgbColor',
     'RTCDTMFSender': 'RtcDtmfSender',
     'RTCDTMFToneChangeEvent': 'RtcDtmfToneChangeEvent',
     'RTCErrorCallback': '_RtcErrorCallback',
     'RTCSessionDescriptionCallback': '_RtcSessionDescriptionCallback',
-    'StorageInfoErrorCallback': '_StorageInfoErrorCallback',
-    'StorageInfoUsageCallback': '_StorageInfoUsageCallback',
     'StringCallback': '_StringCallback',
     'SVGDocument': 'SvgDocument', # Manual to avoid name conflicts.
     'SVGElement': 'SvgElement', # Manual to avoid name conflicts.
     'SVGException': 'SvgException', # Manual of avoid conflict with Exception.
+    'SVGGradientElement': '_GradientElement',
     'SVGSVGElement': 'SvgSvgElement', # Manual to avoid name conflicts.
     'WebGLVertexArrayObjectOES': 'VertexArrayObject',
     'WebKitAnimationEvent': 'AnimationEvent',
     'WebKitCSSKeyframeRule': 'CssKeyframeRule',
     'WebKitCSSKeyframesRule': 'CssKeyframesRule',
-    'WebKitCSSMatrix': 'CssMatrix',
     'WebKitCSSTransformValue': 'CssTransformValue',
-    'WebKitPoint': 'DomPoint',
+    'WebKitPoint': '_DomPoint',
     'WebKitTransitionEvent': '_WebKitTransitionEvent',
     'XMLHttpRequest': 'HttpRequest',
     'XMLHttpRequestException': 'HttpRequestException',
@@ -62,6 +57,18 @@
 # Interfaces that are suppressed, but need to still exist for Dartium and to
 # properly wrap DOM objects if/when encountered.
 _removed_html_interfaces = [
+  'CSSPrimitiveValue',
+  'CSSValue',
+  'Counter',
+  'DOMFileSystemSync', # Workers
+  'DatabaseSync', # Workers
+  'DedicatedWorkerContext', # Workers
+  'DirectoryEntrySync', # Workers
+  'DirectoryReaderSync', # Workers
+  'EntrySync', # Workers
+  'FileEntrySync', # Workers
+  'FileReaderSync', # Workers
+  'FileWriterSync', # Workers
   'HTMLAppletElement',
   'HTMLBaseFontElement',
   'HTMLDirectoryElement',
@@ -70,12 +77,16 @@
   'HTMLFrameSetElement',
   'HTMLMarqueeElement',
   'IDBAny',
+  'RGBColor',
+  'Rect',
+  'SQLTransactionSync', # Workers
+  'SQLTransactionSyncCallback', # Workers
   'SVGAltGlyphDefElement', # Webkit only.
   'SVGAltGlyphItemElement', # Webkit only.
   'SVGAnimateColorElement', # Deprecated. Use AnimateElement instead.
+  'SVGColor',
   'SVGComponentTransferFunctionElement', # Currently not supported anywhere.
   'SVGCursorElement', # Webkit only.
-  'SVGGradientElement', # Currently not supported anywhere.
   'SVGFEDropShadowElement', # Webkit only for the following:
   'SVGFontElement',
   'SVGFontFaceElement',
@@ -86,10 +97,20 @@
   'SVGGlyphElement',
   'SVGGlyphRefElement',
   'SVGHKernElement',
-  'SVGMissingGlyphElement',
   'SVGMPathElement',
+  'SVGPaint',
+  'SVGMissingGlyphElement',
   'SVGTRefElement',
   'SVGVKernElement',
+  'SharedWorker', # Workers
+  'SharedWorkerContext', # Workers
+  'WebKitCSSFilterValue',
+  'WebKitCSSMatrix',
+  'WebKitCSSMixFunctionValue',
+  'WebKitCSSTransformValue',
+  'WorkerContext', # Workers
+  'WorkerLocation', # Workers
+  'WorkerNavigator', # Workers
 ]
 
 for interface in _removed_html_interfaces:
@@ -237,7 +258,6 @@
   'Node.childNodes',
   'Node.firstChild',
   'Node.lastChild',
-  'Node.localName',
   'Node.namespaceURI',
   'Node.removeChild',
   'Node.replaceChild',
@@ -287,8 +307,8 @@
     'DOMWindow.clearInterval': '_clearInterval',
     'DOMWindow.setTimeout': '_setTimeout',
     'DOMWindow.setInterval': '_setInterval',
-    'DOMWindow.webkitConvertPointFromNodeToPage': 'convertPointFromNodeToPage',
-    'DOMWindow.webkitConvertPointFromPageToNode': 'convertPointFromPageToNode',
+    'DOMWindow.webkitConvertPointFromNodeToPage': '_convertPointFromNodeToPage',
+    'DOMWindow.webkitConvertPointFromPageToNode': '_convertPointFromPageToNode',
     'DOMWindow.webkitNotifications': 'notifications',
     'DOMWindow.webkitRequestFileSystem': '_requestFileSystem',
     'DOMWindow.webkitResolveLocalFileSystemURL': 'resolveLocalFileSystemUrl',
@@ -306,15 +326,10 @@
     'RTCPeerConnection.createAnswer': '_createAnswer',
     'RTCPeerConnection.createOffer': '_createOffer',
     'StorageInfo.queryUsageAndQuota': '_queryUsageAndQuota',
-    'SVGComponentTransferFunctionElement.offset': 'gradientOffset',
     'SVGElement.className': '$dom_svgClassName',
     'SVGStopElement.offset': 'gradientOffset',
-    'WorkerContext.webkitRequestFileSystem': '_requestFileSystem',
-    'WorkerContext.webkitRequestFileSystemSync': '_requestFileSystemSync',
-    'WorkerContext.webkitResolveLocalFileSystemSyncURL':
-        'resolveLocalFileSystemSyncUrl',
-    'WorkerContext.webkitResolveLocalFileSystemURL':
-        'resolveLocalFileSystemUrl',
+    #'WorkerContext.webkitRequestFileSystem': '_requestFileSystem', # Workers
+    #'WorkerContext.webkitRequestFileSystemSync': '_requestFileSystemSync', # Workers
 })
 
 for member in convert_to_future_members:
@@ -332,6 +347,7 @@
 # TODO(jacobr): cleanup and augment this list.
 _removed_html_members = monitored.Set('htmlrenamer._removed_html_members', [
     'Attr.*',
+    'CSSStyleDeclaration.getPropertyCSSValue',
     'CanvasRenderingContext2D.clearShadow',
     'CanvasRenderingContext2D.drawImageFromRect',
     'CanvasRenderingContext2D.setAlpha',
@@ -347,10 +363,11 @@
     'CanvasRenderingContext2D.webkitLineDashOffset',
     'CharacterData.remove',
     'DOMWindow.call:blur',
-    'DOMWindow.clientInformation',
     'DOMWindow.call:focus',
+    'DOMWindow.clientInformation',
     'DOMWindow.get:frames',
     'DOMWindow.get:length',
+    'DOMWindow.on:beforeUnload',
     'DOMWindow.prompt',
     'DOMWindow.webkitCancelAnimationFrame',
     'DOMWindow.webkitCancelRequestAnimationFrame',
@@ -448,6 +465,7 @@
     'Element.set:outerHTML',
     'Element.setAttributeNode',
     'Element.setAttributeNodeNS',
+    'Event.returnValue',
     'Event.srcElement',
     'EventSource.URL',
     'HTMLAnchorElement.charset',
@@ -463,6 +481,7 @@
     'HTMLBodyElement.background',
     'HTMLBodyElement.bgColor',
     'HTMLBodyElement.link',
+    'HTMLBodyElement.on:beforeUnload',
     'HTMLBodyElement.text',
     'HTMLBodyElement.vLink',
     'HTMLDListElement.compact',
@@ -517,7 +536,6 @@
     'HTMLPreElement.width',
     'HTMLScriptElement.text',
     'HTMLSelectElement.options',
-    'HTMLSelectElement.remove',
     'HTMLSelectElement.selectedOptions',
     'HTMLTableCaptionElement.align',
     'HTMLTableCellElement.abbr',
@@ -592,6 +610,7 @@
     'Node.set:nodeValue',
     'NodeList.item',
     'ShadowRoot.getElementsByTagNameNS',
+    'SVGStyledElement.getPresentationAttribute',
     'WheelEvent.wheelDelta',
     'WorkerContext.webkitIndexedDB',
 # TODO(jacobr): should these be removed?
@@ -611,6 +630,10 @@
     self._database = database
 
   def RenameInterface(self, interface):
+    if 'Callback' in interface.ext_attrs:
+      if interface.id in _removed_html_interfaces:
+        return None
+
     if interface.id in html_interface_renames:
       return html_interface_renames[interface.id]
     elif interface.id.startswith('HTML'):
@@ -655,8 +678,15 @@
     if self._FindMatch(interface, member, member_prefix,
         _removed_html_members):
       return True
+    if interface.id in _removed_html_interfaces:
+      return True
     return False
 
+  def ShouldSuppressInterface(self, interface):
+    """ Returns true if the interface should be suppressed."""
+    if interface.id in _removed_html_interfaces:
+      return True
+
   def _FindMatch(self, interface, member, member_prefix, candidates):
     for interface in self._database.Hierarchy(interface):
       member_name = interface.id + '.' + member
@@ -674,6 +704,11 @@
     if interface.id in _library_names:
       return _library_names[interface.id]
 
+    # TODO(ager, blois): The conditional has been removed from indexed db,
+    # so we can no longer determine the library based on the conditionals.
+    if interface.id.startswith("IDB"):
+      return 'indexed_db'
+
     if 'Conditional' in interface.ext_attrs:
       if 'WEB_AUDIO' in interface.ext_attrs['Conditional']:
         return 'web_audio'
diff --git a/tools/dom/scripts/idlparser_test.dart b/tools/dom/scripts/idlparser_test.dart
index 126d8cf..4ca9f95 100644
--- a/tools/dom/scripts/idlparser_test.dart
+++ b/tools/dom/scripts/idlparser_test.dart
@@ -95,7 +95,9 @@
   if (expected is String)
     formatted = printList(ast);
 
-  Expect.equals(expected, formatted, "parse: $input");
+  if (expected != formatted) {
+    throw new StateError("parse: $input");
+  }
 }
 
 // Prints the list in [1,2,3] notation, including nested lists.
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 99c27e7..4d813a4 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -12,6 +12,9 @@
 from generator import *
 from htmldartgenerator import *
 
+HTML_LIBRARY_NAMES = ['chrome', 'html', 'indexed_db', 'svg', 'web_audio',
+                      'web_gl', 'web_sql']
+
 _js_custom_members = monitored.Set('systemhtml._js_custom_members', [
     'ArrayBuffer.slice',
     'AudioBufferSourceNode.start',
@@ -70,7 +73,7 @@
     'Window.location',
     'Window.open',
     'Window.requestAnimationFrame',
-    'WorkerContext.indexedDB',
+    # 'WorkerContext.indexedDB', # Workers
     ])
 
 _js_custom_constructors = monitored.Set('systemhtml._js_custom_constructors', [
@@ -392,9 +395,9 @@
     'XMLHttpRequestProgressEvent':
         "Device.isEventTypeSupported('XMLHttpRequestProgressEvent')",
     'WebGLRenderingContext': "JS('bool', '!!(window.WebGLRenderingContext)')",
-    'WebKitCSSMatrix': "JS('bool', '!!(window.WebKitCSSMatrix)')",
     'WebKitPoint': "JS('bool', '!!(window.WebKitPoint)')",
     'WebSocket': "JS('bool', 'typeof window.WebSocket != \"undefined\"')",
+    'Worker': "JS('bool', '(typeof window.Worker != \"undefined\")')",
     'XSLTProcessor': "JS('bool', '!!(window.XSLTProcessor)')",
   }.items() +
   dict((key,
@@ -429,12 +432,15 @@
 
   def GenerateCallback(self):
     """Generates a typedef for the callback interface."""
+    typedef_name = self._renamer.RenameInterface(self._interface)
+    if not typedef_name:
+      return
+
     info = GetCallbackInfo(self._interface)
     code = self._library_emitter.FileEmitter(self._interface.id,
         self._library_name)
     code.Emit(self._template_loader.Load('callback.darttemplate'))
 
-    typedef_name = self._renamer.RenameInterface(self._interface)
     code.Emit('typedef void $NAME($PARAMS);\n',
               LIBRARYNAME='dart.dom.%s' % self._library_name,
               NAME=typedef_name,
@@ -511,10 +517,15 @@
         GetAnnotationsAndComments(self._library_name,
                                   self._interface.doc_js_name), '')
 
+    class_modifiers = ''
+    if self._renamer.ShouldSuppressInterface(self._interface):
+      class_modifiers = 'abstract '
+
     self._implementation_members_emitter = implementation_emitter.Emit(
         self._backend.ImplementationTemplate(),
         LIBRARYNAME='dart.dom.%s' % self._library_name,
         ANNOTATIONS=annotations,
+        CLASS_MODIFIERS=class_modifiers,
         CLASSNAME=self._interface_type_info.implementation_name(),
         EXTENDS=' extends %s' % base_class if base_class else '',
         IMPLEMENTS=implements_str,
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 4bc95a5..25d3370 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -10,7 +10,7 @@
 import os
 from generator import *
 from htmldartgenerator import *
-from systemhtml import js_support_checks, GetCallbackInfo
+from systemhtml import js_support_checks, GetCallbackInfo, HTML_LIBRARY_NAMES
 
 class DartiumBackend(HtmlDartGenerator):
   """Generates Dart implementation for one DOM IDL interface."""
@@ -152,6 +152,9 @@
     # Emit internal constructor which is necessary for Dartium bindings
     # to construct wrappers from C++.  Eventually it should go away
     # once it is possible to construct such an instance directly.
+    if not self._members_emitter:
+      return
+
     super_constructor = ''
     if base_class and base_class != 'NativeFieldWrapperClass1':
       super_constructor = ' : super.internal()'
@@ -875,14 +878,12 @@
   def __init__(self, emitters, cpp_sources_dir):
     self._emitters = emitters
     self._cpp_sources_dir = cpp_sources_dir
-    self._library_headers = {}
+    self._library_headers = dict((lib, []) for lib in HTML_LIBRARY_NAMES)
     self._sources_list = []
 
   def CreateHeaderEmitter(self, interface_name, library_name, is_callback=False):
     path = os.path.join(self._cpp_sources_dir, 'Dart%s.h' % interface_name)
     if not is_callback:
-      if not library_name in self._library_headers:
-        self._library_headers[library_name] = []
       self._library_headers[library_name].append(path)
     return self._emitters.FileEmitter(path)
 
diff --git a/tools/dom/src/AttributeMap.dart b/tools/dom/src/AttributeMap.dart
index 1d196e3..6c96bc9 100644
--- a/tools/dom/src/AttributeMap.dart
+++ b/tools/dom/src/AttributeMap.dart
@@ -38,19 +38,19 @@
     }
   }
 
-  Collection<String> get keys {
+  Iterable<String> get keys {
     // TODO: generate a lazy collection instead.
     var attributes = _element.$dom_attributes;
     var keys = new List<String>();
     for (int i = 0, len = attributes.length; i < len; i++) {
       if (_matches(attributes[i])) {
-        keys.add(attributes[i].$dom_localName);
+        keys.add(attributes[i].localName);
       }
     }
     return keys;
   }
 
-  Collection<String> get values {
+  Iterable<String> get values {
     // TODO: generate a lazy collection instead.
     var attributes = _element.$dom_attributes;
     var values = new List<String>();
@@ -191,7 +191,7 @@
     });
   }
 
-  Collection<String> get keys {
+  Iterable<String> get keys {
     final keys = new List<String>();
     $dom_attributes.forEach((String key, String value) {
       if (_matches(key)) {
@@ -201,7 +201,7 @@
     return keys;
   }
 
-  Collection<String> get values {
+  Iterable<String> get values {
     final values = new List<String>();
     $dom_attributes.forEach((String key, String value) {
       if (_matches(key)) {
diff --git a/tools/dom/src/CssClassSet.dart b/tools/dom/src/CssClassSet.dart
index 29aa860..acae69c 100644
--- a/tools/dom/src/CssClassSet.dart
+++ b/tools/dom/src/CssClassSet.dart
@@ -42,7 +42,7 @@
     readClasses().forEach(f);
   }
 
-  String join([String separator]) => readClasses().join(separator);
+  String join([String separator = ""]) => readClasses().join(separator);
 
   Iterable map(f(String element)) => readClasses().map(f);
 
@@ -58,9 +58,8 @@
 
   int get length => readClasses().length;
 
-  dynamic reduce(dynamic initialValue,
-      dynamic combine(dynamic previousValue, String element)) {
-    return readClasses().reduce(initialValue, combine);
+  String reduce(String combine(String value, String element)) {
+    return readClasses().reduce(combine);
   }
 
   dynamic fold(dynamic initialValue,
@@ -149,9 +148,6 @@
     _modify((s) => s.retainWhere(test));
   }
 
-  bool isSubsetOf(Collection<String> collection) =>
-    readClasses().isSubsetOf(collection);
-
   bool containsAll(Iterable<String> collection) =>
     readClasses().containsAll(collection);
 
@@ -170,10 +166,6 @@
   List<String> toList({ bool growable: true }) =>
       readClasses().toList(growable: growable);
   Set<String> toSet() => readClasses().toSet();
-  String min([int compare(String a, String b)]) =>
-      readClasses().min(compare);
-  String max([int compare(String a, String b)]) =>
-      readClasses().max(compare);
   Iterable<String> take(int n) => readClasses().take(n);
   Iterable<String> takeWhile(bool test(String value)) =>
       readClasses().takeWhile(test);
diff --git a/tools/dom/src/EventListener.dart b/tools/dom/src/EventListener.dart
index 2c9f2b4..60b29f1 100644
--- a/tools/dom/src/EventListener.dart
+++ b/tools/dom/src/EventListener.dart
@@ -4,4 +4,4 @@
 
 part of html;
 
-typedef void EventListener(Event event);
+typedef EventListener(Event event);
diff --git a/tools/dom/src/WrappedEvent.dart b/tools/dom/src/WrappedEvent.dart
new file mode 100644
index 0000000..92b13f9
--- /dev/null
+++ b/tools/dom/src/WrappedEvent.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of dart.html;
+
+/**
+ * Helper class to implement custom events which wrap DOM events.
+ */
+class _WrappedEvent implements Event {
+  final Event wrapped;
+  _WrappedEvent(this.wrapped);
+
+  bool get bubbles => wrapped.bubbles;
+
+  bool get cancelBubble => wrapped.bubbles;
+  void set cancelBubble(bool value) {
+    wrapped.cancelBubble = value;
+  }
+
+  bool get cancelable => wrapped.cancelable;
+
+  DataTransfer get clipboardData => wrapped.clipboardData;
+
+  EventTarget get currentTarget => wrapped.currentTarget;
+
+  bool get defaultPrevented => wrapped.defaultPrevented;
+
+  int get eventPhase => wrapped.eventPhase;
+
+  EventTarget get target => wrapped.target;
+
+  int get timeStamp => wrapped.timeStamp;
+
+  String get type => wrapped.type;
+
+  void $dom_initEvent(String eventTypeArg, bool canBubbleArg,
+      bool cancelableArg) {
+    throw new UnsupportedError(
+        'Cannot initialize this Event.');
+  }
+
+  void preventDefault() {
+    wrapped.preventDefault();
+  }
+
+  void stopImmediatePropagation() {
+    wrapped.stopImmediatePropagation();
+  }
+
+  void stopPropagation() {
+    wrapped.stopPropagation();
+  }
+}
diff --git a/tools/dom/src/WrappedList.dart b/tools/dom/src/WrappedList.dart
index 171dd7e..c20cfd5 100644
--- a/tools/dom/src/WrappedList.dart
+++ b/tools/dom/src/WrappedList.dart
@@ -27,15 +27,15 @@
 
   void forEach(void f(E element)) { _list.forEach(f); }
 
-  dynamic reduce(initialValue, combine(previousValue, E element)) =>
-      _list.reduce(initialValue, combine);
+  E reduce(E combine(E value, E element)) =>
+      _list.reduce(combine);
 
   dynamic fold(initialValue, combine(previousValue, E element)) =>
       _list.fold(initialValue, combine);
 
   bool every(bool f(E element)) => _list.every(f);
 
-  String join([String separator]) => _list.join(separator);
+  String join([String separator = ""]) => _list.join(separator);
 
   bool any(bool f(E element)) => _list.any(f);
 
@@ -46,10 +46,6 @@
 
   int get length => _list.length;
 
-  E min([int compare(E a, E b)]) => _list.min(compare);
-
-  E max([int compare(E a, E b)]) => _list.max(compare);
-
   bool get isEmpty => _list.isEmpty;
 
   Iterable<E> take(int n) => _list.take(n);
@@ -84,10 +80,6 @@
 
   void remove(Object element) { _list.remove(element); }
 
-  void removeAll(Iterable elements) { _list.removeAll(elements); }
-
-  void retainAll(Iterable elements) { _list.retainAll(elements); }
-
   void removeWhere(bool test(E element)) { _list.removeWhere(test); }
 
   void retainWhere(bool test(E element)) { _list.retainWhere(test); }
@@ -118,7 +110,7 @@
 
   List<E> sublist(int start, [int end]) => _list.sublist(start, end);
 
-  List<E> getRange(int start, int length) => sublist(start, start + length);
+  Iterable<E> getRange(int start, int end) => _list.getRange(start, end);
 
   void setRange(int start, int length, List<E> from, [int startFrom]) {
     _list.setRange(start, length, from, startFrom);
@@ -130,7 +122,14 @@
     _list.insertRange(start, length, fill);
   }
 
-  Map<int, E> asMap() => IterableMixinWorkaround.asMapList(_list);
+  Map<int, E> asMap() => _list.asMap();
+
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
 }
 
 /**
diff --git a/tools/dom/src/dart2js_KeyEvent.dart b/tools/dom/src/dart2js_KeyEvent.dart
index 5a0a133..a81d842 100644
--- a/tools/dom/src/dart2js_KeyEvent.dart
+++ b/tools/dom/src/dart2js_KeyEvent.dart
@@ -10,7 +10,7 @@
  * on how we can make this class work with as many international keyboards as
  * possible. Bugs welcome!
  */
-class KeyEvent implements KeyboardEvent {
+class KeyEvent extends _WrappedEvent implements KeyboardEvent {
   /** The parent KeyboardEvent that this KeyEvent is wrapping and "fixing". */
   KeyboardEvent _parent;
 
@@ -45,7 +45,7 @@
   bool get _realAltKey => JS('int', '#.altKey', _parent);
 
   /** Construct a KeyEvent with [parent] as the event we're emulating. */
-  KeyEvent(KeyboardEvent parent) {
+  KeyEvent(KeyboardEvent parent): super(parent) {
     _parent = parent;
     _shadowAltKey = _realAltKey;
     _shadowCharCode = _realCharCode;
@@ -66,22 +66,11 @@
 
   /** True if the altGraphKey is pressed during this event. */
   bool get altGraphKey => _parent.altGraphKey;
-  bool get bubbles => _parent.bubbles;
-  /** True if this event can be cancelled. */
-  bool get cancelable => _parent.cancelable;
-  bool get cancelBubble => _parent.cancelBubble;
-  void set cancelBubble(bool cancel) {
-    _parent.cancelBubble = cancel;
-  }
   /** Accessor to the clipboardData available for this event. */
   DataTransfer get clipboardData => _parent.clipboardData;
   /** True if the ctrl key is pressed during this event. */
   bool get ctrlKey => _parent.ctrlKey;
-  /** Accessor to the target this event is listening to for changes. */
-  EventTarget get currentTarget => _parent.currentTarget;
-  bool get defaultPrevented => _parent.defaultPrevented;
   int get detail => _parent.detail;
-  int get eventPhase => _parent.eventPhase;
   /**
    * Accessor to the part of the keyboard that the key was pressed from (one of
    * KeyLocation.STANDARD, KeyLocation.RIGHT, KeyLocation.LEFT,
@@ -92,35 +81,17 @@
   /** True if the Meta (or Mac command) key is pressed during this event. */
   bool get metaKey => _parent.metaKey;
   Point get page => _parent.page;
-  bool get returnValue => _parent.returnValue;
-  void set returnValue(bool value) {
-    _parent.returnValue = value;
-  }
   /** True if the shift key was pressed during this event. */
   bool get shiftKey => _parent.shiftKey;
-  int get timeStamp => _parent.timeStamp;
-  /**
-   * The type of key event that occurred. One of "keydown", "keyup", or
-   * "keypress".
-   */
-  String get type => _parent.type;
   Window get view => _parent.view;
-  void preventDefault() => _parent.preventDefault();
-  void stopImmediatePropagation() => _parent.stopImmediatePropagation();
-  void stopPropagation() => _parent.stopPropagation();
   void $dom_initUIEvent(String type, bool canBubble, bool cancelable,
       Window view, int detail) {
     throw new UnsupportedError("Cannot initialize a UI Event from a KeyEvent.");
   }
-  void $dom_initEvent(String eventTypeArg, bool canBubbleArg,
-      bool cancelableArg) {
-    throw new UnsupportedError("Cannot initialize an Event from a KeyEvent.");
-  }
   String get _shadowKeyIdentifier => JS('String', '#.keyIdentifier', _parent);
 
   int get $dom_charCode => charCode;
   int get $dom_keyCode => keyCode;
-  EventTarget get target => _parent.target;
   String get $dom_keyIdentifier {
     throw new UnsupportedError("keyIdentifier is unsupported.");
   }
diff --git a/tools/dom/src/dartium_KeyEvent.dart b/tools/dom/src/dartium_KeyEvent.dart
index 8f129a1..6f2cd78 100644
--- a/tools/dom/src/dartium_KeyEvent.dart
+++ b/tools/dom/src/dartium_KeyEvent.dart
@@ -10,7 +10,7 @@
  * on how we can make this class work with as many international keyboards as
  * possible. Bugs welcome!
  */
-class KeyEvent implements KeyboardEvent {
+class KeyEvent extends _WrappedEvent implements KeyboardEvent {
   /** The parent KeyboardEvent that this KeyEvent is wrapping and "fixing". */
   KeyboardEvent _parent;
 
@@ -45,7 +45,7 @@
   bool get _realAltKey => _parent.altKey;
 
   /** Construct a KeyEvent with [parent] as the event we're emulating. */
-  KeyEvent(KeyboardEvent parent) {
+  KeyEvent(KeyboardEvent parent): super(parent) {
     _parent = parent;
     _shadowAltKey = _realAltKey;
     _shadowCharCode = _realCharCode;
@@ -64,22 +64,9 @@
 
   /** True if the altGraphKey is pressed during this event. */
   bool get altGraphKey => _parent.altGraphKey;
-  bool get bubbles => _parent.bubbles;
-  /** True if this event can be cancelled. */
-  bool get cancelable => _parent.cancelable;
-  bool get cancelBubble => _parent.cancelBubble;
-  void set cancelBubble(bool cancel) {
-    _parent.cancelBubble = cancel;
-  }
-  /** Accessor to the clipboardData available for this event. */
-  DataTransfer get clipboardData => _parent.clipboardData;
   /** True if the ctrl key is pressed during this event. */
   bool get ctrlKey => _parent.ctrlKey;
-  /** Accessor to the target this event is listening to for changes. */
-  EventTarget get currentTarget => _parent.currentTarget;
-  bool get defaultPrevented => _parent.defaultPrevented;
   int get detail => _parent.detail;
-  int get eventPhase => _parent.eventPhase;
   /**
    * Accessor to the part of the keyboard that the key was pressed from (one of
    * KeyLocation.STANDARD, KeyLocation.RIGHT, KeyLocation.LEFT,
@@ -90,35 +77,17 @@
   /** True if the Meta (or Mac command) key is pressed during this event. */
   bool get metaKey => _parent.metaKey;
   Point get page => _parent.page;
-  bool get returnValue => _parent.returnValue;
-  void set returnValue(bool value) {
-    _parent.returnValue = value;
-  }
   /** True if the shift key was pressed during this event. */
   bool get shiftKey => _parent.shiftKey;
-  int get timeStamp => _parent.timeStamp;
-  /**
-   * The type of key event that occurred. One of "keydown", "keyup", or
-   * "keypress".
-   */
-  String get type => _parent.type;
   Window get view => _parent.view;
-  void preventDefault() => _parent.preventDefault();
-  void stopImmediatePropagation() => _parent.stopImmediatePropagation();
-  void stopPropagation() => _parent.stopPropagation();
   void $dom_initUIEvent(String type, bool canBubble, bool cancelable,
       Window view, int detail) {
     throw new UnsupportedError("Cannot initialize a UI Event from a KeyEvent.");
   }
-  void $dom_initEvent(String eventTypeArg, bool canBubbleArg,
-      bool cancelableArg) {
-    throw new UnsupportedError("Cannot initialize an Event from a KeyEvent.");
-  }
   String get _shadowKeyIdentifier => _parent.$dom_keyIdentifier;
 
   int get $dom_charCode => charCode;
   int get $dom_keyCode => keyCode;
-  EventTarget get target => _parent.target;
   String get $dom_keyIdentifier {
     throw new UnsupportedError("keyIdentifier is unsupported.");
   }
diff --git a/tools/dom/src/native_DOMImplementation.dart b/tools/dom/src/native_DOMImplementation.dart
index aeb3775..b5b2650 100644
--- a/tools/dom/src/native_DOMImplementation.dart
+++ b/tools/dom/src/native_DOMImplementation.dart
@@ -126,8 +126,8 @@
   String remove(String key) native "DOMStringMap_remove_Callback";
   void clear() => Maps.clear(this);
   void forEach(void f(String key, String value)) => Maps.forEach(this, f);
-  Collection<String> get keys native "DOMStringMap_getKeys_Callback";
-  Collection<String> get values => Maps.getValues(this);
+  Iterable<String> get keys native "DOMStringMap_getKeys_Callback";
+  Iterable<String> get values => Maps.getValues(this);
   int get length => Maps.length(this);
   bool get isEmpty => Maps.isEmpty(this);
 }
diff --git a/tools/dom/templates/dart2js_impl.darttemplate b/tools/dom/templates/dart2js_impl.darttemplate
index 39e363c..6195077 100644
--- a/tools/dom/templates/dart2js_impl.darttemplate
+++ b/tools/dom/templates/dart2js_impl.darttemplate
@@ -5,5 +5,5 @@
 part of $LIBRARYNAME;
 
 @DocsEditable
-$(ANNOTATIONS)class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+$(ANNOTATIONS)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS}
diff --git a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
index fa10608..4ab1438 100644
--- a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
@@ -45,6 +45,7 @@
 part '$AUXILIARY_DIR/Isolates.dart';
 part '$AUXILIARY_DIR/Microtask.dart';
 part '$AUXILIARY_DIR/Serialization.dart';
+part '$AUXILIARY_DIR/WrappedEvent.dart';
 part '$AUXILIARY_DIR/WrappedList.dart';
 part '$AUXILIARY_DIR/shared_FactoryProviders.dart';
 part '$AUXILIARY_DIR/dart2js_Conversions.dart';
@@ -64,7 +65,7 @@
 /**
  * The top-level Document object.
  */
-HtmlDocument get document => JS('Document', 'document');
+HtmlDocument get document => JS('HtmlDocument', 'document');
 
 Element query(String selector) => document.query(selector);
 List<Element> queryAll(String selector) => document.queryAll(selector);
diff --git a/tools/dom/templates/html/dartium/cpp_resolver.template b/tools/dom/templates/html/dartium/cpp_resolver.template
index e104ebe..2a021c1 100644
--- a/tools/dom/templates/html/dartium/cpp_resolver.template
+++ b/tools/dom/templates/html/dartium/cpp_resolver.template
@@ -6,6 +6,7 @@
 
 #include "config.h"
 $!INCLUDES
+#include <dart_api.h>
 
 namespace WebCore {
 
diff --git a/tools/dom/templates/html/dartium/dart_implementation.darttemplate b/tools/dom/templates/html/dartium/dart_implementation.darttemplate
index f0c067d..3b2c20f 100644
--- a/tools/dom/templates/html/dartium/dart_implementation.darttemplate
+++ b/tools/dom/templates/html/dartium/dart_implementation.darttemplate
@@ -7,6 +7,6 @@
 part of $LIBRARYNAME;
 
 @DocsEditable
-$(ANNOTATIONS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
+$(ANNOTATIONS)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/dartium/html_dartium.darttemplate b/tools/dom/templates/html/dartium/html_dartium.darttemplate
index c84c791..72e2df7 100644
--- a/tools/dom/templates/html/dartium/html_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/html_dartium.darttemplate
@@ -39,6 +39,7 @@
 part '$AUXILIARY_DIR/Point.dart';
 part '$AUXILIARY_DIR/ReadyState.dart';
 part '$AUXILIARY_DIR/Rectangle.dart';
+part '$AUXILIARY_DIR/WrappedEvent.dart';
 part '$AUXILIARY_DIR/WrappedList.dart';
 part '$AUXILIARY_DIR/_HttpRequestUtils.dart';
 part '$AUXILIARY_DIR/shared_FactoryProviders.dart';
diff --git a/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate b/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
index 8aa13d1..1fca45d 100644
--- a/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
+++ b/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
@@ -62,7 +62,7 @@
    * will allow, the image will be clipped to fit the available space.
    *
    *     CanvasElement canvas = new CanvasElement(width: 600, height: 600);
-   *     CanvasRenderingContext2D ctx = canvas.context2d;
+   *     CanvasRenderingContext2D ctx = canvas.context2D;
    *     ImageElement img = document.query('img');
    *     img.width = 100;
    *     img.height = 100;
@@ -140,7 +140,7 @@
    * available space.
    *
    *     CanvasElement canvas = new CanvasElement(width: 600, height: 600);
-   *     CanvasRenderingContext2D ctx = canvas.context2d;
+   *     CanvasRenderingContext2D ctx = canvas.context2D;
    *     ImageElement img = document.query('img');
    *
    *     ctx.drawImage(img, 100, 100);
@@ -181,7 +181,7 @@
    * will allow, the image will be clipped to fit the available space.
    *
    *     CanvasElement canvas = new CanvasElement(width: 600, height: 600);
-   *     CanvasRenderingContext2D ctx = canvas.context2d;
+   *     CanvasRenderingContext2D ctx = canvas.context2D;
    *     ImageElement img = document.query('img');
    *     img.width = 100;
    *     img.height = 100;
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index 6d34148..13eaa30 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -6,7 +6,7 @@
 
 // TODO(jacobr): use _Lists.dart to remove some of the duplicated
 // functionality.
-class _ChildrenElementList implements List {
+class _ChildrenElementList extends ListBase<Element> {
   // Raw Element.
   final Element _element;
   final HtmlCollection _childElements;
@@ -63,20 +63,20 @@
     return false;
   }
 
-  String join([String separator]) {
-    return IterableMixinWorkaround.joinList(this, separator);
+  String join([String separator = ""]) {
+    return _childElements.join(separator);
   }
 
   Iterable map(f(Element element)) {
-    return IterableMixinWorkaround.mapList(this, f);
+    return _childElements.map(f);
   }
 
   Iterable<Element> where(bool f(Element element)) {
-    return IterableMixinWorkaround.where(this, f);
+    return _childElements.where(f);
   }
 
   Iterable expand(Iterable f(Element element)) {
-    return IterableMixinWorkaround.expand(this, f);
+    return _childElements.expand(f);
   }
 
   bool get isEmpty {
@@ -84,31 +84,31 @@
   }
 
   Iterable<Element> take(int n) {
-    return IterableMixinWorkaround.takeList(this, n);
+    return _childElements.take(n);
   }
 
   Iterable<Element> takeWhile(bool test(Element value)) {
-    return IterableMixinWorkaround.takeWhile(this, test);
+    return _childElements.takeWhile(test);
   }
 
   Iterable<Element> skip(int n) {
-    return IterableMixinWorkaround.skipList(this, n);
+    return _childElements.skip(n);
   }
 
   Iterable<Element> skipWhile(bool test(Element value)) {
-    return IterableMixinWorkaround.skipWhile(this, test);
+    return _childElements.skipWhile(test);
   }
 
   Element firstWhere(bool test(Element value), {Element orElse()}) {
-    return IterableMixinWorkaround.firstWhere(this, test, orElse);
+    return _childElements.firstWhere(test, orElse: orElse);
   }
 
   Element lastWhere(bool test(Element value), {Element orElse()}) {
-    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
+    return _childElements.lastWhere(test, orElse: orElse);
   }
 
   Element singleWhere(bool test(Element value)) {
-    return IterableMixinWorkaround.singleWhere(this, test);
+    return _childElements.singleWhere(test);
   }
 
   Element elementAt(int index) {
@@ -150,24 +150,24 @@
   }
 
   Iterable<Element> get reversed {
-    return IterableMixinWorkaround.reversedList(this);
+    return _childElements.reversed;
   }
 
   void sort([int compare(Element a, Element b)]) {
     throw new UnsupportedError('TODO(jacobr): should we impl?');
   }
 
-  dynamic reduce(dynamic initialValue,
-      dynamic combine(dynamic previousValue, Element element)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  Element reduce(Element combine(Element value, Element element)) {
+    return _childElements.reduce(combine);
   }
 
   dynamic fold(dynamic initialValue,
       dynamic combine(dynamic previousValue, Element element)) {
-    return IterableMixinWorkaround.fold(this, initialValue, combine);
+    return _childElements.fold(initialValue, combine);
   }
 
-  void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
+  void setRange(int start, int rangeLength, List from,
+                [int startFrom = 0]) {
     throw new UnimplementedError();
   }
 
@@ -180,20 +180,12 @@
     }
   }
 
-  void removeAll(Iterable elements) {
-    IterableMixinWorkaround.removeAll(this, elements);
-  }
-
-  void retainAll(Iterable elements) {
-    IterableMixinWorkaround.retainAll(this, elements);
-  }
-
   void removeWhere(bool test(Element element)) {
-    IterableMixinWorkaround.removeWhere(this, test);
+    _childElements.removeWhere(test);
   }
 
   void retainWhere(bool test(Element element)) {
-    IterableMixinWorkaround.retainWhere(this, test);
+    _childElements.retainWhere(test);
   }
 
   void removeRange(int start, int rangeLength) {
@@ -204,14 +196,15 @@
     throw new UnimplementedError();
   }
 
+  Iterable getRange(int start, int end)  {
+    throw new UnimplementedError();
+  }
+
   List sublist(int start, [int end]) {
     if (end == null) end = length;
     return new _FrozenElementList._wrap(Lists.getRange(this, start, end, []));
   }
 
-  List getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   int indexOf(Element element, [int start = 0]) {
     return Lists.indexOf(this, element, start, this.length);
   }
@@ -271,16 +264,15 @@
     return first;
   }
 
-  Element min([int compare(Element a, Element b)]) {
-    return IterableMixinWorkaround.min(this, compare);
-  }
-
-  Element max([int compare(Element a, Element b)]) {
-    return IterableMixinWorkaround.max(this, compare);
-  }
-
   Map<int, Element> asMap() {
-    return IterableMixinWorkaround.asMapList(this);
+    return _childElements.asMap();
+  }
+
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
   }
 }
 
@@ -288,96 +280,11 @@
 // a better option given that we cannot quite force NodeList to be an
 // ElementList as there are valid cases where a NodeList JavaScript object
 // contains Node objects that are not Elements.
-class _FrozenElementList implements List {
+class _FrozenElementList extends ListBase {
   final List<Node> _nodeList;
 
   _FrozenElementList._wrap(this._nodeList);
 
-  bool contains(Element element) {
-    for (Element el in this) {
-      if (el == element) return true;
-    }
-    return false;
-  }
-
-  void forEach(void f(Element element)) {
-    for (Element el in this) {
-      f(el);
-    }
-  }
-
-  String join([String separator]) {
-    return IterableMixinWorkaround.joinList(this, separator);
-  }
-
-  Iterable map(f(Element element)) {
-    return IterableMixinWorkaround.mapList(this, f);
-  }
-
-  Iterable<Element> where(bool f(Element element)) {
-    return IterableMixinWorkaround.where(this, f);
-  }
-
-  Iterable expand(Iterable f(Element element)) {
-    return IterableMixinWorkaround.expand(this, f);
-  }
-
-  bool every(bool f(Element element)) {
-    for(Element element in this) {
-      if (!f(element)) {
-        return false;
-      }
-    };
-    return true;
-  }
-
-  bool any(bool f(Element element)) {
-    for(Element element in this) {
-      if (f(element)) {
-        return true;
-      }
-    };
-    return false;
-  }
-
-  List<Element> toList({ bool growable: true }) =>
-      new List<Element>.from(this, growable: growable);
-  Set<Element> toSet() => new Set<Element>.from(this);
-
-  Iterable<Element> take(int n) {
-    return IterableMixinWorkaround.takeList(this, n);
-  }
-
-  Iterable<Element> takeWhile(bool test(Element value)) {
-    return IterableMixinWorkaround.takeWhile(this, test);
-  }
-
-  Iterable<Element> skip(int n) {
-    return IterableMixinWorkaround.skipList(this, n);
-  }
-
-  Iterable<Element> skipWhile(bool test(Element value)) {
-    return IterableMixinWorkaround.skipWhile(this, test);
-  }
-
-  Element firstWhere(bool test(Element value), {Element orElse()}) {
-    return IterableMixinWorkaround.firstWhere(this, test, orElse);
-  }
-
-  Element lastWhere(bool test(Element value), {Element orElse()}) {
-    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
-  }
-
-  Element singleWhere(bool test(Element value)) {
-    return IterableMixinWorkaround.singleWhere(this, test);
-  }
-
-  Element elementAt(int index) {
-    return this[index];
-  }
-
-  bool get isEmpty => _nodeList.isEmpty;
-
   int get length => _nodeList.length;
 
   Element operator [](int index) => _nodeList[index];
@@ -394,31 +301,16 @@
     throw new UnsupportedError('');
   }
 
-  Iterator<Element> get iterator => new _FrozenElementListIterator(this);
-
   void addAll(Iterable<Element> iterable) {
     throw new UnsupportedError('');
   }
 
-  Iterable<Element> get reversed {
-    return IterableMixinWorkaround.reversedList(this);
-  }
-
   void sort([int compare(Element a, Element b)]) {
     throw new UnsupportedError('');
   }
 
-  dynamic reduce(dynamic initialValue,
-      dynamic combine(dynamic previousValue, Element element)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
-  }
-
-  dynamic fold(dynamic initialValue,
-      dynamic combine(dynamic previousValue, Element element)) {
-    return IterableMixinWorkaround.fold(this, initialValue, combine);
-  }
-
-  void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
+  void setRange(int start, int rangeLength, List from,
+                [int startFrom = 0]) {
     throw new UnsupportedError('');
   }
 
@@ -434,15 +326,6 @@
     return new _FrozenElementList._wrap(_nodeList.sublist(start, end));
   }
 
-  List<Element> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
-  int indexOf(Element element, [int start = 0]) =>
-    _nodeList.indexOf(element, start);
-
-  int lastIndexOf(Element element, [int start = null]) =>
-    _nodeList.lastIndexOf(element, start);
-
   void clear() {
     throw new UnsupportedError('');
   }
@@ -459,14 +342,6 @@
     throw new UnsupportedError('');
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError('');
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError('');
-  }
-
   void removeWhere(bool test(Element element)) {
     throw new UnsupportedError('');
   }
@@ -481,49 +356,12 @@
 
   Element get single => _nodeList.single;
 
-  Element min([int compare(Element a, Element b)]) {
-    return IterableMixinWorkaround.min(this, compare);
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
   }
-
-  Element max([int compare(Element a, Element b)]) {
-    return IterableMixinWorkaround.max(this, compare);
-  }
-
-  Map<int, Element> asMap() {
-    return IterableMixinWorkaround.asMapList(this);
-  }
-}
-
-class _FrozenElementListIterator implements Iterator<Element> {
-  final _FrozenElementList _list;
-  int _index = -1;
-  Element _current;
-
-  _FrozenElementListIterator(this._list);
-
-  /**
-   * Moves to the next element. Returns true if the iterator is positioned
-   * at an element. Returns false if it is positioned after the last element.
-   */
-  bool moveNext() {
-    int nextIndex = _index + 1;
-    if (nextIndex < _list.length) {
-      _current = _list[nextIndex];
-      _index = nextIndex;
-      return true;
-    }
-    _index = _list.length;
-    _current = null;
-    return false;
-  }
-
-  /**
-   * Returns the element the [Iterator] is positioned at.
-   *
-   * Return [:null:] if the iterator is positioned before the first, or
-   * after the last element.
-   */
-  Element get current => _current;
 }
 
 class _ElementCssClassSet extends CssClassSet {
@@ -661,7 +499,7 @@
    */
   CssClassSet get classes => new _ElementCssClassSet(this);
 
-  void set classes(Collection<String> value) {
+  void set classes(Iterable<String> value) {
     CssClassSet classSet = classes;
     classSet.clear();
     classSet.addAll(value);
diff --git a/tools/dom/templates/html/impl/impl_Geolocation.darttemplate b/tools/dom/templates/html/impl/impl_Geolocation.darttemplate
index 11e52b7..19447c2 100644
--- a/tools/dom/templates/html/impl/impl_Geolocation.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Geolocation.darttemplate
@@ -55,7 +55,7 @@
     var controller;
     controller = new StreamController<Geoposition>(
       onSubscriptionStateChange: () {
-        if (controller.hasSubscribers) {
+        if (controller.hasListener) {
           assert(watchId == null);
           watchId = $dom_watchPosition(
               (position) {
diff --git a/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate
index 50b23ad..ef01381 100644
--- a/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate
@@ -6,7 +6,16 @@
 
 $(ANNOTATIONS)class $CLASSNAME$EXTENDS implements CanvasImageSource$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
-  CanvasRenderingContext2D get context2d => getContext('2d');
+  /** An API for drawing on this canvas. */
+$if DART2JS
+  CanvasRenderingContext2D get context2D =>
+      JS('Null|CanvasRenderingContext2D', '#.getContext(#)', this, '2d');
+$else
+  CanvasRenderingContext2D get context2D => getContext('2d');
+$endif
+
+  @deprecated
+  CanvasRenderingContext2D get context2d => this.context2D;
 
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
diff --git a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
index a8940cb..dd2e6e4 100644
--- a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
@@ -8,22 +8,28 @@
 
 $(ANNOTATIONS)class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
+
+$if DART2JS
   @DomName('Document.body')
-  BodyElement get body => document.$dom_body;
+  BodyElement body;
+$else
+  @DomName('Document.body')
+  BodyElement get body => $dom_body;
 
   @DomName('Document.body')
   void set body(BodyElement value) {
-    document.$dom_body = value;
+    $dom_body = value;
   }
+$endif
 
   @DomName('Document.caretRangeFromPoint')
   Range caretRangeFromPoint(int x, int y) {
-    return document.$dom_caretRangeFromPoint(x, y);
+    return $dom_caretRangeFromPoint(x, y);
   }
 
   @DomName('Document.elementFromPoint')
   Element elementFromPoint(int x, int y) {
-    return document.$dom_elementFromPoint(x, y);
+    return $dom_elementFromPoint(x, y);
   }
 
   /**
@@ -67,36 +73,36 @@
   @DomName('Document.getCSSCanvasContext')
   CanvasRenderingContext getCssCanvasContext(String contextId, String name,
       int width, int height) {
-    return document.$dom_getCssCanvasContext(contextId, name, width, height);
+    return $dom_getCssCanvasContext(contextId, name, width, height);
   }
 
   @DomName('Document.head')
-  HeadElement get head => document.$dom_head;
+  HeadElement get head => $dom_head;
 
   @DomName('Document.lastModified')
-  String get lastModified => document.$dom_lastModified;
+  String get lastModified => $dom_lastModified;
 
   @DomName('Document.preferredStylesheetSet')
-  String get preferredStylesheetSet => document.$dom_preferredStylesheetSet;
+  String get preferredStylesheetSet => $dom_preferredStylesheetSet;
 
   @DomName('Document.referrer')
-  String get referrer => document.$dom_referrer;
+  String get referrer => $dom_referrer;
 
   @DomName('Document.selectedStylesheetSet')
-  String get selectedStylesheetSet => document.$dom_selectedStylesheetSet;
+  String get selectedStylesheetSet => $dom_selectedStylesheetSet;
   void set selectedStylesheetSet(String value) {
-    document.$dom_selectedStylesheetSet = value;
+    $dom_selectedStylesheetSet = value;
   }
 
   @DomName('Document.styleSheets')
-  List<StyleSheet> get styleSheets => document.$dom_styleSheets;
+  List<StyleSheet> get styleSheets => $dom_styleSheets;
 
   @DomName('Document.title')
-  String get title => document.$dom_title;
+  String get title => $dom_title;
 
   @DomName('Document.title')
   void set title(String value) {
-    document.$dom_title = value;
+    $dom_title = value;
   }
 
   @DomName('Document.webkitCancelFullScreen')
@@ -104,7 +110,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
   void cancelFullScreen() {
-    document.$dom_webkitCancelFullScreen();
+    $dom_webkitCancelFullScreen();
   }
 
   @DomName('Document.webkitExitFullscreen')
@@ -112,7 +118,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
   void exitFullscreen() {
-    document.$dom_webkitExitFullscreen();
+    $dom_webkitExitFullscreen();
   }
 
   @DomName('Document.webkitExitPointerLock')
@@ -120,43 +126,43 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
   void exitPointerLock() {
-    document.$dom_webkitExitPointerLock();
+    $dom_webkitExitPointerLock();
   }
 
   @DomName('Document.webkitFullscreenElement')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  Element get fullscreenElement => document.$dom_webkitFullscreenElement;
+  Element get fullscreenElement => $dom_webkitFullscreenElement;
 
   @DomName('Document.webkitFullscreenEnabled')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  bool get fullscreenEnabled => document.$dom_webkitFullscreenEnabled;
+  bool get fullscreenEnabled => $dom_webkitFullscreenEnabled;
 
   @DomName('Document.webkitHidden')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  bool get hidden => document.$dom_webkitHidden;
+  bool get hidden => $dom_webkitHidden;
 
   @DomName('Document.webkitIsFullScreen')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  bool get isFullScreen => document.$dom_webkitIsFullScreen;
+  bool get isFullScreen => $dom_webkitIsFullScreen;
 
   @DomName('Document.webkitPointerLockElement')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
   Element get pointerLockElement =>
-      document.$dom_webkitPointerLockElement;
+      $dom_webkitPointerLockElement;
 
   @DomName('Document.webkitVisibilityState')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental
-  String get visibilityState => document.$dom_webkitVisibilityState;
+  String get visibilityState => $dom_webkitVisibilityState;
 }
diff --git a/tools/dom/templates/html/impl/impl_IDBObjectStore.darttemplate b/tools/dom/templates/html/impl/impl_IDBObjectStore.darttemplate
index d963e04eb..5343411 100644
--- a/tools/dom/templates/html/impl/impl_IDBObjectStore.darttemplate
+++ b/tools/dom/templates/html/impl/impl_IDBObjectStore.darttemplate
@@ -160,7 +160,7 @@
         controller.close();
       } else {
         controller.add(cursor);
-        if (autoAdvance == true && controller.hasSubscribers) {
+        if (autoAdvance == true && controller.hasListener) {
           cursor.next();
         }
       }
diff --git a/tools/dom/templates/html/impl/impl_Node.darttemplate b/tools/dom/templates/html/impl/impl_Node.darttemplate
index bd9eeb2..cb664d6 100644
--- a/tools/dom/templates/html/impl/impl_Node.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Node.darttemplate
@@ -9,7 +9,7 @@
  * the actual child nodes of an element until strictly necessary greatly
  * improving performance for the typical cases where it is not required.
  */
-class _ChildNodeListLazy implements List {
+class _ChildNodeListLazy extends ListBase<Node> {
   final Node _this;
 
   _ChildNodeListLazy(this._this);
@@ -51,14 +51,6 @@
   }
 $endif
 
-  Node min([int compare(Node a, Node b)]) {
-    return IterableMixinWorkaround.min(this, compare);
-  }
-
-  Node max([int compare(Node a, Node b)]) {
-    return IterableMixinWorkaround.max(this, compare);
-  }
-
   void add(Node value) {
     _this.append(value);
   }
@@ -113,20 +105,26 @@
     _this.$dom_removeChild(node);
   }
 
-  void removeAll(Iterable elements) {
-    IterableMixinWorkaround.removeAll(this, elements);
-  }
-
-  void retainAll(Iterable elements) {
-    IterableMixinWorkaround.retainAll(this, elements);
+  void _filter(bool test(Node node), bool removeMatching) {
+    // This implementation of removeWhere/retainWhere is more efficient
+    // than the default in ListBase. Child nodes can be removed in constant
+    // time.
+    Node child = _this.$dom_firstChild;
+    while (child != null) {
+      Node nextChild = child.nextSibling;
+      if (test(child) == removeMatching) {
+        _this.$dom_removeChild(child);
+      }
+      child = nextChild;
+    }
   }
 
   void removeWhere(bool test(Node node)) {
-    IterableMixinWorkaround.removeWhere(this, test);
+    _filter(test, true);
   }
 
   void retainWhere(bool test(Node node)) {
-    IterableMixinWorkaround.retainWhere(this, test);
+    _filter(test, false);
   }
 
   void clear() {
@@ -139,42 +137,6 @@
 
   Iterator<Node> get iterator => _this.$dom_childNodes.iterator;
 
-  // TODO(jacobr): We can implement these methods much more efficiently by
-  // looking up the nodeList only once instead of once per iteration.
-  bool contains(Node element) => IterableMixinWorkaround.contains(this, element);
-
-  void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);
-
-  dynamic reduce(dynamic initialValue,
-      dynamic combine(dynamic previousValue, Node element)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
-  }
-
-  dynamic fold(dynamic initialValue,
-      dynamic combine(dynamic previousValue, Node element)) {
-    return IterableMixinWorkaround.fold(this, initialValue, combine);
-  }
-
-  String join([String separator]) {
-    return IterableMixinWorkaround.joinList(this, separator);
-  }
-
-  Iterable map(f(Node element)) {
-    return IterableMixinWorkaround.mapList(this, f);
-  }
-
-  Iterable<Node> where(bool f(Node element)) {
-    return IterableMixinWorkaround.where(this, f);
-  }
-
-  Iterable expand(Iterable f(Node element)) {
-    return IterableMixinWorkaround.expand(this, f);
-  }
-
-  bool every(bool f(Node element)) => IterableMixinWorkaround.every(this, f);
-
-  bool any(bool f(Node element)) => IterableMixinWorkaround.any(this, f);
-
   List<Node> toList({ bool growable: true }) =>
       new List<Node>.from(this, growable: growable);
   Set<Node> toSet() => new Set<Node>.from(this);
@@ -183,54 +145,12 @@
 
   // From List<Node>:
 
-  Iterable<Node> take(int n) {
-    return IterableMixinWorkaround.takeList(this, n);
-  }
-
-  Iterable<Node> takeWhile(bool test(Node value)) {
-    return IterableMixinWorkaround.takeWhile(this, test);
-  }
-
-  Iterable<Node> skip(int n) {
-    return IterableMixinWorkaround.skipList(this, n);
-  }
-
-  Iterable<Node> skipWhile(bool test(Node value)) {
-    return IterableMixinWorkaround.skipWhile(this, test);
-  }
-
-  Node firstWhere(bool test(Node value), {Node orElse()}) {
-    return IterableMixinWorkaround.firstWhere(this, test, orElse);
-  }
-
-  Node lastWhere(bool test(Node value), {Node orElse()}) {
-    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
-  }
-
-  Node singleWhere(bool test(Node value)) {
-    return IterableMixinWorkaround.singleWhere(this, test);
-  }
-
-  Node elementAt(int index) {
-    return this[index];
-  }
-
-  Iterable<Node> get reversed {
-    return IterableMixinWorkaround.reversedList(this);
-  }
-
   // TODO(jacobr): this could be implemented for child node lists.
   // The exception we throw here is misleading.
   void sort([int compare(Node a, Node b)]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(Node element, [int start = 0]) =>
-      Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(Node element, [int start = 0]) =>
-      Lists.lastIndexOf(this, element, start);
-
   // FIXME: implement these.
   void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
     throw new UnsupportedError(
@@ -244,14 +164,22 @@
     throw new UnsupportedError(
         "Cannot insertRange on immutable List.");
   }
+
+  Iterable<Node> getRange(int start, int end) {
+    throw new UnimplementedError("NodeList.getRange");
+  }
+
   List<Node> sublist(int start, [int end]) {
     if (end == null) end == length;
     return Lists.getRange(this, start, end, <Node>[]);
   }
 
-  List<Node> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
   // -- end List<Node> mixins.
 
   // TODO(jacobr): benchmark whether this is more efficient or whether caching
@@ -264,8 +192,6 @@
   }
 
   Node operator[](int index) => _this.$dom_childNodes[index];
-
-  Map<int, Node> asMap() => IterableMixinWorkaround.asMapList(this);
 }
 
 $(ANNOTATIONS)class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
@@ -273,7 +199,7 @@
     return new _ChildNodeListLazy(this);
   }
 
-  void set nodes(Collection<Node> value) {
+  void set nodes(Iterable<Node> value) {
     // Copy list first since we don't want liveness during iteration.
     // TODO(jacobr): there is a better way to do this.
     List copy = new List.from(value);
@@ -418,5 +344,11 @@
     return _modelChangedStream.stream;
   }
 
+  /**
+   * Print out a String representation of this Node.
+   */
+  String toString() => localName == null ?
+      (nodeValue == null ? super.toString() : nodeValue) : localName;
+
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/impl/impl_SVGColor.darttemplate b/tools/dom/templates/html/impl/impl_SVGColor.darttemplate
new file mode 100644
index 0000000..afe3c34
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_SVGColor.darttemplate
@@ -0,0 +1,12 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of $LIBRARYNAME;
+
+// Hack because the baseclass is private in dart:html, and we want to omit this
+// type entirely but can't.
+@DocsEditable
+$(ANNOTATIONS)class $CLASSNAME$IMPLEMENTS$NATIVESPEC {
+  _SVGColor.internal();
+}
diff --git a/tools/dom/templates/html/impl/impl_ScriptProcessorNode.darttemplate b/tools/dom/templates/html/impl/impl_ScriptProcessorNode.darttemplate
index 15bf88e..d6f813f 100644
--- a/tools/dom/templates/html/impl/impl_ScriptProcessorNode.darttemplate
+++ b/tools/dom/templates/html/impl/impl_ScriptProcessorNode.darttemplate
@@ -18,7 +18,7 @@
     if (_eventStream == null) {
       var controller = new StreamController();
       var callback = (audioData) { 
-          if (controller.hasSubscribers) {
+          if (controller.hasListener) {
             // This stream is a strange combination of broadcast and single
             // subscriber streams. We only allow one listener, but if there is
             // no listener, we don't queue up events, we just drop them on the
diff --git a/tools/dom/templates/html/impl/impl_Storage.darttemplate b/tools/dom/templates/html/impl/impl_Storage.darttemplate
index e4d0523..d043abe 100644
--- a/tools/dom/templates/html/impl/impl_Storage.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Storage.darttemplate
@@ -63,13 +63,13 @@
     }
   }
 
-  Collection<String> get keys {
+  Iterable<String> get keys {
     final keys = [];
     forEach((k, v) => keys.add(k));
     return keys;
   }
 
-  Collection<String> get values {
+  Iterable<String> get values {
     final values = [];
     forEach((k, v) => values.add(v));
     return values;
diff --git a/tools/dom/templates/html/impl/impl_Window.darttemplate b/tools/dom/templates/html/impl/impl_Window.darttemplate
index 2f1c194..2d9493d 100644
--- a/tools/dom/templates/html/impl/impl_Window.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Window.darttemplate
@@ -231,10 +231,102 @@
    * lasting storage. This storage cannot be freed without the user's
    * permission. Returns a [Future] whose value stores a reference to the
    * sandboxed file system for use. Because the file system is sandboxed,
-   * applications cannot access file systems created in other web pages. 
+   * applications cannot access file systems created in other web pages.
    */
   Future<FileSystem> requestFileSystem(int size, {bool persistent: false}) {
     return _requestFileSystem(persistent? 1 : 0, size);
   }
+
+  @DomName('DOMWindow.convertPointFromNodeToPage')
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental
+  Point convertPointFromNodeToPage(Node node, Point point) {
+    var result = _convertPointFromNodeToPage(node,
+        new _DomPoint(point.x, point.y));
+    return new Point(result.x, result.y);
+  }
+
+  @DomName('DOMWindow.convertPointFromPageToNode')
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental
+  Point convertPointFromPageToNode(Node node, Point point) {
+    var result = _convertPointFromPageToNode(node,
+        new _DomPoint(point.x, point.y));
+    return new Point(result.x, result.y);
+  }
+
+  /**
+   * Checks whether [convertPointFromNodeToPage] and
+   * [convertPointFromPageToNode] are supported on the current platform.
+   */
+  static bool get supportsPointConversions => _DomPoint.supported;
 $!MEMBERS
+
+  @DomName('DOMWindow.beforeunloadEvent')
+  @DocsEditable
+  static const EventStreamProvider<BeforeUnloadEvent> beforeUnloadEvent =
+      const _BeforeUnloadEventStreamProvider('beforeunload');
+
+  @DomName('DOMWindow.onbeforeunload')
+  @DocsEditable
+  Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
+}
+
+/**
+ * Event object that is fired before the window is closed.
+ *
+ * The standard window close behavior can be prevented by setting the
+ * [returnValue]. This will display a dialog to the user confirming that they
+ * want to close the page.
+ */
+abstract class BeforeUnloadEvent implements Event {
+  /**
+   * If set to a non-null value, a dialog will be presented to the user
+   * confirming that they want to close the page.
+   */
+  String returnValue;
+}
+
+class _BeforeUnloadEvent extends _WrappedEvent implements BeforeUnloadEvent {
+  String _returnValue;
+
+  _BeforeUnloadEvent(Event base): super(base);
+
+  String get returnValue => _returnValue;
+
+  void set returnValue(String value) {
+    _returnValue = value;
+$if DART2JS
+    // FF and IE use the value as the return value, Chrome will return this from
+    // the event callback function.
+    if (JS('bool', '("returnValue" in #)', _base)) {
+      JS('void', '#.returnValue = #', _base, value);
+    }
+$endif
+  }
+}
+
+class _BeforeUnloadEventStreamProvider implements
+    EventStreamProvider<BeforeUnloadEvent> {
+  final String _eventType;
+
+  const _BeforeUnloadEventStreamProvider(this._eventType);
+
+  Stream<BeforeUnloadEvent> forTarget(EventTarget e, {bool useCapture: false}) {
+    var controller = new StreamController.broadcast();
+    var stream = new _EventStream(e, _eventType, useCapture);
+    stream.listen((event) {
+      var wrapped = new _BeforeUnloadEvent(event);
+      controller.add(wrapped);
+      return wrapped.returnValue;
+    });
+
+    return controller.stream;
+  }
+
+  String getEventType(EventTarget target) {
+    return _eventType;
+  }
 }
diff --git a/tools/dom/templates/html/impl/impl_WorkerContext.darttemplate b/tools/dom/templates/html/impl/impl_WorkerContext.darttemplate
deleted file mode 100644
index 9215272..0000000
--- a/tools/dom/templates/html/impl/impl_WorkerContext.darttemplate
+++ /dev/null
@@ -1,57 +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 $LIBRARYNAME;
-
-$(ANNOTATIONS)class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
-$if DART2JS
-  /**
-   * Gets an instance of the Indexed DB factory to being using Indexed DB.
-   *
-   * Use [IdbFactory.supported] to check if Indexed DB is supported on the
-   * current platform.
-   */
-  @SupportedBrowser(SupportedBrowser.CHROME, '23.0')
-  @SupportedBrowser(SupportedBrowser.FIREFOX, '15.0')
-  @SupportedBrowser(SupportedBrowser.IE, '10.0')
-  @Experimental
-  IdbFactory get indexedDB =>
-      JS('IdbFactory',
-         '#.indexedDB || #.webkitIndexedDB || #.mozIndexedDB',
-         this, this, this);
-$endif
-
-  /**
-   * Access a sandboxed file system of the specified `size`. If `persistent` is
-   * true, the application will request permission from the user to create
-   * lasting storage. This storage cannot be freed without the user's
-   * permission. Returns a [Future] whose value stores a reference to the
-   * sandboxed file system for use. Because the file system is sandboxed,
-   * applications cannot access file systems created in other web pages. 
-   */
-  @DomName('WorkerContext.webkitRequestFileSystem')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental
-  Future<FileSystem> requestFileSystem(int size, {bool persistent: false}) {
-    return _requestFileSystem(persistent? 1 : 0, size);
-  }
-
-  /**
-   * Access a sandboxed file system of the specified `size`. If `persistent` is
-   * true, the application will request permission from the user to create
-   * lasting storage. This storage cannot be freed without the user's
-   * permission. This call will block until a reference to the synchronous file 
-   * system API has been obtained. Because the file system is sandboxed,
-   * applications cannot access file systems created in other web pages. 
-   */
-  @DomName('WorkerContext.webkitRequestFileSystemSync')
-  @DocsEditable
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental
-  FileSystemSync requestFileSystemSync(int size, {bool persistent: false}) {
-    return _requestFileSystemSync(persistent? 1 : 0, size);
-  }
-$!MEMBERS
-}
diff --git a/tools/dom/templates/immutable_list_mixin.darttemplate b/tools/dom/templates/immutable_list_mixin.darttemplate
index 81c72e2..8b85dab 100644
--- a/tools/dom/templates/immutable_list_mixin.darttemplate
+++ b/tools/dom/templates/immutable_list_mixin.darttemplate
@@ -14,11 +14,12 @@
   // SVG Collections expose numberOfItems rather than length.
   int get length => numberOfItems;
 $endif
-  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, $E)) {
-    return IterableMixinWorkaround.reduce(this, initialValue, combine);
+  $E reduce($E combine($E value, $E element)) {
+    return IterableMixinWorkaround.reduce(this, combine);
   }
 
-  dynamic fold(dynamic initialValue, dynamic combine(dynamic, $E)) {
+  dynamic fold(dynamic initialValue,
+               dynamic combine(dynamic previousValue, $E element)) {
     return IterableMixinWorkaround.fold(this, initialValue, combine);
   }
 
@@ -30,7 +31,7 @@
 
   void forEach(void f($E element)) => IterableMixinWorkaround.forEach(this, f);
 
-  String join([String separator]) =>
+  String join([String separator = ""]) =>
       IterableMixinWorkaround.joinList(this, separator);
 
   Iterable map(f($E element)) =>
@@ -138,12 +139,6 @@
     throw new StateError("More than one element");
   }
 
-  $E min([int compare($E a, $E b)]) =>
-      IterableMixinWorkaround.min(this, compare);
-
-  $E max([int compare($E a, $E b)]) =>
-      IterableMixinWorkaround.max(this, compare);
-
   void insert(int index, $E element) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
@@ -160,14 +155,6 @@
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError("Cannot remove from immutable List.");
-  }
-
   void removeWhere(bool test($E element)) {
     throw new UnsupportedError("Cannot remove from immutable List.");
   }
@@ -188,15 +175,22 @@
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
+  Iterable<$E> getRange(int start, int end) =>
+    IterableMixinWorkaround.getRangeList(this, start, end);
+
   List<$E> sublist(int start, [int end]) {
     if (end == null) end = length;
     return Lists.getRange(this, start, end, <$E>[]);
   }
 
-  List<$E> getRange(int start, int rangeLength) =>
-      sublist(start, start + rangeLength);
-
   Map<int, $E> asMap() =>
     IterableMixinWorkaround.asMapList(this);
 
+  String toString() {
+    StringBuffer buffer = new StringBuffer('[');
+    buffer.writeAll(this, ', ');
+    buffer.write(']');
+    return buffer.toString();
+  }
+
   // -- end List<$E> mixins.
diff --git a/tools/gyp/configurations_make.gypi b/tools/gyp/configurations_make.gypi
index 8a73b91..b13dabd 100644
--- a/tools/gyp/configurations_make.gypi
+++ b/tools/gyp/configurations_make.gypi
@@ -25,10 +25,8 @@
           #'-ansi',
           '-fno-rtti',
           '-fno-exceptions',
-          '-fPIC',
           '-fvisibility=hidden',
           '-fvisibility-inlines-hidden',
-          '-fno-omit-frame-pointer',
         ],
       },
 
@@ -70,7 +68,10 @@
       },
 
       'Dart_Debug': {
-        'cflags': [ '-O<(dart_debug_optimization_level)' ],
+        'cflags': [
+          '-O<(dart_debug_optimization_level)',
+          '-fno-omit-frame-pointer',
+        ],
       },
 
       'Dart_Release': {
diff --git a/tools/only_in_release_mode.py b/tools/only_in_release_mode.py
new file mode 100644
index 0000000..2713b10
--- /dev/null
+++ b/tools/only_in_release_mode.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+"""
+Wrapper around a build action that should only be executed in release mode.
+
+The mode is defined via an environment varible DART_BUILD_MODE.
+
+The arguments to the script are:
+
+  only_in_release_mode.py files... -- command arguments...
+
+If mode is not 'release', the script will create the files listed
+before --.  If mode is release, the script will execute the command
+after --.
+"""
+
+import os
+import subprocess
+import sys
+
+
+def Main():
+  # Throws an error if '--' is not in the argument list.
+  separator_index = sys.argv.index('--')
+  outputs = sys.argv[1:separator_index]
+  arguments = sys.argv[separator_index + 1:]
+  mode = os.getenv('DART_BUILD_MODE', default='release')
+  if mode != 'release':
+    print >> sys.stderr, 'Not running %s in mode=%s' % (arguments, mode)
+    for output in outputs:
+      with open(output, 'w'):
+        # Create an empty file to ensure that we don't rerun this
+        # command unnecessarily.
+        pass
+    return 0
+  else:
+    try:
+      subprocess.check_call(arguments)
+    except subprocess.CalledProcessError as e:
+      return e.returncode
+    return 0
+
+
+if __name__ == '__main__':
+  sys.exit(Main())
diff --git a/tools/publish_all_pkgs.py b/tools/publish_all_pkgs.py
index 5ddeb20..1958a3b 100644
--- a/tools/publish_all_pkgs.py
+++ b/tools/publish_all_pkgs.py
@@ -21,7 +21,7 @@
   pkgs_to_publish = []
   for name in os.listdir('pkg'):
     if os.path.isdir(os.path.join('pkg', name)):
-      if name != '.svn' and name != 'fixnum':
+      if (name != '.svn' and name != 'fixnum' and name != 'expect':
         pkgs_to_publish.append(os.path.join('pkg', name))
 
   # Publish dart2js as an "unsupported" package.
diff --git a/tools/test.dart b/tools/test.dart
index 218f996..1d78bbc 100755
--- a/tools/test.dart
+++ b/tools/test.dart
@@ -77,15 +77,15 @@
   var startTime = new DateTime.now();
   // Extract global options from first configuration.
   var firstConf = configurations[0];
-  Map<String, RegExp> selectors = firstConf['selectors'];
   var maxProcesses = firstConf['tasks'];
   var progressIndicator = firstConf['progress'];
+  // TODO(kustermann): Remove this option once the buildbots don't use it
+  // anymore.
   var failureSummary = firstConf['failure-summary'];
   BuildbotProgressIndicator.stepName = firstConf['step_name'];
   var verbose = firstConf['verbose'];
   var printTiming = firstConf['time'];
   var listTests = firstConf['list'];
-  var useContentSecurityPolicy = firstConf['csp'];
 
   if (!firstConf['append_logs'])  {
     var file = new File(TestUtils.flakyFileName());
@@ -120,6 +120,8 @@
   var testSuites = new List<TestSuite>();
   var maxBrowserProcesses = maxProcesses;
   for (var conf in configurations) {
+    Map<String, RegExp> selectors = conf['selectors'];
+    var useContentSecurityPolicy = conf['csp'];
     if (!listTests && runningBrowserTests) {
       // Start global http servers that serve the entire dart repo.
       // The http server is available on window.location.port, and a second
@@ -195,10 +197,9 @@
     eventListener.add(new FlakyLogWriter());
     if (printFailures) {
       // The buildbot has it's own failure summary since it needs to wrap it
-      // into'@@@'-annotated sections.
-      var printFaiureSummary =
-          failureSummary && progressIndicator != 'buildbot';
-      eventListener.add(new TestFailurePrinter(printFaiureSummary, formatter));
+      // into '@@@'-annotated sections.
+      var printFailureSummary = progressIndicator != 'buildbot';
+      eventListener.add(new TestFailurePrinter(printFailureSummary, formatter));
     }
     eventListener.add(new ProgressIndicator.fromName(progressIndicator,
                                                      startTime,
diff --git a/tools/test.py b/tools/test.py
index d047998..f7794c1 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -19,7 +19,7 @@
   client = os.path.abspath(os.path.join(tools_dir, '..'));
   dart_script_name = 'test.dart'
   dart_test_script = string.join([tools_dir, dart_script_name], os.sep)
-  command = [utils.DartBinary(), dart_test_script] + args
+  command = [utils.DartBinary(), '--checked', dart_test_script] + args
   exit_code = subprocess.call(command)
   utils.DiagnoseExitCode(exit_code, command)
   return exit_code
diff --git a/tools/testing/dart/browser_test.dart b/tools/testing/dart/browser_test.dart
index cb8fd7d..2e9ec0a 100644
--- a/tools/testing/dart/browser_test.dart
+++ b/tools/testing/dart/browser_test.dart
@@ -33,7 +33,7 @@
 </html>
 """;
 
-String getHtmlLayoutContents(String scriptType, String sourceScript) =>
+String getHtmlLayoutContents(String scriptType, Path sourceScript) =>
 """
 <!DOCTYPE html>
 <html>
diff --git a/tools/testing/dart/multitest.dart b/tools/testing/dart/multitest.dart
index 44ba773..1af62b2 100644
--- a/tools/testing/dart/multitest.dart
+++ b/tools/testing/dart/multitest.dart
@@ -96,9 +96,10 @@
         for (String nextOutcome in annotation.outcomesList) {
           outcomes[annotation.key].add(nextOutcome);
           if (!validMultitestOutcomes.contains(nextOutcome)) {
-            Expect.fail(
-              "Invalid test directive '$nextOutcome' on line ${lineCount}:\n"
-              "${annotation.rest} ");
+            print(
+                "Invalid test directive '$nextOutcome' on line ${lineCount}:\n"
+                "${annotation.rest} ");
+            exit(1);
           }
         }
       }
@@ -111,8 +112,9 @@
   // Check that every key (other than the none case) has at least one outcome
   for (var outcomeKey in outcomes.keys) {
     if (outcomeKey != 'none' && outcomes[outcomeKey].isEmpty) {
-      Expect.fail("Test ${outcomeKey} has no valid annotated outcomes.\n"
-                  "Expected one of: ${validMultitestOutcomes.toString()}");
+      print("Test ${outcomeKey} has no valid annotated outcomes.\n"
+            "Expected one of: ${validMultitestOutcomes.toString()}");
+      exit(1);
     }
   }
 
@@ -172,7 +174,8 @@
             // This is just for safety reasons, we don't want
             // to unintentionally clobber files relative to the destination
             // dir when copying them ove.
-            Expect.fail("relative paths containing .. are not allowed.");
+            print("relative paths containing .. are not allowed.");
+            exit(1);
           }
           foundImports.add(relativePath);
           toSearch.add(libraryDir.join(relativePath));
@@ -192,7 +195,7 @@
 
   Path sourceDir = filePath.directoryPath;
   Path targetDir = CreateMultitestDirectory(outputDir, suiteDir);
-  Expect.isNotNull(targetDir);
+  assert(targetDir != null);
 
   // Copy all the relative imports of the multitest.
   Set<Path> importsToCopy = _findAllRelativeImports(filePath);
diff --git a/tools/testing/dart/status_expression.dart b/tools/testing/dart/status_expression.dart
index 2ac072a..95f175c 100644
--- a/tools/testing/dart/status_expression.dart
+++ b/tools/testing/dart/status_expression.dart
@@ -56,7 +56,7 @@
 
   List<String> tokenize() {
     if (!testRegexp.hasMatch(expression)) {
-      throw new ExpectException("Syntax error in '$expression'");
+      throw new FormatException("Syntax error in '$expression'");
     }
     for (Match match in regexp.allMatches(expression)) tokens.add(match[0]);
     return tokens;
@@ -229,13 +229,16 @@
     if (scanner.current == Token.LEFT_PAREN) {
       scanner.advance();
       SetExpression value = parseSetExpression();
-      Expect.equals(scanner.current, Token.RIGHT_PAREN,
-                    "Missing right parenthesis in expression");
+      if (scanner.current != Token.RIGHT_PAREN) {
+        throw new RuntimeError("Missing right parenthesis in expression");
+      }
       scanner.advance();
       return value;
     }
-    Expect.isTrue(new RegExp(r"^\w+$").hasMatch(scanner.current),
-                  "Expected identifier in expression, got ${scanner.current}");
+    if (!new RegExp(r"^\w+$").hasMatch(scanner.current)) {
+      throw new RuntimeError(
+          "Expected identifier in expression, got ${scanner.current}");
+    }
     SetExpression value = new SetConstant(scanner.current);
     scanner.advance();
     return value;
@@ -267,25 +270,32 @@
     if (scanner.current == Token.LEFT_PAREN) {
       scanner.advance();
       BooleanExpression value = parseBooleanExpression();
-      Expect.equals(scanner.current, Token.RIGHT_PAREN,
-                    "Missing right parenthesis in expression");
+      if (scanner.current != Token.RIGHT_PAREN) {
+        throw new RuntimeError("Missing right parenthesis in expression");
+      }
       scanner.advance();
       return value;
     }
 
     // The only atomic booleans are of the form $variable == value or the
     // form $variable.
-    Expect.equals(scanner.current, Token.DOLLAR_SYMBOL,
-        "Expected \$ in expression, got ${scanner.current}");
+    if (scanner.current != Token.DOLLAR_SYMBOL) {
+      throw new RuntimeError(
+          "Expected \$ in expression, got ${scanner.current}");
+    }
     scanner.advance();
-    Expect.isTrue(new RegExp(r"^\w+$").hasMatch(scanner.current),
-        "Expected identifier in expression, got ${scanner.current}");
+    if (!new RegExp(r"^\w+$").hasMatch(scanner.current)) {
+      throw new RuntimeError(
+          "Expected identifier in expression, got ${scanner.current}");
+    }
     TermVariable left = new TermVariable(scanner.current);
     scanner.advance();
     if (scanner.current == Token.EQUALS) {
       scanner.advance();
-      Expect.isTrue(new RegExp(r"^\w+$").hasMatch(scanner.current),
-          "Expected identifier in expression, got ${scanner.current}");
+      if (!new RegExp(r"^\w+$").hasMatch(scanner.current)) {
+        throw new RuntimeError(
+            "Expected identifier in expression, got ${scanner.current}");
+      }
       TermConstant right = new TermConstant(scanner.current);
       scanner.advance();
       return new Comparison(left, right);
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index d751ab4..0932f21 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -79,10 +79,10 @@
    dartc: Perform static analysis on Dart code by running dartc.
           (only valid with the following runtimes: none),
 
-   new_analyzer: Perform static analysis on Dart code by running the analyzer.
+   dartanalyzer: Perform static analysis on Dart code by running the analyzer.
           (only valid with the following runtimes: none)''',
               ['-c', '--compiler'],
-              ['none', 'dart2dart', 'dart2js', 'dartc', 'new_analyzer'],
+              ['none', 'dart2dart', 'dart2js', 'dartc', 'dartanalyzer'],
               'none'),
           new _TestOptionSpecification(
               'runtime',
@@ -442,7 +442,7 @@
                                'opera'];
         break;
       case 'dartc':
-      case 'new_analyzer':
+      case 'dartanalyzer':
         validRuntimes = const ['none'];
         break;
       case 'none':
@@ -591,7 +591,7 @@
       var timeout = 60;
       switch (configuration['compiler']) {
         case 'dartc':
-        case 'new_analyzer':
+        case 'dartanalyzer':
           timeout *= 4;
           break;
         case 'dart2js':
diff --git a/tools/testing/dart/test_progress.dart b/tools/testing/dart/test_progress.dart
index af5caf6..5eac74a 100644
--- a/tools/testing/dart/test_progress.dart
+++ b/tools/testing/dart/test_progress.dart
@@ -310,7 +310,7 @@
   }
 }
 
-class LineProgressIndicator extends EventListener {
+class LineProgressIndicator extends EventListener implements ProgressIndicator {
   void done(TestCase test) {
     var status = 'pass';
     if (test.lastCommandOutput.unexpectedOutput) {
diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
index f81135d..5dd8e19 100644
--- a/tools/testing/dart/test_runner.dart
+++ b/tools/testing/dart/test_runner.dart
@@ -33,6 +33,12 @@
 typedef void ExitCodeEvent(int exitCode);
 typedef void EnqueueMoreWork(ProcessQueue queue);
 
+// Some IO tests use these variables and get confused if the host environment
+// variables are inherited so they are excluded.
+const List<String> EXCLUDED_ENVIRONMENT_VARIABLES =
+    const ['http_proxy', 'https_proxy', 'no_proxy',
+           'HTTP_PROXY', 'HTTPS_PROXY', 'NO_PROXY'];
+
 
 /**
  * [areByteArraysEqual] compares a range of bytes from [buffer1] with a
@@ -161,7 +167,7 @@
             var dependencyLastModified =
                 TestUtils.lastModifiedCache.getLastModified(dependency);
             if (dependencyLastModified == null ||
-                dependencyLastModified > jsOutputLastModified) {
+                dependencyLastModified.isAfter(jsOutputLastModified)) {
               return false;
             }
           }
@@ -275,8 +281,9 @@
     // PREFIX EXECUTABLE SUFFIX ARGUMENTS
     var specialCommand = configuration['special-command'];
     if (!specialCommand.isEmpty) {
-      Expect.isTrue(specialCommand.contains('@'),
-                    "special-command must contain a '@' char");
+      if (!specialCommand.contains('@')) {
+        throw new FormatException("special-command must contain a '@' char");
+      }
       var specialCommandSplit = specialCommand.split('@');
       var prefix = specialCommandSplit[0].trim();
       var suffix = specialCommandSplit[1].trim();
@@ -393,8 +400,7 @@
 
   List<String> get batchRunnerArguments => [_lastArguments[0], '--batch'];
 
-  List<String> get batchTestArguments =>
-      _lastArguments.getRange(1, _lastArguments.length - 1);
+  List<String> get batchTestArguments => _lastArguments.sublist(1);
 
   /** Add a test case to listen for when this current test has completed. */
   void addObserver(BrowserTestCase testCase) {
@@ -810,7 +816,7 @@
 
   bool _didMultitestFail(List errors, List staticWarnings) {
     Set<String> outcome = testCase.info.multitestOutcome;
-    Expect.isNotNull(outcome);
+    if (outcome == null) throw "outcome must not be null";
     if (outcome.contains('compile-time error') && errors.length > 0) {
       return true;
     } else if (outcome.contains('static type warning')
@@ -943,7 +949,9 @@
   RunningProcess(TestCase this.testCase, Command this.command);
 
   Future<CommandOutput> start() {
-    Expect.isFalse(testCase.expectedOutcomes.contains(SKIP));
+    if (testCase.expectedOutcomes.contains(SKIP)) {
+      throw "testCase.expectedOutcomes must not contain 'SKIP'.";
+    }
 
     completer = new Completer<CommandOutput>();
     startTime = new DateTime.now();
@@ -1020,6 +1028,11 @@
     options.environment = new Map<String, String>.from(baseEnvironment);
     options.environment['DART_CONFIGURATION'] =
         TestUtils.configurationDir(testCase.configuration);
+
+    for (var excludedEnvironmentVariable in EXCLUDED_ENVIRONMENT_VARIABLES) {
+      options.environment.remove(excludedEnvironmentVariable);
+    }
+
     return options;
   }
 }
@@ -1055,7 +1068,7 @@
   bool get active => _currentTest != null;
 
   void startTest(TestCase testCase) {
-    Expect.isNull(_currentTest);
+    if (_currentTest != null) throw "_currentTest must be null.";
     _currentTest = testCase;
     _command = testCase.commands.last;
     if (_process == null) {
@@ -1413,7 +1426,7 @@
 
   void _runTest(TestCase test) {
     if (test.usesWebDriver) {
-      browserUsed = test.configuration['browser'];
+      browserUsed = test.configuration['runtime'];
       if (_needsSelenium) _ensureSeleniumServerRunning();
     }
     eventTestAdded(test);
@@ -1652,7 +1665,9 @@
 
     var nextCommandIndex = testCase.commandOutputs.keys.length;
     var numberOfCommands = testCase.commands.length;
-    Expect.isTrue(nextCommandIndex < numberOfCommands);
+    if (nextCommandIndex >= numberOfCommands) {
+      throw "nextCommandIndex must be less than numberOfCommands";
+    }
     var command = testCase.commands[nextCommandIndex];
     var isLastCommand = nextCommandIndex == (numberOfCommands - 1);
 
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 24c71dc..6381a12 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -140,7 +140,7 @@
     var name;
     switch (configuration['compiler']) {
       case 'dartc':
-      case 'new_analyzer':
+      case 'dartanalyzer':
         name = executablePath;
         break;
       case 'dart2js':
@@ -181,8 +181,8 @@
         return '$buildDir/dart$suffix';
       case 'dartc':
         return '$buildDir/analyzer/bin/dart_analyzer$suffix';
-      case 'new_analyzer':
-        return 'sdk/bin/analyzer$suffix';
+      case 'dartanalyzer':
+        return 'sdk/bin/dartanalyzer_developer$suffix';
       default:
         throw "Unknown executable for: ${configuration['compiler']}";
     }
@@ -397,7 +397,7 @@
                   this.hasCompileError, this.hasRuntimeError,
                   this.isNegativeIfChecked, this.hasFatalTypeErrors,
                   this.multitestOutcome) {
-    Expect.isTrue(filePath.isAbsolute);
+    assert(filePath.isAbsolute);
   }
 }
 
@@ -473,8 +473,8 @@
     if (!useSdk) return [];
 
     var snapshotPath = TestUtils.absolutePath(new Path(buildDir).join(
-        new Path('dart-sdk/lib/_internal/compiler/'
-                 'implementation/dart2js.dart.snapshot'))).toString();
+        new Path('dart-sdk/bin/snapshots/'
+                 'utils_wrapper.dart.snapshot'))).toString();
     return [new Uri.fromComponents(scheme: 'file', path: snapshotPath)];
   }
 
@@ -528,7 +528,7 @@
       return new Future.immediate(null);
     }
 
-    Expect.isTrue(updater.isActive);
+    assert(updater.isActive);
     updater.onUpdated.add(() => completer.complete(null));
 
     return completer.future;
@@ -637,10 +637,10 @@
     } else {
       // The test name is the relative path from the test suite directory to
       // the test, with the .dart extension removed.
-      Expect.isTrue(filePath.toNativePath().startsWith(
+      assert(filePath.toNativePath().startsWith(
                     suiteDir.toNativePath()));
       var testNamePath = filePath.relativeTo(suiteDir);
-      Expect.isTrue(testNamePath.extension == 'dart');
+      assert(testNamePath.extension == 'dart');
       if (testNamePath.extension == 'dart') {
         testName = testNamePath.directoryPath.append(
             testNamePath.filenameWithoutExtension).toString();
@@ -717,7 +717,7 @@
                                                   info.optionsFromFile);
 
     List<List<String>> vmOptionsList = getVmOptions(info.optionsFromFile);
-    Expect.isFalse(vmOptionsList.isEmpty, "empty vmOptionsList");
+    assert(!vmOptionsList.isEmpty);
 
     for (var vmOptions in vmOptionsList) {
       doTest(new TestCase('$suiteName/$testName',
@@ -781,7 +781,7 @@
 
     case 'none':
     case 'dartc':
-    case 'new_analyzer':
+    case 'dartanalyzer':
       var arguments = new List.from(vmOptions);
       arguments.addAll(args);
       return <Command>[new Command(dartShellFileName, arguments)];
@@ -836,7 +836,8 @@
       return "/$PREFIX_DARTDIR/$fileRelativeToDartDir";
     }
     // Unreachable
-    Expect.fail('This should be unreachable.');
+    print("Cannot create URL for path $file. Not in build or dart directory.");
+    exit(1);
   }
 
   String _getUriForBrowserTest(TestInformation info,
@@ -848,7 +849,7 @@
     var serverPort = "PORT";
     var crossOriginPort = "CROSS_ORIGIN_PORT";
     if (!configuration['list']) {
-      Expect.isTrue(configuration.containsKey('_servers_'));
+      assert(configuration.containsKey('_servers_'));
       serverPort = configuration['_servers_'].port;
       crossOriginPort = configuration['_servers_'].crossOriginPort;
     }
@@ -970,7 +971,7 @@
         List<String> otherScripts = optionsFromFile['otherScripts'];
         for (String name in otherScripts) {
           Path namePath = new Path(name);
-          Expect.equals(namePath.extension, 'dart');
+          assert(namePath.extension == 'dart');
           String baseName = namePath.filenameWithoutExtension;
           Path fromPath = filePath.directoryPath.join(namePath);
           commands.add(_compileCommand(
@@ -1012,7 +1013,10 @@
           }
           commandSet.add(new Command('python', args));
         } else {
-          Expect.isTrue(runtime == "drt");
+          if (runtime != "drt") {
+            print("Unknown runtime $runtime");
+            exit(1);
+          }
 
           var dartFlags = [];
           var dumpRenderTreeOptions = [];
@@ -1085,7 +1089,8 @@
         args.add(inputFile);
         break;
       default:
-        Expect.fail('unimplemented compiler $compiler');
+        print('unimplemented compiler $compiler');
+        exit(1);
     }
     if (executable.endsWith('.dart')) {
       // Run the compiler script via the Dart VM.
@@ -1148,12 +1153,13 @@
       case 'dart2dart':
         return 'application/dart';
       case 'dart2js':
-      case 'new_analyzer':
+      case 'dartanalyzer':
       case 'dartc':
         return 'text/javascript';
       default:
-        Expect.fail('Non-web runtime, so no scriptType for: '
+        print('Non-web runtime, so no scriptType for: '
                     '${configuration["compiler"]}');
+        exit(1);
         return null;
     }
   }
@@ -1216,7 +1222,7 @@
     bool isMultitest = optionsFromFile["isMultitest"];
     List<String> dartOptions = optionsFromFile["dartOptions"];
     List<List<String>> vmOptionsList = getVmOptions(optionsFromFile);
-    Expect.isTrue(!isMultitest || dartOptions == null);
+    assert(!isMultitest || dartOptions == null);
     if (dartOptions == null) {
       args.add(filePath.toNativePath());
     } else {
@@ -1225,7 +1231,7 @@
       var file = new File(executable_name);
       if (!file.existsSync()) {
         executable_name = '../$executable_name';
-        Expect.isTrue(new File(executable_name).existsSync());
+        assert(new File(executable_name).existsSync());
         dartOptions[0] = executable_name;
       }
       args.addAll(dartOptions);
@@ -1710,8 +1716,7 @@
       base = new Path('/');
     }
     Directory dir = new Directory.fromPath(base);
-    Expect.isTrue(dir.existsSync(),
-                  "Expected ${dir} to already exist");
+    assert(dir.existsSync());
     var segments = relativePath.segments();
     for (String segment in segments) {
       base = base.append(segment);
@@ -1725,7 +1730,7 @@
       if (!dir.existsSync()) {
         dir.createSync();
       }
-      Expect.isTrue(dir.existsSync(), "Failed to create ${dir.path}");
+      assert(dir.existsSync());
     }
     return dir;
   }
@@ -1832,7 +1837,7 @@
       const ['d8', 'jsshell'].contains(runtime);
 
   static bool isCommandLineAnalyzer(String compiler) =>
-      compiler == 'dartc' || compiler == 'new_analyzer';
+      compiler == 'dartc' || compiler == 'dartanalyzer';
 
   static String buildDir(Map configuration) {
     // FIXME(kustermann,ricow): Our code assumes that the returned 'buildDir'
diff --git a/utils/apidoc/apidoc.dart b/utils/apidoc/apidoc.dart
index a4fbe43..b7783b4 100644
--- a/utils/apidoc/apidoc.dart
+++ b/utils/apidoc/apidoc.dart
@@ -17,6 +17,7 @@
 import 'dart:async';
 import 'dart:io';
 import 'dart:json' as json;
+import 'dart:uri';
 
 import 'html_diff.dart';
 
@@ -25,6 +26,7 @@
 import '../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart';
 import '../../sdk/lib/_internal/dartdoc/lib/dartdoc.dart';
 import '../../sdk/lib/_internal/libraries.dart';
+import 'package:pathos/path.dart' as pathos;
 
 HtmlDiff _diff;
 
@@ -37,7 +39,7 @@
 
   List<String> excludedLibraries = <String>[];
   List<String> includedLibraries = <String>[];
-  Path packageRoot;
+  String packageRoot;
   String version;
 
   // Parse the command-line arguments.
@@ -65,7 +67,7 @@
         } else if (arg.startsWith('--out=')) {
           outputDir = new Path(arg.substring('--out='.length));
         } else if (arg.startsWith('--package-root=')) {
-          packageRoot = new Path(arg.substring('--package-root='.length));
+          packageRoot = arg.substring('--package-root='.length);
         } else if (arg.startsWith('--version=')) {
           version = arg.substring('--version='.length);
         } else {
@@ -104,10 +106,10 @@
   // TODO(johnniwinther): Libraries for the compilation seem to be more like
   // URIs. Perhaps Path should have a toURI() method.
   // Add all of the core libraries.
-  final apidocLibraries = <Path>[];
+  final apidocLibraries = <Uri>[];
   LIBRARIES.forEach((String name, LibraryInfo info) {
     if (info.documented) {
-      apidocLibraries.add(new Path('dart:$name'));
+      apidocLibraries.add(Uri.parse('dart:$name'));
     }
   });
 
@@ -130,7 +132,7 @@
       }
 
       if (new File.fromPath(libPath).existsSync()) {
-        apidocLibraries.add(libPath);
+        apidocLibraries.add(_pathToFileUri(libPath.toNativePath()));
         includedLibraries.add(libName);
       } else {
         print('Warning: could not find package at $path');
@@ -147,7 +149,7 @@
 
     // TODO(amouravski): make apidoc use roughly the same flow as bin/dartdoc.
     Future.wait([copiedStatic, copiedApiDocStatic, htmlDiff])
-      .then((_) => apidoc.documentLibraries( apidocLibraries, libPath,
+      .then((_) => apidoc.documentLibraries(apidocLibraries, libPath,
             packageRoot))
       .then((_) => compileScript(mode, outputDir, libPath))
       .then((_) => print(apidoc.status))
@@ -447,3 +449,14 @@
     return a(memberUrl(member), memberName);
   }
 }
+
+/** Converts a local path string to a `file:` [Uri]. */
+Uri _pathToFileUri(String path) {
+  path = pathos.absolute(path);
+  if (Platform.operatingSystem != 'windows') {
+    return Uri.parse('file://$path');
+  } else {
+    return Uri.parse('file:///${path.replaceAll("\\", "/")}');
+  }
+}
+
diff --git a/utils/apidoc/apidoc.gyp b/utils/apidoc/apidoc.gyp
index f3f484a..f75e4c7 100644
--- a/utils/apidoc/apidoc.gyp
+++ b/utils/apidoc/apidoc.gyp
@@ -28,24 +28,55 @@
       'actions': [
         {
           'action_name': 'run_apidoc',
+          # The 'inputs' list records the files whose timestamps are
+          # compared to the files listed in 'outputs'.  If a file
+          # 'outputs' doesn't exist or if a file in 'inputs' is newer
+          # than a file in 'outputs', this action is executed.  Notice
+          # that the dependencies listed above has nothing to do with
+          # when this action is executed.  You must list a file in
+          # 'inputs' to make sure that it exists before the action is
+          # executed, or to make sure this action is re-run.
+          #
+          # We want to build the platform documentation whenever
+          # dartdoc, apidoc, or its dependency changes.  This prevents
+          # people from accidentally breaking apidoc when making
+          # changes to the platform libraries and or when modifying
+          # dart2js or the VM.
+          #
+          # In addition, we want to make sure that the platform
+          # documentation is regenerated when the platform sources
+          # changes.
+          #
+          # So we want this action to be re-run when a dart file
+          # changes in this directory, or in the SDK library (we may
+          # no longer need to list the files in ../../runtime/lib and
+          # ../../runtime/bin, as most of them has moved to
+          # ../../sdk/lib).
+          #
+          # In addition, we want to make sure the documentation is
+          # regenerated when a resource file (CSS, PNG, etc) is
+          # updated.  This is because these files are also copied to
+          # the output directory.
           'inputs': [
             '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
-            '<(PRODUCT_DIR)/dart2js.snapshot',
+            '<(SHARED_INTERMEDIATE_DIR)/utils_wrapper.dart.snapshot',
             '<!@(["python", "../../tools/list_files.py", "\\.(css|ico|js|json|png|sh|txt|yaml|py)$", ".", "../../sdk/lib/_internal/dartdoc"])',
-            '<!@(["python", "../../tools/list_files.py", "\\.dart$", "../../sdk/lib", "../../runtime/lib", "../../runtime/bin"])',
+            '<!@(["python", "../../tools/list_files.py", "\\.dart$", ".", "../../sdk/lib", "../../runtime/lib", "../../runtime/bin"])',
             '../../sdk/bin/dart',
             '../../sdk/bin/dart.bat',
             '../../sdk/bin/dart2js',
             '../../sdk/bin/dart2js.bat',
-          ],
-          'inputs': [
-            '<!@(["python", "../../tools/list_files.py", "\\.(css|png|dart)$", "."])',
+            '../../tools/only_in_release_mode.py',
           ],
           'outputs': [
             '<(PRODUCT_DIR)/api_docs/index.html',
             '<(PRODUCT_DIR)/api_docs/client-static.js',
           ],
           'action': [
+            'python',
+            '../../tools/only_in_release_mode.py',
+            '<@(_outputs)',
+            '--',
             '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
             '--package-root=<(PRODUCT_DIR)/packages/',
             'apidoc.dart',
@@ -56,6 +87,7 @@
             '--exclude-lib=analyzer_experimental',
             '--exclude-lib=browser',
             '--exclude-lib=dartdoc',
+            '--exclude-lib=expect',
             '--exclude-lib=http',
             '--exclude-lib=oauth2',
             '--exclude-lib=pathos',
diff --git a/utils/compiler/compiler.gyp b/utils/compiler/compiler.gyp
index 784a75b..1755ce2 100644
--- a/utils/compiler/compiler.gyp
+++ b/utils/compiler/compiler.gyp
@@ -22,40 +22,15 @@
             '<!@(["python", "../../tools/list_files.py", "\\.dart$", "../../sdk/lib/_internal/compiler", "../../runtime/lib"])',
           ],
           'outputs': [
-            '<(PRODUCT_DIR)/dart2js.snapshot',
+            '<(SHARED_INTERMEDIATE_DIR)/utils_wrapper.dart.snapshot',
           ],
           'action': [
             '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
-            # Note: we don't store the snapshot in the location where
-            # the dart2js script is looking for it.  The motivation
-            # for that is to support an incremental development model
-            # for dart2js compiler engineers.  However, we install the
-            # snapshot in the proper location when building the SDK.
-            '--generate-script-snapshot=<(PRODUCT_DIR)/dart2js.snapshot',
-            '../../sdk/lib/_internal/compiler/implementation/dart2js.dart',
+            'create_snapshot.dart',
+            '--output_dir=<(SHARED_INTERMEDIATE_DIR)',
+            '--dart2js_main=sdk/lib/_internal/compiler/implementation/dart2js.dart',
           ],
         },
-        {
-          # TODO(ahe): Remove this action after a few days.
-          'action_name': 'remove_old_scripts',
-          'inputs': [
-            'remove_old_scripts.py',
-          ],
-          'outputs': [
-            '<(INTERMEDIATE_DIR)/<(_action_name).success',
-          ],
-          'action': [
-            'python',
-            '<@(_inputs)',
-            '<@(_outputs)',
-            '<(PRODUCT_DIR)/dart2js',
-            '<(PRODUCT_DIR)/dart2js.bat',
-            '<(PRODUCT_DIR)/dart2js_developer',
-            '<(PRODUCT_DIR)/dart2js_developer.bat',
-            '<(PRODUCT_DIR)/dartdoc',
-            '<(PRODUCT_DIR)/dartdoc.bat',
-          ]
-        },
       ],
     },
   ],
diff --git a/utils/compiler/create_snapshot.dart b/utils/compiler/create_snapshot.dart
new file mode 100644
index 0000000..f0e50082
--- /dev/null
+++ b/utils/compiler/create_snapshot.dart
@@ -0,0 +1,90 @@
+// 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 'dart:io';
+
+Future<String> getVersion(var options, var rootPath) {
+  var versionPath = rootPath.append("tools").append("version.dart");
+  return Process.run(options.executable,
+                     [versionPath.toNativePath()])
+      .then((result) {
+        if (result.exitCode != 0) {
+          throw "Could not generate version";
+        }
+        return result.stdout.trim();
+      });
+}
+
+Future<String> getSnapshotGenerationFile(var options, var args, var rootPath) {
+  var dart2js = rootPath.append(args["dart2js_main"]);
+
+  return getVersion(options, rootPath).then((version) {
+    var snapshotGenerationText = 
+"""
+import '${dart2js}' as dart2jsMain;
+import 'dart:io';
+
+void main() {
+  Options options = new Options();
+  if (options.arguments.length < 1) throw "No tool given as argument";
+  String tool = options.arguments.removeAt(0);
+  if (tool == "dart2js") {
+    dart2jsMain.BUILD_ID = "$version";
+    dart2jsMain.mainWithErrorHandler(options);
+  }
+}
+
+""";
+    return snapshotGenerationText;
+  });
+}
+
+void writeSnapshotFile(var path, var content) {
+    File file = new File(path);
+    var writer = file.openSync(mode: FileMode.WRITE);
+    writer.writeStringSync(content);
+    writer.close();
+}
+
+Future createSnapshot(var options, var dart_file) {
+  return Process.run(options.executable,
+                     ["--generate-script-snapshot=$dart_file.snapshot",
+                      dart_file])
+      .then((result) {
+        if (result.exitCode != 0) {
+          throw "Could not generate snapshot";
+        }
+      });
+}
+
+/**
+ * Takes the following arguments:
+ * --output_dir=val     The full path to the output_dir.
+ * --dart2js_main=val   The path to the dart2js main script releative to root.
+ */
+void main() { 
+  Options options = new Options();
+  var validArguments = ["--output_dir", "--dart2js_main"];
+  var args = {};
+  for (var argument in options.arguments) {
+    var argumentSplit = argument.split("=");
+    if (argumentSplit.length != 2) throw "Invalid argument $argument, no =";
+    if (!validArguments.contains(argumentSplit[0])) {
+      throw "Invalid argument $argument";
+    }
+    args[argumentSplit[0].substring(2)] = argumentSplit[1];
+  }
+  if (!args.containsKey("dart2js_main")) throw "Please specify dart2js_main";
+  if (!args.containsKey("output_dir")) throw "Please specify output_dir";
+
+  var scriptFile = new File(options.script);
+  var path = new Path(scriptFile.directorySync().path); 
+  var rootPath = path.directoryPath.directoryPath;
+
+  getSnapshotGenerationFile(options, args, rootPath).then((result) {
+    var wrapper = "${args['output_dir']}/utils_wrapper.dart";
+    writeSnapshotFile(wrapper, result);
+    createSnapshot(options, wrapper);
+  });
+}
diff --git a/utils/compiler/remove_old_scripts.py b/utils/compiler/remove_old_scripts.py
deleted file mode 100644
index ffa6400..0000000
--- a/utils/compiler/remove_old_scripts.py
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-'''
-Tool for deleting files given on the command line, and touching a
-file on success.
-
-Usage:
-  python tools/list_files.py FILE_TO_TOUCH FILES_TO_DELETE...
-'''
-
-import os
-import sys
-
-
-def main(argv):
-  file_to_touch = argv[1]
-  for filename in argv[2:]:
-    if os.path.exists(filename):
-      os.remove(filename)
-  with file(file_to_touch, 'a'):
-    os.utime(file_to_touch, None)
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/utils/pub/error_group.dart b/utils/pub/error_group.dart
index f579d8e..b5f8f8e 100644
--- a/utils/pub/error_group.dart
+++ b/utils/pub/error_group.dart
@@ -230,7 +230,7 @@
   StreamSubscription _subscription;
 
   /// Whether [this] has any listeners.
-  bool get _hasListeners => _controller.hasSubscribers;
+  bool get _hasListeners => _controller.hasListener;
 
   /// Creates a new [_ErrorGroupFuture] that's a child of [_group] and wraps
   /// [inner].
diff --git a/utils/pub/io.dart b/utils/pub/io.dart
index 3eed22c..8523d34 100644
--- a/utils/pub/io.dart
+++ b/utils/pub/io.dart
@@ -149,7 +149,7 @@
       var entityPath = entity.path;
       if (!includeHidden && path.basename(entityPath).startsWith('.')) continue;
 
-      // TODO(nweiz): remove this when issue 4928 is fixed.
+      // TODO(nweiz): remove this when issue 9832 is fixed.
       if (entity is Link) {
         // We treat broken symlinks as files, in that we don't want to recurse
         // into them.
@@ -188,12 +188,7 @@
 void deleteEntry(String path) {
   if (linkExists(path)) {
     log.io("Deleting link $path.");
-    if (Platform.operatingSystem == 'windows') {
-      // TODO(nweiz): remove this when issue 9278 is fixed.
-      new Directory(path).deleteSync();
-    } else {
-      new Link(path).deleteSync();
-    }
+    new Link(path).deleteSync();
   } else if (dirExists(path)) {
     log.io("Deleting directory $path.");
     new Directory(path).deleteSync(recursive: true);
diff --git a/utils/pub/package.dart b/utils/pub/package.dart
index d3d9819..883b01b1 100644
--- a/utils/pub/package.dart
+++ b/utils/pub/package.dart
@@ -48,12 +48,12 @@
         where((entry) => entry.contains(_README_REGEXP));
     if (readmes.isEmpty) return;
 
-    return path.join(dir, readmes.min((readme1, readme2) {
+    return path.join(dir, readmes.reduce((readme1, readme2) {
       var extensions1 = ".".allMatches(readme1).length;
       var extensions2 = ".".allMatches(readme2).length;
       var comparison = extensions1.compareTo(extensions2);
-      if (comparison != 0) return comparison;
-      return readme1.compareTo(readme2);
+      if (comparison == 0) comparison = readme1.compareTo(readme2);
+      return (comparison <= 0) ? readme1 : readme2;
     }));
   }
 
diff --git a/utils/pub/safe_http_server.dart b/utils/pub/safe_http_server.dart
index 7fd522b..8843e48 100644
--- a/utils/pub/safe_http_server.dart
+++ b/utils/pub/safe_http_server.dart
@@ -131,7 +131,7 @@
   List<Cookie> get cookies => _inner.cookies;
   Future<Socket> detachSocket() => _inner.detachSocket();
   HttpConnectionInfo get connectionInfo => _inner.connectionInfo;
-  void writeBytes(List<int> data) => _inner.writeBytes(data);
+  void add(List<int> data) => _inner.add(data);
   Future<HttpResponse> consume(Stream<List<int>> stream) =>
     _inner.consume(stream);
   Future<HttpResponse> addStream(Stream<List<int>> stream) =>
diff --git a/utils/pub/utils.dart b/utils/pub/utils.dart
index cb316cbe..47c27fc 100644
--- a/utils/pub/utils.dart
+++ b/utils/pub/utils.dart
@@ -110,7 +110,7 @@
 
 /// Returns a set containing all elements in [minuend] that are not in
 /// [subtrahend].
-Set setMinus(Collection minuend, Collection subtrahend) {
+Set setMinus(Iterable minuend, Iterable subtrahend) {
   var minuendSet = new Set.from(minuend);
   minuendSet.removeAll(subtrahend);
   return minuendSet;
@@ -333,13 +333,13 @@
 String urlDecode(String encoded) =>
   decodeUriComponent(encoded.replaceAll("+", " "));
 
-/// Takes a simple data structure (composed of [Map]s, [List]s, scalar objects,
-/// and [Future]s) and recursively resolves all the [Future]s contained within.
-/// Completes with the fully resolved structure.
+/// Takes a simple data structure (composed of [Map]s, [Iterable]s, scalar
+/// objects, and [Future]s) and recursively resolves all the [Future]s contained
+/// within. Completes with the fully resolved structure.
 Future awaitObject(object) {
   // Unroll nested futures.
   if (object is Future) return object.then(awaitObject);
-  if (object is Collection) {
+  if (object is Iterable) {
     return Future.wait(object.map(awaitObject).toList());
   }
   if (object is! Map) return new Future.immediate(object);
diff --git a/utils/tests/pub/command_line_config.dart b/utils/tests/pub/command_line_config.dart
index f05f931..1efd7d1d 100644
--- a/utils/tests/pub/command_line_config.dart
+++ b/utils/tests/pub/command_line_config.dart
@@ -5,6 +5,7 @@
 library command_line_config;
 
 import 'dart:io';
+import 'dart:math';
 
 import 'package:pathos/path.dart' as path;
 import 'package:unittest/unittest.dart';
@@ -91,7 +92,7 @@
     if (stack.length == 0) return;
 
     // Figure out the longest path so we know how much to pad.
-    int longest = stack.map((frame) => frame.location.length).max();
+    int longest = stack.map((frame) => frame.location.length).reduce(max);
 
     // Print out the stack trace nicely formatted.
     for (var frame in stack) {
diff --git a/utils/tests/pub/install/git/check_out_and_update_test.dart b/utils/tests/pub/install/git/check_out_and_update_test.dart
index 14e65c7..3af7fb7 100644
--- a/utils/tests/pub/install/git/check_out_and_update_test.dart
+++ b/utils/tests/pub/install/git/check_out_and_update_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration('checks out and updates a package from Git', () {
     ensureGit();
 
diff --git a/utils/tests/pub/install/git/check_out_branch_test.dart b/utils/tests/pub/install/git/check_out_branch_test.dart
index 8375fb2..2df0198 100644
--- a/utils/tests/pub/install/git/check_out_branch_test.dart
+++ b/utils/tests/pub/install/git/check_out_branch_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration('checks out a package at a specific branch from Git', () {
     ensureGit();
 
diff --git a/utils/tests/pub/install/git/check_out_revision_test.dart b/utils/tests/pub/install/git/check_out_revision_test.dart
index e9fec81..b763dd4 100644
--- a/utils/tests/pub/install/git/check_out_revision_test.dart
+++ b/utils/tests/pub/install/git/check_out_revision_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration('checks out a package at a specific revision from Git', () {
     ensureGit();
 
diff --git a/utils/tests/pub/install/git/check_out_test.dart b/utils/tests/pub/install/git/check_out_test.dart
index dcd530b..c2a4f68 100644
--- a/utils/tests/pub/install/git/check_out_test.dart
+++ b/utils/tests/pub/install/git/check_out_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration('checks out a package from Git', () {
     ensureGit();
 
diff --git a/utils/tests/pub/install/git/check_out_transitive_test.dart b/utils/tests/pub/install/git/check_out_transitive_test.dart
index 6031447..d68763c 100644
--- a/utils/tests/pub/install/git/check_out_transitive_test.dart
+++ b/utils/tests/pub/install/git/check_out_transitive_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration('checks out packages transitively from Git', () {
     ensureGit();
 
diff --git a/utils/tests/pub/install/git/check_out_twice_test.dart b/utils/tests/pub/install/git/check_out_twice_test.dart
index 8ddd2ac..87d9a94 100644
--- a/utils/tests/pub/install/git/check_out_twice_test.dart
+++ b/utils/tests/pub/install/git/check_out_twice_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration('checks out a package from Git twice', () {
     ensureGit();
 
diff --git a/utils/tests/pub/install/git/check_out_with_trailing_slash_test.dart b/utils/tests/pub/install/git/check_out_with_trailing_slash_test.dart
index 2b1bb1c..e414483 100644
--- a/utils/tests/pub/install/git/check_out_with_trailing_slash_test.dart
+++ b/utils/tests/pub/install/git/check_out_with_trailing_slash_test.dart
@@ -12,6 +12,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   group("(regression)", () {
     integration('checks out a package from Git with a trailing slash', () {
       ensureGit();
diff --git a/utils/tests/pub/install/git/dependency_name_match_pubspec_test.dart b/utils/tests/pub/install/git/dependency_name_match_pubspec_test.dart
index cd12ff2..c1e5572 100644
--- a/utils/tests/pub/install/git/dependency_name_match_pubspec_test.dart
+++ b/utils/tests/pub/install/git/dependency_name_match_pubspec_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration('requires the dependency name to match the remote pubspec '
       'name', () {
     ensureGit();
diff --git a/utils/tests/pub/install/git/different_repo_name_test.dart b/utils/tests/pub/install/git/different_repo_name_test.dart
index 3c30faf..3e5378c 100644
--- a/utils/tests/pub/install/git/different_repo_name_test.dart
+++ b/utils/tests/pub/install/git/different_repo_name_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration('doesn\'t require the repository name to match the name in the '
       'pubspec', () {
     ensureGit();
diff --git a/utils/tests/pub/install/git/lock_version_test.dart b/utils/tests/pub/install/git/lock_version_test.dart
index 205b6ea..444ff38 100644
--- a/utils/tests/pub/install/git/lock_version_test.dart
+++ b/utils/tests/pub/install/git/lock_version_test.dart
@@ -14,6 +14,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration('keeps a Git package locked to the version in the lockfile', () {
     ensureGit();
 
diff --git a/utils/tests/pub/install/git/require_pubspec_name_test.dart b/utils/tests/pub/install/git/require_pubspec_name_test.dart
index 1713e04..aad6a52 100644
--- a/utils/tests/pub/install/git/require_pubspec_name_test.dart
+++ b/utils/tests/pub/install/git/require_pubspec_name_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration('requires the dependency to have a pubspec with a name '
       'field', () {
     ensureGit();
diff --git a/utils/tests/pub/install/git/require_pubspec_test.dart b/utils/tests/pub/install/git/require_pubspec_test.dart
index 084bbe0..ad1a22d 100644
--- a/utils/tests/pub/install/git/require_pubspec_test.dart
+++ b/utils/tests/pub/install/git/require_pubspec_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration('requires the dependency to have a pubspec', () {
     ensureGit();
 
diff --git a/utils/tests/pub/install/git/stay_locked_if_compatible_test.dart b/utils/tests/pub/install/git/stay_locked_if_compatible_test.dart
index 0f57785..8bc5025 100644
--- a/utils/tests/pub/install/git/stay_locked_if_compatible_test.dart
+++ b/utils/tests/pub/install/git/stay_locked_if_compatible_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration("doesn't update a locked Git package with a new compatible "
       "constraint", () {
     ensureGit();
diff --git a/utils/tests/pub/install/git/unlock_if_incompatible_test.dart b/utils/tests/pub/install/git/unlock_if_incompatible_test.dart
index 64d4406..1b23fba 100644
--- a/utils/tests/pub/install/git/unlock_if_incompatible_test.dart
+++ b/utils/tests/pub/install/git/unlock_if_incompatible_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration('updates a locked Git package with a new incompatible '
       'constraint', () {
     ensureGit();
diff --git a/utils/tests/pub/install/hosted/do_not_update_on_removed_constraints_test.dart b/utils/tests/pub/install/hosted/do_not_update_on_removed_constraints_test.dart
index ba49e66..539d263 100644
--- a/utils/tests/pub/install/hosted/do_not_update_on_removed_constraints_test.dart
+++ b/utils/tests/pub/install/hosted/do_not_update_on_removed_constraints_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration("doesn't update dependencies whose constraints have been "
       "removed", () {
     servePackages([
diff --git a/utils/tests/pub/install/hosted/fail_gracefully_on_missing_package_test.dart b/utils/tests/pub/install/hosted/fail_gracefully_on_missing_package_test.dart
index e0b4615..5833599 100644
--- a/utils/tests/pub/install/hosted/fail_gracefully_on_missing_package_test.dart
+++ b/utils/tests/pub/install/hosted/fail_gracefully_on_missing_package_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration('fails gracefully if the package does not exist', () {
     servePackages([]);
 
diff --git a/utils/tests/pub/install/hosted/fail_gracefully_on_url_resolve_test.dart b/utils/tests/pub/install/hosted/fail_gracefully_on_url_resolve_test.dart
index 6c7acde..2fef340 100644
--- a/utils/tests/pub/install/hosted/fail_gracefully_on_url_resolve_test.dart
+++ b/utils/tests/pub/install/hosted/fail_gracefully_on_url_resolve_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration('fails gracefully if the url does not resolve', () {
     d.dir(appPath, [
       d.pubspec({
diff --git a/utils/tests/pub/install/hosted/install_transitive_test.dart b/utils/tests/pub/install/hosted/install_transitive_test.dart
index 23e4bd6..7da990f5 100644
--- a/utils/tests/pub/install/hosted/install_transitive_test.dart
+++ b/utils/tests/pub/install/hosted/install_transitive_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration('installs packages transitively from a pub server', () {
     servePackages([
       packageMap("foo", "1.2.3", [dependencyMap("bar", "2.0.4")]),
diff --git a/utils/tests/pub/install/hosted/remove_removed_dependency_test.dart b/utils/tests/pub/install/hosted/remove_removed_dependency_test.dart
index d009ac3..44d4be1 100644
--- a/utils/tests/pub/install/hosted/remove_removed_dependency_test.dart
+++ b/utils/tests/pub/install/hosted/remove_removed_dependency_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration("removes a dependency that's been removed from the pubspec", () {
     servePackages([
       packageMap("foo", "1.0.0"),
diff --git a/utils/tests/pub/install/hosted/remove_removed_transitive_dependency_test.dart b/utils/tests/pub/install/hosted/remove_removed_transitive_dependency_test.dart
index 6120c33..35aa564 100644
--- a/utils/tests/pub/install/hosted/remove_removed_transitive_dependency_test.dart
+++ b/utils/tests/pub/install/hosted/remove_removed_transitive_dependency_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration("removes a transitive dependency that's no longer depended"
       " on", () {
     servePackages([
diff --git a/utils/tests/pub/install/hosted/resolve_constraints_test.dart b/utils/tests/pub/install/hosted/resolve_constraints_test.dart
index 2b6f2b0..0da297a 100644
--- a/utils/tests/pub/install/hosted/resolve_constraints_test.dart
+++ b/utils/tests/pub/install/hosted/resolve_constraints_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration('resolves version constraints from a pub server', () {
     servePackages([
       packageMap("foo", "1.2.3", [dependencyMap("baz", ">=2.0.0")]),
diff --git a/utils/tests/pub/install/hosted/stay_locked_if_compatible_test.dart b/utils/tests/pub/install/hosted/stay_locked_if_compatible_test.dart
index 7681164..7c08ab5 100644
--- a/utils/tests/pub/install/hosted/stay_locked_if_compatible_test.dart
+++ b/utils/tests/pub/install/hosted/stay_locked_if_compatible_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration("doesn't update a locked pub server package with a new "
       "compatible constraint", () {
     servePackages([packageMap("foo", "1.0.0")]);
diff --git a/utils/tests/pub/install/hosted/stay_locked_if_new_is_satisfied_test.dart b/utils/tests/pub/install/hosted/stay_locked_if_new_is_satisfied_test.dart
index 81bf855..fd2f244 100644
--- a/utils/tests/pub/install/hosted/stay_locked_if_new_is_satisfied_test.dart
+++ b/utils/tests/pub/install/hosted/stay_locked_if_new_is_satisfied_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration("doesn't unlock dependencies if a new dependency is already "
       "satisfied", () {
     servePackages([
diff --git a/utils/tests/pub/install/hosted/stay_locked_test.dart b/utils/tests/pub/install/hosted/stay_locked_test.dart
index d765af5..6deaf5d 100644
--- a/utils/tests/pub/install/hosted/stay_locked_test.dart
+++ b/utils/tests/pub/install/hosted/stay_locked_test.dart
@@ -14,6 +14,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration('keeps a pub server package locked to the version in the '
       'lockfile', () {
     servePackages([packageMap("foo", "1.0.0")]);
diff --git a/utils/tests/pub/install/hosted/unlock_if_incompatible_test.dart b/utils/tests/pub/install/hosted/unlock_if_incompatible_test.dart
index f1dd592..082a36c 100644
--- a/utils/tests/pub/install/hosted/unlock_if_incompatible_test.dart
+++ b/utils/tests/pub/install/hosted/unlock_if_incompatible_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration('updates a locked pub server package with a new incompatible '
       'constraint', () {
     servePackages([packageMap("foo", "1.0.0")]);
diff --git a/utils/tests/pub/install/hosted/unlock_if_new_is_unsatisfied_test.dart b/utils/tests/pub/install/hosted/unlock_if_new_is_unsatisfied_test.dart
index 8da00dd..44ecb89 100644
--- a/utils/tests/pub/install/hosted/unlock_if_new_is_unsatisfied_test.dart
+++ b/utils/tests/pub/install/hosted/unlock_if_new_is_unsatisfied_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration("unlocks dependencies if necessary to ensure that a new "
       "dependency is satisfied", () {
     servePackages([
diff --git a/utils/tests/pub/install/pub_install_test.dart b/utils/tests/pub/install/pub_install_test.dart
index 37bc1c1..ad2370b 100644
--- a/utils/tests/pub/install/pub_install_test.dart
+++ b/utils/tests/pub/install/pub_install_test.dart
@@ -15,7 +15,6 @@
 
 main() {
   initConfig();
-
   group('requires', () {
     integration('a pubspec', () {
       d.dir(appPath, []).create();
diff --git a/utils/tests/pub/oauth2/with_a_malformed_credentials_authenticates_again_test.dart b/utils/tests/pub/oauth2/with_a_malformed_credentials_authenticates_again_test.dart
index d9d5389..3a0be34 100644
--- a/utils/tests/pub/oauth2/with_a_malformed_credentials_authenticates_again_test.dart
+++ b/utils/tests/pub/oauth2/with_a_malformed_credentials_authenticates_again_test.dart
@@ -15,6 +15,7 @@
 import 'utils.dart';
 
 main() {
+  initConfig();
   integration('with a malformed credentials.json, authenticates again and '
       'saves credentials.json', () {
     d.validPackage.create();
diff --git a/utils/tests/pub/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart b/utils/tests/pub/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart
index 976903c..bcfe774 100644
--- a/utils/tests/pub/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart
+++ b/utils/tests/pub/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart
@@ -15,6 +15,7 @@
 import 'utils.dart';
 
 main() {
+  initConfig();
   integration('with a pre-existing credentials.json does not authenticate', () {
     d.validPackage.create();
 
diff --git a/utils/tests/pub/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart b/utils/tests/pub/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
index 20cb0e5..6d900a1 100644
--- a/utils/tests/pub/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
+++ b/utils/tests/pub/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
@@ -15,6 +15,7 @@
 import 'utils.dart';
 
 main() {
+  initConfig();
   // Regression test for issue 8849.
   integration('with a server-rejected refresh token, authenticates again and '
       'saves credentials.json', () {
diff --git a/utils/tests/pub/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart b/utils/tests/pub/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
index 2526403..4f8a741 100644
--- a/utils/tests/pub/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
+++ b/utils/tests/pub/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
@@ -15,6 +15,7 @@
 import 'utils.dart';
 
 main() {
+  initConfig();
   integration('with an expired credentials.json, refreshes and saves the '
       'refreshed access token to credentials.json', () {
     d.validPackage.create();
diff --git a/utils/tests/pub/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart b/utils/tests/pub/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart
index 3565951..7cfcc29 100644
--- a/utils/tests/pub/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart
+++ b/utils/tests/pub/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart
@@ -15,6 +15,7 @@
 import 'utils.dart';
 
 main() {
+  initConfig();
   integration('with an expired credentials.json without a refresh token, '
        'authenticates again and saves credentials.json', () {
     d.validPackage.create();
diff --git a/utils/tests/pub/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart b/utils/tests/pub/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart
index ff771e6..e2d0c21 100644
--- a/utils/tests/pub/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart
+++ b/utils/tests/pub/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart
@@ -14,6 +14,7 @@
 import 'utils.dart';
 
 main() {
+  initConfig();
   integration('with no credentials.json, authenticates and saves '
       'credentials.json', () {
     d.validPackage.create();
diff --git a/utils/tests/pub/oauth2/with_server_rejected_credentials_authenticates_again_test.dart b/utils/tests/pub/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
index c607424..0dbc6e8 100644
--- a/utils/tests/pub/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
+++ b/utils/tests/pub/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
@@ -15,6 +15,7 @@
 import 'utils.dart';
 
 main() {
+  initConfig();
   integration('with server-rejected credentials, authenticates again and saves '
       'credentials.json', () {
     d.validPackage.create();
diff --git a/utils/tests/pub/pub.status b/utils/tests/pub/pub.status
index f57559f..5d194b4 100644
--- a/utils/tests/pub/pub.status
+++ b/utils/tests/pub/pub.status
@@ -3,6 +3,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 pub_uploader_test: Pass, Fail # Issue 9357
+oauth2/with_server_rejected_credentials_authenticates_again_test: Pass, Fail # Issue 9839.
 
 # Pub only runs on the VM, so just rule out all compilers.
 [ $compiler == dart2js || $compiler == dart2dart ]
diff --git a/utils/tests/pub/pub_uploader_test.dart b/utils/tests/pub/pub_uploader_test.dart
index 5413f1d..1085e02 100644
--- a/utils/tests/pub/pub_uploader_test.dart
+++ b/utils/tests/pub/pub_uploader_test.dart
@@ -35,6 +35,7 @@
 }
 
 main() {
+  initConfig();
   group('displays usage', () {
     integration('when run with no arguments', () {
       schedulePub(args: ['uploader'],
diff --git a/utils/tests/pub/test_pub.dart b/utils/tests/pub/test_pub.dart
index f239de3d..3ba46a4 100644
--- a/utils/tests/pub/test_pub.dart
+++ b/utils/tests/pub/test_pub.dart
@@ -94,7 +94,7 @@
             new ByteStream(stream).toBytes().then((data) {
               response.statusCode = 200;
               response.contentLength = data.length;
-              response.writeBytes(data);
+              response.add(data);
               response.close();
             }).catchError((e) {
               response.statusCode = 404;
@@ -232,6 +232,11 @@
       currentSchedule.timeout = new Duration(seconds: 10);
     }
 
+    // By default, don't capture stack traces since they slow the tests way
+    // down. To debug failing tests, comment this out.
+    currentSchedule.captureStackTraces =
+        new Options().arguments.contains('--trace');
+
     // Ensure the SDK version is always available.
     d.dir(sdkPath, [
       d.file('version', '0.1.2.3')
diff --git a/utils/tests/pub/update/git/do_not_update_if_unneeded_test.dart b/utils/tests/pub/update/git/do_not_update_if_unneeded_test.dart
index 062e6b4..512b619 100644
--- a/utils/tests/pub/update/git/do_not_update_if_unneeded_test.dart
+++ b/utils/tests/pub/update/git/do_not_update_if_unneeded_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration("doesn't update one locked Git package's dependencies if it's "
       "not necessary", () {
     ensureGit();
diff --git a/utils/tests/pub/update/git/update_locked_test.dart b/utils/tests/pub/update/git/update_locked_test.dart
index 300f531..3ed68c5 100644
--- a/utils/tests/pub/update/git/update_locked_test.dart
+++ b/utils/tests/pub/update/git/update_locked_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration("updates locked Git packages", () {
     ensureGit();
 
diff --git a/utils/tests/pub/update/git/update_one_locked_test.dart b/utils/tests/pub/update/git/update_one_locked_test.dart
index 21d239f..976553e 100644
--- a/utils/tests/pub/update/git/update_one_locked_test.dart
+++ b/utils/tests/pub/update/git/update_one_locked_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration("updates one locked Git package but no others", () {
     ensureGit();
 
diff --git a/utils/tests/pub/update/git/update_to_incompatible_pubspec_test.dart b/utils/tests/pub/update/git/update_to_incompatible_pubspec_test.dart
index 67d7ec2..09123f4 100644
--- a/utils/tests/pub/update/git/update_to_incompatible_pubspec_test.dart
+++ b/utils/tests/pub/update/git/update_to_incompatible_pubspec_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration("updates Git packages to an incompatible pubspec", () {
     ensureGit();
 
diff --git a/utils/tests/pub/update/git/update_to_nonexistent_pubspec_test.dart b/utils/tests/pub/update/git/update_to_nonexistent_pubspec_test.dart
index c4bf53d..9e2e995 100644
--- a/utils/tests/pub/update/git/update_to_nonexistent_pubspec_test.dart
+++ b/utils/tests/pub/update/git/update_to_nonexistent_pubspec_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration("updates Git packages to a nonexistent pubspec", () {
     ensureGit();
 
diff --git a/utils/tests/pub/update/hosted/fail_gracefully_on_missing_package_test.dart b/utils/tests/pub/update/hosted/fail_gracefully_on_missing_package_test.dart
index 8de4886..a2a47e4 100644
--- a/utils/tests/pub/update/hosted/fail_gracefully_on_missing_package_test.dart
+++ b/utils/tests/pub/update/hosted/fail_gracefully_on_missing_package_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration('fails gracefully if the package does not exist', () {
     servePackages([]);
 
diff --git a/utils/tests/pub/update/hosted/fail_gracefully_on_url_resolve_test.dart b/utils/tests/pub/update/hosted/fail_gracefully_on_url_resolve_test.dart
index fbf9043..db71d25 100644
--- a/utils/tests/pub/update/hosted/fail_gracefully_on_url_resolve_test.dart
+++ b/utils/tests/pub/update/hosted/fail_gracefully_on_url_resolve_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration('fails gracefully if the url does not resolve', () {
     d.dir(appPath, [
       d.pubspec({
diff --git a/utils/tests/pub/update/hosted/remove_removed_dependency_test.dart b/utils/tests/pub/update/hosted/remove_removed_dependency_test.dart
index 4841a97..2a916a2 100644
--- a/utils/tests/pub/update/hosted/remove_removed_dependency_test.dart
+++ b/utils/tests/pub/update/hosted/remove_removed_dependency_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration("removes a dependency that's been removed from the pubspec", () {
     servePackages([
       packageMap("foo", "1.0.0"),
diff --git a/utils/tests/pub/update/hosted/remove_removed_transitive_dependency_test.dart b/utils/tests/pub/update/hosted/remove_removed_transitive_dependency_test.dart
index 4a4658c..2045050 100644
--- a/utils/tests/pub/update/hosted/remove_removed_transitive_dependency_test.dart
+++ b/utils/tests/pub/update/hosted/remove_removed_transitive_dependency_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration("removes a transitive dependency that's no longer depended "
       "on", () {
     servePackages([
diff --git a/utils/tests/pub/update/hosted/unlock_dependers_test.dart b/utils/tests/pub/update/hosted/unlock_dependers_test.dart
index 2c3b728..f1b8e4d 100644
--- a/utils/tests/pub/update/hosted/unlock_dependers_test.dart
+++ b/utils/tests/pub/update/hosted/unlock_dependers_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration("updates a locked package's dependers in order to get it to max "
       "version", () {
     servePackages([
diff --git a/utils/tests/pub/update/hosted/unlock_if_necessary_test.dart b/utils/tests/pub/update/hosted/unlock_if_necessary_test.dart
index ca7355b..3115942 100644
--- a/utils/tests/pub/update/hosted/unlock_if_necessary_test.dart
+++ b/utils/tests/pub/update/hosted/unlock_if_necessary_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration("updates one locked pub server package's dependencies if it's "
       "necessary", () {
     servePackages([
diff --git a/utils/tests/pub/update/hosted/update_removed_constraints_test.dart b/utils/tests/pub/update/hosted/update_removed_constraints_test.dart
index 7bd3965..dc20323 100644
--- a/utils/tests/pub/update/hosted/update_removed_constraints_test.dart
+++ b/utils/tests/pub/update/hosted/update_removed_constraints_test.dart
@@ -10,6 +10,7 @@
 import '../../test_pub.dart';
 
 main() {
+  initConfig();
   integration("updates dependencies whose constraints have been removed", () {
     servePackages([
       packageMap("foo", "1.0.0", [dependencyMap("shared-dep")]),
diff --git a/utils/tests/pub/validator/lib_test.dart b/utils/tests/pub/validator/lib_test.dart
index e5d21f6..6f9a38a 100644
--- a/utils/tests/pub/validator/lib_test.dart
+++ b/utils/tests/pub/validator/lib_test.dart
@@ -34,7 +34,7 @@
     });
   });
 
-  integration('should consider a package invalid if it', () {
+  group('should consider a package invalid if it', () {
     setUp(d.validPackage.create);
 
     integration('has no lib directory', () {
