Version 0.6.19.0 .

svn merge -r 26167:26292 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@26296 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/.gitignore b/.gitignore
index d82160d..1632934 100644
--- a/.gitignore
+++ b/.gitignore
@@ -57,3 +57,7 @@
 # Generated files.
 tools/out
 tools/xcodebuild
+pkg/shadow_dom/tool/node_modules
+
+
+
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index f850b03..9206a32 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -14,5 +14,6 @@
       input_api,
       output_api,
       json_url='http://dart-status.appspot.com/current?format=json')
-  results.extend(status_check)
+  # TODO(ricow): reenable when status page is back in shape
+  # results.extend(status_check)
   return results
diff --git a/WATCHLISTS b/WATCHLISTS
new file mode 100644
index 0000000..ceb0027
--- /dev/null
+++ b/WATCHLISTS
@@ -0,0 +1,19 @@
+# Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Watchlist Rules
+# Refer: http://dev.chromium.org/developers/contributing-code/watchlists
+
+{
+  'WATCHLIST_DEFINITIONS': {
+    'runtime': {
+      'filepath': 'runtime/',
+    },
+  },
+
+  'WATCHLISTS': {
+    'runtime': ['vm-dev@dartlang.org'],
+  },
+}
+
diff --git a/pkg/analyzer_experimental/lib/analyzer.dart b/pkg/analyzer_experimental/lib/analyzer.dart
index 644009c..a88c94c 100644
--- a/pkg/analyzer_experimental/lib/analyzer.dart
+++ b/pkg/analyzer_experimental/lib/analyzer.dart
@@ -11,7 +11,6 @@
 import 'src/error.dart';
 import 'src/generated/ast.dart';
 import 'src/generated/error.dart';
-import 'src/generated/java_io.dart';
 import 'src/generated/parser.dart';
 import 'src/generated/scanner.dart';
 import 'src/generated/source_io.dart';
@@ -49,13 +48,7 @@
 
 /// 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("Can't convert $literal to a Dart string.");
-  }
+  return literal.stringValue;
 }
 
 /// A simple error listener that collects errors into an [AnalysisErrorGroup].
diff --git a/pkg/analyzer_experimental/lib/options.dart b/pkg/analyzer_experimental/lib/options.dart
index dd841f0..37c6c8d 100644
--- a/pkg/analyzer_experimental/lib/options.dart
+++ b/pkg/analyzer_experimental/lib/options.dart
@@ -5,6 +5,7 @@
 library options;
 
 import 'package:args/args.dart';
+import 'package:path/path.dart';
 
 import 'dart:io';
 
@@ -153,9 +154,8 @@
 
   static String _getVersion() {
     try {
-      Path path = new Path(Platform.script);
-      Path versionPath = path.directoryPath.append('..').append('version');
-      File versionFile = new File.fromPath(versionPath);
+      String versionPath = join(dirname(Platform.script), '..', 'version');;
+      File versionFile = new File(versionPath);
       return versionFile.readAsStringSync().trim();
     } catch (_) {
       // This happens when the script is not running in the context of an SDK.
diff --git a/pkg/barback/lib/src/asset_cascade.dart b/pkg/barback/lib/src/asset_cascade.dart
index af48a47..341480d 100644
--- a/pkg/barback/lib/src/asset_cascade.dart
+++ b/pkg/barback/lib/src/asset_cascade.dart
@@ -113,8 +113,10 @@
   /// Gets the asset identified by [id].
   ///
   /// If [id] is for a generated or transformed asset, this will wait until it
-  /// has been created and return it. If the asset cannot be found, returns
-  /// null.
+  /// has been created and return it. This means that the returned asset will
+  /// always be [AssetState.AVAILABLE].
+  ///
+  /// If the asset cannot be found, returns null.
   Future<AssetNode> getAssetNode(AssetId id) {
     assert(id.package == package);
 
@@ -126,11 +128,9 @@
     // * If [id] has never been generated and all active transformers provide
     //   metadata about the file names of assets it can emit, we can prove that
     //   none of them can emit [id] and fail early.
-    return newFuture(() {
-      var node = _getAssetNode(id);
-
+    return _phases.last.getInput(id).then((node) {
       // If the requested asset is available, we can just return it.
-      if (node != null) return node;
+      if (node != null && node.state.isAvailable) return node;
 
       // If there's a build running, that build might generate the asset, so we
       // wait for it to complete and then try again.
@@ -144,24 +144,6 @@
     });
   }
 
-  // Returns the post-transformation asset node for [id], if one is available.
-  //
-  // This will only return a node that has an asset available, and only if that
-  // node is guaranteed not to be consumed by any transforms. If the phase is
-  // still working to figure out if a node will be consumed by a transformer,
-  // that node won't be returned.
-  AssetNode _getAssetNode(AssetId id) {
-    // Each phase's inputs are the outputs of the previous phase. Find the last
-    // phase that contains the asset. Since the last phase has no transformers,
-    // this will find the latest output for that id.
-    for (var i = _phases.length - 1; i >= 0; i--) {
-      var node = _phases[i].getUnconsumedInput(id);
-      if (node != null) return node;
-    }
-
-    return null;
-  }
-
   /// Adds [sources] to the graph's known set of source assets.
   ///
   /// Begins applying any transforms that can consume any of the sources. If a
diff --git a/pkg/barback/lib/src/barback.dart b/pkg/barback/lib/src/barback.dart
index 27c4d47..3dcb23e 100644
--- a/pkg/barback/lib/src/barback.dart
+++ b/pkg/barback/lib/src/barback.dart
@@ -73,7 +73,7 @@
   Future<Asset> getAssetById(AssetId id) {
     return _graph.getAssetNode(id).then((node) {
       if (node == null) throw new AssetNotFoundException(id);
-      return node.whenAvailable;
+      return node.asset;
     });
   }
 
diff --git a/pkg/barback/lib/src/errors.dart b/pkg/barback/lib/src/errors.dart
index a379ae5..f356066 100644
--- a/pkg/barback/lib/src/errors.dart
+++ b/pkg/barback/lib/src/errors.dart
@@ -29,6 +29,10 @@
 /// Error thrown when two or more transformers both output an asset with [id].
 class AssetCollisionException implements BarbackException {
   /// All the transforms that output an asset with [id].
+  ///
+  /// If this only contains a single transform, that indicates that a
+  /// transformer produced an output that collides with a source asset or an
+  /// asset from a previous phase.
   final Set<TransformInfo> transforms;
   final AssetId id;
 
diff --git a/pkg/barback/lib/src/package_graph.dart b/pkg/barback/lib/src/package_graph.dart
index 307a870..c46ed55 100644
--- a/pkg/barback/lib/src/package_graph.dart
+++ b/pkg/barback/lib/src/package_graph.dart
@@ -85,8 +85,10 @@
   /// Gets the asset node identified by [id].
   ///
   /// If [id] is for a generated or transformed asset, this will wait until it
-  /// has been created and return it. If the asset cannot be found, returns
-  /// null.
+  /// has been created and return it. This means that the returned asset will
+  /// always be [AssetState.AVAILABLE].
+  ///
+  /// If the asset cannot be found, returns null.
   Future<AssetNode> getAssetNode(AssetId id) {
     var cascade = _cascades[id.package];
     if (cascade != null) return cascade.getAssetNode(id);
diff --git a/pkg/barback/lib/src/phase.dart b/pkg/barback/lib/src/phase.dart
index cf817ca..86444ad 100644
--- a/pkg/barback/lib/src/phase.dart
+++ b/pkg/barback/lib/src/phase.dart
@@ -56,6 +56,13 @@
   /// is a transformer. "dart2js on web/main.dart" is a transform.
   final _transforms = new Map<AssetId, Set<TransformNode>>();
 
+  /// Controllers for assets that aren't consumed by transforms in this phase.
+  ///
+  /// These assets are passed to the next phase unmodified. They need
+  /// intervening controllers to ensure that the outputs can be marked dirty
+  /// when determining whether transforms apply, and removed if they do.
+  final _passThroughControllers = new Map<AssetId, AssetNodeController>();
+
   /// Futures that will complete once the transformers that can consume a given
   /// asset are determined.
   ///
@@ -73,10 +80,10 @@
   /// transforms that produced those asset nodes.
   ///
   /// Usually there's only one node for a given output id. However, it's
-  /// possible for multiple transformers in this phase to output an asset with
-  /// the same id. In that case, the chronologically first output emitted is
-  /// passed forward. We keep track of the other nodes so that if that output is
-  /// removed, we know which asset to replace it with.
+  /// possible for multiple transformers to output an asset with the same id. In
+  /// that case, the chronologically first output emitted is passed forward. We
+  /// keep track of the other nodes so that if that output is removed, we know
+  /// which asset to replace it with.
   final _outputs = new Map<AssetId, Queue<AssetNode>>();
 
   /// A stream that emits an event whenever this phase becomes dirty and needs
@@ -163,36 +170,11 @@
     });
   }
 
-  /// Returns the input for this phase with the given [id], but only if that
-  /// input is known not to be consumed as a transformer's primary input.
-  ///
-  /// If the input is unavailable, or if the phase hasn't determined whether or
-  /// not any transformers will consume it as a primary input, null will be
-  /// returned instead. This means that the return value is guaranteed to always
-  /// be [AssetState.AVAILABLE].
-  AssetNode getUnconsumedInput(AssetId id) {
-    if (!_inputs.containsKey(id)) return null;
-
-    // If the asset has transforms, it's not unconsumed.
-    if (!_transforms[id].isEmpty) return null;
-
-    // If we're working on figuring out if the asset has transforms, we can't
-    // prove that it's unconsumed.
-    if (_adjustTransformersFutures.containsKey(id)) return null;
-
-    // The asset should be available. If it were removed, it wouldn't be in
-    // _inputs, and if it were dirty, it'd be in _adjustTransformersFutures.
-    assert(_inputs[id].state.isAvailable);
-    return _inputs[id];
-  }
-
   /// Gets the asset node for an input [id].
   ///
   /// If an input with that ID cannot be found, returns null.
   Future<AssetNode> getInput(AssetId id) {
     return newFuture(() {
-      // TODO(rnystrom): Need to handle passthrough where an asset from a
-      // previous phase can be found.
       if (id.package == cascade.package) return _inputs[id];
       return cascade.graph.getAssetNode(id);
     });
@@ -210,6 +192,11 @@
     // kick off a build, even if that build does nothing.
     _onDirtyController.add(null);
 
+    // If there's a pass-through for this node, mark it dirty while we figure
+    // out whether we need to add any transforms for it.
+    var controller = _passThroughControllers[node.id];
+    if (controller != null) controller.setDirty();
+
     // Once the input is available, hook up transformers for it. If it changes
     // while that's happening, try again.
     _adjustTransformersFutures[node.id] = node.tryUntilStable((asset) {
@@ -219,6 +206,8 @@
       return _removeStaleTransforms(asset)
           .then((_) => _addFreshTransforms(node, oldTransformers));
     }).then((_) {
+      _adjustPassThrough(node);
+
       // Now all the transforms are set up correctly and the asset is available
       // for the time being. Set up handlers for when the asset changes in the
       // future.
@@ -226,6 +215,8 @@
         if (state.isRemoved) {
           _onDirtyController.add(null);
           _transforms.remove(node.id);
+          var passThrough = _passThroughControllers.remove(node.id);
+          if (passThrough != null) passThrough.setRemoved();
         } else {
           _adjustTransformers(node);
         }
@@ -237,8 +228,10 @@
 
       // If the asset is removed, [tryUntilStable] will throw an
       // [AssetNotFoundException]. In that case, just remove all transforms for
-      // the node.
+      // the node, and its pass-through.
       _transforms.remove(node.id);
+      var passThrough = _passThroughControllers.remove(node.id);
+      if (passThrough != null) passThrough.setRemoved();
     }).whenComplete(() {
       _adjustTransformersFutures.remove(node.id);
     });
@@ -291,6 +284,28 @@
     }));
   }
 
+  /// Adjust whether [node] is passed through the phase unmodified, based on
+  /// whether it's consumed by other transforms in this phase.
+  ///
+  /// If [node] was already passed-through, this will update the passed-through
+  /// value.
+  void _adjustPassThrough(AssetNode node) {
+    assert(node.state.isAvailable);
+
+    if (_transforms[node.id].isEmpty) {
+      var controller = _passThroughControllers[node.id];
+      if (controller != null) {
+        controller.setAvailable(node.asset);
+      } else {
+        _passThroughControllers[node.id] =
+            new AssetNodeController.available(node.asset, node.transform);
+      }
+    } else {
+      var controller = _passThroughControllers.remove(node.id);
+      if (controller != null) controller.setRemoved();
+    }
+  }
+
   /// Processes this phase.
   ///
   /// Returns a future that completes when processing is done. If there is
@@ -308,14 +323,24 @@
 
   /// Applies all currently wired up and dirty transforms.
   Future _processTransforms() {
+    if (_next == null) return;
+
+    var newPassThroughs = _passThroughControllers.values
+        .map((controller) => controller.node)
+        .where((output) {
+      return !_outputs.containsKey(output.id) ||
+        !_outputs[output.id].contains(output);
+    }).toSet();
+
     // Convert this to a list so we can safely modify _transforms while
     // iterating over it.
     var dirtyTransforms =
         flatten(_transforms.values.map((transforms) => transforms.toList()))
         .where((transform) => transform.isDirty).toList();
-    if (dirtyTransforms.isEmpty) return null;
 
-    var collisions = new Set<AssetId>();
+    if (dirtyTransforms.isEmpty && newPassThroughs.isEmpty) return null;
+
+    var collisions = _passAssetsThrough(newPassThroughs);
     return Future.wait(dirtyTransforms.map((transform) {
       return transform.apply().then((outputs) {
         for (var output in outputs) {
@@ -346,6 +371,30 @@
     });
   }
 
+  /// Pass all new assets that aren't consumed by transforms through to the next
+  /// phase.
+  ///
+  /// Returns a set of asset ids that have collisions between new passed-through
+  /// assets and pre-existing transform outputs.
+  Set<AssetId> _passAssetsThrough(Set<AssetId> newPassThroughs) {
+    var collisions = new Set<AssetId>();
+    for (var output in newPassThroughs) {
+      if (_outputs.containsKey(output.id)) {
+        // There shouldn't be another pass-through asset with the same id.
+        assert(!_outputs[output.id].any((asset) => asset.transform == null));
+
+        _outputs[output.id].add(output);
+        collisions.add(output.id);
+      } else {
+        _outputs[output.id] = new Queue<AssetNode>.from([output]);
+        _next.addInput(output);
+      }
+
+      _handleOutputRemoval(output);
+    }
+    return collisions;
+  }
+
   /// Properly resolve collisions when [output] is removed.
   void _handleOutputRemoval(AssetNode output) {
     output.whenRemoved.then((_) {
diff --git a/pkg/barback/test/package_graph/errors_test.dart b/pkg/barback/test/package_graph/errors_test.dart
index 46ff289..8e4fd89 100644
--- a/pkg/barback/test/package_graph/errors_test.dart
+++ b/pkg/barback/test/package_graph/errors_test.dart
@@ -284,4 +284,53 @@
     expectAsset("app|foo.out", "two.out");
     buildShouldFail([isAssetCollisionException("app|foo.out")]);
   });
+
+  test("a collision with a pass-through asset returns the pass-through asset",
+      () {
+    initGraph([
+      "app|foo.txt",
+      "app|foo.in"
+    ], {"app": [
+      [new RewriteTransformer("in", "txt")]
+    ]});
+
+    updateSources(["app|foo.txt", "app|foo.in"]);
+    expectAsset("app|foo.txt", "foo");
+    buildShouldFail([isAssetCollisionException("app|foo.txt")]);
+  });
+
+  test("a new pass-through asset that collides returns the previous asset", () {
+    initGraph([
+      "app|foo.txt",
+      "app|foo.in"
+    ], {"app": [
+      [new RewriteTransformer("in", "txt")]
+    ]});
+
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.txt", "foo.txt");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt", "foo.txt");
+    buildShouldFail([isAssetCollisionException("app|foo.txt")]);
+  });
+
+  test("a new transform output that collides with a pass-through asset returns "
+      "the pass-through asset", () {
+    initGraph([
+      "app|foo.txt",
+      "app|foo.in"
+    ], {"app": [
+      [new RewriteTransformer("in", "txt")]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt", "foo");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.txt", "foo");
+    buildShouldFail([isAssetCollisionException("app|foo.txt")]);
+  });
 }
diff --git a/pkg/barback/test/package_graph/transform_test.dart b/pkg/barback/test/package_graph/transform_test.dart
index c24bae8..4d7b97e 100644
--- a/pkg/barback/test/package_graph/transform_test.dart
+++ b/pkg/barback/test/package_graph/transform_test.dart
@@ -603,7 +603,7 @@
 
   test("doesn't transform an asset that goes from primary to non-primary "
       "during isPrimary", () {
-    var check = new CheckContentTransformer("do", "ne");
+    var check = new CheckContentTransformer(new RegExp(r"^do$"), "ne");
     initGraph({
       "app|foo.txt": "do"
     }, {"app": [[check]]});
@@ -662,7 +662,7 @@
   test("doesn't transform an asset that goes from primary to non-primary "
       "during another transformer's isPrimary", () {
     var rewrite = new RewriteTransformer("md", "md");
-    var check = new CheckContentTransformer("do", "ne");
+    var check = new CheckContentTransformer(new RegExp(r"^do$"), "ne");
     initGraph({
       "app|foo.txt": "do",
       "app|foo.md": "foo"
@@ -809,6 +809,138 @@
     buildShouldSucceed();
   });
 
+  group("pass-through", () {
+    test("passes an asset through a phase in which no transforms apply", () {
+      initGraph([
+        "app|foo.in",
+        "app|bar.zip",
+      ], {"app": [
+        [new RewriteTransformer("in", "mid")],
+        [new RewriteTransformer("zip", "zap")],
+        [new RewriteTransformer("mid", "out")],
+      ]});
+
+      updateSources(["app|foo.in", "app|bar.zip"]);
+      expectAsset("app|foo.out", "foo.mid.out");
+      expectAsset("app|bar.zap", "bar.zap");
+      buildShouldSucceed();
+    });
+
+    test("doesn't pass an asset through a phase in which a transform consumes "
+        "it", () {
+      initGraph([
+        "app|foo.in",
+      ], {"app": [
+        [new RewriteTransformer("in", "mid")],
+        [new RewriteTransformer("mid", "phase2")],
+        [new RewriteTransformer("mid", "phase3")],
+      ]});
+
+      updateSources(["app|foo.in"]);
+      expectAsset("app|foo.phase2", "foo.mid.phase2");
+      expectNoAsset("app|foo.phase3");
+      buildShouldSucceed();
+    });
+
+    test("removes a pass-through asset when the source is removed", () {
+      initGraph([
+        "app|foo.in",
+        "app|bar.zip",
+      ], {"app": [
+        [new RewriteTransformer("zip", "zap")],
+        [new RewriteTransformer("in", "out")],
+      ]});
+
+      updateSources(["app|foo.in", "app|bar.zip"]);
+      expectAsset("app|foo.out", "foo.out");
+      buildShouldSucceed();
+
+      removeSources(["app|foo.in"]);
+      expectNoAsset("app|foo.in");
+      expectNoAsset("app|foo.out");
+      buildShouldSucceed();
+    });
+
+    test("updates a pass-through asset when the source is updated", () {
+      initGraph([
+        "app|foo.in",
+        "app|bar.zip",
+      ], {"app": [
+        [new RewriteTransformer("zip", "zap")],
+        [new RewriteTransformer("in", "out")],
+      ]});
+
+      updateSources(["app|foo.in", "app|bar.zip"]);
+      expectAsset("app|foo.out", "foo.out");
+      buildShouldSucceed();
+
+      modifyAsset("app|foo.in", "boo");
+      updateSources(["app|foo.in"]);
+      expectAsset("app|foo.out", "boo.out");
+      buildShouldSucceed();
+    });
+
+    test("passes an asset through a phase in which transforms have ceased to "
+        "apply", () {
+      initGraph([
+        "app|foo.in",
+      ], {"app": [
+        [new RewriteTransformer("in", "mid")],
+        [new CheckContentTransformer("foo.mid", ".phase2")],
+        [new CheckContentTransformer(new RegExp(r"\.mid$"), ".phase3")],
+      ]});
+
+      updateSources(["app|foo.in"]);
+      expectAsset("app|foo.mid", "foo.mid.phase2");
+      buildShouldSucceed();
+
+      modifyAsset("app|foo.in", "bar");
+      updateSources(["app|foo.in"]);
+      expectAsset("app|foo.mid", "bar.mid.phase3");
+      buildShouldSucceed();
+    });
+
+    test("doesn't pass an asset through a phase in which transforms have "
+        "started to apply", () {
+      initGraph([
+        "app|foo.in",
+      ], {"app": [
+        [new RewriteTransformer("in", "mid")],
+        [new CheckContentTransformer("bar.mid", ".phase2")],
+        [new CheckContentTransformer(new RegExp(r"\.mid$"), ".phase3")],
+      ]});
+
+      updateSources(["app|foo.in"]);
+      expectAsset("app|foo.mid", "foo.mid.phase3");
+      buildShouldSucceed();
+
+      modifyAsset("app|foo.in", "bar");
+      updateSources(["app|foo.in"]);
+      expectAsset("app|foo.mid", "bar.mid.phase2");
+      buildShouldSucceed();
+    });
+
+    test("doesn't pass an asset through if it's removed during isPrimary", () {
+      var check = new CheckContentTransformer("bar", " modified");
+      initGraph(["app|foo.txt"], {"app": [[check]]});
+
+      updateSources(["app|foo.txt"]);
+      expectAsset("app|foo.txt", "foo");
+      buildShouldSucceed();
+
+      check.pauseIsPrimary("app|foo.txt");
+      modifyAsset("app|foo.txt", "bar");
+      updateSources(["app|foo.txt"]);
+      // Ensure we're waiting on [check.isPrimary]
+      schedule(pumpEventQueue);
+
+      removeSources(["app|foo.txt"]);
+      check.resumeIsPrimary("app|foo.txt");
+      expectNoAsset("app|foo.txt");
+      buildShouldSucceed();
+    });
+  });
+
   group('cross-package transforms', () {
     test("can access other packages' source assets", () {
       initGraph({
diff --git a/pkg/barback/test/transformer/check_content.dart b/pkg/barback/test/transformer/check_content.dart
index 252ee1c..445e86f 100644
--- a/pkg/barback/test/transformer/check_content.dart
+++ b/pkg/barback/test/transformer/check_content.dart
@@ -10,15 +10,15 @@
 
 import 'mock.dart';
 
-/// A transformer that modifies assets with the given content.
+/// A transformer that modifies assets that contains the given content.
 class CheckContentTransformer extends MockTransformer {
-  final String content;
+  final Pattern content;
   final String addition;
 
   CheckContentTransformer(this.content, this.addition);
 
   Future<bool> doIsPrimary(Asset asset) =>
-    asset.readAsString().then((value) => value == content);
+    asset.readAsString().then((value) => value.contains(content));
 
   Future doApply(Transform transform) {
     return getPrimary(transform).then((primary) {
diff --git a/pkg/browser/lib/dart.js b/pkg/browser/lib/dart.js
index e14bfbb..b96581c 100644
--- a/pkg/browser/lib/dart.js
+++ b/pkg/browser/lib/dart.js
@@ -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.
 
+(function() {
 // Bootstrap support for Dart scripts on the page as this script.
 if (navigator.webkitStartDart) {
   if (!navigator.webkitStartDart()) {
@@ -35,3 +36,4 @@
     }
   }
 }
+})();
diff --git a/pkg/docgen/README.md b/pkg/docgen/README.md
index 1af9ebe..24ba58a 100644
--- a/pkg/docgen/README.md
+++ b/pkg/docgen/README.md
@@ -38,6 +38,9 @@
 - `--parse-sdk` Parses the SDK libraries only. (Ignores the path passed in.)
 - `--package-root` Sets the package root of the library being analyzed.
 - `--append` Appends to the docs folder, library_list.txt, and index.txt.
+- `--introduction` Adds the provided markdown text file as the introduction
+for the outputted documentation.
+
 
 ###### Output Directory
 Documented libraries will be located at bin/docs in either YAML or JSON format 
diff --git a/pkg/docgen/bin/docgen.dart b/pkg/docgen/bin/docgen.dart
index 48b9071..ca4f780 100644
--- a/pkg/docgen/bin/docgen.dart
+++ b/pkg/docgen/bin/docgen.dart
@@ -23,7 +23,9 @@
       includePrivate: results['include-private'], 
       includeSdk: results['parse-sdk'] || results['include-sdk'], 
       parseSdk: results['parse-sdk'],
-      append: results['append'] && new Directory('docs').existsSync());
+      append: results['append'] && new Directory('docs').existsSync(),
+      introduction: results['parse-sdk'] ? 
+          'sdk-introduction.md' : results['introduction']);
 }
 
 /**
@@ -57,10 +59,13 @@
       help: 'Parses the SDK libraries only.', 
       defaultsTo: false, negatable: false);
   parser.addOption('package-root', 
-      help: "Sets the package root of the library being analyzed.");
+      help: 'Sets the package root of the library being analyzed.');
   parser.addFlag('append', 
       help: 'Append to the docs folder, library_list.txt and index.txt', 
       defaultsTo: false, negatable: false);
+  parser.addOption('introduction', 
+      help: 'Adds the provided markdown text file as the introduction' 
+        ' for the outputted documentation.', defaultsTo: '');
   
   return parser;
 }
diff --git a/pkg/docgen/bin/sdk-introduction.md b/pkg/docgen/bin/sdk-introduction.md
new file mode 100644
index 0000000..1362e5b
--- /dev/null
+++ b/pkg/docgen/bin/sdk-introduction.md
@@ -0,0 +1,19 @@
+Welcome to the Dart API reference documentation,
+covering the official Dart APIs (dart:*)
+as well as other packages that live in the Dart project.
+For help using the Dart APIs, also see
+[www.dartlang.org](https://www.dartlang.org)
+pages such as the following:
+
+  * [Programmer's Guide](https://www.dartlang.org/docs/)
+  * [A Tour of the Dart Libraries](https://www.dartlang.org/docs/dart-up-and-running/contents/ch03.html)
+  * [Dart Cookbook](https://www.dartlang.org/docs/cookbook/)
+  * [Articles](https://www.dartlang.org/articles/)
+  
+The API reference is automatically generated from the source code in the
+[Dart project](https://code.google.com/p/dart/).
+If you'd like to contribute to this documentation, see
+[Guidelines for Dart Doc Comments](http://www.dartlang.org/articles/doc-comment-guidelines/),
+[Contributing](https://code.google.com/p/dart/wiki/Contributing),
+and, if you're contributing to DOM-related docs such as dart:html,
+[Contributing HTML Documentation](https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation).
\ No newline at end of file
diff --git a/pkg/docgen/lib/docgen.dart b/pkg/docgen/lib/docgen.dart
index b67a321..a51ab86 100644
--- a/pkg/docgen/lib/docgen.dart
+++ b/pkg/docgen/lib/docgen.dart
@@ -65,6 +65,11 @@
 /// This is set from the command line arguments flag --include-private
 bool _includePrivate = false;
 
+// TODO(janicejl): Make MDN content generic or pluggable. Maybe move 
+// MDN-specific code to its own library that is imported into the default impl?
+/// Map of all the comments for dom elements from MDN. 
+Map _mdn;
+
 /**
  * Docgen constructor initializes the link resolver for markdown parsing.
  * Also initializes the command line arguments.
@@ -79,7 +84,7 @@
  */
 Future<bool> docgen(List<String> files, {String packageRoot,
     bool outputToYaml: true, bool includePrivate: false, bool includeSdk: false,
-    bool parseSdk: false, bool append: false}) {
+    bool parseSdk: false, bool append: false, String introduction: ''}) {
   _includePrivate = includePrivate;
   if (!append) {
     var dir = new Directory('docs');
@@ -96,7 +101,6 @@
     }
   }
   logger.info('Package Root: ${packageRoot}');
-
   linkResolver = (name) =>
       fixReference(name, _currentLibrary, _currentClass, _currentMember);
 
@@ -106,7 +110,8 @@
         throw new StateError('No library mirrors were created.');
       }
       _documentLibraries(mirrorSystem.libraries.values,includeSdk: includeSdk,
-          outputToYaml: outputToYaml, append: append, parseSdk: parseSdk);
+          outputToYaml: outputToYaml, append: append, parseSdk: parseSdk, 
+          introduction: introduction);
 
       return true;
     });
@@ -222,7 +227,8 @@
  * Creates documentation for filtered libraries.
  */
 void _documentLibraries(List<LibraryMirror> libs, {bool includeSdk: false,
-    bool outputToYaml: true, bool append: false, bool parseSdk: false}) {
+    bool outputToYaml: true, bool append: false, bool parseSdk: false, 
+    String introduction: ''}) {
   libs.forEach((lib) {
     // Files belonging to the SDK have a uri that begins with 'dart:'.
     if (includeSdk || !lib.uri.toString().startsWith('dart:')) {
@@ -242,12 +248,22 @@
   filteredEntities.where((e) => e is Class || e is Library).forEach((output) {
     _writeIndexableToFile(output, outputToYaml);
   });
-  // Outputs a yaml file with all libraries and their preview comments after 
-  // creating all libraries. This will help the viewer know what libraries are 
-  // available to read in.
-  var libraryMap = {'libraries' : filteredEntities.where((e) => 
-      e is Library).map((e) => e.previewMap).toList()};
-  _writeToFile(getYamlString(libraryMap), 'library_list.yaml', append: append);
+  // Outputs a YAML or JSON file with all libraries and their preview comments 
+  // after creating all libraries. This will help the viewer know what 
+  // libraries are available to read in.
+  var libraryMap = {
+    'libraries' : filteredEntities.where((e) => 
+        e is Library).map((e) => e.previewMap).toList(),
+    'introduction' : introduction == '' ? 
+        '' : markdown.markdownToHtml(new File(introduction).readAsStringSync(),
+            linkResolver: linkResolver, inlineSyntaxes: markdownSyntaxes)
+  };
+  if (outputToYaml) {
+    _writeToFile(getYamlString(libraryMap), 'library_list.yaml', 
+        append: append);
+  } else {
+    _writeToFile(stringify(libraryMap), 'library_list.json', append: append);
+  }
   // Outputs all the qualified names documented with their type.
   // This will help generate search results.
   _writeToFile(filteredEntities.map((e) => 
@@ -313,7 +329,7 @@
 /**
  * Returns a list of meta annotations assocated with a mirror.
  */
-List<String> _annotations(DeclarationMirror mirror) {
+List<Annotation> _annotations(DeclarationMirror mirror) {
   var annotationMirrors = mirror.metadata.where((e) =>
       e is dart2js.Dart2JsConstructedConstantMirror);
   var annotations = [];
@@ -357,6 +373,58 @@
 }
 
 /**
+ * Generates MDN comments from database.json. 
+ */
+void _mdnComment(Indexable item) {
+  //Check if MDN is loaded. 
+  if (_mdn == null) {
+    // Reading in MDN related json file. 
+    var mdnDir = path.join(path.dirname(path.dirname(path.dirname(path.dirname(
+        path.absolute(new Options().script))))), 'utils', 'apidoc', 'mdn');
+    _mdn = parse(new File(path.join(mdnDir, 'database.json'))
+        .readAsStringSync());
+  }
+  if (item.comment.isNotEmpty) return;
+  var domAnnotation = item.annotations.firstWhere(
+      (e) => e.qualifiedName == 'metadata.DomName', orElse: () => null);
+  if (domAnnotation == null) return;
+  var domName = domAnnotation.parameters.single;
+  var parts = domName.split('.');
+  if (parts.length == 2) item.comment = _mdnMemberComment(parts[0], parts[1]);
+  if (parts.length == 1) item.comment = _mdnTypeComment(parts[0]);
+}
+
+/**
+ * Generates the MDN Comment for variables and method DOM elements. 
+ */
+String _mdnMemberComment(String type, String member) {
+  var mdnType = _mdn[type];
+  if (mdnType == null) return '';
+  var mdnMember = mdnType['members'].firstWhere((e) => e['name'] == member, 
+      orElse: () => null);
+  if (mdnMember == null) return '';
+  if (mdnMember['help'] == null || mdnMember['help'] == '') return '';
+  if (mdnMember['url'] == null) return '';
+  return _htmlMdn(mdnMember['help'], mdnMember['url']);
+}
+
+/**
+ * Generates the MDN Comment for class DOM elements. 
+ */
+String _mdnTypeComment(String type) {
+  var mdnType = _mdn[type];
+  if (mdnType == null) return '';
+  if (mdnType['summary'] == null || mdnType['summary'] == "") return '';
+  if (mdnType['srcUrl'] == null) return '';
+  return _htmlMdn(mdnType['summary'], mdnType['srcUrl']);
+}
+
+String _htmlMdn(String content, String url) {
+  return '<div class="mdn">' + content.trim() + '<p class="mdn-note">'
+      '<a href="' + url.trim() + '">from Mdn</a></p></div>';
+}
+
+/**
  * Converts all [foo] references in comments to <a>libraryName.foo</a>.
  */
 markdown.Node fixReference(String name, LibraryMirror currentLibrary,
@@ -406,7 +474,7 @@
 MethodGroup _methods(Map<String, MethodMirror> mirrorMap) {
   var group = new MethodGroup();
   mirrorMap.forEach((String mirrorName, MethodMirror mirror) {
-    if (_includePrivate || !_isHidden(mirror)) {
+    if (_includePrivate || !mirror.isPrivate) {
       group.addMethod(mirror);
     }
   });
@@ -429,11 +497,8 @@
         _methods(mirror.methods), _annotations(mirror), _generics(mirror),
         mirror.qualifiedName, _isHidden(mirror), mirror.owner.qualifiedName,
         mirror.isAbstract);
-    if (superclass != null)
-      clazz.addInherited(superclass);
-    interfaces.forEach((interface) {
-      clazz.addInherited(interface);
-    });
+    if (superclass != null) clazz.addInherited(superclass);
+    interfaces.forEach((interface) => clazz.addInherited(interface));
     entityMap[mirror.qualifiedName] = clazz;
   }
   return clazz;
@@ -621,12 +686,14 @@
   bool isAbstract;
 
   /// List of the meta annotations on the class.
-  List<String> annotations;
+  List<Annotation> annotations;
 
   Class(String name, this.superclass, String comment, this.interfaces,
       this.variables, this.methods, this.annotations, this.generics,
       String qualifiedName, bool isPrivate, String owner, this.isAbstract) 
-      : super(name, comment, qualifiedName, isPrivate, owner);
+      : super(name, comment, qualifiedName, isPrivate, owner) {
+    _mdnComment(this);
+  }
 
   String get typeName => 'class';
   
@@ -646,9 +713,7 @@
    */
   void addInherited(Class superclass) {
     inheritedVariables.addAll(superclass.inheritedVariables);
-    if (_isVisible(superclass)) {
-      inheritedVariables.addAll(superclass.variables);
-    }
+    inheritedVariables.addAll(superclass.variables);
     inheritedMethods.addInherited(superclass);
   }
 
@@ -808,7 +873,7 @@
   Map<String, Generic> generics;
 
   /// List of the meta annotations on the typedef.
-  List<String> annotations;
+  List<Annotation> annotations;
 
   Typedef(String name, this.returnType, String comment, this.generics,
       this.parameters, this.annotations,
@@ -839,11 +904,13 @@
   Type type;
 
   /// List of the meta annotations on the variable.
-  List<String> annotations;
+  List<Annotation> annotations;
 
   Variable(String name, this.isFinal, this.isStatic, this.isConst, this.type,
       String comment, this.annotations, String qualifiedName, bool isPrivate,
-      String owner) : super(name, comment, qualifiedName, isPrivate, owner);
+      String owner) : super(name, comment, qualifiedName, isPrivate, owner) {
+    _mdnComment(this);
+  }
 
   /// Generates a map describing the [Variable] object.
   Map toMap() => {
@@ -881,13 +948,15 @@
   String commentInheritedFrom = "";
 
   /// List of the meta annotations on the method.
-  List<String> annotations;
+  List<Annotation> annotations;
 
   Method(String name, this.isStatic, this.isAbstract, this.isConst,
       this.returnType, String comment, this.parameters, this.annotations,
       String qualifiedName, bool isPrivate, String owner, this.isConstructor,
       this.isGetter, this.isSetter, this.isOperator) 
-        : super(name, comment, qualifiedName, isPrivate, owner);
+        : super(name, comment, qualifiedName, isPrivate, owner) {
+    _mdnComment(this);
+  }
 
   /**
    * Makes sure that the method with an inherited equivalent have comments.
@@ -956,15 +1025,13 @@
 
   void addInherited(Class parent) {
     setters.addAll(parent.inheritedMethods.setters);
+    setters.addAll(parent.methods.setters);
     getters.addAll(parent.inheritedMethods.getters);
+    getters.addAll(parent.methods.getters);
     operators.addAll(parent.inheritedMethods.operators);
+    operators.addAll(parent.methods.operators);
     regularMethods.addAll(parent.inheritedMethods.regularMethods);
-    if (_isVisible(parent)) {
-      setters.addAll(parent.methods.setters);
-      getters.addAll(parent.methods.getters);
-      operators.addAll(parent.methods.operators);
-      regularMethods.addAll(parent.methods.regularMethods);
-    }
+    regularMethods.addAll(parent.methods.regularMethods);
   }
 
   Map toMap() => {
@@ -1006,7 +1073,7 @@
   String defaultValue;
 
   /// List of the meta annotations on the parameter.
-  List<String> annotations;
+  List<Annotation> annotations;
 
   Parameter(this.name, this.isOptional, this.isNamed, this.hasDefaultValue,
       this.type, this.defaultValue, this.annotations);
diff --git a/pkg/http_server/lib/http_server.dart b/pkg/http_server/lib/http_server.dart
index 1f10eb8..123ff7c 100644
--- a/pkg/http_server/lib/http_server.dart
+++ b/pkg/http_server/lib/http_server.dart
@@ -9,6 +9,7 @@
 import 'dart:json' as JSON;
 
 import 'package:mime/mime.dart';
+import "package:path/path.dart";
 
 part 'src/http_body.dart';
 part 'src/http_body_impl.dart';
diff --git a/pkg/http_server/lib/src/virtual_directory.dart b/pkg/http_server/lib/src/virtual_directory.dart
index f608eb9..42b0c026 100644
--- a/pkg/http_server/lib/src/virtual_directory.dart
+++ b/pkg/http_server/lib/src/virtual_directory.dart
@@ -77,7 +77,7 @@
   }
 
   void serveRequest(HttpRequest request) {
-    _locateResource(new Path('.'), request.uri.pathSegments.iterator..moveNext())
+    _locateResource('.', request.uri.pathSegments.iterator..moveNext())
         .then((entity) {
           if (entity == null) {
             _serveErrorPage(HttpStatus.NOT_FOUND, request);
@@ -101,39 +101,39 @@
     _errorCallback = callback;
   }
 
-  Future<FileSystemEntity> _locateResource(Path path,
+  Future<FileSystemEntity> _locateResource(String path,
                                            Iterator<String> segments) {
-    path = path.canonicalize();
-    if (path.segments().first == "..") return new Future.value(null);
-    Path fullPath() => new Path(root).join(path);
-    return FileSystemEntity.type(fullPath().toNativePath(), followLinks: false)
+    path = normalize(path);
+    if (split(path).first == "..") return new Future.value(null);
+    String fullPath() => join(root, path);
+    return FileSystemEntity.type(fullPath(), followLinks: false)
         .then((type) {
           switch (type) {
             case FileSystemEntityType.FILE:
               if (segments.current == null) {
-                return new File.fromPath(fullPath());
+                return new File(fullPath());
               }
               break;
 
             case FileSystemEntityType.DIRECTORY:
               if (segments.current == null) {
                 if (allowDirectoryListing) {
-                  return new Directory.fromPath(fullPath());
+                  return new Directory(fullPath());
                 }
               } else {
                 if (_invalidPathRegExp.hasMatch(segments.current)) break;
-                return _locateResource(path.append(segments.current),
+                return _locateResource(join(path, segments.current),
                                        segments..moveNext());
               }
               break;
 
             case FileSystemEntityType.LINK:
               if (followLinks) {
-                return new Link.fromPath(fullPath()).target()
+                return new Link(fullPath()).target()
                     .then((target) {
-                      var targetPath = new Path(target).canonicalize();
-                      if (targetPath.isAbsolute) return null;
-                      targetPath = path.directoryPath.join(targetPath);
+                      String targetPath = normalize(target);
+                      if (isAbsolute(targetPath)) return null;
+                      targetPath = join(dirname(path), targetPath);
                       return _locateResource(targetPath, segments);
                     });
               }
@@ -254,7 +254,7 @@
       void add(String name, String modified, var size) {
         if (size == null) size = "-";
         if (modified == null) modified = "";
-        var p = new Path(path).append(name).canonicalize().toString();
+        var p = normalize(join(path, name));
         var entry =
 '''  <tr>
     <td><a href="$p">$name</a></td>
@@ -272,11 +272,11 @@
         // TODO(ajohnsen): Consider async dir listing.
         if (entity is File) {
           var stat = entity.statSync();
-          add(new Path(entity.path).filename,
+          add(basename(entity.path),
               stat.modified.toString(),
               stat.size);
         } else if (entity is Directory) {
-          add(new Path(entity.path).filename + '/',
+          add(basename(entity.path) + '/',
               entity.statSync().modified.toString(),
               null);
         }
diff --git a/pkg/http_server/test/utils.dart b/pkg/http_server/test/utils.dart
index 498d159..6a46696 100644
--- a/pkg/http_server/test/utils.dart
+++ b/pkg/http_server/test/utils.dart
@@ -6,7 +6,7 @@
 
 import 'dart:async';
 import 'dart:io';
-
+import "package:path/path.dart";
 
 Future<int> getStatusCode(int port,
                           String path,
@@ -57,8 +57,8 @@
 
 
 setupSecure() {
-  Path scriptDir = new Path(new Options().script).directoryPath;
-  Path certificateDatabase = scriptDir.append('pkcert');
-  SecureSocket.initialize(database: certificateDatabase.toNativePath(),
+  String scriptDir = dirname(new Options().script);
+  String certificateDatabase = join(scriptDir, 'pkcert');
+  SecureSocket.initialize(database: certificateDatabase,
                           password: 'dartdart');
 }
diff --git a/pkg/http_server/test/virtual_directory_test.dart b/pkg/http_server/test/virtual_directory_test.dart
index 0136b62..4b59f2c 100644
--- a/pkg/http_server/test/virtual_directory_test.dart
+++ b/pkg/http_server/test/virtual_directory_test.dart
@@ -5,8 +5,9 @@
 import 'dart:async';
 import 'dart:io';
 
-import "package:unittest/unittest.dart";
 import "package:http_server/http_server.dart";
+import "package:path/path.dart";
+import "package:unittest/unittest.dart";
 
 import 'utils.dart';
 
@@ -296,7 +297,7 @@
           test('relative-parent-link', () {
             expect(HttpServer.bind('localhost', 0).then((server) {
               var dir = new Directory('').createTempSync();
-              var name = new Path(dir.path).filename;
+              var name = basename(dir.path);
               var file = new File('${dir.path}/file')..createSync();
               var link = new Link('${dir.path}/dir3')
                   ..createSync('../$name/file');
diff --git a/pkg/intl/lib/generate_localized.dart b/pkg/intl/lib/generate_localized.dart
index a232fd3..9516372 100644
--- a/pkg/intl/lib/generate_localized.dart
+++ b/pkg/intl/lib/generate_localized.dart
@@ -85,7 +85,7 @@
  * We can't use a hyphen in a Dart library name, so convert the locale
  * separator to an underscore.
  */
-String asLibraryName(String x) => x.replaceAll('-', '_');
+String _libraryName(String x) => x.replaceAll('-', '_');
 
 /**
  * Generate a file <[generated_file_prefix]>_messages_<[locale]>.dart
@@ -146,6 +146,9 @@
   get localeName => '$locale';
 """;
 
+
+_deferredName(locale) => "lazy_${_libraryName(locale)}";
+
 /**
  * This section generates the messages_all.dart file based on the list of
  * [allLocales].
@@ -153,17 +156,28 @@
 String generateMainImportFile() {
   var output = new StringBuffer();
   output.write(mainPrologue);
-  for (var each in allLocales) {
-    var baseFile = '${generatedFilePrefix}messages_$each.dart';
+  for (var locale in allLocales) {
+    var baseFile = '${generatedFilePrefix}messages_$locale.dart';
     var file = importForGeneratedFile(baseFile);
-    output.write("import '$file' as ${asLibraryName(each)};\n");
+    output.write("@${_deferredName(locale)} ");
+    output.write("import '$file' as ${_libraryName(locale)};\n");
   }
+  output.write("\n");
+  for (var locale in allLocales) {
+    output.write("const ${_deferredName(locale)} = const DeferredLibrary");
+    output.write("('${_libraryName(locale)}');\n");
+  }
+  output.write("\nconst deferredLibraries = const {\n");
+  for (var locale in allLocales) {
+    output.write("  '$locale' : ${_deferredName(locale)},\n");
+  }
+  output.write("};\n");
   output.write(
     "\nMessageLookupByLibrary _findExact(localeName) {\n"
     "  switch (localeName) {\n");
-  for (var each in allLocales) {
+  for (var locale in allLocales) {
     output.write(
-        "    case '$each' : return ${asLibraryName(each)}.messages;\n");
+        "    case '$locale' : return ${_libraryName(locale)}.messages;\n");
   }
   output.write(closing);
   return output.toString();
@@ -198,10 +212,10 @@
 }
 
 /** User programs should call this before using [localeName] for messages.*/
-initializeMessages(localeName) {
+Future initializeMessages(String localeName) {
   initializeInternalMessageLookup(() => new CompositeMessageLookup());
   messageLookup.addLocale(localeName, _findGeneratedMessagesFor);
-  return new Future.value();
+  return deferredLibraries[localeName].load();
 }
 
 MessageLookupByLibrary _findGeneratedMessagesFor(locale) {
diff --git a/pkg/intl/lib/intl.dart b/pkg/intl/lib/intl.dart
index e91c2b2..a15abed 100644
--- a/pkg/intl/lib/intl.dart
+++ b/pkg/intl/lib/intl.dart
@@ -249,8 +249,8 @@
     // top-level message, so look up our translation by calling Intl.message
     // with ourselves as an argument.
     if (name != null) {
-      return Intl.message(
-        Intl.plural(howMany,
+      return message(
+        plural(howMany,
             zero: zero, one: one, two: two, few: few, many: many, other: other),
         name: name,
         args: args,
@@ -273,10 +273,10 @@
   }
 
   /**
-   * Format a message differently depending on [gender]. Normally used as part
-   * of an Intl.message message that is to be translated.
+   * Format a message differently depending on [targetGender]. Normally used as
+   * part of an Intl.message message that is to be translated.
    */
-  static String gender(String gender,
+  static String gender(String targetGender,
       {String male, String female, String other,
        String desc, Map examples, String locale, String name,
        List<String>args}) {
@@ -284,8 +284,8 @@
     // top-level message, so look up our translation by calling Intl.message
     // with ourselves as an argument.
     if (name != null) {
-      return Intl.message(
-        Intl.gender(gender, male: male, female: female, other: other),
+      return message(
+        gender(targetGender, male: male, female: female, other: other),
         name: name,
         args: args,
         locale: locale);
@@ -294,7 +294,7 @@
     if (other == null) {
       throw new ArgumentError("The 'other' named argument must be specified");
     }
-    switch(gender) {
+    switch(targetGender) {
       case "female" : return female == null ? other : female;
       case "male" : return male == null ? other : male;
       default: return other;
@@ -314,8 +314,8 @@
     // top-level message, so look up our translation by calling Intl.message
     // with ourselves as an argument.
     if (name != null) {
-      return Intl.message(
-          Intl.select(choice, cases),
+      return message(
+          select(choice, cases),
           name: name,
           args: args,
           locale: locale);
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 81660c1..39486e0 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -20,10 +20,14 @@
 
 [ $compiler == dart2js && $runtime == d8 ]
 unmodifiable_collection/test/unmodifiable_collection_test: Pass, Fail # Issue 12429
+csslib/test/declaration_test: Pass, Crash # V8 issue 2846
 
 [ $compiler == dart2js ]
 analyzer_experimental/test/generated/ast_test: Fail #Issue 12341
 
+[ $compiler == dart2js && $checked && $runtime == ie9 ]
+crypto/test/base64_test: Timeout # Issue 12486
+
 [ $compiler == dart2js && ($runtime == d8 || $runtime == drt) ]
 crypto/test/hmac_sha256_test: Pass, Fail # v8 bug: Issue 12293
 crypto/test/sha1_test: Pass, Fail # v8 bug: Issue 12293
@@ -56,6 +60,7 @@
 crypto/test/hmac_sha1_test: Fail # Issue 11407.
 crypto/test/sha1_test: Fail # Issue 11407.
 stack_trace/test/trace_test: Fail # http://dartbug.com/12380
+crypto/test/sha256_test: Pass, Fail # Issue 12502
 
 # Skip browser-specific tests on VM
 [ $runtime == vm ]
@@ -199,6 +204,7 @@
 custom_element: Skip
 mdv: Skip
 mutation_observer: Skip
+polymer_expressions/test/syntax_test: Skip
 third_party/html5lib/test/browser/browser_test: Skip
 
 [ $runtime == safari || $runtime == chrome || $runtime == ie9 || $runtime == ff || $runtime == dartium || $runtime == drt ]
diff --git a/pkg/polymer_expressions/README.md b/pkg/polymer_expressions/README.md
new file mode 100644
index 0000000..5a7e9b2
--- /dev/null
+++ b/pkg/polymer_expressions/README.md
@@ -0,0 +1,282 @@
+polymer_expressions
+===================
+
+Polymer Expressions are an expressive syntax that can be used in templates in
+Dart. Polymer Expressions allow you to write complex binding expressions, with
+property access, function invocation, list/map indexing, and two-way filtering
+like:
+
+```html
+    {{ person.title + " " + person.getFullName() | upppercase }}
+```
+
+## Overview
+
+### Model-Driven Views (MDV)
+[MDV][mdv] allows you to define templates directly in HTML that are rendered by the
+browser into the DOM. Templates are bound to a data model, and changes to the
+data are automatically reflected in the DOM, and changes in HTML inputs are
+assigned back into the model. The template and model are bound together via
+binding expressions that are evaluated against the model. These binding
+expressions are placed in double-curly-braces, or "mustaches".
+
+Example:
+
+```html
+    <template>
+      <p>Hello {{ person.name }}</p>
+    </template>
+```
+
+MDV includes a very basic binding syntax which only allows a series of
+dot-separate property names.
+
+[mdv]: http://www.polymer-project.org/platform/mdv.html
+
+### Custom Binding Syntaxes with BindingDelegate
+
+While MDV's built-in syntax is very basic, it does allow custom syntaxes called
+"binding delegates" to be installed and used. A binding delegate can interpret
+the contents of mustaches however it likes. PolymerExpressions is such a
+binding delegate.
+
+Example:
+
+```html
+    <template bind>
+      <p>Hello {{ person.title + " " + person.getFullName() | uppercase }}</p>
+    </template>
+```
+
+## Usage
+
+### Installing from Pub
+
+Add the following to your pubspec.yaml file:
+
+```yaml
+    dependencies:
+      polymer_expressions: any
+```
+
+Hint: check https://pub.dartlang.org/packages/polymer_expressions for the latest
+version number.
+
+Then import polymer_expressions.dart:
+
+    import 'package:polymer_expressions/polymer_expressions.dart';
+
+### Registering a Binding Delegate
+
+**Polymer Expressions are now the default syntax for `<polymer-element>` custom
+elements.**
+
+You do not need to manually register the bindingDelegate if your bindings are
+inside a custom element. However, if you want to use polymer_expressions outside
+a custom element, read on:
+
+Binding delegates must be installed on a template before they can be used.
+For example, set the bindingDelegate property of your template
+elements to an instance of PolymerExpressions. The templates will then use the
+PolymerExpressions instance to interpret
+binding expressions.
+
+```dart
+    import 'dart:html';
+    import 'package:polymer_expressions/polymer_expressions.dart';
+
+    main() {
+      var template = query('#my_template');
+      template.bindingDelegate = new PolymerExpressions();
+    }
+```
+
+### Registering Top-Level Variables
+
+Before a top-level variable can be used, it must be registered. The
+PolymerExpressions constructor takes a map of named values to use as variables.
+
+```dart
+    main() {
+      var globals = {
+        'uppercase': (String v) => v.toUpperCase(),
+        'app_id': 'my_app_123',
+      };
+      var template = query('#my_template');
+      template.bindingDelegate = new PolymerExpressions(globals: globals);
+    }
+```
+
+## Features
+
+### The Model and Scope
+
+Polymer Expressions allow binding to more than just the model assigned to a
+template instance. Top-level variables can be defined so that you can use
+filters, global variables and constants, functions, etc. These variables and the
+model are held together in a container called a Scope. Scopes can be nested,
+which happens when template tags are nested.
+
+### Two-way Bindings
+
+Bindings can be used to modify the data model based on events in the DOM. The
+most common case is to bind an &lt;input&gt; element's value field to a model
+property and have the property update when the input changes. For this to work,
+the binding expression must be "assignable". Only a subset of expressions are
+assignable. Assignable expressions cannot contain function calls, operators, and
+any index operator must have a literal argument. Assignable expressions can
+contain filter operators as long as all the filters are two-way transformers.
+
+Some restrictions may be relaxed further as allowed.
+
+Assignable Expressions:
+
+ * `foo`
+ * `foo.bar`
+ * `items[0].description`
+ * `people['john'].name`
+ * `product.cost | convertCurrency('ZWD')` where `convertCurrency` evaluates to
+   a Tranformer object.
+
+Non-Assignable Expressions:
+
+ * `a + 1`
+ * `!c`
+ * `foo()`
+ * `person.lastName | uppercase` where `uppercase` is a filter function.
+
+### Null-Safety
+
+Expressions are generally null-safe. If an intermediate expression yields `null`
+the entire expression will return null, rather than throwing an exception.
+Property access, method invocation and operators are null-safe. Passing null to
+a function that doesn't handle null will not be null safe.
+
+### Streams
+
+Polymer Expressions have experimental support for binding to streams, and when
+new values are passed to the stream, the template updates. The feature is not
+fully implemented yet.
+
+See the examples in /example/streams for more details.
+
+## Syntax
+
+### Property Access
+
+Properties on the model and in the scope are looked up via simple property
+names, like `foo`. Property names are looked up first in the top-level
+variables, next in the model, then recursively in parent scopes. Properties on
+objects can be access with dot notation like `foo.bar`.
+
+The keyword `this` always refers to the model if there is one, otherwise `this`
+is `null`. If you have model properties and top-level variables with the same
+name, you can use `this` to refer to the model property.
+
+### Literals
+
+Polymer Expressions support number, boolean, string, and map literals. Strings
+can use either single or double quotes.
+
+ * Numbers: `1`, `1.0`
+ * Booleans: `true`, `false`
+ * Strings: `'abc'`, `"xyz"`
+ * Maps: `{ 'a': 1, 'b': 2 }`
+
+List literals are planned, see [issue 9](https://github.com/dart-lang/polymer_expressions/issues/9)
+
+### Functions and Methods
+
+If a property is a function in the scope, a method on the model, or a method on
+an object, it can be invoked with standard function syntax. Functions and
+Methods can take arguments. Named arguments are not supported. Arguments can be
+literals or variables.
+
+Examples:
+
+ * Top-level function: `myFunction()`
+ * Top-level function with arguments: `myFunction(a, b, 42)`
+ * Model method: `aMethod()`
+ * Method on nested-property: `a.b.anotherMethod()`
+
+### Operators
+
+Polymer Expressions supports the following binary and unary operators:
+
+ * Arithmetic operators: +, -, *, /, %, unary + and -
+ * Comparison operators: ==, !=, <=, <, >, >=
+ * Boolean operators: &&, ||, unary !
+
+Expressions do not support bitwise operators such as &, |, << and >>, or increment/decrement operators (++ and --)
+
+### List and Map Indexing
+
+List and Map like objects can be accessed via the index operator: []
+
+Examples:
+
+ * `items[2]`
+ * `people['john']`
+
+Unlike JavaScript, list and map contents are not generally available via
+property access. That is, the previous examples are not equivalent to `items.2`
+and `people.john`. This ensures that access to properties and methods on Lists
+and Maps is preserved.
+
+### Filters and Transformers
+
+A filter is a function that transforms a value into another, used via the pipe
+syntax: `value | filter` Any function that takes exactly one argument can be
+used as a filter.
+
+Example:
+
+If `person.name` is "John", and a top-level function named `uppercase` has been
+registered, then `person.name | uppercase` will have the value "JOHN".
+
+The pipe syntax is used rather than a regular function call so that we can
+support two-way bindings through transformers. A transformer is a filter that
+has an inverse function. Transformers must extend or implement the `Transformer`
+class, which has `forward()` and `reverse()` methods.
+
+### Repeating Templates
+
+A template can be repeated by using the "repeat" attribute with a binding. The
+binding can either evaluate to an Iterable, in which case the template is
+instantiated for each item in the iterable and the model of the instance is
+set to the item, or the binding can be a "in" iterator expression, in which
+case a new variable is added to each scope.
+
+The following examples produce the same output.
+
+Evaluate to an iterable:
+
+```html
+    <template repeat="{{ items }}">
+      <div>{{ }}</div>
+    </template>
+```
+
+"in" expression:
+
+```html
+    <template repeat="{{ item in items }}">
+      <div>{{ item }}</div>
+    </template>
+```
+
+## Status
+
+The syntax implemented is experimental and subject to change, in fact, it
+**will** change soon. The goal is to be compatible with Polymer's binding
+syntax. We will announce breaking changes on the
+[web-ui@dartlang.org mailing list][web-ui-list].
+
+Please [file issues on Dart project page](http://dartbug.com/new)
+for any bugs you find or for feature requests. Make a note that it applies to
+"package:polymer_expressions"
+
+You can discuss Polymer Expressions on the
+[web-ui@dartlang.org mailing list][web-ui-list].
+
+[web-ui-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/web-ui
diff --git a/pkg/polymer_expressions/example/example.dart b/pkg/polymer_expressions/example/example.dart
new file mode 100644
index 0000000..f3ad658
--- /dev/null
+++ b/pkg/polymer_expressions/example/example.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:html';
+
+import 'package:polymer_expressions/polymer_expressions.dart';
+import 'package:mdv/mdv.dart' as mdv;
+
+import 'person.dart';
+
+main() {
+  mdv.initialize();
+  var john = new Person('John', 'Messerly', ['A', 'B', 'C']);
+  var justin = new Person('Justin', 'Fagnani', ['D', 'E', 'F']);
+  var globals = {
+    'uppercase': (String v) => v.toUpperCase(),
+    'people': [john, justin],
+  };
+
+  query('#test')
+      ..bindingDelegate = new PolymerExpressions(globals: globals)
+      ..model = john;
+
+  query('#test2').model = john;
+}
diff --git a/pkg/polymer_expressions/example/example.html b/pkg/polymer_expressions/example/example.html
new file mode 100644
index 0000000..50a2ef8
--- /dev/null
+++ b/pkg/polymer_expressions/example/example.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<!--
+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.
+-->
+
+<html>
+  <head>
+    <title>example</title>
+    <style>
+      .jname {
+        background: #faa;
+      }
+      .fname {
+        border: solid 1px #88f;
+      }
+    </style>
+  </head>
+
+  <body>
+    <template id="test" bind>
+      <h1>Polymer Expression Syntax</h1>
+      <label> first name: <input value="{{ firstName }}"></label>
+      <label> last name: <input value="{{ lastName }}"></label>
+      <div>Hello {{ getFullName() }}!</div>
+      <div>{{ firstName }} {{ lastName }}</div>
+      <div>
+        <h2>Iteration</h2>
+        <ul>
+          <template repeat="{{ item in items.take(2) }}">
+            <li>{{ item }}</li>
+          </template>
+        </ul>
+        <ul>
+          <template repeat="{{ people }}">
+            <li class="{{ {'jname': firstName.startsWith('J'),
+                'fname': lastName.startsWith('F')} }}">
+              {{ firstName }} {{ lastName }}
+            </li>
+            <ul>
+              <template repeat="{{ item in items }}">
+                <li checked?="{{ item == 'A'}}">{{ firstName }} {{ item }}</li>
+              </template>
+            </ul>
+          </template>
+        </ul>
+      </div>
+    </template>
+
+    <template id="test2" bind>
+      <h1>Default  Syntax</h1>
+      <label> first name: <input value="{{ firstName }}"></label>
+      <label> last name: <input value="{{ lastName }}"></label>
+    </template>
+
+    <script type="application/dart" src="example.dart"></script>
+    <script src="packages/browser/dart.js"></script>
+  </body>
+</html>
diff --git a/pkg/polymer_expressions/example/person.dart b/pkg/polymer_expressions/example/person.dart
new file mode 100644
index 0000000..d561fac
--- /dev/null
+++ b/pkg/polymer_expressions/example/person.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 person;
+
+import 'package:observe/observe.dart';
+
+class Person extends ChangeNotifierBase {
+  static const _FIRST_NAME = const Symbol('firstName');
+  static const _LAST_NAME = const Symbol('lastName');
+  static const _ITEMS = const Symbol('items');
+  static const _GET_FULL_NAME = const Symbol('getFullName');
+
+  String _firstName;
+  String _lastName;
+  List<String> _items;
+
+  Person(this._firstName, this._lastName, this._items);
+
+  String get firstName => _firstName;
+
+  void set firstName(String value) {
+    _firstName = value;
+    notifyChange(new PropertyChangeRecord(_FIRST_NAME));
+  }
+
+  String get lastName => _lastName;
+
+  void set lastName(String value) {
+    _lastName = value;
+    notifyChange(new PropertyChangeRecord(_LAST_NAME));
+  }
+
+  String getFullName() => '$_firstName $_lastName';
+
+  List<String> get items => _items;
+
+  void set items(List<String> value) {
+    _items = value;
+    notifyChange(new PropertyChangeRecord(_ITEMS));
+  }
+
+  String toString() => "Person(firstName: $_firstName, lastName: $_lastName)";
+
+}
diff --git a/pkg/polymer_expressions/example/streams/collect_key_press.html b/pkg/polymer_expressions/example/streams/collect_key_press.html
new file mode 100644
index 0000000..48221c1
--- /dev/null
+++ b/pkg/polymer_expressions/example/streams/collect_key_press.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<!--
+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.
+-->
+
+<html>
+  <body>
+    <template id="test" repeat="{{ keyPress | collect }}">
+      <div>key: {{ }}</div>
+    </template>
+    <script type="application/dart">
+      import 'dart:async';
+      import 'dart:html';
+      import 'package:polymer_expressions/polymer_expressions.dart';
+      import 'package:polymer_expressions/async.dart';
+      import 'package:mdv/mdv.dart' as mdv;
+      import 'package:observe/observe.dart';
+
+      Iterable collect(StreamBinding s) {
+        var list = new ObservableList();
+        s.stream.listen((e) { list.add(e); });
+        return list;
+      }
+
+      main() {
+        mdv.initialize();
+
+        var globals = {
+          'keyPress': document.onKeyPress
+              .map((e) => new String.fromCharCode(e.charCode)),
+          'collect': collect,
+        };
+
+        query('#test')
+            ..bindingDelegate = new PolymerExpressions(globals: globals)
+            ..model = null;
+      }
+    </script>
+    <script src="packages/browser/dart.js"></script>
+  </body>
+</html>
diff --git a/pkg/polymer_expressions/example/streams/count_clicks.html b/pkg/polymer_expressions/example/streams/count_clicks.html
new file mode 100644
index 0000000..e164719
--- /dev/null
+++ b/pkg/polymer_expressions/example/streams/count_clicks.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<!--
+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.
+-->
+
+<html>
+  <body>
+    <template id="test" bind="{{ mouseDown | count }}">
+      Clicks: {{ value }}
+    </template>
+    <script type="application/dart">
+      import 'dart:async';
+      import 'dart:html';
+      import 'package:polymer_expressions/polymer_expressions.dart';
+      import 'package:polymer_expressions/async.dart';
+      import 'package:mdv/mdv.dart' as mdv;
+      import 'package:observe/observe.dart';
+
+      count(StreamBinding s) {
+        var box = new ObservableBox();
+        box.value = 0;
+        s.stream.listen((e) { box.value++; });
+        return box;
+      }
+
+      main() {
+        mdv.initialize();
+
+        var globals = {
+          'mouseDown': document.onMouseDown,
+          'count': count,
+        };
+
+        query('#test')
+            ..bindingDelegate = new PolymerExpressions(globals: globals)
+            ..model = null;
+      }
+    </script>
+    <script src="packages/browser/dart.js"></script>
+  </body>
+</html>
diff --git a/pkg/polymer_expressions/example/streams/mouse_move.html b/pkg/polymer_expressions/example/streams/mouse_move.html
new file mode 100644
index 0000000..c6cd1cc
--- /dev/null
+++ b/pkg/polymer_expressions/example/streams/mouse_move.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<!--
+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.
+-->
+
+<html>
+  <body>
+    <template id="test" bind="{{ mouse }}">
+      ({{ value.offsetX }}, {{ value.offsetY }})
+    </template>
+    <script type="application/dart">
+      import 'dart:html';
+      import 'package:polymer_expressions/polymer_expressions.dart';
+      import 'package:mdv/mdv.dart' as mdv;
+
+      main() {
+        mdv.initialize();
+
+        var globals = {
+          'mouse': document.onMouseMove,
+        };
+
+        query('#test')
+            ..bindingDelegate = new PolymerExpressions(globals: globals)
+            ..model = null;
+      }
+    </script>
+    <script src="packages/browser/dart.js"></script>
+  </body>
+</html>
diff --git a/pkg/polymer_expressions/example/streams/mouse_resize_image.html b/pkg/polymer_expressions/example/streams/mouse_resize_image.html
new file mode 100644
index 0000000..a056d2e
--- /dev/null
+++ b/pkg/polymer_expressions/example/streams/mouse_resize_image.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<!--
+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.
+-->
+
+<html>
+  <body>
+    <template id="test" bind="{{ mouseMax }}">
+      <img src="http://www.dartlang.org/logos/dart-logo.png"
+           width="{{ value }}"
+           height="{{ value }}">
+    </template>
+    <script type="application/dart">
+      import 'dart:html';
+      import 'dart:math';
+      import 'package:polymer_expressions/polymer_expressions.dart';
+      import 'package:mdv/mdv.dart' as mdv;
+
+      main() {
+        mdv.initialize();
+
+        var globals = {
+          'mouse': document.onMouseMove,
+          'mouseMax':
+              document.onMouseMove.map((e) => max(e.offsetX, e.offsetY)),
+        };
+
+        query('#test')
+            ..bindingDelegate = new PolymerExpressions(globals: globals)
+            ..model = null;
+      }
+    </script>
+    <script src="packages/browser/dart.js"></script>
+  </body>
+</html>
diff --git a/pkg/polymer_expressions/lib/async.dart b/pkg/polymer_expressions/lib/async.dart
new file mode 100644
index 0000000..23e9846
--- /dev/null
+++ b/pkg/polymer_expressions/lib/async.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library polymer_expressions.async;
+
+import 'dart:async';
+import 'package:observe/observe.dart';
+
+class StreamBinding<T> extends ObservableBox {
+  final Stream<T> stream;
+
+  StreamBinding(this.stream) {
+    stream.listen((T i) { value = i; });
+  }
+
+}
diff --git a/pkg/polymer_expressions/lib/eval.dart b/pkg/polymer_expressions/lib/eval.dart
new file mode 100644
index 0000000..dbf1f88
--- /dev/null
+++ b/pkg/polymer_expressions/lib/eval.dart
@@ -0,0 +1,613 @@
+// 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 polymer_expressions.eval;
+
+import 'dart:async';
+import 'dart:collection';
+import 'dart:mirrors';
+
+import 'package:observe/observe.dart';
+
+import 'async.dart';
+import 'expression.dart';
+import 'filter.dart';
+import 'visitor.dart';
+import 'src/mirrors.dart';
+
+final _BINARY_OPERATORS = {
+  '+':  (a, b) => a + b,
+  '-':  (a, b) => a - b,
+  '*':  (a, b) => a * b,
+  '/':  (a, b) => a / b,
+  '==': (a, b) => a == b,
+  '!=': (a, b) => a != b,
+  '>':  (a, b) => a > b,
+  '>=': (a, b) => a >= b,
+  '<':  (a, b) => a < b,
+  '<=': (a, b) => a <= b,
+  '||': (a, b) => a || b,
+  '&&': (a, b) => a && b,
+  '|':  (a, f) {
+    if (f is Transformer) return f.forward(a);
+    if (f is Filter) return f(a);
+    throw new EvalException("Filters must be a one-argument function.");
+  }
+};
+
+final _UNARY_OPERATORS = {
+  '+': (a) => a,
+  '-': (a) => -a,
+  '!': (a) => !a,
+};
+
+final _BOOLEAN_OPERATORS = ['!', '||', '&&'];
+
+/**
+ * Evaluation [expr] in the context of [scope].
+ */
+Object eval(Expression expr, Scope scope) => observe(expr, scope)._value;
+
+
+ExpressionObserver observe(Expression expr, Scope scope) {
+  var observer = new ObserverBuilder(scope).visit(expr);
+  new Updater(scope).visit(observer);
+  return observer;
+}
+
+/**
+ * Assign [value] to the variable or field referenced by [expr] in the context
+ * of [scope].
+ *
+ * [expr] must be an /assignable/ expression, it must not contain
+ * operators or function invocations, and any index operations must use a
+ * literal index.
+ */
+void assign(Expression expr, Object value, Scope scope) {
+
+  notAssignable() =>
+      throw new EvalException("Expression is not assignable: $expr");
+
+  Expression expression;
+  var property;
+  bool isIndex = false;
+  var filters = <Expression>[]; // reversed order for assignment
+
+  while (expr is BinaryOperator && expr.operator == '|') {
+    filters.add(expr.right);
+    expr = expr.left;
+  }
+
+  if (expr is Identifier) {
+    expression = empty();
+    property = expr.value;
+  } else if (expr is Invoke) {
+    expression = expr.receiver;
+    if (expr.method == '[]') {
+      if (expr.arguments[0] is! Literal) notAssignable();
+      Literal l = expr.arguments[0];
+      property = l.value;
+      isIndex = true;
+    } else if (expr.method != null) {
+      if (expr.arguments != null) notAssignable();
+      property = expr.method;
+    } else {
+      notAssignable();
+    }
+  } else {
+    notAssignable();
+  }
+
+  // transform the values backwards through the filters
+  for (var filterExpr in filters) {
+    var filter = eval(filterExpr, scope);
+    if (filter is! Transformer) {
+      throw new EvalException("filter must implement Transformer: $filterExpr");
+    }
+    value = filter.reverse(value);
+  }
+  // make the assignment
+  var o = eval(expression, scope);
+  if (o == null) throw new EvalException("Can't assign to null: $expression");
+  if (isIndex) {
+    o[property] = value;
+  } else {
+    reflect(o).setField(new Symbol(property), value);
+  }
+}
+
+/**
+ * A mapping of names to objects. Scopes contain a set of named [variables] and
+ * a single [model] object (which can be thought of as the "this" reference).
+ * Names are currently looked up in [variables] first, then the [model].
+ *
+ * Scopes can be nested by giving them a [parent]. If a name in not found in a
+ * Scope, it will look for it in it's parent.
+ */
+class Scope extends Object {
+  final Scope parent;
+  final Object model;
+  // TODO(justinfagnani): disallow adding/removing names
+  final ObservableMap<String, Object> _variables;
+  InstanceMirror __modelMirror;
+
+  Scope({this.model, Map<String, Object> variables: const {}, this.parent})
+      : _variables = new ObservableMap.from(variables);
+
+  InstanceMirror get _modelMirror {
+    if (__modelMirror != null) return __modelMirror;
+    __modelMirror = reflect(model);
+    return __modelMirror;
+  }
+
+  Object operator[](String name) {
+    if (name == 'this') {
+      return model;
+    } else if (_variables.containsKey(name)) {
+      return _convert(_variables[name]);
+    } else if (model != null) {
+      var symbol = new Symbol(name);
+      var classMirror = _modelMirror.type;
+      var memberMirror = getMemberMirror(classMirror, symbol);
+      if (memberMirror is VariableMirror ||
+          (memberMirror is MethodMirror && memberMirror.isGetter)) {
+        return _convert(_modelMirror.getField(symbol).reflectee);
+      } else if (memberMirror is MethodMirror) {
+        return new Method(_modelMirror, symbol);
+      }
+    }
+    if (parent != null) {
+      return _convert(parent[name]);
+    } else {
+      throw new EvalException("variable not found: $name in $hashCode");
+    }
+  }
+
+  Object ownerOf(String name) {
+    if (name == 'this') {
+      // we could return the Scope if it were Observable, but since assigning
+      // a model to a template destroys and recreates the instance, it doesn't
+      // seem neccessary
+      return null;
+    } else if (_variables.containsKey(name)) {
+      return _variables;
+    } else {
+      var symbol = new Symbol(name);
+      var classMirror = _modelMirror.type;
+      if (getMemberMirror(classMirror, symbol) != null) {
+        return model;
+      }
+    }
+    if (parent != null) {
+      return parent.ownerOf(name);
+    }
+  }
+
+  bool contains(String name) {
+    if (_variables.containsKey(name)) {
+      return true;
+    } else {
+      var symbol = new Symbol(name);
+      var classMirror = _modelMirror.type;
+      if (getMemberMirror(classMirror, symbol) != null) {
+        return true;
+      }
+    }
+    if (parent != null) {
+      return parent.contains(name);
+    }
+    return false;
+  }
+
+  String toString() => 'Scope($hashCode $parent)';
+}
+
+Object _convert(v) {
+  if (v is Stream) return new StreamBinding(v);
+  return v;
+}
+
+abstract class ExpressionObserver<E extends Expression> implements Expression {
+  final E _expr;
+  ExpressionObserver _parent;
+
+  StreamSubscription _subscription;
+  Object _value;
+
+  StreamController _controller = new StreamController.broadcast();
+  Stream get onUpdate => _controller.stream;
+
+  ExpressionObserver(this._expr);
+
+  Object get currentValue => _value;
+
+  update(Scope scope) => _updateSelf(scope);
+
+  _updateSelf(Scope scope) {}
+
+  _invalidate(Scope scope) {
+    _observe(scope);
+    if (_parent != null) {
+      _parent._invalidate(scope);
+    }
+  }
+
+  _observe(Scope scope) {
+    // unobserve last value
+    if (_subscription != null) {
+      _subscription.cancel();
+      _subscription = null;
+    }
+
+    var _oldValue = _value;
+
+    // evaluate
+    _updateSelf(scope);
+
+    if (!identical(_value, _oldValue)) {
+      _controller.add(_value);
+    }
+  }
+
+  String toString() => _expr.toString();
+}
+
+class Updater extends RecursiveVisitor<ExpressionObserver> {
+  final Scope scope;
+
+  Updater(this.scope);
+
+  visitExpression(ExpressionObserver e) {
+    e._observe(scope);
+  }
+
+  visitInExpression(InObserver c) {
+    visit(c.right);
+    visitExpression(c);
+  }
+}
+
+class ObserverBuilder extends Visitor {
+  final Scope scope;
+  final Queue parents = new Queue();
+
+  ObserverBuilder(this.scope);
+
+  visitEmptyExpression(EmptyExpression e) => new EmptyObserver(e);
+
+  visitParenthesizedExpression(ParenthesizedExpression e) => visit(e.child);
+
+  visitInvoke(Invoke i) {
+    var receiver = visit(i.receiver);
+    var args = (i.arguments == null)
+        ? null
+        : i.arguments.map(visit).toList(growable: false);
+    var invoke =  new InvokeObserver(i, receiver, args);
+    receiver._parent = invoke;
+    if (args != null) args.forEach((a) => a._parent = invoke);
+    return invoke;
+  }
+
+  visitLiteral(Literal l) => new LiteralObserver(l);
+
+  visitMapLiteral(MapLiteral l) {
+    var entries = l.entries.map(visit).toList(growable: false);
+    var map = new MapLiteralObserver(l, entries);
+    entries.forEach((e) => e._parent = map);
+    return map;
+  }
+
+  visitMapLiteralEntry(MapLiteralEntry e) {
+    var key = visit(e.key);
+    var value = visit(e.entryValue);
+    var entry = new MapLiteralEntryObserver(e, key, value);
+    key._parent = entry;
+    value._parent = entry;
+    return entry;
+  }
+
+  visitIdentifier(Identifier i) => new IdentifierObserver(i);
+
+  visitBinaryOperator(BinaryOperator o) {
+    var left = visit(o.left);
+    var right = visit(o.right);
+    var binary = new BinaryObserver(o, left, right);
+    left._parent = binary;
+    right._parent = binary;
+    return binary;
+  }
+
+  visitUnaryOperator(UnaryOperator o) {
+    var expr = visit(o.child);
+    var unary = new UnaryObserver(o, expr);
+    expr._parent = unary;
+    return unary;
+  }
+
+  visitInExpression(InExpression i) {
+    // don't visit the left. It's an identifier, but we don't want to evaluate
+    // it, we just want to add it to the comprehension object
+    var left = visit(i.left);
+    var right = visit(i.right);
+    var inexpr = new InObserver(i, left, right);
+    right._parent = inexpr;
+    return inexpr;
+  }
+}
+
+class EmptyObserver extends ExpressionObserver<EmptyExpression>
+    implements EmptyExpression {
+
+  EmptyObserver(EmptyExpression value) : super(value);
+
+  _updateSelf(Scope scope) {
+    _value = scope.model;
+    // TODO(justin): listen for scope.model changes?
+  }
+
+  accept(Visitor v) => v.visitEmptyExpression(this);
+}
+
+class LiteralObserver extends ExpressionObserver<Literal> implements Literal {
+
+  LiteralObserver(Literal value) : super(value);
+
+  dynamic get value => _expr.value;
+
+  _updateSelf(Scope scope) {
+    _value = _expr.value;
+  }
+
+  accept(Visitor v) => v.visitLiteral(this);
+}
+
+class MapLiteralObserver extends ExpressionObserver<MapLiteral>
+    implements MapLiteral {
+
+  final List<MapLiteralEntryObserver> entries;
+
+  MapLiteralObserver(MapLiteral value, this.entries) : super(value);
+
+  _updateSelf(Scope scope) {
+    _value = entries.fold(new Map(),
+        (m, e) => m..[e.key._value] = e.entryValue._value);
+  }
+
+  accept(Visitor v) => v.visitMapLiteral(this);
+}
+
+class MapLiteralEntryObserver extends ExpressionObserver<MapLiteralEntry>
+    implements MapLiteralEntry {
+
+  final LiteralObserver key;
+  final ExpressionObserver entryValue;
+
+  MapLiteralEntryObserver(MapLiteralEntry value, this.key, this.entryValue)
+      : super(value);
+
+  accept(Visitor v) => v.visitMapLiteralEntry(this);
+}
+
+class IdentifierObserver extends ExpressionObserver<Identifier>
+    implements Identifier {
+
+  IdentifierObserver(Identifier value) : super(value);
+
+  dynamic get value => _expr.value;
+
+  _updateSelf(Scope scope) {
+    _value = scope[_expr.value];
+
+    var owner = scope.ownerOf(_expr.value);
+    if (owner is Observable) {
+      _subscription = (owner as Observable).changes.listen(
+          (List<ChangeRecord> changes) {
+            var symbol = new Symbol(_expr.value);
+            if (changes.any((c) => c.changes(symbol))) {
+              _invalidate(scope);
+            }
+          });
+    }
+  }
+
+  accept(Visitor v) => v.visitIdentifier(this);
+}
+
+class ParenthesizedObserver extends ExpressionObserver<ParenthesizedExpression>
+    implements ParenthesizedExpression {
+  final ExpressionObserver child;
+
+  ParenthesizedObserver(ExpressionObserver expr, this.child) : super(expr);
+
+
+  _updateSelf(Scope scope) {
+    _value = child._value;
+  }
+
+  accept(Visitor v) => v.visitParenthesizedExpression(this);
+}
+
+class UnaryObserver extends ExpressionObserver<UnaryOperator>
+    implements UnaryOperator {
+  final ExpressionObserver child;
+
+  UnaryObserver(UnaryOperator expr, this.child) : super(expr);
+
+  String get operator => _expr.operator;
+
+  _updateSelf(Scope scope) {
+    var f = _UNARY_OPERATORS[_expr.operator];
+    if (operator == '!') {
+      _value = f(_toBool(child._value));
+    } else {
+      _value = (child._value == null) ? null : f(child._value);
+    }
+  }
+
+  accept(Visitor v) => v.visitUnaryOperator(this);
+}
+
+class BinaryObserver extends ExpressionObserver<BinaryOperator>
+    implements BinaryOperator {
+
+  final ExpressionObserver left;
+  final ExpressionObserver right;
+
+  BinaryObserver(BinaryOperator expr, this.left, this.right)
+      : super(expr);
+
+  String get operator => _expr.operator;
+
+  _updateSelf(Scope scope) {
+    var f = _BINARY_OPERATORS[operator];
+    if (operator == '&&' || operator == '||') {
+      _value = f(_toBool(left._value), _toBool(right._value));
+    } else {
+      _value = (left._value == null || right._value == null)
+          ? null : f(left._value, right._value);
+    }
+  }
+
+  accept(Visitor v) => v.visitBinaryOperator(this);
+
+}
+
+class InvokeObserver extends ExpressionObserver<Invoke> implements Invoke {
+  final ExpressionObserver receiver;
+  List<ExpressionObserver> arguments;
+
+  InvokeObserver(Expression expr, this.receiver, [this.arguments])
+      : super(expr);
+
+  bool get isGetter => _expr.isGetter;
+
+  String get method => _expr.method;
+
+  _updateSelf(Scope scope) {
+    var args = (arguments == null)
+        ? []
+        : arguments.map((a) => a._value)
+            .toList(growable: false);
+    var receiverValue = receiver._value;
+    if (receiverValue == null) {
+      _value = null;
+    } else if (_expr.method == null) {
+      if (_expr.isGetter) {
+        // getter, but not a top-level identifier
+        // TODO(justin): listen to the receiver's owner
+        _value = receiverValue;
+      } else {
+        // top-level function or model method
+        // TODO(justin): listen to model changes to see if the method has
+        // changed? listen to the scope to see if the top-level method has
+        // changed?
+        assert(receiverValue is Function);
+        _value = call(receiverValue, args);
+      }
+    } else {
+      // special case [] because we don't need mirrors
+      if (_expr.method == '[]') {
+        assert(args.length == 1);
+        var key = args[0];
+        _value = receiverValue[key];
+
+        if (receiverValue is Observable) {
+          _subscription = (receiverValue as Observable).changes.listen(
+              (List<ChangeRecord> changes) {
+                if (changes.any((c) =>
+                    c is MapChangeRecord && c.changes(key))) {
+                  _invalidate(scope);
+                }
+              });
+        }
+      } else {
+        var mirror = reflect(receiverValue);
+        var symbol = new Symbol(_expr.method);
+        _value = (_expr.isGetter)
+            ? mirror.getField(symbol).reflectee
+            : mirror.invoke(symbol, args, null).reflectee;
+
+        if (receiverValue is Observable) {
+          _subscription = (receiverValue as Observable).changes.listen(
+              (List<ChangeRecord> changes) {
+                if (changes.any((c) => c.changes(symbol))) {
+                  _invalidate(scope);
+                }
+              });
+        }
+      }
+    }
+  }
+
+  accept(Visitor v) => v.visitInvoke(this);
+}
+
+class InObserver extends ExpressionObserver<InExpression>
+    implements InExpression {
+  IdentifierObserver left;
+  ExpressionObserver right;
+
+  InObserver(Expression expr, this.left, this.right) : super(expr);
+
+  _updateSelf(Scope scope) {
+    Identifier identifier = left;
+    var iterable = right._value;
+
+    if (iterable is! Iterable && iterable != null) {
+      throw new EvalException("right side of 'in' is not an iterator");
+    }
+
+    if (iterable is ObservableList) {
+      _subscription = (iterable as ObservableList).changes.listen(
+          (List<ChangeRecord> changes) {
+            if (changes.any((c) => c is ListChangeRecord)) {
+              _invalidate(scope);
+            }
+          });
+    }
+
+    // TODO: make Comprehension observable and update it
+    _value = new Comprehension(identifier.value, iterable);
+  }
+
+  accept(Visitor v) => v.visitInExpression(this);
+}
+
+_toBool(v) => (v == null) ? false : v;
+
+call(dynamic receiver, List args) {
+  if (receiver is Method) {
+    return
+        _convert(receiver.mirror.invoke(receiver.symbol, args, null).reflectee);
+  } else {
+    return _convert(Function.apply(receiver, args, null));
+  }
+}
+
+/**
+ * A comprehension declaration ("a in b").
+ */
+class Comprehension {
+  final String identifier;
+  final Iterable iterable;
+  Comprehension(this.identifier, this.iterable);
+}
+
+/**
+ * A method on a model object in a [Scope].
+ */
+class Method { //implements _FunctionWrapper {
+  final InstanceMirror mirror;
+  final Symbol symbol;
+
+  Method(this.mirror, this.symbol);
+
+  dynamic call(List args) => mirror.invoke(symbol, args, null).reflectee;
+}
+
+class EvalException implements Exception {
+  final String message;
+  EvalException(this.message);
+  String toString() => "EvalException: $message";
+}
diff --git a/pkg/polymer_expressions/lib/expression.dart b/pkg/polymer_expressions/lib/expression.dart
new file mode 100644
index 0000000..516e85b
--- /dev/null
+++ b/pkg/polymer_expressions/lib/expression.dart
@@ -0,0 +1,208 @@
+// 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 polymer_expressions.expression;
+
+import 'visitor.dart';
+
+// Helper functions for building expression trees programmatically
+
+EmptyExpression empty() => new EmptyExpression();
+Literal literal(v) => new Literal(v);
+MapLiteral mapLiteral(List<MapLiteralEntry> entries) => new MapLiteral(entries);
+MapLiteralEntry mapLiteralEntry(Literal key, Expression value) =>
+    new MapLiteralEntry(key, value);
+Identifier ident(String v) => new Identifier(v);
+ParenthesizedExpression paren(Expression e) => new ParenthesizedExpression(e);
+UnaryOperator unary(String op, Expression e) => new UnaryOperator(op, e);
+BinaryOperator binary(Expression l, String op, Expression r) =>
+    new BinaryOperator(l, op, r);
+Invoke invoke(Expression e, String m, [List<Expression> a]) =>
+    new Invoke(e, m, a);
+InExpression inExpr(Expression l, Expression r) => new InExpression(l, r);
+
+
+class AstFactory {
+  EmptyExpression empty() => new EmptyExpression();
+
+  Literal literal(v) => new Literal(v);
+
+  MapLiteral mapLiteral(List<MapLiteralEntry> entries) =>
+      new MapLiteral(entries);
+
+  MapLiteralEntry mapLiteralEntry(Literal key, Expression value) =>
+      new MapLiteralEntry(key, value);
+
+  Identifier identifier(String v) => new Identifier(v);
+
+  ParenthesizedExpression parenthesized(Expression e) =>
+      new ParenthesizedExpression(e);
+
+  UnaryOperator unary(String op, Expression e) => new UnaryOperator(op, e);
+
+  BinaryOperator binary(Expression l, String op, Expression r) =>
+      new BinaryOperator(l, op, r);
+
+  Invoke invoke(Expression e, String m, [List<Expression> a]) =>
+      new Invoke(e, m, a);
+
+  InExpression inExpr(Expression l, Expression r) => new InExpression(l, r);
+}
+
+/// Base class for all expressions
+abstract class Expression {
+  accept(Visitor v);
+}
+
+class EmptyExpression extends Expression {
+  accept(Visitor v) => v.visitEmptyExpression(this);
+  bool operator ==(o) => o is EmptyExpression;
+}
+
+class Literal<T> extends Expression {
+  final T value;
+
+  Literal(this.value);
+
+  accept(Visitor v) => v.visitLiteral(this);
+
+  String toString() => (value is String) ? '"$value"' : '$value';
+
+  bool operator ==(o) => o is Literal<T> && o.value == value;
+
+  int get hashCode => value.hashCode;
+}
+
+class MapLiteral extends Expression {
+  final List<MapLiteralEntry> entries;
+
+  MapLiteral(this.entries);
+
+  accept(Visitor v) => v.visitMapLiteral(this);
+
+  String toString() => "{$entries}";
+
+  bool operator ==(o) => o is MapLiteral && _listEquals(o.entries, entries);
+}
+
+class MapLiteralEntry extends Expression {
+  final Literal key;
+  final Expression entryValue;
+
+  MapLiteralEntry(this.key, this.entryValue);
+
+  accept(Visitor v) => v.visitMapLiteralEntry(this);
+
+  String toString() => "$key: $entryValue";
+
+  bool operator ==(o) => o is MapLiteralEntry && o.key == key
+      && o.entryValue == entryValue;
+}
+
+class ParenthesizedExpression extends Expression {
+  final Expression child;
+
+  ParenthesizedExpression(this.child);
+
+  accept(Visitor v) => v.visitParenthesizedExpression(this);
+
+  String toString() => '($child)';
+
+  bool operator ==(o) => o is ParenthesizedExpression && o.child == child;
+
+  int get hashCode => child.hashCode;
+}
+
+class Identifier extends Expression {
+  final String value;
+
+  Identifier(this.value);
+
+  accept(Visitor v) => v.visitIdentifier(this);
+
+  String toString() => value;
+
+  bool operator ==(o) => o is Identifier && o.value == value;
+
+  int get hashCode => value.hashCode;
+}
+
+class UnaryOperator extends Expression {
+  final String operator;
+  final Expression child;
+
+  UnaryOperator(this.operator, this.child);
+
+  accept(Visitor v) => v.visitUnaryOperator(this);
+
+  String toString() => '$operator $child';
+
+  bool operator ==(o) => o is UnaryOperator && o.operator == operator
+      && o.child == child;
+}
+
+class BinaryOperator extends Expression {
+  final String operator;
+  final Expression left;
+  final Expression right;
+
+  BinaryOperator(this.left, this.operator, this.right);
+
+  accept(Visitor v) => v.visitBinaryOperator(this);
+
+  String toString() => '($left $operator $right)';
+
+  bool operator ==(o) => o is BinaryOperator && o.operator == operator
+      && o.left == left && o.right == right;
+}
+
+class InExpression extends Expression {
+  final Expression left;
+  final Expression right;
+
+  InExpression(this.left, this.right);
+
+  accept(Visitor v) => v.visitInExpression(this);
+
+  String toString() => '($left in $right)';
+
+  bool operator ==(o) => o is InExpression && o.left == left
+      && o.right == right;
+}
+
+/**
+ * Represents a function or method invocation. If [method] is null, then
+ * [receiver] is an expression that should evaluate to a function. If [method]
+ * is not null, then [receiver] is an expression that should evaluate to an
+ * object that has an appropriate method.
+ */
+class Invoke extends Expression {
+  final Expression receiver;
+  final String method;
+  final List<Expression> arguments;
+
+  Invoke(this.receiver, this.method, [this.arguments]);
+
+  accept(Visitor v) => v.visitInvoke(this);
+
+  bool get isGetter => arguments == null;
+
+  String toString() => '$receiver.$method($arguments)';
+
+  bool operator ==(o) =>
+      o is Invoke
+      && o.receiver == receiver
+      && o.method == method
+      && _listEquals(o.arguments, arguments);
+}
+
+bool _listEquals(List a, List b) {
+  if (a == b) return true;
+  if (a == null || b == null) return false;
+  if (a.length != b.length) return false;
+  for (int i = 0; i < a.length; i++) {
+    if (a[i] != b[i]) return false;
+  }
+  return true;
+}
\ No newline at end of file
diff --git a/pkg/polymer_expressions/lib/filter.dart b/pkg/polymer_expressions/lib/filter.dart
new file mode 100644
index 0000000..ab808ed
--- /dev/null
+++ b/pkg/polymer_expressions/lib/filter.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library polymer_expressions.filter;
+
+typedef Object Filter(Object value);
+
+abstract class Transformer<T, V> {
+
+  T forward(V v);
+  V reverse(T t);
+  Transformer<V, T> get inverse => new _InverseTransformer(this);
+}
+
+class _InverseTransformer<T, V> implements Transformer<T, V> {
+  final Transformer<V, T> _t;
+  _InverseTransformer(this._t);
+
+  T forward(V v) => _t.reverse(v);
+  V reverse(T t) => _t.forward(t);
+  Transformer<V, T> get inverse => _t;
+}
diff --git a/pkg/polymer_expressions/lib/parser.dart b/pkg/polymer_expressions/lib/parser.dart
new file mode 100644
index 0000000..c02d656
--- /dev/null
+++ b/pkg/polymer_expressions/lib/parser.dart
@@ -0,0 +1,282 @@
+// 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 polymer_expressions.parser;
+
+import 'tokenizer.dart';
+import 'expression.dart';
+
+const _UNARY_OPERATORS = const ['+', '-', '!'];
+
+Expression parse(String expr) => new Parser(expr).parse();
+
+class Parser {
+  final AstFactory _astFactory;
+  final Tokenizer _tokenizer;
+  List<Token> _tokens;
+  Iterator _iterator;
+  Token _token;
+
+  Parser(String input, {AstFactory astFactory})
+      : _tokenizer = new Tokenizer(input),
+        _astFactory = (astFactory == null) ? new AstFactory() : astFactory;
+
+  Expression parse() {
+    _tokens = _tokenizer.tokenize();
+    _iterator = _tokens.iterator;
+    _advance();
+    return _parseExpression();
+  }
+
+  _advance([int kind, String value]) {
+    if ((kind != null && _token.kind != kind)
+        || (value != null && _token.value != value)) {
+      throw new ParseException("Expected $value: $_token");
+    }
+    _token = _iterator.moveNext() ? _iterator.current : null;
+  }
+
+  Expression _parseExpression() {
+    if (_token == null) return _astFactory.empty();
+    var expr = _parseUnary();
+    return (expr == null) ? null : _parsePrecedence(expr, 0);
+  }
+
+  // _parsePrecedence and _parseBinary implement the precedence climbing
+  // algorithm as described in:
+  // http://en.wikipedia.org/wiki/Operator-precedence_parser#Precedence_climbing_method
+  Expression _parsePrecedence(Expression left, int precedence) {
+    assert(left != null);
+    while (_token != null) {
+      if (_token.kind == GROUPER_TOKEN) {
+        if (_token.value == '(') {
+          var args = _parseArguments();
+          left = _astFactory.invoke(left, null, args);
+        } else if (_token.value == '[') {
+          var indexExpr = _parseIndex();
+          var args = indexExpr == null ? [] : [indexExpr];
+          left = _astFactory.invoke(left, '[]', args);
+        } else {
+          break;
+        }
+      } else if (_token.kind == DOT_TOKEN) {
+        _advance();
+        var right = _parseUnary();
+        left = _makeInvoke(left, right);
+      } else if (_token.kind == KEYWORD_TOKEN && _token.value == 'in') {
+        left = _parseComprehension(left);
+      } else if (_token.kind == OPERATOR_TOKEN
+          && _token.precedence >= precedence) {
+        left = _parseBinary(left);
+      } else {
+        break;
+      }
+    }
+    return left;
+  }
+
+  Invoke _makeInvoke(left, right) {
+    if (right is Identifier) {
+      return _astFactory.invoke(left, right.value);
+    } else if (right is Invoke && right.receiver is Identifier) {
+      Identifier method = right.receiver;
+      return _astFactory.invoke(left, method.value, right.arguments);
+    } else {
+      throw new ParseException("expected identifier: $right");
+    }
+  }
+
+  Expression _parseBinary(left) {
+    var op = _token;
+    _advance();
+    var right = _parseUnary();
+    while (_token != null
+        && (_token.kind == OPERATOR_TOKEN
+        || _token.kind == DOT_TOKEN
+        || _token.kind == GROUPER_TOKEN)
+        && _token.precedence > op.precedence) {
+      right = _parsePrecedence(right, _token.precedence);
+    }
+    return _astFactory.binary(left, op.value, right);
+  }
+
+  Expression _parseUnary() {
+    if (_token.kind == OPERATOR_TOKEN) {
+      var value = _token.value;
+      if (value == '+' || value == '-') {
+        _advance();
+        if (_token.kind == INTEGER_TOKEN) {
+          return _parseInteger(value);
+        } else if (_token.kind == DECIMAL_TOKEN) {
+          return _parseDecimal(value);
+        } else {
+          var expr = _parsePrecedence(_parsePrimary(), POSTFIX_PRECEDENCE);
+          return _astFactory.unary(value, expr);
+        }
+      } else if (value == '!') {
+        _advance();
+        var expr = _parsePrecedence(_parsePrimary(), POSTFIX_PRECEDENCE);
+        return _astFactory.unary(value, expr);
+      }
+    }
+    return _parsePrimary();
+  }
+
+  Expression _parsePrimary() {
+    var kind = _token.kind;
+    switch (kind) {
+      case KEYWORD_TOKEN:
+        var keyword = _token.value;
+        if (keyword == 'this') {
+          _advance();
+          // TODO(justin): return keyword node
+          return _astFactory.identifier('this');
+        } else if (keyword == 'in') {
+          return null;
+        } else {
+          throw new ArgumentError('unrecognized keyword: $keyword');
+        }
+        break;
+      case IDENTIFIER_TOKEN:
+        return _parseInvokeOrIdentifier();
+        break;
+      case STRING_TOKEN:
+        return _parseString();
+        break;
+      case INTEGER_TOKEN:
+        return _parseInteger();
+        break;
+      case DECIMAL_TOKEN:
+        return _parseDecimal();
+        break;
+      case GROUPER_TOKEN:
+        if (_token.value == '(') {
+          return _parseParenthesized();
+        } else if (_token.value == '{') {
+          return _parseMapLiteral();
+        }
+        return null;
+        break;
+      default:
+        return null;
+    }
+  }
+
+  MapLiteral _parseMapLiteral() {
+    var entries = [];
+    do {
+      _advance();
+      if (_token.kind == GROUPER_TOKEN && _token.value == '}') {
+        break;
+      }
+      entries.add(_parseMapLiteralEntry());
+    } while(_token != null && _token.value == ',');
+    _advance(GROUPER_TOKEN, '}');
+    return new MapLiteral(entries);
+  }
+
+  MapLiteralEntry _parseMapLiteralEntry() {
+    var key = _parseString();
+    _advance(COLON_TOKEN, ':');
+    var value = _parseExpression();
+    return _astFactory.mapLiteralEntry(key, value);
+  }
+
+  InExpression _parseComprehension(Expression left) {
+    assert(_token.value == 'in');
+    if (left is! Identifier) {
+      throw new ParseException(
+          "in... statements must start with an identifier");
+    }
+    _advance();
+    var right = _parseExpression();
+    return _astFactory.inExpr(left, right);
+  }
+
+  Expression _parseInvokeOrIdentifier() {
+    if (_token.value == 'true') {
+      _advance();
+      return _astFactory.literal(true);
+    }
+    if (_token.value == 'false') {
+      _advance();
+      return _astFactory.literal(false);
+    }
+    var identifier = _parseIdentifier();
+    var args = _parseArguments();
+    if (args == null) {
+      return identifier;
+    } else {
+      return _astFactory.invoke(identifier, null, args);
+    }
+  }
+
+  Invoke _parseInvoke() {
+    var identifier = _parseIdentifier();
+    var args = _parseArguments();
+    return _astFactory.invoke(null, identifier, args);
+  }
+
+  Identifier _parseIdentifier() {
+    if (_token.kind != IDENTIFIER_TOKEN) {
+      throw new ParseException("expected identifier: $_token.value");
+    }
+    var value = _token.value;
+    _advance();
+    return _astFactory.identifier(value);
+  }
+
+  List<Expression> _parseArguments() {
+    if (_token != null && _token.kind == GROUPER_TOKEN && _token.value == '(') {
+      var args = [];
+      do {
+        _advance();
+        if (_token.kind == GROUPER_TOKEN && _token.value == ')') {
+          break;
+        }
+        var expr = _parseExpression();
+        args.add(expr);
+      } while(_token != null && _token.value == ',');
+      _advance(GROUPER_TOKEN, ')');
+      return args;
+    }
+    return null;
+  }
+
+  Expression _parseIndex() {
+    if (_token != null && _token.kind == GROUPER_TOKEN && _token.value == '[') {
+      _advance();
+      var expr = _parseExpression();
+      _advance(GROUPER_TOKEN, ']');
+      return expr;
+    }
+    return null;
+  }
+
+  ParenthesizedExpression _parseParenthesized() {
+    _advance();
+    var expr = _parseExpression();
+    _advance(GROUPER_TOKEN, ')');
+    return _astFactory.parenthesized(expr);
+  }
+
+  Literal<String> _parseString() {
+    var value = _astFactory.literal(_token.value);
+    _advance();
+    return value;
+  }
+
+  Literal<int> _parseInteger([String prefix = '']) {
+    var value = _astFactory.literal(int.parse('$prefix${_token.value}'));
+    _advance();
+    return value;
+  }
+
+  Literal<double> _parseDecimal([String prefix = '']) {
+    var value = _astFactory.literal(double.parse('$prefix${_token.value}'));
+    _advance();
+    return value;
+  }
+
+}
diff --git a/pkg/polymer_expressions/lib/polymer_expressions.dart b/pkg/polymer_expressions/lib/polymer_expressions.dart
new file mode 100644
index 0000000..dd7d7af
--- /dev/null
+++ b/pkg/polymer_expressions/lib/polymer_expressions.dart
@@ -0,0 +1,109 @@
+// 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 polymer_expressions;
+
+import 'dart:async';
+import 'dart:html';
+
+import 'package:observe/observe.dart';
+
+import 'eval.dart';
+import 'expression.dart';
+import 'parser.dart';
+
+// TODO(justin): Investigate XSS protection
+Object _classAttributeConverter(v) =>
+    (v is Map) ? v.keys.where((k) => v[k] == true).join(' ') :
+    (v is Iterable) ? v.join(' ') :
+    v;
+
+Object _styleAttributeConverter(v) =>
+    (v is Map) ? v.keys.map((k) => '$k: ${v[k]}').join(';') :
+    (v is Iterable) ? v.join(';') :
+    v;
+
+class PolymerExpressions extends BindingDelegate {
+
+  final Map<String, Object> globals;
+
+  PolymerExpressions({Map<String, Object> globals})
+      : globals = (globals == null) ? new Map<String, Object>() : globals;
+
+  _Binding getBinding(model, String path, name, node) {
+    if (path == null) return null;
+    var expr = new Parser(path).parse();
+    if (model is! Scope) {
+      model = new Scope(model: model, variables: globals);
+    }
+    if (node is Element && name == "class") {
+      return new _Binding(expr, model, _classAttributeConverter);
+    }
+    if (node is Element && name == "style") {
+      return new _Binding(expr, model, _styleAttributeConverter);
+    }
+    return new _Binding(expr, model);
+  }
+
+  getInstanceModel(Element template, model) {
+    if (model is! Scope) {
+      var _scope = new Scope(model: model, variables: globals);
+      return _scope;
+    }
+    return model;
+  }
+}
+
+class _Binding extends Object with ChangeNotifierMixin {
+  static const _VALUE = const Symbol('value');
+
+  final Scope _scope;
+  final ExpressionObserver _expr;
+  final _converter;
+  var _value;
+
+
+  _Binding(Expression expr, Scope scope, [this._converter])
+      : _expr = observe(expr, scope),
+        _scope = scope {
+    _expr.onUpdate.listen(_setValue);
+    _setValue(_expr.currentValue);
+  }
+
+  _setValue(v) {
+    if (v is Comprehension) {
+      // convert the Comprehension into a list of scopes with the loop
+      // variable added to the scope
+      _value = v.iterable.map((i) {
+        var vars = new Map();
+        vars[v.identifier] = i;
+        Scope childScope = new Scope(parent: _scope, variables: vars);
+        return childScope;
+      }).toList(growable: false);
+    } else {
+      _value = (_converter == null) ? v : _converter(v);
+    }
+    notifyChange(new PropertyChangeRecord(_VALUE));
+  }
+
+  get value => _value;
+
+  set value(v) {
+    try {
+      assign(_expr, v, _scope);
+      notifyChange(new PropertyChangeRecord(_VALUE));
+    } on EvalException catch (e) {
+      // silently swallow binding errors
+    }
+  }
+
+  getValueWorkaround(key) {
+    if (key == _VALUE) return value;
+  }
+
+  setValueWorkaround(key, v) {
+    if (key == _VALUE) value = v;
+  }
+
+}
diff --git a/pkg/polymer_expressions/lib/src/mirrors.dart b/pkg/polymer_expressions/lib/src/mirrors.dart
new file mode 100644
index 0000000..c2a6c47
--- /dev/null
+++ b/pkg/polymer_expressions/lib/src/mirrors.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.
+
+library polymer_expressions.mirrors;
+
+import 'dart:mirrors';
+
+/**
+ * Walks up the class hierarchy to find a method declaration with the given
+ * [name].
+ *
+ * Note that it's not possible to tell if there's an implementation via
+ * noSuchMethod().
+ */
+Mirror getMemberMirror(ClassMirror classMirror, Symbol name) {
+  if (classMirror.members.containsKey(name)) {
+    return classMirror.members[name];
+  }
+  if (hasSuperclass(classMirror)) {
+    var mirror = getMemberMirror(classMirror.superclass, name);
+    if (mirror != null) {
+      return mirror;
+    }
+  }
+  for (ClassMirror supe in classMirror.superinterfaces) {
+    var mirror = getMemberMirror(supe, name);
+    if (mirror != null) {
+      return mirror;
+    }
+  }
+  return null;
+}
+
+/**
+ * Work-around for http://dartbug.com/5794
+ */
+bool hasSuperclass(ClassMirror classMirror) {
+  var superclass = classMirror.superclass;
+  return (superclass != null) &&
+      (superclass.qualifiedName != const Symbol('dart.core.Object'));
+}
diff --git a/pkg/polymer_expressions/lib/tokenizer.dart b/pkg/polymer_expressions/lib/tokenizer.dart
new file mode 100644
index 0000000..4e03167
--- /dev/null
+++ b/pkg/polymer_expressions/lib/tokenizer.dart
@@ -0,0 +1,300 @@
+// 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 polymer_expressions.tokenizer;
+
+const int _TAB = 9;
+const int _LF = 10;
+const int _VTAB = 11;
+const int _FF = 12;
+const int _CR = 13;
+const int _SPACE = 32;
+const int _BANG = 33;
+const int _DQ = 34;
+const int _$ = 36;
+const int _AMPERSAND = 38;
+const int _SQ = 39;
+const int _OPEN_PAREN = 40;
+const int _CLOSE_PAREN = 41;
+const int _STAR = 42;
+const int _PLUS = 43;
+const int _COMMA = 44;
+const int _MINUS = 45;
+const int _PERIOD = 46;
+const int _SLASH = 47;
+const int _0 = 48;
+const int _9 = 57;
+const int _COLON = 58;
+const int _LT = 60;
+const int _EQ = 61;
+const int _GT = 62;
+const int _QUESTION = 63;
+const int _A = 65;
+const int _Z = 90;
+const int _OPEN_SQUARE_BRACKET = 91;
+const int _BACKSLASH = 92;
+const int _CLOSE_SQUARE_BRACKET = 93;
+const int _CARET = 94;
+const int _US = 95;
+const int _a = 97;
+const int _f = 102;
+const int _n = 110;
+const int _r = 114;
+const int _t = 116;
+const int _v = 118;
+const int _z = 122;
+const int _OPEN_CURLY_BRACKET = 123;
+const int _BAR = 124;
+const int _CLOSE_CURLY_BRACKET = 125;
+const int _NBSP = 160;
+
+const _OPERATORS = const [_PLUS, _MINUS, _STAR, _SLASH, _BANG, _AMPERSAND,
+                          /*_COMMA,*/ _LT, _EQ, _GT, _QUESTION, _CARET, _BAR];
+
+const _GROUPERS = const [_OPEN_PAREN, _CLOSE_PAREN,
+                         _OPEN_SQUARE_BRACKET, _CLOSE_SQUARE_BRACKET,
+                         _OPEN_CURLY_BRACKET, _CLOSE_CURLY_BRACKET];
+
+const _TWO_CHAR_OPS = const ['==', '!=', '<=', '>=', '||', '&&'];
+
+const _KEYWORDS = const ['in', 'this'];
+
+const _PRECEDENCE = const {
+  '!':  0,
+  ':':  0,
+  ',':  0,
+  ')':  0,
+  ']':  0,
+  '}':  0, // ?
+  '?':  1,
+  '||': 2,
+  '&&': 3,
+  '|':  4,
+  '^':  5,
+  '&':  6,
+
+  // equality
+  '!=': 7,
+  '==': 7,
+
+  // relational
+  '>=': 8,
+  '>':  8,
+  '<=': 8,
+  '<':  8,
+
+  // additive
+  '+':  9,
+  '-':  9,
+
+  // multiplicative
+  '%':  10,
+  '/':  10,
+  '*':  10,
+
+  // postfix
+  '(':  11,
+  '[':  11,
+  '.':  11,
+  '{': 11, //not sure this is correct
+};
+
+const POSTFIX_PRECEDENCE = 11;
+
+const int STRING_TOKEN = 1;
+const int IDENTIFIER_TOKEN = 2;
+const int DOT_TOKEN = 3;
+const int COMMA_TOKEN = 4;
+const int COLON_TOKEN = 5;
+const int INTEGER_TOKEN = 6;
+const int DECIMAL_TOKEN = 7;
+const int OPERATOR_TOKEN = 8;
+const int GROUPER_TOKEN = 9;
+const int KEYWORD_TOKEN = 10;
+
+bool isWhitespace(int next) => next == _SPACE || next == _TAB || next == _NBSP;
+
+bool isIdentifierOrKeywordStart(int next) => (_a <= next && next <= _z) ||
+    (_A <= next && next <= _Z) || next == _US || next == _$ || next > 127;
+
+bool isIdentifier(int next) => (_a <= next && next <= _z) ||
+    (_A <= next && next <= _Z) || (_0 <= next && next <= _9) ||
+    next == _US || next == _$ || next > 127;
+
+bool isQuote(int next) => next == _DQ || next == _SQ;
+
+bool isNumber(int next) => _0 <= next && next <= _9;
+
+bool isOperator(int next) => _OPERATORS.contains(next);
+
+bool isGrouper(int next) => _GROUPERS.contains(next);
+
+int escape(int c) {
+  switch (c) {
+    case _f: return _FF; break;
+    case _n: return _LF; break;
+    case _r: return _CR; break;
+    case _t: return _TAB; break;
+    case _v: return _VTAB; break;
+    default: return c;
+  }
+}
+
+class Token {
+  final int kind;
+  final String value;
+  final int precedence;
+
+  Token(this.kind, this.value, [this.precedence = 0]);
+
+  String toString() => "($kind, '$value')";
+}
+
+class Tokenizer {
+  final List<Token> _tokens = <Token>[];
+  final StringBuffer _sb = new StringBuffer();
+  final RuneIterator _iterator;
+
+  int _next;
+
+  Tokenizer(String input) : _iterator = new RuneIterator(input);
+
+  _advance() {
+    _next = _iterator.moveNext() ? _iterator.current : null;
+  }
+
+  List<Token> tokenize() {
+    _advance();
+    while(_next != null) {
+      if (isWhitespace(_next)) {
+        _advance();
+      } else if (isQuote(_next)) {
+        tokenizeString();
+      } else if (isIdentifierOrKeywordStart(_next)) {
+        tokenizeIdentifierOrKeyword();
+      } else if (isNumber(_next)) {
+        tokenizeNumber();
+      } else if (_next == _PERIOD) {
+        tokenizeDot();
+      } else if (_next == _COMMA) {
+        tokenizeComma();
+      } else if (_next == _COLON) {
+        tokenizeColon();
+      } else if (isOperator(_next)) {
+        tokenizeOperator();
+      } else if (isGrouper(_next)) {
+        tokenizeGrouper();
+      } else {
+        _advance();
+      }
+    }
+    return _tokens;
+  }
+
+  tokenizeString() {
+    int quoteChar = _next;
+    _advance();
+    while (_next != quoteChar) {
+      if (_next == null) throw new ParseException("unterminated string");
+      if (_next == _BACKSLASH) {
+        _advance();
+        if (_next == null) throw new ParseException("unterminated string");
+        _sb.writeCharCode(escape(_next));
+      } else {
+        _sb.writeCharCode(_next);
+      }
+      _advance();
+    }
+    _tokens.add(new Token(STRING_TOKEN, _sb.toString()));
+    _sb.clear();
+    _advance();
+  }
+
+  tokenizeIdentifierOrKeyword() {
+    while (_next != null && isIdentifier(_next)) {
+      _sb.writeCharCode(_next);
+      _advance();
+    }
+    var value = _sb.toString();
+    if (_KEYWORDS.contains(value)) {
+      _tokens.add(new Token(KEYWORD_TOKEN, value));
+    } else {
+      _tokens.add(new Token(IDENTIFIER_TOKEN, value));
+    }
+    _sb.clear();
+  }
+
+  tokenizeNumber() {
+    while (_next != null && isNumber(_next)) {
+      _sb.writeCharCode(_next);
+      _advance();
+    }
+    if (_next == _PERIOD) {
+      tokenizeDot();
+    } else {
+      _tokens.add(new Token(INTEGER_TOKEN, _sb.toString()));
+      _sb.clear();
+    }
+  }
+
+  tokenizeDot() {
+    _advance();
+    if (isNumber(_next)) {
+      tokenizeFraction();
+    } else {
+      _tokens.add(new Token(DOT_TOKEN, '.', POSTFIX_PRECEDENCE));
+    }
+  }
+
+  tokenizeComma() {
+    _advance();
+    _tokens.add(new Token(COMMA_TOKEN, ','));
+  }
+
+  tokenizeColon() {
+    _advance();
+    _tokens.add(new Token(COLON_TOKEN, ':'));
+  }
+
+  tokenizeFraction() {
+    _sb.writeCharCode(_PERIOD);
+    while (_next != null && isNumber(_next)) {
+      _sb.writeCharCode(_next);
+      _advance();
+    }
+    _tokens.add(new Token(DECIMAL_TOKEN, _sb.toString()));
+    _sb.clear();
+  }
+
+  tokenizeOperator() {
+    int startChar = _next;
+    _advance();
+    var op;
+    // check for 2 character operators
+    if (isOperator(_next)) {
+      var op2 = new String.fromCharCodes([startChar, _next]);
+      if (_TWO_CHAR_OPS.contains(op2)) {
+        op = op2;
+        _advance();
+      } else {
+        op = new String.fromCharCode(startChar);
+      }
+    } else {
+      op = new String.fromCharCode(startChar);
+    }
+    _tokens.add(new Token(OPERATOR_TOKEN, op, _PRECEDENCE[op]));
+  }
+
+  tokenizeGrouper() {
+    var value = new String.fromCharCode(_next);
+    _tokens.add(new Token(GROUPER_TOKEN, value, _PRECEDENCE[value]));
+    _advance();
+  }
+}
+
+class ParseException implements Exception {
+  final String message;
+  ParseException(this.message);
+  String toString() => "ParseException: $message";
+}
diff --git a/pkg/polymer_expressions/lib/visitor.dart b/pkg/polymer_expressions/lib/visitor.dart
new file mode 100644
index 0000000..a11a0d4
--- /dev/null
+++ b/pkg/polymer_expressions/lib/visitor.dart
@@ -0,0 +1,76 @@
+// 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 polymer_expressions.visitor;
+
+import 'expression.dart';
+
+abstract class Visitor<E extends Expression> {
+  visit(E s) => s.accept(this);
+  visitEmptyExpression(EmptyExpression e);
+  visitParenthesizedExpression(ParenthesizedExpression e);
+  visitInvoke(Invoke i);
+  visitLiteral(Literal l);
+  visitMapLiteral(MapLiteral l);
+  visitMapLiteralEntry(MapLiteralEntry l);
+  visitIdentifier(Identifier i);
+  visitBinaryOperator(BinaryOperator o);
+  visitUnaryOperator(UnaryOperator o);
+  visitInExpression(InExpression c);
+}
+
+abstract class RecursiveVisitor<E> extends Visitor<E> {
+  visitExpression(E e);
+
+  visitEmptyExpression(EmptyExpression e) => visitExpression(e);
+
+  visitParenthesizedExpression(ParenthesizedExpression e) {
+    visit(e);
+    visitExpression(e);
+  }
+
+  visitInvoke(Invoke i) {
+    visit(i.receiver);
+    if (i.arguments != null) {
+      for (var a in i.arguments) {
+        visit(a);
+      }
+    }
+    visitExpression(i);
+  }
+
+  visitLiteral(Literal l) => visitExpression(l);
+
+  visitMapLiteral(MapLiteral l) {
+    for (var e in l.entries) {
+      visit(e);
+    }
+    visitExpression(l);
+  }
+
+  visitMapLiteralEntry(MapLiteralEntry e) {
+    visit(e.key);
+    visit(e.entryValue);
+    visitExpression(e);
+  }
+
+  visitIdentifier(Identifier i) => visitExpression(i);
+
+  visitBinaryOperator(BinaryOperator o) {
+    visit(o.left);
+    visit(o.right);
+    visitExpression(o);
+  }
+
+  visitUnaryOperator(UnaryOperator o) {
+    visit(o.child);
+    visitExpression(o);
+  }
+
+  visitInExpression(InExpression c) {
+    visit(c.left);
+    visit(c.right);
+    visitExpression(c);
+  }
+}
\ No newline at end of file
diff --git a/pkg/polymer_expressions/pubspec.yaml b/pkg/polymer_expressions/pubspec.yaml
new file mode 100644
index 0000000..d6322cf
--- /dev/null
+++ b/pkg/polymer_expressions/pubspec.yaml
@@ -0,0 +1,10 @@
+name: polymer_expressions
+author: Web UI Authors <html-dev@dartlang.org>
+description: An expressive custom binding syntax for MDV templates
+homepage: http://www.dartlang.org/
+dependencies:
+  browser: any
+  mdv: any
+  observe: any
+dev_dependencies:
+  unittest: any
diff --git a/pkg/polymer_expressions/test/all_tests.dart b/pkg/polymer_expressions/test/all_tests.dart
new file mode 100644
index 0000000..bbfccba
--- /dev/null
+++ b/pkg/polymer_expressions/test/all_tests.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.
+
+library all_tests;
+
+import 'eval_test.dart' as eval;
+import 'parser_test.dart' as parser;
+import 'tokenizer_test.dart' as tokenizer;
+
+main() {
+  tokenizer.main();
+  parser.main();
+  eval.main();
+}
diff --git a/pkg/polymer_expressions/test/eval_test.dart b/pkg/polymer_expressions/test/eval_test.dart
new file mode 100644
index 0000000..b2d9123
--- /dev/null
+++ b/pkg/polymer_expressions/test/eval_test.dart
@@ -0,0 +1,378 @@
+// 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 eval_test;
+
+import 'dart:async';
+
+import 'package:polymer_expressions/eval.dart';
+import 'package:polymer_expressions/filter.dart';
+import 'package:polymer_expressions/parser.dart';
+import 'package:unittest/unittest.dart';
+import 'package:observe/observe.dart';
+
+main() {
+
+  group('eval', () {
+    test('should return the model for an empty expression', () {
+      expectEval('', 'model', 'model');
+    });
+
+    test('should handle the "this" keyword', () {
+      expectEval('this', 'model', 'model');
+      expectEval('this.name', 'foo', new Foo(name: 'foo'));
+      expectEval('this["a"]', 'x', {'a': 'x'});
+    });
+
+    test('should return a literal int', () {
+      expectEval('1', 1);
+      expectEval('+1', 1);
+      expectEval('-1', -1);
+    });
+
+    test('should return a literal double', () {
+      expectEval('1.2', 1.2);
+      expectEval('+1.2', 1.2);
+      expectEval('-1.2', -1.2);
+    });
+
+    test('should return a literal string', () {
+      expectEval('"hello"', "hello");
+      expectEval("'hello'", "hello");
+    });
+
+    test('should return a literal boolean', () {
+      expectEval('true', true);
+      expectEval('false', false);
+    });
+
+    test('should return a literal map', () {
+      expectEval('{"a": 1}', equals(new Map.from({'a': 1})));
+      expectEval('{"a": 1}', containsPair('a', 1));
+    });
+
+    test('should call methods on a literal map', () {
+      expectEval('{"a": 1}.length', 1);
+    });
+
+    test('should evaluate unary operators', () {
+      expectEval('+a', 2, null, {'a': 2});
+      expectEval('-a', -2, null, {'a': 2});
+      expectEval('!a', false, null, {'a': true});
+    });
+
+    test('should evaluate binary operators', () {
+      expectEval('1 + 2', 3);
+      expectEval('2 - 1', 1);
+      expectEval('4 / 2', 2);
+      expectEval('2 * 3', 6);
+
+      expectEval('1 == 1', true);
+      expectEval('1 == 2', false);
+      expectEval('1 != 1', false);
+      expectEval('1 != 2', true);
+
+      expectEval('1 > 1', false);
+      expectEval('1 > 2', false);
+      expectEval('2 > 1', true);
+      expectEval('1 >= 1', true);
+      expectEval('1 >= 2', false);
+      expectEval('2 >= 1', true);
+      expectEval('1 < 1', false);
+      expectEval('1 < 2', true);
+      expectEval('2 < 1', false);
+      expectEval('1 <= 1', true);
+      expectEval('1 <= 2', true);
+      expectEval('2 <= 1', false);
+
+      expectEval('true || true', true);
+      expectEval('true || false', true);
+      expectEval('false || true', true);
+      expectEval('false || false', false);
+
+      expectEval('true && true', true);
+      expectEval('true && false', false);
+      expectEval('false && true', false);
+      expectEval('false && false', false);
+    });
+
+    test('should invoke a method on the model', () {
+      var foo = new Foo(name: 'foo', age: 2);
+      expectEval('x()', foo.x(), foo);
+      expectEval('name', foo.name, foo);
+    });
+
+    test('should invoke chained methods', () {
+      var foo = new Foo(name: 'foo', age: 2);
+      expectEval('name.length', foo.name.length, foo);
+      expectEval('x().toString()', foo.x().toString(), foo);
+      expectEval('name.substring(2)', foo.name.substring(2), foo);
+      expectEval('a()()', 1, null, {'a': () => () => 1});
+    });
+
+    test('should invoke a top-level function', () {
+      expectEval('x()', 42, null, {'x': () => 42});
+      expectEval('x(5)', 5, null, {'x': (i) => i});
+      expectEval('y(5, 10)', 50, null, {'y': (i, j) => i * j});
+    });
+
+    test('should give precedence to top-level functions over methods', () {
+      var foo = new Foo(name: 'foo', age: 2);
+      expectEval('x()', 42, foo, {'x': () => 42});
+    });
+
+    test('should invoke the [] operator', () {
+      var map = {'a': 1, 'b': 2};
+      expectEval('map["a"]', 1, null, {'map': map});
+      expectEval('map["a"] + map["b"]', 3, null, {'map': map});
+    });
+
+    test('should call a filter', () {
+      var topLevel = {
+        'a': 'foo',
+        'uppercase': (s) => s.toUpperCase(),
+      };
+      expectEval('a | uppercase', 'FOO', null, topLevel);
+    });
+
+    test('should call a transformer', () {
+      var topLevel = {
+        'a': '42',
+        'parseInt': parseInt,
+        'add': add,
+      };
+      expectEval('a | parseInt()', 42, null, topLevel);
+      expectEval('a | parseInt(8)', 34, null, topLevel);
+      expectEval('a | parseInt() | add(10)', 52, null, topLevel);
+    });
+
+    test('should return null if the receiver of a method is null', () {
+      expectEval('a.b', null, null, {'a': null});
+      expectEval('a.b()', null, null, {'a': null});
+    });
+
+    test('should return null if null is invoked', () {
+      expectEval('a()', null, null, {'a': null});
+    });
+
+    test('should return null if an operand is null', () {
+      expectEval('a + b', null, null, {'a': null, 'b': null});
+      expectEval('+a', null, null, {'a': null});
+    });
+
+    test('should treat null as false', () {
+      expectEval('!a', true, null, {'a': null});
+
+      expectEval('a && b', false, null, {'a': null, 'b': true});
+      expectEval('a && b', false, null, {'a': true, 'b': null});
+      expectEval('a && b', false, null, {'a': null, 'b': false});
+      expectEval('a && b', false, null, {'a': false, 'b': null});
+      expectEval('a && b', false, null, {'a': null, 'b': null});
+
+      expectEval('a || b', true, null, {'a': null, 'b': true});
+      expectEval('a || b', true, null, {'a': true, 'b': null});
+      expectEval('a || b', false, null, {'a': null, 'b': false});
+      expectEval('a || b', false, null, {'a': false, 'b': null});
+      expectEval('a || b', false, null, {'a': null, 'b': null});
+    });
+
+    test('should evaluate an "in" expression', () {
+      var scope = new Scope(variables: {'items': [1, 2, 3]});
+      var comprehension = eval(parse('item in items'), scope);
+      expect(comprehension.iterable, orderedEquals([1, 2, 3]));
+    });
+
+    test('should handle null iterators in "in" expressions', () {
+      var scope = new Scope(variables: {'items': null});
+      var comprehension = eval(parse('item in items'), scope);
+      expect(comprehension, isNotNull);
+      expect(comprehension.iterable, null);
+    });
+
+  });
+
+  group('assign', () {
+
+    test('should assign a single identifier', () {
+      var foo = new Foo(name: 'a');
+      assign(parse('name'), 'b', new Scope(model: foo));
+      expect(foo.name, 'b');
+    });
+
+    test('should assign a sub-property', () {
+      var child = new Foo(name: 'child');
+      var parent = new Foo(child: child);
+      assign(parse('child.name'), 'Joe', new Scope(model: parent));
+      expect(parent.child.name, 'Joe');
+    });
+
+    test('should assign an index', () {
+      var foo = new Foo(items: [1, 2, 3]);
+      assign(parse('items[0]'), 4, new Scope(model: foo));
+      expect(foo.items[0], 4);
+    });
+
+    test('should assign through transformers', () {
+      var foo = new Foo(name: '42', age: 32);
+      var globals = {
+        'a': '42',
+        'parseInt': parseInt,
+        'add': add,
+      };
+      var scope = new Scope(model: foo, variables: globals);
+      assign(parse('age | add(7)'), 29, scope);
+      expect(foo.age, 22);
+      assign(parse('name | parseInt() | add(10)'), 29, scope);
+      expect(foo.name, '19');
+    });
+
+  });
+
+  group('scope', () {
+    test('should return fields on the model', () {
+      var foo = new Foo(name: 'a', age: 1);
+      var scope = new Scope(model: foo);
+      expect(scope['name'], 'a');
+      expect(scope['age'], 1);
+    });
+
+    test('should throw for undefined names', () {
+      var scope = new Scope();
+      expect(() => scope['a'], throwsException);
+    });
+
+    test('should return variables', () {
+      var scope = new Scope(variables: {'a': 'A'});
+      expect(scope['a'], 'A');
+    });
+
+    test("should a field from the parent's model", () {
+      var parent = new Scope(variables: {'a': 'A', 'b': 'B'});
+      var child = new Scope(variables: {'a': 'a'}, parent: parent);
+      expect(child['a'], 'a');
+      expect(parent['a'], 'A');
+      expect(child['b'], 'B');
+    });
+
+  });
+
+  group('observe', () {
+    test('should observe an identifier', () {
+      var foo = new Foo(name: 'foo');
+      return expectObserve('name',
+          model: foo,
+          beforeMatcher: 'foo',
+          mutate: () {
+            foo.name = 'fooz';
+          },
+          afterMatcher: 'fooz'
+      );
+    });
+
+    test('should observe an invocation', () {
+      var foo = new Foo(name: 'foo');
+      return expectObserve('foo.name',
+          variables: {'foo': foo},
+          beforeMatcher: 'foo',
+          mutate: () {
+            foo.name = 'fooz';
+          },
+          afterMatcher: 'fooz'
+      );
+    });
+
+    test('should observe map access', () {
+      var foo = toObservable({'one': 'one', 'two': 'two'});
+      return expectObserve('foo["one"]',
+          variables: {'foo': foo},
+          beforeMatcher: 'one',
+          mutate: () {
+            foo['one'] = '1';
+          },
+          afterMatcher: '1'
+      );
+    });
+
+    test('should observe an comprehension', () {
+      var items = new ObservableList();
+      var foo = new Foo(name: 'foo');
+      return expectObserve('item in items',
+          variables: {'items': items},
+          beforeMatcher: (c) => c.iterable.isEmpty,
+          mutate: () {
+            items.add(foo);
+          },
+          afterMatcher: (c) => c.iterable.contains(foo)
+      );
+    });
+
+  });
+
+}
+
+class Foo extends Object with ChangeNotifierMixin {
+  String _name;
+  String get name => _name;
+  void set name(String n) {
+    _name = notifyPropertyChange(const Symbol('name'), _name, n);
+  }
+
+  int age;
+  Foo child;
+  List<int> items;
+
+  Foo({name, this.age, this.child, this.items}) : _name = name;
+
+  int x() => age * age;
+}
+
+parseInt([int radix = 10]) => new IntToString(radix: radix);
+
+class IntToString extends Transformer<int, String> {
+  final int radix;
+  IntToString({this.radix: 10});
+  int forward(String s) => int.parse(s, radix: radix);
+  String reverse(int i) => '$i';
+}
+
+add(int i) => new Add(i);
+
+class Add extends Transformer<int, int> {
+  final int i;
+  Add(this.i);
+  int forward(int x) => x + i;
+  int reverse(int x) => x - i;
+}
+
+Object evalString(String s, [Object model, Map vars]) =>
+    eval(new Parser(s).parse(), new Scope(model: model, variables: vars));
+
+expectEval(String s, dynamic matcher, [Object model, Map vars = const {}]) =>
+    expect(
+        eval(new Parser(s).parse(), new Scope(model: model, variables: vars)),
+        matcher,
+        reason: s);
+
+expectObserve(String s, {
+    Object model,
+    Map variables: const {},
+    dynamic beforeMatcher,
+    mutate(),
+    dynamic afterMatcher}) {
+
+  var observer = observe(new Parser(s).parse(),
+      new Scope(model: model, variables: variables));
+  expect(observer.currentValue, beforeMatcher);
+  var passed = false;
+  var future = observer.onUpdate.first.then((value) {
+    expect(value, afterMatcher);
+    expect(observer.currentValue, afterMatcher);
+    passed = true;
+  });
+  mutate();
+  // fail if we don't receive an update by the next event loop
+  return Future.wait([future, new Future(() {
+    expect(passed, true, reason: "Didn't receive a change notification on $s");
+  })]);
+}
diff --git a/pkg/polymer_expressions/test/parser_test.dart b/pkg/polymer_expressions/test/parser_test.dart
new file mode 100644
index 0000000..21b11fb
--- /dev/null
+++ b/pkg/polymer_expressions/test/parser_test.dart
@@ -0,0 +1,199 @@
+// 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 parser_test;
+
+import 'package:polymer_expressions/parser.dart';
+import 'package:polymer_expressions/expression.dart';
+import 'package:unittest/unittest.dart';
+
+expectParse(String s, Expression e) =>
+    expect(new Parser(s).parse(), e, reason: s);
+
+main() {
+
+  group('parser', () {
+
+    test('should parse an empty expression', () {
+      expectParse('', empty());
+    });
+
+    test('should parse an identifier', () {
+      expectParse('abc', ident('abc'));
+    });
+
+    test('should parse a string literal', () {
+      expectParse('"abc"', literal('abc'));
+    });
+
+    test('should parse an integer literal', () {
+      expectParse('123', literal(123));
+    });
+
+    test('should parse a double literal', () {
+      expectParse('1.23', literal(1.23));
+    });
+
+    test('should parse a positive double literal', () {
+      expectParse('+1.23', literal(1.23));
+    });
+
+    test('should parse a negative double literal', () {
+      expectParse('-1.23', literal(-1.23));
+    });
+
+    test('should parse a plus operator with literals', () {
+      expectParse('1 + 2', binary(literal(1), '+', literal(2)));
+    });
+
+    test('should parse binary operators', () {
+      expectParse('a && b', binary(ident('a'), '&&', ident('b')));
+      expectParse('1 && 2', binary(literal(1), '&&', literal(2)));
+      expectParse('false && true', binary(literal(false), '&&', literal(true)));
+      expectParse('false || true', binary(literal(false), '||', literal(true)));
+    });
+
+    test('should give multiply higher associativity than plus', () {
+      expectParse('a + b * c',
+          binary(
+              ident('a'),
+              '+',
+              binary(ident('b'), '*', ident('c'))));
+    });
+
+    test('should give multiply higher associativity than plus 2', () {
+      expectParse('a * b + c',
+          binary(
+              binary(ident('a'), '*', ident('b')),
+              '+',
+              ident('c')));
+    });
+
+    test('should parse a dot operator', () {
+      expectParse('a.b', invoke(ident('a'), 'b'));
+    });
+
+    test('should parse chained dot operators', () {
+      expectParse('a.b.c', invoke(invoke(ident('a'), 'b'), 'c'));
+    });
+
+    test('should give dot high associativity', () {
+      expectParse('a * b.c', binary(ident('a'), '*', invoke(ident('b'), 'c')));
+    });
+
+    test('should parse a function with no arguments', () {
+      expectParse('a()', invoke(ident('a'), null, []));
+    });
+
+    test('should parse a single function argument', () {
+      expectParse('a(b)', invoke(ident('a'), null, [ident('b')]));
+    });
+
+    test('should parse a function call as a subexpression', () {
+      expectParse('a() + 1',
+          binary(
+              invoke(ident('a'), null, []),
+              '+',
+              literal(1)));
+    });
+
+    test('should parse multiple function arguments', () {
+      expectParse('a(b, c)',
+          invoke(ident('a'), null, [ident('b'), ident('c')]));
+    });
+
+    test('should parse nested function calls', () {
+      expectParse('a(b(c))', invoke(ident('a'), null, [
+          invoke(ident('b'), null, [ident('c')])]));
+    });
+
+    test('should parse an empty method call', () {
+      expectParse('a.b()', invoke(ident('a'), 'b', []));
+    });
+
+    test('should parse a method call with a single argument', () {
+      expectParse('a.b(c)', invoke(ident('a'), 'b', [ident('c')]));
+    });
+
+    test('should parse a method call with multiple arguments', () {
+      expectParse('a.b(c, d)',
+          invoke(ident('a'), 'b', [ident('c'), ident('d')]));
+    });
+
+    test('should parse chained method calls', () {
+      expectParse('a.b().c()', invoke(invoke(ident('a'), 'b', []), 'c', []));
+    });
+
+    test('should parse chained function calls', () {
+      expectParse('a()()', invoke(invoke(ident('a'), null, []), null, []));
+    });
+
+    test('should parse parenthesized expression', () {
+      expectParse('(a)', paren(ident('a')));
+      expectParse('(( 3 * ((1 + 2)) ))', paren(paren(
+          binary(literal(3), '*', paren(paren(
+              binary(literal(1), '+', literal(2))))))));
+    });
+
+    test('should parse an index operator', () {
+      expectParse('a[b]', invoke(ident('a'), '[]', [ident('b')]));
+      expectParse('a.b[c]', invoke(invoke(ident('a'), 'b', null),
+          '[]', [ident('c')]));
+    });
+
+    test('should parse chained index operators', () {
+      expectParse('a[][]', invoke(invoke(ident('a'), '[]', []), '[]', []));
+    });
+
+    test('should parse multiple index operators', () {
+      expectParse('a[b] + c[d]', binary(
+          invoke(ident('a'), '[]', [ident('b')]),
+          '+',
+          invoke(ident('c'), '[]', [ident('d')])));
+    });
+
+    test('should parse a filter chain', () {
+      expectParse('a | b | c', binary(binary(ident('a'), '|', ident('b')),
+          '|', ident('c')));
+    });
+
+    test('should parse comprehension', () {
+      expectParse('a in b', inExpr(ident('a'), ident('b')));
+      expectParse('a in b.c',
+          inExpr(ident('a'), invoke(ident('b'), 'c', null)));
+      expectParse('a in b + c',
+          inExpr(ident('a'), binary(ident('b'), '+', ident('c'))));
+    });
+
+    test('should reject comprehension with non-assignable left expression', () {
+      expect(() => parse('a + 1 in b'), throwsException);
+    });
+
+    test('should reject keywords as identifiers', () {
+      expect(() => parse('a.in'), throwsException);
+    });
+
+    test('should parse map literals', () {
+      expectParse("{'a': 1}",
+          mapLiteral([mapLiteralEntry(literal('a'), literal(1))]));
+      expectParse("{'a': 1, 'b': 2 + 3}",
+          mapLiteral([
+              mapLiteralEntry(literal('a'), literal(1)),
+              mapLiteralEntry(literal('b'),
+                  binary(literal(2), '+', literal(3)))]));
+      expectParse("{'a': foo()}",
+          mapLiteral([mapLiteralEntry(
+              literal('a'), invoke(ident('foo'), null, []))]));
+      expectParse("{'a': foo('a')}",
+          mapLiteral([mapLiteralEntry(
+              literal('a'), invoke(ident('foo'), null, [literal('a')]))]));
+    });
+
+    test('should parse map literals with method calls', () {
+      expectParse("{'a': 1}.length",
+          invoke(mapLiteral([mapLiteralEntry(literal('a'), literal(1))]),
+              'length'));
+    });
+  });
+}
diff --git a/pkg/polymer_expressions/test/syntax_test.dart b/pkg/polymer_expressions/test/syntax_test.dart
new file mode 100644
index 0000000..791a021
--- /dev/null
+++ b/pkg/polymer_expressions/test/syntax_test.dart
@@ -0,0 +1,87 @@
+// 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:html';
+
+import 'package:polymer_expressions/polymer_expressions.dart';
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_enhanced_config.dart';
+import 'package:observe/observe.dart';
+import 'package:mdv/mdv.dart' as mdv;
+
+main() {
+  mdv.initialize();
+  useHtmlEnhancedConfiguration();
+
+  group('syntax', () {
+    setUp(() {
+      document.body.nodes.add(new Element.html('''
+          <template id="test" bind>
+            <input id="input" value="{{ firstName }}">
+          </template>'''));
+    });
+
+    tearDown(() {
+      query('#test')..unbindAll()..remove();
+    });
+
+    test('should make two-way bindings to inputs', () {
+      var person = new Person('John', 'Messerly', ['A', 'B', 'C']);
+      query('#test')
+          ..bindingDelegate = new PolymerExpressions()
+          ..model = person;
+      return new Future.delayed(new Duration()).then((_) {
+        InputElement input = query('#input');
+        expect(input.value, 'John');
+        input.focus();
+        input.value = 'Justin';
+        input.blur();
+        var event = new Event('change');
+        // TODO(justin): figure out how to trigger keyboard events to test
+        // two-way bindings
+      });
+    });
+
+  });
+}
+
+class Person extends Object with ChangeNotifierMixin {
+  static const _FIRST_NAME = const Symbol('firstName');
+  static const _LAST_NAME = const Symbol('lastName');
+  static const _ITEMS = const Symbol('items');
+  static const _GET_FULL_NAME = const Symbol('getFullName');
+
+  String _firstName;
+  String _lastName;
+  List<String> _items;
+
+  Person(this._firstName, this._lastName, this._items);
+
+  String get firstName => _firstName;
+
+  void set firstName(String value) {
+    _firstName = value;
+    notifyChange(new PropertyChangeRecord(_FIRST_NAME));
+  }
+
+  String get lastName => _lastName;
+
+  void set lastName(String value) {
+    _lastName = value;
+    notifyChange(new PropertyChangeRecord(_LAST_NAME));
+  }
+
+  String getFullName() => '$_firstName $_lastName';
+
+  List<String> get items => _items;
+
+  void set items(List<String> value) {
+    _items = value;
+    notifyChange(new PropertyChangeRecord(_ITEMS));
+  }
+
+  String toString() => "Person(firstName: $_firstName, lastName: $_lastName)";
+
+}
diff --git a/pkg/polymer_expressions/test/syntax_test.html b/pkg/polymer_expressions/test/syntax_test.html
new file mode 100644
index 0000000..4f494a6
--- /dev/null
+++ b/pkg/polymer_expressions/test/syntax_test.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+
+<html>
+  <head>
+    <title>syntax_test</title>
+  </head>
+
+  <body>
+    <script type="application/dart" src="syntax_test.dart"></script>
+    <script src="packages/browser/dart.js"></script>
+  </body>
+</html>
diff --git a/pkg/polymer_expressions/test/tokenizer_test.dart b/pkg/polymer_expressions/test/tokenizer_test.dart
new file mode 100644
index 0000000..6c40514
--- /dev/null
+++ b/pkg/polymer_expressions/test/tokenizer_test.dart
@@ -0,0 +1,190 @@
+// 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 tokenizer_test;
+
+import 'package:polymer_expressions/tokenizer.dart';
+import 'package:unittest/unittest.dart';
+
+main() {
+
+  group('tokenizer', () {
+
+    test('should tokenize an empty expression', () {
+      expectTokens('', []);
+    });
+
+    test('should tokenize an identifier', () {
+      expectTokens('abc', [t(IDENTIFIER_TOKEN, 'abc')]);
+    });
+
+    test('should tokenize a double quoted String', () {
+      expectTokens('"abc"', [t(STRING_TOKEN, 'abc')]);
+    });
+
+    test('should tokenize a single quoted String', () {
+      expectTokens("'abc'", [t(STRING_TOKEN, 'abc')]);
+    });
+
+    test('should tokenize a String with escaping', () {
+      expectTokens('"a\\b\\\\c\\\'\\""', [t(STRING_TOKEN, 'ab\\c\'"')]);
+    });
+
+    test('should tokenize a dot operator', () {
+      expectTokens('a.b', [
+          t(IDENTIFIER_TOKEN, 'a'),
+          t(DOT_TOKEN, '.'),
+          t(IDENTIFIER_TOKEN, 'b')]);
+    });
+
+    test('should tokenize a unary plus operator', () {
+      expectTokens('+a', [
+          t(OPERATOR_TOKEN, '+'),
+          t(IDENTIFIER_TOKEN, 'a')]);
+    });
+
+    test('should tokenize a binary plus operator', () {
+      expectTokens('a + b', [
+          t(IDENTIFIER_TOKEN, 'a'),
+          t(OPERATOR_TOKEN, '+'),
+          t(IDENTIFIER_TOKEN, 'b')]);
+    });
+
+    test('should tokenize a logical and operator', () {
+      expectTokens('a && b', [
+          t(IDENTIFIER_TOKEN, 'a'),
+          t(OPERATOR_TOKEN, '&&'),
+          t(IDENTIFIER_TOKEN, 'b')]);
+    });
+
+    test('should tokenize an iterate expression with "in" keyword', () {
+      expectTokens('item in items', [
+          t(IDENTIFIER_TOKEN, 'item'),
+          t(KEYWORD_TOKEN, 'in'),
+          t(IDENTIFIER_TOKEN, 'items')]);
+    });
+
+    test('should tokenize keywords', () {
+      expectTokens('in', [t(KEYWORD_TOKEN, 'in')]);
+      expectTokens('this', [t(KEYWORD_TOKEN, 'this')]);
+    });
+
+    test('should tokenize groups', () {
+      expectTokens('a(b)[]{}', [
+          t(IDENTIFIER_TOKEN, 'a'),
+          t(GROUPER_TOKEN, '('),
+          t(IDENTIFIER_TOKEN, 'b'),
+          t(GROUPER_TOKEN, ')'),
+          t(GROUPER_TOKEN, '['),
+          t(GROUPER_TOKEN, ']'),
+          t(GROUPER_TOKEN, '{'),
+          t(GROUPER_TOKEN, '}')]);
+    });
+
+    test('should tokenize argument lists', () {
+      expectTokens('(a, b)', [
+          t(GROUPER_TOKEN, '('),
+          t(IDENTIFIER_TOKEN, 'a'),
+          t(COMMA_TOKEN, ','),
+          t(IDENTIFIER_TOKEN, 'b'),
+          t(GROUPER_TOKEN, ')')]);
+    });
+
+    test('should tokenize maps', () {
+      expectTokens("{'a': b}", [
+          t(GROUPER_TOKEN, '{'),
+          t(STRING_TOKEN, 'a'),
+          t(COLON_TOKEN, ':'),
+          t(IDENTIFIER_TOKEN, 'b'),
+          t(GROUPER_TOKEN, '}')]);
+    });
+
+    test('should tokenize integers', () {
+      expectTokens('123', [t(INTEGER_TOKEN, '123')]);
+      expectTokens('+123', [t(OPERATOR_TOKEN, '+'), t(INTEGER_TOKEN, '123')]);
+      expectTokens('-123', [t(OPERATOR_TOKEN, '-'), t(INTEGER_TOKEN, '123')]);
+    });
+
+    test('should tokenize decimals', () {
+      expectTokens('1.23', [t(DECIMAL_TOKEN, '1.23')]);
+      expectTokens('+1.23', [t(OPERATOR_TOKEN, '+'), t(DECIMAL_TOKEN, '1.23')]);
+      expectTokens('-1.23', [t(OPERATOR_TOKEN, '-'), t(DECIMAL_TOKEN, '1.23')]);
+    });
+
+    test('should tokenize booleans as identifiers', () {
+      expectTokens('true', [t(IDENTIFIER_TOKEN, 'true')]);
+      expectTokens('false', [t(IDENTIFIER_TOKEN, 'false')]);
+    });
+
+  });
+}
+
+TokenMatcher isToken(int index, String text) => new TokenMatcher(index, text);
+
+class TokenMatcher extends Matcher {
+  final int kind;
+  final String value;
+
+  TokenMatcher(this.kind, this.value);
+
+  bool matches(Token t, Map m) => t.kind == kind && t.value == value;
+
+  Description describe(Description d) => d.add('isToken($kind, $value) ');
+}
+
+expectTokens(String s, List<Token> expected) {
+  var tokens = new Tokenizer(s).tokenize();
+  var matchers = expected.map((t) => isToken(t.kind, t.value)).toList();
+  expect(tokens, matchList(matchers), reason: s);
+}
+
+Token t(int kind, String value) => new Token(kind, value);
+
+MatcherList matchList(List matchers) => new MatcherList(matchers);
+
+class MatcherList extends Matcher {
+  final List<Matcher> matchers;
+
+  MatcherList(this.matchers);
+
+  bool matches(List o, Map matchState) {
+    if (o.length != matchers.length) return false;
+    for (int i = 0; i < o.length; i++) {
+      var state = new Map();
+      if (!matchers[i].matches(o[i], state)) {
+        matchState = {
+          'index': i,
+          'value': o[i],
+          'state': state,
+        };
+        return false;
+      }
+    }
+    return true;
+  }
+
+  Description describe(Description d) {
+    d.add('matches all: ');
+    matchers.forEach((m) => m.describe(d));
+  }
+
+  Description describeMismatch(item, Description mismatchDescription,
+      Map matchState, bool verbose) {
+    if (matchState != null) {
+      var index = matchState['index'];
+      var value = matchState['value'];
+      var state = matchState['state'];
+      var matcher = matchers[index];
+      mismatchDescription.add("Mismatch at index $index: ");
+      matcher.describeMismatch(value, mismatchDescription, state, verbose);
+    } else {
+      if (item.length != matchers.length) {
+        mismatchDescription.add('wrong lengths');
+      } else {
+        mismatchDescription.add('was ').addDescriptionOf(item);
+      }
+    }
+  }
+
+}
diff --git a/pkg/scheduled_test/test/metatest.dart b/pkg/scheduled_test/test/metatest.dart
index cc77069..4834b6e 100644
--- a/pkg/scheduled_test/test/metatest.dart
+++ b/pkg/scheduled_test/test/metatest.dart
@@ -200,7 +200,7 @@
 
 /// Special test configuration for use within the child isolates. This hides all
 /// output and reports data back to the parent isolate.
-class _MetaConfiguration extends Configuration {
+class _MetaConfiguration extends SimpleConfiguration {
   final name = "MetaConfiguration";
 
   void logTestCaseMesssage(TestCase testCase, String message) {}
diff --git a/pkg/shadow_dom/lib/shadow_dom.debug.js b/pkg/shadow_dom/lib/shadow_dom.debug.js
index 4ea1ab8..eff86b3 100644
--- a/pkg/shadow_dom/lib/shadow_dom.debug.js
+++ b/pkg/shadow_dom/lib/shadow_dom.debug.js
@@ -3204,4 +3204,528 @@
   };
 })();
 
+// 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.
+
+var Platform = {};
+
+/*
+ * Copyright 2012 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+/*
+  This is a limited shim for ShadowDOM css styling.
+  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles
+
+  The intention here is to support only the styling features which can be
+  relatively simply implemented. The goal is to allow users to avoid the
+  most obvious pitfalls and do so without compromising performance significantly.
+  For ShadowDOM styling that's not covered here, a set of best practices
+  can be provided that should allow users to accomplish more complex styling.
+
+  The following is a list of specific ShadowDOM styling features and a brief
+  discussion of the approach used to shim.
+
+  Shimmed features:
+
+  * @host: ShadowDOM allows styling of the shadowRoot's host element using the
+  @host rule. To shim this feature, the @host styles are reformatted and
+  prefixed with a given scope name and promoted to a document level stylesheet.
+  For example, given a scope name of .foo, a rule like this:
+
+    @host {
+      * {
+        background: red;
+      }
+    }
+
+  becomes:
+
+    .foo {
+      background: red;
+    }
+
+  * encapsultion: Styles defined within ShadowDOM, apply only to
+  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement
+  this feature.
+
+  By default, rules are prefixed with the host element tag name
+  as a descendant selector. This ensures styling does not leak out of the 'top'
+  of the element's ShadowDOM. For example,
+
+  div {
+      font-weight: bold;
+    }
+
+  becomes:
+
+  x-foo div {
+      font-weight: bold;
+    }
+
+  becomes:
+
+
+  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then
+  selectors are scoped by adding an attribute selector suffix to each
+  simple selector that contains the host element tag name. Each element
+  in the element's ShadowDOM template is also given the scope attribute.
+  Thus, these rules match only elements that have the scope attribute.
+  For example, given a scope name of x-foo, a rule like this:
+
+    div {
+      font-weight: bold;
+    }
+
+  becomes:
+
+    div[x-foo] {
+      font-weight: bold;
+    }
+
+  Note that elements that are dynamically added to a scope must have the scope
+  selector added to them manually.
+
+  * ::pseudo: These rules are converted to rules that take advantage of the
+  pseudo attribute. For example, a shadowRoot like this inside an x-foo
+
+    <div pseudo="x-special">Special</div>
+
+  with a rule like this:
+
+    x-foo::x-special { ... }
+
+  becomes:
+
+    x-foo [pseudo=x-special] { ... }
+
+  Unaddressed ShadowDOM styling features:
+
+  * upper/lower bound encapsulation: Styles which are defined outside a
+  shadowRoot should not cross the ShadowDOM boundary and should not apply
+  inside a shadowRoot.
+
+  This styling behavior is not emulated. Some possible ways to do this that
+  were rejected due to complexity and/or performance concerns include: (1) reset
+  every possible property for every possible selector for a given scope name;
+  (2) re-implement css in javascript.
+
+  As an alternative, users should make sure to use selectors
+  specific to the scope in which they are working.
+
+  * ::distributed: This behavior is not emulated. It's often not necessary
+  to style the contents of a specific insertion point and instead, descendants
+  of the host element can be styled selectively. Users can also create an
+  extra node around an insertion point and style that node's contents
+  via descendent selectors. For example, with a shadowRoot like this:
+
+    <style>
+      content::-webkit-distributed(div) {
+        background: red;
+      }
+    </style>
+    <content></content>
+
+  could become:
+
+    <style>
+      / *@polyfill .content-container div * /
+      content::-webkit-distributed(div) {
+        background: red;
+      }
+    </style>
+    <div class="content-container">
+      <content></content>
+    </div>
+
+  Note the use of @polyfill in the comment above a ShadowDOM specific style
+  declaration. This is a directive to the styling shim to use the selector
+  in comments in lieu of the next selector when running under polyfill.
+*/
+(function(scope) {
+
+var ShadowCSS = {
+  strictStyling: false,
+  registry: {},
+  // Shim styles for a given root associated with a name and extendsName
+  // 1. cache root styles by name
+  // 2. optionally tag root nodes with scope name
+  // 3. shim polyfill directives /* @polyfill */
+  // 4. shim @host and scoping
+  shimStyling: function(root, name, extendsName) {
+    if (root) {
+      // use caching to make working with styles nodes easier and to facilitate
+      // lookup of extendee
+      var def = this.registerDefinition(root, name, extendsName);
+      // find styles and apply shimming...
+      if (this.strictStyling) {
+        this.applyScopeToContent(root, name);
+      }
+      this.shimPolyfillDirectives(def.rootStyles, name);
+      this.applyShimming(def.scopeStyles, name);
+    }
+  },
+  // Shim styles to be placed inside a shadowRoot.
+  // 1. shim polyfill directives /* @polyfill */
+  // 2. shim @host and scoping
+  shimShadowDOMStyling: function(styles, name) {
+    this.shimPolyfillDirectives(styles, name);
+    this.applyShimming(styles, name);
+  },
+  registerDefinition: function(root, name, extendsName) {
+    var def = this.registry[name] = {
+      root: root,
+      name: name,
+      extendsName: extendsName
+    }
+    var styles = root.querySelectorAll('style');
+    styles = styles ? Array.prototype.slice.call(styles, 0) : [];
+    def.rootStyles = styles;
+    def.scopeStyles = def.rootStyles;
+    var extendee = this.registry[def.extendsName];
+    if (extendee) {
+      def.scopeStyles = def.scopeStyles.concat(extendee.scopeStyles);
+    }
+    return def;
+  },
+  applyScopeToContent: function(root, name) {
+    if (root) {
+      // add the name attribute to each node in root.
+      Array.prototype.forEach.call(root.querySelectorAll('*'),
+          function(node) {
+            node.setAttribute(name, '');
+          });
+      // and template contents too
+      Array.prototype.forEach.call(root.querySelectorAll('template'),
+          function(template) {
+            this.applyScopeToContent(template.content, name);
+          },
+          this);
+    }
+  },
+  /*
+   * Process styles to convert native ShadowDOM rules that will trip
+   * up the css parser; we rely on decorating the stylesheet with comments.
+   *
+   * For example, we convert this rule:
+   *
+   * (comment start) @polyfill @host g-menu-item (comment end)
+   * shadow::-webkit-distributed(g-menu-item) {
+   *
+   * to this:
+   *
+   * scopeName g-menu-item {
+   *
+  **/
+  shimPolyfillDirectives: function(styles, name) {
+    if (styles) {
+      Array.prototype.forEach.call(styles, function(s) {
+        s.textContent = this.convertPolyfillDirectives(s.textContent, name);
+      }, this);
+    }
+  },
+  convertPolyfillDirectives: function(cssText, name) {
+    var r = '', l = 0, matches, selector;
+    while (matches = cssPolyfillCommentRe.exec(cssText)) {
+      r += cssText.substring(l, matches.index);
+      // remove end comment delimiter (*/)
+      selector = matches[1].slice(0, -2).replace(hostRe, name);
+      r += this.scopeSelector(selector, name) + '{';
+      l = cssPolyfillCommentRe.lastIndex;
+    }
+    r += cssText.substring(l, cssText.length);
+    return r;
+  },
+  // apply @host and scope shimming
+  applyShimming: function(styles, name) {
+    var cssText = this.shimAtHost(styles, name);
+    cssText += this.shimScoping(styles, name);
+    addCssToDocument(cssText);
+  },
+  // form: @host { .foo { declarations } }
+  // becomes: scopeName.foo { declarations }
+  shimAtHost: function(styles, name) {
+    if (styles) {
+      return this.convertAtHostStyles(styles, name);
+    }
+  },
+  convertAtHostStyles: function(styles, name) {
+    var cssText = stylesToCssText(styles);
+    var r = '', l=0, matches;
+    while (matches = hostRuleRe.exec(cssText)) {
+      r += cssText.substring(l, matches.index);
+      r += this.scopeHostCss(matches[1], name);
+      l = hostRuleRe.lastIndex;
+    }
+    r += cssText.substring(l, cssText.length);
+    var re = new RegExp('^' + name + selectorReSuffix, 'm');
+    var cssText = rulesToCss(this.findAtHostRules(cssToRules(r),
+      re));
+    return cssText;
+  },
+  scopeHostCss: function(cssText, name) {
+    var r = '', matches;
+    while (matches = selectorRe.exec(cssText)) {
+      r += this.scopeHostSelector(matches[1], name) +' ' + matches[2] + '\n\t';
+    }
+    return r;
+  },
+  // supports scopig by name and  [is=name] syntax
+  scopeHostSelector: function(selector, name) {
+    var r = [], parts = selector.split(','), is = '[is=' + name + ']';
+    parts.forEach(function(p) {
+      p = p.trim();
+      // selector: *|:scope -> name
+      if (p.match(hostElementRe)) {
+        p = p.replace(hostElementRe, name + '$1$3, ' + is + '$1$3');
+      // selector: .foo -> name.foo, [bar] -> name[bar]
+      } else if (p.match(hostFixableRe)) {
+        p = name + p + ', ' + is + p;
+      }
+      r.push(p);
+    }, this);
+    return r.join(', ');
+  },
+  // consider styles that do not include component name in the selector to be
+  // unscoped and in need of promotion;
+  // for convenience, also consider keyframe rules this way.
+  findAtHostRules: function(cssRules, matcher) {
+    return Array.prototype.filter.call(cssRules,
+      this.isHostRule.bind(this, matcher));
+  },
+  isHostRule: function(matcher, cssRule) {
+    return (cssRule.selectorText && cssRule.selectorText.match(matcher)) ||
+      (cssRule.cssRules && this.findAtHostRules(cssRule.cssRules, matcher).length) ||
+      (cssRule.type == CSSRule.WEBKIT_KEYFRAMES_RULE);
+  },
+  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:
+   *
+   *  .foo {... }
+   *
+   *  and converts this to
+   *
+   *  scopeName .foo { ... }
+  */
+  shimScoping: function(styles, name) {
+    if (styles) {
+      return this.convertScopedStyles(styles, name);
+    }
+  },
+  convertScopedStyles: function(styles, name) {
+    Array.prototype.forEach.call(styles, function(s) {
+      if (s.parentNode) {
+        s.parentNode.removeChild(s);
+      }
+    });
+    var cssText = stylesToCssText(styles).replace(hostRuleRe, '');
+    cssText = this.convertPseudos(cssText);
+    var rules = cssToRules(cssText);
+    cssText = this.scopeRules(rules, name);
+    return cssText;
+  },
+  convertPseudos: function(cssText) {
+    return cssText.replace(cssPseudoRe, ' [pseudo=$1]');
+  },
+  // change a selector like 'div' to 'name div'
+  scopeRules: function(cssRules, name) {
+    var cssText = '';
+    Array.prototype.forEach.call(cssRules, function(rule) {
+      if (rule.selectorText && (rule.style && rule.style.cssText)) {
+        cssText += this.scopeSelector(rule.selectorText, name,
+          this.strictStyling) + ' {\n\t';
+        cssText += this.propertiesFromRule(rule) + '\n}\n\n';
+      } else if (rule.media) {
+        cssText += '@media ' + rule.media.mediaText + ' {\n';
+        cssText += this.scopeRules(rule.cssRules, name);
+        cssText += '\n}\n\n';
+      } else if (rule.cssText) {
+        cssText += rule.cssText + '\n\n';
+      }
+    }, this);
+    return cssText;
+  },
+  scopeSelector: function(selector, name, strict) {
+    var r = [], parts = selector.split(',');
+    parts.forEach(function(p) {
+      p = p.trim();
+      if (this.selectorNeedsScoping(p, name)) {
+        p = strict ? this.applyStrictSelectorScope(p, name) :
+          this.applySimpleSelectorScope(p, name);
+      }
+      r.push(p);
+    }, this);
+    return r.join(', ');
+  },
+  selectorNeedsScoping: function(selector, name) {
+    var matchScope = '(' + name + '|\\[is=' + name + '\\])';
+    var re = new RegExp('^' + matchScope + selectorReSuffix, 'm');
+    return !selector.match(re);
+  },
+  // scope via name and [is=name]
+  applySimpleSelectorScope: function(selector, name) {
+    return name + ' ' + selector + ', ' + '[is=' + name + '] ' + selector;
+  },
+  // return a selector with [name] suffix on each simple selector
+  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]
+  applyStrictSelectorScope: function(selector, name) {
+    var splits = [' ', '>', '+', '~'],
+      scoped = selector,
+      attrName = '[' + name + ']';
+    splits.forEach(function(sep) {
+      var parts = scoped.split(sep);
+      scoped = parts.map(function(p) {
+        var t = p.trim();
+        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {
+          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')
+        }
+        return p;
+      }).join(sep);
+    });
+    return scoped;
+  },
+  propertiesFromRule: function(rule) {
+    var properties = rule.style.cssText;
+    // TODO(sorvell): Chrome cssom incorrectly removes quotes from the content
+    // property. (https://code.google.com/p/chromium/issues/detail?id=247231)
+    if (rule.style.content && !rule.style.content.match(/['"]+/)) {
+      properties = 'content: \'' + rule.style.content + '\';\n' +
+        rule.style.cssText.replace(/content:[^;]*;/g, '');
+    }
+    return properties;
+  }
+};
+
+var hostRuleRe = /@host[^{]*{(([^}]*?{[^{]*?}[\s\S]*?)+)}/gim,
+    selectorRe = /([^{]*)({[\s\S]*?})/gim,
+    hostElementRe = /(.*)((?:\*)|(?:\:scope))(.*)/,
+    hostFixableRe = /^[.\[:]/,
+    cssCommentRe = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,
+    cssPolyfillCommentRe = /\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,
+    cssPseudoRe = /::(x-[^\s{,(]*)/gim,
+    selectorReSuffix = '([>\\s~+\[.,{:][\\s\\S]*)?$',
+    hostRe = /@host/gim;
+
+function stylesToCssText(styles, preserveComments) {
+  var cssText = '';
+  Array.prototype.forEach.call(styles, function(s) {
+    cssText += s.textContent + '\n\n';
+  });
+  // strip comments for easier processing
+  if (!preserveComments) {
+    cssText = cssText.replace(cssCommentRe, '');
+  }
+  return cssText;
+}
+
+function cssToRules(cssText) {
+  var style = document.createElement('style');
+  style.textContent = cssText;
+  document.head.appendChild(style);
+  var rules = style.sheet.cssRules;
+  style.parentNode.removeChild(style);
+  return rules;
+}
+
+function rulesToCss(cssRules) {
+  for (var i=0, css=[]; i < cssRules.length; i++) {
+    css.push(cssRules[i].cssText);
+  }
+  return css.join('\n\n');
+}
+
+function addCssToDocument(cssText) {
+  if (cssText) {
+    getSheet().appendChild(document.createTextNode(cssText));
+  }
+}
+
+var sheet;
+function getSheet() {
+  if (!sheet) {
+    sheet = document.createElement("style");
+    sheet.setAttribute('ShadowCSSShim', '');
+  }
+  return sheet;
+}
+
+// add polyfill stylesheet to document
+if (window.ShadowDOMPolyfill) {
+  addCssToDocument('style { display: none !important; }\n');
+  var head = document.querySelector('head');
+  head.insertBefore(getSheet(), head.childNodes[0]);
+}
+
+// exports
+scope.ShadowCSS = ShadowCSS;
+
+})(window.Platform);
+// 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.
+
+(function(scope) {
+  // TODO(terry): Remove shimShadowDOMStyling2 until wrap/unwrap from a
+  //              dart:html Element to a JS DOM node is available.
+  /**
+   * Given the content of a STYLE tag and the name of a component shim the CSS
+   * and return the new scoped CSS to replace the STYLE's content.  The content
+   * is replaced in Dart's implementation of PolymerElement.
+   */
+  function shimShadowDOMStyling2(styleContent, name) {
+    if (window.ShadowDOMPolyfill) {
+      var content = this.convertPolyfillDirectives(styleContent, name);
+
+      // applyShimming calls shimAtHost and shipScoping
+      // shimAtHost code:
+      var r = '', l=0, matches;
+      while (matches = hostRuleRe.exec(content)) {
+        r += content.substring(l, matches.index);
+        r += this.scopeHostCss(matches[1], name);
+        l = hostRuleRe.lastIndex;
+      }
+      r += content.substring(l, content.length);
+      var re = new RegExp('^' + name + selectorReSuffix, 'm');
+      var atHostCssText = rulesToCss(this.findAtHostRules(cssToRules(r), re));
+
+      // shimScoping code:
+      // strip comments for easier processing
+      content = content.replace(cssCommentRe, '');
+
+      content = this.convertPseudos(content);
+      var rules = cssToRules(content);
+      var cssText = this.scopeRules(rules, name);
+
+      return atHostCssText + cssText;
+    }
+  }
+
+  // Minimal copied code from ShadowCSS, that is not exposed in
+  // PlatForm.ShadowCSS (local code).
+  var hostRuleRe = /@host[^{]*{(([^}]*?{[^{]*?}[\s\S]*?)+)}/gim,
+    cssCommentRe = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,
+    selectorReSuffix = '([>\\s~+\[.,{:][\\s\\S]*)?$';
+
+  function cssToRules(cssText) {
+    var style = document.createElement('style');
+    style.textContent = cssText;
+    document.head.appendChild(style);
+    var rules = style.sheet.cssRules;
+    style.parentNode.removeChild(style);
+    return rules;
+  }
+
+  function rulesToCss(cssRules) {
+    for (var i=0, css=[]; i < cssRules.length; i++) {
+      css.push(cssRules[i].cssText);
+    }
+    return css.join('\n\n');
+  }
+
+  // exports
+  scope.ShadowCSS.shimShadowDOMStyling2 = shimShadowDOMStyling2;
+})(window.Platform);
+
 }
\ No newline at end of file
diff --git a/pkg/shadow_dom/lib/shadow_dom.min.js b/pkg/shadow_dom/lib/shadow_dom.min.js
index e9d570e..888ec35 100644
--- a/pkg/shadow_dom/lib/shadow_dom.min.js
+++ b/pkg/shadow_dom/lib/shadow_dom.min.js
@@ -1,2 +1,2 @@
-if(!HTMLElement.prototype.createShadowRoot&&!HTMLElement.prototype.webkitCreateShadowRoot||window.__forceShadowDomPolyfill){(function(){Element.prototype.webkitCreateShadowRoot&&(Element.prototype.webkitCreateShadowRoot=function(){return window.ShadowDOMPolyfill.wrapIfNeeded(this).createShadowRoot()})})();var SideTable;"undefined"!=typeof WeakMap&&0>navigator.userAgent.indexOf("Firefox/")?SideTable=WeakMap:function(){var e=Object.defineProperty,t=Object.hasOwnProperty,n=(new Date).getTime()%1e9;SideTable=function(){this.name="__st"+(1e9*Math.random()>>>0)+(n++ +"__")},SideTable.prototype={set:function(t,n){e(t,this.name,{value:n,writable:!0})},get:function(e){return t.call(e,this.name)?e[this.name]:void 0},"delete":function(e){this.set(e,void 0)}}}();var ShadowDOMPolyfill={};(function(e){"use strict";function t(e){if(!e)throw new Error("Assertion failed")}function n(e,t){return Object.getOwnPropertyNames(t).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}),e}function r(e,t){return Object.getOwnPropertyNames(t).forEach(function(n){switch(n){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":return}Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}),e}function i(e){var t=e.__proto__||Object.getPrototypeOf(e),n=M.get(t);if(n)return n;var r=i(t),o=p(r);return u(t,o,e),o}function o(e,t){l(e,t,!0)}function a(e,t){l(t,e,!1)}function l(e,t,n){Object.getOwnPropertyNames(e).forEach(function(r){if(!(r in t)){L&&e.__lookupGetter__(r);var i;try{i=Object.getOwnPropertyDescriptor(e,r)}catch(o){i=C}var a,l;if(n&&"function"==typeof i.value)return t[r]=function(){return this.impl[r].apply(this.impl,arguments)},void 0;a=function(){return this.impl[r]},(i.writable||i.set)&&(l=function(e){this.impl[r]=e}),Object.defineProperty(t,r,{get:a,set:l,configurable:i.configurable,enumerable:i.enumerable})}})}function s(e,t,n){var i=e.prototype;u(i,t,n),r(t,e)}function u(e,n,r){var i=n.prototype;t(void 0===M.get(e)),M.set(e,n),o(e,i),r&&a(i,r)}function c(e,t){return M.get(t.prototype)===e}function d(e){var t=Object.getPrototypeOf(e),n=i(t),r=p(n);return u(t,r,e),r}function p(e){function t(t){e.call(this,t)}return t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t._ShadowDOMPolyfill$isGeneratedWrapper=!0,t}function h(e){return e instanceof N.EventTarget||e instanceof N.Event||e instanceof N.DOMImplementation}function f(e){return e instanceof D||e instanceof O||e instanceof _||e instanceof H}function m(e){if(null===e)return null;t(f(e));var n=S.get(e);if(!n){var r=i(e);n=new r(e),S.set(e,n)}return n}function g(e){return null===e?null:(t(h(e)),e.impl)}function w(e){return e&&h(e)?g(e):e}function v(e){return e&&!h(e)?m(e):e}function E(e,n){null!==n&&(t(f(e)),t(void 0===n||h(n)),S.set(e,n))}function y(e,t,n){Object.defineProperty(e.prototype,t,{get:n,configurable:!0,enumerable:!0})}function T(e,t){y(e,t,function(){return m(this.impl[t])})}function b(e,t){e.forEach(function(e){t.forEach(function(t){e.prototype[t]=function(){var e=m(this);return e[t].apply(e,arguments)}})})}var S=new SideTable,M=new SideTable,N=Object.create(null);Object.getOwnPropertyNames(window);var L=/Firefox/.test(navigator.userAgent),C={get:function(){},set:function(){},configurable:!0,enumerable:!0},H=DOMImplementation,O=Event,D=Node,_=Window;e.assert=t,e.defineGetter=y,e.defineWrapGetter=T,e.forwardMethodsToWrapper=b,e.isWrapper=h,e.isWrapperFor=c,e.mixin=n,e.registerObject=d,e.registerWrapper=s,e.rewrap=E,e.unwrap=g,e.unwrapIfNeeded=w,e.wrap=m,e.wrapIfNeeded=v,e.wrappers=N})(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e instanceof I.ShadowRoot}function n(e){var t=e.localName;return"content"===t||"shadow"===t}function r(e){return!!e.shadowRoot}function i(e){var t;return e.parentNode||(t=e.defaultView)&&R(t)||null}function o(o,a,l){if(l.length)return l.shift();if(t(o))return o.insertionParent||e.getHostForShadowRoot(o);var s=e.eventParentsTable.get(o);if(s){for(var u=1;s.length>u;u++)l[u-1]=s[u];return s[0]}if(a&&n(o)){var c=o.parentNode;if(c&&r(c))for(var d=e.getShadowTrees(c),p=a.insertionParent,u=0;d.length>u;u++)if(d[u].contains(p))return p}return i(o)}function a(e){for(var r=[],i=e,a=[],s=[];i;){var u=null;if(n(i)){u=l(r);var c=r[r.length-1]||i;r.push(c)}else r.length||r.push(i);var d=r[r.length-1];a.push({target:d,currentTarget:i}),t(i)&&r.pop(),i=o(i,u,s)}return a}function l(e){for(var t=e.length-1;t>=0;t--)if(!n(e[t]))return e[t];return null}function s(r,i){for(var a=[];r;){for(var s=[],c=i,p=void 0;c;){var h=null;if(s.length){if(n(c)&&(h=l(s),u(p))){var f=s[s.length-1];s.push(f)}}else s.push(c);if(d(c,r))return s[s.length-1];t(c)&&s.pop(),p=c,c=o(c,h,a)}r=t(r)?e.getHostForShadowRoot(r):r.parentNode}}function u(e){return e.insertionParent}function c(e){for(var t;t=e.parentNode;)e=t;return e}function d(e,t){return c(e)===c(t)}function p(e){switch(e){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function h(t){if(!F.get(t)){F.set(t,!0),p(t.type)||e.renderAllPending();var n=R(t.target),r=R(t);return f(r,n)}}function f(e,t){var n=a(t);return"load"===e.type&&2===n.length&&n[0].target instanceof I.Document&&n.shift(),m(e,n)&&g(e,n)&&w(e,n),k.set(e,y.NONE),W.set(e,null),e.defaultPrevented}function m(e,t){for(var n,r=t.length-1;r>0;r--){var i=t[r].target,o=t[r].currentTarget;if(i!==o&&(n=y.CAPTURING_PHASE,!v(t[r],e,n)))return!1}return!0}function g(e,t){var n=y.AT_TARGET;return v(t[0],e,n)}function w(e,t){for(var n,r=e.bubbles,i=1;t.length>i;i++){var o=t[i].target,a=t[i].currentTarget;if(o===a)n=y.AT_TARGET;else{if(!r||q.get(e))continue;n=y.BUBBLING_PHASE}if(!v(t[i],e,n))return}}function v(e,t,n){var r=e.target,i=e.currentTarget,o=A.get(i);if(!o)return!0;if("relatedTarget"in t){var a=x(t),l=R(a.relatedTarget),u=s(i,l);if(u===r)return!0;B.set(t,u)}k.set(t,n);var c=t.type,d=!1;j.set(t,r),W.set(t,i);for(var p=0;o.length>p;p++){var h=o[p];if(h.removed)d=!0;else if(!(h.type!==c||!h.capture&&n===y.CAPTURING_PHASE||h.capture&&n===y.BUBBLING_PHASE))try{if("function"==typeof h.handler?h.handler.call(i,t):h.handler.handleEvent(t),q.get(t))return!1}catch(f){window.onerror?window.onerror(f.message):console.error(f)}}if(d){var m=o.slice();o.length=0;for(var p=0;m.length>p;p++)m[p].removed||o.push(m[p])}return!G.get(t)}function E(e,t,n){this.type=e,this.handler=t,this.capture=Boolean(n)}function y(e,t){return e instanceof U?(this.impl=e,void 0):R(M(U,"Event",e,t))}function T(e){return e&&e.relatedTarget?Object.create(e,{relatedTarget:{value:x(e.relatedTarget)}}):e}function b(e,t,n){var r=window[e],i=function(t,n){return t instanceof r?(this.impl=t,void 0):R(M(r,e,t,n))};return i.prototype=Object.create(t.prototype),n&&_(i.prototype,n),r&&P(r,i,document.createEvent(e)),i}function S(e,t){return function(){arguments[t]=x(arguments[t]);var n=x(this);n[e].apply(n,arguments)}}function M(e,t,n,r){if(et)return new e(n,T(r));var i=x(document.createEvent(t)),o=J[t],a=[n];return Object.keys(o).forEach(function(e){var t=null!=r&&e in r?r[e]:o[e];"relatedTarget"===e&&(t=x(t)),a.push(t)}),i["init"+t].apply(i,a),i}function N(e){return"function"==typeof e?!0:e&&e.handleEvent}function L(e){this.impl=e}function C(t){return t instanceof I.ShadowRoot&&(t=e.getHostForShadowRoot(t)),x(t)}function H(e){D(e,rt)}function O(t,n,r,i){e.renderAllPending();for(var o=R(it.call(n.impl,r,i)),l=a(o,this),s=0;l.length>s;s++){var u=l[s];if(u.currentTarget===t)return u.target}return null}var D=e.forwardMethodsToWrapper,_=e.mixin,P=e.registerWrapper,x=e.unwrap,R=e.wrap,I=e.wrappers;new SideTable;var A=new SideTable,F=new SideTable,j=new SideTable,W=new SideTable,B=new SideTable,k=new SideTable,G=new SideTable,q=new SideTable;E.prototype={equals:function(e){return this.handler===e.handler&&this.type===e.type&&this.capture===e.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var U=window.Event;y.prototype={get target(){return j.get(this)},get currentTarget(){return W.get(this)},get eventPhase(){return k.get(this)},stopPropagation:function(){G.set(this,!0)},stopImmediatePropagation:function(){G.set(this,!0),q.set(this,!0)}},P(U,y,document.createEvent("Event"));var V=b("UIEvent",y),K=b("CustomEvent",y),$={get relatedTarget(){return B.get(this)||R(x(this).relatedTarget)}},z=_({initMouseEvent:S("initMouseEvent",14)},$),X=_({initFocusEvent:S("initFocusEvent",5)},$),Y=b("MouseEvent",V,z),Q=b("FocusEvent",V,X),Z=b("MutationEvent",y,{initMutationEvent:S("initMutationEvent",3),get relatedNode(){return R(this.impl.relatedNode)}}),J=Object.create(null),et=function(){try{new window.MouseEvent("click")}catch(e){return!1}return!0}();if(!et){var tt=function(e,t,n){if(n){var r=J[n];t=_(_({},r),t)}J[e]=t};tt("Event",{bubbles:!1,cancelable:!1}),tt("CustomEvent",{detail:null},"Event"),tt("UIEvent",{view:null,detail:0},"Event"),tt("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),tt("FocusEvent",{relatedTarget:null},"UIEvent")}var nt=window.EventTarget,rt=["addEventListener","removeEventListener","dispatchEvent"];[Element,Window,Document].forEach(function(e){var t=e.prototype;rt.forEach(function(e){Object.defineProperty(t,e+"_",{value:t[e]})})}),L.prototype={addEventListener:function(e,t,n){if(N(t)){var r=new E(e,t,n),i=A.get(this);if(i){for(var o=0;i.length>o;o++)if(r.equals(i[o]))return}else i=[],A.set(this,i);i.push(r);var a=C(this);a.addEventListener_(e,h,!0)}},removeEventListener:function(e,t,n){n=Boolean(n);var r=A.get(this);if(r){for(var i=0,o=!1,a=0;r.length>a;a++)r[a].type===e&&r[a].capture===n&&(i++,r[a].handler===t&&(o=!0,r[a].remove()));if(o&&1===i){var l=C(this);l.removeEventListener_(e,h,!0)}}},dispatchEvent:function(t){e.renderAllPending();var n=C(this);return n.dispatchEvent_(x(t))}},nt&&P(nt,L);var it=document.elementFromPoint;e.adjustRelatedTarget=s,e.elementFromPoint=O,e.wrapEventTargetMethods=H,e.wrappers.CustomEvent=K,e.wrappers.Event=y,e.wrappers.EventTarget=L,e.wrappers.FocusEvent=Q,e.wrappers.MouseEvent=Y,e.wrappers.MutationEvent=Z,e.wrappers.UIEvent=V}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,{enumerable:!1})}function n(){this.length=0,t(this,"length")}function r(e){if(null==e)return e;for(var t=new n,r=0,i=e.length;i>r;r++)t[r]=o(e[r]);return t.length=i,t}function i(e,t){e.prototype[t]=function(){return r(this.impl[t].apply(this.impl,arguments))}}var o=e.wrap;n.prototype={item:function(e){return this[e]}},t(n.prototype,"item"),e.wrappers.NodeList=n,e.addWrapNodeListMethod=i,e.wrapNodeList=r}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){s(e instanceof o)}function n(e,t,n,r){if(e.nodeType!==o.DOCUMENT_FRAGMENT_NODE)return e.parentNode&&e.parentNode.removeChild(e),e.parentNode_=t,e.previousSibling_=n,e.nextSibling_=r,n&&(n.nextSibling_=e),r&&(r.previousSibling_=e),[e];for(var i,a=[];i=e.firstChild;)e.removeChild(i),a.push(i),i.parentNode_=t;for(var l=0;a.length>l;l++)a[l].previousSibling_=a[l-1]||n,a[l].nextSibling_=a[l+1]||r;return n&&(n.nextSibling_=a[0]),r&&(r.previousSibling_=a[a.length-1]),a}function r(e){if(1===e.length)return d(e[0]);for(var t=d(document.createDocumentFragment()),n=0;e.length>n;n++)t.appendChild(d(e[n]));return t}function i(e){for(var t=e.firstChild;t;){s(t.parentNode===e);var n=t.nextSibling,r=d(t),i=r.parentNode;i&&w.call(i,r),t.previousSibling_=t.nextSibling_=t.parentNode_=null,t=n}e.firstChild_=e.lastChild_=null}function o(e){s(e instanceof h),a.call(this,e),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0}var a=e.wrappers.EventTarget,l=e.wrappers.NodeList;e.defineWrapGetter;var s=e.assert,u=e.mixin,c=e.registerWrapper,d=e.unwrap,p=e.wrap,h=window.Node,f=h.prototype.appendChild,m=h.prototype.insertBefore,g=h.prototype.replaceChild,w=h.prototype.removeChild,v=h.prototype.compareDocumentPosition;o.prototype=Object.create(a.prototype),u(o.prototype,{appendChild:function(e){t(e),this.invalidateShadowRenderer();var i=this.lastChild,o=null,a=n(e,this,i,o);return this.lastChild_=a[a.length-1],i||(this.firstChild_=a[0]),f.call(this.impl,r(a)),e},insertBefore:function(e,i){if(!i)return this.appendChild(e);t(e),t(i),s(i.parentNode===this),this.invalidateShadowRenderer();var o=i.previousSibling,a=i,l=n(e,this,o,a);this.firstChild===i&&(this.firstChild_=l[0]);var u=d(i),c=u.parentNode;return c&&m.call(c,r(l),u),e},removeChild:function(e){if(t(e),e.parentNode!==this)throw new Error("NotFoundError");this.invalidateShadowRenderer();var n=this.firstChild,r=this.lastChild,i=e.nextSibling,o=e.previousSibling,a=d(e),l=a.parentNode;return l&&w.call(l,a),n===e&&(this.firstChild_=i),r===e&&(this.lastChild_=o),o&&(o.nextSibling_=i),i&&(i.previousSibling_=o),e.previousSibling_=e.nextSibling_=e.parentNode_=null,e},replaceChild:function(e,i){if(t(e),t(i),i.parentNode!==this)throw new Error("NotFoundError");this.invalidateShadowRenderer();var o=i.previousSibling,a=i.nextSibling;a===e&&(a=e.nextSibling);var l=n(e,this,o,a);this.firstChild===i&&(this.firstChild_=l[0]),this.lastChild===i&&(this.lastChild_=l[l.length-1]),i.previousSibling_=null,i.nextSibling_=null,i.parentNode_=null;var s=d(i);return s.parentNode&&g.call(s.parentNode,r(l),s),i},hasChildNodes:function(){return null===this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:p(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:p(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:p(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:p(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:p(this.impl.previousSibling)},get parentElement(){for(var e=this.parentNode;e&&e.nodeType!==o.ELEMENT_NODE;)e=e.parentNode;return e},get textContent(){for(var e="",t=this.firstChild;t;t=t.nextSibling)e+=t.textContent;return e},set textContent(e){if(i(this),this.invalidateShadowRenderer(),""!==e){var t=this.impl.ownerDocument.createTextNode(e);this.appendChild(t)}},get childNodes(){for(var e=new l,t=0,n=this.firstChild;n;n=n.nextSibling)e[t++]=n;return e.length=t,e},cloneNode:function(e){if(!this.invalidateShadowRenderer())return p(this.impl.cloneNode(e));var t=p(this.impl.cloneNode(!1));if(e)for(var n=this.firstChild;n;n=n.nextSibling)t.appendChild(n.cloneNode(!0));return t},contains:function(e){if(!e)return!1;if(e===this)return!0;var t=e.parentNode;return t?this.contains(t):!1},compareDocumentPosition:function(e){return v.call(this.impl,d(e))},get ownerDocument(){return e.renderAllPending(),p(this.impl.ownerDocument)}}),c(h,o,document.createDocumentFragment()),delete o.prototype.querySelector,delete o.prototype.querySelectorAll,o.prototype=u(Object.create(a.prototype),o.prototype),e.wrappers.Node=o}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e,n){for(var r,i=e.firstElementChild;i;){if(i.matches(n))return i;if(r=t(i,n))return r;i=i.nextElementSibling}return null}function n(e,t,r){for(var i=e.firstElementChild;i;)i.matches(t)&&(r[r.length++]=i),n(i,t,r),i=i.nextElementSibling;return r}var r={querySelector:function(e){return t(this,e)},querySelectorAll:function(e){return n(this,e,new NodeList)}},i={getElementsByTagName:function(e){return this.querySelectorAll(e)},getElementsByClassName:function(e){return this.querySelectorAll("."+e)},getElementsByTagNameNS:function(e,t){if("*"===e)return this.getElementsByTagName(t);for(var n=new NodeList,r=this.getElementsByTagName(t),i=0,o=0;r.length>i;i++)r[i].namespaceURI===e&&(n[o++]=r[i]);return n.length=o,n}};e.GetElementsByInterface=i,e.SelectorsInterface=r}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;return e}function n(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.previousSibling;return e}var r=e.wrappers.NodeList,i={get firstElementChild(){return t(this.firstChild)},get lastElementChild(){return n(this.lastChild)},get childElementCount(){for(var e=0,t=this.firstElementChild;t;t=t.nextElementSibling)e++;return e},get children(){for(var e=new r,t=0,n=this.firstElementChild;n;n=n.nextElementSibling)e[t++]=n;return e.length=t,e}},o={get nextElementSibling(){return t(this.nextSibling)},get previousElementSibling(){return n(this.nextSibling)}};e.ChildNodeInterface=o,e.ParentNodeInterface=i}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}var n=e.ChildNodeInterface,r=e.wrappers.Node,i=e.mixin,o=e.registerWrapper,a=window.CharacterData;t.prototype=Object.create(r.prototype),i(t.prototype,{get textContent(){return this.data},set textContent(e){this.data=e}}),i(t.prototype,n),o(a,t,document.createTextNode("")),e.wrappers.CharacterData=t}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){i.call(this,e)}var n=e.ChildNodeInterface,r=e.GetElementsByInterface,i=e.wrappers.Node,o=e.ParentNodeInterface,a=e.SelectorsInterface;e.addWrapNodeListMethod;var l=e.mixin,s=e.registerWrapper,u=e.wrappers,c=new SideTable,d=window.Element,p=d.prototype.matches||d.prototype.mozMatchesSelector||d.prototype.msMatchesSelector||d.prototype.webkitMatchesSelector;t.prototype=Object.create(i.prototype),l(t.prototype,{createShadowRoot:function(){var t=new u.ShadowRoot(this);return c.set(this,t),e.getRendererForHost(this),this.invalidateShadowRenderer(!0),t},get shadowRoot(){return c.get(this)||null},setAttribute:function(e,t){this.impl.setAttribute(e,t),this.invalidateShadowRenderer()},matches:function(e){return p.call(this.impl,e)}}),l(t.prototype,n),l(t.prototype,r),l(t.prototype,o),l(t.prototype,a),s(d,t),e.wrappers.Element=t}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e){case"&":return"&amp;";case"<":return"&lt;";case'"':return"&quot;"}}function n(e){return e.replace(m,t)}function r(e){switch(e.nodeType){case Node.ELEMENT_NODE:for(var t,r=e.tagName.toLowerCase(),o="<"+r,a=e.attributes,l=0;t=a[l];l++)o+=" "+t.name+'="'+n(t.value)+'"';return o+=">",g[r]?o:o+i(e)+"</"+r+">";case Node.TEXT_NODE:return n(e.nodeValue);case Node.COMMENT_NODE:return"<!--"+n(e.nodeValue)+"-->";default:throw console.error(e),new Error("not implemented")}}function i(e){for(var t="",n=e.firstChild;n;n=n.nextSibling)t+=r(n);return t}function o(e,t,n){var r=n||"div";e.textContent="";var i=h(e.ownerDocument.createElement(r));i.innerHTML=t;for(var o;o=i.firstChild;)e.appendChild(f(o))}function a(e){u.call(this,e)}function l(t){c(a,t,function(){return e.renderAllPending(),this.impl[t]})}function s(t){Object.defineProperty(a.prototype,t,{value:function(){return e.renderAllPending(),this.impl[t].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var u=e.wrappers.Element,c=e.defineGetter,d=e.mixin,p=e.registerWrapper,h=e.unwrap,f=e.wrap,m=/&|<|"/g,g={area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},w=window.HTMLElement;a.prototype=Object.create(u.prototype),d(a.prototype,{get innerHTML(){return i(this)},set innerHTML(e){o(this,e,this.tagName)},get outerHTML(){return r(this)},set outerHTML(e){if(this.invalidateShadowRenderer())throw new Error("not implemented");this.impl.outerHTML=e}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollLeft","scrollTop","scrollWidth"].forEach(l),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(s),p(w,a,document.createElement("b")),e.wrappers.HTMLElement=a,e.getInnerHTML=i,e.setInnerHTML=o}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,i=e.registerWrapper,o=window.HTMLContentElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get select(){return this.getAttribute("select")},set select(e){this.setAttribute("select",e)},setAttribute:function(e,t){n.prototype.setAttribute.call(this,e,t),"select"===String(e).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),o&&i(o,t),e.wrappers.HTMLContentElement=t}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e),this.olderShadowRoot_=null}var n=e.wrappers.HTMLElement,r=e.mixin,i=e.registerWrapper,o=window.HTMLShadowElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get olderShadowRoot(){return this.olderShadowRoot_},invalidateShadowRenderer:function(){n.prototype.invalidateShadowRenderer.call(this,!0)}}),o&&i(o,t),e.wrappers.HTMLShadowElement=t}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){if(!e.defaultView)return e;var t=d.get(e);if(!t){for(t=e.implementation.createHTMLDocument("");t.lastChild;)t.removeChild(t.lastChild);d.set(e,t)}return t}function n(e){for(var n,r=t(e.ownerDocument),i=r.createDocumentFragment();n=e.firstChild;)i.appendChild(n);return i}function r(e){i.call(this,e)}var i=e.wrappers.HTMLElement,o=e.getInnerHTML,a=e.mixin,l=e.registerWrapper,s=e.setInnerHTML,u=e.wrap,c=new SideTable,d=new SideTable,p=window.HTMLTemplateElement;r.prototype=Object.create(i.prototype),a(r.prototype,{get content(){if(p)return u(this.impl.content);var e=c.get(this);return e||(e=n(this),c.set(this,e)),e},get innerHTML(){return o(this.content)},set innerHTML(e){s(this.content,e),this.invalidateShadowRenderer()}}),p&&l(p,r),e.wrappers.HTMLTemplateElement=r}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e.localName){case"content":return new n(e);case"shadow":return new i(e);case"template":return new o(e)}r.call(this,e)}var n=e.wrappers.HTMLContentElement,r=e.wrappers.HTMLElement,i=e.wrappers.HTMLShadowElement,o=e.wrappers.HTMLTemplateElement;e.mixin;var a=e.registerWrapper,l=window.HTMLUnknownElement;t.prototype=Object.create(r.prototype),a(l,t),e.wrappers.HTMLUnknownElement=t}(this.ShadowDOMPolyfill),function(e){"use strict";var t=e.GetElementsByInterface,n=e.ParentNodeInterface,r=e.SelectorsInterface,i=e.mixin,o=e.registerObject,a=o(document.createDocumentFragment());i(a.prototype,n),i(a.prototype,r),i(a.prototype,t);var l=o(document.createTextNode("")),s=o(document.createComment(""));e.wrappers.Comment=s,e.wrappers.DocumentFragment=a,e.wrappers.Text=l}(this.ShadowDOMPolyfill),function(e){"use strict";function t(t){var r=s(t.impl.ownerDocument.createDocumentFragment());n.call(this,r),a(r,this);var i=t.shadowRoot;e.nextOlderShadowTreeTable.set(this,i),u.set(this,t)}var n=e.wrappers.DocumentFragment,r=e.elementFromPoint,i=e.getInnerHTML,o=e.mixin,a=e.rewrap,l=e.setInnerHTML,s=e.unwrap,u=new SideTable;t.prototype=Object.create(n.prototype),o(t.prototype,{get innerHTML(){return i(this)},set innerHTML(e){l(this,e),this.invalidateShadowRenderer()},invalidateShadowRenderer:function(){return u.get(this).invalidateShadowRenderer()},elementFromPoint:function(e,t){return r(this,this.ownerDocument,e,t)},getElementById:function(e){return this.querySelector("#"+e)}}),e.wrappers.ShadowRoot=t,e.getHostForShadowRoot=function(e){return u.get(e)}}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.previousSibling_=e.previousSibling,e.nextSibling_=e.nextSibling,e.parentNode_=e.parentNode}function n(e){e.firstChild_=e.firstChild,e.lastChild_=e.lastChild}function r(e){_(e instanceof D);for(var r=e.firstChild;r;r=r.nextSibling)t(r);n(e)}function i(e){var t=x(e);r(e),t.textContent=""}function o(e,n){var i=x(e),o=x(n);o.nodeType===D.DOCUMENT_FRAGMENT_NODE?r(n):(l(n),t(n)),e.lastChild_=e.lastChild,e.lastChild===e.firstChild&&(e.firstChild_=e.firstChild);var a=R(i.lastChild);a&&(a.nextSibling_=a.nextSibling),i.appendChild(o)}function a(e,n){var r=x(e),i=x(n);t(n),n.previousSibling&&(n.previousSibling.nextSibling_=n),n.nextSibling&&(n.nextSibling.previousSibling_=n),e.lastChild===n&&(e.lastChild_=n),e.firstChild===n&&(e.firstChild_=n),r.removeChild(i)}function l(e){var t=x(e),n=t.parentNode;n&&a(R(n),e)}function s(e,t){c(t).push(e),F.set(e,t);var n=A.get(e);n||A.set(e,n=[]),n.push(t)}function u(e){I.set(e,[])}function c(e){return I.get(e)}function d(e){for(var t=[],n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t}function p(e,t,n){for(var r=d(e),i=0;r.length>i;i++){var o=r[i];if(t(o)){if(n(o)===!1)return}else p(o,t,n)}}function h(e,t){var n=!1;return p(e,y,function(e){u(e);for(var r=0;t.length>r;r++){var i=t[r];void 0!==i&&m(i,e)&&(s(i,e),t[r]=void 0,n=!0)}}),n?t.filter(function(e){return void 0!==e}):t}function f(e,t){for(var n=0;t.length>n;n++)if(t[n]in e)return t[n]}function m(e,t){var n=t.getAttribute("select");if(!n)return!0;if(n=n.trim(),!n)return!0;if(e.nodeType!==D.ELEMENT_NODE)return!1;if(!k.test(n))return!1;if(":"===n[0]&&!G.test(n))return!1;try{return e.matches(n)}catch(r){return!1}}function g(){H=null,U.forEach(function(e){e.render()}),U=[]}function w(e){this.host=e,this.dirty=!1,this.associateNode(e)}function v(e){var t=W.get(e);return t||(t=new w(e),W.set(e,t)),t}function E(e){return"content"===e.localName}function y(e){return"content"===e.localName}function T(e){return"shadow"===e.localName}function b(e){return"shadow"===e.localName}function S(e){return!!e.shadowRoot}function M(e){return j.get(e)}function N(e){for(var t=[],n=e.shadowRoot;n;n=j.get(n))t.push(n);return t}function L(e,t){F.set(e,t)}function C(e){new w(e).render()}var H,O=e.wrappers.HTMLContentElement,D=e.wrappers.Node,_=e.assert,P=e.mixin,x=e.unwrap,R=e.wrap,I=new SideTable,A=new SideTable,F=new SideTable,j=new SideTable,W=new SideTable,B=new SideTable,k=/^[*.:#[a-zA-Z_|]/,G=new RegExp("^:("+["link","visited","target","enabled","disabled","checked","indeterminate","nth-child","nth-last-child","nth-of-type","nth-last-of-type","first-child","last-child","first-of-type","last-of-type","only-of-type"].join("|")+")"),q=f(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),U=[];w.prototype={render:function(){if(this.dirty){var e=this.host;this.treeComposition();var t=e.shadowRoot;if(t){this.removeAllChildNodes(this.host);var n=d(t);n.forEach(function(n){this.renderNode(e,t,n,!1)},this),this.dirty=!1}}},invalidate:function(){if(!this.dirty){if(this.dirty=!0,U.push(this),H)return;H=window[q](g,0)}},renderNode:function(e,t,n,r){if(S(n)){this.appendChild(e,n);var i=v(n);i.dirty=!0,i.render()}else E(n)?this.renderInsertionPoint(e,t,n,r):T(n)?this.renderShadowInsertionPoint(e,t,n):this.renderAsAnyDomTree(e,t,n,r)},renderAsAnyDomTree:function(e,t,n,r){if(this.appendChild(e,n),S(n))C(n);else{var i=n,o=d(i);o.forEach(function(e){this.renderNode(i,t,e,r)},this)}},renderInsertionPoint:function(e,t,n,r){var i=c(n);i.length?(this.removeAllChildNodes(n),i.forEach(function(n){E(n)&&r?this.renderInsertionPoint(e,t,n,r):this.renderAsAnyDomTree(e,t,n,r)},this)):this.renderFallbackContent(e,n),this.remove(n)},renderShadowInsertionPoint:function(e,t,n){var r=M(t);if(r){F.set(r,n),n.olderShadowRoot_=r,this.remove(n);var i=d(r);i.forEach(function(t){this.renderNode(e,r,t,!0)},this)}else this.renderFallbackContent(e,n)},renderFallbackContent:function(e,t){var n=d(t);n.forEach(function(t){this.appendChild(e,t)},this)},treeComposition:function(){var e=this.host,t=e.shadowRoot,n=[],r=d(e);r.forEach(function(e){if(E(e)){var t=c(e);t&&t.length||(t=d(e)),n.push.apply(n,t)}else n.push(e)});for(var i,o;t;){if(i=void 0,p(t,b,function(e){return i=e,!1}),o=i,n=h(t,n),o){var a=M(t);if(a){t=a,L(t,o);continue}break}break}},appendChild:function(e,t){o(e,t),this.associateNode(t)},remove:function(e){l(e),this.associateNode(e)},removeAllChildNodes:function(e){i(e)},associateNode:function(e){B.set(e,this)}},D.prototype.invalidateShadowRenderer=function(e){var t=B.get(this);if(!t)return!1;var n;return(e||this.shadowRoot||(n=this.parentNode)&&(n.shadowRoot||n instanceof ShadowRoot))&&t.invalidate(),!0},O.prototype.getDistributedNodes=function(){return g(),c(this)},P(D.prototype,{get insertionParent(){return F.get(this)||null}}),e.eventParentsTable=A,e.getRendererForHost=v,e.getShadowTrees=N,e.nextOlderShadowTreeTable=j,e.renderAllPending=g,e.visual={removeAllChildNodes:i,appendChild:o,removeChild:a}}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){l.call(this,e)}function n(e){var n=document[e];t.prototype[e]=function(){return g(n.apply(this.impl,arguments))}}function r(e){this.impl=e}function i(e,t){var n=document.implementation[t];e.prototype[t]=function(){return g(n.apply(this.impl,arguments))}}function o(e,t){var n=document.implementation[t];e.prototype[t]=function(){return n.apply(this.impl,arguments)}}var a=e.GetElementsByInterface,l=e.wrappers.Node,s=e.ParentNodeInterface,u=e.SelectorsInterface,c=e.defineWrapGetter,d=e.elementFromPoint,p=e.forwardMethodsToWrapper,h=e.mixin,f=e.registerWrapper,m=e.unwrap,g=e.wrap,w=e.wrapEventTargetMethods;e.wrapNodeList;var v=new SideTable;t.prototype=Object.create(l.prototype),c(t,"documentElement"),c(t,"body"),c(t,"head"),["getElementById","createElement","createElementNS","createTextNode","createDocumentFragment","createEvent","createEventNS"].forEach(n);var E=document.adoptNode,y=document.write;h(t.prototype,{adoptNode:function(e){return E.call(this.impl,m(e)),e},elementFromPoint:function(e,t){return d(this,this,e,t)},write:function(e){for(var t=this.querySelectorAll("*"),n=t[t.length-1];n.nextSibling;)n=n.nextSibling;var r=n.parentNode;r.lastChild_=void 0,n.nextSibling_=void 0,y.call(this.impl,e)}}),p([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement],["appendChild","compareDocumentPosition","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"]),p([window.HTMLDocument||window.Document],["adoptNode","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createTextNode","elementFromPoint","getElementById","write"]),h(t.prototype,a),h(t.prototype,s),h(t.prototype,u),h(t.prototype,{get implementation(){var e=v.get(this);return e?e:(e=new r(m(this).implementation),v.set(this,e),e)}}),f(window.Document,t,document.implementation.createHTMLDocument("")),window.HTMLDocument&&f(window.HTMLDocument,t),w([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),i(r,"createDocumentType"),i(r,"createDocument"),i(r,"createHTMLDocument"),o(r,"hasFeature"),f(window.DOMImplementation,r),p([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),e.wrappers.Document=t,e.wrappers.DOMImplementation=r}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.mixin,i=e.registerWrapper,o=e.unwrap,a=e.unwrapIfNeeded,l=e.wrap,s=window.Window;t.prototype=Object.create(n.prototype);var u=window.getComputedStyle;s.prototype.getComputedStyle=function(e,t){return u.call(this||window,a(e),t)},["addEventListener","removeEventListener","dispatchEvent"].forEach(function(e){s.prototype[e]=function(){var t=l(this||window);return t[e].apply(t,arguments)}}),r(t.prototype,{getComputedStyle:function(e,t){return u.call(o(this),a(e),t)}}),i(s,t),e.wrappers.Window=t}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){this.impl=e}function n(e){return new t(e)}function r(e){return e.map(n)}function i(e){var t=this;this.impl=new c(function(n){e.call(t,r(n),t)})}var o=e.defineGetter,a=e.defineWrapGetter,l=e.registerWrapper,s=e.unwrapIfNeeded,u=e.wrapNodeList;e.wrappers;var c=window.MutationObserver||window.WebKitMutationObserver;if(c){var d=window.MutationRecord;t.prototype={get addedNodes(){return u(this.impl.addedNodes)},get removedNodes(){return u(this.impl.removedNodes)}},["target","previousSibling","nextSibling"].forEach(function(e){a(t,e)}),["type","attributeName","attributeNamespace","oldValue"].forEach(function(e){o(t,e,function(){return this.impl[e]
-})}),d&&l(d,t),window.Node,i.prototype={observe:function(e,t){this.impl.observe(s(e),t)},disconnect:function(){this.impl.disconnect()},takeRecords:function(){return r(this.impl.takeRecords())}},e.wrappers.MutationObserver=i,e.wrappers.MutationRecord=t}}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=n[e],r=window[t];if(r){var i=document.createElement(e),o=i.constructor;window[t]=o}}e.isWrapperFor;var n={a:"HTMLAnchorElement",applet:"HTMLAppletElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",br:"HTMLBRElement",base:"HTMLBaseElement",body:"HTMLBodyElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",dl:"HTMLDListElement",datalist:"HTMLDataListElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",hr:"HTMLHRElement",head:"HTMLHeadElement",h1:"HTMLHeadingElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",input:"HTMLInputElement",li:"HTMLLIElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",link:"HTMLLinkElement",map:"HTMLMapElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",del:"HTMLModElement",ol:"HTMLOListElement",object:"HTMLObjectElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",table:"HTMLTableElement",tr:"HTMLTableRowElement",thead:"HTMLTableSectionElement",tbody:"HTMLTableSectionElement",textarea:"HTMLTextAreaElement",title:"HTMLTitleElement",ul:"HTMLUListElement",video:"HTMLVideoElement"};Object.keys(n).forEach(t),Object.getOwnPropertyNames(e.wrappers).forEach(function(t){window[t]=e.wrappers[t]}),e.knownElements=n}(this.ShadowDOMPolyfill),function(){var e=window.ShadowDOMPolyfill;e.wrap,Object.defineProperties(HTMLElement.prototype,{webkitShadowRoot:{get:function(){return this.shadowRoot}}}),HTMLElement.prototype.webkitCreateShadowRoot=HTMLElement.prototype.createShadowRoot,window.dartExperimentalFixupGetTag=function(t){function n(e){if(e instanceof r)return"NodeList";if(e instanceof i)return"ShadowRoot";if(e instanceof MutationRecord)return"MutationRecord";if(e instanceof MutationObserver)return"MutationObserver";if(o(e)){e=a(e);var n=e.constructor;if(n&&n._ShadowDOMPolyfill$isGeneratedWrapper){var l=n._ShadowDOMPolyfill$cacheTag_;return l||(l=Object.prototype.toString.call(e),l=l.substring(8,l.length-1),n._ShadowDOMPolyfill$cacheTag_=l),l}}return t(e)}var r=e.wrappers.NodeList,i=e.wrappers.ShadowRoot,o=e.isWrapper,a=e.unwrap;return n}}()}
\ No newline at end of file
+if(!HTMLElement.prototype.createShadowRoot&&!HTMLElement.prototype.webkitCreateShadowRoot||window.__forceShadowDomPolyfill){!function(){Element.prototype.webkitCreateShadowRoot&&(Element.prototype.webkitCreateShadowRoot=function(){return window.ShadowDOMPolyfill.wrapIfNeeded(this).createShadowRoot()})}();var SideTable;"undefined"!=typeof WeakMap&&navigator.userAgent.indexOf("Firefox/")<0?SideTable=WeakMap:function(){var a=Object.defineProperty,b=Object.hasOwnProperty,c=(new Date).getTime()%1e9;SideTable=function(){this.name="__st"+(1e9*Math.random()>>>0)+(c++ +"__")},SideTable.prototype={set:function(b,c){a(b,this.name,{value:c,writable:!0})},get:function(a){return b.call(a,this.name)?a[this.name]:void 0},"delete":function(a){this.set(a,void 0)}}}();var ShadowDOMPolyfill={};!function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a,b){return Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))}),a}function d(a,b){return Object.getOwnPropertyNames(b).forEach(function(c){switch(c){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":return}Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))}),a}function e(a){var b=a.__proto__||Object.getPrototypeOf(a),c=y.get(b);if(c)return c;var d=e(b),f=m(d);return j(b,f,a),f}function f(a,b){h(a,b,!0)}function g(a,b){h(b,a,!1)}function h(a,b,c){Object.getOwnPropertyNames(a).forEach(function(d){if(!(d in b)){A&&a.__lookupGetter__(d);var e;try{e=Object.getOwnPropertyDescriptor(a,d)}catch(f){e=B}var g,h;if(c&&"function"==typeof e.value)return b[d]=function(){return this.impl[d].apply(this.impl,arguments)},void 0;g=function(){return this.impl[d]},(e.writable||e.set)&&(h=function(a){this.impl[d]=a}),Object.defineProperty(b,d,{get:g,set:h,configurable:e.configurable,enumerable:e.enumerable})}})}function i(a,b,c){var e=a.prototype;j(e,b,c),d(b,a)}function j(a,c,d){var e=c.prototype;b(void 0===y.get(a)),y.set(a,c),f(a,e),d&&g(e,d)}function k(a,b){return y.get(b.prototype)===a}function l(a){var b=Object.getPrototypeOf(a),c=e(b),d=m(c);return j(b,d,a),d}function m(a){function b(b){a.call(this,b)}return b.prototype=Object.create(a.prototype),b.prototype.constructor=b,b._ShadowDOMPolyfill$isGeneratedWrapper=!0,b}function n(a){return a instanceof z.EventTarget||a instanceof z.Event||a instanceof z.DOMImplementation}function o(a){return a instanceof E||a instanceof D||a instanceof F||a instanceof C}function p(a){if(null===a)return null;b(o(a));var c=x.get(a);if(!c){var d=e(a);c=new d(a),x.set(a,c)}return c}function q(a){return null===a?null:(b(n(a)),a.impl)}function r(a){return a&&n(a)?q(a):a}function s(a){return a&&!n(a)?p(a):a}function t(a,c){null!==c&&(b(o(a)),b(void 0===c||n(c)),x.set(a,c))}function u(a,b,c){Object.defineProperty(a.prototype,b,{get:c,configurable:!0,enumerable:!0})}function v(a,b){u(a,b,function(){return p(this.impl[b])})}function w(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=p(this);return a[b].apply(a,arguments)}})})}var x=new SideTable,y=new SideTable,z=Object.create(null);Object.getOwnPropertyNames(window);var A=/Firefox/.test(navigator.userAgent),B={get:function(){},set:function(){},configurable:!0,enumerable:!0},C=DOMImplementation,D=Event,E=Node,F=Window;a.assert=b,a.defineGetter=u,a.defineWrapGetter=v,a.forwardMethodsToWrapper=w,a.isWrapper=n,a.isWrapperFor=k,a.mixin=c,a.registerObject=l,a.registerWrapper=i,a.rewrap=t,a.unwrap=q,a.unwrapIfNeeded=r,a.wrap=p,a.wrapIfNeeded=s,a.wrappers=z}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof J.ShadowRoot}function c(a){var b=a.localName;return"content"===b||"shadow"===b}function d(a){return!!a.shadowRoot}function e(a){var b;return a.parentNode||(b=a.defaultView)&&I(b)||null}function f(f,g,h){if(h.length)return h.shift();if(b(f))return f.insertionParent||a.getHostForShadowRoot(f);var i=a.eventParentsTable.get(f);if(i){for(var j=1;j<i.length;j++)h[j-1]=i[j];return i[0]}if(g&&c(f)){var k=f.parentNode;if(k&&d(k))for(var l=a.getShadowTrees(k),m=g.insertionParent,j=0;j<l.length;j++)if(l[j].contains(m))return m}return e(f)}function g(a){for(var d=[],e=a,g=[],i=[];e;){var j=null;if(c(e)){j=h(d);var k=d[d.length-1]||e;d.push(k)}else d.length||d.push(e);var l=d[d.length-1];g.push({target:l,currentTarget:e}),b(e)&&d.pop(),e=f(e,j,i)}return g}function h(a){for(var b=a.length-1;b>=0;b--)if(!c(a[b]))return a[b];return null}function i(d,e){for(var g=[];d;){for(var i=[],k=e,m=void 0;k;){var n=null;if(i.length){if(c(k)&&(n=h(i),j(m))){var o=i[i.length-1];i.push(o)}}else i.push(k);if(l(k,d))return i[i.length-1];b(k)&&i.pop(),m=k,k=f(k,n,g)}d=b(d)?a.getHostForShadowRoot(d):d.parentNode}}function j(a){return a.insertionParent}function k(a){for(var b;b=a.parentNode;)a=b;return a}function l(a,b){return k(a)===k(b)}function m(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function n(b){if(!L.get(b)){L.set(b,!0),m(b.type)||a.renderAllPending();var c=I(b.target),d=I(b);return o(d,c)}}function o(a,b){var c=g(b);return"load"===a.type&&2===c.length&&c[0].target instanceof J.Document&&c.shift(),p(a,c)&&q(a,c)&&r(a,c),P.set(a,u.NONE),N.set(a,null),a.defaultPrevented}function p(a,b){for(var c,d=b.length-1;d>0;d--){var e=b[d].target,f=b[d].currentTarget;if(e!==f&&(c=u.CAPTURING_PHASE,!s(b[d],a,c)))return!1}return!0}function q(a,b){var c=u.AT_TARGET;return s(b[0],a,c)}function r(a,b){for(var c,d=a.bubbles,e=1;e<b.length;e++){var f=b[e].target,g=b[e].currentTarget;if(f===g)c=u.AT_TARGET;else{if(!d||R.get(a))continue;c=u.BUBBLING_PHASE}if(!s(b[e],a,c))return}}function s(a,b,c){var d=a.target,e=a.currentTarget,f=K.get(e);if(!f)return!0;if("relatedTarget"in b){var g=H(b),h=I(g.relatedTarget),j=i(e,h);if(j===d)return!0;O.set(b,j)}P.set(b,c);var k=b.type,l=!1;M.set(b,d),N.set(b,e);for(var m=0;m<f.length;m++){var n=f[m];if(n.removed)l=!0;else if(!(n.type!==k||!n.capture&&c===u.CAPTURING_PHASE||n.capture&&c===u.BUBBLING_PHASE))try{if("function"==typeof n.handler?n.handler.call(e,b):n.handler.handleEvent(b),R.get(b))return!1}catch(o){window.onerror?window.onerror(o.message):console.error(o)}}if(l){var p=f.slice();f.length=0;for(var m=0;m<p.length;m++)p[m].removed||f.push(p[m])}return!Q.get(b)}function t(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function u(a,b){return a instanceof S?(this.impl=a,void 0):I(y(S,"Event",a,b))}function v(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:H(a.relatedTarget)}}):a}function w(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?(this.impl=b,void 0):I(y(d,a,b,c))};return e.prototype=Object.create(b.prototype),c&&F(e.prototype,c),d&&G(d,e,document.createEvent(a)),e}function x(a,b){return function(){arguments[b]=H(arguments[b]);var c=H(this);c[a].apply(c,arguments)}}function y(a,b,c,d){if(ab)return new a(c,v(d));var e=H(document.createEvent(b)),f=_[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=H(b)),g.push(b)}),e["init"+b].apply(e,g),e}function z(a){return"function"==typeof a?!0:a&&a.handleEvent}function A(a){this.impl=a}function B(b){return b instanceof J.ShadowRoot&&(b=a.getHostForShadowRoot(b)),H(b)}function C(a){E(a,db)}function D(b,c,d,e){a.renderAllPending();for(var f=I(eb.call(c.impl,d,e)),h=g(f,this),i=0;i<h.length;i++){var j=h[i];if(j.currentTarget===b)return j.target}return null}var E=a.forwardMethodsToWrapper,F=a.mixin,G=a.registerWrapper,H=a.unwrap,I=a.wrap,J=a.wrappers;new SideTable;var K=new SideTable,L=new SideTable,M=new SideTable,N=new SideTable,O=new SideTable,P=new SideTable,Q=new SideTable,R=new SideTable;t.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var S=window.Event;u.prototype={get target(){return M.get(this)},get currentTarget(){return N.get(this)},get eventPhase(){return P.get(this)},stopPropagation:function(){Q.set(this,!0)},stopImmediatePropagation:function(){Q.set(this,!0),R.set(this,!0)}},G(S,u,document.createEvent("Event"));var T=w("UIEvent",u),U=w("CustomEvent",u),V={get relatedTarget(){return O.get(this)||I(H(this).relatedTarget)}},W=F({initMouseEvent:x("initMouseEvent",14)},V),X=F({initFocusEvent:x("initFocusEvent",5)},V),Y=w("MouseEvent",T,W),Z=w("FocusEvent",T,X),$=w("MutationEvent",u,{initMutationEvent:x("initMutationEvent",3),get relatedNode(){return I(this.impl.relatedNode)}}),_=Object.create(null),ab=function(){try{new window.MouseEvent("click")}catch(a){return!1}return!0}();if(!ab){var bb=function(a,b,c){if(c){var d=_[c];b=F(F({},d),b)}_[a]=b};bb("Event",{bubbles:!1,cancelable:!1}),bb("CustomEvent",{detail:null},"Event"),bb("UIEvent",{view:null,detail:0},"Event"),bb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),bb("FocusEvent",{relatedTarget:null},"UIEvent")}var cb=window.EventTarget,db=["addEventListener","removeEventListener","dispatchEvent"];[Element,Window,Document].forEach(function(a){var b=a.prototype;db.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),A.prototype={addEventListener:function(a,b,c){if(z(b)){var d=new t(a,b,c),e=K.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],K.set(this,e);e.push(d);var g=B(this);g.addEventListener_(a,n,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=K.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=B(this);h.removeEventListener_(a,n,!0)}}},dispatchEvent:function(b){a.renderAllPending();var c=B(this);return c.dispatchEvent_(H(b))}},cb&&G(cb,A);var eb=document.elementFromPoint;a.adjustRelatedTarget=i,a.elementFromPoint=D,a.wrapEventTargetMethods=C,a.wrappers.CustomEvent=U,a.wrappers.Event=u,a.wrappers.EventTarget=A,a.wrappers.FocusEvent=Z,a.wrappers.MouseEvent=Y,a.wrappers.MutationEvent=$,a.wrappers.UIEvent=T}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,{enumerable:!1})}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=f(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(this.impl[b].apply(this.impl,arguments))}}var f=a.wrap;c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){i(a instanceof f)}function c(a,b,c,d){if(a.nodeType!==f.DOCUMENT_FRAGMENT_NODE)return a.parentNode&&a.parentNode.removeChild(a),a.parentNode_=b,a.previousSibling_=c,a.nextSibling_=d,c&&(c.nextSibling_=a),d&&(d.previousSibling_=a),[a];for(var e,g=[];e=a.firstChild;)a.removeChild(e),g.push(e),e.parentNode_=b;for(var h=0;h<g.length;h++)g[h].previousSibling_=g[h-1]||c,g[h].nextSibling_=g[h+1]||d;return c&&(c.nextSibling_=g[0]),d&&(d.previousSibling_=g[g.length-1]),g}function d(a){if(1===a.length)return l(a[0]);for(var b=l(document.createDocumentFragment()),c=0;c<a.length;c++)b.appendChild(l(a[c]));return b}function e(a){for(var b=a.firstChild;b;){i(b.parentNode===a);var c=b.nextSibling,d=l(b),e=d.parentNode;e&&r.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}function f(a){i(a instanceof n),g.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0}var g=a.wrappers.EventTarget,h=a.wrappers.NodeList;a.defineWrapGetter;var i=a.assert,j=a.mixin,k=a.registerWrapper,l=a.unwrap,m=a.wrap,n=window.Node,o=n.prototype.appendChild,p=n.prototype.insertBefore,q=n.prototype.replaceChild,r=n.prototype.removeChild,s=n.prototype.compareDocumentPosition;f.prototype=Object.create(g.prototype),j(f.prototype,{appendChild:function(a){b(a),this.invalidateShadowRenderer();var e=this.lastChild,f=null,g=c(a,this,e,f);return this.lastChild_=g[g.length-1],e||(this.firstChild_=g[0]),o.call(this.impl,d(g)),a},insertBefore:function(a,e){if(!e)return this.appendChild(a);b(a),b(e),i(e.parentNode===this),this.invalidateShadowRenderer();var f=e.previousSibling,g=e,h=c(a,this,f,g);this.firstChild===e&&(this.firstChild_=h[0]);var j=l(e),k=j.parentNode;return k&&p.call(k,d(h),j),a},removeChild:function(a){if(b(a),a.parentNode!==this)throw new Error("NotFoundError");this.invalidateShadowRenderer();var c=this.firstChild,d=this.lastChild,e=a.nextSibling,f=a.previousSibling,g=l(a),h=g.parentNode;return h&&r.call(h,g),c===a&&(this.firstChild_=e),d===a&&(this.lastChild_=f),f&&(f.nextSibling_=e),e&&(e.previousSibling_=f),a.previousSibling_=a.nextSibling_=a.parentNode_=null,a},replaceChild:function(a,e){if(b(a),b(e),e.parentNode!==this)throw new Error("NotFoundError");this.invalidateShadowRenderer();var f=e.previousSibling,g=e.nextSibling;g===a&&(g=a.nextSibling);var h=c(a,this,f,g);this.firstChild===e&&(this.firstChild_=h[0]),this.lastChild===e&&(this.lastChild_=h[h.length-1]),e.previousSibling_=null,e.nextSibling_=null,e.parentNode_=null;var i=l(e);return i.parentNode&&q.call(i.parentNode,d(h),i),e},hasChildNodes:function(){return null===this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:m(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:m(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:m(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:m(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:m(this.impl.previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==f.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)a+=b.textContent;return a},set textContent(a){if(e(this),this.invalidateShadowRenderer(),""!==a){var b=this.impl.ownerDocument.createTextNode(a);this.appendChild(b)}},get childNodes(){for(var a=new h,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){if(!this.invalidateShadowRenderer())return m(this.impl.cloneNode(a));var b=m(this.impl.cloneNode(!1));if(a)for(var c=this.firstChild;c;c=c.nextSibling)b.appendChild(c.cloneNode(!0));return b},contains:function(a){if(!a)return!1;if(a===this)return!0;var b=a.parentNode;return b?this.contains(b):!1},compareDocumentPosition:function(a){return s.call(this.impl,l(a))},get ownerDocument(){return a.renderAllPending(),m(this.impl.ownerDocument)}}),k(n,f,document.createDocumentFragment()),delete f.prototype.querySelector,delete f.prototype.querySelectorAll,f.prototype=j(Object.create(g.prototype),f.prototype),a.wrappers.Node=f}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a,c){for(var d,e=a.firstElementChild;e;){if(e.matches(c))return e;if(d=b(e,c))return d;e=e.nextElementSibling}return null}function c(a,b,d){for(var e=a.firstElementChild;e;)e.matches(b)&&(d[d.length++]=e),c(e,b,d),e=e.nextElementSibling;return d}var d={querySelector:function(a){return b(this,a)},querySelectorAll:function(a){return c(this,a,new NodeList)}},e={getElementsByTagName:function(a){return this.querySelectorAll(a)},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){if("*"===a)return this.getElementsByTagName(b);for(var c=new NodeList,d=this.getElementsByTagName(b),e=0,f=0;e<d.length;e++)d[e].namespaceURI===a&&(c[f++]=d[e]);return c.length=f,c}};a.GetElementsByInterface=e,a.SelectorsInterface=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.nextSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.mixin,f=a.registerWrapper,g=window.CharacterData;b.prototype=Object.create(d.prototype),e(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a}}),e(b.prototype,c),f(g,b,document.createTextNode("")),a.wrappers.CharacterData=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){e.call(this,a)}var c=a.ChildNodeInterface,d=a.GetElementsByInterface,e=a.wrappers.Node,f=a.ParentNodeInterface,g=a.SelectorsInterface;a.addWrapNodeListMethod;var h=a.mixin,i=a.registerWrapper,j=a.wrappers,k=new SideTable,l=window.Element,m=l.prototype.matches||l.prototype.mozMatchesSelector||l.prototype.msMatchesSelector||l.prototype.webkitMatchesSelector;b.prototype=Object.create(e.prototype),h(b.prototype,{createShadowRoot:function(){var b=new j.ShadowRoot(this);return k.set(this,b),a.getRendererForHost(this),this.invalidateShadowRenderer(!0),b},get shadowRoot(){return k.get(this)||null},setAttribute:function(a,b){this.impl.setAttribute(a,b),this.invalidateShadowRenderer()},matches:function(a){return m.call(this.impl,a)}}),h(b.prototype,c),h(b.prototype,d),h(b.prototype,f),h(b.prototype,g),i(l,b),a.wrappers.Element=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case'"':return"&quot;"}}function c(a){return a.replace(p,b)}function d(a){switch(a.nodeType){case Node.ELEMENT_NODE:for(var b,d=a.tagName.toLowerCase(),f="<"+d,g=a.attributes,h=0;b=g[h];h++)f+=" "+b.name+'="'+c(b.value)+'"';return f+=">",q[d]?f:f+e(a)+"</"+d+">";case Node.TEXT_NODE:return c(a.nodeValue);case Node.COMMENT_NODE:return"<!--"+c(a.nodeValue)+"-->";default:throw console.error(a),new Error("not implemented")}}function e(a){for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=d(c);return b}function f(a,b,c){var d=c||"div";a.textContent="";var e=n(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(o(f))}function g(a){j.call(this,a)}function h(b){k(g,b,function(){return a.renderAllPending(),this.impl[b]})}function i(b){Object.defineProperty(g.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var j=a.wrappers.Element,k=a.defineGetter,l=a.mixin,m=a.registerWrapper,n=a.unwrap,o=a.wrap,p=/&|<|"/g,q={area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},r=window.HTMLElement;g.prototype=Object.create(j.prototype),l(g.prototype,{get innerHTML(){return e(this)},set innerHTML(a){f(this,a,this.tagName)},get outerHTML(){return d(this)},set outerHTML(a){if(this.invalidateShadowRenderer())throw new Error("not implemented");this.impl.outerHTML=a}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollLeft","scrollTop","scrollWidth"].forEach(h),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(i),m(r,g,document.createElement("b")),a.wrappers.HTMLElement=g,a.getInnerHTML=e,a.setInnerHTML=f}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a),this.olderShadowRoot_=null}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get olderShadowRoot(){return this.olderShadowRoot_},invalidateShadowRenderer:function(){c.prototype.invalidateShadowRenderer.call(this,!0)}}),f&&e(f,b),a.wrappers.HTMLShadowElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=l.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);l.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=d.createDocumentFragment();c=a.firstChild;)e.appendChild(c);return e}function d(a){e.call(this,a)}var e=a.wrappers.HTMLElement,f=a.getInnerHTML,g=a.mixin,h=a.registerWrapper,i=a.setInnerHTML,j=a.wrap,k=new SideTable,l=new SideTable,m=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),g(d.prototype,{get content(){if(m)return j(this.impl.content);var a=k.get(this);return a||(a=c(this),k.set(this,a)),a},get innerHTML(){return f(this.content)},set innerHTML(a){i(this.content,a),this.invalidateShadowRenderer()}}),m&&h(m,d),a.wrappers.HTMLTemplateElement=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement;a.mixin;var g=a.registerWrapper,h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createTextNode("")),i=f(document.createComment(""));a.wrappers.Comment=i,a.wrappers.DocumentFragment=g,a.wrappers.Text=h}(this.ShadowDOMPolyfill),function(a){"use strict";function b(b){var d=i(b.impl.ownerDocument.createDocumentFragment());c.call(this,d),g(d,this);var e=b.shadowRoot;a.nextOlderShadowTreeTable.set(this,e),j.set(this,b)}var c=a.wrappers.DocumentFragment,d=a.elementFromPoint,e=a.getInnerHTML,f=a.mixin,g=a.rewrap,h=a.setInnerHTML,i=a.unwrap,j=new SideTable;b.prototype=Object.create(c.prototype),f(b.prototype,{get innerHTML(){return e(this)},set innerHTML(a){h(this,a),this.invalidateShadowRenderer()},invalidateShadowRenderer:function(){return j.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return d(this,this.ownerDocument,a,b)},getElementById:function(a){return this.querySelector("#"+a)}}),a.wrappers.ShadowRoot=b,a.getHostForShadowRoot=function(a){return j.get(a)}}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a){a.firstChild_=a.firstChild,a.lastChild_=a.lastChild}function d(a){F(a instanceof E);for(var d=a.firstChild;d;d=d.nextSibling)b(d);c(a)}function e(a){var b=H(a);d(a),b.textContent=""}function f(a,c){var e=H(a),f=H(c);f.nodeType===E.DOCUMENT_FRAGMENT_NODE?d(c):(h(c),b(c)),a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var g=I(e.lastChild);g&&(g.nextSibling_=g.nextSibling),e.appendChild(f)}function g(a,c){var d=H(a),e=H(c);b(c),c.previousSibling&&(c.previousSibling.nextSibling_=c),c.nextSibling&&(c.nextSibling.previousSibling_=c),a.lastChild===c&&(a.lastChild_=c),a.firstChild===c&&(a.firstChild_=c),d.removeChild(e)}function h(a){var b=H(a),c=b.parentNode;c&&g(I(c),a)}function i(a,b){k(b).push(a),L.set(a,b);var c=K.get(a);c||K.set(a,c=[]),c.push(b)}function j(a){J.set(a,[])}function k(a){return J.get(a)}function l(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function m(a,b,c){for(var d=l(a),e=0;e<d.length;e++){var f=d[e];if(b(f)){if(c(f)===!1)return}else m(f,b,c)}}function n(a,b){var c=!1;return m(a,u,function(a){j(a);for(var d=0;d<b.length;d++){var e=b[d];void 0!==e&&p(e,a)&&(i(e,a),b[d]=void 0,c=!0)}}),c?b.filter(function(a){return void 0!==a}):b}function o(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function p(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(a.nodeType!==E.ELEMENT_NODE)return!1;if(!P.test(c))return!1;if(":"===c[0]&&!Q.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function q(){C=null,S.forEach(function(a){a.render()}),S=[]}function r(a){this.host=a,this.dirty=!1,this.associateNode(a)}function s(a){var b=N.get(a);return b||(b=new r(a),N.set(a,b)),b}function t(a){return"content"===a.localName}function u(a){return"content"===a.localName}function v(a){return"shadow"===a.localName}function w(a){return"shadow"===a.localName}function x(a){return!!a.shadowRoot}function y(a){return M.get(a)}function z(a){for(var b=[],c=a.shadowRoot;c;c=M.get(c))b.push(c);return b}function A(a,b){L.set(a,b)}function B(a){new r(a).render()}var C,D=a.wrappers.HTMLContentElement,E=a.wrappers.Node,F=a.assert,G=a.mixin,H=a.unwrap,I=a.wrap,J=new SideTable,K=new SideTable,L=new SideTable,M=new SideTable,N=new SideTable,O=new SideTable,P=/^[*.:#[a-zA-Z_|]/,Q=new RegExp("^:("+["link","visited","target","enabled","disabled","checked","indeterminate","nth-child","nth-last-child","nth-of-type","nth-last-of-type","first-child","last-child","first-of-type","last-of-type","only-of-type"].join("|")+")"),R=o(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),S=[];r.prototype={render:function(){if(this.dirty){var a=this.host;this.treeComposition();var b=a.shadowRoot;if(b){this.removeAllChildNodes(this.host);var c=l(b);c.forEach(function(c){this.renderNode(a,b,c,!1)},this),this.dirty=!1}}},invalidate:function(){if(!this.dirty){if(this.dirty=!0,S.push(this),C)return;C=window[R](q,0)}},renderNode:function(a,b,c,d){if(x(c)){this.appendChild(a,c);var e=s(c);e.dirty=!0,e.render()}else t(c)?this.renderInsertionPoint(a,b,c,d):v(c)?this.renderShadowInsertionPoint(a,b,c):this.renderAsAnyDomTree(a,b,c,d)},renderAsAnyDomTree:function(a,b,c,d){if(this.appendChild(a,c),x(c))B(c);else{var e=c,f=l(e);f.forEach(function(a){this.renderNode(e,b,a,d)},this)}},renderInsertionPoint:function(a,b,c,d){var e=k(c);e.length?(this.removeAllChildNodes(c),e.forEach(function(c){t(c)&&d?this.renderInsertionPoint(a,b,c,d):this.renderAsAnyDomTree(a,b,c,d)},this)):this.renderFallbackContent(a,c),this.remove(c)},renderShadowInsertionPoint:function(a,b,c){var d=y(b);if(d){L.set(d,c),c.olderShadowRoot_=d,this.remove(c);var e=l(d);e.forEach(function(b){this.renderNode(a,d,b,!0)},this)}else this.renderFallbackContent(a,c)},renderFallbackContent:function(a,b){var c=l(b);c.forEach(function(b){this.appendChild(a,b)},this)},treeComposition:function(){var a=this.host,b=a.shadowRoot,c=[],d=l(a);d.forEach(function(a){if(t(a)){var b=k(a);b&&b.length||(b=l(a)),c.push.apply(c,b)}else c.push(a)});for(var e,f;b;){if(e=void 0,m(b,w,function(a){return e=a,!1}),f=e,c=n(b,c),f){var g=y(b);if(g){b=g,A(b,f);continue}break}break}},appendChild:function(a,b){f(a,b),this.associateNode(b)},remove:function(a){h(a),this.associateNode(a)},removeAllChildNodes:function(a){e(a)},associateNode:function(a){O.set(a,this)}},E.prototype.invalidateShadowRenderer=function(a){var b=O.get(this);if(!b)return!1;var c;return(a||this.shadowRoot||(c=this.parentNode)&&(c.shadowRoot||c instanceof ShadowRoot))&&b.invalidate(),!0},D.prototype.getDistributedNodes=function(){return q(),k(this)},G(E.prototype,{get insertionParent(){return L.get(this)||null}}),a.eventParentsTable=K,a.getRendererForHost=s,a.getShadowTrees=z,a.nextOlderShadowTreeTable=M,a.renderAllPending=q,a.visual={removeAllChildNodes:e,appendChild:f,removeChild:g}}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){h.call(this,a)}function c(a){var c=document[a];b.prototype[a]=function(){return q(c.apply(this.impl,arguments))}}function d(a){this.impl=a}function e(a,b){var c=document.implementation[b];a.prototype[b]=function(){return q(c.apply(this.impl,arguments))}}function f(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(this.impl,arguments)}}var g=a.GetElementsByInterface,h=a.wrappers.Node,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=a.defineWrapGetter,l=a.elementFromPoint,m=a.forwardMethodsToWrapper,n=a.mixin,o=a.registerWrapper,p=a.unwrap,q=a.wrap,r=a.wrapEventTargetMethods;a.wrapNodeList;var s=new SideTable;b.prototype=Object.create(h.prototype),k(b,"documentElement"),k(b,"body"),k(b,"head"),["getElementById","createElement","createElementNS","createTextNode","createDocumentFragment","createEvent","createEventNS"].forEach(c);var t=document.adoptNode,u=document.write;n(b.prototype,{adoptNode:function(a){return t.call(this.impl,p(a)),a},elementFromPoint:function(a,b){return l(this,this,a,b)},write:function(a){for(var b=this.querySelectorAll("*"),c=b[b.length-1];c.nextSibling;)c=c.nextSibling;var d=c.parentNode;d.lastChild_=void 0,c.nextSibling_=void 0,u.call(this.impl,a)}}),m([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement],["appendChild","compareDocumentPosition","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"]),m([window.HTMLDocument||window.Document],["adoptNode","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createTextNode","elementFromPoint","getElementById","write"]),n(b.prototype,g),n(b.prototype,i),n(b.prototype,j),n(b.prototype,{get implementation(){var a=s.get(this);return a?a:(a=new d(p(this).implementation),s.set(this,a),a)}}),o(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&o(window.HTMLDocument,b),r([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),e(d,"createDocumentType"),e(d,"createDocument"),e(d,"createHTMLDocument"),f(d,"hasFeature"),o(window.DOMImplementation,d),m([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.wrappers.Document=b,a.wrappers.DOMImplementation=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap,i=window.Window;b.prototype=Object.create(c.prototype);var j=window.getComputedStyle;i.prototype.getComputedStyle=function(a,b){return j.call(this||window,g(a),b)},["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){i.prototype[a]=function(){var b=h(this||window);return b[a].apply(b,arguments)}}),d(b.prototype,{getComputedStyle:function(a,b){return j.call(f(this),g(a),b)}}),e(i,b),a.wrappers.Window=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}function c(a){return new b(a)}function d(a){return a.map(c)}function e(a){var b=this;this.impl=new k(function(c){a.call(b,d(c),b)})}var f=a.defineGetter,g=a.defineWrapGetter,h=a.registerWrapper,i=a.unwrapIfNeeded,j=a.wrapNodeList;a.wrappers;var k=window.MutationObserver||window.WebKitMutationObserver;if(k){var l=window.MutationRecord;b.prototype={get addedNodes(){return j(this.impl.addedNodes)},get removedNodes(){return j(this.impl.removedNodes)}},["target","previousSibling","nextSibling"].forEach(function(a){g(b,a)}),["type","attributeName","attributeNamespace","oldValue"].forEach(function(a){f(b,a,function(){return this.impl[a]
+})}),l&&h(l,b),window.Node,e.prototype={observe:function(a,b){this.impl.observe(i(a),b)},disconnect:function(){this.impl.disconnect()},takeRecords:function(){return d(this.impl.takeRecords())}},a.wrappers.MutationObserver=e,a.wrappers.MutationRecord=b}}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}a.isWrapperFor;var c={a:"HTMLAnchorElement",applet:"HTMLAppletElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",br:"HTMLBRElement",base:"HTMLBaseElement",body:"HTMLBodyElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",dl:"HTMLDListElement",datalist:"HTMLDataListElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",hr:"HTMLHRElement",head:"HTMLHeadElement",h1:"HTMLHeadingElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",input:"HTMLInputElement",li:"HTMLLIElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",link:"HTMLLinkElement",map:"HTMLMapElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",del:"HTMLModElement",ol:"HTMLOListElement",object:"HTMLObjectElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",table:"HTMLTableElement",tr:"HTMLTableRowElement",thead:"HTMLTableSectionElement",tbody:"HTMLTableSectionElement",textarea:"HTMLTextAreaElement",title:"HTMLTitleElement",ul:"HTMLUListElement",video:"HTMLVideoElement"};Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]}),a.knownElements=c}(this.ShadowDOMPolyfill),function(){var a=window.ShadowDOMPolyfill;a.wrap,Object.defineProperties(HTMLElement.prototype,{webkitShadowRoot:{get:function(){return this.shadowRoot}}}),HTMLElement.prototype.webkitCreateShadowRoot=HTMLElement.prototype.createShadowRoot,window.dartExperimentalFixupGetTag=function(b){function c(a){if(a instanceof d)return"NodeList";if(a instanceof e)return"ShadowRoot";if(a instanceof MutationRecord)return"MutationRecord";if(a instanceof MutationObserver)return"MutationObserver";if(f(a)){a=g(a);var c=a.constructor;if(c&&c._ShadowDOMPolyfill$isGeneratedWrapper){var h=c._ShadowDOMPolyfill$cacheTag_;return h||(h=Object.prototype.toString.call(a),h=h.substring(8,h.length-1),c._ShadowDOMPolyfill$cacheTag_=h),h}}return b(a)}var d=a.wrappers.NodeList,e=a.wrappers.ShadowRoot,f=a.isWrapper,g=a.unwrap;return c}}();var Platform={};!function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(m,"")),c}function c(a){var b=document.createElement("style");b.textContent=a,document.head.appendChild(b);var c=b.sheet.cssRules;return b.parentNode.removeChild(b),c}function d(a){for(var b=0,c=[];b<a.length;b++)c.push(a[b].cssText);return c.join("\n\n")}function e(a){a&&f().appendChild(document.createTextNode(a))}function f(){return g||(g=document.createElement("style"),g.setAttribute("ShadowCSSShim","")),g}var g,h={strictStyling:!1,registry:{},shimStyling:function(a,b,c){if(a){var d=this.registerDefinition(a,b,c);this.strictStyling&&this.applyScopeToContent(a,b),this.shimPolyfillDirectives(d.rootStyles,b),this.applyShimming(d.scopeStyles,b)}},shimShadowDOMStyling:function(a,b){this.shimPolyfillDirectives(a,b),this.applyShimming(a,b)},registerDefinition:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=a.querySelectorAll("style");e=e?Array.prototype.slice.call(e,0):[],d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return f&&(d.scopeStyles=d.scopeStyles.concat(f.scopeStyles)),d},applyScopeToContent:function(a,b){a&&(Array.prototype.forEach.call(a.querySelectorAll("*"),function(a){a.setAttribute(b,"")}),Array.prototype.forEach.call(a.querySelectorAll("template"),function(a){this.applyScopeToContent(a.content,b)},this))},shimPolyfillDirectives:function(a,b){a&&Array.prototype.forEach.call(a,function(a){a.textContent=this.convertPolyfillDirectives(a.textContent,b)},this)},convertPolyfillDirectives:function(a,b){for(var c,d,e="",f=0;c=n.exec(a);)e+=a.substring(f,c.index),d=c[1].slice(0,-2).replace(q,b),e+=this.scopeSelector(d,b)+"{",f=n.lastIndex;return e+=a.substring(f,a.length)},applyShimming:function(a,b){var c=this.shimAtHost(a,b);c+=this.shimScoping(a,b),e(c)},shimAtHost:function(a,b){return a?this.convertAtHostStyles(a,b):void 0},convertAtHostStyles:function(a,e){for(var f,g=b(a),h="",j=0;f=i.exec(g);)h+=g.substring(j,f.index),h+=this.scopeHostCss(f[1],e),j=i.lastIndex;h+=g.substring(j,g.length);var k=new RegExp("^"+e+p,"m"),g=d(this.findAtHostRules(c(h),k));return g},scopeHostCss:function(a,b){for(var c,d="";c=j.exec(a);)d+=this.scopeHostSelector(c[1],b)+" "+c[2]+"\n	";return d},scopeHostSelector:function(a,b){var c=[],d=a.split(","),e="[is="+b+"]";return d.forEach(function(a){a=a.trim(),a.match(k)?a=a.replace(k,b+"$1$3, "+e+"$1$3"):a.match(l)&&(a=b+a+", "+e+a),c.push(a)},this),c.join(", ")},findAtHostRules:function(a,b){return Array.prototype.filter.call(a,this.isHostRule.bind(this,b))},isHostRule:function(a,b){return b.selectorText&&b.selectorText.match(a)||b.cssRules&&this.findAtHostRules(b.cssRules,a).length||b.type==CSSRule.WEBKIT_KEYFRAMES_RULE},shimScoping:function(a,b){return a?this.convertScopedStyles(a,b):void 0},convertScopedStyles:function(a,d){Array.prototype.forEach.call(a,function(a){a.parentNode&&a.parentNode.removeChild(a)});var e=b(a).replace(i,"");e=this.convertPseudos(e);var f=c(e);return e=this.scopeRules(f,d)},convertPseudos:function(a){return a.replace(o," [pseudo=$1]")},scopeRules:function(a,b){var c="";return Array.prototype.forEach.call(a,function(a){a.selectorText&&a.style&&a.style.cssText?(c+=this.scopeSelector(a.selectorText,b,this.strictStyling)+" {\n	",c+=this.propertiesFromRule(a)+"\n}\n\n"):a.media?(c+="@media "+a.media.mediaText+" {\n",c+=this.scopeRules(a.cssRules,b),c+="\n}\n\n"):a.cssText&&(c+=a.cssText+"\n\n")},this),c},scopeSelector:function(a,b,c){var d=[],e=a.split(",");return e.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b)&&(a=c?this.applyStrictSelectorScope(a,b):this.applySimpleSelectorScope(a,b)),d.push(a)},this),d.join(", ")},selectorNeedsScoping:function(a,b){var c="("+b+"|\\[is="+b+"\\])",d=new RegExp("^"+c+p,"m");return!a.match(d)},applySimpleSelectorScope:function(a,b){return b+" "+a+", "+"[is="+b+"] "+a},applyStrictSelectorScope:function(a,b){var c=[" ",">","+","~"],d=a,e="["+b+"]";return c.forEach(function(a){var b=d.split(a);d=b.map(function(a){var b=a.trim();return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},propertiesFromRule:function(a){var b=a.style.cssText;return a.style.content&&!a.style.content.match(/['"]+/)&&(b="content: '"+a.style.content+"';\n"+a.style.cssText.replace(/content:[^;]*;/g,"")),b}},i=/@host[^{]*{(([^}]*?{[^{]*?}[\s\S]*?)+)}/gim,j=/([^{]*)({[\s\S]*?})/gim,k=/(.*)((?:\*)|(?:\:scope))(.*)/,l=/^[.\[:]/,m=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,n=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,o=/::(x-[^\s{,(]*)/gim,p="([>\\s~+[.,{:][\\s\\S]*)?$",q=/@host/gim;if(window.ShadowDOMPolyfill){e("style { display: none !important; }\n");var r=document.querySelector("head");r.insertBefore(f(),r.childNodes[0])}a.ShadowCSS=h}(window.Platform),function(a){function b(a,b){if(window.ShadowDOMPolyfill){for(var h,i=this.convertPolyfillDirectives(a,b),j="",k=0;h=e.exec(i);)j+=i.substring(k,h.index),j+=this.scopeHostCss(h[1],b),k=e.lastIndex;j+=i.substring(k,i.length);var l=new RegExp("^"+b+g,"m"),m=d(this.findAtHostRules(c(j),l));i=i.replace(f,""),i=this.convertPseudos(i);var n=c(i),o=this.scopeRules(n,b);return m+o}}function c(a){var b=document.createElement("style");b.textContent=a,document.head.appendChild(b);var c=b.sheet.cssRules;return b.parentNode.removeChild(b),c}function d(a){for(var b=0,c=[];b<a.length;b++)c.push(a[b].cssText);return c.join("\n\n")}var e=/@host[^{]*{(([^}]*?{[^{]*?}[\s\S]*?)+)}/gim,f=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,g="([>\\s~+[.,{:][\\s\\S]*)?$";a.ShadowCSS.shimShadowDOMStyling2=b}(window.Platform)}
\ No newline at end of file
diff --git a/pkg/shadow_dom/lib/src/platform/ShadowCSS.js b/pkg/shadow_dom/lib/src/platform/ShadowCSS.js
new file mode 100644
index 0000000..96861a1
--- /dev/null
+++ b/pkg/shadow_dom/lib/src/platform/ShadowCSS.js
@@ -0,0 +1,452 @@
+/*
+ * Copyright 2012 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+/*
+  This is a limited shim for ShadowDOM css styling.
+  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles
+
+  The intention here is to support only the styling features which can be
+  relatively simply implemented. The goal is to allow users to avoid the
+  most obvious pitfalls and do so without compromising performance significantly.
+  For ShadowDOM styling that's not covered here, a set of best practices
+  can be provided that should allow users to accomplish more complex styling.
+
+  The following is a list of specific ShadowDOM styling features and a brief
+  discussion of the approach used to shim.
+
+  Shimmed features:
+
+  * @host: ShadowDOM allows styling of the shadowRoot's host element using the
+  @host rule. To shim this feature, the @host styles are reformatted and
+  prefixed with a given scope name and promoted to a document level stylesheet.
+  For example, given a scope name of .foo, a rule like this:
+
+    @host {
+      * {
+        background: red;
+      }
+    }
+
+  becomes:
+
+    .foo {
+      background: red;
+    }
+
+  * encapsultion: Styles defined within ShadowDOM, apply only to
+  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement
+  this feature.
+
+  By default, rules are prefixed with the host element tag name
+  as a descendant selector. This ensures styling does not leak out of the 'top'
+  of the element's ShadowDOM. For example,
+
+  div {
+      font-weight: bold;
+    }
+
+  becomes:
+
+  x-foo div {
+      font-weight: bold;
+    }
+
+  becomes:
+
+
+  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then
+  selectors are scoped by adding an attribute selector suffix to each
+  simple selector that contains the host element tag name. Each element
+  in the element's ShadowDOM template is also given the scope attribute.
+  Thus, these rules match only elements that have the scope attribute.
+  For example, given a scope name of x-foo, a rule like this:
+
+    div {
+      font-weight: bold;
+    }
+
+  becomes:
+
+    div[x-foo] {
+      font-weight: bold;
+    }
+
+  Note that elements that are dynamically added to a scope must have the scope
+  selector added to them manually.
+
+  * ::pseudo: These rules are converted to rules that take advantage of the
+  pseudo attribute. For example, a shadowRoot like this inside an x-foo
+
+    <div pseudo="x-special">Special</div>
+
+  with a rule like this:
+
+    x-foo::x-special { ... }
+
+  becomes:
+
+    x-foo [pseudo=x-special] { ... }
+
+  Unaddressed ShadowDOM styling features:
+
+  * upper/lower bound encapsulation: Styles which are defined outside a
+  shadowRoot should not cross the ShadowDOM boundary and should not apply
+  inside a shadowRoot.
+
+  This styling behavior is not emulated. Some possible ways to do this that
+  were rejected due to complexity and/or performance concerns include: (1) reset
+  every possible property for every possible selector for a given scope name;
+  (2) re-implement css in javascript.
+
+  As an alternative, users should make sure to use selectors
+  specific to the scope in which they are working.
+
+  * ::distributed: This behavior is not emulated. It's often not necessary
+  to style the contents of a specific insertion point and instead, descendants
+  of the host element can be styled selectively. Users can also create an
+  extra node around an insertion point and style that node's contents
+  via descendent selectors. For example, with a shadowRoot like this:
+
+    <style>
+      content::-webkit-distributed(div) {
+        background: red;
+      }
+    </style>
+    <content></content>
+
+  could become:
+
+    <style>
+      / *@polyfill .content-container div * /
+      content::-webkit-distributed(div) {
+        background: red;
+      }
+    </style>
+    <div class="content-container">
+      <content></content>
+    </div>
+
+  Note the use of @polyfill in the comment above a ShadowDOM specific style
+  declaration. This is a directive to the styling shim to use the selector
+  in comments in lieu of the next selector when running under polyfill.
+*/
+(function(scope) {
+
+var ShadowCSS = {
+  strictStyling: false,
+  registry: {},
+  // Shim styles for a given root associated with a name and extendsName
+  // 1. cache root styles by name
+  // 2. optionally tag root nodes with scope name
+  // 3. shim polyfill directives /* @polyfill */
+  // 4. shim @host and scoping
+  shimStyling: function(root, name, extendsName) {
+    if (root) {
+      // use caching to make working with styles nodes easier and to facilitate
+      // lookup of extendee
+      var def = this.registerDefinition(root, name, extendsName);
+      // find styles and apply shimming...
+      if (this.strictStyling) {
+        this.applyScopeToContent(root, name);
+      }
+      this.shimPolyfillDirectives(def.rootStyles, name);
+      this.applyShimming(def.scopeStyles, name);
+    }
+  },
+  // Shim styles to be placed inside a shadowRoot.
+  // 1. shim polyfill directives /* @polyfill */
+  // 2. shim @host and scoping
+  shimShadowDOMStyling: function(styles, name) {
+    this.shimPolyfillDirectives(styles, name);
+    this.applyShimming(styles, name);
+  },
+  registerDefinition: function(root, name, extendsName) {
+    var def = this.registry[name] = {
+      root: root,
+      name: name,
+      extendsName: extendsName
+    }
+    var styles = root.querySelectorAll('style');
+    styles = styles ? Array.prototype.slice.call(styles, 0) : [];
+    def.rootStyles = styles;
+    def.scopeStyles = def.rootStyles;
+    var extendee = this.registry[def.extendsName];
+    if (extendee) {
+      def.scopeStyles = def.scopeStyles.concat(extendee.scopeStyles);
+    }
+    return def;
+  },
+  applyScopeToContent: function(root, name) {
+    if (root) {
+      // add the name attribute to each node in root.
+      Array.prototype.forEach.call(root.querySelectorAll('*'),
+          function(node) {
+            node.setAttribute(name, '');
+          });
+      // and template contents too
+      Array.prototype.forEach.call(root.querySelectorAll('template'),
+          function(template) {
+            this.applyScopeToContent(template.content, name);
+          },
+          this);
+    }
+  },
+  /*
+   * Process styles to convert native ShadowDOM rules that will trip
+   * up the css parser; we rely on decorating the stylesheet with comments.
+   *
+   * For example, we convert this rule:
+   *
+   * (comment start) @polyfill @host g-menu-item (comment end)
+   * shadow::-webkit-distributed(g-menu-item) {
+   *
+   * to this:
+   *
+   * scopeName g-menu-item {
+   *
+  **/
+  shimPolyfillDirectives: function(styles, name) {
+    if (styles) {
+      Array.prototype.forEach.call(styles, function(s) {
+        s.textContent = this.convertPolyfillDirectives(s.textContent, name);
+      }, this);
+    }
+  },
+  convertPolyfillDirectives: function(cssText, name) {
+    var r = '', l = 0, matches, selector;
+    while (matches = cssPolyfillCommentRe.exec(cssText)) {
+      r += cssText.substring(l, matches.index);
+      // remove end comment delimiter (*/)
+      selector = matches[1].slice(0, -2).replace(hostRe, name);
+      r += this.scopeSelector(selector, name) + '{';
+      l = cssPolyfillCommentRe.lastIndex;
+    }
+    r += cssText.substring(l, cssText.length);
+    return r;
+  },
+  // apply @host and scope shimming
+  applyShimming: function(styles, name) {
+    var cssText = this.shimAtHost(styles, name);
+    cssText += this.shimScoping(styles, name);
+    addCssToDocument(cssText);
+  },
+  // form: @host { .foo { declarations } }
+  // becomes: scopeName.foo { declarations }
+  shimAtHost: function(styles, name) {
+    if (styles) {
+      return this.convertAtHostStyles(styles, name);
+    }
+  },
+  convertAtHostStyles: function(styles, name) {
+    var cssText = stylesToCssText(styles);
+    var r = '', l=0, matches;
+    while (matches = hostRuleRe.exec(cssText)) {
+      r += cssText.substring(l, matches.index);
+      r += this.scopeHostCss(matches[1], name);
+      l = hostRuleRe.lastIndex;
+    }
+    r += cssText.substring(l, cssText.length);
+    var re = new RegExp('^' + name + selectorReSuffix, 'm');
+    var cssText = rulesToCss(this.findAtHostRules(cssToRules(r),
+      re));
+    return cssText;
+  },
+  scopeHostCss: function(cssText, name) {
+    var r = '', matches;
+    while (matches = selectorRe.exec(cssText)) {
+      r += this.scopeHostSelector(matches[1], name) +' ' + matches[2] + '\n\t';
+    }
+    return r;
+  },
+  // supports scopig by name and  [is=name] syntax
+  scopeHostSelector: function(selector, name) {
+    var r = [], parts = selector.split(','), is = '[is=' + name + ']';
+    parts.forEach(function(p) {
+      p = p.trim();
+      // selector: *|:scope -> name
+      if (p.match(hostElementRe)) {
+        p = p.replace(hostElementRe, name + '$1$3, ' + is + '$1$3');
+      // selector: .foo -> name.foo, [bar] -> name[bar]
+      } else if (p.match(hostFixableRe)) {
+        p = name + p + ', ' + is + p;
+      }
+      r.push(p);
+    }, this);
+    return r.join(', ');
+  },
+  // consider styles that do not include component name in the selector to be
+  // unscoped and in need of promotion;
+  // for convenience, also consider keyframe rules this way.
+  findAtHostRules: function(cssRules, matcher) {
+    return Array.prototype.filter.call(cssRules,
+      this.isHostRule.bind(this, matcher));
+  },
+  isHostRule: function(matcher, cssRule) {
+    return (cssRule.selectorText && cssRule.selectorText.match(matcher)) ||
+      (cssRule.cssRules && this.findAtHostRules(cssRule.cssRules, matcher).length) ||
+      (cssRule.type == CSSRule.WEBKIT_KEYFRAMES_RULE);
+  },
+  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:
+   *
+   *  .foo {... }
+   *
+   *  and converts this to
+   *
+   *  scopeName .foo { ... }
+  */
+  shimScoping: function(styles, name) {
+    if (styles) {
+      return this.convertScopedStyles(styles, name);
+    }
+  },
+  convertScopedStyles: function(styles, name) {
+    Array.prototype.forEach.call(styles, function(s) {
+      if (s.parentNode) {
+        s.parentNode.removeChild(s);
+      }
+    });
+    var cssText = stylesToCssText(styles).replace(hostRuleRe, '');
+    cssText = this.convertPseudos(cssText);
+    var rules = cssToRules(cssText);
+    cssText = this.scopeRules(rules, name);
+    return cssText;
+  },
+  convertPseudos: function(cssText) {
+    return cssText.replace(cssPseudoRe, ' [pseudo=$1]');
+  },
+  // change a selector like 'div' to 'name div'
+  scopeRules: function(cssRules, name) {
+    var cssText = '';
+    Array.prototype.forEach.call(cssRules, function(rule) {
+      if (rule.selectorText && (rule.style && rule.style.cssText)) {
+        cssText += this.scopeSelector(rule.selectorText, name,
+          this.strictStyling) + ' {\n\t';
+        cssText += this.propertiesFromRule(rule) + '\n}\n\n';
+      } else if (rule.media) {
+        cssText += '@media ' + rule.media.mediaText + ' {\n';
+        cssText += this.scopeRules(rule.cssRules, name);
+        cssText += '\n}\n\n';
+      } else if (rule.cssText) {
+        cssText += rule.cssText + '\n\n';
+      }
+    }, this);
+    return cssText;
+  },
+  scopeSelector: function(selector, name, strict) {
+    var r = [], parts = selector.split(',');
+    parts.forEach(function(p) {
+      p = p.trim();
+      if (this.selectorNeedsScoping(p, name)) {
+        p = strict ? this.applyStrictSelectorScope(p, name) :
+          this.applySimpleSelectorScope(p, name);
+      }
+      r.push(p);
+    }, this);
+    return r.join(', ');
+  },
+  selectorNeedsScoping: function(selector, name) {
+    var matchScope = '(' + name + '|\\[is=' + name + '\\])';
+    var re = new RegExp('^' + matchScope + selectorReSuffix, 'm');
+    return !selector.match(re);
+  },
+  // scope via name and [is=name]
+  applySimpleSelectorScope: function(selector, name) {
+    return name + ' ' + selector + ', ' + '[is=' + name + '] ' + selector;
+  },
+  // return a selector with [name] suffix on each simple selector
+  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]
+  applyStrictSelectorScope: function(selector, name) {
+    var splits = [' ', '>', '+', '~'],
+      scoped = selector,
+      attrName = '[' + name + ']';
+    splits.forEach(function(sep) {
+      var parts = scoped.split(sep);
+      scoped = parts.map(function(p) {
+        var t = p.trim();
+        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {
+          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')
+        }
+        return p;
+      }).join(sep);
+    });
+    return scoped;
+  },
+  propertiesFromRule: function(rule) {
+    var properties = rule.style.cssText;
+    // TODO(sorvell): Chrome cssom incorrectly removes quotes from the content
+    // property. (https://code.google.com/p/chromium/issues/detail?id=247231)
+    if (rule.style.content && !rule.style.content.match(/['"]+/)) {
+      properties = 'content: \'' + rule.style.content + '\';\n' +
+        rule.style.cssText.replace(/content:[^;]*;/g, '');
+    }
+    return properties;
+  }
+};
+
+var hostRuleRe = /@host[^{]*{(([^}]*?{[^{]*?}[\s\S]*?)+)}/gim,
+    selectorRe = /([^{]*)({[\s\S]*?})/gim,
+    hostElementRe = /(.*)((?:\*)|(?:\:scope))(.*)/,
+    hostFixableRe = /^[.\[:]/,
+    cssCommentRe = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,
+    cssPolyfillCommentRe = /\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,
+    cssPseudoRe = /::(x-[^\s{,(]*)/gim,
+    selectorReSuffix = '([>\\s~+\[.,{:][\\s\\S]*)?$',
+    hostRe = /@host/gim;
+
+function stylesToCssText(styles, preserveComments) {
+  var cssText = '';
+  Array.prototype.forEach.call(styles, function(s) {
+    cssText += s.textContent + '\n\n';
+  });
+  // strip comments for easier processing
+  if (!preserveComments) {
+    cssText = cssText.replace(cssCommentRe, '');
+  }
+  return cssText;
+}
+
+function cssToRules(cssText) {
+  var style = document.createElement('style');
+  style.textContent = cssText;
+  document.head.appendChild(style);
+  var rules = style.sheet.cssRules;
+  style.parentNode.removeChild(style);
+  return rules;
+}
+
+function rulesToCss(cssRules) {
+  for (var i=0, css=[]; i < cssRules.length; i++) {
+    css.push(cssRules[i].cssText);
+  }
+  return css.join('\n\n');
+}
+
+function addCssToDocument(cssText) {
+  if (cssText) {
+    getSheet().appendChild(document.createTextNode(cssText));
+  }
+}
+
+var sheet;
+function getSheet() {
+  if (!sheet) {
+    sheet = document.createElement("style");
+    sheet.setAttribute('ShadowCSSShim', '');
+  }
+  return sheet;
+}
+
+// add polyfill stylesheet to document
+if (window.ShadowDOMPolyfill) {
+  addCssToDocument('style { display: none !important; }\n');
+  var head = document.querySelector('head');
+  head.insertBefore(getSheet(), head.childNodes[0]);
+}
+
+// exports
+scope.ShadowCSS = ShadowCSS;
+
+})(window.Platform);
\ No newline at end of file
diff --git a/pkg/shadow_dom/lib/src/platform/patches-shadow-css.js b/pkg/shadow_dom/lib/src/platform/patches-shadow-css.js
new file mode 100644
index 0000000..9525570
--- /dev/null
+++ b/pkg/shadow_dom/lib/src/platform/patches-shadow-css.js
@@ -0,0 +1,65 @@
+// 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.
+
+(function(scope) {
+  // TODO(terry): Remove shimShadowDOMStyling2 until wrap/unwrap from a
+  //              dart:html Element to a JS DOM node is available.
+  /**
+   * Given the content of a STYLE tag and the name of a component shim the CSS
+   * and return the new scoped CSS to replace the STYLE's content.  The content
+   * is replaced in Dart's implementation of PolymerElement.
+   */
+  function shimShadowDOMStyling2(styleContent, name) {
+    if (window.ShadowDOMPolyfill) {
+      var content = this.convertPolyfillDirectives(styleContent, name);
+
+      // applyShimming calls shimAtHost and shipScoping
+      // shimAtHost code:
+      var r = '', l=0, matches;
+      while (matches = hostRuleRe.exec(content)) {
+        r += content.substring(l, matches.index);
+        r += this.scopeHostCss(matches[1], name);
+        l = hostRuleRe.lastIndex;
+      }
+      r += content.substring(l, content.length);
+      var re = new RegExp('^' + name + selectorReSuffix, 'm');
+      var atHostCssText = rulesToCss(this.findAtHostRules(cssToRules(r), re));
+
+      // shimScoping code:
+      // strip comments for easier processing
+      content = content.replace(cssCommentRe, '');
+
+      content = this.convertPseudos(content);
+      var rules = cssToRules(content);
+      var cssText = this.scopeRules(rules, name);
+
+      return atHostCssText + cssText;
+    }
+  }
+
+  // Minimal copied code from ShadowCSS, that is not exposed in
+  // PlatForm.ShadowCSS (local code).
+  var hostRuleRe = /@host[^{]*{(([^}]*?{[^{]*?}[\s\S]*?)+)}/gim,
+    cssCommentRe = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,
+    selectorReSuffix = '([>\\s~+\[.,{:][\\s\\S]*)?$';
+
+  function cssToRules(cssText) {
+    var style = document.createElement('style');
+    style.textContent = cssText;
+    document.head.appendChild(style);
+    var rules = style.sheet.cssRules;
+    style.parentNode.removeChild(style);
+    return rules;
+  }
+
+  function rulesToCss(cssRules) {
+    for (var i=0, css=[]; i < cssRules.length; i++) {
+      css.push(cssRules[i].cssText);
+    }
+    return css.join('\n\n');
+  }
+
+  // exports
+  scope.ShadowCSS.shimShadowDOMStyling2 = shimShadowDOMStyling2;
+})(window.Platform);
diff --git a/pkg/shadow_dom/lib/src/platform/patches-shadowdom-polyfill-before.js b/pkg/shadow_dom/lib/src/platform/patches-shadowdom-polyfill-before.js
new file mode 100644
index 0000000..fe15015
--- /dev/null
+++ b/pkg/shadow_dom/lib/src/platform/patches-shadowdom-polyfill-before.js
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function() {
+  // TODO(jmesserly): fix dart:html to use unprefixed name
+  if (Element.prototype.webkitCreateShadowRoot) {
+    Element.prototype.webkitCreateShadowRoot = function() {
+      return window.ShadowDOMPolyfill.wrapIfNeeded(this).createShadowRoot();
+    };
+  }
+})();
diff --git a/pkg/shadow_dom/lib/src/platform/patches-shadowdom-polyfill.js b/pkg/shadow_dom/lib/src/platform/patches-shadowdom-polyfill.js
new file mode 100644
index 0000000..cafb597
--- /dev/null
+++ b/pkg/shadow_dom/lib/src/platform/patches-shadowdom-polyfill.js
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function() {
+  var ShadowDOMPolyfill = window.ShadowDOMPolyfill;
+  var wrap = ShadowDOMPolyfill.wrap;
+
+  // patch in prefixed name
+  Object.defineProperties(HTMLElement.prototype, {
+    //TODO(sjmiles): review accessor alias with Arv
+    webkitShadowRoot: {
+      get: function() {
+        return this.shadowRoot;
+      }
+    }
+  });
+
+  //TODO(sjmiles): review method alias with Arv
+  HTMLElement.prototype.webkitCreateShadowRoot =
+      HTMLElement.prototype.createShadowRoot;
+
+  // TODO(jmesserly): we need to wrap document somehow (a dart:html hook?)
+  window.dartExperimentalFixupGetTag = function(originalGetTag) {
+    var NodeList = ShadowDOMPolyfill.wrappers.NodeList;
+    var ShadowRoot = ShadowDOMPolyfill.wrappers.ShadowRoot;
+    var isWrapper = ShadowDOMPolyfill.isWrapper;
+    var unwrap = ShadowDOMPolyfill.unwrap;
+    function getTag(obj) {
+      if (obj instanceof NodeList) return 'NodeList';
+      if (obj instanceof ShadowRoot) return 'ShadowRoot';
+      if (obj instanceof MutationRecord) return 'MutationRecord';
+      if (obj instanceof MutationObserver) return 'MutationObserver';
+
+      if (isWrapper(obj)) {
+        obj = unwrap(obj);
+
+        // Fix up class names for Firefox. For some of them like
+        // HTMLFormElement and HTMLInputElement, the "constructor" property of
+        // the unwrapped nodes points at the wrapper for some reason.
+        // TODO(jmesserly): figure out why this is happening.
+        var ctor = obj.constructor;
+        if (ctor && ctor._ShadowDOMPolyfill$isGeneratedWrapper) {
+          var name = ctor._ShadowDOMPolyfill$cacheTag_;
+          if (!name) {
+            name = Object.prototype.toString.call(obj);
+            name = name.substring(8, name.length - 1);
+            ctor._ShadowDOMPolyfill$cacheTag_ = name;
+          }
+          return name;
+        }
+      }
+      return originalGetTag(obj);
+    }
+
+    return getTag;
+  };
+})();
diff --git a/pkg/shadow_dom/lib/src/platform/platform-init.js b/pkg/shadow_dom/lib/src/platform/platform-init.js
new file mode 100644
index 0000000..4e83afc
--- /dev/null
+++ b/pkg/shadow_dom/lib/src/platform/platform-init.js
@@ -0,0 +1,5 @@
+// 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.
+
+var Platform = {};
diff --git a/pkg/shadow_dom/test/runner.html b/pkg/shadow_dom/test/runner.html
new file mode 100644
index 0000000..83dd0ee
--- /dev/null
+++ b/pkg/shadow_dom/test/runner.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<!--
+Copyright 2012 The Polymer Authors. All rights reserved.
+Use of this source code is governed by a BSD-style
+license that can be found in the LICENSE file.
+-->
+<meta charset="utf-8">
+<link rel="stylesheet" href="../tool/node_modules/mocha/mocha.css">
+<script src="../tool/node_modules/chai/chai.js"></script>
+<script src="../tool/node_modules/mocha/mocha.js"></script>
+<script src="../tools/test/mocha-htmltest.js"></script>
+<script src="../tool/shadowdom.js"></script>
+<script src="../../../third_party/polymer/ShadowDOM/test/test.main.js"></script>
+<div id="mocha"></div>
+<script>
+mocha.run();
+</script>
diff --git a/pkg/shadow_dom/test/runner.min.html b/pkg/shadow_dom/test/runner.min.html
new file mode 100644
index 0000000..6c45525
--- /dev/null
+++ b/pkg/shadow_dom/test/runner.min.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<!--
+Copyright 2012 The Polymer Authors. All rights reserved.
+Use of this source code is governed by a BSD-style
+license that can be found in the LICENSE file.
+-->
+<meta charset="utf-8">
+<link rel="stylesheet" href="../tool/node_modules/mocha/mocha.css">
+<script src="../tool/node_modules/chai/chai.js"></script>
+<script src="../tool/node_modules/mocha/mocha.js"></script>
+<script src="../tools/test/mocha-htmltest.js"></script>
+<script src="../tool/shadowdom.min.js"></script>
+<script src="../../../third_party/polymer/ShadowDOM/test/test.main.js"></script>
+<div id="mocha"></div>
+<script>
+mocha.run();
+</script>
+
diff --git a/pkg/shadow_dom/tool/build/else.js b/pkg/shadow_dom/tool/build/else.js
new file mode 100644
index 0000000..dacd762
--- /dev/null
+++ b/pkg/shadow_dom/tool/build/else.js
@@ -0,0 +1 @@
+} else {
\ No newline at end of file
diff --git a/pkg/shadow_dom/tool/build/end-if.js b/pkg/shadow_dom/tool/build/end-if.js
new file mode 100644
index 0000000..ff30235
--- /dev/null
+++ b/pkg/shadow_dom/tool/build/end-if.js
@@ -0,0 +1 @@
+}
\ No newline at end of file
diff --git a/pkg/shadow_dom/tool/build/if-poly.js b/pkg/shadow_dom/tool/build/if-poly.js
new file mode 100644
index 0000000..7503d65
--- /dev/null
+++ b/pkg/shadow_dom/tool/build/if-poly.js
@@ -0,0 +1,3 @@
+if ((!HTMLElement.prototype.createShadowRoot &&
+    !HTMLElement.prototype.webkitCreateShadowRoot) ||
+    window.__forceShadowDomPolyfill) {
diff --git a/pkg/shadow_dom/tool/conf/karma.conf.js b/pkg/shadow_dom/tool/conf/karma.conf.js
new file mode 100644
index 0000000..382e2c7
--- /dev/null
+++ b/pkg/shadow_dom/tool/conf/karma.conf.js
@@ -0,0 +1,89 @@
+// Sample Karma configuration file, that contain pretty much all the available options
+// It's used for running client tests on Travis (http://travis-ci.org/#!/karma-runner/karma)
+// Most of the options can be overriden by cli arguments (see karma --help)
+//
+// For all available config options and default values, see:
+// https://github.com/karma-runner/karma/blob/stable/lib/config.js#L54
+
+
+// base path, that will be used to resolve files and exclude
+basePath = '../';
+
+// list of files / patterns to load in the browser
+files = [
+  'tools/test/mocha-htmltest.js',
+  'conf/mocha.conf.js',
+  'node_modules/chai/chai.js',
+  'shadowdom.js',
+  'test/test.main.js',
+  {pattern: 'src/**/*.js', included: false},
+  {pattern: 'test/**/*.js', included: false},
+  {pattern: 'test/**/*.html', included: false},
+  {pattern: 'tools/**/*.js', included: false}
+];
+
+// list of files to exclude
+exclude = [];
+
+frameworks = ['mocha'];
+
+// use dots reporter, as travis terminal does not support escaping sequences
+// possible values: 'dots', 'progress', 'junit', 'teamcity'
+// CLI --reporters progress
+reporters = ['progress'];
+
+// web server port
+// CLI --port 9876
+port = 9876;
+
+// cli runner port
+// CLI --runner-port 9100
+runnerPort = 9100;
+
+// enable / disable colors in the output (reporters and logs)
+// CLI --colors --no-colors
+colors = true;
+
+// level of logging
+// possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
+// CLI --log-level debug
+logLevel = LOG_INFO;
+
+// enable / disable watching file and executing tests whenever any file changes
+// CLI --auto-watch --no-auto-watch
+autoWatch = true;
+
+// Start these browsers, currently available:
+// - Chrome
+// - ChromeCanary
+// - Firefox
+// - Opera
+// - Safari (only Mac)
+// - PhantomJS
+// - IE (only Windows)
+// CLI --browsers Chrome,Firefox,Safari
+browsers = ['ChromeCanary'];
+
+// If browser does not capture in given timeout [ms], kill it
+// CLI --capture-timeout 5000
+captureTimeout = 50000;
+
+// Auto run tests on start (when browsers are captured) and exit
+// CLI --single-run --no-single-run
+singleRun = true;
+
+// report which specs are slower than 500ms
+// CLI --report-slower-than 500
+reportSlowerThan = 500;
+
+// compile coffee scripts
+preprocessors = {
+};
+
+plugins = [
+  'karma-mocha',
+  'karma-chrome-launcher',
+  'karma-firefox-launcher',
+  'karma-script-launcher',
+  'karma-crbot-reporter'
+]
diff --git a/pkg/shadow_dom/tool/conf/mocha.conf.js b/pkg/shadow_dom/tool/conf/mocha.conf.js
new file mode 100644
index 0000000..11dd0d6
--- /dev/null
+++ b/pkg/shadow_dom/tool/conf/mocha.conf.js
@@ -0,0 +1 @@
+mocha.setup({ui:'tdd',htmlbase: '/base/test/'});
diff --git a/pkg/shadow_dom/tool/gruntfile.js b/pkg/shadow_dom/tool/gruntfile.js
new file mode 100644
index 0000000..f245d73
--- /dev/null
+++ b/pkg/shadow_dom/tool/gruntfile.js
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+module.exports = function(grunt) {
+  ShadowDOMPolyfill = [
+    'sidetable.js',
+    'wrappers.js',
+    'wrappers/events.js',
+    'wrappers/NodeList.js',
+    'wrappers/Node.js',
+    'querySelector.js',
+    'wrappers/node-interfaces.js',
+    'wrappers/CharacterData.js',
+    'wrappers/Element.js',
+    'wrappers/HTMLElement.js',
+    'wrappers/HTMLContentElement.js',
+    'wrappers/HTMLShadowElement.js',
+    'wrappers/HTMLTemplateElement.js',
+    'wrappers/HTMLUnknownElement.js',
+    'wrappers/generic.js',
+    'wrappers/ShadowRoot.js',
+    'ShadowRenderer.js',
+    'wrappers/Document.js',
+    'wrappers/Window.js',
+    'wrappers/MutationObserver.js',
+    'wrappers/override-constructors.js'
+  ];
+  ShadowDOMPolyfill = ShadowDOMPolyfill.map(function(p) {
+    return '../../../third_party/polymer/ShadowDOM/src/' + p;
+  });
+
+  // Apply partial patch from Polymer/Platform, dart2js, CSS
+  // polyfill from platform and dart2js CSS patches:
+  ShadowDOMPolyfill.unshift(
+    '../lib/src/platform/patches-shadowdom-polyfill-before.js'
+    );
+  ShadowDOMPolyfill.push(
+    '../lib/src/platform/patches-shadowdom-polyfill.js',
+    '../lib/src/platform/platform-init.js',
+    '../lib/src/platform/ShadowCSS.js',
+    '../lib/src/platform/patches-shadow-css.js'
+    );
+
+  // Only load polyfill if not natively present.
+  ConditionalShadowDOM = [].concat(
+    'build/if-poly.js',
+    ShadowDOMPolyfill,
+    'build/end-if.js'
+  );
+
+  // karma setup
+  var browsers;
+  (function() {
+    try {
+      var config = grunt.file.readJSON('local.json');
+      if (config.browsers) {
+        browsers = config.browsers;
+      }
+    } catch (e) {
+      var os = require('os');
+      browsers = ['Chrome', 'Firefox'];
+      if (os.type() === 'Darwin') {
+        browsers.push('ChromeCanary');
+      }
+      if (os.type() === 'Windows_NT') {
+        browsers.push('IE');
+      }
+    }
+  })();
+  grunt.initConfig({
+    karma: {
+      options: {
+        configFile: 'conf/karma.conf.js',
+        keepalive: true,
+        browsers: browsers
+      },
+      buildbot: {
+        browsers: browsers,
+        reporters: ['crbot'],
+        logLevel: 'OFF'
+      },
+      ShadowDOM: {
+        browsers: browsers
+      }
+    },
+    concat: {
+      ShadowDOM: {
+        src: ConditionalShadowDOM,
+        dest: '../lib/shadow_dom.debug.js',
+        nonull: true
+      }
+    },
+    uglify: {
+      ShadowDOM: {
+        options: {
+          compress: {
+            // TODO(sjmiles): should be false by default (?)
+            // https://github.com/mishoo/UglifyJS2/issues/165
+            unsafe: false
+          }
+          //compress: true, Xmangle: true, beautify: true, unsafe: false
+        },
+        files: {
+          '../lib/shadow_dom.min.js': ['../lib/shadow_dom.debug.js']
+        }
+      }
+    },
+
+    yuidoc: {
+      compile: {
+        name: '<%= pkg.name %>',
+        description: '<%= pkg.description %>',
+        version: '<%= pkg.version %>',
+        url: '<%= pkg.homepage %>',
+        options: {
+          exclude: 'third_party',
+          paths: '.',
+          outdir: 'docs',
+          linkNatives: 'true',
+          tabtospace: 2,
+          themedir: '../docs/doc_themes/simple'
+        }
+      }
+    },
+    pkg: grunt.file.readJSON('package.json')
+  });
+
+  // plugins
+  grunt.loadNpmTasks('grunt-contrib-concat');
+  grunt.loadNpmTasks('grunt-contrib-uglify');
+  grunt.loadNpmTasks('grunt-contrib-yuidoc');
+  grunt.loadNpmTasks('grunt-karma-0.9.1');
+
+  // tasks
+  grunt.registerTask('default', ['concat', 'uglify']);
+  grunt.registerTask('minify', ['concat', 'uglify']);
+  grunt.registerTask('docs', ['yuidoc']);
+  grunt.registerTask('test', ['karma:ShadowDOM']);
+  grunt.registerTask('test-buildbot', ['karma:buildbot']);
+};
+
diff --git a/pkg/shadow_dom/tool/package.json b/pkg/shadow_dom/tool/package.json
new file mode 100644
index 0000000..766ca28
--- /dev/null
+++ b/pkg/shadow_dom/tool/package.json
@@ -0,0 +1,16 @@
+{
+  "name": "ShadowDOM",
+  "version": "0.0.1",
+  "devDependencies": {
+    "mocha": ">=1.9",
+    "chai": "*",
+    "grunt": "*",
+    "grunt-contrib-concat": "*",
+    "grunt-contrib-uglify": "*",
+    "grunt-contrib-yuidoc": "~0.4.0",
+    "grunt-karma-0.9.1": "~0.4.3",
+    "karma-mocha": "*",
+    "karma-script-launcher": "*",
+    "karma-crbot-reporter": "*"
+  }
+}
diff --git a/pkg/shadow_dom/tool/play.html b/pkg/shadow_dom/tool/play.html
new file mode 100644
index 0000000..f17b471
--- /dev/null
+++ b/pkg/shadow_dom/tool/play.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<!--
+Copyright 2012 The Polymer Authors. All rights reserved.
+Use of this source code is goverened by a BSD-style
+license that can be found in the LICENSE file.
+-->
+<meta charset="utf-8">
+<script src="shadowdom.js"></script>
+<style>
+
+.el,
+.sr {
+  height: 300px;
+  width: 300px;
+}
+
+</style>
+<textarea class="el" placeholder="Element host"></textarea>
+<textarea class="sr" placeholder="Shadow Root"></textarea>
+<button onclick="update()">Update</button>
+
+<div class="test">Real</div>
+
+<script>
+
+var el = document.querySelector('.test');
+var sr = el.createShadowRoot();
+
+sr.innerHTML = 'Before <content></content> After';
+
+function update() {
+  el.innerHTML = document.querySelector('.el').value;
+  sr.innerHTML = document.querySelector('.sr').value;
+}
+
+document.querySelector('.el').value = el.innerHTML;
+document.querySelector('.sr').value = sr.innerHTML;
+
+</script>
diff --git a/pkg/shadow_dom/tool/readme.txt b/pkg/shadow_dom/tool/readme.txt
new file mode 100644
index 0000000..829c697
--- /dev/null
+++ b/pkg/shadow_dom/tool/readme.txt
@@ -0,0 +1,18 @@
+How to build shadow_dom package:
+
+- Install nodejs and npm
+     sudo apt-get install nodejs
+     sudo apt-get install npm
+- Install grunt http://gruntjs.com/getting-started
+
+- Change to the shadow_dom tool directory
+     cd pkg/shadow_dom/tool
+
+- Install project dependencies
+     npm install
+
+- Run grunt to generate the shadow_dom packages in pkg/shadow_dom/lib
+     grunt
+
+
+
diff --git a/pkg/shadow_dom/tool/shadowdom.js b/pkg/shadow_dom/tool/shadowdom.js
new file mode 100644
index 0000000..91f5819
--- /dev/null
+++ b/pkg/shadow_dom/tool/shadowdom.js
@@ -0,0 +1,44 @@
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function() {
+  var thisFile = 'shadowdom.js';
+  var base = '';
+  Array.prototype.forEach.call(document.querySelectorAll('script[src]'), function(s) {
+    var src = s.getAttribute('src');
+    var re = new RegExp(thisFile + '[^\\\\]*');
+    var match = src.match(re);
+    if (match) {
+      base = src.slice(0, -match[0].length);
+    }
+  });
+  base += '../../../third_party/polymer/ShadowDOM/src/';
+
+  [
+    'sidetable.js',
+    'wrappers.js',
+    'wrappers/events.js',
+    'wrappers/NodeList.js',
+    'wrappers/Node.js',
+    'querySelector.js',
+    'wrappers/node-interfaces.js',
+    'wrappers/CharacterData.js',
+    'wrappers/Element.js',
+    'wrappers/HTMLElement.js',
+    'wrappers/HTMLContentElement.js',
+    'wrappers/HTMLShadowElement.js',
+    'wrappers/HTMLTemplateElement.js',
+    'wrappers/HTMLUnknownElement.js',
+    'wrappers/generic.js',
+    'wrappers/ShadowRoot.js',
+    'ShadowRenderer.js',
+    'wrappers/Document.js',
+    'wrappers/Window.js',
+    'wrappers/MutationObserver.js',
+    'wrappers/override-constructors.js'
+  ].forEach(function(src) {
+    document.write('<script src="' + base + src + '"></script>');
+  });
+
+})();
diff --git a/pkg/unittest/lib/html_config.dart b/pkg/unittest/lib/html_config.dart
index 86123cf..2dde44b 100644
--- a/pkg/unittest/lib/html_config.dart
+++ b/pkg/unittest/lib/html_config.dart
@@ -95,7 +95,7 @@
                .replaceAll('>','&gt;');
 }
 
-class HtmlConfiguration extends Configuration {
+class HtmlConfiguration extends SimpleConfiguration {
   /** Whether this is run within dartium layout tests. */
   final bool _isLayoutTest;
   HtmlConfiguration(this._isLayoutTest);
diff --git a/pkg/unittest/lib/html_enhanced_config.dart b/pkg/unittest/lib/html_enhanced_config.dart
index 5cc5fe5..723fc0c 100644
--- a/pkg/unittest/lib/html_enhanced_config.dart
+++ b/pkg/unittest/lib/html_enhanced_config.dart
@@ -15,7 +15,7 @@
 import 'dart:html';
 import 'unittest.dart';
 
-class HtmlEnhancedConfiguration extends Configuration {
+class HtmlEnhancedConfiguration extends SimpleConfiguration {
   /** Whether this is run within dartium layout tests. */
   final bool _isLayoutTest;
   HtmlEnhancedConfiguration(this._isLayoutTest);
diff --git a/pkg/unittest/lib/interactive_html_config.dart b/pkg/unittest/lib/interactive_html_config.dart
index 106b071..27791ee 100644
--- a/pkg/unittest/lib/interactive_html_config.dart
+++ b/pkg/unittest/lib/interactive_html_config.dart
@@ -64,7 +64,7 @@
 }
 
 
-class HtmlConfiguration extends Configuration {
+class HtmlConfiguration extends SimpleConfiguration {
   StreamSubscription _errorSubscription;
 
   void _installErrorHandler() {
diff --git a/pkg/unittest/lib/src/configuration.dart b/pkg/unittest/lib/src/configuration.dart
new file mode 100644
index 0000000..4571b90
--- /dev/null
+++ b/pkg/unittest/lib/src/configuration.dart
@@ -0,0 +1,76 @@
+// 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 unittest;
+
+/**
+ * Describes the interface used by the unit test system for communicating the
+ * results of a test run.
+ */
+abstract class Configuration {
+
+  /**
+   * Creates an instance of [SimpleConfiguration].
+   */
+  factory Configuration() => new SimpleConfiguration();
+
+  /**
+   * If [true], tests are started automatically. Otherwise [runTests]
+   * must be called explicitly after tests are set up.
+   */
+  bool get autoStart;
+
+  /**
+   * Called as soon as the unittest framework becomes initialized. This is done
+   * even before tests are added to the test framework. It might be used to
+   * determine/debug errors that occur before the test harness starts executing.
+   * It is also used to tell the vm or browser that tests are going to be run
+   * asynchronously and that the process should wait until they are done.
+   */
+  void onInit();
+
+  /** Called as soon as the unittest framework starts running. */
+  void onStart() {}
+
+  /**
+   * Called when each test starts. Useful to show intermediate progress on
+   * a test suite.
+   */
+  void onTestStart(TestCase testCase);
+
+  /**
+   * Called when each test is first completed. Useful to show intermediate
+   * progress on a test suite.
+   */
+  void onTestResult(TestCase testCase);
+
+  /**
+   * Called when an already completed test changes state. For example: a test
+   * that was marked as passing may later be marked as being in error because
+   * it still had callbacks being invoked.
+   */
+  void onTestResultChanged(TestCase testCase);
+
+  /**
+   * Handles the logging of messages by a test case.
+   */
+  void onLogMessage(TestCase testCase, String message);
+
+  /**
+   * Called when the unittest framework is done running. [success] indicates
+   * whether all tests passed successfully.
+   */
+  void onDone(bool success);
+
+  /**
+   * Called with the result of all test cases. Browser tests commonly override
+   * this to reformat the output.
+   *
+   * When [uncaughtError] is not null, it contains an error that occured outside
+   * of tests (e.g. setting up the test).
+   */
+  void onSummary(int passed, int failed, int errors, List<TestCase> results,
+      String uncaughtError);
+}
+
diff --git a/pkg/unittest/lib/src/expect.dart b/pkg/unittest/lib/src/expect.dart
index 0df9068..76151c0 100644
--- a/pkg/unittest/lib/src/expect.dart
+++ b/pkg/unittest/lib/src/expect.dart
@@ -5,15 +5,12 @@
 part of matcher;
 
 /** The objects thrown by the default failure handler. */
-class TestFailure {
-  String _message;
+class TestFailure extends Error {
+  final String message;
 
-  get message => _message;
-  set message(String value) => _message = value;
+  TestFailure(this.message);
 
-  TestFailure(String message) : _message = message;
-
-  String toString() => _message;
+  String toString() => message;
 }
 
 /**
@@ -30,7 +27,7 @@
 /**
  * Some matchers, like those for Futures and exception testing,
  * can fail in asynchronous sections, and throw exceptions.
- * A user of this library will typically want to catch and handle 
+ * A user of this library will typically want to catch and handle
  * such exceptions. The [wrapAsync] property is a function that
  * can wrap callbacks used by these Matchers so that they can be
  * used safely. For example, the unittest library will set this
diff --git a/pkg/unittest/lib/src/config.dart b/pkg/unittest/lib/src/simple_configuration.dart
similarity index 79%
rename from pkg/unittest/lib/src/config.dart
rename to pkg/unittest/lib/src/simple_configuration.dart
index d79306f..b9d3a02 100644
--- a/pkg/unittest/lib/src/config.dart
+++ b/pkg/unittest/lib/src/simple_configuration.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -7,9 +7,9 @@
 // A custom failure handler for [expect] that routes expect failures
 // to the config.
 class _ExpectFailureHandler extends DefaultFailureHandler {
-  Configuration _config;
+  final SimpleConfiguration _config;
 
-  _ExpectFailureHandler(this._config) : super();
+  _ExpectFailureHandler(this._config);
 
   void fail(String reason) {
     _config.onExpectFailure(reason);
@@ -22,8 +22,7 @@
  * advantage of the platform can create a subclass and override methods from
  * this class.
  */
-
-class Configuration {
+class SimpleConfiguration implements Configuration {
   // The VM won't shut down if a receive port is open. Use this to make sure
   // we correctly wait for asynchronous tests.
   ReceivePort _receivePort;
@@ -35,11 +34,7 @@
    */
   final String name = 'Configuration';
 
-  /**
-   * If true, then tests are started automatically (otherwise [runTests]
-   * must be called explicitly after the tests are set up.
-   */
-  final bool autoStart = true;
+  bool get autoStart => true;
 
   /**
    * If true (the default), throw an exception at the end if any tests failed.
@@ -61,22 +56,15 @@
    * The constructor sets up a failure handler for [expect] that redirects
    * [expect] failures to [onExpectFailure].
    */
-  Configuration() {
+  SimpleConfiguration() {
     configureExpectFailureHandler(new _ExpectFailureHandler(this));
   }
-  /**
-   * Called as soon as the unittest framework becomes initialized. This is done
-   * even before tests are added to the test framework. It might be used to
-   * determine/debug errors that occur before the test harness starts executing.
-   * It is also used to tell the vm or browser that tests are going to be run
-   * asynchronously and that the process should wait until they are done.
-   */
+
   void onInit() {
     _receivePort = new ReceivePort();
     _postMessage('unittest-suite-wait-for-done');
   }
 
-  /** Called as soon as the unittest framework starts running. */
   void onStart() {}
 
   /**
@@ -91,7 +79,7 @@
 
   /**
    * Called when each test is first completed. Useful to show intermediate
-   * progress on a test suite. Derived classes should call this first 
+   * progress on a test suite. Derived classes should call this first
    * before their own override code.
    */
   void onTestResult(TestCase testCase) {
@@ -112,25 +100,20 @@
       if (testCase.result == PASS) {
         testCase._result = FAIL;
         testCase._message = reason.toString();
-        // Use the last stack as the overall failure stack.    
+        // Use the last stack as the overall failure stack.
         testCase._stackTrace = lastReasonAndTrace.last;
       } else {
         // Add the last stack to the message; we have a further stack
         // caused by some other failure.
         reason.write(lastReasonAndTrace.last);
         reason.write('\n');
-        // Add the existing reason to the end of the expect log to 
+        // Add the existing reason to the end of the expect log to
         // create the final message.
         testCase._message = '${reason.toString()}\n${testCase._message}';
       }
     }
   }
 
-  /**
-   * Called when an already completed test changes state; for example a test
-   * that was marked as passing may later be marked as being in error because
-   * it still had callbacks being invoked.
-   */
   void onTestResultChanged(TestCase testCase) {
     assert(testCase != null);
   }
@@ -159,7 +142,7 @@
       }
     }
   }
-  
+
   /**
    * Format a test result.
    */
@@ -213,10 +196,6 @@
     }
   }
 
-  /**
-   * Called when the unittest framework is done running. [success] indicates
-   * whether all tests passed successfully.
-   */
   void onDone(bool success) {
     if (success) {
       _postMessage('unittest-suite-success');
@@ -229,13 +208,7 @@
     }
   }
 
-  /** Handle errors that happen outside the tests. */
-  // TODO(vsm): figure out how to expose the stack trace here
-  // Currently e.message works in dartium, but not in dartc.
-  void handleExternalError(e, String message, [stack]) =>
-      _reportTestError('$message\nCaught $e', stack);
-
-  _postMessage(String message) {
+  void _postMessage(String message) {
     // In dart2js browser tests, the JavaScript-based test controller
     // intercepts calls to print and listens for "secret" messages.
     print(message);
diff --git a/pkg/unittest/lib/unittest.dart b/pkg/unittest/lib/unittest.dart
index 43365f4..eb186bd 100644
--- a/pkg/unittest/lib/unittest.dart
+++ b/pkg/unittest/lib/unittest.dart
@@ -146,13 +146,15 @@
 import 'dart:async';
 import 'dart:collection';
 import 'dart:isolate';
+import 'package:stack_trace/stack_trace.dart';
+
 import 'matcher.dart';
 export 'matcher.dart';
 
-import 'package:stack_trace/stack_trace.dart';
-
 import 'src/utils.dart';
-part 'src/config.dart';
+
+part 'src/configuration.dart';
+part 'src/simple_configuration.dart';
 part 'src/test_case.dart';
 
 Configuration _config;
@@ -656,16 +658,16 @@
   _runTest();
 }
 
-/**
- * Utility function that can be used to notify the test framework that an
- *  error was caught outside of this library.
- */
-void _reportTestError(String msg, trace) {
- if (_currentTestCaseIndex < testCases.length) {
-    final testCase = testCases[_currentTestCaseIndex];
-    testCase.error(msg, trace);
+/** Handle errors that happen outside the tests. */
+// TODO(vsm): figure out how to expose the stack trace here
+// Currently e.message works in dartium, but not in dartc.
+void handleExternalError(e, String message, [stack]) {
+  var msg = '$message\nCaught $e';
+
+  if (currentTestCase != null) {
+    currentTestCase.error(msg, stack);
   } else {
-    _uncaughtErrorMessage = "$msg: $trace";
+    _uncaughtErrorMessage = "$msg: $stack";
   }
 }
 
diff --git a/pkg/unittest/lib/vm_config.dart b/pkg/unittest/lib/vm_config.dart
index 7ff2154..0133186 100644
--- a/pkg/unittest/lib/vm_config.dart
+++ b/pkg/unittest/lib/vm_config.dart
@@ -11,7 +11,7 @@
 import 'dart:io';
 import 'unittest.dart';
 
-class VMConfiguration extends Configuration {
+class VMConfiguration extends SimpleConfiguration {
   // Color constants used for generating messages.
   final String GREEN_COLOR = '\u001b[32m';
   final String RED_COLOR = '\u001b[31m';
diff --git a/pkg/unittest/test/unittest_test_utils.dart b/pkg/unittest/test/unittest_test_utils.dart
index 7b171f1..03fc8d6 100644
--- a/pkg/unittest/test/unittest_test_utils.dart
+++ b/pkg/unittest/test/unittest_test_utils.dart
@@ -33,7 +33,7 @@
       '$setup:$teardown:$uncaughtError$testDetails';
 }
 
-class TestConfiguration extends Configuration {
+class TestConfiguration extends SimpleConfiguration {
 
   // Some test state that is captured.
   int count = 0; // A count of callbacks.
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index 700eed7..2cc50c3 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -77,6 +77,7 @@
 
 // Are we running on Windows?
 var _isWindows = false;
+var _workingWindowsDrivePrefix;
 // The current working directory
 var _workingDirectoryUri;
 // The URI that the entry point script was loaded from. Remembered so that
@@ -115,6 +116,7 @@
   return fixedPath;
 }
 
+
 _enforceTrailingSlash(uri) {
   // Ensure we have a trailing slash character.
   if (!uri.endsWith('/')) {
@@ -124,7 +126,19 @@
 }
 
 
+_extractDriveLetterPrefix(cwd) {
+  if (!_isWindows) {
+    return null;
+  }
+  if (cwd.length > 1 && cwd[1] == ':') {
+    return '/${cwd[0]}:';
+  }
+  return null;
+}
+
+
 void _setWorkingDirectory(cwd) {
+  _workingWindowsDrivePrefix = _extractDriveLetterPrefix(cwd);
   cwd = _sanitizeWindowsPath(cwd);
   cwd = _enforceTrailingSlash(cwd);
   _workingDirectoryUri = new Uri(scheme: 'file', path: cwd);
@@ -227,8 +241,20 @@
     throw "URIs using the 'file:' scheme may not contain a host.";
   }
 
-  _logResolution('# Path: $uri -> ${uri.path}');
-  return uri.path;
+  String path = uri.path;
+  _logResolution('# Path: $uri -> ${path}');
+  // Check that the path is not already in the form of /X:.
+  if (_isWindows && (path.length > 2) && path.startsWith('/') &&
+      (path[2] != ':')) {
+    // Absolute path on Windows without a drive letter.
+    if (_workingWindowsDrivePrefix == null) {
+      throw 'Could not determine windows drive letter prefix.';
+    }
+    _logResolution('# Path: Windows absolute path needs a drive letter.'
+                   ' Prepending $_workingWindowsDrivePrefix.');
+    path = '$_workingWindowsDrivePrefix$path';
+  }
+  return path;
 }
 
 
diff --git a/runtime/bin/io_natives.cc b/runtime/bin/io_natives.cc
index a5c7170..ff790d6 100644
--- a/runtime/bin/io_natives.cc
+++ b/runtime/bin/io_natives.cc
@@ -51,12 +51,7 @@
   V(SecureSocket_RegisterBadCertificateCallback, 2)                            \
   V(SecureSocket_RegisterHandshakeCompleteCallback, 2)                         \
   V(SecureSocket_Renegotiate, 4)                                               \
-  V(SecureSocket_InitializeLibrary, 4)                                         \
-  V(SecureSocket_AddCertificate, 2)                                            \
-  V(SecureSocket_ChangeTrust, 2)                                               \
-  V(SecureSocket_ImportCertificatesWithPrivateKeys, 2)                         \
-  V(SecureSocket_GetCertificate, 1)                                            \
-  V(SecureSocket_RemoveCertificate, 1)                                         \
+  V(SecureSocket_InitializeLibrary, 3)                                         \
   V(SecureSocket_NewServicePort, 0)                                            \
   V(SecureSocket_FilterPointer, 1)                                             \
   V(ServerSocket_CreateBindListen, 5)                                          \
diff --git a/runtime/bin/net/nss.gyp b/runtime/bin/net/nss.gyp
index dbc685a..e1c64e1 100644
--- a/runtime/bin/net/nss.gyp
+++ b/runtime/bin/net/nss.gyp
@@ -17,7 +17,6 @@
   'variables': {
     # Added by Dart.
     'nss_directory': '../../../third_party/nss',
-    'pkcs12_directory': '../../../third_party/nss_pkcs12',
     'conditions': [
       ['OS=="ios"', {
         'exclude_nss_root_certs%': 0,
@@ -1069,19 +1068,6 @@
         '<(nss_directory)/nss/lib/util/utilpars.h',
         '<(nss_directory)/nss/lib/util/utilparst.h',
         '<(nss_directory)/nss/lib/util/utilrename.h',
-        '<(pkcs12_directory)/p12creat.c',
-        '<(pkcs12_directory)/p12d.c',
-        '<(pkcs12_directory)/p12dec.c',
-        '<(pkcs12_directory)/p12e.c',
-        '<(pkcs12_directory)/p12.h',
-        '<(pkcs12_directory)/p12local.c',
-        '<(pkcs12_directory)/p12local.h',
-        '<(pkcs12_directory)/p12plcy.c',
-        '<(pkcs12_directory)/p12plcy.h',
-        '<(pkcs12_directory)/p12t.h',
-        '<(pkcs12_directory)/p12tmpl.c',
-        '<(pkcs12_directory)/pkcs12.h',
-        '<(pkcs12_directory)/pkcs12t.h',
       ],
       'sources!': [
         # mpi_arm.c is included by mpi_arm_mac.c.
@@ -1147,7 +1133,6 @@
         '<(nss_directory)/nss/lib/softoken',
         '<(nss_directory)/nss/lib/ssl',
         '<(nss_directory)/nss/lib/util',
-        '<(pkcs12_directory)',
       ],
       'direct_dependent_settings': {
         'defines': [
@@ -1174,7 +1159,6 @@
           '<(nss_directory)/nss/lib/smime',
           '<(nss_directory)/nss/lib/softoken',
           '<(nss_directory)/nss/lib/util',
-          '<(pkcs12_directory)',
         ],
       },
       'msvs_disabled_warnings': [4018, 4101, 4267, ],
diff --git a/runtime/bin/secure_socket.cc b/runtime/bin/secure_socket.cc
index 2bfa94f..5038266 100644
--- a/runtime/bin/secure_socket.cc
+++ b/runtime/bin/secure_socket.cc
@@ -10,12 +10,9 @@
 #include <stdio.h>
 #include <string.h>
 
-#include <certdb.h>
 #include <key.h>
 #include <keyt.h>
 #include <nss.h>
-#include <p12.h>
-#include <p12plcy.h>
 #include <pk11pub.h>
 #include <prerror.h>
 #include <prinit.h>
@@ -40,10 +37,10 @@
 
 bool SSLFilter::library_initialized_ = false;
 // To protect library initialization.
-dart::Mutex* SSLFilter::mutex = new dart::Mutex();
+dart::Mutex* SSLFilter::mutex_ = new dart::Mutex();
 // The password is needed when creating secure server sockets.  It can
 // be null if only secure client sockets are used.
-char* SSLFilter::password_ = NULL;
+const char* SSLFilter::password_ = NULL;
 
 // Forward declaration.
 static void ProcessFilter(Dart_Port dest_port_id,
@@ -232,7 +229,7 @@
                                       &certificate_database));
   } else if (!Dart_IsNull(certificate_database_object)) {
     Dart_ThrowException(DartUtils::NewDartArgumentError(
-        "SecureSocket.initialize: database argument is not a String or null"));
+        "Non-String certificate directory argument to SetCertificateDatabase"));
   }
   // Leave certificate_database as NULL if no value was provided.
 
@@ -247,7 +244,7 @@
     password = "";
   } else {
     Dart_ThrowException(DartUtils::NewDartArgumentError(
-        "SecureSocket.initialize: password argument is not a String or null"));
+        "Password argument to SetCertificateDatabase is not a String or null"));
   }
 
   Dart_Handle builtin_roots_object =
@@ -258,322 +255,10 @@
     ThrowIfError(Dart_BooleanValue(builtin_roots_object, &builtin_roots));
   } else {
     Dart_ThrowException(DartUtils::NewDartArgumentError(
-        "SecureSocket.initialize: useBuiltinRoots argument is not a bool"));
+        "UseBuiltinRoots argument to SetCertificateDatabase is not a bool"));
   }
 
-  Dart_Handle read_only_object =
-      ThrowIfError(Dart_GetNativeArgument(args, 3));
-  // Check that the type is boolean, and get the boolean value from it.
-  bool read_only = true;
-  if (Dart_IsBoolean(read_only_object)) {
-    ThrowIfError(Dart_BooleanValue(read_only_object, &read_only));
-  } else {
-    Dart_ThrowException(DartUtils::NewDartArgumentError(
-        "SecureSocket.initialize: readOnly argument is not a bool"));
-  }
-
-  SSLFilter::InitializeLibrary(
-      certificate_database, password, builtin_roots, read_only);
-}
-
-
-static Dart_Handle X509FromCertificate(CERTCertificate* certificate) {
-  PRTime start_validity;
-  PRTime end_validity;
-  SECStatus status =
-      CERT_GetCertTimes(certificate, &start_validity, &end_validity);
-  if (status != SECSuccess) {
-    ThrowPRException("CertificateException",
-                     "Cannot get validity times from certificate");
-  }
-  int64_t start_epoch_ms = start_validity / PR_USEC_PER_MSEC;
-  int64_t end_epoch_ms = end_validity / PR_USEC_PER_MSEC;
-  Dart_Handle subject_name_object =
-      DartUtils::NewString(certificate->subjectName);
-  Dart_Handle issuer_name_object =
-      DartUtils::NewString(certificate->issuerName);
-  Dart_Handle start_epoch_ms_int = Dart_NewInteger(start_epoch_ms);
-  Dart_Handle end_epoch_ms_int = Dart_NewInteger(end_epoch_ms);
-
-  Dart_Handle date_type =
-      DartUtils::GetDartType(DartUtils::kCoreLibURL, "DateTime");
-  Dart_Handle from_milliseconds =
-      DartUtils::NewString("fromMillisecondsSinceEpoch");
-
-  Dart_Handle start_validity_date =
-      Dart_New(date_type, from_milliseconds, 1, &start_epoch_ms_int);
-  Dart_Handle end_validity_date =
-      Dart_New(date_type, from_milliseconds, 1, &end_epoch_ms_int);
-
-  Dart_Handle x509_type =
-      DartUtils::GetDartType(DartUtils::kIOLibURL, "X509Certificate");
-  Dart_Handle arguments[] = { subject_name_object,
-                              issuer_name_object,
-                              start_validity_date,
-                              end_validity_date };
-  return Dart_New(x509_type, Dart_Null(), 4, arguments);
-}
-
-
-char* PasswordCallback(PK11SlotInfo* slot, PRBool retry, void* arg) {
-  if (!retry) {
-    return PL_strdup(static_cast<char*>(arg));  // Freed by NSS internals.
-  }
-  return NULL;
-}
-
-
-void FUNCTION_NAME(SecureSocket_AddCertificate)
-    (Dart_NativeArguments args) {
-  Dart_Handle certificate_object =
-      ThrowIfError(Dart_GetNativeArgument(args, 0));
-  Dart_Handle trust_object = ThrowIfError(Dart_GetNativeArgument(args, 1));
-
-  if (!Dart_IsList(certificate_object) || !Dart_IsString(trust_object)) {
-    Dart_ThrowException(DartUtils::NewDartArgumentError(
-        "Bad argument to SecureSocket.addCertificate"));
-  }
-
-  intptr_t length;
-  ThrowIfError(Dart_ListLength(certificate_object, &length));
-  uint8_t* certificate = reinterpret_cast<uint8_t*>(malloc(length + 1));
-  if (certificate == NULL) {
-    FATAL("Out of memory in SecureSocket.addCertificate");
-  }
-  ThrowIfError(Dart_ListGetAsBytes(
-      certificate_object, 0, certificate, length));
-
-  const char* trust_string;
-  ThrowIfError(Dart_StringToCString(trust_object,
-                                    &trust_string));
-
-  PK11SlotInfo* slot = PK11_GetInternalKeySlot();
-  SECStatus status = PK11_Authenticate(slot, PR_TRUE, SSLFilter::GetPassword());
-  PK11_FreeSlot(slot);
-  if (status == SECFailure) {
-    ThrowPRException("CertificateException",
-                     "Could not authenticate to certificate database");
-  }
-
-  CERTCertificate* cert = CERT_DecodeCertFromPackage(
-      reinterpret_cast<char*>(certificate), length);
-  if (cert == NULL) {
-    ThrowPRException("CertificateException", "Certificate cannot be decoded");
-  }
-  CERTCertTrust trust;
-  status = CERT_DecodeTrustString(&trust, trust_string);
-  if (status != SECSuccess) {
-    ThrowPRException("CertificateException", "Trust string cannot be decoded");
-  }
-  {
-    MutexLocker locker(SSLFilter::mutex);
-    status = CERT_ChangeCertTrust(CERT_GetDefaultCertDB(), cert, &trust);
-  }
-  if (status != SECSuccess) {
-    ThrowPRException("CertificateException", "Cannot set trust attributes");
-  }
-
-  Dart_SetReturnValue(args, X509FromCertificate(cert));
-  return;
-}
-
-
-/*
- * Called by the PKCS#12 decoder if a certificate's nickname collides with
- * the nickname of a different existing certificate in the database.
- */
-SECItem* nickname_callback(SECItem *old_nickname,
-                           PRBool *cancel,
-                           void *arg) {
-  *cancel = PR_TRUE;
-  return NULL;
-}
-
-
-void FUNCTION_NAME(SecureSocket_ImportCertificatesWithPrivateKeys)
-    (Dart_NativeArguments args) {
-  Dart_Handle pk12_object = ThrowIfError(Dart_GetNativeArgument(args, 0));
-  if (!Dart_IsList(pk12_object)) {
-    Dart_ThrowException(DartUtils::NewDartArgumentError(
-        "SecureSocket.importPrivateCertificates: certificates is not a List"));
-  }
-
-  Dart_Handle password_object = ThrowIfError(Dart_GetNativeArgument(args, 1));
-  if (!Dart_IsString(password_object)) {
-    Dart_ThrowException(DartUtils::NewDartArgumentError(
-        "SecureSocket.importPrivateCertificates: password is not a String"));
-  }
-
-  intptr_t length;
-  ThrowIfError(Dart_ListLength(pk12_object, &length));
-  uint8_t* pk12 = Dart_ScopeAllocate(length);
-  if (pk12 == NULL) {
-    FATAL("Out of memory in SecureSocket.importPrivateCertificates");
-  }
-  ThrowIfError(Dart_ListGetAsBytes(pk12_object, 0, pk12, length));
-
-  // A big-endian Unicode (UTF16) password.
-  intptr_t password_length;
-  ThrowIfError(Dart_StringLength(password_object, &password_length));
-  password_length++;
-  uint16_t* password = reinterpret_cast<uint16_t*>(
-      Dart_ScopeAllocate(sizeof(uint16_t) * password_length));
-  if (password == NULL) {
-    FATAL("Out of memory in SecureSocket.importPrivateCertificates");
-  }
-  intptr_t returned_length = password_length;
-  ThrowIfError(Dart_StringToUTF16(password_object, password, &returned_length));
-  ASSERT(password_length == returned_length + 1);
-  password[password_length - 1] = 0;
-  for (int i = 0; i < password_length; ++i) {
-    password[i] = Utils::HostToBigEndian16(password[i]);
-  }
-  SECItem p12_password;
-  p12_password.type = siBuffer;
-  p12_password.data = reinterpret_cast<unsigned char*>(password);
-  p12_password.len = sizeof(uint16_t) * password_length;
-
-  Dart_SetReturnValue(args, Dart_Null());
-  // Set the password callback for the certificate database we are importing to.
-  // The password for a slot is gotten from a callback, and it is freed by the
-  // caller of the callback.  The argument to the callback comes from the wincx
-  // argument to a PK11 function.
-  PK11SlotInfo* slot = PK11_GetInternalKeySlot();
-  SECStatus status = PK11_Authenticate(slot, PR_TRUE, SSLFilter::GetPassword());
-  if (status == SECFailure) {
-    PK11_FreeSlot(slot);
-    ThrowPRException("CertificateException",
-                     "Could not authenticate to certificate database");
-  }
-
-  SEC_PKCS12DecoderContext* context = SEC_PKCS12DecoderStart(
-      &p12_password,
-      slot,
-      SSLFilter::GetPassword(),
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      NULL);
-  PK11_FreeSlot(slot);
-  if (!context) {
-    FATAL("Unexpected error: SecureSocket.addPrivateCertificates DecoderStart");
-  }
-  bool success;
-  {
-    MutexLocker locker(SSLFilter::mutex);
-    success =
-        SECSuccess == SEC_PKCS12DecoderUpdate(context, pk12, length) &&
-        SECSuccess == SEC_PKCS12DecoderVerify(context) &&
-        SECSuccess == SEC_PKCS12DecoderValidateBags(context,
-                                                    nickname_callback) &&
-        SECSuccess == SEC_PKCS12DecoderImportBags(context);
-  }
-  SEC_PKCS12DecoderFinish(context);
-  if (!success) {
-    ThrowPRException("CertificateException", "Could not import PKCS#12 file");
-  }
-}
-
-
-void FUNCTION_NAME(SecureSocket_ChangeTrust)(Dart_NativeArguments args) {
-  Dart_Handle nickname_object = ThrowIfError(Dart_GetNativeArgument(args, 0));
-  if (!Dart_IsString(nickname_object)) {
-    Dart_ThrowException(DartUtils::NewDartArgumentError(
-        "SecureSocket.changeTrust: nickname argument is not a String"));
-  }
-  const char* nickname;
-  ThrowIfError(Dart_StringToCString(nickname_object, &nickname));
-
-  Dart_Handle trust_object = ThrowIfError(Dart_GetNativeArgument(args, 1));
-  if (!Dart_IsString(trust_object)) {
-    Dart_ThrowException(DartUtils::NewDartArgumentError(
-        "SecureSocket.changeTrust: trust argument is not a String"));
-  }
-  const char* trust_string;
-  ThrowIfError(Dart_StringToCString(trust_object, &trust_string));
-
-  PK11SlotInfo* slot = PK11_GetInternalKeySlot();
-  SECStatus status = PK11_Authenticate(slot, PR_TRUE, SSLFilter::GetPassword());
-  if (status == SECFailure) {
-    ThrowPRException("CertificateException",
-                     "Could not authenticate to certificate database");
-  }
-  PK11_FreeSlot(slot);
-
-  CERTCertificate* certificate =
-      PK11_FindCertFromNickname(nickname, SSLFilter::GetPassword());
-  if (certificate == NULL) {
-    ThrowCertificateException("Cannot find certificate with nickname %s",
-                              nickname);
-  }
-  CERTCertTrust trust;
-  if (SECSuccess != CERT_DecodeTrustString(&trust, trust_string)) {
-    CERT_DestroyCertificate(certificate);
-    ThrowPRException("CertificateException", "Trust string cannot be decoded");
-  }
-  {
-    MutexLocker locker(SSLFilter::mutex);
-    status = CERT_ChangeCertTrust(CERT_GetDefaultCertDB(), certificate, &trust);
-  }
-  if (status != SECSuccess) {
-    CERT_DestroyCertificate(certificate);
-    ThrowCertificateException("Cannot set trust on certificate %s", nickname);
-  }
-  Dart_SetReturnValue(args, X509FromCertificate(certificate));
-  CERT_DestroyCertificate(certificate);
-}
-
-
-void FUNCTION_NAME(SecureSocket_GetCertificate)(Dart_NativeArguments args) {
-  Dart_Handle nickname_object = ThrowIfError(Dart_GetNativeArgument(args, 0));
-  if (!Dart_IsString(nickname_object)) {
-    Dart_ThrowException(DartUtils::NewDartArgumentError(
-        "SecureSocket.getCertificate: nickname argument is not a String"));
-  }
-  const char* nickname;
-  ThrowIfError(Dart_StringToCString(nickname_object, &nickname));
-
-  CERTCertificate* certificate = PK11_FindCertFromNickname(
-                                     nickname, SSLFilter::GetPassword());
-  if (certificate != NULL) {
-    Dart_SetReturnValue(args, X509FromCertificate(certificate));
-    CERT_DestroyCertificate(certificate);
-  }
-}
-
-
-void FUNCTION_NAME(SecureSocket_RemoveCertificate)(Dart_NativeArguments args) {
-  Dart_Handle nickname_object =
-      ThrowIfError(Dart_GetNativeArgument(args, 0));
-  if (!Dart_IsString(nickname_object)) {
-    Dart_ThrowException(DartUtils::NewDartArgumentError(
-        "SecureSocket.removeCertificate: nickname is not a String"));
-  }
-  const char* nickname;
-  ThrowIfError(Dart_StringToCString(nickname_object, &nickname));
-
-  CERTCertificate* certificate =
-      PK11_FindCertFromNickname(nickname, SSLFilter::GetPassword());
-  if (certificate == NULL) {
-    ThrowCertificateException("Cannot find certificate with nickname %s",
-                              nickname);
-  }
-  SECKEYPrivateKey* key =
-      PK11_FindKeyByAnyCert(certificate, SSLFilter::GetPassword());
-  // Free the copy returned from FindKeyByAnyCert.
-  SECKEY_DestroyPrivateKey(key);
-  SECStatus status;
-  {
-    MutexLocker locker(SSLFilter::mutex);
-    status = (key == NULL) ?
-        SEC_DeletePermCertificate(certificate) :
-        PK11_DeleteTokenCertAndKey(certificate, SSLFilter::GetPassword());
-  }
-  CERT_DestroyCertificate(certificate);
-  if (status != SECSuccess) {
-    ThrowCertificateException("Cannot remove certificate %s", nickname);
-  }
+  SSLFilter::InitializeLibrary(certificate_database, password, builtin_roots);
 }
 
 
@@ -723,9 +408,47 @@
 }
 
 
+static Dart_Handle X509FromCertificate(CERTCertificate* certificate) {
+  PRTime start_validity;
+  PRTime end_validity;
+  SECStatus status =
+      CERT_GetCertTimes(certificate, &start_validity, &end_validity);
+  if (status != SECSuccess) {
+    ThrowPRException("CertificateException",
+                     "Cannot get validity times from certificate");
+  }
+  int64_t start_epoch_ms = start_validity / PR_USEC_PER_MSEC;
+  int64_t end_epoch_ms = end_validity / PR_USEC_PER_MSEC;
+  Dart_Handle subject_name_object =
+      DartUtils::NewString(certificate->subjectName);
+  Dart_Handle issuer_name_object =
+      DartUtils::NewString(certificate->issuerName);
+  Dart_Handle start_epoch_ms_int = Dart_NewInteger(start_epoch_ms);
+  Dart_Handle end_epoch_ms_int = Dart_NewInteger(end_epoch_ms);
+
+  Dart_Handle date_type =
+      DartUtils::GetDartType(DartUtils::kCoreLibURL, "DateTime");
+  Dart_Handle from_milliseconds =
+      DartUtils::NewString("fromMillisecondsSinceEpoch");
+
+  Dart_Handle start_validity_date =
+      Dart_New(date_type, from_milliseconds, 1, &start_epoch_ms_int);
+  Dart_Handle end_validity_date =
+      Dart_New(date_type, from_milliseconds, 1, &end_epoch_ms_int);
+
+  Dart_Handle x509_type =
+      DartUtils::GetDartType(DartUtils::kIOLibURL, "X509Certificate");
+  Dart_Handle arguments[] = { subject_name_object,
+                              issuer_name_object,
+                              start_validity_date,
+                              end_validity_date };
+  return Dart_New(x509_type, Dart_Null(), 4, arguments);
+}
+
+
 void SSLFilter::Init(Dart_Handle dart_this) {
   if (!library_initialized_) {
-    InitializeLibrary(NULL, "", true, true, false);
+    InitializeLibrary(NULL, "", true, false);
   }
   ASSERT(string_start_ == NULL);
   string_start_ = Dart_NewPersistentHandle(DartUtils::NewString("start"));
@@ -798,6 +521,14 @@
 }
 
 
+char* PasswordCallback(PK11SlotInfo* slot, PRBool retry, void* arg) {
+  if (!retry) {
+    return PL_strdup(static_cast<char*>(arg));  // Freed by NSS internals.
+  }
+  return NULL;
+}
+
+
 static const char* builtin_roots_module =
 #if defined(TARGET_OS_LINUX) || defined(TARGET_OS_ANDROID)
     "name=\"Root Certs\" library=\"libnssckbi.so\"";
@@ -814,9 +545,8 @@
 void SSLFilter::InitializeLibrary(const char* certificate_database,
                                   const char* password,
                                   bool use_builtin_root_certificates,
-                                  bool read_only,
                                   bool report_duplicate_initialization) {
-  MutexLocker locker(mutex);
+  MutexLocker locker(mutex_);
   SECStatus status;
   if (!library_initialized_) {
     PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);
@@ -824,7 +554,7 @@
     if (certificate_database == NULL || certificate_database[0] == '\0') {
       status = NSS_NoDB_Init(NULL);
       if (status != SECSuccess) {
-        mutex->Unlock();  // MutexLocker destructor not called when throwing.
+        mutex_->Unlock();  // MutexLocker destructor not called when throwing.
         ThrowPRException("TlsException",
                          "Failed NSS_NoDB_Init call.");
       }
@@ -832,13 +562,13 @@
         SECMODModule* module = SECMOD_LoadUserModule(
             const_cast<char*>(builtin_roots_module), NULL, PR_FALSE);
         if (!module) {
-          mutex->Unlock();  // MutexLocker destructor not called when throwing.
+          mutex_->Unlock();  // MutexLocker destructor not called when throwing.
           ThrowPRException("TlsException",
                            "Failed to load builtin root certificates.");
         }
       }
     } else {
-      PRUint32 init_flags = read_only ? NSS_INIT_READONLY : 0;
+      PRUint32 init_flags = NSS_INIT_READONLY;
       if (!use_builtin_root_certificates) {
         init_flags |= NSS_INIT_NOMODDB;
       }
@@ -848,7 +578,7 @@
                               SECMOD_DB,
                               init_flags);
       if (status != SECSuccess) {
-        mutex->Unlock();  // MutexLocker destructor not called when throwing.
+        mutex_->Unlock();  // MutexLocker destructor not called when throwing.
         ThrowPRException("TlsException",
                          "Failed NSS_Init call.");
       }
@@ -857,34 +587,28 @@
     }
     library_initialized_ = true;
 
-    // Allow encoding and decoding of private keys in PKCS#12 files.
-    SEC_PKCS12EnableCipher(PKCS12_RC2_CBC_40, 1);
-    SEC_PKCS12EnableCipher(PKCS12_DES_EDE3_168, 1);
-    SEC_PKCS12SetPreferredCipher(PKCS12_DES_EDE3_168, 1);
-
     status = NSS_SetDomesticPolicy();
     if (status != SECSuccess) {
-      mutex->Unlock();  // MutexLocker destructor not called when throwing.
+      mutex_->Unlock();  // MutexLocker destructor not called when throwing.
       ThrowPRException("TlsException",
                        "Failed NSS_SetDomesticPolicy call.");
     }
-
     // Enable TLS, as well as SSL3 and SSL2.
     status = SSL_OptionSetDefault(SSL_ENABLE_TLS, PR_TRUE);
     if (status != SECSuccess) {
-      mutex->Unlock();  // MutexLocker destructor not called when throwing.
+      mutex_->Unlock();  // MutexLocker destructor not called when throwing.
       ThrowPRException("TlsException",
                        "Failed SSL_OptionSetDefault enable TLS call.");
     }
     status = SSL_ConfigServerSessionIDCache(0, 0, 0, NULL);
     if (status != SECSuccess) {
-      mutex->Unlock();  // MutexLocker destructor not called when throwing.
+      mutex_->Unlock();  // MutexLocker destructor not called when throwing.
       ThrowPRException("TlsException",
                        "Failed SSL_ConfigServerSessionIDCache call.");
     }
 
   } else if (report_duplicate_initialization) {
-    mutex->Unlock();  // MutexLocker destructor not called when throwing.
+    mutex_->Unlock();  // MutexLocker destructor not called when throwing.
     // Like ThrowPRException, without adding an OSError.
     Dart_ThrowException(DartUtils::NewDartIOException("TlsException",
         "Called SecureSocket.initialize more than once",
@@ -959,20 +683,23 @@
           const_cast<char*>(certificate_name));
       if (certificate == NULL) {
         ThrowCertificateException(
-            "Cannot find server certificate with distinguished name %s",
+            "Cannot find server certificate by distinguished name: %s",
             certificate_name);
       }
     } else {
       // Look up certificate using the nickname certificate_name.
       certificate = PK11_FindCertFromNickname(
-          const_cast<char*>(certificate_name), GetPassword());
+          const_cast<char*>(certificate_name),
+          static_cast<void*>(const_cast<char*>(password_)));
       if (certificate == NULL) {
         ThrowCertificateException(
-            "Cannot find server certificate with nickname %s",
+            "Cannot find server certificate by nickname: %s",
             certificate_name);
       }
     }
-    SECKEYPrivateKey* key = PK11_FindKeyByAnyCert(certificate, GetPassword());
+    SECKEYPrivateKey* key = PK11_FindKeyByAnyCert(
+        certificate,
+        static_cast<void*>(const_cast<char*>(password_)));
     if (key == NULL) {
       CERT_DestroyCertificate(certificate);
       if (PR_GetError() == -8177) {
diff --git a/runtime/bin/secure_socket.h b/runtime/bin/secure_socket.h
index cdb4f65..304ccd5 100644
--- a/runtime/bin/secure_socket.h
+++ b/runtime/bin/secure_socket.h
@@ -46,8 +46,6 @@
     kFirstEncrypted = kReadEncrypted
   };
 
-  static dart::Mutex* mutex;  // To protect library initialization.
-
   SSLFilter()
       : callback_error(NULL),
         string_start_(NULL),
@@ -89,17 +87,15 @@
   static void InitializeLibrary(const char* certificate_database,
                                 const char* password,
                                 bool use_builtin_root_certificates,
-                                bool read_only,
                                 bool report_duplicate_initialization = true);
   static Dart_Port GetServicePort();
   Dart_Handle callback_error;
 
-  static char* GetPassword() { return password_; }
-
  private:
   static const int kMemioBufferSize = 20 * KB;
   static bool library_initialized_;
-  static char* password_;
+  static const char* password_;
+  static dart::Mutex* mutex_;  // To protect library initialization.
   static NativeService filter_service_;
 
   uint8_t* buffers_[kNumBuffers];
@@ -119,6 +115,7 @@
     return static_cast<BufferIndex>(i) >= kFirstEncrypted;
   }
   void InitializeBuffers(Dart_Handle dart_this);
+  void InitializePlatformData();
 
   DISALLOW_COPY_AND_ASSIGN(SSLFilter);
 };
diff --git a/runtime/bin/secure_socket_patch.dart b/runtime/bin/secure_socket_patch.dart
index 13640b2..104f562 100644
--- a/runtime/bin/secure_socket_patch.dart
+++ b/runtime/bin/secure_socket_patch.dart
@@ -8,27 +8,8 @@
 
   /* patch */ static void initialize({String database,
                                       String password,
-                                      bool useBuiltinRoots: true,
-                                      bool readOnly: true})
-      native "SecureSocket_InitializeLibrary";
-
-  /* patch */ static X509Certificate addCertificate(List<int> certificate,
-                                                    String trust)
-      native "SecureSocket_AddCertificate";
-
-  /* patch */ static importCertificatesWithPrivateKeys(List<int> certificates,
-                                                       String password)
-      native "SecureSocket_ImportCertificatesWithPrivateKeys";
-
-  /* patch */ static X509Certificate changeTrust(String nickname,
-                                                 String trust)
-      native "SecureSocket_ChangeTrust";
-
-  /* patch */ static X509Certificate getCertificate(String nickname)
-      native "SecureSocket_GetCertificate";
-
-  /* patch */ static removeCertificate(String nickname)
-      native "SecureSocket_RemoveCertificate";
+                                      bool useBuiltinRoots: true})
+  native "SecureSocket_InitializeLibrary";
 }
 
 
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 4d9225d..55f9224e 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.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.
 
-patch class RawServerSocket  {
+patch class RawServerSocket {
   /* patch */ static Future<RawServerSocket> bind(address,
                                                   int port,
                                                   {int backlog: 0,
@@ -145,7 +145,7 @@
   static Uint8List _fixed(int id) native "InternetAddress_Fixed";
 }
 
-class _NetworkInterface implements NetworkInterface{
+class _NetworkInterface implements NetworkInterface {
   final String name;
   final List<InternetAddress> addresses;
 
diff --git a/runtime/lib/bool_patch.dart b/runtime/lib/bool_patch.dart
index f5020c3..d5594e2 100644
--- a/runtime/lib/bool_patch.dart
+++ b/runtime/lib/bool_patch.dart
@@ -10,4 +10,7 @@
     return this ? 1231 : 1237;
   }
 
+  String toString() {
+  	return this ? "true" : "false";
+  }
 }
diff --git a/runtime/lib/corelib_sources.gypi b/runtime/lib/corelib_sources.gypi
index 14a53b2..3d50b40 100644
--- a/runtime/lib/corelib_sources.gypi
+++ b/runtime/lib/corelib_sources.gypi
@@ -35,6 +35,7 @@
     'invocation_mirror.h',
     'invocation_mirror_patch.dart',
     'map_patch.dart',
+    'null_patch.dart',
     'object.cc',
     'object_patch.dart',
     'print_patch.dart',
diff --git a/runtime/lib/double_patch.dart b/runtime/lib/double_patch.dart
index 8fb5560..9e2abeb 100644
--- a/runtime/lib/double_patch.dart
+++ b/runtime/lib/double_patch.dart
@@ -39,11 +39,11 @@
   }
 
   /* patch */ static double parse(String str,
-                                  [double handleError(String str)]) {
+                                  [double onError(String str)]) {
     var result = _parse(str);
     if (result == null) {
-      if (handleError == null) throw new FormatException(str);
-      return handleError(str);
+      if (onError == null) throw new FormatException(str);
+      return onError(str);
     }
     return result;
   }
diff --git a/runtime/lib/null_patch.dart b/runtime/lib/null_patch.dart
new file mode 100644
index 0000000..cfc1f33
--- /dev/null
+++ b/runtime/lib/null_patch.dart
@@ -0,0 +1,21 @@
+// 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 core library.
+
+patch class Null {
+
+  factory Null._uninstantiable() {
+    throw new UnsupportedError(
+        "class Null cannot be instantiated");
+  }
+
+  int get hashCode {
+    return 2011;  // The year Dart was announced and a prime.
+  }
+
+  String toString() {
+    return 'null';
+  }
+}
diff --git a/runtime/lib/object_patch.dart b/runtime/lib/object_patch.dart
index e2b4933..2d42da7 100644
--- a/runtime/lib/object_patch.dart
+++ b/runtime/lib/object_patch.dart
@@ -13,9 +13,6 @@
   static _setHash(obj, hash) native "Object_setHash";
 
   /* patch */ int get hashCode {
-    if (this == null) {
-      return 2011;  // The year Dart was announced and a prime.
-    }
     var result = _getHash(this);
     if (result == 0) {
       // We want the hash to be a Smi value greater than 0.
diff --git a/runtime/lib/simd128.cc b/runtime/lib/simd128.cc
index 0ff6da4..9b79412 100644
--- a/runtime/lib/simd128.cc
+++ b/runtime/lib/simd128.cc
@@ -233,6 +233,13 @@
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, mask, arguments->NativeArgAt(1));
   int64_t m = mask.AsInt64Value();
+  if (m < 0 || m > 255) {
+    const String& error = String::Handle(
+      String::NewFormatted("mask (%"Pd64") must be in the range [0..256)", m));
+    const Array& args = Array::Handle(Array::New(1));
+    args.SetAt(0, error);
+    Exceptions::ThrowByType(Exceptions::kRange, args);
+  }
   float data[4] = { self.x(), self.y(), self.z(), self.w() };
   float _x = data[m & 0x3];
   float _y = data[(m >> 2) & 0x3];
diff --git a/runtime/lib/typed_data.dart b/runtime/lib/typed_data.dart
index de61ae0..4e76c27 100644
--- a/runtime/lib/typed_data.dart
+++ b/runtime/lib/typed_data.dart
@@ -2022,263 +2022,8 @@
   double get y native "Float32x4_getY";
   double get z native "Float32x4_getZ";
   double get w native "Float32x4_getW";
-  Float32x4 get xxxx => _shuffle(0x0);
-  Float32x4 get xxxy => _shuffle(0x40);
-  Float32x4 get xxxz => _shuffle(0x80);
-  Float32x4 get xxxw => _shuffle(0xC0);
-  Float32x4 get xxyx => _shuffle(0x10);
-  Float32x4 get xxyy => _shuffle(0x50);
-  Float32x4 get xxyz => _shuffle(0x90);
-  Float32x4 get xxyw => _shuffle(0xD0);
-  Float32x4 get xxzx => _shuffle(0x20);
-  Float32x4 get xxzy => _shuffle(0x60);
-  Float32x4 get xxzz => _shuffle(0xA0);
-  Float32x4 get xxzw => _shuffle(0xE0);
-  Float32x4 get xxwx => _shuffle(0x30);
-  Float32x4 get xxwy => _shuffle(0x70);
-  Float32x4 get xxwz => _shuffle(0xB0);
-  Float32x4 get xxww => _shuffle(0xF0);
-  Float32x4 get xyxx => _shuffle(0x4);
-  Float32x4 get xyxy => _shuffle(0x44);
-  Float32x4 get xyxz => _shuffle(0x84);
-  Float32x4 get xyxw => _shuffle(0xC4);
-  Float32x4 get xyyx => _shuffle(0x14);
-  Float32x4 get xyyy => _shuffle(0x54);
-  Float32x4 get xyyz => _shuffle(0x94);
-  Float32x4 get xyyw => _shuffle(0xD4);
-  Float32x4 get xyzx => _shuffle(0x24);
-  Float32x4 get xyzy => _shuffle(0x64);
-  Float32x4 get xyzz => _shuffle(0xA4);
-  Float32x4 get xyzw => _shuffle(0xE4);
-  Float32x4 get xywx => _shuffle(0x34);
-  Float32x4 get xywy => _shuffle(0x74);
-  Float32x4 get xywz => _shuffle(0xB4);
-  Float32x4 get xyww => _shuffle(0xF4);
-  Float32x4 get xzxx => _shuffle(0x8);
-  Float32x4 get xzxy => _shuffle(0x48);
-  Float32x4 get xzxz => _shuffle(0x88);
-  Float32x4 get xzxw => _shuffle(0xC8);
-  Float32x4 get xzyx => _shuffle(0x18);
-  Float32x4 get xzyy => _shuffle(0x58);
-  Float32x4 get xzyz => _shuffle(0x98);
-  Float32x4 get xzyw => _shuffle(0xD8);
-  Float32x4 get xzzx => _shuffle(0x28);
-  Float32x4 get xzzy => _shuffle(0x68);
-  Float32x4 get xzzz => _shuffle(0xA8);
-  Float32x4 get xzzw => _shuffle(0xE8);
-  Float32x4 get xzwx => _shuffle(0x38);
-  Float32x4 get xzwy => _shuffle(0x78);
-  Float32x4 get xzwz => _shuffle(0xB8);
-  Float32x4 get xzww => _shuffle(0xF8);
-  Float32x4 get xwxx => _shuffle(0xC);
-  Float32x4 get xwxy => _shuffle(0x4C);
-  Float32x4 get xwxz => _shuffle(0x8C);
-  Float32x4 get xwxw => _shuffle(0xCC);
-  Float32x4 get xwyx => _shuffle(0x1C);
-  Float32x4 get xwyy => _shuffle(0x5C);
-  Float32x4 get xwyz => _shuffle(0x9C);
-  Float32x4 get xwyw => _shuffle(0xDC);
-  Float32x4 get xwzx => _shuffle(0x2C);
-  Float32x4 get xwzy => _shuffle(0x6C);
-  Float32x4 get xwzz => _shuffle(0xAC);
-  Float32x4 get xwzw => _shuffle(0xEC);
-  Float32x4 get xwwx => _shuffle(0x3C);
-  Float32x4 get xwwy => _shuffle(0x7C);
-  Float32x4 get xwwz => _shuffle(0xBC);
-  Float32x4 get xwww => _shuffle(0xFC);
-  Float32x4 get yxxx => _shuffle(0x1);
-  Float32x4 get yxxy => _shuffle(0x41);
-  Float32x4 get yxxz => _shuffle(0x81);
-  Float32x4 get yxxw => _shuffle(0xC1);
-  Float32x4 get yxyx => _shuffle(0x11);
-  Float32x4 get yxyy => _shuffle(0x51);
-  Float32x4 get yxyz => _shuffle(0x91);
-  Float32x4 get yxyw => _shuffle(0xD1);
-  Float32x4 get yxzx => _shuffle(0x21);
-  Float32x4 get yxzy => _shuffle(0x61);
-  Float32x4 get yxzz => _shuffle(0xA1);
-  Float32x4 get yxzw => _shuffle(0xE1);
-  Float32x4 get yxwx => _shuffle(0x31);
-  Float32x4 get yxwy => _shuffle(0x71);
-  Float32x4 get yxwz => _shuffle(0xB1);
-  Float32x4 get yxww => _shuffle(0xF1);
-  Float32x4 get yyxx => _shuffle(0x5);
-  Float32x4 get yyxy => _shuffle(0x45);
-  Float32x4 get yyxz => _shuffle(0x85);
-  Float32x4 get yyxw => _shuffle(0xC5);
-  Float32x4 get yyyx => _shuffle(0x15);
-  Float32x4 get yyyy => _shuffle(0x55);
-  Float32x4 get yyyz => _shuffle(0x95);
-  Float32x4 get yyyw => _shuffle(0xD5);
-  Float32x4 get yyzx => _shuffle(0x25);
-  Float32x4 get yyzy => _shuffle(0x65);
-  Float32x4 get yyzz => _shuffle(0xA5);
-  Float32x4 get yyzw => _shuffle(0xE5);
-  Float32x4 get yywx => _shuffle(0x35);
-  Float32x4 get yywy => _shuffle(0x75);
-  Float32x4 get yywz => _shuffle(0xB5);
-  Float32x4 get yyww => _shuffle(0xF5);
-  Float32x4 get yzxx => _shuffle(0x9);
-  Float32x4 get yzxy => _shuffle(0x49);
-  Float32x4 get yzxz => _shuffle(0x89);
-  Float32x4 get yzxw => _shuffle(0xC9);
-  Float32x4 get yzyx => _shuffle(0x19);
-  Float32x4 get yzyy => _shuffle(0x59);
-  Float32x4 get yzyz => _shuffle(0x99);
-  Float32x4 get yzyw => _shuffle(0xD9);
-  Float32x4 get yzzx => _shuffle(0x29);
-  Float32x4 get yzzy => _shuffle(0x69);
-  Float32x4 get yzzz => _shuffle(0xA9);
-  Float32x4 get yzzw => _shuffle(0xE9);
-  Float32x4 get yzwx => _shuffle(0x39);
-  Float32x4 get yzwy => _shuffle(0x79);
-  Float32x4 get yzwz => _shuffle(0xB9);
-  Float32x4 get yzww => _shuffle(0xF9);
-  Float32x4 get ywxx => _shuffle(0xD);
-  Float32x4 get ywxy => _shuffle(0x4D);
-  Float32x4 get ywxz => _shuffle(0x8D);
-  Float32x4 get ywxw => _shuffle(0xCD);
-  Float32x4 get ywyx => _shuffle(0x1D);
-  Float32x4 get ywyy => _shuffle(0x5D);
-  Float32x4 get ywyz => _shuffle(0x9D);
-  Float32x4 get ywyw => _shuffle(0xDD);
-  Float32x4 get ywzx => _shuffle(0x2D);
-  Float32x4 get ywzy => _shuffle(0x6D);
-  Float32x4 get ywzz => _shuffle(0xAD);
-  Float32x4 get ywzw => _shuffle(0xED);
-  Float32x4 get ywwx => _shuffle(0x3D);
-  Float32x4 get ywwy => _shuffle(0x7D);
-  Float32x4 get ywwz => _shuffle(0xBD);
-  Float32x4 get ywww => _shuffle(0xFD);
-  Float32x4 get zxxx => _shuffle(0x2);
-  Float32x4 get zxxy => _shuffle(0x42);
-  Float32x4 get zxxz => _shuffle(0x82);
-  Float32x4 get zxxw => _shuffle(0xC2);
-  Float32x4 get zxyx => _shuffle(0x12);
-  Float32x4 get zxyy => _shuffle(0x52);
-  Float32x4 get zxyz => _shuffle(0x92);
-  Float32x4 get zxyw => _shuffle(0xD2);
-  Float32x4 get zxzx => _shuffle(0x22);
-  Float32x4 get zxzy => _shuffle(0x62);
-  Float32x4 get zxzz => _shuffle(0xA2);
-  Float32x4 get zxzw => _shuffle(0xE2);
-  Float32x4 get zxwx => _shuffle(0x32);
-  Float32x4 get zxwy => _shuffle(0x72);
-  Float32x4 get zxwz => _shuffle(0xB2);
-  Float32x4 get zxww => _shuffle(0xF2);
-  Float32x4 get zyxx => _shuffle(0x6);
-  Float32x4 get zyxy => _shuffle(0x46);
-  Float32x4 get zyxz => _shuffle(0x86);
-  Float32x4 get zyxw => _shuffle(0xC6);
-  Float32x4 get zyyx => _shuffle(0x16);
-  Float32x4 get zyyy => _shuffle(0x56);
-  Float32x4 get zyyz => _shuffle(0x96);
-  Float32x4 get zyyw => _shuffle(0xD6);
-  Float32x4 get zyzx => _shuffle(0x26);
-  Float32x4 get zyzy => _shuffle(0x66);
-  Float32x4 get zyzz => _shuffle(0xA6);
-  Float32x4 get zyzw => _shuffle(0xE6);
-  Float32x4 get zywx => _shuffle(0x36);
-  Float32x4 get zywy => _shuffle(0x76);
-  Float32x4 get zywz => _shuffle(0xB6);
-  Float32x4 get zyww => _shuffle(0xF6);
-  Float32x4 get zzxx => _shuffle(0xA);
-  Float32x4 get zzxy => _shuffle(0x4A);
-  Float32x4 get zzxz => _shuffle(0x8A);
-  Float32x4 get zzxw => _shuffle(0xCA);
-  Float32x4 get zzyx => _shuffle(0x1A);
-  Float32x4 get zzyy => _shuffle(0x5A);
-  Float32x4 get zzyz => _shuffle(0x9A);
-  Float32x4 get zzyw => _shuffle(0xDA);
-  Float32x4 get zzzx => _shuffle(0x2A);
-  Float32x4 get zzzy => _shuffle(0x6A);
-  Float32x4 get zzzz => _shuffle(0xAA);
-  Float32x4 get zzzw => _shuffle(0xEA);
-  Float32x4 get zzwx => _shuffle(0x3A);
-  Float32x4 get zzwy => _shuffle(0x7A);
-  Float32x4 get zzwz => _shuffle(0xBA);
-  Float32x4 get zzww => _shuffle(0xFA);
-  Float32x4 get zwxx => _shuffle(0xE);
-  Float32x4 get zwxy => _shuffle(0x4E);
-  Float32x4 get zwxz => _shuffle(0x8E);
-  Float32x4 get zwxw => _shuffle(0xCE);
-  Float32x4 get zwyx => _shuffle(0x1E);
-  Float32x4 get zwyy => _shuffle(0x5E);
-  Float32x4 get zwyz => _shuffle(0x9E);
-  Float32x4 get zwyw => _shuffle(0xDE);
-  Float32x4 get zwzx => _shuffle(0x2E);
-  Float32x4 get zwzy => _shuffle(0x6E);
-  Float32x4 get zwzz => _shuffle(0xAE);
-  Float32x4 get zwzw => _shuffle(0xEE);
-  Float32x4 get zwwx => _shuffle(0x3E);
-  Float32x4 get zwwy => _shuffle(0x7E);
-  Float32x4 get zwwz => _shuffle(0xBE);
-  Float32x4 get zwww => _shuffle(0xFE);
-  Float32x4 get wxxx => _shuffle(0x3);
-  Float32x4 get wxxy => _shuffle(0x43);
-  Float32x4 get wxxz => _shuffle(0x83);
-  Float32x4 get wxxw => _shuffle(0xC3);
-  Float32x4 get wxyx => _shuffle(0x13);
-  Float32x4 get wxyy => _shuffle(0x53);
-  Float32x4 get wxyz => _shuffle(0x93);
-  Float32x4 get wxyw => _shuffle(0xD3);
-  Float32x4 get wxzx => _shuffle(0x23);
-  Float32x4 get wxzy => _shuffle(0x63);
-  Float32x4 get wxzz => _shuffle(0xA3);
-  Float32x4 get wxzw => _shuffle(0xE3);
-  Float32x4 get wxwx => _shuffle(0x33);
-  Float32x4 get wxwy => _shuffle(0x73);
-  Float32x4 get wxwz => _shuffle(0xB3);
-  Float32x4 get wxww => _shuffle(0xF3);
-  Float32x4 get wyxx => _shuffle(0x7);
-  Float32x4 get wyxy => _shuffle(0x47);
-  Float32x4 get wyxz => _shuffle(0x87);
-  Float32x4 get wyxw => _shuffle(0xC7);
-  Float32x4 get wyyx => _shuffle(0x17);
-  Float32x4 get wyyy => _shuffle(0x57);
-  Float32x4 get wyyz => _shuffle(0x97);
-  Float32x4 get wyyw => _shuffle(0xD7);
-  Float32x4 get wyzx => _shuffle(0x27);
-  Float32x4 get wyzy => _shuffle(0x67);
-  Float32x4 get wyzz => _shuffle(0xA7);
-  Float32x4 get wyzw => _shuffle(0xE7);
-  Float32x4 get wywx => _shuffle(0x37);
-  Float32x4 get wywy => _shuffle(0x77);
-  Float32x4 get wywz => _shuffle(0xB7);
-  Float32x4 get wyww => _shuffle(0xF7);
-  Float32x4 get wzxx => _shuffle(0xB);
-  Float32x4 get wzxy => _shuffle(0x4B);
-  Float32x4 get wzxz => _shuffle(0x8B);
-  Float32x4 get wzxw => _shuffle(0xCB);
-  Float32x4 get wzyx => _shuffle(0x1B);
-  Float32x4 get wzyy => _shuffle(0x5B);
-  Float32x4 get wzyz => _shuffle(0x9B);
-  Float32x4 get wzyw => _shuffle(0xDB);
-  Float32x4 get wzzx => _shuffle(0x2B);
-  Float32x4 get wzzy => _shuffle(0x6B);
-  Float32x4 get wzzz => _shuffle(0xAB);
-  Float32x4 get wzzw => _shuffle(0xEB);
-  Float32x4 get wzwx => _shuffle(0x3B);
-  Float32x4 get wzwy => _shuffle(0x7B);
-  Float32x4 get wzwz => _shuffle(0xBB);
-  Float32x4 get wzww => _shuffle(0xFB);
-  Float32x4 get wwxx => _shuffle(0xF);
-  Float32x4 get wwxy => _shuffle(0x4F);
-  Float32x4 get wwxz => _shuffle(0x8F);
-  Float32x4 get wwxw => _shuffle(0xCF);
-  Float32x4 get wwyx => _shuffle(0x1F);
-  Float32x4 get wwyy => _shuffle(0x5F);
-  Float32x4 get wwyz => _shuffle(0x9F);
-  Float32x4 get wwyw => _shuffle(0xDF);
-  Float32x4 get wwzx => _shuffle(0x2F);
-  Float32x4 get wwzy => _shuffle(0x6F);
-  Float32x4 get wwzz => _shuffle(0xAF);
-  Float32x4 get wwzw => _shuffle(0xEF);
-  Float32x4 get wwwx => _shuffle(0x3F);
-  Float32x4 get wwwy => _shuffle(0x7F);
-  Float32x4 get wwwz => _shuffle(0xBF);
-  Float32x4 get wwww => _shuffle(0xFF);
-  Float32x4 _shuffle(int mask) native "Float32x4_shuffle";
+
+  Float32x4 shuffle(int mask) native "Float32x4_shuffle";
 
   Float32x4 withZWInXY(Float32x4 other) native "Float32x4_withZWInXY";
   Float32x4 interleaveXY(Float32x4 other) native "Float32x4_interleaveXY";
diff --git a/runtime/platform/thread_win.cc b/runtime/platform/thread_win.cc
index 6265f6f..7b3ca56 100644
--- a/runtime/platform/thread_win.cc
+++ b/runtime/platform/thread_win.cc
@@ -71,7 +71,7 @@
 ThreadLocalKey Thread::CreateThreadLocal() {
   ThreadLocalKey key = TlsAlloc();
   if (key == kUnsetThreadLocalKey) {
-    FATAL("TlsAlloc failed");
+    FATAL1("TlsAlloc failed %d", GetLastError());
   }
   return key;
 }
@@ -81,7 +81,7 @@
   ASSERT(key != kUnsetThreadLocalKey);
   BOOL result = TlsFree(key);
   if (!result) {
-    FATAL("TlsFree failed");
+    FATAL1("TlsFree failed %d", GetLastError());
   }
 }
 
@@ -96,7 +96,7 @@
   ASSERT(key != kUnsetThreadLocalKey);
   BOOL result = TlsSetValue(key, reinterpret_cast<void*>(value));
   if (!result) {
-    FATAL("TlsSetValue failed");
+    FATAL1("TlsSetValue failed %d", GetLastError());
   }
 }
 
@@ -105,7 +105,7 @@
   // Allocate unnamed semaphore with initial count 1 and max count 1.
   data_.semaphore_ = CreateSemaphore(NULL, 1, 1, NULL);
   if (data_.semaphore_ == NULL) {
-    FATAL("Mutex allocation failed");
+    FATAL1("Mutex allocation failed %d", GetLastError());
   }
 }
 
@@ -118,7 +118,7 @@
 void Mutex::Lock() {
   DWORD result = WaitForSingleObject(data_.semaphore_, INFINITE);
   if (result != WAIT_OBJECT_0) {
-    FATAL("Mutex lock failed");
+    FATAL1("Mutex lock failed %d", GetLastError());
   }
 }
 
@@ -130,7 +130,7 @@
     return true;
   }
   if (result == WAIT_ABANDONED || result == WAIT_FAILED) {
-    FATAL("Mutex try lock failed");
+    FATAL1("Mutex try lock failed %d", GetLastError());
   }
   ASSERT(result == WAIT_TIMEOUT);
   return false;
@@ -140,7 +140,7 @@
 void Mutex::Unlock() {
   BOOL result = ReleaseSemaphore(data_.semaphore_, 1, NULL);
   if (result == 0) {
-    FATAL("Mutex unlock failed");
+    FATAL1("Mutex unlock failed", GetLastError());
   }
 }
 
@@ -244,7 +244,7 @@
     // Signal event.
     BOOL result = SetEvent(first->event_);
     if (result == 0) {
-      FATAL("Monitor::Notify failed to signal event");
+      FATAL1("Monitor::Notify failed to signal event", GetLastError());
     }
   }
   LeaveCriticalSection(&waiters_cs_);
@@ -261,7 +261,7 @@
   while (current != NULL) {
     BOOL result = SetEvent(current->event_);
     if (result == 0) {
-      FATAL("Failed to set event for NotifyAll");
+      FATAL1("Failed to set event for NotifyAll", GetLastError());
     }
     current = current->next_;
   }
@@ -315,14 +315,14 @@
     // Wait forever for a Notify or a NotifyAll event.
     result = WaitForSingleObject(wait_data->event_, INFINITE);
     if (result == WAIT_FAILED) {
-      FATAL("Monitor::Wait failed");
+      FATAL1("Monitor::Wait failed", GetLastError());
     }
   } else {
     // Wait for the given period of time for a Notify or a NotifyAll
     // event.
     result = WaitForSingleObject(wait_data->event_, millis);
     if (result == WAIT_FAILED) {
-      FATAL("Monitor::Wait with timeout failed");
+      FATAL1("Monitor::Wait with timeout failed", GetLastError());
     }
     if (result == WAIT_TIMEOUT) {
       // No longer waiting. Remove from the list of waiters.
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index f59a048..5b4a370 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -1938,6 +1938,7 @@
       case kExternalOneByteStringCid:
       case kExternalTwoByteStringCid:
       case kBoolCid:
+      case kNullCid:
       case kArrayCid:
       case kImmutableArrayCid:
       case kGrowableObjectArrayCid:
@@ -1996,11 +1997,12 @@
                   String::Handle(interface_class.Name()).ToCString());
     }
     // Verify that unless cls belongs to core lib, it cannot extend or implement
-    // any of bool, num, int, double, String, Function, dynamic.
+    // any of Null, bool, num, int, double, String, Function, dynamic.
     // The exception is signature classes, which are compiler generated and
     // represent a function type, therefore implementing the Function interface.
     if (!cls_belongs_to_core_lib) {
       if (interface.IsBoolType() ||
+          interface.IsNullType() ||
           interface.IsNumberType() ||
           interface.IsIntType() ||
           interface.IsDoubleType() ||
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 7aaf5bc..2f72473 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -1032,11 +1032,6 @@
   const MegamorphicCache& cache = MegamorphicCache::Handle(
       isolate->megamorphic_cache_table()->Lookup(name, descriptor));
   Class& cls = Class::Handle(receiver.clazz());
-  const bool is_null = cls.IsNullClass();
-  // For lookups treat null as an instance of class Object.
-  if (is_null) {
-    cls = isolate->object_store()->object_class();
-  }
   ASSERT(!cls.IsNull());
   if (FLAG_trace_ic || FLAG_trace_ic_miss_in_optimized) {
     OS::PrintErr("Megamorphic IC miss, class=%s, function=%s\n",
@@ -1064,8 +1059,7 @@
   if (instructions.IsNull()) return;
 
   cache.EnsureCapacity();
-  const Smi& class_id = Smi::Handle(Smi::New(
-      is_null ? static_cast<intptr_t>(kNullCid) : cls.id()));
+  const Smi& class_id = Smi::Handle(Smi::New(cls.id()));
   cache.Insert(class_id, target);
   return;
 }
@@ -1217,11 +1211,7 @@
   const Array& args_descriptor = Array::CheckedHandle(arguments.ArgAt(2));
   const Array& args = Array::CheckedHandle(arguments.ArgAt(3));
 
-  Class& receiver_class = Class::Handle(receiver.clazz());
-  // For lookups treat null as an instance of class Object.
-  if (receiver_class.IsNullClass()) {
-    receiver_class = isolate->object_store()->object_class();
-  }
+  const Class& receiver_class = Class::Handle(receiver.clazz());
   const String& target_name = String::Handle(ic_data.target_name());
 
   Object& result = Object::Handle();
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index aa88e83..fdc7e50 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -240,26 +240,44 @@
 }
 
 
+#define GET_PEER(type, ctype, raw_obj, peer)                                   \
+
+
+#define EXTERNAL_PEER_HELPER(cid, raw_obj, peer)                               \
+  switch (cid) {                                                               \
+    case kExternalOneByteStringCid: {                                          \
+      RawExternalOneByteString* raw_string =                                   \
+          reinterpret_cast<RawExternalOneByteString*>(raw_obj)->ptr();         \
+      ExternalStringData<uint8_t>* data = raw_string->external_data_;          \
+      *peer = data->peer();                                                    \
+      return true;                                                             \
+    }                                                                          \
+    case kExternalTwoByteStringCid: {                                          \
+      RawExternalTwoByteString* raw_string =                                   \
+          reinterpret_cast<RawExternalTwoByteString*>(raw_obj)->ptr();         \
+      ExternalStringData<uint16_t>* data = raw_string->external_data_;         \
+      *peer = data->peer();                                                    \
+      return true;                                                             \
+    }                                                                          \
+  }                                                                            \
+  return false;                                                                \
+
+
+bool Api::ExternalStringGetPeerHelper(Dart_NativeArguments args,
+                                      int arg_index,
+                                      void** peer) {
+  NoGCScope no_gc_scope;
+  NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
+  RawObject* raw_obj = arguments->NativeArgAt(arg_index);
+  intptr_t cid = raw_obj->GetClassId();
+  EXTERNAL_PEER_HELPER(cid, raw_obj, peer);
+}
+
+
 bool Api::ExternalStringGetPeerHelper(Dart_Handle object, void** peer) {
   NoGCScope no_gc_scope;
   RawObject* raw_obj = Api::UnwrapHandle(object);
-  switch (Api::ClassId(object)) {
-    case kExternalOneByteStringCid: {
-      RawExternalOneByteString* raw_string =
-          reinterpret_cast<RawExternalOneByteString*>(raw_obj)->ptr();
-      ExternalStringData<uint8_t>* data = raw_string->external_data_;
-      *peer = data->peer();
-      return true;
-    }
-    case kExternalTwoByteStringCid: {
-      RawExternalTwoByteString* raw_string =
-          reinterpret_cast<RawExternalTwoByteString*>(raw_obj)->ptr();
-      ExternalStringData<uint16_t>* data = raw_string->external_data_;
-      *peer = data->peer();
-      return true;
-    }
-  }
-  return false;
+  EXTERNAL_PEER_HELPER(Api::ClassId(object), raw_obj, peer);
 }
 
 
@@ -3686,18 +3704,14 @@
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
   Isolate* isolate = arguments->isolate();
   CHECK_ISOLATE(isolate);
-  ReusableObjectHandleScope reused_obj_handle(isolate);
-  Object& obj = reused_obj_handle.Handle();
-  obj = arguments->NativeArgAt(arg_index);
-  intptr_t cid = obj.GetClassId();
-  if (RawObject::IsExternalStringClassId(cid)) {
-    const String& str = String::Cast(obj);
-    *peer = str.GetPeer();
-    ASSERT(*peer != NULL);
+  if (Api::ExternalStringGetPeerHelper(args, arg_index, peer)) {
     return Api::Success();
   }
   *peer = NULL;
-  if (RawObject::IsStringClassId(cid)) {
+  ReusableObjectHandleScope reused_obj_handle(isolate);
+  Object& obj = reused_obj_handle.Handle();
+  obj = arguments->NativeArgAt(arg_index);
+  if (RawObject::IsStringClassId(obj.GetClassId())) {
     return Api::NewHandle(isolate, obj.raw());
   }
   return Api::NewError("%s expects argument to be of"
diff --git a/runtime/vm/dart_api_impl.h b/runtime/vm/dart_api_impl.h
index d549b8f..dc2f88c 100644
--- a/runtime/vm/dart_api_impl.h
+++ b/runtime/vm/dart_api_impl.h
@@ -191,6 +191,9 @@
   static void InitHandles();
 
   // Helper function to get the peer value of an external string object.
+  static bool ExternalStringGetPeerHelper(Dart_NativeArguments args,
+                                          int arg_index,
+                                          void** peer);
   static bool ExternalStringGetPeerHelper(Dart_Handle object, void** peer);
 
   // Helper function to set the return value of native functions.
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index c1717ec..e818aa2 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -1222,27 +1222,20 @@
       node->left()->IsLiteralNode() &&
       type.IsInstantiated()) {
     const Instance& literal_value = node->left()->AsLiteralNode()->literal();
-    const Class& cls = Class::Handle(literal_value.clazz());
     ConstantInstr* result = NULL;
-    if (cls.IsNullClass()) {
-      // A null object is only an instance of Object and dynamic, which has
-      // already been checked above (if the type is instantiated). So we can
-      // return false here if the instance is null (and if the type is
-      // instantiated).
-      result = new ConstantInstr(negate_result ? Bool::True() : Bool::False());
+
+    Error& malformed_error = Error::Handle();
+    if (literal_value.IsInstanceOf(type,
+                                   TypeArguments::Handle(),
+                                   &malformed_error)) {
+      result = new ConstantInstr(negate_result ?
+                                 Bool::False() : Bool::True());
     } else {
-      Error& malformed_error = Error::Handle();
-      if (literal_value.IsInstanceOf(type,
-                                     TypeArguments::Handle(),
-                                     &malformed_error)) {
-        result = new ConstantInstr(negate_result ?
-                                   Bool::False() : Bool::True());
-      } else {
-        result = new ConstantInstr(negate_result ?
-                                   Bool::True() : Bool::False());
-      }
-      ASSERT(malformed_error.IsNull());
+      result = new ConstantInstr(negate_result ?
+                                 Bool::True() : Bool::False());
     }
+    ASSERT(malformed_error.IsNull());
+
     ReturnDefinition(result);
     return;
   }
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 74137bc..84879f5 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -46,6 +46,8 @@
 static bool ShouldInlineSimd() {
 #if defined(TARGET_ARCH_MIPS)
   return false;
+#elif defined(TARGET_ARCH_ARM)
+  return CPUFeatures::neon_supported() && FLAG_enable_simd_inline;
 #endif
   return FLAG_enable_simd_inline;
 }
@@ -398,20 +400,49 @@
   } else if ((from == kUnboxedUint32x4) && (to == kTagged)) {
     converted = new BoxUint32x4Instr(use->CopyWithType());
   } else {
+    // We have failed to find a suitable conversion instruction.
+    // Insert two "dummy" conversion instructions with the correct
+    // "from" and "to" representation. The inserted instructions will
+    // trigger a deoptimization if executed. See #12417 for a discussion.
     const intptr_t deopt_id = (deopt_target != NULL) ?
         deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    // We have failed to find a suitable conversion instruction.
-    // Insert a "dummy" conversion instruction with the correct
-    // "to" representation. The inserted instruction will trigger a
-    // a deoptimization if executed. See issue #12417 for a discussion.
+    ASSERT(from != kTagged);
+    ASSERT(to != kTagged);
+    Value* to_value = NULL;
+    if (from == kUnboxedDouble) {
+      BoxDoubleInstr* boxed = new BoxDoubleInstr(use->CopyWithType());
+      use->BindTo(boxed);
+      InsertBefore(insert_before, boxed, NULL, Definition::kValue);
+      to_value = new Value(boxed);
+    } else if (from == kUnboxedUint32x4) {
+      BoxUint32x4Instr* boxed = new BoxUint32x4Instr(use->CopyWithType());
+      use->BindTo(boxed);
+      InsertBefore(insert_before, boxed, NULL, Definition::kValue);
+      to_value = new Value(boxed);
+    } else if (from == kUnboxedFloat32x4) {
+      BoxFloat32x4Instr* boxed = new BoxFloat32x4Instr(use->CopyWithType());
+      use->BindTo(boxed);
+      InsertBefore(insert_before, boxed, NULL, Definition::kValue);
+      to_value = new Value(boxed);
+    } else if (from == kUnboxedMint) {
+      BoxIntegerInstr* boxed = new BoxIntegerInstr(use->CopyWithType());
+      use->BindTo(boxed);
+      InsertBefore(insert_before, boxed, NULL, Definition::kValue);
+      to_value = new Value(boxed);
+    } else {
+      UNIMPLEMENTED();
+    }
+    ASSERT(to_value != NULL);
     if (to == kUnboxedDouble) {
-      converted = new UnboxDoubleInstr(use->CopyWithType(), deopt_id);
+      converted = new UnboxDoubleInstr(to_value, deopt_id);
     } else if (to == kUnboxedUint32x4) {
-      converted = new UnboxDoubleInstr(use->CopyWithType(), deopt_id);
+      converted = new UnboxUint32x4Instr(to_value, deopt_id);
     } else if (to == kUnboxedFloat32x4) {
-      converted = new UnboxDoubleInstr(use->CopyWithType(), deopt_id);
+      converted = new UnboxFloat32x4Instr(to_value, deopt_id);
     } else if (to == kUnboxedMint) {
-      converted = new UnboxIntegerInstr(use->CopyWithType(), deopt_id);
+      converted = new UnboxIntegerInstr(to_value, deopt_id);
+    } else {
+      UNIMPLEMENTED();
     }
   }
   ASSERT(converted != NULL);
@@ -1236,15 +1267,12 @@
   } else if (HasOnlyOneDouble(*call->ic_data()) &&
              (op_kind == Token::kNEGATE)) {
     AddReceiverCheck(call);
-    ConstantInstr* minus_one =
-        flow_graph()->GetConstant(Double::ZoneHandle(Double::NewCanonical(-1)));
-    unary_op = new BinaryDoubleOpInstr(Token::kMUL,
-                                       new Value(input),
-                                       new Value(minus_one),
-                                       call->deopt_id());
+    unary_op = new UnaryDoubleOpInstr(
+        Token::kNEGATE, new Value(input), call->deopt_id());
+  } else {
+    return false;
   }
-  if (unary_op == NULL) return false;
-
+  ASSERT(unary_op != NULL);
   ReplaceCall(call, unary_op);
   return true;
 }
@@ -1480,13 +1508,23 @@
     ASSERT(call->ArgumentCount() == 2);
     // Extract shuffle mask.
     Definition* mask_definition = call->ArgumentAt(1);
+    if (!mask_definition->IsConstant()) {
+      // Not a constant.
+      return false;
+    }
     ASSERT(mask_definition->IsConstant());
     ConstantInstr* constant_instruction = mask_definition->AsConstant();
     const Object& constant_mask = constant_instruction->value();
+    if (!constant_mask.IsSmi()) {
+      // Not a smi.
+      return false;
+    }
     ASSERT(constant_mask.IsSmi());
     mask = Smi::Cast(constant_mask).Value();
-    ASSERT(mask >= 0);
-    ASSERT(mask <= 255);
+    if (mask < 0 || mask > 255) {
+      // Not a valid mask.
+      return false;
+    }
   }
   Float32x4ShuffleInstr* instr = new Float32x4ShuffleInstr(
       getter,
@@ -6372,6 +6410,17 @@
 }
 
 
+void ConstantPropagator::VisitUnaryDoubleOp(UnaryDoubleOpInstr* instr) {
+  const Object& value = instr->value()->definition()->constant_value();
+  if (IsNonConstant(value)) {
+    SetValue(instr, non_constant_);
+  } else if (IsConstant(value)) {
+    // TODO(kmillikin): Handle unary operations.
+    SetValue(instr, non_constant_);
+  }
+}
+
+
 void ConstantPropagator::VisitSmiToDouble(SmiToDoubleInstr* instr) {
   const Object& value = instr->value()->definition()->constant_value();
   if (IsConstant(value) && value.IsInteger()) {
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index bbd7cd3..41e83b6 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -567,9 +567,6 @@
     return false;
   }
 
-  // We should never test for an instance of null.
-  ASSERT(!type.IsNullType());
-
   // Consider the compile type of the value.
   const AbstractType& compile_type = *ToAbstractType();
   if (compile_type.IsMalformed()) {
@@ -981,6 +978,11 @@
 }
 
 
+CompileType UnaryDoubleOpInstr::ComputeType() const {
+  return CompileType::FromCid(kDoubleCid);
+}
+
+
 CompileType DoubleToSmiInstr::ComputeType() const {
   return CompileType::FromCid(kSmiCid);
 }
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index 02880071..2aab9ba 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -783,6 +783,12 @@
 }
 
 
+void UnaryDoubleOpInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("%s, ", Token::Str(op_kind()));
+  value()->PrintTo(f);
+}
+
+
 void CheckClassInstr::PrintOperandsTo(BufferFormatter* f) const {
   value()->PrintTo(f);
   PrintICData(f, unary_checks());
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index e71aba8..a3b7fc7 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -89,7 +89,7 @@
   V(Float32x4, Float32x4., Float32x4Constructor, 1876089990)                   \
   V(Float32x4, Float32x4.zero, Float32x4Zero, 1903586222)                      \
   V(Float32x4, Float32x4.splat, Float32x4Splat, 38462589)                      \
-  V(_Float32x4, _shuffle, Float32x4Shuffle, 2044955136)                        \
+  V(_Float32x4, shuffle, Float32x4Shuffle, 713523911)                          \
   V(_Float32x4, get:x, Float32x4ShuffleX, 1019523296)                          \
   V(_Float32x4, get:y, Float32x4ShuffleY, 710282243)                           \
   V(_Float32x4, get:z, Float32x4ShuffleZ, 1612806041)                          \
@@ -581,6 +581,7 @@
   M(CloneContext)                                                              \
   M(BinarySmiOp)                                                               \
   M(UnarySmiOp)                                                                \
+  M(UnaryDoubleOp)                                                             \
   M(CheckStackOverflow)                                                        \
   M(SmiToDouble)                                                               \
   M(DoubleToInteger)                                                           \
@@ -920,6 +921,7 @@
   friend class BinaryMintOpInstr;
   friend class BinarySmiOpInstr;
   friend class UnarySmiOpInstr;
+  friend class UnaryDoubleOpInstr;
   friend class ShiftMintOpInstr;
   friend class UnaryMintOpInstr;
   friend class MathUnaryInstr;
@@ -4714,7 +4716,7 @@
       : op_kind_(op_kind) {
     SetInputAt(0, left);
     SetInputAt(1, right);
-    // Overrided generated deopt_id.
+    // Overriden generated deopt_id.
     deopt_id_ = deopt_id;
   }
 
@@ -6053,6 +6055,58 @@
 };
 
 
+// Handles only NEGATE.
+class UnaryDoubleOpInstr : public TemplateDefinition<1> {
+ public:
+  UnaryDoubleOpInstr(Token::Kind op_kind,
+                     Value* value,
+                     intptr_t deopt_id)
+      : op_kind_(op_kind) {
+    ASSERT(op_kind == Token::kNEGATE);
+    SetInputAt(0, value);
+    // Overriden generated deopt_id.
+    deopt_id_ = deopt_id;
+  }
+
+  Value* value() const { return inputs_[0]; }
+  Token::Kind op_kind() const { return op_kind_; }
+
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+  DECLARE_INSTRUCTION(UnaryDoubleOp)
+  virtual CompileType ComputeType() const;
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual intptr_t DeoptimizationTarget() const {
+    // Direct access since this instruction cannot deoptimize, and the deopt-id
+    // was inherited from another instruction that could deoptimize.
+    return deopt_id_;
+  }
+
+  virtual Representation representation() const {
+    return kUnboxedDouble;
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT(idx == 0);
+    return kUnboxedDouble;
+  }
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+  virtual bool AttributesEqual(Instruction* other) const { return true; }
+
+  virtual bool MayThrow() const { return false; }
+
+ private:
+  const Token::Kind op_kind_;
+
+  DISALLOW_COPY_AND_ASSIGN(UnaryDoubleOpInstr);
+};
+
+
 class CheckStackOverflowInstr : public TemplateInstruction<0> {
  public:
   CheckStackOverflowInstr(intptr_t token_pos, intptr_t loop_depth)
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index ffa5755..04edbc1 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -3779,6 +3779,24 @@
 }
 
 
+LocationSummary* UnaryDoubleOpInstr::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::RequiresFpuRegister());
+  summary->set_out(Location::RequiresFpuRegister());
+  return summary;
+}
+
+
+void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  DRegister result = EvenDRegisterOf(locs()->out().fpu_reg());
+  DRegister value = EvenDRegisterOf(locs()->in(0).fpu_reg());
+  __ vnegd(result, value);
+}
+
+
 LocationSummary* SmiToDoubleInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 69e744c..412248c 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -3844,6 +3844,24 @@
 }
 
 
+LocationSummary* UnaryDoubleOpInstr::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::RequiresFpuRegister());
+  summary->set_out(Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  XmmRegister value = locs()->in(0).fpu_reg();
+  ASSERT(locs()->out().fpu_reg() == value);
+  __ DoubleNegate(value);
+}
+
+
 LocationSummary* SmiToDoubleInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 6740dbb..e84f418 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -3230,6 +3230,31 @@
 }
 
 
+LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary() const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(Location::RequiresFpuRegister());
+  summary->set_temp(0, Location::RequiresFpuRegister());
+  return summary;
+}
+
+
+void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  // TODO(zra): Implement vneg.
+  const Double& minus_one = Double::ZoneHandle(Double::NewCanonical(-1));
+  __ LoadObject(TMP, minus_one);
+  FpuRegister result = locs()->out().fpu_reg();
+  FpuRegister value = locs()->in(0).fpu_reg();
+  FpuRegister temp_fp = locs()->temp(0).fpu_reg();
+  __ LoadDFromOffset(temp_fp, TMP, Double::value_offset() - kHeapObjectTag);
+  __ muld(result, value, temp_fp);
+}
+
+
+
 LocationSummary* SmiToDoubleInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index a7303de..2a1a546 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -3776,6 +3776,48 @@
 }
 
 
+void UnarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register value = locs()->in(0).reg();
+  ASSERT(value == locs()->out().reg());
+  switch (op_kind()) {
+    case Token::kNEGATE: {
+      Label* deopt = compiler->AddDeoptStub(deopt_id(),
+                                            kDeoptUnaryOp);
+      __ negq(value);
+      __ j(OVERFLOW, deopt);
+      if (FLAG_throw_on_javascript_int_overflow) {
+        EmitJavascriptOverflowCheck(compiler, range(), deopt, value);
+      }
+      break;
+    }
+    case Token::kBIT_NOT:
+      __ notq(value);
+      __ andq(value, Immediate(~kSmiTagMask));  // Remove inverted smi-tag.
+      break;
+    default:
+      UNREACHABLE();
+  }
+}
+
+
+LocationSummary* UnaryDoubleOpInstr::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::RequiresFpuRegister());
+  summary->set_out(Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  XmmRegister value = locs()->in(0).fpu_reg();
+  ASSERT(locs()->out().fpu_reg() == value);
+  __ DoubleNegate(value);
+}
+
+
 LocationSummary* MathMinMaxInstr::MakeLocationSummary() const {
   if (result_cid() == kDoubleCid) {
     const intptr_t kNumInputs = 2;
@@ -3865,30 +3907,6 @@
 }
 
 
-void UnarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register value = locs()->in(0).reg();
-  ASSERT(value == locs()->out().reg());
-  switch (op_kind()) {
-    case Token::kNEGATE: {
-      Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                            kDeoptUnaryOp);
-      __ negq(value);
-      __ j(OVERFLOW, deopt);
-      if (FLAG_throw_on_javascript_int_overflow) {
-        EmitJavascriptOverflowCheck(compiler, range(), deopt, value);
-      }
-      break;
-    }
-    case Token::kBIT_NOT:
-      __ notq(value);
-      __ andq(value, Immediate(~kSmiTagMask));  // Remove inverted smi-tag.
-      break;
-    default:
-      UNREACHABLE();
-  }
-}
-
-
 LocationSummary* SmiToDoubleInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index b92355e..ca2a64d 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -417,8 +417,6 @@
 
   // Allocate and initialize the null class.
   cls = Class::New<Instance>(kNullCid);
-  cls.set_is_finalized();
-  cls.set_is_type_finalized();
   isolate->object_store()->set_null_class(cls);
 
   // Allocate and initialize the free list element class.
@@ -850,27 +848,6 @@
   // well as the core implementation dictionary have been setup, preallocate
   // remaining classes and register them by name in the dictionaries.
   String& name = String::Handle();
-  cls = Class::New<Bool>();
-  object_store->set_bool_class(cls);
-  RegisterClass(cls, Symbols::Bool(), core_lib);
-  pending_classes.Add(cls, Heap::kOld);
-
-  // TODO(12364): The class 'Null' is not registered in the class dictionary
-  // because it is not exported by dart:core.
-  cls = Class::New<Instance>(kNullCid);
-  cls.set_name(Symbols::Null());
-  // We immediately mark Null as finalized because it has no corresponding
-  // source.
-  cls.set_is_finalized();
-  cls.set_is_type_finalized();
-  object_store->set_null_class(cls);
-  cls.set_library(core_lib);  // A sort of fiction for the mirrors.
-  // When/if we promote Null to an ordinary class, it should be added to the
-  // core library, given source and added to the list of classes pending
-  // finalization.
-  // RegisterClass(cls, Symbols::Null(), core_lib);
-  // pending_classes.Add(cls, Heap::kOld);
-
   cls = object_store->array_class();  // Was allocated above.
   RegisterPrivateClass(cls, Symbols::ObjectArray(), core_lib);
   pending_classes.Add(cls, Heap::kOld);
@@ -938,6 +915,17 @@
   type = Type::NewNonParameterizedType(cls);
   object_store->set_object_type(type);
 
+  cls = Class::New<Bool>();
+  object_store->set_bool_class(cls);
+  RegisterClass(cls, Symbols::Bool(), core_lib);
+  pending_classes.Add(cls, Heap::kOld);
+
+  cls = Class::New<Instance>(kNullCid);
+  cls.set_is_prefinalized();
+  object_store->set_null_class(cls);
+  RegisterClass(cls, Symbols::Null(), core_lib);
+  pending_classes.Add(cls, Heap::kOld);
+
   cls = object_store->type_class();
   RegisterPrivateClass(cls, Symbols::Type(), core_lib);
   pending_classes.Add(cls, Heap::kOld);
@@ -10476,14 +10464,14 @@
 
 
 bool AbstractType::IsNullType() const {
-  ASSERT(Type::Handle(Type::NullType()).IsCanonical());
-  return raw() == Type::NullType();
+  return HasResolvedTypeClass() &&
+      (type_class() == Isolate::Current()->object_store()->null_class());
 }
 
 
 bool AbstractType::IsBoolType() const {
   return HasResolvedTypeClass() &&
-      (type_class() == Type::Handle(Type::BoolType()).type_class());
+      (type_class() == Isolate::Current()->object_store()->bool_class());
 }
 
 
diff --git a/runtime/vm/resolver.cc b/runtime/vm/resolver.cc
index b7c4901..1150b81 100644
--- a/runtime/vm/resolver.cc
+++ b/runtime/vm/resolver.cc
@@ -26,14 +26,7 @@
                                       const String& function_name,
                                       const ArgumentsDescriptor& args_desc) {
   // Figure out type of receiver first.
-  Class& cls = Class::Handle();
-  cls = receiver.clazz();
-  // For lookups treat null as an instance of class Object.
-  if (cls.IsNullClass()) {
-    cls = Isolate::Current()->object_store()->object_class();
-  }
-  ASSERT(!cls.IsNull());
-
+  const Class& cls = Class::Handle(receiver.clazz());
   return ResolveDynamicForReceiverClass(cls, function_name, args_desc);
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index 3401be7..c5d9bb0 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -129,30 +129,69 @@
   bool classNeedsRti(ClassElement cls);
   bool methodNeedsRti(FunctionElement function);
 
-  // The following methods are hooks for the backend to register its
-  // helper methods.
+  /// Called during resolution to notify to the backend that a class is
+  /// being instantiated.
   void registerInstantiatedClass(ClassElement cls,
                                  Enqueuer enqueuer,
                                  TreeElements elements) {}
+
+  /// Called during resolution to notify to the backend that the
+  /// program uses string interpolation.
   void registerStringInterpolation(TreeElements elements) {}
+
+  /// Called during resolution to notify to the backend that the
+  /// program has a catch statement.
   void registerCatchStatement(Enqueuer enqueuer,
                               TreeElements elements) {}
-  void registerWrapException(TreeElements elements) {}
+
+  /// Called during resolution to notify to the backend that the
+  /// program explicitly throws an exception.
   void registerThrowExpression(TreeElements elements) {}
+
+  /// Called during resolution to notify to the backend that the
+  /// program has a global variable with a lazy initializer.
   void registerLazyField(TreeElements elements) {}
+
+  /// Called during resolution to notify to the backend that the
+  /// program uses a type variable as an expression.
   void registerTypeVariableExpression(TreeElements elements) {}
+
+  /// Called during resolution to notify to the backend that the
+  /// program uses a type literal.
   void registerTypeLiteral(Element element, TreeElements elements) {}
+
+  /// Called during resolution to notify to the backend that the
+  /// program has a catch statement with a stack trace.
   void registerStackTraceInCatch(TreeElements elements) {}
+
+  /// Register an is check to the backend.
   void registerIsCheck(DartType type,
                        Enqueuer enqueuer,
                        TreeElements elements) {}
+
+  /// Register an as check to the backend.
   void registerAsCheck(DartType type, TreeElements elements) {}
+
+  /// Register that the application may throw a [NoSuchMethodError].
   void registerThrowNoSuchMethod(TreeElements elements) {}
+
+  /// Register that the application may throw a [RuntimeError].
   void registerThrowRuntimeError(TreeElements elements) {}
+
+  /// Register that the application may throw an
+  /// [AbstractClassInstantiationError].
   void registerAbstractClassInstantiation(TreeElements elements) {}
+
+  /// Register that the application may throw a [FallThroughError].
   void registerFallThroughError(TreeElements elements) {}
+
+  /// Register that a super call will end up calling
+  /// [: super.noSuchMethod :].
   void registerSuperNoSuchMethod(TreeElements elements) {}
+
+  /// Register that the application creates a constant map.
   void registerConstantMap(TreeElements elements) {}
+
   /**
    * Call this to register that an instantiated generic class has a call
    * method.
@@ -222,6 +261,12 @@
   /// Returns true if this element should be retained for reflection even if it
   /// would normally be tree-shaken away.
   bool isNeededForReflection(Element element) => false;
+
+  /// Returns true if global optimizations such as type inferencing
+  /// can apply to this element. One category of elements that do not
+  /// apply is runtime helpers that the backend calls, but the
+  /// optimizations don't see those calls.
+  bool canBeUsedForGlobalOptimizations(Element element) => true;
 }
 
 /**
@@ -780,6 +825,7 @@
     listClass = lookupCoreClass('List');
     typeClass = lookupCoreClass('Type');
     mapClass = lookupCoreClass('Map');
+    nullClass = lookupCoreClass('Null');
     stackTraceClass = lookupCoreClass('StackTrace');
     if (!missingCoreClasses.isEmpty) {
       internalErrorOnElement(coreLibrary,
@@ -804,7 +850,6 @@
     boundClosureClass = lookupHelperClass('BoundClosure');
     closureClass = lookupHelperClass('Closure');
     dynamicClass = lookupHelperClass('Dynamic_');
-    nullClass = lookupHelperClass('Null');
     if (!missingHelperClasses.isEmpty) {
       internalErrorOnElement(jsHelperLibrary,
           'dart:_js_helper library does not contain required classes: '
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index 235a943..65a4c56 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -332,6 +332,12 @@
            && (identical(element.kind, ElementKind.FUNCTION));
   }
 
+  static bool isNativeOrExtendsNative(ClassElement element) {
+    if (element == null) return false;
+    if (element.isNative()) return true;
+    return isNativeOrExtendsNative(element.superclass);
+  }
+
   static bool isInstanceSend(Send send, TreeElements elements) {
     Element element = elements[send];
     if (element == null) return !isClosureSend(send, element);
@@ -358,7 +364,7 @@
       return new SourceString(reconstructConstructorName(element));
     }
   }
-  
+
   // TODO(johnniwinther): Remove this method.
   static String reconstructConstructorName(Element element) {
     String className = element.getEnclosingClass().name.slowToString();
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index 3bdbe46..3ab0a44 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -1419,16 +1419,17 @@
   FunctionElement get targetConstructor => superMember;
 
   FunctionSignature computeSignature(compiler) {
+    if (functionSignature != null) return functionSignature;
     if (isDefaultConstructor) {
-      return new FunctionSignatureX(
+      return functionSignature = new FunctionSignatureX(
           const Link<Element>(), const Link<Element>(), 0, 0, false,
           getEnclosingClass().thisType);
     }
     if (superMember.isErroneous()) {
-      return compiler.objectClass.localLookup(
+      return functionSignature = compiler.objectClass.localLookup(
           const SourceString('')).computeSignature(compiler);
     }
-    return superMember.computeSignature(compiler);
+    return functionSignature = superMember.computeSignature(compiler);
   }
 
   get declaration => this;
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index c4b8f52..ee46294 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -201,6 +201,14 @@
   Element getInterceptorMethod;
   Element interceptedNames;
 
+  /**
+   * This element is a top-level variable (in generated output) that the
+   * compiler initializes to a datastructure used to map from a Type to the
+   * interceptor.  See declaration of `mapTypeToInterceptor` in
+   * `interceptors.dart`.
+   */
+  Element mapTypeToInterceptor;
+
   HType stringType;
   HType indexablePrimitiveType;
   HType readableArrayType;
@@ -333,6 +341,9 @@
   /// element must be retained.
   final Set<Element> metaTargetsUsed = new Set<Element>();
 
+  /// List of elements that the backend may use.
+  final Set<Element> helpersUsed = new Set<Element>();
+
   JavaScriptBackend(Compiler compiler, bool generateSourceMap, bool disableEval)
       : namer = determineNamer(compiler),
         oneShotInterceptors = new Map<String, Selector>(),
@@ -354,9 +365,16 @@
         new Namer(compiler);
   }
 
+  bool canBeUsedForGlobalOptimizations(Element element) {
+    if (element.isParameter() || element.isFieldParameter()) {
+      element = element.enclosingElement;
+    }
+    return !helpersUsed.contains(element.declaration);
+  }
+
   bool isInterceptorClass(ClassElement element) {
     if (element == null) return false;
-    if (element.isNative()) return true;
+    if (Elements.isNativeOrExtendsNative(element)) return true;
     if (interceptedClasses.contains(element)) return true;
     if (classesMixedIntoNativeClasses.contains(element)) return true;
     return false;
@@ -412,7 +430,7 @@
       Set<ClassElement> result = new Set<ClassElement>();
       for (Element element in intercepted) {
         ClassElement classElement = element.getEnclosingClass();
-        if (classElement.isNative()
+        if (Elements.isNativeOrExtendsNative(classElement)
             || interceptedClasses.contains(classElement)) {
           result.add(classElement);
         }
@@ -434,7 +452,7 @@
       Iterable<ClassElement> subclasses = compiler.world.subclassesOf(use);
       if (subclasses != null) {
         for (ClassElement subclass in subclasses) {
-          if (subclass.isNative()) {
+          if (Elements.isNativeOrExtendsNative(subclass)) {
             if (result == null) result = new Set<ClassElement>();
             result.add(subclass);
           }
@@ -454,6 +472,8 @@
         compiler.findInterceptor(const SourceString('getInterceptor'));
     interceptedNames =
         compiler.findInterceptor(const SourceString('interceptedNames'));
+    mapTypeToInterceptor =
+        compiler.findInterceptor(const SourceString('mapTypeToInterceptor'));
     dispatchPropertyName =
         compiler.findInterceptor(const SourceString('dispatchPropertyName'));
     getDispatchPropertyMethod =
@@ -594,7 +614,7 @@
             member.name, () => new Set<Element>());
         set.add(member);
         if (classElement == jsInterceptorClass) return;
-        if (!classElement.isNative()) {
+        if (classElement.isMixinApplication) {
           MixinApplicationElement mixinApplication = classElement;
           assert(member.getEnclosingClass() == mixinApplication.mixin);
           classesMixedIntoNativeClasses.add(mixinApplication.mixin);
@@ -703,7 +723,7 @@
       addInterceptors(jsPlainJavaScriptObjectClass, enqueuer, elements);
     } else if (cls == jsUnknownJavaScriptObjectClass) {
       addInterceptors(jsUnknownJavaScriptObjectClass, enqueuer, elements);
-    } else if (cls.isNative()) {
+    } else if (Elements.isNativeOrExtendsNative(cls)) {
       addInterceptorsForNativeClassMembers(cls, enqueuer);
     }
   }
@@ -741,7 +761,7 @@
       // TODO(ngeoffray): Should we have the resolver register those instead?
       Element e =
           compiler.findHelper(const SourceString('boolConversionCheck'));
-      if (e != null) world.addToWorkList(e);
+      if (e != null) enqueue(world, e, elements);
     }
   }
 
@@ -762,11 +782,11 @@
     ensure(jsUnknownJavaScriptObjectClass);
   }
 
-  void registerWrapException(TreeElements elements) {
-    enqueueInResolution(getWrapExceptionHelper(), elements);
-  }
-
   void registerThrowExpression(TreeElements elements) {
+    // 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 the throwExpression helper.
+    enqueueInResolution(getWrapExceptionHelper(), elements);
     enqueueInResolution(getThrowExpressionHelper(), elements);
   }
 
@@ -845,10 +865,10 @@
     // need to register checked mode helpers.
     if (inCheckedMode) {
       CheckedModeHelper helper = getCheckedModeHelper(type, typeCast: false);
-      if (helper != null) world.addToWorkList(helper.getElement(compiler));
+      if (helper != null) enqueue(world, helper.getElement(compiler), elements);
       // We also need the native variant of the check (for DOM types).
       helper = getNativeCheckedModeHelper(type, typeCast: false);
-      if (helper != null) world.addToWorkList(helper.getElement(compiler));
+      if (helper != null) enqueue(world, helper.getElement(compiler), elements);
     }
     bool isTypeVariable = type.kind == TypeKind.TYPE_VARIABLE;
     if (!type.isRaw || type.containsTypeVariables) {
@@ -874,8 +894,9 @@
       // We will neeed to add the "$is" and "$as" properties on the
       // JavaScript object prototype, so we make sure
       // [:defineProperty:] is compiled.
-      world.addToWorkList(
-          compiler.findHelper(const SourceString('defineProperty')));
+      enqueue(world,
+              compiler.findHelper(const SourceString('defineProperty')),
+              elements);
     }
    }
 
@@ -892,14 +913,25 @@
 
   void registerThrowNoSuchMethod(TreeElements elements) {
     enqueueInResolution(getThrowNoSuchMethod(), elements);
+    // Also register the types of the arguments passed to this method.
+    compiler.enqueuer.resolution.registerInstantiatedClass(
+        compiler.listClass, elements);
+    compiler.enqueuer.resolution.registerInstantiatedClass(
+        compiler.stringClass, elements);
   }
 
   void registerThrowRuntimeError(TreeElements elements) {
     enqueueInResolution(getThrowRuntimeError(), elements);
+    // Also register the types of the arguments passed to this method.
+    compiler.enqueuer.resolution.registerInstantiatedClass(
+        compiler.stringClass, elements);
   }
 
   void registerAbstractClassInstantiation(TreeElements elements) {
     enqueueInResolution(getThrowAbstractClassInstantiationError(), elements);
+    // Also register the types of the arguments passed to this method.
+    compiler.enqueuer.resolution.registerInstantiatedClass(
+        compiler.stringClass, elements);
   }
 
   void registerFallThroughError(TreeElements elements) {
@@ -976,7 +1008,15 @@
            compiler.enabledRuntimeType;
   }
 
+  // Enqueue [e] in [enqueuer].
+  //
+  // The backend must *always* call this method when enqueuing an
+  // element. Calls done by the backend are not seen by global
+  // optimizations, so they would make these optimizations unsound.
+  // Therefore we need to collect the list of helpers the backend may
+  // use.
   void enqueue(Enqueuer enqueuer, Element e, TreeElements elements) {
+    helpersUsed.add(e.declaration);
     enqueuer.addToWorkList(e);
     elements.registerDependency(e);
   }
@@ -1329,19 +1369,6 @@
     return compiler.findHelper(const SourceString("throwCyclicInit"));
   }
 
-  /**
-   * Remove [element] from the set of generated code, and put it back
-   * into the worklist.
-   *
-   * Invariant: [element] must be a declaration element.
-   */
-  void eagerRecompile(Element element) {
-    assert(invariant(element, element.isDeclaration));
-    generatedCode.remove(element);
-    generatedBailoutCode.remove(element);
-    compiler.enqueuer.codegen.addToWorkList(element);
-  }
-
   bool isNullImplementation(ClassElement cls) {
     return cls == jsNullClass;
   }
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
index 32d3ab8..965822e 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
@@ -1296,6 +1296,8 @@
   /// O is the named arguments.
   /// The reflection name of a constructor is similar to a regular method but
   /// starts with 'new '.
+  /// The reflection name of class 'C' is 'C'.
+  /// An anonymous mixin application has no reflection name.
   /// This is used by js_mirrors.dart.
   String getReflectionName(elementOrSelector, String mangledName) {
     SourceString name = elementOrSelector.name;
@@ -1982,7 +1984,11 @@
     buffer.write(jsAst.prettyPrint(builder.toObjectInitializer(), compiler));
     if (backend.shouldRetainName(classElement.name)) {
       String reflectionName = getReflectionName(classElement, className);
-      buffer.write(',$n$n"+$reflectionName": 0');
+      List<int> interfaces = <int>[];
+      for (DartType interface in classElement.interfaces) {
+        interfaces.add(reifyType(interface));
+      }
+      buffer.write(',$n$n"+$reflectionName": $interfaces');
     }
   }
 
@@ -2631,6 +2637,8 @@
     for (Element element in Elements.sortedByPosition(staticNonFinalFields)) {
       // [:interceptedNames:] is handled in [emitInterceptedNames].
       if (element == backend.interceptedNames) continue;
+      // `mapTypeToInterceptor` is handled in [emitMapTypeToInterceptor].
+      if (element == backend.mapTypeToInterceptor) continue;
       compiler.withCurrentElement(element, () {
         Constant initialValue = handler.getInitialValueFor(element);
         jsAst.Expression init =
@@ -2984,7 +2992,7 @@
   }
 
   var scripts = document.scripts;
-  function onLoad() {
+  function onLoad(event) {
     for (var i = 0; i < scripts.length; ++i) {
       scripts[i].removeEventListener('load', onLoad, false);
     }
@@ -3008,8 +3016,7 @@
   } else {
     ${mainCall};
   }
-});
-""");
+})$N""");
     addComment('END invoke [main].', buffer);
   }
 
@@ -3056,6 +3063,9 @@
     bool hasNumber = false;
     bool hasString = false;
     bool hasNative = false;
+    bool anyNativeClasses = compiler.enqueuer.codegen.nativeEnqueuer
+          .hasInstantiatedNativeClasses();
+
     for (ClassElement cls in classes) {
       if (cls == backend.jsArrayClass ||
           cls == backend.jsMutableArrayClass ||
@@ -3068,10 +3078,18 @@
       else if (cls == backend.jsNumberClass) hasNumber = true;
       else if (cls == backend.jsStringClass) hasString = true;
       else {
-        // TODO(sra): The set of classes includes classes mixed-in to
-        // interceptor classes.
-        // assert(cls == compiler.objectClass || cls.isNative());
-        if (cls.isNative()) hasNative = true;
+        // The set of classes includes classes mixed-in to interceptor classes
+        // and user extensions of native classes.
+        //
+        // The set of classes also includes the 'primitive' interceptor
+        // PlainJavaScriptObject even when it has not been resolved, since it is
+        // only resolved through the reference in getNativeInterceptor when
+        // getNativeInterceptor is marked as used.  Guard against probing
+        // unresolved PlainJavaScriptObject by testing for anyNativeClasses.
+
+        if (anyNativeClasses) {
+          if (Elements.isNativeOrExtendsNative(cls)) hasNative = true;
+        }
       }
     }
     if (hasDouble) {
@@ -3081,8 +3099,7 @@
 
     if (classes == backend.interceptedClasses) {
       // I.e. this is the general interceptor.
-      hasNative = compiler.enqueuer.codegen.nativeEnqueuer
-          .hasInstantiatedNativeClasses();
+      hasNative = anyNativeClasses;
     }
 
     jsAst.Block block = new jsAst.Block.empty();
@@ -3245,9 +3262,13 @@
     for (ClassElement element in sortedClasses) {
       if (rtiNeededClasses.contains(element)) {
         regularClasses.add(element);
-      } else if (element.isNative()) {
-        // For now, native classes cannot be deferred.
+      } else if (Elements.isNativeOrExtendsNative(element)) {
+        // For now, native classes and related classes cannot be deferred.
         nativeClasses.add(element);
+        if (!element.isNative()) {
+          assert(invariant(element, !isDeferred(element)));
+          regularClasses.add(element);
+        }
       } else if (isDeferred(element)) {
         deferredClasses.add(element);
       } else {
@@ -3305,8 +3326,10 @@
     return rtiNeededClasses;
   }
 
-  // Optimize performance critical one shot interceptors.
-  jsAst.Statement tryOptimizeOneShotInterceptor(Selector selector,
+  // Returns a statement that takes care of performance critical
+  // common case for a one-shot interceptor, or null if there is no
+  // fast path.
+  jsAst.Statement fastPathForOneShotInterceptor(Selector selector,
                                                 Set<ClassElement> classes) {
     jsAst.Expression isNumber(String variable) {
       return js('typeof $variable == "number"');
@@ -3329,11 +3352,10 @@
       String name = selector.name.stringValue;
       if (name == '==') {
         // Unfolds to:
-        // [: if (receiver == null) return a0 == null;
+        //    if (receiver == null) return a0 == null;
         //    if (typeof receiver != 'object') {
         //      return a0 != null && receiver === a0;
         //    }
-        // :].
         List<jsAst.Statement> body = <jsAst.Statement>[];
         body.add(js.if_('receiver == null', js.return_(js('a0 == null'))));
         body.add(js.if_(
@@ -3349,23 +3371,21 @@
       if (selector.argumentCount == 1) {
         // The following operators do not map to a JavaScript
         // operator.
-        if (name != '~/' && name != '<<' && name != '%' && name != '>>') {
-          jsAst.Expression result = js('receiver').binary(name, js('a0'));
-          if (name == '&' || name == '|' || name == '^') {
-            result = tripleShiftZero(result);
-          }
-          // Unfolds to:
-          // [: if (typeof receiver == "number" && typeof a0 == "number")
-          //      return receiver op a0;
-          // :].
-          return js.if_(
-              isNumber('receiver').binary('&&', isNumber('a0')),
-              js.return_(result));
+        if (name == '~/' || name == '<<' || name == '%' || name == '>>') {
+          return null;
         }
-      } else if (name == 'unary-') {
-        // operator~ does not map to a JavaScript operator.
+        jsAst.Expression result = js('receiver').binary(name, js('a0'));
+        if (name == '&' || name == '|' || name == '^') {
+          result = tripleShiftZero(result);
+        }
         // Unfolds to:
-        // [: if (typeof receiver == "number") return -receiver:].
+        //    if (typeof receiver == "number" && typeof a0 == "number")
+        //      return receiver op a0;
+        return js.if_(
+            isNumber('receiver').binary('&&', isNumber('a0')),
+            js.return_(result));
+      } else if (name == 'unary-') {
+        // [: if (typeof receiver == "number") return -receiver :].
         return js.if_(isNumber('receiver'),
                       js.return_(js('-receiver')));
       } else {
@@ -3376,21 +3396,19 @@
     } else if (selector.isIndex() || selector.isIndexSet()) {
       // For an index operation, this code generates:
       //
-      // [: if (receiver.constructor == Array || typeof receiver == "string") {
+      //    if (receiver.constructor == Array || typeof receiver == "string") {
       //      if (a0 >>> 0 === a0 && a0 < receiver.length) {
       //        return receiver[a0];
       //      }
       //    }
-      // :]
       //
       // For an index set operation, this code generates:
       //
-      // [: if (receiver.constructor == Array && !receiver.immutable$list) {
+      //    if (receiver.constructor == Array && !receiver.immutable$list) {
       //      if (a0 >>> 0 === a0 && a0 < receiver.length) {
       //        return receiver[a0] = a1;
       //      }
       //    }
-      // :]
       bool containsArray = classes.contains(backend.jsArrayClass);
       bool containsString = classes.contains(backend.jsStringClass);
       // The index set operator requires a check on its set value in
@@ -3463,7 +3481,7 @@
 
       List<jsAst.Statement> body = <jsAst.Statement>[];
       jsAst.Statement optimizedPath =
-          tryOptimizeOneShotInterceptor(selector, classes);
+          fastPathForOneShotInterceptor(selector, classes);
       if (optimizedPath != null) {
         body.add(optimizedPath);
       }
@@ -3511,6 +3529,37 @@
     buffer.write(N);
   }
 
+  /**
+   * Emit initializer for [mapTypeToInterceptor] data structure used by
+   * [findInterceptorForType].  See declaration of [mapTypeToInterceptor] in
+   * `interceptors.dart`.
+   */
+  void emitMapTypeToInterceptor(CodeBuffer buffer) {
+    // TODO(sra): Perhaps inject a constant instead?
+    // TODO(sra): Filter by subclasses of native types.
+    List<jsAst.Expression> elements = <jsAst.Expression>[];
+    ConstantHandler handler = compiler.constantHandler;
+    List<Constant> constants = handler.getConstantsForEmission();
+    for (Constant constant in constants) {
+      if (constant is TypeConstant) {
+        TypeConstant typeConstant = constant;
+        Element element = typeConstant.representedType.element;
+        if (element is ClassElement) {
+          ClassElement classElement = element;
+          elements.add(backend.emitter.constantReference(constant));
+          elements.add(js(namer.isolateAccess(classElement)));
+        }
+      }
+    }
+
+    jsAst.ArrayInitializer array = new jsAst.ArrayInitializer.from(elements);
+    String name = backend.namer.getName(backend.mapTypeToInterceptor);
+    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 = {}'),
@@ -3587,7 +3636,7 @@
     if (!backend.retainMetadataOf(element)) return code;
     return compiler.withCurrentElement(element, () {
       List<int> metadata = <int>[];
-      FunctionSignature signature = element.computeSignature(compiler);
+      FunctionSignature signature = element.functionSignature;
       if (element.isConstructor()) {
         metadata.add(reifyType(element.getEnclosingClass().thisType));
       } else {
@@ -3843,6 +3892,7 @@
       emitStaticNonFinalFieldInitializations(mainBuffer);
       emitOneShotInterceptors(mainBuffer);
       emitInterceptedNames(mainBuffer);
+      emitMapTypeToInterceptor(mainBuffer);
       emitLazilyInitializedStaticFields(mainBuffer);
 
       mainBuffer.add(nativeBuffer);
@@ -4013,10 +4063,17 @@
     String metadataField = '"${namer.metadataField}"';
     return '''
 (function (reflectionData) {
+'''
+// [map] returns an object literal that V8 shouldn't try to optimize with a
+// hidden class. This prevents a potential performance problem where V8 tries
+// to build a hidden class for an object used as a hashMap.
+'''
+  function map(x){x={x:x};delete x.x;return x}
   if (!init.libraries) init.libraries = [];
-  if (!init.mangledNames) init.mangledNames = {};
-  if (!init.mangledGlobalNames) init.mangledGlobalNames = {};
-  if (!init.statics) init.statics = {};
+  if (!init.mangledNames) init.mangledNames = map();
+  if (!init.mangledGlobalNames) init.mangledGlobalNames = map();
+  if (!init.statics) init.statics = map();
+  if (!init.interfaces) init.interfaces = map();
   var libraries = init.libraries;
   var mangledNames = init.mangledNames;
   var mangledGlobalNames = init.mangledGlobalNames;
@@ -4052,6 +4109,8 @@
         var previousProperty;
         if (firstChar === "+") {
           mangledGlobalNames[previousProperty] = property.substring(1);
+          if (element && element.length) ''' // Breaking long line.
+'''init.interfaces[previousProperty] = element;
         } else if (firstChar === "@") {
           property = property.substring(1);
           ${namer.CURRENT_ISOLATE}[property][$metadataField] = element;
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
index 7d14262..7a6e6f3 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
@@ -569,11 +569,11 @@
       return cls.name.slowToString();
     }
     List<String> names = classes
-        .where((cls) => !cls.isNative())
+        .where((cls) => !Elements.isNativeOrExtendsNative(cls))
         .map(abbreviate)
         .toList();
     // There is one dispatch mechanism for all native classes.
-    if (classes.any((cls) => cls.isNative())) {
+    if (classes.any((cls) => Elements.isNativeOrExtendsNative(cls))) {
       names.add("x");
     }
     // Sort the names of the classes after abbreviating them to ensure
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 53fc608..9b3ac22 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
@@ -93,6 +93,12 @@
     return backend.namer.isolateAccess(element);
   }
 
+  String get defineNativeMethodsExtendedName {
+    Element element = compiler.findHelper(
+        const SourceString('defineNativeMethodsExtended'));
+    return backend.namer.isolateAccess(element);
+  }
+
   String get defineNativeMethodsFinishName {
     Element element = compiler.findHelper(
         const SourceString('defineNativeMethodsFinish'));
@@ -118,6 +124,10 @@
    * benefit), due to how [getNativeInterceptor] works.  Finding the interceptor
    * of a leaf class in the hierarchy is more efficient that a non-leaf, so it
    * improves performance when more classes can be treated as leaves.
+   *
+   * [classes] contains native classes, mixin applications, and user subclasses
+   * of native classes.  ONLY the native classes are generated here.  [classes]
+   * is sorted in desired output order.
    */
   void generateNativeClasses(List<ClassElement> classes,
                              CodeBuffer mainBuffer) {
@@ -127,8 +137,10 @@
 
     List<ClassElement> preOrder = <ClassElement>[];
     Set<ClassElement> seen = new Set<ClassElement>();
+    seen..add(compiler.objectClass)
+        ..add(backend.jsInterceptorClass);
     void walk(ClassElement element) {
-      if (seen.contains(element) || element == compiler.objectClass) return;
+      if (seen.contains(element)) return;
       seen.add(element);
       walk(element.superclass);
       preOrder.add(element);
@@ -140,8 +152,10 @@
     Map<ClassElement, ClassBuilder> builders =
         new Map<ClassElement, ClassBuilder>();
     for (ClassElement classElement in classes) {
-      ClassBuilder builder = generateNativeClass(classElement);
-      builders[classElement] = builder;
+      if (classElement.isNative()) {
+        ClassBuilder builder = generateNativeClass(classElement);
+        builders[classElement] = builder;
+      }
     }
 
     // Find which classes are needed and which are non-leaf classes.  Any class
@@ -150,6 +164,10 @@
 
     Set<ClassElement> neededClasses = new Set<ClassElement>();
     Set<ClassElement> nonleafClasses = new Set<ClassElement>();
+
+    Map<ClassElement, List<ClassElement>> extensionPoints =
+        computeExtensionPoints(preOrder);
+
     neededClasses.add(compiler.objectClass);
 
     Set<ClassElement> neededByConstant =
@@ -176,6 +194,8 @@
         // TODO(9556): Remove this test when [emitRuntimeTypeSupport] no longer
         // adds information to a class prototype or constructor.
         needed = true;
+      } else if (extensionPoints.containsKey(classElement)) {
+        needed = true;
       }
 
       if (needed || neededClasses.contains(classElement)) {
@@ -185,7 +205,7 @@
       }
     }
 
-    // Collect all the tags that map to each class.
+    // Collect all the tags that map to each native class.
 
     Map<ClassElement, Set<String>> leafTags =
         new Map<ClassElement, Set<String>>();
@@ -193,9 +213,11 @@
         new Map<ClassElement, Set<String>>();
 
     for (ClassElement classElement in classes) {
+      if (!classElement.isNative()) continue;
       List<String> nativeTags = nativeTagsOfClass(classElement);
 
-      if (nonleafClasses.contains(classElement)) {
+      if (nonleafClasses.contains(classElement) ||
+          extensionPoints.containsKey(classElement)) {
         nonleafTags
             .putIfAbsent(classElement, () => new Set<String>())
             .addAll(nativeTags);
@@ -218,10 +240,19 @@
     if (compiler.enqueuer.codegen.nativeEnqueuer
         .hasInstantiatedNativeClasses()) {
       void generateDefines(ClassElement classElement) {
-        generateDefineNativeMethods(leafTags[classElement], classElement,
-            defineNativeMethodsName);
-        generateDefineNativeMethods(nonleafTags[classElement], classElement,
-            defineNativeMethodsNonleafName);
+        generateDefineNativeMethods(leafTags[classElement],
+            null,
+            classElement, defineNativeMethodsName);
+        List<ClassElement> extensions = extensionPoints[classElement];
+        if (extensions == null) {
+          generateDefineNativeMethods(nonleafTags[classElement],
+              null,
+              classElement, defineNativeMethodsNonleafName);
+        } else {
+          generateDefineNativeMethods(nonleafTags[classElement],
+              makeSubclassList(extensions),
+              classElement, defineNativeMethodsExtendedName);
+        }
       }
       generateDefines(backend.jsInterceptorClass);
       for (ClassElement classElement in classes) {
@@ -231,6 +262,7 @@
 
     // Emit the native class interceptors that were actually used.
     for (ClassElement classElement in classes) {
+      if (!classElement.isNative()) continue;
       if (neededClasses.contains(classElement)) {
         // Define interceptor class for [classElement].
         emitter.emitClassBuilderWithReflectionData(
@@ -242,6 +274,38 @@
     }
   }
 
+  /**
+   * Computes the native classes that are extended (subclassed) by non-native
+   * classes and the set non-mative classes that extend them.  (A List is used
+   * instead of a Set for out stability).
+   */
+  Map<ClassElement, List<ClassElement>> computeExtensionPoints(
+      List<ClassElement> classes) {
+    ClassElement nativeSuperclassOf(ClassElement element) {
+      if (element == null) return null;
+      if (element.isNative()) return element;
+      return nativeSuperclassOf(element.superclass);
+    }
+
+    ClassElement nativeAncestorOf(ClassElement element) {
+      return nativeSuperclassOf(element.superclass);
+    }
+
+    Map<ClassElement, List<ClassElement>> map =
+        new Map<ClassElement, List<ClassElement>>();
+
+    for (ClassElement classElement in classes) {
+      if (classElement.isNative()) continue;
+      ClassElement nativeAncestor = nativeAncestorOf(classElement);
+      if (nativeAncestor != null) {
+        map
+          .putIfAbsent(nativeAncestor, () => <ClassElement>[])
+          .add(classElement);
+      }
+    }
+    return map;
+  }
+
   ClassBuilder generateNativeClass(ClassElement classElement) {
     assert(!classElement.hasBackendMembers);
     nativeClasses.add(classElement);
@@ -249,6 +313,7 @@
     ClassElement superclass = classElement.superclass;
     assert(superclass != null);
     // Fix superclass.  TODO(sra): make native classes inherit from Interceptor.
+    assert(superclass != compiler.objectClass);
     if (superclass == compiler.objectClass) {
       superclass = backend.jsInterceptorClass;
     }
@@ -275,18 +340,28 @@
   }
 
   void generateDefineNativeMethods(
-      Set<String> tags, ClassElement classElement, String definer) {
+      Set<String> tags, jsAst.Expression extraArgument,
+      ClassElement classElement, String definer) {
     if (tags == null) return;
     String tagsString = (tags.toList()..sort()).join('|');
-    jsAst.Expression definition =
-        js(definer)(
-            [js.string(tagsString),
-             js(backend.namer.isolateAccess(classElement))]);
+
+    List arguments = [
+        js.string(tagsString),
+        js(backend.namer.isolateAccess(classElement))];
+    if (extraArgument != null) {
+      arguments.add(extraArgument);
+    }
+    jsAst.Expression definition = js(definer)(arguments);
 
     nativeBuffer.add(jsAst.prettyPrint(definition, compiler));
     nativeBuffer.add('$N$n');
   }
 
+  jsAst.Expression makeSubclassList(List<ClassElement> classes) {
+    return new jsAst.ArrayInitializer.from(
+        classes.map((ClassElement classElement) =>
+            js(backend.namer.isolateAccess(classElement))));
+  }
 
   void finishGenerateNativeClasses() {
     // TODO(sra): Put specialized version of getNativeMethods on
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
index 2910563..74b6e56 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
@@ -90,11 +90,12 @@
     return <Dart2JsMemberMirror>[new Dart2JsMethodMirror(library, element)];
   } else if (element is AbstractFieldElement) {
     var members = <Dart2JsMemberMirror>[];
-    if (element.getter != null) {
-      members.add(new Dart2JsMethodMirror(library, element.getter));
+    AbstractFieldElement field = element;
+    if (field.getter != null) {
+      members.add(new Dart2JsMethodMirror(library, field.getter));
     }
-    if (element.setter != null) {
-      members.add(new Dart2JsMethodMirror(library, element.setter));
+    if (field.setter != null) {
+      members.add(new Dart2JsMethodMirror(library, field.setter));
     }
     return members;
   }
@@ -882,7 +883,7 @@
     return _typeVariables;
   }
 
-  bool operator ==(Object other) {
+  bool operator ==(other) {
     if (identical(this, other)) {
       return true;
     }
@@ -1138,7 +1139,7 @@
   // TODO(johnniwinther): Substitute type arguments for type variables.
   Map<String, VariableMirror> get variables => originalDeclaration.variables;
 
-  bool operator ==(Object other) {
+  bool operator ==(other) {
     if (identical(this, other)) {
       return true;
     }
@@ -1257,7 +1258,7 @@
 
   bool get isVoid => true;
 
-  bool operator ==(Object other) {
+  bool operator ==(other) {
     if (identical(this, other)) {
       return true;
     }
@@ -1289,7 +1290,7 @@
 
   bool get isDynamic => true;
 
-  bool operator ==(Object other) {
+  bool operator ==(other) {
     if (identical(this, other)) {
       return true;
     }
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
index 182a83f..81fcc90 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
@@ -105,7 +105,8 @@
   if (owner is LibraryMirror) {
     return owner;
   } else if (owner is TypeMirror) {
-    return owner.library;
+    TypeMirror mirror = owner;
+    return mirror.library;
   }
   throw new Exception('Unexpected owner: ${owner}');
 }
@@ -250,16 +251,19 @@
 DeclarationMirror _lookupLocal(Mirror mirror, String id) {
   DeclarationMirror result;
   if (mirror is ContainerMirror) {
+    ContainerMirror containerMirror = mirror;
     // Try member lookup.
-    result = mirror.members[id];
+    result = containerMirror.members[id];
   }
   if (result != null) return result;
   if (mirror is ClassMirror) {
+    ClassMirror classMirror = mirror;
     // Try type variables.
-    result = mirror.typeVariables.firstWhere(
+    result = classMirror.typeVariables.firstWhere(
         (TypeVariableMirror v) => v.simpleName == id, orElse: () => null);
   } else if (mirror is MethodMirror) {
-    result = mirror.parameters.firstWhere(
+    MethodMirror methodMirror = mirror;
+    result = methodMirror.parameters.firstWhere(
         (ParameterMirror p) => p.simpleName == id, orElse: () => null);
   }
   return result;
diff --git a/sdk/lib/_internal/compiler/implementation/native_handler.dart b/sdk/lib/_internal/compiler/implementation/native_handler.dart
index ed7fb1f..724383c 100644
--- a/sdk/lib/_internal/compiler/implementation/native_handler.dart
+++ b/sdk/lib/_internal/compiler/implementation/native_handler.dart
@@ -86,6 +86,11 @@
 
   bool hasInstantiatedNativeClasses() => !registeredClasses.isEmpty;
 
+  final Set<ClassElement> nativeClassesAndSubclasses = new Set<ClassElement>();
+
+  final Map<ClassElement, Set<ClassElement>> nonNativeSubclasses =
+      new Map<ClassElement, Set<ClassElement>>();
+
   /**
    * Records matched constraints ([SpecialType] or [DartType]).  Once a type
    * constraint has been matched, there is no need to match it again.
@@ -115,6 +120,9 @@
   void processNativeClasses(Iterable<LibraryElement> libraries) {
     libraries.forEach(processNativeClassesInLibrary);
     processNativeClassesInLibrary(compiler.isolateHelperLibrary);
+
+    processSubclassesOfNativeClasses(libraries);
+
     if (!enableLiveTypeAnalysis) {
       nativeClasses.forEach((c) => enqueueClass(c, 'forced'));
       flushQueue();
@@ -137,6 +145,124 @@
     classElement.ensureResolved(compiler);
   }
 
+  void processSubclassesOfNativeClasses(Iterable<LibraryElement> libraries) {
+    // Collect potential subclasses, e.g.
+    //
+    //     class B extends foo.A {}
+    //
+    // SourceString "A" has a potential subclass B.
+
+    var potentialExtends = new Map<SourceString, Set<ClassElement>>();
+
+    libraries.forEach((library) {
+      library.implementation.forEachLocalMember((element) {
+        if (element.isClass()) {
+          SourceString name = element.name;
+          SourceString extendsName = findExtendsNameOfClass(element);
+          if (extendsName != null) {
+            Set<ClassElement> potentialSubclasses =
+                potentialExtends.putIfAbsent(
+                    extendsName,
+                    () => new Set<ClassElement>());
+            potentialSubclasses.add(element);
+          }
+        }
+      });
+    });
+
+    // Resolve all the native classes and any classes that might extend them in
+    // [potentialExtends], and then check that the properly resolved class is in
+    // fact a subclass of a native class.
+
+    ClassElement nativeSuperclassOf(ClassElement classElement) {
+      if (classElement.isNative()) return classElement;
+      if (classElement.superclass == null) return null;
+      return nativeSuperclassOf(classElement.superclass);
+    }
+
+    void walkPotentialSubclasses(ClassElement element) {
+      if (nativeClassesAndSubclasses.contains(element)) return;
+      element.ensureResolved(compiler);
+      ClassElement nativeSuperclass = nativeSuperclassOf(element);
+      if (nativeSuperclass != null) {
+        nativeClassesAndSubclasses.add(element);
+        if (!element.isNative()) {
+          nonNativeSubclasses.putIfAbsent(nativeSuperclass,
+              () => new Set<ClassElement>())
+            .add(element);
+        }
+        Set<ClassElement> potentialSubclasses = potentialExtends[element.name];
+        if (potentialSubclasses != null) {
+          potentialSubclasses.forEach(walkPotentialSubclasses);
+        }
+      }
+    }
+
+    nativeClasses.forEach(walkPotentialSubclasses);
+
+    nativeClasses.addAll(nativeClassesAndSubclasses);
+    unusedClasses.addAll(nativeClassesAndSubclasses);
+  }
+
+  /**
+   * Returns the source string of the class named in the extends clause, or
+   * `null` if there is no extends clause.
+   */
+  SourceString findExtendsNameOfClass(ClassElement classElement) {
+    //  "class B extends A ... {}"  --> "A"
+    //  "class B extends foo.A ... {}"  --> "A"
+    //  "class B<T> extends foo.A<T,T> with M1, M2 ... {}"  --> "A"
+
+    // We want to avoid calling classElement.parseNode on every class.  Doing so
+    // will slightly increase parse time and size and cause compiler errors and
+    // warnings to me emitted in more unused code.
+
+    // An alternative to this code is to extend the API of ClassElement to
+    // expose the name of the extended element.
+
+    // Pattern match the above cases in the token stream.
+    //  [abstract] class X extends [id.]* id
+
+    Token skipTypeParameters(Token token) {
+      BeginGroupToken beginGroupToken = token;
+      Token endToken = beginGroupToken.endGroup;
+      return endToken.next;
+      //for (;;) {
+      //  token = token.next;
+      //  if (token.stringValue == '>') return token.next;
+      //  if (token.stringValue == '<') return skipTypeParameters(token);
+      //}
+    }
+
+    SourceString scanForExtendsName(Token token) {
+      if (token.stringValue == 'abstract') token = token.next;
+      if (token.stringValue != 'class') return null;
+      token = token.next;
+      if (!token.isIdentifier()) return null;
+      token = token.next;
+      //  class F<X extends B<X>> extends ...
+      if (token.stringValue == '<') {
+        token = skipTypeParameters(token);
+      }
+      if (token.stringValue != 'extends') return null;
+      token = token.next;
+      Token id = token;
+      while (token.kind != EOF_TOKEN) {
+        token = token.next;
+        if (token.stringValue != '.') break;
+        token = token.next;
+        if (!token.isIdentifier()) return null;
+        id = token;
+      }
+      // Should be at '{', 'with', 'implements', '<' or 'native'.
+      return id.value;
+    }
+
+    return compiler.withCurrentElement(classElement, () {
+      return scanForExtendsName(classElement.position());
+    });
+  }
+
   ClassElement get annotationCreatesClass {
     findAnnotationClasses();
     return _annotationCreatesClass;
@@ -385,6 +511,7 @@
     staticUse(const SourceString('convertDartClosureToJS'));
     staticUse(const SourceString('defineNativeMethods'));
     staticUse(const SourceString('defineNativeMethodsNonleaf'));
+    staticUse(const SourceString('defineNativeMethodsExtended'));
     // TODO(9577): Registering `defineNativeMethodsFinish` seems redundant with
     // respect to the registering in the backend. When the backend registering
     // is removed as part of fixing Issue 9577, this can be the sole place
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index f21f244..a2c9d1d 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -341,6 +341,10 @@
       }
       if (element.isSynthesized) {
         Element target = element.targetConstructor;
+        // Ensure the signature of the synthesized element is
+        // resolved. This is the only place where the resolver is
+        // seeing this element.
+        element.computeSignature(compiler);
         if (!target.isErroneous()) {
           compiler.enqueuer.resolution.registerStaticUse(
               element.targetConstructor);
@@ -1467,6 +1471,7 @@
       if (malformedIsError) {
         visitor.error(node, messageKind.error, messageArguments);
       } else {
+        compiler.backend.registerThrowRuntimeError(visitor.mapping);
         visitor.warning(node, messageKind.warning, messageArguments);
       }
       var erroneousElement = new ErroneousElementX(
@@ -1702,9 +1707,9 @@
       // The type annotations on a typedef do not imply type checks.
       // TODO(karlklose): clean this up (dartbug.com/8870).
       inCheckContext = compiler.enableTypeAssertions &&
+          !element.isLibrary() &&
           !element.isTypedef() &&
-          (element.enclosingElement == null ||
-           !element.enclosingElement.isTypedef()),
+          !element.enclosingElement.isTypedef(),
       inCatchBlock = false,
       super(compiler, mapping);
 
@@ -2280,14 +2285,14 @@
     bool resolvedArguments = false;
     if (node.isOperator) {
       String operatorString = node.selector.asOperator().source.stringValue;
-      if (operatorString == 'is') {
+      if (identical(operatorString, 'is')) {
         DartType type =
             resolveTypeExpression(node.typeAnnotationFromIsCheckOrCast);
         if (type != null) {
           compiler.enqueuer.resolution.registerIsCheck(type, mapping);
         }
         resolvedArguments = true;
-      } else if (operatorString == 'as') {
+      } else if (identical(operatorString, 'as')) {
         DartType type = resolveTypeExpression(node.arguments.head);
         if (type != null) {
           compiler.enqueuer.resolution.registerAsCheck(type, mapping);
@@ -2577,10 +2582,6 @@
   }
 
   visitThrow(Throw node) {
-    // 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);
   }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index acf5cb9..9169282 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -1153,7 +1153,9 @@
     // Create the inlining state after evaluating the arguments, that
     // may have an impact on the state of the current method.
     InliningState state = new InliningState(
-        function, returnElement, returnType, elements, stack, localsHandler);
+        function, returnElement, returnType, elements, stack,
+        localsHandler, inTryStatement);
+    inTryStatement = false;
     LocalsHandler newLocalsHandler = new LocalsHandler(this);
     newLocalsHandler.closureData =
         compiler.closureToClassMapper.computeClosureToClassMapping(
@@ -1206,6 +1208,7 @@
     state.oldStack.add(stack[0]);
     stack = state.oldStack;
     localsHandler = state.oldLocalsHandler;
+    inTryStatement = state.inTryStatement;
   }
 
   /**
@@ -3187,6 +3190,9 @@
     } else if (name == const SourceString('JS_OBJECT_CLASS_NAME')) {
       String name = backend.namer.getRuntimeTypeName(compiler.objectClass);
       stack.add(addConstantString(node, name));
+    } else if (name == const SourceString('JS_NULL_CLASS_NAME')) {
+      String name = backend.namer.getRuntimeTypeName(compiler.nullClass);
+      stack.add(addConstantString(node, name));
     } else if (name == const SourceString('JS_FUNCTION_CLASS_NAME')) {
       String name = backend.namer.getRuntimeTypeName(compiler.functionClass);
       stack.add(addConstantString(node, name));
@@ -3224,6 +3230,8 @@
       handleForeignJsCurrentIsolate(node);
     } else if (name == const SourceString('JS_GET_NAME')) {
       handleForeignJsGetName(node);
+    } else if (name == const SourceString('JS_EFFECT')) {
+      stack.add(graph.addConstantNull(compiler));
     } else {
       throw "Unknown foreign: ${selector}";
     }
@@ -5214,13 +5222,15 @@
   final TreeElements oldElements;
   final List<HInstruction> oldStack;
   final LocalsHandler oldLocalsHandler;
+  final bool inTryStatement;
 
   InliningState(this.function,
                 this.oldReturnElement,
                 this.oldReturnType,
                 this.oldElements,
                 this.oldStack,
-                this.oldLocalsHandler) {
+                this.oldLocalsHandler,
+                this.inTryStatement) {
     assert(function.isImplementation);
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index f9d8e6a..0e592f3 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -2346,8 +2346,13 @@
       LibraryElement coreLibrary = compiler.coreLibrary;
       ClassElement objectClass = compiler.objectClass;
       Element element = type.element;
-
-      if (identical(element, objectClass) || type.treatAsDynamic) {
+      if (element == compiler.nullClass) {
+        if (negative) {
+          checkNonNull(input);
+        } else {
+          checkNull(input);
+        }
+      } else if (identical(element, objectClass) || type.treatAsDynamic) {
         // The constant folder also does this optimization, but we make
         // it safe by assuming it may have not run.
         push(newLiteralBool(!negative), node);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
index 2af8285..1ea358d 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
@@ -168,7 +168,7 @@
     // If there is an instruction that dominates all others, we can
     // use only the selector of that instruction.
     if (dominator != null) {
-      interceptedClasses = 
+      interceptedClasses =
             backend.getInterceptedClassesOn(dominator.selector.name);
 
       // If we found that we need number, we must still go through all
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
index 2b01077..e89ba47 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
@@ -34,21 +34,18 @@
     JavaScriptItemCompilationContext context = work.compilationContext;
     measure(() {
       List<OptimizationPhase> phases = <OptimizationPhase>[
-          // Run trivial constant folding first to optimize
+          // Run trivial instruction simplification first to optimize
           // some patterns useful for type conversion.
-          new SsaConstantFolder(constantSystem, backend, work),
+          new SsaInstructionSimplifier(constantSystem, backend, work),
           new SsaTypeConversionInserter(compiler),
           new SsaNonSpeculativeTypePropagator(compiler),
-          new SsaConstantFolder(constantSystem, backend, work),
-          // The constant folder affects the types of instructions, so
-          // we run the type propagator again. Note that this would
-          // not be necessary if types were directly stored on
-          // instructions.
-          new SsaNonSpeculativeTypePropagator(compiler),
+          // After type propagation, more instructions can be
+          // simplified.
+          new SsaInstructionSimplifier(constantSystem, backend, work),
           new SsaCheckInserter(backend, work, context.boundsChecked),
           new SsaRedundantPhiEliminator(),
           new SsaDeadPhiEliminator(),
-          new SsaConstantFolder(constantSystem, backend, work),
+          new SsaInstructionSimplifier(constantSystem, backend, work),
           new SsaNonSpeculativeTypePropagator(compiler),
           // Run a dead code eliminator before LICM because dead
           // interceptors are often in the way of LICM'able instructions.
@@ -57,8 +54,8 @@
           new SsaCodeMotion(),
           new SsaValueRangeAnalyzer(compiler, constantSystem, work),
           // Previous optimizations may have generated new
-          // opportunities for constant folding.
-          new SsaConstantFolder(constantSystem, backend, work),
+          // opportunities for instruction simplification.
+          new SsaInstructionSimplifier(constantSystem, backend, work),
           new SsaSimplifyInterceptors(compiler, constantSystem, work),
           new SsaDeadCodeEliminator()];
       runPhases(graph, phases);
@@ -122,15 +119,16 @@
  * If both inputs to known operations are available execute the operation at
  * compile-time.
  */
-class SsaConstantFolder extends HBaseVisitor implements OptimizationPhase {
-  final String name = "SsaConstantFolder";
+class SsaInstructionSimplifier extends HBaseVisitor
+    implements OptimizationPhase {
+  final String name = "SsaInstructionSimplifier";
   final JavaScriptBackend backend;
   final CodegenWorkItem work;
   final ConstantSystem constantSystem;
   HGraph graph;
   Compiler get compiler => backend.compiler;
 
-  SsaConstantFolder(this.constantSystem, this.backend, this.work);
+  SsaInstructionSimplifier(this.constantSystem, this.backend, this.work);
 
   void visitGraph(HGraph visitee) {
     graph = visitee;
@@ -583,7 +581,8 @@
     // raw type.
     } else if (!RuntimeTypes.hasTypeArguments(type)) {
       TypeMask expressionMask = expressionType.computeMask(compiler);
-      TypeMask typeMask = new TypeMask.nonNullSubtype(type);
+      TypeMask typeMask = (element == compiler.nullClass)
+          ? new TypeMask.subtype(type) : new TypeMask.nonNullSubtype(type);
       if (expressionMask.union(typeMask, compiler) == typeMask) {
         return graph.addConstantBool(true, compiler);
       } else if (expressionMask.intersection(typeMask, compiler).isEmpty) {
@@ -1039,7 +1038,17 @@
     HBasicBlock preheader = loopHeader.predecessors[0];
     int dependsFlags = SideEffects.computeDependsOnFlags(changesFlags);
     HInstruction instruction = block.first;
-    bool firstInstructionInLoop = block == loopHeader;
+    bool isLoopAlwaysTaken() {
+      HInstruction instruction = loopHeader.last;
+      assert(instruction is HGoto || instruction is HLoopBranch);
+      return instruction is HGoto
+          || instruction.inputs[0].isConstantTrue();
+    }
+    bool firstInstructionInLoop = block == loopHeader
+        // Compensate for lack of code motion.
+        || (blockChangesFlags[loopHeader.id] == 0
+            && isLoopAlwaysTaken()
+            && loopHeader.successors[0] == block);
     while (instruction != null) {
       HInstruction next = instruction.next;
       if (instruction.useGvn()
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart b/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
index 7cddf8f..257864c 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
@@ -56,7 +56,7 @@
  */
 abstract class Value {
   final ValueRangeInfo info;
-  const Value([this.info = null]);
+  const Value(this.info);
 
   Value operator +(Value other) => const UnknownValue();
   Value operator -(Value other) => const UnknownValue();
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 ab7226b..c13d7a4 100644
--- a/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
@@ -2,7 +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 types;
+library concrete_types_inferrer;
+
+import 'dart:collection' show Queue, IterableBase;
+import '../dart2jslib.dart' hide Selector, TypedSelector;
+import '../dart_types.dart';
+import '../elements/elements.dart';
+import '../native_handler.dart' as native;
+import '../tree/tree.dart';
+import '../universe/universe.dart';
+import '../util/util.dart';
+
+import 'types.dart' show TypeMask, TypesInferrer;
 
 class CancelTypeInferenceException {
   final Node node;
diff --git a/sdk/lib/_internal/compiler/implementation/types/container_tracer.dart b/sdk/lib/_internal/compiler/implementation/types/container_tracer.dart
index ab3f998..caf28f0 100644
--- a/sdk/lib/_internal/compiler/implementation/types/container_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/container_tracer.dart
@@ -12,6 +12,7 @@
 import 'simple_types_inferrer.dart'
     show InferrerEngine, InferrerVisitor, LocalsHandler;
 import 'types.dart';
+import 'inferrer_visitor.dart';
 
 /**
  * A set of selector names that [List] implements, that we know do not
@@ -179,7 +180,7 @@
 
   /**
    * A set of selectors that both use and update the list, for example
-   * [: list[0]++; :] or [: list[0] |= 42; :]. 
+   * [: list[0]++; :] or [: list[0] |= 42; :].
    */
   final Set<Selector> constraints = new Set<Selector>();
 
@@ -326,7 +327,7 @@
       return analyzedNode == resolved;
     } else {
       assert(resolved is Element);
-      return escapingElements.contains(resolved); 
+      return escapingElements.contains(resolved);
     }
   }
 
@@ -335,7 +336,8 @@
   }
 }
 
-class ContainerTracerVisitor extends InferrerVisitor<TypeMask> {
+class ContainerTracerVisitor
+    extends InferrerVisitor<TypeMask, InferrerEngine<TypeMask>> {
   final Element analyzedElement;
   final TracerForConcreteContainer tracer;
   final bool visitingClosure;
@@ -746,7 +748,7 @@
     if (node.expression == null) {
       return types.nullType;
     }
-    
+
     TypeMask type;
     bool isEscaping = visitAndCatchEscaping(() {
       type = visit(node.expression);
@@ -761,7 +763,7 @@
     }
     return type;
   }
-  
+
   TypeMask visitForIn(ForIn node) {
     visit(node.expression);
     Selector iteratorSelector = elements.getIteratorSelector(node);
diff --git a/sdk/lib/_internal/compiler/implementation/types/inferrer_visitor.dart b/sdk/lib/_internal/compiler/implementation/types/inferrer_visitor.dart
index ce86ef6..00c9295 100644
--- a/sdk/lib/_internal/compiler/implementation/types/inferrer_visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/inferrer_visitor.dart
@@ -2,7 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of simple_types_inferrer;
+library inferrer_visitor;
+
+import '../dart2jslib.dart' hide Selector, TypedSelector;
+import '../dart_types.dart';
+import '../elements/elements.dart';
+import '../tree/tree.dart';
+import '../universe/universe.dart';
+import '../util/util.dart';
 
 /**
  * The interface [InferrerVisitor] will use when working on types.
@@ -75,106 +82,6 @@
 }
 
 /**
- * An implementation of [TypeSystem] for [TypeMask].
- */
-class TypeMaskSystem implements TypeSystem<TypeMask> {
-  final Compiler compiler;
-  TypeMaskSystem(this.compiler);
-
-  TypeMask narrowType(TypeMask type,
-                      DartType annotation,
-                      {bool isNullable: true}) {
-    if (annotation.treatAsDynamic) return type;
-    if (annotation.isVoid) return nullType;
-    if (annotation.element == compiler.objectClass) return type;
-    TypeMask otherType;
-    if (annotation.kind == TypeKind.TYPEDEF
-        || annotation.kind == TypeKind.FUNCTION) {
-      otherType = functionType;
-    } else if (annotation.kind == TypeKind.TYPE_VARIABLE) {
-      // TODO(ngeoffray): Narrow to bound.
-      return type;
-    } else {
-      assert(annotation.kind == TypeKind.INTERFACE);
-      otherType = new TypeMask.nonNullSubtype(annotation);
-    }
-    if (isNullable) otherType = otherType.nullable();
-    if (type == null) return otherType;
-    return type.intersection(otherType, compiler);
-  }
-
-  TypeMask computeLUB(TypeMask firstType, TypeMask secondType) {
-    if (firstType == null) {
-      return secondType;
-    } else if (secondType == dynamicType || firstType == dynamicType) {
-      return dynamicType;
-    } else if (firstType == secondType) {
-      return firstType;
-    } else {
-      TypeMask union = firstType.union(secondType, compiler);
-      // TODO(kasperl): If the union isn't nullable it seems wasteful
-      // to use dynamic. Fix that.
-      return union.containsAll(compiler) ? dynamicType : union;
-    }
-  }
-
-  TypeMask allocateDiamondPhi(TypeMask firstType, TypeMask secondType) {
-    return computeLUB(firstType, secondType);
-  }
-
-  TypeMask get dynamicType => compiler.typesTask.dynamicType;
-  TypeMask get nullType => compiler.typesTask.nullType;
-  TypeMask get intType => compiler.typesTask.intType;
-  TypeMask get doubleType => compiler.typesTask.doubleType;
-  TypeMask get numType => compiler.typesTask.numType;
-  TypeMask get boolType => compiler.typesTask.boolType;
-  TypeMask get functionType => compiler.typesTask.functionType;
-  TypeMask get listType => compiler.typesTask.listType;
-  TypeMask get constListType => compiler.typesTask.constListType;
-  TypeMask get fixedListType => compiler.typesTask.fixedListType;
-  TypeMask get growableListType => compiler.typesTask.growableListType;
-  TypeMask get mapType => compiler.typesTask.mapType;
-  TypeMask get constMapType => compiler.typesTask.constMapType;
-  TypeMask get stringType => compiler.typesTask.stringType;
-  TypeMask get typeType => compiler.typesTask.typeType;
-
-  TypeMask nonNullSubtype(DartType type) => new TypeMask.nonNullSubtype(type);
-  TypeMask nonNullSubclass(DartType type) => new TypeMask.nonNullSubclass(type);
-  TypeMask nonNullExact(DartType type) => new TypeMask.nonNullExact(type);
-  TypeMask nonNullEmpty() => new TypeMask.nonNullEmpty();
-
-  TypeMask nullable(TypeMask type) {
-    return type.nullable();
-  }
-
-  TypeMask allocateContainer(TypeMask type,
-                             Node node,
-                             Element enclosing,
-                             [TypeMask elementType, int length]) {
-    ContainerTypeMask mask = new ContainerTypeMask(type, node, enclosing);
-    mask.elementType = elementType;
-    mask.length = length;
-    return mask;
-  }
-
-  Selector newTypedSelector(TypeMask receiver, Selector selector) {
-    return new TypedSelector(receiver, selector);
-  }
-
-  TypeMask addPhiInput(Element element, TypeMask phiType, TypeMask newType) {
-    return computeLUB(phiType, newType);
-  }
-
-  TypeMask allocatePhi(Node node, Element element, TypeMask inputType) {
-    return inputType;
-  }
-
-  TypeMask simplifyPhi(Node node, Element element, TypeMask phiType) {
-    return phiType;
-  }
-}
-
-/**
  * A variable scope holds types for variables. It has a link to a
  * parent scope, but never changes the types in that parent. Instead,
  * updates to locals of a parent scope are put in the current scope.
@@ -243,8 +150,9 @@
     forEachLocalUntilNode(null, f);
   }
 
-  void remove(Element element) {
-    variables.remove(element);
+  bool updates(Element element) {
+    if (variables == null) return false;
+    return variables.containsKey(element);
   }
 
   String toString() {
@@ -303,12 +211,73 @@
 }
 
 /**
+ * Placeholder for inferred arguments types on sends.
+ */
+class ArgumentsTypes<T> {
+  final List<T> positional;
+  final Map<SourceString, T> named;
+  ArgumentsTypes(this.positional, named)
+    : this.named = (named == null) ? new Map<SourceString, T>() : named;
+
+  int get length => positional.length + named.length;
+
+  String toString() => "{ positional = $positional, named = $named }";
+
+  bool operator==(other) {
+    if (positional.length != other.positional.length) return false;
+    if (named.length != other.named.length) return false;
+    for (int i = 0; i < positional.length; i++) {
+      if (positional[i] != other.positional[i]) return false;
+    }
+    named.forEach((name, type) {
+      if (other.named[name] != type) return false;
+    });
+    return true;
+  }
+
+  int get hashCode => throw new UnsupportedError('ArgumentsTypes.hashCode');
+
+  bool hasNoArguments() => positional.isEmpty && named.isEmpty;
+
+  bool hasOnePositionalArgumentWithType(T type) {
+    return named.isEmpty && positional.length == 1 && positional[0] == type;
+  }
+}
+
+class CallSite {
+  final Selector selector;
+  final ArgumentsTypes arguments;
+  CallSite(this.selector, this.arguments) {
+    assert(selector != null);
+  }
+}
+
+abstract class MinimalInferrerEngine<T> {
+  /**
+   * Returns the type of [element].
+   */
+  T typeOfElement(Element element);
+
+  /**
+   * Records that [node] sets non-final field [element] to be of type
+   * [type].
+   *
+   * [constraint] is a field assignment constraint, as described in
+   * [InternalSimpleTypesInferrer].
+   */
+  void recordTypeOfNonFinalField(Node node,
+                                 Element field,
+                                 T type,
+                                 CallSite constraint);
+}
+
+/**
  * Placeholder for inferred types of local variables.
  */
 class LocalsHandler<T> {
   final Compiler compiler;
   final TypeSystem<T> types;
-  final InferrerEngine<T> inferrer;
+  final MinimalInferrerEngine<T> inferrer;
   final VariableScope<T> locals;
   final Map<Element, Element> capturedAndBoxed;
   final FieldInitializationScope<T> fieldScope;
@@ -399,21 +368,43 @@
         && elseBranch != null
         && elseBranch.seenBreakOrContinue;
     if (aborts) return;
-    if (thenBranch.aborts) {
-      thenBranch = this;
-      if (elseBranch == null) return;
-    } else if (elseBranch == null || elseBranch.aborts) {
-      elseBranch = this;
+
+    void mergeOneBranch(LocalsHandler<T> other) {
+      other.locals.forEachOwnLocal((Element local, T type) {
+        T myType = locals[local];
+        if (myType == null) return;
+        if (type == myType) return;
+        locals[local] = types.allocateDiamondPhi(myType, type);
+      });
     }
 
-    thenBranch.locals.forEachOwnLocal((Element local, T type) {
-      T otherType = elseBranch.locals[local];
-      if (otherType == null) return;
-      T existing = locals[local];
-      if (type == existing && otherType == existing) return;
-      locals[local] = types.allocateDiamondPhi(type, otherType);
-    });
+    if (thenBranch.aborts) {
+      if (elseBranch == null) return;
+      mergeOneBranch(elseBranch);
+    } else if (elseBranch == null || elseBranch.aborts) {
+      mergeOneBranch(thenBranch);
+    } else {
+      void mergeLocal(Element local) {
+        T myType = locals[local];
+        if (myType == null) return;
+        T elseType = elseBranch.locals[local];
+        T thenType = thenBranch.locals[local];
+        if (thenType == elseType) {
+          locals[local] = thenType;
+        } else {
+          locals[local] = types.allocateDiamondPhi(thenType, elseType);
+        }
+      }
 
+      thenBranch.locals.forEachOwnLocal((Element local, _) {
+        mergeLocal(local);
+      });
+      elseBranch.locals.forEachOwnLocal((Element local, _) {
+        // Discard locals we already processed when iterating over
+        // [thenBranch]'s locals.
+        if (!thenBranch.locals.updates(local)) mergeLocal(local);
+      });
+    }
   }
 
   /**
@@ -512,10 +503,11 @@
   }
 }
 
-abstract class InferrerVisitor<T> extends ResolvedVisitor<T> {
+abstract class InferrerVisitor
+    <T, E extends MinimalInferrerEngine<T>> extends ResolvedVisitor<T> {
   final Element analyzedElement;
   final TypeSystem<T> types;
-  final InferrerEngine<T> inferrer;
+  final E inferrer;
   final Compiler compiler;
   final Map<TargetElement, List<LocalsHandler<T>>> breaksFor =
       new Map<TargetElement, List<LocalsHandler<T>>>();
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 5bae1d7..6fe350d 100644
--- a/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
@@ -15,7 +15,8 @@
 import '../util/util.dart' show Link;
 import 'types.dart'
     show TypesInferrer, FlatTypeMask, TypeMask, ContainerTypeMask,
-         ElementTypeMask;
+         ElementTypeMask, TypeSystem, MinimalInferrerEngine;
+import 'inferrer_visitor.dart';
 
 // BUG(8802): There's a bug in the analyzer that makes the re-export
 // of Selector from dart2jslib.dart fail. For now, we work around that
@@ -23,7 +24,105 @@
 import '../dart2jslib.dart' hide Selector, TypedSelector;
 import '../universe/universe.dart' show Selector, SideEffects, TypedSelector;
 
-part 'inferrer_visitor.dart';
+/**
+ * An implementation of [TypeSystem] for [TypeMask].
+ */
+class TypeMaskSystem implements TypeSystem<TypeMask> {
+  final Compiler compiler;
+  TypeMaskSystem(this.compiler);
+
+  TypeMask narrowType(TypeMask type,
+                      DartType annotation,
+                      {bool isNullable: true}) {
+    if (annotation.treatAsDynamic) return type;
+    if (annotation.isVoid) return nullType;
+    if (annotation.element == compiler.objectClass) return type;
+    TypeMask otherType;
+    if (annotation.kind == TypeKind.TYPEDEF
+        || annotation.kind == TypeKind.FUNCTION) {
+      otherType = functionType;
+    } else if (annotation.kind == TypeKind.TYPE_VARIABLE) {
+      // TODO(ngeoffray): Narrow to bound.
+      return type;
+    } else {
+      assert(annotation.kind == TypeKind.INTERFACE);
+      otherType = new TypeMask.nonNullSubtype(annotation);
+    }
+    if (isNullable) otherType = otherType.nullable();
+    if (type == null) return otherType;
+    return type.intersection(otherType, compiler);
+  }
+
+  TypeMask computeLUB(TypeMask firstType, TypeMask secondType) {
+    if (firstType == null) {
+      return secondType;
+    } else if (secondType == dynamicType || firstType == dynamicType) {
+      return dynamicType;
+    } else if (firstType == secondType) {
+      return firstType;
+    } else {
+      TypeMask union = firstType.union(secondType, compiler);
+      // TODO(kasperl): If the union isn't nullable it seems wasteful
+      // to use dynamic. Fix that.
+      return union.containsAll(compiler) ? dynamicType : union;
+    }
+  }
+
+  TypeMask allocateDiamondPhi(TypeMask firstType, TypeMask secondType) {
+    return computeLUB(firstType, secondType);
+  }
+
+  TypeMask get dynamicType => compiler.typesTask.dynamicType;
+  TypeMask get nullType => compiler.typesTask.nullType;
+  TypeMask get intType => compiler.typesTask.intType;
+  TypeMask get doubleType => compiler.typesTask.doubleType;
+  TypeMask get numType => compiler.typesTask.numType;
+  TypeMask get boolType => compiler.typesTask.boolType;
+  TypeMask get functionType => compiler.typesTask.functionType;
+  TypeMask get listType => compiler.typesTask.listType;
+  TypeMask get constListType => compiler.typesTask.constListType;
+  TypeMask get fixedListType => compiler.typesTask.fixedListType;
+  TypeMask get growableListType => compiler.typesTask.growableListType;
+  TypeMask get mapType => compiler.typesTask.mapType;
+  TypeMask get constMapType => compiler.typesTask.constMapType;
+  TypeMask get stringType => compiler.typesTask.stringType;
+  TypeMask get typeType => compiler.typesTask.typeType;
+
+  TypeMask nonNullSubtype(DartType type) => new TypeMask.nonNullSubtype(type);
+  TypeMask nonNullSubclass(DartType type) => new TypeMask.nonNullSubclass(type);
+  TypeMask nonNullExact(DartType type) => new TypeMask.nonNullExact(type);
+  TypeMask nonNullEmpty() => new TypeMask.nonNullEmpty();
+
+  TypeMask nullable(TypeMask type) {
+    return type.nullable();
+  }
+
+  TypeMask allocateContainer(TypeMask type,
+                             Node node,
+                             Element enclosing,
+                             [TypeMask elementType, int length]) {
+    ContainerTypeMask mask = new ContainerTypeMask(type, node, enclosing);
+    mask.elementType = elementType;
+    mask.length = length;
+    return mask;
+  }
+
+  Selector newTypedSelector(TypeMask receiver, Selector selector) {
+    return new TypedSelector(receiver, selector);
+  }
+
+  TypeMask addPhiInput(Element element, TypeMask phiType, TypeMask newType) {
+    return computeLUB(phiType, newType);
+  }
+
+  TypeMask allocatePhi(Node node, Element element, TypeMask inputType) {
+    return inputType;
+  }
+
+  TypeMask simplifyPhi(Node node, Element element, TypeMask phiType) {
+    return phiType;
+  }
+}
 
 /**
  * A work queue that ensures there are no duplicates, and adds and
@@ -223,7 +322,7 @@
  * type information about visited nodes, as well as to request type
  * information of elements.
  */
-abstract class InferrerEngine<T> {
+abstract class InferrerEngine<T> implements MinimalInferrerEngine<T> {
   final Compiler compiler;
   final TypeSystem<T> types;
   final Map<Node, T> concreteTypes = new Map<Node, T>();
@@ -859,6 +958,9 @@
 
   bool recordType(Element analyzedElement, TypeMask type) {
     if (isNativeElement(analyzedElement)) return false;
+    if (!compiler.backend.canBeUsedForGlobalOptimizations(analyzedElement)) {
+      return false;
+    }
     assert(type != null);
     assert(analyzedElement.isField()
            || analyzedElement.isParameter()
@@ -1111,8 +1213,8 @@
   }
 
   bool updateParameterType(Element parameter) {
-    FunctionTypeInformation functionInfo =
-        typeInformationOf(parameter.enclosingElement);
+    Element function = parameter.enclosingElement;
+    FunctionTypeInformation functionInfo = typeInformationOf(function);
     if (functionInfo.canBeClosurized) return false;
     if (!isNotClosure(parameter.enclosingElement)) return false;
 
@@ -1472,49 +1574,8 @@
   }
 }
 
-class CallSite {
-  final Selector selector;
-  final ArgumentsTypes arguments;
-  CallSite(this.selector, this.arguments) {
-    assert(selector != null);
-  }
-}
-
-/**
- * Placeholder for inferred arguments types on sends.
- */
-class ArgumentsTypes<T> {
-  final List<T> positional;
-  final Map<SourceString, T> named;
-  ArgumentsTypes(this.positional, named)
-    : this.named = (named == null) ? new Map<SourceString, T>() : named;
-
-  int get length => positional.length + named.length;
-
-  String toString() => "{ positional = $positional, named = $named }";
-
-  bool operator==(other) {
-    if (positional.length != other.positional.length) return false;
-    if (named.length != other.named.length) return false;
-    for (int i = 0; i < positional.length; i++) {
-      if (positional[i] != other.positional[i]) return false;
-    }
-    named.forEach((name, type) {
-      if (other.named[name] != type) return false;
-    });
-    return true;
-  }
-
-  int get hashCode => throw new UnsupportedError('ArgumentsTypes.hashCode');
-
-  bool hasNoArguments() => positional.isEmpty && named.isEmpty;
-
-  bool hasOnePositionalArgumentWithType(T type) {
-    return named.isEmpty && positional.length == 1 && positional[0] == type;
-  }
-}
-
-class SimpleTypeInferrerVisitor<T> extends InferrerVisitor<T> {
+class SimpleTypeInferrerVisitor<T>
+    extends InferrerVisitor<T, InferrerEngine<T>> {
   T returnType;
   bool visitingInitializers = false;
   bool isConstructorRedirect = false;
@@ -2000,7 +2061,8 @@
       return inferrer.typeOfNativeBehavior(nativeBehavior);
     } else if (name == const SourceString('JS_OPERATOR_IS_PREFIX')
                || name == const SourceString('JS_OPERATOR_AS_PREFIX')
-               || name == const SourceString('JS_OBJECT_CLASS_NAME')) {
+               || name == const SourceString('JS_OBJECT_CLASS_NAME')
+               || name == const SourceString('JS_NULL_CLASS_NAME')) {
       return types.stringType;
     } else {
       sideEffects.setAllSideEffects();
diff --git a/sdk/lib/_internal/compiler/implementation/types/types.dart b/sdk/lib/_internal/compiler/implementation/types/types.dart
index 538b44e..3e2178a 100644
--- a/sdk/lib/_internal/compiler/implementation/types/types.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/types.dart
@@ -4,8 +4,6 @@
 
 library types;
 
-import 'dart:collection' show Queue, IterableBase;
-
 import '../dart2jslib.dart' hide Selector, TypedSelector;
 import '../tree/tree.dart';
 import '../elements/elements.dart';
@@ -13,9 +11,9 @@
 import '../util/util.dart';
 import '../universe/universe.dart';
 import 'simple_types_inferrer.dart' show SimpleTypesInferrer;
+import 'concrete_types_inferrer.dart' show ConcreteTypesInferrer;
 import '../dart_types.dart';
 
-part 'concrete_types_inferrer.dart';
 part 'container_type_mask.dart';
 part 'element_type_mask.dart';
 part 'flat_type_mask.dart';
diff --git a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
index 11ef337..f005351 100644
--- a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
+++ b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
@@ -2128,15 +2128,15 @@
     write("# VERSION: ${new DateTime.now()}\n\n");
     write("NETWORK:\n*\n\n");
     write("CACHE:\n");
-    var toCache = new Directory.fromPath(outputDir);
+    var toCache = new Directory(outputDir);
     toCache.list(recursive: true).listen(
         (FileSystemEntity entity) {
-          if (entity.isFile) {
+          if (entity is File) {
             var filename = entity.path;
             if (filename.endsWith('appcache.manifest')) {
               return;
             }
-            Path relativeFilePath = new Path(filename).relativeTo(outputDir);
+            String relativeFilePath = path.relative(filename, from: outputDir);
             write("$relativeFilePath\n");
           }
         },
diff --git a/sdk/lib/_internal/lib/core_patch.dart b/sdk/lib/_internal/lib/core_patch.dart
index 207800a..3a4f7ac 100644
--- a/sdk/lib/_internal/lib/core_patch.dart
+++ b/sdk/lib/_internal/lib/core_patch.dart
@@ -105,8 +105,8 @@
 
 patch class double {
   patch static double parse(String source,
-                            [double handleError(String source)]) {
-    return Primitives.parseDouble(source, handleError);
+                            [double onError(String source)]) {
+    return Primitives.parseDouble(source, onError);
   }
 }
 
diff --git a/sdk/lib/_internal/lib/foreign_helper.dart b/sdk/lib/_internal/lib/foreign_helper.dart
index 73e3c09..9ba05eb 100644
--- a/sdk/lib/_internal/lib/foreign_helper.dart
+++ b/sdk/lib/_internal/lib/foreign_helper.dart
@@ -177,6 +177,9 @@
 /// Returns the name of the class `Object` in the generated code.
 String JS_OBJECT_CLASS_NAME() {}
 
+/// Returns the name of the class `Null` in the generated code.
+String JS_NULL_CLASS_NAME() {}
+
 /// Returns the name of the class `Function` in the generated code.
 String JS_FUNCTION_CLASS_NAME() {}
 
@@ -236,3 +239,19 @@
  * Obtain [name] from Namer.
  */
 String JS_GET_NAME(String name) {}
+
+/**
+ * Pretend [code] is executed.  Generates no executable code.  This is used to
+ * model effects at some other point in external code.  For example, the
+ * following models an assignment to foo with an unknown value.
+ *
+ *     var foo;
+ *
+ *     main() {
+ *       JS_EFFECT((_){ foo = _; })
+ *     }
+ *
+ * TODO(sra): Replace this hack with something to mark the volatile or
+ * externally initialized elements.
+ */
+void JS_EFFECT(Function code) { code(null); }
diff --git a/sdk/lib/_internal/lib/interceptors.dart b/sdk/lib/_internal/lib/interceptors.dart
index 27c2edf..fedc0f6 100644
--- a/sdk/lib/_internal/lib/interceptors.dart
+++ b/sdk/lib/_internal/lib/interceptors.dart
@@ -25,7 +25,7 @@
                               lookupDispatchRecord,
                               StringMatch,
                               firstMatchAfter;
-import 'dart:_foreign_helper' show JS;
+import 'dart:_foreign_helper' show JS, JS_EFFECT;
 
 part 'js_array.dart';
 part 'js_number.dart';
@@ -247,6 +247,37 @@
  */
 var interceptedNames;
 
+
+/**
+ * Data structure used to map a [Type] to the [Interceptor] for that type.  It
+ * is JavaScript array of 2N entries of adjacent slots containing a [Type]
+ * followed by an [Interceptor] class for the type.
+ *
+ * The value of this variable is set by the compiler and contains only types
+ * that are user extensions of native classes where the type occurs as a
+ * constant in the program.
+ */
+// TODO(sra): Mark this as initialized to a constant with unknown value.
+var mapTypeToInterceptor;
+
+findInterceptorConstructorForType(Type type) {
+  JS_EFFECT((_){ mapTypeToInterceptor = _; });
+  if (mapTypeToInterceptor == null) return null;
+  List map = JS('JSFixedArray', '#', mapTypeToInterceptor);
+  for (int i = 0; i + 1 < map.length; i += 2) {
+    if (type == map[i]) {
+      return map[i + 1];
+    }
+  }
+  return null;
+}
+
+findInterceptorForType(Type type) {
+  var constructor = findInterceptorConstructorForType(type);
+  if (constructor == null) return null;
+  return JS('', '#.prototype', constructor);
+}
+
 /**
  * The base interceptor class.
  *
diff --git a/sdk/lib/_internal/lib/io_patch.dart b/sdk/lib/_internal/lib/io_patch.dart
index 6aed3a2..e41a2ce 100644
--- a/sdk/lib/_internal/lib/io_patch.dart
+++ b/sdk/lib/_internal/lib/io_patch.dart
@@ -289,33 +289,9 @@
 
   patch static void initialize({String database,
                                 String password,
-                                bool useBuiltinRoots: true,
-                                bool readOnly: true}) {
+                                bool useBuiltinRoots: true}) {
     throw new UnsupportedError("SecureSocket.initialize");
   }
-
-  patch static X509Certificate addCertificate(List<int> certificate,
-                                              String trust) {
-    throw new UnsupportedError("SecureSocket.addCertificate");
-  }
-
-  patch static importCertificatesWithPrivateKeys(List<int> certificates,
-                                                 String password) {
-    throw new UnsupportedError(
-        "SecureSocket.importCertificatesWithPrivateKeys");
-  }
-
-  patch static X509Certificate getCertificate(String nickname) {
-    throw new UnsupportedError("SecureSocket.getCertificate");
-  }
-
-  patch static removeCertificate(String nickname) {
-    throw new UnsupportedError("SecureSocket.removeCertificate");
-  }
-
-  patch static X509Certificate changeTrust(String nickname, String trust) {
-    throw new UnsupportedError("SecureSocket.changeTrust");
-  }
 }
 
 patch class _SecureFilter {
diff --git a/sdk/lib/_internal/lib/js_helper.dart b/sdk/lib/_internal/lib/js_helper.dart
index ab69f61..e5ec91f 100644
--- a/sdk/lib/_internal/lib/js_helper.dart
+++ b/sdk/lib/_internal/lib/js_helper.dart
@@ -23,13 +23,17 @@
                                    JS_HAS_EQUALS,
                                    JS_IS_INDEXABLE_FIELD_NAME,
                                    JS_OBJECT_CLASS_NAME,
+                                   JS_NULL_CLASS_NAME,
                                    JS_OPERATOR_AS_PREFIX,
                                    JS_OPERATOR_IS_PREFIX,
                                    JS_SIGNATURE_NAME,
                                    RAW_DART_FUNCTION_REF;
 import 'dart:_interceptors';
 import 'dart:_collection-dev' as _symbol_dev;
-import 'dart:_js_names' show mangledNames, mangledGlobalNames;
+
+import 'dart:_js_names' show
+    mangledNames,
+    unmangleGlobalNameIfPreservedAnyways;
 
 part 'constant_map.dart';
 part 'native_helper.dart';
@@ -1611,18 +1615,6 @@
 }
 
 /**
- * Represents the type of Null. The compiler treats this specially.
- * TODO(lrn): Null should be defined in core. It's a class, like int.
- * It just happens to act differently in assignability tests and,
- * like int, can't be extended or implemented.
- */
-class Null {
-  factory Null() {
-    throw new UnsupportedError('new Null()');
-  }
-}
-
-/**
  * The following methods are called by the runtime to implement
  * checked mode and casts. We specialize each primitive type (eg int, bool), and
  * use the compiler's convention to do is-checks on regular objects.
diff --git a/sdk/lib/_internal/lib/js_mirrors.dart b/sdk/lib/_internal/lib/js_mirrors.dart
index 3914b20..52aca10 100644
--- a/sdk/lib/_internal/lib/js_mirrors.dart
+++ b/sdk/lib/_internal/lib/js_mirrors.dart
@@ -24,6 +24,7 @@
     RuntimeError,
     createRuntimeType,
     createUnmangledInvocationMirror,
+    getMangledTypeName,
     runtimeTypeToString;
 import 'dart:_interceptors' show
     Interceptor,
@@ -398,7 +399,7 @@
   // TODO(ahe): Don't discard type arguments to support
   // [ClassMirror.isOriginalDeclaration] and [ClassMirror.originalDeclaration]
   // correctly.
-  return reflectClassByMangledName('$key'.split('<')[0]);
+  return reflectClassByMangledName(getMangledTypeName(key).split('<')[0]);
 }
 
 ClassMirror reflectClassByMangledName(String mangledName) {
@@ -522,7 +523,7 @@
     throw new NoSuchMethodError(this, '${n(fieldName)}=', [arg], null);
   }
 
-  List<ClassMirror> get superinterfaces => mixin.superinterfaces;
+  List<ClassMirror> get superinterfaces => [mixin];
 
   Map<Symbol, MethodMirror> get constructors => mixin.constructors;
 
@@ -688,6 +689,7 @@
   UnmodifiableMapView<Symbol, VariableMirror> _cachedVariables;
   UnmodifiableMapView<Symbol, Mirror> _cachedMembers;
   UnmodifiableListView<InstanceMirror> _cachedMetadata;
+  UnmodifiableListView<ClassMirror> _cachedSuperinterfaces;
 
   // Set as side-effect of accessing JsLibraryMirror.classes.
   JsLibraryMirror _owner;
@@ -868,6 +870,8 @@
         // Filter-out setters corresponding to variables.
         if (result[s(name)] is VariableMirror) continue;
       }
+      // Constructors aren't 'members'.
+      if (method.isConstructor) continue;
       // Use putIfAbsent to filter-out getters corresponding to variables.
       result.putIfAbsent(method.simpleName, () => method);
     }
@@ -1013,8 +1017,22 @@
 
   ClassMirror get originalDeclaration => this;
 
+  List<ClassMirror> get superinterfaces {
+    if (_cachedSuperinterfaces != null) return _cachedSuperinterfaces;
+    List<int> interfaces = JS('List|Null', 'init.interfaces[#]', _mangledName);
+    var result = const [];
+    if (interfaces != null) {
+      ClassMirror lookupType(int i) {
+        var type = JS('=Object', 'init.metadata[#]', i);
+        return typeMirrorFromRuntimeTypeRepresentation(type);
+      }
+      result = interfaces.map(lookupType).toList();
+    }
+    return _cachedSuperinterfaces =
+        new UnmodifiableListView<ClassMirror>(result);
+  }
+
   // TODO(ahe): Implement these.
-  List<ClassMirror> get superinterfaces => throw new UnimplementedError();
   Map<Symbol, TypeVariableMirror> get typeVariables
       => throw new UnimplementedError();
   Map<Symbol, TypeMirror> get typeArguments => throw new UnimplementedError();
diff --git a/sdk/lib/_internal/lib/js_names.dart b/sdk/lib/_internal/lib/js_names.dart
index 4b3e9a9..9eaf777 100644
--- a/sdk/lib/_internal/lib/js_names.dart
+++ b/sdk/lib/_internal/lib/js_names.dart
@@ -6,6 +6,8 @@
 
 import 'dart:_foreign_helper' show JS, JS_GET_NAME;
 
+import 'dart:_js_helper' show JsCache;
+
 /// No-op method that is called to inform the compiler that unmangled named
 /// must be preserved.
 preserveNames() {}
@@ -14,7 +16,7 @@
 /// with some additional information, such as, number of required arguments.
 /// This map is for mangled names used as instance members.
 final Map<String, String> mangledNames =
-    computeMangledNames(JS('', 'init.mangledNames'), false);
+    computeMangledNames(JS('=Object', 'init.mangledNames'), false);
 
 /// A map from "reflective" names to mangled names (the reverse of
 /// [mangledNames]).
@@ -24,7 +26,7 @@
 /// A map from mangled names to "reflective" names (see [mangledNames]).  This
 /// map is for globals, that is, static and top-level members.
 final Map<String, String> mangledGlobalNames =
-    computeMangledNames(JS('', 'init.mangledGlobalNames'), true);
+    computeMangledNames(JS('=Object', 'init.mangledGlobalNames'), true);
 
 /// A map from "reflective" names to mangled names (the reverse of
 /// [mangledGlobalNames]).
@@ -71,3 +73,19 @@
   return result;
 })(#, Object.prototype.hasOwnProperty)''', victim);
 }
+
+/**
+ * Returns the (global) unmangled version of [name].
+ *
+ * Normally, you should use [mangledGlobalNames] directly, but this method
+ * doesn't tell the compiler to preserve names. So this method only returns a
+ * non-null value if some other component has made the compiler preserve names.
+ *
+ * This is used, for example, to return unmangled names from TypeImpl.toString
+ * *if* names are being preserved for other reasons (use of dart:mirrors, for
+ * example).
+ */
+String unmangleGlobalNameIfPreservedAnyways(String name) {
+  var names = JS('=Object', 'init.mangledGlobalNames');
+  return JsCache.fetch(names, name);
+}
diff --git a/sdk/lib/_internal/lib/js_rti.dart b/sdk/lib/_internal/lib/js_rti.dart
index 4441214..f582c1a 100644
--- a/sdk/lib/_internal/lib/js_rti.dart
+++ b/sdk/lib/_internal/lib/js_rti.dart
@@ -46,10 +46,17 @@
 
 class TypeImpl implements Type {
   final String _typeName;
+  String _unmangledName;
 
   TypeImpl(this._typeName);
 
-  String toString() => _typeName;
+  String toString() {
+    if (_unmangledName != null) return _unmangledName;
+    String unmangledName = unmangleGlobalNameIfPreservedAnyways(_typeName);
+    // TODO(ahe): Handle type arguments.
+    if (unmangledName == null) unmangledName = _typeName;
+    return _unmangledName = unmangledName;
+  }
 
   // TODO(ahe): This is a poor hashCode as it collides with its name.
   int get hashCode => _typeName.hashCode;
@@ -59,6 +66,8 @@
   }
 }
 
+getMangledTypeName(TypeImpl type) => type._typeName;
+
 /**
  * Sets the runtime type information on [target]. [typeInfo] is a type
  * representation of type 4 or 5, that is, either a JavaScript array or
@@ -383,7 +392,8 @@
  */
 bool isSupertypeOfNull(var type) {
   // `null` means `dynamic`.
-  return isNull(type) || getConstructorName(type) == JS_OBJECT_CLASS_NAME();
+  return isNull(type) || getConstructorName(type) == JS_OBJECT_CLASS_NAME()
+                      || getConstructorName(type) == JS_NULL_CLASS_NAME();
 }
 
 /**
@@ -677,9 +687,9 @@
   return value is JSArray;
 }
 
-hasField(var object, var name) => JS('bool', r'#[#] != null', object, name);
+hasField(var object, var name) => JS('bool', r'# in #', name, object);
 
-hasNoField(var object, var name) => JS('bool', r'#[#] == null', object, name);
+hasNoField(var object, var name) => !hasField(object, name);
 
 /// Returns [:true:] if [o] is a JavaScript function.
 bool isJsFunction(var o) => JS('bool', r'typeof # == "function"', o);
diff --git a/sdk/lib/_internal/lib/native_helper.dart b/sdk/lib/_internal/lib/native_helper.dart
index 5c311f4..5470611 100644
--- a/sdk/lib/_internal/lib/native_helper.dart
+++ b/sdk/lib/_internal/lib/native_helper.dart
@@ -240,10 +240,17 @@
 /// A JavaScript object mapping tags to `true` or `false`.
 var leafTags;
 
+/// A JavaScript list mapping subclass interceptor constructors to the native
+/// superclass tag.
+var interceptorToTag;
+
 /**
- * Associates tags with an interceptor.  Called from generated code.  The tags
- * are all 'leaf' tags representing classes that have no subclasses with
- * different behaviour.
+ * Associates dispatch tags (JavaScript constructor names e.g. DOM interface
+ * names like HTMLDivElement) with an interceptor.  Called from generated code
+ * during initial isolate definition.
+ *
+ * The tags are all 'leaf' tags representing classes that have no subclasses
+ * with different behaviour.
  *
  * [tags] is a string of `|`-separated tags.
  */
@@ -252,14 +259,45 @@
 }
 
 /**
- * Associates tags with an interceptor.  Called from generated code.  The tags
- * are all non-'leaf' tags, representing classes that have a subclass with
- * different behaviour.
+ * Associates dispatch tags (JavaScript constructor names e.g. DOM interface
+ * names like HTMLElement) with an interceptor.  Called from generated code
+ * during initial isolate definition.
+ *
+ * The tags are all non-'leaf' tags, representing classes that have a subclass
+ * with different behaviour.
  */
 void defineNativeMethodsNonleaf(String tags, interceptorClass) {
   defineNativeMethodsCommon(tags, interceptorClass, false);
 }
 
+/**
+ * Associates dispatch tags (JavaScript constructor names e.g. DOM interface
+ * names like HTMLElement) with an interceptor.  Called from generated code
+ * during initial isolate definition.
+ *
+ * The tags are all non-'leaf' tags, representing classes that have a user
+ * defined subclass that requires additional dispatch.
+ * [subclassInterceptorClasses] is a list of interceptor classes
+ * (i.e. constructors) for the user defined subclasses.
+ */
+void defineNativeMethodsExtended(String tags, interceptorClass,
+                                 subclassInterceptorClasses) {
+  if (interceptorToTag == null) {
+    interceptorToTag = [];
+  }
+  List classes = JS('JSFixedArray', '#', subclassInterceptorClasses);
+  for (int i = 0; i < classes.length; i++) {
+    interceptorToTag.add(classes[i]);
+    // 'tags' is a single tag.
+    interceptorToTag.add(tags);
+  }
+
+  defineNativeMethodsCommon(tags, interceptorClass, false);
+}
+
+// TODO(sra): Try to encode all the calls to defineNativeMethodsXXX as pure
+// data.  The challenge is that the calls remove a lot of redundancy that is
+// expanded by the loops in these methods.
 void defineNativeMethodsCommon(String tags, var interceptorClass, bool isLeaf) {
   var methods = JS('', '#.prototype', interceptorClass);
   if (interceptorsByTag == null) interceptorsByTag = JS('=Object', '{}');
@@ -280,6 +318,14 @@
   // classes over unknown.
 }
 
+String findDispatchTagForInterceptorClass(interceptorClassConstructor) {
+  if (interceptorToTag == null) return null;
+  int i =
+      JS('int', '#.indexOf(#)', interceptorToTag, interceptorClassConstructor);
+  if (i < 0) return null;
+  return JS('', '#[#]', interceptorToTag, i + 1);
+}
+
 lookupInterceptor(var hasOwnPropertyFunction, String tag) {
   var map = interceptorsByTag;
   if (map == null) return null;
@@ -313,11 +359,23 @@
   var isLeaf =
       (leafTags != null) && JS('bool', '(#[#]) === true', leafTags, tag);
   if (isLeaf) {
-    var fieldName = JS_IS_INDEXABLE_FIELD_NAME();
-    bool indexability = JS('bool', r'!!#[#]', interceptor, fieldName);
-    return makeDispatchRecord(interceptor, false, null, indexability);
+    return makeLeafDispatchRecord(interceptor);
   } else {
     var proto = JS('', 'Object.getPrototypeOf(#)', obj);
     return makeDispatchRecord(interceptor, proto, null, null);
   }
 }
+
+makeLeafDispatchRecord(interceptor) {
+  var fieldName = JS_IS_INDEXABLE_FIELD_NAME();
+  bool indexability = JS('bool', r'!!#[#]', interceptor, fieldName);
+  return makeDispatchRecord(interceptor, false, null, indexability);
+}
+
+/**
+ * [proto] should have no shadowing prototypes that are not also assigned a
+ * dispatch rescord.
+ */
+setNativeSubclassDispatchRecord(proto, interceptor) {
+  setDispatchProperty(proto, makeLeafDispatchRecord(interceptor));
+}
diff --git a/sdk/lib/_internal/pub/bin/pub.dart b/sdk/lib/_internal/pub/bin/pub.dart
index f8491d1..1a3e16c 100644
--- a/sdk/lib/_internal/pub/bin/pub.dart
+++ b/sdk/lib/_internal/pub/bin/pub.dart
@@ -151,6 +151,10 @@
   for (var command in PubCommand.commands.keys) {
     // Hide aliases.
     if (PubCommand.commands[command].aliases.indexOf(command) >= 0) continue;
+
+    // Hide undocumented commands.
+    if (PubCommand.commands[command].hidden) continue;
+
     length = math.max(length, command.length);
     names.add(command);
   }
diff --git a/sdk/lib/_internal/pub/lib/src/command.dart b/sdk/lib/_internal/pub/lib/src/command.dart
index 97ad11ce..5c72d58 100644
--- a/sdk/lib/_internal/pub/lib/src/command.dart
+++ b/sdk/lib/_internal/pub/lib/src/command.dart
@@ -15,6 +15,7 @@
 import 'command/help.dart';
 import 'command/install.dart';
 import 'command/lish.dart';
+import 'command/list_package_dirs.dart';
 import 'command/serve.dart';
 import 'command/update.dart';
 import 'command/uploader.dart';
@@ -42,6 +43,10 @@
   /// A one-line description of this command.
   String get description;
 
+  /// If the command is undocumented and should not appear in command listings,
+  /// this will be `true`.
+  bool get hidden => false;
+
   /// How to invoke this command (e.g. `"pub install [package]"`).
   String get usage;
 
@@ -193,6 +198,7 @@
     'deploy': new DeployCommand(),
     'help': new HelpCommand(),
     'install': new InstallCommand(),
+    'list-package-dirs': new ListPackageDirsCommand(),
     'publish': new LishCommand(),
     'serve': new ServeCommand(),
     'update': new UpdateCommand(),
diff --git a/sdk/lib/_internal/pub/lib/src/command/cache.dart b/sdk/lib/_internal/pub/lib/src/command/cache.dart
index b33a045..24c5124 100644
--- a/sdk/lib/_internal/pub/lib/src/command/cache.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/cache.dart
@@ -16,6 +16,7 @@
 class CacheCommand extends PubCommand {
   String get description => "Inspect the system cache.";
   String get usage => 'pub cache list';
+  bool get hidden => true;
   bool get requiresEntrypoint => false;
 
   Future onRun() {
diff --git a/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart b/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart
new file mode 100644
index 0000000..ea5b140
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart
@@ -0,0 +1,48 @@
+// 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 pub.command.list_package_dirs;
+
+import 'dart:async';
+import 'dart:io';
+import 'dart:json' as json;
+
+import '../command.dart';
+import '../exit_codes.dart' as exit_codes;
+import '../log.dart' as log;
+
+/// Handles the `list-package-dirs` pub command.
+class ListPackageDirsCommand extends PubCommand {
+  String get description => "Print local paths to dependencies.";
+  String get usage => "pub list-package-dirs";
+  bool get hidden => true;
+
+  ListPackageDirsCommand() {
+    commandParser.addOption("format",
+        help: "How output should be displayed.",
+        allowed: ["json"]);
+  }
+
+  Future onRun() {
+    if (!entrypoint.lockFileExists) {
+      log.error(json.stringify(
+          'Package "myapp" has no lockfile. Please run "pub install" first.'));
+      exit(exit_codes.NO_INPUT);
+    }
+
+    var output = {};
+    var futures = [];
+    entrypoint.loadLockFile().packages.forEach((name, package) {
+      var source = entrypoint.cache.sources[package.source];
+      futures.add(source.getDirectory(package).then((packageDir) {
+        output[name] = packageDir;
+      }));
+    });
+
+    return Future.wait(futures).then((_) {
+      log.message(json.stringify(output));
+    });
+  }
+}
+
diff --git a/sdk/lib/_internal/pub/lib/src/command/serve.dart b/sdk/lib/_internal/pub/lib/src/command/serve.dart
index 69d92a1..ad891dc 100644
--- a/sdk/lib/_internal/pub/lib/src/command/serve.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/serve.dart
@@ -9,10 +9,12 @@
 
 import 'package:barback/barback.dart';
 import 'package:path/path.dart' as path;
+import 'package:watcher/watcher.dart';
 
 import '../command.dart';
 import '../entrypoint.dart';
 import '../exit_codes.dart' as exit_codes;
+import '../io.dart';
 import '../log.dart' as log;
 import '../pub_package_provider.dart';
 import '../utils.dart';
@@ -26,18 +28,58 @@
   String get description => "Run a local web development server.";
   String get usage => 'pub serve';
 
+  PubPackageProvider _provider;
+  Barback _barback;
+
+  /// The completer for the top-level future returned by the command.
+  ///
+  /// Only used to keep pub running (by not completing) and to pipe fatal
+  /// errors to pub's top-level error-handling machinery.
+  final _commandCompleter = new Completer();
+
   ServeCommand() {
     commandParser.addOption('port', defaultsTo: '8080',
         help: 'The port to listen on.');
   }
 
   Future onRun() {
-    // The completer for the top-level future returned by the command. Only
-    // used to keep pub running (by not completing) and to pipe fatal errors
-    // to pub's top-level error-handling machinery.
-    var completer = new Completer();
+    var port = parsePort();
 
-    return new Future.value().then((_) {
+    return ensureLockFileIsUpToDate().then((_) {
+      return PubPackageProvider.create(entrypoint);
+    }).then((provider) {
+      _provider = provider;
+
+      initBarback();
+
+      HttpServer.bind("localhost", port).then((server) {
+        watchSources();
+
+        log.message("Serving ${entrypoint.root.name} "
+            "on http://localhost:${server.port}");
+
+        server.listen(handleRequest);
+      });
+
+      return _commandCompleter.future;
+    });
+  }
+
+  /// Parses the `--port` command-line argument and exits if it isn't valid.
+  int parsePort() {
+    try {
+      return int.parse(commandOptions['port']);
+    } on FormatException catch(_) {
+      log.error('Could not parse port "${commandOptions['port']}"');
+      this.printUsage();
+      exit(exit_codes.USAGE);
+    }
+  }
+
+  /// Installs dependencies is the lockfile is out of date with respect to the
+  /// pubspec.
+  Future ensureLockFileIsUpToDate() {
+    return new Future.sync(() {
       // The server relies on an up-to-date lockfile, so install first if
       // needed.
       if (!entrypoint.isLockFileUpToDate()) {
@@ -46,91 +88,50 @@
           log.message("Dependencies installed!");
         });
       }
-    }).then((_) {
-      return PubPackageProvider.create(entrypoint);
-    }).then((provider) {
-      var port;
-      try {
-        port = int.parse(commandOptions['port']);
-      } on FormatException catch(_) {
-        log.error('Could not parse port "${commandOptions['port']}"');
-        this.printUsage();
-        exit(exit_codes.USAGE);
+    });
+  }
+
+  void handleRequest(HttpRequest request) {
+    var id = getIdFromUri(request.uri);
+    if (id == null) {
+      notFound(request, "Path ${request.uri.path} is not valid.");
+      return;
+    }
+
+    _barback.getAssetById(id).then((asset) {
+      return validateStream(asset.read()).then((stream) {
+        log.message(
+            "$_green${request.method}$_none ${request.uri} -> $asset");
+        // TODO(rnystrom): Set content-type based on asset type.
+        return request.response.addStream(stream).then((_) {
+          request.response.close();
+        });
+      }).catchError((error) {
+        log.error("$_red${request.method}$_none "
+            "${request.uri} -> $error");
+
+        // If we couldn't read the asset, handle the error gracefully.
+        if (error is FileException) {
+          // Assume this means the asset was a file-backed source asset
+          // and we couldn't read it, so treat it like a missing asset.
+          notFound(request, error);
+          return;
+        }
+
+        // Otherwise, it's some internal error.
+        request.response.statusCode = 500;
+        request.response.reasonPhrase = "Internal Error";
+        request.response.write(error);
+        request.response.close();
+      });
+    }).catchError((error) {
+      log.error("$_red${request.method}$_none ${request.uri} -> $error");
+      if (error is! AssetNotFoundException) {
+        _commandCompleter.completeError(error);
+        return;
       }
 
-      var barback = new Barback(provider);
-
-      barback.results.listen((result) {
-        if (result.succeeded) {
-          // TODO(rnystrom): Report using growl/inotify-send where available.
-          log.message("Build completed ${_green}successfully$_none");
-        } else {
-          log.message("Build completed with "
-              "${_red}${result.errors.length}$_none errors.");
-        }
-      });
-
-      barback.errors.listen((error) {
-        log.error("${_red}Build error:\n$error$_none");
-      });
-
-      // TODO(rnystrom): Watch file system and update sources again when they
-      // are added or modified.
-
-      HttpServer.bind("localhost", port).then((server) {
-        // Add all of the visible files.
-        for (var package in provider.packages) {
-          barback.updateSources(provider.listAssets(package));
-        }
-
-        log.message("Serving ${entrypoint.root.name} "
-            "on http://localhost:${server.port}");
-
-        server.listen((request) {
-          var id = getIdFromUri(request.uri);
-          if (id == null) {
-            return notFound(request, "Path ${request.uri.path} is not valid.");
-          }
-
-          barback.getAssetById(id).then((asset) {
-            return validateStream(asset.read()).then((stream) {
-              log.message(
-                  "$_green${request.method}$_none ${request.uri} -> $asset");
-              // TODO(rnystrom): Set content-type based on asset type.
-              return request.response.addStream(stream).then((_) {
-                request.response.close();
-              });
-            }).catchError((error) {
-              log.error("$_red${request.method}$_none "
-                  "${request.uri} -> $error");
-
-              // If we couldn't read the asset, handle the error gracefully.
-              if (error is FileException) {
-                // Assume this means the asset was a file-backed source asset
-                // and we couldn't read it, so treat it like a missing asset.
-                notFound(request, error);
-                return;
-              }
-
-              // Otherwise, it's some internal error.
-              request.response.statusCode = 500;
-              request.response.reasonPhrase = "Internal Error";
-              request.response.write(error);
-              request.response.close();
-            });
-          }).catchError((error) {
-            log.error("$_red${request.method}$_none ${request.uri} -> $error");
-            if (error is! AssetNotFoundException) {
-              completer.completeError(error);
-              return;
-            }
-
-            notFound(request, error);
-          });
-        });
-      });
-
-      return completer.future;
+      notFound(request, error);
     });
   }
 
@@ -186,4 +187,97 @@
     return new AssetId(entrypoint.root.name,
         path.url.join("web", path.url.joinAll(parts)));
   }
+
+  /// Creates the [Barback] instance and listens to its outputs.
+  void initBarback() {
+    assert(_provider != null);
+
+    _barback = new Barback(_provider);
+
+    _barback.results.listen((result) {
+      if (result.succeeded) {
+        // TODO(rnystrom): Report using growl/inotify-send where available.
+        log.message("Build completed ${_green}successfully$_none");
+      } else {
+        log.message("Build completed with "
+            "${_red}${result.errors.length}$_none errors.");
+      }
+    });
+
+    _barback.errors.listen((error) {
+      log.error("${_red}Build error:\n$error$_none");
+    });
+  }
+
+  /// Adds all of the source assets in the provided packages to barback and
+  /// then watches the public directories for changes.
+  void watchSources() {
+    assert(_provider != null);
+    assert(_barback != null);
+
+    for (var package in _provider.packages) {
+      // Add the initial sources.
+      _barback.updateSources(listAssets(package));
+
+      // Watch the visible package directories for changes.
+      var packageDir = _provider.getPackageDir(package);
+
+      for (var name in getPublicDirectories(package)) {
+        var subdirectory = path.join(packageDir, name);
+        var watcher = new DirectoryWatcher(subdirectory);
+        watcher.events.listen((event) {
+          var id = pathToAssetId(package, packageDir, event.path);
+          if (event.type == ChangeType.REMOVE) {
+            _barback.removeSources([id]);
+          } else {
+            _barback.updateSources([id]);
+          }
+        });
+      }
+    }
+  }
+
+  /// Lists all of the visible files in [package].
+  ///
+  /// This is the recursive contents of the "asset" and "lib" directories (if
+  /// present). If [package] is the entrypoint package, it also includes the
+  /// contents of "web".
+  List<AssetId> listAssets(String package) {
+    var files = <AssetId>[];
+
+    for (var dirPath in getPublicDirectories(package)) {
+      var packageDir = _provider.getPackageDir(package);
+      var dir = path.join(packageDir, dirPath);
+      if (!dirExists(dir)) continue;
+      for (var entry in listDir(dir, recursive: true)) {
+        // Ignore "packages" symlinks if there.
+        if (path.split(entry).contains("packages")) continue;
+
+        // Skip directories.
+        if (!fileExists(entry)) continue;
+
+        files.add(pathToAssetId(package, packageDir, entry));
+      }
+    }
+
+    return files;
+  }
+
+  /// Gets the names of the top-level directories in [package] whose contents
+  /// should be provided as source assets.
+  Iterable<String> getPublicDirectories(String package) {
+    var directories = ["asset", "lib"];
+    if (package == entrypoint.root.name) directories.add("web");
+    return directories;
+  }
+
+  /// Converts a local file path to an [AssetId].
+  AssetId pathToAssetId(String package, String packageDir, String filePath) {
+    var relative = path.relative(filePath, from: packageDir);
+
+    // AssetId paths use "/" on all platforms.
+    relative = path.toUri(relative).path;
+
+    return new AssetId(package, relative);
+  }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/entrypoint.dart b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
index 30f42f7..9ec81ec 100644
--- a/sdk/lib/_internal/pub/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
@@ -53,6 +53,9 @@
   /// The path to the entrypoint's "packages" directory.
   String get packagesDir => path.join(root.dir, 'packages');
 
+  /// `true` if the entrypoint package currently has a lock file.
+  bool get lockFileExists => entryExists(_lockFilePath);
+
   /// Ensures that the package identified by [id] is installed to the directory.
   /// Returns the resolved [PackageId].
   ///
@@ -146,9 +149,8 @@
   /// Loads the list of concrete package versions from the `pubspec.lock`, if it
   /// exists. If it doesn't, this completes to an empty [LockFile].
   LockFile loadLockFile() {
-    var lockFilePath = path.join(root.dir, 'pubspec.lock');
-    if (!entryExists(lockFilePath)) return new LockFile.empty();
-    return new LockFile.load(lockFilePath, cache.sources);
+    if (!lockFileExists) return new LockFile.empty();
+    return new LockFile.load(_lockFilePath, cache.sources);
   }
 
   /// Determines whether or not the lockfile is out of date with respect to the
@@ -181,6 +183,9 @@
     return true;
   }
 
+  /// The path to the entrypoint package's lockfile.
+  String get _lockFilePath => path.join(root.dir, 'pubspec.lock');
+
   /// Saves a list of concrete package versions to the `pubspec.lock` file.
   void _saveLockFile(List<PackageId> packageIds) {
     var lockFile = new LockFile.empty();
diff --git a/sdk/lib/_internal/pub/lib/src/pub_package_provider.dart b/sdk/lib/_internal/pub/lib/src/pub_package_provider.dart
index b1c2821..0c43571 100644
--- a/sdk/lib/_internal/pub/lib/src/pub_package_provider.dart
+++ b/sdk/lib/_internal/pub/lib/src/pub_package_provider.dart
@@ -10,14 +10,10 @@
 import 'package:path/path.dart' as path;
 
 import 'entrypoint.dart';
-import 'io.dart';
 
 /// An implementation of barback's [PackageProvider] interface so that barback
 /// can assets within pub packages.
 class PubPackageProvider implements PackageProvider {
-  /// The [Entrypoint] package being served.
-  final Entrypoint _entrypoint;
-
   /// Maps the names of all of the packages in [_entrypoint]'s transitive
   /// dependency graph to the local path of the directory for that package.
   final Map<String, String> _packageDirs;
@@ -30,7 +26,6 @@
 
     // Cache package directories up front so we can have synchronous access
     // to them.
-    // TODO(rnystrom): Handle missing or out of date lockfile.
     var futures = [];
     entrypoint.loadLockFile().packages.forEach((name, package) {
       var source = entrypoint.cache.sources[package.source];
@@ -40,51 +35,16 @@
     });
 
     return Future.wait(futures).then((_) {
-      return new PubPackageProvider._(entrypoint, packageDirs);
+      return new PubPackageProvider._(packageDirs);
     });
   }
 
-  PubPackageProvider._(this._entrypoint, this._packageDirs);
+  PubPackageProvider._(this._packageDirs);
 
   Iterable<String> get packages => _packageDirs.keys;
 
-  /// Lists all of the visible files in [package].
-  ///
-  /// This is the recursive contents of the "asset" and "lib" directories (if
-  /// present). If [package] is the entrypoint package, it also includes the
-  /// contents of "web".
-  List<AssetId> listAssets(String package) {
-    var files = <AssetId>[];
-
-    addFiles(String dirPath) {
-      var packageDir = _packageDirs[package];
-      var dir = path.join(packageDir, dirPath);
-      if (!dirExists(dir)) return;
-      for (var entry in listDir(dir, recursive: true)) {
-        // Ignore "packages" symlinks if there.
-        if (path.split(entry).contains("packages")) continue;
-
-        // Skip directories.
-        if (!fileExists(entry)) continue;
-
-        // AssetId paths use "/" on all platforms.
-        var relative = path.relative(entry, from: packageDir);
-        relative = path.toUri(relative).path;
-        files.add(new AssetId(package, relative));
-      }
-    }
-
-    // Expose the "asset" and "lib" directories.
-    addFiles("asset");
-    addFiles("lib");
-
-    // The entrypoint's "web" directory is also visible.
-    if (package == _entrypoint.root.name) {
-      addFiles("web");
-    }
-
-    return files;
-  }
+  /// Gets the root directory of [package].
+  String getPackageDir(String package) => _packageDirs[package];
 
   // TODO(rnystrom): Actually support transformers.
   Iterable<Iterable<Transformer>> getTransformers(String package) => [];
diff --git a/sdk/lib/_internal/pub/test/list_package_dirs/ignores_updated_pubspec_test.dart b/sdk/lib/_internal/pub/test/list_package_dirs/ignores_updated_pubspec_test.dart
new file mode 100644
index 0000000..bc13c27
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/list_package_dirs/ignores_updated_pubspec_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE d.file.
+
+import 'package:path/path.dart' as path;
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("uses what's in the lockfile regardless of the pubspec", () {
+    d.dir("foo", [
+      d.libDir("foo"),
+      d.libPubspec("foo", "1.0.0")
+    ]).create();
+
+    d.dir(appPath, [
+      d.appPubspec({
+        "foo": {"path": path.join(sandboxDir, "foo")}
+      })
+    ]).create();
+
+    pubInstall();
+
+    // Add a dependency on "bar" and remove "foo", but don't run "pub install".
+    d.dir(appPath, [
+      d.appPubspec({
+        "bar": "any"
+      })
+    ]).create();
+
+    schedulePub(args: ["list-package-dirs", "--format=json"],
+        outputJson: {
+          "foo": path.join(sandboxDir, "foo")
+        });
+  });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/list_package_dirs/includes_dev_dependencies_test.dart b/sdk/lib/_internal/pub/test/list_package_dirs/includes_dev_dependencies_test.dart
new file mode 100644
index 0000000..60c7786
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/list_package_dirs/includes_dev_dependencies_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE d.file.
+
+import 'package:path/path.dart' as path;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('includes dev dependencies in the results', () {
+    d.dir("foo", [
+      d.libDir("foo"),
+      d.libPubspec("foo", "1.0.0")
+    ]).create();
+
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dev_dependencies": {
+          "foo": {"path": path.join(sandboxDir, "foo")}
+        }
+      })
+    ]).create();
+
+    pubInstall();
+
+    schedulePub(args: ["list-package-dirs", "--format=json"],
+        outputJson: {
+          "foo": path.join(sandboxDir, "foo")
+        });
+  });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart b/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart
new file mode 100644
index 0000000..b3ac39b
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE d.file.
+
+import 'package:path/path.dart' as path;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('prints the local paths to all packages in the lockfile', () {
+    servePackages([packageMap("bar", "1.0.0")]);
+
+    d.dir("foo", [
+      d.libDir("foo"),
+      d.libPubspec("foo", "1.0.0")
+    ]).create();
+
+    d.dir(appPath, [
+      d.appPubspec({
+        "foo": {"path": path.join(sandboxDir, "foo")},
+        "bar": "any"
+      })
+    ]).create();
+
+    pubInstall();
+
+    schedulePub(args: ["list-package-dirs", "--format=json"],
+        outputJson: {
+          "foo": path.join(sandboxDir, "foo"),
+          "bar": port.then((p) => path.join(sandboxDir, cachePath, "hosted",
+              "localhost%58$p", "bar-1.0.0"))
+        });
+  });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/list_package_dirs/no_lockfile_test.dart b/sdk/lib/_internal/pub/test/list_package_dirs/no_lockfile_test.dart
new file mode 100644
index 0000000..554edd7
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/list_package_dirs/no_lockfile_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE d.file.
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('with no lockfile, exits with error', () {
+    d.dir(appPath, [
+      d.appPubspec()
+    ]).create();
+
+    schedulePub(args: ["list-package-dirs", "--format=json"],
+        error: '''
+        "Package \\"myapp\\" has no lockfile. Please run \\"pub install\\" first."
+        ''',
+        exitCode: exit_codes.NO_INPUT);
+  });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/pub_cache_test.dart b/sdk/lib/_internal/pub/test/pub_cache_test.dart
index 39bb79b..91bc4a0 100644
--- a/sdk/lib/_internal/pub/test/pub_cache_test.dart
+++ b/sdk/lib/_internal/pub/test/pub_cache_test.dart
@@ -4,12 +4,19 @@
 
 library pub_cache_test;
 
+import 'package:path/path.dart' as path;
+
 import 'descriptor.dart' as d;
 import 'test_pub.dart';
 
 main() {
   initConfig();
 
+  hostedDir(package) {
+    return path.join(sandboxDir, cachePath, "hosted",
+        "pub.dartlang.org", package);
+  }
+
   integration('running pub cache displays error message', () {
     schedulePub(args: ['cache'],
         output: '''
@@ -47,7 +54,7 @@
       ])
     ]).create();
 
-    schedulePub(args: ['cache', 'list'], output: '{"packages":{}}');
+    schedulePub(args: ['cache', 'list'], outputJson: {"packages":{}});
   });
 
   integration('running pub cache list', () {
@@ -66,10 +73,12 @@
       ])
     ]).create();
 
-    schedulePub(args: ['cache', 'list'], output:
-      new RegExp(r'\{"packages":\{"bar":\{"2\.0\.0":\{"location":'
-          r'"[^"]+bar-2\.0\.0"\}},"foo":\{"1\.2\.3":\{"location":'
-          r'"[^"]+foo-1\.2\.3"\}\}\}\}$'));
+    schedulePub(args: ['cache', 'list'], outputJson: {
+      "packages": {
+        "bar": {"2.0.0": {"location": hostedDir('bar-2.0.0')}},
+        "foo": {"1.2.3": {"location": hostedDir('foo-1.2.3')}}
+      }
+    });
   });
 
   integration('includes packages containing deps with bad sources', () {
@@ -85,8 +94,10 @@
       ])
     ]).create();
 
-    schedulePub(args: ['cache', 'list'], output:
-      new RegExp(r'\{"packages":\{"foo":\{"1\.2\.3":\{"location":'
-          r'"[^"]+foo-1\.2\.3"\}\}\}\}$'));
+    schedulePub(args: ['cache', 'list'], outputJson: {
+      "packages": {
+        "foo": {"1.2.3": {"location": hostedDir('foo-1.2.3')}}
+      }
+    });
   });
 }
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/pub_test.dart b/sdk/lib/_internal/pub/test/pub_test.dart
index ce4a4c5..f9b5c57 100644
--- a/sdk/lib/_internal/pub/test/pub_test.dart
+++ b/sdk/lib/_internal/pub/test/pub_test.dart
@@ -28,7 +28,6 @@
     -v, --verbose         Shortcut for "--verbosity=all".
 
     Available commands:
-      cache      Inspect the system cache.
       deploy     Copy and compile all Dart entrypoints in the 'web' directory.
       help       Display help information for Pub.
       install    Install the current package's dependencies.
diff --git a/sdk/lib/_internal/pub/test/serve/missing_asset_test.dart b/sdk/lib/_internal/pub/test/serve/missing_asset_test.dart
index 1f69b6c..39efa26 100644
--- a/sdk/lib/_internal/pub/test/serve/missing_asset_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/missing_asset_test.dart
@@ -4,8 +4,6 @@
 
 library pub_tests;
 
-import 'dart:io';
-
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
 import 'utils.dart';
diff --git a/sdk/lib/_internal/pub/test/serve/serve_from_dependency_asset_test.dart b/sdk/lib/_internal/pub/test/serve/serve_from_dependency_asset_test.dart
index ff25e6a..0d41296 100644
--- a/sdk/lib/_internal/pub/test/serve/serve_from_dependency_asset_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/serve_from_dependency_asset_test.dart
@@ -27,8 +27,7 @@
       })
     ]).create();
 
-    pubInstall();
-    startPubServe();
+    startPubServe(shouldInstallFirst: true);
     requestShouldSucceed("assets/foo/foo.txt", "foo");
     requestShouldSucceed("assets/foo/sub/bar.txt", "bar");
 
diff --git a/sdk/lib/_internal/pub/test/serve/serve_from_dependency_lib_test.dart b/sdk/lib/_internal/pub/test/serve/serve_from_dependency_lib_test.dart
index 7067525..ae7db1b 100644
--- a/sdk/lib/_internal/pub/test/serve/serve_from_dependency_lib_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/serve_from_dependency_lib_test.dart
@@ -27,8 +27,7 @@
       })
     ]).create();
 
-    pubInstall();
-    startPubServe();
+    startPubServe(shouldInstallFirst: true);
     requestShouldSucceed("packages/foo/lib.dart", "foo() => 'foo';");
     requestShouldSucceed("packages/foo/sub/lib.dart", "bar() => 'bar';");
 
diff --git a/sdk/lib/_internal/pub/test/serve/utils.dart b/sdk/lib/_internal/pub/test/serve/utils.dart
index 3a08392..128917a 100644
--- a/sdk/lib/_internal/pub/test/serve/utils.dart
+++ b/sdk/lib/_internal/pub/test/serve/utils.dart
@@ -67,4 +67,22 @@
       expect(response.statusCode, equals(404));
     });
   }, "request $urlPath");
-}
\ No newline at end of file
+}
+
+/// Reads lines from pub serve's stdout until it prints the build success
+/// message.
+///
+/// The schedule will not proceed until the output is found. If not found, it
+/// will eventually time out.
+void waitForBuildSuccess() {
+  nextLine() {
+    return _pubServer.nextLine().then((line) {
+      if (line.contains("successfully")) return;
+
+      // This line wasn't it, so ignore it and keep trying.
+      return nextLine();
+    });
+  }
+
+  schedule(nextLine);
+}
diff --git a/sdk/lib/_internal/pub/test/serve/watch_added_file_test.dart b/sdk/lib/_internal/pub/test/serve/watch_added_file_test.dart
new file mode 100644
index 0000000..75a1718
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/watch_added_file_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("picks up files added after serving started", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file("index.html", "body")
+      ])
+    ]).create();
+
+    startPubServe();
+    waitForBuildSuccess();
+    requestShouldSucceed("index.html", "body");
+
+    d.dir(appPath, [
+      d.dir("web", [
+        d.file("other.html", "added")
+      ])
+    ]).create();
+
+    waitForBuildSuccess();
+    requestShouldSucceed("other.html", "added");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/watch_modified_file_test.dart b/sdk/lib/_internal/pub/test/serve/watch_modified_file_test.dart
new file mode 100644
index 0000000..6cf610d
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/watch_modified_file_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("watches modifications to files", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file("index.html", "before")
+      ])
+    ]).create();
+
+    startPubServe();
+    requestShouldSucceed("index.html", "before");
+
+    d.dir(appPath, [
+      d.dir("web", [
+        d.file("index.html", "after")
+      ])
+    ]).create();
+
+    waitForBuildSuccess();
+    requestShouldSucceed("index.html", "after");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/watch_removed_file_test.dart b/sdk/lib/_internal/pub/test/serve/watch_removed_file_test.dart
new file mode 100644
index 0000000..46fdc4c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/watch_removed_file_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as path;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/io.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("stop serving a file that is removed", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file("index.html", "body")
+      ])
+    ]).create();
+
+    startPubServe();
+    requestShouldSucceed("index.html", "body");
+
+    schedule(() => deleteEntry(
+        path.join(sandboxDir, appPath, "web", "index.html")));
+
+    waitForBuildSuccess();
+    requestShould404("index.html");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart
index b018be1..f1358a9 100644
--- a/sdk/lib/_internal/pub/test/test_pub.dart
+++ b/sdk/lib/_internal/pub/test/test_pub.dart
@@ -366,20 +366,40 @@
       'symlinking $target to $symlink');
 }
 
-/// Schedules a call to the Pub command-line utility. Runs Pub with [args] and
-/// validates that its results match [output], [error], and [exitCode].
-void schedulePub({List args, Pattern output, Pattern error,
+/// Schedules a call to the Pub command-line utility.
+///
+/// Runs Pub with [args] and validates that its results match [output] (or
+/// [outputJson]), [error], and [exitCode]. If [outputJson] is given, validates
+/// that pub outputs stringified JSON matching that object.
+void schedulePub({List args, Pattern output, Pattern error, outputJson,
     Future<Uri> tokenEndpoint, int exitCode: 0}) {
+  // Cannot pass both output and outputJson.
+  assert(output == null || outputJson == null);
+
   var pub = startPub(args: args, tokenEndpoint: tokenEndpoint);
   pub.shouldExit(exitCode);
 
+  var failures = [];
+  var stderr;
+
   expect(Future.wait([
     pub.remainingStdout(),
     pub.remainingStderr()
   ]).then((results) {
-    var failures = [];
-    _validateOutput(failures, 'stdout', output, results[0].split('\n'));
-    _validateOutput(failures, 'stderr', error, results[1].split('\n'));
+    stderr = results[1];
+
+    if (outputJson == null) {
+      _validateOutput(failures, 'stdout', output, results[0]);
+      return;
+    }
+
+    // Allow the expected JSON to contain futures.
+    return awaitObject(outputJson).then((resolved) {
+      _validateOutputJson(failures, 'stdout', resolved, results[0]);
+    });
+  }).then((_) {
+    _validateOutput(failures, 'stderr', error, stderr);
+
     if (!failures.isEmpty) throw new TestFailure(failures.join('\n'));
   }), completes);
 }
@@ -647,13 +667,14 @@
 /// report the offending difference in a nice way. For other [Pattern]s, just
 /// reports whether the output contained the pattern.
 void _validateOutput(List<String> failures, String pipe, Pattern expected,
-                     List<String> actual) {
+                     String actual) {
   if (expected == null) return;
 
+  var actualLines = actual.split("\n");
   if (expected is RegExp) {
-    _validateOutputRegex(failures, pipe, expected, actual);
+    _validateOutputRegex(failures, pipe, expected, actualLines);
   } else {
-    _validateOutputString(failures, pipe, expected, actual);
+    _validateOutputString(failures, pipe, expected, actualLines);
   }
 }
 
@@ -719,6 +740,22 @@
   }
 }
 
+void _validateOutputJson(List<String> failures, String pipe,
+                         expected, String actualText) {
+  var actual;
+  try {
+    actual = json.parse(actualText);
+  } on FormatException catch(error) {
+    failures.add('Expected $pipe JSON:');
+    failures.add(expected);
+    failures.add('Got invalid JSON:');
+    failures.add(actualText);
+  }
+
+  // Do a deep comparison of the JSON objects.
+  expect(actual, equals(expected));
+}
+
 /// A function that creates a [Validator] subclass.
 typedef Validator ValidatorCreator(Entrypoint entrypoint);
 
diff --git a/sdk/lib/async/async.dart b/sdk/lib/async/async.dart
index 5f843b2..76c2b42 100644
--- a/sdk/lib/async/async.dart
+++ b/sdk/lib/async/async.dart
@@ -2,6 +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.
 
+/**
+ * Support for asynchronous programming,
+ * with classes such as Future and Stream.
+ *
+ * For an introduction to using dart:async, see the
+ * [dart:async section of the language tour]
+ * (https://www.dartlang.org/docs/dart-up-and-running/contents/ch03.html#ch03-asynchronous-programming).
+ * Also see
+ * [articles](https://www.dartlang.org/articles/)
+ * such as
+ * [Using Future Based APIs]
+ * (https://www.dartlang.org/articles/using-future-based-apis/).
+ */
 library dart.async;
 
 import "dart:collection";
diff --git a/sdk/lib/async/stream_impl.dart b/sdk/lib/async/stream_impl.dart
index c8fbe70..7f26c4f 100644
--- a/sdk/lib/async/stream_impl.dart
+++ b/sdk/lib/async/stream_impl.dart
@@ -548,7 +548,7 @@
 }
 
 /** A delayed data event. */
-class _DelayedData<T> extends _DelayedEvent{
+class _DelayedData<T> extends _DelayedEvent {
   final T value;
   _DelayedData(this.value);
   void perform(_EventDispatch<T> dispatch) {
diff --git a/sdk/lib/chrome/dart2js/chrome_dart2js.dart b/sdk/lib/chrome/dart2js/chrome_dart2js.dart
index 0bca602..77338a8 100644
--- a/sdk/lib/chrome/dart2js/chrome_dart2js.dart
+++ b/sdk/lib/chrome/dart2js/chrome_dart2js.dart
@@ -1,10 +1,10 @@
-/// Native wrappers for the Chrome Packaged App APIs.
+/// Native wrappers for the Chrome packaged app APIs.
 ///
-/// These functions allow direct access to the Packaged App APIs, allowing
-/// Chrome Packaged Apps to be written using Dart.
+/// These functions allow direct access to the chrome.* APIs, allowing
+/// Chrome packaged apps to be written using Dart.
 ///
-/// For more information on these APIs, see the Chrome.* APIs Documentation:
-///   http://developer.chrome.com/extensions/api_index.html
+/// For more information on these APIs, see the
+/// [chrome.* API documentation](http://developer.chrome.com/apps/api_index.html).
 library chrome;
 
 import 'dart:_foreign_helper' show JS;
@@ -363,6 +363,7 @@
    * Members
    */
   API_ChromeApp app;
+  API_file_system fileSystem;
 
   /*
    * Constructor
@@ -376,6 +377,11 @@
     if (app_object == null)
       throw new UnsupportedError('Not supported by current browser.');
     app = new API_ChromeApp(app_object);
+
+    var file_system_object = JS('', '#.fileSystem', this._jsObject);
+    if (file_system_object == null)
+      throw new UnsupportedError('Not supported by current browser.');
+    fileSystem = new API_file_system(file_system_object);
   }
 }
 
diff --git a/sdk/lib/collection/collection.dart b/sdk/lib/collection/collection.dart
index f77fc23..ba07414 100644
--- a/sdk/lib/collection/collection.dart
+++ b/sdk/lib/collection/collection.dart
@@ -2,6 +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.
 
+/**
+ * Classes and utilities that supplement the collection support in dart:core.
+ */
 library dart.collection;
 
 import 'dart:_collection-dev';
diff --git a/sdk/lib/convert/convert.dart b/sdk/lib/convert/convert.dart
index 4003684..3e9b6f5 100644
--- a/sdk/lib/convert/convert.dart
+++ b/sdk/lib/convert/convert.dart
@@ -2,6 +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.
 
+/**
+ * Converters for JSON and UTF-8, as well as support for creating additional 
+ * converters.
+ */
 library dart.convert;
 
 import 'dart:async';
diff --git a/sdk/lib/core/bool.dart b/sdk/lib/core/bool.dart
index 2c5da00..6155d6a 100644
--- a/sdk/lib/core/bool.dart
+++ b/sdk/lib/core/bool.dart
@@ -4,9 +4,22 @@
 
 part of dart.core;
 
+/**
+ * The reserved words [:true:] and [:false:] denote objects that are the only
+ * instances of this class.
+ * 
+ * It is a compile-time error for a class to attempt to extend or implement
+ * bool.
+ */
 class bool {
   factory bool._uninstantiable() {
     throw new UnsupportedError(
         "class bool cannot be instantiated");
   }
+
+  /**
+   * Returns [:"true":] if the receiver is [:true:], or [:"false":] if the
+   * receiver is [:false:].
+   */
+  String toString();
 }
diff --git a/sdk/lib/core/core.dart b/sdk/lib/core/core.dart
index de7fc4a..89208f8 100644
--- a/sdk/lib/core/core.dart
+++ b/sdk/lib/core/core.dart
@@ -25,6 +25,7 @@
 part "iterator.dart";
 part "list.dart";
 part "map.dart";
+part "null.dart";
 part "num.dart";
 part "object.dart";
 part "pattern.dart";
diff --git a/sdk/lib/core/corelib_sources.gypi b/sdk/lib/core/corelib_sources.gypi
index faafe0a..172f2e8 100644
--- a/sdk/lib/core/corelib_sources.gypi
+++ b/sdk/lib/core/corelib_sources.gypi
@@ -22,6 +22,7 @@
     'iterator.dart',
     'list.dart',
     'map.dart',
+    'null.dart',
     'num.dart',
     'object.dart',
     'pattern.dart',
diff --git a/sdk/lib/core/double.dart b/sdk/lib/core/double.dart
index 0028f91..409e294 100644
--- a/sdk/lib/core/double.dart
+++ b/sdk/lib/core/double.dart
@@ -11,10 +11,14 @@
 /**
  * Representation of Dart doubles containing double specific constants
  * and operations and specializations of operations inherited from
- * [num].
+ * [num]. Dart doubles are 64-bit floating-point numbers as specified in the
+ * IEEE 754 standard.
  *
  * The [double] type is contagious. Operations on [double]s return
  * [double] results.
+ *
+ * It is a compile-time error for a class to attempt to extend or implement
+ * double.
  */
 abstract class double extends num {
   static const double NAN = 0.0 / 0.0;
@@ -142,15 +146,16 @@
    * (optional) exponent part consists of the character "e" or "E", an optional
    * sign, and one or more digits.
    *
-   * The input string is trimmed (see [String.trim]) before conversion.
+   * Leading and trailing whitespace is ignored.
    *
-   * If the [source] is not a valid double literal, the [handleError]
+   * If the [source] is not a valid double literal, the [onError]
    * is called with the [source] as argument, and its return value is
-   * used instead. If no handleError is provided, a [FormatException]
-   * is thrown.
+   * used instead. If no `onError` is provided, a [FormatException]
+   * is thrown instead.
    *
-   * The [onError] function is only invoked if [source] is a [String]. It is
-   * not invoked if the [source] is, for example, `null`.
+   * The [onError] function is only invoked if [source] is a [String] with an
+   * invalid format. It is not invoked if the [source] is invalid for some
+   * other reason, for example by being `null`.
    *
    * Examples of accepted strings:
    *
@@ -164,5 +169,5 @@
    *     "-NaN"
    */
   external static double parse(String source,
-                               [double handleError(String source)]);
+                               [double onError(String source)]);
 }
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index f61cdfe..1ce7193 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -16,15 +16,48 @@
       return object.toString();
     }
     if (object is String) {
-      // TODO(ahe): Remove backslash when http://dartbug.com/4995 is fixed.
       String string = object;
-      const backslash = '\\';
-      String escaped = string
-        .replaceAll('$backslash', '$backslash$backslash')
-        .replaceAll('\n', '${backslash}n')
-        .replaceAll('\r', '${backslash}r')
-        .replaceAll('"',  '$backslash"');
-      return '"$escaped"';
+      StringBuffer buffer = new StringBuffer('"');
+      const int TAB = 0x09;
+      const int NEWLINE = 0x0a;
+      const int CARRIGE_RETURN = 0x0d;
+      const int BACKSLASH = 0x5c;
+      const int DOUBLE_QUOTE = 0x22;
+      const int DIGIT_ZERO = 0x30;
+      const int LOWERCASE_A = 0x61;
+      const int MAX_CONTROL = 0x1f;
+      for (int i = 0; i < string.length; i++) {
+        int codeUnit = string.codeUnitAt(i);
+        if (codeUnit <= MAX_CONTROL) {
+          if (codeUnit == NEWLINE) {
+            buffer.write(r"\n");
+          } else if (codeUnit == CARRIGE_RETURN) {
+            buffer.write(r"\r");
+          } else if (codeUnit == TAB) {
+            buffer.write(r"\t");
+          } else {
+            buffer.write(r"\x");
+            // Convert code in range 0x00 .. 0x1f to hex a two-digit hex string.
+            if (codeUnit < 0x10) {
+              buffer.write("0");
+            } else {
+              buffer.write("1");
+              codeUnit -= 0x10;
+            }
+            // Single digit to hex.
+            buffer.writeCharCode(codeUnit < 10 ? DIGIT_ZERO + codeUnit
+                                               : LOWERCASE_A - 10 + codeUnit);
+          }
+        } else if (codeUnit == BACKSLASH) {
+          buffer.write(r"\\");
+        } else if (codeUnit == DOUBLE_QUOTE) {
+          buffer.write(r'\"');
+        } else {
+          buffer.writeCharCode(codeUnit);
+        }
+      }
+      buffer.write('"');
+      return buffer.toString();
     }
     return _objectToString(object);
   }
diff --git a/sdk/lib/core/int.dart b/sdk/lib/core/int.dart
index 2dd2be2..5d7f79a 100644
--- a/sdk/lib/core/int.dart
+++ b/sdk/lib/core/int.dart
@@ -17,6 +17,8 @@
  * values. The behavior of the operators and methods in the [int]
  * class therefore sometimes differs between the Dart VM and Dart code
  * compiled to JavaScript.*
+ *
+ * It is a compile-time error for a class to attempt to extend or implement int.
  */
 abstract class int extends num {
   /** The bit-wise and operator. */
diff --git a/sdk/lib/core/null.dart b/sdk/lib/core/null.dart
new file mode 100644
index 0000000..dd914a3
--- /dev/null
+++ b/sdk/lib/core/null.dart
@@ -0,0 +1,21 @@
+// 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;
+
+/**
+ * The reserved word [:null:] denotes an object that is the sole instance of 
+ * this class.
+ * 
+ * It is a compile-time error for a class to attempt to extend or implement
+ * Null.
+ */
+class Null {
+  factory Null._uninstantiable() {
+    throw new UnsupportedError('class Null cannot be instantiated');
+  }
+
+  /** Returns the string `"null"`. */
+  String toString() => "null";
+}
diff --git a/sdk/lib/core/num.dart b/sdk/lib/core/num.dart
index 57bf59e..b35a5ad 100644
--- a/sdk/lib/core/num.dart
+++ b/sdk/lib/core/num.dart
@@ -6,6 +6,9 @@
 
 /**
  * All numbers in dart are instances of [num].
+ *
+ * It is a compile-time error for any type other than the types int and double
+ * to attempt to extend or implement num.
  */
 abstract class num implements Comparable<num> {
   /** Addition operator. */
diff --git a/sdk/lib/core/object.dart b/sdk/lib/core/object.dart
index 3b61927..737f916 100644
--- a/sdk/lib/core/object.dart
+++ b/sdk/lib/core/object.dart
@@ -23,6 +23,25 @@
    * The default behavior for all [Object]s is to return true if and
    * only if [:this:] and [other] are the same object.
    *
+   * Override this method to specify a different equality relation on
+   * a class. The overriding method must still be an equivalence relation.
+   * That is, it must be:
+   *
+   *  * Total: It must return a boolean for all arguments. It should never throw
+   *    or return `null`.
+   *
+   *  * Reflexive: For all objects `o`, `o == o` must be true.
+   *
+   *  * Symmetric: For all objects `o1` and `o2`, `o1 == o2` and `o2 == o1` must
+   *    either both be true, or both be false.
+   *
+   *  * Transitive: For all objects `o1`, `o2`, and `o3`, if `o1 == o2` and
+   *    `o2 == o3` are true, then `o1 == o3` must be true.
+   *
+   * The method should also be consistent over time, so equality of two objects
+   * should not change over time, or at least only change if one of the objects
+   * was modified.
+   *
    * If a subclass overrides the equality operator it should override
    * the [hashCode] method as well to maintain consistency.
    */
diff --git a/sdk/lib/core/regexp.dart b/sdk/lib/core/regexp.dart
index dd29d51..a515692 100644
--- a/sdk/lib/core/regexp.dart
+++ b/sdk/lib/core/regexp.dart
@@ -69,7 +69,7 @@
 
 
 /**
- * [RegExp] represents regular expressions.
+ * A class for working with regular expressions.
  *
  * Dart regular expressions have the same syntax and semantics as
  * JavaScript regular expressions. See
diff --git a/sdk/lib/core/string.dart b/sdk/lib/core/string.dart
index e2ffc23..3f1a7cc 100644
--- a/sdk/lib/core/string.dart
+++ b/sdk/lib/core/string.dart
@@ -16,6 +16,9 @@
  * terminology to Go we use the name "rune" for an integer representing a
  * Unicode code point. The runes of a string are accessible through the [runes]
  * getter.
+ *
+ * It is a compile-time error for a class to attempt to extend or implement
+ * String.
  */
 abstract class String implements Comparable<String>, Pattern {
   /**
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index 02573c2..47d6327 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -738,10 +738,29 @@
     return output.join("/");
   }
 
-  Uri resolve(String uri) {
-    return resolveUri(Uri.parse(uri));
+  /**
+   * Resolve [reference] as an URI relative to `this`.
+   *
+   * First turn [reference] into a URI using [Uri.parse]. Then resolve the
+   * resulting URI relative to `this`.
+   *
+   * Returns the resolved URI.
+   *
+   * See [resolveUri] for details.
+   */
+  Uri resolve(String reference) {
+    return resolveUri(Uri.parse(reference));
   }
 
+  /**
+   * Resolve [reference] as an URI relative to `this`.
+   *
+   * Returns the resolved URI.
+   *
+   * The algorithm for resolving a reference is described in
+   * [RFC-3986 Section 5]
+   * (http://tools.ietf.org/html/rfc3986#section-5 "RFC-1123").
+   */
   Uri resolveUri(Uri reference) {
     // From RFC 3986.
     String targetScheme;
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 1ff5ad4..15b960c 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -18,8 +18,6 @@
 import 'dart:web_audio' as web_audio;
 import 'dart:web_gl' as gl;
 import 'dart:web_sql';
-import 'dart:_js_helper' show convertDartClosureToJS, Creates, JavaScriptIndexingBehavior, JSName, Null, Returns;
-import 'dart:_interceptors' show Interceptor, JSExtendableArray;
 import 'dart:_isolate_helper' show IsolateNatives;
 import 'dart:_foreign_helper' show JS;
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32,6 +30,12 @@
 
 
 // Not actually used, but imported since dart:html can generate these objects.
+import 'dart:_js_helper' show
+    convertDartClosureToJS, Creates, JavaScriptIndexingBehavior,
+    JSName, Null, Returns,
+    findDispatchTagForInterceptorClass, setNativeSubclassDispatchRecord;
+import 'dart:_interceptors' show
+    Interceptor, JSExtendableArray, findInterceptorConstructorForType;
 
 
 
@@ -62,8 +66,8 @@
 
 // Workaround for tags like <cite> that lack their own Element subclass --
 // Dart issue 1990.
-class _HTMLElement extends Element native "HTMLElement" {
-  factory _HTMLElement() { throw new UnsupportedError("Not supported"); }
+class HtmlElement extends Element native "HTMLElement" {
+  factory HtmlElement() { throw new UnsupportedError("Not supported"); }
 }
 
 // Support for Send/ReceivePortSync.
@@ -154,7 +158,7 @@
 
 @DocsEditable()
 @DomName('HTMLAnchorElement')
-class AnchorElement extends _HTMLElement native "HTMLAnchorElement" {
+class AnchorElement extends HtmlElement native "HTMLAnchorElement" {
   // To suppress missing implicit constructor warnings.
   factory AnchorElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -403,7 +407,7 @@
  * on MDN.
  */
 @DomName('HTMLAreaElement')
-class AreaElement extends _HTMLElement native "HTMLAreaElement" {
+class AreaElement extends HtmlElement native "HTMLAreaElement" {
   // To suppress missing implicit constructor warnings.
   factory AreaElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -511,7 +515,7 @@
 
 @DocsEditable()
 @DomName('HTMLBRElement')
-class BRElement extends _HTMLElement native "HTMLBRElement" {
+class BRElement extends HtmlElement native "HTMLBRElement" {
   // To suppress missing implicit constructor warnings.
   factory BRElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -541,7 +545,7 @@
 
 @DocsEditable()
 @DomName('HTMLBaseElement')
-class BaseElement extends _HTMLElement native "HTMLBaseElement" {
+class BaseElement extends HtmlElement native "HTMLBaseElement" {
   // To suppress missing implicit constructor warnings.
   factory BaseElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -620,7 +624,7 @@
 
 @DocsEditable()
 @DomName('HTMLBodyElement')
-class BodyElement extends _HTMLElement native "HTMLBodyElement" {
+class BodyElement extends HtmlElement native "HTMLBodyElement" {
   // To suppress missing implicit constructor warnings.
   factory BodyElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -731,7 +735,7 @@
 
 @DocsEditable()
 @DomName('HTMLButtonElement')
-class ButtonElement extends _HTMLElement native "HTMLButtonElement" {
+class ButtonElement extends HtmlElement native "HTMLButtonElement" {
   // To suppress missing implicit constructor warnings.
   factory ButtonElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -844,7 +848,7 @@
 
 
 @DomName('HTMLCanvasElement')
-class CanvasElement extends _HTMLElement implements CanvasImageSource native "HTMLCanvasElement" {
+class CanvasElement extends HtmlElement implements CanvasImageSource native "HTMLCanvasElement" {
   // To suppress missing implicit constructor warnings.
   factory CanvasElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -1926,7 +1930,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME, '26')
 @Experimental()
 // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#content-element
-class ContentElement extends _HTMLElement native "HTMLContentElement" {
+class ContentElement extends HtmlElement native "HTMLContentElement" {
   // To suppress missing implicit constructor warnings.
   factory ContentElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -6295,7 +6299,7 @@
 
 @DocsEditable()
 @DomName('HTMLDListElement')
-class DListElement extends _HTMLElement native "HTMLDListElement" {
+class DListElement extends HtmlElement native "HTMLDListElement" {
   // To suppress missing implicit constructor warnings.
   factory DListElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -6314,7 +6318,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
-class DataListElement extends _HTMLElement native "HTMLDataListElement" {
+class DataListElement extends HtmlElement native "HTMLDataListElement" {
   // To suppress missing implicit constructor warnings.
   factory DataListElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -6523,7 +6527,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental()
-class DetailsElement extends _HTMLElement native "HTMLDetailsElement" {
+class DetailsElement extends HtmlElement native "HTMLDetailsElement" {
   // To suppress missing implicit constructor warnings.
   factory DetailsElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -6664,7 +6668,7 @@
 @DocsEditable()
 @DomName('HTMLDialogElement')
 @Unstable()
-class DialogElement extends _HTMLElement native "HTMLDialogElement" {
+class DialogElement extends HtmlElement native "HTMLDialogElement" {
   // To suppress missing implicit constructor warnings.
   factory DialogElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -6913,7 +6917,7 @@
  * * [Inline-level element](http://www.w3.org/TR/CSS2/visuren.html#inline-boxes) from W3C.
  */
 @DomName('HTMLDivElement')
-class DivElement extends _HTMLElement native "HTMLDivElement" {
+class DivElement extends HtmlElement native "HTMLDivElement" {
   // To suppress missing implicit constructor warnings.
   factory DivElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -6976,7 +6980,7 @@
   /// Moved to [HtmlDocument].
   @DomName('Document.body')
   @DocsEditable()
-  Element $dom_body;
+  HtmlElement $dom_body;
 
   @DomName('Document.charset')
   @DocsEditable()
@@ -10574,7 +10578,7 @@
 @SupportedBrowser(SupportedBrowser.IE)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
-class EmbedElement extends _HTMLElement native "HTMLEmbedElement" {
+class EmbedElement extends HtmlElement native "HTMLEmbedElement" {
   // To suppress missing implicit constructor warnings.
   factory EmbedElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -11196,7 +11200,7 @@
 @DocsEditable()
 @DomName('HTMLFieldSetElement')
 @Unstable()
-class FieldSetElement extends _HTMLElement native "HTMLFieldSetElement" {
+class FieldSetElement extends HtmlElement native "HTMLFieldSetElement" {
   // To suppress missing implicit constructor warnings.
   factory FieldSetElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -11872,7 +11876,7 @@
 
 @DocsEditable()
 @DomName('HTMLFormElement')
-class FormElement extends _HTMLElement native "HTMLFormElement" {
+class FormElement extends HtmlElement native "HTMLFormElement" {
   // To suppress missing implicit constructor warnings.
   factory FormElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -12144,7 +12148,7 @@
  * An `<hr>` tag.
  */
 @DomName('HTMLHRElement')
-class HRElement extends _HTMLElement native "HTMLHRElement" {
+class HRElement extends HtmlElement native "HTMLHRElement" {
   // To suppress missing implicit constructor warnings.
   factory HRElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -12200,7 +12204,7 @@
 
 @DocsEditable()
 @DomName('HTMLHeadElement')
-class HeadElement extends _HTMLElement native "HTMLHeadElement" {
+class HeadElement extends HtmlElement native "HTMLHeadElement" {
   // To suppress missing implicit constructor warnings.
   factory HeadElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -12215,7 +12219,7 @@
 
 @DocsEditable()
 @DomName('HTMLHeadingElement')
-class HeadingElement extends _HTMLElement native "HTMLHeadingElement" {
+class HeadingElement extends HtmlElement native "HTMLHeadingElement" {
   // To suppress missing implicit constructor warnings.
   factory HeadingElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -12625,6 +12629,10 @@
   @Experimental()
   String get visibilityState => $dom_webkitVisibilityState;
 
+  @Experimental
+  void register(String tag, Type customElementClass) {
+    _registerCustomElement(JS('', 'window'), this, tag, customElementClass);
+  }
 
   @Creates('Null')  // Set from Dart code; does not instantiate a native type.
   // Note: used to polyfill <template>
@@ -12636,21 +12644,6 @@
 
 
 @DocsEditable()
-@DomName('HTMLHtmlElement')
-class HtmlElement extends _HTMLElement native "HTMLHtmlElement" {
-  // To suppress missing implicit constructor warnings.
-  factory HtmlElement._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('HTMLHtmlElement.HTMLHtmlElement')
-  @DocsEditable()
-  factory HtmlElement() => document.$dom_createElement("html");
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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('HTMLFormControlsCollection')
 class HtmlFormControlsCollection extends HtmlCollection native "HTMLFormControlsCollection" {
   // To suppress missing implicit constructor warnings.
@@ -12666,6 +12659,21 @@
 
 
 @DocsEditable()
+@DomName('HTMLHtmlElement')
+class HtmlHtmlElement extends HtmlElement native "HTMLHtmlElement" {
+  // To suppress missing implicit constructor warnings.
+  factory HtmlHtmlElement._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('HTMLHtmlElement.HTMLHtmlElement')
+  @DocsEditable()
+  factory HtmlHtmlElement() => document.$dom_createElement("html");
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('HTMLOptionsCollection')
 class HtmlOptionsCollection extends HtmlCollection native "HTMLOptionsCollection" {
   // To suppress missing implicit constructor warnings.
@@ -13320,7 +13328,7 @@
 
 @DocsEditable()
 @DomName('HTMLIFrameElement')
-class IFrameElement extends _HTMLElement native "HTMLIFrameElement" {
+class IFrameElement extends HtmlElement native "HTMLIFrameElement" {
   // To suppress missing implicit constructor warnings.
   factory IFrameElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -13421,7 +13429,7 @@
 
 
 @DomName('HTMLImageElement')
-class ImageElement extends _HTMLElement implements CanvasImageSource native "HTMLImageElement" {
+class ImageElement extends HtmlElement implements CanvasImageSource native "HTMLImageElement" {
   // To suppress missing implicit constructor warnings.
   factory ImageElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -13502,7 +13510,7 @@
 
 
 @DomName('HTMLInputElement')
-class InputElement extends _HTMLElement implements
+class InputElement extends HtmlElement implements
     HiddenInputElement,
     SearchInputElement,
     TextInputElement,
@@ -13641,7 +13649,7 @@
 
   @DomName('HTMLInputElement.list')
   @DocsEditable()
-  final Element list;
+  final HtmlElement list;
 
   @DomName('HTMLInputElement.max')
   @DocsEditable()
@@ -14404,7 +14412,7 @@
   @DomName('InputMethodContext.target')
   @DocsEditable()
   @Experimental() // untriaged
-  final Element target;
+  final HtmlElement target;
 
   @DomName('InputMethodContext.confirmComposition')
   @DocsEditable()
@@ -14521,7 +14529,7 @@
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental()
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#the-keygen-element
-class KeygenElement extends _HTMLElement native "HTMLKeygenElement" {
+class KeygenElement extends HtmlElement native "HTMLKeygenElement" {
   // To suppress missing implicit constructor warnings.
   factory KeygenElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -14594,7 +14602,7 @@
 
 @DocsEditable()
 @DomName('HTMLLIElement')
-class LIElement extends _HTMLElement native "HTMLLIElement" {
+class LIElement extends HtmlElement native "HTMLLIElement" {
   // To suppress missing implicit constructor warnings.
   factory LIElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -14619,7 +14627,7 @@
 
 @DocsEditable()
 @DomName('HTMLLabelElement')
-class LabelElement extends _HTMLElement native "HTMLLabelElement" {
+class LabelElement extends HtmlElement native "HTMLLabelElement" {
   // To suppress missing implicit constructor warnings.
   factory LabelElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -14629,7 +14637,7 @@
 
   @DomName('HTMLLabelElement.control')
   @DocsEditable()
-  final Element control;
+  final HtmlElement control;
 
   @DomName('HTMLLabelElement.form')
   @DocsEditable()
@@ -14646,7 +14654,7 @@
 
 @DocsEditable()
 @DomName('HTMLLegendElement')
-class LegendElement extends _HTMLElement native "HTMLLegendElement" {
+class LegendElement extends HtmlElement native "HTMLLegendElement" {
   // To suppress missing implicit constructor warnings.
   factory LegendElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -14665,7 +14673,7 @@
 
 @DocsEditable()
 @DomName('HTMLLinkElement')
-class LinkElement extends _HTMLElement native "HTMLLinkElement" {
+class LinkElement extends HtmlElement native "HTMLLinkElement" {
   // To suppress missing implicit constructor warnings.
   factory LinkElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -14812,7 +14820,7 @@
 
 @DocsEditable()
 @DomName('HTMLMapElement')
-class MapElement extends _HTMLElement native "HTMLMapElement" {
+class MapElement extends HtmlElement native "HTMLMapElement" {
   // To suppress missing implicit constructor warnings.
   factory MapElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -14912,7 +14920,7 @@
 @DocsEditable()
 @DomName('HTMLMediaElement')
 @Unstable()
-class MediaElement extends _HTMLElement native "HTMLMediaElement" {
+class MediaElement extends HtmlElement native "HTMLMediaElement" {
   // To suppress missing implicit constructor warnings.
   factory MediaElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -16029,7 +16037,7 @@
  *  * [Menu Element](http://www.w3.org/TR/html5/the-menu-element.html#the-menu-element) from the W3C.
  */
 @DomName('HTMLMenuElement')
-class MenuElement extends _HTMLElement native "HTMLMenuElement" {
+class MenuElement extends HtmlElement native "HTMLMenuElement" {
   // To suppress missing implicit constructor warnings.
   factory MenuElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -16179,7 +16187,7 @@
 
 @DocsEditable()
 @DomName('HTMLMetaElement')
-class MetaElement extends _HTMLElement native "HTMLMetaElement" {
+class MetaElement extends HtmlElement native "HTMLMetaElement" {
   // To suppress missing implicit constructor warnings.
   factory MetaElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -16243,7 +16251,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
-class MeterElement extends _HTMLElement native "HTMLMeterElement" {
+class MeterElement extends HtmlElement native "HTMLMeterElement" {
   // To suppress missing implicit constructor warnings.
   factory MeterElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -16558,7 +16566,7 @@
 @DocsEditable()
 @DomName('HTMLModElement')
 @Unstable()
-class ModElement extends _HTMLElement native "HTMLModElement" {
+class ModElement extends HtmlElement native "HTMLModElement" {
   // To suppress missing implicit constructor warnings.
   factory ModElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -18155,7 +18163,7 @@
 
 @DocsEditable()
 @DomName('HTMLOListElement')
-class OListElement extends _HTMLElement native "HTMLOListElement" {
+class OListElement extends HtmlElement native "HTMLOListElement" {
   // To suppress missing implicit constructor warnings.
   factory OListElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -18186,7 +18194,7 @@
 @SupportedBrowser(SupportedBrowser.IE)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
-class ObjectElement extends _HTMLElement native "HTMLObjectElement" {
+class ObjectElement extends HtmlElement native "HTMLObjectElement" {
   // To suppress missing implicit constructor warnings.
   factory ObjectElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -18266,7 +18274,7 @@
 
 @DocsEditable()
 @DomName('HTMLOptGroupElement')
-class OptGroupElement extends _HTMLElement native "HTMLOptGroupElement" {
+class OptGroupElement extends HtmlElement native "HTMLOptGroupElement" {
   // To suppress missing implicit constructor warnings.
   factory OptGroupElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -18289,7 +18297,7 @@
 
 @DocsEditable()
 @DomName('HTMLOptionElement')
-class OptionElement extends _HTMLElement native "HTMLOptionElement" {
+class OptionElement extends HtmlElement native "HTMLOptionElement" {
   // To suppress missing implicit constructor warnings.
   factory OptionElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -18354,7 +18362,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
-class OutputElement extends _HTMLElement native "HTMLOutputElement" {
+class OutputElement extends HtmlElement native "HTMLOutputElement" {
   // To suppress missing implicit constructor warnings.
   factory OutputElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -18476,7 +18484,7 @@
 
 @DocsEditable()
 @DomName('HTMLParagraphElement')
-class ParagraphElement extends _HTMLElement native "HTMLParagraphElement" {
+class ParagraphElement extends HtmlElement native "HTMLParagraphElement" {
   // To suppress missing implicit constructor warnings.
   factory ParagraphElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -18492,7 +18500,7 @@
 @DocsEditable()
 @DomName('HTMLParamElement')
 @Unstable()
-class ParamElement extends _HTMLElement native "HTMLParamElement" {
+class ParamElement extends HtmlElement native "HTMLParamElement" {
   // To suppress missing implicit constructor warnings.
   factory ParamElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -19116,7 +19124,7 @@
 
 @DocsEditable()
 @DomName('HTMLPreElement')
-class PreElement extends _HTMLElement native "HTMLPreElement" {
+class PreElement extends HtmlElement native "HTMLPreElement" {
   // To suppress missing implicit constructor warnings.
   factory PreElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -19166,7 +19174,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
-class ProgressElement extends _HTMLElement native "HTMLProgressElement" {
+class ProgressElement extends HtmlElement native "HTMLProgressElement" {
   // To suppress missing implicit constructor warnings.
   factory ProgressElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -19291,7 +19299,7 @@
 
 @DocsEditable()
 @DomName('HTMLQuoteElement')
-class QuoteElement extends _HTMLElement native "HTMLQuoteElement" {
+class QuoteElement extends HtmlElement native "HTMLQuoteElement" {
   // To suppress missing implicit constructor warnings.
   factory QuoteElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -20242,7 +20250,7 @@
 
 @DocsEditable()
 @DomName('HTMLScriptElement')
-class ScriptElement extends _HTMLElement native "HTMLScriptElement" {
+class ScriptElement extends HtmlElement native "HTMLScriptElement" {
   // To suppress missing implicit constructor warnings.
   factory ScriptElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -20429,7 +20437,7 @@
 
 
 @DomName('HTMLSelectElement')
-class SelectElement extends _HTMLElement native "HTMLSelectElement" {
+class SelectElement extends HtmlElement native "HTMLSelectElement" {
   // To suppress missing implicit constructor warnings.
   factory SelectElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -20672,7 +20680,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME, '26')
 @Experimental()
 // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#shadow-element
-class ShadowElement extends _HTMLElement native "HTMLShadowElement" {
+class ShadowElement extends HtmlElement native "HTMLShadowElement" {
   // To suppress missing implicit constructor warnings.
   factory ShadowElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -20890,7 +20898,7 @@
 
 @DocsEditable()
 @DomName('HTMLSourceElement')
-class SourceElement extends _HTMLElement native "HTMLSourceElement" {
+class SourceElement extends HtmlElement native "HTMLSourceElement" {
   // To suppress missing implicit constructor warnings.
   factory SourceElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -20947,7 +20955,7 @@
 
 @DocsEditable()
 @DomName('HTMLSpanElement')
-class SpanElement extends _HTMLElement native "HTMLSpanElement" {
+class SpanElement extends HtmlElement native "HTMLSpanElement" {
   // To suppress missing implicit constructor warnings.
   factory SpanElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -21846,7 +21854,7 @@
 
 @DocsEditable()
 @DomName('HTMLStyleElement')
-class StyleElement extends _HTMLElement native "HTMLStyleElement" {
+class StyleElement extends HtmlElement native "HTMLStyleElement" {
   // To suppress missing implicit constructor warnings.
   factory StyleElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -22025,7 +22033,7 @@
 
 @DocsEditable()
 @DomName('HTMLTableCaptionElement')
-class TableCaptionElement extends _HTMLElement native "HTMLTableCaptionElement" {
+class TableCaptionElement extends HtmlElement native "HTMLTableCaptionElement" {
   // To suppress missing implicit constructor warnings.
   factory TableCaptionElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -22040,7 +22048,7 @@
 
 @DocsEditable()
 @DomName('HTMLTableCellElement')
-class TableCellElement extends _HTMLElement native "HTMLTableCellElement,HTMLTableDataCellElement,HTMLTableHeaderCellElement" {
+class TableCellElement extends HtmlElement native "HTMLTableCellElement,HTMLTableDataCellElement,HTMLTableHeaderCellElement" {
   // To suppress missing implicit constructor warnings.
   factory TableCellElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -22071,7 +22079,7 @@
 
 @DocsEditable()
 @DomName('HTMLTableColElement')
-class TableColElement extends _HTMLElement native "HTMLTableColElement" {
+class TableColElement extends HtmlElement native "HTMLTableColElement" {
   // To suppress missing implicit constructor warnings.
   factory TableColElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -22090,7 +22098,7 @@
 
 @DocsEditable()
 @DomName('HTMLTableElement')
-class TableElement extends _HTMLElement native "HTMLTableElement" {
+class TableElement extends HtmlElement native "HTMLTableElement" {
 
   @DomName('HTMLTableElement.tBodies')
   List<TableSectionElement> get tBodies =>
@@ -22160,17 +22168,17 @@
   @JSName('createCaption')
   @DomName('HTMLTableElement.createCaption')
   @DocsEditable()
-  Element $dom_createCaption() native;
+  HtmlElement $dom_createCaption() native;
 
   @JSName('createTFoot')
   @DomName('HTMLTableElement.createTFoot')
   @DocsEditable()
-  Element $dom_createTFoot() native;
+  HtmlElement $dom_createTFoot() native;
 
   @JSName('createTHead')
   @DomName('HTMLTableElement.createTHead')
   @DocsEditable()
-  Element $dom_createTHead() native;
+  HtmlElement $dom_createTHead() native;
 
   @DomName('HTMLTableElement.deleteCaption')
   @DocsEditable()
@@ -22191,7 +22199,7 @@
   @JSName('insertRow')
   @DomName('HTMLTableElement.insertRow')
   @DocsEditable()
-  Element $dom_insertRow(int index) native;
+  HtmlElement $dom_insertRow(int index) native;
 }
 // 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
@@ -22200,7 +22208,7 @@
 
 @DocsEditable()
 @DomName('HTMLTableRowElement')
-class TableRowElement extends _HTMLElement native "HTMLTableRowElement" {
+class TableRowElement extends HtmlElement native "HTMLTableRowElement" {
 
   @DomName('HTMLTableRowElement.cells')
   List<TableCellElement> get cells =>
@@ -22239,7 +22247,7 @@
   @JSName('insertCell')
   @DomName('HTMLTableRowElement.insertCell')
   @DocsEditable()
-  Element $dom_insertCell(int index) native;
+  HtmlElement $dom_insertCell(int index) native;
 }
 // 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
@@ -22248,7 +22256,7 @@
 
 @DocsEditable()
 @DomName('HTMLTableSectionElement')
-class TableSectionElement extends _HTMLElement native "HTMLTableSectionElement" {
+class TableSectionElement extends HtmlElement native "HTMLTableSectionElement" {
 
   @DomName('HTMLTableSectionElement.rows')
   List<TableRowElement> get rows =>
@@ -22275,7 +22283,7 @@
   @JSName('insertRow')
   @DomName('HTMLTableSectionElement.insertRow')
   @DocsEditable()
-  Element $dom_insertRow(int index) native;
+  HtmlElement $dom_insertRow(int index) native;
 }
 // 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
@@ -22371,7 +22379,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental()
 // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#template-element
-class TemplateElement extends _HTMLElement native "HTMLTemplateElement" {
+class TemplateElement extends HtmlElement native "HTMLTemplateElement" {
   // To suppress missing implicit constructor warnings.
   factory TemplateElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -22621,7 +22629,7 @@
 
 @DocsEditable()
 @DomName('HTMLTextAreaElement')
-class TextAreaElement extends _HTMLElement native "HTMLTextAreaElement" {
+class TextAreaElement extends HtmlElement native "HTMLTextAreaElement" {
   // To suppress missing implicit constructor warnings.
   factory TextAreaElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -23126,7 +23134,7 @@
 
 @DocsEditable()
 @DomName('HTMLTitleElement')
-class TitleElement extends _HTMLElement native "HTMLTitleElement" {
+class TitleElement extends HtmlElement native "HTMLTitleElement" {
   // To suppress missing implicit constructor warnings.
   factory TitleElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -23390,7 +23398,7 @@
 @SupportedBrowser(SupportedBrowser.SAFARI)
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#the-track-element
 @Experimental()
-class TrackElement extends _HTMLElement native "HTMLTrackElement" {
+class TrackElement extends HtmlElement native "HTMLTrackElement" {
   // To suppress missing implicit constructor warnings.
   factory TrackElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -23665,7 +23673,7 @@
 
 @DocsEditable()
 @DomName('HTMLUListElement')
-class UListElement extends _HTMLElement native "HTMLUListElement" {
+class UListElement extends HtmlElement native "HTMLUListElement" {
   // To suppress missing implicit constructor warnings.
   factory UListElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -23680,7 +23688,7 @@
 
 @DocsEditable()
 @DomName('HTMLUnknownElement')
-class UnknownElement extends _HTMLElement native "HTMLUnknownElement" {
+class UnknownElement extends HtmlElement native "HTMLUnknownElement" {
   // To suppress missing implicit constructor warnings.
   factory UnknownElement._() { throw new UnsupportedError("Not supported"); }
 }
@@ -26828,7 +26836,7 @@
 @DomName('HTMLAppletElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#the-applet-element
 @deprecated // deprecated
-abstract class _HTMLAppletElement extends _HTMLElement native "HTMLAppletElement" {
+abstract class _HTMLAppletElement extends HtmlElement native "HTMLAppletElement" {
   // To suppress missing implicit constructor warnings.
   factory _HTMLAppletElement._() { throw new UnsupportedError("Not supported"); }
 }
@@ -26841,7 +26849,7 @@
 @DomName('HTMLBaseFontElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#basefont
 @deprecated // deprecated
-abstract class _HTMLBaseFontElement extends _HTMLElement native "HTMLBaseFontElement" {
+abstract class _HTMLBaseFontElement extends HtmlElement native "HTMLBaseFontElement" {
   // To suppress missing implicit constructor warnings.
   factory _HTMLBaseFontElement._() { throw new UnsupportedError("Not supported"); }
 }
@@ -26854,7 +26862,7 @@
 @DomName('HTMLDirectoryElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#dir
 @deprecated // deprecated
-abstract class _HTMLDirectoryElement extends _HTMLElement native "HTMLDirectoryElement" {
+abstract class _HTMLDirectoryElement extends HtmlElement native "HTMLDirectoryElement" {
   // To suppress missing implicit constructor warnings.
   factory _HTMLDirectoryElement._() { throw new UnsupportedError("Not supported"); }
 }
@@ -26867,7 +26875,7 @@
 @DomName('HTMLFontElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#htmlfontelement
 @deprecated // deprecated
-abstract class _HTMLFontElement extends _HTMLElement native "HTMLFontElement" {
+abstract class _HTMLFontElement extends HtmlElement native "HTMLFontElement" {
   // To suppress missing implicit constructor warnings.
   factory _HTMLFontElement._() { throw new UnsupportedError("Not supported"); }
 }
@@ -26880,7 +26888,7 @@
 @DomName('HTMLFrameElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#htmlframeelement
 @deprecated // deprecated
-abstract class _HTMLFrameElement extends _HTMLElement native "HTMLFrameElement" {
+abstract class _HTMLFrameElement extends HtmlElement native "HTMLFrameElement" {
   // To suppress missing implicit constructor warnings.
   factory _HTMLFrameElement._() { throw new UnsupportedError("Not supported"); }
 }
@@ -26893,7 +26901,7 @@
 @DomName('HTMLFrameSetElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#frameset
 @deprecated // deprecated
-abstract class _HTMLFrameSetElement extends _HTMLElement native "HTMLFrameSetElement" {
+abstract class _HTMLFrameSetElement extends HtmlElement native "HTMLFrameSetElement" {
   // To suppress missing implicit constructor warnings.
   factory _HTMLFrameSetElement._() { throw new UnsupportedError("Not supported"); }
 }
@@ -26906,7 +26914,7 @@
 @DomName('HTMLMarqueeElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#the-marquee-element
 @deprecated // deprecated
-abstract class _HTMLMarqueeElement extends _HTMLElement native "HTMLMarqueeElement" {
+abstract class _HTMLMarqueeElement extends HtmlElement native "HTMLMarqueeElement" {
   // To suppress missing implicit constructor warnings.
   factory _HTMLMarqueeElement._() { throw new UnsupportedError("Not supported"); }
 }
@@ -30806,6 +30814,73 @@
     return e;
   }
 }
+// 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.
+
+
+_callOnCreated(receiver) {
+  return receiver.onCreated();
+}
+
+_makeCreatedCallbackMethod() {
+  return JS('',
+      '''((function(invokeCallback) {
+             return function() {
+               return invokeCallback(this);
+             };
+          })(#))''',
+      convertDartClosureToJS(_callOnCreated, 1));
+}
+
+void _registerCustomElement(context, document, String tag, Type type) {
+  // Function follows the same pattern as the following JavaScript code for
+  // registering a custom element.
+  //
+  //    var proto = Object.create(HTMLElement.prototype, {
+  //        createdCallback: {
+  //          value: function() {
+  //            window.console.log('here');
+  //          }
+  //        }
+  //    });
+  //    document.register('x-foo', { prototype: proto });
+  //    ...
+  //    var e = document.createElement('x-foo');
+
+  var interceptorClass = findInterceptorConstructorForType(type);
+  if (interceptorClass == null) {
+    throw new ArgumentError(type);
+  }
+
+  String baseClassName = findDispatchTagForInterceptorClass(interceptorClass);
+  if (baseClassName == null) {
+    throw new ArgumentError(type);
+  }
+  if (baseClassName == 'Element') baseClassName = 'HTMLElement';
+
+  var baseConstructor = JS('=Object', '#[#]', context, baseClassName);
+  if (JS('bool', "typeof(#) != 'function'", baseConstructor)) {
+    throw new ArgumentError(type);
+  }
+
+  var properties = JS('=Object', '{}');
+
+  var jsCreatedCallback = _makeCreatedCallbackMethod();
+
+  JS('void', '#.createdCallback = #', properties,
+      JS('=Object', '{value: #}', jsCreatedCallback));
+
+  var baseProto = JS('=Object', '#.prototype', baseConstructor);
+  var proto = JS('=Object', 'Object.create(#, #)', baseProto, properties);
+
+  var interceptor = JS('=Object', '#.prototype', interceptorClass);
+
+  setNativeSubclassDispatchRecord(proto, interceptor);
+
+  JS('void', '#.register(#, #)',
+      document, tag, JS('', '{prototype: #}', proto));
+}
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 843ea2c..1daeb79 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -13,6 +13,7 @@
 import 'dart:isolate';
 import 'dart:json' as json;
 import 'dart:math';
+import 'dart:mirrors';
 import 'dart:nativewrappers';
 import 'dart:typed_data';
 import 'dart:web_gl' as gl;
@@ -27,6 +28,8 @@
 // Auto-generated dart:html library.
 
 
+// TODO(vsm): Remove this when we can do the proper checking in
+// native code for custom elements.
 // Not actually used, but imported since dart:html can generate these objects.
 
 
@@ -175,7 +178,7 @@
 
 @DocsEditable()
 @DomName('HTMLAnchorElement')
-class AnchorElement extends _HTMLElement {
+class AnchorElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory AnchorElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -509,7 +512,7 @@
  * on MDN.
  */
 @DomName('HTMLAreaElement')
-class AreaElement extends _HTMLElement {
+class AreaElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory AreaElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -650,7 +653,7 @@
 
 @DocsEditable()
 @DomName('HTMLBRElement')
-class BRElement extends _HTMLElement {
+class BRElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory BRElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -686,7 +689,7 @@
 
 @DocsEditable()
 @DomName('HTMLBaseElement')
-class BaseElement extends _HTMLElement {
+class BaseElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory BaseElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -785,7 +788,7 @@
 
 @DocsEditable()
 @DomName('HTMLBodyElement')
-class BodyElement extends _HTMLElement {
+class BodyElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory BodyElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -899,7 +902,7 @@
 
 @DocsEditable()
 @DomName('HTMLButtonElement')
-class ButtonElement extends _HTMLElement {
+class ButtonElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory ButtonElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -1061,7 +1064,7 @@
 
 
 @DomName('HTMLCanvasElement')
-class CanvasElement extends _HTMLElement implements CanvasImageSource {
+class CanvasElement extends HtmlElement implements CanvasImageSource {
   // To suppress missing implicit constructor warnings.
   factory CanvasElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -2308,7 +2311,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME, '26')
 @Experimental()
 // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#content-element
-class ContentElement extends _HTMLElement {
+class ContentElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory ContentElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -6846,7 +6849,7 @@
 
 @DocsEditable()
 @DomName('HTMLDListElement')
-class DListElement extends _HTMLElement {
+class DListElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory DListElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -6868,7 +6871,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
-class DataListElement extends _HTMLElement {
+class DataListElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory DataListElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -7103,7 +7106,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental()
-class DetailsElement extends _HTMLElement {
+class DetailsElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory DetailsElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -7259,7 +7262,7 @@
 @DocsEditable()
 @DomName('HTMLDialogElement')
 @Unstable()
-class DialogElement extends _HTMLElement {
+class DialogElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory DialogElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -7441,7 +7444,7 @@
  * * [Inline-level element](http://www.w3.org/TR/CSS2/visuren.html#inline-boxes) from W3C.
  */
 @DomName('HTMLDivElement')
-class DivElement extends _HTMLElement {
+class DivElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory DivElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -7504,12 +7507,12 @@
   /// Moved to [HtmlDocument].
   @DomName('Document.body')
   @DocsEditable()
-  Element get $dom_body native "Document_body_Getter";
+  HtmlElement get $dom_body native "Document_body_Getter";
 
   /// Moved to [HtmlDocument].
   @DomName('Document.body')
   @DocsEditable()
-  void set $dom_body(Element value) native "Document_body_Setter";
+  void set $dom_body(HtmlElement value) native "Document_body_Setter";
 
   @DomName('Document.charset')
   @DocsEditable()
@@ -10970,7 +10973,7 @@
 @SupportedBrowser(SupportedBrowser.IE)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
-class EmbedElement extends _HTMLElement {
+class EmbedElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory EmbedElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -11627,7 +11630,7 @@
 @DocsEditable()
 @DomName('HTMLFieldSetElement')
 @Unstable()
-class FieldSetElement extends _HTMLElement {
+class FieldSetElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory FieldSetElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -12365,7 +12368,7 @@
 
 @DocsEditable()
 @DomName('HTMLFormElement')
-class FormElement extends _HTMLElement {
+class FormElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory FormElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -12663,7 +12666,7 @@
  * An `<hr>` tag.
  */
 @DomName('HTMLHRElement')
-class HRElement extends _HTMLElement {
+class HRElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory HRElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -12719,7 +12722,7 @@
 
 @DocsEditable()
 @DomName('HTMLHeadElement')
-class HeadElement extends _HTMLElement {
+class HeadElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory HeadElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -12737,7 +12740,7 @@
 
 @DocsEditable()
 @DomName('HTMLHeadingElement')
-class HeadingElement extends _HTMLElement {
+class HeadingElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory HeadingElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -13157,6 +13160,10 @@
   @Experimental()
   String get visibilityState => $dom_webkitVisibilityState;
 
+  @Experimental
+  void register(String tag, Type custom) {
+    _Utils.register(tag, custom);
+  }
 
   // Note: used to polyfill <template>
   Document _templateContentsOwner;
@@ -13169,14 +13176,150 @@
 
 
 @DocsEditable()
-@DomName('HTMLHtmlElement')
-class HtmlElement extends _HTMLElement {
+@DomName('HTMLElement')
+class HtmlElement extends Element {
   // To suppress missing implicit constructor warnings.
   factory HtmlElement._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('HTMLHtmlElement.HTMLHtmlElement')
+  @DomName('HTMLElement.contentEditable')
   @DocsEditable()
-  factory HtmlElement() => document.$dom_createElement("html");
+  String get contentEditable native "HTMLElement_contentEditable_Getter";
+
+  @DomName('HTMLElement.contentEditable')
+  @DocsEditable()
+  void set contentEditable(String value) native "HTMLElement_contentEditable_Setter";
+
+  @DomName('HTMLElement.dir')
+  @DocsEditable()
+  String get dir native "HTMLElement_dir_Getter";
+
+  @DomName('HTMLElement.dir')
+  @DocsEditable()
+  void set dir(String value) native "HTMLElement_dir_Setter";
+
+  @DomName('HTMLElement.draggable')
+  @DocsEditable()
+  bool get draggable native "HTMLElement_draggable_Getter";
+
+  @DomName('HTMLElement.draggable')
+  @DocsEditable()
+  void set draggable(bool value) native "HTMLElement_draggable_Setter";
+
+  @DomName('HTMLElement.hidden')
+  @DocsEditable()
+  bool get hidden native "HTMLElement_hidden_Getter";
+
+  @DomName('HTMLElement.hidden')
+  @DocsEditable()
+  void set hidden(bool value) native "HTMLElement_hidden_Setter";
+
+  @DomName('HTMLElement.id')
+  @DocsEditable()
+  String get id native "HTMLElement_id_Getter";
+
+  @DomName('HTMLElement.id')
+  @DocsEditable()
+  void set id(String value) native "HTMLElement_id_Setter";
+
+  @DomName('HTMLElement.innerHTML')
+  @DocsEditable()
+  String get innerHtml native "HTMLElement_innerHTML_Getter";
+
+  @DomName('HTMLElement.innerHTML')
+  @DocsEditable()
+  void set innerHtml(String value) native "HTMLElement_innerHTML_Setter";
+
+  @DomName('HTMLElement.isContentEditable')
+  @DocsEditable()
+  bool get isContentEditable native "HTMLElement_isContentEditable_Getter";
+
+  @DomName('HTMLElement.lang')
+  @DocsEditable()
+  String get lang native "HTMLElement_lang_Getter";
+
+  @DomName('HTMLElement.lang')
+  @DocsEditable()
+  void set lang(String value) native "HTMLElement_lang_Setter";
+
+  @DomName('HTMLElement.outerHTML')
+  @DocsEditable()
+  String get outerHtml native "HTMLElement_outerHTML_Getter";
+
+  @DomName('HTMLElement.spellcheck')
+  @DocsEditable()
+  // http://blog.whatwg.org/the-road-to-html-5-spellchecking
+  @Experimental() // nonstandard
+  bool get spellcheck native "HTMLElement_spellcheck_Getter";
+
+  @DomName('HTMLElement.spellcheck')
+  @DocsEditable()
+  // http://blog.whatwg.org/the-road-to-html-5-spellchecking
+  @Experimental() // nonstandard
+  void set spellcheck(bool value) native "HTMLElement_spellcheck_Setter";
+
+  @DomName('HTMLElement.tabIndex')
+  @DocsEditable()
+  int get tabIndex native "HTMLElement_tabIndex_Getter";
+
+  @DomName('HTMLElement.tabIndex')
+  @DocsEditable()
+  void set tabIndex(int value) native "HTMLElement_tabIndex_Setter";
+
+  @DomName('HTMLElement.title')
+  @DocsEditable()
+  String get title native "HTMLElement_title_Getter";
+
+  @DomName('HTMLElement.title')
+  @DocsEditable()
+  void set title(String value) native "HTMLElement_title_Setter";
+
+  @DomName('HTMLElement.translate')
+  @DocsEditable()
+  bool get translate native "HTMLElement_translate_Getter";
+
+  @DomName('HTMLElement.translate')
+  @DocsEditable()
+  void set translate(bool value) native "HTMLElement_translate_Setter";
+
+  @DomName('HTMLElement.webkitdropzone')
+  @DocsEditable()
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental()
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
+  String get dropzone native "HTMLElement_webkitdropzone_Getter";
+
+  @DomName('HTMLElement.webkitdropzone')
+  @DocsEditable()
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental()
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
+  void set dropzone(String value) native "HTMLElement_webkitdropzone_Setter";
+
+  @DomName('HTMLElement.click')
+  @DocsEditable()
+  void click() native "HTMLElement_click_Callback";
+
+  @DomName('HTMLElement.getInputContext')
+  @DocsEditable()
+  // http://www.w3.org/TR/ime-api/#the-getinputcontext-method
+  @Experimental()
+  InputMethodContext getInputContext() native "HTMLElement_getInputContext_Callback";
+
+  @DomName('HTMLElement.insertAdjacentElement')
+  @DocsEditable()
+  @Experimental() // non-standard
+  Element insertAdjacentElement(String where, Element element) native "HTMLElement_insertAdjacentElement_Callback";
+
+  @DomName('HTMLElement.insertAdjacentHTML')
+  @DocsEditable()
+  void insertAdjacentHtml(String where, String html) native "HTMLElement_insertAdjacentHTML_Callback";
+
+  @DomName('HTMLElement.insertAdjacentText')
+  @DocsEditable()
+  @Experimental() // non-standard
+  void insertAdjacentText(String where, String text) native "HTMLElement_insertAdjacentText_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13209,6 +13352,24 @@
 
 
 @DocsEditable()
+@DomName('HTMLHtmlElement')
+class HtmlHtmlElement extends HtmlElement {
+  // To suppress missing implicit constructor warnings.
+  factory HtmlHtmlElement._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('HTMLHtmlElement.HTMLHtmlElement')
+  @DocsEditable()
+  factory HtmlHtmlElement() => document.$dom_createElement("html");
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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('HTMLOptionsCollection')
 class HtmlOptionsCollection extends HtmlCollection {
   // To suppress missing implicit constructor warnings.
@@ -13919,7 +14080,7 @@
 
 @DocsEditable()
 @DomName('HTMLIFrameElement')
-class IFrameElement extends _HTMLElement {
+class IFrameElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory IFrameElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -14056,7 +14217,7 @@
 
 
 @DomName('HTMLImageElement')
-class ImageElement extends _HTMLElement implements CanvasImageSource {
+class ImageElement extends HtmlElement implements CanvasImageSource {
   // To suppress missing implicit constructor warnings.
   factory ImageElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -14175,7 +14336,7 @@
 
 
 @DomName('HTMLInputElement')
-class InputElement extends _HTMLElement implements
+class InputElement extends HtmlElement implements
     HiddenInputElement,
     SearchInputElement,
     TextInputElement,
@@ -14389,7 +14550,7 @@
 
   @DomName('HTMLInputElement.list')
   @DocsEditable()
-  Element get list native "HTMLInputElement_list_Getter";
+  HtmlElement get list native "HTMLInputElement_list_Getter";
 
   @DomName('HTMLInputElement.max')
   @DocsEditable()
@@ -15285,7 +15446,7 @@
   @DomName('InputMethodContext.target')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get target native "InputMethodContext_target_Getter";
+  HtmlElement get target native "InputMethodContext_target_Getter";
 
   @DomName('InputMethodContext.confirmComposition')
   @DocsEditable()
@@ -15379,7 +15540,7 @@
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental()
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#the-keygen-element
-class KeygenElement extends _HTMLElement {
+class KeygenElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory KeygenElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -15473,7 +15634,7 @@
 
 @DocsEditable()
 @DomName('HTMLLIElement')
-class LIElement extends _HTMLElement {
+class LIElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory LIElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -15511,7 +15672,7 @@
 
 @DocsEditable()
 @DomName('HTMLLabelElement')
-class LabelElement extends _HTMLElement {
+class LabelElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory LabelElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -15521,7 +15682,7 @@
 
   @DomName('HTMLLabelElement.control')
   @DocsEditable()
-  Element get control native "HTMLLabelElement_control_Getter";
+  HtmlElement get control native "HTMLLabelElement_control_Getter";
 
   @DomName('HTMLLabelElement.form')
   @DocsEditable()
@@ -15545,7 +15706,7 @@
 
 @DocsEditable()
 @DomName('HTMLLegendElement')
-class LegendElement extends _HTMLElement {
+class LegendElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory LegendElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -15567,7 +15728,7 @@
 
 @DocsEditable()
 @DomName('HTMLLinkElement')
-class LinkElement extends _HTMLElement {
+class LinkElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory LinkElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -15774,7 +15935,7 @@
 
 @DocsEditable()
 @DomName('HTMLMapElement')
-class MapElement extends _HTMLElement {
+class MapElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory MapElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -15918,7 +16079,7 @@
 @DocsEditable()
 @DomName('HTMLMediaElement')
 @Unstable()
-class MediaElement extends _HTMLElement {
+class MediaElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory MediaElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -17233,7 +17394,7 @@
  *  * [Menu Element](http://www.w3.org/TR/html5/the-menu-element.html#the-menu-element) from the W3C.
  */
 @DomName('HTMLMenuElement')
-class MenuElement extends _HTMLElement {
+class MenuElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory MenuElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -17377,7 +17538,7 @@
 
 @DocsEditable()
 @DomName('HTMLMetaElement')
-class MetaElement extends _HTMLElement {
+class MetaElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory MetaElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -17456,7 +17617,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
-class MeterElement extends _HTMLElement {
+class MeterElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory MeterElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -17857,7 +18018,7 @@
 @DocsEditable()
 @DomName('HTMLModElement')
 @Unstable()
-class ModElement extends _HTMLElement {
+class ModElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory ModElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -19450,7 +19611,7 @@
 
 @DocsEditable()
 @DomName('HTMLOListElement')
-class OListElement extends _HTMLElement {
+class OListElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory OListElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -19496,7 +19657,7 @@
 @SupportedBrowser(SupportedBrowser.IE)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
-class ObjectElement extends _HTMLElement {
+class ObjectElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory ObjectElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -19609,7 +19770,7 @@
 
 @DocsEditable()
 @DomName('HTMLOptGroupElement')
-class OptGroupElement extends _HTMLElement {
+class OptGroupElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory OptGroupElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -19643,7 +19804,7 @@
 
 @DocsEditable()
 @DomName('HTMLOptionElement')
-class OptionElement extends _HTMLElement {
+class OptionElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory OptionElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -19717,7 +19878,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
-class OutputElement extends _HTMLElement {
+class OutputElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory OutputElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -19858,7 +20019,7 @@
 
 @DocsEditable()
 @DomName('HTMLParagraphElement')
-class ParagraphElement extends _HTMLElement {
+class ParagraphElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory ParagraphElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -19877,7 +20038,7 @@
 @DocsEditable()
 @DomName('HTMLParamElement')
 @Unstable()
-class ParamElement extends _HTMLElement {
+class ParamElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory ParamElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -20564,7 +20725,7 @@
 
 @DocsEditable()
 @DomName('HTMLPreElement')
-class PreElement extends _HTMLElement {
+class PreElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory PreElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -20630,7 +20791,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
-class ProgressElement extends _HTMLElement {
+class ProgressElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory ProgressElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -20773,7 +20934,7 @@
 
 @DocsEditable()
 @DomName('HTMLQuoteElement')
-class QuoteElement extends _HTMLElement {
+class QuoteElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory QuoteElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -21718,7 +21879,7 @@
 
 @DocsEditable()
 @DomName('HTMLScriptElement')
-class ScriptElement extends _HTMLElement {
+class ScriptElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory ScriptElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -21952,7 +22113,7 @@
 
 
 @DomName('HTMLSelectElement')
-class SelectElement extends _HTMLElement {
+class SelectElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory SelectElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -22234,7 +22395,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME, '26')
 @Experimental()
 // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#shadow-element
-class ShadowElement extends _HTMLElement {
+class ShadowElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory ShadowElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -22504,7 +22665,7 @@
 
 @DocsEditable()
 @DomName('HTMLSourceElement')
-class SourceElement extends _HTMLElement {
+class SourceElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory SourceElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -22579,7 +22740,7 @@
 
 @DocsEditable()
 @DomName('HTMLSpanElement')
-class SpanElement extends _HTMLElement {
+class SpanElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory SpanElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -23642,7 +23803,7 @@
 
 @DocsEditable()
 @DomName('HTMLStyleElement')
-class StyleElement extends _HTMLElement {
+class StyleElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory StyleElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -23805,7 +23966,7 @@
 
 @DocsEditable()
 @DomName('HTMLTableCaptionElement')
-class TableCaptionElement extends _HTMLElement {
+class TableCaptionElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory TableCaptionElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -23823,7 +23984,7 @@
 
 @DocsEditable()
 @DomName('HTMLTableCellElement')
-class TableCellElement extends _HTMLElement {
+class TableCellElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory TableCellElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -23869,7 +24030,7 @@
 
 @DocsEditable()
 @DomName('HTMLTableColElement')
-class TableColElement extends _HTMLElement {
+class TableColElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory TableColElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -23893,7 +24054,7 @@
 
 @DocsEditable()
 @DomName('HTMLTableElement')
-class TableElement extends _HTMLElement {
+class TableElement extends HtmlElement {
 
   @DomName('HTMLTableElement.tBodies')
   List<TableSectionElement> get tBodies =>
@@ -23967,19 +24128,19 @@
 
   @DomName('HTMLTableElement.createCaption')
   @DocsEditable()
-  Element $dom_createCaption() native "HTMLTableElement_createCaption_Callback";
+  HtmlElement $dom_createCaption() native "HTMLTableElement_createCaption_Callback";
 
   @DomName('HTMLTableElement.createTBody')
   @DocsEditable()
-  Element $dom_createTBody() native "HTMLTableElement_createTBody_Callback";
+  HtmlElement $dom_createTBody() native "HTMLTableElement_createTBody_Callback";
 
   @DomName('HTMLTableElement.createTFoot')
   @DocsEditable()
-  Element $dom_createTFoot() native "HTMLTableElement_createTFoot_Callback";
+  HtmlElement $dom_createTFoot() native "HTMLTableElement_createTFoot_Callback";
 
   @DomName('HTMLTableElement.createTHead')
   @DocsEditable()
-  Element $dom_createTHead() native "HTMLTableElement_createTHead_Callback";
+  HtmlElement $dom_createTHead() native "HTMLTableElement_createTHead_Callback";
 
   @DomName('HTMLTableElement.deleteCaption')
   @DocsEditable()
@@ -23999,7 +24160,7 @@
 
   @DomName('HTMLTableElement.insertRow')
   @DocsEditable()
-  Element $dom_insertRow(int index) native "HTMLTableElement_insertRow_Callback";
+  HtmlElement $dom_insertRow(int index) native "HTMLTableElement_insertRow_Callback";
 }
 // 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
@@ -24008,7 +24169,7 @@
 
 @DocsEditable()
 @DomName('HTMLTableRowElement')
-class TableRowElement extends _HTMLElement {
+class TableRowElement extends HtmlElement {
 
   @DomName('HTMLTableRowElement.cells')
   List<TableCellElement> get cells =>
@@ -24045,7 +24206,7 @@
 
   @DomName('HTMLTableRowElement.insertCell')
   @DocsEditable()
-  Element $dom_insertCell(int index) native "HTMLTableRowElement_insertCell_Callback";
+  HtmlElement $dom_insertCell(int index) native "HTMLTableRowElement_insertCell_Callback";
 }
 // 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
@@ -24054,7 +24215,7 @@
 
 @DocsEditable()
 @DomName('HTMLTableSectionElement')
-class TableSectionElement extends _HTMLElement {
+class TableSectionElement extends HtmlElement {
 
   @DomName('HTMLTableSectionElement.rows')
   List<TableRowElement> get rows =>
@@ -24079,7 +24240,7 @@
 
   @DomName('HTMLTableSectionElement.insertRow')
   @DocsEditable()
-  Element $dom_insertRow(int index) native "HTMLTableSectionElement_insertRow_Callback";
+  HtmlElement $dom_insertRow(int index) native "HTMLTableSectionElement_insertRow_Callback";
 }
 // 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
@@ -24175,7 +24336,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental()
 // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#template-element
-class TemplateElement extends _HTMLElement {
+class TemplateElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory TemplateElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -24426,7 +24587,7 @@
 
 @DocsEditable()
 @DomName('HTMLTextAreaElement')
-class TextAreaElement extends _HTMLElement {
+class TextAreaElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory TextAreaElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -25133,7 +25294,7 @@
 
 @DocsEditable()
 @DomName('HTMLTitleElement')
-class TitleElement extends _HTMLElement {
+class TitleElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory TitleElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -25386,7 +25547,7 @@
 @SupportedBrowser(SupportedBrowser.SAFARI)
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#the-track-element
 @Experimental()
-class TrackElement extends _HTMLElement {
+class TrackElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory TrackElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -25681,7 +25842,7 @@
 
 @DocsEditable()
 @DomName('HTMLUListElement')
-class UListElement extends _HTMLElement {
+class UListElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory UListElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -25699,7 +25860,7 @@
 
 @DocsEditable()
 @DomName('HTMLUnknownElement')
-class UnknownElement extends _HTMLElement {
+class UnknownElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory UnknownElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -28697,7 +28858,7 @@
 @DomName('HTMLAppletElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#the-applet-element
 @deprecated // deprecated
-abstract class _HTMLAppletElement extends _HTMLElement {
+abstract class _HTMLAppletElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory _HTMLAppletElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -28713,7 +28874,7 @@
 @DomName('HTMLBaseFontElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#basefont
 @deprecated // deprecated
-abstract class _HTMLBaseFontElement extends _HTMLElement {
+abstract class _HTMLBaseFontElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory _HTMLBaseFontElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -28729,7 +28890,7 @@
 @DomName('HTMLDirectoryElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#dir
 @deprecated // deprecated
-abstract class _HTMLDirectoryElement extends _HTMLElement {
+abstract class _HTMLDirectoryElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory _HTMLDirectoryElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -28742,164 +28903,10 @@
 
 
 @DocsEditable()
-@DomName('HTMLElement')
-class _HTMLElement extends Element {
-  // To suppress missing implicit constructor warnings.
-  factory _HTMLElement._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('HTMLElement.contentEditable')
-  @DocsEditable()
-  String get contentEditable native "HTMLElement_contentEditable_Getter";
-
-  @DomName('HTMLElement.contentEditable')
-  @DocsEditable()
-  void set contentEditable(String value) native "HTMLElement_contentEditable_Setter";
-
-  @DomName('HTMLElement.dir')
-  @DocsEditable()
-  String get dir native "HTMLElement_dir_Getter";
-
-  @DomName('HTMLElement.dir')
-  @DocsEditable()
-  void set dir(String value) native "HTMLElement_dir_Setter";
-
-  @DomName('HTMLElement.draggable')
-  @DocsEditable()
-  bool get draggable native "HTMLElement_draggable_Getter";
-
-  @DomName('HTMLElement.draggable')
-  @DocsEditable()
-  void set draggable(bool value) native "HTMLElement_draggable_Setter";
-
-  @DomName('HTMLElement.hidden')
-  @DocsEditable()
-  bool get hidden native "HTMLElement_hidden_Getter";
-
-  @DomName('HTMLElement.hidden')
-  @DocsEditable()
-  void set hidden(bool value) native "HTMLElement_hidden_Setter";
-
-  @DomName('HTMLElement.id')
-  @DocsEditable()
-  String get id native "HTMLElement_id_Getter";
-
-  @DomName('HTMLElement.id')
-  @DocsEditable()
-  void set id(String value) native "HTMLElement_id_Setter";
-
-  @DomName('HTMLElement.innerHTML')
-  @DocsEditable()
-  String get innerHtml native "HTMLElement_innerHTML_Getter";
-
-  @DomName('HTMLElement.innerHTML')
-  @DocsEditable()
-  void set innerHtml(String value) native "HTMLElement_innerHTML_Setter";
-
-  @DomName('HTMLElement.isContentEditable')
-  @DocsEditable()
-  bool get isContentEditable native "HTMLElement_isContentEditable_Getter";
-
-  @DomName('HTMLElement.lang')
-  @DocsEditable()
-  String get lang native "HTMLElement_lang_Getter";
-
-  @DomName('HTMLElement.lang')
-  @DocsEditable()
-  void set lang(String value) native "HTMLElement_lang_Setter";
-
-  @DomName('HTMLElement.outerHTML')
-  @DocsEditable()
-  String get outerHtml native "HTMLElement_outerHTML_Getter";
-
-  @DomName('HTMLElement.spellcheck')
-  @DocsEditable()
-  // http://blog.whatwg.org/the-road-to-html-5-spellchecking
-  @Experimental() // nonstandard
-  bool get spellcheck native "HTMLElement_spellcheck_Getter";
-
-  @DomName('HTMLElement.spellcheck')
-  @DocsEditable()
-  // http://blog.whatwg.org/the-road-to-html-5-spellchecking
-  @Experimental() // nonstandard
-  void set spellcheck(bool value) native "HTMLElement_spellcheck_Setter";
-
-  @DomName('HTMLElement.tabIndex')
-  @DocsEditable()
-  int get tabIndex native "HTMLElement_tabIndex_Getter";
-
-  @DomName('HTMLElement.tabIndex')
-  @DocsEditable()
-  void set tabIndex(int value) native "HTMLElement_tabIndex_Setter";
-
-  @DomName('HTMLElement.title')
-  @DocsEditable()
-  String get title native "HTMLElement_title_Getter";
-
-  @DomName('HTMLElement.title')
-  @DocsEditable()
-  void set title(String value) native "HTMLElement_title_Setter";
-
-  @DomName('HTMLElement.translate')
-  @DocsEditable()
-  bool get translate native "HTMLElement_translate_Getter";
-
-  @DomName('HTMLElement.translate')
-  @DocsEditable()
-  void set translate(bool value) native "HTMLElement_translate_Setter";
-
-  @DomName('HTMLElement.webkitdropzone')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
-  String get dropzone native "HTMLElement_webkitdropzone_Getter";
-
-  @DomName('HTMLElement.webkitdropzone')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
-  void set dropzone(String value) native "HTMLElement_webkitdropzone_Setter";
-
-  @DomName('HTMLElement.click')
-  @DocsEditable()
-  void click() native "HTMLElement_click_Callback";
-
-  @DomName('HTMLElement.getInputContext')
-  @DocsEditable()
-  // http://www.w3.org/TR/ime-api/#the-getinputcontext-method
-  @Experimental()
-  InputMethodContext getInputContext() native "HTMLElement_getInputContext_Callback";
-
-  @DomName('HTMLElement.insertAdjacentElement')
-  @DocsEditable()
-  @Experimental() // non-standard
-  Element insertAdjacentElement(String where, Element element) native "HTMLElement_insertAdjacentElement_Callback";
-
-  @DomName('HTMLElement.insertAdjacentHTML')
-  @DocsEditable()
-  void insertAdjacentHtml(String where, String html) native "HTMLElement_insertAdjacentHTML_Callback";
-
-  @DomName('HTMLElement.insertAdjacentText')
-  @DocsEditable()
-  @Experimental() // non-standard
-  void insertAdjacentText(String where, String text) native "HTMLElement_insertAdjacentText_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('HTMLFontElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#htmlfontelement
 @deprecated // deprecated
-abstract class _HTMLFontElement extends _HTMLElement {
+abstract class _HTMLFontElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory _HTMLFontElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -28915,7 +28922,7 @@
 @DomName('HTMLFrameElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#htmlframeelement
 @deprecated // deprecated
-abstract class _HTMLFrameElement extends _HTMLElement {
+abstract class _HTMLFrameElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory _HTMLFrameElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -28931,7 +28938,7 @@
 @DomName('HTMLFrameSetElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#frameset
 @deprecated // deprecated
-abstract class _HTMLFrameSetElement extends _HTMLElement {
+abstract class _HTMLFrameSetElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory _HTMLFrameSetElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -28947,7 +28954,7 @@
 @DomName('HTMLMarqueeElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#the-marquee-element
 @deprecated // deprecated
-abstract class _HTMLMarqueeElement extends _HTMLElement {
+abstract class _HTMLMarqueeElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory _HTMLMarqueeElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -33270,6 +33277,39 @@
   // TODO(jacobr): we need a failsafe way to determine that a Node is really a
   // DOM node rather than just a class that extends Node.
   static bool isNode(obj) => obj is Node;
+
+  static void register(String tag, Type type) {
+    // TODO(vsm): Move these checks into native code.
+    if (type == null) {
+      throw new UnsupportedError("Invalid null type.");
+    }
+    ClassMirror cls = reflectClass(type);
+    LibraryMirror lib = cls.owner;
+    String libName = lib.uri.toString();
+    if (libName.startsWith('dart:')) {
+      throw new UnsupportedError("Invalid custom element from $libName.");
+    }
+    ClassMirror superClass = cls.superclass;
+
+    Symbol objectName = reflectClass(Object).qualifiedName;
+    bool isRoot(ClassMirror cls) =>
+      cls == null || cls.qualifiedName == objectName;
+    // TODO(vsm): Support extending SvgElement as well.
+    Symbol elementName = reflectClass(HtmlElement).qualifiedName;
+    bool isElement(ClassMirror cls) =>
+      cls != null && cls.qualifiedName == elementName;
+
+    while(!isRoot(superClass) && !isElement(superClass)) {
+      superClass = superClass.superclass;
+    }
+
+    if (isRoot(superClass)) {
+      throw new UnsupportedError("Invalid custom element doesn't inherit from HtmlElement.");
+    }
+    _register(tag, type);
+  }
+
+  static void _register(String tag, Type type) native "Utils_register";
 }
 
 class _NPObject extends NativeFieldWrapperClass1 {
@@ -33397,7 +33437,7 @@
 
 final _forwardingPrintClosure = _Utils.forwardingPrint;
 
- class _Timer implements Timer{
+ class _Timer implements Timer {
   var _canceler;
 
   _Timer(int milliSeconds, void callback(Timer timer), bool repeating) {
diff --git a/sdk/lib/io/directory.dart b/sdk/lib/io/directory.dart
index 7bae578..57b6568 100644
--- a/sdk/lib/io/directory.dart
+++ b/sdk/lib/io/directory.dart
@@ -16,14 +16,6 @@
   factory Directory(String path) => new _Directory(path);
 
   /**
-   * Creates a directory object from a Path object. The path is either
-   * an absolute path, or it is a relative path which is interpreted
-   * relative to the directory in which the Dart VM was started.
-   */
-  @deprecated
-  factory Directory.fromPath(Path path) => new _Directory.fromPath(path);
-
-  /**
    * Creates a directory object pointing to the current working
    * directory.
    */
diff --git a/sdk/lib/io/directory_impl.dart b/sdk/lib/io/directory_impl.dart
index e27b610..39d36cf 100644
--- a/sdk/lib/io/directory_impl.dart
+++ b/sdk/lib/io/directory_impl.dart
@@ -24,8 +24,6 @@
     }
   }
 
-  _Directory.fromPath(Path path) : this(path.toNativePath());
-
   external static String _current();
   external static _setCurrent(path);
   external static _createTemp(String template);
@@ -98,11 +96,11 @@
   }
 
   Future<Directory> createRecursively() {
-    var path = new Path(this.path);
+    var path = new _Path(this.path);
     var dirsToCreate = [];
     var terminator = path.isAbsolute ? '/' : '';
     while (path.toString() != terminator) {
-      dirsToCreate.add(new Directory.fromPath(path));
+      dirsToCreate.add(new Directory(path.toNativePath()));
       path = path.directoryPath;
     }
     return _computeExistingIndex(dirsToCreate).then((index) {
@@ -139,11 +137,11 @@
   }
 
   void createRecursivelySync() {
-    var path = new Path(this.path);
+    var path = new _Path(this.path);
     var dirsToCreate = [];
     var terminator = path.isAbsolute ? '/' : '';
     while (path.toString() != terminator) {
-      var dir = new Directory.fromPath(path);
+      var dir = new Directory(path.toNativePath());
       if (dir.existsSync()) break;
       dirsToCreate.add(dir);
       path = path.directoryPath;
diff --git a/sdk/lib/io/file.dart b/sdk/lib/io/file.dart
index dba6931..5cbff1c 100644
--- a/sdk/lib/io/file.dart
+++ b/sdk/lib/io/file.dart
@@ -41,12 +41,6 @@
   factory File(String path) => new _File(path);
 
   /**
-   * Create a File object from a Path object.
-   */
-  @deprecated
-  factory File.fromPath(Path path) => new _File.fromPath(path);
-
-  /**
    * Create the file. Returns a [:Future<File>:] that completes with
    * the file when it has been created.
    *
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index cf9a7ef..f621360 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -246,9 +246,6 @@
     }
   }
 
-  // Constructor from Path for file.
-  _File.fromPath(Path path) : this(path.toNativePath());
-
   Future<bool> exists() {
     _ensureFileService();
     List request = new List(2);
@@ -346,8 +343,8 @@
   }
 
   Directory get directory {
-    Path path = new Path(this.path).directoryPath;
-    return new Directory.fromPath(path);
+    _Path path = new _Path(this.path).directoryPath;
+    return new Directory(path.toNativePath());
   }
 
   Future<RandomAccessFile> open({FileMode mode: FileMode.READ}) {
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index 1a5e3a5..615c59a 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -1590,8 +1590,8 @@
       scheme = previous.uri.scheme;
     }
     if (!uri.path.startsWith('/')) {
-      var absolute = new Path.raw(previous.uri.path).directoryPath;
-      absolute = absolute.join(new Path.raw(u.path));
+      var absolute = new _Path.raw(previous.uri.path).directoryPath;
+      absolute = absolute.join(new _Path.raw(u.path));
       path = absolute.canonicalize().toString();
     }
     replaceComponents(scheme: scheme, host: host, port: port, path: path);
diff --git a/sdk/lib/io/io.dart b/sdk/lib/io/io.dart
index 4f61b2b..37a65c1 100644
--- a/sdk/lib/io/io.dart
+++ b/sdk/lib/io/io.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /**
+ * File, socket, HTTP, and other I/O support for server applications.
+ * 
  * The IO library is used for Dart server applications,
  * which run on a stand-alone Dart VM from the command line.
  * *This library does not work in browser based applications.*
diff --git a/sdk/lib/io/link.dart b/sdk/lib/io/link.dart
index 8b726ed..d774fa2 100644
--- a/sdk/lib/io/link.dart
+++ b/sdk/lib/io/link.dart
@@ -15,12 +15,6 @@
   factory Link(String path) => new _Link(path);
 
   /**
-   * Creates a Link object from a Path object.
-   */
-  @deprecated
-  factory Link.fromPath(Path path) => new _Link.fromPath(path);
-
-  /**
    * Creates a symbolic link. Returns a [:Future<Link>:] that completes with
    * the link when it has been created. If the link exists,
    * the future will complete with an error.
@@ -144,8 +138,6 @@
   }
 
 
-  _Link.fromPath(Path inputPath) : path = inputPath.toNativePath();
-
   String toString() => "Link: '$path'";
 
   Future<bool> exists() => FileSystemEntity.isLink(path);
diff --git a/sdk/lib/io/path.dart b/sdk/lib/io/path.dart
index 702e42e..0262e4b 100644
--- a/sdk/lib/io/path.dart
+++ b/sdk/lib/io/path.dart
@@ -16,7 +16,7 @@
  * August 2013.*
  */
 @deprecated
-abstract class Path {
+abstract class _Path {
   /**
    * Creates a Path from a String that uses the native filesystem's conventions.
    *
@@ -26,7 +26,7 @@
    * If the path starts with a drive letter, like 'C:',  a '/' is added
    * before the drive letter.
    *
-   *     new Path(r'c:\a\b').toString() == '/c:/a/b'
+   *     new _Path(r'c:\a\b').toString() == '/c:/a/b'
    *
    * A path starting with a drive letter is
    * treated specially.  Backwards links ('..') cannot cancel the drive letter.
@@ -34,14 +34,14 @@
    * If the path is a share path this is recorded in the Path object and
    * maintained in operations on the Path object.
    *
-   *     var share = new Path(r'\\share\a\b\c');
+   *     var share = new _Path(r'\\share\a\b\c');
    *     share.isWindowsShare == true
    *     share.toString() == '/share/a/b/c'
    *     share.toNativePath() == r'\\share\a\b\c'
    *     share.append('final').isWindowsShare == true
    */
   @deprecated
-  factory Path(String source) => new _Path(source);
+  factory _Path(String source) => new __Path(source);
 
   /**
    * Creates a Path from the String [source].  [source] is used as-is, so if
@@ -49,7 +49,7 @@
    * behavior may not be as expected.  Paths are immutable.
    */
   @deprecated
-  factory Path.raw(String source) => new _Path.raw(source);
+  factory _Path.raw(String source) => new __Path.raw(source);
 
   /**
    * Is this path the empty string?
@@ -86,7 +86,7 @@
    * and combining consecutive '/'s.  Leading '..' segments
    * are kept on relative paths, and dropped from absolute paths.
    */
-  Path canonicalize();
+  _Path canonicalize();
 
   /**
    * Joins the relative path [further] to this path.  Canonicalizes the
@@ -97,13 +97,13 @@
    * If [further] is an absolute path, an IllegalArgument exception is thrown.
    *
    * Examples:
-   *   `new Path('/a/b/c').join(new Path('d/e'))` returns the Path object
+   *   `new _Path('/a/b/c').join(new _Path('d/e'))` returns the Path object
    *   containing `'a/b/c/d/e'`.
    *
-   *   `new Path('a/b/../c/').join(new Path('d/./e//')` returns the Path
+   *   `new _Path('a/b/../c/').join(new _Path('d/./e//')` returns the Path
    *   containing `'a/c/d/e/'`.
    *
-   *   `new Path('a/b/c').join(new Path('d/../../e')` returns the Path
+   *   `new _Path('a/b/c').join(new _Path('d/../../e')` returns the Path
    *   containing `'a/b/e'`.
    *
    * Note that the join operation does not drop the last segment of the
@@ -115,7 +115,7 @@
    * parent directories in the base, you can check whether
    * `further.canonicalize()` starts with '../' or equals '..'.
    */
-  Path join(Path further);
+  _Path join(_Path further);
 
 
   /**
@@ -129,7 +129,7 @@
    * path component of the base is dropped unless it ends with a slash,
    * call [: a.relativeTo(b.directoryPath) :] instead of [: a.relativeTo(b) :].
    */
-  Path relativeTo(Path base);
+  _Path relativeTo(_Path base);
 
   /**
    * Converts a path to a string using the native filesystem's conventions.
@@ -138,14 +138,14 @@
    * On Windows, converts '/'s to backwards slashes, and removes
    * the leading '/' if the path starts with a drive specification.
    * For most valid Windows paths, this should be the inverse of the
-   * conversion that the constructor new Path() performs.  If the path is
+   * conversion that the constructor new _Path() performs.  If the path is
    * a Windows share, restores the '\\' at the start of the path.
    */
   String toNativePath();
 
   /**
    * Returns the path as a string.  If this path is constructed using
-   * new Path.raw(), or new Path() on a non-Windows system, the
+   * new _Path.raw(), or new _Path() on a non-Windows system, the
    * returned value is the original string argument to the constructor.
    */
   String toString();
@@ -156,8 +156,8 @@
    * beginning does not create an empty segment before it, and a '/' at
    * the end does not create an empty segment after it.
    *
-   *     new Path('/a/b/c/d').segments() == ['a', 'b', 'c', d'];
-   *     new Path(' foo bar //../') == [' foo bar ', '', '..'];
+   *     new _Path('/a/b/c/d').segments() == ['a', 'b', 'c', d'];
+   *     new _Path(' foo bar //../') == [' foo bar ', '', '..'];
    */
   List<String> segments();
 
@@ -167,7 +167,7 @@
    * a '/'.  The path is not canonicalized, and [finalSegment] may
    * contain '/'s.
    */
-  Path append(String finalSegment);
+  _Path append(String finalSegment);
 
   /**
    * Drops the final '/' and whatever follows it from this Path,
@@ -175,20 +175,20 @@
    * this Path is the first character, returns '/' instead of the empty string.
    * If there is no '/' in the Path, returns the empty string.
    *
-   *     new Path('../images/dot.gif').directoryPath == '../images'
-   *     new Path('/usr/geoffrey/www/').directoryPath == '/usr/geoffrey/www'
-   *     new Path('lost_file_old').directoryPath == ''
-   *     new Path('/src').directoryPath == '/'
-   *     Note: new Path('/D:/src').directoryPath == '/D:'
+   *     new _Path('../images/dot.gif').directoryPath == '../images'
+   *     new _Path('/usr/geoffrey/www/').directoryPath == '/usr/geoffrey/www'
+   *     new _Path('lost_file_old').directoryPath == ''
+   *     new _Path('/src').directoryPath == '/'
+   *     Note: new _Path('/D:/src').directoryPath == '/D:'
    */
-  Path get directoryPath;
+  _Path get directoryPath;
 
   /**
    * The part of the path after the last '/', or the entire path if
    * it contains no '/'.
    *
-   *     new Path('images/DSC_0027.jpg).filename == 'DSC_0027.jpg'
-   *     new Path('users/fred/').filename == ''
+   *     new _Path('images/DSC_0027.jpg).filename == 'DSC_0027.jpg'
+   *     new _Path('users/fred/').filename == ''
    */
   String get filename;
 
@@ -196,9 +196,9 @@
    * The part of [filename] before the last '.', or the entire filename if it
    * contains no '.'.  If [filename] is '.' or '..' it is unchanged.
    *
-   *     new Path('/c:/My Documents/Heidi.txt').filenameWithoutExtension
+   *     new _Path('/c:/My Documents/Heidi.txt').filenameWithoutExtension
    *     would return 'Heidi'.
-   *     new Path('not what I would call a path').filenameWithoutExtension
+   *     new _Path('not what I would call a path').filenameWithoutExtension
    *     would return 'not what I would call a path'.
    */
   String get filenameWithoutExtension;
@@ -207,8 +207,8 @@
    * The part of [filename] after the last '.', or '' if [filename]
    * contains no '.'.  If [filename] is '.' or '..', returns ''.
    *
-   *     new Path('tiger.svg').extension == 'svg'
-   *     new Path('/src/dart/dart_secrets').extension == ''
+   *     new _Path('tiger.svg').extension == 'svg'
+   *     new _Path('/src/dart/dart_secrets').extension == ''
    */
   String get extension;
 }
diff --git a/sdk/lib/io/path_impl.dart b/sdk/lib/io/path_impl.dart
index 50e4d38..9915863 100644
--- a/sdk/lib/io/path_impl.dart
+++ b/sdk/lib/io/path_impl.dart
@@ -4,16 +4,16 @@
 
 part of dart.io;
 
-class _Path implements Path {
+class __Path implements _Path {
   final String _path;
   final bool isWindowsShare;
 
-  _Path(String source)
+  __Path(String source)
       : _path = _clean(source), isWindowsShare = _isWindowsShare(source);
 
-  _Path.raw(String source) : _path = source, isWindowsShare = false;
+  __Path.raw(String source) : _path = source, isWindowsShare = false;
 
-  _Path._internal(String this._path, bool this.isWindowsShare);
+  __Path._internal(String this._path, bool this.isWindowsShare);
 
   static String _clean(String source) {
     if (Platform.operatingSystem == 'windows') return _cleanWindows(source);
@@ -44,14 +44,14 @@
 
   String toString() => _path;
 
-  Path relativeTo(Path base) {
+  _Path relativeTo(_Path base) {
     // Returns a path "relative" such that
     // base.join(relative) == this.canonicalize.
     // Throws exception if an impossible case is reached.
     if (base.isAbsolute != isAbsolute ||
         base.isWindowsShare != isWindowsShare) {
       throw new ArgumentError(
-          "Invalid case of Path.relativeTo(base):\n"
+          "Invalid case of _Path.relativeTo(base):\n"
           "  Path and base must both be relative, or both absolute.\n"
           "  Arguments: $_path.relativeTo($base)");
     }
@@ -71,17 +71,17 @@
           if(basePath[1] != _path[1]) {
             // Replace the drive letter in basePath with that from _path.
             basePath = '/${_path[1]}:/${basePath.substring(4)}';
-            base = new Path(basePath);
+            base = new _Path(basePath);
           }
         } else {
           throw new ArgumentError(
-              "Invalid case of Path.relativeTo(base):\n"
+              "Invalid case of _Path.relativeTo(base):\n"
               "  Base path and target path are on different Windows drives.\n"
               "  Arguments: $_path.relativeTo($base)");
         }
       } else if (baseHasDrive != pathHasDrive) {
         throw new ArgumentError(
-            "Invalid case of Path.relativeTo(base):\n"
+            "Invalid case of _Path.relativeTo(base):\n"
             "  Base path must start with a drive letter if and "
             "only if target path does.\n"
             "  Arguments: $_path.relativeTo($base)");
@@ -89,7 +89,7 @@
 
     }
     if (_path.startsWith(basePath)) {
-      if (_path == basePath) return new Path('.');
+      if (_path == basePath) return new _Path('.');
       // There must be a '/' at the end of the match, or immediately after.
       int matchEnd = basePath.length;
       if (_path[matchEnd - 1] == '/' || _path[matchEnd] == '/') {
@@ -97,7 +97,7 @@
         while (matchEnd < _path.length && _path[matchEnd] == '/') {
           matchEnd++;
         }
-        return new Path(_path.substring(matchEnd)).canonicalize();
+        return new _Path(_path.substring(matchEnd)).canonicalize();
       }
     }
 
@@ -118,7 +118,7 @@
 
     if (common < baseSegments.length && baseSegments[common] == '..') {
       throw new ArgumentError(
-          "Invalid case of Path.relativeTo(base):\n"
+          "Invalid case of _Path.relativeTo(base):\n"
           "  Base path has more '..'s than path does.\n"
           "  Arguments: $_path.relativeTo($base)");
     }
@@ -134,11 +134,11 @@
     if (hasTrailingSeparator) {
         segments.add('');
     }
-    return new Path(segments.join('/'));
+    return new _Path(segments.join('/'));
   }
 
 
-  Path join(Path further) {
+  _Path join(_Path further) {
     if (further.isAbsolute) {
       throw new ArgumentError(
           "Path.join called with absolute Path as argument.");
@@ -147,17 +147,17 @@
       return further.canonicalize();
     }
     if (hasTrailingSeparator) {
-      var joined = new _Path._internal('$_path${further}', isWindowsShare);
+      var joined = new __Path._internal('$_path${further}', isWindowsShare);
       return joined.canonicalize();
     }
-    var joined = new _Path._internal('$_path/${further}', isWindowsShare);
+    var joined = new __Path._internal('$_path/${further}', isWindowsShare);
     return joined.canonicalize();
   }
 
   // Note: The URI RFC names for canonicalize, join, and relativeTo
   // are normalize, resolve, and relativize.  But resolve and relativize
   // drop the last segment of the base path (the filename), on URIs.
-  Path canonicalize() {
+  _Path canonicalize() {
     if (isCanonical) return this;
     return makeCanonical();
   }
@@ -184,7 +184,7 @@
     return !segs.any((s) => s == '' || s == '.' || s == '..');
   }
 
-  Path makeCanonical() {
+  _Path makeCanonical() {
     bool isAbs = isAbsolute;
     List segs = segments();
     String drive;
@@ -242,7 +242,7 @@
         segmentsToJoin.add('');
       }
     }
-    return new _Path._internal(segmentsToJoin.join('/'), isWindowsShare);
+    return new __Path._internal(segmentsToJoin.join('/'), isWindowsShare);
   }
 
   String toNativePath() {
@@ -271,13 +271,13 @@
     return result;
   }
 
-  Path append(String finalSegment) {
+  _Path append(String finalSegment) {
     if (isEmpty) {
-      return new _Path._internal(finalSegment, isWindowsShare);
+      return new __Path._internal(finalSegment, isWindowsShare);
     } else if (hasTrailingSeparator) {
-      return new _Path._internal('$_path$finalSegment', isWindowsShare);
+      return new __Path._internal('$_path$finalSegment', isWindowsShare);
     } else {
-      return new _Path._internal('$_path/$finalSegment', isWindowsShare);
+      return new __Path._internal('$_path/$finalSegment', isWindowsShare);
     }
   }
 
@@ -294,12 +294,12 @@
     return (pos < 0) ? '' : name.substring(pos + 1);
   }
 
-  Path get directoryPath {
+  _Path get directoryPath {
     int pos = _path.lastIndexOf('/');
-    if (pos < 0) return new Path('');
+    if (pos < 0) return new _Path('');
     while (pos > 0 && _path[pos - 1] == '/') --pos;
     var dirPath = (pos > 0) ? _path.substring(0, pos) : '/';
-    return new _Path._internal(dirPath, isWindowsShare);
+    return new __Path._internal(dirPath, isWindowsShare);
   }
 
   String get filename {
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index f2a33e2..1867050 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -204,117 +204,7 @@
    */
   external static void initialize({String database,
                                    String password,
-                                   bool useBuiltinRoots: true,
-                                   bool readOnly: true});
-
-  /**
-   * Trust strings for use in [addCertificate] and [changeTrust].
-   */
-  static const String TRUST_ISSUE_SERVER_CERTIFICATES = 'C,,';
-  static const String TRUST_ISSUE_CLIENT_CERTIFICATES = 'T,,';
-  static const String TRUST_ISSUE_CLIENT_SERVER_CERTIFICATES = 'TC,,';
-  static const String TRUST_CERTIFICATE = 'P,,';
-
-  /**
-   * Adds a X509 certificate (for SSL and TLS secure networking) to the
-   * in-memory certificate cache.  Returns an X509Certificate object
-   * with information about the added certificate.
-   *
-   * The in-memory certificate cache is different from the certificate
-   * database opened by `SecureSocket.initialize`, and certificates added
-   * by [addCertificate] cannot be modified or removed by [changeTrust]
-   * or [removeCertificate].  However, if the certificate is already in the
-   * database, then [removeCertificate] will remove it from both the database
-   * and the in-memory cache.
-   *
-   * [certificate] must be a list of bytes encoding a certificate in
-   *  PEM format: a base64 encoded DER certificate, enclosed between
-   * "-----BEGIN CERTIFICATE-----" and "-----END CERTIFICATE-----".
-   *
-   * [trust] is a string specifying the allowed uses of this certificate.
-   * For example, 'TC,,' specifies that the certificate is for a certificate
-   * authority that is trusted to issue server and client certificates, so
-   * that a server or client certificate signed by this authority will be
-   * accepted.
-   *
-   * See the documentation of NSS certutil at
-   * http://developer.mozilla.org/en-US/docs/NSS_reference/NSS_tools_:_certutil
-   * or
-   * http://blogs.oracle.com/meena/entry/notes_about_trust_flags
-   * for more information about trust attributes.
-   */
-  external static X509Certificate addCertificate(List<int> certificate,
-                                                 String trust);
-
-  /**
-   * Adds a X509 certificates (for SSL and TLS secure networking) with
-   * their private keys to the certificate database.  SecureSocket.initialize
-   * must have been called with the path to a certificate database, and with
-   * readOnly set to `false`.
-   *
-   * [certificates] must be a list containing the bytes of a PKCS #12 encoded
-   * list of certificates and private keys.  These are commonly called
-   * `.pfx` or `.p12` files.  Only PKCS #12 files using
-   * 3-key triple-DES and 40 bit RC2 encryption are accepted.
-   *
-   * All certificates are imported with no default trust, and the appropriate
-   * uses of each certificate must be added with `SecureSocket.changeTrust`.
-   *
-   * See the documentation of NSS certutil at
-   * http://developer.mozilla.org/en-US/docs/NSS_reference/NSS_tools_:_certutil
-   * or
-   * http://blogs.oracle.com/meena/entry/notes_about_trust_flags
-   * for more information about trust attributes.
-   *
-   * Returns a CertificateError if it fails. The error code -8183 does not
-   * indicate that the PKCS #12 file is corrupt.  It also is returned if
-   * the certificate database is read-only, or is the default internal database,
-   * or if the password for the file or database is incorrect.
-   */
-  external static importCertificatesWithPrivateKeys(List<int> certificates,
-                                                    String password);
-
-  /**
-   * Changes the trust settings for the certificate with nickname [nickname].
-   * This certificate must exist in the certificate database.
-   * SecureSocket.initialize must have been called with the path to a
-   * certificate database, and with readOnly set to false.
-   *
-   * [trust] is a string specifying the allowed uses of this certificate.
-   * For example, 'TC,,' specifies that the certificate is for a certificate
-   * authority that is trusted to issue server and client certificates, so
-   * that a server or client certificate signed by this authority will be
-   * accepted.
-   *
-   * See the documentation of NSS certutil at
-   * http://developer.mozilla.org/en-US/docs/NSS_reference/NSS_tools_:_certutil
-   * or
-   * http://blogs.oracle.com/meena/entry/notes_about_trust_flags
-   * for more information about trust attributes.
-   */
-  external static X509Certificate changeTrust(String nickname,
-                                              String trust);
-
-  /**
-   * Gets the certificate with nickname [nickname] from
-   * the certificate database.  Returns an X509Certificate object with
-   * information about the certificate.
-   *
-   * Throws a CertificateException if it cannot find the certificate with
-   * the given nickname.
-   */
-  external static X509Certificate getCertificate(String nickname);
-
-  /**
-   * Removes the certificate with nickname [nickname] permanently from
-   * the certificate database.
-   * This certificate must exist in the certificate database.
-   * SecureSocket.initialize must have been called with the path to a
-   * certificate database, and with readOnly set to false.
-   *
-   * Returns null if it cannot find the certificate with that nickname.
-   */
-  external static removeCertificate(String nickname);
+                                   bool useBuiltinRoots: true});
 }
 
 
@@ -522,8 +412,7 @@
   static final int NUM_BUFFERS = 4;
 
   // Is a buffer identifier for an encrypted buffer?
-  static bool _isBufferEncrypted(int identifier) =>
-      identifier >= READ_ENCRYPTED;
+  static bool _isBufferEncrypted(int identifier) => identifier >= READ_ENCRYPTED;
 
   RawSocket _socket;
   final Completer<_RawSecureSocket> _handshakeComplete =
diff --git a/sdk/lib/io/socket.dart b/sdk/lib/io/socket.dart
index 8c2a21b..c5b4b8d 100644
--- a/sdk/lib/io/socket.dart
+++ b/sdk/lib/io/socket.dart
@@ -417,9 +417,10 @@
 }
 
 /**
- * A high-level class for communicating over a TCP socket. The [Socket] exposes
- * both a [Stream] and a [IOSink] interface, making it ideal for
- * using together with other [Stream]s.
+ * A high-level class for communicating over a TCP socket. 
+ *
+ * The [Socket] exposes both a [Stream] and a [IOSink] interface, making it 
+ * ideal for using together with other [Stream]s.
  */
 abstract class Socket implements Stream<List<int>>, IOSink {
   /**
diff --git a/sdk/lib/io/websocket.dart b/sdk/lib/io/websocket.dart
index b67f89e..a3f2b25 100644
--- a/sdk/lib/io/websocket.dart
+++ b/sdk/lib/io/websocket.dart
@@ -76,9 +76,10 @@
 
 
 /**
- * A client or server web socket connection. The stream exposes the
- * messages received. A text message will be of type [:String:] and a
- * binary message will be of type [:List<int>:].
+ * A two-way HTTP communication object for client or server applications.
+ *
+ * The stream exposes the messages received. A text message will be of type 
+ * [:String:] and a binary message will be of type [:List<int>:].
  */
 abstract class WebSocket implements Stream, StreamSink {
   /**
diff --git a/sdk/lib/json/json.dart b/sdk/lib/json/json.dart
index 28d3df9..5fd3a6a 100644
--- a/sdk/lib/json/json.dart
+++ b/sdk/lib/json/json.dart
@@ -2,6 +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.
 
+/**
+ * Utilities for encoding and decoding JSON (JavaScript Object Notation) data.
+ */
+
 library dart.json;
 
 // JSON parsing and serialization.
@@ -57,7 +61,7 @@
  * The optional [reviver] function, if provided, is called once for each
  * object or list property parsed. The arguments are the property name
  * ([String]) or list index ([int]), and the value is the parsed value.
- * The return value of the revivier will be used as the value of that property
+ * The return value of the reviver will be used as the value of that property
  * instead the parsed value.
  *
  * Throws [FormatException] if the input is not valid JSON text.
@@ -177,7 +181,7 @@
   void handleString(String value) { this.value = value; }
   void handleNumber(num value) { this.value = value; }
   void handleBool(bool value) { this.value = value; }
-  void handleNull() { this.value = value; }
+  void handleNull() { this.value = null; }
 
   void beginObject() {
     pushContainer();
diff --git a/sdk/lib/math/math.dart b/sdk/lib/math/math.dart
index 6cea069..0c1f67f 100644
--- a/sdk/lib/math/math.dart
+++ b/sdk/lib/math/math.dart
@@ -2,6 +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.
 
+/**
+ * Mathematical constants and functions, plus a random number generator.
+ */
 library dart.math;
 
 part "random.dart";
diff --git a/sdk/lib/mirrors/mirrors.dart b/sdk/lib/mirrors/mirrors.dart
index c41c6c2..b0d39d9 100644
--- a/sdk/lib/mirrors/mirrors.dart
+++ b/sdk/lib/mirrors/mirrors.dart
@@ -13,37 +13,37 @@
 // setters for the purposes of member lookup.
 
 /**
- * The mirrors library provides basic reflection support for Dart.
- * Reflection here is limited to introspection and dynamic
- * evaluation.
+ * Basic reflection in Dart,
+ * with support for introspection and dynamic evaluation.
  *
- * Introspection is that subset of reflection by which a running
+ * *Introspection* is that subset of reflection by which a running
  * program can examine its own structure. For example, a function
  * that prints out the names of all the members of an arbitrary object.
  *
- * Dynamic evaluation refers the ability to evaluate code that
+ * *Dynamic evaluation* refers the ability to evaluate code that
  * has not been literally specified at compile time, such as calling a method
  * whose name is provided as an argument (because it is looked up
  * in a database, or provided interactively by the user).
  *
- * How to Interpret the Dartdoc specifications below
+ * ## How to interpret this library's documentation
  *
  * As a rule, the names of Dart declarations are represented using
- * instances of class [Symbol]. Whenever we speak of an object *s*
- * of class [Symbol] denoting a name, we mean the string that
+ * instances of class [Symbol]. Whenever the doc speaks of an object *s*
+ * of class [Symbol] denoting a name, it means the string that
  * was used to construct *s*.
  *
- * We will also frequently abuse notation and write
- * Dart pseudo-code such as [:o.x(a):], where we have defined
- * o and a to be objects; what is actually meant in these
+ * The documentation frequently abuses notation with
+ * Dart pseudo-code such as [:o.x(a):], where
+ * o and a are defined to be objects; what is actually meant in these
  * cases is [:o'.x(a'):] where *o'* and *a'* are Dart variables
  * bound to *o* and *a* respectively. Furthermore, *o'* and *a'*
  * are assumed to be fresh variables (meaning that they are
  * distinct from any other variables in the program).
  *
+ * Sometimes the documentation refers to *serializable* objects.
  * An object is serializable across isolates if and only if it is an instance of
- * either num, bool, String, a list of objects that are serializable
- * across isolates or a map whose keys and values are all serializable across
+ * num, bool, String, a list of objects that are serializable
+ * across isolates, or a map with keys and values that are all serializable across
  * isolates.
  */
 library dart.mirrors;
diff --git a/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart b/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart
index 0c761ff..a145ff2 100644
--- a/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart
+++ b/sdk/lib/typed_data/dart2js/typed_data_dart2js.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.
 
-/// The Dart TypedData library.
+/**
+ * Specialized integers and floating point numbers,
+ * with SIMD support and efficient lists.
+ */
 library dart.typed_data;
 
 import 'dart:collection';
@@ -931,264 +934,270 @@
   /// Extracted w value.
   double get w => _storage[3];
 
-  Float32x4 get xxxx => _shuffle(0x0);
-  Float32x4 get xxxy => _shuffle(0x40);
-  Float32x4 get xxxz => _shuffle(0x80);
-  Float32x4 get xxxw => _shuffle(0xC0);
-  Float32x4 get xxyx => _shuffle(0x10);
-  Float32x4 get xxyy => _shuffle(0x50);
-  Float32x4 get xxyz => _shuffle(0x90);
-  Float32x4 get xxyw => _shuffle(0xD0);
-  Float32x4 get xxzx => _shuffle(0x20);
-  Float32x4 get xxzy => _shuffle(0x60);
-  Float32x4 get xxzz => _shuffle(0xA0);
-  Float32x4 get xxzw => _shuffle(0xE0);
-  Float32x4 get xxwx => _shuffle(0x30);
-  Float32x4 get xxwy => _shuffle(0x70);
-  Float32x4 get xxwz => _shuffle(0xB0);
-  Float32x4 get xxww => _shuffle(0xF0);
-  Float32x4 get xyxx => _shuffle(0x4);
-  Float32x4 get xyxy => _shuffle(0x44);
-  Float32x4 get xyxz => _shuffle(0x84);
-  Float32x4 get xyxw => _shuffle(0xC4);
-  Float32x4 get xyyx => _shuffle(0x14);
-  Float32x4 get xyyy => _shuffle(0x54);
-  Float32x4 get xyyz => _shuffle(0x94);
-  Float32x4 get xyyw => _shuffle(0xD4);
-  Float32x4 get xyzx => _shuffle(0x24);
-  Float32x4 get xyzy => _shuffle(0x64);
-  Float32x4 get xyzz => _shuffle(0xA4);
-  Float32x4 get xyzw => _shuffle(0xE4);
-  Float32x4 get xywx => _shuffle(0x34);
-  Float32x4 get xywy => _shuffle(0x74);
-  Float32x4 get xywz => _shuffle(0xB4);
-  Float32x4 get xyww => _shuffle(0xF4);
-  Float32x4 get xzxx => _shuffle(0x8);
-  Float32x4 get xzxy => _shuffle(0x48);
-  Float32x4 get xzxz => _shuffle(0x88);
-  Float32x4 get xzxw => _shuffle(0xC8);
-  Float32x4 get xzyx => _shuffle(0x18);
-  Float32x4 get xzyy => _shuffle(0x58);
-  Float32x4 get xzyz => _shuffle(0x98);
-  Float32x4 get xzyw => _shuffle(0xD8);
-  Float32x4 get xzzx => _shuffle(0x28);
-  Float32x4 get xzzy => _shuffle(0x68);
-  Float32x4 get xzzz => _shuffle(0xA8);
-  Float32x4 get xzzw => _shuffle(0xE8);
-  Float32x4 get xzwx => _shuffle(0x38);
-  Float32x4 get xzwy => _shuffle(0x78);
-  Float32x4 get xzwz => _shuffle(0xB8);
-  Float32x4 get xzww => _shuffle(0xF8);
-  Float32x4 get xwxx => _shuffle(0xC);
-  Float32x4 get xwxy => _shuffle(0x4C);
-  Float32x4 get xwxz => _shuffle(0x8C);
-  Float32x4 get xwxw => _shuffle(0xCC);
-  Float32x4 get xwyx => _shuffle(0x1C);
-  Float32x4 get xwyy => _shuffle(0x5C);
-  Float32x4 get xwyz => _shuffle(0x9C);
-  Float32x4 get xwyw => _shuffle(0xDC);
-  Float32x4 get xwzx => _shuffle(0x2C);
-  Float32x4 get xwzy => _shuffle(0x6C);
-  Float32x4 get xwzz => _shuffle(0xAC);
-  Float32x4 get xwzw => _shuffle(0xEC);
-  Float32x4 get xwwx => _shuffle(0x3C);
-  Float32x4 get xwwy => _shuffle(0x7C);
-  Float32x4 get xwwz => _shuffle(0xBC);
-  Float32x4 get xwww => _shuffle(0xFC);
-  Float32x4 get yxxx => _shuffle(0x1);
-  Float32x4 get yxxy => _shuffle(0x41);
-  Float32x4 get yxxz => _shuffle(0x81);
-  Float32x4 get yxxw => _shuffle(0xC1);
-  Float32x4 get yxyx => _shuffle(0x11);
-  Float32x4 get yxyy => _shuffle(0x51);
-  Float32x4 get yxyz => _shuffle(0x91);
-  Float32x4 get yxyw => _shuffle(0xD1);
-  Float32x4 get yxzx => _shuffle(0x21);
-  Float32x4 get yxzy => _shuffle(0x61);
-  Float32x4 get yxzz => _shuffle(0xA1);
-  Float32x4 get yxzw => _shuffle(0xE1);
-  Float32x4 get yxwx => _shuffle(0x31);
-  Float32x4 get yxwy => _shuffle(0x71);
-  Float32x4 get yxwz => _shuffle(0xB1);
-  Float32x4 get yxww => _shuffle(0xF1);
-  Float32x4 get yyxx => _shuffle(0x5);
-  Float32x4 get yyxy => _shuffle(0x45);
-  Float32x4 get yyxz => _shuffle(0x85);
-  Float32x4 get yyxw => _shuffle(0xC5);
-  Float32x4 get yyyx => _shuffle(0x15);
-  Float32x4 get yyyy => _shuffle(0x55);
-  Float32x4 get yyyz => _shuffle(0x95);
-  Float32x4 get yyyw => _shuffle(0xD5);
-  Float32x4 get yyzx => _shuffle(0x25);
-  Float32x4 get yyzy => _shuffle(0x65);
-  Float32x4 get yyzz => _shuffle(0xA5);
-  Float32x4 get yyzw => _shuffle(0xE5);
-  Float32x4 get yywx => _shuffle(0x35);
-  Float32x4 get yywy => _shuffle(0x75);
-  Float32x4 get yywz => _shuffle(0xB5);
-  Float32x4 get yyww => _shuffle(0xF5);
-  Float32x4 get yzxx => _shuffle(0x9);
-  Float32x4 get yzxy => _shuffle(0x49);
-  Float32x4 get yzxz => _shuffle(0x89);
-  Float32x4 get yzxw => _shuffle(0xC9);
-  Float32x4 get yzyx => _shuffle(0x19);
-  Float32x4 get yzyy => _shuffle(0x59);
-  Float32x4 get yzyz => _shuffle(0x99);
-  Float32x4 get yzyw => _shuffle(0xD9);
-  Float32x4 get yzzx => _shuffle(0x29);
-  Float32x4 get yzzy => _shuffle(0x69);
-  Float32x4 get yzzz => _shuffle(0xA9);
-  Float32x4 get yzzw => _shuffle(0xE9);
-  Float32x4 get yzwx => _shuffle(0x39);
-  Float32x4 get yzwy => _shuffle(0x79);
-  Float32x4 get yzwz => _shuffle(0xB9);
-  Float32x4 get yzww => _shuffle(0xF9);
-  Float32x4 get ywxx => _shuffle(0xD);
-  Float32x4 get ywxy => _shuffle(0x4D);
-  Float32x4 get ywxz => _shuffle(0x8D);
-  Float32x4 get ywxw => _shuffle(0xCD);
-  Float32x4 get ywyx => _shuffle(0x1D);
-  Float32x4 get ywyy => _shuffle(0x5D);
-  Float32x4 get ywyz => _shuffle(0x9D);
-  Float32x4 get ywyw => _shuffle(0xDD);
-  Float32x4 get ywzx => _shuffle(0x2D);
-  Float32x4 get ywzy => _shuffle(0x6D);
-  Float32x4 get ywzz => _shuffle(0xAD);
-  Float32x4 get ywzw => _shuffle(0xED);
-  Float32x4 get ywwx => _shuffle(0x3D);
-  Float32x4 get ywwy => _shuffle(0x7D);
-  Float32x4 get ywwz => _shuffle(0xBD);
-  Float32x4 get ywww => _shuffle(0xFD);
-  Float32x4 get zxxx => _shuffle(0x2);
-  Float32x4 get zxxy => _shuffle(0x42);
-  Float32x4 get zxxz => _shuffle(0x82);
-  Float32x4 get zxxw => _shuffle(0xC2);
-  Float32x4 get zxyx => _shuffle(0x12);
-  Float32x4 get zxyy => _shuffle(0x52);
-  Float32x4 get zxyz => _shuffle(0x92);
-  Float32x4 get zxyw => _shuffle(0xD2);
-  Float32x4 get zxzx => _shuffle(0x22);
-  Float32x4 get zxzy => _shuffle(0x62);
-  Float32x4 get zxzz => _shuffle(0xA2);
-  Float32x4 get zxzw => _shuffle(0xE2);
-  Float32x4 get zxwx => _shuffle(0x32);
-  Float32x4 get zxwy => _shuffle(0x72);
-  Float32x4 get zxwz => _shuffle(0xB2);
-  Float32x4 get zxww => _shuffle(0xF2);
-  Float32x4 get zyxx => _shuffle(0x6);
-  Float32x4 get zyxy => _shuffle(0x46);
-  Float32x4 get zyxz => _shuffle(0x86);
-  Float32x4 get zyxw => _shuffle(0xC6);
-  Float32x4 get zyyx => _shuffle(0x16);
-  Float32x4 get zyyy => _shuffle(0x56);
-  Float32x4 get zyyz => _shuffle(0x96);
-  Float32x4 get zyyw => _shuffle(0xD6);
-  Float32x4 get zyzx => _shuffle(0x26);
-  Float32x4 get zyzy => _shuffle(0x66);
-  Float32x4 get zyzz => _shuffle(0xA6);
-  Float32x4 get zyzw => _shuffle(0xE6);
-  Float32x4 get zywx => _shuffle(0x36);
-  Float32x4 get zywy => _shuffle(0x76);
-  Float32x4 get zywz => _shuffle(0xB6);
-  Float32x4 get zyww => _shuffle(0xF6);
-  Float32x4 get zzxx => _shuffle(0xA);
-  Float32x4 get zzxy => _shuffle(0x4A);
-  Float32x4 get zzxz => _shuffle(0x8A);
-  Float32x4 get zzxw => _shuffle(0xCA);
-  Float32x4 get zzyx => _shuffle(0x1A);
-  Float32x4 get zzyy => _shuffle(0x5A);
-  Float32x4 get zzyz => _shuffle(0x9A);
-  Float32x4 get zzyw => _shuffle(0xDA);
-  Float32x4 get zzzx => _shuffle(0x2A);
-  Float32x4 get zzzy => _shuffle(0x6A);
-  Float32x4 get zzzz => _shuffle(0xAA);
-  Float32x4 get zzzw => _shuffle(0xEA);
-  Float32x4 get zzwx => _shuffle(0x3A);
-  Float32x4 get zzwy => _shuffle(0x7A);
-  Float32x4 get zzwz => _shuffle(0xBA);
-  Float32x4 get zzww => _shuffle(0xFA);
-  Float32x4 get zwxx => _shuffle(0xE);
-  Float32x4 get zwxy => _shuffle(0x4E);
-  Float32x4 get zwxz => _shuffle(0x8E);
-  Float32x4 get zwxw => _shuffle(0xCE);
-  Float32x4 get zwyx => _shuffle(0x1E);
-  Float32x4 get zwyy => _shuffle(0x5E);
-  Float32x4 get zwyz => _shuffle(0x9E);
-  Float32x4 get zwyw => _shuffle(0xDE);
-  Float32x4 get zwzx => _shuffle(0x2E);
-  Float32x4 get zwzy => _shuffle(0x6E);
-  Float32x4 get zwzz => _shuffle(0xAE);
-  Float32x4 get zwzw => _shuffle(0xEE);
-  Float32x4 get zwwx => _shuffle(0x3E);
-  Float32x4 get zwwy => _shuffle(0x7E);
-  Float32x4 get zwwz => _shuffle(0xBE);
-  Float32x4 get zwww => _shuffle(0xFE);
-  Float32x4 get wxxx => _shuffle(0x3);
-  Float32x4 get wxxy => _shuffle(0x43);
-  Float32x4 get wxxz => _shuffle(0x83);
-  Float32x4 get wxxw => _shuffle(0xC3);
-  Float32x4 get wxyx => _shuffle(0x13);
-  Float32x4 get wxyy => _shuffle(0x53);
-  Float32x4 get wxyz => _shuffle(0x93);
-  Float32x4 get wxyw => _shuffle(0xD3);
-  Float32x4 get wxzx => _shuffle(0x23);
-  Float32x4 get wxzy => _shuffle(0x63);
-  Float32x4 get wxzz => _shuffle(0xA3);
-  Float32x4 get wxzw => _shuffle(0xE3);
-  Float32x4 get wxwx => _shuffle(0x33);
-  Float32x4 get wxwy => _shuffle(0x73);
-  Float32x4 get wxwz => _shuffle(0xB3);
-  Float32x4 get wxww => _shuffle(0xF3);
-  Float32x4 get wyxx => _shuffle(0x7);
-  Float32x4 get wyxy => _shuffle(0x47);
-  Float32x4 get wyxz => _shuffle(0x87);
-  Float32x4 get wyxw => _shuffle(0xC7);
-  Float32x4 get wyyx => _shuffle(0x17);
-  Float32x4 get wyyy => _shuffle(0x57);
-  Float32x4 get wyyz => _shuffle(0x97);
-  Float32x4 get wyyw => _shuffle(0xD7);
-  Float32x4 get wyzx => _shuffle(0x27);
-  Float32x4 get wyzy => _shuffle(0x67);
-  Float32x4 get wyzz => _shuffle(0xA7);
-  Float32x4 get wyzw => _shuffle(0xE7);
-  Float32x4 get wywx => _shuffle(0x37);
-  Float32x4 get wywy => _shuffle(0x77);
-  Float32x4 get wywz => _shuffle(0xB7);
-  Float32x4 get wyww => _shuffle(0xF7);
-  Float32x4 get wzxx => _shuffle(0xB);
-  Float32x4 get wzxy => _shuffle(0x4B);
-  Float32x4 get wzxz => _shuffle(0x8B);
-  Float32x4 get wzxw => _shuffle(0xCB);
-  Float32x4 get wzyx => _shuffle(0x1B);
-  Float32x4 get wzyy => _shuffle(0x5B);
-  Float32x4 get wzyz => _shuffle(0x9B);
-  Float32x4 get wzyw => _shuffle(0xDB);
-  Float32x4 get wzzx => _shuffle(0x2B);
-  Float32x4 get wzzy => _shuffle(0x6B);
-  Float32x4 get wzzz => _shuffle(0xAB);
-  Float32x4 get wzzw => _shuffle(0xEB);
-  Float32x4 get wzwx => _shuffle(0x3B);
-  Float32x4 get wzwy => _shuffle(0x7B);
-  Float32x4 get wzwz => _shuffle(0xBB);
-  Float32x4 get wzww => _shuffle(0xFB);
-  Float32x4 get wwxx => _shuffle(0xF);
-  Float32x4 get wwxy => _shuffle(0x4F);
-  Float32x4 get wwxz => _shuffle(0x8F);
-  Float32x4 get wwxw => _shuffle(0xCF);
-  Float32x4 get wwyx => _shuffle(0x1F);
-  Float32x4 get wwyy => _shuffle(0x5F);
-  Float32x4 get wwyz => _shuffle(0x9F);
-  Float32x4 get wwyw => _shuffle(0xDF);
-  Float32x4 get wwzx => _shuffle(0x2F);
-  Float32x4 get wwzy => _shuffle(0x6F);
-  Float32x4 get wwzz => _shuffle(0xAF);
-  Float32x4 get wwzw => _shuffle(0xEF);
-  Float32x4 get wwwx => _shuffle(0x3F);
-  Float32x4 get wwwy => _shuffle(0x7F);
-  Float32x4 get wwwz => _shuffle(0xBF);
-  Float32x4 get wwww => _shuffle(0xFF);
+  /// Mask passed to [shuffle].
+  static const int XXXX = 0x0;
+  static const int XXXY = 0x40;
+  static const int XXXZ = 0x80;
+  static const int XXXW = 0xC0;
+  static const int XXYX = 0x10;
+  static const int XXYY = 0x50;
+  static const int XXYZ = 0x90;
+  static const int XXYW = 0xD0;
+  static const int XXZX = 0x20;
+  static const int XXZY = 0x60;
+  static const int XXZZ = 0xA0;
+  static const int XXZW = 0xE0;
+  static const int XXWX = 0x30;
+  static const int XXWY = 0x70;
+  static const int XXWZ = 0xB0;
+  static const int XXWW = 0xF0;
+  static const int XYXX = 0x4;
+  static const int XYXY = 0x44;
+  static const int XYXZ = 0x84;
+  static const int XYXW = 0xC4;
+  static const int XYYX = 0x14;
+  static const int XYYY = 0x54;
+  static const int XYYZ = 0x94;
+  static const int XYYW = 0xD4;
+  static const int XYZX = 0x24;
+  static const int XYZY = 0x64;
+  static const int XYZZ = 0xA4;
+  static const int XYZW = 0xE4;
+  static const int XYWX = 0x34;
+  static const int XYWY = 0x74;
+  static const int XYWZ = 0xB4;
+  static const int XYWW = 0xF4;
+  static const int XZXX = 0x8;
+  static const int XZXY = 0x48;
+  static const int XZXZ = 0x88;
+  static const int XZXW = 0xC8;
+  static const int XZYX = 0x18;
+  static const int XZYY = 0x58;
+  static const int XZYZ = 0x98;
+  static const int XZYW = 0xD8;
+  static const int XZZX = 0x28;
+  static const int XZZY = 0x68;
+  static const int XZZZ = 0xA8;
+  static const int XZZW = 0xE8;
+  static const int XZWX = 0x38;
+  static const int XZWY = 0x78;
+  static const int XZWZ = 0xB8;
+  static const int XZWW = 0xF8;
+  static const int XWXX = 0xC;
+  static const int XWXY = 0x4C;
+  static const int XWXZ = 0x8C;
+  static const int XWXW = 0xCC;
+  static const int XWYX = 0x1C;
+  static const int XWYY = 0x5C;
+  static const int XWYZ = 0x9C;
+  static const int XWYW = 0xDC;
+  static const int XWZX = 0x2C;
+  static const int XWZY = 0x6C;
+  static const int XWZZ = 0xAC;
+  static const int XWZW = 0xEC;
+  static const int XWWX = 0x3C;
+  static const int XWWY = 0x7C;
+  static const int XWWZ = 0xBC;
+  static const int XWWW = 0xFC;
+  static const int YXXX = 0x1;
+  static const int YXXY = 0x41;
+  static const int YXXZ = 0x81;
+  static const int YXXW = 0xC1;
+  static const int YXYX = 0x11;
+  static const int YXYY = 0x51;
+  static const int YXYZ = 0x91;
+  static const int YXYW = 0xD1;
+  static const int YXZX = 0x21;
+  static const int YXZY = 0x61;
+  static const int YXZZ = 0xA1;
+  static const int YXZW = 0xE1;
+  static const int YXWX = 0x31;
+  static const int YXWY = 0x71;
+  static const int YXWZ = 0xB1;
+  static const int YXWW = 0xF1;
+  static const int YYXX = 0x5;
+  static const int YYXY = 0x45;
+  static const int YYXZ = 0x85;
+  static const int YYXW = 0xC5;
+  static const int YYYX = 0x15;
+  static const int YYYY = 0x55;
+  static const int YYYZ = 0x95;
+  static const int YYYW = 0xD5;
+  static const int YYZX = 0x25;
+  static const int YYZY = 0x65;
+  static const int YYZZ = 0xA5;
+  static const int YYZW = 0xE5;
+  static const int YYWX = 0x35;
+  static const int YYWY = 0x75;
+  static const int YYWZ = 0xB5;
+  static const int YYWW = 0xF5;
+  static const int YZXX = 0x9;
+  static const int YZXY = 0x49;
+  static const int YZXZ = 0x89;
+  static const int YZXW = 0xC9;
+  static const int YZYX = 0x19;
+  static const int YZYY = 0x59;
+  static const int YZYZ = 0x99;
+  static const int YZYW = 0xD9;
+  static const int YZZX = 0x29;
+  static const int YZZY = 0x69;
+  static const int YZZZ = 0xA9;
+  static const int YZZW = 0xE9;
+  static const int YZWX = 0x39;
+  static const int YZWY = 0x79;
+  static const int YZWZ = 0xB9;
+  static const int YZWW = 0xF9;
+  static const int YWXX = 0xD;
+  static const int YWXY = 0x4D;
+  static const int YWXZ = 0x8D;
+  static const int YWXW = 0xCD;
+  static const int YWYX = 0x1D;
+  static const int YWYY = 0x5D;
+  static const int YWYZ = 0x9D;
+  static const int YWYW = 0xDD;
+  static const int YWZX = 0x2D;
+  static const int YWZY = 0x6D;
+  static const int YWZZ = 0xAD;
+  static const int YWZW = 0xED;
+  static const int YWWX = 0x3D;
+  static const int YWWY = 0x7D;
+  static const int YWWZ = 0xBD;
+  static const int YWWW = 0xFD;
+  static const int ZXXX = 0x2;
+  static const int ZXXY = 0x42;
+  static const int ZXXZ = 0x82;
+  static const int ZXXW = 0xC2;
+  static const int ZXYX = 0x12;
+  static const int ZXYY = 0x52;
+  static const int ZXYZ = 0x92;
+  static const int ZXYW = 0xD2;
+  static const int ZXZX = 0x22;
+  static const int ZXZY = 0x62;
+  static const int ZXZZ = 0xA2;
+  static const int ZXZW = 0xE2;
+  static const int ZXWX = 0x32;
+  static const int ZXWY = 0x72;
+  static const int ZXWZ = 0xB2;
+  static const int ZXWW = 0xF2;
+  static const int ZYXX = 0x6;
+  static const int ZYXY = 0x46;
+  static const int ZYXZ = 0x86;
+  static const int ZYXW = 0xC6;
+  static const int ZYYX = 0x16;
+  static const int ZYYY = 0x56;
+  static const int ZYYZ = 0x96;
+  static const int ZYYW = 0xD6;
+  static const int ZYZX = 0x26;
+  static const int ZYZY = 0x66;
+  static const int ZYZZ = 0xA6;
+  static const int ZYZW = 0xE6;
+  static const int ZYWX = 0x36;
+  static const int ZYWY = 0x76;
+  static const int ZYWZ = 0xB6;
+  static const int ZYWW = 0xF6;
+  static const int ZZXX = 0xA;
+  static const int ZZXY = 0x4A;
+  static const int ZZXZ = 0x8A;
+  static const int ZZXW = 0xCA;
+  static const int ZZYX = 0x1A;
+  static const int ZZYY = 0x5A;
+  static const int ZZYZ = 0x9A;
+  static const int ZZYW = 0xDA;
+  static const int ZZZX = 0x2A;
+  static const int ZZZY = 0x6A;
+  static const int ZZZZ = 0xAA;
+  static const int ZZZW = 0xEA;
+  static const int ZZWX = 0x3A;
+  static const int ZZWY = 0x7A;
+  static const int ZZWZ = 0xBA;
+  static const int ZZWW = 0xFA;
+  static const int ZWXX = 0xE;
+  static const int ZWXY = 0x4E;
+  static const int ZWXZ = 0x8E;
+  static const int ZWXW = 0xCE;
+  static const int ZWYX = 0x1E;
+  static const int ZWYY = 0x5E;
+  static const int ZWYZ = 0x9E;
+  static const int ZWYW = 0xDE;
+  static const int ZWZX = 0x2E;
+  static const int ZWZY = 0x6E;
+  static const int ZWZZ = 0xAE;
+  static const int ZWZW = 0xEE;
+  static const int ZWWX = 0x3E;
+  static const int ZWWY = 0x7E;
+  static const int ZWWZ = 0xBE;
+  static const int ZWWW = 0xFE;
+  static const int WXXX = 0x3;
+  static const int WXXY = 0x43;
+  static const int WXXZ = 0x83;
+  static const int WXXW = 0xC3;
+  static const int WXYX = 0x13;
+  static const int WXYY = 0x53;
+  static const int WXYZ = 0x93;
+  static const int WXYW = 0xD3;
+  static const int WXZX = 0x23;
+  static const int WXZY = 0x63;
+  static const int WXZZ = 0xA3;
+  static const int WXZW = 0xE3;
+  static const int WXWX = 0x33;
+  static const int WXWY = 0x73;
+  static const int WXWZ = 0xB3;
+  static const int WXWW = 0xF3;
+  static const int WYXX = 0x7;
+  static const int WYXY = 0x47;
+  static const int WYXZ = 0x87;
+  static const int WYXW = 0xC7;
+  static const int WYYX = 0x17;
+  static const int WYYY = 0x57;
+  static const int WYYZ = 0x97;
+  static const int WYYW = 0xD7;
+  static const int WYZX = 0x27;
+  static const int WYZY = 0x67;
+  static const int WYZZ = 0xA7;
+  static const int WYZW = 0xE7;
+  static const int WYWX = 0x37;
+  static const int WYWY = 0x77;
+  static const int WYWZ = 0xB7;
+  static const int WYWW = 0xF7;
+  static const int WZXX = 0xB;
+  static const int WZXY = 0x4B;
+  static const int WZXZ = 0x8B;
+  static const int WZXW = 0xCB;
+  static const int WZYX = 0x1B;
+  static const int WZYY = 0x5B;
+  static const int WZYZ = 0x9B;
+  static const int WZYW = 0xDB;
+  static const int WZZX = 0x2B;
+  static const int WZZY = 0x6B;
+  static const int WZZZ = 0xAB;
+  static const int WZZW = 0xEB;
+  static const int WZWX = 0x3B;
+  static const int WZWY = 0x7B;
+  static const int WZWZ = 0xBB;
+  static const int WZWW = 0xFB;
+  static const int WWXX = 0xF;
+  static const int WWXY = 0x4F;
+  static const int WWXZ = 0x8F;
+  static const int WWXW = 0xCF;
+  static const int WWYX = 0x1F;
+  static const int WWYY = 0x5F;
+  static const int WWYZ = 0x9F;
+  static const int WWYW = 0xDF;
+  static const int WWZX = 0x2F;
+  static const int WWZY = 0x6F;
+  static const int WWZZ = 0xAF;
+  static const int WWZW = 0xEF;
+  static const int WWWX = 0x3F;
+  static const int WWWY = 0x7F;
+  static const int WWWZ = 0xBF;
+  static const int WWWW = 0xFF;
 
-  Float32x4 _shuffle(int m) {
+
+  /// Shuffle the lane values. [mask] must be one of the 256 shuffle constants.
+  Float32x4 shuffle(int m) {
+    if (m < 0 || m > 255) {
+      throw new RangeError('mask $m must be in the range [0..256)');
+    }
     double _x = _storage[m & 0x3];
     double _y = _storage[(m >> 2) & 0x3];
     double _z = _storage[(m >> 4) & 0x3];
@@ -1246,6 +1255,7 @@
     return new Float32x4(_x, _y, _z, _w);
   }
 
+  /// Copy [this] and replace the [x] lane.
   Float32x4 withX(double x) {
     double _x = x;
     double _y = _storage[1];
@@ -1254,6 +1264,7 @@
     return new Float32x4(_x, _y, _z, _w);
   }
 
+  /// Copy [this] and replace the [y] lane.
   Float32x4 withY(double y) {
     double _x = _storage[0];
     double _y = y;
@@ -1262,6 +1273,7 @@
     return new Float32x4(_x, _y, _z, _w);
   }
 
+  /// Copy [this] and replace the [z] lane.
   Float32x4 withZ(double z) {
     double _x = _storage[0];
     double _y = _storage[1];
@@ -1270,6 +1282,7 @@
     return new Float32x4(_x, _y, _z, _w);
   }
 
+  /// Copy [this] and replace the [w] lane.
   Float32x4 withW(double w) {
     double _x = _storage[0];
     double _y = _storage[1];
diff --git a/sdk/lib/typed_data/typed_data.dart b/sdk/lib/typed_data/typed_data.dart
index f75b4bb..7184e47 100644
--- a/sdk/lib/typed_data/typed_data.dart
+++ b/sdk/lib/typed_data/typed_data.dart
@@ -876,518 +876,266 @@
   /// Extracted w value.
   double get w;
 
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xxxx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xxxy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xxxz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xxxw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xxyx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xxyy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xxyz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xxyw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xxzx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xxzy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xxzz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xxzw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xxwx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xxwy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xxwz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xxww;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xyxx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xyxy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xyxz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xyxw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xyyx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xyyy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xyyz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xyyw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xyzx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xyzy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xyzz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xyzw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xywx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xywy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xywz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xyww;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xzxx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xzxy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xzxz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xzxw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xzyx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xzyy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xzyz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xzyw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xzzx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xzzy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xzzz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xzzw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xzwx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xzwy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xzwz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xzww;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xwxx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xwxy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xwxz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xwxw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xwyx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xwyy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xwyz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xwyw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xwzx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xwzy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xwzz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xwzw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xwwx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xwwy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xwwz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get xwww;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yxxx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yxxy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yxxz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yxxw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yxyx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yxyy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yxyz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yxyw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yxzx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yxzy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yxzz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yxzw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yxwx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yxwy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yxwz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yxww;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yyxx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yyxy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yyxz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yyxw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yyyx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yyyy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yyyz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yyyw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yyzx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yyzy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yyzz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yyzw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yywx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yywy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yywz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yyww;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yzxx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yzxy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yzxz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yzxw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yzyx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yzyy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yzyz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yzyw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yzzx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yzzy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yzzz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yzzw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yzwx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yzwy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yzwz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get yzww;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get ywxx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get ywxy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get ywxz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get ywxw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get ywyx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get ywyy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get ywyz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get ywyw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get ywzx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get ywzy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get ywzz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get ywzw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get ywwx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get ywwy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get ywwz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get ywww;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zxxx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zxxy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zxxz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zxxw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zxyx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zxyy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zxyz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zxyw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zxzx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zxzy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zxzz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zxzw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zxwx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zxwy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zxwz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zxww;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zyxx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zyxy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zyxz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zyxw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zyyx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zyyy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zyyz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zyyw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zyzx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zyzy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zyzz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zyzw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zywx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zywy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zywz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zyww;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zzxx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zzxy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zzxz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zzxw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zzyx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zzyy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zzyz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zzyw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zzzx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zzzy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zzzz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zzzw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zzwx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zzwy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zzwz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zzww;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zwxx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zwxy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zwxz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zwxw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zwyx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zwyy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zwyz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zwyw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zwzx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zwzy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zwzz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zwzw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zwwx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zwwy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zwwz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get zwww;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wxxx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wxxy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wxxz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wxxw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wxyx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wxyy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wxyz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wxyw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wxzx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wxzy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wxzz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wxzw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wxwx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wxwy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wxwz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wxww;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wyxx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wyxy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wyxz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wyxw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wyyx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wyyy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wyyz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wyyw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wyzx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wyzy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wyzz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wyzw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wywx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wywy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wywz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wyww;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wzxx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wzxy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wzxz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wzxw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wzyx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wzyy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wzyz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wzyw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wzzx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wzzy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wzzz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wzzw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wzwx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wzwy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wzwz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wzww;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wwxx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wwxy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wwxz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wwxw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wwyx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wwyy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wwyz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wwyw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wwzx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wwzy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wwzz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wwzw;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wwwx;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wwwy;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wwwz;
-  /// Returns a new [Float32x4] with lane values reordered.
-  Float32x4 get wwww;
+  /// Mask passed to [shuffle].
+  static const int XXXX = 0x0;
+  static const int XXXY = 0x40;
+  static const int XXXZ = 0x80;
+  static const int XXXW = 0xC0;
+  static const int XXYX = 0x10;
+  static const int XXYY = 0x50;
+  static const int XXYZ = 0x90;
+  static const int XXYW = 0xD0;
+  static const int XXZX = 0x20;
+  static const int XXZY = 0x60;
+  static const int XXZZ = 0xA0;
+  static const int XXZW = 0xE0;
+  static const int XXWX = 0x30;
+  static const int XXWY = 0x70;
+  static const int XXWZ = 0xB0;
+  static const int XXWW = 0xF0;
+  static const int XYXX = 0x4;
+  static const int XYXY = 0x44;
+  static const int XYXZ = 0x84;
+  static const int XYXW = 0xC4;
+  static const int XYYX = 0x14;
+  static const int XYYY = 0x54;
+  static const int XYYZ = 0x94;
+  static const int XYYW = 0xD4;
+  static const int XYZX = 0x24;
+  static const int XYZY = 0x64;
+  static const int XYZZ = 0xA4;
+  static const int XYZW = 0xE4;
+  static const int XYWX = 0x34;
+  static const int XYWY = 0x74;
+  static const int XYWZ = 0xB4;
+  static const int XYWW = 0xF4;
+  static const int XZXX = 0x8;
+  static const int XZXY = 0x48;
+  static const int XZXZ = 0x88;
+  static const int XZXW = 0xC8;
+  static const int XZYX = 0x18;
+  static const int XZYY = 0x58;
+  static const int XZYZ = 0x98;
+  static const int XZYW = 0xD8;
+  static const int XZZX = 0x28;
+  static const int XZZY = 0x68;
+  static const int XZZZ = 0xA8;
+  static const int XZZW = 0xE8;
+  static const int XZWX = 0x38;
+  static const int XZWY = 0x78;
+  static const int XZWZ = 0xB8;
+  static const int XZWW = 0xF8;
+  static const int XWXX = 0xC;
+  static const int XWXY = 0x4C;
+  static const int XWXZ = 0x8C;
+  static const int XWXW = 0xCC;
+  static const int XWYX = 0x1C;
+  static const int XWYY = 0x5C;
+  static const int XWYZ = 0x9C;
+  static const int XWYW = 0xDC;
+  static const int XWZX = 0x2C;
+  static const int XWZY = 0x6C;
+  static const int XWZZ = 0xAC;
+  static const int XWZW = 0xEC;
+  static const int XWWX = 0x3C;
+  static const int XWWY = 0x7C;
+  static const int XWWZ = 0xBC;
+  static const int XWWW = 0xFC;
+  static const int YXXX = 0x1;
+  static const int YXXY = 0x41;
+  static const int YXXZ = 0x81;
+  static const int YXXW = 0xC1;
+  static const int YXYX = 0x11;
+  static const int YXYY = 0x51;
+  static const int YXYZ = 0x91;
+  static const int YXYW = 0xD1;
+  static const int YXZX = 0x21;
+  static const int YXZY = 0x61;
+  static const int YXZZ = 0xA1;
+  static const int YXZW = 0xE1;
+  static const int YXWX = 0x31;
+  static const int YXWY = 0x71;
+  static const int YXWZ = 0xB1;
+  static const int YXWW = 0xF1;
+  static const int YYXX = 0x5;
+  static const int YYXY = 0x45;
+  static const int YYXZ = 0x85;
+  static const int YYXW = 0xC5;
+  static const int YYYX = 0x15;
+  static const int YYYY = 0x55;
+  static const int YYYZ = 0x95;
+  static const int YYYW = 0xD5;
+  static const int YYZX = 0x25;
+  static const int YYZY = 0x65;
+  static const int YYZZ = 0xA5;
+  static const int YYZW = 0xE5;
+  static const int YYWX = 0x35;
+  static const int YYWY = 0x75;
+  static const int YYWZ = 0xB5;
+  static const int YYWW = 0xF5;
+  static const int YZXX = 0x9;
+  static const int YZXY = 0x49;
+  static const int YZXZ = 0x89;
+  static const int YZXW = 0xC9;
+  static const int YZYX = 0x19;
+  static const int YZYY = 0x59;
+  static const int YZYZ = 0x99;
+  static const int YZYW = 0xD9;
+  static const int YZZX = 0x29;
+  static const int YZZY = 0x69;
+  static const int YZZZ = 0xA9;
+  static const int YZZW = 0xE9;
+  static const int YZWX = 0x39;
+  static const int YZWY = 0x79;
+  static const int YZWZ = 0xB9;
+  static const int YZWW = 0xF9;
+  static const int YWXX = 0xD;
+  static const int YWXY = 0x4D;
+  static const int YWXZ = 0x8D;
+  static const int YWXW = 0xCD;
+  static const int YWYX = 0x1D;
+  static const int YWYY = 0x5D;
+  static const int YWYZ = 0x9D;
+  static const int YWYW = 0xDD;
+  static const int YWZX = 0x2D;
+  static const int YWZY = 0x6D;
+  static const int YWZZ = 0xAD;
+  static const int YWZW = 0xED;
+  static const int YWWX = 0x3D;
+  static const int YWWY = 0x7D;
+  static const int YWWZ = 0xBD;
+  static const int YWWW = 0xFD;
+  static const int ZXXX = 0x2;
+  static const int ZXXY = 0x42;
+  static const int ZXXZ = 0x82;
+  static const int ZXXW = 0xC2;
+  static const int ZXYX = 0x12;
+  static const int ZXYY = 0x52;
+  static const int ZXYZ = 0x92;
+  static const int ZXYW = 0xD2;
+  static const int ZXZX = 0x22;
+  static const int ZXZY = 0x62;
+  static const int ZXZZ = 0xA2;
+  static const int ZXZW = 0xE2;
+  static const int ZXWX = 0x32;
+  static const int ZXWY = 0x72;
+  static const int ZXWZ = 0xB2;
+  static const int ZXWW = 0xF2;
+  static const int ZYXX = 0x6;
+  static const int ZYXY = 0x46;
+  static const int ZYXZ = 0x86;
+  static const int ZYXW = 0xC6;
+  static const int ZYYX = 0x16;
+  static const int ZYYY = 0x56;
+  static const int ZYYZ = 0x96;
+  static const int ZYYW = 0xD6;
+  static const int ZYZX = 0x26;
+  static const int ZYZY = 0x66;
+  static const int ZYZZ = 0xA6;
+  static const int ZYZW = 0xE6;
+  static const int ZYWX = 0x36;
+  static const int ZYWY = 0x76;
+  static const int ZYWZ = 0xB6;
+  static const int ZYWW = 0xF6;
+  static const int ZZXX = 0xA;
+  static const int ZZXY = 0x4A;
+  static const int ZZXZ = 0x8A;
+  static const int ZZXW = 0xCA;
+  static const int ZZYX = 0x1A;
+  static const int ZZYY = 0x5A;
+  static const int ZZYZ = 0x9A;
+  static const int ZZYW = 0xDA;
+  static const int ZZZX = 0x2A;
+  static const int ZZZY = 0x6A;
+  static const int ZZZZ = 0xAA;
+  static const int ZZZW = 0xEA;
+  static const int ZZWX = 0x3A;
+  static const int ZZWY = 0x7A;
+  static const int ZZWZ = 0xBA;
+  static const int ZZWW = 0xFA;
+  static const int ZWXX = 0xE;
+  static const int ZWXY = 0x4E;
+  static const int ZWXZ = 0x8E;
+  static const int ZWXW = 0xCE;
+  static const int ZWYX = 0x1E;
+  static const int ZWYY = 0x5E;
+  static const int ZWYZ = 0x9E;
+  static const int ZWYW = 0xDE;
+  static const int ZWZX = 0x2E;
+  static const int ZWZY = 0x6E;
+  static const int ZWZZ = 0xAE;
+  static const int ZWZW = 0xEE;
+  static const int ZWWX = 0x3E;
+  static const int ZWWY = 0x7E;
+  static const int ZWWZ = 0xBE;
+  static const int ZWWW = 0xFE;
+  static const int WXXX = 0x3;
+  static const int WXXY = 0x43;
+  static const int WXXZ = 0x83;
+  static const int WXXW = 0xC3;
+  static const int WXYX = 0x13;
+  static const int WXYY = 0x53;
+  static const int WXYZ = 0x93;
+  static const int WXYW = 0xD3;
+  static const int WXZX = 0x23;
+  static const int WXZY = 0x63;
+  static const int WXZZ = 0xA3;
+  static const int WXZW = 0xE3;
+  static const int WXWX = 0x33;
+  static const int WXWY = 0x73;
+  static const int WXWZ = 0xB3;
+  static const int WXWW = 0xF3;
+  static const int WYXX = 0x7;
+  static const int WYXY = 0x47;
+  static const int WYXZ = 0x87;
+  static const int WYXW = 0xC7;
+  static const int WYYX = 0x17;
+  static const int WYYY = 0x57;
+  static const int WYYZ = 0x97;
+  static const int WYYW = 0xD7;
+  static const int WYZX = 0x27;
+  static const int WYZY = 0x67;
+  static const int WYZZ = 0xA7;
+  static const int WYZW = 0xE7;
+  static const int WYWX = 0x37;
+  static const int WYWY = 0x77;
+  static const int WYWZ = 0xB7;
+  static const int WYWW = 0xF7;
+  static const int WZXX = 0xB;
+  static const int WZXY = 0x4B;
+  static const int WZXZ = 0x8B;
+  static const int WZXW = 0xCB;
+  static const int WZYX = 0x1B;
+  static const int WZYY = 0x5B;
+  static const int WZYZ = 0x9B;
+  static const int WZYW = 0xDB;
+  static const int WZZX = 0x2B;
+  static const int WZZY = 0x6B;
+  static const int WZZZ = 0xAB;
+  static const int WZZW = 0xEB;
+  static const int WZWX = 0x3B;
+  static const int WZWY = 0x7B;
+  static const int WZWZ = 0xBB;
+  static const int WZWW = 0xFB;
+  static const int WWXX = 0xF;
+  static const int WWXY = 0x4F;
+  static const int WWXZ = 0x8F;
+  static const int WWXW = 0xCF;
+  static const int WWYX = 0x1F;
+  static const int WWYY = 0x5F;
+  static const int WWYZ = 0x9F;
+  static const int WWYW = 0xDF;
+  static const int WWZX = 0x2F;
+  static const int WWZY = 0x6F;
+  static const int WWZZ = 0xAF;
+  static const int WWZW = 0xEF;
+  static const int WWWX = 0x3F;
+  static const int WWWY = 0x7F;
+  static const int WWWZ = 0xBF;
+  static const int WWWW = 0xFF;
+
+  /// Shuffle the lane values. [mask] must be one of the 256 shuffle constants.
+  Float32x4 shuffle(int mask);
 
   /// Returns a new [Float32x4] with values in the X and Y lanes
   /// replaced with the values in the Z and W lanes of [other].
diff --git a/sdk/lib/utf/utf.dart b/sdk/lib/utf/utf.dart
index 940ce68..43a2944 100644
--- a/sdk/lib/utf/utf.dart
+++ b/sdk/lib/utf/utf.dart
@@ -2,6 +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.
 
+/**
+ * Support for encoding and decoding Unicode characters in UTF-8, UTF-16, and 
+ * UTF-32.
+ */
 library dart.utf;
 import "dart:async";
 import "dart:collection";
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index d69253a1..08ddefd 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -1,3 +1,6 @@
+/**
+ * High-fidelity audio programming in the browser.
+ */
 library dart.dom.web_audio;
 
 import 'dart:async';
diff --git a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
index 65c742b..010c2db 100644
--- a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
+++ b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
@@ -1,3 +1,6 @@
+/**
+ * 3D programming in the browser.
+ */
 library dart.dom.web_gl;
 
 import 'dart:collection';
diff --git a/tests/co19/co19-analyzer.status b/tests/co19/co19-analyzer.status
index a7f309b..cb4f01a 100644
--- a/tests/co19/co19-analyzer.status
+++ b/tests/co19/co19-analyzer.status
@@ -12,52 +12,21 @@
 
 # invalid argument for constant constructor
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t02: fail
-Language/11_Expressions/01_Constants_A16_t03: fail
-
-# final instance variable created instance of the enclosing class
-Language/11_Expressions/01_Constants_A17_t03: fail
-
-# analyzer problem: forward reference of typedef with type parameters
-Language/13_Libraries_and_Scripts/3_Parts_A02_t03: skip
-
-# not clear: typedef int func2(int);
-Language/14_Types/6_Type_dynamic_A04_t01: fail
 
 # TBF: _f is private, so does not collide
 Language/07_Classes/1_Instance_Methods_A05_t08: fail
 
-# TBF: return without value is not a warning
-Language/12_Statements/11_Return_A07_t01: fail
-
-
 # co19 issue #380, Strings class has been removed
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: fail, OK
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A04_t01: fail, OK
 
-# co19 issue #382, Deprecated parts of String interface is being removed.
-LibTest/core/String/charCodes_A01_t01: fail, OK
-LibTest/core/String/charCodeAt_A02_t01: fail, OK
-LibTest/core/String/charCodeAt_A03_t01: fail, OK
-LibTest/core/String/charCodeAt_A01_t01: fail, OK
-LibTest/core/String/splitChars_A01_t01: fail, OK
-
 # co19 issue #389, ceil, floor, truncate and round return integers
 LibTest/core/int/operator_division_A01_t01: fail, OK
 
-# co19 issue #395, uses dart:io API (outdated)
-Language/15_Reference/1_Lexical_Rules_A01_t10: Fail, OK
-
 # co19 issue #397, List.addLast removed
-Language/11_Expressions/06_Lists_A06_t01: fail, OK
 LibTest/core/Iterable/where_A01_t07: fail, OK
-LibTest/core/List/addLast_A01_t01: fail, OK
-LibTest/core/List/addLast_A01_t03: fail, OK
-LibTest/core/List/addLast_A02_t01: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: fail, OK
 
 # co19 issue #400, collection library reorg
-LibTest/core/List/List.fixedLength_A01_t01: fail, OK
-LibTest/core/List/operator_subscript_A01_t02: fail, OK
 LibTest/core/String/String_class_A01_t01: fail, OK
 LibTest/core/String/concat_A01_t01: fail, OK
 LibTest/core/String/concat_A02_t01: fail, OK
@@ -66,51 +35,20 @@
 LibTest/core/Set/isSubsetOf_A01_t02: fail, OK
 
 # co19 issue #403
-LibTest/core/List/List_A01_t02: fail, OK
 LibTest/core/List/every_A01_t01: fail, OK
-LibTest/core/List/insertRange_A01_t01: fail, OK
-LibTest/core/List/insertRange_A02_t01: fail, OK
-LibTest/core/List/insertRange_A03_t01: fail, OK
-LibTest/core/List/insertRange_A04_t01: fail, OK
-LibTest/core/List/insertRange_A05_t01: fail, OK
-LibTest/core/List/insertRange_A06_t01: fail, OK
-LibTest/core/List/insertRange_A07_t01: fail, OK
-LibTest/core/List/insertRange_A08_t01: fail, OK
-
-# co19 issue #412, using 'null' as operand
-Language/11_Expressions/01_Constants_A11_t01: fail, OK
-Language/11_Expressions/01_Constants_A12_t01: fail, OK
-Language/11_Expressions/01_Constants_A13_t06: fail, OK
 
 # co19 issue #414, extra @compile-error
 Language/03_Overview/1_Scoping_A02_t28: fail, OK
 
 # co19 issue #416, function name is declared the parameter scope
 Language/03_Overview/1_Scoping_A02_t07: fail, OK
-Language/12_Statements/04_Local_Function_Declaration_A01_t01: fail, OK
-
-# co19 issue #420, 'throw' without exception; deprecated; rethrow should be used
-Language/11_Expressions/08_Throw_A05_t01: fail, OK
-Language/11_Expressions/08_Throw_A05_t02: fail, OK
-Language/11_Expressions/08_Throw_A05_t03: fail, OK
-
-# analyzer issue https://code.google.com/p/dart/issues/detail?id=11534
-Language/14_Types/4_Interface_Types_A11_t01: skip
-Language/14_Types/4_Interface_Types_A11_t02: skip
 
 # co19 issue #424, Uninitialized finals are warnings not errors
-Language/05_Variables/05_Variables_A05_t05: fail, OK
-Language/05_Variables/05_Variables_A05_t06: fail, OK
-Language/05_Variables/05_Variables_A05_t07: fail, OK
-Language/05_Variables/05_Variables_A05_t08: fail, OK
-Language/05_Variables/05_Variables_A05_t09: fail, OK
-Language/05_Variables/05_Variables_A05_t10: fail, OK
 Language/05_Variables/05_Variables_A07_t05: fail, OK
 Language/05_Variables/05_Variables_A07_t06: fail, OK
 Language/05_Variables/05_Variables_A07_t07: fail, OK
 Language/05_Variables/05_Variables_A07_t08: fail, OK
 Language/05_Variables/05_Variables_A08_t01: fail, OK
-Language/11_Expressions/11_Instance_Creation/2_Const_A01_t02: fail, OK
 
 # co19 issue #425, Only static fields can be declared as 'const'
 Language/05_Variables/05_Variables_A12_t01: fail, OK
@@ -128,242 +66,24 @@
 
 # co19 issue #431, it is OK to use 'double' argument for const constructor
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t01: fail, OK
-Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t03: fail, OK
 
 # co19 issue #428, number literals with a + prefix
-Language/11_Expressions/01_Constants_A01_t01: fail, OK
-Language/11_Expressions/03_Numbers_A01_t01: fail, OK
-Language/11_Expressions/03_Numbers_A01_t02: fail, OK
-Language/11_Expressions/03_Numbers_A01_t03: fail, OK
-Language/11_Expressions/03_Numbers_A01_t04: fail, OK
-Language/11_Expressions/03_Numbers_A01_t08: fail, OK
-Language/11_Expressions/03_Numbers_A01_t10: fail, OK
-Language/12_Statements/02_Expression_Statements_A01_t06: fail, OK
 LibTest/core/double/ceil_A01_t05: fail, OK
 LibTest/core/double/floor_A01_t05: fail, OK
 
-# co19 issue #385, library name is not required
-Language/13_Libraries_and_Scripts/1_Imports_A04_t03: fail, OK
-Language/13_Libraries_and_Scripts/2_Exports_A05_t01: fail, OK
-
-# co19 issue #388, StringBuffer renamed add to write
-Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t01: fail, OK
-Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t01: fail, OK
-Language/11_Expressions/14_Function_Invocation/1_Actual_Argument_List_Evaluation_A02_t01: fail, OK
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A04_t01: fail, OK
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: fail, OK
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t02: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A04_t01: fail, OK
-LibTest/core/StringBuffer/addAll_A03_t01: fail, OK
-LibTest/core/StringBuffer/add_A01_t01: fail, OK
-LibTest/core/StringBuffer/add_A01_t02: fail, OK
-LibTest/core/StringBuffer/addAll_A01_t01: fail, OK
-LibTest/core/StringBuffer/addAll_A01_t02: fail, OK
-LibTest/core/StringBuffer/isEmpty_A01_t01: fail, OK
-LibTest/core/StringBuffer/toString_A01_t01: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A07_t01: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A08_t01: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A08_t02: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A09_t01: fail, OK
-
-#co19 issue #432, missing @static-warning annotation
-Language/14_Types/8_Parameterized_Types_A03_t03: fail, OK
-Language/14_Types/8_Parameterized_Types_A03_t05: fail, OK
-
-# co19 issue #433, missing @static-warning annotation
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t01: fail, OK
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t07: fail, OK
-
-# co19 issue #434, argument definition was dropped
-Language/11_Expressions/33_Argument_Definition_Test_A01_t02: fail, OK
-#Language/11_Expressions/33_Argument_Definition_Test_A01_t14: fail, OK (this is passing for the wrong reason)
-#Language/11_Expressions/33_Argument_Definition_Test_A01_t18: fail, OK (this is passing for the wrong reason)
-Language/11_Expressions/33_Argument_Definition_Test_A02_t01: fail, OK
-Language/11_Expressions/33_Argument_Definition_Test_A02_t02: fail, OK
-Language/11_Expressions/33_Argument_Definition_Test_A03_t01: fail, OK
-Language/11_Expressions/33_Argument_Definition_Test_A03_t02: fail, OK
-
-# co19 issue #435, AssertionError has not properties
-LibTest/core/AssertionError/column_A01_t02: fail, OK
-LibTest/core/AssertionError/failedAssertion_A01_t01: fail, OK
-LibTest/core/AssertionError/line_A01_t02: fail, OK
-LibTest/core/AssertionError/url_A01_t01: fail, OK
-
 # co19 issue 459, FallThroughError is no longer const
-LibTest/core/FallThroughError/toString_A01_t01: fail, OK
 LibTest/core/FallThroughError/FallThroughError_A01_t01: Fail, OK
 
 # co19 issue #437, annotation should be constant _variable_ or constant constructor invocation
 Language/07_Classes/07_Classes_A01_t20: fail, OK
 Language/07_Classes/07_Classes_A02_t34: fail, OK
 Language/07_Classes/07_Classes_A03_t10: fail, OK
-Language/13_Libraries_and_Scripts/2_Exports_A01_t17: fail, OK
-
-# co19 issue 438, Static variables are initialized lazily, need not be constants
-Language/11_Expressions/01_Constants_A16_t01: fail, OK
-Language/11_Expressions/01_Constants_A16_t02: fail, OK
-
-# co19 issue 439, it is warning, not error to import two different libraries with the same name
-Language/13_Libraries_and_Scripts/1_Imports_A05_t01: fail, OK
-
-# co19 issue #440, adj strings is not a string interpolation
-Language/13_Libraries_and_Scripts/5_URIs_A01_t24: fail, OK
-Language/13_Libraries_and_Scripts/5_URIs_A01_t25: fail, OK
-
-# co19 issue #441, assignment in constructor is not initializing
-Language/05_Variables/05_Variables_A05_t04: fail, OK
-
-# co19 issue #462, const instance creation with invalid arguments is error
-Language/11_Expressions/11_Instance_Creation/2_Const_A09_t02: fail, OK
-Language/11_Expressions/11_Instance_Creation/2_Const_A09_t03: fail, OK
 
 # co19 issue #464, not initialized final instance variable is warning, not error
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: fail
 
 # co19 issue #442, undefined name "Expect"
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A17_t04: fail, OK
-Language/07_Classes/6_Constructors/2_Factories_A06_t03: fail, OK
-Language/09_Generics/09_Generics_A05_t02: fail, OK
-Language/09_Generics/09_Generics_A05_t01: fail, OK
-Language/11_Expressions/04_Booleans/1_Boolean_Conversion_A01_t01: fail, OK
-Language/11_Expressions/04_Booleans/1_Boolean_Conversion_A02_t01: fail, OK
-Language/11_Expressions/06_Lists_A09_t01: fail, OK
-Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A02_t01: fail, OK
-Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A03_t01: fail, OK
-Language/11_Expressions/18_Assignment_A02_t01: fail, OK
-Language/11_Expressions/18_Assignment_A04_t06: fail, OK
-Language/11_Expressions/18_Assignment_A06_t01: fail, OK
-Language/11_Expressions/19_Conditional_A02_t03: fail, OK
-Language/11_Expressions/19_Conditional_A02_t04: fail, OK
-Language/11_Expressions/19_Conditional_A04_t03: fail, OK
-Language/11_Expressions/27_Unary_Expressions_A02_t03: fail, OK
-Language/12_Statements/03_Variable_Declaration_A01_t01: fail, OK
-Language/12_Statements/03_Variable_Declaration_A01_t02: fail, OK
-Language/12_Statements/05_If_A02_t01: fail, OK
-Language/12_Statements/05_If_A02_t02: fail, OK
-Language/12_Statements/10_Try_A01_t01: fail, OK
-Language/12_Statements/11_Return_A03_t02: fail, OK
-Language/12_Statements/11_Return_A04_t01: fail, OK
-Language/12_Statements/15_Assert_A03_t03: fail, OK
-Language/12_Statements/15_Assert_A03_t09: fail, OK
-Language/12_Statements/15_Assert_A03_t08: fail, OK
-Language/12_Statements/15_Assert_A04_t02: fail, OK
-Language/14_Types/2_Dynamic_Type_System_A01_t01: fail, OK
-Language/14_Types/4_Interface_Types_A08_t03: fail, OK
-Language/14_Types/7_Type_Void_A04_t02: fail, OK
-Language/15_Reference/1_Lexical_Rules/2_Comments_A04_t03: fail, OK
-LibTest/core/AssertionError/toString_A01_t01: fail, OK
-LibTest/core/Date/add_A01_t01: fail, OK
-LibTest/core/Date/add_A03_t01: fail, OK
-LibTest/core/Date/add_A02_t01: fail, OK
-LibTest/core/Date/add_A05_t01: fail, OK
-LibTest/core/Date/compareTo_A01_t01: fail, OK
-LibTest/core/Date/compareTo_A02_t01: fail, OK
-LibTest/core/Date/compareTo_A03_t01: fail, OK
-LibTest/core/Date/compareTo_A01_t02: fail, OK
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A01_t01: fail, OK
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A01_t02: fail, OK
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A02_t01: fail, OK
-LibTest/core/Date/Date.fromString_A01_t01: fail, OK
-LibTest/core/Date/Date.fromString_A01_t02: fail, OK
-LibTest/core/Date/Date.fromString_A02_t01: fail, OK
-LibTest/core/Date/Date.fromString_A03_t01: fail, OK
-LibTest/core/Date/Date.now_A01_t01: fail, OK
-LibTest/core/Date/Date.now_A01_t02: fail, OK
-LibTest/core/Date/Date.now_A01_t03: fail, OK
-LibTest/core/Date/Date.utc_A01_t01: fail, OK
-LibTest/core/Date/Date_A01_t01: fail, OK
-LibTest/core/Date/Date_A01_t03: fail, OK
-LibTest/core/Date/Date_A01_t02: fail, OK
-LibTest/core/Date/Date_A01_t04: fail, OK
-LibTest/core/Date/day_A01_t01: fail, OK
-LibTest/core/Date/difference_A01_t01: fail, OK
-LibTest/core/Date/difference_A01_t02: fail, OK
-LibTest/core/Date/difference_A02_t01: fail, OK
-LibTest/core/Date/hour_A01_t01: fail, OK
-LibTest/core/Date/isUtc_A01_t01: fail, OK
-LibTest/core/Date/millisecond_A01_t01: fail, OK
-LibTest/core/Date/millisecondsSinceEpoch_A01_t01: fail, OK
-LibTest/core/Date/minute_A01_t01: fail, OK
-LibTest/core/Date/month_A01_t01: fail, OK
-LibTest/core/Date/operator_equality_A01_t01: fail, OK
-LibTest/core/Date/operator_GE_A01_t01: fail, OK
-LibTest/core/Date/operator_GT_A01_t01: fail, OK
-LibTest/core/Date/operator_LE_A01_t01: fail, OK
-LibTest/core/Date/operator_LT_A01_t01: fail, OK
-LibTest/core/Date/second_A01_t01: fail, OK
-LibTest/core/Date/subtract_A01_t01: fail, OK
-LibTest/core/Date/subtract_A03_t01: fail, OK
-LibTest/core/Date/subtract_A02_t01: fail, OK
-LibTest/core/Date/subtract_A05_t01: fail, OK
-LibTest/core/Date/timeZoneName_A01_t01: fail, OK
-LibTest/core/Date/timeZoneOffset_A01_t01: fail, OK
-LibTest/core/Date/toLocal_A01_t01: fail, OK
-LibTest/core/Date/toString_A01_t01: fail, OK
-LibTest/core/Date/toString_A02_t01: fail, OK
-LibTest/core/Date/toUtc_A01_t01: fail, OK
-LibTest/core/Date/year_A01_t01: fail, OK
-LibTest/core/Date/weekday_A01_t01: fail, OK
-LibTest/core/List/getRange_A06_t01: fail, OK
-LibTest/core/List/indexOf_A06_t01: fail, OK
-LibTest/core/List/operator_subscript_A03_t01: fail, OK
-LibTest/core/List/operator_subscripted_assignment_A03_t01: fail, OK
-LibTest/core/Map/putIfAbsent_A01_t04: fail, OK
-LibTest/core/Strings/concatAll_A04_t01: fail, OK
-LibTest/core/Strings/join_A04_t01: fail, OK
-
-# co19 issue #443, Undefined class 'InvocationMirror'
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: fail, OK
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: fail, OK
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: fail, OK
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t06: fail, OK
-Language/11_Expressions/17_Getter_Invocation_A02_t01: fail, OK
-Language/11_Expressions/17_Getter_Invocation_A02_t02: fail, OK
-
-# co19 issue #444, AsyncError has been removed
-LibTest/async/Completer/complete_A02_t02: fail, OK
-LibTest/async/Completer/completeError_A01_t01: fail, OK
-LibTest/async/Completer/completeError_A03_t02: fail, OK
-LibTest/async/Future/catchError_A01_t01: fail, OK
-LibTest/async/Future/catchError_A01_t02: fail, OK
-LibTest/async/Future/catchError_A02_t01: fail, OK
-LibTest/async/Future/catchError_A03_t01: fail, OK
-LibTest/async/Future/catchError_A03_t02: fail, OK
-LibTest/async/Future/catchError_A03_t03: fail, OK
-LibTest/async/Future/forEach_A03_t01: fail, OK
-LibTest/async/Future/Future.delayed_A02_t01: fail, OK
-LibTest/async/Future/then_A02_t01: fail, OK
-LibTest/async/Future/then_A02_t02: fail, OK
-LibTest/async/Future/then_A03_t01: fail, OK
-LibTest/async/Future/then_A04_t01: fail, OK
-LibTest/async/Future/whenComplete_A03_t01: fail, OK
-LibTest/async/Future/whenComplete_A04_t02: fail, OK
-
-# co19 issue #445, Future.immediate was repalce with Future.value
-LibTest/async/Future/asStream_A01_t01: fail, OK
-LibTest/async/Future/asStream_A01_t02: fail, OK
-LibTest/async/Future/asStream_A02_t01: fail, OK
-LibTest/async/Future/Future.immediate_A01_t01: fail, OK
-LibTest/async/Future/Future.immediateError_A01_t01: fail, OK
-LibTest/async/Future/then_A01_t03: fail, OK
-
-# co19 issue #446, Date was replaced with DateTime
-Language/14_Types/6_Type_dynamic_A03_t01: fail, OK
-
-# co19 issue 447, In Future delayed int replaced with Duration
-LibTest/async/Future/asStream_A01_t02: fail, OK
-LibTest/async/Future/asStream_A02_t01: fail, OK
-LibTest/async/Future/forEach_A01_t01: fail, OK
-LibTest/async/Future/forEach_A02_t01: fail, OK
-LibTest/async/Future/then_A01_t03: fail, OK
-LibTest/async/Future/wait_A01_t01: fail, OK
-LibTest/async/Future/wait_A01_t04: fail, OK
-LibTest/async/Future/wait_A01_t05: fail, OK
-LibTest/async/Future/wait_A01_t06: fail, OK
-LibTest/async/Future/whenComplete_A01_t01: fail, OK
-LibTest/async/Future/whenComplete_A02_t01: fail, OK
-LibTest/async/Future/whenComplete_A04_t01: fail, OK
+Language/15_Types/4_Interface_Types_A08_t03: fail, OK
 
 # co19 issue #448, Collection was removed
 LibTest/collection/Queue/Queue.from_A01_t01: fail, OK
@@ -374,83 +94,14 @@
 LibTest/core/RegExp/allMatches_A01_t01: fail, OK
 LibTest/core/Set/intersection_A01_t02: fail, OK
 
-# co19 issue #449, Strings was removed
-LibTest/core/Strings/concatAll_A01_t01: fail, OK
-LibTest/core/Strings/concatAll_A02_t01: fail, OK
-LibTest/core/Strings/concatAll_A03_t01: fail, OK
-LibTest/core/Strings/join_A01_t01: fail, OK
-LibTest/core/Strings/join_A02_t01: fail, OK
-LibTest/core/Strings/join_A03_t01: fail, OK
-
-# co19 issue #450, The class 'List' does not have a constructor 'fixedLength'
-LibTest/core/List/add_A02_t01: fail, OK
-LibTest/core/List/addAll_A02_t01: fail, OK
-LibTest/core/List/clear_A02_t01: fail, OK
-LibTest/core/List/length_A04_t01: fail, OK
-LibTest/core/List/removeLast_A02_t01: fail, OK
-LibTest/core/List/removeRange_A02_t01: fail, OK
-
-# co19 issue 451, Set.intersection() requires Set argument
-LibTest/core/Set/intersection_A01_t01: fail, OK
-LibTest/core/Set/intersection_A01_t03: fail, OK
-LibTest/core/Set/intersection_A03_t01: fail, OK
-
 # co19 issue 452, more method in Iterable
 LibTest/core/Set/Set.from_A01_t02: fail, OK
 
-# co19 issue #453, abstract member in concrete class
-Language/07_Classes/07_Classes_A07_t10: fail, OK
-
-# co19 issue #454, should be static warning
-Language/11_Expressions/11_Instance_Creation/1_New_A01_t04: fail, OK
-
 # co19 issue #455, undeclared identifier is static warning
-Language/13_Libraries_and_Scripts/1_Imports_A02_t14: fail, OK
-
-# co19 issue #456
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t04: fail, OK
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t05: fail, OK
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t08: fail, OK
-
-# co19 issue 457, malformed type is static warning
-Language/11_Expressions/31_Type_Test_A05_t01: fail, OK
-Language/11_Expressions/31_Type_Test_A05_t02: fail, OK
-Language/11_Expressions/31_Type_Test_A05_t03: fail, OK
-Language/11_Expressions/32_Type_Cast_A04_t01: fail, OK
-Language/11_Expressions/32_Type_Cast_A04_t02: fail, OK
-
-# co19 issue #465, any use of a malbounded type gives rise to a static warning.
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t01: fail, OK
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t02: fail, OK
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t03: fail, OK
-Language/11_Expressions/11_Instance_Creation_A03_t01: fail, OK
-Language/11_Expressions/11_Instance_Creation_A04_t01: fail, OK
-Language/11_Expressions/11_Instance_Creation_A04_t02: fail, OK
-
-# co19 issue #481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t02: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t05: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t08: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t09: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t10: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t22: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t25: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t29: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t28: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t30: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t42: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t45: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t48: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t49: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t50: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t62: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t65: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t68: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t69: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t70: fail, OK
-
-# co19 issue 483, instance access to static member
-Language/11_Expressions/15_Method_Invocation/2_Cascaded_Invocation_A01_t19: fail, OK
+Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t10: fail, OK
+Language/13_Statements/04_Local_Function_Declaration_A02_t02: fail, OK
+Language/14_Libraries_and_Scripts/1_Imports_A02_t12: fail, OK
+Language/14_Libraries_and_Scripts/1_Imports_A02_t15: fail, OK
 
 # co19 issue #486, some override errors are now warnings
 Language/07_Classes/1_Instance_Methods_A01_t01: fail, OK
@@ -472,5 +123,190 @@
 Language/07_Classes/4_Abstract_Instance_Members_A04_t05: fail, OK
 Language/07_Classes/4_Abstract_Instance_Members_A04_t06: fail, OK
 
-# co19 issue #487, Function type T may be assigned to function type T iff T <: S
-Language/14_Types/5_Function_Types_A01_t01: fail, OK
+# co19-roll r546 (11.08.2013) caused these failures
+Language/05_Variables/05_Variables_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t01: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t04: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A04_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A11_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A12_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A13_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A17_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t08: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t10: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/06_Lists_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A01_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t08: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t12: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A09_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A09_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation_A01_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation_A01_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation_A01_t08: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/2_Cascaded_Invocation_A01_t19: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/02_Expression_Statements_A01_t06: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/04_Local_Function_Declaration_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Return_A07_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t27: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t47: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t67: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/2_Exports_A01_t17: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/2_Exports_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t24: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t25: fail # co19-roll r546: Please triage this failure
+Language/15_Types/1_Static_Types_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/5_Function_Types_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/6_Type_dynamic_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/6_Type_dynamic_A04_t01: fail # co19-roll r546: Please triage this failure
+Language/16_Reference/1_Lexical_Rules/2_Comments_A04_t03: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/asBroadcastStream_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/distinct_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/distinct_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/drain_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/drain_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/EventTransformStream_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/expand_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/first_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/handleError_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/listen_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/listen_A04_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/transform_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/where_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Future/asStream_A01_t02: pass # co19-roll r546: Please triage this failure
+LibTest/async/Future/asStream_A02_t01: pass # co19-roll r546: Please triage this failure
+LibTest/async/Future/whenComplete_A03_t01: pass # co19-roll r546: Please triage this failure
+LibTest/async/Stream/asBroadcastStream_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/asBroadcastStream_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/contains_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/hasListener_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/hasListener_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/isClosed_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/isClosed_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/isPaused_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/isPaused_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/sink_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/StreamController.broadcast_A04_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/distinct_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/distinct_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/drain_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/drain_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamEventTransformer/handleData_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamEventTransformer/handleDone_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamEventTransformer/handleError_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/expand_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/handleError_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/isBroadcast_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/isBroadcast_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamIterator/cancel_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/listen_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/listen_A04_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamSink/close_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.fromFuture_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.fromFuture_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.fromIterable_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.periodic_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/transform_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/where_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/cancel_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer.periodic_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer.periodic_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/compareTo_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/isAtSameMomentAs_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/subtract_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/double/parse_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_div_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_eq_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_gt_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_gte_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_lt_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_lte_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_minus_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_mult_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_plus_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/FallThroughError/toString_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/ceilToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/floorToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/roundToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/truncateToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/asMap_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/every_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/forEach_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/join_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/lastWhere_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List.filled_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List.from_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List.generate_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List.generate_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List.generate_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/map_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/removeAt_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/replaceRange_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/replaceRange_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/skipWhile_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/takeWhile_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/toList_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/toList_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/toSet_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/StringBuffer/writeAll_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnFunction_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/streamSpawnFunction_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/add_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/addError_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/addError_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/operator_equality_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/any_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/asBroadcastStream_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/contains_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/contains_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/isBroadcast_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/last_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/length_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/single_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A02_t03: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A02_t04: fail # co19-roll r546: Please triage this failure
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index 116302e..67c183c 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -12,52 +12,21 @@
 
 # invalid argument for constant constructor
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t02: fail
-Language/11_Expressions/01_Constants_A16_t03: fail
-
-# final instance variable created instance of the enclosing class
-Language/11_Expressions/01_Constants_A17_t03: fail
-
-# analyzer problem: forward reference of typedef with type parameters
-Language/13_Libraries_and_Scripts/3_Parts_A02_t03: skip
-
-# not clear: typedef int func2(int);
-Language/14_Types/6_Type_dynamic_A04_t01: fail
 
 # TBF: _f is private, so does not collide
 Language/07_Classes/1_Instance_Methods_A05_t08: fail
 
-# TBF: return without value is not a warning
-Language/12_Statements/11_Return_A07_t01: fail
-
-
 # co19 issue #380, Strings class has been removed
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: fail, OK
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A04_t01: fail, OK
 
-# co19 issue #382, Deprecated parts of String interface is being removed.
-LibTest/core/String/charCodes_A01_t01: fail, OK
-LibTest/core/String/charCodeAt_A02_t01: fail, OK
-LibTest/core/String/charCodeAt_A03_t01: fail, OK
-LibTest/core/String/charCodeAt_A01_t01: fail, OK
-LibTest/core/String/splitChars_A01_t01: fail, OK
-
 # co19 issue #389, ceil, floor, truncate and round return integers
-LibTest/core/int/operator_division_A01_t01: fail
-
-# co19 issue #395, uses dart:io API (outdated)
-Language/15_Reference/1_Lexical_Rules_A01_t10: Fail, OK
+LibTest/core/int/operator_division_A01_t01: fail, OK
 
 # co19 issue #397, List.addLast removed
-Language/11_Expressions/06_Lists_A06_t01: fail, OK
 LibTest/core/Iterable/where_A01_t07: fail, OK
-LibTest/core/List/addLast_A01_t01: fail, OK
-LibTest/core/List/addLast_A01_t03: fail, OK
-LibTest/core/List/addLast_A02_t01: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: fail, OK
 
 # co19 issue #400, collection library reorg
-LibTest/core/List/List.fixedLength_A01_t01: fail, OK
-LibTest/core/List/operator_subscript_A01_t02: fail, OK
 LibTest/core/String/String_class_A01_t01: fail, OK
 LibTest/core/String/concat_A01_t01: fail, OK
 LibTest/core/String/concat_A02_t01: fail, OK
@@ -66,51 +35,24 @@
 LibTest/core/Set/isSubsetOf_A01_t02: fail, OK
 
 # co19 issue #403
-LibTest/core/List/List_A01_t02: fail, OK
 LibTest/core/List/every_A01_t01: fail, OK
-LibTest/core/List/insertRange_A01_t01: fail, OK
-LibTest/core/List/insertRange_A02_t01: fail, OK
-LibTest/core/List/insertRange_A03_t01: fail, OK
-LibTest/core/List/insertRange_A04_t01: fail, OK
-LibTest/core/List/insertRange_A05_t01: fail, OK
-LibTest/core/List/insertRange_A06_t01: fail, OK
-LibTest/core/List/insertRange_A07_t01: fail, OK
-LibTest/core/List/insertRange_A08_t01: fail, OK
-
-# co19 issue #412, using 'null' as operand
-Language/11_Expressions/01_Constants_A11_t01: fail, OK
-Language/11_Expressions/01_Constants_A12_t01: fail, OK
-Language/11_Expressions/01_Constants_A13_t06: fail, OK
 
 # co19 issue #414, extra @compile-error
 Language/03_Overview/1_Scoping_A02_t28: fail, OK
 
 # co19 issue #416, function name is declared the parameter scope
 Language/03_Overview/1_Scoping_A02_t07: fail, OK
-Language/12_Statements/04_Local_Function_Declaration_A01_t01: fail, OK
-
-# co19 issue #420, 'throw' without exception; deprecated; rethrow should be used
-Language/11_Expressions/08_Throw_A05_t01: fail, OK
-Language/11_Expressions/08_Throw_A05_t02: fail, OK
-Language/11_Expressions/08_Throw_A05_t03: fail, OK
 
 # analyzer issue https://code.google.com/p/dart/issues/detail?id=11534
-Language/14_Types/4_Interface_Types_A11_t01: skip
-Language/14_Types/4_Interface_Types_A11_t02: skip
+Language/15_Types/4_Interface_Types_A11_t01: Skip
+Language/15_Types/4_Interface_Types_A11_t02: Skip
 
 # co19 issue #424, Uninitialized finals are warnings not errors
-Language/05_Variables/05_Variables_A05_t05: fail, OK
-Language/05_Variables/05_Variables_A05_t06: fail, OK
-Language/05_Variables/05_Variables_A05_t07: fail, OK
-Language/05_Variables/05_Variables_A05_t08: fail, OK
-Language/05_Variables/05_Variables_A05_t09: fail, OK
-Language/05_Variables/05_Variables_A05_t10: fail, OK
 Language/05_Variables/05_Variables_A07_t05: fail, OK
 Language/05_Variables/05_Variables_A07_t06: fail, OK
 Language/05_Variables/05_Variables_A07_t07: fail, OK
 Language/05_Variables/05_Variables_A07_t08: fail, OK
 Language/05_Variables/05_Variables_A08_t01: fail, OK
-Language/11_Expressions/11_Instance_Creation/2_Const_A01_t02: fail, OK
 
 # co19 issue #425, Only static fields can be declared as 'const'
 Language/05_Variables/05_Variables_A12_t01: fail, OK
@@ -128,243 +70,26 @@
 
 # co19 issue #431, it is OK to use 'double' argument for const constructor
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t01: fail, OK
-Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t03: fail, OK
 
 # co19 issue #428, number literals with a + prefix
-Language/11_Expressions/01_Constants_A01_t01: fail, OK
-Language/11_Expressions/03_Numbers_A01_t01: fail, OK
-Language/11_Expressions/03_Numbers_A01_t02: fail, OK
-Language/11_Expressions/03_Numbers_A01_t03: fail, OK
-Language/11_Expressions/03_Numbers_A01_t04: fail, OK
-Language/11_Expressions/03_Numbers_A01_t08: fail, OK
-Language/11_Expressions/03_Numbers_A01_t10: fail, OK
-Language/12_Statements/02_Expression_Statements_A01_t06: fail, OK
 LibTest/core/double/ceil_A01_t05: fail, OK
 LibTest/core/double/floor_A01_t05: fail, OK
 
-# co19 issue #385, library name is not required
-Language/13_Libraries_and_Scripts/1_Imports_A04_t03: fail, OK
-Language/13_Libraries_and_Scripts/2_Exports_A05_t01: fail, OK
-
-# co19 issue #388, StringBuffer renamed add to write
-Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t01: fail, OK
-Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t01: fail, OK
-Language/11_Expressions/14_Function_Invocation/1_Actual_Argument_List_Evaluation_A02_t01: fail, OK
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A04_t01: fail, OK
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: fail, OK
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t02: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A04_t01: fail, OK
-LibTest/core/StringBuffer/addAll_A03_t01: fail, OK
-LibTest/core/StringBuffer/add_A01_t01: fail, OK
-LibTest/core/StringBuffer/add_A01_t02: fail, OK
-LibTest/core/StringBuffer/addAll_A01_t01: fail, OK
-LibTest/core/StringBuffer/addAll_A01_t02: fail, OK
-LibTest/core/StringBuffer/isEmpty_A01_t01: fail, OK
-LibTest/core/StringBuffer/toString_A01_t01: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A07_t01: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A08_t01: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A08_t02: fail, OK
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A09_t01: fail, OK
-
-#co19 issue #432, missing @static-warning annotation
-Language/14_Types/8_Parameterized_Types_A03_t03: fail,OK
-Language/14_Types/8_Parameterized_Types_A03_t05: fail,OK
-
-# co19 issue #433, missing @static-warning annotation
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t01: fail, OK
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t07: fail, OK
-
 # co19 issue #434, argument definition was dropped
-Language/11_Expressions/33_Argument_Definition_Test_A01_t02: fail, OK
 #Language/11_Expressions/33_Argument_Definition_Test_A01_t14: fail, OK (this is passing for the wrong reason)
 #Language/11_Expressions/33_Argument_Definition_Test_A01_t18: fail, OK (this is passing for the wrong reason)
-Language/11_Expressions/33_Argument_Definition_Test_A02_t01: fail, OK
-Language/11_Expressions/33_Argument_Definition_Test_A02_t02: fail, OK
-Language/11_Expressions/33_Argument_Definition_Test_A03_t01: fail, OK
-Language/11_Expressions/33_Argument_Definition_Test_A03_t02: fail, OK
-
-# co19 issue #435, AssertionError has not properties
-LibTest/core/AssertionError/column_A01_t02: fail, OK
-LibTest/core/AssertionError/failedAssertion_A01_t01: fail, OK
-LibTest/core/AssertionError/line_A01_t02: fail, OK
-LibTest/core/AssertionError/url_A01_t01: fail, OK
 
 # co19 issue 459, FallThroughError is no longer const
-LibTest/core/FallThroughError/toString_A01_t01: Fail
-LibTest/core/FallThroughError/FallThroughError_A01_t01: Fail
+LibTest/core/FallThroughError/FallThroughError_A01_t01: Fail, OK
 
 # co19 issue #437, annotation should be constant _variable_ or constant constructor invocation
 Language/07_Classes/07_Classes_A01_t20: fail, OK
 Language/07_Classes/07_Classes_A02_t34: fail, OK
 Language/07_Classes/07_Classes_A03_t10: fail, OK
-Language/13_Libraries_and_Scripts/2_Exports_A01_t17: fail, OK
-
-# co19 issue 438, Static variables are initialized lazily, need not be constants
-Language/11_Expressions/01_Constants_A16_t01: fail, OK
-Language/11_Expressions/01_Constants_A16_t02: fail, OK
-
-# co19 issue 439, it is warning, not error to import two different libraries with the same name
-Language/13_Libraries_and_Scripts/1_Imports_A05_t01: fail, OK
-
-# co19 issue #440, adj strings is not a string interpolation
-Language/13_Libraries_and_Scripts/5_URIs_A01_t24: fail, OK
-Language/13_Libraries_and_Scripts/5_URIs_A01_t25: fail, OK
-
-# co19 issue #441, assignment in constructor is not initializing
-Language/05_Variables/05_Variables_A05_t04: fail, OK
-
-# co19 issue #462, const instance creation with invalid arguments is error
-Language/11_Expressions/11_Instance_Creation/2_Const_A09_t02: fail, OK
-Language/11_Expressions/11_Instance_Creation/2_Const_A09_t03: fail, OK
 
 # co19 issue #464, not initialized final instance variable is warning, not error
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: fail
 
-# co19 issue #442, undefined name "Expect"
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A17_t04: fail, OK
-Language/07_Classes/6_Constructors/2_Factories_A06_t03: fail, OK
-Language/09_Generics/09_Generics_A05_t02: fail, OK
-Language/09_Generics/09_Generics_A05_t01: fail, OK
-Language/11_Expressions/04_Booleans/1_Boolean_Conversion_A01_t01: fail, OK
-Language/11_Expressions/04_Booleans/1_Boolean_Conversion_A02_t01: fail, OK
-Language/11_Expressions/06_Lists_A09_t01: fail, OK
-Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A02_t01: fail, OK
-Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A03_t01: fail, OK
-Language/11_Expressions/18_Assignment_A02_t01: fail, OK
-Language/11_Expressions/18_Assignment_A04_t06: fail, OK
-Language/11_Expressions/18_Assignment_A06_t01: fail, OK
-Language/11_Expressions/19_Conditional_A02_t03: fail, OK
-Language/11_Expressions/19_Conditional_A02_t04: fail, OK
-Language/11_Expressions/19_Conditional_A04_t03: fail, OK
-Language/11_Expressions/27_Unary_Expressions_A02_t03: fail, OK
-Language/12_Statements/03_Variable_Declaration_A01_t01: fail, OK
-Language/12_Statements/03_Variable_Declaration_A01_t02: fail, OK
-Language/12_Statements/05_If_A02_t01: fail, OK
-Language/12_Statements/05_If_A02_t02: fail, OK
-Language/12_Statements/10_Try_A01_t01: fail, OK
-Language/12_Statements/11_Return_A03_t02: fail, OK
-Language/12_Statements/11_Return_A04_t01: fail, OK
-Language/12_Statements/15_Assert_A03_t03: fail, OK
-Language/12_Statements/15_Assert_A03_t09: fail, OK
-Language/12_Statements/15_Assert_A03_t08: fail, OK
-Language/12_Statements/15_Assert_A04_t02: fail, OK
-Language/14_Types/2_Dynamic_Type_System_A01_t01: fail, OK
-Language/14_Types/4_Interface_Types_A08_t03: fail, OK
-Language/14_Types/7_Type_Void_A04_t02: fail, OK
-Language/15_Reference/1_Lexical_Rules/2_Comments_A04_t03: fail, OK
-LibTest/core/AssertionError/toString_A01_t01: fail, OK
-LibTest/core/Date/add_A01_t01: fail, OK
-LibTest/core/Date/add_A03_t01: fail, OK
-LibTest/core/Date/add_A02_t01: fail, OK
-LibTest/core/Date/add_A05_t01: fail, OK
-LibTest/core/Date/compareTo_A01_t01: fail, OK
-LibTest/core/Date/compareTo_A02_t01: fail, OK
-LibTest/core/Date/compareTo_A03_t01: fail, OK
-LibTest/core/Date/compareTo_A01_t02: fail, OK
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A01_t01: fail, OK
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A01_t02: fail, OK
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A02_t01: fail, OK
-LibTest/core/Date/Date.fromString_A01_t01: fail, OK
-LibTest/core/Date/Date.fromString_A01_t02: fail, OK
-LibTest/core/Date/Date.fromString_A02_t01: fail, OK
-LibTest/core/Date/Date.fromString_A03_t01: fail, OK
-LibTest/core/Date/Date.now_A01_t01: fail, OK
-LibTest/core/Date/Date.now_A01_t02: fail, OK
-LibTest/core/Date/Date.now_A01_t03: fail, OK
-LibTest/core/Date/Date.utc_A01_t01: fail, OK
-LibTest/core/Date/Date_A01_t01: fail, OK
-LibTest/core/Date/Date_A01_t03: fail, OK
-LibTest/core/Date/Date_A01_t02: fail, OK
-LibTest/core/Date/Date_A01_t04: fail, OK
-LibTest/core/Date/day_A01_t01: fail, OK
-LibTest/core/Date/difference_A01_t01: fail, OK
-LibTest/core/Date/difference_A01_t02: fail, OK
-LibTest/core/Date/difference_A02_t01: fail, OK
-LibTest/core/Date/hour_A01_t01: fail, OK
-LibTest/core/Date/isUtc_A01_t01: fail, OK
-LibTest/core/Date/millisecond_A01_t01: fail, OK
-LibTest/core/Date/millisecondsSinceEpoch_A01_t01: fail, OK
-LibTest/core/Date/minute_A01_t01: fail, OK
-LibTest/core/Date/month_A01_t01: fail, OK
-LibTest/core/Date/operator_equality_A01_t01: fail, OK
-LibTest/core/Date/operator_GE_A01_t01: fail, OK
-LibTest/core/Date/operator_GT_A01_t01: fail, OK
-LibTest/core/Date/operator_LE_A01_t01: fail, OK
-LibTest/core/Date/operator_LT_A01_t01: fail, OK
-LibTest/core/Date/second_A01_t01: fail, OK
-LibTest/core/Date/subtract_A01_t01: fail, OK
-LibTest/core/Date/subtract_A03_t01: fail, OK
-LibTest/core/Date/subtract_A02_t01: fail, OK
-LibTest/core/Date/subtract_A05_t01: fail, OK
-LibTest/core/Date/timeZoneName_A01_t01: fail, OK
-LibTest/core/Date/timeZoneOffset_A01_t01: fail, OK
-LibTest/core/Date/toLocal_A01_t01: fail, OK
-LibTest/core/Date/toString_A01_t01: fail, OK
-LibTest/core/Date/toString_A02_t01: fail, OK
-LibTest/core/Date/toUtc_A01_t01: fail, OK
-LibTest/core/Date/year_A01_t01: fail, OK
-LibTest/core/Date/weekday_A01_t01: fail, OK
-LibTest/core/List/getRange_A06_t01: fail, OK
-LibTest/core/List/indexOf_A06_t01: fail, OK
-LibTest/core/List/operator_subscript_A03_t01: fail, OK
-LibTest/core/List/operator_subscripted_assignment_A03_t01: fail, OK
-LibTest/core/Map/putIfAbsent_A01_t04: fail, OK
-LibTest/core/Strings/concatAll_A04_t01: fail, OK
-LibTest/core/Strings/join_A04_t01: fail, OK
-
-# co19 issue #443, Undefined class 'InvocationMirror'
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: fail, OK
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: fail, OK
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: fail, OK
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t06: fail, OK
-Language/11_Expressions/17_Getter_Invocation_A02_t01: fail, OK
-Language/11_Expressions/17_Getter_Invocation_A02_t02: fail, OK
-
-# co19 issue #444, AsyncError has been removed
-LibTest/async/Completer/complete_A02_t02: fail, OK
-LibTest/async/Completer/completeError_A01_t01: fail, OK
-LibTest/async/Completer/completeError_A03_t02: fail, OK
-LibTest/async/Future/catchError_A01_t01: fail, OK
-LibTest/async/Future/catchError_A01_t02: fail, OK
-LibTest/async/Future/catchError_A02_t01: fail, OK
-LibTest/async/Future/catchError_A03_t01: fail, OK
-LibTest/async/Future/catchError_A03_t02: fail, OK
-LibTest/async/Future/catchError_A03_t03: fail, OK
-LibTest/async/Future/forEach_A03_t01: fail, OK
-LibTest/async/Future/Future.delayed_A02_t01: fail, OK
-LibTest/async/Future/then_A02_t01: fail, OK
-LibTest/async/Future/then_A02_t02: fail, OK
-LibTest/async/Future/then_A03_t01: fail, OK
-LibTest/async/Future/then_A04_t01: fail, OK
-LibTest/async/Future/whenComplete_A03_t01: fail, OK
-LibTest/async/Future/whenComplete_A04_t02: fail, OK
-
-# co19 issue #445, Future.immediate was repalce with Future.value
-LibTest/async/Future/asStream_A01_t01: fail, OK
-LibTest/async/Future/asStream_A01_t02: fail, OK
-LibTest/async/Future/asStream_A02_t01: fail, OK
-LibTest/async/Future/Future.immediate_A01_t01: fail, OK
-LibTest/async/Future/Future.immediateError_A01_t01: fail, OK
-LibTest/async/Future/then_A01_t03: fail, OK
-
-# co19 issue #446, Date was replaced with DateTime
-Language/14_Types/6_Type_dynamic_A03_t01: fail, OK
-
-# co19 issue 447, In Future delayed int replaced with Duration
-LibTest/async/Future/asStream_A01_t02: fail, OK
-LibTest/async/Future/asStream_A02_t01: fail, OK
-LibTest/async/Future/forEach_A01_t01: fail, OK
-LibTest/async/Future/forEach_A02_t01: fail, OK
-LibTest/async/Future/then_A01_t03: fail, OK
-LibTest/async/Future/wait_A01_t01: fail, OK
-LibTest/async/Future/wait_A01_t04: fail, OK
-LibTest/async/Future/wait_A01_t05: fail, OK
-LibTest/async/Future/wait_A01_t06: fail, OK
-LibTest/async/Future/whenComplete_A01_t01: fail, OK
-LibTest/async/Future/whenComplete_A02_t01: fail, OK
-LibTest/async/Future/whenComplete_A04_t01: fail, OK
-
 # co19 issue #448, Collection was removed
 LibTest/collection/Queue/Queue.from_A01_t01: fail, OK
 LibTest/collection/Queue/Queue.from_A01_t02: fail, OK
@@ -374,81 +99,189 @@
 LibTest/core/RegExp/allMatches_A01_t01: fail, OK
 LibTest/core/Set/intersection_A01_t02: fail, OK
 
-# co19 issue #449, Strings was removed
-LibTest/core/Strings/concatAll_A01_t01: fail, OK
-LibTest/core/Strings/concatAll_A02_t01: fail, OK
-LibTest/core/Strings/concatAll_A03_t01: fail, OK
-LibTest/core/Strings/join_A01_t01: fail, OK
-LibTest/core/Strings/join_A02_t01: fail, OK
-LibTest/core/Strings/join_A03_t01: fail, OK
-
-# co19 issue #450, The class 'List' does not have a constructor 'fixedLength'
-LibTest/core/List/add_A02_t01: fail, OK
-LibTest/core/List/addAll_A02_t01: fail, OK
-LibTest/core/List/clear_A02_t01: fail, OK
-LibTest/core/List/length_A04_t01: fail, OK
-LibTest/core/List/removeLast_A02_t01: fail, OK
-LibTest/core/List/removeRange_A02_t01: fail, OK
-
-# co19 issue 451, Set.intersection() requires Set argument
-LibTest/core/Set/intersection_A01_t01: fail, OK
-LibTest/core/Set/intersection_A01_t03: fail, OK
-LibTest/core/Set/intersection_A03_t01: fail, OK
-
 # co19 issue 452, more method in Iterable
 LibTest/core/Set/Set.from_A01_t02: fail, OK
 
-# co19 issue #453, abstract member in concrete class
-Language/07_Classes/07_Classes_A07_t10: fail, OK
-
-# co19 issue #454, should be static warning
-Language/11_Expressions/11_Instance_Creation/1_New_A01_t04: fail, OK
-
-# co19 issue #455, undeclared identifier is static warning
-Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t10: fail, OK
-Language/12_Statements/04_Local_Function_Declaration_A02_t02: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A02_t12: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A02_t14: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A02_t15: fail, OK
-
-# co19 issue #456
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t04: fail, OK
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t05: fail, OK
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t08: fail, OK
-
-# co19 issue 457, malformed type is static warning
-Language/11_Expressions/31_Type_Test_A05_t01: fail, OK
-Language/11_Expressions/31_Type_Test_A05_t02: fail, OK
-Language/11_Expressions/31_Type_Test_A05_t03: fail, OK
-Language/11_Expressions/32_Type_Cast_A04_t01: fail, OK
-Language/11_Expressions/32_Type_Cast_A04_t02: fail, OK
-
-# co19 issue #465, any use of a malbounded type gives rise to a static warning.
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t01: fail, OK
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t02: fail, OK
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t03: fail, OK
-Language/11_Expressions/11_Instance_Creation_A03_t01: fail, OK
-Language/11_Expressions/11_Instance_Creation_A04_t01: fail, OK
-Language/11_Expressions/11_Instance_Creation_A04_t02: fail, OK
-
-# co19 issue #481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t02: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t05: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t08: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t09: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t10: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t22: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t25: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t29: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t28: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t30: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t42: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t45: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t48: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t49: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t50: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t62: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t65: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t68: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t69: fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t70: fail, OK
+# co19-roll r546 (11.08.2013) caused these failures
+Language/05_Variables/05_Variables_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t01: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t04: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A04_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A11_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A12_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A13_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A17_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t08: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t10: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/06_Lists_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A01_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t08: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t12: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A09_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A09_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation_A01_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation_A01_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation_A01_t08: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/02_Expression_Statements_A01_t06: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/04_Local_Function_Declaration_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Return_A07_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t27: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t47: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t67: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/2_Exports_A01_t17: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/2_Exports_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t24: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t25: fail # co19-roll r546: Please triage this failure
+Language/15_Types/1_Static_Types_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/6_Type_dynamic_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/6_Type_dynamic_A04_t01: fail # co19-roll r546: Please triage this failure
+Language/16_Reference/1_Lexical_Rules/2_Comments_A04_t03: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/asBroadcastStream_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/distinct_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/distinct_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/drain_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/drain_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/EventTransformStream_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/expand_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/first_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/listen_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/listen_A04_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/transform_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/where_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Future/asStream_A01_t02: pass # co19-roll r546: Please triage this failure
+LibTest/async/Future/asStream_A02_t01: pass # co19-roll r546: Please triage this failure
+LibTest/async/Future/whenComplete_A03_t01: pass # co19-roll r546: Please triage this failure
+LibTest/async/Stream/asBroadcastStream_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/asBroadcastStream_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/contains_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/hasListener_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/hasListener_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/isClosed_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/isClosed_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/isPaused_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/isPaused_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/sink_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamController/StreamController.broadcast_A04_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/distinct_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/distinct_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/drain_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/drain_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamEventTransformer/handleData_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamEventTransformer/handleDone_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamEventTransformer/handleError_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/expand_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/isBroadcast_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/isBroadcast_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamIterator/cancel_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/listen_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/listen_A04_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamSink/close_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.fromFuture_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.fromFuture_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.fromIterable_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.periodic_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/transform_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/where_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/cancel_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer.periodic_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer.periodic_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/compareTo_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/isAtSameMomentAs_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/subtract_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/double/parse_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_div_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_eq_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_gt_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_gte_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_lt_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_lte_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_minus_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_mult_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_plus_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/FallThroughError/toString_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/ceilToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/floorToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/roundToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/truncateToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/asMap_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/every_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/forEach_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/join_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/lastWhere_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List.filled_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List.from_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List.generate_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List.generate_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List.generate_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/map_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/removeAt_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/replaceRange_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/replaceRange_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/skipWhile_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/takeWhile_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/toList_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/toList_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/toSet_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/StringBuffer/writeAll_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnFunction_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/streamSpawnFunction_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/add_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/addError_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/addError_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/operator_equality_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/any_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/asBroadcastStream_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/contains_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/contains_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/isBroadcast_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/last_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/length_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/single_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A02_t03: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A02_t04: fail # co19-roll r546: Please triage this failure
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index 2e5df38..13a1129 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -4,96 +4,24 @@
 
 [ $compiler == dart2dart ]
 
-Language/11_Expressions/08_Throw_A05_t01: Fail # co19 issue 420
-Language/11_Expressions/08_Throw_A05_t02: Fail # co19 issue 420
-Language/11_Expressions/08_Throw_A05_t03: Fail # co19 issue 420
-
 LibTest/math/max_A01_t03: Fail # co19 issue 467
 LibTest/math/min_A01_t03: Fail # co19 issue 467
 
 # The following tests fail because they contain number literals with a + prefix (co19 issue 428)
 LibTest/core/double/floor_A01_t05: Fail # issue 428
 LibTest/core/double/ceil_A01_t05: Fail # issue 428
-Language/12_Statements/02_Expression_Statements_A01_t06: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t10: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t08: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t04: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t03: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t02: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t01: Fail # co19 issue 428
-Language/11_Expressions/01_Constants_A01_t01: Fail # co19 issue 428
 
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A04_t15: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/07_Classes/9_Superclasses/1_Inheritance_and_Overriding_A01_t03: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Expressions/01_Constants_A18_t06: Fail # # co19 issue 468
-Language/11_Expressions/11_Instance_Creation_A05_t02: Fail # co19 issue 478
-Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t10: Fail # Issue 7025
-Language/12_Statements/03_Variable_Declaration_A04_t07: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/12_Statements/03_Variable_Declaration_A04_t08: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/12_Statements/09_Switch_A04_t01: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/12_Statements/10_Try_A03_t01: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/12_Statements/10_Try_A03_t02: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/12_Statements/10_Try_A03_t03: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t12: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t15: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t29: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/15_Reference/1_Lexical_Rules_A01_t10: Fail # co19 issue 470
-LibTest/async/Future/Future.delayed_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/Future.delayed_A01_t02: Fail # co19 issue 471
-LibTest/async/Future/Future.delayed_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/asStream_A01_t01: Fail # co19 issue 472
-LibTest/async/Future/asStream_A01_t02: Fail # co19 issue 472
-LibTest/async/Future/asStream_A02_t01: Fail # co19 issue 472
-LibTest/async/Future/catchError_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/catchError_A03_t02: Fail # co19 issue 471
-LibTest/async/Future/catchError_A03_t03: Fail # co19 issue 471
-LibTest/async/Future/forEach_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/forEach_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/forEach_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/then_A01_t03: Fail # co19 issue 472
-LibTest/async/Future/then_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/then_A02_t02: Fail # co19 issue 473
-LibTest/async/Future/then_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/then_A04_t01: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t04: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t05: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t06: Fail # co19 issue 471
-LibTest/async/Future/wait_A02_t01: Fail # co19 issue 474
-LibTest/async/Future/wait_A02_t02: Fail # co19 issue 474
-LibTest/async/Future/whenComplete_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A04_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A04_t02: Fail # co19 issue 471
 LibTest/collection/Queue/iterator_current_A01_t02: Fail # co19 issue 475
 LibTest/collection/Queue/iterator_moveNext_A01_t02: Fail # co19 issue 475
-LibTest/core/List/List_A01_t02: Fail # co19 issue 476
-LibTest/core/double/toStringAsExponential_A02_t01: Fail # co19 issue 477
 LibTest/core/int/toStringAsExponential_A02_t01: Fail # co19 issue 477
 
-Language/14_Types/5_Function_Types_A01_t10: Fail # co19 issue 392
-Language/14_Types/5_Function_Types_A02_t06: Fail # co19 issue 392
-
 Language/03_Overview/1_Scoping_A01_t39: Fail # http://dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t01: Fail # http://dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t02: Fail # http://dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t03: Fail # http://dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t04: Fail # http://dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t05: Fail # http://dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t01: Fail # http://dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t02: Fail # http://dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t03: Fail # http://dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t04: Fail # http://dartbug.com/7202
-
-Language/12_Statements/02_Expression_Statements_A01_t08: Fail # co 19 issue 370
 
 Language/03_Overview/2_Privacy_A01_t19: Fail # Calling unresolved class constructor.
 Language/03_Overview/2_Privacy_A01_t20: Fail # Calling unresolved class constructor.
 Language/07_Classes/6_Constructors_A03_t03: Fail # Calling unresolved class constructor.
-Language/11_Expressions/11_Instance_Creation/1_New_A06_t04: Fail # Calling unresolved class constructor.
-Language/11_Expressions/11_Instance_Creation/1_New_A06_t05: Fail # Calling unresolved class constructor.
-Language/11_Expressions/11_Instance_Creation/1_New_A06_t06: Fail # Calling unresolved class constructor.
 
 Language/03_Overview/1_Scoping_A01_t39: Fail # http://dartbug.com/5519
 Language/03_Overview/1_Scoping_A01_t40: Fail # http://dartbug.com/5519
@@ -108,13 +36,6 @@
 Language/05_Variables/05_Variables_A01_t13: Fail # http://dartbug.com/5519
 Language/05_Variables/05_Variables_A01_t14: Fail # http://dartbug.com/5519
 Language/05_Variables/05_Variables_A01_t15: Fail # http://dartbug.com/5519
-Language/05_Variables/05_Variables_A05_t04: Fail # Inherited from dart2js
-Language/05_Variables/05_Variables_A05_t05: Fail # Inherited from dart2js
-Language/05_Variables/05_Variables_A05_t06: Fail # Inherited from dart2js
-Language/05_Variables/05_Variables_A05_t07: Fail # Inherited from dart2js
-Language/05_Variables/05_Variables_A05_t08: Fail # Inherited from dart2js
-Language/05_Variables/05_Variables_A05_t09: Fail # Inherited from dart2js
-Language/05_Variables/05_Variables_A05_t10: Fail # Inherited from dart2js
 Language/05_Variables/05_Variables_A07_t05: Fail # Inherited from dart2js
 Language/05_Variables/05_Variables_A07_t06: Fail # Inherited from dart2js
 Language/05_Variables/05_Variables_A07_t07: Fail # Inherited from dart2js
@@ -179,141 +100,6 @@
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t02: Fail # inherited from VM
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t03: Fail # inherited from VM
 Language/07_Classes/6_Constructors_A02_t01: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A03_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A03_t03: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A03_t04: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A03_t05: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A05_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A05_t03: Fail # http://dartbug.com/5810
-Language/11_Expressions/01_Constants_A05_t04: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A08_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A09_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A10_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A10_t03: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A11_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A11_t03: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A11_t04: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A12_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A12_t03: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A13_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A13_t03: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A13_t04: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A13_t05: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A14_t02: Fail # http://dartbug.com/5810
-Language/11_Expressions/01_Constants_A15_t06: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t07: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t08: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t09: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t10: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t11: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t12: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t13: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t14: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t15: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t16: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t17: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t18: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t20: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t21: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A15_t31: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A16_t01: Fail # inherited from VM
-Language/11_Expressions/01_Constants_A16_t02: Crash, Pass # inherited from VM
-Language/11_Expressions/01_Constants_A16_t02: Fail # inherited from VM
-Language/11_Expressions/01_Constants_A16_t03: Fail # inherited from VM
-Language/11_Expressions/01_Constants_A17_t01: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A17_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A17_t03: Crash # inherited from VM
-Language/11_Expressions/01_Constants_A17_t03: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A19_t02: Fail # http://dartbug.com/5810
-Language/11_Expressions/01_Constants_A19_t03: Fail # http://dartbug.com/5810
-Language/11_Expressions/01_Constants_A19_t04: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A20_t02: Fail # http://dartbug.com/5810
-Language/11_Expressions/01_Constants_A20_t03: Fail # http://dartbug.com/5810
-Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t09: Fail, OK # co19 issue 210
-Language/11_Expressions/05_Strings_A02_t01: Skip # co19 issue 90.
-Language/11_Expressions/05_Strings_A02_t46: Fail # inherited from VM
-Language/11_Expressions/05_Strings_A02_t48: Fail # inherited from VM
-Language/11_Expressions/05_Strings_A20_t01: Fail # inherited from VM
-Language/11_Expressions/06_Lists_A03_t01: Fail # http://dartbug.com/5519
-Language/11_Expressions/06_Lists_A03_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/07_Maps_A01_t01: Skip # co19 issue 91: map literals illegal at statement beginning.
-Language/11_Expressions/07_Maps_A02_t01: Fail # http://dartbug.com/5519
-Language/11_Expressions/07_Maps_A02_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/11_Instance_Creation/1_New_A01_t04: Fail, OK # co19 issue 241
-Language/11_Expressions/11_Instance_Creation/1_New_A02_t03: Fail # inherited from dart2js
-Language/11_Expressions/11_Instance_Creation/1_New_A02_t05: Fail # inherited from dart2js
-Language/11_Expressions/11_Instance_Creation/1_New_A02_t06: Fail # inherited from dart2js
-Language/11_Expressions/11_Instance_Creation/1_New_A02_t07: Fail # inherited from dart2js
-Language/11_Expressions/11_Instance_Creation/1_New_A03_t01: Fail # http://dartbug.com/6895
-Language/11_Expressions/11_Instance_Creation/1_New_A03_t02: Fail # http://dartbug.com/6895
-Language/11_Expressions/11_Instance_Creation/1_New_A04_t01: Fail # http://dartbug.com/6895
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t09: Fail # inherited from VM
-Language/11_Expressions/11_Instance_Creation/2_Const_A01_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/11_Instance_Creation/2_Const_A06_t01: Fail # http://dartbug.com/5519
-Language/11_Expressions/11_Instance_Creation/2_Const_A06_t02: Fail # http://dartbug.com/5519
-Language/11_Expressions/11_Instance_Creation/2_Const_A10_t01: Fail # inherited from VM
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t01: Fail # inherited from VM
-Language/11_Expressions/18_Assignment_A05_t04: Fail, Pass, OK # Fails in minified, depends on method names.
-Language/11_Expressions/22_Equality_A01_t01: Fail # inherited from VM
-Language/11_Expressions/22_Equality_A01_t15: Fail # http://dartbug.com/5519
-Language/11_Expressions/22_Equality_A01_t16: Fail # http://dartbug.com/5519
-Language/11_Expressions/22_Equality_A01_t19: Fail # http://dartbug.com/5519
-Language/11_Expressions/22_Equality_A01_t20: Fail, OK # co19 issue 241
-Language/11_Expressions/22_Equality_A05_t01: Fail # inherited from VM
-Language/11_Expressions/23_Relational_Expressions_A01_t10: Fail # http://dartbug.com/5519
-Language/11_Expressions/23_Relational_Expressions_A01_t11: Fail # http://dartbug.com/5519
-Language/11_Expressions/23_Relational_Expressions_A01_t12: Fail # http://dartbug.com/5519
-Language/11_Expressions/23_Relational_Expressions_A01_t13: Fail # http://dartbug.com/5519
-Language/11_Expressions/27_Unary_Expressions_A01_t01: Fail # inherited from VM
-Language/11_Expressions/30_Identifier_Reference_A02_t01: Fail # Pseudo keyword "abstract".
-Language/11_Expressions/30_Identifier_Reference_A04_t09: Fail # Inherited from dart2js
-Language/11_Expressions/30_Identifier_Reference_A05_t01: Fail # Inherited from dart2js
-Language/11_Expressions/30_Identifier_Reference_A05_t12: Fail # Inherited from dart2js
-Language/11_Expressions/30_Identifier_Reference_A08_t02: Fail # Inhertited from VM.
-Language/12_Statements/03_Variable_Declaration_A04_t01: Fail # http://dartbug.com/5519
-Language/12_Statements/03_Variable_Declaration_A04_t02: Fail # Inherited from dart2js
-Language/12_Statements/03_Variable_Declaration_A04_t03: Fail # Inherited from dart2js
-Language/12_Statements/03_Variable_Declaration_A04_t04: Fail # Inherited from dart2js
-Language/12_Statements/03_Variable_Declaration_A04_t05: Fail # Inherited from dart2js
-Language/12_Statements/03_Variable_Declaration_A04_t06: Fail # Inherited from dart2js
-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/09_Switch_A01_t02: Fail # Inherited from VM (switch case with several labels).
-Language/12_Statements/09_Switch_A06_t02: Fail # Inherited from VM (does not throw NSME).
-Language/12_Statements/10_Try_A06_t01: Fail, Pass # Passes in conservative renaming mode. Test depends on function names.
-Language/12_Statements/10_Try_A07_t03: Fail # Test depends on out file name.
-Language/12_Statements/11_Return_A05_t01: Fail # Inherited from dart2js
-Language/12_Statements/11_Return_A05_t02: Fail # Inherited from dart2js
-Language/12_Statements/11_Return_A05_t03: Fail # Inherited from dart2js
-Language/12_Statements/12_Labels_A01_t03: Fail # Inherited from VM (Multiple labels fail).
-Language/13_Libraries_and_Scripts/1_Imports_A02_t14: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/1_Imports_A02_t28: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/1_Imports_A05_t01: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/3_Parts_A03_t02: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/4_Scripts_A03_t01: Fail # http://dartbug.com/5519
-Language/13_Libraries_and_Scripts/4_Scripts_A03_t03: Fail # http://dartbug.com/5519
-Language/13_Libraries_and_Scripts/5_URIs_A01_t01: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/5_URIs_A01_t11: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/5_URIs_A01_t21: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/5_URIs_A01_t24: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/5_URIs_A01_t25: Fail # Inherited from dart2js
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t01: Fail # http://dartbug.com/5519
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t02: Fail # http://dartbug.com/5519
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t03: Fail # http://dartbug.com/5519
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t04: Fail # http://dartbug.com/5519
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t05: Fail # Inherited from dart2js
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t01: Fail, Pass # inherited from dart2js: fails in minify, self-reference typedef check not performed
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t02: Fail, Pass # inherited from dart2js: fails in minify, self-reference typedef check not performed
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t03: Fail, Pass # inherited from dart2js: fails in minify, self-reference typedef check not performed
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t04: Fail # Inherited from dart2js
-Language/14_Types/5_Function_Types_A06_t01: Fail # Inherited from dart2js
-Language/15_Reference/1_Lexical_Rules/1_Reserved_Words_A40_t04: Fail # inherited from dart2js
-Language/15_Reference/1_Lexical_Rules_A02_t06: Fail # inherited from dart2js
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A03_t01: Fail # Inherited from dart2js
-LibTest/core/Date/Date.fromString_A03_t01: Pass, OK # Issue co19 - 121 (currently passing due to co19 issues 373 and 374)
-LibTest/core/Date/toString_A02_t01: Fail, OK # inherited from VM
-LibTest/core/Date/year_A01_t01: Fail, OK # inherited from VM
 LibTest/core/Match/operator_subscript_A01_t01: Fail # inherited from VM
 LibTest/core/Match/operator_subscript_A01_t01: Fail, OK # co19 issue 294
 LibTest/core/Match/pattern_A01_t01: Fail, OK # Issue 400
@@ -337,7 +123,6 @@
 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
@@ -350,43 +135,11 @@
 LibTest/math/sin_A01_t01: Fail # Inherited from VM.
 LibTest/math/tan_A01_t01: Fail # Issue co19 - 44
 
-LibTest/core/StringBuffer/isEmpty_A01_t01:  Fail, OK # co19 issue 355
 
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: Fail, OK # co19 issue 409
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: Fail, OK # co19 issue 409
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail, OK # co19 issue 409
-Language/11_Expressions/17_Getter_Invocation_A02_t01: Fail, OK # co19 issue 409
-Language/11_Expressions/18_Assignment_A05_t02: Fail, OK # co19 issue 409
-Language/11_Expressions/18_Assignment_A05_t05: Fail, OK # co19 issue 409
-Language/11_Expressions/18_Assignment_A08_t04: Fail, OK # co19 issue 409
 
 LibTest/core/String/indexOf_A01_t02: Fail # Issue 427
 LibTest/core/String/lastIndexOf_A01_t02: Fail # Issue 427
 
-Language/11_Expressions/31_Type_Test_A05_t01: Fail # co19 issue 463
-Language/11_Expressions/31_Type_Test_A05_t02: Fail # co19 issue 463
-Language/11_Expressions/31_Type_Test_A05_t03: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A04_t01: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A04_t02: Fail # co19 issue 463
-
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t01: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t02: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t03: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation/2_Const_A07_t01: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation/2_Const_A07_t02: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation/2_Const_A07_t03: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A03_t01: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A03_t02: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A04_t01: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A04_t02: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A04_t03: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A04_t04: Fail # co19 issue 466
-
-[ $compiler == dart2dart && $minified ]
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: Fail, OK # co19 issue 396
-Language/11_Expressions/17_Getter_Invocation_A02_t01: Fail, OK # co19 issue 396
-Language/11_Expressions/18_Assignment_A05_t02: Fail, OK # co19 issue 396
-
 
 [ $compiler == dart2dart && $system == windows ]
 LibTest/core/double/operator_remainder_A01_t04: Fail # Result is NaN
@@ -401,96 +154,6 @@
 
 [ $compiler == dart2dart ]
 Language/03_Overview/2_Privacy_A01_t06: Fail # co19 issue 463
-Language/09_Generics/09_Generics_A05_t01: Fail # co19 issue 463
-Language/11_Expressions/31_Type_Test_A04_t01: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A03_t01: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A03_t02: Fail # co19 issue 463
-Language/14_Types/2_Dynamic_Type_System_A02_t01: Fail # co19 issue 463
-Language/14_Types/4_Interface_Types_A11_t01: Pass, Crash # Issue 8857
-Language/14_Types/4_Interface_Types_A11_t02: Pass, Crash # Issue 8857
-
-LibTest/core/Date/operator_equality_A01_t01: Fail # DateTime.== now looks at timezone, co19 issue 379
-
-Language/14_Types/6_Type_dynamic_A03_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A03_t01: pass
-LibTest/core/Date/Date.fromString_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromString_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromString_A03_t01: pass
-LibTest/core/Date/Date.now_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.now_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.now_A01_t03: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.utc_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date_A01_t03: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date_A01_t04: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/add_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/add_A02_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/add_A03_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/compareTo_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/compareTo_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/day_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/difference_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/difference_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/hour_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/isUtc_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/millisecond_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/millisecondsSinceEpoch_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/minute_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/month_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_GE_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_GT_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_LE_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_LT_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/second_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/subtract_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/subtract_A02_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/subtract_A03_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/timeZoneName_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/timeZoneOffset_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/toLocal_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/toString_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/toUtc_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/weekday_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-
-LibTest/core/Strings/join_A01_t01: Fail # Strings class has been removed. co19 issue 380
-LibTest/core/Strings/join_A04_t01: Fail # Strings class has been removed. co19 issue 380
-LibTest/core/Strings/concatAll_A01_t01: Fail # Strings class has been removed. co19 issue 380
-LibTest/core/Strings/concatAll_A04_t01: Fail # Strings class has been removed. co19 issue 380
-
-LibTest/core/String/charCodes_A01_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/charCodeAt_A02_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/charCodeAt_A03_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/charCodeAt_A01_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/splitChars_A01_t01: Fail # Deprecated string members removed (issue 382).
-
-LibTest/core/StringBuffer/addAll_A01_t02: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/add_A01_t02: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/add_A01_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/addAll_A01_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/toString_A01_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t02: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A04_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/12_Statements/01_Blocks_A01_t03: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/14_Function_Invocation/1_Actual_Argument_List_Evaluation_A02_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t12: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t05: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A13_t03: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t06: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A04_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail # StringBuffer renamed add to write. co19 issue 388.
-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
@@ -501,68 +164,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, 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/async/Future/catchError_A01_t01: Fail # Future constructors have changed # issues 408
-LibTest/async/Future/Future.immediateError_A01_t01: Fail # Future constructors have changed # issues 408
-LibTest/async/Future/asStream_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/Future.immediate_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/then_A01_t03: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/catchError_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/forEach_A03_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/asStream_A01_t02: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/Future.immediateError_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/asStream_A02_t01: Fail # Future constructors have changed # issue 408
-
 LibTest/core/Iterable/any_A01_t04: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A01_t02: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A02_t01: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A02_t02: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A05_t01: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A03_t01: Fail # setRange throws StateError if there aren't enough elements in the iterable. Issue 402
-LibTest/core/List/setRange_A03_t02: Fail # setRange throws StateError if there aren't enough elements in the iterable. Issue 402
 
-LibTest/core/List/removeRange_A01_t01: Fail # removeRange now takes end-argument. Issue 404
-LibTest/core/List/removeRange_A03_t01: Fail # removeRange now takes end-argument. Issue 404
-LibTest/core/List/removeRange_A05_t01: Fail # removeRange now takes end-argument. Issue 404
-
-LibTest/core/List/insertRange_A01_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A03_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A04_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A05_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A06_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/every_A01_t01: Fail # insertRange is removed. Issue 403
-
-LibTest/async/Completer/completeError_A01_t01: Fail # No AsyncError anymore. Issue 407
-LibTest/async/Future/Future.immediateError_A01_t01: Fail # No AsyncError anymore. Issue 407
-LibTest/async/Future/catchError_A02_t01: Fail # No AsyncError anymore. Issue 407
-
-LibTest/async/Completer/complete_A01_t03: Fail # Completer is now asynchronous. Issue 419
-LibTest/async/Completer/complete_A01_t04: Fail # Completer is now asynchronous. Issue 419
-LibTest/async/Future/then_A01_t01: Fail # Completer is now asynchronous. Issue 419
-LibTest/async/Future/then_A01_t04: Fail # Completer is now asynchronous. Issue 419
-
-Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t02: Fail # Issue 397
-Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t02: Fail # Issue 397
-Language/11_Expressions/11_Instance_Creation/1_New_A08_t01: Fail # Issue 397
-Language/11_Expressions/11_Instance_Creation/1_New_A08_t02: Fail # Issue 397
-Language/11_Expressions/11_Instance_Creation/1_New_A08_t03: Fail # Issue 397
 LibTest/core/Iterable/where_A01_t07: Fail # Issue 397
-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
 
@@ -573,17 +178,240 @@
 Language/07_Classes/1_Instance_Methods_A02_t02: Fail # Override rules have been relaxed. Issue
 Language/07_Classes/1_Instance_Methods_A02_t05: Fail # Override rules have been relaxed. Issue
 
-Language/11_Expressions/33_Argument_Definition_Test_A01_t02: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A02_t01: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A02_t02: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A03_t01: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A03_t02: Fail, OK # co19 issue 436
 
-Language/13_Libraries_and_Scripts/1_Imports_A03_t02: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t05: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t22: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t25: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t42: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t45: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t62: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t65: Fail # 481
+# co19-roll r546 (11.08.2013) caused these failures
+[ $compiler == dart2dart ]
+Language/05_Variables/05_Variables_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t03: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t04: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t05: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t06: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/07_Classes_A11_t01: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/07_Classes_A11_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t01: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A03_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A03_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A05_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A09_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A10_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A10_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A11_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A11_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A11_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A12_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A12_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A13_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A13_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A13_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A13_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A14_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t08: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t10: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t11: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t12: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t13: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t14: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t15: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t16: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t17: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t18: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t20: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t21: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A15_t31: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A17_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A17_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A17_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A19_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A19_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A19_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A20_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A20_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t08: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t10: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings/1_String_Interpolation_A01_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings/1_String_Interpolation_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings/1_String_Interpolation_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings_A02_t46: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings_A02_t48: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings_A20_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/06_Lists_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/06_Lists_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A02_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A02_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A04_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t12: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A08_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A08_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A09_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A09_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A10_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/17_Getter_Invocation_A02_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A08_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/22_Equality_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/22_Equality_A01_t15: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/22_Equality_A01_t16: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/22_Equality_A01_t19: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/22_Equality_A01_t20: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/22_Equality_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/23_Relational_Expressions_A01_t10: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/23_Relational_Expressions_A01_t11: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/23_Relational_Expressions_A01_t12: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/23_Relational_Expressions_A01_t13: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/27_Unary_Expressions_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A02_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A04_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A05_t12: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/33_Type_Cast_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/33_Type_Cast_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/02_Expression_Statements_A01_t06: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/02_Expression_Statements_A01_t08: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t04: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t05: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t06: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t07: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t08: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/04_Local_Function_Declaration_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/06_For_A01_t11: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A04_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Return_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Return_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Return_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A07_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/12_Labels_A01_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A02_t28: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A02_t29: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t08: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t09: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t10: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t27: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t28: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t29: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t30: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t47: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t48: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t49: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t50: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t67: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t68: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t69: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t70: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/3_Parts_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/4_Scripts_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t11: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t21: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t24: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t25: fail # co19-roll r546: Please triage this failure
+Language/15_Types/1_Static_Types_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t03: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t04: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t05: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A07_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A07_t02: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A07_t03: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A07_t04: fail # co19-roll r546: Please triage this failure
+Language/15_Types/4_Interface_Types_A11_t01: crash # co19-roll r546: Please triage this failure
+Language/15_Types/4_Interface_Types_A11_t02: crash # co19-roll r546: Please triage this failure
+Language/15_Types/5_Function_Types_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/16_Reference/1_Lexical_Rules/1_Reserved_Words_A40_t04: fail # co19-roll r546: Please triage this failure
+Language/16_Reference/1_Lexical_Rules/2_Comments_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/16_Reference/1_Lexical_Rules_A02_t06: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.periodic_A03_t01: fail, pass # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer.periodic_A02_t01: fail, pass # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/isAtSameMomentAs_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/parse_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/year_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/double/parse_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/skip_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/take_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnFunction_A04_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnUri_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnUri_A02_t03: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/streamSpawnFunction_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/addError_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/addError_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/any_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A02_t02: timeout # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A02_t03: timeout # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A02_t04: fail # co19-roll r546: Please triage this failure
+Utils/tests/Expect/listEquals_A02_t01: fail # co19-roll r546: Please triage this failure
+Utils/tests/Expect/listEquals_A03_t01: fail # co19-roll r546: Please triage this failure
+Utils/tests/Expect/setEquals_A02_t01: fail # co19-roll r546: Please triage this failure
+
+[ $compiler == dart2dart && $minified ]
+Language/13_Statements/11_Try_A06_t01: fail # co19-roll r546: Please triage this failure
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 335f686..1cbc686 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -22,13 +22,6 @@
 
 Language/03_Overview/1_Scoping_A02_t05: Fail # TODO(ahe): Please triage this failure.
 Language/03_Overview/1_Scoping_A02_t06: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A05_t04: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A05_t05: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A05_t06: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A05_t07: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A05_t08: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A05_t09: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A05_t10: Fail # TODO(ahe): Please triage this failure.
 Language/05_Variables/05_Variables_A07_t05: Fail # TODO(ahe): Please triage this failure.
 Language/05_Variables/05_Variables_A07_t06: Fail # TODO(ahe): Please triage this failure.
 Language/05_Variables/05_Variables_A07_t07: Fail # TODO(ahe): Please triage this failure.
@@ -40,97 +33,11 @@
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A04_t15: Fail # TODO(ahe): Please triage this failure.
 Language/07_Classes/6_Constructors/2_Factories_A07_t01: Fail # TODO(ahe): Please triage this failure.
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/01_Constants_A13_t06: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/01_Constants_A18_t07: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/01_Constants_A20_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/08_Throw_A05_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/08_Throw_A05_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/1_New_A02_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/1_New_A02_t05: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/1_New_A02_t06: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/1_New_A02_t07: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/2_Const_A01_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/2_Const_A11_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/2_Const_A11_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation_A05_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t10: Fail # Issue 7025
-Language/11_Expressions/17_Getter_Invocation_A02_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/18_Assignment_A05_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/18_Assignment_A05_t05: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/30_Identifier_Reference_A04_t09: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/30_Identifier_Reference_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/30_Identifier_Reference_A05_t12: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/32_Type_Cast_A02_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/32_Type_Cast_A03_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/32_Type_Cast_A03_t02: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/02_Expression_Statements_A01_t08: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/03_Variable_Declaration_A04_t02: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/03_Variable_Declaration_A04_t03: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/03_Variable_Declaration_A04_t04: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/03_Variable_Declaration_A04_t05: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/03_Variable_Declaration_A04_t06: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/03_Variable_Declaration_A04_t07: Fail # TODO(ahe): Please triage this failure.
-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/09_Switch_A06_t02: Fail # co19 issue 413
-Language/12_Statements/10_Try_A06_t01: Fail # Issue 11850: dart2js inlining results in stack traces not as accurate
-Language/12_Statements/10_Try_A07_t03: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/11_Return_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/11_Return_A05_t02: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/11_Return_A05_t03: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t03: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t12: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t14: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t15: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t28: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t29: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/3_Parts_A03_t02: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/5_URIs_A01_t01: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/5_URIs_A01_t11: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/5_URIs_A01_t21: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/5_URIs_A01_t24: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/5_URIs_A01_t25: Fail # TODO(ahe): Please triage this failure.
-Language/14_Types/5_Function_Types_A01_t10: Pass # co19 issue 392, issue 9058
-Language/14_Types/5_Function_Types_A02_t06: Pass # co19 issue 392, issue 9058
-Language/15_Reference/1_Lexical_Rules/1_Reserved_Words_A40_t04: Fail # TODO(ahe): Please triage this failure.
-LibTest/async/Future/Future.delayed_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/Future.delayed_A01_t02: Fail # co19 issue 471
-LibTest/async/Future/Future.delayed_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/asStream_A01_t01: Fail # co19 issue 472
-LibTest/async/Future/asStream_A01_t02: Fail # co19 issue 472
-LibTest/async/Future/asStream_A02_t01: Fail # co19 issue 472
-LibTest/async/Future/catchError_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/catchError_A03_t02: Fail # co19 issue 471
-LibTest/async/Future/catchError_A03_t03: Fail # co19 issue 471
-LibTest/async/Future/forEach_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/forEach_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/forEach_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/then_A01_t03: Fail # co19 issue 472
-LibTest/async/Future/then_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/then_A02_t02: Fail # co19 issue 473
-LibTest/async/Future/then_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/then_A04_t01: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t04: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t05: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t06: Fail # co19 issue 471
-LibTest/async/Future/wait_A02_t01: Fail # co19 issue 474
-LibTest/async/Future/wait_A02_t02: Fail # co19 issue 474
-LibTest/async/Future/whenComplete_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A04_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A04_t02: Fail # co19 issue 471
 LibTest/collection/Queue/iterator_current_A01_t02: Fail # co19 issue 475
 LibTest/collection/Queue/iterator_moveNext_A01_t02: Fail # co19 issue 475
-LibTest/core/List/List_A01_t02: Fail # co19 issue 476
 LibTest/core/List/List_A03_t01: Fail # TODO(kasperl): Please triage this failure.
 LibTest/core/double/INFINITY_A01_t04: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/double/NEGATIVE_INFINITY_A01_t04: Fail # TODO(ahe): Please triage this failure.
-LibTest/core/double/toStringAsExponential_A02_t01: Fail # co19 issue 477
 LibTest/core/int/toStringAsExponential_A02_t01: Fail # co19 issue 477.
 LibTest/math/pow_A01_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/math/pow_A11_t01: Fail # TODO(ahe): Please triage this failure.
@@ -139,7 +46,6 @@
 
 
 [ $compiler == dart2js && $runtime == jsshell ]
-Language/11_Expressions/12_Spawning_an_Isolate_A01_t01: Fail, Pass # TODO(ahe): Please triage this failure.
 LibTest/isolate/SendPort/send_A02_t05: Fail, Pass # TODO(ahe): Please triage this failure.
 LibTest/isolate/SendPort/send_A02_t06: Fail, Pass # TODO(ahe): Please triage this failure.
 LibTest/isolate/isolate_api/spawnFunction_A01_t01: Fail, Pass # TODO(ahe): Please triage this failure.
@@ -157,28 +63,16 @@
 
 
 [ $compiler == dart2js ]
-Language/14_Types/4_Interface_Types_A11_t01: Pass, Crash # Issue 8857
-Language/14_Types/4_Interface_Types_A11_t02: Pass, Crash # Issue 8857
 
 LibTest/isolate/ReceivePort/receive_A01_t02: Fail # Issue 6750
 
-LibTest/core/StringBuffer/isEmpty_A01_t01:  Fail, OK # co19 issue 355
-
 Language/07_Classes/6_Constructors/2_Factories_A01_t05: Fail # Partially implemented rediriecting constructors makes this fail.
 
 [ $compiler == dart2js && $runtime == ie9 ]
-Language/11_Expressions/03_Numbers_A01_t06: Fail # Issue: 8920
-Language/11_Expressions/03_Numbers_A01_t09: Fail # Issue: 8920
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail # Issue: 8920
-LibTest/core/Date/Date_A01_t03: Fail # Issue: 8920
-LibTest/core/Date/Date.fromString_A03_t01: Fail # Issue: 8920
-LibTest/core/Date/timeZoneName_A01_t01: Fail # Issue: 8920
-LibTest/core/Date/year_A01_t01: Fail # Issue: 8920
 LibTest/core/double/round_A01_t01: Fail # Issue: 8920
 LibTest/core/double/toRadixString_A01_t01: Fail # Issue: 8920
 LibTest/core/double/toStringAsExponential_A01_t04: Fail # Issue: 8920
 LibTest/core/double/toStringAsPrecision_A01_t04: Fail # Issue: 8920
-LibTest/core/Expect/identical_A01_t01: Fail # Issue: 8920
 LibTest/core/int/compareTo_A01_t01: Fail # Issue: 8920
 LibTest/core/int/operator_left_shift_A01_t01: Fail # Issue: 8920
 LibTest/core/int/operator_remainder_A01_t03: Fail # Issue: 8920
@@ -204,8 +98,6 @@
 
 [ $compiler == dart2js && $runtime == jsshell ]
 LibTest/core/Map/Map_class_A01_t04: Pass, Slow # Issue 8096
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t01: Fail # TODO(ngeoaffray): Please triage these failure.
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail # TODO(ngeoaffray): Please triage these failure.
 LibTest/core/double/round_A01_t01: Fail # TODO(ngeoaffray): Please triage these failure.
 LibTest/core/int/operator_truncating_division_A01_t01: Fail # TODO(ngeoaffray): Please triage these failure.
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: Fail # TODO(ngeoaffray): Please triage these failure.
@@ -213,49 +105,9 @@
 LibTest/math/acos_A01_t01: Fail # TODO(ngeoaffray): Please triage these failure.
 LibTest/math/asin_A01_t01: Fail # TODO(ngeoaffray): Please triage these failure.
 
-[ $compiler == dart2js && $minified ]
-# These tests assume that the invocation mirror gets the original name of the
-# method, but that information is not present when minifying.  They could be
-# fixed by using the invocation mirror to invoke a method on a different object
-# and checking that the correct method is invoked.
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: Fail, OK
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail, OK
-Language/11_Expressions/18_Assignment_A08_t04: Fail, OK
-
-[ $compiler == dart2js && ($minified || $runtime == ie9) ]
-Language/12_Statements/10_Try_A06_t01: Fail # BUG(11480): Triage.
-
 [ $compiler == dart2js && $checked ]
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A17_t03: Fail # TODO(ahe): Please triage this failure.
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A17_t04: Fail # TODO(ahe): Please triage this failure.
-Language/09_Generics/09_Generics_A03_t01: Fail # TODO(ahe): Please triage this failure.
-Language/09_Generics/09_Generics_A04_t06: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/03_Numbers_A05_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/06_Lists_A09_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/06_Lists_A09_t04: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/07_Maps_A10_t05: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/07_Maps_A11_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/1_New_A07_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/1_New_A11_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/2_Const_A09_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/2_Const_A09_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/19_Conditional_A04_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/20_Logical_Boolean_Expressions_A03_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/27_Unary_Expressions_A02_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/32_Type_Cast_A05_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/32_Type_Cast_A05_t05: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/06_For/1_For_Loop_A01_t08: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/09_Switch_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t06: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t26: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t46: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t66: Fail # TODO(ahe): Please triage this failure.
-LibTest/core/AssertionError/column_A01_t02: Fail # TODO(ahe): Please triage this failure.
-LibTest/core/AssertionError/failedAssertion_A01_t01: Fail # TODO(ahe): Please triage this failure.
-LibTest/core/AssertionError/line_A01_t02: Fail # co19 issue 479
-LibTest/core/AssertionError/url_A01_t01: Fail # TODO(ahe): Please triage this failure.
-LibTest/core/Set/intersection_A03_t01: Fail # co19 issue 480
 LibTest/core/TypeError/column_A01_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/TypeError/dstName_A01_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/TypeError/dstType_A01_t01: Fail # TODO(ahe): Please triage this failure.
@@ -264,15 +116,6 @@
 LibTest/core/TypeError/srcType_A01_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/TypeError/url_A01_t01: Fail # TODO(ahe): Please triage this failure.
 
-Language/11_Expressions/11_Instance_Creation/1_New_A12_t02: Fail # http://dartbug.com/3970
-
-
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: Fail, OK # co19 issue 405
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail, OK # co19 issue 405
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: Fail, OK # co19 issue 405
-Language/11_Expressions/18_Assignment_A05_t04: Fail, OK # co19 issue 405
-Language/11_Expressions/18_Assignment_A08_t04: Fail, OK # co19 issue 405
-
 
 [ $compiler == dart2js ]
 LibTest/core/int/operator_GT_A01_t01: Fail, OK # co19 issue 200
@@ -304,14 +147,10 @@
 Language/06_Functions/2_Formal_Parameters_A03_t04: Fail # TODO(ahe): Enforce optional parameter semantics.
 Language/06_Functions/2_Formal_Parameters_A03_t06: Fail # TODO(ahe): Enforce optional parameter semantics.
 
-Language/11_Expressions/01_Constants_A03_t01: Fail # Compile-time error: error: not a compile-time constant
-Language/11_Expressions/01_Constants_A11_t01: Fail # Compile-time error: error: not a compile-time constant
 LibTest/isolate/SendPort/send_A02_t01: Fail # Compile-time error: error: not a compile-time constant
 LibTest/isolate/SendPort/send_A02_t02: Fail # Compile-time error: error: not a compile-time constant
 LibTest/isolate/SendPort/send_A02_t03: Fail # Compile-time error: error: not a compile-time constant
 
-Language/11_Expressions/01_Constants_A18_t03: Fail # Compile-time error: unexpected token 'equals'
-Language/11_Expressions/05_Strings_A20_t01: Fail # Runtime error: Expect.identical(expected: <abyr, abyr
 LibTest/isolate/isolate_api/spawnUri_A02_t01: Fail # Runtime error: Expect.throws() fails
 LibTest/isolate/isolate_api/spawnUri_A01_t01: Fail # Runtime error: UnsupportedError: Currently spawnUri is not supported without web workers.
 LibTest/isolate/isolate_api/spawnUri_A01_t02: Fail # Runtime error: UnsupportedError: Currently spawnUri is not supported without web workers.
@@ -327,7 +166,6 @@
 LibTest/core/int/operator_OR_A01_t01: Fail, OK # Requires bigints.
 LibTest/core/int/operator_remainder_A01_t01: Fail, OK # Requires bigints.
 
-LibTest/core/Date/toString_A02_t01: Fail # Argument error. Year 999999 is out of range. Needs to be specified (and then potentially reported to co19): issue 1878.
 
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A04_t01: Fail, OK # co19 issue 212
 
@@ -340,34 +178,15 @@
 # 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.
-
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t14: Fail, OK # co19 issue 210
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t15: Fail, OK # co19 issue 210
-Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t09: Fail, OK # co19 issue 210
 
 Language/03_Overview/1_Scoping_A01_t40: Fail, OK # co19 issue 188
 Language/03_Overview/1_Scoping_A01_t41: Fail, OK # co19 issue 188
 
-Language/11_Expressions/33_Argument_Definition_Test_A01_t02: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A02_t01: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A02_t02: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A03_t01: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A03_t02: Fail, OK # co19 issue 436
-
 Language/06_Functions/4_External_Functions_A01_t01: Fail, OK # http://dartbug.com/5021
 
 Language/03_Overview/2_Privacy_A01_t09: Fail, OK # co19 issue 198
@@ -375,87 +194,6 @@
 LibTest/core/int/hashCode_A01_t01: Fail, OK # co19 issue 308
 
 Language/03_Overview/2_Privacy_A01_t11: Pass, OK # co19 issue 316
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t01: Pass, OK # co19 issue 316
-
-LibTest/core/Date/operator_equality_A01_t01: Fail # DateTime.== now looks at timezone, co19 issue 379.
-
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A03_t01: pass
-LibTest/core/Date/Date.fromString_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromString_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromString_A03_t01: pass
-LibTest/core/Date/Date.now_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.now_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.now_A01_t03: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.utc_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date_A01_t03: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date_A01_t04: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/add_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/add_A02_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/add_A03_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/compareTo_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/compareTo_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/day_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/difference_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/difference_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/hour_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/isUtc_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/millisecond_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/millisecondsSinceEpoch_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/minute_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/month_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_GE_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_GT_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_LE_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_LT_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/second_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/subtract_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/subtract_A02_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/subtract_A03_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/timeZoneName_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/timeZoneOffset_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/toLocal_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/toString_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/toUtc_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/weekday_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-
-Language/12_Statements/10_Try_A03_t01: Fail # co19 issue 381
-Language/12_Statements/10_Try_A03_t02: Fail # co19 issue 381
-Language/12_Statements/10_Try_A03_t03: Fail # co19 issue 381
-
-LibTest/core/Strings/join_A01_t01: Fail # Strings class has been removed. co19 issue 380
-LibTest/core/Strings/join_A04_t01: Fail # Strings class has been removed. co19 issue 380
-LibTest/core/Strings/concatAll_A01_t01: Fail # Strings class has been removed. co19 issue 380
-LibTest/core/Strings/concatAll_A04_t01: Fail # Strings class has been removed. co19 issue 380
-
-LibTest/core/StringBuffer/addAll_A01_t02: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/add_A01_t02: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/add_A01_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/addAll_A01_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/toString_A01_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t02: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A04_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/12_Statements/01_Blocks_A01_t03: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/14_Function_Invocation/1_Actual_Argument_List_Evaluation_A02_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t12: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t05: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A13_t03: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t06: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A04_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail # StringBuffer renamed add to write. co19 issue 388.
-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
@@ -466,76 +204,15 @@
 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
 
-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
-Language/11_Expressions/11_Instance_Creation/1_New_A08_t02: Fail # Issue 397
-Language/11_Expressions/11_Instance_Creation/1_New_A08_t03: Fail # Issue 397
 LibTest/core/Iterable/where_A01_t07: Fail # Issue 397
-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/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/async/Future/catchError_A01_t01: Fail # Future constructors have changed # issues 408
-LibTest/async/Future/Future.immediateError_A01_t01: Fail # Future constructors have changed # issues 408
-LibTest/async/Future/asStream_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/Future.immediate_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/then_A01_t03: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/catchError_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/forEach_A03_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/asStream_A01_t02: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/Future.immediateError_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/asStream_A02_t01: Fail # Future constructors have changed # issue 408
 
 LibTest/core/Iterable/any_A01_t04: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A01_t02: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A02_t01: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A02_t02: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A03_t01: Fail # setRange throws StateError if there aren't enough elements in the iterable. Issue 402
-LibTest/core/List/setRange_A03_t02: Fail # setRange throws StateError if there aren't enough elements in the iterable. Issue 402
-
-LibTest/core/List/removeRange_A01_t01: Fail # removeRange now takes end-argument. Issue 404
-LibTest/core/List/removeRange_A03_t01: Fail # removeRange now takes end-argument. Issue 404
-LibTest/core/List/removeRange_A05_t01: Fail # removeRange now takes end-argument. Issue 404
-
-LibTest/core/List/insertRange_A01_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A03_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A04_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A05_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A06_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/every_A01_t01: Fail # insertRange is removed. Issue 403
-
-LibTest/async/Completer/completeError_A01_t01: Fail # No AsyncError anymore. Issue 407
-LibTest/async/Future/Future.immediateError_A01_t01: Fail # No AsyncError anymore. Issue 407
-LibTest/async/Future/catchError_A02_t01: Fail # No AsyncError anymore. Issue 407
-
-LibTest/async/Completer/complete_A01_t03: Fail # Completer is now asynchronous. Issue 419
-LibTest/async/Completer/complete_A01_t04: Fail # Completer is now asynchronous. Issue 419
-LibTest/async/Future/then_A01_t01: Fail # Completer is now asynchronous. Issue 419
-LibTest/async/Future/then_A01_t04: Fail # Completer is now asynchronous. Issue 419
 
 LibTest/core/double/parse_A02_t01: Fail # Issue 418
 
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: Fail, OK # co19 issue 409
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: Fail, OK # co19 issue 409
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail, OK # co19 issue 409
-Language/11_Expressions/18_Assignment_A05_t04: Fail, OK # co19 issue 409
-Language/11_Expressions/18_Assignment_A08_t04: Fail, OK # co19 issue 409
-
-Language/14_Types/5_Function_Types_A01_t10: Fail # co19 issue 410
-Language/14_Types/5_Function_Types_A02_t06: Fail # co19 issue 410
-
 LibTest/core/Match/pattern_A01_t01: Fail # co19 Issue 400, 422
 LibTest/core/RegExp/allMatches_A01_t01: Fail # co19 Issue 400, 422
 
-Language/11_Expressions/08_Throw_A05_t01: Fail # co19 issue 420
-Language/11_Expressions/08_Throw_A05_t02: Fail # co19 issue 420
-Language/11_Expressions/08_Throw_A05_t03: Fail # co19 issue 420
 
 LibTest/core/String/indexOf_A01_t02: Fail # Issue 427
 LibTest/core/String/lastIndexOf_A01_t02: Fail # Issue 427
@@ -543,81 +220,9 @@
 LibTest/core/FallThroughError/toString_A01_t01: Fail # FallThroughError is no longer const. Issue 459
 LibTest/core/FallThroughError/FallThroughError_A01_t01: Fail # FallThroughError is no longer const. Issue 459
 
-Language/09_Generics/09_Generics_A05_t01: Fail # co19 issue 463
-Language/11_Expressions/31_Type_Test_A04_t01: Fail # co19 issue 463
-Language/11_Expressions/31_Type_Test_A05_t01: Fail # co19 issue 463
-Language/11_Expressions/31_Type_Test_A05_t02: Fail # co19 issue 463
-Language/11_Expressions/31_Type_Test_A05_t03: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A03_t01: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A03_t02: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A04_t01: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A04_t02: Fail # co19 issue 463
-
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t01: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t02: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t03: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation/2_Const_A07_t01: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation/2_Const_A07_t02: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation/2_Const_A07_t03: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A03_t01: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A03_t02: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A04_t01: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A04_t02: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A04_t03: Fail # co19 issue 466
-Language/11_Expressions/11_Instance_Creation_A04_t04: Fail # co19 issue 466
-
-Language/13_Libraries_and_Scripts/1_Imports_A03_t02: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t05: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t22: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t25: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t42: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t45: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t62: Fail # 481
-Language/13_Libraries_and_Scripts/1_Imports_A03_t65: Fail # 481
-
-Language/14_Types/2_Dynamic_Type_System_A02_t01: Fail # co19 issue 481
-
-[ $compiler == dart2js && $checked ]
-
-Language/03_Overview/1_Scoping_A02_t30: Fail # co19 issue 463
-Language/09_Generics/09_Generics_A05_t02: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A05_t01: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A05_t02: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A05_t04: Fail # co19 issue 463
-Language/14_Types/8_Parameterized_Types_A02_t01: Fail # co19 issue 463
-
-Language/13_Libraries_and_Scripts/1_Imports_A03_t31: Fail # 481
-
-[ $compiler == dart2js && $unchecked ]
-LibTest/core/List/setRange_A05_t01: Fail # setRange throws StateError if there aren't enough elements in the iterable. Issue 402
-
-# Issues with co19 test suite in checked mode.
-[ $compiler == dart2js && $checked ]
-Language/11_Expressions/30_Identifier_Reference_A07_t01: Fail, OK # test should be marked type-error
-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/every_A01_t01: fail # Issue 400
-
-
-# Issues with co19 test suite in browsers.
-[ $compiler == dart2js && $browser ]
-Language/15_Reference/1_Lexical_Rules_A01_t10: Fail, OK # co19 issue 395
-
-# Issues with co19 test suite in minified mode.
-[ $compiler == dart2js && $minified ]
-Language/11_Expressions/18_Assignment_A05_t04: Fail, OK # co19 issue 396
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: Fail, OK # co19 issue 396
-
-
 [ $compiler == dart2js && $jscl ]
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A04_t01: Fail, Pass # issue 3333
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: Fail, Pass # issue 3333
-
-Language/11_Expressions/03_Numbers_A01_t06: Fail, OK # Requires bigint.
-Language/11_Expressions/03_Numbers_A01_t09: Fail, OK # Requires bigint.
-LibTest/core/Date/Date_A01_t03: Fail, OK # co19 issue 180
-LibTest/core/Date/year_A01_t01: Fail, OK # Requires big int.
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: Fail, OK # This is not rejected by V8.
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A04_t01: Fail, OK # co19 issue 92.
 LibTest/core/RegExp/firstMatch_A01_t01: Fail, OK # Bad test, use Match.regexp, not Match.pattern.
@@ -652,39 +257,15 @@
 Language/03_Overview/1_Scoping_A02_t07: Fail # duplicate definition of f(var f){f();}
 Language/03_Overview/2_Privacy_A01_t06: Fail # cannot resolve type _inaccessibleFuncType
 
-Language/11_Expressions/01_Constants_A12_t01: Fail # internal error: CompileTimeConstantEvaluator not implemented
-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
-
-
-# BUG(11331): Renamed Date to DateTime (issue 373, 374) but this only has an
-# impact on V8, because of the way method calls are evaluated. Needs more
-# investigation.
-[ $compiler == dart2js && $runtime == d8 ]
-Language/14_Types/6_Type_dynamic_A03_t01: Fail
-
-
 [ $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'
 LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: Fail # Expect.fail('Some exception expected')
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: Fail # Expect.fail('Some exception expected')
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: Fail # Expect.fail('Some exception expected')
 
-
-#
-# The following tests may be broken, but require further review.
-#
-[ $compiler == dart2js && $jscl ]
-LibTest/core/Expect/identical_A01_t01: Fail # TODO(floitsch): Is NaN identical to NaN?
-
-
 [ $compiler == dart2js && ($runtime == ie10 || $runtime == ff || $runtime == chrome || $runtime == drt || $runtime == safari || $runtime == opera) ]
 *: Skip
 
-
 #
 # Missing compile-time errors.
 #
@@ -720,21 +301,7 @@
 Language/07_Classes/4_Abstract_Instance_Members_A04_t01: Fail # Checks that a compile-time error is produced when the overriding abstract method has fewer named parameters than the instance method being overridden (2 vs 3) and neither  have any required parameters.
 Language/07_Classes/4_Abstract_Instance_Members_A04_t05: Fail # Checks that a compile-time error is produced when the overriding non-abstract  instance method has the same set of named parameters as the abstract method being overriden,  but in a different order.
 Language/07_Classes/4_Abstract_Instance_Members_A04_t06: Fail # Checks that a compile-time error is produced when the overriding non-abstract  instance method has almost the same set of named parameters as the abstract method being overriden,  except for one that has a different name.
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: Fail # Checks that error is produced if a final variable is not initialized in one  of the specified ways.
-Language/07_Classes/6_Constructors/3_Constant_Constructors_A03_t01: Fail # Checks that a compile-time error is produced when a class with constant  constructor also declares a non-final instance variable.
 Language/07_Classes/6_Constructors_A02_t01: Fail # Checks that a compile-error is produced when a named constructor definition does not begin with the name of its class.
-Language/11_Expressions/01_Constants_A16_t01: Fail # Checks that an IntegerDivisionByZeroException raised during evaluation  of a compile-time constant causes a compile-time error.
-Language/11_Expressions/01_Constants_A16_t02: Fail # Checks that an OutOfMemoryException raised during evaluation of a compile-time constant causes a compile-time error.
-Language/11_Expressions/05_Strings_A02_t46: Fail # Checks that multi-line strings that contain characters and sequences prohibited by this grammar, cause compile-time errors.
-Language/11_Expressions/05_Strings_A02_t48: Fail # Checks that multi-line strings that contain characters and sequences prohibited by this grammar, cause compile-time errors.
-Language/11_Expressions/22_Equality_A01_t15: Fail # Checks that equality expressions cannot be operands of another equality expression.
-Language/11_Expressions/22_Equality_A01_t16: Fail # Checks that equality expressions cannot be operands of another equality expression.
-Language/11_Expressions/23_Relational_Expressions_A01_t10: Fail # Checks that a relational expression cannot be the operand of another relational expression.
-Language/11_Expressions/23_Relational_Expressions_A01_t11: Fail # Checks that a relational expression cannot be the operand of another relational expression.
-Language/11_Expressions/23_Relational_Expressions_A01_t12: Fail # Checks that a relational expression cannot be the operand of another relational expression.
-Language/11_Expressions/23_Relational_Expressions_A01_t13: Fail # Checks that a relational expression cannot be the operand of another relational expression.
-Language/12_Statements/03_Variable_Declaration_A04_t01: Fail # Checks that if the variable declaration is prefixed with the const modifier, then variable must be initialized to a constant expression.
-Language/15_Reference/1_Lexical_Rules_A02_t06: Fail # Checks that Unicode whitespaces other than WHITESPACE are not permitted in the source code. Checks symbol U+00a0.
 
 #
 # Unexpected compile-time errors.
@@ -748,9 +315,6 @@
 Language/07_Classes/3_Setters_A04_t06: Fail # http://dartbug.com/5023
 Language/07_Classes/3_Setters_A04_t07: Fail # http://dartbug.com/5023
 
-Language/13_Libraries_and_Scripts/4_Scripts_A03_t01: Fail # http://dartbug.com/5683
-Language/13_Libraries_and_Scripts/4_Scripts_A03_t03: Fail # http://dartbug.com/5683
-
 Language/07_Classes/07_Classes_A03_t10: Fail # http://dartbug.com/6687
 
 
@@ -758,26 +322,280 @@
 # Unexpected runtime errors.
 #
 [ $compiler == dart2js ]
-#Language/11_Expressions/32_Type_Cast_A01_t01: Fail # http://dartbug.com/9074
-
-#Language/14_Types/4_Interface_Types_A08_t06: Fail # class Queue cannot be resolved.
-
-Language/14_Types/4_Interface_Types_A11_t04: Fail # http://dartbug.com/5020
-Language/14_Types/4_Interface_Types_A12_t10: Fail # http://dartbug.com/5020
-
 Language/03_Overview/1_Scoping_A01_t39: Fail # dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t01: Fail # dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t02: Fail # dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t03: Fail # dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t04: Fail # dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A06_t05: Fail # dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t01: Fail # dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t02: Fail # dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t03: Fail # dartbug.com/7202
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t04: Fail # dartbug.com/7202
 
-LibTest/core/String/charCodes_A01_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/charCodeAt_A02_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/charCodeAt_A03_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/charCodeAt_A01_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/splitChars_A01_t01: Fail # Deprecated string members removed (issue 382).
+
+# co19-roll r546 (11.08.2013) caused these failures
+[ $compiler == dart2js ]
+Language/05_Variables/05_Variables_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/07_Classes_A11_t01: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/07_Classes_A11_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t01: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t04: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/6_Constructors/3_Constant_Constructors_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A02_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A04_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A11_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A12_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A13_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A20_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings/1_String_Interpolation_A01_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings/1_String_Interpolation_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings/1_String_Interpolation_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings_A02_t46: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings_A02_t48: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings_A20_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A12_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/08_Throw_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A08_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A08_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A09_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A11_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A11_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/17_Getter_Invocation_A02_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A08_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/22_Equality_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/22_Equality_A01_t15: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/22_Equality_A01_t16: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/22_Equality_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/23_Relational_Expressions_A01_t10: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/23_Relational_Expressions_A01_t11: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/23_Relational_Expressions_A01_t12: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/23_Relational_Expressions_A01_t13: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A02_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A04_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A05_t12: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/33_Type_Cast_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/33_Type_Cast_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/33_Type_Cast_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/02_Expression_Statements_A01_t08: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t04: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t05: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t06: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t07: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t08: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/04_Local_Function_Declaration_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/06_For_A01_t11: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Return_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Return_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Return_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A07_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A02_t28: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A02_t29: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t08: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t09: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t10: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t27: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t28: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t29: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t30: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t47: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t48: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t49: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t50: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t67: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t68: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t69: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t70: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/3_Parts_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/4_Scripts_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t11: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t21: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t24: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t25: fail # co19-roll r546: Please triage this failure
+Language/15_Types/1_Static_Types_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t03: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t04: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t05: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A07_t01: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A07_t02: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A07_t03: fail # co19-roll r546: Please triage this failure
+Language/15_Types/3_Type_Declarations/1_Typedef_A07_t04: fail # co19-roll r546: Please triage this failure
+Language/15_Types/4_Interface_Types_A11_t01: crash # co19-roll r546: Please triage this failure
+Language/15_Types/4_Interface_Types_A11_t02: crash # co19-roll r546: Please triage this failure
+Language/15_Types/4_Interface_Types_A11_t04: fail # co19-roll r546: Please triage this failure
+Language/15_Types/4_Interface_Types_A12_t10: fail # co19-roll r546: Please triage this failure
+Language/16_Reference/1_Lexical_Rules/1_Reserved_Words_A40_t04: fail # co19-roll r546: Please triage this failure
+Language/16_Reference/1_Lexical_Rules/2_Comments_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/16_Reference/1_Lexical_Rules_A02_t06: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.periodic_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.periodic_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/run_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer.periodic_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/DateTime_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/isAtSameMomentAs_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/parse_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/year_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/double/parse_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Duration/operator_div_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/List_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/skip_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/take_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnFunction_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnFunction_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnFunction_A04_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnFunction_A04_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnFunction_A04_t03: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnUri_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnUri_A02_t03: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/streamSpawnFunction_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/streamSpawnFunction_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/streamSpawnFunction_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/streamSpawnFunction_A02_t03: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/add_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/add_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/addError_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/addError_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/operator_equality_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/any_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/contains_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A01_t01: fail # co19-roll r546: Please triage this failure
+Utils/tests/Expect/identical_A01_t01: fail # co19-roll r546: Please triage this failure
+Utils/tests/Expect/listEquals_A02_t01: fail # co19-roll r546: Please triage this failure
+Utils/tests/Expect/listEquals_A03_t01: fail # co19-roll r546: Please triage this failure
+Utils/tests/Expect/setEquals_A02_t01: fail # co19-roll r546: Please triage this failure
+
+# co19-roll r546 (11.08.2013) caused these failures
+[ $compiler == dart2js && $checked ]
+Language/10_Generics/09_Generics_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/10_Generics/09_Generics_A04_t06: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/06_Lists_A09_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/06_Lists_A09_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A10_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A11_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A07_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A12_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A09_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation_A01_t07: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/19_Conditional_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/20_Logical_Boolean_Expressions_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/27_Unary_Expressions_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/06_For/1_For_Loop_A01_t08: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t26: fail # co19-roll r546: Please triage this failure
+Language/15_Types/1_Static_Types_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/15_Types/1_Static_Types_A03_t04: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/asBroadcastStream_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/contains_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/contains_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/distinct_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/drain_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/firstWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/firstWhere_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/first_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/fold_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/fold_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/forEach_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/forEach_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/handleError_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/isBroadcast_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/lastWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/lastWhere_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/listen_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/listen_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/listen_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/map_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/reduce_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/reduce_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/singleWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/skip_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/take_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/take_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/toList_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/toSet_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/transform_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/where_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/where_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/drain_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/firstWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/firstWhere_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/fold_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/fold_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/lastWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/lastWhere_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/reduce_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/reduce_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/singleWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/take_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/transform_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/where_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/where_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamEventTransformer/bind_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/compareTo_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/getRange_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/join_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/removeAt_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Set/intersection_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/last_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/length_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/single_A01_t01: fail # co19-roll r546: Please triage this failure
+
+
+# Could this be dart issue 7728?
+# co19-roll r546 (11.08.2013) caused these failures
+[ $compiler == dart2js && ($runtime == d8 || $runtime == jsshell) ]
+LibTest/async/Future/Future.delayed_A01_t01: Fail # co19-roll r546: Please triage this failure
+LibTest/async/Future/Future.delayed_A01_t02: Fail # co19-roll r546: Please triage this failure
+LibTest/async/Future/Future.delayed_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/first_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/first_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.fromFuture_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.fromFuture_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.fromIterable_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.periodic_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/cancel_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer.periodic_A01_t01: fail # co19-roll r546: Please triage this failure
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 94e2291..96d4ddb 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -3,12 +3,6 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == none]
-Language/11_Expressions/33_Argument_Definition_Test_A01_t02: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A02_t01: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A02_t02: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A03_t01: Fail, OK # co19 issue 436
-Language/11_Expressions/33_Argument_Definition_Test_A03_t02: Fail, OK # co19 issue 436
-
 LibTest/math/max_A01_t03: Fail # co19 issue 467
 LibTest/math/min_A01_t03: Fail # co19 issue 467
 
@@ -17,72 +11,20 @@
 LibTest/core/Stopwatch/elapsed_A01_t03: Pass, Fail # Issue 12383.
 
 [ $runtime == vm ]
-Language/11_Expressions/33_Argument_Definition_Test_A02_t02: Crash, Pass # Issue 9597 (question-mark operator)
 Language/07_Classes/6_Constructors_A02_t01: Skip # co19 issue 415.
 
 [ $compiler == none && $runtime == vm ]
-
 # The following tests fail because they contain number literals with a + prefix (co19 issue 428)
 LibTest/core/double/floor_A01_t05: Fail # co19 issue 428
 LibTest/core/double/ceil_A01_t05: Fail # co19 issue 428
-Language/12_Statements/02_Expression_Statements_A01_t06: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t10: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t08: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t04: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t03: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t02: Fail # co19 issue 428
-Language/11_Expressions/03_Numbers_A01_t01: Fail # co19 issue 428
-Language/11_Expressions/01_Constants_A01_t01: Fail # co19 issue 428
 
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t04: Fail # Dart issue 5743
-Language/11_Expressions/01_Constants_A18_t06: Fail # co19 issue 468
-Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t10: Fail # co19 issue 469
-Language/12_Statements/03_Variable_Declaration_A04_t08: Fail # Issue 6871
-Language/13_Libraries_and_Scripts/1_Imports_A02_t12: Fail # Issue 11982
-Language/13_Libraries_and_Scripts/1_Imports_A02_t15: Fail # Issue 11982
-Language/15_Reference/1_Lexical_Rules_A01_t10: Fail # co19 issue 470
-LibTest/async/Future/Future.delayed_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/Future.delayed_A01_t02: Fail # co19 issue 471
-LibTest/async/Future/Future.delayed_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/asStream_A01_t01: Fail # co19 issue 472
-LibTest/async/Future/asStream_A01_t02: Fail # co19 issue 472
-LibTest/async/Future/asStream_A02_t01: Fail # co19 issue 472
-LibTest/async/Future/catchError_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/catchError_A03_t02: Fail # co19 issue 471
-LibTest/async/Future/catchError_A03_t03: Fail # co19 issue 471
-LibTest/async/Future/forEach_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/forEach_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/forEach_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/then_A01_t03: Fail # co19 issue 472
-LibTest/async/Future/then_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/then_A02_t02: Fail # co19 issue 473
-LibTest/async/Future/then_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/then_A04_t01: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t04: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t05: Fail # co19 issue 471
-LibTest/async/Future/wait_A01_t06: Fail # co19 issue 471
-LibTest/async/Future/wait_A02_t01: Fail # co19 issue 474
-LibTest/async/Future/wait_A02_t02: Fail # co19 issue 474
-LibTest/async/Future/whenComplete_A01_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A02_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A03_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A04_t01: Fail # co19 issue 471
-LibTest/async/Future/whenComplete_A04_t02: Fail # co19 issue 471
 LibTest/collection/Queue/iterator_current_A01_t02: Fail # co19 issue 475
 LibTest/collection/Queue/iterator_moveNext_A01_t02: Fail # co19 issue 475
-LibTest/core/List/List_A01_t02: Fail # co19 issue 476
-LibTest/core/double/toStringAsExponential_A02_t01: Fail # co19 issue 477
 LibTest/core/int/toStringAsExponential_A02_t01: Fail # co19 issue 477
 
-LibTest/core/Match/pattern_A01_t01: Fail # Issue 422
-LibTest/core/RegExp/allMatches_A01_t01: Fail # Issue 422
-
-Language/13_Libraries_and_Scripts/1_Imports_A02_t21: Crash # Dart issue 6060
-Language/13_Libraries_and_Scripts/1_Imports_A02_t22: Crash # Dart issue 6060
-
-Language/13_Libraries_and_Scripts/1_Imports_A04_t03: Fail # co19 issue 385
-Language/13_Libraries_and_Scripts/2_Exports_A05_t01: Fail # co19 issue 385
+LibTest/core/Match/pattern_A01_t01: Fail # co19 issue 422
+LibTest/core/RegExp/allMatches_A01_t01: Fail # co19 issue 422
 
 Language/07_Classes/4_Abstract_Instance_Members_A03_t02: Fail # Dart issue 978
 Language/07_Classes/4_Abstract_Instance_Members_A03_t03: Fail # Dart issue 978
@@ -92,296 +34,71 @@
 Language/07_Classes/4_Abstract_Instance_Members_A04_t06: Fail # Dart issue 978
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A04_t15: Fail # Dart issue 6954
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t01: Fail # co19 issue 426
-Language/11_Expressions/05_Strings_A02_t46: Fail # Dart issue 4009
-Language/11_Expressions/05_Strings_A02_t48: Fail # Dart issue 4009
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t09: Fail # Dart issue 1372
-Language/11_Expressions/11_Instance_Creation/2_Const_A10_t01: Fail # Dart issue 5775
-Language/11_Expressions/30_Identifier_Reference_A05_t02: Fail # Dart issue 2492
-Language/11_Expressions/30_Identifier_Reference_A08_t02: Fail # Dart issue 5802
-Language/12_Statements/03_Variable_Declaration_A04_t07: Fail # Dart issue 7305
-Language/12_Statements/04_Local_Function_Declaration_A02_t02: Fail # Dart issue 5773
-Language/12_Statements/06_For_A01_t11: Fail # Dart issue 5675
-Language/12_Statements/09_Switch_A01_t02: Fail # Dart issue 2238
-Language/12_Statements/09_Switch_A02_t01: Fail # Dart issue 7306
-Language/12_Statements/09_Switch_A02_t02: Fail # Dart issue 7307
-Language/12_Statements/09_Switch_A03_t01: Fail # Dart issue 7307
-Language/12_Statements/09_Switch_A03_t02: Fail # Dart issue 7307
-Language/12_Statements/09_Switch_A04_t01: Fail # Dart issue 6897
-Language/12_Statements/09_Switch_A06_t02: Fail # Dart issue 5837
-Language/12_Statements/10_Try_A03_t01: Fail # Dart issue 7311
-Language/12_Statements/10_Try_A03_t02: Fail # Dart issue 7311
-Language/12_Statements/10_Try_A03_t03: Fail # Dart issue 7311
-Language/12_Statements/12_Labels_A01_t03: Fail # Dart issue 2238
-Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t04: Fail # Dart issue 5839
-Language/13_Libraries_and_Scripts/1_Imports_A05_t01: Fail # Dart issue 3206
-Language/13_Libraries_and_Scripts/2_Exports_A04_t02: Fail # Dart issue 6134
-Language/13_Libraries_and_Scripts/2_Exports_A04_t03: Fail # Dart issue 6134
-Language/13_Libraries_and_Scripts/5_URIs_A01_t01: Fail # Dart issue 6352
-Language/13_Libraries_and_Scripts/5_URIs_A01_t04: Fail # Dart issue 7317
-Language/13_Libraries_and_Scripts/5_URIs_A01_t05: Fail # Dart issue 7317
-Language/13_Libraries_and_Scripts/5_URIs_A01_t11: Fail # Dart issue 6352
-Language/13_Libraries_and_Scripts/5_URIs_A01_t14: Fail # Dart issue 7317
-Language/13_Libraries_and_Scripts/5_URIs_A01_t15: Fail # Dart issue 7317
-Language/13_Libraries_and_Scripts/5_URIs_A01_t21: Fail # Dart issue 6352
-Language/14_Types/5_Function_Types_A01_t10: Fail # co19 issue 392
-Language/14_Types/5_Function_Types_A02_t06: Fail # co19 issue 392
 LibTest/core/double/parse_A02_t01: Fail # co19 issue 418
-LibTest/math/pow_A01_t01: Fail # Dart issue 7318
+LibTest/math/pow_A01_t01: Fail # co19 issue 44
 LibTest/math/pow_A11_t01: Fail # Dart issue 449
 LibTest/math/pow_A13_t01: Fail # Dart issue 449
 
-Language/05_Variables/05_Variables_A05_t04: Fail # Dart issue 5881
 Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t02: Fail # Dart issue 5802
 Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t05: Fail # Dart issue 5894
 
-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/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
-LibTest/core/double/floor_A01_t04: Fail # truncate/ceil/floor/round returns ints, issue 389
-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
+LibTest/core/double/truncate_A01_t03: Fail # truncate/ceil/floor/round returns ints, co19 issue 389
+LibTest/core/double/truncate_A01_t04: Fail # truncate/ceil/floor/round returns ints, co19 issue 389
+LibTest/core/double/ceil_A01_t03: Fail # truncate/ceil/floor/round returns ints, co19 issue 389
+LibTest/core/double/ceil_A01_t04: Fail # truncate/ceil/floor/round returns ints, co19 issue 389
+LibTest/core/double/floor_A01_t03: Fail # truncate/ceil/floor/round returns ints, co19 issue 389
+LibTest/core/double/floor_A01_t04: Fail # truncate/ceil/floor/round returns ints, co19 issue 389
+LibTest/core/double/round_A01_t02: Fail # truncate/ceil/floor/round returns ints, co19 issue 389
+LibTest/core/double/round_A01_t04: Fail # truncate/ceil/floor/round returns ints, co19 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
+Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t03: Fail # Issue 6085
 
-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
-
-LibTest/async/Future/catchError_A01_t01: Fail # Future constructors have changed # issues 408
-LibTest/async/Future/Future.immediateError_A01_t01: Fail # Future constructors have changed # issues 408
-LibTest/async/Future/asStream_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/Future.immediate_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/then_A01_t03: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/catchError_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/forEach_A03_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/asStream_A01_t02: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/Future.immediateError_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/async/Future/asStream_A02_t01: Fail # Future constructors have changed # issue 408
-
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: Fail, OK # co19 issue 409
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: Fail, OK # co19 issue 409
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail, OK # co19 issue 409
-Language/11_Expressions/17_Getter_Invocation_A02_t01: Fail, OK # co19 issue 409
-Language/11_Expressions/18_Assignment_A05_t02: Fail, OK # co19 issue 409
-Language/11_Expressions/18_Assignment_A05_t04: Fail, OK # co19 issue 409
-Language/11_Expressions/18_Assignment_A05_t05: Fail, OK # co19 issue 409
-Language/11_Expressions/18_Assignment_A08_t04: Fail, OK # co19 issue 409
-
-Language/11_Expressions/01_Constants_A16_t01: Fail # Not properly reporting exception in initializer expressions
-Language/11_Expressions/01_Constants_A16_t02: Fail # Not properly reporting exception in initializer expressions
-
-Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t03: Fail # co19 issue 458, potentially constant expression analysis
-
-Language/11_Expressions/01_Constants_A17_t03: Crash # issue 1681 (recursion in compile-time constant expression)
-Language/11_Expressions/01_Constants_A16_t02: Crash, Pass # Should result in OOM
+LibTest/async/Future/asStream_A01_t01: Fail # Future constructors have changed # co19 issue 408
+LibTest/async/Future/forEach_A03_t01: Fail # Future constructors have changed # co19 issue 408
+LibTest/async/Future/asStream_A01_t02: Fail # Future constructors have changed # co19 issue 408
+LibTest/async/Future/asStream_A02_t01: Fail # Future constructors have changed # co19 issue 408
 
 # Some of these tests are expected to fail for another reason. These are marked as Skip.
-Language/07_Classes/07_Classes_A02_t29: Skip # must not instantiate an abstract class, co19 issue 183
-Language/07_Classes/07_Classes_A02_t31: Skip # must not instantiate an abstract class, co19 issue 183
+Language/07_Classes/07_Classes_A02_t29: Skip # co19 issue 490
+Language/07_Classes/07_Classes_A02_t31: Skip # co19 issue 490
 
-# co19 175 - related to issue 4522, all need fixing, some passes because of temporary warning.
-Language/11_Expressions/07_Maps_A03_t01: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A04_t01: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A04_t02: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A06_t01: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A06_t02: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A07_t04: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A07_t03: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A08_t01: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A10_t01: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A10_t02: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A10_t03: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A10_t04: Pass, Fail # co19 175
-Language/11_Expressions/07_Maps_A10_t05: Pass, Fail # co19 175
+LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A03_t01: Fail # Issue 12508
+LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A02_t01: Fail # Issue 12508
+LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: Fail # Issue 12508
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: Fail # Issue 12508
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A04_t01: Fail # Issue 12508
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: Fail # Issue 12508
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: Fail # Issue 12508
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: Fail # Issue 12508
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: Fail # Issue 12508
 
-Language/11_Expressions/05_Strings_A02_t01: Skip # co19 issue 90.
-Language/11_Expressions/07_Maps_A01_t01: Skip # co19 issue 91: map literals illegal at statement beginning.
+LibTest/core/Match/operator_subscript_A01_t01: Fail # Issue 12508
+LibTest/core/RegExp/firstMatch_A01_t01: Fail # Issue 12508
+LibTest/core/double/toRadixString_A01_t01: Fail # co19 issue 491
+LibTest/core/int/toRadixString_A01_t01: Fail # co19 issue 492
 
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t01: Fail # issue 1604.
+LibTest/math/sin_A01_t01: Pass, Fail, OK # co19 issue 44
 
-LibTest/core/List/every_A03_t01: Skip # Promise removed (co19 issue #79)
+LibTest/isolate/SendPort/send_A02_t02: Skip # co19 issue 493
 
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A03_t01: Fail
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A02_t01: Fail
-LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: Fail
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: Fail
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A04_t01: Fail
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: Fail
+LibTest/core/String/contains_A01_t02: Fail  # Issue 12508
 
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: Fail
+LibTest/isolate/SendPort/send_A02_t03: Skip # co19 issue 495
 
-LibTest/core/Date/Date.fromString_A03_t01: Pass # Issue co19 - 121  (currently passing due to co19 issues 373 and 374)
-LibTest/core/Match/operator_subscript_A01_t01: Fail
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: Fail
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: Fail
-LibTest/core/RegExp/firstMatch_A01_t01: Fail
-LibTest/core/double/toRadixString_A01_t01: Fail # Issue 463
-LibTest/core/int/toRadixString_A01_t01: Fail # Issue 461
+LibTest/isolate/ReceivePort/receive_A01_t02: Fail # VM triage, check spec.
+LibTest/isolate/isolate_api/spawnUri_A02_t02: Fail # VM triage, check spec.
+LibTest/isolate/isolate_api/spawnUri_A02_t03: Fail # VM triage, check spec.
 
-LibTest/math/sin_A01_t01: Pass, Fail, OK # Issue co19 - 44
 
-LibTest/core/Date/toString_A02_t01: Fail # Argument error. Year 999999 is out of range. Needs to be specified (and then potentially reported to co19): issue 1878.
-LibTest/core/Date/year_A01_t01: Fail # Year out of range. Needs to be specified: issue 8808. Possibly a co19 bug.
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A15_t07: Fail $ co19 issue 494
 
-LibTest/isolate/SendPort/send_A02_t02: Skip # co19 issue 293
-LibTest/isolate/SendPort/send_A02_t03: Skip # co19 issue 293
-
-LibTest/core/Match/operator_subscript_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/firstMatch_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A02_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A03_t01: Fail, OK # co19 issue 294
-
-Language/11_Expressions/07_Maps_A07_t03: Fail, OK # co19 issue 287
-Language/11_Expressions/07_Maps_A04_t02: Fail, OK # co19 issue 287
-
-LibTest/core/String/contains_A01_t03: Skip # Times out.
-
-LibTest/core/String/contains_A01_t02: Fail
-
-Language/07_Classes/07_Classes_A02_t29: Fail
-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
-
-# parameter name or type expected
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A15_t07: Fail
-
-LibTest/core/Strings/join_A01_t01: Fail # Strings class has been removed. co19 issue 380
-LibTest/core/Strings/join_A04_t01: Fail # Strings class has been removed. co19 issue 380
-LibTest/core/Strings/concatAll_A01_t01: Fail # Strings class has been removed. co19 issue 380
-LibTest/core/Strings/concatAll_A04_t01: Fail # Strings class has been removed. co19 issue 380
-
-LibTest/core/String/charCodes_A01_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/charCodeAt_A02_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/charCodeAt_A03_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/charCodeAt_A01_t01: Fail # Deprecated string members removed (issue 382).
-LibTest/core/String/splitChars_A01_t01: Fail # Deprecated string members removed (issue 382).
-
-Language/14_Types/6_Type_dynamic_A03_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromString_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.fromString_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.now_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.now_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.now_A01_t03: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date.utc_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date_A01_t03: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/Date_A01_t04: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/add_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/add_A02_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/add_A03_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/compareTo_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/compareTo_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/day_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/difference_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/difference_A01_t02: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/hour_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/isUtc_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/millisecond_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/millisecondsSinceEpoch_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/minute_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/month_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_GE_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_GT_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_LE_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/operator_LT_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/second_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/subtract_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/subtract_A02_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/subtract_A03_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/timeZoneName_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/timeZoneOffset_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/toLocal_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/toString_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/toUtc_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-LibTest/core/Date/weekday_A01_t01: Fail # Renamed Date to DateTime (issue 373, 374)
-
-LibTest/core/StringBuffer/addAll_A01_t02: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/add_A01_t02: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/add_A01_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/addAll_A01_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/StringBuffer/toString_A01_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t02: Fail # StringBuffer renamed add to write. co19 issue 388.
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A04_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/12_Statements/01_Blocks_A01_t03: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/14_Function_Invocation/1_Actual_Argument_List_Evaluation_A02_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A01_t04: Fail # co19 issue 461
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t12: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t05: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A13_t03: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/11_Instance_Creation/1_New_A09_t06: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A04_t01: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: Fail # StringBuffer renamed add to write. co19 issue 388.
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail # StringBuffer renamed add to write. co19 issue 388.
-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/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
-Language/11_Expressions/11_Instance_Creation/1_New_A08_t02: Fail # Issue 397
-Language/11_Expressions/11_Instance_Creation/1_New_A08_t03: Fail # Issue 397
 LibTest/core/Iterable/where_A01_t07: Fail # Issue 397
-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/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
 
 LibTest/core/Iterable/any_A01_t04: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A01_t02: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A02_t01: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A02_t02: Fail # setRange now takes end-argument. Issue 402
-LibTest/core/List/setRange_A03_t01: Fail # setRange throws StateError if there aren't enough elements in the iterable. Issue 402
-LibTest/core/List/setRange_A03_t02: Fail # setRange throws StateError if there aren't enough elements in the iterable. Issue 402
-
-LibTest/core/List/removeRange_A01_t01: Fail # removeRange now takes end-argument. Issue 404
-LibTest/core/List/removeRange_A03_t01: Fail # removeRange now takes end-argument. Issue 404
-LibTest/core/List/removeRange_A05_t01: Fail # removeRange now takes end-argument. Issue 404
-
-LibTest/core/List/insertRange_A01_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A03_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A04_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A05_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/insertRange_A06_t01: Fail # insertRange is removed. Issue 403
-LibTest/core/List/every_A01_t01: Fail # insertRange is removed. Issue 403
-
-LibTest/async/Completer/completeError_A01_t01: Fail # No AsyncError anymore. Issue 407
-LibTest/async/Future/Future.immediateError_A01_t01: Fail # No AsyncError anymore. Issue 407
-LibTest/async/Future/catchError_A02_t01: Fail # No AsyncError anymore. Issue 407
-
-LibTest/async/Completer/complete_A01_t03: Fail # Completer is now asynchronous. Issue 419
-LibTest/async/Completer/complete_A01_t04: Fail # Completer is now asynchronous. Issue 419
-LibTest/async/Future/then_A01_t01: Fail # Completer is now asynchronous. Issue 419
-LibTest/async/Future/then_A01_t04: Fail # Completer is now asynchronous. Issue 419
 
 LibTest/core/String/indexOf_A01_t02: Fail # Issue 427
 LibTest/core/String/lastIndexOf_A01_t02: Fail # Issue 427
@@ -404,66 +121,15 @@
 
 Language/03_Overview/1_Scoping_A02_t28: Fail # Issue 463
 Language/03_Overview/2_Privacy_A01_t06: Fail # Issue 463
-Language/09_Generics/09_Generics_A05_t01: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t01: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t02: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation/1_New_A05_t03: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation/2_Const_A07_t01: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation/2_Const_A07_t02: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation/2_Const_A07_t03: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation_A03_t01: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation_A03_t02: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation_A04_t01: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation_A04_t02: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation_A04_t03: Fail # Issue 463
-Language/11_Expressions/11_Instance_Creation_A04_t04: Fail # Issue 463
-Language/11_Expressions/31_Type_Test_A04_t01: Fail # Issue 463
-Language/11_Expressions/31_Type_Test_A05_t01: Fail # Issue 463
-Language/11_Expressions/31_Type_Test_A05_t02: Fail # Issue 463
-Language/11_Expressions/31_Type_Test_A05_t03: Fail # Issue 463
-Language/11_Expressions/32_Type_Cast_A03_t01: Fail # Issue 463
-Language/11_Expressions/32_Type_Cast_A03_t02: Fail # Issue 463
-Language/11_Expressions/32_Type_Cast_A04_t01: Fail # Issue 463
-Language/11_Expressions/32_Type_Cast_A04_t02: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t02: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t05: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t08: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t22: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t25: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t28: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t42: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t45: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t48: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t62: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t65: Fail # Issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t68: Fail # Issue 463
-Language/14_Types/2_Dynamic_Type_System_A02_t01: Fail # Issue 463
 
 # end [ $compiler == none && $runtime == vm ]
 
 
-[ $compiler == none && $runtime == vm && $unchecked ]
-Language/11_Expressions/11_Instance_Creation_A05_t02: Fail # co19 issue 478
-
-LibTest/core/List/setRange_A05_t01: Fail # setRange now takes end-argument. Issue 402
-
-
 [ $compiler == none && $runtime == vm && $checked ]
-Language/03_Overview/1_Scoping_A02_t30: Fail # co19 issue 463
-Language/09_Generics/09_Generics_A05_t02: Fail # co19 issue 463
-Language/13_Libraries_and_Scripts/1_Imports_A03_t06: Fail # co19 issue 463, bound is mapped to dynamic, no error.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t26: Fail # co19 issue 463, bound is mapped to dynamic, no error.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t46: Fail # co19 issue 463, bound is mapped to dynamic, no error.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t66: Fail # co19 issue 463, bound is mapped to dynamic, no error.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t31: Fail # co19 issue 463
-Language/14_Types/8_Parameterized_Types_A02_t01: Fail # co19 issue 463
-
+LibTest/async/Future/catchError_A01_t01: Fail # Future constructors have changed # issue 408
+LibTest/core/List/every_A01_t01: Fail # insertRange is removed. Issue 403
+LibTest/core/List/getRange_A01_t01: Fail # getRange now takes end-argument and returns Iterable. Issue 399
 LibTest/core/Set/intersection_A03_t01: Fail # co19 issue 480
-
-LibTest/core/AssertionError/column_A01_t02: Fail # co19 issue 479
-LibTest/core/AssertionError/failedAssertion_A01_t01: Fail # co19 issue 479
-LibTest/core/AssertionError/line_A01_t02: Fail # co19 issue 479
-LibTest/core/AssertionError/url_A01_t01: Fail # co19 issue 479
 LibTest/core/TypeError/column_A01_t01: Fail # co19 issue 479
 LibTest/core/TypeError/dstName_A01_t01: Fail # co19 issue 479
 LibTest/core/TypeError/dstType_A01_t01: Fail # co19 issue 479
@@ -471,38 +137,8 @@
 LibTest/core/TypeError/line_A01_t01: Fail # co19 issue 479
 LibTest/core/TypeError/srcType_A01_t01: Fail # co19 issue 479
 LibTest/core/TypeError/url_A01_t01: Fail # co19 issue 479
-
-LibTest/core/Strings/concatAll_A04_t01: Fail, OK # checks for ArgumentError. TypeError is ok too. co19 issue 366
-LibTest/core/Strings/join_A04_t01: Fail, OK # checks for ArgumentError. TypeError is ok too. co19 issue 366
-
 LibTest/core/int/operator_division_A01_t01: Fail # ~/ returns ints, issue 361
 
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: Fail, OK # co19 issue 405
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: Fail, OK # co19 issue 405
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail, OK # co19 issue 405
-Language/11_Expressions/17_Getter_Invocation_A02_t01: Fail, OK # co19 issue 405
-Language/11_Expressions/18_Assignment_A05_t02: Fail, OK # co19 issue 405
-Language/11_Expressions/18_Assignment_A05_t04: Fail, OK # co19 issue 405
-Language/11_Expressions/18_Assignment_A05_t05: Fail, OK # co19 issue 405
-Language/11_Expressions/18_Assignment_A08_t04: Fail, OK # co19 issue 405
-Language/11_Expressions/30_Identifier_Reference_A07_t01: Fail, OK # co19 issue 460
-
-# Passing for the wrong reasons:
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t01: Pass # co19 issues 405 and 463
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t02: Pass # co19 issues 405 and 463
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t03: Pass # co19 issues 405 and 463
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t04: Pass # co19 issues 405 and 463
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t06: Pass # co19 issues 405 and 463
-Language/11_Expressions/17_Getter_Invocation_A02_t02: Pass # co19 issues 405 and 463
-
-Language/11_Expressions/32_Type_Cast_A05_t01: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A05_t02: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A05_t03: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A05_t04: Fail # co19 issue 463
-Language/11_Expressions/32_Type_Cast_A05_t05: Fail # co19 issue 463
-
-Language/12_Statements/09_Switch_A05_t01: Fail # co19 issue 442
-
 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
@@ -520,9 +156,12 @@
 
 #end [ $compiler == none && $runtime == vm && $checked ]
 
-
 [ $compiler == none && $runtime == vm && $mode == debug ]
 LibTest/isolate/isolate_api/spawnFunction_A02_t01: Crash
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A04_t02: Crash # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.periodic_A01_t01: Fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.periodic_A03_t01: Fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/contains_A02_t01: Fail # co19-roll r546: Please triage this failure
 
 [ $compiler == none && $runtime == vm && $system == macos ]
 LibTest/math/exp_A01_t01: Fail, OK # Issue co19 - 44
@@ -552,3 +191,211 @@
 
 [ $compiler == none && $runtime == vm && $arch == simmips ]
 LibTest/math/cos_A01_t01: Pass, Fail # Fail on Mac
+
+# co19-roll r546 (11.08.2013) caused these failures
+[ $compiler == none && $runtime == vm ]
+Language/05_Variables/05_Variables_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t03: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t04: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t05: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A06_t06: fail # co19-roll r546: Please triage this failure
+Language/05_Variables/05_Variables_A16_t02: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/07_Classes_A11_t02: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/07_Classes_A11_t04: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t01: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t04: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/3_Setters_A08_t05: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A16_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/01_Constants_A17_t03: crash # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t08: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/03_Numbers_A01_t10: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings/1_String_Interpolation_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings/1_String_Interpolation_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings_A02_t46: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings_A02_t48: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/05_Strings_A20_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/07_Maps_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t12: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A08_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A08_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A09_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A10_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/17_Getter_Invocation_A02_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t05: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/18_Assignment_A08_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A05_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/32_Type_Test_A04_t04: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/33_Type_Cast_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/33_Type_Cast_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/02_Expression_Statements_A01_t06: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t07: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/03_Variable_Declaration_A04_t08: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/06_For_A01_t11: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A01_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A02_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A02_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A03_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A04_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A06_t02: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A02_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/11_Try_A07_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/12_Labels_A01_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t04: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A02_t21: crash # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A02_t22: crash # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t09: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t10: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t27: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t29: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t30: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t47: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t49: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t50: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t67: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t69: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t70: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/2_Exports_A04_t02: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/2_Exports_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/2_Exports_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t01: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t04: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t05: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t11: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t14: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t15: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/5_URIs_A01_t21: fail # co19-roll r546: Please triage this failure
+Language/15_Types/1_Static_Types_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/16_Reference/1_Lexical_Rules/2_Comments_A04_t03: fail # co19-roll r546: Please triage this failure
+LibTest/async/Future/asStream_A01_t01: pass # co19-roll r546: Please triage this failure
+LibTest/async/Future/asStream_A01_t02: pass # co19-roll r546: Please triage this failure
+LibTest/async/Future/asStream_A02_t01: pass # co19-roll r546: Please triage this failure
+LibTest/async/Future/forEach_A03_t01: pass # co19-roll r546: Please triage this failure
+LibTest/async/StreamSink/close_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.periodic_A01_t01: fail, pass # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.periodic_A03_t01: fail, pass # co19-roll r546: Please triage this failure
+LibTest/async/Timer/run_A01_t01: fail, pass # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer_A02_t01: fail, pass # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer_A02_t01: fail, pass # co19-roll r546: Please triage this failure
+LibTest/async/Timer/Timer.periodic_A02_t01: fail, pass # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/isAtSameMomentAs_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/parse_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/year_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/double/parse_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/getRange_A04_t01: pass # co19-roll r546: Please triage this failure
+LibTest/core/List/skip_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/take_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnFunction_A04_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/streamSpawnFunction_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/addError_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateSink/addError_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/any_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/contains_A02_t01: fail, pass # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/SendPort/send_A02_t04: fail # co19-roll r546: Please triage this failure
+Utils/tests/Expect/listEquals_A02_t01: fail # co19-roll r546: Please triage this failure
+Utils/tests/Expect/listEquals_A03_t01: fail # co19-roll r546: Please triage this failure
+Utils/tests/Expect/setEquals_A02_t01: fail # co19-roll r546: Please triage this failure
+
+
+
+# co19-roll r546 (11.08.2013) caused these failures
+[ $compiler == none && $runtime == vm && $checked ]
+Language/12_Expressions/12_Instance_Creation_A01_t08: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A03_t26: fail # co19-roll r546: Please triage this failure
+Language/15_Types/1_Static_Types_A03_t03: fail # co19-roll r546: Please triage this failure
+Language/15_Types/1_Static_Types_A03_t04: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/asBroadcastStream_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/contains_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/contains_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/distinct_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/drain_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/firstWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/firstWhere_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/first_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/fold_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/fold_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/forEach_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/forEach_A02_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/handleError_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/isBroadcast_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/lastWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/lastWhere_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/listen_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/listen_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/listen_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/map_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/reduce_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/reduce_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/singleWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/skip_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/take_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/take_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/toList_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/toSet_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/transform_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/where_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/where_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/drain_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/firstWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/firstWhere_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/fold_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/fold_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/lastWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/lastWhere_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/reduce_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/reduce_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/singleWhere_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/take_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/transform_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/where_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/where_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/async/StreamEventTransformer/bind_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/compareTo_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/join_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/List/removeAt_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Set/intersection_A01_t01: pass # co19-roll r546: Please triage this failure
+LibTest/core/Set/intersection_A01_t03: pass # co19-roll r546: Please triage this failure
+LibTest/core/Set/intersection_A03_t01: pass # co19-roll r546: Please triage this failure
+LibTest/core/int/ceilToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/floorToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/roundToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/int/truncateToDouble_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/last_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/length_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/IsolateStream/single_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/isolate_api/spawnFunction_A03_t01: fail # co19-roll r546: Please triage this failure
+
+# co19-roll r546 (11.08.2013) caused these failures
+[ $compiler == none && $runtime == vm && $unchecked ]
+Language/12_Expressions/12_Instance_Creation/2_Const_A09_t02: Fail # co19-roll r546: Please triage this failure
+
diff --git a/tests/compiler/dart2js/cpa_inference_test.dart b/tests/compiler/dart2js/cpa_inference_test.dart
index abb669a..bbe7d38 100644
--- a/tests/compiler/dart2js/cpa_inference_test.dart
+++ b/tests/compiler/dart2js/cpa_inference_test.dart
@@ -3,9 +3,9 @@
 // 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';
+import '../../../sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart';
 
 import "parser_helper.dart";
 import "compiler_helper.dart";
diff --git a/tests/compiler/dart2js/licm_test.dart b/tests/compiler/dart2js/licm_test.dart
new file mode 100644
index 0000000..0b16cba
--- /dev/null
+++ b/tests/compiler/dart2js/licm_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.
+
+// Check that we hoist instructions in a loop condition, even if that
+// condition involves control flow.
+
+import 'package:expect/expect.dart';
+
+import 'compiler_helper.dart';
+
+const String TEST = '''
+var a = [1];
+
+main() {
+  int count = int.parse('42') == 42 ? 42 : null;
+  for (int i = 0; i < count && i < a[0]; i++) {
+    print(i);
+  }
+  a.removeLast();
+  // Ensure we don't try to generate a bailout method based on a check
+  // of [count].
+  count.removeLast();
+}
+''';
+
+main() {
+  compileAndMatch(
+      TEST, 'main', new RegExp("if \\(count == null\\)(.|\\n)*while"));
+}
diff --git a/tests/compiler/dart2js/list_tracer_test.dart b/tests/compiler/dart2js/list_tracer_test.dart
index 691c95b..c9b9791 100644
--- a/tests/compiler/dart2js/list_tracer_test.dart
+++ b/tests/compiler/dart2js/list_tracer_test.dart
@@ -154,14 +154,14 @@
   listOnlySetWithConstraint[0]++;
 
   listEscapingInSetterValue[0] = anInt;
-  new A().callSetter = listEscapingInSetterValue;
+  new A(null).callSetter = listEscapingInSetterValue;
 
   listEscapingInIndex[0] = anInt;
-  new A()[listEscapingInIndex];
+  new A(null)[listEscapingInIndex];
 
-  new A()[listEscapingInIndexSet] = 42;
+  new A(null)[listEscapingInIndexSet] = 42;
 
-  new A()[listEscapingTwiceInIndexSet] = listEscapingTwiceInIndexSet;
+  new A(null)[listEscapingTwiceInIndexSet] = listEscapingTwiceInIndexSet;
 
   listPassedAsOptionalParameter[0] = anInt;
   takeOptional(listPassedAsOptionalParameter);
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index ec113a8..2d72fc5 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -164,6 +164,7 @@
   getInterceptor(x) {}
   getNativeInterceptor(x) {}
   var dispatchPropertyName;
+  var mapTypeToInterceptor;
   getDispatchProperty(o) {}
   initializeDispatchProperty(f,p,i) {}
   initializeDispatchPropertyCSP(f,p,i) {}
diff --git a/tests/compiler/dart2js/no_such_method_codegen_test.dart b/tests/compiler/dart2js/no_such_method_codegen_test.dart
new file mode 100644
index 0000000..85777ad
--- /dev/null
+++ b/tests/compiler/dart2js/no_such_method_codegen_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// The mock compiler of dart2js used to make the compiler crash on
+// this program.
+//
+// The SSA backend generates a call to a throwNoSuchMethod helper for
+// the access to `foo`, and we used to not infer return types of
+// helpers, so we did not know throwNoSuchMethod was not returning.
+// As a consequence, all operator[] had to be compiled, and due to
+// missing backend dependencies, some of them were not resolved.
+
+import 'compiler_helper.dart';
+
+const String TEST = '''
+main() => foo[42];
+''';
+
+main() {
+  Uri uri = new Uri(scheme: 'source');
+  var compiler = compilerFor(TEST, uri);
+  compiler.runCompiler(uri);
+}
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index 112ba50..8587e3e 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -76,6 +76,7 @@
   testIncrementsAndDecrements();
   testOverrideHashCodeCheck();
   testSupertypeOrder();
+  testConstructorArgumentMismatch();
 }
 
 testSupertypeOrder() {
@@ -575,6 +576,20 @@
   Expect.isTrue(element.isSynthesized);
 }
 
+testConstructorArgumentMismatch() {
+  String script = "class A {} foo() { print(new A(42)); }";
+  MockCompiler compiler = new MockCompiler();
+  compiler.parseScript(script);
+  FunctionElement fooElement = compiler.mainApp.find(buildSourceString('foo'));
+  Expect.isNotNull(fooElement);
+  fooElement.parseNode(compiler);
+  compiler.resolver.resolve(fooElement);
+
+  compareWarningKinds(
+      script, [MessageKind.INVALID_ARGUMENTS.warning], compiler.warnings);
+  compareWarningKinds(script, [], compiler.errors);
+}
+
 testTopLevelFields() {
   MockCompiler compiler = new MockCompiler();
   compiler.parseScript("int a;");
diff --git a/tests/compiler/dart2js/simple_inferrer_test.dart b/tests/compiler/dart2js/simple_inferrer_test.dart
index b62a220..74194b5 100644
--- a/tests/compiler/dart2js/simple_inferrer_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_test.dart
@@ -233,6 +233,24 @@
   }
 }
 
+testIf1(a) {
+  var c = null;
+  if (a) {
+    c = 10;
+  } else {
+  }
+  return c;
+}
+
+testIf2(a) {
+  var c = null;
+  if (a) {
+  } else {
+    c = 10;
+  }
+  return c;
+}
+
 returnAsString() {
   return topLevelGetter() as String;
 }
@@ -503,6 +521,8 @@
   testIsCheck18(topLevelGetter());
   testIsCheck19(topLevelGetter());
   testIsCheck20();
+  testIf1(topLevelGetter());
+  testIf2(topLevelGetter());
   returnAsString();
   returnIntAsNum();
   returnAsTypedef();
@@ -602,6 +622,8 @@
   checkReturn('testIsCheck18', typesTask.dynamicType);
   checkReturn('testIsCheck19', typesTask.dynamicType);
   checkReturn('testIsCheck20', typesTask.dynamicType.nonNullable());
+  checkReturn('testIf1', typesTask.intType.nullable());
+  checkReturn('testIf2', typesTask.intType.nullable());
   checkReturn('returnAsString',
       new TypeMask.subtype(compiler.stringClass.computeType(compiler)));
   checkReturn('returnIntAsNum', typesTask.intType);
diff --git a/tests/compiler/dart2js_native/inference_of_helper_methods_test.dart b/tests/compiler/dart2js_native/inference_of_helper_methods_test.dart
new file mode 100644
index 0000000..7d821c3
--- /dev/null
+++ b/tests/compiler/dart2js_native/inference_of_helper_methods_test.dart
@@ -0,0 +1,32 @@
+// 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:_js_helper' show intTypeCheck;
+
+bool get inCheckedMode {
+  try {
+    String a = 42;
+  } on TypeError catch (e) {
+    return true;
+  }
+  return false;
+}
+
+main() {
+  var a = [];
+  a.add(42);
+  a.add('foo');
+  // By calling direclty [intTypeCheck] with an int, we're making the
+  // type inferrer infer that the parameter type of [intTypeCheck] is
+  // always an int, and therefore the method will be compiled to
+  // never throw. So when the backend actually uses the helper for
+  // implementing checked mode semantics (like in the check below),
+  // the check won't fail at runtime.
+  intTypeCheck(42);
+  if (inCheckedMode) {
+    int value;
+    Expect.throws(() => value = a[1], (e) => e is TypeError);
+  }
+}
diff --git a/tests/compiler/dart2js_native/subclassing_1_test.dart b/tests/compiler/dart2js_native/subclassing_1_test.dart
new file mode 100644
index 0000000..b90366a
--- /dev/null
+++ b/tests/compiler/dart2js_native/subclassing_1_test.dart
@@ -0,0 +1,58 @@
+// 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:_js_helper' show Creates, setNativeSubclassDispatchRecord;
+import 'dart:_interceptors' show findInterceptorForType;
+
+// Test that subclasses of native classes can be defined by setting the dispatch
+// record.
+
+class A native "A" {
+  foo(x) =>  '$x,${this.oof()}';
+  oof() => 'A';
+}
+
+class B extends A {
+  oof() => 'B';
+}
+
+B makeB1() native;
+B makeB2() native;
+B makeC() native;
+
+@Creates('=Object')
+getBPrototype() native;
+
+@Creates('=Object')
+getCPrototype() native;
+
+void setup() native r"""
+function A() {}
+function B() {}
+function C() {}
+makeA = function(){return new A;};
+makeB1 = function(){return new B;};
+makeB2 = function(){return new B;};
+makeC = function(){return new C;};
+
+getBPrototype = function(){return B.prototype;};
+getCPrototype = function(){return C.prototype;};
+""";
+
+main() {
+  setup();
+
+  setNativeSubclassDispatchRecord(getBPrototype(), findInterceptorForType(B));
+  setNativeSubclassDispatchRecord(getCPrototype(), findInterceptorForType(B));
+
+  B b1 = makeB1();
+  Expect.equals('1,B', b1.foo(1));
+
+  B b2 = makeB2();
+  Expect.equals('2,B', b2.foo(2));
+
+  B b3 = makeC();
+  Expect.equals('3,B', b3.foo(3));
+}
diff --git a/tests/compiler/dart2js_native/subclassing_2_test.dart b/tests/compiler/dart2js_native/subclassing_2_test.dart
new file mode 100644
index 0000000..f8b93aa
--- /dev/null
+++ b/tests/compiler/dart2js_native/subclassing_2_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+import 'dart:_js_helper' show Creates, setNativeSubclassDispatchRecord;
+import 'dart:_interceptors' show findInterceptorForType;
+
+// Test calling convention of methods introduced on subclasses of native
+// classes.
+
+doFoo(r, x) => '$x,${r.oof()}';
+
+class A native "A" {
+  foo(x) => (doFoo)(this, x);
+}
+
+class B extends A {
+  // [oof] is introduced only on this subclass of a native class.  It should
+  // have interceptor calling convention.
+  oof() => 'B';
+}
+
+B makeB() native;
+
+@Creates('=Object')
+getBPrototype() native;
+
+void setup() native r"""
+function A() {}
+function B() {}
+makeA = function(){return new A;};
+makeB = function(){return new B;};
+
+getBPrototype = function(){return B.prototype;};
+""";
+
+main() {
+  setup();
+
+  setNativeSubclassDispatchRecord(getBPrototype(), findInterceptorForType(B));
+
+  B b = makeB();
+  Expect.equals('1,B', b.foo(1));
+}
diff --git a/tests/compiler/dart2js_native/subclassing_3_test.dart b/tests/compiler/dart2js_native/subclassing_3_test.dart
new file mode 100644
index 0000000..d73f0c8
--- /dev/null
+++ b/tests/compiler/dart2js_native/subclassing_3_test.dart
@@ -0,0 +1,50 @@
+// 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:_js_helper' show Creates, setNativeSubclassDispatchRecord;
+import 'dart:_interceptors' show Interceptor, findInterceptorForType;
+
+// Test calling convention of methods introduced on subclasses of native
+// class of mixin.
+
+doFoo(r, x) => '$x,${r.oof()},${r.miz()}';
+
+class M {
+  miz() => 'M';
+}
+
+class N native "N" {
+  foo(x) => (doFoo)(this, x);
+}
+
+class A extends N {}
+
+class B extends A with M {
+  // [oof] is introduced only on this subclass of a native class.  It should
+  // have interceptor calling convention.
+  oof() => 'B';
+  // [miz] is introduced only on the mixin-application A+M.
+}
+
+B makeB() native;
+
+@Creates('=Object')
+getBPrototype() native;
+
+void setup() native r"""
+function B() {}
+makeB = function(){return new B;};
+
+getBPrototype = function(){return B.prototype;};
+""";
+
+main() {
+  setup();
+
+  setNativeSubclassDispatchRecord(getBPrototype(), findInterceptorForType(B));
+
+  B b = makeB();
+  Expect.equals('1,B,M', b.foo(1));
+}
diff --git a/tests/compiler/dart2js_native/subclassing_4_test.dart b/tests/compiler/dart2js_native/subclassing_4_test.dart
new file mode 100644
index 0000000..9d25e1a
--- /dev/null
+++ b/tests/compiler/dart2js_native/subclassing_4_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+import 'dart:_js_helper' show Creates, setNativeSubclassDispatchRecord;
+import 'dart:_interceptors' show Interceptor, findInterceptorForType;
+
+// Test calling convention on subclasses of native classes.
+
+class M {
+  miz() => 'M';
+}
+
+class N native "N" {}
+
+class A extends N {}
+
+class B extends A with M {
+  // The call to [miz] has a know type [B].  The call is in an intercepted
+  // method and to an intercepted method, so the ambient interceptor can be
+  // used.  For correct optimization of the interceptor, the compiler needs to
+  // (1) correctly determine that B is an intercepted type (because it extends a
+  // native class) and (2) realize that the intersection of [B] and subclasses
+  // of mixin applications of [M] is non-empty.
+  callMiz() => this.miz();
+}
+
+B makeB() native;
+
+@Creates('=Object')
+getBPrototype() native;
+
+void setup() native r"""
+function B() {}
+makeB = function(){return new B;};
+getBPrototype = function(){return B.prototype;};
+""";
+
+main() {
+  setup();
+
+  setNativeSubclassDispatchRecord(getBPrototype(), findInterceptorForType(B));
+
+  B b = makeB();
+  Expect.equals('M', b.callMiz());
+}
diff --git a/tests/corelib/safe_to_string_test.dart b/tests/corelib/safe_to_string_test.dart
index 10be1f7..233eb5d 100644
--- a/tests/corelib/safe_to_string_test.dart
+++ b/tests/corelib/safe_to_string_test.dart
@@ -15,6 +15,16 @@
 
   Expect.stringEquals(r'"\\\"\n\r"', Error.safeToString('\\"\n\r'));
 
+  Expect.stringEquals(r'"\x00\x01\x02\x03\x04\x05\x06\x07"',
+                      Error.safeToString('\x00\x01\x02\x03\x04\x05\x06\x07'));
+  Expect.stringEquals(r'"\x08\t\n\x0b\x0c\r\x0e\x0f"',
+                      Error.safeToString('\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'));
+  Expect.stringEquals(r'"\x10\x11\x12\x13\x14\x15\x16\x17"',
+                      Error.safeToString('\x10\x11\x12\x13\x14\x15\x16\x17'));
+  Expect.stringEquals(r'"\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"',
+                      Error.safeToString('\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f'));
+  Expect.stringEquals('" "', Error.safeToString(" "));
+
   Expect.stringEquals('null', Error.safeToString(null));
   Expect.stringEquals('true', Error.safeToString(true));
   Expect.stringEquals('false', Error.safeToString(false));
diff --git a/tests/html/custom_elements_test.dart b/tests/html/custom_elements_test.dart
index 666a0a3..a78892b 100644
--- a/tests/html/custom_elements_test.dart
+++ b/tests/html/custom_elements_test.dart
@@ -7,18 +7,32 @@
 import '../../pkg/unittest/lib/html_individual_config.dart';
 import 'dart:html';
 
-class CustomType extends Element {
-  factory CustomType() => null;
+class CustomMixin {
+  var mixinMethodCalled;
 
-  bool onCreatedCalled = false;
+  void mixinMethod() {
+    mixinMethodCalled = true;
+  }
+}
+
+class CustomType extends HtmlElement with CustomMixin{
+  factory CustomType() => null;
+  bool onCreatedCalled; // = false;
   void onCreated() {
     onCreatedCalled = true;
     customCreatedCount++;
   }
+
+  void invokeMixinMethod() {
+    mixinMethod();
+  }
 }
 
 int customCreatedCount = 0;
 
+int nextTagId = 0;
+String get nextTag => 'x-type${nextTagId++}';
+
 class NotAnElement {}
 
 main() {
@@ -26,42 +40,45 @@
 
   group('register', () {
     test('register', () {
-      document.register('x-type1', CustomType);
+      var tag = nextTag;
+      document.register(tag, CustomType);
 
-      var element = new Element.tag('x-type1');
+      var element = new Element.tag(tag);
       expect(element, isNotNull);
       expect(element is CustomType, isTrue);
       expect(element.onCreatedCalled, isTrue);
     });
 
     test('register twice', () {
-      document.register('x-type2', CustomType);
+      var tag = nextTag;
+      document.register(tag, CustomType);
       expect(() {
-        document.register('x-type2', CustomType);
+        document.register(tag, CustomType);
       }, throws, reason: 'Cannot register a tag more than once.');
 
-      document.register('x-type3', CustomType);
+      var newTag = nextTag;
+      document.register(newTag, CustomType);
 
-      var element = new Element.tag('x-type3');
+      var element = new Element.tag(newTag);
       expect(element, isNotNull);
       expect(element is CustomType, isTrue);
     });
 
     test('register null', () {
       expect(() {
-        document.register('x-type4', null);
+        document.register(nextTag, null);
       }, throws, reason: 'Cannot register a null type.');
     });
 
     test('register native', () {
       expect(() {
-        document.register('x-type5', BodyElement);
+        document.register(nextTag, BodyElement);
       }, throws, reason: 'Cannot register a native element.');
     });
 
     test('register non-element', () {
       expect(() {
-        document.register('x-type6', NotAnElement);
+        document.register(nextTag, NotAnElement);
       }, throws, reason: 'Cannot register a non-element.');
     });
   });
@@ -69,16 +86,18 @@
   group('preregister', () {
     // TODO(vsm): Modify this test once we agree on the proper semantics.
     test('pre-registration construction', () {
-      var dom = new Element.html('<div><x-type7></x-type7></div>');
+      var tag = nextTag;
+      var dom = new Element.html('<div><$tag></$tag></div>');
       var preElement = dom.children[0];
       expect(preElement, isNotNull);
-      expect(preElement is UnknownElement, isTrue);
+      expect(preElement is HtmlElement, isTrue);
+      expect(preElement is CustomType, isFalse);
       var firedOnPre = false;
       preElement.onFocus.listen((_) {
         firedOnPre = true;
       });
 
-      document.register('x-type7', CustomType);
+      document.register(tag, CustomType);
 
       var postElement = dom.children[0];
       expect(postElement, isNotNull);
@@ -86,44 +105,69 @@
       expect(postElement.onCreatedCalled, isTrue);
 
       // Element from first query remains an UnknownElement.
-      expect(preElement is UnknownElement, isTrue);
-      expect(preElement.parent, isNull);
+      expect(preElement is HtmlElement, isTrue);
+      expect(preElement.parent, dom);
       expect(dom.children.length, 1);
 
       var firedOnPost = false;
       postElement.onFocus.listen((_) {
         firedOnPost = true;
       });
-      // Event handlers should not persist to new element.
+      // Event handlers persist on old and new element.
       postElement.dispatchEvent(new Event('focus'));
-      expect(firedOnPre, isFalse);
+      expect(firedOnPre, isTrue);
       expect(firedOnPost, isTrue);
     });
   });
 
   group('innerHtml', () {
     test('query', () {
-      document.register('x-type8', CustomType);
+      var tag = nextTag;
+      document.register(tag, CustomType);
       var element = new DivElement();
-      element.innerHtml = '<x-type8></x-type8>';
+      element.innerHtml = '<$tag></$tag>';
       document.body.nodes.add(element);
-      var queried = query('x-type8');
+      var queried = query(tag);
 
       expect(queried, isNotNull);
       expect(queried is CustomType, isTrue);
       expect(queried.onCreatedCalled, isTrue);
     });
+
+    test('query id', () {
+      var tag = nextTag;
+      document.register(tag, CustomType);
+      var element = new DivElement();
+      element.innerHtml = '<$tag id="someid"></$tag>';
+      document.body.nodes.add(element);
+      var queried = query('#someid');
+
+      expect(queried, isNotNull);
+      expect(queried is CustomType, isTrue);
+      expect(queried.id, "someid");
+    });
   });
 
   group('lifecycle', () {
     test('onCreated', () {
       int oldCount = customCreatedCount;
-
-      document.register('x-type9', CustomType);
+      var tag = nextTag;
+      document.register(tag, CustomType);
       var element = new DivElement();
-      element.innerHtml = '<x-type9></x-type9>';
+      element.innerHtml = '<$tag></$tag>';
       document.body.nodes.add(element);
       expect(customCreatedCount, oldCount + 1);
     });
   });
+
+  group('mixins', () {
+    test('can invoke mixin methods', () {
+      var tag = nextTag;
+      document.register(tag, CustomType);
+
+      var element = new Element.tag(tag);
+      element.invokeMixinMethod();
+      expect(element.mixinMethodCalled, isTrue);
+    });
+  });
 }
diff --git a/tests/html/element_types_test.dart b/tests/html/element_types_test.dart
index 2638d3a..960bb16 100644
--- a/tests/html/element_types_test.dart
+++ b/tests/html/element_types_test.dart
@@ -116,7 +116,7 @@
     check('form', () => new FormElement() is FormElement);
     check('head', () => new HeadElement() is HeadElement);
     check('hr', () => new HRElement() is HRElement);
-    check('html', () => new HtmlElement() is HtmlElement);
+    check('html', () => new HtmlHtmlElement() is HtmlHtmlElement);
     check('h1', () => new HeadingElement.h1() is HeadingElement);
     check('h2', () => new HeadingElement.h2() is HeadingElement);
     check('h3', () => new HeadingElement.h3() is HeadingElement);
diff --git a/tests/html/html.status b/tests/html/html.status
index a39b862..8cdf46d 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -6,16 +6,7 @@
 event_test: Skip  # Issue 1996
 interactive_test: Skip # Must be run manually.
 
-# Issue 9326
-custom_elements_test/preregister: Fail
-custom_elements_test/lifecycle: Fail
-
-[ $compiler == dart2js ]
-# Document.register is unimplemented.
-custom_elements_test: Skip
-
-[ $compiler == dartanalyzer || $compiler == dart2analyzer ]
-# Document.register is unimplemented.
+[ $compiler == dart2js && $runtime != drt ]
 custom_elements_test: Skip
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium) && $mode == debug && $system == macos]
@@ -24,6 +15,8 @@
 [ $compiler == none && ($runtime == drt || $runtime == dartium) ]
 # postMessage in dartium always transfers the typed array buffer, never a view
 postmessage_structured_test/typed_arrays: Fail
+events_test: Pass, Fail # Issue 12489
+custom_elements_test/lifecycle: Fail   # Issue 9326 - Implement "extends Element" in dartium
 
 [ $compiler == none && $runtime == drt && $system == windows ]
 worker_test/functional: Pass, Crash # Issue 9929.
diff --git a/tests/language/closure_in_initializer2_test.dart b/tests/language/closure_in_initializer2_test.dart
index b44b0c7..a782c64 100644
--- a/tests/language/closure_in_initializer2_test.dart
+++ b/tests/language/closure_in_initializer2_test.dart
@@ -2,12 +2,16 @@
 // for 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 a parameter used in a closure is properly boxed.
+
 import "package:expect/expect.dart";
 
-class S {
+abstract class S {
   S() {
     Expect.equals(2, this.f());
   }
+
+  get f;
 }
 
 class A extends S {
diff --git a/tests/language/closure_in_initializer_test.dart b/tests/language/closure_in_initializer_test.dart
index 04f1033..7697bbe 100644
--- a/tests/language/closure_in_initializer_test.dart
+++ b/tests/language/closure_in_initializer_test.dart
@@ -2,6 +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.
 
+// Test that a parameter used in two different closures defined in a
+// constructor initializer, is properly boxed.
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/language/create_unresolved_type_test.dart b/tests/language/create_unresolved_type_test.dart
new file mode 100644
index 0000000..ceaf6dc
--- /dev/null
+++ b/tests/language/create_unresolved_type_test.dart
@@ -0,0 +1,7 @@
+// 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.
+
+main() {
+  new F<int>();  /// 01: runtime error, static type warning
+}
diff --git a/tests/language/language.status b/tests/language/language.status
index 97d31b4..a16ddfb 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -299,3 +299,12 @@
 prefix22_test: Pass
 invocation_mirror_test: Fail, OK # hardcoded names.
 super_call4_test: Fail, OK # hardcoded names.
+
+[ $compiler == dart2js || $compiler == dart2dart]
+null_test/03: Fail    # Issue 12445.
+
+[ $compiler == dart2js ]
+null_test/none: Fail  # Issue 12482
+
+[ $compiler == dartanalyzer ]
+null_test/03: Fail  # Issue 12484
diff --git a/tests/language/no_such_constructor2_test.dart b/tests/language/no_such_constructor2_test.dart
new file mode 100644
index 0000000..1c2236e
--- /dev/null
+++ b/tests/language/no_such_constructor2_test.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class A {
+  A();
+}
+
+main() {
+  Expect.throws(() => new A(42), (e) => e is NoSuchMethodError);
+}
diff --git a/tests/language/no_such_constructor_test.dart b/tests/language/no_such_constructor_test.dart
new file mode 100644
index 0000000..40ade74
--- /dev/null
+++ b/tests/language/no_such_constructor_test.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class A {
+  A();
+}
+
+main() {
+  new A(42); /// 01: static type warning, runtime error
+}
diff --git a/tests/language/null_is_test.dart b/tests/language/null_is_test.dart
index 395d474..380dbce 100644
--- a/tests/language/null_is_test.dart
+++ b/tests/language/null_is_test.dart
@@ -6,10 +6,41 @@
 
 main() {
   Expect.isTrue(null is Object);
+  Expect.isTrue(null is Null);
   Expect.isFalse(null is int);
   Expect.isFalse(null is bool);
   Expect.isFalse(null is num);
   Expect.isFalse(null is String);
   Expect.isFalse(null is List);
   Expect.isFalse(null is Expect);
+
+  test(null);
+
+  Expect.isFalse(1 is Null);
+  Expect.isFalse("1" is Null);
+  Expect.isFalse(true is Null);
+  Expect.isFalse(false is Null);
+  Expect.isFalse(new Object() is Null);
+
+  testNegative(1);
+  testNegative("1");
+  testNegative(true);
+  testNegative(false);
+  testNegative(new Object());
+}
+
+test(n) {
+  // Test where the argument is not a compile-time constant.
+  Expect.isTrue(n is Object);
+  Expect.isTrue(n is Null);
+  Expect.isFalse(n is int);
+  Expect.isFalse(n is bool);
+  Expect.isFalse(n is num);
+  Expect.isFalse(n is String);
+  Expect.isFalse(n is List);
+  Expect.isFalse(n is Expect);
+}
+
+testNegative(n){
+  Expect.isFalse(n is Null);
 }
diff --git a/tests/language/null_test.dart b/tests/language/null_test.dart
index 6ce22ee..c499c50 100644
--- a/tests/language/null_test.dart
+++ b/tests/language/null_test.dart
@@ -1,54 +1,204 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Second dart test program.
 
+// VMOptions=--optimization-counter-threshold=5
+
+import "dart:mirrors";
 import "package:expect/expect.dart";
 
-class NullTest {
-  static int foo(var obj) {
-    Expect.equals(null, obj);
-  }
+class BadInherit
+  extends Null     /// 01: compile-time error
+  implements Null  /// 02: compile-time error
+  extends Object with Null  /// 03: compile-time error
+    {}
 
-  static bool compareToNull(var value) {
-    return null == value;
-  }
-
-  static bool compareWithNull(var value) {
-    return value == null;
-  }
-
-  static int testMain() {
-    var val = 1;
-    var obj = null;
-
-    Expect.equals(null, obj);
-    Expect.equals(null, null);
-
-    foo(obj);
-    foo(null);
-
-    if (obj != null) {
-      foo(null);
-    } else {
-      foo(obj);
-    }
-
-    Expect.isFalse(compareToNull(val));
-    Expect.isTrue(compareToNull(obj));
-    Expect.isFalse(compareWithNull(val));
-    Expect.isTrue(compareWithNull(obj));
-    Expect.isTrue(obj is Object);
-    Expect.isFalse(obj is String);
-    Expect.isTrue(obj is !String);
-    Expect.isFalse(obj is !Object);
-    Expect.isFalse(val is !Object);
-
-    return 0;
+class EqualsNotCalled {
+  int get hashCode => throw "And don't warn!";
+  bool operator==(Object other) {
+    throw "SHOULD NOT GET HERE";
   }
 }
 
+class Generic<T> {
+  bool test(o) => o is T;
+  T cast(o) => o as T;
+  Type get type => T;
+}
 
-main() {
-  NullTest.testMain();
+class Generic2<T, S> {
+  bool test(o) => new Generic<T>().test(o);
+  T cast(o) => new Generic<T>().cast(o);
+  Type get type => new Generic<T>().type;
+}
+
+// Magic incantation to avoid the compiler recognizing the constant values
+// at compile time. If the result is computed at compile time, the dynamic code
+// will not be tested.
+confuse(x) {
+  try { throw [x]; } on dynamic catch (e) { return e[0]; }
+  return 42;
+}
+
+void main() {
+  for (int i = 0; i < 10; i++) {
+    test();
+  }
+}
+
+void test() {
+  new BadInherit();  // Make sure class is referenced.
+
+  int foo(var obj) {
+    Expect.equals(null, obj);
+  }
+
+  bool compareToNull(var value) {
+    return null == value;
+  }
+
+  bool compareWithNull(var value) {
+    return value == null;
+  }
+
+  var val = 1;
+  var obj = confuse(null);  // Null value that isn't known at compile-time.
+  Expect.isTrue(identical(obj, null), "identical");
+
+  Expect.isTrue(null == null);
+  Expect.isTrue(null == obj);
+  Expect.isTrue(obj == null);
+  Expect.isTrue(obj == obj);
+
+  // Using  == null  or  null ==  will not call any equality method.
+  Expect.isFalse(new EqualsNotCalled() == null);
+  Expect.isFalse(null == new EqualsNotCalled());
+  Expect.isFalse(new EqualsNotCalled() == obj);
+  Expect.isFalse(obj == new EqualsNotCalled());
+
+  Expect.isFalse(null == false);
+  Expect.isFalse(null == 0);
+  Expect.isFalse(null == "");
+  Expect.isFalse(null == []);
+  Expect.isFalse(null == 0.0);
+  Expect.isFalse(null == -0.0);
+  Expect.isFalse(null == double.NAN);
+
+  Expect.isFalse(obj == false);
+  Expect.isFalse(obj == 0);
+  Expect.isFalse(obj == "");
+  Expect.isFalse(obj == []);
+  Expect.isFalse(obj == 0.0);
+  Expect.isFalse(obj == -0.0);
+  Expect.isFalse(obj == double.NAN);
+
+  // Explicit constant expressions.
+  const t1 = null == null;
+  const t2 = null == 0;
+  const t3 = false == null;
+  Expect.isTrue(t1);
+  Expect.isFalse(t2);
+  Expect.isFalse(t3);
+
+  foo(obj);
+  foo(null);
+  if (obj != null) {
+    foo(null);
+  } else {
+    foo(obj);
+  }
+
+  // Test "is" operator.
+  Expect.isTrue(null is Null);
+  Expect.isTrue(obj is Null);
+  Expect.isTrue(null is Object);
+  Expect.isTrue(obj is Object);
+  Expect.isTrue(null is dynamic);
+  Expect.isTrue(obj is dynamic);
+  Expect.isFalse(null is String);
+  Expect.isFalse(obj is String);
+  Expect.isFalse(0 is Null);  // It's only assignable.
+  Expect.isFalse(null is! Null);
+  Expect.isFalse(obj is! Null);
+  Expect.isFalse(null is! Object);
+  Expect.isFalse(obj is! Object);
+  Expect.isFalse(null is! dynamic);
+  Expect.isFalse(obj is! dynamic);
+  Expect.isTrue(null is! String);
+  Expect.isTrue(obj is! String);
+  Expect.isTrue(0 is! Null);  // It's only assignable.
+
+  // Test "is" operator with generic type variable.
+  Expect.isTrue(new Generic<Null>().test(null));
+  Expect.isFalse(new Generic<Null>().test(42));
+  Expect.isTrue(new Generic2<Null, int>().test(null));
+  Expect.isFalse(new Generic2<Null, int>().test(42));
+
+  // Test cast, "as", operator.
+  Expect.equals(null, null as Null);
+  Expect.equals(null, null as Object);
+  Expect.equals(null, null as int);
+  Expect.throws(() => 42 as Null, (e) => e is CastError);
+  Expect.equals(null, new Generic<Null>().cast(null));
+  Expect.equals(null, new Generic<Object>().cast(null));
+  Expect.equals(null, new Generic<int>().cast(null));
+
+  Expect.equals(null, obj as Null);
+  Expect.equals(null, obj as Object);
+  Expect.equals(null, obj as int);
+  Expect.equals(null, new Generic<Null>().cast(obj));
+  Expect.equals(null, new Generic<Object>().cast(obj));
+  Expect.equals(null, new Generic<int>().cast(obj));
+
+  Expect.equals("null", null.toString());
+  Expect.equals("null", "${null}");
+  Expect.equals("null", obj.toString());
+  Expect.equals("null", "${obj}");
+
+  Expect.equals(Null, null.runtimeType);
+  Expect.equals(Null, obj.runtimeType);
+  Expect.equals(Null, new Generic<Null>().type);
+  Expect.equals(Null, new Generic2<Null, int>().type);
+
+  Expect.isFalse(compareToNull(val));
+  Expect.isTrue(compareToNull(obj));
+  Expect.isFalse(compareWithNull(val));
+  Expect.isTrue(compareWithNull(obj));
+
+  ClassMirror cm = reflectClass(Null);
+
+  InstanceMirror im1 = reflect(null);
+  Expect.equals(cm, im1.type);
+  Expect.isTrue(im1.invoke(const Symbol("=="), [null]).reflectee);
+  Expect.isFalse(im1.invoke(const Symbol("=="), [42]).reflectee);
+
+  InstanceMirror im2 = reflect(obj);
+  Expect.equals(cm, im2.type);
+  Expect.isTrue(im2.invoke(const Symbol("=="), [null]).reflectee);
+  Expect.isFalse(im2.invoke(const Symbol("=="), [42]).reflectee);
+
+  // Method/value extraction. The runtimeType was checked above, and operator==
+  // cannot be extracted.
+  // Currently fails in VM.
+  Expect.equals(null.toString, obj.toString);
+  Expect.equals(null.noSuchMethod, obj.noSuchMethod);
+  Expect.equals(null.hashCode, obj.hashCode);
+
+  var toString = null.toString;
+  Expect.equals("null", toString());
+  Expect.equals("null", Function.apply(toString, []));
+
+  Expect.throws(() => obj.notDeclared());
+  var noSuchMethod = null.noSuchMethod;
+  // Assing to "var" to prevent warning.
+  var capture = new CaptureInvocationMirror();
+  var mirror = capture.notDeclared();
+  Expect.throws(() => noSuchMethod(mirror));
+  Expect.throws(() => Function.apply(noSuchMethod, [mirror]));
+}
+
+
+class CaptureInvocationMirror {
+  noSuchMethod(mirror) => mirror;
 }
diff --git a/tests/lib/analyzer/analyze_tests.status b/tests/lib/analyzer/analyze_tests.status
index ca318fe..de9d41a 100644
--- a/tests/lib/analyzer/analyze_tests.status
+++ b/tests/lib/analyzer/analyze_tests.status
@@ -17,6 +17,7 @@
 standalone/io/secure_socket_argument_test: fail
 standalone/io/stdout_bad_argument_test: fail
 standalone/io/skipping_dart2js_compilations_test: fail
+standalone/io/dependency_graph_test: fail # http/dartbug.com/12449
 standalone/io/url_encoding_test: fail
 standalone/io/web_socket_protocol_processor_test: fail
 standalone/io/test_runner_test: fail
@@ -45,6 +46,7 @@
 standalone/io/secure_socket_argument_test: fail
 standalone/io/stdout_bad_argument_test: fail
 standalone/io/skipping_dart2js_compilations_test: fail
+standalone/io/dependency_graph_test: fail # http/dartbug.com/12449
 standalone/io/url_encoding_test: fail
 standalone/io/web_socket_protocol_processor_test: fail
 standalone/io/test_runner_test: fail
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 41d369f..97c4189 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -17,7 +17,6 @@
 mirrors/method_mirror_name_test: Fail # Issue 6335
 mirrors/method_mirror_properties_test: Fail # Issue 11861
 mirrors/method_mirror_returntype_test : Fail # Issue 11928
-mirrors/mixin_members_test : Fail # Issue 11863
 mirrors/mirrors_test: Fail # TODO(ahe): I'm working on fixing this.
 mirrors/null_test : Fail # Issue 12129
 mirrors/library_metadata_test: Fail # Issue 10905
@@ -102,6 +101,7 @@
 async/run_async3_test: Fail # _enqueueImmediate runs after Timer. http://dartbug.com/9001.
 mirrors/operator_test: Fail # http://dartbug.com/11944
 mirrors/mixin_test: Fail # TODO(ahe): This test is slightly broken. http://dartbug.com/12464
+mirrors/hierarchy_test: Fail # TODO(ahe): This test is slightly broken. http://dartbug.com/12464
 
 [ $compiler == none && $runtime == drt ]
 async/timer_isolate_test: Skip # See Issue 4997
diff --git a/tests/lib/mirrors/hierarchy_test.dart b/tests/lib/mirrors/hierarchy_test.dart
new file mode 100644
index 0000000..44ad0f2
--- /dev/null
+++ b/tests/lib/mirrors/hierarchy_test.dart
@@ -0,0 +1,56 @@
+// 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 hierarchy_test;
+
+@MirrorsUsed(targets: 'hierarchy_test, Object')
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class FooMixin {
+  foo() => print('foo');
+}
+
+class Qux {
+  qux() => print('qux');
+}
+
+class Bar extends Qux implements FooMixin {
+  bar() => print('bar');
+  foo() => print('foo');
+}
+
+class Baz extends Qux with FooMixin {
+  bar() => print('bar');
+}
+
+stringifyHierarchy(mirror) {
+  var sb = new StringBuffer();
+  for (var type = mirror.type; type != null; type = type.superclass) {
+    sb.write('> ${MirrorSystem.getName(type.qualifiedName)}\n');
+    for (var i in type.superinterfaces) {
+      sb.write('  + ${MirrorSystem.getName(i.qualifiedName)}\n');
+    }
+  }
+  return '$sb';
+}
+
+main() {
+  Expect.stringEquals('''
+> hierarchy_test.Bar
+  + hierarchy_test.FooMixin
+> hierarchy_test.Qux
+> dart.core.Object
+''', stringifyHierarchy(reflect(new Bar()..foo()..bar()..qux())));
+
+  // TODO(ahe): Using wrong mixin syntax, see http://dartbug.com/12464.
+  Expect.stringEquals('''
+> hierarchy_test.Baz
+> hierarchy_test.FooMixin(hierarchy_test.Qux)
+  + hierarchy_test.FooMixin
+> hierarchy_test.Qux
+> dart.core.Object
+''', stringifyHierarchy(reflect(new Baz()..foo()..bar()..qux())));
+}
diff --git a/tests/lib/mirrors/library_uri_io_test.dart b/tests/lib/mirrors/library_uri_io_test.dart
index 1ee7b4c..c7ff851 100644
--- a/tests/lib/mirrors/library_uri_io_test.dart
+++ b/tests/lib/mirrors/library_uri_io_test.dart
@@ -24,10 +24,8 @@
   var mirrors = currentMirrorSystem();
   test("Test current library uri", () {
     String appendSlash(String path) => path.endsWith('/') ? path : '$path/';
-    Uri cwd = new Uri(
-        scheme: 'file',
-        path: appendSlash(new Path(new File('.').fullPathSync()).toString()));
-    Uri uri = cwd.resolve(new Path(Platform.script).toString());
+    Uri cwd = new Uri.file(appendSlash(new File('.').fullPathSync()));
+    Uri uri = cwd.resolveUri(new Uri.file(Platform.script));
     testLibraryUri(new Class(), uri);
   });
 }
diff --git a/tests/lib/mirrors/mixin_members_test.dart b/tests/lib/mirrors/mixin_members_test.dart
index 4b82534..eca7166 100644
--- a/tests/lib/mirrors/mixin_members_test.dart
+++ b/tests/lib/mirrors/mixin_members_test.dart
@@ -2,10 +2,16 @@
 // for 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 mixin_members_test;
+
+// TODO(ahe): Don't add mirrors used, the test doesn't work without it.
+@MirrorsUsed(targets: 'mixin_members_test', override: '*')
 import "dart:mirrors";
 
 import "package:expect/expect.dart";
 
+import 'stringify.dart';
+
 class Fooer {
   foo1();
 }
@@ -29,21 +35,24 @@
 
 main() {
   ClassMirror cm = reflectClass(C);
-  Classmirror sM1M2 = cm.superclass;
-  Classmirror sM1 = sM1M2.superclass;
+  ClassMirror sM1M2 = cm.superclass;
+  ClassMirror sM1 = sM1M2.superclass;
   ClassMirror s = sM1.superclass;
-  Expect.equals(0, cm.members.length);
-  Expect.setEquals(sM1M2.members.keys,
-                   [const Symbol("baz1"), const Symbol("baz2")]);
-  Expect.setEquals(sM1M2.superinterfaces.map((e) => e.simpleName),
-                   [const Symbol("M2")]);
-  Expect.setEquals(sM1.members.keys,
-                   [const Symbol("bar1"), const Symbol("bar2")]);
-  Expect.setEquals(sM1.superinterfaces.map((e) => e.simpleName),
-                   [const Symbol("M1")]);
-  Expect.setEquals(s.members.keys.toSet(),
-                   [const Symbol("foo1"), const Symbol("foo2")]);
-  Expect.setEquals(s.superinterfaces.map((e) => e.simpleName),
-                   [const Symbol("Fooer")]);
-  Expect.equals(true, reflectClass(S) == s);
+  expect('{}', cm.members);
+  expect('[s(baz1), s(baz2)]',
+         // TODO(ahe): Shouldn't have to sort.
+         sort(sM1M2.members.keys),
+         '(S with M1, M2).members');
+  expect('[s(M2)]', simpleNames(sM1M2.superinterfaces),
+         '(S with M1, M2).superinterfaces');
+  expect('[s(bar1), s(bar2)]',
+         // TODO(ahe): Shouldn't have to sort.
+         sort(sM1.members.keys), '(S with M1).members');
+  expect('[s(M1)]', simpleNames(sM1.superinterfaces),
+         '(S with M1).superinterfaces');
+  expect('[s(foo1), s(foo2)]',
+         // TODO(ahe): Shouldn't have to sort.
+         sort(s.members.keys), 's.members');
+  expect('[s(Fooer)]', simpleNames(s.superinterfaces), 's.superinterfaces');
+  Expect.equals(s, reflectClass(S));
 }
diff --git a/tests/lib/mirrors/mixin_test.dart b/tests/lib/mirrors/mixin_test.dart
index 86ca0c8..eb70034 100644
--- a/tests/lib/mirrors/mixin_test.dart
+++ b/tests/lib/mirrors/mixin_test.dart
@@ -65,11 +65,14 @@
       'Class(s(Mixin) in s(test.mixin_test), top-level)',
       'Class(s(Object) in s(dart.core), top-level)',
   ]);
+
   expect(
-      '{Mixin: Method(s(Mixin) in s(Mixin), constructor),'
-      ' i: Variable(s(i) in s(Mixin)),'
+      '{i: Variable(s(i) in s(Mixin)),'
       ' m: Method(s(m) in s(Mixin))}',
       reflectClass(Mixin).members);
+
+  expect('{Mixin: Method(s(Mixin) in s(Mixin), constructor)}',
+         reflectClass(Mixin).constructors);
 }
 
 testMixin2() {
@@ -77,11 +80,14 @@
       'Class(s(Mixin2) in s(test.mixin_test), top-level)',
       'Class(s(Object) in s(dart.core), top-level)',
   ]);
+
   expect(
-      '{Mixin2: Method(s(Mixin2) in s(Mixin2), constructor),'
-      ' i2: Variable(s(i2) in s(Mixin2)),'
+      '{i2: Variable(s(i2) in s(Mixin2)),'
       ' m2: Method(s(m2) in s(Mixin2))}',
       reflectClass(Mixin2).members);
+
+  expect('{Mixin2: Method(s(Mixin2) in s(Mixin2), constructor)}',
+         reflectClass(Mixin2).constructors);
 }
 
 testMixinApplication() {
@@ -94,12 +100,14 @@
   ]);
 
   expect(
-      '{MixinApplication: Method(s(MixinApplication) in s(MixinApplication),'
-      ' constructor),'
-      ' i: Variable(s(i) in s(MixinApplication)),'
+      '{i: Variable(s(i) in s(MixinApplication)),'
       ' m: Method(s(m) in s(MixinApplication))}',
       reflectClass(MixinApplication).members);
 
+  expect('{MixinApplication: Method(s(MixinApplication) in s(MixinApplication),'
+         ' constructor)}',
+         reflectClass(MixinApplication).constructors);
+
   expectSame(reflectClass(C), reflectClass(MixinApplication).superclass);
 }
 
@@ -114,19 +122,26 @@
   ]);
 
   expect(
-      '{MixinApplicationA: Method(s(MixinApplicationA) in s(MixinApplicationA),'
-      ' constructor),'
-      ' i2: Variable(s(i2) in s(MixinApplicationA)),'
+      // TODO(ahe): The owner should be the mixin.
+      '{i2: Variable(s(i2) in s(MixinApplicationA)),'
       ' m2: Method(s(m2) in s(MixinApplicationA))}',
       reflectClass(MixinApplicationA).members);
 
   expect(
-       // TODO(ahe): The owner should probably be the mixin application.
-      '{Mixin: Method(s(Mixin) in s(Mixin), constructor),'
-      ' i: Variable(s(i) in s(Mixin)),'
+      '{MixinApplicationA: Method(s(MixinApplicationA) in s(MixinApplicationA),'
+      ' constructor)}',
+      reflectClass(MixinApplicationA).constructors);
+
+  expect(
+      '{i: Variable(s(i) in s(Mixin)),'
       ' m: Method(s(m) in s(Mixin))}',
       reflectClass(MixinApplicationA).superclass.members);
 
+  expect(
+      // TODO(ahe): The owner should be the mixin application.
+      '{Mixin: Method(s(Mixin) in s(Mixin), constructor)}',
+      reflectClass(MixinApplicationA).superclass.constructors);
+
   expectSame(
       reflectClass(C),
       reflectClass(MixinApplicationA).superclass.superclass);
@@ -142,12 +157,15 @@
   ]);
 
   expect(
-      '{UnusedMixinApplication: Method(s(UnusedMixinApplication)'
-      ' in s(UnusedMixinApplication), constructor),'
-      ' i: Variable(s(i) in s(UnusedMixinApplication)),'
+      '{i: Variable(s(i) in s(UnusedMixinApplication)),'
       ' m: Method(s(m) in s(UnusedMixinApplication))}',
       reflectClass(UnusedMixinApplication).members);
 
+  expect(
+      '{UnusedMixinApplication: Method(s(UnusedMixinApplication)'
+      ' in s(UnusedMixinApplication), constructor)}',
+      reflectClass(UnusedMixinApplication).constructors);
+
   expectSame(reflectClass(C), reflectClass(UnusedMixinApplication).superclass);
 }
 
@@ -162,17 +180,23 @@
   ]);
 
   expect(
-      '{Subclass: Method(s(Subclass) in s(Subclass), constructor),'
-      ' f: Method(s(f) in s(Subclass))}',
+      '{f: Method(s(f) in s(Subclass))}',
       reflectClass(Subclass).members);
 
   expect(
-       // TODO(ahe): The owner should probably be the mixin application.
-      '{Mixin: Method(s(Mixin) in s(Mixin), constructor),'
-      ' i: Variable(s(i) in s(Mixin)),'
+      '{Subclass: Method(s(Subclass) in s(Subclass), constructor)}',
+      reflectClass(Subclass).constructors);
+
+  expect(
+      '{i: Variable(s(i) in s(Mixin)),'
       ' m: Method(s(m) in s(Mixin))}',
       reflectClass(Subclass).superclass.members);
 
+  expect(
+       // TODO(ahe): The owner should be the mixin application.
+      '{Mixin: Method(s(Mixin) in s(Mixin), constructor)}',
+      reflectClass(Subclass).superclass.constructors);
+
   expectSame(
       reflectClass(C),
       reflectClass(Subclass).superclass.superclass);
@@ -189,10 +213,13 @@
   ]);
 
   expect(
-      '{Subclass2: Method(s(Subclass2) in s(Subclass2), constructor),'
-      ' g: Method(s(g) in s(Subclass2))}',
+      '{g: Method(s(g) in s(Subclass2))}',
       reflectClass(Subclass2).members);
 
+  expect(
+      '{Subclass2: Method(s(Subclass2) in s(Subclass2), constructor)}',
+      reflectClass(Subclass2).constructors);
+
   expectSame(
       reflectClass(MixinApplication),
       reflectClass(Subclass2).superclass);
@@ -211,24 +238,33 @@
   ]);
 
   expect(
-      '{SubclassA: Method(s(SubclassA) in s(SubclassA), constructor),'
-      ' fa: Method(s(fa) in s(SubclassA))}',
+      '{fa: Method(s(fa) in s(SubclassA))}',
       reflectClass(SubclassA).members);
 
   expect(
-       // TODO(ahe): The owner should probably be the mixin application.
-      '{Mixin2: Method(s(Mixin2) in s(Mixin2), constructor),'
-      ' i2: Variable(s(i2) in s(Mixin2)),'
+      '{SubclassA: Method(s(SubclassA) in s(SubclassA), constructor)}',
+      reflectClass(SubclassA).constructors);
+
+  expect(
+      '{i2: Variable(s(i2) in s(Mixin2)),'
       ' m2: Method(s(m2) in s(Mixin2))}',
       reflectClass(SubclassA).superclass.members);
 
   expect(
-       // TODO(ahe): The owner should probably be the mixin application.
-      '{Mixin: Method(s(Mixin) in s(Mixin), constructor),'
-      ' i: Variable(s(i) in s(Mixin)),'
+       // TODO(ahe): The owner should be the mixin application.
+      '{Mixin2: Method(s(Mixin2) in s(Mixin2), constructor)}',
+      reflectClass(SubclassA).superclass.constructors);
+
+  expect(
+      '{i: Variable(s(i) in s(Mixin)),'
       ' m: Method(s(m) in s(Mixin))}',
       reflectClass(SubclassA).superclass.superclass.members);
 
+  expect(
+       // TODO(ahe): The owner should be the mixin application.
+      '{Mixin: Method(s(Mixin) in s(Mixin), constructor)}',
+      reflectClass(SubclassA).superclass.superclass.constructors);
+
   expectSame(
       reflectClass(C),
       reflectClass(SubclassA).superclass.superclass.superclass);
@@ -246,10 +282,13 @@
   ]);
 
   expect(
-      '{Subclass2A: Method(s(Subclass2A) in s(Subclass2A), constructor),'
-      ' ga: Method(s(ga) in s(Subclass2A))}',
+      '{ga: Method(s(ga) in s(Subclass2A))}',
       reflectClass(Subclass2A).members);
 
+  expect(
+      '{Subclass2A: Method(s(Subclass2A) in s(Subclass2A), constructor)}',
+      reflectClass(Subclass2A).constructors);
+
   expectSame(reflectClass(MixinApplicationA),
              reflectClass(Subclass2A).superclass);
 }
diff --git a/tests/lib/mirrors/null_test.dart b/tests/lib/mirrors/null_test.dart
index 2a8a8ba..10b92f3 100644
--- a/tests/lib/mirrors/null_test.dart
+++ b/tests/lib/mirrors/null_test.dart
@@ -26,6 +26,7 @@
                 'noSuchMethod');
 
   ClassMirror NullMirror = nullMirror.type;
+  Expect.equals(reflectClass(Null), NullMirror);
   Expect.equals(const Symbol('Null'), NullMirror.simpleName);
   Expect.equals(const Symbol('Object'), NullMirror.superclass.simpleName);
   Expect.equals(null, NullMirror.superclass.superclass);
diff --git a/tests/lib/mirrors/stringify.dart b/tests/lib/mirrors/stringify.dart
index 731403b..9778772 100644
--- a/tests/lib/mirrors/stringify.dart
+++ b/tests/lib/mirrors/stringify.dart
@@ -26,7 +26,7 @@
   return '{$buffer}';
 }
 
-stringifyList(List list) {
+stringifyIterable(Iterable list) {
   var buffer = new StringBuffer();
   bool first = true;
   for (String value in list.map(stringify)) {
@@ -100,7 +100,7 @@
 
 stringify(value) {
   if (value is Map) return stringifyMap(value);
-  if (value is List) return stringifyList(value);
+  if (value is Iterable) return stringifyIterable(value);
   if (value is ParameterMirror) return stringifyParameter(value);
   if (value is VariableMirror) return stringifyVariable(value);
   if (value is MethodMirror) return stringifyMethod(value);
@@ -111,8 +111,14 @@
   throw 'Unexpected value: $value';
 }
 
-expect(expected, actual) => Expect.stringEquals(expected, stringify(actual));
+expect(expected, actual, [String reason]) {
+  Expect.stringEquals(expected, stringify(actual), reason);
+}
 
 compareSymbols(Symbol a, Symbol b) {
   return MirrorSystem.getName(a).compareTo(MirrorSystem.getName(b));
 }
+
+simpleNames(Iterable<Mirror> i) => i.map((e) => e.simpleName);
+
+sort(Iterable<Symbol> symbols) => symbols.toList()..sort(compareSymbols);
diff --git a/tests/lib/mirrors/unmangled_type_test.dart b/tests/lib/mirrors/unmangled_type_test.dart
new file mode 100644
index 0000000..dbc6b62
--- /dev/null
+++ b/tests/lib/mirrors/unmangled_type_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.
+
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class Foo {
+}
+
+main() {
+  Expect.stringEquals('Foo', '${new Foo().runtimeType}');
+  Expect.stringEquals('foo', MirrorSystem.getName(new Symbol('foo')));
+}
diff --git a/tests/lib/typed_data/float32x4_cross_test.dart b/tests/lib/typed_data/float32x4_cross_test.dart
index 0816846..3268488 100644
--- a/tests/lib/typed_data/float32x4_cross_test.dart
+++ b/tests/lib/typed_data/float32x4_cross_test.dart
@@ -10,11 +10,11 @@
 import 'package:expect/expect.dart';
 
 Float32x4 cross(Float32x4 a, Float32x4 b) {
-  var t0 = a.yzxw;
-  var t1 = b.zxyw;
+  var t0 = a.shuffle(Float32x4.YZXW);
+  var t1 = b.shuffle(Float32x4.ZXYW);
   var l = t0 * t1;
-  t0 = a.zxyw;
-  t1 = b.yzxw;
+  t0 = a.shuffle(Float32x4.ZXYW);
+  t1 = b.shuffle(Float32x4.YZXW);
   var r = t0 * t1;
   return l-r;
 }
diff --git a/tests/lib/typed_data/float32x4_shuffle_test.dart b/tests/lib/typed_data/float32x4_shuffle_test.dart
index a863f12..d12f86d 100644
--- a/tests/lib/typed_data/float32x4_shuffle_test.dart
+++ b/tests/lib/typed_data/float32x4_shuffle_test.dart
@@ -9,1300 +9,1360 @@
 import "package:expect/expect.dart";
 import 'dart:typed_data';
 
-void testShuffle0() {
+void testShuffle00() {
   var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
   var c;
-  c = m.xxxx;
+  c = m.shuffle(Float32x4.XXXX);
   Expect.equals(1.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.xxxy;
+  c = m.shuffle(Float32x4.XXXY);
   Expect.equals(1.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.xxxz;
+  c = m.shuffle(Float32x4.XXXZ);
   Expect.equals(1.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.xxxw;
+  c = m.shuffle(Float32x4.XXXW);
   Expect.equals(1.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.xxyx;
+  c = m.shuffle(Float32x4.XXYX);
   Expect.equals(1.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.xxyy;
+  c = m.shuffle(Float32x4.XXYY);
   Expect.equals(1.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.xxyz;
+  c = m.shuffle(Float32x4.XXYZ);
   Expect.equals(1.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.xxyw;
+  c = m.shuffle(Float32x4.XXYW);
   Expect.equals(1.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.xxzx;
+  c = m.shuffle(Float32x4.XXZX);
   Expect.equals(1.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.xxzy;
+  c = m.shuffle(Float32x4.XXZY);
   Expect.equals(1.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.xxzz;
+  c = m.shuffle(Float32x4.XXZZ);
   Expect.equals(1.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.xxzw;
+  c = m.shuffle(Float32x4.XXZW);
   Expect.equals(1.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.xxwx;
+  c = m.shuffle(Float32x4.XXWX);
   Expect.equals(1.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.xxwy;
+  c = m.shuffle(Float32x4.XXWY);
   Expect.equals(1.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.xxwz;
+  c = m.shuffle(Float32x4.XXWZ);
   Expect.equals(1.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.xxww;
+  c = m.shuffle(Float32x4.XXWW);
   Expect.equals(1.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.xyxx;
+}
+
+void testShuffle01() {
+  var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+  var c;
+  c = m.shuffle(Float32x4.XYXX);
   Expect.equals(1.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.xyxy;
+  c = m.shuffle(Float32x4.XYXY);
   Expect.equals(1.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.xyxz;
+  c = m.shuffle(Float32x4.XYXZ);
   Expect.equals(1.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.xyxw;
+  c = m.shuffle(Float32x4.XYXW);
   Expect.equals(1.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.xyyx;
+  c = m.shuffle(Float32x4.XYYX);
   Expect.equals(1.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.xyyy;
+  c = m.shuffle(Float32x4.XYYY);
   Expect.equals(1.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.xyyz;
+  c = m.shuffle(Float32x4.XYYZ);
   Expect.equals(1.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.xyyw;
+  c = m.shuffle(Float32x4.XYYW);
   Expect.equals(1.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.xyzx;
+  c = m.shuffle(Float32x4.XYZX);
   Expect.equals(1.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.xyzy;
+  c = m.shuffle(Float32x4.XYZY);
   Expect.equals(1.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.xyzz;
+  c = m.shuffle(Float32x4.XYZZ);
   Expect.equals(1.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.xyzw;
+  c = m.shuffle(Float32x4.XYZW);
   Expect.equals(1.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.xywx;
+  c = m.shuffle(Float32x4.XYWX);
   Expect.equals(1.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.xywy;
+  c = m.shuffle(Float32x4.XYWY);
   Expect.equals(1.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.xywz;
+  c = m.shuffle(Float32x4.XYWZ);
   Expect.equals(1.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.xyww;
+  c = m.shuffle(Float32x4.XYWW);
   Expect.equals(1.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.xzxx;
+}
+
+void testShuffle02() {
+  var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+  var c;
+  c = m.shuffle(Float32x4.XZXX);
   Expect.equals(1.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.xzxy;
+  c = m.shuffle(Float32x4.XZXY);
   Expect.equals(1.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.xzxz;
+  c = m.shuffle(Float32x4.XZXZ);
   Expect.equals(1.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.xzxw;
+  c = m.shuffle(Float32x4.XZXW);
   Expect.equals(1.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.xzyx;
+  c = m.shuffle(Float32x4.XZYX);
   Expect.equals(1.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.xzyy;
+  c = m.shuffle(Float32x4.XZYY);
   Expect.equals(1.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.xzyz;
+  c = m.shuffle(Float32x4.XZYZ);
   Expect.equals(1.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.xzyw;
+  c = m.shuffle(Float32x4.XZYW);
   Expect.equals(1.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.xzzx;
+  c = m.shuffle(Float32x4.XZZX);
   Expect.equals(1.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.xzzy;
+  c = m.shuffle(Float32x4.XZZY);
   Expect.equals(1.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.xzzz;
+  c = m.shuffle(Float32x4.XZZZ);
   Expect.equals(1.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.xzzw;
+  c = m.shuffle(Float32x4.XZZW);
   Expect.equals(1.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.xzwx;
+  c = m.shuffle(Float32x4.XZWX);
   Expect.equals(1.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.xzwy;
+  c = m.shuffle(Float32x4.XZWY);
   Expect.equals(1.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.xzwz;
+  c = m.shuffle(Float32x4.XZWZ);
   Expect.equals(1.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.xzww;
+  c = m.shuffle(Float32x4.XZWW);
   Expect.equals(1.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.xwxx;
+}
+
+void testShuffle03() {
+  var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+  var c;
+  c = m.shuffle(Float32x4.XWXX);
   Expect.equals(1.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.xwxy;
+  c = m.shuffle(Float32x4.XWXY);
   Expect.equals(1.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.xwxz;
+  c = m.shuffle(Float32x4.XWXZ);
   Expect.equals(1.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.xwxw;
+  c = m.shuffle(Float32x4.XWXW);
   Expect.equals(1.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.xwyx;
+  c = m.shuffle(Float32x4.XWYX);
   Expect.equals(1.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.xwyy;
+  c = m.shuffle(Float32x4.XWYY);
   Expect.equals(1.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.xwyz;
+  c = m.shuffle(Float32x4.XWYZ);
   Expect.equals(1.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.xwyw;
+  c = m.shuffle(Float32x4.XWYW);
   Expect.equals(1.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.xwzx;
+  c = m.shuffle(Float32x4.XWZX);
   Expect.equals(1.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.xwzy;
+  c = m.shuffle(Float32x4.XWZY);
   Expect.equals(1.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.xwzz;
+  c = m.shuffle(Float32x4.XWZZ);
   Expect.equals(1.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.xwzw;
+  c = m.shuffle(Float32x4.XWZW);
   Expect.equals(1.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.xwwx;
+  c = m.shuffle(Float32x4.XWWX);
   Expect.equals(1.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.xwwy;
+  c = m.shuffle(Float32x4.XWWY);
   Expect.equals(1.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.xwwz;
+  c = m.shuffle(Float32x4.XWWZ);
   Expect.equals(1.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.xwww;
+  c = m.shuffle(Float32x4.XWWW);
   Expect.equals(1.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(4.0, c.w);
 }
 
-void testShuffle1() {
+void testShuffle10() {
   var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
   var c;
-  c = m.yxxx;
+  c = m.shuffle(Float32x4.YXXX);
   Expect.equals(2.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.yxxy;
+  c = m.shuffle(Float32x4.YXXY);
   Expect.equals(2.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.yxxz;
+  c = m.shuffle(Float32x4.YXXZ);
   Expect.equals(2.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.yxxw;
+  c = m.shuffle(Float32x4.YXXW);
   Expect.equals(2.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.yxyx;
+  c = m.shuffle(Float32x4.YXYX);
   Expect.equals(2.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.yxyy;
+  c = m.shuffle(Float32x4.YXYY);
   Expect.equals(2.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.yxyz;
+  c = m.shuffle(Float32x4.YXYZ);
   Expect.equals(2.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.yxyw;
+  c = m.shuffle(Float32x4.YXYW);
   Expect.equals(2.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.yxzx;
+  c = m.shuffle(Float32x4.YXZX);
   Expect.equals(2.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.yxzy;
+  c = m.shuffle(Float32x4.YXZY);
   Expect.equals(2.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.yxzz;
+  c = m.shuffle(Float32x4.YXZZ);
   Expect.equals(2.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.yxzw;
+  c = m.shuffle(Float32x4.YXZW);
   Expect.equals(2.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.yxwx;
+  c = m.shuffle(Float32x4.YXWX);
   Expect.equals(2.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.yxwy;
+  c = m.shuffle(Float32x4.YXWY);
   Expect.equals(2.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.yxwz;
+  c = m.shuffle(Float32x4.YXWZ);
   Expect.equals(2.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.yxww;
+  c = m.shuffle(Float32x4.YXWW);
   Expect.equals(2.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.yyxx;
+}
+
+void testShuffle11() {
+  var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+  var c;
+  c = m.shuffle(Float32x4.YYXX);
   Expect.equals(2.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.yyxy;
+  c = m.shuffle(Float32x4.YYXY);
   Expect.equals(2.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.yyxz;
+  c = m.shuffle(Float32x4.YYXZ);
   Expect.equals(2.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.yyxw;
+  c = m.shuffle(Float32x4.YYXW);
   Expect.equals(2.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.yyyx;
+  c = m.shuffle(Float32x4.YYYX);
   Expect.equals(2.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.yyyy;
+  c = m.shuffle(Float32x4.YYYY);
   Expect.equals(2.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.yyyz;
+  c = m.shuffle(Float32x4.YYYZ);
   Expect.equals(2.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.yyyw;
+  c = m.shuffle(Float32x4.YYYW);
   Expect.equals(2.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.yyzx;
+  c = m.shuffle(Float32x4.YYZX);
   Expect.equals(2.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.yyzy;
+  c = m.shuffle(Float32x4.YYZY);
   Expect.equals(2.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.yyzz;
+  c = m.shuffle(Float32x4.YYZZ);
   Expect.equals(2.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.yyzw;
+  c = m.shuffle(Float32x4.YYZW);
   Expect.equals(2.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.yywx;
+  c = m.shuffle(Float32x4.YYWX);
   Expect.equals(2.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.yywy;
+  c = m.shuffle(Float32x4.YYWY);
   Expect.equals(2.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.yywz;
+  c = m.shuffle(Float32x4.YYWZ);
   Expect.equals(2.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.yyww;
+  c = m.shuffle(Float32x4.YYWW);
   Expect.equals(2.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.yzxx;
+}
+
+void testShuffle12() {
+  var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+  var c;
+  c = m.shuffle(Float32x4.YZXX);
   Expect.equals(2.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.yzxy;
+  c = m.shuffle(Float32x4.YZXY);
   Expect.equals(2.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.yzxz;
+  c = m.shuffle(Float32x4.YZXZ);
   Expect.equals(2.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.yzxw;
+  c = m.shuffle(Float32x4.YZXW);
   Expect.equals(2.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.yzyx;
+  c = m.shuffle(Float32x4.YZYX);
   Expect.equals(2.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.yzyy;
+  c = m.shuffle(Float32x4.YZYY);
   Expect.equals(2.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.yzyz;
+  c = m.shuffle(Float32x4.YZYZ);
   Expect.equals(2.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.yzyw;
+  c = m.shuffle(Float32x4.YZYW);
   Expect.equals(2.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.yzzx;
+  c = m.shuffle(Float32x4.YZZX);
   Expect.equals(2.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.yzzy;
+  c = m.shuffle(Float32x4.YZZY);
   Expect.equals(2.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.yzzz;
+  c = m.shuffle(Float32x4.YZZZ);
   Expect.equals(2.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.yzzw;
+  c = m.shuffle(Float32x4.YZZW);
   Expect.equals(2.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.yzwx;
+  c = m.shuffle(Float32x4.YZWX);
   Expect.equals(2.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.yzwy;
+  c = m.shuffle(Float32x4.YZWY);
   Expect.equals(2.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.yzwz;
+  c = m.shuffle(Float32x4.YZWZ);
   Expect.equals(2.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.yzww;
+  c = m.shuffle(Float32x4.YZWW);
   Expect.equals(2.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.ywxx;
+}
+
+void testShuffle13() {
+  var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+  var c;
+  c = m.shuffle(Float32x4.YWXX);
   Expect.equals(2.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.ywxy;
+  c = m.shuffle(Float32x4.YWXY);
   Expect.equals(2.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.ywxz;
+  c = m.shuffle(Float32x4.YWXZ);
   Expect.equals(2.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.ywxw;
+  c = m.shuffle(Float32x4.YWXW);
   Expect.equals(2.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.ywyx;
+  c = m.shuffle(Float32x4.YWYX);
   Expect.equals(2.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.ywyy;
+  c = m.shuffle(Float32x4.YWYY);
   Expect.equals(2.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.ywyz;
+  c = m.shuffle(Float32x4.YWYZ);
   Expect.equals(2.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.ywyw;
+  c = m.shuffle(Float32x4.YWYW);
   Expect.equals(2.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.ywzx;
+  c = m.shuffle(Float32x4.YWZX);
   Expect.equals(2.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.ywzy;
+  c = m.shuffle(Float32x4.YWZY);
   Expect.equals(2.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.ywzz;
+  c = m.shuffle(Float32x4.YWZZ);
   Expect.equals(2.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.ywzw;
+  c = m.shuffle(Float32x4.YWZW);
   Expect.equals(2.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.ywwx;
+  c = m.shuffle(Float32x4.YWWX);
   Expect.equals(2.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.ywwy;
+  c = m.shuffle(Float32x4.YWWY);
   Expect.equals(2.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.ywwz;
+  c = m.shuffle(Float32x4.YWWZ);
   Expect.equals(2.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.ywww;
+  c = m.shuffle(Float32x4.YWWW);
   Expect.equals(2.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(4.0, c.w);
 }
 
-void testShuffle2() {
+void testShuffle20() {
   var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
   var c;
-  c = m.zxxx;
+  c = m.shuffle(Float32x4.ZXXX);
   Expect.equals(3.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.zxxy;
+  c = m.shuffle(Float32x4.ZXXY);
   Expect.equals(3.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.zxxz;
+  c = m.shuffle(Float32x4.ZXXZ);
   Expect.equals(3.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.zxxw;
+  c = m.shuffle(Float32x4.ZXXW);
   Expect.equals(3.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.zxyx;
+  c = m.shuffle(Float32x4.ZXYX);
   Expect.equals(3.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.zxyy;
+  c = m.shuffle(Float32x4.ZXYY);
   Expect.equals(3.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.zxyz;
+  c = m.shuffle(Float32x4.ZXYZ);
   Expect.equals(3.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.zxyw;
+  c = m.shuffle(Float32x4.ZXYW);
   Expect.equals(3.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.zxzx;
+  c = m.shuffle(Float32x4.ZXZX);
   Expect.equals(3.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.zxzy;
+  c = m.shuffle(Float32x4.ZXZY);
   Expect.equals(3.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.zxzz;
+  c = m.shuffle(Float32x4.ZXZZ);
   Expect.equals(3.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.zxzw;
+  c = m.shuffle(Float32x4.ZXZW);
   Expect.equals(3.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.zxwx;
+  c = m.shuffle(Float32x4.ZXWX);
   Expect.equals(3.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.zxwy;
+  c = m.shuffle(Float32x4.ZXWY);
   Expect.equals(3.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.zxwz;
+  c = m.shuffle(Float32x4.ZXWZ);
   Expect.equals(3.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.zxww;
+  c = m.shuffle(Float32x4.ZXWW);
   Expect.equals(3.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.zyxx;
+}
+
+void testShuffle21() {
+  var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+  var c;
+  c = m.shuffle(Float32x4.ZYXX);
   Expect.equals(3.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.zyxy;
+  c = m.shuffle(Float32x4.ZYXY);
   Expect.equals(3.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.zyxz;
+  c = m.shuffle(Float32x4.ZYXZ);
   Expect.equals(3.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.zyxw;
+  c = m.shuffle(Float32x4.ZYXW);
   Expect.equals(3.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.zyyx;
+  c = m.shuffle(Float32x4.ZYYX);
   Expect.equals(3.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.zyyy;
+  c = m.shuffle(Float32x4.ZYYY);
   Expect.equals(3.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.zyyz;
+  c = m.shuffle(Float32x4.ZYYZ);
   Expect.equals(3.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.zyyw;
+  c = m.shuffle(Float32x4.ZYYW);
   Expect.equals(3.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.zyzx;
+  c = m.shuffle(Float32x4.ZYZX);
   Expect.equals(3.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.zyzy;
+  c = m.shuffle(Float32x4.ZYZY);
   Expect.equals(3.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.zyzz;
+  c = m.shuffle(Float32x4.ZYZZ);
   Expect.equals(3.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.zyzw;
+  c = m.shuffle(Float32x4.ZYZW);
   Expect.equals(3.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.zywx;
+  c = m.shuffle(Float32x4.ZYWX);
   Expect.equals(3.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.zywy;
+  c = m.shuffle(Float32x4.ZYWY);
   Expect.equals(3.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.zywz;
+  c = m.shuffle(Float32x4.ZYWZ);
   Expect.equals(3.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.zyww;
+  c = m.shuffle(Float32x4.ZYWW);
   Expect.equals(3.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.zzxx;
+}
+
+void testShuffle22() {
+  var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+  var c;
+  c = m.shuffle(Float32x4.ZZXX);
   Expect.equals(3.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.zzxy;
+  c = m.shuffle(Float32x4.ZZXY);
   Expect.equals(3.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.zzxz;
+  c = m.shuffle(Float32x4.ZZXZ);
   Expect.equals(3.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.zzxw;
+  c = m.shuffle(Float32x4.ZZXW);
   Expect.equals(3.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.zzyx;
+  c = m.shuffle(Float32x4.ZZYX);
   Expect.equals(3.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.zzyy;
+  c = m.shuffle(Float32x4.ZZYY);
   Expect.equals(3.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.zzyz;
+  c = m.shuffle(Float32x4.ZZYZ);
   Expect.equals(3.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.zzyw;
+  c = m.shuffle(Float32x4.ZZYW);
   Expect.equals(3.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.zzzx;
+  c = m.shuffle(Float32x4.ZZZX);
   Expect.equals(3.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.zzzy;
+  c = m.shuffle(Float32x4.ZZZY);
   Expect.equals(3.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.zzzz;
+  c = m.shuffle(Float32x4.ZZZZ);
   Expect.equals(3.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.zzzw;
+  c = m.shuffle(Float32x4.ZZZW);
   Expect.equals(3.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.zzwx;
+  c = m.shuffle(Float32x4.ZZWX);
   Expect.equals(3.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.zzwy;
+  c = m.shuffle(Float32x4.ZZWY);
   Expect.equals(3.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.zzwz;
+  c = m.shuffle(Float32x4.ZZWZ);
   Expect.equals(3.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.zzww;
+  c = m.shuffle(Float32x4.ZZWW);
   Expect.equals(3.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.zwxx;
+}
+
+void testShuffle23() {
+  var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+  var c;
+  c = m.shuffle(Float32x4.ZWXX);
   Expect.equals(3.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.zwxy;
+  c = m.shuffle(Float32x4.ZWXY);
   Expect.equals(3.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.zwxz;
+  c = m.shuffle(Float32x4.ZWXZ);
   Expect.equals(3.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.zwxw;
+  c = m.shuffle(Float32x4.ZWXW);
   Expect.equals(3.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.zwyx;
+  c = m.shuffle(Float32x4.ZWYX);
   Expect.equals(3.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.zwyy;
+  c = m.shuffle(Float32x4.ZWYY);
   Expect.equals(3.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.zwyz;
+  c = m.shuffle(Float32x4.ZWYZ);
   Expect.equals(3.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.zwyw;
+  c = m.shuffle(Float32x4.ZWYW);
   Expect.equals(3.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.zwzx;
+  c = m.shuffle(Float32x4.ZWZX);
   Expect.equals(3.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.zwzy;
+  c = m.shuffle(Float32x4.ZWZY);
   Expect.equals(3.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.zwzz;
+  c = m.shuffle(Float32x4.ZWZZ);
   Expect.equals(3.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.zwzw;
+  c = m.shuffle(Float32x4.ZWZW);
   Expect.equals(3.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.zwwx;
+  c = m.shuffle(Float32x4.ZWWX);
   Expect.equals(3.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.zwwy;
+  c = m.shuffle(Float32x4.ZWWY);
   Expect.equals(3.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.zwwz;
+  c = m.shuffle(Float32x4.ZWWZ);
   Expect.equals(3.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.zwww;
+  c = m.shuffle(Float32x4.ZWWW);
   Expect.equals(3.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(4.0, c.w);
 }
 
-void testShuffle3() {
+void testShuffle30() {
   var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
   var c;
-  c = m.wxxx;
+  c = m.shuffle(Float32x4.WXXX);
   Expect.equals(4.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.wxxy;
+  c = m.shuffle(Float32x4.WXXY);
   Expect.equals(4.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.wxxz;
+  c = m.shuffle(Float32x4.WXXZ);
   Expect.equals(4.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.wxxw;
+  c = m.shuffle(Float32x4.WXXW);
   Expect.equals(4.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.wxyx;
+  c = m.shuffle(Float32x4.WXYX);
   Expect.equals(4.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.wxyy;
+  c = m.shuffle(Float32x4.WXYY);
   Expect.equals(4.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.wxyz;
+  c = m.shuffle(Float32x4.WXYZ);
   Expect.equals(4.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.wxyw;
+  c = m.shuffle(Float32x4.WXYW);
   Expect.equals(4.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.wxzx;
+  c = m.shuffle(Float32x4.WXZX);
   Expect.equals(4.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.wxzy;
+  c = m.shuffle(Float32x4.WXZY);
   Expect.equals(4.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.wxzz;
+  c = m.shuffle(Float32x4.WXZZ);
   Expect.equals(4.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.wxzw;
+  c = m.shuffle(Float32x4.WXZW);
   Expect.equals(4.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.wxwx;
+  c = m.shuffle(Float32x4.WXWX);
   Expect.equals(4.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.wxwy;
+  c = m.shuffle(Float32x4.WXWY);
   Expect.equals(4.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.wxwz;
+  c = m.shuffle(Float32x4.WXWZ);
   Expect.equals(4.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.wxww;
+  c = m.shuffle(Float32x4.WXWW);
   Expect.equals(4.0, c.x);
   Expect.equals(1.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.wyxx;
+}
+
+void testShuffle31() {
+  var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+  var c;
+  c = m.shuffle(Float32x4.WYXX);
   Expect.equals(4.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.wyxy;
+  c = m.shuffle(Float32x4.WYXY);
   Expect.equals(4.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.wyxz;
+  c = m.shuffle(Float32x4.WYXZ);
   Expect.equals(4.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.wyxw;
+  c = m.shuffle(Float32x4.WYXW);
   Expect.equals(4.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.wyyx;
+  c = m.shuffle(Float32x4.WYYX);
   Expect.equals(4.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.wyyy;
+  c = m.shuffle(Float32x4.WYYY);
   Expect.equals(4.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.wyyz;
+  c = m.shuffle(Float32x4.WYYZ);
   Expect.equals(4.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.wyyw;
+  c = m.shuffle(Float32x4.WYYW);
   Expect.equals(4.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.wyzx;
+  c = m.shuffle(Float32x4.WYZX);
   Expect.equals(4.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.wyzy;
+  c = m.shuffle(Float32x4.WYZY);
   Expect.equals(4.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.wyzz;
+  c = m.shuffle(Float32x4.WYZZ);
   Expect.equals(4.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.wyzw;
+  c = m.shuffle(Float32x4.WYZW);
   Expect.equals(4.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.wywx;
+  c = m.shuffle(Float32x4.WYWX);
   Expect.equals(4.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.wywy;
+  c = m.shuffle(Float32x4.WYWY);
   Expect.equals(4.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.wywz;
+  c = m.shuffle(Float32x4.WYWZ);
   Expect.equals(4.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.wyww;
+  c = m.shuffle(Float32x4.WYWW);
   Expect.equals(4.0, c.x);
   Expect.equals(2.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.wzxx;
+}
+
+void testShuffle32() {
+  var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+  var c;
+  c = m.shuffle(Float32x4.WZXX);
   Expect.equals(4.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.wzxy;
+  c = m.shuffle(Float32x4.WZXY);
   Expect.equals(4.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.wzxz;
+  c = m.shuffle(Float32x4.WZXZ);
   Expect.equals(4.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.wzxw;
+  c = m.shuffle(Float32x4.WZXW);
   Expect.equals(4.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.wzyx;
+  c = m.shuffle(Float32x4.WZYX);
   Expect.equals(4.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.wzyy;
+  c = m.shuffle(Float32x4.WZYY);
   Expect.equals(4.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.wzyz;
+  c = m.shuffle(Float32x4.WZYZ);
   Expect.equals(4.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.wzyw;
+  c = m.shuffle(Float32x4.WZYW);
   Expect.equals(4.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.wzzx;
+  c = m.shuffle(Float32x4.WZZX);
   Expect.equals(4.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.wzzy;
+  c = m.shuffle(Float32x4.WZZY);
   Expect.equals(4.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.wzzz;
+  c = m.shuffle(Float32x4.WZZZ);
   Expect.equals(4.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.wzzw;
+  c = m.shuffle(Float32x4.WZZW);
   Expect.equals(4.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.wzwx;
+  c = m.shuffle(Float32x4.WZWX);
   Expect.equals(4.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.wzwy;
+  c = m.shuffle(Float32x4.WZWY);
   Expect.equals(4.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.wzwz;
+  c = m.shuffle(Float32x4.WZWZ);
   Expect.equals(4.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.wzww;
+  c = m.shuffle(Float32x4.WZWW);
   Expect.equals(4.0, c.x);
   Expect.equals(3.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.wwxx;
+}
+
+void testShuffle33() {
+  var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+  var c;
+  c = m.shuffle(Float32x4.WWXX);
   Expect.equals(4.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.wwxy;
+  c = m.shuffle(Float32x4.WWXY);
   Expect.equals(4.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.wwxz;
+  c = m.shuffle(Float32x4.WWXZ);
   Expect.equals(4.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.wwxw;
+  c = m.shuffle(Float32x4.WWXW);
   Expect.equals(4.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(1.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.wwyx;
+  c = m.shuffle(Float32x4.WWYX);
   Expect.equals(4.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.wwyy;
+  c = m.shuffle(Float32x4.WWYY);
   Expect.equals(4.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.wwyz;
+  c = m.shuffle(Float32x4.WWYZ);
   Expect.equals(4.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.wwyw;
+  c = m.shuffle(Float32x4.WWYW);
   Expect.equals(4.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(2.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.wwzx;
+  c = m.shuffle(Float32x4.WWZX);
   Expect.equals(4.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.wwzy;
+  c = m.shuffle(Float32x4.WWZY);
   Expect.equals(4.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.wwzz;
+  c = m.shuffle(Float32x4.WWZZ);
   Expect.equals(4.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.wwzw;
+  c = m.shuffle(Float32x4.WWZW);
   Expect.equals(4.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(3.0, c.z);
   Expect.equals(4.0, c.w);
-  c = m.wwwx;
+  c = m.shuffle(Float32x4.WWWX);
   Expect.equals(4.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(1.0, c.w);
-  c = m.wwwy;
+  c = m.shuffle(Float32x4.WWWY);
   Expect.equals(4.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(2.0, c.w);
-  c = m.wwwz;
+  c = m.shuffle(Float32x4.WWWZ);
   Expect.equals(4.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(4.0, c.z);
   Expect.equals(3.0, c.w);
-  c = m.wwww;
+  c = m.shuffle(Float32x4.WWWW);
   Expect.equals(4.0, c.x);
   Expect.equals(4.0, c.y);
   Expect.equals(4.0, c.z);
@@ -1310,11 +1370,68 @@
 }
 
 
+void testShuffleNonConstant(mask) {
+  var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+  var c;
+  c = m.shuffle(mask);
+  if (mask == 1) {
+    Expect.equals(2.0, c.x);
+    Expect.equals(1.0, c.y);
+    Expect.equals(1.0, c.z);
+    Expect.equals(1.0, c.w);
+  } else {
+    Expect.equals(Float32x4.YYYY + 1, mask);
+    Expect.equals(3.0, c.x);
+    Expect.equals(2.0, c.y);
+    Expect.equals(2.0, c.z);
+    Expect.equals(2.0, c.w);
+  }
+}
+
+void testInvalidShuffle(mask) {
+  // Not a valid mask.
+  Expect.isFalse(mask <= 255 && mask >= 0);
+  var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+  var c;
+  Expect.throws(() {
+    c = m.shuffle(mask);
+  });
+}
+
+void testShuffle() {
+  var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
+  var c;
+  c = m.shuffle(Float32x4.WZYX);
+  Expect.equals(4.0, c.x);
+  Expect.equals(3.0, c.y);
+  Expect.equals(2.0, c.z);
+  Expect.equals(1.0, c.w);
+}
+
 main() {
+  var xxxx = Float32x4.XXXX + 1;
+  var yyyy = Float32x4.YYYY + 1;
   for (int i = 0; i < 20; i++) {
-    testShuffle0();
-    testShuffle1();
-    testShuffle2();
-    testShuffle3();
+    testShuffle();
+    testShuffle00();
+    testShuffle01();
+    testShuffle02();
+    testShuffle03();
+    testShuffle10();
+    testShuffle11();
+    testShuffle12();
+    testShuffle13();
+    testShuffle20();
+    testShuffle21();
+    testShuffle22();
+    testShuffle23();
+    testShuffle30();
+    testShuffle31();
+    testShuffle32();
+    testShuffle33();
+    testShuffleNonConstant(xxxx);
+    testShuffleNonConstant(yyyy);
+    testInvalidShuffle(256);
+    testInvalidShuffle(-1);
   }
 }
diff --git a/tests/lib/typed_data/float32x4_test.dart b/tests/lib/typed_data/float32x4_test.dart
index cc24455..41401b8 100644
--- a/tests/lib/typed_data/float32x4_test.dart
+++ b/tests/lib/typed_data/float32x4_test.dart
@@ -130,42 +130,42 @@
 
 testShuffle() {
   var m = new Float32x4(1.0, 2.0, 3.0, 4.0);
-  var xxxx = m.xxxx;
+  var xxxx = m.shuffle(Float32x4.XXXX);
   Expect.equals(1.0, xxxx.x);
   Expect.equals(1.0, xxxx.y);
   Expect.equals(1.0, xxxx.z);
   Expect.equals(1.0, xxxx.w);
-  var yyyy = m.yyyy;
+  var yyyy = m.shuffle(Float32x4.YYYY);
   Expect.equals(2.0, yyyy.x);
   Expect.equals(2.0, yyyy.y);
   Expect.equals(2.0, yyyy.z);
   Expect.equals(2.0, yyyy.w);
-  var zzzz = m.zzzz;
+  var zzzz = m.shuffle(Float32x4.ZZZZ);
   Expect.equals(3.0, zzzz.x);
   Expect.equals(3.0, zzzz.y);
   Expect.equals(3.0, zzzz.z);
   Expect.equals(3.0, zzzz.w);
-  var wwww = m.wwww;
+  var wwww = m.shuffle(Float32x4.WWWW);
   Expect.equals(4.0, wwww.x);
   Expect.equals(4.0, wwww.y);
   Expect.equals(4.0, wwww.z);
   Expect.equals(4.0, wwww.w);
-  var wzyx = m.wzyx;
+  var wzyx = m.shuffle(Float32x4.WZYX);
   Expect.equals(4.0, wzyx.x);
   Expect.equals(3.0, wzyx.y);
   Expect.equals(2.0, wzyx.z);
   Expect.equals(1.0, wzyx.w);
-  var wwzz = m.wwzz;
+  var wwzz = m.shuffle(Float32x4.WWZZ);
   Expect.equals(4.0, wwzz.x);
   Expect.equals(4.0, wwzz.y);
   Expect.equals(3.0, wwzz.z);
   Expect.equals(3.0, wwzz.w);
-  var xxyy = m.xxyy;
+  var xxyy = m.shuffle(Float32x4.XXYY);
   Expect.equals(1.0, xxyy.x);
   Expect.equals(1.0, xxyy.y);
   Expect.equals(2.0, xxyy.z);
   Expect.equals(2.0, xxyy.w);
-  var yyww = m.yyww;
+  var yyww = m.shuffle(Float32x4.YYWW);
   Expect.equals(2.0, yyww.x);
   Expect.equals(2.0, yyww.y);
   Expect.equals(4.0, yyww.z);
diff --git a/tests/standalone/io/certificate_test.dart b/tests/standalone/io/certificate_test.dart
deleted file mode 100644
index b4c8796..0000000
--- a/tests/standalone/io/certificate_test.dart
+++ /dev/null
@@ -1,38 +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.
-
-// This test verifies that a server certificate can be verified by a client
-// that loads the certificate authority certificate it depends on at runtime.
-
-import "package:path/path.dart";
-import "dart:io";
-import "dart:async";
-
-String scriptDir = dirname(new Options().script);
-
-void main() {
-  SecureSocket.initialize(database: join(scriptDir, 'pkcert'),
-                          password: 'dartdart');
-  runServer().then((SecureServerSocket server) {
-    return Process.run(new Options().executable,
-                       ['--checked',
-                        join(scriptDir, 'certificate_test_client.dart'),
-                        server.port.toString(),
-                        join(scriptDir, 'pkcert', 'myauthority.pem')]);
-  }).then((ProcessResult result) {
-    if (result.exitCode != 0 || !result.stdout.contains("SUCCESS")) {
-      print("Client failed with exit code ${result.exitCode}");
-      print("  stdout (expects \"SUCCESS\\n\"):");
-      print(result.stdout);
-      print("  stderr:");
-      print(result.stderr);
-      throw new AssertionError();
-    }
-  });
-}
-
-Future<SecureServerSocket> runServer() =>
-  SecureServerSocket.bind("localhost", 0, "localhost_cert")
-    .then((server) => server..listen(
-        (socket) => socket.pipe(socket).then((_) => server.close())));
diff --git a/tests/standalone/io/certificate_test_client.dart b/tests/standalone/io/certificate_test_client.dart
deleted file mode 100644
index 4e3262d..0000000
--- a/tests/standalone/io/certificate_test_client.dart
+++ /dev/null
@@ -1,65 +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.
-//
-// Client that tests that a certificate authority certificate loaded
-// at runtime can be used to verify a certificate chain. The server it
-// connects to uses localhost_cert, signed by myauthority_cert, to connect
-// securely.
-
-import 'dart:io';
-
-void main() {
-  int port = int.parse(new Options().arguments[0]);
-  String certificate = new Options().arguments[1];
-  SecureSocket.initialize();
-  var mycert = new File(certificate).readAsBytesSync();
-  bool threw = false;
-  try {
-    SecureSocket.addCertificate("I am not a cert".codeUnits,
-                                SecureSocket.TRUST_ISSUE_SERVER_CERTIFICATES);
-  } on CertificateException catch (e) {
-    threw = true;
-  }
-  if (!threw) throw "Expected bad certificate to throw";
-
-  threw = false;
-  try {
-    SecureSocket.addCertificate(mycert, "Trust me, I'm a string");
-  } on CertificateException catch (e) {
-    threw = true;
-  }
-  if (!threw) throw "Expected bad trust string to throw";
-
-  SecureSocket.addCertificate(mycert,
-                              SecureSocket.TRUST_ISSUE_SERVER_CERTIFICATES);
-
-  SecureSocket.connect('localhost', port).then((SecureSocket socket) {
-    socket.writeln('hello world');
-    socket.listen((data) { });
-    return socket.close();
-  }).then((_) {
-    SecureSocket.changeTrust('myauthority_cert', ',,');
-    return SecureSocket.connect('localhost', port);
-  }).then((_) {
-    throw "Expected untrusted authority to stop connection";
-  }, onError: (e) {
-    if (e is! CertificateException) throw e;
-  }).then((_) {
-    SecureSocket.changeTrust('myauthority_cert', 'C,,');
-    return SecureSocket.connect('localhost', port);
-  }).then((SecureSocket socket) {
-    socket.writeln('hello world');
-    socket.listen((data) { });
-    return socket.close();
-  }).then((_) {
-    SecureSocket.removeCertificate('myauthority_cert');
-    return SecureSocket.connect('localhost', port);
-  }).then((_) {
-    throw "Expected untrusted root to stop connection";
-  }, onError: (e) {
-    if (e is! CertificateException) throw e;
-  }).then((_) {
-    print('SUCCESS');  // Checked by parent process.
-  });
-}
diff --git a/tests/standalone/io/certificate_test_client_database.dart b/tests/standalone/io/certificate_test_client_database.dart
deleted file mode 100644
index 9723a6a..0000000
--- a/tests/standalone/io/certificate_test_client_database.dart
+++ /dev/null
@@ -1,42 +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.
-//
-// Client that tests that a certificate authority certificate loaded
-// at runtime can be used to verify a certificate chain. The server it
-// connects to uses localhost_cert, signed by myauthority_cert, to connect
-// securely.  This client tests that addCertificate works if a certificate
-// database has been specified.
-
-import 'dart:io';
-
-void main() {
-  int port = int.parse(new Options().arguments[0]);
-  String certificate = new Options().arguments[1];
-  String database = new Options().arguments[2];
-  SecureSocket.initialize(database: database,
-                          password: 'dartdart',
-                          readOnly: false);
-  SecureSocket.removeCertificate('localhost_cert');
-  SecureSocket.removeCertificate('myauthority_cert');
-  var mycert = new File(certificate).readAsBytesSync();
-  SecureSocket.addCertificate(mycert,
-                              SecureSocket.TRUST_ISSUE_SERVER_CERTIFICATES);
-  if (null != SecureSocket.getCertificate('myauthority_cert')) {
-    throw "Expected getCertificate to return null";
-  }
-  SecureSocket.connect('localhost', port).then((SecureSocket socket) {
-    socket.writeln('hello world');
-    socket.listen((data) { });
-    return socket.close();
-  }).then((_) {
-    // The certificate is only in the in-memory cache, so cannot be removed.
-    try {
-      SecureSocket.removeCertificate('myauthority_cert');
-    } catch (e) {
-      if (e is! CertificateException) throw "error $e";
-    }
-  }).then((_) {
-    print('SUCCESS');  // Checked by parent process.
-  });
-}
diff --git a/tests/standalone/io/delete_a_directory_later.dart b/tests/standalone/io/delete_a_directory_later.dart
deleted file mode 100644
index 5e6da0d..0000000
--- a/tests/standalone/io/delete_a_directory_later.dart
+++ /dev/null
@@ -1,12 +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.
-
-import "dart:io";
-import "dart:async";
-
-main() {
-  new Timer(new Duration(seconds: 2), () {
-    new Directory(new Options().arguments[0]).delete(recursive: true);
-  });
-}
diff --git a/tests/standalone/io/pkcert/myauthority.pem b/tests/standalone/io/pkcert/myauthority.pem
deleted file mode 100644
index 3aebea4..0000000
--- a/tests/standalone/io/pkcert/myauthority.pem
+++ /dev/null
@@ -1,11 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIBpDCCAQ2gAwIBAgIFAJq4IS0wDQYJKoZIhvcNAQEFBQAwFjEUMBIGA1UEAxML

-bXlhdXRob3JpdHkwHhcNMTMwMjE1MTA0MzA5WhcNMTgwMjE1MTA0MzA5WjAWMRQw

-EgYDVQQDEwtteWF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA

-tnrkyrXF1SEUeOdIiULWs0dOEUlX6t73UDVbbTorF6R66fkjkEK3vW9ekZFUWq5+

-HVku4LUViJR140+F+CzUYtN73Ur28GqLa6LY4XtzHfPSfgecgayI1mEU+0f/2l8B

-4RiE9V8mW9RqPM6Lb69QrwXSYdzStl6ltuLJhgPGqAMCAwEAATANBgkqhkiG9w0B

-AQUFAAOBgQBdBUQTUR5oIRdqBGR87qW7caLAuPoVmzikOrSBNoyamVF0lwFFxgNw

-sj5VWdMn0SJhXd3EUMVlHr+4B/c3jUy1PlvBQGURn2cp5c4tj3FMOqkemuA0ywOF

-gbt2lqi7/RW4bHITqfPi7CDzE36n25vXc64Ylk7vEi3hUfjYfIqNcA==
------END CERTIFICATE-----
diff --git a/tests/standalone/io/user_certificate_test.dart b/tests/standalone/io/user_certificate_test.dart
deleted file mode 100644
index c44ca96..0000000
--- a/tests/standalone/io/user_certificate_test.dart
+++ /dev/null
@@ -1,116 +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.
-
-// This test verifies the SecureSocket functions addCertificate,
-// importCertificatesWithPrivateKeys, changeTrust, getCertificate, and
-// removeCertificate.
-
-// It loads a copy of the test certificate database,
-// removes all certificates and keys, then imports the certificates and keys
-// again.  Then it runs a secure server, using the user certificate (a
-// certificate with private key), and starts client processes that use
-// addCertificate to trust the certificate that signed the server's certificate.
-// The clients then test that they can successfully connect to the server.
-
-import "package:expect/expect.dart";
-import "package:path/path.dart";
-import "dart:io";
-import "dart:async";
-
-void main() {
-  Directory tempDirectory = new Directory('').createTempSync();
-  String scriptDirectory = dirname(Platform.script);
-  String database = join(scriptDirectory, 'pkcert');
-  String serverDatabase = join(tempDirectory.path, 'server');
-  String clientDatabase = join(tempDirectory.path, 'client');
-  new Directory(serverDatabase).createSync();
-  new Directory(clientDatabase).createSync();
-
-  cleanUp() {
-    if (Platform.isWindows) {
-      // Delay directory deletion until after this script exits.
-      // The certificate database files are locked until then.
-      Process.start('start',  // Starts a detatched process.
-                    [Platform.executable,
-                     join(scriptDirectory, 'delete_a_directory_later.dart'),
-                     tempDirectory.path],
-                     runInShell: true);
-    } else {
-      tempDirectory.delete(recursive: true);
-    }
-  }
-
-  Future.wait([
-      copyFileToDirectory(join(database, 'cert9.db'), serverDatabase),
-      copyFileToDirectory(join(database, 'key4.db'), serverDatabase),
-      copyFileToDirectory(join(database, 'cert9.db'), clientDatabase),
-      copyFileToDirectory(join(database, 'key4.db'), clientDatabase),
-  ]).then((_) {
-    SecureSocket.initialize(database: serverDatabase,
-                            password: 'dartdart',
-                            readOnly: false);
-    for (var nickname in ['localhost_cert', 'myauthority_cert']) {
-      Expect.isNotNull(SecureSocket.getCertificate(nickname));
-      SecureSocket.removeCertificate(nickname);
-      Expect.isNull(SecureSocket.getCertificate(nickname));
-    }
-
-    var mycerts = new File(join(database, 'localhost.p12')).readAsBytesSync();
-    SecureSocket.importCertificatesWithPrivateKeys(mycerts, 'dartdart');
-
-    checkCertificate('localhost_cert', 'CN=localhost', 'CN=myauthority');
-    checkCertificate('myauthority_cert', 'CN=myauthority', 'CN=myauthority');
-
-    SecureSocket.removeCertificate('myauthority_cert');
-    return runServer().then((server) {
-      var tests = ['certificate_test_client.dart',
-                   'certificate_test_client_database.dart'];
-      return Future.wait(tests.map((test) =>
-          Process.run(Platform.executable,
-                      ['--checked',
-                       join(scriptDirectory, test),
-                       server.port.toString(),
-                       join(database, 'myauthority.pem'),
-                       clientDatabase])))
-      .then(verifyResults)
-      .whenComplete(server.close);
-    });
-  })
-  .whenComplete(cleanUp);
-}
-
-checkCertificate(nickname, subject, issuer) {
-  var cert = SecureSocket.getCertificate(nickname);
-  Expect.isTrue(cert is X509Certificate);
-  Expect.equals(subject, cert.subject);
-  Expect.equals(issuer, cert.issuer);
-}
-
-Future<SecureServerSocket> runServer() =>
-  SecureServerSocket.bind("localhost", 0, "localhost_cert")
-    .then((server) => server..listen((socket) => socket.pipe(socket)));
-
-verifyResults(results) => results.map(verifyResult);
-verifyResult(ProcessResult result) {
-  if (result.exitCode != 0 ||  !result.stdout.contains('SUCCESS')) {
-    print("Client failed with exit code ${result.exitCode}");
-    print("  stdout (expected \"SUCCESS\\n\"):");
-    print(result.stdout);
-    print("  stderr:");
-    print(result.stderr);
-    Expect.fail("Client failed");
-  }
-}
-
-Future copyFileToDirectory(String file, String directory) {
-  switch (Platform.operatingSystem) {
-    case 'linux':
-    case 'macos':
-      return Process.run('cp', [file, directory]);
-    case 'windows':
-      return Process.run('cmd.exe', ['/C', 'copy $file $directory']);
-    default:
-      Expect.fail('Unknown operating system ${Platform.operatingSystem}');
-  }
-}
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 25e362a4..e15eaf5 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -7,6 +7,10 @@
 # listed in tests/lib/analyzer/analyze_tests.status without the "standalone"
 # prefix.
 
+# The testing infrastructure is using the dart:io Path class.
+io/skipping_dart2js_compilations_test: Skip # http/dartbug.com/12449
+io/dependency_graph_test: Skip # http/dartbug.com/12449
+
 package/invalid_uri_test: Fail, OK # Fails intentionally
 
 [ $runtime == vm ]
@@ -147,7 +151,7 @@
 *: Skip
 
 [ $arch == arm ]
-*: Skip # Shared libraries problem.
+io/internet_address_test: Fail  # localhost is an Unknown name?
 
 [ $arch == simarm ]
 out_of_memory_test: Skip # passes on Mac, crashes on Linux
diff --git a/tests/utils/dummy_compiler_test.dart b/tests/utils/dummy_compiler_test.dart
index f341977..f95a289 100644
--- a/tests/utils/dummy_compiler_test.dart
+++ b/tests/utils/dummy_compiler_test.dart
@@ -76,7 +76,8 @@
 class JSBool {}
 getInterceptor(o){}
 getDispatchProperty(o) {}
-setDispatchProperty(o, v) {}""";
+setDispatchProperty(o, v) {}
+var mapTypeToInterceptor;""";
     } else if (uri.path.endsWith('js_helper.dart')) {
       source = 'library jshelper; class JSInvocationMirror {} '
                'class ConstantMap {} class TypeImpl {} '
diff --git a/tests/utils/recursive_import_test.dart b/tests/utils/recursive_import_test.dart
index f827089..db0eff3 100644
--- a/tests/utils/recursive_import_test.dart
+++ b/tests/utils/recursive_import_test.dart
@@ -47,7 +47,7 @@
   add(x) { }
 }
 class JSMutableArray extends JSArray {}
-class JSExtendableArray extends JSMutableArray{}
+class JSExtendableArray extends JSMutableArray {}
 class JSFixedArray extends JSMutableArray {}
 class JSString {
   split(x) => null;
diff --git a/tests/utils/utils.status b/tests/utils/utils.status
index 7bc1414..6fdf0e2 100644
--- a/tests/utils/utils.status
+++ b/tests/utils/utils.status
@@ -11,6 +11,9 @@
 dart2js_test: Skip # Uses dart:io.
 txt_layout_test: Skip # Might just go away.
 
+[ $compiler == none && $runtime == drt && $mode == debug ]
+recursive_import_test: Fail # 12501
+
 [ $compiler == dart2js && $browser ]
 *: Skip
 
diff --git a/tools/VERSION b/tools/VERSION
index 5265791..01d318f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 0
 MINOR 6
-BUILD 18
+BUILD 19
 PATCH 0
diff --git a/tools/coverage.dart b/tools/coverage.dart
index 3f51f00..20811d1 100644
--- a/tools/coverage.dart
+++ b/tools/coverage.dart
@@ -104,7 +104,7 @@
       }
     });
 
-    String srcPath = new Path(Uri.parse(url).path).toNativePath();
+    String srcPath = Uri.parse(url).toFilePath();
     List lines = new File(srcPath).readAsLinesSync();
     for (int line = 1; line <= lines.length; line++) {
       String prefix = "      ";
diff --git a/tools/dom/dom.py b/tools/dom/dom.py
index 4e3240a..c362f55 100755
--- a/tools/dom/dom.py
+++ b/tools/dom/dom.py
@@ -96,18 +96,6 @@
   os.chdir(os.path.join('..', '..', '..'))
   return result
 
-def http_server():
-  print('Browse tests at '
-      '\033[94mhttp://localhost:5400/root_build/generated_tests/\033[0m')
-  return call([
-    utils.DartBinary(),
-    os.path.join('tools', 'testing', 'dart', 'http_server.dart'),
-    '--port=5400',
-    '--crossOriginPort=5401',
-    '--network=0.0.0.0',
-    '--build-directory=%s' % os.path.join('out', 'ReleaseIA32')
-  ])
-
 def size_check():
   ''' Displays the dart2js size of swarm. '''
   dart_file = os.path.join('samples', 'swarm', 'swarm.dart')
@@ -151,6 +139,25 @@
     cmd.append('html')
   return call(cmd)
 
+def test_server():
+  start_test_server(5400, os.path.join('out', 'ReleaseIA32'))
+
+def test_server_dartium():
+  start_test_server(5500, os.path.join('..', 'out', 'Release'))
+
+def start_test_server(port, build_directory):
+  print('Browse tests at '
+      '\033[94mhttp://localhost:%d/root_build/generated_tests/\033[0m' % port)
+  return call([
+    utils.DartBinary(),
+    os.path.join('tools', 'testing', 'dart', 'http_server.dart'),
+    '--port=%d' % port,
+    '--crossOriginPort=%d' % (port + 1),
+    '--network=0.0.0.0',
+    '--build-directory=%s' % build_directory
+  ])
+
+
 def call(args):
   print ' '.join(args)
   pipe = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
@@ -176,8 +183,10 @@
       '\t\tOptionally provide name of test to run.'],
   'test_ff': [test_ff, 'Run tests in checked mode in Firefox.\n'
       '\t\tOptionally provide name of test to run.'],
-  'http_server': [http_server, 'Starts the testing server for manually '
+  'test_server': [test_server, 'Starts the testing server for manually '
       'running browser tests.'],
+  'test_server_dartium': [test_server_dartium, 'Starts the testing server for '
+      'manually running browser tests from a dartium enlistment.'],
 }
 
 def main():
diff --git a/tools/dom/scripts/chromegenerator.py b/tools/dom/scripts/chromegenerator.py
index 2093d15..73d504c 100755
--- a/tools/dom/scripts/chromegenerator.py
+++ b/tools/dom/scripts/chromegenerator.py
@@ -36,13 +36,13 @@
 // DO NOT EDIT
 // Auto-generated dart:chrome library.
 
-/// Native wrappers for the Chrome Packaged App APIs.
+/// Native wrappers for the Chrome packaged app APIs.
 ///
-/// These functions allow direct access to the Packaged App APIs, allowing
-/// Chrome Packaged Apps to be written using Dart.
+/// These functions allow direct access to the chrome.* APIs, allowing
+/// Chrome packaged apps to be written using Dart.
 ///
-/// For more information on these APIs, see the Chrome.* APIs Documentation:
-///   http://developer.chrome.com/extensions/api_index.html
+/// For more information on these APIs, see the
+/// [chrome.* API documentation](http://developer.chrome.com/apps/api_index.html).
 library chrome;
 
 import 'dart:_foreign_helper' show JS;
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index d264a5c..396b7b3 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -736,8 +736,6 @@
 
   def implementation_name(self):
     implementation_name = self._dart_interface_name
-    if self.merged_into():
-      return '_%s' % self.idl_type()
 
     if not self.has_generated_interface():
       implementation_name = '_%s' % implementation_name
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index 23882c6..c58b21b 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -39,6 +39,8 @@
     'FileSystemCallback': '_FileSystemCallback',
     'FileWriterCallback': '_FileWriterCallback',
     'HTMLDocument' : 'HtmlDocument',
+    'HTMLElement' : 'HtmlElement',
+    'HTMLHtmlElement' : 'HtmlHtmlElement',
     'IDBFactory': 'IdbFactory', # Manual to avoid name conflicts.
     'Key': 'CryptoKey',
     'NamedNodeMap': '_NamedNodeMap',
diff --git a/tools/dom/src/chrome/chrome.dart b/tools/dom/src/chrome/chrome.dart
index 221ee5e..2c02ae9 100644
--- a/tools/dom/src/chrome/chrome.dart
+++ b/tools/dom/src/chrome/chrome.dart
@@ -44,6 +44,7 @@
    * Members
    */
   API_ChromeApp app;
+  API_file_system fileSystem;
 
   /*
    * Constructor
@@ -57,6 +58,11 @@
     if (app_object == null)
       throw new UnsupportedError('Not supported by current browser.');
     app = new API_ChromeApp(app_object);
+
+    var file_system_object = JS('', '#.fileSystem', this._jsObject);
+    if (file_system_object == null)
+      throw new UnsupportedError('Not supported by current browser.');
+    fileSystem = new API_file_system(file_system_object);
   }
 }
 
diff --git a/tools/dom/src/dart2js_CustomElementSupport.dart b/tools/dom/src/dart2js_CustomElementSupport.dart
new file mode 100644
index 0000000..a40e81c
--- /dev/null
+++ b/tools/dom/src/dart2js_CustomElementSupport.dart
@@ -0,0 +1,68 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of dart.dom.html;
+
+_callOnCreated(receiver) {
+  return receiver.onCreated();
+}
+
+_makeCreatedCallbackMethod() {
+  return JS('',
+      '''((function(invokeCallback) {
+             return function() {
+               return invokeCallback(this);
+             };
+          })(#))''',
+      convertDartClosureToJS(_callOnCreated, 1));
+}
+
+void _registerCustomElement(context, document, String tag, Type type) {
+  // Function follows the same pattern as the following JavaScript code for
+  // registering a custom element.
+  //
+  //    var proto = Object.create(HTMLElement.prototype, {
+  //        createdCallback: {
+  //          value: function() {
+  //            window.console.log('here');
+  //          }
+  //        }
+  //    });
+  //    document.register('x-foo', { prototype: proto });
+  //    ...
+  //    var e = document.createElement('x-foo');
+
+  var interceptorClass = findInterceptorConstructorForType(type);
+  if (interceptorClass == null) {
+    throw new ArgumentError(type);
+  }
+
+  String baseClassName = findDispatchTagForInterceptorClass(interceptorClass);
+  if (baseClassName == null) {
+    throw new ArgumentError(type);
+  }
+  if (baseClassName == 'Element') baseClassName = 'HTMLElement';
+
+  var baseConstructor = JS('=Object', '#[#]', context, baseClassName);
+  if (JS('bool', "typeof(#) != 'function'", baseConstructor)) {
+    throw new ArgumentError(type);
+  }
+
+  var properties = JS('=Object', '{}');
+
+  var jsCreatedCallback = _makeCreatedCallbackMethod();
+
+  JS('void', '#.createdCallback = #', properties,
+      JS('=Object', '{value: #}', jsCreatedCallback));
+
+  var baseProto = JS('=Object', '#.prototype', baseConstructor);
+  var proto = JS('=Object', 'Object.create(#, #)', baseProto, properties);
+
+  var interceptor = JS('=Object', '#.prototype', interceptorClass);
+
+  setNativeSubclassDispatchRecord(proto, interceptor);
+
+  JS('void', '#.register(#, #)',
+      document, tag, JS('', '{prototype: #}', proto));
+}
diff --git a/tools/dom/src/native_DOMImplementation.dart b/tools/dom/src/native_DOMImplementation.dart
index 8cdf24d..a7c0e97 100644
--- a/tools/dom/src/native_DOMImplementation.dart
+++ b/tools/dom/src/native_DOMImplementation.dart
@@ -211,7 +211,8 @@
     Symbol objectName = reflectClass(Object).qualifiedName;
     bool isRoot(ClassMirror cls) =>
       cls == null || cls.qualifiedName == objectName;
-    Symbol elementName = reflectClass(Element).qualifiedName;
+    // TODO(vsm): Support extending SvgElement as well.
+    Symbol elementName = reflectClass(HtmlElement).qualifiedName;
     bool isElement(ClassMirror cls) =>
       cls != null && cls.qualifiedName == elementName;
 
@@ -220,7 +221,7 @@
     }
 
     if (isRoot(superClass)) {
-      throw new UnsupportedError("Invalid custom element doesn't inherit from Element.");
+      throw new UnsupportedError("Invalid custom element doesn't inherit from HtmlElement.");
     }
     _register(tag, type);
   }
@@ -353,7 +354,7 @@
 
 final _forwardingPrintClosure = _Utils.forwardingPrint;
 
- class _Timer implements Timer{
+ class _Timer implements Timer {
   var _canceler;
 
   _Timer(int milliSeconds, void callback(Timer timer), bool repeating) {
diff --git a/tools/dom/templates/html/dart2js/chrome_dart2js.darttemplate b/tools/dom/templates/html/dart2js/chrome_dart2js.darttemplate
index 3798c9c..2ea934d 100644
--- a/tools/dom/templates/html/dart2js/chrome_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/chrome_dart2js.darttemplate
@@ -6,13 +6,13 @@
 // DO NOT EDIT
 // Auto-generated dart:chrome library.
 
-/// Native wrappers for the Chrome Packaged App APIs.
+/// Native wrappers for the Chrome packaged app APIs.
 ///
-/// These functions allow direct access to the Packaged App APIs, allowing
-/// Chrome Packaged Apps to be written using Dart.
+/// These functions allow direct access to the chrome.* APIs, allowing
+/// Chrome packaged apps to be written using Dart.
 ///
-/// For more information on these APIs, see the Chrome.* APIs Documentation:
-///   http://developer.chrome.com/extensions/api_index.html
+/// For more information on these APIs, see the
+/// [chrome.* API documentation](http://developer.chrome.com/apps/api_index.html).
 library chrome;
 
 import 'dart:_foreign_helper' show JS;
diff --git a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
index bfe368c..62fcb28 100644
--- a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
@@ -27,8 +27,12 @@
 import 'dart:web_audio' as web_audio;
 import 'dart:web_gl' as gl;
 import 'dart:web_sql';
-import 'dart:_js_helper' show convertDartClosureToJS, Creates, JavaScriptIndexingBehavior, JSName, Null, Returns;
-import 'dart:_interceptors' show Interceptor, JSExtendableArray;
+import 'dart:_js_helper' show
+    convertDartClosureToJS, Creates, JavaScriptIndexingBehavior,
+    JSName, Null, Returns,
+    findDispatchTagForInterceptorClass, setNativeSubclassDispatchRecord;
+import 'dart:_interceptors' show
+    Interceptor, JSExtendableArray, findInterceptorConstructorForType;
 import 'dart:_isolate_helper' show IsolateNatives;
 import 'dart:_foreign_helper' show JS;
 
@@ -57,6 +61,7 @@
 part '$AUXILIARY_DIR/WrappedEvent.dart';
 part '$AUXILIARY_DIR/WrappedList.dart';
 part '$AUXILIARY_DIR/dart2js_Conversions.dart';
+part '$AUXILIARY_DIR/dart2js_CustomElementSupport.dart';
 part '$AUXILIARY_DIR/dart2js_DOMImplementation.dart';
 part '$AUXILIARY_DIR/dart2js_KeyEvent.dart';
 part '$AUXILIARY_DIR/dart2js_LocationWrapper.dart';
@@ -89,8 +94,8 @@
 
 // Workaround for tags like <cite> that lack their own Element subclass --
 // Dart issue 1990.
-class _HTMLElement extends Element native "HTMLElement" {
-  factory _HTMLElement() { throw new UnsupportedError("Not supported"); }
+class HtmlElement extends Element native "HTMLElement" {
+  factory HtmlElement() { throw new UnsupportedError("Not supported"); }
 }
 
 // Support for Send/ReceivePortSync.
diff --git a/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate b/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate
index af28eef..7cb895e 100644
--- a/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate
@@ -2,6 +2,9 @@
 // https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
 // Auto-generated dart:audio library.
 
+/**
+ * High-fidelity audio programming in the browser.
+ */
 library dart.dom.web_audio;
 
 import 'dart:async';
diff --git a/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate b/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate
index 6383511..147f61c 100644
--- a/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate
@@ -2,6 +2,9 @@
 // https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
 // Auto-generated dart:web_gl library.
 
+/**
+ * 3D programming in the browser.
+ */
 library dart.dom.web_gl;
 
 import 'dart:collection';
diff --git a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
index 227131a..8f1a4ca 100644
--- a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
@@ -168,8 +168,8 @@
 
   @Experimental
 $if DART2JS
-  void register(String tag, Type custom) {
-    throw new UnsupportedError("Custom DOM types not supported");
+  void register(String tag, Type customElementClass) {
+    _registerCustomElement(JS('', 'window'), this, tag, customElementClass);
   }
 $else
   void register(String tag, Type custom) {
diff --git a/utils/compiler/create_snapshot.dart b/utils/compiler/create_snapshot.dart
index 5e429bd..37920a3 100644
--- a/utils/compiler/create_snapshot.dart
+++ b/utils/compiler/create_snapshot.dart
@@ -6,9 +6,9 @@
 
 Future<String> getVersion(var options, var rootPath) {
   var suffix = Platform.operatingSystem == 'windows' ? '.exe' : '';
-  var printVersionScript =
-      rootPath.append("tools").append("print_version.py").toNativePath();
-  return Process.run("python$suffix", [printVersionScript]).then((result) {
+  var printVersionScript = rootPath.resolve("tools/print_version.py");
+  return Process.run("python$suffix",
+                     [printVersionScript.toFilePath()]).then((result) {
     if (result.exitCode != 0) {
       throw "Could not generate version";
     }
@@ -17,14 +17,13 @@
 }
 
 Future<String> getSnapshotGenerationFile(var options, var args, var rootPath) {
-  var dart2js = rootPath.append(args["dart2js_main"]);
-  var dartdoc = rootPath.append(args["dartdoc_main"]);
-
+  var dart2js = rootPath.resolve(args["dart2js_main"]);
+  var dartdoc = rootPath.resolve(args["dartdoc_main"]);
   return getVersion(options, rootPath).then((version) {
     var snapshotGenerationText =
 """
-import '${dart2js}' as dart2jsMain;
-import '${dartdoc}' as dartdocMain;
+import '${dart2js.toFilePath(windows: false)}' as dart2jsMain;
+import '${dartdoc.toFilePath(windows: false)}' as dartdocMain;
 import 'dart:io';
 
 void main() {
@@ -86,9 +85,9 @@
   if (!args.containsKey("output_dir")) throw "Please specify output_dir";
   if (!args.containsKey("package_root")) throw "Please specify package_root";
 
-  var scriptFile = new File(new File(options.script).fullPathSync());
-  var path = new Path(scriptFile.directory.path);
-  var rootPath = path.directoryPath.directoryPath;
+  var scriptFile = new Uri.file(new File(options.script).fullPathSync());
+  var path = scriptFile.resolve(".");
+  var rootPath = path.resolve("../..");
   getSnapshotGenerationFile(options, args, rootPath).then((result) {
     var wrapper = "${args['output_dir']}/utils_wrapper.dart";
     writeSnapshotFile(wrapper, result);
diff --git a/utils/testrunner/standard_test_runner.dart b/utils/testrunner/standard_test_runner.dart
index 89fcc2f..7429259 100644
--- a/utils/testrunner/standard_test_runner.dart
+++ b/utils/testrunner/standard_test_runner.dart
@@ -41,7 +41,7 @@
 /**
  * A special marker string used to separate group names and
  * identify non-debug output.
- */ 
+ */
 final marker = '###';
 
 class Macros {
@@ -53,7 +53,7 @@
   static const String testStacktrace = '<STACK>';
 }
 
-class TestRunnerConfiguration extends Configuration {
+class TestRunnerConfiguration extends SimpleConfiguration {
   get name => 'Minimal test runner configuration';
   get autoStart => false;
 
@@ -191,7 +191,7 @@
 
 // Support for running in isolates.
 
-class TestRunnerChildConfiguration extends Configuration {
+class TestRunnerChildConfiguration extends SimpleConfiguration {
   get name => 'Test runner child configuration';
   get autoStart => false;