Version 1.9.0-dev.5.0

svn merge -r 42855:43175 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@43185 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index 5cfadd9..08f6aa5 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -3507,6 +3507,10 @@
 \LMHash{}
 If $f$ is marked \SYNC* (\ref{functions}), then a fresh instance $i$ implementing the built-in class \code{Iterable} is associated with the invocation and immediately returned. When iteration over the iterable is started, by getting an iterator $j$ from the iterable and calling \code{moveNext()} on it, execution of the body of $f$ will begin. When $f$ terminates, $j$ is positioned after its last element, so that its current value is \NULL{} and the current call to \code{moveNext()} on $j$ returns false, as will all further calls.
 
+% Can we get more than one iterator from this Iterable? I'd say yes. And if so, do they restart the computation or do they iterate over previously computed results. My guess is the latter.
+% I also assume we extend the IterableBase implementation; otherwise one can pre-compute
+% it all
+
 \LMHash{}
 If $f$ is synchronous and is not a generator (\ref{functions}) then execution of the body of $f$ begins immediately.  When $f$ terminates the current return value is returned to the caller.
 
@@ -7122,14 +7126,12 @@
 \LMHash{}
 {\em Documentation comments} are comments that begin with the tokens  \code{///} or  \code{/**}. Documentation comments are intended to be processed by a tool that produces human readable documentation. 
 
-\LMHash{}
-The scope of a documentation comment  always excludes the imported namespace of the enclosing library. Only names declared in the enclosing library are considered in scope within a documentation comment.
 
 \LMHash{}
-The scope of a documentation comment immediately preceding the declaration of a class $C$ is the instance scope of $C$, excluding any names introduced via the import namespace of the enclosing library.
+The scope of a documentation comment immediately preceding the declaration of a class $C$ is the instance scope of $C$.
 
 \LMHash{}
-The scope of a documentation comment immediately preceding the declaration of a function $f$  is the  scope in force at the very beginning of the body of $f$,  excluding any names introduced via the import namespace of the enclosing library.
+The scope of a documentation comment immediately preceding the declaration of a function $f$  is the  scope in force at the very beginning of the body of $f$.
 
 
 
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index c3214a9..69af5fb 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -70,6 +70,10 @@
       for readability.
     </p>
     <p>
+      It is the client's responsibility to read output from the server to
+      avoid its blocking.
+    </p>
+    <p>
       To ease interoperability with Lisp-based clients (which may not
       be able to easily distinguish between empty lists, empty maps,
       and null), client-to-server communication is allowed to replace
@@ -96,15 +100,20 @@
       longer to process than others.
     </p>
     <p>
-      Every request is required to have two fields and may have an
-      optional third field. The first required field is the ‘id’
+      Every request is required to have two fields and may have two
+      additional optional fields. The first required field is the ‘id’
       field, which is only used by the server to associate a response
       with the request that generated the response. The second
       required field is the ‘method’ field, which is used to determine
-      what the server is being requested to do. The optional field is
+      what the server is being requested to do. One optional field is
       the ‘params’ field, whose structure is dependent on the method
       being requested. The structure of this field is described with
-      each request for which it is required.
+      each request for which it is required. The other optional field
+      is the 'clientRequestTime' field, which is a number indicating
+      the time at which the client made the request (milliseconds
+      since epoch). Providing clientRequestTime helps us track
+      how responsive analysis server is to client requests
+      and better address any issues that occur.
     </p>
     <p>
       Every response has up to three fields. The first field is the
@@ -173,6 +182,22 @@
       errors produced for all files in the actual analysis roots.
       </dd>
     </dl>
+    <dl>
+      <dt>--file-read-mode</dt>
+      <dd>
+      An enumeration of the ways files can be read from disk. Some clients
+      normalize end of line characters which would make the file offset and
+      range information incorrect. The default option is <tt>as-is</tt>, but
+      can also be set to <tt>normalize-eol-always</tt>. The default option
+      (<tt>as-is</tt>) reads files as they are on disk. The
+      <tt>normalize-eol-always</tt> option does the following:
+      <ul>
+        <li>'\r\n' is converted to '\n';</li>
+        <li>'\r' by itself is converted to '\n';</li>
+        <li>this happens regardless of the OS editor is running on.</li>
+      </ul>
+      </dd>
+    </dl>
     </blockquote>
     <h2 class="domain"><a name="domain_server">Domain: server</a></h2>
       <p>
@@ -347,6 +372,7 @@
       
       
       
+      
     <h3>Requests</h3><dl><dt class="request">analysis.getErrors</dt><dd><div class="box"><pre>request: {
   "id": String
   "method": "analysis.getErrors"
@@ -441,7 +467,28 @@
               in multiple contexts in conflicting ways (such as a
               part that is included in multiple libraries).
             </p>
-          </dd></dl></dd><dt class="request">analysis.getNavigation</dt><dd><div class="box"><pre>request: {
+          </dd></dl></dd><dt class="request">analysis.getLibraryDependencies</dt><dd><div class="box"><pre>request: {
+  "id": String
+  "method": "analysis.getLibraryDependencies"
+}</pre><br><pre>response: {
+  "id": String
+  "error": <span style="color:#999999">optional</span> <a href="#type_RequestError">RequestError</a>
+  "result": {
+    "<b>libraries</b>": List&lt;<a href="#type_FilePath">FilePath</a>&gt;
+  }
+}</pre></div>
+            <p>
+              Return a list of all of the libraries referenced by any files in
+              existing analysis roots.
+            </p>
+            
+      <h4>Returns</h4><dl><dt class="field"><b><i>libraries ( List&lt;<a href="#type_FilePath">FilePath</a>&gt; )</i></b></dt><dd>
+                    
+                    <p>
+                      A list of the paths of library elements referenced by
+                      files in existing analysis roots.
+                    </p>
+                </dd></dl></dd><dt class="request">analysis.getNavigation</dt><dd><div class="box"><pre>request: {
   "id": String
   "method": "analysis.getNavigation"
   "params": {
@@ -700,6 +747,8 @@
 }</pre><br><pre>response: {
   "id": String
   "error": <span style="color:#999999">optional</span> <a href="#type_RequestError">RequestError</a>
+  "result": {
+  }
 }</pre></div>
         <p>
           Update the content of one or more files. Files that were
@@ -712,13 +761,14 @@
           filesystem.
         </p>
         
+        
       <h4>Parameters</h4><dl><dt class="field"><b><i>files ( Map&lt;<a href="#type_FilePath">FilePath</a>, <a href="#type_AddContentOverlay">AddContentOverlay</a> | <a href="#type_ChangeContentOverlay">ChangeContentOverlay</a> | <a href="#type_RemoveContentOverlay">RemoveContentOverlay</a>&gt; )</i></b></dt><dd>
             
             <p>
               A table mapping the files whose content has changed to a
               description of the content change.
             </p>
-          </dd></dl></dd><dt class="request">analysis.updateOptions</dt><dd><div class="box"><pre>request: {
+          </dd></dl><h4>Returns</h4><dl></dl></dd><dt class="request">analysis.updateOptions</dt><dd><div class="box"><pre>request: {
   "id": String
   "method": "analysis.updateOptions"
   "params": {
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 14d2480..43db47b 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -63,6 +63,19 @@
  */
 class AnalysisServer {
   /**
+   * The version of the analysis server. The value should be replaced
+   * automatically during the build.
+   */
+  static final String VERSION = '0.0.1';
+
+  /**
+   * The number of milliseconds to perform operations before inserting
+   * a 1 millisecond delay so that the VM and dart:io can deliver content
+   * to stdin. This should be removed once the underlying problem is fixed.
+   */
+  static int performOperationDelayFreqency = 25;
+
+  /**
    * The channel from which requests are received and to which responses should
    * be sent.
    */
@@ -159,16 +172,16 @@
   bool _noErrorNotification;
 
   /**
+   * The [Completer] that completes when analysis is complete.
+   */
+  Completer _onAnalysisCompleteCompleter;
+
+  /**
    * The controller that is notified when analysis is started.
    */
   StreamController<AnalysisContext> _onAnalysisStartedController;
 
   /**
-   * The controller that is notified when analysis is complete.
-   */
-  StreamController _onAnalysisCompleteController;
-
-  /**
    * The controller that is notified when a single file has been analyzed.
    */
   StreamController<ChangeNotice> _onFileAnalyzedController;
@@ -185,6 +198,21 @@
   bool rethrowExceptions;
 
   /**
+   * The next time (milliseconds since epoch) after which the analysis server
+   * should pause so that pending requests can be fetched by the system.
+   */
+  // Add 1 sec to prevent delay from impacting short running tests
+  int _nextPerformOperationDelayTime =
+      new DateTime.now().millisecondsSinceEpoch +
+      1000;
+
+  /**
+   * The current state of overlays from the client.  This is used as the
+   * content cache for all contexts.
+   */
+  ContentCache _overlayState = new ContentCache();
+
+  /**
    * Initialize a newly created server to receive requests from and send
    * responses to the given [channel].
    *
@@ -198,7 +226,7 @@
       AnalysisServerOptions analysisServerOptions, this.defaultSdk,
       this.instrumentationService, {this.rethrowExceptions: true}) {
     searchEngine = createSearchEngine(index);
-    operationQueue = new ServerOperationQueue(this);
+    operationQueue = new ServerOperationQueue();
     contextDirectoryManager =
         new ServerContextManager(this, resourceProvider, packageMapProvider);
     contextDirectoryManager.defaultOptions.incremental = true;
@@ -209,7 +237,6 @@
     _noErrorNotification = analysisServerOptions.noErrorNotification;
     AnalysisEngine.instance.logger = new AnalysisLogger();
     _onAnalysisStartedController = new StreamController.broadcast();
-    _onAnalysisCompleteController = new StreamController.broadcast();
     _onFileAnalyzedController = new StreamController.broadcast();
     _onPriorityChangeController =
         new StreamController<PriorityChangeEvent>.broadcast();
@@ -220,9 +247,17 @@
   }
 
   /**
-   * The stream that is notified when analysis is complete.
+   * The [Future] that completes when analysis is complete.
    */
-  Stream get onAnalysisComplete => _onAnalysisCompleteController.stream;
+  Future get onAnalysisComplete {
+    if (isAnalysisComplete()) {
+      return new Future.value();
+    }
+    if (_onAnalysisCompleteCompleter == null) {
+      _onAnalysisCompleteCompleter = new Completer();
+    }
+    return _onAnalysisCompleteCompleter.future;
+  }
 
   /**
    * The stream that is notified when analysis of a context is started.
@@ -539,14 +574,6 @@
   }
 
   /**
-   * Returns `true` if the given [AnalysisContext] is a priority one.
-   */
-  bool isPriorityContext(AnalysisContext context) {
-    // TODO(scheglov) implement support for priority sources/contexts
-    return false;
-  }
-
-  /**
    * Returns a [Future] completing when [file] has been completely analyzed, in
    * particular, all its errors have been computed.  The future is completed
    * with an [AnalysisDoneReason] indicating what caused the file's analysis to
@@ -618,7 +645,10 @@
         _schedulePerformOperation();
       } else {
         sendStatusNotification(null);
-        _onAnalysisCompleteController.add(null);
+        if (_onAnalysisCompleteCompleter != null) {
+          _onAnalysisCompleteCompleter.complete();
+          _onAnalysisCompleteCompleter = null;
+        }
       }
     }
   }
@@ -785,11 +815,7 @@
                 break;
               case AnalysisService.OUTLINE:
                 LineInfo lineInfo = context.getLineInfo(source);
-                sendAnalysisNotificationOutline(
-                    this,
-                    source,
-                    lineInfo,
-                    dartUnit);
+                sendAnalysisNotificationOutline(this, file, lineInfo, dartUnit);
                 break;
               case AnalysisService.OVERRIDES:
                 sendAnalysisNotificationOverrides(this, file, dartUnit);
@@ -836,6 +862,7 @@
       }
       context.analysisPriorityOrder = sourceList;
     });
+    operationQueue.reschedule();
     Source firstSource = files.length > 0 ? getSource(files[0]) : null;
     _onPriorityChangeController.add(new PriorityChangeEvent(firstSource));
   }
@@ -868,42 +895,47 @@
    */
   void updateContent(String id, Map<String, dynamic> changes) {
     changes.forEach((file, change) {
-      AnalysisContext analysisContext = getAnalysisContext(file);
-      // TODO(paulberry): handle the case where a file is referred to by more
-      // than one context (e.g package A depends on package B using a local
-      // path, user has both packages open for editing in separate contexts,
-      // and user modifies a file in package B).
-      if (analysisContext != null) {
-        Source source = getSource(file);
-        if (change is AddContentOverlay) {
-          analysisContext.setContents(source, change.content);
-        } else if (change is ChangeContentOverlay) {
-          // TODO(paulberry): an error should be generated if source is not
-          // currently in the content cache.
-          TimestampedData<String> oldContents =
-              analysisContext.getContents(source);
-          String newContents;
-          try {
-            newContents =
-                SourceEdit.applySequence(oldContents.data, change.edits);
-          } on RangeError {
-            throw new RequestFailure(
-                new Response(
-                    id,
-                    error: new RequestError(
-                        RequestErrorCode.INVALID_OVERLAY_CHANGE,
-                        'Invalid overlay change')));
-          }
-          // TODO(paulberry): to aid in incremental processing it would be
-          // better to use setChangedContents.
-          analysisContext.setContents(source, newContents);
-        } else if (change is RemoveContentOverlay) {
-          analysisContext.setContents(source, null);
-        } else {
-          // Protocol parsing should have ensured that we never get here.
-          throw new AnalysisException('Illegal change type');
+      Source source = getSource(file);
+      String oldContents = _overlayState.getContents(source);
+      String newContents;
+      if (change is AddContentOverlay) {
+        newContents = change.content;
+      } else if (change is ChangeContentOverlay) {
+        if (oldContents == null) {
+          // The client may only send a ChangeContentOverlay if there is
+          // already an existing overlay for the source.
+          throw new RequestFailure(
+              new Response(
+                  id,
+                  error: new RequestError(
+                      RequestErrorCode.INVALID_OVERLAY_CHANGE,
+                      'Invalid overlay change')));
         }
-        schedulePerformAnalysisOperation(analysisContext);
+        try {
+          newContents = SourceEdit.applySequence(oldContents, change.edits);
+        } on RangeError {
+          throw new RequestFailure(
+              new Response(
+                  id,
+                  error: new RequestError(
+                      RequestErrorCode.INVALID_OVERLAY_CHANGE,
+                      'Invalid overlay change')));
+        }
+      } else if (change is RemoveContentOverlay) {
+        newContents = null;
+      } else {
+        // Protocol parsing should have ensured that we never get here.
+        throw new AnalysisException('Illegal change type');
+      }
+      _overlayState.setContents(source, newContents);
+      for (InternalAnalysisContext context in folderMap.values) {
+        if (context.handleContentsChanged(
+            source,
+            oldContents,
+            newContents,
+            true)) {
+          schedulePerformAnalysisOperation(context);
+        }
       }
     });
   }
@@ -938,7 +970,24 @@
    */
   void _schedulePerformOperation() {
     assert(!performOperationPending);
-    new Future(performOperation);
+    /*
+     * TODO (danrubel) Rip out this workaround once the underlying problem
+     * is fixed. Currently, the VM and dart:io do not deliver content
+     * on stdin in a timely manner if the event loop is busy.
+     * To work around this problem, we delay for 1 millisecond
+     * every 25 milliseconds.
+     *
+     * To disable this workaround and see the underlying problem,
+     * set performOperationDelayFreqency to zero
+     */
+    int now = new DateTime.now().millisecondsSinceEpoch;
+    if (now > _nextPerformOperationDelayTime &&
+        performOperationDelayFreqency > 0) {
+      _nextPerformOperationDelayTime = now + performOperationDelayFreqency;
+      new Future.delayed(new Duration(milliseconds: 1), performOperation);
+    } else {
+      new Future(performOperation);
+    }
     performOperationPending = true;
   }
 }
@@ -948,6 +997,7 @@
   bool enableIncrementalResolutionApi = false;
   bool enableIncrementalResolutionValidation = false;
   bool noErrorNotification = false;
+  String fileReadMode = 'as-is';
 }
 
 /**
@@ -1015,7 +1065,9 @@
 
   @override
   void addContext(Folder folder, UriResolver packageUriResolver) {
-    AnalysisContext context = AnalysisEngine.instance.createAnalysisContext();
+    InternalAnalysisContext context =
+        AnalysisEngine.instance.createAnalysisContext();
+    context.contentCache = analysisServer._overlayState;
     analysisServer.folderMap[folder] = context;
     context.sourceFactory = _createSourceFactory(packageUriResolver);
     context.analysisOptions = new AnalysisOptionsImpl.con1(defaultOptions);
diff --git a/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart b/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
index bcb86cc..884dcd2 100644
--- a/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
+++ b/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
@@ -61,36 +61,14 @@
  * standard input and standard output) to communicate with clients.
  */
 class ByteStreamServerChannel implements ServerCommunicationChannel {
-  /**
-   * Value of [_outputState] indicating that there is no outstanding data in
-   * [_pendingOutput], and that the most recent flush of [_output] has
-   * completed.
-   */
-  static const int _STATE_IDLE = 0;
-
-  /**
-   * Value of [_outputState] indicating that there is outstanding data in
-   * [_pendingOutput], and that the most recent flush of [_output] has
-   * completed; therefore a microtask has been scheduled to send the data.
-   */
-  static const int _STATE_MICROTASK_PENDING = 1;
-
-  /**
-   * Value of [_outputState] indicating that data has been sent to the
-   * [_output] stream and flushed, but the flush has not completed, so we must
-   * wait for it to complete before sending more data.  There may or may not be
-   * outstanding data in [_pendingOutput].
-   */
-  static const int _STATE_FLUSH_PENDING = 2;
-
-  final Stream input;
+  final Stream _input;
 
   final IOSink _output;
 
   /**
    * The instrumentation service that is to be used by this analysis server.
    */
-  final InstrumentationService instrumentationService;
+  final InstrumentationService _instrumentationService;
 
   /**
    * Completer that will be signalled when the input stream is closed.
@@ -98,23 +76,12 @@
   final Completer _closed = new Completer();
 
   /**
-   * State of the output stream (see constants above).
-   */
-  int _outputState = _STATE_IDLE;
-
-  /**
-   * List of strings that need to be sent to [_output] at the next available
-   * opportunity.
-   */
-  List<String> _pendingOutput = <String>[];
-
-  /**
    * True if [close] has been called.
    */
   bool _closeRequested = false;
 
-  ByteStreamServerChannel(this.input, this._output,
-      this.instrumentationService);
+  ByteStreamServerChannel(this._input, this._output,
+      this._instrumentationService);
 
   /**
    * Future that will be completed when the input stream is closed.
@@ -127,20 +94,15 @@
   void close() {
     if (!_closeRequested) {
       _closeRequested = true;
-      if (_outputState == _STATE_IDLE) {
-        assert(!_closed.isCompleted);
-        _closed.complete();
-      } else {
-        // Nothing to do.  [_flushCompleted] will call _closed.complete() after
-        // the flush completes.
-      }
+      assert(!_closed.isCompleted);
+      _closed.complete();
     }
   }
 
   @override
   void listen(void onRequest(Request request), {Function onError, void
       onDone()}) {
-    input.transform(
+    _input.transform(
         (new Utf8Codec()).decoder).transform(
             new LineSplitter()).listen(
                 (String data) => _readRequest(data, onRequest),
@@ -162,7 +124,7 @@
     String jsonEncoding = JSON.encode(notification.toJson());
     ServerCommunicationChannel.ToJson.stop();
     _outputLine(jsonEncoding);
-    instrumentationService.logNotification(jsonEncoding);
+    _instrumentationService.logNotification(jsonEncoding);
   }
 
   @override
@@ -176,53 +138,14 @@
     String jsonEncoding = JSON.encode(response.toJson());
     ServerCommunicationChannel.ToJson.stop();
     _outputLine(jsonEncoding);
-    instrumentationService.logResponse(jsonEncoding);
-  }
-
-  /**
-   * Callback invoked after a flush of [_output] completes.  Closes the stream
-   * if necessary.  Otherwise schedules additional pending output.
-   */
-  void _flushCompleted(_) {
-    assert(_outputState == _STATE_FLUSH_PENDING);
-    if (_pendingOutput.isNotEmpty) {
-      _output.write(_pendingOutput.join());
-      _output.flush().then(_flushCompleted);
-      _pendingOutput.clear();
-      // Since we've done another flush, stay in _STATE_FLUSH_PENDING.
-    } else {
-      _outputState = _STATE_IDLE;
-      if (_closeRequested) {
-        assert(!_closed.isCompleted);
-        _closed.complete();
-      }
-    }
-  }
-
-  /**
-   * Microtask that writes pending output to the output stream and flushes it.
-   */
-  void _microtask() {
-    assert(_outputState == _STATE_MICROTASK_PENDING);
-    _output.write(_pendingOutput.join());
-    _output.flush().then(_flushCompleted);
-    _pendingOutput.clear();
-    _outputState = _STATE_FLUSH_PENDING;
+    _instrumentationService.logResponse(jsonEncoding);
   }
 
   /**
    * Send the string [s] to [_output] followed by a newline.
    */
   void _outputLine(String s) {
-    _pendingOutput.add(s);
-    _pendingOutput.add('\n');
-    if (_outputState == _STATE_IDLE) {
-      // Don't send the output just yet; schedule a microtask to do it, so that
-      // if caller decides to output additional lines, they will get sent in
-      // the same call to _output.write().
-      new Future.microtask(_microtask);
-      _outputState = _STATE_MICROTASK_PENDING;
-    }
+    _output.writeln(s);
   }
 
   /**
@@ -234,7 +157,7 @@
     if (_closed.isCompleted) {
       return;
     }
-    instrumentationService.logRequest(data);
+    _instrumentationService.logRequest(data);
     // Parse the string as a JSON descriptor and process the resulting
     // structure as a request.
     ServerCommunicationChannel.FromJson.start();
diff --git a/pkg/analysis_server/lib/src/channel/channel.dart b/pkg/analysis_server/lib/src/channel/channel.dart
index 046a7c3..71ee75e 100644
--- a/pkg/analysis_server/lib/src/channel/channel.dart
+++ b/pkg/analysis_server/lib/src/channel/channel.dart
@@ -8,7 +8,6 @@
 import 'dart:convert';
 
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/util/utilities_timing.dart';
 
 /**
diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart
index 03d8a89..be1c3ac 100644
--- a/pkg/analysis_server/lib/src/computer/computer_outline.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart
@@ -19,8 +19,7 @@
   final CompilationUnit unit;
   final LineInfo lineInfo;
 
-  DartUnitOutlineComputer(Source source, this.lineInfo, this.unit)
-      : file = source.fullName;
+  DartUnitOutlineComputer(this.file, this.lineInfo, this.unit);
 
   /**
    * Returns the computed outline, not `null`.
diff --git a/pkg/analysis_server/lib/src/constants.dart b/pkg/analysis_server/lib/src/constants.dart
index 7aa71a7..4f5e232 100644
--- a/pkg/analysis_server/lib/src/constants.dart
+++ b/pkg/analysis_server/lib/src/constants.dart
@@ -23,6 +23,8 @@
 //
 const String ANALYSIS_GET_ERRORS = 'analysis.getErrors';
 const String ANALYSIS_GET_HOVER = 'analysis.getHover';
+const String ANALYSIS_GET_LIBRARY_DEPENDENCIES =
+    'analysis.getLibraryDependencies';
 const String ANALYSIS_REANALYZE = 'analysis.reanalyze';
 const String ANALYSIS_SET_ANALYSIS_ROOTS = 'analysis.setAnalysisRoots';
 const String ANALYSIS_SET_PRIORITY_FILES = 'analysis.setPriorityFiles';
@@ -56,7 +58,8 @@
 const String SEARCH_FIND_ELEMENT_REFERENCES = 'search.findElementReferences';
 const String SEARCH_FIND_MEMBER_DECLARATIONS = 'search.findMemberDeclarations';
 const String SEARCH_FIND_MEMBER_REFERENCES = 'search.findMemberReferences';
-const String SEARCH_FIND_TOP_LEVEL_DECLARATIONS = 'search.findTopLevelDeclarations';
+const String SEARCH_FIND_TOP_LEVEL_DECLARATIONS =
+    'search.findTopLevelDeclarations';
 const String SEARCH_GET_TYPE_HIERARCHY = 'search.getTypeHierarchy';
 
 //
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index 829745a..100276f 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -10,6 +10,7 @@
 import 'package:analysis_server/src/computer/computer_hover.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analysis_server/src/services/dependencies/library_dependencies.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/engine.dart' as engine;
 
@@ -87,6 +88,14 @@
     return new AnalysisGetHoverResult(hovers).toResponse(request.id);
   }
 
+  /// Implement the `analysis.getLibraryDependencies` request.
+  Response getLibraryDependencies(Request request) {
+    Set<String> libraries = new LibraryDependencyCollector(
+        server.getAnalysisContexts()).collectLibraryDependencies();
+    return new AnalysisGetLibraryDependenciesResult(
+        libraries.toList(growable: false)).toResponse(request.id);
+  }
+
   @override
   Response handleRequest(Request request) {
     try {
@@ -95,6 +104,8 @@
         return getErrors(request);
       } else if (requestName == ANALYSIS_GET_HOVER) {
         return getHover(request);
+      } else if (requestName == ANALYSIS_GET_LIBRARY_DEPENDENCIES) {
+        return getLibraryDependencies(request);
       } else if (requestName == ANALYSIS_REANALYZE) {
         return reanalyze(request);
       } else if (requestName == ANALYSIS_SET_ANALYSIS_ROOTS) {
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index 06c5188..e6a57b4 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -57,9 +57,8 @@
 
   /**
    * The maximum number of performance measurements to keep.
-   * This defaults to zero for efficiency, but clients may change this.
    */
-  int performanceListMaxLength = 0;
+  static const int performanceListMaxLength = 50;
 
   /**
    * Performance for the last priority change event.
@@ -175,7 +174,7 @@
     int notificationCount = 0;
     manager.results(completionRequest).listen((CompletionResult result) {
       ++notificationCount;
-      performance.logElapseTime("notification $notificationCount", () {
+      performance.logElapseTime("notification $notificationCount send", () {
         sendCompletionNotification(
             completionId,
             result.replacementOffset,
@@ -183,9 +182,13 @@
             result.suggestions,
             result.last);
       });
+      if (notificationCount == 1) {
+        performance.logFirstNotificationComplete('notification 1 complete');
+        performance.suggestionCountFirst = result.suggestions.length;
+      }
       if (result.last) {
         performance.notificationCount = notificationCount;
-        performance.suggestionCount = result.suggestions.length;
+        performance.suggestionCountLast = result.suggestions.length;
         performance.complete();
       }
     });
@@ -201,7 +204,6 @@
   void recordRequest(CompletionPerformance performance, AnalysisContext context,
       Source source, int offset) {
     performance.source = source;
-    performance.offset = offset;
     if (priorityChangedPerformance != null &&
         priorityChangedPerformance.source != source) {
       priorityChangedPerformance = null;
@@ -213,7 +215,7 @@
     if (data == null) {
       return;
     }
-    performance.contents = data.data;
+    performance.setContentsAndOffset(data.data, offset);
     while (performanceList.length >= performanceListMaxLength) {
       performanceList.removeAt(0);
     }
diff --git a/pkg/analysis_server/lib/src/domain_server.dart b/pkg/analysis_server/lib/src/domain_server.dart
index 607fb3d..a99b196 100644
--- a/pkg/analysis_server/lib/src/domain_server.dart
+++ b/pkg/analysis_server/lib/src/domain_server.dart
@@ -27,7 +27,8 @@
    * Return the version number of the analysis server.
    */
   Response getVersion(Request request) {
-    return new ServerGetVersionResult('0.0.1').toResponse(request.id);
+    return new ServerGetVersionResult(
+        AnalysisServer.VERSION).toResponse(request.id);
   }
 
   @override
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 70ce1d3..c611d3f 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -304,50 +304,45 @@
         EMPTY_PROBLEM_LIST);
     // process the request
     var params = new EditGetRefactoringParams.fromRequest(request);
-    runZoned(() {
-      _init(params.kind, params.file, params.offset, params.length).then((_) {
-        if (initStatus.hasFatalError) {
-          feedback = null;
+    runZoned(() async {
+      await _init(params.kind, params.file, params.offset, params.length);
+      if (initStatus.hasFatalError) {
+        feedback = null;
+        return _sendResultResponse();
+      }
+      // set options
+      if (_requiresOptions) {
+        if (params.options == null) {
+          optionsStatus = new RefactoringStatus();
           return _sendResultResponse();
         }
-        // set options
-        if (_requiresOptions) {
-          if (params.options == null) {
-            optionsStatus = new RefactoringStatus();
-            return _sendResultResponse();
-          }
-          optionsStatus = _setOptions(params);
-          if (_hasFatalError) {
-            return _sendResultResponse();
-          }
-        }
-        // done if just validation
-        if (params.validateOnly) {
-          finalStatus = new RefactoringStatus();
+        optionsStatus = _setOptions(params);
+        if (_hasFatalError) {
           return _sendResultResponse();
         }
-        // simulate an exception
-        if (test_simulateRefactoringException_final) {
-          throw 'A simulated refactoring exception - final.';
-        }
-        // validation and create change
-        return refactoring.checkFinalConditions().then((_finalStatus) {
-          finalStatus = _finalStatus;
-          if (_hasFatalError) {
-            return _sendResultResponse();
-          }
-          // simulate an exception
-          if (test_simulateRefactoringException_change) {
-            throw 'A simulated refactoring exception - change.';
-          }
-          // create change
-          return refactoring.createChange().then((change) {
-            result.change = change;
-            result.potentialEdits = nullIfEmpty(refactoring.potentialEditIds);
-            return _sendResultResponse();
-          });
-        });
-      });
+      }
+      // done if just validation
+      if (params.validateOnly) {
+        finalStatus = new RefactoringStatus();
+        return _sendResultResponse();
+      }
+      // simulate an exception
+      if (test_simulateRefactoringException_final) {
+        throw 'A simulated refactoring exception - final.';
+      }
+      // validation and create change
+      finalStatus = await refactoring.checkFinalConditions();
+      if (_hasFatalError) {
+        return _sendResultResponse();
+      }
+      // simulate an exception
+      if (test_simulateRefactoringException_change) {
+        throw 'A simulated refactoring exception - change.';
+      }
+      // create change
+      result.change = await refactoring.createChange();
+      result.potentialEdits = nullIfEmpty(refactoring.potentialEditIds);
+      _sendResultResponse();
     }, onError: (exception, stackTrace) {
       server.instrumentationService.logException(exception, stackTrace);
       server.sendResponse(
@@ -360,14 +355,15 @@
    * Initializes this context to perform a refactoring with the specified
    * parameters. The existing [Refactoring] is reused or created as needed.
    */
-  Future<RefactoringStatus> _init(RefactoringKind kind, String file, int offset,
-      int length) {
+  _init(RefactoringKind kind, String file,
+      int offset, int length) async {
+    await server.onAnalysisComplete;
     // check if we can continue with the existing Refactoring instance
     if (this.kind == kind &&
         this.file == file &&
         this.offset == offset &&
         this.length == length) {
-      return new Future.value(initStatus);
+      return;
     }
     _reset();
     this.kind = kind;
@@ -464,53 +460,50 @@
     if (refactoring == null) {
       initStatus =
           new RefactoringStatus.fatal('Unable to create a refactoring');
-      return new Future.value(initStatus);
+      return;
     }
     // check initial conditions
-    return refactoring.checkInitialConditions().then((status) {
-      initStatus = status;
-      if (refactoring is ExtractLocalRefactoring) {
-        ExtractLocalRefactoring refactoring = this.refactoring;
-        ExtractLocalVariableFeedback feedback = this.feedback;
-        feedback.names = refactoring.names;
-        feedback.offsets = refactoring.offsets;
-        feedback.lengths = refactoring.lengths;
+    initStatus = await refactoring.checkInitialConditions();
+    if (refactoring is ExtractLocalRefactoring) {
+      ExtractLocalRefactoring refactoring = this.refactoring;
+      ExtractLocalVariableFeedback feedback = this.feedback;
+      feedback.names = refactoring.names;
+      feedback.offsets = refactoring.offsets;
+      feedback.lengths = refactoring.lengths;
+    }
+    if (refactoring is ExtractMethodRefactoring) {
+      ExtractMethodRefactoring refactoring = this.refactoring;
+      ExtractMethodFeedback feedback = this.feedback;
+      feedback.canCreateGetter = refactoring.canCreateGetter;
+      feedback.returnType = refactoring.returnType;
+      feedback.names = refactoring.names;
+      feedback.parameters = refactoring.parameters;
+      feedback.offsets = refactoring.offsets;
+      feedback.lengths = refactoring.lengths;
+    }
+    if (refactoring is InlineLocalRefactoring) {
+      InlineLocalRefactoring refactoring = this.refactoring;
+      if (!initStatus.hasFatalError) {
+        feedback = new InlineLocalVariableFeedback(
+            refactoring.variableName,
+            refactoring.referenceCount);
       }
-      if (refactoring is ExtractMethodRefactoring) {
-        ExtractMethodRefactoring refactoring = this.refactoring;
-        ExtractMethodFeedback feedback = this.feedback;
-        feedback.canCreateGetter = refactoring.canCreateGetter;
-        feedback.returnType = refactoring.returnType;
-        feedback.names = refactoring.names;
-        feedback.parameters = refactoring.parameters;
-        feedback.offsets = refactoring.offsets;
-        feedback.lengths = refactoring.lengths;
+    }
+    if (refactoring is InlineMethodRefactoring) {
+      InlineMethodRefactoring refactoring = this.refactoring;
+      if (!initStatus.hasFatalError) {
+        feedback = new InlineMethodFeedback(
+            refactoring.methodName,
+            refactoring.isDeclaration,
+            className: refactoring.className);
       }
-      if (refactoring is InlineLocalRefactoring) {
-        InlineLocalRefactoring refactoring = this.refactoring;
-        if (!status.hasFatalError) {
-          feedback = new InlineLocalVariableFeedback(
-              refactoring.variableName,
-              refactoring.referenceCount);
-        }
-      }
-      if (refactoring is InlineMethodRefactoring) {
-        InlineMethodRefactoring refactoring = this.refactoring;
-        if (!status.hasFatalError) {
-          feedback = new InlineMethodFeedback(
-              refactoring.methodName,
-              refactoring.isDeclaration,
-              className: refactoring.className);
-        }
-      }
-      if (refactoring is RenameRefactoring) {
-        RenameRefactoring refactoring = this.refactoring;
-        RenameFeedback feedback = this.feedback;
-        feedback.elementKindName = refactoring.elementKindName;
-        feedback.oldName = refactoring.oldName;
-      }
-      return initStatus;
-    });
+    }
+    if (refactoring is RenameRefactoring) {
+      RenameRefactoring refactoring = this.refactoring;
+      RenameFeedback feedback = this.feedback;
+      feedback.elementKindName = refactoring.elementKindName;
+      feedback.oldName = refactoring.oldName;
+    }
   }
 
   void _reset([engine.AnalysisContext context]) {
diff --git a/pkg/analysis_server/lib/src/generated_protocol.dart b/pkg/analysis_server/lib/src/generated_protocol.dart
index d83dd32..dec7e5e 100644
--- a/pkg/analysis_server/lib/src/generated_protocol.dart
+++ b/pkg/analysis_server/lib/src/generated_protocol.dart
@@ -708,6 +708,94 @@
     return _JenkinsSmiHash.finish(hash);
   }
 }
+/**
+ * analysis.getLibraryDependencies params
+ */
+class AnalysisGetLibraryDependenciesParams {
+  Request toRequest(String id) {
+    return new Request(id, "analysis.getLibraryDependencies", null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisGetLibraryDependenciesParams) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 246577680;
+  }
+}
+
+/**
+ * analysis.getLibraryDependencies result
+ *
+ * {
+ *   "libraries": List<FilePath>
+ * }
+ */
+class AnalysisGetLibraryDependenciesResult implements HasToJson {
+  /**
+   * A list of the paths of library elements referenced by files in existing
+   * analysis roots.
+   */
+  List<String> libraries;
+
+  AnalysisGetLibraryDependenciesResult(this.libraries);
+
+  factory AnalysisGetLibraryDependenciesResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<String> libraries;
+      if (json.containsKey("libraries")) {
+        libraries = jsonDecoder._decodeList(jsonPath + ".libraries", json["libraries"], jsonDecoder._decodeString);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "libraries");
+      }
+      return new AnalysisGetLibraryDependenciesResult(libraries);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.getLibraryDependencies result");
+    }
+  }
+
+  factory AnalysisGetLibraryDependenciesResult.fromResponse(Response response) {
+    return new AnalysisGetLibraryDependenciesResult.fromJson(
+        new ResponseDecoder(REQUEST_ID_REFACTORING_KINDS.remove(response.id)), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["libraries"] = libraries;
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisGetLibraryDependenciesResult) {
+      return _listEqual(libraries, other.libraries, (String a, String b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, libraries.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
 
 /**
  * analysis.getNavigation params
@@ -1317,14 +1405,44 @@
     return _JenkinsSmiHash.finish(hash);
   }
 }
+
 /**
  * analysis.updateContent result
+ *
+ * {
+ * }
  */
-class AnalysisUpdateContentResult {
-  Response toResponse(String id) {
-    return new Response(id, result: null);
+class AnalysisUpdateContentResult implements HasToJson {
+  AnalysisUpdateContentResult();
+
+  factory AnalysisUpdateContentResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      return new AnalysisUpdateContentResult();
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.updateContent result");
+    }
   }
 
+  factory AnalysisUpdateContentResult.fromResponse(Response response) {
+    return new AnalysisUpdateContentResult.fromJson(
+        new ResponseDecoder(REQUEST_ID_REFACTORING_KINDS.remove(response.id)), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
   @override
   bool operator==(other) {
     if (other is AnalysisUpdateContentResult) {
@@ -1335,7 +1453,8 @@
 
   @override
   int get hashCode {
-    return 468798730;
+    int hash = 0;
+    return _JenkinsSmiHash.finish(hash);
   }
 }
 
@@ -5294,6 +5413,11 @@
 
   static const ERROR = const AnalysisErrorSeverity._("ERROR");
 
+  /**
+   * A list containing all of the enum values that are defined.
+   */
+  static const List<AnalysisErrorSeverity> VALUES = const <AnalysisErrorSeverity>[INFO, WARNING, ERROR];
+
   final String name;
 
   const AnalysisErrorSeverity._(this.name);
@@ -5358,6 +5482,11 @@
 
   static const TODO = const AnalysisErrorType._("TODO");
 
+  /**
+   * A list containing all of the enum values that are defined.
+   */
+  static const List<AnalysisErrorType> VALUES = const <AnalysisErrorType>[CHECKED_MODE_COMPILE_TIME_ERROR, COMPILE_TIME_ERROR, HINT, LINT, STATIC_TYPE_WARNING, STATIC_WARNING, SYNTACTIC_ERROR, TODO];
+
   final String name;
 
   const AnalysisErrorType._(this.name);
@@ -5571,6 +5700,11 @@
 
   static const OVERRIDES = const AnalysisService._("OVERRIDES");
 
+  /**
+   * A list containing all of the enum values that are defined.
+   */
+  static const List<AnalysisService> VALUES = const <AnalysisService>[FOLDING, HIGHLIGHTS, INVALIDATE, NAVIGATION, OCCURRENCES, OUTLINE, OVERRIDES];
+
   final String name;
 
   const AnalysisService._(this.name);
@@ -6133,6 +6267,11 @@
 
   static const PARAMETER = const CompletionSuggestionKind._("PARAMETER");
 
+  /**
+   * A list containing all of the enum values that are defined.
+   */
+  static const List<CompletionSuggestionKind> VALUES = const <CompletionSuggestionKind>[ARGUMENT_LIST, IMPORT, IDENTIFIER, INVOCATION, KEYWORD, NAMED_ARGUMENT, OPTIONAL_ARGUMENT, PARAMETER];
+
   final String name;
 
   const CompletionSuggestionKind._(this.name);
@@ -6414,6 +6553,11 @@
 
   static const UNKNOWN = const ElementKind._("UNKNOWN");
 
+  /**
+   * A list containing all of the enum values that are defined.
+   */
+  static const List<ElementKind> VALUES = const <ElementKind>[CLASS, CLASS_TYPE_ALIAS, COMPILATION_UNIT, CONSTRUCTOR, FIELD, FUNCTION, FUNCTION_TYPE_ALIAS, GETTER, LABEL, LIBRARY, LOCAL_VARIABLE, METHOD, PARAMETER, PREFIX, SETTER, TOP_LEVEL_VARIABLE, TYPE_PARAMETER, UNIT_TEST_GROUP, UNIT_TEST_TEST, UNKNOWN];
+
   final String name;
 
   const ElementKind._(this.name);
@@ -6572,6 +6716,11 @@
 
   static const SERVER = const ExecutableKind._("SERVER");
 
+  /**
+   * A list containing all of the enum values that are defined.
+   */
+  static const List<ExecutableKind> VALUES = const <ExecutableKind>[CLIENT, EITHER, NOT_EXECUTABLE, SERVER];
+
   final String name;
 
   const ExecutableKind._(this.name);
@@ -6617,6 +6766,11 @@
 class ExecutionService implements Enum {
   static const LAUNCH_DATA = const ExecutionService._("LAUNCH_DATA");
 
+  /**
+   * A list containing all of the enum values that are defined.
+   */
+  static const List<ExecutionService> VALUES = const <ExecutionService>[LAUNCH_DATA];
+
   final String name;
 
   const ExecutionService._(this.name);
@@ -6668,6 +6822,11 @@
 
   static const TOP_LEVEL_DECLARATION = const FoldingKind._("TOP_LEVEL_DECLARATION");
 
+  /**
+   * A list containing all of the enum values that are defined.
+   */
+  static const List<FoldingKind> VALUES = const <FoldingKind>[COMMENT, CLASS_MEMBER, DIRECTIVES, DOCUMENTATION_COMMENT, TOP_LEVEL_DECLARATION];
+
   final String name;
 
   const FoldingKind._(this.name);
@@ -7000,6 +7159,11 @@
 
   static const TYPE_PARAMETER = const HighlightRegionType._("TYPE_PARAMETER");
 
+  /**
+   * A list containing all of the enum values that are defined.
+   */
+  static const List<HighlightRegionType> VALUES = const <HighlightRegionType>[ANNOTATION, BUILT_IN, CLASS, COMMENT_BLOCK, COMMENT_DOCUMENTATION, COMMENT_END_OF_LINE, CONSTRUCTOR, DIRECTIVE, DYNAMIC_TYPE, ENUM, ENUM_CONSTANT, FIELD, FIELD_STATIC, FUNCTION, FUNCTION_DECLARATION, FUNCTION_TYPE_ALIAS, GETTER_DECLARATION, IDENTIFIER_DEFAULT, IMPORT_PREFIX, KEYWORD, LABEL, LITERAL_BOOLEAN, LITERAL_DOUBLE, LITERAL_INTEGER, LITERAL_LIST, LITERAL_MAP, LITERAL_STRING, LOCAL_VARIABLE, LOCAL_VARIABLE_DECLARATION, METHOD, METHOD_DECLARATION, METHOD_DECLARATION_STATIC, METHOD_STATIC, PARAMETER, SETTER_DECLARATION, TOP_LEVEL_VARIABLE, TYPE_NAME_DYNAMIC, TYPE_PARAMETER];
+
   final String name;
 
   const HighlightRegionType._(this.name);
@@ -7511,6 +7675,11 @@
 
   static const VARIABLE = const LinkedEditSuggestionKind._("VARIABLE");
 
+  /**
+   * A list containing all of the enum values that are defined.
+   */
+  static const List<LinkedEditSuggestionKind> VALUES = const <LinkedEditSuggestionKind>[METHOD, PARAMETER, TYPE, VARIABLE];
+
   final String name;
 
   const LinkedEditSuggestionKind._(this.name);
@@ -8424,6 +8593,11 @@
 
   static const SORT_MEMBERS = const RefactoringKind._("SORT_MEMBERS");
 
+  /**
+   * A list containing all of the enum values that are defined.
+   */
+  static const List<RefactoringKind> VALUES = const <RefactoringKind>[CONVERT_GETTER_TO_METHOD, CONVERT_METHOD_TO_GETTER, EXTRACT_LOCAL_VARIABLE, EXTRACT_METHOD, INLINE_LOCAL_VARIABLE, INLINE_METHOD, MOVE_FILE, RENAME, SORT_MEMBERS];
+
   final String name;
 
   const RefactoringKind._(this.name);
@@ -8678,6 +8852,11 @@
 
   static const NAMED = const RefactoringMethodParameterKind._("NAMED");
 
+  /**
+   * A list containing all of the enum values that are defined.
+   */
+  static const List<RefactoringMethodParameterKind> VALUES = const <RefactoringMethodParameterKind>[REQUIRED, POSITIONAL, NAMED];
+
   final String name;
 
   const RefactoringMethodParameterKind._(this.name);
@@ -8819,6 +8998,11 @@
 
   static const FATAL = const RefactoringProblemSeverity._("FATAL");
 
+  /**
+   * A list containing all of the enum values that are defined.
+   */
+  static const List<RefactoringProblemSeverity> VALUES = const <RefactoringProblemSeverity>[INFO, WARNING, ERROR, FATAL];
+
   final String name;
 
   const RefactoringProblemSeverity._(this.name);
@@ -9105,6 +9289,11 @@
    */
   static const UNSUPPORTED_FEATURE = const RequestErrorCode._("UNSUPPORTED_FEATURE");
 
+  /**
+   * A list containing all of the enum values that are defined.
+   */
+  static const List<RequestErrorCode> VALUES = const <RequestErrorCode>[CONTENT_MODIFIED, FORMAT_INVALID_FILE, GET_ERRORS_INVALID_FILE, INVALID_OVERLAY_CHANGE, INVALID_PARAMETER, INVALID_REQUEST, SERVER_ALREADY_STARTED, SERVER_ERROR, SORT_MEMBERS_INVALID_FILE, SORT_MEMBERS_PARSE_ERRORS, UNANALYZED_PRIORITY_FILES, UNKNOWN_REQUEST, UNSUPPORTED_FEATURE];
+
   final String name;
 
   const RequestErrorCode._(this.name);
@@ -9315,6 +9504,11 @@
    */
   static const WRITE = const SearchResultKind._("WRITE");
 
+  /**
+   * A list containing all of the enum values that are defined.
+   */
+  static const List<SearchResultKind> VALUES = const <SearchResultKind>[DECLARATION, INVOCATION, READ, READ_WRITE, REFERENCE, UNKNOWN, WRITE];
+
   final String name;
 
   const SearchResultKind._(this.name);
@@ -9366,6 +9560,11 @@
 class ServerService implements Enum {
   static const STATUS = const ServerService._("STATUS");
 
+  /**
+   * A list containing all of the enum values that are defined.
+   */
+  static const List<ServerService> VALUES = const <ServerService>[STATUS];
+
   final String name;
 
   const ServerService._(this.name);
diff --git a/pkg/analysis_server/lib/src/get_handler.dart b/pkg/analysis_server/lib/src/get_handler.dart
index ebdac828f..0aabb73 100644
--- a/pkg/analysis_server/lib/src/get_handler.dart
+++ b/pkg/analysis_server/lib/src/get_handler.dart
@@ -2,16 +2,26 @@
 // for 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 get.handler;
+library analysis_server.src.get_handler;
 
+import 'dart:collection';
 import 'dart:convert';
 import 'dart:io';
 import 'dart:math';
 
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_completion.dart';
+import 'package:analysis_server/src/domain_execution.dart';
+import 'package:analysis_server/src/operation/operation.dart';
+import 'package:analysis_server/src/operation/operation_analysis.dart';
+import 'package:analysis_server/src/operation/operation_queue.dart';
+import 'package:analysis_server/src/protocol.dart' hide Element;
 import 'package:analysis_server/src/socket_server.dart';
+import 'package:analysis_server/src/status/ast_writer.dart';
+import 'package:analysis_server/src/status/element_writer.dart';
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -19,6 +29,13 @@
 import 'analysis_server.dart';
 
 /**
+ * A function that can be used to generate HTML output into the given [buffer].
+ * The HTML that is generated must be valid (special characters must already be
+ * encoded).
+ */
+typedef void HtmlGenerator(StringBuffer buffer);
+
+/**
  * Instances of the class [GetHandler] handle GET requests.
  */
 class GetHandler {
@@ -28,6 +45,11 @@
   static const String STATUS_PATH = '/status';
 
   /**
+   * The path used to request information about a element model.
+   */
+  static const String AST_PATH = '/ast';
+
+  /**
    * The path used to request information about the cache entry corresponding
    * to a single file.
    */
@@ -45,6 +67,26 @@
   static const String COMPLETION_PATH = '/completion';
 
   /**
+   * The path used to request information about a specific context.
+   */
+  static const String CONTEXT_PATH = '/context';
+
+  /**
+   * The path used to request information about a element model.
+   */
+  static const String ELEMENT_PATH = '/element';
+
+  /**
+   * The path used to request an overlay contents.
+   */
+  static const String OVERLAY_PATH = '/overlay';
+
+  /**
+   * The path used to request overlays information.
+   */
+  static const String OVERLAYS_PATH = '/overlays';
+
+  /**
    * Query parameter used to represent the cache state to search for, when
    * accessing [CACHE_STATE_PATH].
    */
@@ -63,11 +105,19 @@
   static const String DESCRIPTOR_QUERY_PARAM = 'descriptor';
 
   /**
+   * Query parameter used to represent the index in the [_overlayContents].
+   */
+  static const String ID_PARAM = 'id';
+
+  /**
    * Query parameter used to represent the source to search for, when accessing
    * [CACHE_ENTRY_PATH].
    */
   static const String SOURCE_QUERY_PARAM = 'entry';
 
+  static final ContentType _htmlContent =
+      new ContentType("text", "html", charset: "utf-8");
+
   /**
    * The socket server whose status is to be reported on.
    */
@@ -79,100 +129,129 @@
   List<String> _printBuffer;
 
   /**
+   * Contents of overlay files.
+   */
+  final Map<int, String> _overlayContents = <int, String>{};
+
+  /**
    * Initialize a newly created handler for GET requests.
    */
   GetHandler(this._server, this._printBuffer);
 
   /**
+   * Return the active [CompletionDomainHandler]
+   * or `null` if either analysis server is not running
+   * or there is no completion domain handler.
+   */
+  CompletionDomainHandler get _completionDomainHandler {
+    AnalysisServer analysisServer = _server.analysisServer;
+    if (analysisServer == null) {
+      return null;
+    }
+    return analysisServer.handlers.firstWhere(
+        (h) => h is CompletionDomainHandler,
+        orElse: () => null);
+  }
+
+  /**
    * Handle a GET request received by the HTTP server.
    */
   void handleGetRequest(HttpRequest request) {
     String path = request.uri.path;
     if (path == STATUS_PATH) {
       _returnServerStatus(request);
+    } else if (path == AST_PATH) {
+      _returnAst(request);
     } else if (path == CACHE_STATE_PATH) {
       _returnCacheState(request);
     } else if (path == CACHE_ENTRY_PATH) {
       _returnCacheEntry(request);
     } else if (path == COMPLETION_PATH) {
       _returnCompletionInfo(request);
+    } else if (path == CONTEXT_PATH) {
+      _returnContextInfo(request);
+    } else if (path == ELEMENT_PATH) {
+      _returnElement(request);
+    } else if (path == OVERLAY_PATH) {
+      _returnOverlayContents(request);
+    } else if (path == OVERLAYS_PATH) {
+      _returnOverlaysInfo(request);
     } else {
       _returnUnknownRequest(request);
     }
   }
 
   /**
+   * Return the folder being managed by the given [analysisServer] that matches
+   * the given [contextFilter], or `null` if there is none.
+   */
+  Folder _findFolder(AnalysisServer analysisServer, String contextFilter) {
+    return analysisServer.folderMap.keys.firstWhere(
+        (Folder folder) => folder.path == contextFilter,
+        orElse: () => null);
+  }
+
+  /**
+   * Return `true` if the given analysis [context] has at least one entry with
+   * an exception.
+   */
+  bool _hasException(AnalysisContextImpl context) {
+    bool hasException = false;
+    context.visitCacheItems(
+        (Source source, SourceEntry sourceEntry, DataDescriptor rowDesc,
+            CacheState state) {
+      if (sourceEntry.exception != null) {
+        hasException = true;
+      }
+    });
+    return hasException;
+  }
+
+  /**
+   * Return the folder in the [folderMap] with which the given [context] is
+   * associated.
+   */
+  Folder _keyForValue(Map<Folder, AnalysisContext> folderMap,
+      AnalysisContext context) {
+    for (Folder folder in folderMap.keys) {
+      if (folderMap[folder] == context) {
+        return folder;
+      }
+    }
+    return null;
+  }
+
+  /**
    * Create a link to [path] with query parameters [params], with inner HTML
-   * [innerHtml].
+   * [innerHtml]. If [hasError] is `true`, then the link will have the class
+   * 'error'.
    */
-  String _makeLink(String path, Map<String, String> params, String innerHtml) {
+  String _makeLink(String path, Map<String, String> params, String innerHtml,
+      [bool hasError = false]) {
     Uri uri = new Uri(path: path, queryParameters: params);
-    return '<a href="${HTML_ESCAPE.convert(uri.toString())}">$innerHtml</a>';
+    String href = HTML_ESCAPE.convert(uri.toString());
+    String classAttribute = hasError ? ' class="error"' : '';
+    return '<a href="$href"$classAttribute>$innerHtml</a>';
   }
 
   /**
-   * Generate a table showing the cache values corresponding to the given
-   * [descriptors], using [getState] to get the cache state corresponding to
-   * each descriptor, and [getValue] to get the cached value corresponding to
-   * each descriptor.  Append the resulting HTML to [response].
+   * Return a response containing information about an AST structure.
    */
-  void _outputDescriptorTable(HttpResponse response,
-      List<DataDescriptor> descriptors, CacheState getState(DataDescriptor), dynamic
-      getValue(DataDescriptor)) {
-    response.write('<dl>');
-    for (DataDescriptor descriptor in descriptors) {
-      String descriptorName = HTML_ESCAPE.convert(descriptor.toString());
-      String descriptorState =
-          HTML_ESCAPE.convert(getState(descriptor).toString());
-      response.write('<dt>$descriptorName ($descriptorState)</dt><dd>');
-      try {
-        _outputValueAsHtml(response, getValue(descriptor));
-      } catch (exception) {
-        response.write('(${HTML_ESCAPE.convert(exception.toString())})');
-      }
-      response.write('</dd>');
+  void _returnAst(HttpRequest request) {
+    AnalysisServer analysisServer = _server.analysisServer;
+    if (analysisServer == null) {
+      return _returnFailure(request, 'Analysis server not running');
     }
-    response.write('</dl>');
-  }
-
-  /**
-   * Render the given [value] as HTML and append it to [response].
-   */
-  void _outputValueAsHtml(HttpResponse response, dynamic value) {
-    if (value == null) {
-      response.write('<i>null</i>');
-    } else if (value is String) {
-      response.write('<pre>${HTML_ESCAPE.convert(value)}</pre>');
-    } else if (value is List) {
-      response.write('${value.length} entries');
-      response.write('<ul>');
-      for (var entry in value) {
-        response.write('<li>');
-        _outputValueAsHtml(response, entry);
-        response.write('</li>');
-      }
-      response.write('</ul>');
-    } else {
-      response.write(HTML_ESCAPE.convert(value.toString()));
-      response.write(
-          ' <i>(${HTML_ESCAPE.convert(value.runtimeType.toString())})</i>');
-    }
-  }
-
-  /**
-   * Return a response containing information about a single source file in the
-   * cache.
-   */
-  void _returnCacheEntry(HttpRequest request) {
-    // Figure out which context is being searched for.
     String contextFilter = request.uri.queryParameters[CONTEXT_QUERY_PARAM];
     if (contextFilter == null) {
       return _returnFailure(
           request,
           'Query parameter $CONTEXT_QUERY_PARAM required');
     }
-
-    // Figure out which CacheEntry is being searched for.
+    Folder folder = _findFolder(analysisServer, contextFilter);
+    if (folder == null) {
+      return _returnFailure(request, 'Invalid context: $contextFilter');
+    }
     String sourceUri = request.uri.queryParameters[SOURCE_QUERY_PARAM];
     if (sourceUri == null) {
       return _returnFailure(
@@ -180,60 +259,143 @@
           'Query parameter $SOURCE_QUERY_PARAM required');
     }
 
+    AnalysisContextImpl context = analysisServer.folderMap[folder];
+
+    _writeResponse(request, (StringBuffer buffer) {
+      _writePage(
+          buffer,
+          'Analysis Server - AST Structure',
+          ['Context: $contextFilter', 'File: $sourceUri'],
+          (HttpResponse) {
+        Source source = context.sourceFactory.forUri(sourceUri);
+        if (source == null) {
+          buffer.write('<p>Not found.</p>');
+          return;
+        }
+        SourceEntry entry = context.getReadableSourceEntryOrNull(source);
+        if (entry == null) {
+          buffer.write('<p>Not found.</p>');
+          return;
+        }
+        CompilationUnit ast = (entry as DartEntry).anyParsedCompilationUnit;
+        if (ast == null) {
+          buffer.write('<p>null</p>');
+          return;
+        }
+        ast.accept(new AstWriter(buffer));
+      });
+    });
+  }
+
+  /**
+   * Return a response containing information about a single source file in the
+   * cache.
+   */
+  void _returnCacheEntry(HttpRequest request) {
     AnalysisServer analysisServer = _server.analysisServer;
     if (analysisServer == null) {
       return _returnFailure(request, 'Analysis server not running');
     }
-    HttpResponse response = request.response;
-    response.statusCode = HttpStatus.OK;
-    response.headers.add(HttpHeaders.CONTENT_TYPE, "text/html");
-    response.write('<html>');
-    response.write('<head>');
-    response.write('<title>Dart Analysis Server - Search result</title>');
-    response.write('</head>');
-    response.write('<body>');
-    response.write('<h1>');
-    response.write('File ${HTML_ESCAPE.convert(sourceUri)}');
-    response.write(' in context ${HTML_ESCAPE.convert(contextFilter)}');
-    response.write('</h1>');
-    analysisServer.folderMap.forEach(
-        (Folder folder, AnalysisContextImpl context) {
-      if (folder.path != contextFilter) {
-        return;
-      }
+    String contextFilter = request.uri.queryParameters[CONTEXT_QUERY_PARAM];
+    if (contextFilter == null) {
+      return _returnFailure(
+          request,
+          'Query parameter $CONTEXT_QUERY_PARAM required');
+    }
+    Folder folder = _findFolder(analysisServer, contextFilter);
+    if (folder == null) {
+      return _returnFailure(request, 'Invalid context: $contextFilter');
+    }
+    String sourceUri = request.uri.queryParameters[SOURCE_QUERY_PARAM];
+    if (sourceUri == null) {
+      return _returnFailure(
+          request,
+          'Query parameter $SOURCE_QUERY_PARAM required');
+    }
+
+    List<Folder> allContexts = <Folder>[];
+    Map<Folder, SourceEntry> entryMap = new HashMap<Folder, SourceEntry>();
+    analysisServer.folderMap.forEach((Folder folder, AnalysisContextImpl context) {
       Source source = context.sourceFactory.forUri(sourceUri);
-      if (source == null) {
-        response.write('<p>Not found.</p>');
-        return;
-      }
-      SourceEntry entry = context.getReadableSourceEntryOrNull(source);
-      if (entry == null) {
-        response.write('<p>Not found.</p>');
-        return;
-      }
-      response.write('<h2>File info:</h2><dl>');
-      _outputDescriptorTable(
-          response,
-          entry.descriptors,
-          entry.getState,
-          entry.getValue);
-      if (entry is DartEntry) {
-        for (Source librarySource in entry.containingLibraries) {
-          String libraryName = HTML_ESCAPE.convert(librarySource.fullName);
-          response.write('<h2>In library $libraryName:</h2>');
-          _outputDescriptorTable(
-              response,
-              entry.libraryDescriptors,
-              (DataDescriptor descriptor) =>
-                  entry.getStateInLibrary(descriptor, librarySource),
-              (DataDescriptor descriptor) =>
-                  entry.getValueInLibrary(descriptor, librarySource));
+      if (source != null) {
+        SourceEntry entry = context.getReadableSourceEntryOrNull(source);
+        if (entry != null) {
+          allContexts.add(folder);
+          entryMap[folder] = entry;
         }
       }
     });
-    response.write('</body>');
-    response.write('</html>');
-    response.close();
+    allContexts.sort((Folder firstFolder, Folder secondFolder) => firstFolder.path.compareTo(secondFolder.path));
+    AnalysisContextImpl context = analysisServer.folderMap[folder];
+
+    _writeResponse(request, (StringBuffer buffer) {
+      _writePage(
+          buffer,
+          'Analysis Server - Cache Entry',
+          ['Context: $contextFilter', 'File: $sourceUri'],
+          (HttpResponse) {
+        buffer.write('<h3>Analyzing Contexts</h3><p>');
+        bool first = true;
+        allContexts.forEach((Folder folder) {
+          if (first) {
+            first = false;
+          } else {
+            buffer.write('<br>');
+          }
+          AnalysisContextImpl analyzingContext = analysisServer.folderMap[folder];
+          if (analyzingContext == context) {
+            buffer.write(folder.path);
+          } else {
+            buffer.write(_makeLink(CACHE_ENTRY_PATH, {
+              CONTEXT_QUERY_PARAM: folder.path,
+              SOURCE_QUERY_PARAM: sourceUri
+            }, HTML_ESCAPE.convert(folder.path)));
+          }
+          if (entryMap[folder].explicitlyAdded) {
+            buffer.write(' (explicit)');
+          } else {
+            buffer.write(' (implicit)');
+          }
+        });
+        buffer.write('</p>');
+
+        SourceEntry entry = entryMap[folder];
+        if (entry == null) {
+          buffer.write('<p>Not being analyzed in this context.</p>');
+          return;
+        }
+        Map<String, String> linkParameters = <String, String>{
+          CONTEXT_QUERY_PARAM: folder.path,
+          SOURCE_QUERY_PARAM: sourceUri
+        };
+
+        buffer.write('<h3>Library Independent</h3>');
+        _writeDescriptorTable(
+            buffer,
+            entry.descriptors,
+            entry.getState,
+            entry.getValue,
+            linkParameters);
+        if (entry is DartEntry) {
+          for (Source librarySource in entry.containingLibraries) {
+            String libraryName = HTML_ESCAPE.convert(librarySource.fullName);
+            buffer.write('<h3>In library $libraryName:</h3>');
+            _writeDescriptorTable(
+                buffer,
+                entry.libraryDescriptors,
+                (DataDescriptor descriptor) =>
+                    entry.getStateInLibrary(descriptor, librarySource),
+                (DataDescriptor descriptor) =>
+                    entry.getValueInLibrary(descriptor, librarySource),
+                linkParameters);
+          }
+        }
+        if (entry.exception != null) {
+          buffer.write('<h3>Exception</h3>');
+          _writeException(buffer, entry.exception);
+        }
+      });
+    });
   }
 
   /**
@@ -241,6 +403,17 @@
    * state.
    */
   void _returnCacheState(HttpRequest request) {
+    AnalysisServer analysisServer = _server.analysisServer;
+    if (analysisServer == null) {
+      return _returnFailure(request, 'Analysis server not running');
+    }
+    // Figure out which context is being searched within.
+    String contextFilter = request.uri.queryParameters[CONTEXT_QUERY_PARAM];
+    if (contextFilter == null) {
+      return _returnFailure(
+          request,
+          'Query parameter $CONTEXT_QUERY_PARAM required');
+    }
     // Figure out what CacheState is being searched for.
     String stateQueryParam = request.uri.queryParameters[STATE_QUERY_PARAM];
     if (stateQueryParam == null) {
@@ -259,15 +432,6 @@
           request,
           'Query parameter $STATE_QUERY_PARAM is invalid');
     }
-
-    // Figure out which context is being searched for.
-    String contextFilter = request.uri.queryParameters[CONTEXT_QUERY_PARAM];
-    if (contextFilter == null) {
-      return _returnFailure(
-          request,
-          'Query parameter $CONTEXT_QUERY_PARAM required');
-    }
-
     // Figure out which descriptor is being searched for.
     String descriptorFilter =
         request.uri.queryParameters[DESCRIPTOR_QUERY_PARAM];
@@ -277,164 +441,149 @@
           'Query parameter $DESCRIPTOR_QUERY_PARAM required');
     }
 
-    AnalysisServer analysisServer = _server.analysisServer;
-    if (analysisServer == null) {
-      return _returnFailure(request, 'Analysis server not running');
-    }
-    HttpResponse response = request.response;
-    response.statusCode = HttpStatus.OK;
-    response.headers.add(HttpHeaders.CONTENT_TYPE, "text/html");
-    response.write('<html>');
-    response.write('<head>');
-    response.write('<title>Dart Analysis Server - Search result</title>');
-    response.write('</head>');
-    response.write('<body>');
-    response.write('<h1>');
-    response.write('Files with state ${HTML_ESCAPE.convert(stateQueryParam)}');
-    response.write(' for descriptor ${HTML_ESCAPE.convert(descriptorFilter)}');
-    response.write(' in context ${HTML_ESCAPE.convert(contextFilter)}');
-    response.write('</h1>');
-    response.write('<ul>');
-    int count = 0;
-    analysisServer.folderMap.forEach(
-        (Folder folder, AnalysisContextImpl context) {
-      if (folder.path != contextFilter) {
+    Folder folder = _findFolder(analysisServer, contextFilter);
+    AnalysisContextImpl context = analysisServer.folderMap[folder];
+    List<String> links = <String>[];
+    context.visitCacheItems(
+        (Source source, SourceEntry dartEntry, DataDescriptor rowDesc, CacheState state)
+            {
+      if (state != stateFilter || rowDesc.toString() != descriptorFilter) {
         return;
       }
-      context.visitCacheItems(
-          (Source source, SourceEntry dartEntry, DataDescriptor rowDesc, CacheState state)
-              {
-        if (state != stateFilter || rowDesc.toString() != descriptorFilter) {
-          return;
-        }
-        String link = _makeLink(CACHE_ENTRY_PATH, {
-          CONTEXT_QUERY_PARAM: folder.path,
-          SOURCE_QUERY_PARAM: source.uri.toString()
-        }, HTML_ESCAPE.convert(source.fullName));
-        response.write('<li>$link</li>');
-        count++;
+      String link = _makeLink(CACHE_ENTRY_PATH, {
+        CONTEXT_QUERY_PARAM: folder.path,
+        SOURCE_QUERY_PARAM: source.uri.toString()
+      }, HTML_ESCAPE.convert(source.fullName));
+      links.add(link);
+    });
+
+    _writeResponse(request, (StringBuffer buffer) {
+      _writePage(
+          buffer,
+          'Analysis Server - Cache Search',
+          [
+              'Context: $contextFilter',
+              'Descriptor: ${HTML_ESCAPE.convert(descriptorFilter)}',
+              'State: ${HTML_ESCAPE.convert(stateQueryParam)}'],
+          (StringBuffer buffer) {
+        buffer.write('<p>${links.length} files found</p>');
+        buffer.write('<ul>');
+        links.forEach((String link) {
+          buffer.write('<li>$link</li>');
+        });
+        buffer.write('</ul>');
       });
     });
-    response.write('</ul>');
-    response.write('<p>$count files found</p>');
-    response.write('</body>');
-    response.write('</html>');
-    response.close();
   }
 
   /**
    * Return a response displaying code completion information.
    */
   void _returnCompletionInfo(HttpRequest request) {
-    var refresh = request.requestedUri.queryParameters['refresh'];
-    var maxCount = request.requestedUri.queryParameters['maxCount'];
-    HttpResponse response = request.response;
-    response.statusCode = HttpStatus.OK;
-    response.headers.add(HttpHeaders.CONTENT_TYPE, "text/html");
-    response.write('<html>');
-    response.write('<head>');
-    response.write('<title>Dart Analysis Server - Completion Stats</title>');
-    response.write('<style>');
-    response.write('td.right {text-align: right;}');
-    response.write('</style>');
-    if (refresh is String) {
-      int seconds = int.parse(refresh, onError: (_) => 5);
-      response.write('<meta http-equiv="refresh" content="$seconds">');
-    }
-    response.write('</head>');
-    response.write('<body>');
-    _writeCompletionInfo(response, maxCount);
-    response.write('<p>&nbsp</p>');
-    response.write('<p>Try ');
-    response.write('<a href="?refresh=5">?refresh=5</a>');
-    response.write(' to refresh every 5 seconds</p>');
-    response.write('<p>and ');
-    response.write('<a href="?maxCount=50">?maxCount=50</a>');
-    response.write(' to keep the last 50 performance measurements</p>');
-    response.write('</body>');
-    response.write('</html>');
-    response.close();
-  }
-
-  void _returnFailure(HttpRequest request, String message) {
-    HttpResponse response = request.response;
-    response.statusCode = HttpStatus.OK;
-    response.headers.add(HttpHeaders.CONTENT_TYPE, "text/html");
-    response.write('<html>');
-    response.write('<head>');
-    response.write('<title>Dart Analysis Server - Failure</title>');
-    response.write('</head>');
-    response.write('<body>');
-    response.write(HTML_ESCAPE.convert(message));
-    response.write('</body>');
-    response.write('</html>');
-    response.close();
+    String value = request.requestedUri.queryParameters['index'];
+    int index = value != null ? int.parse(value, onError: (_) => 0) : 0;
+    _writeResponse(request, (StringBuffer buffer) {
+      _writePage(buffer, 'Analysis Server - Completion Stats', [], (StringBuffer buffer) {
+        _writeCompletionPerformanceDetail(buffer, index);
+        _writeCompletionPerformanceList(buffer);
+      });
+    });
   }
 
   /**
-   * Return a response indicating the status of the analysis server.
+   * Return a response containing information about a single source file in the
+   * cache.
    */
-  void _returnServerStatus(HttpRequest request) {
-    HttpResponse response = request.response;
-    response.statusCode = HttpStatus.OK;
-    response.headers.add(HttpHeaders.CONTENT_TYPE, "text/html");
-    response.write('<html>');
-    response.write('<head>');
-    response.write('<title>Dart Analysis Server - Status</title>');
-    response.write('<style>');
-    response.write('td.right {text-align: right;}');
-    response.write('</style>');
-    response.write('</head>');
-    response.write('<body>');
-    response.write('<h1>Analysis Server</h1>');
+  void _returnContextInfo(HttpRequest request) {
     AnalysisServer analysisServer = _server.analysisServer;
     if (analysisServer == null) {
-      response.write('<p>Not running</p>');
-    } else {
-      if (analysisServer.statusAnalyzing) {
-        response.write('<p>Running (analyzing)</p>');
-      } else {
-        response.write('<p>Running (not analyzing)</p>');
+      return _returnFailure(request, 'Analysis server not running');
+    }
+    String contextFilter = request.uri.queryParameters[CONTEXT_QUERY_PARAM];
+    if (contextFilter == null) {
+      return _returnFailure(
+          request,
+          'Query parameter $CONTEXT_QUERY_PARAM required');
+    }
+    Folder folder = _findFolder(analysisServer, contextFilter);
+    if (folder == null) {
+      return _returnFailure(request, 'Invalid context: $contextFilter');
+    }
+
+    List<String> priorityNames;
+    List<String> explicitNames = <String>[];
+    List<String> implicitNames = <String>[];
+    Map<String, String> links = new HashMap<String, String>();
+    List<CaughtException> exceptions = <CaughtException>[];
+    Map<String, int> overlayMap = new HashMap<String, int>();
+    AnalysisContextImpl context = analysisServer.folderMap[folder];
+    priorityNames =
+        context.prioritySources.map((Source source) => source.fullName).toList();
+    context.visitCacheItems(
+        (Source source, SourceEntry sourceEntry, DataDescriptor rowDesc,
+            CacheState state) {
+      String sourceName = source.fullName;
+      if (!links.containsKey(sourceName)) {
+        CaughtException exception = sourceEntry.exception;
+        if (exception != null) {
+          exceptions.add(exception);
+        }
+        String link = _makeLink(CACHE_ENTRY_PATH, {
+          CONTEXT_QUERY_PARAM: folder.path,
+          SOURCE_QUERY_PARAM: source.uri.toString()
+        }, sourceName, exception != null);
+        if (sourceEntry.explicitlyAdded) {
+          explicitNames.add(sourceName);
+        } else {
+          implicitNames.add(sourceName);
+        }
+        links[sourceName] = link;
       }
-      response.write('<h1>Analysis Contexts</h1>');
-      response.write('<h2>Summary</h2>');
-      response.write('<table>');
-      List headerRowText = ['Context'];
-      headerRowText.addAll(CacheState.values);
-      _writeRow(response, headerRowText, header: true);
-      Map<Folder, AnalysisContext> folderMap = analysisServer.folderMap;
-      List<Folder> folders = folderMap.keys.toList();
-      folders.sort(
-          (Folder first, Folder second) => first.shortName.compareTo(second.shortName));
-      folders.forEach((Folder folder) {
-        AnalysisContextImpl context = folderMap[folder];
-        String key = folder.shortName;
-        AnalysisContextStatistics statistics = context.statistics;
-        Map<CacheState, int> totals = <CacheState, int>{};
-        for (CacheState state in CacheState.values) {
-          totals[state] = 0;
-        }
-        statistics.cacheRows.forEach((AnalysisContextStatistics_CacheRow row) {
-          for (CacheState state in CacheState.values) {
-            totals[state] += row.getCount(state);
+    });
+    _overlayContents.clear();
+    int count = 0;
+    context.visitContentCache((Source source, int stamp, String contents) {
+      count++;
+      overlayMap[source.fullName] = count;
+      _overlayContents[count] = contents;
+    });
+    explicitNames.sort();
+    implicitNames.sort();
+
+    void _writeFiles(StringBuffer buffer, String title, List<String> fileNames)
+        {
+      buffer.write('<h3>$title</h3>');
+      if (fileNames == null || fileNames.isEmpty) {
+        buffer.write('<p>None</p>');
+      } else {
+        buffer.write('<table style="width: 100%">');
+        for (String fileName in fileNames) {
+          buffer.write('<tr><td>');
+          buffer.write(links[fileName]);
+          buffer.write('</td><td>');
+          if (overlayMap.containsKey(fileName)) {
+            buffer.write(_makeLink(OVERLAY_PATH, {
+              ID_PARAM: overlayMap[fileName].toString()
+            }, 'overlay'));
           }
-        });
-        List rowText = [
-            '<a href="#context_${HTML_ESCAPE.convert(key)}">$key</a>'];
-        for (CacheState state in CacheState.values) {
-          rowText.add(totals[state]);
+          buffer.write('</td></tr>');
         }
-        _writeRow(response, rowText, classes: [null, "right"]);
-      });
-      response.write('</table>');
-      folders.forEach((Folder folder) {
-        AnalysisContextImpl context = folderMap[folder];
-        String key = folder.shortName;
-        response.write(
-            '<h2><a name="context_${HTML_ESCAPE.convert(key)}">Analysis Context: $key</a></h2>');
+        buffer.write('</table>');
+      }
+    }
+
+    _writeResponse(request, (StringBuffer buffer) {
+      _writePage(
+          buffer,
+          'Analysis Server - Context',
+          ['Context: $contextFilter'],
+          (StringBuffer buffer) {
+        List headerRowText = ['Context'];
+        headerRowText.addAll(CacheState.values);
+        buffer.write('<h3>Summary</h3>');
+        buffer.write('<table>');
+        _writeRow(buffer, headerRowText, header: true);
         AnalysisContextStatistics statistics = context.statistics;
-        response.write('<table>');
-        _writeRow(response, headerRowText, header: true);
         statistics.cacheRows.forEach((AnalysisContextStatistics_CacheRow row) {
           List rowText = [row.name];
           for (CacheState state in CacheState.values) {
@@ -446,25 +595,162 @@
             };
             rowText.add(_makeLink(CACHE_STATE_PATH, params, text));
           }
-          _writeRow(response, rowText, classes: [null, "right"]);
+          _writeRow(buffer, rowText, classes: [null, "right"]);
         });
-        response.write('</table>');
-        List<CaughtException> exceptions = statistics.exceptions;
-        if (!exceptions.isEmpty) {
-          response.write('<h2>Exceptions</h2>');
+        buffer.write('</table>');
+
+        _writeFiles(buffer, 'Priority Files', priorityNames);
+        _writeFiles(buffer, 'Explicitly Analyzed Files', explicitNames);
+        _writeFiles(buffer, 'Implicitly Analyzed Files', implicitNames);
+
+        buffer.write('<h3>Exceptions</h3>');
+        if (exceptions.isEmpty) {
+          buffer.write('<p>None</p>');
+        } else {
           exceptions.forEach((CaughtException exception) {
-            response.write('<p>${exception.exception}</p>');
+            _writeException(buffer, exception);
           });
         }
       });
+    });
+  }
+
+  /**
+   * Return a response containing information about an element structure.
+   */
+  void _returnElement(HttpRequest request) {
+    AnalysisServer analysisServer = _server.analysisServer;
+    if (analysisServer == null) {
+      return _returnFailure(request, 'Analysis server not running');
     }
-    response.write('<h1>Most recent strings printed by analysis server</h2>');
-    response.write('<pre>');
-    response.write(HTML_ESCAPE.convert(_printBuffer.join('\n')));
-    response.write('</pre>');
-    response.write('</body>');
-    response.write('</html>');
-    response.close();
+    String contextFilter = request.uri.queryParameters[CONTEXT_QUERY_PARAM];
+    if (contextFilter == null) {
+      return _returnFailure(
+          request,
+          'Query parameter $CONTEXT_QUERY_PARAM required');
+    }
+    Folder folder = _findFolder(analysisServer, contextFilter);
+    if (folder == null) {
+      return _returnFailure(request, 'Invalid context: $contextFilter');
+    }
+    String sourceUri = request.uri.queryParameters[SOURCE_QUERY_PARAM];
+    if (sourceUri == null) {
+      return _returnFailure(
+          request,
+          'Query parameter $SOURCE_QUERY_PARAM required');
+    }
+
+    AnalysisContextImpl context = analysisServer.folderMap[folder];
+
+    _writeResponse(request, (StringBuffer buffer) {
+      _writePage(
+          buffer,
+          'Analysis Server - Element Model',
+          ['Context: $contextFilter', 'File: $sourceUri'],
+          (StringBuffer buffer) {
+        Source source = context.sourceFactory.forUri(sourceUri);
+        if (source == null) {
+          buffer.write('<p>Not found.</p>');
+          return;
+        }
+        SourceEntry entry = context.getReadableSourceEntryOrNull(source);
+        if (entry == null) {
+          buffer.write('<p>Not found.</p>');
+          return;
+        }
+        LibraryElement element = entry.getValue(DartEntry.ELEMENT);
+        if (element == null) {
+          buffer.write('<p>null</p>');
+          return;
+        }
+        element.accept(new ElementWriter(buffer));
+      });
+    });
+  }
+
+  void _returnFailure(HttpRequest request, String message) {
+    _writeResponse(request, (StringBuffer buffer) {
+      _writePage(
+          buffer,
+          'Analysis Server - Failure',
+          [],
+          (StringBuffer buffer) {
+        buffer.write(HTML_ESCAPE.convert(message));
+      });
+    });
+  }
+
+  void _returnOverlayContents(HttpRequest request) {
+    String idString = request.requestedUri.queryParameters[ID_PARAM];
+    if (idString == null) {
+      return _returnFailure(request, 'Query parameter $ID_PARAM required');
+    }
+    int id = int.parse(idString);
+    String contents = _overlayContents[id];
+
+    _writeResponse(request, (StringBuffer buffer) {
+      _writePage(
+          buffer,
+          'Analysis Server - Overlay',
+          [],
+          (StringBuffer buffer) {
+        buffer.write('<pre>${HTML_ESCAPE.convert(contents)}</pre>');
+      });
+    });
+  }
+
+  /**
+   * Return a response displaying overlays information.
+   */
+  void _returnOverlaysInfo(HttpRequest request) {
+    AnalysisServer analysisServer = _server.analysisServer;
+    if (analysisServer == null) {
+      return _returnFailure(request, 'Analysis server is not running');
+    }
+
+    _writeResponse(request, (StringBuffer buffer) {
+      _writePage(
+          buffer,
+          'Analysis Server - Overlays',
+          [],
+          (StringBuffer buffer) {
+        buffer.write('<table border="1">');
+        int count = 0;
+        _overlayContents.clear();
+        analysisServer.folderMap.forEach((_, AnalysisContextImpl context) {
+          context.visitContentCache(
+              (Source source, int stamp, String contents) {
+            count++;
+            buffer.write('<tr>');
+            String linkRef = '$OVERLAY_PATH?id=$count';
+            String linkText = HTML_ESCAPE.convert(source.toString());
+            buffer.write('<td><a href="$linkRef">$linkText</a></td>');
+            buffer.write(
+                '<td>${new DateTime.fromMillisecondsSinceEpoch(stamp)}</td>');
+            buffer.write('</tr>');
+            _overlayContents[count] = contents;
+          });
+        });
+        buffer.write('<tr><td colspan="2">Total: $count entries.</td></tr>');
+        buffer.write('</table>');
+      });
+    });
+  }
+
+  /**
+   * Return a response indicating the status of the analysis server.
+   */
+  void _returnServerStatus(HttpRequest request) {
+    _writeResponse(request, (StringBuffer buffer) {
+      _writePage(buffer, 'Analysis Server - Status', [], (StringBuffer buffer) {
+        if (_writeServerStatus(buffer)) {
+          _writeAnalysisStatus(buffer);
+          _writeEditStatus(buffer);
+          _writeExecutionStatus(buffer);
+          _writeRecentOutput(buffer);
+        }
+      });
+    });
   }
 
   /**
@@ -474,7 +760,7 @@
   void _returnUnknownRequest(HttpRequest request) {
     HttpResponse response = request.response;
     response.statusCode = HttpStatus.NOT_FOUND;
-    response.headers.add(HttpHeaders.CONTENT_TYPE, "text/html");
+    response.headers.contentType = _htmlContent;
     response.write('<html>');
     response.write('<head>');
     response.write('<title>Dart Analysis Server - Page Not Found</title>');
@@ -492,78 +778,425 @@
   }
 
   /**
-   * Append code completion information.
+   * Return a two digit decimal representation of the given non-negative integer
+   * [value].
    */
-  void _writeCompletionInfo(HttpResponse response, maxCount) {
-    response.write('<h1>Code Completion</h1>');
+  String _twoDigit(int value) {
+    if (value < 10) {
+      return '0$value';
+    }
+    return value.toString();
+  }
+
+  /**
+   * Write the status of the analysis domain (on the main status page) to the
+   * given [buffer] object.
+   */
+  void _writeAnalysisStatus(StringBuffer buffer) {
     AnalysisServer analysisServer = _server.analysisServer;
-    if (analysisServer == null) {
-      response.write('<p>Not running</p>');
-      return;
+    Map<Folder, AnalysisContext> folderMap = analysisServer.folderMap;
+    List<Folder> folders = folderMap.keys.toList();
+    folders.sort(
+        (Folder first, Folder second) => first.shortName.compareTo(second.shortName));
+    AnalysisOptionsImpl options =
+        analysisServer.contextDirectoryManager.defaultOptions;
+    ServerOperationQueue operationQueue = analysisServer.operationQueue;
+
+    buffer.write('<h3>Analysis Domain</h3>');
+    _writeTwoColumns(buffer, (StringBuffer buffer) {
+      if (operationQueue.isEmpty) {
+        buffer.write('<p>Status: Done analyzing</p>');
+      } else {
+        ServerOperation operation = operationQueue.peek();
+        if (operation is PerformAnalysisOperation) {
+          Folder folder = _keyForValue(folderMap, operation.context);
+          if (folder == null) {
+            buffer.write('<p>Status: Analyzing in unmapped context</p>');
+          } else {
+            buffer.write('<p>Status: Analyzing in ${folder.path}</p>');
+          }
+        } else {
+          buffer.write('<p>Status: Analyzing</p>');
+        }
+      }
+
+      buffer.write('<p><b>Analysis Contexts</b></p>');
+      buffer.write('<p>');
+      bool first = true;
+      folders.forEach((Folder folder) {
+        if (first) {
+          first = false;
+        } else {
+          buffer.write('<br>');
+        }
+        String key = folder.shortName;
+        buffer.write(_makeLink(CONTEXT_PATH, {
+          CONTEXT_QUERY_PARAM: folder.path
+        }, key, _hasException(folderMap[folder])));
+      });
+      buffer.write('</p>');
+
+      buffer.write('<p><b>Options</b></p>');
+      buffer.write('<p>');
+      _writeOption(
+          buffer,
+          'Analyze functon bodies',
+          options.analyzeFunctionBodies);
+      _writeOption(buffer, 'Cache size', options.cacheSize);
+      _writeOption(buffer, 'Generate hints', options.hint);
+      _writeOption(buffer, 'Generate dart2js hints', options.dart2jsHint);
+      _writeOption(buffer, 'Generate SDK errors', options.generateSdkErrors);
+      _writeOption(buffer, 'Incremental resolution', options.incremental);
+      _writeOption(
+          buffer,
+          'Incremental resolution with API changes',
+          options.incrementalApi);
+      _writeOption(
+          buffer,
+          'Preserve comments',
+          options.preserveComments,
+          last: true);
+      buffer.write('</p>');
+      int freq = AnalysisServer.performOperationDelayFreqency;
+      String delay = freq > 0 ? '1 ms every $freq ms' : 'off';
+      buffer.write('<p><b>perform operation delay:</b> $delay</p>');
+    }, (StringBuffer buffer) {
+      _writeSubscriptionMap(
+          buffer,
+          AnalysisService.VALUES,
+          analysisServer.analysisServices);
+    });
+  }
+
+  /**
+   * Write performance information about a specific completion request
+   * to the given [buffer] object.
+   */
+  void _writeCompletionPerformanceDetail(StringBuffer buffer, int index) {
+    CompletionDomainHandler handler = _completionDomainHandler;
+    CompletionPerformance performance;
+    if (handler != null) {
+      List<CompletionPerformance> list = handler.performanceList;
+      if (list != null && list.isNotEmpty) {
+        performance = list[max(0, min(list.length - 1, index))];
+      }
     }
-    CompletionDomainHandler handler = analysisServer.handlers.firstWhere(
-        (h) => h is CompletionDomainHandler,
-        orElse: () => null);
-    if (handler == null) {
-      response.write('<p>No code completion</p>');
-      return;
-    }
-    if (maxCount is String) {
-      int count = int.parse(maxCount, onError: (_) => 0);
-      handler.performanceListMaxLength = count;
-    }
-    CompletionPerformance performance = handler.performance;
     if (performance == null) {
-      response.write('<p>No performance stats yet</p>');
+      buffer.write('<h3>Completion Performance Detail</h3>');
+      buffer.write('<p>No completions yet</p>');
       return;
     }
-    response.write('<table>');
-    _writeRow(response, ['Elapsed', '', 'Operation'], header: true);
+    buffer.write(
+        '<h3>Completion Performance Detail - ${performance.startTimeAndMs}</h3>');
+    buffer.write('<table>');
+    _writeRow(buffer, ['Elapsed', '', 'Operation'], header: true);
     performance.operations.forEach((OperationPerformance op) {
       String elapsed = op.elapsed != null ? op.elapsed.toString() : '???';
-      _writeRow(response, [elapsed, '&nbsp;&nbsp;', op.name]);
+      _writeRow(buffer, [elapsed, '&nbsp;&nbsp;', op.name]);
     });
     if (handler.priorityChangedPerformance == null) {
-      response.write('<p>No priorityChanged caching</p>');
+      buffer.write('<p>No priorityChanged caching</p>');
     } else {
       int len = handler.priorityChangedPerformance.operations.length;
       if (len > 0) {
         var op = handler.priorityChangedPerformance.operations[len - 1];
         if (op != null) {
-          _writeRow(response, ['&nbsp;', '&nbsp;', '&nbsp;']);
+          _writeRow(buffer, ['&nbsp;', '&nbsp;', '&nbsp;']);
           String elapsed = op.elapsed != null ? op.elapsed.toString() : '???';
-          _writeRow(response, [elapsed, '&nbsp;&nbsp;', op.name]);
+          _writeRow(buffer, [elapsed, '&nbsp;&nbsp;', op.name]);
         }
       }
     }
-    response.write('</table>');
-    if (handler.performanceList.length > 0) {
-      response.write('<table>');
-      _writeRow(response, ['Milliseconds', '', '# Notifications', '', '# Suggestions', '', 'Snippet'], header: true);
-      handler.performanceList.forEach((CompletionPerformance performance) {
-        _writeRow(
-            response,
-            [
-                performance.elapsedInMilliseconds,
-                '&nbsp;&nbsp;',
-                performance.notificationCount,
-                '&nbsp;&nbsp;',
-                performance.suggestionCount,
-                '&nbsp;&nbsp;',
-                performance.snippet]);
-      });
-      response.write('</table>');
+    buffer.write('</table>');
+  }
+
+  /**
+   * Write a table showing summary information for the last several
+   * completion requests to the given [buffer] object.
+   */
+  void _writeCompletionPerformanceList(StringBuffer buffer) {
+    CompletionDomainHandler handler = _completionDomainHandler;
+    buffer.write('<h3>Completion Performance</h3>');
+    if (handler == null) {
+      return;
+    }
+    buffer.write('<table>');
+    _writeRow(
+        buffer,
+        [
+            'Start Time',
+            '',
+            'First (ms)',
+            '',
+            'Complete (ms)',
+            '',
+            '# Notifications',
+            '',
+            '# Suggestions',
+            '',
+            'Snippet'],
+        header: true);
+    int index = 0;
+    for (CompletionPerformance performance in handler.performanceList) {
+      String link = _makeLink(COMPLETION_PATH, {
+        'index': '$index'
+      }, '${performance.startTimeAndMs}');
+      _writeRow(
+          buffer,
+          [
+              link,
+              '&nbsp;&nbsp;',
+              performance.firstNotificationInMilliseconds,
+              '&nbsp;&nbsp;',
+              performance.elapsedInMilliseconds,
+              '&nbsp;&nbsp;',
+              performance.notificationCount,
+              '&nbsp;&nbsp;',
+              performance.suggestionCount,
+              '&nbsp;&nbsp;',
+              HTML_ESCAPE.convert(performance.snippet)]);
+      ++index;
+    }
+    ;
+    buffer.write('</table>');
+    buffer.write('''
+      <p><strong>First (ms)</strong> - the number of milliseconds
+        from when completion received the request until the first notification
+        with completion results was queued for sending back to the client.
+      <p><strong>Complete (ms)</strong> - the number of milliseconds
+        from when completion received the request until the final notification
+        with completion results was queued for sending back to the client.
+      <p><strong># Notifications</strong> - the total number of notifications
+        sent to the client with completion results for this request.
+      <p><strong># Suggestions</strong> - the number of suggestions
+        sent to the client in the first notification, followed by a comma,
+        followed by the number of suggestions send to the client
+        in the last notification. If there is only one notification,
+        then there will be only one number in this column.''');
+  }
+
+  /**
+   * Generate a table showing the cache values corresponding to the given
+   * [descriptors], using [getState] to get the cache state corresponding to
+   * each descriptor, and [getValue] to get the cached value corresponding to
+   * each descriptor.  Append the resulting HTML to the given [buffer]. The
+   * [linkParameters] will be used if the value is too large to be displayed on
+   * the current page and needs to be linked to a separate page.
+   */
+  void _writeDescriptorTable(StringBuffer buffer,
+      List<DataDescriptor> descriptors, CacheState getState(DataDescriptor), dynamic
+      getValue(DataDescriptor), Map<String, String> linkParameters) {
+    buffer.write('<dl>');
+    for (DataDescriptor descriptor in descriptors) {
+      String descriptorName = HTML_ESCAPE.convert(descriptor.toString());
+      String descriptorState =
+          HTML_ESCAPE.convert(getState(descriptor).toString());
+      buffer.write('<dt>$descriptorName ($descriptorState)</dt><dd>');
+      try {
+        _writeValueAsHtml(buffer, getValue(descriptor), linkParameters);
+      } catch (exception) {
+        buffer.write('(${HTML_ESCAPE.convert(exception.toString())})');
+      }
+      buffer.write('</dd>');
+    }
+    buffer.write('</dl>');
+  }
+
+  /**
+   * Write the status of the edit domain (on the main status page) to the given
+   * [buffer].
+   */
+  void _writeEditStatus(StringBuffer buffer) {
+    buffer.write('<h3>Edit Domain</h3>');
+    _writeTwoColumns(buffer, (StringBuffer buffer) {
+      buffer.write('<p><b>Performance Data</b></p>');
+      buffer.write('<p>');
+      buffer.write(_makeLink(COMPLETION_PATH, {}, 'Completion data'));
+      buffer.write('</p>');
+    }, (StringBuffer buffer) {
+    });
+  }
+
+  /**
+   * Write a representation of the given [caughtException] to the given
+   * [buffer]. If [isCause] is `true`, then the exception was a cause for
+   * another exception.
+   */
+  void _writeException(StringBuffer buffer, CaughtException caughtException,
+      {bool isCause: false}) {
+    Object exception = caughtException.exception;
+
+    if (exception is AnalysisException) {
+      buffer.write('<p>');
+      if (isCause) {
+        buffer.write('Caused by ');
+      }
+      buffer.write(exception.message);
+      buffer.write('</p>');
+      _writeStackTrace(buffer, caughtException.stackTrace);
+      CaughtException cause = exception.cause;
+      if (cause != null) {
+        buffer.write('<blockquote>');
+        _writeException(buffer, cause, isCause: true);
+        buffer.write('</blockquote>');
+      }
+    } else {
+      buffer.write('<p>');
+      if (isCause) {
+        buffer.write('Caused by ');
+      }
+      buffer.write(exception.toString());
+      buffer.write('<p>');
+      _writeStackTrace(buffer, caughtException.stackTrace);
     }
   }
 
   /**
-   * Write a single row within a table to the given [response] object. The row
-   * will have one cell for each of the [columns], and will be a header row if
-   * [header] is `true`.
+   * Write the status of the execution domain (on the main status page) to the
+   * given [buffer].
    */
-  void _writeRow(HttpResponse response, List<Object> columns, {bool header:
+  void _writeExecutionStatus(StringBuffer buffer) {
+    AnalysisServer analysisServer = _server.analysisServer;
+    ExecutionDomainHandler handler = analysisServer.handlers.firstWhere(
+        (RequestHandler handler) => handler is ExecutionDomainHandler,
+        orElse: () => null);
+    Set<ExecutionService> services = new Set<ExecutionService>();
+    if (handler.onFileAnalyzed != null) {
+      services.add(ExecutionService.LAUNCH_DATA);
+    }
+
+    if (handler != null) {
+      buffer.write('<h3>Execution Domain</h3>');
+      _writeTwoColumns(buffer, (StringBuffer buffer) {
+        _writeSubscriptionList(buffer, ExecutionService.VALUES, services);
+      }, (StringBuffer buffer) {
+      });
+    }
+  }
+
+  /**
+   * Write a representation of an analysis option with the given [name] and
+   * [value] to the given [buffer]. The option should be separated from other
+   * options unless the [last] flag is true, indicating that this is the last
+   * option in the list of options.
+   */
+  void _writeOption(StringBuffer buffer, String name, Object value, {bool last:
+      false}) {
+    buffer.write(name);
+    buffer.write(' = ');
+    buffer.write(value.toString());
+    if (!last) {
+      buffer.write('<br>');
+    }
+  }
+
+  /**
+   * Write a standard HTML page to the given [buffer]. The page will have the
+   * given [title] and a body that is generated by the given [body] generator.
+   */
+  void _writePage(StringBuffer buffer, String title, List<String> subtitles,
+      HtmlGenerator body) {
+    DateTime now = new DateTime.now();
+    String date = "${now.month}/${now.day}/${now.year}";
+    String time =
+        "${now.hour}:${_twoDigit(now.minute)}:${_twoDigit(now.second)}.${now.millisecond}";
+
+    buffer.write('<!DOCTYPE html>');
+    buffer.write('<html>');
+    buffer.write('<head>');
+    buffer.write('<meta charset="utf-8">');
+    buffer.write(
+        '<meta name="viewport" content="width=device-width, initial-scale=1.0">');
+    buffer.write('<title>$title</title>');
+    buffer.write('<style>');
+    buffer.write('a {color: #0000DD; text-decoration: none;}');
+    buffer.write('a:link.error {background-color: #FFEEEE;}');
+    buffer.write('a:visited.error {background-color: #FFEEEE;}');
+    buffer.write('a:hover.error {background-color: #FFEEEE;}');
+    buffer.write('a:active.error {background-color: #FFEEEE;}');
+    buffer.write(
+        'h3 {background-color: #DDDDDD; margin-top: 0em; margin-bottom: 0em;}');
+    buffer.write('p {margin-top: 0.5em; margin-bottom: 0.5em;}');
+//    response.write('span.error {text-decoration-line: underline; text-decoration-color: red; text-decoration-style: wavy;}');
+    buffer.write(
+        'table.column {border: 0px solid black; width: 100%; table-layout: fixed;}');
+    buffer.write('td.column {vertical-align: top; width: 50%;}');
+    buffer.write('td.right {text-align: right;}');
+    buffer.write('</style>');
+    buffer.write('</head>');
+
+    buffer.write('<body>');
+    buffer.write(
+        '<h2>$title <small><small>(as of $time on $date)</small></small></h2>');
+    if (subtitles != null && subtitles.isNotEmpty) {
+      buffer.write('<blockquote>');
+      bool first = true;
+      for (String subtitle in subtitles) {
+        if (first) {
+          first = false;
+        } else {
+          buffer.write('<br>');
+        }
+        buffer.write('<b>');
+        buffer.write(subtitle);
+        buffer.write('</b>');
+      }
+      buffer.write('</blockquote>');
+    }
+    try {
+      body(buffer);
+    } catch (exception, stackTrace) {
+      buffer.write('<h3>Exception while creating page</h3>');
+      _writeException(buffer, new CaughtException(exception, stackTrace));
+    }
+    buffer.write('</body>');
+    buffer.write('</html>');
+  }
+
+  /**
+   * Write the recent output section (on the main status page) to the given
+   * [buffer] object.
+   */
+  void _writeRecentOutput(StringBuffer buffer) {
+    buffer.write('<h3>Recent Output</h3>');
+    String output = HTML_ESCAPE.convert(_printBuffer.join('\n'));
+    if (output.isEmpty) {
+      buffer.write('<i>none</i>');
+    } else {
+      buffer.write('<pre>');
+      buffer.write(output);
+      buffer.write('</pre>');
+    }
+  }
+
+  void _writeResponse(HttpRequest request, HtmlGenerator writePage) {
+    HttpResponse response = request.response;
+    response.statusCode = HttpStatus.OK;
+    response.headers.contentType = _htmlContent;
+    try {
+      StringBuffer buffer = new StringBuffer();
+      try {
+        writePage(buffer);
+      } catch (exception, stackTrace) {
+        buffer.clear();
+        _writePage(buffer, 'Internal Exception', [], (StringBuffer buffer) {
+          _writeException(buffer, new CaughtException(exception, stackTrace));
+        });
+      }
+      response.write(buffer.toString());
+    } finally {
+      response.close();
+    }
+  }
+
+  /**
+   * Write a single row within a table to the given [buffer]. The row will have
+   * one cell for each of the [columns], and will be a header row if [header] is
+   * `true`.
+   */
+  void _writeRow(StringBuffer buffer, List<Object> columns, {bool header:
       false, List<String> classes}) {
-    response.write('<tr>');
+    buffer.write('<tr>');
     int count = columns.length;
     int maxClassIndex = classes == null ? 0 : classes.length - 1;
     for (int i = 0; i < count; i++) {
@@ -575,18 +1208,182 @@
         }
       }
       if (header) {
-        response.write('<th$classAttribute>');
+        buffer.write('<th$classAttribute>');
       } else {
-        response.write('<td$classAttribute>');
+        buffer.write('<td$classAttribute>');
       }
-      response.write(columns[i]);
+      buffer.write(columns[i]);
       if (header) {
-        response.write('</th>');
+        buffer.write('</th>');
       } else {
-        response.write('</td>');
+        buffer.write('</td>');
       }
     }
+    buffer.write('</tr>');
+  }
 
-    response.write('</tr>');
+  /**
+   * Write the status of the service domain (on the main status page) to the
+   * given [response] object.
+   */
+  bool _writeServerStatus(StringBuffer buffer) {
+    AnalysisServer analysisServer = _server.analysisServer;
+    Set<ServerService> services = analysisServer.serverServices;
+
+    buffer.write('<h3>Server Domain</h3>');
+    _writeTwoColumns(buffer, (StringBuffer buffer) {
+      if (analysisServer == null) {
+        buffer.write('Status: <span style="color:red">Not running</span>');
+        return false;
+      }
+      buffer.write('<p>');
+      buffer.write('Status: Running<br>');
+      buffer.write('Instrumentation: ');
+      if (AnalysisEngine.instance.instrumentationService.isActive) {
+        buffer.write('<span style="color:red">Active</span>');
+      } else {
+        buffer.write('Inactive');
+      }
+      buffer.write('<br>');
+      buffer.write('Version: ');
+      buffer.write(AnalysisServer.VERSION);
+      buffer.write('</p>');
+    }, (StringBuffer buffer) {
+      _writeSubscriptionList(buffer, ServerService.VALUES, services);
+    });
+    return true;
+  }
+
+  /**
+   * Write a representation of the given [stackTrace] to the given [buffer].
+   */
+  void _writeStackTrace(StringBuffer buffer, StackTrace stackTrace) {
+    if (stackTrace != null) {
+      String trace = stackTrace.toString().replaceAll('#', '<br>#');
+      if (trace.startsWith('<br>#')) {
+        trace = trace.substring(4);
+      }
+      buffer.write('<p>');
+      buffer.write(trace);
+      buffer.write('</p>');
+    }
+  }
+
+  /**
+   * Given a [service] that could be subscribed to and a set of the services
+   * that are actually subscribed to ([subscribedServices]), write a
+   * representation of the service to the given [buffer].
+   */
+  void _writeSubscriptionInList(StringBuffer buffer, Enum service,
+      Set<Enum> subscribedServices) {
+    if (subscribedServices.contains(service)) {
+      buffer.write('<code>+ </code>');
+    } else {
+      buffer.write('<code>- </code>');
+    }
+    buffer.write(service.name);
+    buffer.write('<br>');
+  }
+
+  /**
+   * Given a [service] that could be subscribed to and a set of paths that are
+   * subscribed to the services ([subscribedPaths]), write a representation of
+   * the service to the given [buffer].
+   */
+  void _writeSubscriptionInMap(StringBuffer buffer, Enum service,
+      Set<String> subscribedPaths) {
+    buffer.write('<p>');
+    buffer.write(service.name);
+    buffer.write('</p>');
+    if (subscribedPaths == null || subscribedPaths.isEmpty) {
+      buffer.write('none');
+    } else {
+      List<String> paths = subscribedPaths.toList();
+      paths.sort();
+      for (String path in paths) {
+        buffer.write('<p>');
+        buffer.write(path);
+        buffer.write('</p>');
+      }
+    }
+  }
+
+  /**
+   * Given a list containing all of the services that can be subscribed to in a
+   * single domain ([allServices]) and a set of the services that are actually
+   * subscribed to ([subscribedServices]), write a representation of the
+   * subscriptions to the given [buffer].
+   */
+  void _writeSubscriptionList(StringBuffer buffer, List<Enum> allServices,
+      Set<Enum> subscribedServices) {
+    buffer.write('<p><b>Subscriptions</b></p>');
+    buffer.write('<p>');
+    for (Enum service in allServices) {
+      _writeSubscriptionInList(buffer, service, subscribedServices);
+    }
+    buffer.write('</p>');
+  }
+
+  /**
+   * Given a list containing all of the services that can be subscribed to in a
+   * single domain ([allServices]) and a set of the services that are actually
+   * subscribed to ([subscribedServices]), write a representation of the
+   * subscriptions to the given [buffer].
+   */
+  void _writeSubscriptionMap(StringBuffer buffer, List<Enum> allServices,
+      Map<Enum, Set<String>> subscribedServices) {
+    buffer.write('<p><b>Subscriptions</b></p>');
+    for (Enum service in allServices) {
+      _writeSubscriptionInMap(buffer, service, subscribedServices[service]);
+    }
+  }
+
+  /**
+   * Write two columns of information to the given [buffer], where the
+   * [leftColumn] and [rightColumn] functions are used to generate the content
+   * of those columns.
+   */
+  void _writeTwoColumns(StringBuffer buffer, HtmlGenerator leftColumn,
+      HtmlGenerator rightColumn) {
+    buffer.write(
+        '<table class="column"><tr class="column"><td class="column">');
+    leftColumn(buffer);
+    buffer.write('</td><td class="column">');
+    rightColumn(buffer);
+    buffer.write('</td></tr></table>');
+  }
+
+  /**
+   * Render the given [value] as HTML and append it to the given [buffer]. The
+   * [linkParameters] will be used if the value is too large to be displayed on
+   * the current page and needs to be linked to a separate page.
+   */
+  void _writeValueAsHtml(StringBuffer buffer, Object value, Map<String,
+      String> linkParameters) {
+    if (value == null) {
+      buffer.write('<i>null</i>');
+    } else if (value is String) {
+      buffer.write('<pre>${HTML_ESCAPE.convert(value)}</pre>');
+    } else if (value is List) {
+      buffer.write('List containing ${value.length} entries');
+      buffer.write('<ul>');
+      for (var entry in value) {
+        buffer.write('<li>');
+        _writeValueAsHtml(buffer, entry, linkParameters);
+        buffer.write('</li>');
+      }
+      buffer.write('</ul>');
+    } else if (value is AstNode) {
+      String link =
+          _makeLink(AST_PATH, linkParameters, value.runtimeType.toString());
+      buffer.write('<i>$link</i>');
+    } else if (value is Element) {
+      String link =
+          _makeLink(ELEMENT_PATH, linkParameters, value.runtimeType.toString());
+      buffer.write('<i>$link</i>');
+    } else {
+      buffer.write(HTML_ESCAPE.convert(value.toString()));
+      buffer.write(' <i>(${value.runtimeType.toString()})</i>');
+    }
   }
 }
diff --git a/pkg/analysis_server/lib/src/operation/operation.dart b/pkg/analysis_server/lib/src/operation/operation.dart
index 5ae3e10..03fd913 100644
--- a/pkg/analysis_server/lib/src/operation/operation.dart
+++ b/pkg/analysis_server/lib/src/operation/operation.dart
@@ -30,17 +30,26 @@
  * equates to a higher priority.
  */
 class ServerOperationPriority {
-  static const int COUNT = 4;
+  static const int COUNT = 6;
+
+  static const ServerOperationPriority ANALYSIS_NOTIFICATION =
+      const ServerOperationPriority._(0, "ANALYSIS_NOTIFICATION");
+
+  static const ServerOperationPriority ANALYSIS_INDEX =
+      const ServerOperationPriority._(1, "ANALYSIS_INDEX");
+
+  static const ServerOperationPriority PRIORITY_ANALYSIS_CONTINUE =
+      const ServerOperationPriority._(2, "PRIORITY_ANALYSIS_CONTINUE");
+
+  static const ServerOperationPriority PRIORITY_ANALYSIS =
+      const ServerOperationPriority._(3, "PRIORITY_ANALYSIS");
+
   static const ServerOperationPriority ANALYSIS_CONTINUE =
-      const ServerOperationPriority._(0, "ANALYSIS_CONTINUE");
+      const ServerOperationPriority._(4, "ANALYSIS_CONTINUE");
 
   static const ServerOperationPriority ANALYSIS =
-      const ServerOperationPriority._(1, "ANALYSIS");
+      const ServerOperationPriority._(5, "ANALYSIS");
 
-  static const ServerOperationPriority SEARCH =
-      const ServerOperationPriority._(2, "SEARCH");
-  static const ServerOperationPriority REFACTORING =
-      const ServerOperationPriority._(3, "REFACTORING");
   final int ordinal;
   final String name;
 
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index facf368..8ea73ae 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -77,12 +77,12 @@
 }
 
 
-void sendAnalysisNotificationOutline(AnalysisServer server, Source source,
+void sendAnalysisNotificationOutline(AnalysisServer server, String file,
     LineInfo lineInfo, CompilationUnit dartUnit) {
   try {
-    var computer = new DartUnitOutlineComputer(source, lineInfo, dartUnit);
+    var computer = new DartUnitOutlineComputer(file, lineInfo, dartUnit);
     var outline = computer.compute();
-    var params = new protocol.AnalysisOutlineParams(source.fullName, outline);
+    var params = new protocol.AnalysisOutlineParams(file, outline);
     server.sendNotification(params.toNotification());
   } catch (exception, stackTrace) {
     server.sendServerErrorNotification(exception, stackTrace);
@@ -106,6 +106,9 @@
  * Instances of [PerformAnalysisOperation] perform a single analysis task.
  */
 class PerformAnalysisOperation extends ServerOperation {
+  static const int IDLE_CACHE_SIZE = AnalysisOptionsImpl.DEFAULT_CACHE_SIZE;
+  static const int WORKING_CACHE_SIZE = 512;
+
   final AnalysisContext context;
   final bool isContinue;
 
@@ -113,13 +116,25 @@
 
   @override
   ServerOperationPriority get priority {
-    if (isContinue) {
-      return ServerOperationPriority.ANALYSIS_CONTINUE;
+    if (_isPriorityContext) {
+      if (isContinue) {
+        return ServerOperationPriority.PRIORITY_ANALYSIS_CONTINUE;
+      } else {
+        return ServerOperationPriority.PRIORITY_ANALYSIS;
+      }
     } else {
-      return ServerOperationPriority.ANALYSIS;
+      if (isContinue) {
+        return ServerOperationPriority.ANALYSIS_CONTINUE;
+      } else {
+        return ServerOperationPriority.ANALYSIS;
+      }
     }
   }
 
+  bool get _isPriorityContext =>
+      context is InternalAnalysisContext &&
+          (context as InternalAnalysisContext).prioritySources.isNotEmpty;
+
   @override
   void perform(AnalysisServer server) {
     //
@@ -130,18 +145,22 @@
     // AnalysisResult result = context.performAnalysisTask((taskDescription) {
     //   sendStatusNotification(context.toString(), taskDescription);
     // });
+    if (!isContinue) {
+      _setCacheSize(WORKING_CACHE_SIZE);
+    }
     // prepare results
     AnalysisResult result = context.performAnalysisTask();
     List<ChangeNotice> notices = result.changeNotices;
     if (notices == null) {
+      _setCacheSize(IDLE_CACHE_SIZE);
       server.sendContextAnalysisDoneNotifications(
           context,
           AnalysisDoneReason.COMPLETE);
       return;
     }
     // process results
-    sendNotices(server, notices);
-    updateIndex(server, notices);
+    _sendNotices(server, notices);
+    _updateIndex(server, notices);
     // continue analysis
     server.addOperation(new PerformAnalysisOperation(context, true));
   }
@@ -149,53 +168,69 @@
   /**
    * Send the information in the given list of notices back to the client.
    */
-  void sendNotices(AnalysisServer server, List<ChangeNotice> notices) {
+  void _sendNotices(AnalysisServer server, List<ChangeNotice> notices) {
     for (int i = 0; i < notices.length; i++) {
       ChangeNotice notice = notices[i];
       Source source = notice.source;
       String file = source.fullName;
       // Dart
-      CompilationUnit dartUnit = notice.compilationUnit;
-      if (dartUnit != null) {
+      CompilationUnit parsedDartUnit = notice.parsedDartUnit;
+      CompilationUnit resolvedDartUnit = notice.resolvedDartUnit;
+      CompilationUnit dartUnit =
+          resolvedDartUnit != null ? resolvedDartUnit : parsedDartUnit;
+      if (resolvedDartUnit != null) {
         if (server.hasAnalysisSubscription(
             protocol.AnalysisService.HIGHLIGHTS,
             file)) {
-          sendAnalysisNotificationHighlights(server, file, dartUnit);
+          server.addOperation(
+              new _DartHighlightsOperation(file, resolvedDartUnit));
         }
         if (server.hasAnalysisSubscription(
             protocol.AnalysisService.NAVIGATION,
             file)) {
-          sendAnalysisNotificationNavigation(server, file, dartUnit);
+          server.addOperation(
+              new _DartNavigationOperation(file, resolvedDartUnit));
         }
         if (server.hasAnalysisSubscription(
             protocol.AnalysisService.OCCURRENCES,
             file)) {
-          sendAnalysisNotificationOccurrences(server, file, dartUnit);
-        }
-        if (server.hasAnalysisSubscription(
-            protocol.AnalysisService.OUTLINE,
-            file)) {
-          LineInfo lineInfo = notice.lineInfo;
-          sendAnalysisNotificationOutline(server, source, lineInfo, dartUnit);
+          server.addOperation(
+              new _DartOccurrencesOperation(file, resolvedDartUnit));
         }
         if (server.hasAnalysisSubscription(
             protocol.AnalysisService.OVERRIDES,
             file)) {
-          sendAnalysisNotificationOverrides(server, file, dartUnit);
+          server.addOperation(
+              new _DartOverridesOperation(file, resolvedDartUnit));
         }
       }
-      if (server.shouldSendErrorsNotificationFor(file)) {
-        sendAnalysisNotificationErrors(
-            server,
-            file,
-            notice.lineInfo,
-            notice.errors);
+      if (dartUnit != null) {
+        if (server.hasAnalysisSubscription(
+            protocol.AnalysisService.OUTLINE,
+            file)) {
+          LineInfo lineInfo = notice.lineInfo;
+          server.addOperation(
+              new _DartOutlineOperation(file, lineInfo, dartUnit));
+        }
       }
+      // errors
+      if (server.shouldSendErrorsNotificationFor(file)) {
+        server.addOperation(
+            new _NotificationErrorsOperation(file, notice.lineInfo, notice.errors));
+      }
+      // done
       server.fileAnalyzed(notice);
     }
   }
 
-  void updateIndex(AnalysisServer server, List<ChangeNotice> notices) {
+  void _setCacheSize(int cacheSize) {
+    AnalysisOptionsImpl options =
+        new AnalysisOptionsImpl.con1(context.analysisOptions);
+    options.cacheSize = cacheSize;
+    context.analysisOptions = options;
+  }
+
+  void _updateIndex(AnalysisServer server, List<ChangeNotice> notices) {
     Index index = server.index;
     if (index == null) {
       return;
@@ -203,18 +238,18 @@
     for (ChangeNotice notice in notices) {
       // Dart
       try {
-        CompilationUnit dartUnit = notice.compilationUnit;
+        CompilationUnit dartUnit = notice.resolvedDartUnit;
         if (dartUnit != null) {
-          index.indexUnit(context, dartUnit);
+          server.addOperation(new _DartIndexOperation(context, dartUnit));
         }
       } catch (exception, stackTrace) {
         server.sendServerErrorNotification(exception, stackTrace);
       }
       // HTML
       try {
-        HtmlUnit htmlUnit = notice.htmlUnit;
+        HtmlUnit htmlUnit = notice.resolvedHtmlUnit;
         if (htmlUnit != null) {
-          index.indexHtmlUnit(context, htmlUnit);
+          server.addOperation(new _HtmlIndexOperation(context, htmlUnit));
         }
       } catch (exception, stackTrace) {
         server.sendServerErrorNotification(exception, stackTrace);
@@ -222,3 +257,130 @@
     }
   }
 }
+
+
+class _DartHighlightsOperation extends _DartNotificationOperation {
+  _DartHighlightsOperation(String file, CompilationUnit unit)
+      : super(file, unit);
+
+  @override
+  void perform(AnalysisServer server) {
+    sendAnalysisNotificationHighlights(server, file, unit);
+  }
+}
+
+
+class _DartIndexOperation extends ServerOperation {
+  final AnalysisContext context;
+  final CompilationUnit unit;
+
+  _DartIndexOperation(this.context, this.unit);
+
+  @override
+  ServerOperationPriority get priority {
+    return ServerOperationPriority.ANALYSIS_INDEX;
+  }
+
+  @override
+  void perform(AnalysisServer server) {
+    Index index = server.index;
+    index.indexUnit(context, unit);
+  }
+}
+
+
+class _DartNavigationOperation extends _DartNotificationOperation {
+  _DartNavigationOperation(String file, CompilationUnit unit)
+      : super(file, unit);
+
+  @override
+  void perform(AnalysisServer server) {
+    sendAnalysisNotificationNavigation(server, file, unit);
+  }
+}
+
+
+abstract class _DartNotificationOperation extends ServerOperation {
+  final String file;
+  final CompilationUnit unit;
+
+  _DartNotificationOperation(this.file, this.unit);
+
+  @override
+  ServerOperationPriority get priority {
+    return ServerOperationPriority.ANALYSIS_NOTIFICATION;
+  }
+}
+
+
+class _DartOccurrencesOperation extends _DartNotificationOperation {
+  _DartOccurrencesOperation(String file, CompilationUnit unit)
+      : super(file, unit);
+
+  @override
+  void perform(AnalysisServer server) {
+    sendAnalysisNotificationOccurrences(server, file, unit);
+  }
+}
+
+
+class _DartOutlineOperation extends _DartNotificationOperation {
+  final LineInfo lineInfo;
+
+  _DartOutlineOperation(String file, this.lineInfo, CompilationUnit unit)
+      : super(file, unit);
+
+  @override
+  void perform(AnalysisServer server) {
+    sendAnalysisNotificationOutline(server, file, lineInfo, unit);
+  }
+}
+
+
+class _DartOverridesOperation extends _DartNotificationOperation {
+  _DartOverridesOperation(String file, CompilationUnit unit)
+      : super(file, unit);
+
+  @override
+  void perform(AnalysisServer server) {
+    sendAnalysisNotificationOverrides(server, file, unit);
+  }
+}
+
+
+class _HtmlIndexOperation extends ServerOperation {
+  final AnalysisContext context;
+  final HtmlUnit unit;
+
+  _HtmlIndexOperation(this.context, this.unit);
+
+  @override
+  ServerOperationPriority get priority {
+    return ServerOperationPriority.ANALYSIS_INDEX;
+  }
+
+  @override
+  void perform(AnalysisServer server) {
+    Index index = server.index;
+    index.indexHtmlUnit(context, unit);
+  }
+}
+
+
+class _NotificationErrorsOperation extends ServerOperation {
+  final String file;
+  final LineInfo lineInfo;
+  final List<AnalysisError> errors;
+
+  _NotificationErrorsOperation(this.file, this.lineInfo, this.errors);
+
+  @override
+  ServerOperationPriority get priority {
+    return ServerOperationPriority.ANALYSIS_NOTIFICATION;
+  }
+
+  @override
+  void perform(AnalysisServer server) {
+    sendAnalysisNotificationErrors(server, file, lineInfo, errors);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/operation/operation_queue.dart b/pkg/analysis_server/lib/src/operation/operation_queue.dart
index b26c677..67ca993 100644
--- a/pkg/analysis_server/lib/src/operation/operation_queue.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_queue.dart
@@ -8,21 +8,15 @@
 
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/operation/operation.dart';
-import 'package:analysis_server/src/operation/operation_analysis.dart';
 
 
 /**
  * A queue of operations in an [AnalysisServer].
  */
 class ServerOperationQueue {
-  final List<ServerOperationPriority> _analysisPriorities = [
-      ServerOperationPriority.ANALYSIS_CONTINUE,
-      ServerOperationPriority.ANALYSIS];
-
-  final AnalysisServer _server;
   final List<Queue<ServerOperation>> _queues = <Queue<ServerOperation>>[];
 
-  ServerOperationQueue(this._server) {
+  ServerOperationQueue() {
     for (int i = 0; i < ServerOperationPriority.COUNT; i++) {
       var queue = new DoubleLinkedQueue<ServerOperation>();
       _queues.add(queue);
@@ -57,26 +51,41 @@
   }
 
   /**
+   * Return the next operation to perform, or `null` if the queue is empty. This
+   * method does not change the queue.
+   */
+  ServerOperation peek() {
+    for (Queue<ServerOperation> queue in _queues) {
+      if (!queue.isEmpty) {
+        return queue.first;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Reschedules queued operations according their current priorities.
+   */
+  void reschedule() {
+    // prepare all operations
+    List<ServerOperation> operations = <ServerOperation>[];
+    for (Queue<ServerOperation> queue in _queues) {
+      operations.addAll(queue);
+      queue.clear();
+    }
+    // add all operations
+    operations.forEach(add);
+  }
+
+  /**
    * Returns the next operation to perform or `null` if empty.
    */
   ServerOperation take() {
-    // try to find a priority analysis operarion
-    for (ServerOperationPriority priority in _analysisPriorities) {
-      Queue<ServerOperation> queue = _queues[priority.ordinal];
-      for (PerformAnalysisOperation operation in queue) {
-        if (_server.isPriorityContext(operation.context)) {
-          queue.remove(operation);
-          return operation;
-        }
-      }
-    }
-    // non-priority operations
     for (Queue<ServerOperation> queue in _queues) {
       if (!queue.isEmpty) {
         return queue.removeFirst();
       }
     }
-    // empty
     return null;
   }
 }
diff --git a/pkg/analysis_server/lib/src/protocol.dart b/pkg/analysis_server/lib/src/protocol.dart
index 95eb38c..1161df1 100644
--- a/pkg/analysis_server/lib/src/protocol.dart
+++ b/pkg/analysis_server/lib/src/protocol.dart
@@ -497,6 +497,12 @@
   static const String PARAMS = 'params';
 
   /**
+   * The name of the optional JSON attribute indicating the time
+   * (milliseconds since epoch) at which the client made the request.
+   */
+  static const String CLIENT_REQUEST_TIME = 'clientRequestTime';
+
+  /**
    * The unique identifier used to identify this request.
    */
   final String id;
@@ -512,11 +518,18 @@
   final Map<String, Object> _params;
 
   /**
+   * The time (milliseconds since epoch) at which the client made the request
+   * or `null` if this information is not provided by the client.
+   */
+  final int clientRequestTime;
+
+  /**
    * Initialize a newly created [Request] to have the given [id] and [method]
    * name.  If [params] is supplied, it is used as the "params" map for the
    * request.  Otherwise an empty "params" map is allocated.
    */
-  Request(this.id, this.method, [Map<String, Object> params])
+  Request(this.id, this.method, [Map<String, Object> params,
+      this.clientRequestTime])
       : _params = params != null ? params : new HashMap<String, Object>();
 
   /**
@@ -530,10 +543,13 @@
    *     'params': {
    *       paramter_name: value
    *     }
+   *     'clientRequestTime': millisecondsSinceEpoch
    *   }
    *
-   * where the parameters are optional and can contain any number of name/value
-   * pairs.
+   * where both the parameters and clientRequestTime are optional.
+   * The parameters can contain any number of name/value pairs.
+   * The clientRequestTime must be an int representing the time at which
+   * the client issued the request (milliseconds since epoch).
    */
   factory Request.fromString(String data) {
     try {
@@ -546,9 +562,13 @@
       if (id is! String || method is! String) {
         return null;
       }
+      var time = result[Request.CLIENT_REQUEST_TIME];
+      if (time != null && time is! int) {
+        return null;
+      }
       var params = result[Request.PARAMS];
       if (params is Map || params == null) {
-        return new Request(id, method, params);
+        return new Request(id, method, params, time);
       } else {
         return null;
       }
@@ -568,6 +588,9 @@
     if (_params.isNotEmpty) {
       jsonObject[PARAMS] = _params;
     }
+    if (clientRequestTime != null) {
+      jsonObject[CLIENT_REQUEST_TIME] = clientRequestTime;
+    }
     return jsonObject;
   }
 }
@@ -691,6 +714,17 @@
       : _result = result;
 
   /**
+   * Initialize a newly created instance to represent the
+   * FORMAT_INVALID_FILE error condition.
+   */
+  Response.formatInvalidFile(Request request)
+      : this(
+          request.id,
+          error: new RequestError(
+              RequestErrorCode.FORMAT_INVALID_FILE,
+              'Error during `edit.format`: invalid file.'));
+
+  /**
    * Initialize a newly created instance based upon the given JSON data
    */
   factory Response.fromJson(Map<String, Object> json) {
@@ -718,17 +752,6 @@
 
   /**
    * Initialize a newly created instance to represent the
-   * FORMAT_INVALID_FILE error condition.
-   */
-  Response.formatInvalidFile(Request request)
-      : this(
-          request.id,
-          error: new RequestError(
-              RequestErrorCode.FORMAT_INVALID_FILE,
-              'Error during `edit.format`: invalid file.'));
-
-  /**
-   * Initialize a newly created instance to represent the
    * GET_ERRORS_INVALID_FILE error condition.
    */
   Response.getErrorsInvalidFile(Request request)
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 92c4ecc..898aa4f 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -6,6 +6,7 @@
 
 import 'dart:async';
 import 'dart:io';
+import 'dart:math';
 
 import 'package:analysis_server/plugin/plugin.dart';
 import 'package:analysis_server/src/analysis_server.dart';
@@ -15,6 +16,7 @@
 import 'package:analysis_server/src/server/stdio_server.dart';
 import 'package:analysis_server/src/socket_server.dart';
 import 'package:analysis_server/starter.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/incremental_logger.dart';
@@ -23,7 +25,6 @@
 import 'package:analyzer/src/generated/sdk_io.dart';
 import 'package:args/args.dart';
 
-
 /**
  * Initializes incremental logger.
  *
@@ -39,7 +40,7 @@
   }
   // create logger
   if (spec == 'console') {
-    logger = new StringSinkLogger(console.log);
+    logger = new StringSinkLogger(stdout);
   }
   if (spec.startsWith('file:')) {
     String fileName = spec.substring('file:'.length);
@@ -67,6 +68,11 @@
   static const String CLIENT_ID = "client-id";
 
   /**
+   * The name of the option used to set the version for the client.
+   */
+  static const String CLIENT_VERSION = "client-version";
+
+  /**
    * The name of the option used to enable incremental resolution of API
    * changes.
    */
@@ -102,6 +108,12 @@
   static const String INTERNAL_PRINT_TO_CONSOLE = "internal-print-to-console";
 
   /**
+   * The name of the option used to specify if [print] should print to the
+   * console instead of being intercepted.
+   */
+  static const String INTERNAL_DELAY_FREQUENCY = 'internal-delay-freqency';
+
+  /**
    * The name of the option used to specify the port to which the server will
    * connect.
    */
@@ -115,11 +127,16 @@
   static const String SDK_OPTION = "sdk";
 
   /**
-   * The name of the option used to disable error notifications.
+   * The name of the flag used to disable error notifications.
    */
   static const String NO_ERROR_NOTIFICATION = "no-error-notification";
 
   /**
+   * The name of the option used to set the file read mode.
+   */
+  static const String FILE_READ_MODE = "file-read-mode";
+
+  /**
    * The instrumentation server that is to be used by the analysis server.
    */
   InstrumentationServer instrumentationServer;
@@ -173,6 +190,13 @@
 //      }
 //    }
 
+    // TODO (danrubel) Remove this workaround
+    // once the underlying VM and dart:io issue has been fixed.
+    if (results[INTERNAL_DELAY_FREQUENCY] != null) {
+      AnalysisServer.performOperationDelayFreqency =
+          int.parse(results[INTERNAL_DELAY_FREQUENCY], onError: (_) => 0);
+    }
+
     int port;
     bool serve_http = false;
     if (results[PORT_OPTION] != null) {
@@ -194,6 +218,7 @@
     analysisServerOptions.enableIncrementalResolutionValidation =
         results[INCREMENTAL_RESOLUTION_VALIDATION];
     analysisServerOptions.noErrorNotification = results[NO_ERROR_NOTIFICATION];
+    analysisServerOptions.fileReadMode = results[FILE_READ_MODE];
 
     _initIncrementalLogger(results[INCREMENTAL_RESOLUTION_LOG]);
 
@@ -208,7 +233,12 @@
 
     InstrumentationService service =
         new InstrumentationService(instrumentationServer);
-//    service.logVersion(results[CLIENT_ID], defaultSdk.sdkVersion);
+    service.logVersion(
+        _readUuid(service),
+        results[CLIENT_ID],
+        results[CLIENT_VERSION],
+        AnalysisServer.VERSION,
+        defaultSdk.sdkVersion);
     AnalysisEngine.instance.instrumentationService = service;
     //
     // Process all of the plugins so that extensions are registered.
@@ -278,6 +308,7 @@
     parser.addOption(
         CLIENT_ID,
         help: "an identifier used to identify the client");
+    parser.addOption(CLIENT_VERSION, help: "the version of the client");
     parser.addFlag(
         ENABLE_INCREMENTAL_RESOLUTION_API,
         help: "enable using incremental resolution for API changes",
@@ -309,13 +340,24 @@
     parser.addOption(
         PORT_OPTION,
         help: "[port] the port on which the server will listen");
+    parser.addOption(INTERNAL_DELAY_FREQUENCY);
     parser.addOption(SDK_OPTION, help: "[path] the path to the sdk");
     parser.addFlag(
         NO_ERROR_NOTIFICATION,
-        help:
-            "disable sending all analysis error notifications to the server",
+        help: "disable sending all analysis error notifications to the server",
         defaultsTo: false,
         negatable: false);
+    parser.addOption(
+        FILE_READ_MODE,
+        help: "an option of the ways files can be read from disk, " +
+            "some clients normalize end of line characters which would make " +
+            "the file offset and range information incorrect.",
+        allowed: ["as-is", "normalize-eol-always"],
+        allowedHelp: {
+      "as-is": "file contents are read as-is, no file changes occur",
+      "normalize-eol-always":
+          r'file contents normalize the end of line characters to the single character new line `\n`'
+    }, defaultsTo: "as-is");
 
     return parser;
   }
@@ -329,4 +371,35 @@
     print('Supported flags are:');
     print(parser.usage);
   }
+
+  /**
+   * Read the UUID from disk, generating and storing a new one if necessary.
+   */
+  String _readUuid(InstrumentationService service) {
+    File uuidFile = new File(
+        PhysicalResourceProvider.INSTANCE.getStateLocation(
+            '.instrumentation').getChild('uuid.txt').path);
+    try {
+      if (uuidFile.existsSync()) {
+        String uuid = uuidFile.readAsStringSync();
+        if (uuid != null && uuid.length > 5) {
+          return uuid;
+        }
+      }
+    } catch (exception, stackTrace) {
+      service.logPriorityException(exception, stackTrace);
+    }
+    int millisecondsSinceEpoch = new DateTime.now().millisecondsSinceEpoch;
+    int random = new Random().nextInt(0x3fffffff);
+    String uuid = '$millisecondsSinceEpoch$random';
+    try {
+      uuidFile.parent.createSync(recursive: true);
+      uuidFile.writeAsStringSync(uuid);
+    } catch (exception, stackTrace) {
+      service.logPriorityException(exception, stackTrace);
+      // Slightly alter the uuid to indicate it was not persisted
+      uuid = 'temp-$uuid';
+    }
+    return uuid;
+  }
 }
diff --git a/pkg/analysis_server/lib/src/server/http_server.dart b/pkg/analysis_server/lib/src/server/http_server.dart
index da5ba35..beda85c 100644
--- a/pkg/analysis_server/lib/src/server/http_server.dart
+++ b/pkg/analysis_server/lib/src/server/http_server.dart
@@ -118,7 +118,8 @@
   void _returnUnknownRequest(HttpRequest request) {
     HttpResponse response = request.response;
     response.statusCode = HttpStatus.NOT_FOUND;
-    response.headers.add(HttpHeaders.CONTENT_TYPE, "text/plain");
+    response.headers.contentType =
+        new ContentType("text", "plain", charset: "utf-8");
     response.write('Not found');
     response.close();
   }
diff --git a/pkg/analysis_server/lib/src/services/completion/completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/completion_manager.dart
index a8d16db..4861199 100644
--- a/pkg/analysis_server/lib/src/services/completion/completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/completion_manager.dart
@@ -115,46 +115,38 @@
  * Overall performance of a code completion operation.
  */
 class CompletionPerformance {
+  final DateTime start = new DateTime.now();
   final Map<String, Duration> _startTimes = new Map<String, Duration>();
   final Stopwatch _stopwatch = new Stopwatch();
   final List<OperationPerformance> operations = <OperationPerformance>[];
 
   Source source;
-  int offset;
-  String contents;
+  String snippet = '';
   int notificationCount = -1;
-  int suggestionCount = -1;
+  int suggestionCountFirst = -1;
+  int suggestionCountLast = -1;
+  Duration _firstNotification;
 
   CompletionPerformance() {
     _stopwatch.start();
   }
 
+  void setContentsAndOffset(String contents, int offset) {
+    snippet = _computeSnippet(contents, offset);
+  }
+
   int get elapsedInMilliseconds =>
       operations.length > 0 ? operations.last.elapsed.inMilliseconds : 0;
 
-  String get snippet {
-    if (contents == null || offset < 0 || contents.length < offset) {
-      return '???';
-    }
-    int start = offset;
-    while (start > 0) {
-      String ch = contents[start - 1];
-      if (ch == '\r' || ch == '\n') {
-        break;
-      }
-      --start;
-    }
-    int end = offset;
-    while (end < contents.length) {
-      String ch = contents[end];
-      if (ch == '\r' || ch == '\n') {
-        break;
-      }
-      ++end;
-    }
-    String prefix = contents.substring(start, offset);
-    String suffix = contents.substring(offset, end);
-    return '$prefix^$suffix';
+  int get firstNotificationInMilliseconds =>
+      _firstNotification != null ? _firstNotification.inMilliseconds : 0;
+
+  String get startTimeAndMs => '${start.millisecondsSinceEpoch} - $start';
+
+  String get suggestionCount {
+    if (notificationCount < 1) return '';
+    if (notificationCount == 1) return '$suggestionCountFirst';
+    return '$suggestionCountFirst,  $suggestionCountLast';
   }
 
   void complete([String tag = null]) {
@@ -181,6 +173,11 @@
     return result;
   }
 
+  void logFirstNotificationComplete(String tag) {
+    _firstNotification = _stopwatch.elapsed;
+    _logDuration(tag, _firstNotification);
+  }
+
   void logStartTime(String tag) {
     _startTimes[tag] = _stopwatch.elapsed;
   }
@@ -188,6 +185,31 @@
   void _logDuration(String tag, Duration elapsed) {
     operations.add(new OperationPerformance(tag, elapsed));
   }
+
+  static String _computeSnippet(String contents, int offset) {
+    if (contents == null || offset == null || offset < 0 || contents.length < offset) {
+      return '???';
+    }
+    int start = offset;
+    while (start > 0) {
+      String ch = contents[start - 1];
+      if (ch == '\r' || ch == '\n') {
+        break;
+      }
+      --start;
+    }
+    int end = offset;
+    while (end < contents.length) {
+      String ch = contents[end];
+      if (ch == '\r' || ch == '\n') {
+        break;
+      }
+      ++end;
+    }
+    String prefix = contents.substring(start, offset);
+    String suffix = contents.substring(offset, end);
+    return '$prefix^$suffix';
+  }
 }
 
 /**
diff --git a/pkg/analysis_server/lib/src/services/completion/invocation_computer.dart b/pkg/analysis_server/lib/src/services/completion/invocation_computer.dart
index 348021e..6d7dd95 100644
--- a/pkg/analysis_server/lib/src/services/completion/invocation_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/invocation_computer.dart
@@ -64,11 +64,8 @@
       node = (node as PropertyAccess).realTarget;
     }
     if (node is Expression) {
-      DartType type = node.bestType;
-      if (type != null) {
-        ClassElementSuggestionBuilder.suggestionsFor(request, type.element);
-        return new Future.value(true);
-      }
+      InterfaceTypeSuggestionBuilder.suggestionsFor(request, node.bestType);
+      return new Future.value(true);
     }
     return new Future.value(false);
   }
@@ -161,10 +158,9 @@
     if (element != null) {
       InterfaceType type = element.type;
       if (type != null) {
-        ClassElementSuggestionBuilder.suggestionsFor(
+        StaticClassElementSuggestionBuilder.suggestionsFor(
             request,
-            type.element,
-            staticOnly: true);
+            type.element);
       }
     }
     return new Future.value(false);
@@ -204,10 +200,7 @@
     if (element != null) {
       PropertyInducingElement elemVar = element.variable;
       if (elemVar != null) {
-        DartType type = elemVar.type;
-        if (type != null) {
-          ClassElementSuggestionBuilder.suggestionsFor(request, type.element);
-        }
+        InterfaceTypeSuggestionBuilder.suggestionsFor(request, elemVar.type);
       }
       return new Future.value(true);
     }
@@ -216,10 +209,7 @@
 
   @override
   Future<bool> visitVariableElement(VariableElement element) {
-    DartType type = element.type;
-    if (type != null) {
-      ClassElementSuggestionBuilder.suggestionsFor(request, type.element);
-    }
+    InterfaceTypeSuggestionBuilder.suggestionsFor(request, element.type);
     return new Future.value(true);
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/completion/local_computer.dart b/pkg/analysis_server/lib/src/services/completion/local_computer.dart
index fb4c505..0460537 100644
--- a/pkg/analysis_server/lib/src/services/completion/local_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/local_computer.dart
@@ -14,6 +14,7 @@
 import 'package:analysis_server/src/services/completion/optype.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
 
 /**
  * A computer for calculating `completion.getSuggestions` request results
@@ -207,15 +208,14 @@
   void declaredClass(ClassDeclaration declaration) {
     bool isDeprecated = _isDeprecated(declaration);
     CompletionSuggestion suggestion =
-        _addSuggestion(declaration.name, NO_RETURN_TYPE, null, isDeprecated);
+        _addSuggestion(declaration.name, NO_RETURN_TYPE, isDeprecated);
     if (suggestion != null) {
       suggestion.element = _createElement(
           protocol.ElementKind.CLASS,
           declaration.name,
-          null,
-          NO_RETURN_TYPE,
-          declaration.isAbstract,
-          isDeprecated);
+          returnType: NO_RETURN_TYPE,
+          isAbstract: declaration.isAbstract,
+          isDeprecated: isDeprecated);
     }
   }
 
@@ -223,15 +223,14 @@
   void declaredClassTypeAlias(ClassTypeAlias declaration) {
     bool isDeprecated = _isDeprecated(declaration);
     CompletionSuggestion suggestion =
-        _addSuggestion(declaration.name, NO_RETURN_TYPE, null, isDeprecated);
+        _addSuggestion(declaration.name, NO_RETURN_TYPE, isDeprecated);
     if (suggestion != null) {
       suggestion.element = _createElement(
           protocol.ElementKind.CLASS_TYPE_ALIAS,
           declaration.name,
-          null,
-          NO_RETURN_TYPE,
-          true,
-          isDeprecated);
+          returnType: NO_RETURN_TYPE,
+          isAbstract: true,
+          isDeprecated: isDeprecated);
     }
   }
 
@@ -243,15 +242,13 @@
     bool isDeprecated = _isDeprecated(fieldDecl) || _isDeprecated(varDecl);
     TypeName type = fieldDecl.fields.type;
     CompletionSuggestion suggestion =
-        _addSuggestion(varDecl.name, type, fieldDecl.parent, isDeprecated);
+        _addSuggestion(varDecl.name, type, isDeprecated, classDecl: fieldDecl.parent);
     if (suggestion != null) {
       suggestion.element = _createElement(
           protocol.ElementKind.FIELD,
           varDecl.name,
-          null,
-          type,
-          false,
-          isDeprecated);
+          returnType: type,
+          isDeprecated: isDeprecated);
     }
   }
 
@@ -278,16 +275,20 @@
       kind = protocol.ElementKind.FUNCTION;
     }
     CompletionSuggestion suggestion =
-        _addSuggestion(declaration.name, returnType, null, isDeprecated);
+        _addSuggestion(declaration.name, returnType, isDeprecated);
     if (suggestion != null) {
       FormalParameterList param = declaration.functionExpression.parameters;
       suggestion.element = _createElement(
           kind,
           declaration.name,
-          param != null ? param.toSource() : null,
-          returnType,
-          false,
-          isDeprecated);
+          parameters: param != null ? param.toSource() : null,
+          returnType: returnType,
+          isDeprecated: isDeprecated);
+      if (kind == protocol.ElementKind.FUNCTION) {
+        _addParameterInfo(
+            suggestion,
+            declaration.functionExpression.parameters);
+      }
     }
   }
 
@@ -296,16 +297,15 @@
     bool isDeprecated = _isDeprecated(declaration);
     TypeName returnType = declaration.returnType;
     CompletionSuggestion suggestion =
-        _addSuggestion(declaration.name, returnType, null, isDeprecated);
+        _addSuggestion(declaration.name, returnType, isDeprecated);
     if (suggestion != null) {
       // TODO (danrubel) determine parameters and return type
       suggestion.element = _createElement(
           protocol.ElementKind.FUNCTION_TYPE_ALIAS,
           declaration.name,
-          null,
-          returnType,
-          true,
-          isDeprecated);
+          returnType: returnType,
+          isAbstract: true,
+          isDeprecated: isDeprecated);
     }
   }
 
@@ -319,15 +319,10 @@
     if (typesOnly) {
       return;
     }
-    CompletionSuggestion suggestion = _addSuggestion(name, type, null, false);
+    CompletionSuggestion suggestion = _addSuggestion(name, type, false);
     if (suggestion != null) {
-      suggestion.element = _createElement(
-          protocol.ElementKind.LOCAL_VARIABLE,
-          name,
-          null,
-          type,
-          false,
-          false);
+      suggestion.element =
+          _createElement(protocol.ElementKind.LOCAL_VARIABLE, name, returnType: type);
     }
   }
 
@@ -356,16 +351,22 @@
       parameters = declaration.parameters.toSource();
     }
     bool isDeprecated = _isDeprecated(declaration);
-    CompletionSuggestion suggestion =
-        _addSuggestion(declaration.name, returnType, declaration.parent, isDeprecated);
+    CompletionSuggestion suggestion = _addSuggestion(
+        declaration.name,
+        returnType,
+        isDeprecated,
+        classDecl: declaration.parent);
     if (suggestion != null) {
       suggestion.element = _createElement(
           kind,
           declaration.name,
-          parameters,
-          returnType,
-          declaration.isAbstract,
-          isDeprecated);
+          parameters: parameters,
+          returnType: returnType,
+          isAbstract: declaration.isAbstract,
+          isDeprecated: isDeprecated);
+      if (kind == protocol.ElementKind.METHOD) {
+        _addParameterInfo(suggestion, declaration.parameters);
+      }
     }
   }
 
@@ -374,10 +375,10 @@
     if (typesOnly) {
       return;
     }
-    CompletionSuggestion suggestion = _addSuggestion(name, type, null, false);
+    CompletionSuggestion suggestion = _addSuggestion(name, type, false);
     if (suggestion != null) {
       suggestion.element =
-          _createElement(protocol.ElementKind.PARAMETER, name, null, type, false, false);
+          _createElement(protocol.ElementKind.PARAMETER, name, returnType: type);
     }
   }
 
@@ -389,20 +390,53 @@
     }
     bool isDeprecated = _isDeprecated(varList) || _isDeprecated(varDecl);
     CompletionSuggestion suggestion =
-        _addSuggestion(varDecl.name, varList.type, null, isDeprecated);
+        _addSuggestion(varDecl.name, varList.type, isDeprecated);
     if (suggestion != null) {
       suggestion.element = _createElement(
           protocol.ElementKind.TOP_LEVEL_VARIABLE,
           varDecl.name,
-          null,
-          varList.type,
-          false,
-          isDeprecated);
+          returnType: varList.type,
+          isDeprecated: isDeprecated);
     }
   }
 
+  void _addParameterInfo(CompletionSuggestion suggestion,
+      FormalParameterList parameters) {
+    var paramList = parameters.parameters;
+    suggestion.parameterNames =
+        paramList.map((FormalParameter param) => param.identifier.name).toList();
+    suggestion.parameterTypes = paramList.map((FormalParameter param) {
+      TypeName type = null;
+      if (param is DefaultFormalParameter) {
+        NormalFormalParameter child = param.parameter;
+        if (child is SimpleFormalParameter) {
+          type = child.type;
+        } else if (child is FieldFormalParameter) {
+          type = child.type;
+        }
+      }
+      if (param is SimpleFormalParameter) {
+        type = param.type;
+      } else if (param is FieldFormalParameter) {
+        type = param.type;
+      }
+      if (type == null) {
+        return 'dynamic';
+      }
+      Identifier typeId = type.name;
+      if (typeId == null) {
+        return 'dynamic';
+      }
+      return typeId.name;
+    }).toList();
+    suggestion.requiredParameterCount = paramList.where(
+        (FormalParameter param) => param is! DefaultFormalParameter).length;
+    suggestion.hasNamedParameters =
+        paramList.any((FormalParameter param) => param.kind == ParameterKind.NAMED);
+  }
+
   CompletionSuggestion _addSuggestion(SimpleIdentifier id, TypeName returnType,
-      ClassDeclaration classDecl, bool isDeprecated) {
+      bool isDeprecated, {ClassDeclaration classDecl}) {
     if (id != null) {
       String completion = id.name;
       if (completion != null && completion.length > 0 && completion != '_') {
@@ -412,7 +446,7 @@
             completion,
             completion.length,
             0,
-            false,
+            isDeprecated,
             false,
             returnType: _nameForType(returnType));
         if (classDecl != null) {
@@ -436,8 +470,8 @@
    * Create a new protocol Element for inclusion in a completion suggestion.
    */
   protocol.Element _createElement(protocol.ElementKind kind,
-      SimpleIdentifier id, String parameters, TypeName returnType, bool isAbstract,
-      bool isDeprecated) {
+      SimpleIdentifier id, {String parameters, TypeName returnType, bool isAbstract:
+      false, bool isDeprecated: false}) {
     String name = id.name;
     int flags = protocol.Element.makeFlags(
         isAbstract: isAbstract,
diff --git a/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
index 8be79634..b90b026 100644
--- a/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
@@ -5,6 +5,7 @@
 library services.completion.suggestion.builder;
 
 import 'dart:async';
+import 'dart:collection';
 
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
 import 'package:analysis_server/src/protocol_server.dart' hide Element,
@@ -64,11 +65,9 @@
       isDeprecated,
       false);
   suggestion.element = protocol.newElement_fromEngine(element);
-  if (element is ClassMemberElement) {
-    ClassElement enclosingElement = element.enclosingElement;
-    if (enclosingElement != null) {
-      suggestion.declaringType = enclosingElement.displayName;
-    }
+  Element enclosingElement = element.enclosingElement;
+  if (enclosingElement is ClassElement) {
+    suggestion.declaringType = enclosingElement.displayName;
   }
   suggestion.returnType = returnType;
   if (element is ExecutableElement && element is! PropertyAccessorElement) {
@@ -165,77 +164,6 @@
 }
 
 /**
- * This class visits elements in a class and provides suggestions based upon
- * the visible members in that class. Clients should call
- * [ClassElementSuggestionBuilder.suggestionsFor].
- */
-class ClassElementSuggestionBuilder extends GeneralizingElementVisitor with
-    ElementSuggestionBuilder {
-  final bool staticOnly;
-  final DartCompletionRequest request;
-
-  ClassElementSuggestionBuilder(this.request, bool staticOnly)
-      : this.staticOnly = staticOnly;
-
-  @override
-  CompletionSuggestionKind get kind => CompletionSuggestionKind.INVOCATION;
-
-  @override
-  visitClassElement(ClassElement element) {
-    element.visitChildren(this);
-    element.allSupertypes.forEach((InterfaceType type) {
-      type.element.visitChildren(this);
-    });
-  }
-
-  @override
-  visitElement(Element element) {
-    // ignored
-  }
-
-  @override
-  visitFieldElement(FieldElement element) {
-    if (staticOnly && !element.isStatic) {
-      return;
-    }
-    addSuggestion(element);
-  }
-
-  @override
-  visitMethodElement(MethodElement element) {
-    if (staticOnly && !element.isStatic) {
-      return;
-    }
-    if (element.isOperator) {
-      return;
-    }
-    addSuggestion(element);
-  }
-
-  @override
-  visitPropertyAccessorElement(PropertyAccessorElement element) {
-    if (staticOnly && !element.isStatic) {
-      return;
-    }
-    addSuggestion(element);
-  }
-
-  /**
-   * Add suggestions for the visible members in the given class
-   */
-  static void suggestionsFor(DartCompletionRequest request, Element element,
-      {bool staticOnly: false}) {
-    if (element == DynamicElementImpl.instance) {
-      element = request.cache.objectClassElement;
-    }
-    if (element is ClassElement) {
-      return element.accept(
-          new ClassElementSuggestionBuilder(request, staticOnly));
-    }
-  }
-}
-
-/**
  * Common mixin for sharing behavior
  */
 abstract class ElementSuggestionBuilder {
@@ -285,6 +213,184 @@
 }
 
 /**
+ * This class provides suggestions based upon the visible instance members in
+ * an interface type.  Clients should call
+ * [InterfaceTypeSuggestionBuilder.suggestionsFor].
+ */
+class InterfaceTypeSuggestionBuilder {
+  /**
+   * Enumerated value indicating that we have not generated any completions for
+   * a given identifier yet.
+   */
+  static const int _COMPLETION_TYPE_NONE = 0;
+
+  /**
+   * Enumerated value indicating that we have generated a completion for a
+   * getter.
+   */
+  static const int _COMPLETION_TYPE_GETTER = 1;
+
+  /**
+   * Enumerated value indicating that we have generated a completion for a
+   * setter.
+   */
+  static const int _COMPLETION_TYPE_SETTER = 2;
+
+  /**
+   * Enumerated value indicating that we have generated a completion for a
+   * field, a method, or a getter/setter pair.
+   */
+  static const int _COMPLETION_TYPE_FIELD_OR_METHOD_OR_GETSET = 3;
+
+  final DartCompletionRequest request;
+
+  /**
+   * Map indicating, for each possible completion identifier, whether we have
+   * already generated completions for a getter, setter, or both.  The "both"
+   * case also handles the case where have generated a completion for a method
+   * or a field.
+   *
+   * Note: the enumerated values stored in this map are intended to be bitwise
+   * compared.
+   */
+  Map<String, int> _completionTypesGenerated = new HashMap<String, int>();
+
+  InterfaceTypeSuggestionBuilder(this.request);
+
+  CompletionSuggestionKind get kind => CompletionSuggestionKind.INVOCATION;
+
+  /**
+   * Add a suggestion based upon the given element, provided that it is not
+   * shadowed by a previously added suggestion.
+   */
+  void addSuggestion(Element element) {
+    if (element.isPrivate) {
+      LibraryElement elementLibrary = element.library;
+      LibraryElement unitLibrary = request.unit.element.library;
+      if (elementLibrary != unitLibrary) {
+        return;
+      }
+    }
+    String identifier = element.displayName;
+    int alreadyGenerated =
+        _completionTypesGenerated.putIfAbsent(identifier, () => _COMPLETION_TYPE_NONE);
+    if (element is MethodElement) {
+      // Anything shadows a method.
+      if (alreadyGenerated != _COMPLETION_TYPE_NONE) {
+        return;
+      }
+      _completionTypesGenerated[identifier] =
+          _COMPLETION_TYPE_FIELD_OR_METHOD_OR_GETSET;
+    } else if (element is PropertyAccessorElement) {
+      if (element.isGetter) {
+        // Getters, fields, and methods shadow a getter.
+        if ((alreadyGenerated & _COMPLETION_TYPE_GETTER) != 0) {
+          return;
+        }
+        _completionTypesGenerated[identifier] |= _COMPLETION_TYPE_GETTER;
+      } else {
+        // Setters, fields, and methods shadow a setter.
+        if ((alreadyGenerated & _COMPLETION_TYPE_SETTER) != 0) {
+          return;
+        }
+        _completionTypesGenerated[identifier] |= _COMPLETION_TYPE_SETTER;
+      }
+    } else if (element is FieldElement) {
+      // Fields and methods shadow a field.  A getter/setter pair shadows a
+      // field, but a getter or setter by itself doesn't.
+      if (alreadyGenerated == _COMPLETION_TYPE_FIELD_OR_METHOD_OR_GETSET) {
+        return;
+      }
+      _completionTypesGenerated[identifier] =
+          _COMPLETION_TYPE_FIELD_OR_METHOD_OR_GETSET;
+    } else {
+      // Unexpected element type; skip it.
+      assert(false);
+      return;
+    }
+    CompletionSuggestion suggestion = createSuggestion(element, kind: kind);
+    if (suggestion != null) {
+      request.suggestions.add(suggestion);
+    }
+  }
+
+  void _buildSuggestions(InterfaceType type, LibraryElement library) {
+    // Visit all of the types in the class hierarchy, collecting possible
+    // completions.  If multiple elements are found that complete to the same
+    // identifier, addSuggestion will discard all but the first (with a few
+    // exceptions to handle getter/setter pairs).
+    for (InterfaceType targetType in _getTypeOrdering(type)) {
+      for (MethodElement method in targetType.methods) {
+        addSuggestion(method);
+      }
+      for (PropertyAccessorElement propertyAccessor in targetType.accessors) {
+        if (propertyAccessor.isSynthetic) {
+          // Avoid visiting a field twice
+          if (propertyAccessor.isGetter) {
+            addSuggestion(propertyAccessor.variable);
+          }
+        } else {
+          addSuggestion(propertyAccessor);
+        }
+      }
+    }
+  }
+
+  /**
+   * Get a list of [InterfaceType]s that should be searched to find the
+   * possible completions for an object having type [type].
+   */
+  List<InterfaceType> _getTypeOrdering(InterfaceType type) {
+    // Candidate completions can come from [type] as well as any types above it
+    // in the class hierarchy (including mixins, superclasses, and interfaces).
+    // If a given completion identifier shows up in multiple types, we should
+    // use the element that is nearest in the superclass chain, so we will
+    // visit [type] first, then its mixins, then its superclass, then its
+    // superclass's mixins, etc., and only afterwards visit interfaces.
+    //
+    // We short-circuit loops in the class hierarchy by keeping track of the
+    // classes seen (not the interfaces) so that we won't be fooled by nonsense
+    // like "class C<T> extends C<List<T>> {}"
+    List<InterfaceType> result = <InterfaceType>[];
+    Set<ClassElement> classesSeen = new HashSet<ClassElement>();
+    List<InterfaceType> typesToVisit = <InterfaceType>[type];
+    while (typesToVisit.isNotEmpty) {
+      InterfaceType nextType = typesToVisit.removeLast();
+      if (!classesSeen.add(nextType.element)) {
+        // Class had already been seen, so ignore this type.
+        continue;
+      }
+      result.add(nextType);
+      // typesToVisit is a stack, so push on the interfaces first, then the
+      // superclass, then the mixins.  This will ensure that they are visited
+      // in the reverse order.
+      typesToVisit.addAll(nextType.interfaces);
+      if (nextType.superclass != null) {
+        typesToVisit.add(nextType.superclass);
+      }
+      typesToVisit.addAll(nextType.mixins);
+    }
+    return result;
+  }
+
+  /**
+   * Add suggestions for the visible members in the given interface
+   */
+  static void suggestionsFor(DartCompletionRequest request, DartType type) {
+    CompilationUnit compilationUnit =
+        request.node.getAncestor((AstNode node) => node is CompilationUnit);
+    LibraryElement library = compilationUnit.element.library;
+    if (type is DynamicTypeImpl) {
+      type = request.cache.objectClassElement.type;
+    }
+    if (type is InterfaceType) {
+      return new InterfaceTypeSuggestionBuilder(
+          request)._buildSuggestions(type, library);
+    }
+  }
+}
+
+/**
  * This class visits elements in a library and provides suggestions based upon
  * the visible members in that library. Clients should call
  * [LibraryElementSuggestionBuilder.suggestionsFor].
@@ -392,6 +498,73 @@
 }
 
 /**
+ * This class visits elements in a class and provides suggestions based upon
+ * the visible static members in that class. Clients should call
+ * [StaticClassElementSuggestionBuilder.suggestionsFor].
+ */
+class StaticClassElementSuggestionBuilder extends GeneralizingElementVisitor
+    with ElementSuggestionBuilder {
+  final DartCompletionRequest request;
+
+  StaticClassElementSuggestionBuilder(this.request);
+
+  @override
+  CompletionSuggestionKind get kind => CompletionSuggestionKind.INVOCATION;
+
+  @override
+  visitClassElement(ClassElement element) {
+    element.visitChildren(this);
+    element.allSupertypes.forEach((InterfaceType type) {
+      type.element.visitChildren(this);
+    });
+  }
+
+  @override
+  visitElement(Element element) {
+    // ignored
+  }
+
+  @override
+  visitFieldElement(FieldElement element) {
+    if (!element.isStatic) {
+      return;
+    }
+    addSuggestion(element);
+  }
+
+  @override
+  visitMethodElement(MethodElement element) {
+    if (!element.isStatic) {
+      return;
+    }
+    if (element.isOperator) {
+      return;
+    }
+    addSuggestion(element);
+  }
+
+  @override
+  visitPropertyAccessorElement(PropertyAccessorElement element) {
+    if (!element.isStatic) {
+      return;
+    }
+    addSuggestion(element);
+  }
+
+  /**
+   * Add suggestions for the visible members in the given class
+   */
+  static void suggestionsFor(DartCompletionRequest request, Element element) {
+    if (element == DynamicElementImpl.instance) {
+      element = request.cache.objectClassElement;
+    }
+    if (element is ClassElement) {
+      return element.accept(new StaticClassElementSuggestionBuilder(request));
+    }
+  }
+}
+
+/**
  * Common interface implemented by suggestion builders.
  */
 abstract class SuggestionBuilder {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 1c2934f..4aa4c62 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -67,11 +67,13 @@
       50,
       "Create constructor to call {0}");
   static const CREATE_FIELD =
-      const FixKind('CREATE_FIELD', 50, "Create field '{0}'");
+      const FixKind('CREATE_FIELD', 51, "Create field '{0}'");
   static const CREATE_FILE =
       const FixKind('CREATE_FILE', 50, "Create file '{0}'");
   static const CREATE_FUNCTION =
       const FixKind('CREATE_FUNCTION', 51, "Create function '{0}'");
+  static const CREATE_GETTER =
+      const FixKind('CREATE_GETTER', 50, "Create getter '{0}'");
   static const CREATE_LOCAL_VARIABLE =
       const FixKind('CREATE_LOCAL_VARIABLE', 50, "Create local variable '{0}'");
   static const CREATE_METHOD =
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index ceec5fe..c46ee05 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -199,6 +199,7 @@
     }
     if (errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER) {
       _addFix_createField();
+      _addFix_createGetter();
       _addFix_createFunction_forFunctionType();
       _addFix_importLibrary_withType();
       _addFix_importLibrary_withTopLevelVariable();
@@ -222,6 +223,7 @@
     }
     if (errorCode == StaticTypeWarningCode.UNDEFINED_GETTER) {
       _addFix_createField();
+      _addFix_createGetter();
       _addFix_createFunction_forFunctionType();
     }
     if (errorCode == HintCode.UNDEFINED_METHOD ||
@@ -697,6 +699,83 @@
     }
   }
 
+  void _addFix_createGetter() {
+    SimpleIdentifier nameNode = node;
+    String name = nameNode.name;
+    if (!nameNode.inGetterContext()) {
+      return;
+    }
+    // prepare target Expression
+    Expression target;
+    {
+      AstNode nameParent = nameNode.parent;
+      if (nameParent is PrefixedIdentifier) {
+        target = nameParent.prefix;
+      }
+      if (nameParent is PropertyAccess) {
+        target = nameParent.realTarget;
+      }
+    }
+    // prepare target ClassElement
+    bool staticModifier = false;
+    ClassElement targetClassElement;
+    if (target != null) {
+      // prepare target interface type
+      DartType targetType = target.bestType;
+      if (targetType is! InterfaceType) {
+        return;
+      }
+      targetClassElement = targetType.element;
+      // maybe static
+      if (target is Identifier) {
+        Identifier targetIdentifier = target;
+        Element targetElement = targetIdentifier.staticElement;
+        staticModifier = targetElement.kind == ElementKind.CLASS;
+      }
+    } else {
+      targetClassElement = getEnclosingClassElement(node);
+      if (targetClassElement == null) {
+        return;
+      }
+      staticModifier = _inStaticContext();
+    }
+    utils.targetClassElement = targetClassElement;
+    // prepare location
+    ClassDeclaration targetClassNode = targetClassElement.node;
+    _FieldLocation targetLocation = _prepareNewGetterLocation(targetClassNode);
+    // build method source
+    String targetFile = targetClassElement.source.fullName;
+    SourceBuilder sb = new SourceBuilder(targetFile, targetLocation.offset);
+    {
+      sb.append(targetLocation.prefix);
+      // maybe "static"
+      if (staticModifier) {
+        sb.append('static ');
+      }
+      // append type
+      Expression fieldTypeNode = climbPropertyAccess(nameNode);
+      DartType fieldType = _inferUndefinedExpressionType(fieldTypeNode);
+      _appendType(sb, fieldType, groupId: 'TYPE');
+      sb.append('get ');
+      // append name
+      {
+        sb.startPosition('NAME');
+        sb.append(name);
+        sb.endPosition();
+      }
+      sb.append(' => null;');
+      sb.append(targetLocation.suffix);
+    }
+    // insert source
+    _insertBuilder(sb);
+    // add linked positions
+    if (targetFile == file) {
+      _addLinkedPosition('NAME', sb, rf.rangeNode(node));
+    }
+    // add proposal
+    _addFixToElement(FixKind.CREATE_GETTER, [name], targetClassElement);
+  }
+
   void _addFix_createImportUri() {
     if (node is SimpleStringLiteral && node.parent is ImportDirective) {
       ImportDirective importDirective = node.parent;
@@ -2040,6 +2119,32 @@
         suffix);
   }
 
+  _FieldLocation _prepareNewGetterLocation(ClassDeclaration classDeclaration) {
+    String indent = utils.getIndent(1);
+    // find an existing target member
+    ClassMember prevMember = null;
+    List<ClassMember> members = classDeclaration.members;
+    for (ClassMember member in members) {
+      if (member is FieldDeclaration ||
+          member is ConstructorDeclaration ||
+          member is MethodDeclaration && member.isGetter) {
+        prevMember = member;
+      } else {
+        break;
+      }
+    }
+    // after the last field/getter
+    if (prevMember != null) {
+      return new _FieldLocation(eol + eol + indent, prevMember.end, '');
+    }
+    // at the beginning of the class
+    String suffix = members.isEmpty ? '' : eol;
+    return new _FieldLocation(
+        eol + indent,
+        classDeclaration.leftBracket.end,
+        suffix);
+  }
+
   /**
    * Removes any [ParenthesizedExpression] enclosing [expr].
    *
diff --git a/pkg/analysis_server/lib/src/services/dependencies/library_dependencies.dart b/pkg/analysis_server/lib/src/services/dependencies/library_dependencies.dart
new file mode 100644
index 0000000..95299b1
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/dependencies/library_dependencies.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 services.dependencies.library;
+
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+class LibraryDependencyCollector {
+
+  final Set<LibraryElement> _visitedLibraries = new Set<LibraryElement>();
+  final Set<String> _dependencies = new Set<String>();
+
+  final List<AnalysisContext> _contexts;
+
+  LibraryDependencyCollector(this._contexts);
+
+  Set<String> collectLibraryDependencies() {
+    _contexts.forEach(
+        (AnalysisContext context) =>
+            context.librarySources.forEach(
+                (Source source) => _addDependencies(context.getLibraryElement(source))));
+    return _dependencies;
+  }
+
+  void _addDependencies(LibraryElement libraryElement) {
+    if (libraryElement == null) {
+      return;
+    }
+    if (_visitedLibraries.add(libraryElement)) {
+      for (CompilationUnitElement cu in libraryElement.units) {
+        String path = cu.source.fullName;
+        if (path != null) {
+          _dependencies.add(path);
+        }
+      }
+      libraryElement.imports.forEach(
+          (ImportElement import) => _addDependencies(import.importedLibrary));
+      libraryElement.exports.forEach(
+          (ExportElement export) => _addDependencies(export.exportedLibrary));
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/index/store/codec.dart b/pkg/analysis_server/lib/src/services/index/store/codec.dart
index de90056..1625edd 100644
--- a/pkg/analysis_server/lib/src/services/index/store/codec.dart
+++ b/pkg/analysis_server/lib/src/services/index/store/codec.dart
@@ -182,8 +182,11 @@
       if (library != null) {
         components = components.toList();
         components[0] = library.source.fullName;
-        if (element.enclosingElement is CompilationUnitElement) {
-          components[1] = library.definingCompilationUnit.source.fullName;
+        for (Element e = element; e != null; e = e.enclosingElement) {
+          if (e is CompilationUnitElement) {
+            components[1] = e.source.fullName;
+            break;
+          }
         }
       }
     }
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index f2038ec..cdc873a 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -62,8 +62,17 @@
       });
       return;
     }
-    PhysicalResourceProvider resourceProvider =
-        PhysicalResourceProvider.INSTANCE;
+    PhysicalResourceProvider resourceProvider;
+    if (analysisServerOptions.fileReadMode == 'as-is') {
+      resourceProvider = PhysicalResourceProvider.INSTANCE;
+    } else if (analysisServerOptions.fileReadMode == 'normalize-eol-always') {
+      resourceProvider =
+          new PhysicalResourceProvider(PhysicalResourceProvider.NORMALIZE_EOL_ALWAYS);
+    } else {
+      throw new Exception(
+          'File read mode was set to the unknown mode: $analysisServerOptions.fileReadMode');
+    }
+
     analysisServer = new AnalysisServer(
         serverChannel,
         resourceProvider,
diff --git a/pkg/analysis_server/lib/src/status/ast_writer.dart b/pkg/analysis_server/lib/src/status/ast_writer.dart
new file mode 100644
index 0000000..a5dd302
--- /dev/null
+++ b/pkg/analysis_server/lib/src/status/ast_writer.dart
@@ -0,0 +1,183 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 analysis_server.src.status.ast_writer;
+
+import 'dart:convert';
+
+import 'package:analyzer/src/generated/ast.dart';
+
+/**
+ * A visitor that will produce an HTML representation of an AST structure.
+ */
+class AstWriter extends UnifyingAstVisitor {
+  /**
+   * The buffer on which the HTML is to be written.
+   */
+  final StringBuffer buffer;
+
+  /**
+   * The current level of indentation.
+   */
+  int indentLevel = 0;
+
+  /**
+   * Initialize a newly created element writer to write the HTML representation
+   * of visited nodes on the given [buffer].
+   */
+  AstWriter(this.buffer);
+
+  @override
+  void visitNode(AstNode node) {
+    _writeNode(node);
+    indentLevel++;
+    try {
+      node.visitChildren(this);
+    } finally {
+      indentLevel--;
+    }
+  }
+
+  /**
+   * Return the name of the given [node], or `null` if the given node is not a
+   * declaration.
+   */
+  String _getName(AstNode node) {
+    if (node is ClassTypeAlias) {
+      return node.name.name;
+    } else if (node is ClassDeclaration) {
+      return node.name.name;
+    } else if (node is ConstructorDeclaration) {
+      if (node.name == null) {
+        return node.returnType.name;
+      } else {
+        return node.returnType.name + '.' + node.name.name;
+      }
+    } else if (node is ConstructorName) {
+      return node.toSource();
+    } else if (node is FieldDeclaration) {
+      return _getNames(node.fields);
+    } else if (node is FunctionDeclaration) {
+      SimpleIdentifier nameNode = node.name;
+      if (nameNode != null) {
+        return nameNode.name;
+      }
+    } else if (node is FunctionTypeAlias) {
+      return node.name.name;
+    } else if (node is Identifier) {
+      return node.name;
+    } else if (node is MethodDeclaration) {
+      return node.name.name;
+    } else if (node is TopLevelVariableDeclaration) {
+      return _getNames(node.variables);
+    } else if (node is TypeName) {
+      return node.toSource();
+    } else if (node is TypeParameter) {
+      return node.name.name;
+    } else if (node is VariableDeclaration) {
+      return node.name.name;
+    }
+    return null;
+  }
+
+  /**
+   * Return a string containing a comma-separated list of the names of all of
+   * the variables in the given list of [variables].
+   */
+  String _getNames(VariableDeclarationList variables) {
+    StringBuffer buffer = new StringBuffer();
+    bool first = true;
+    for (VariableDeclaration variable in variables.variables) {
+      if (first) {
+        first = false;
+      } else {
+        buffer.write(', ');
+      }
+      buffer.write(variable.name.name);
+    }
+    return buffer.toString();
+  }
+
+  void _indent([int extra = 0]) {
+    for (int i = 0; i < indentLevel; i++) {
+      buffer.write('&#x250A;&nbsp;&nbsp;&nbsp;');
+    }
+    if (extra > 0) {
+      buffer.write('&#x250A;&nbsp;&nbsp;&nbsp;');
+      for (int i = 1; i < extra; i++) {
+        buffer.write('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;');
+      }
+    }
+  }
+
+  /**
+   * Write a representation of the given [node] to the buffer.
+   */
+  void _writeNode(AstNode node) {
+    _indent();
+    buffer.write(node.runtimeType);
+    buffer.write(' <span style="color:gray">[');
+    buffer.write(node.offset);
+    buffer.write('..');
+    buffer.write(node.offset + node.length - 1);
+    buffer.write(']</span>');
+    buffer.write('<br>');
+    _writeProperty('name', _getName(node));
+    if (node is BinaryExpression) {
+      _writeProperty('static element', node.staticElement);
+      _writeProperty('static type', node.staticType);
+      _writeProperty('propagated element', node.propagatedElement);
+      _writeProperty('propagated type', node.propagatedType);
+    } else if (node is CompilationUnit) {
+      _writeProperty("element", node.element);
+    } else if (node is ExportDirective) {
+      _writeProperty("element", node.element);
+    } else if (node is FunctionExpressionInvocation) {
+      _writeProperty('static element', node.staticElement);
+      _writeProperty('static type', node.staticType);
+      _writeProperty('propagated element', node.propagatedElement);
+      _writeProperty('propagated type', node.propagatedType);
+    } else if (node is ImportDirective) {
+      _writeProperty("element", node.element);
+    } else if (node is LibraryDirective) {
+      _writeProperty("element", node.element);
+    } else if (node is PartDirective) {
+      _writeProperty("element", node.element);
+    } else if (node is PartOfDirective) {
+      _writeProperty("element", node.element);
+    } else if (node is PostfixExpression) {
+      _writeProperty('static element', node.staticElement);
+      _writeProperty('static type', node.staticType);
+      _writeProperty('propagated element', node.propagatedElement);
+      _writeProperty('propagated type', node.propagatedType);
+    } else if (node is PrefixExpression) {
+      _writeProperty('static element', node.staticElement);
+      _writeProperty('static type', node.staticType);
+      _writeProperty('propagated element', node.propagatedElement);
+      _writeProperty('propagated type', node.propagatedType);
+    } else if (node is SimpleIdentifier) {
+      _writeProperty('static element', node.staticElement);
+      _writeProperty('static type', node.staticType);
+      _writeProperty('propagated element', node.propagatedElement);
+      _writeProperty('propagated type', node.propagatedType);
+    } else if (node is SimpleStringLiteral) {
+      _writeProperty("value", node.value);
+    } else if (node is Expression) {
+      _writeProperty('static type', node.staticType);
+      _writeProperty('propagated type', node.propagatedType);
+    }
+  }
+
+  /**
+   * Write the [value] of the property with the given [name].
+   */
+  void _writeProperty(String name, Object value) {
+    if (value != null) {
+      _indent(2);
+      buffer.write('$name = ');
+      buffer.write(HTML_ESCAPE.convert(value.toString()));
+      buffer.write('<br>');
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/status/element_writer.dart b/pkg/analysis_server/lib/src/status/element_writer.dart
new file mode 100644
index 0000000..be7e59c
--- /dev/null
+++ b/pkg/analysis_server/lib/src/status/element_writer.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 analysis_server.src.status.element_writer;
+
+import 'dart:convert';
+
+import 'package:analyzer/src/generated/element.dart';
+
+/**
+ * A visitor that will produce an HTML representation of an element structure.
+ */
+class ElementWriter extends GeneralizingElementVisitor {
+  /**
+   * The buffer on which the HTML is to be written.
+   */
+  final StringBuffer buffer;
+
+  /**
+   * The current level of indentation.
+   */
+  int indentLevel = 0;
+
+  /**
+   * Initialize a newly created element writer to write the HTML representation
+   * of visited elements on the given [buffer].
+   */
+  ElementWriter(this.buffer);
+
+  @override
+  void visitElement(Element element) {
+    for (int i = 0; i < indentLevel; i++) {
+      buffer.write('&#x250A;&nbsp;&nbsp;&nbsp;');
+    }
+    if (element.isSynthetic) {
+      buffer.write('<i>');
+    }
+    buffer.write(HTML_ESCAPE.convert(element.toString()));
+    if (element.isSynthetic) {
+      buffer.write('</i>');
+    }
+    buffer.write(' <span style="color:gray">(');
+    buffer.write(element.runtimeType);
+    buffer.write(')</span><br>');
+    indentLevel++;
+    try {
+      element.visitChildren(this);
+    } finally {
+      indentLevel--;
+    }
+  }
+}
diff --git a/pkg/analysis_server/test/analysis/reanalyze_test.dart b/pkg/analysis_server/test/analysis/reanalyze_test.dart
index cd3cd0b..c2c60af 100644
--- a/pkg/analysis_server/test/analysis/reanalyze_test.dart
+++ b/pkg/analysis_server/test/analysis/reanalyze_test.dart
@@ -21,6 +21,16 @@
 
 @reflectiveTest
 class ReanalyzeTest extends AbstractAnalysisTest {
+  Map<String, List<AnalysisError>> filesErrors = {};
+
+  @override
+  void processNotification(Notification notification) {
+    if (notification.event == ANALYSIS_ERRORS) {
+      var decoded = new AnalysisErrorsParams.fromNotification(notification);
+      filesErrors[decoded.file] = decoded.errors;
+    }
+  }
+
   test_reanalyze() {
     createProject();
     List<AnalysisContext> contexts = server.folderMap.values.toList();
@@ -34,4 +44,34 @@
     AnalysisContext newContext = contexts[0];
     expect(newContext, isNot(same(oldContext)));
   }
+
+  test_reanalyze_with_overlay() {
+    createProject();
+    resourceProvider.newFolder(testFolder);
+    resourceProvider.newFile(testFile, 'main() {}');
+    return waitForTasksFinished().then((_) {
+      // Update the content with an overlay that contains a syntax error.
+      server.updateContent('1', {
+        testFile: new AddContentOverlay('main() {')
+      });
+      return waitForTasksFinished();
+    }).then((_) {
+      // Verify that the syntax error was detected.
+      List<AnalysisError> errors = filesErrors[testFile];
+      expect(errors, hasLength(1));
+      // Remove testFile from filesErrors so that we'll notice when the file is
+      // re-analyzed.
+      filesErrors.remove(testFile);
+      // Reanalyze.
+      server.reanalyze();
+      return waitForTasksFinished();
+    }).then((_) {
+      // The file should have been reanalyzed.
+      expect(filesErrors, contains(testFile));
+      // Verify that the syntax error is present (this indicates that the
+      // content introduced by the call to updateContent is still in effect).
+      List<AnalysisError> errors = filesErrors[testFile];
+      expect(errors, hasLength(1));
+    });
+  }
 }
diff --git a/pkg/analysis_server/test/analysis/test_all.dart b/pkg/analysis_server/test/analysis/test_all.dart
index 83d013d..e9867c2 100644
--- a/pkg/analysis_server/test/analysis/test_all.dart
+++ b/pkg/analysis_server/test/analysis/test_all.dart
@@ -13,6 +13,7 @@
 import 'notification_occurrences_test.dart' as notification_occurrences_test;
 import 'notification_outline_test.dart' as notification_outline_test;
 import 'notification_overrides_test.dart' as notification_overrides_test;
+import 'update_content_test.dart' as update_content_test;
 
 /**
  * Utility for manually running all tests.
@@ -28,5 +29,6 @@
     notification_occurrences_test.main();
     notification_outline_test.main();
     notification_overrides_test.main();
+    update_content_test.main();
   });
 }
diff --git a/pkg/analysis_server/test/analysis/update_content_test.dart b/pkg/analysis_server/test/analysis/update_content_test.dart
new file mode 100644
index 0000000..1fbcaa3
--- /dev/null
+++ b/pkg/analysis_server/test/analysis/update_content_test.dart
@@ -0,0 +1,90 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 test.analysis.updateContent;
+
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:unittest/unittest.dart';
+
+import '../analysis_abstract.dart';
+import '../reflective_tests.dart';
+
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(UpdateContentTest);
+}
+
+
+@reflectiveTest
+class UpdateContentTest extends AbstractAnalysisTest {
+  Map<String, List<AnalysisError>> filesErrors = {};
+
+  @override
+  void processNotification(Notification notification) {
+    if (notification.event == ANALYSIS_ERRORS) {
+      var decoded = new AnalysisErrorsParams.fromNotification(notification);
+      filesErrors[decoded.file] = decoded.errors;
+    }
+  }
+
+  test_illegal_ChangeContentOverlay() {
+    // It should be illegal to send a ChangeContentOverlay for a file that
+    // doesn't have an overlay yet.
+    createProject();
+    addTestFile('library foo;');
+    String id = 'myId';
+    try {
+      server.updateContent(id, {
+        testFile: new ChangeContentOverlay([new SourceEdit(8, 3, 'bar')])
+      });
+      fail('Expected an exception to be thrown');
+    } on RequestFailure catch (e) {
+      expect(e.response.id, id);
+      expect(e.response.error.code, RequestErrorCode.INVALID_OVERLAY_CHANGE);
+    }
+  }
+
+  test_multiple_contexts() {
+    String fooPath = '/project1/foo.dart';
+    resourceProvider.newFile(fooPath, '''
+library foo;
+import '../project2/baz.dart';
+main() { f(); }''');
+    String barPath = '/project2/bar.dart';
+    resourceProvider.newFile(barPath, '''
+library bar;
+import 'baz.dart';
+main() { f(); }''');
+    String bazPath = '/project2/baz.dart';
+    resourceProvider.newFile(bazPath, '''
+library baz;
+f(int i) {}
+''');
+    Request request = new AnalysisSetAnalysisRootsParams(
+        ['/project1', '/project2'],
+        []).toRequest('0');
+    handleSuccessfulRequest(request);
+    return waitForTasksFinished().then((_) {
+      // Files foo.dart and bar.dart should both have errors, since they both
+      // call f() with the wrong number of arguments.
+      expect(filesErrors[fooPath], hasLength(1));
+      expect(filesErrors[barPath], hasLength(1));
+      // Overlay the content of baz.dart to eliminate the errors.
+      server.updateContent('1', {
+        bazPath: new AddContentOverlay('''
+library baz;
+f() {}
+''')
+      });
+      return waitForTasksFinished();
+    }).then((_) {
+      // The overlay should have been propagated to both contexts, causing both
+      // foo.dart and bar.dart to be reanalyzed and found to be free of errors.
+      expect(filesErrors[fooPath], isEmpty);
+      expect(filesErrors[barPath], isEmpty);
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/analysis_abstract.dart b/pkg/analysis_server/test/analysis_abstract.dart
index 3cf7602..b167e77 100644
--- a/pkg/analysis_server/test/analysis_abstract.dart
+++ b/pkg/analysis_server/test/analysis_abstract.dart
@@ -258,10 +258,9 @@
   }
 
   /**
-   * Returns a [Future] that completes when the [AnalysisServer] finishes
-   * all its scheduled tasks.
+   * Returns a [Future] that completes when the server's analysis is complete.
    */
   Future waitForTasksFinished() {
-    return waitForServerOperationsPerformed(server);
+    return server.onAnalysisComplete;
   }
 }
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index 7eb7e6a..528324a 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -284,6 +284,7 @@
     notice.setErrors([], new LineInfo([0]));
     AnalysisResult firstResult = new AnalysisResult([notice], 0, '', 0);
     AnalysisResult lastResult = new AnalysisResult(null, 1, '', 1);
+    when(context.analysisOptions).thenReturn(new AnalysisOptionsImpl());
     when(
         context.performAnalysisTask).thenReturnList(
             [firstResult, firstResult, firstResult, lastResult]);
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index 651fd72..530393f 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -68,7 +68,7 @@
           expect(response, isResponseSuccess('0'));
           // unit "a" is resolved eventually
           // unit "b" is not resolved
-          return waitForServerOperationsPerformed(server).then((_) {
+          return server.onAnalysisComplete.then((_) {
             expect(serverRef.getResolvedCompilationUnits(fileA), hasLength(1));
             expect(serverRef.getResolvedCompilationUnits(fileB), isEmpty);
           });
@@ -84,7 +84,7 @@
           var serverRef = server;
           expect(response, isResponseSuccess('0'));
           // verify that unit is resolved eventually
-          return waitForServerOperationsPerformed(server).then((_) {
+          return server.onAnalysisComplete.then((_) {
             var units = serverRef.getResolvedCompilationUnits(file);
             expect(units, hasLength(1));
           });
@@ -163,7 +163,7 @@
     // create project
     helper.createSingleFileProject('int V = 42;');
     // wait, there are highlight regions
-    helper.waitForOperationsFinished().then((_) {
+    helper.onAnalysisComplete.then((_) {
       var highlights = helper.getHighlights(helper.testFile);
       expect(highlights, isNotEmpty);
     });
@@ -174,13 +174,13 @@
     // create project
     helper.createSingleFileProject('int V = 42;');
     // wait, no regions initially
-    return helper.waitForOperationsFinished().then((_) {
+    return helper.onAnalysisComplete.then((_) {
       var highlights = helper.getHighlights(helper.testFile);
       expect(highlights, isEmpty);
       // subscribe
       helper.addAnalysisSubscriptionHighlights(helper.testFile);
       // wait, has regions
-      return helper.waitForOperationsFinished().then((_) {
+      return helper.onAnalysisComplete.then((_) {
         var highlights = helper.getHighlights(helper.testFile);
         expect(highlights, isNotEmpty);
       });
@@ -190,10 +190,10 @@
   test('after analysis, no such file', () {
     AnalysisTestHelper helper = new AnalysisTestHelper();
     helper.createSingleFileProject('int V = 42;');
-    return helper.waitForOperationsFinished().then((_) {
+    return helper.onAnalysisComplete.then((_) {
       String noFile = '/no-such-file.dart';
       helper.addAnalysisSubscriptionHighlights(noFile);
-      return helper.waitForOperationsFinished().then((_) {
+      return helper.onAnalysisComplete.then((_) {
         var highlights = helper.getHighlights(noFile);
         expect(highlights, isEmpty);
       });
@@ -207,10 +207,10 @@
   print(42);
 }
 ''');
-    return helper.waitForOperationsFinished().then((_) {
+    return helper.onAnalysisComplete.then((_) {
       String file = '/lib/core/core.dart';
       helper.addAnalysisSubscriptionNavigation(file);
-      return helper.waitForOperationsFinished().then((_) {
+      return helper.onAnalysisComplete.then((_) {
         var navigationRegions = helper.getNavigation(file);
         expect(navigationRegions, isNotEmpty);
       });
@@ -223,7 +223,7 @@
   test('bad type', () {
     AnalysisTestHelper helper = new AnalysisTestHelper();
     helper.createSingleFileProject('// empty');
-    return helper.waitForOperationsFinished().then((_) {
+    return helper.onAnalysisComplete.then((_) {
       Request request = new Request('0', ANALYSIS_UPDATE_CONTENT, {
         'files': {
           helper.testFile: {
@@ -239,14 +239,14 @@
   test('full content', () {
     AnalysisTestHelper helper = new AnalysisTestHelper();
     helper.createSingleFileProject('// empty');
-    return helper.waitForOperationsFinished().then((_) {
+    return helper.onAnalysisComplete.then((_) {
       // no errors initially
       List<AnalysisError> errors = helper.getTestErrors();
       expect(errors, isEmpty);
       // update code
       helper.sendContentChange(new AddContentOverlay('library lib'));
       // wait, there is an error
-      return helper.waitForOperationsFinished().then((_) {
+      return helper.onAnalysisComplete.then((_) {
         List<AnalysisError> errors = helper.getTestErrors();
         expect(errors, hasLength(1));
       });
@@ -257,7 +257,7 @@
     AnalysisTestHelper helper = new AnalysisTestHelper();
     String initialContent = 'library A;';
     helper.createSingleFileProject(initialContent);
-    return helper.waitForOperationsFinished().then((_) {
+    return helper.onAnalysisComplete.then((_) {
       // no errors initially
       List<AnalysisError> errors = helper.getTestErrors();
       expect(errors, isEmpty);
@@ -268,7 +268,7 @@
           new ChangeContentOverlay(
               [new SourceEdit('library '.length, 'A;'.length, 'lib')]));
       // wait, there is an error
-      return helper.waitForOperationsFinished().then((_) {
+      return helper.onAnalysisComplete.then((_) {
         List<AnalysisError> errors = helper.getTestErrors();
         expect(errors, hasLength(1));
       });
@@ -278,14 +278,14 @@
   test('change on disk, normal', () {
     AnalysisTestHelper helper = new AnalysisTestHelper();
     helper.createSingleFileProject('library A;');
-    return helper.waitForOperationsFinished().then((_) {
+    return helper.onAnalysisComplete.then((_) {
       // There should be no errors
       expect(helper.getTestErrors(), hasLength(0));
       // Change file on disk, adding a syntax error.
       helper.resourceProvider.modifyFile(helper.testFile, 'library lib');
       // There should be errors now.
       return pumpEventQueue().then((_) {
-        return helper.waitForOperationsFinished().then((_) {
+        return helper.onAnalysisComplete.then((_) {
           expect(helper.getTestErrors(), hasLength(1));
         });
       });
@@ -295,22 +295,22 @@
   test('change on disk, during override', () {
     AnalysisTestHelper helper = new AnalysisTestHelper();
     helper.createSingleFileProject('library A;');
-    return helper.waitForOperationsFinished().then((_) {
+    return helper.onAnalysisComplete.then((_) {
       // update code
       helper.sendContentChange(new AddContentOverlay('library B;'));
       // There should be no errors
-      return helper.waitForOperationsFinished().then((_) {
+      return helper.onAnalysisComplete.then((_) {
         expect(helper.getTestErrors(), hasLength(0));
         // Change file on disk, adding a syntax error.
         helper.resourceProvider.modifyFile(helper.testFile, 'library lib');
         // There should still be no errors (file should not have been reread).
-        return helper.waitForOperationsFinished().then((_) {
+        return helper.onAnalysisComplete.then((_) {
           expect(helper.getTestErrors(), hasLength(0));
           // Send a content change with a null content param--file should be
           // reread from disk.
           helper.sendContentChange(new RemoveContentOverlay());
           // There should be errors now.
-          return helper.waitForOperationsFinished().then((_) {
+          return helper.onAnalysisComplete.then((_) {
             expect(helper.getTestErrors(), hasLength(1));
           });
         });
@@ -322,9 +322,9 @@
     Future outOfRangeTest(SourceEdit edit) {
       AnalysisTestHelper helper = new AnalysisTestHelper();
       helper.createSingleFileProject('library A;');
-      return helper.waitForOperationsFinished().then((_) {
+      return helper.onAnalysisComplete.then((_) {
         helper.sendContentChange(new AddContentOverlay('library B;'));
-        return helper.waitForOperationsFinished().then((_) {
+        return helper.onAnalysisComplete.then((_) {
           ChangeContentOverlay contentChange = new ChangeContentOverlay([edit]);
           Request request = new AnalysisUpdateContentParams({
             helper.testFile: contentChange
@@ -473,6 +473,13 @@
     });
   }
 
+  /**
+   * Returns a [Future] that completes when the server's analysis is complete.
+   */
+  Future get onAnalysisComplete {
+    return server.onAnalysisComplete;
+  }
+
   void addAnalysisSubscription(AnalysisService service, String file) {
     // add file to subscription
     var files = analysisSubscriptions[service];
@@ -618,14 +625,6 @@
     server.done();
   }
 
-  /**
-   * Returns a [Future] that completes when this this helper finished all its
-   * scheduled tasks.
-   */
-  Future waitForOperationsFinished() {
-    return waitForServerOperationsPerformed(server);
-  }
-
   static String _getCodeString(code) {
     if (code is List<String>) {
       code = code.join('\n');
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index f6650cf..ded3d0d 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -547,6 +547,11 @@
   @override
   Stream<SourcesChangedEvent> get onSourcesChanged => mockStream;
 
+  @override
+  TimestampedData<String> getContents(Source source) {
+    return source.contents;
+  }
+
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
 
diff --git a/pkg/analysis_server/test/domain_execution_test.dart b/pkg/analysis_server/test/domain_execution_test.dart
index dc912de..fd63c42 100644
--- a/pkg/analysis_server/test/domain_execution_test.dart
+++ b/pkg/analysis_server/test/domain_execution_test.dart
@@ -196,7 +196,6 @@
       AnalysisServer server = new AnalysisServerMock();
       when(server.getAnalysisContexts()).thenReturn([context]);
       when(server.contextDirectoryManager).thenReturn(manager);
-      when(server.isAnalysisComplete()).thenReturn(false);
 
       StreamController controller = new StreamController.broadcast(sync: true);
       when(server.onFileAnalyzed).thenReturn(controller.stream);
diff --git a/pkg/analysis_server/test/integration/asynchrony_test.dart b/pkg/analysis_server/test/integration/asynchrony_test.dart
index ad4cd07..238b586 100644
--- a/pkg/analysis_server/test/integration/asynchrony_test.dart
+++ b/pkg/analysis_server/test/integration/asynchrony_test.dart
@@ -12,7 +12,7 @@
 import 'integration_tests.dart';
 
 main() {
-  runReflectiveTests(AsynchronyIntegrationTest);
+//  runReflectiveTests(AsynchronyIntegrationTest);
 }
 
 /**
@@ -23,6 +23,12 @@
  *
  * Once enough commands have been sent, we begin reading from the server's
  * output buffer, and verify that it responds to the last command.
+ *
+ * NB.
+ *
+ * This test was intentionally disabled, because after r43123 server
+ * writes to stdout synchronously. So, now it is the client's responsibility
+ * to read stdout in a timely manner to avoid blocking the server.
  */
 @reflectiveTest
 class AsynchronyIntegrationTest {
diff --git a/pkg/analysis_server/test/integration/integration_test_methods.dart b/pkg/analysis_server/test/integration/integration_test_methods.dart
index db72218..2158ed6 100644
--- a/pkg/analysis_server/test/integration/integration_test_methods.dart
+++ b/pkg/analysis_server/test/integration/integration_test_methods.dart
@@ -231,6 +231,25 @@
   }
 
   /**
+   * Return a list of all of the libraries referenced by any files in existing
+   * analysis roots.
+   *
+   * Returns
+   *
+   * libraries ( List<FilePath> )
+   *
+   *   A list of the paths of library elements referenced by files in existing
+   *   analysis roots.
+   */
+  Future<AnalysisGetLibraryDependenciesResult> sendAnalysisGetLibraryDependencies() {
+    return server.send("analysis.getLibraryDependencies", null)
+        .then((result) {
+      ResponseDecoder decoder = new ResponseDecoder(null);
+      return new AnalysisGetLibraryDependenciesResult.fromJson(decoder, 'result', result);
+    });
+  }
+
+  /**
    * Return the navigation information associated with the given region of the
    * given file. If the navigation information for the given file has not yet
    * been computed, or the most recently computed navigation information for
@@ -449,13 +468,15 @@
    *
    *   A table mapping the files whose content has changed to a description of
    *   the content change.
+   *
+   * Returns
    */
-  Future sendAnalysisUpdateContent(Map<String, dynamic> files) {
+  Future<AnalysisUpdateContentResult> sendAnalysisUpdateContent(Map<String, dynamic> files) {
     var params = new AnalysisUpdateContentParams(files).toJson();
     return server.send("analysis.updateContent", params)
         .then((result) {
-      expect(result, isNull);
-      return null;
+      ResponseDecoder decoder = new ResponseDecoder(null);
+      return new AnalysisUpdateContentResult.fromJson(decoder, 'result', result);
     });
   }
 
diff --git a/pkg/analysis_server/test/integration/protocol_matchers.dart b/pkg/analysis_server/test/integration/protocol_matchers.dart
index 32970af3..d426e9c 100644
--- a/pkg/analysis_server/test/integration/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/protocol_matchers.dart
@@ -146,6 +146,23 @@
   }));
 
 /**
+ * analysis.getLibraryDependencies params
+ */
+final Matcher isAnalysisGetLibraryDependenciesParams = isNull;
+
+/**
+ * analysis.getLibraryDependencies result
+ *
+ * {
+ *   "libraries": List<FilePath>
+ * }
+ */
+final Matcher isAnalysisGetLibraryDependenciesResult = new LazyMatcher(() => new MatchesJsonObject(
+  "analysis.getLibraryDependencies result", {
+    "libraries": isListOf(isFilePath)
+  }));
+
+/**
  * analysis.getNavigation params
  *
  * {
@@ -257,8 +274,12 @@
 
 /**
  * analysis.updateContent result
+ *
+ * {
+ * }
  */
-final Matcher isAnalysisUpdateContentResult = isNull;
+final Matcher isAnalysisUpdateContentResult = new LazyMatcher(() => new MatchesJsonObject(
+  "analysis.updateContent result", null));
 
 /**
  * analysis.updateOptions params
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index 49c2d03..c017c63 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -58,7 +58,7 @@
  * times. By default, this should pump the event queue enough times to allow
  * any code to run, as long as it's not waiting on some external event.
  */
-Future pumpEventQueue([int times = 20]) {
+Future pumpEventQueue([int times = 50]) {
   if (times == 0) return new Future.value();
   // We use a delayed future to allow microtask events to finish. The
   // Future.value or Future() constructors use scheduleMicrotask themselves and
@@ -67,23 +67,6 @@
   return new Future.delayed(Duration.ZERO, () => pumpEventQueue(times - 1));
 }
 
-/**
- * Returns a [Future] that completes when the given [AnalysisServer] finished
- * all its scheduled tasks.
- */
-Future waitForServerOperationsPerformed(AnalysisServer server) {
-  if (server.isAnalysisComplete()) {
-    return new Future.value();
-  }
-  // We use a delayed future to allow microtask events to finish. The
-  // Future.value or Future() constructors use scheduleMicrotask themselves and
-  // would therefore not wait for microtask callbacks that are scheduled after
-  // invoking this method.
-  return new Future.delayed(
-      Duration.ZERO,
-      () => waitForServerOperationsPerformed(server));
-}
-
 typedef void MockServerOperationPerformFunction(AnalysisServer server);
 
 class MockAnalysisContext extends StringTypedMock implements AnalysisContext {
@@ -324,14 +307,6 @@
 
   @override
   void perform(AnalysisServer server) => this._perform(server);
-
-  @override
-  void sendNotices(AnalysisServer server, List<ChangeNotice> notices) {
-  }
-
-  @override
-  void updateIndex(AnalysisServer server, List<ChangeNotice> notices) {
-  }
 }
 
 
diff --git a/pkg/analysis_server/test/operation/operation_queue_test.dart b/pkg/analysis_server/test/operation/operation_queue_test.dart
index 66083e7..0a4f13e 100644
--- a/pkg/analysis_server/test/operation/operation_queue_test.dart
+++ b/pkg/analysis_server/test/operation/operation_queue_test.dart
@@ -11,22 +11,22 @@
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:typed_mock/typed_mock.dart';
 import 'package:unittest/unittest.dart';
+import '../mocks.dart';
+import 'package:analyzer/src/generated/source.dart';
 
 main() {
   groupSep = ' | ';
 
   group('ServerOperationQueue', () {
-    AnalysisServer server;
     ServerOperationQueue queue;
 
     setUp(() {
-      server = new AnalysisServerMock();
-      queue = new ServerOperationQueue(server);
+      queue = new ServerOperationQueue();
     });
 
     test('clear', () {
-      var operationA = mockOperation(ServerOperationPriority.SEARCH);
-      var operationB = mockOperation(ServerOperationPriority.REFACTORING);
+      var operationA = mockOperation(ServerOperationPriority.ANALYSIS);
+      var operationB = mockOperation(ServerOperationPriority.ANALYSIS_CONTINUE);
       queue.add(operationA);
       queue.add(operationB);
       // there are some operations
@@ -42,7 +42,7 @@
       });
 
       test('false', () {
-        var operation = mockOperation(ServerOperationPriority.SEARCH);
+        var operation = mockOperation(ServerOperationPriority.ANALYSIS);
         queue.add(operation);
         expect(queue.isEmpty, isFalse);
       });
@@ -54,22 +54,21 @@
       });
 
       test('use operation priorities', () {
-        when(server.isPriorityContext(anyObject)).thenReturn(false);
-        var analysisContext = new AnalysisContextMock();
-        var operationA = mockOperation(ServerOperationPriority.SEARCH);
-        var operationB = mockOperation(ServerOperationPriority.REFACTORING);
-        var operationC = new PerformAnalysisOperation(analysisContext, false);
+        var operationA = mockOperation(ServerOperationPriority.ANALYSIS);
+        var operationB =
+            mockOperation(ServerOperationPriority.ANALYSIS_CONTINUE);
+        var operationC =
+            mockOperation(ServerOperationPriority.PRIORITY_ANALYSIS);
         queue.add(operationA);
         queue.add(operationB);
         queue.add(operationC);
         expect(queue.take(), operationC);
-        expect(queue.take(), operationA);
         expect(queue.take(), operationB);
+        expect(queue.take(), operationA);
         expect(queue.take(), isNull);
       });
 
       test('continue analysis first', () {
-        when(server.isPriorityContext(anyObject)).thenReturn(false);
         var analysisContext = new AnalysisContextMock();
         var operationA = new PerformAnalysisOperation(analysisContext, false);
         var operationB = new PerformAnalysisOperation(analysisContext, true);
@@ -81,14 +80,31 @@
       });
 
       test('priority context first', () {
+        var prioritySource = new MockSource();
+        var analysisContextA = new AnalysisContextMock();
+        var analysisContextB = new AnalysisContextMock();
+        analysisContextB.prioritySources = [prioritySource];
+        var operationA = new PerformAnalysisOperation(analysisContextA, false);
+        var operationB = new PerformAnalysisOperation(analysisContextB, false);
+        queue.add(operationA);
+        queue.add(operationB);
+        expect(queue.take(), operationB);
+        expect(queue.take(), operationA);
+        expect(queue.take(), isNull);
+      });
+
+      test('reschedule', () {
+        var prioritySource = new MockSource();
         var analysisContextA = new AnalysisContextMock();
         var analysisContextB = new AnalysisContextMock();
         var operationA = new PerformAnalysisOperation(analysisContextA, false);
         var operationB = new PerformAnalysisOperation(analysisContextB, false);
         queue.add(operationA);
         queue.add(operationB);
-        when(server.isPriorityContext(analysisContextA)).thenReturn(false);
-        when(server.isPriorityContext(analysisContextB)).thenReturn(true);
+        // update priority sources and reschedule
+        analysisContextB.prioritySources = [prioritySource];
+        queue.reschedule();
+        // verify order
         expect(queue.take(), operationB);
         expect(queue.take(), operationA);
         expect(queue.take(), isNull);
@@ -108,7 +124,9 @@
 }
 
 
-class AnalysisContextMock extends TypedMock implements AnalysisContext {
+class AnalysisContextMock extends TypedMock implements InternalAnalysisContext {
+  List<Source> prioritySources = <Source>[];
+
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
 
diff --git a/pkg/analysis_server/test/operation/operation_test.dart b/pkg/analysis_server/test/operation/operation_test.dart
index 4797ded..f9639fe 100644
--- a/pkg/analysis_server/test/operation/operation_test.dart
+++ b/pkg/analysis_server/test/operation/operation_test.dart
@@ -12,7 +12,7 @@
 
   group('ServerOperationPriority', () {
     test('toString', () {
-      expect(ServerOperationPriority.SEARCH.toString(), 'SEARCH');
+      expect(ServerOperationPriority.ANALYSIS.toString(), 'ANALYSIS');
     });
   });
 }
diff --git a/pkg/analysis_server/test/protocol_test.dart b/pkg/analysis_server/test/protocol_test.dart
index e4bcb21..bc4016e 100644
--- a/pkg/analysis_server/test/protocol_test.dart
+++ b/pkg/analysis_server/test/protocol_test.dart
@@ -149,6 +149,7 @@
     Request request = new Request.fromString(json);
     expect(request.id, equals('one'));
     expect(request.method, equals('aMethod'));
+    expect(request.clientRequestTime, isNull);
   }
 
   void test_fromJson_invalidId() {
@@ -171,6 +172,25 @@
     expect(request, isNull);
   }
 
+  void test_fromJson_withBadClientTime() {
+    Request original = new Request('one', 'aMethod', null, 347);
+    Map<String, Object> map = original.toJson();
+    // Insert bad value - should be int but client sent string instead
+    map[Request.CLIENT_REQUEST_TIME] = '347';
+    String json = JSON.encode(map);
+    Request request = new Request.fromString(json);
+    expect(request, isNull);
+  }
+
+  void test_fromJson_withClientTime() {
+    Request original = new Request('one', 'aMethod', null, 347);
+    String json = JSON.encode(original.toJson());
+    Request request = new Request.fromString(json);
+    expect(request.id, equals('one'));
+    expect(request.method, equals('aMethod'));
+    expect(request.clientRequestTime, 347);
+  }
+
   void test_fromJson_withParams() {
     Request original = new Request('one', 'aMethod', {
       'foo': 'bar'
@@ -223,8 +243,7 @@
   }
 
   void test_create_unanalyzedPriorityFiles() {
-    Response response =
-        new Response.unanalyzedPriorityFiles('0', 'file list');
+    Response response = new Response.unanalyzedPriorityFiles('0', 'file list');
     expect(response.id, equals('0'));
     expect(response.error, isNotNull);
     expect(response.toJson(), equals({
diff --git a/pkg/analysis_server/test/services/completion/combinator_computer_test.dart b/pkg/analysis_server/test/services/completion/combinator_computer_test.dart
index 281a5fa..e07cae5 100644
--- a/pkg/analysis_server/test/services/completion/combinator_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/combinator_computer_test.dart
@@ -62,16 +62,16 @@
     return computeFull((bool result) {
       assertSuggestClass(
           'A',
-          COMPLETION_RELEVANCE_DEFAULT,
-          CompletionSuggestionKind.IDENTIFIER);
+          relevance: COMPLETION_RELEVANCE_DEFAULT,
+          kind: CompletionSuggestionKind.IDENTIFIER);
       assertSuggestClass(
           'B',
-          COMPLETION_RELEVANCE_DEFAULT,
-          CompletionSuggestionKind.IDENTIFIER);
+          relevance: COMPLETION_RELEVANCE_DEFAULT,
+          kind: CompletionSuggestionKind.IDENTIFIER);
       assertSuggestClass(
           'PB',
-          COMPLETION_RELEVANCE_DEFAULT,
-          CompletionSuggestionKind.IDENTIFIER);
+          relevance: COMPLETION_RELEVANCE_DEFAULT,
+          kind: CompletionSuggestionKind.IDENTIFIER);
       assertSuggestTopLevelVar(
           'T1',
           null,
@@ -115,16 +115,16 @@
     return computeFull((bool result) {
       assertSuggestClass(
           'A',
-          COMPLETION_RELEVANCE_DEFAULT,
-          CompletionSuggestionKind.IDENTIFIER);
+          relevance: COMPLETION_RELEVANCE_DEFAULT,
+          kind: CompletionSuggestionKind.IDENTIFIER);
       assertSuggestClass(
           'B',
-          COMPLETION_RELEVANCE_DEFAULT,
-          CompletionSuggestionKind.IDENTIFIER);
+          relevance: COMPLETION_RELEVANCE_DEFAULT,
+          kind: CompletionSuggestionKind.IDENTIFIER);
       assertSuggestClass(
           'PB',
-          COMPLETION_RELEVANCE_DEFAULT,
-          CompletionSuggestionKind.IDENTIFIER);
+          relevance: COMPLETION_RELEVANCE_DEFAULT,
+          kind: CompletionSuggestionKind.IDENTIFIER);
       assertSuggestTopLevelVar(
           'T1',
           null,
@@ -138,8 +138,8 @@
           CompletionSuggestionKind.IDENTIFIER);
       assertSuggestClass(
           'Clz',
-          COMPLETION_RELEVANCE_DEFAULT,
-          CompletionSuggestionKind.IDENTIFIER);
+          relevance: COMPLETION_RELEVANCE_DEFAULT,
+          kind: CompletionSuggestionKind.IDENTIFIER);
       assertSuggestFunctionTypeAlias(
           'F2',
           null,
diff --git a/pkg/analysis_server/test/services/completion/completion_test_util.dart b/pkg/analysis_server/test/services/completion/completion_test_util.dart
index a6ce671..6f14dc2 100644
--- a/pkg/analysis_server/test/services/completion/completion_test_util.dart
+++ b/pkg/analysis_server/test/services/completion/completion_test_util.dart
@@ -78,6 +78,16 @@
     expect(suggestion.hasNamedParameters, isNull);
   }
 
+  void assertHasParameterInfo(CompletionSuggestion suggestion) {
+    expect(suggestion.parameterNames, isNotNull);
+    expect(suggestion.parameterTypes, isNotNull);
+    expect(suggestion.parameterNames.length, suggestion.parameterTypes.length);
+    expect(
+        suggestion.requiredParameterCount,
+        lessThanOrEqualTo(suggestion.parameterNames.length));
+    expect(suggestion.hasNamedParameters, isNotNull);
+  }
+
   void assertNoSuggestions({CompletionSuggestionKind kind: null}) {
     if (kind == null) {
       if (request.suggestions.length > 0) {
@@ -170,17 +180,21 @@
     fail(msg.toString());
   }
 
-  CompletionSuggestion assertSuggestClass(String name, [int relevance =
-      COMPLETION_RELEVANCE_DEFAULT, CompletionSuggestionKind kind =
-      CompletionSuggestionKind.INVOCATION]) {
-    CompletionSuggestion cs =
-        assertSuggest(name, csKind: kind, relevance: relevance);
+  CompletionSuggestion assertSuggestClass(String name, {int relevance:
+      COMPLETION_RELEVANCE_DEFAULT, CompletionSuggestionKind kind:
+      CompletionSuggestionKind.INVOCATION, bool isDeprecated: false}) {
+    CompletionSuggestion cs = assertSuggest(
+        name,
+        csKind: kind,
+        relevance: relevance,
+        isDeprecated: isDeprecated);
     protocol.Element element = cs.element;
     expect(element, isNotNull);
     expect(element.kind, equals(protocol.ElementKind.CLASS));
     expect(element.name, equals(name));
     expect(element.parameters, isNull);
     expect(element.returnType, isNull);
+    assertHasNoParameterInfo(cs);
     return cs;
   }
 
@@ -195,6 +209,7 @@
     expect(element.name, equals(name));
     expect(element.parameters, isNull);
     expect(element.returnType, isNull);
+    assertHasNoParameterInfo(cs);
     return cs;
   }
 
@@ -216,6 +231,7 @@
     expect(element.parameters, isNull);
     // The returnType represents the type of a field
     expect(element.returnType, type != null ? type : 'dynamic');
+    assertHasNoParameterInfo(cs);
     return cs;
   }
 
@@ -240,6 +256,7 @@
     expect(
         element.returnType,
         equals(returnType != null ? returnType : 'dynamic'));
+    assertHasParameterInfo(cs);
     return cs;
   }
 
@@ -263,10 +280,11 @@
 //    expect(param, isNotNull);
 //    expect(param[0], equals('('));
 //    expect(param[param.length - 1], equals(')'));
-    // TODO (danrubel) Determine why return type is null
-//    expect(
-//        element.returnType,
-//        equals(returnType != null ? returnType : 'dynamic'));
+    expect(
+        element.returnType,
+        equals(returnType != null ? returnType : 'dynamic'));
+    // TODO (danrubel) Determine why param info is missing
+//    assertHasParameterInfo(cs);
     return cs;
   }
 
@@ -284,12 +302,11 @@
     expect(element, isNotNull);
     expect(element.kind, equals(protocol.ElementKind.GETTER));
     expect(element.name, equals(name));
-    //TODO (danrubel) getter should have parameters
-    // but not used in code completion
-    //expect(element.parameters, '()');
+    expect(element.parameters, isNull);
     expect(
         element.returnType,
         equals(returnType != null ? returnType : 'dynamic'));
+    assertHasNoParameterInfo(cs);
     return cs;
   }
 
@@ -306,6 +323,7 @@
     expect(element.name, equals(name));
     expect(element.parameters, isNull);
     expect(element.returnType, isNull);
+    assertHasNoParameterInfo(cs);
     return cs;
   }
 
@@ -321,6 +339,7 @@
       expect(element.kind, equals(protocol.ElementKind.LIBRARY));
       expect(element.parameters, isNull);
       expect(element.returnType, isNull);
+      assertHasNoParameterInfo(cs);
       return cs;
     } else {
       return assertNotSuggested(prefix);
@@ -341,6 +360,7 @@
       expect(element.name, equals(name));
       expect(element.parameters, isNull);
       expect(element.returnType, returnType != null ? returnType : 'dynamic');
+      assertHasNoParameterInfo(cs);
       return cs;
     } else {
       return assertNotSuggested(name);
@@ -348,10 +368,14 @@
   }
 
   CompletionSuggestion assertSuggestMethod(String name, String declaringType,
-      String returnType, [int relevance = COMPLETION_RELEVANCE_DEFAULT,
-      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
-    CompletionSuggestion cs =
-        assertSuggest(name, csKind: kind, relevance: relevance);
+      String returnType, {int relevance: COMPLETION_RELEVANCE_DEFAULT,
+      CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
+      bool isDeprecated: false}) {
+    CompletionSuggestion cs = assertSuggest(
+        name,
+        csKind: kind,
+        relevance: relevance,
+        isDeprecated: isDeprecated);
     expect(cs.declaringType, equals(declaringType));
     expect(cs.returnType, returnType != null ? returnType : 'dynamic');
     protocol.Element element = cs.element;
@@ -363,6 +387,7 @@
     expect(param[0], equals('('));
     expect(param[param.length - 1], equals(')'));
     expect(element.returnType, returnType != null ? returnType : 'dynamic');
+    assertHasParameterInfo(cs);
     return cs;
   }
 
@@ -381,6 +406,7 @@
       expect(param[0], equals('('));
       expect(param[param.length - 1], equals(')'));
       expect(element.returnType, equals(returnType));
+      assertHasParameterInfo(cs);
       return cs;
     } else {
       return assertNotSuggested(name);
@@ -427,6 +453,7 @@
     if (element.returnType != null) {
       expect(element.returnType, 'dynamic');
     }
+    assertHasNoParameterInfo(cs);
     return cs;
   }
 
@@ -442,6 +469,7 @@
     expect(element.name, equals(name));
     expect(element.parameters, isNull);
     expect(element.returnType, returnType != null ? returnType : 'dynamic');
+    assertHasNoParameterInfo(cs);
     return cs;
   }
 
@@ -486,7 +514,7 @@
 
       // Update the index
       result.changeNotices.forEach((ChangeNotice notice) {
-        CompilationUnit unit = notice.compilationUnit;
+        CompilationUnit unit = notice.resolvedDartUnit;
         if (unit != null) {
           index.indexUnit(context, unit);
         }
@@ -607,7 +635,11 @@
       String declaringType, String returnType, [int relevance =
       COMPLETION_RELEVANCE_DEFAULT]) {
     if (computer is LocalComputer) {
-      return assertSuggestMethod(name, declaringType, returnType, relevance);
+      return assertSuggestMethod(
+          name,
+          declaringType,
+          returnType,
+          relevance: relevance);
     } else {
       return assertNotSuggested(name);
     }
@@ -617,7 +649,7 @@
       COMPLETION_RELEVANCE_DEFAULT, CompletionSuggestionKind kind =
       CompletionSuggestionKind.INVOCATION]) {
     if (computer is ImportedComputer) {
-      return assertSuggestClass(name, relevance, kind);
+      return assertSuggestClass(name, relevance: relevance, kind: kind);
     } else {
       return assertNotSuggested(name);
     }
@@ -673,7 +705,11 @@
       String declaringType, String returnType, [int relevance =
       COMPLETION_RELEVANCE_DEFAULT]) {
     if (computer is ImportedComputer) {
-      return assertSuggestMethod(name, declaringType, returnType, relevance);
+      return assertSuggestMethod(
+          name,
+          declaringType,
+          returnType,
+          relevance: relevance);
     } else {
       return assertNotSuggested(name);
     }
@@ -701,7 +737,7 @@
   CompletionSuggestion assertSuggestInvocationClass(String name, [int relevance
       = COMPLETION_RELEVANCE_DEFAULT]) {
     if (computer is InvocationComputer) {
-      return assertSuggestClass(name, relevance);
+      return assertSuggestClass(name, relevance: relevance);
     } else {
       return assertNotSuggested(name);
     }
@@ -730,7 +766,11 @@
       String declaringType, String returnType, [int relevance =
       COMPLETION_RELEVANCE_DEFAULT]) {
     if (computer is InvocationComputer) {
-      return assertSuggestMethod(name, declaringType, returnType, relevance);
+      return assertSuggestMethod(
+          name,
+          declaringType,
+          returnType,
+          relevance: relevance);
     } else {
       return assertNotSuggested(name);
     }
@@ -754,13 +794,9 @@
     }
   }
 
-  CompletionSuggestion assertSuggestLocalClass(String name, [int relevance =
-      COMPLETION_RELEVANCE_DEFAULT]) {
-    if (computer is LocalComputer) {
-      return assertSuggestClass(name, relevance);
-    } else {
-      return assertNotSuggested(name);
-    }
+  CompletionSuggestion assertSuggestLocalClass(String name, {int relevance:
+      COMPLETION_RELEVANCE_DEFAULT, bool isDeprecated: false}) {
+    return assertNotSuggested(name);
   }
 
   CompletionSuggestion assertSuggestLocalClassTypeAlias(String name,
@@ -773,7 +809,7 @@
   }
 
   CompletionSuggestion assertSuggestLocalField(String name, String type,
-      [int relevance = COMPLETION_RELEVANCE_DEFAULT]) {
+      {int relevance: COMPLETION_RELEVANCE_DEFAULT, bool isDeprecated: false}) {
     return assertNotSuggested(name);
   }
 
@@ -802,22 +838,14 @@
   }
 
   CompletionSuggestion assertSuggestLocalGetter(String name, String returnType,
-      [int relevance = COMPLETION_RELEVANCE_DEFAULT]) {
-    if (computer is LocalComputer) {
-      return assertSuggestGetter(name, returnType, relevance: relevance);
-    } else {
-      return assertNotSuggested(name);
-    }
+      {int relevance: COMPLETION_RELEVANCE_DEFAULT, bool isDeprecated: false}) {
+    return assertNotSuggested(name);
   }
 
   CompletionSuggestion assertSuggestLocalMethod(String name,
-      String declaringType, String returnType, [int relevance =
-      COMPLETION_RELEVANCE_DEFAULT]) {
-    if (computer is LocalComputer) {
-      return assertSuggestMethod(name, declaringType, returnType, relevance);
-    } else {
-      return assertNotSuggested(name);
-    }
+      String declaringType, String returnType, {int relevance:
+      COMPLETION_RELEVANCE_DEFAULT, bool isDeprecated: false}) {
+    return assertNotSuggested(name);
   }
 
   CompletionSuggestion assertSuggestLocalSetter(String name, [int relevance =
@@ -1475,8 +1503,10 @@
       A T;''');
     computeFast();
     return computeFull((bool result) {
-      CompletionSuggestion suggestionA =
-          assertSuggestLocalClass('A', COMPLETION_RELEVANCE_LOW);
+      CompletionSuggestion suggestionA = assertSuggestLocalClass(
+          'A',
+          relevance: COMPLETION_RELEVANCE_LOW,
+          isDeprecated: true);
       if (suggestionA != null) {
         expect(suggestionA.element.isDeprecated, isTrue);
         expect(suggestionA.element.isPrivate, isFalse);
@@ -2032,8 +2062,11 @@
         expect(methodA.element.isDeprecated, isFalse);
         expect(methodA.element.isPrivate, isFalse);
       }
-      CompletionSuggestion getterF =
-          assertSuggestLocalGetter('f', 'X', COMPLETION_RELEVANCE_LOW);
+      CompletionSuggestion getterF = assertSuggestLocalGetter(
+          'f',
+          'X',
+          relevance: COMPLETION_RELEVANCE_LOW,
+          isDeprecated: true);
       if (getterF != null) {
         expect(getterF.element.isDeprecated, isTrue);
         expect(getterF.element.isPrivate, isFalse);
@@ -2056,8 +2089,11 @@
         expect(methodA.element.isDeprecated, isFalse);
         expect(methodA.element.isPrivate, isTrue);
       }
-      CompletionSuggestion getterF =
-          assertSuggestLocalField('f', 'X', COMPLETION_RELEVANCE_LOW);
+      CompletionSuggestion getterF = assertSuggestLocalField(
+          'f',
+          'X',
+          relevance: COMPLETION_RELEVANCE_LOW,
+          isDeprecated: true);
       if (getterF != null) {
         expect(getterF.element.isDeprecated, isTrue);
         expect(getterF.element.isPrivate, isFalse);
@@ -2078,8 +2114,12 @@
     addTestSource('class A {@deprecated Z a(X x, _, b, {y: boo}) {^}}');
     computeFast();
     return computeFull((bool result) {
-      CompletionSuggestion methodA =
-          assertSuggestLocalMethod('a', 'A', 'Z', COMPLETION_RELEVANCE_LOW);
+      CompletionSuggestion methodA = assertSuggestLocalMethod(
+          'a',
+          'A',
+          'Z',
+          relevance: COMPLETION_RELEVANCE_LOW,
+          isDeprecated: true);
       if (methodA != null) {
         expect(methodA.element.isDeprecated, isTrue);
         expect(methodA.element.isPrivate, isFalse);
diff --git a/pkg/analysis_server/test/services/completion/imported_computer_test.dart b/pkg/analysis_server/test/services/completion/imported_computer_test.dart
index ded6b43..74338da 100644
--- a/pkg/analysis_server/test/services/completion/imported_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/imported_computer_test.dart
@@ -499,7 +499,7 @@
     var result = context2.performAnalysisTask();
     while (result.hasMoreWork) {
       result.changeNotices.forEach((ChangeNotice notice) {
-        CompilationUnit unit = notice.compilationUnit;
+        CompilationUnit unit = notice.resolvedDartUnit;
         if (unit != null) {
           index.indexUnit(context2, unit);
         }
diff --git a/pkg/analysis_server/test/services/completion/invocation_computer_test.dart b/pkg/analysis_server/test/services/completion/invocation_computer_test.dart
index 2dd068b..ddfb327 100644
--- a/pkg/analysis_server/test/services/completion/invocation_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/invocation_computer_test.dart
@@ -5,6 +5,8 @@
 library test.services.completion.invocation;
 
 
+import 'dart:async';
+
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analysis_server/src/services/completion/invocation_computer.dart';
@@ -31,11 +33,105 @@
         isDeprecated: isDeprecated);
   }
 
+  /**
+   * Check whether a declaration of the form [shadower] in a derived class
+   * shadows a declaration of the form [shadowee] in a base class, for the
+   * purposes of what is shown during completion.  [shouldBeShadowed] indicates
+   * whether shadowing is expected.
+   */
+  Future check_shadowing(String shadower, String shadowee,
+      bool shouldBeShadowed) {
+    addTestSource('''
+class Base {
+  $shadowee
+}
+class Derived extends Base {
+  $shadower
+}
+void f(Derived d) {
+  d.^
+}
+''');
+    return computeFull((bool result) {
+      List<CompletionSuggestion> suggestionsForX = request.suggestions.where(
+          (CompletionSuggestion s) => s.completion == 'x').toList();
+      if (shouldBeShadowed) {
+        expect(suggestionsForX, hasLength(1));
+        expect(suggestionsForX[0].declaringType, 'Derived');
+      } else {
+        expect(suggestionsForX, hasLength(2));
+      }
+    });
+  }
+
   @override
   void setUpComputer() {
     computer = new InvocationComputer();
   }
 
+  test_generic_field() {
+    addTestSource('''
+class C<T> {
+  T t;
+}
+void f(C<int> c) {
+  c.^
+}
+''');
+    return computeFull((bool result) {
+      assertSuggestField('t', 'int');
+    });
+  }
+
+  test_generic_getter() {
+    addTestSource('''
+class C<T> {
+  T get t => null;
+}
+void f(C<int> c) {
+  c.^
+}
+''');
+    return computeFull((bool result) {
+      assertSuggestGetter('t', 'int');
+    });
+  }
+
+  test_generic_method() {
+    addTestSource('''
+class C<T> {
+  T m(T t) {}
+}
+void f(C<int> c) {
+  c.^
+}
+''');
+    return computeFull((bool result) {
+      CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'int');
+      expect(suggestion.parameterTypes[0], 'int');
+      expect(suggestion.element.returnType, 'int');
+      expect(suggestion.element.parameters, '(int t)');
+    });
+  }
+
+  test_generic_setter() {
+    addTestSource('''
+class C<T> {
+  set t(T value) {}
+}
+void f(C<int> c) {
+  c.^
+}
+''');
+    return computeFull((bool result) {
+      // TODO(paulberry): modify assertSuggestSetter so that we can pass 'int'
+      // as a parmeter to it, and it will check the appropriate field in
+      // the suggestion object.
+      CompletionSuggestion suggestion = assertSuggestSetter('t');
+      expect(suggestion.element.parameters, '(int value)');
+    });
+  }
+
   test_method_parameters_mixed_required_and_named() {
     addTestSource('''
 class C {
@@ -177,4 +273,116 @@
       assertHasNoParameterInfo(suggestion);
     });
   }
+
+  test_shadowing_field_over_field() =>
+      check_shadowing('int x;', 'int x;', true);
+
+  test_shadowing_field_over_getter() =>
+      check_shadowing('int x;', 'int get x => null;', true);
+
+  test_shadowing_field_over_method() =>
+      check_shadowing('int x;', 'void x() {}', true);
+
+  test_shadowing_field_over_setter() =>
+      check_shadowing('int x;', 'set x(int value) {}', true);
+
+  test_shadowing_getter_over_field() =>
+      check_shadowing('int get x => null;', 'int x;', false);
+
+  test_shadowing_getter_over_getter() =>
+      check_shadowing('int get x => null;', 'int get x => null;', true);
+
+  test_shadowing_getter_over_method() =>
+      check_shadowing('int get x => null;', 'void x() {}', true);
+
+  test_shadowing_getter_over_setter() =>
+      check_shadowing('int get x => null;', 'set x(int value) {}', false);
+
+  test_shadowing_method_over_field() =>
+      check_shadowing('void x() {}', 'int x;', true);
+
+  test_shadowing_method_over_getter() =>
+      check_shadowing('void x() {}', 'int get x => null;', true);
+
+  test_shadowing_method_over_method() =>
+      check_shadowing('void x() {}', 'void x() {}', true);
+
+  test_shadowing_method_over_setter() =>
+      check_shadowing('void x() {}', 'set x(int value) {}', true);
+
+  test_shadowing_mixin_order() {
+    addTestSource('''
+class Base {
+}
+class Mixin1 {
+  void f() {}
+}
+class Mixin2 {
+  void f() {}
+}
+class Derived extends Base with Mixin1, Mixin2 {
+}
+void test(Derived d) {
+  d.^
+}
+''');
+    return computeFull((bool result) {
+      // Note: due to dartbug.com/22069, analyzer currently analyzes mixins in
+      // reverse order.  The correct order is that Derived inherits from
+      // "Base with Mixin1, Mixin2", which inherits from "Base with Mixin1",
+      // which inherits from "Base".  So the definition of f in Mixin2 should
+      // shadow the definition in Mixin1.
+      assertSuggestMethod('f', 'Mixin2', 'void');
+    });
+  }
+
+  test_shadowing_mixin_over_superclass() {
+    addTestSource('''
+class Base {
+  void f() {}
+}
+class Mixin {
+  void f() {}
+}
+class Derived extends Base with Mixin {
+}
+void test(Derived d) {
+  d.^
+}
+''');
+    return computeFull((bool result) {
+      assertSuggestMethod('f', 'Mixin', 'void');
+    });
+  }
+
+  test_shadowing_setter_over_field() =>
+      check_shadowing('set x(int value) {}', 'int x;', false);
+
+  test_shadowing_setter_over_getter() =>
+      check_shadowing('set x(int value) {}', 'int get x => null;', false);
+
+  test_shadowing_setter_over_method() =>
+      check_shadowing('set x(int value) {}', 'void x() {}', true);
+
+  test_shadowing_setter_over_setter() =>
+      check_shadowing('set x(int value) {}', 'set x(int value) {}', true);
+
+  test_shadowing_superclass_over_interface() {
+    addTestSource('''
+class Base {
+  void f() {}
+}
+class Interface {
+  void f() {}
+}
+class Derived extends Base implements Interface {
+}
+void test(Derived d) {
+  d.^
+}
+''');
+    return computeFull((bool result) {
+      assertSuggestMethod('f', 'Base', 'void');
+    });
+  }
 }
diff --git a/pkg/analysis_server/test/services/completion/local_computer_test.dart b/pkg/analysis_server/test/services/completion/local_computer_test.dart
index 2399393..2a8e869 100644
--- a/pkg/analysis_server/test/services/completion/local_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/local_computer_test.dart
@@ -21,9 +21,44 @@
 class LocalComputerTest extends AbstractSelectorSuggestionTest {
 
   @override
+  CompletionSuggestion assertSuggestLocalClass(String name, {int relevance:
+      COMPLETION_RELEVANCE_DEFAULT, bool isDeprecated: false}) {
+    return assertSuggestClass(
+        name,
+        relevance: relevance,
+        isDeprecated: isDeprecated);
+  }
+
+  @override
   CompletionSuggestion assertSuggestLocalField(String name, String type,
-      [int relevance = COMPLETION_RELEVANCE_DEFAULT]) {
-    return assertSuggestField(name, type, relevance: relevance);
+      {int relevance: COMPLETION_RELEVANCE_DEFAULT, bool isDeprecated: false}) {
+    return assertSuggestField(
+        name,
+        type,
+        relevance: relevance,
+        isDeprecated: isDeprecated);
+  }
+
+  @override
+  CompletionSuggestion assertSuggestLocalGetter(String name, String returnType,
+      {int relevance: COMPLETION_RELEVANCE_DEFAULT, bool isDeprecated: false}) {
+    return assertSuggestGetter(
+        name,
+        returnType,
+        relevance: relevance,
+        isDeprecated: isDeprecated);
+  }
+
+  @override
+  CompletionSuggestion assertSuggestLocalMethod(String name,
+      String declaringType, String returnType, {int relevance:
+      COMPLETION_RELEVANCE_DEFAULT, bool isDeprecated: false}) {
+    return assertSuggestMethod(
+        name,
+        declaringType,
+        returnType,
+        relevance: relevance,
+        isDeprecated: isDeprecated);
   }
 
   @override
@@ -308,4 +343,226 @@
     expect(computeFast(), isTrue);
     assertSuggestLabel('foo');
   }
+
+  test_function_parameters_mixed_required_and_named() {
+    addTestSource('''
+void m(x, {int y}) {}
+class B extends A {
+  main() {^}
+}
+''');
+    expect(computeFast(), isTrue);
+    CompletionSuggestion suggestion = assertSuggestFunction('m', 'void');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'x');
+    expect(suggestion.parameterTypes[0], 'dynamic');
+    expect(suggestion.parameterNames[1], 'y');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 1);
+    expect(suggestion.hasNamedParameters, true);
+  }
+
+  test_function_parameters_mixed_required_and_positional() {
+    addTestSource('''
+void m(x, [int y]) {}
+class B extends A {
+  main() {^}
+}
+''');
+    expect(computeFast(), isTrue);
+    CompletionSuggestion suggestion = assertSuggestFunction('m', 'void');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'x');
+    expect(suggestion.parameterTypes[0], 'dynamic');
+    expect(suggestion.parameterNames[1], 'y');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 1);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
+  test_function_parameters_named() {
+    addTestSource('''
+void m({x, int y}) {}
+class B extends A {
+  main() {^}
+}
+''');
+    expect(computeFast(), isTrue);
+    CompletionSuggestion suggestion = assertSuggestFunction('m', 'void');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'x');
+    expect(suggestion.parameterTypes[0], 'dynamic');
+    expect(suggestion.parameterNames[1], 'y');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 0);
+    expect(suggestion.hasNamedParameters, true);
+  }
+
+  test_function_parameters_none() {
+    addTestSource('''
+void m() {}
+class B extends A {
+  main() {^}
+}
+''');
+    expect(computeFast(), isTrue);
+    CompletionSuggestion suggestion = assertSuggestFunction('m', 'void');
+    expect(suggestion.parameterNames, isEmpty);
+    expect(suggestion.parameterTypes, isEmpty);
+    expect(suggestion.requiredParameterCount, 0);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
+  test_function_parameters_positional() {
+    addTestSource('''
+void m([x, int y]) {}
+class B extends A {
+  main() {^}
+}
+''');
+    expect(computeFast(), isTrue);
+    CompletionSuggestion suggestion = assertSuggestFunction('m', 'void');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'x');
+    expect(suggestion.parameterTypes[0], 'dynamic');
+    expect(suggestion.parameterNames[1], 'y');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 0);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
+  test_function_parameters_required() {
+    addTestSource('''
+void m(x, int y) {}
+class B extends A {
+  main() {^}
+}
+''');
+    expect(computeFast(), isTrue);
+    CompletionSuggestion suggestion = assertSuggestFunction('m', 'void');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'x');
+    expect(suggestion.parameterTypes[0], 'dynamic');
+    expect(suggestion.parameterNames[1], 'y');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 2);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
+  test_method_parameters_mixed_required_and_named() {
+    addTestSource('''
+class A {
+  void m(x, {int y}) {}
+}
+class B extends A {
+  main() {^}
+}
+''');
+    expect(computeFast(), isTrue);
+    CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'x');
+    expect(suggestion.parameterTypes[0], 'dynamic');
+    expect(suggestion.parameterNames[1], 'y');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 1);
+    expect(suggestion.hasNamedParameters, true);
+  }
+
+  test_method_parameters_mixed_required_and_positional() {
+    addTestSource('''
+class A {
+  void m(x, [int y]) {}
+}
+class B extends A {
+  main() {^}
+}
+''');
+    expect(computeFast(), isTrue);
+    CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'x');
+    expect(suggestion.parameterTypes[0], 'dynamic');
+    expect(suggestion.parameterNames[1], 'y');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 1);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
+  test_method_parameters_named() {
+    addTestSource('''
+class A {
+  void m({x, int y}) {}
+}
+class B extends A {
+  main() {^}
+}
+''');
+    expect(computeFast(), isTrue);
+    CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'x');
+    expect(suggestion.parameterTypes[0], 'dynamic');
+    expect(suggestion.parameterNames[1], 'y');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 0);
+    expect(suggestion.hasNamedParameters, true);
+  }
+
+  test_method_parameters_none() {
+    addTestSource('''
+class A {
+  void m() {}
+}
+class B extends A {
+  main() {^}
+}
+''');
+    expect(computeFast(), isTrue);
+    CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void');
+    expect(suggestion.parameterNames, isEmpty);
+    expect(suggestion.parameterTypes, isEmpty);
+    expect(suggestion.requiredParameterCount, 0);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
+  test_method_parameters_positional() {
+    addTestSource('''
+class A {
+  void m([x, int y]) {}
+}
+class B extends A {
+  main() {^}
+}
+''');
+    expect(computeFast(), isTrue);
+    CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'x');
+    expect(suggestion.parameterTypes[0], 'dynamic');
+    expect(suggestion.parameterNames[1], 'y');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 0);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
+  test_method_parameters_required() {
+    addTestSource('''
+class A {
+  void m(x, int y) {}
+}
+class B extends A {
+  main() {^}
+}
+''');
+    expect(computeFast(), isTrue);
+    CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'x');
+    expect(suggestion.parameterTypes[0], 'dynamic');
+    expect(suggestion.parameterNames[1], 'y');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 2);
+    expect(suggestion.hasNamedParameters, false);
+  }
 }
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index c359221..3ca13a6 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -488,7 +488,7 @@
 ''');
   }
 
-  void test_createField_getter_unqualified_instance_assignmentLhs() {
+  void test_createField_getter_unqualified_instance_assignmentRhs() {
     _indexTestUnit('''
 class A {
   main() {
@@ -694,6 +694,160 @@
     expect(fileEdit.edits[0].replacement, contains('library my.file;'));
   }
 
+  void test_createGetter_multiLevel() {
+    _indexTestUnit('''
+class A {
+}
+class B {
+  A a;
+}
+class C {
+  B b;
+}
+main(C c) {
+  int v = c.b.a.test;
+}
+''');
+    assertHasFix(FixKind.CREATE_GETTER, '''
+class A {
+  int get test => null;
+}
+class B {
+  A a;
+}
+class C {
+  B b;
+}
+main(C c) {
+  int v = c.b.a.test;
+}
+''');
+  }
+
+  void test_createGetter_qualified_instance() {
+    _indexTestUnit('''
+class A {
+}
+main(A a) {
+  int v = a.test;
+}
+''');
+    assertHasFix(FixKind.CREATE_GETTER, '''
+class A {
+  int get test => null;
+}
+main(A a) {
+  int v = a.test;
+}
+''');
+  }
+
+  void test_createGetter_qualified_instance_dynamicType() {
+    _indexTestUnit('''
+class A {
+  B b;
+  void f(Object p) {
+    p == b.test;
+  }
+}
+class B {
+}
+''');
+    assertHasFix(FixKind.CREATE_GETTER, '''
+class A {
+  B b;
+  void f(Object p) {
+    p == b.test;
+  }
+}
+class B {
+  get test => null;
+}
+''');
+  }
+
+  void test_createGetter_setterContext() {
+    _indexTestUnit('''
+class A {
+}
+main(A a) {
+  a.test = 42;
+}
+''');
+    assertNoFix(FixKind.CREATE_GETTER);
+  }
+
+  void test_createGetter_unqualified_instance_asInvocationArgument() {
+    _indexTestUnit('''
+class A {
+  main() {
+    f(test);
+  }
+}
+f(String s) {}
+''');
+    assertHasFix(FixKind.CREATE_GETTER, '''
+class A {
+  String get test => null;
+
+  main() {
+    f(test);
+  }
+}
+f(String s) {}
+''');
+  }
+
+  void test_createGetter_unqualified_instance_assignmentLhs() {
+    _indexTestUnit('''
+class A {
+  main() {
+    test = 42;
+  }
+}
+''');
+    assertNoFix(FixKind.CREATE_GETTER);
+  }
+
+  void test_createGetter_unqualified_instance_assignmentRhs() {
+    _indexTestUnit('''
+class A {
+  main() {
+    int v = test;
+  }
+}
+''');
+    assertHasFix(FixKind.CREATE_GETTER, '''
+class A {
+  int get test => null;
+
+  main() {
+    int v = test;
+  }
+}
+''');
+  }
+
+  void test_createGetter_unqualified_instance_asStatement() {
+    _indexTestUnit('''
+class A {
+  main() {
+    test;
+  }
+}
+''');
+    // TODO
+    assertHasFix(FixKind.CREATE_GETTER, '''
+class A {
+  get test => null;
+
+  main() {
+    test;
+  }
+}
+''');
+  }
+
   void test_createLocalVariable_read_typeAssignment() {
     _indexTestUnit('''
 main() {
@@ -1096,6 +1250,35 @@
 ''');
   }
 
+  void test_creatGetter_location_afterLastGetter() {
+    _indexTestUnit('''
+class A {
+  int existingField;
+
+  int get existingGetter => null;
+
+  existingMethod() {}
+}
+main(A a) {
+  int v = a.test;
+}
+''');
+    assertHasFix(FixKind.CREATE_GETTER, '''
+class A {
+  int existingField;
+
+  int get existingGetter => null;
+
+  int get test => null;
+
+  existingMethod() {}
+}
+main(A a) {
+  int v = a.test;
+}
+''');
+  }
+
   void test_creationFunction_forFunctionType_cascadeSecond() {
     _indexTestUnit('''
 class A {
diff --git a/pkg/analysis_server/test/services/dependencies/library_dependencies_test.dart b/pkg/analysis_server/test/services/dependencies/library_dependencies_test.dart
new file mode 100644
index 0000000..60fb7a0
--- /dev/null
+++ b/pkg/analysis_server/test/services/dependencies/library_dependencies_test.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 test.services.dependencies.library;
+
+import 'package:analysis_server/src/services/dependencies/library_dependencies.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../abstract_context.dart';
+import '../../reflective_tests.dart';
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(LibraryDependenciesTest);
+}
+
+
+@reflectiveTest
+class LibraryDependenciesTest extends AbstractContextTest {
+
+  test_Dependencies() {
+    addSource('/lib1.dart', 'import "lib2.dart";');
+    addSource('/lib2.dart', 'import "lib1.dart";');
+    addSource('/lib3.dart', 'import "lib2.dart";');
+    addSource('/lib4.dart', 'import "lib5.dart";');
+    provider.newFile('/lib5.dart', 'import "lib6.dart";');
+    provider.newFile('/lib6.dart', '');
+
+    _performAnalysis();
+
+    var libs =
+        new LibraryDependencyCollector([context]).collectLibraryDependencies();
+
+    // Cycles
+    expect(libs, contains('/lib1.dart'));
+    expect(libs, contains('/lib2.dart'));
+    // Regular sourcs
+    expect(libs, contains('/lib3.dart'));
+    expect(libs, contains('/lib4.dart'));
+    // Non-source, referenced by source
+    expect(libs, contains('/lib5.dart'));
+    // Non-source, referenced by non-source
+    expect(libs, contains('/lib6.dart'));
+  }
+
+  void _performAnalysis() {
+    while (context.performAnalysisTask().hasMoreWork);
+  }
+}
+
diff --git a/pkg/analysis_server/test/services/dependencies/test_all.dart b/pkg/analysis_server/test/services/dependencies/test_all.dart
new file mode 100644
index 0000000..ccc4b9d
--- /dev/null
+++ b/pkg/analysis_server/test/services/dependencies/test_all.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 test.services.dependencies;
+
+import 'package:unittest/unittest.dart';
+
+import 'library_dependencies_test.dart' as library_dependencies_test;
+
+/// Utility for manually running all tests.
+main() {
+  groupSep = ' | ';
+  group('dependencies', () {
+    library_dependencies_test.main();
+  });
+}
diff --git a/pkg/analysis_server/test/services/index/store/codec_test.dart b/pkg/analysis_server/test/services/index/store/codec_test.dart
index 1a79bcc..e9ed626 100644
--- a/pkg/analysis_server/test/services/index/store/codec_test.dart
+++ b/pkg/analysis_server/test/services/index/store/codec_test.dart
@@ -8,6 +8,7 @@
 import 'package:analysis_server/src/services/index/store/codec.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:unittest/unittest.dart';
 
 import '../../../abstract_single_unit.dart';
@@ -121,6 +122,36 @@
     }
   }
 
+  void test_filePackage_uriMix() {
+    MethodElement buildMethodElement(Source source) {
+      CompilationUnitElementImpl unitElement = new CompilationUnitElementImpl('file.dart');
+      LibraryElementImpl libraryElement = new LibraryElementImpl(null, 'lib', 0);
+      ClassElementImpl classElement = new ClassElementImpl('A', 0);
+      MethodElementImpl methodElement = new MethodElementImpl('m', 0);
+      unitElement.source = source;
+      libraryElement.definingCompilationUnit = unitElement;
+      unitElement.types = [classElement];
+      classElement.methods = [methodElement];
+      return methodElement;
+    }
+    // file:
+    int fileId;
+    {
+      Source source = new _TestSource('/my/file.dart', 'file:///my/file.dart');
+      var methodElement = buildMethodElement(source);
+      fileId = codec.encode(methodElement, true);
+    }
+    // package:
+    int packageId;
+    {
+      Source source = new _TestSource('/my/file.dart', 'package:my_pkg/file.dart');
+      var methodElement = buildMethodElement(source);
+      packageId = codec.encode(methodElement, true);
+    }
+    // should be the same
+    expect(packageId, fileId);
+  }
+
   void test_localLocalVariable() {
     resolveTestUnit('''
 main() {
@@ -229,3 +260,13 @@
     expect(codec.decode(idB), 'bbb');
   }
 }
+
+
+class _TestSource implements Source {
+  final String fullName;
+  final String encoding;
+
+  _TestSource(this.fullName, this.encoding);
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/analysis_server/test/services/refactoring/move_file_test.dart b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
index 3f20034..9b42a64 100644
--- a/pkg/analysis_server/test/services/refactoring/move_file_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
@@ -220,7 +220,7 @@
       }
       for (ChangeNotice notice in result.changeNotices) {
         if (notice.source.fullName.startsWith('/project/')) {
-          index.indexUnit(context, notice.compilationUnit);
+          index.indexUnit(context, notice.resolvedDartUnit);
         }
       }
     }
diff --git a/pkg/analysis_server/test/services/test_all.dart b/pkg/analysis_server/test/services/test_all.dart
index fcc4f1ca..8ccc397 100644
--- a/pkg/analysis_server/test/services/test_all.dart
+++ b/pkg/analysis_server/test/services/test_all.dart
@@ -8,6 +8,7 @@
 
 import 'completion/test_all.dart' as completion_all;
 import 'correction/test_all.dart' as correction_all;
+import 'dependencies/test_all.dart' as dependencies_all;
 import 'index/test_all.dart' as index_all;
 import 'refactoring/test_all.dart' as refactoring_all;
 import 'search/test_all.dart' as search_all;
@@ -17,6 +18,7 @@
   groupSep = ' | ';
   completion_all.main();
   correction_all.main();
+  dependencies_all.main();
   index_all.main();
   refactoring_all.main();
   search_all.main();
diff --git a/pkg/analysis_server/tool/spec/codegen_analysis_server.dart b/pkg/analysis_server/tool/spec/codegen_analysis_server.dart
index 2559d1a..497460a 100644
--- a/pkg/analysis_server/tool/spec/codegen_analysis_server.dart
+++ b/pkg/analysis_server/tool/spec/codegen_analysis_server.dart
@@ -12,7 +12,7 @@
 import 'codegen_tools.dart';
 
 final GeneratedFile target = javaGeneratedFile(
-    '../../../../editor/tools/plugins/com.google.dart.server/src/com/google/dart/server/AnalysisServer.java',
+    '../../../../editor/tools/plugins/com.google.dart.server/src/com/google/dart/server/generated/AnalysisServer.java',
     (Api api) => new CodegenAnalysisServer(api));
 
 /**
@@ -35,8 +35,9 @@
   @override
   void visitApi() {
     outputHeader(javaStyle: true);
-    writeln('package com.google.dart.server;');
+    writeln('package com.google.dart.server.generated;');
     writeln();
+    writeln('import com.google.dart.server.*;');
     writeln('import com.google.dart.server.generated.types.*;');
     writeln();
     writeln('import java.util.List;');
@@ -78,15 +79,28 @@
       });
 
       //
+      // addStatusListener(..)
+      //
+      publicMethod('addStatusListener', () {
+        writeln('''/**
+ * Add the given listener to the list of listeners that will receive notification when the server
+ * is not active
+ * 
+ * @param listener the listener to be added
+ */''');
+        writeln(
+            'public void addStatusListener(AnalysisServerStatusListener listener);');
+      });
+
+      //
       // isSocketOpen()
       //
       publicMethod('isSocketOpen', () {
-              writeln('''/**
+        writeln('''/**
  * Return {@code true} if the socket is open.
  */''');
-        writeln(
-          'public boolean isSocketOpen();');
-        });
+        writeln('public boolean isSocketOpen();');
+      });
 
       //
       // start(..)
@@ -109,7 +123,7 @@
         toHtmlVisitor.write('{@code ${request.longMethod }}');
         toHtmlVisitor.translateHtml(request.html);
         toHtmlVisitor.javadocParams(request.params);
-      }), width: 99, javadocStyle: true);
+      }));
       write('public void $methodName(');
       List<String> arguments = [];
       if (request.params != null) {
diff --git a/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart b/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
index 2fc8d73e..3b5ac0a 100644
--- a/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
+++ b/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
@@ -81,7 +81,10 @@
   CodegenProtocolVisitor(Api api)
       : super(api),
         toHtmlVisitor = new ToHtmlVisitor(api),
-        impliedTypes = computeImpliedTypes(api);
+        impliedTypes = computeImpliedTypes(api) {
+    codeGeneratorSettings.commentLineLength = 79;
+    codeGeneratorSettings.languageName = 'dart';
+  }
 
   /**
    * Compute the code necessary to compare two objects for equality.
@@ -254,6 +257,27 @@
             'static const ${value.value} = const $className._($valueString);');
         writeln();
       }
+
+      writeln('/**');
+      writeln(' * A list containing all of the enum values that are defined.');
+      writeln(' */');
+      write('static const List<');
+      write(className);
+      write('> VALUES = const <');
+      write(className);
+      write('>[');
+      bool first = true;
+      for (TypeEnumValue value in type.values) {
+        if (first) {
+          first = false;
+        } else {
+          write(', ');
+        }
+        write(value.value);
+      }
+      writeln('];');
+      writeln();
+
       writeln('final String name;');
       writeln();
       writeln('const $className._(this.name);');
diff --git a/pkg/analysis_server/tool/spec/codegen_inttest_methods.dart b/pkg/analysis_server/tool/spec/codegen_inttest_methods.dart
index aee1765..3c20ad7 100644
--- a/pkg/analysis_server/tool/spec/codegen_inttest_methods.dart
+++ b/pkg/analysis_server/tool/spec/codegen_inttest_methods.dart
@@ -52,7 +52,10 @@
 
   CodegenInttestMethodsVisitor(Api api)
       : super(api),
-        toHtmlVisitor = new ToHtmlVisitor(api);
+        toHtmlVisitor = new ToHtmlVisitor(api) {
+    codeGeneratorSettings.commentLineLength = 79;
+    codeGeneratorSettings.languageName = 'dart';
+  }
 
   /**
    * Generate a function argument for the given parameter field.
diff --git a/pkg/analysis_server/tool/spec/codegen_java.dart b/pkg/analysis_server/tool/spec/codegen_java.dart
index a8d9200..c2d32a1 100644
--- a/pkg/analysis_server/tool/spec/codegen_java.dart
+++ b/pkg/analysis_server/tool/spec/codegen_java.dart
@@ -136,7 +136,7 @@
    * Convenience method for subclasses for calling docComment.
    */
   void javadocComment(List<dom.Node> docs) {
-    docComment(docs, width: 99, javadocStyle: true);
+    docComment(docs);
   }
 
   /**
diff --git a/pkg/analysis_server/tool/spec/codegen_matchers.dart b/pkg/analysis_server/tool/spec/codegen_matchers.dart
index 30a6e14..fcf621c 100644
--- a/pkg/analysis_server/tool/spec/codegen_matchers.dart
+++ b/pkg/analysis_server/tool/spec/codegen_matchers.dart
@@ -42,7 +42,10 @@
 
   CodegenMatchersVisitor(Api api)
       : super(api),
-        toHtmlVisitor = new ToHtmlVisitor(api);
+        toHtmlVisitor = new ToHtmlVisitor(api) {
+    codeGeneratorSettings.commentLineLength = 79;
+    codeGeneratorSettings.languageName = 'dart';
+  }
 
   /**
    * Create a matcher for the part of the API called [name], optionally
diff --git a/pkg/analysis_server/tool/spec/codegen_tools.dart b/pkg/analysis_server/tool/spec/codegen_tools.dart
index 898f4b7..a32ea91 100644
--- a/pkg/analysis_server/tool/spec/codegen_tools.dart
+++ b/pkg/analysis_server/tool/spec/codegen_tools.dart
@@ -57,6 +57,12 @@
   _CodeGeneratorState _state;
 
   /**
+   * Settings that specialize code generation behavior for a given
+   * programming language.
+   */
+  CodeGeneratorSettings codeGeneratorSettings = new CodeGeneratorSettings();
+
+  /**
    * Measure the width of the current indentation level.
    */
   int get indentWidth => _state.nextIndent.length;
@@ -82,16 +88,17 @@
    * If [javadocStyle] is true, then the output is compatable with Javadoc,
    * which understands certain HTML constructs.
    */
-  void docComment(List<dom.Node> docs, {int width: 79, bool javadocStyle:
-      false}) {
+  void docComment(List<dom.Node> docs) {
     if (containsOnlyWhitespace(docs)) {
       return;
     }
-    writeln('/**');
-    indentBy(' * ', () {
+    writeln(codeGeneratorSettings.docCommentStartMarker);
+    int width = codeGeneratorSettings.commentLineLength;
+    bool javadocStyle = codeGeneratorSettings.languageName == 'java';
+    indentBy(codeGeneratorSettings.docCommentLineLeader, () {
       write(nodesToText(docs, width - _state.indent.length, javadocStyle));
     });
-    writeln(' */');
+    writeln(codeGeneratorSettings.docCommentEndMarker);
   }
 
   /**
@@ -124,9 +131,20 @@
     }
   }
 
+  void lineComment(List<dom.Node> docs) {
+    if (containsOnlyWhitespace(docs)) {
+      return;
+    }
+    write(codeGeneratorSettings.lineCommentLineLeader);
+    int width = codeGeneratorSettings.commentLineLength;
+    indentBy(codeGeneratorSettings.lineCommentLineLeader, () {
+      write(nodesToText(docs, width - _state.indent.length, false));
+    });
+  }
+
   void outputHeader({bool javaStyle: false}) {
     String header;
-    if (javaStyle) {
+    if (codeGeneratorSettings.languageName == 'java') {
       header = '''
 /*
  * Copyright (c) 2014, the Dart project authors.
@@ -144,6 +162,16 @@
  * This file has been automatically generated.  Please do not edit it manually.
  * To regenerate the file, use the script "pkg/analysis_server/tool/spec/generate_files".
  */''';
+    } else if (codeGeneratorSettings.languageName == 'python') {
+      header = '''
+# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+#
+# This file has been automatically generated.  Please do not edit it manually.
+# To regenerate the file, use the script
+# "pkg/analysis_server/tool/spec/generate_files".
+''';
     } else {
       header = '''
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
@@ -173,6 +201,47 @@
   }
 }
 
+/**
+ * Controls several settings of [CodeGenerator].
+ *
+ * The default settings are valid for generating Java and Dart code.
+ */
+class CodeGeneratorSettings {
+  /**
+   * Name of the language being generated. Lowercase.
+   */
+  String languageName;
+
+  /**
+   * Marker used in line comments.
+   */
+  String lineCommentLineLeader;
+
+  /**
+   * Start marker for doc comments.
+   */
+  String docCommentStartMarker;
+
+  /**
+   * Line leader for body lines in doc comments.
+   */
+  String docCommentLineLeader;
+
+  /**
+   * End marker for doc comments.
+   */
+  String docCommentEndMarker;
+
+  /**
+   * Line length for doc comment lines.
+   */
+  int commentLineLength;
+
+  CodeGeneratorSettings({this.languageName: 'java', this.lineCommentLineLeader:
+      '// ', this.docCommentStartMarker: '/**', this.docCommentLineLeader: ' * ',
+      this.docCommentEndMarker: ' */', this.commentLineLength: 99});
+}
+
 abstract class GeneratedContent {
   FileSystemEntity get outputFile;
   bool check();
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index aa86cb6..a91174d 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -32,6 +32,10 @@
       for readability.
     </p>
     <p>
+      It is the client's responsibility to read output from the server to
+      avoid its blocking.
+    </p>
+    <p>
       To ease interoperability with Lisp-based clients (which may not
       be able to easily distinguish between empty lists, empty maps,
       and null), client-to-server communication is allowed to replace
@@ -58,15 +62,20 @@
       longer to process than others.
     </p>
     <p>
-      Every request is required to have two fields and may have an
-      optional third field. The first required field is the ‘id’
+      Every request is required to have two fields and may have two
+      additional optional fields. The first required field is the ‘id’
       field, which is only used by the server to associate a response
       with the request that generated the response. The second
       required field is the ‘method’ field, which is used to determine
-      what the server is being requested to do. The optional field is
+      what the server is being requested to do. One optional field is
       the ‘params’ field, whose structure is dependent on the method
       being requested. The structure of this field is described with
-      each request for which it is required.
+      each request for which it is required. The other optional field
+      is the 'clientRequestTime' field, which is a number indicating
+      the time at which the client made the request (milliseconds
+      since epoch). Providing clientRequestTime helps us track
+      how responsive analysis server is to client requests
+      and better address any issues that occur.
     </p>
     <p>
       Every response has up to three fields. The first field is the
@@ -135,6 +144,22 @@
       errors produced for all files in the actual analysis roots.
       </dd>
     </dl>
+    <dl>
+      <dt>--file-read-mode</dt>
+      <dd>
+      An enumeration of the ways files can be read from disk. Some clients
+      normalize end of line characters which would make the file offset and
+      range information incorrect. The default option is <tt>as-is</tt>, but
+      can also be set to <tt>normalize-eol-always</tt>. The default option
+      (<tt>as-is</tt>) reads files as they are on disk. The
+      <tt>normalize-eol-always</tt> option does the following:
+      <ul>
+        <li>'\r\n' is converted to '\n';</li>
+        <li>'\r' by itself is converted to '\n';</li>
+        <li>this happens regardless of the OS editor is running on.</li>
+      </ul>
+      </dd>
+    </dl>
     </blockquote>
     <domain name="server">
       <p>
@@ -343,6 +368,21 @@
           </field>
         </result>
       </request>
+      <request method="getLibraryDependencies">
+            <p>
+              Return a list of all of the libraries referenced by any files in
+              existing analysis roots.
+            </p>
+            <result>
+                <field name="libraries">
+                    <list><ref>FilePath</ref></list>
+                    <p>
+                      A list of the paths of library elements referenced by
+                      files in existing analysis roots.
+                    </p>
+                </field>
+            </result>
+      </request>
       <request method="getNavigation">
         <p>
           Return the navigation information associated with the given region of
@@ -600,6 +640,8 @@
             </p>
           </field>
         </params>
+        <result>
+        </result>
       </request>
       <request method="updateOptions">
         <p>
diff --git a/pkg/analyzer/lib/file_system/physical_file_system.dart b/pkg/analyzer/lib/file_system/physical_file_system.dart
index 431e92c..3f3e452 100644
--- a/pkg/analyzer/lib/file_system/physical_file_system.dart
+++ b/pkg/analyzer/lib/file_system/physical_file_system.dart
@@ -19,8 +19,12 @@
  * A `dart:io` based implementation of [ResourceProvider].
  */
 class PhysicalResourceProvider implements ResourceProvider {
+
+  static final NORMALIZE_EOL_ALWAYS =
+      (String string) => string.replaceAll(new RegExp('\r\n?'), '\n');
+
   static final PhysicalResourceProvider INSTANCE =
-      new PhysicalResourceProvider._();
+      new PhysicalResourceProvider(null);
 
   /**
    * The name of the directory containing plugin specific subfolders used to
@@ -28,7 +32,11 @@
    */
   static final String SERVER_DIR = ".dartServer";
 
-  PhysicalResourceProvider._();
+  PhysicalResourceProvider(String fileReadMode(String s)) {
+    if (fileReadMode != null) {
+      FileBasedSource.fileReadMode = fileReadMode;
+    }
+  }
 
   @override
   Context get pathContext => io.Platform.isWindows ? windows : posix;
diff --git a/pkg/analyzer/lib/instrumentation/instrumentation.dart b/pkg/analyzer/lib/instrumentation/instrumentation.dart
index c3a9920..0cf5724 100644
--- a/pkg/analyzer/lib/instrumentation/instrumentation.dart
+++ b/pkg/analyzer/lib/instrumentation/instrumentation.dart
@@ -76,6 +76,12 @@
   InstrumentationService(this._instrumentationServer);
 
   /**
+   * Return `true` if this [InstrumentationService] was initialized with a
+   * non-`null` server (and hence instrumentation is active).
+   */
+  bool get isActive => _instrumentationServer != null;
+
+  /**
    * The current time, expressed as a decimal encoded number of milliseconds.
    */
   String get _timestamp => new DateTime.now().millisecondsSinceEpoch.toString();
@@ -106,7 +112,8 @@
   void logFileRead(String path, int modificationTime, String content) {
     if (_instrumentationServer != null) {
       String timeStamp = _toString(modificationTime);
-      _instrumentationServer.log(_join([TAG_FILE_READ, path, timeStamp, content]));
+      _instrumentationServer.log(
+          _join([TAG_FILE_READ, path, timeStamp, content]));
     }
   }
 
@@ -117,7 +124,8 @@
    */
   void logLogEntry(String level, DateTime time, String message) {
     if (_instrumentationServer != null) {
-      String timeStamp = time == null ? 'null' : time.millisecondsSinceEpoch.toString();
+      String timeStamp =
+          time == null ? 'null' : time.millisecondsSinceEpoch.toString();
       _instrumentationServer.log(
           _join([TAG_LOG_ENTRY, level, timeStamp, message]));
     }
@@ -170,6 +178,29 @@
   }
 
   /**
+   * Signal that the client has started analysis server.
+   * This method should be invoked exactly one time.
+   */
+  void logVersion(String uuid, String clientId, String clientVersion,
+      String serverVersion, String sdkVersion) {
+
+    String normalize(String value) =>
+        value != null && value.length > 0 ? value : 'unknown';
+
+    if (_instrumentationServer != null) {
+      _instrumentationServer.logWithPriority(
+          _join(
+              [
+                  TAG_VERSION,
+                  uuid,
+                  normalize(clientId),
+                  normalize(clientVersion),
+                  serverVersion,
+                  sdkVersion]));
+    }
+  }
+
+  /**
    * Signal that the client is done communicating with the instrumentation
    * server. This method should be invoked exactly one time and no other methods
    * should be invoked on this instance after this method has been invoked.
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index 9d4bf16..49cc609 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -2393,11 +2393,6 @@
   CompilationUnit get unit;
 
   /**
-   * Identifiers of the elements that use this elements.
-   */
-  IntSet get users;
-
-  /**
    * Use the given visitor to visit this element.
    *
    * @param visitor the visitor that will visit this element
@@ -2406,11 +2401,6 @@
   accept(ElementVisitor visitor);
 
   /**
-   * Remember the given [element] as a user of this element.
-   */
-  void addUser(Element element);
-
-  /**
    * Return the documentation comment for this element as it appears in the original source
    * (complete with the beginning and ending delimiters), or `null` if this element does not
    * have a documentation comment associated with it. This can be a long-running operation if the
@@ -2650,13 +2640,6 @@
   ElementLocation _cachedLocation;
 
   /**
-   * Identifiers of the elements that use this elements.
-   *
-   * TODO(scheglov) consider this field lazily
-   */
-  final IntSet users = new IntSet();
-
-  /**
    * Initialize a newly created element to have the given name.
    *
    * @param name the name of this element
@@ -2832,16 +2815,6 @@
   }
 
   /**
-   * Remember the given [element] as a user of this element.
-   */
-  @override
-  void addUser(Element element) {
-    if (element != null) {
-      users.add(element.id);
-    }
-  }
-
-  /**
    * Append a textual representation of this element to the given [buffer].
    */
   void appendTo(StringBuffer buffer) {
@@ -7964,20 +7937,6 @@
   @override
   CompilationUnit get unit => _baseElement.unit;
 
-  /**
-   * Identifiers of the elements that use this elements.
-   */
-  @override
-  IntSet get users => _baseElement.users;
-
-  /**
-   * Remember the given [element] as a user of this element.
-   */
-  @override
-  void addUser(Element element) {
-    _baseElement.addUser(element);
-  }
-
   @override
   String computeDocumentationComment() =>
       _baseElement.computeDocumentationComment();
@@ -8522,21 +8481,9 @@
   @override
   CompilationUnit get unit => null;
 
-  /**
-   * Identifiers of the elements that use this elements.
-   */
-  @override
-  IntSet get users => new IntSet();
-
   @override
   accept(ElementVisitor visitor) => visitor.visitMultiplyDefinedElement(this);
 
-  /**
-   * Remember the given [element] as a user of this element.
-   */
-  void addUser(Element element) {
-  }
-
   @override
   String computeDocumentationComment() => null;
 
diff --git a/pkg/analyzer/lib/src/generated/element_handle.dart b/pkg/analyzer/lib/src/generated/element_handle.dart
index b84e36e..d732ff4 100644
--- a/pkg/analyzer/lib/src/generated/element_handle.dart
+++ b/pkg/analyzer/lib/src/generated/element_handle.dart
@@ -7,8 +7,6 @@
 
 library engine.element_handle;
 
-import 'package:analyzer/src/generated/utilities_collection.dart';
-
 import 'ast.dart';
 import 'element.dart';
 import 'engine.dart';
@@ -374,12 +372,6 @@
   @override
   CompilationUnit get unit => actualElement.unit;
 
-  /**
-   * Identifiers of the elements that use this elements.
-   */
-  @override
-  IntSet get users => new IntSet();
-
   @override
   bool operator ==(Object object) =>
       object is Element && object.location == _location;
@@ -387,13 +379,6 @@
   @override
   accept(ElementVisitor visitor) => actualElement.accept(visitor);
 
-  /**
-   * Remember the given [element] as a user of this element.
-   */
-  @override
-  void addUser(Element element) {
-  }
-
   @override
   String computeDocumentationComment() =>
       actualElement.computeDocumentationComment();
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 2b55cfb..2b5bf19 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -623,7 +623,6 @@
     methodName.propagatedElement = propagatedElement;
     ArgumentList argumentList = node.argumentList;
     if (staticElement != null) {
-      staticElement.addUser(_resolver.enclosingFunction);
       List<ParameterElement> parameters =
           _computeCorrespondingParameters(argumentList, staticElement);
       if (parameters != null) {
@@ -631,7 +630,6 @@
       }
     }
     if (propagatedElement != null) {
-      propagatedElement.addUser(_resolver.enclosingFunction);
       List<ParameterElement> parameters =
           _computeCorrespondingParameters(argumentList, propagatedElement);
       if (parameters != null) {
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 5ea16a5..9b47fe2 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -12,6 +12,8 @@
 import 'dart:collection';
 
 import 'package:analyzer/src/cancelable_future.dart';
+import 'package:analyzer/src/generated/incremental_resolution_validator.dart';
+import 'package:analyzer/src/services/lint.dart';
 import 'package:analyzer/src/task/task_dart.dart';
 
 import '../../instrumentation/instrumentation.dart';
@@ -33,7 +35,6 @@
 import 'source.dart';
 import 'utilities_collection.dart';
 import 'utilities_general.dart';
-import 'package:analyzer/src/generated/incremental_resolution_validator.dart';
 
 /**
  * Type of callback functions used by PendingFuture.  Functions of this type
@@ -1150,6 +1151,11 @@
   }
 
   @override
+  set contentCache(ContentCache value) {
+    _contentCache = value;
+  }
+
+  @override
   DeclaredVariables get declaredVariables => _declaredVariables;
 
   @override
@@ -1533,7 +1539,7 @@
       _sourceChanged(source);
     }
     changeSet.changedContents.forEach((Source key, String value) {
-      _contentsChanged(key, value);
+      _contentsChanged(key, value, false);
     });
     changeSet.changedRanges.forEach(
         (Source source, ChangeSet_ContentChange change) {
@@ -1572,10 +1578,10 @@
         Source source = sourcesToInvalidate[i];
         SourceEntry entry = _getReadableSourceEntry(source);
         if (entry is DartEntry) {
-          entry.invalidateAllResolutionInformation(false);
+          entry.invalidateParseInformation();
           _workManager.add(source, _computePriority(entry));
         } else if (entry is HtmlEntry) {
-          entry.invalidateAllResolutionInformation(false);
+          entry.invalidateParseInformation();
           _workManager.add(source, SourcePriority.HTML);
         }
       }
@@ -2148,6 +2154,64 @@
   }
 
   @override
+  bool handleContentsChanged(Source source, String originalContents,
+      String newContents, bool notify) {
+    SourceEntry sourceEntry = _cache.get(source);
+    if (sourceEntry == null) {
+      return false;
+    }
+    bool changed = newContents != originalContents;
+    if (newContents != null) {
+      if (newContents != originalContents) {
+        _incrementalAnalysisCache =
+            IncrementalAnalysisCache.clear(_incrementalAnalysisCache, source);
+        if (!analysisOptions.incremental ||
+            !_tryPoorMansIncrementalResolution(source, newContents)) {
+          _sourceChanged(source);
+        }
+        if (sourceEntry != null) {
+          sourceEntry.modificationTime =
+              _contentCache.getModificationStamp(source);
+          sourceEntry.setValue(SourceEntry.CONTENT, newContents);
+        }
+      } else {
+        if (sourceEntry != null) {
+          sourceEntry.modificationTime =
+              _contentCache.getModificationStamp(source);
+        }
+      }
+    } else if (originalContents != null) {
+      _incrementalAnalysisCache =
+          IncrementalAnalysisCache.clear(_incrementalAnalysisCache, source);
+      changed = newContents != originalContents;
+      // We are removing the overlay for the file, check if the file's
+      // contents is the same as it was in the overlay.
+      if (sourceEntry != null) {
+        try {
+          TimestampedData<String> fileContents = getContents(source);
+          String fileContentsData = fileContents.data;
+          if (fileContentsData == originalContents) {
+            sourceEntry.modificationTime = fileContents.modificationTime;
+            sourceEntry.setValue(SourceEntry.CONTENT, fileContentsData);
+            changed = false;
+          }
+        } catch (e) {
+        }
+      }
+      // If not the same content (e.g. the file is being closed without save),
+      // then force analysis.
+      if (changed) {
+        _sourceChanged(source);
+      }
+    }
+    if (notify && changed) {
+      _onSourcesChangedController.add(
+          new SourcesChangedEvent.changedContent(source, newContents));
+    }
+    return changed;
+  }
+
+  @override
   bool isClientLibrary(Source librarySource) {
     SourceEntry sourceEntry = _getReadableSourceEntry(librarySource);
     if (sourceEntry is DartEntry) {
@@ -2249,32 +2313,6 @@
         performEnd - performStart);
   }
 
-  void _validateLastIncrementalResolutionResult() {
-    if (incrementalResolutionValidation_lastUnitSource == null ||
-        incrementalResolutionValidation_lastLibrarySource == null ||
-        incrementalResolutionValidation_lastUnit == null) {
-      return;
-    }
-    CompilationUnit fullUnit = getResolvedCompilationUnit2(
-        incrementalResolutionValidation_lastUnitSource,
-        incrementalResolutionValidation_lastLibrarySource);
-    if (fullUnit != null) {
-      try {
-        assertSameResolution(
-            incrementalResolutionValidation_lastUnit,
-            fullUnit);
-      } on IncrementalResolutionMismatch catch (mismatch, stack) {
-        String failure = mismatch.message;
-        String message =
-            'Incremental resolution mismatch:\n$failure\nat\n$stack';
-        AnalysisEngine.instance.logger.logError(message);
-      }
-    }
-    incrementalResolutionValidation_lastUnitSource = null;
-    incrementalResolutionValidation_lastLibrarySource = null;
-    incrementalResolutionValidation_lastUnit = null;
-  }
-
   @override
   void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
     Source htmlSource = _sourceFactory.forUri(DartSdk.DART_HTML);
@@ -2395,7 +2433,7 @@
             _workManager.add(source, SourcePriority.PRIORITY_PART);
           }
           ChangeNoticeImpl notice = _getNotice(source);
-          notice.compilationUnit = unit;
+          notice.resolvedDartUnit = unit;
           notice.setErrors(dartEntry.allErrors, lineInfo);
         }
       }
@@ -2479,7 +2517,7 @@
             _workManager.add(source, SourcePriority.PRIORITY_PART);
           }
           ChangeNoticeImpl notice = _getNotice(source);
-          notice.compilationUnit = unit;
+          notice.resolvedDartUnit = unit;
           notice.setErrors(dartEntry.allErrors, lineInfo);
         }
       }
@@ -2535,10 +2573,7 @@
 
   @override
   void setContents(Source source, String contents) {
-    if (_contentsChanged(source, contents)) {
-      _onSourcesChangedController.add(
-          new SourcesChangedEvent.changedContent(source, contents));
-    }
+    _contentsChanged(source, contents, true);
   }
 
   @override
@@ -2605,6 +2640,13 @@
   }
 
   /**
+   * Visit all entries of the content cache.
+   */
+  void visitContentCache(ContentCacheVisitor visitor) {
+    _contentCache.accept(visitor);
+  }
+
+  /**
    * Record that we have accessed the AST structure associated with the given source. At the moment,
    * there is no differentiation between the parsed and resolved forms of the AST.
    *
@@ -2763,7 +2805,6 @@
     return dartEntry;
   }
 
-
   /**
    * Given a source for a Dart file, return a cache entry in which the state of the data represented
    * by the given descriptor is either [CacheState.VALID] or [CacheState.ERROR]. This
@@ -3164,6 +3205,21 @@
     return changed;
   }
 
+  /**
+   * Set the contents of the given source to the given contents and mark the source as having
+   * changed. This has the effect of overriding the default contents of the source. If the contents
+   * are `null` the override is removed so that the default contents will be returned.
+   *
+   * If [notify] is true, a source changed event is triggered.
+   *
+   * @param source the source whose contents are being overridden
+   * @param contents the new contents of the source
+   */
+  void _contentsChanged(Source source, String contents, bool notify) {
+    String originalContents = _contentCache.setContents(source, contents);
+    handleContentsChanged(source, originalContents, contents, notify);
+  }
+
 //  /**
 //   * Create a [BuildUnitElementTask] for the given [source].
 //   */
@@ -3179,68 +3235,6 @@
 //  }
 
   /**
-   * Set the contents of the given source to the given contents and mark the source as having
-   * changed. This has the effect of overriding the default contents of the source. If the contents
-   * are `null` the override is removed so that the default contents will be returned.
-   * [setContents] triggers a source changed event where as this method does not.
-   *
-   * @param source the source whose contents are being overridden
-   * @param contents the new contents of the source
-   */
-  bool _contentsChanged(Source source, String contents) {
-    bool changed = false;
-    String originalContents = _contentCache.setContents(source, contents);
-    if (contents != null) {
-      if (contents != originalContents) {
-        _incrementalAnalysisCache =
-            IncrementalAnalysisCache.clear(_incrementalAnalysisCache, source);
-        if (!analysisOptions.incremental ||
-            !_tryPoorMansIncrementalResolution(source, contents)) {
-          _sourceChanged(source);
-        }
-        changed = true;
-        SourceEntry sourceEntry = _cache.get(source);
-        if (sourceEntry != null) {
-          sourceEntry.modificationTime =
-              _contentCache.getModificationStamp(source);
-          sourceEntry.setValue(SourceEntry.CONTENT, contents);
-        }
-      } else {
-        SourceEntry sourceEntry = _cache.get(source);
-        if (sourceEntry != null) {
-          sourceEntry.modificationTime =
-              _contentCache.getModificationStamp(source);
-        }
-      }
-    } else if (originalContents != null) {
-      _incrementalAnalysisCache =
-          IncrementalAnalysisCache.clear(_incrementalAnalysisCache, source);
-      changed = true;
-      // We are removing the overlay for the file, check if the file's
-      // contents is the same as it was in the overlay.
-      SourceEntry sourceEntry = _cache.get(source);
-      if (sourceEntry != null) {
-        try {
-          TimestampedData<String> fileContents = getContents(source);
-          String fileContentsData = fileContents.data;
-          if (fileContentsData == originalContents) {
-            sourceEntry.modificationTime = fileContents.modificationTime;
-            sourceEntry.setValue(SourceEntry.CONTENT, fileContentsData);
-            changed = false;
-          }
-        } catch (e) {
-        }
-      }
-      // If not the same content (e.g. the file is being closed without save),
-      // then force analysis.
-      if (changed) {
-        _sourceChanged(source);
-      }
-    }
-    return changed;
-  }
-
-  /**
    * Create a [GenerateDartErrorsTask] for the given source, marking the verification errors
    * as being in-process. The compilation unit and the library can be the same if the compilation
    * unit is the defining compilation unit of the library.
@@ -3370,8 +3364,6 @@
         false);
   }
 
-
-
   /**
    * Create a [GetContentTask] for the given source, marking the content as being in-process.
    *
@@ -4379,6 +4371,30 @@
     }
   }
 
+  /**
+   * Record the results produced by performing a [task] and return the cache
+   * entry associated with the results.
+   */
+  DartEntry _recordBuildUnitElementTask(BuildUnitElementTask task) {
+    Source source = task.source;
+    Source library = task.library;
+    DartEntry dartEntry = _cache.get(source);
+    CaughtException thrownException = task.exception;
+    if (thrownException != null) {
+      dartEntry.recordBuildElementErrorInLibrary(library, thrownException);
+      throw new AnalysisException('<rethrow>', thrownException);
+    }
+    dartEntry.setValueInLibrary(DartEntry.BUILT_UNIT, library, task.unit);
+    dartEntry.setValueInLibrary(
+        DartEntry.BUILT_ELEMENT,
+        library,
+        task.unitElement);
+    ChangeNoticeImpl notice = _getNotice(source);
+    LineInfo lineInfo = dartEntry.getValue(SourceEntry.LINE_INFO);
+    notice.setErrors(dartEntry.allErrors, lineInfo);
+    return dartEntry;
+  }
+
 //  /**
 //   * Notify all of the analysis listeners that the given source is no longer included in the set of
 //   * sources that are being analyzed.
@@ -4458,30 +4474,6 @@
 //  }
 
   /**
-   * Record the results produced by performing a [task] and return the cache
-   * entry associated with the results.
-   */
-  DartEntry _recordBuildUnitElementTask(BuildUnitElementTask task) {
-    Source source = task.source;
-    Source library = task.library;
-    DartEntry dartEntry = _cache.get(source);
-    CaughtException thrownException = task.exception;
-    if (thrownException != null) {
-      dartEntry.recordBuildElementErrorInLibrary(library, thrownException);
-      throw new AnalysisException('<rethrow>', thrownException);
-    }
-    dartEntry.setValueInLibrary(DartEntry.BUILT_UNIT, library, task.unit);
-    dartEntry.setValueInLibrary(
-        DartEntry.BUILT_ELEMENT,
-        library,
-        task.unitElement);
-    ChangeNoticeImpl notice = _getNotice(source);
-    LineInfo lineInfo = dartEntry.getValue(SourceEntry.LINE_INFO);
-    notice.setErrors(dartEntry.allErrors, lineInfo);
-    return dartEntry;
-  }
-
-  /**
    * Given a cache entry and a library element, record the library element and other information
    * gleaned from the element in the cache entry.
    *
@@ -4610,7 +4602,6 @@
     return libraryEntry;
   }
 
-
   /**
    * Record the results produced by performing a [task] and return the cache
    * entry associated with the results.
@@ -4644,7 +4635,7 @@
     CompilationUnit unit = task.compilationUnit;
     if (unit != null) {
       ChangeNoticeImpl notice = _getNotice(task.source);
-      notice.compilationUnit = unit;
+      notice.resolvedDartUnit = unit;
       _incrementalAnalysisCache =
           IncrementalAnalysisCache.cacheResult(task.cache, unit);
     }
@@ -4705,6 +4696,9 @@
     dartEntry.setValue(DartEntry.INCLUDED_PARTS, newParts);
     _cache.storedAst(source);
     ChangeNoticeImpl notice = _getNotice(source);
+    if (notice.resolvedDartUnit == null) {
+      notice.parsedDartUnit = task.compilationUnit;
+    }
     notice.setErrors(dartEntry.allErrors, task.lineInfo);
     // Verify that the incrementally parsed and resolved unit in the incremental
     // cache is structurally equivalent to the fully parsed unit
@@ -4782,7 +4776,7 @@
     htmlEntry.setValue(HtmlEntry.RESOLUTION_ERRORS, task.resolutionErrors);
     _cache.storedAst(source);
     ChangeNoticeImpl notice = _getNotice(source);
-    notice.htmlUnit = task.resolvedUnit;
+    notice.resolvedHtmlUnit = task.resolvedUnit;
     LineInfo lineInfo = htmlEntry.getValue(SourceEntry.LINE_INFO);
     notice.setErrors(htmlEntry.allErrors, lineInfo);
     return htmlEntry;
@@ -4945,8 +4939,8 @@
     // reset unit in the notification, it is out of date now
     ChangeNoticeImpl notice = _pendingNotices[source];
     if (notice != null) {
-      notice.compilationUnit = null;
-      notice.htmlUnit = null;
+      notice.resolvedDartUnit = null;
+      notice.resolvedHtmlUnit = null;
     }
   }
 
@@ -5079,7 +5073,7 @@
       DartEntry dartEntry = _cache.get(source);
       LineInfo lineInfo = getLineInfo(source);
       ChangeNoticeImpl notice = _getNotice(source);
-      notice.compilationUnit = unit;
+      notice.resolvedDartUnit = unit;
       notice.setErrors(dartEntry.allErrors, lineInfo);
     });
     // OK
@@ -5137,6 +5131,32 @@
     }
     return changedSources.length > 0;
   }
+
+  void _validateLastIncrementalResolutionResult() {
+    if (incrementalResolutionValidation_lastUnitSource == null ||
+        incrementalResolutionValidation_lastLibrarySource == null ||
+        incrementalResolutionValidation_lastUnit == null) {
+      return;
+    }
+    CompilationUnit fullUnit = getResolvedCompilationUnit2(
+        incrementalResolutionValidation_lastUnitSource,
+        incrementalResolutionValidation_lastLibrarySource);
+    if (fullUnit != null) {
+      try {
+        assertSameResolution(
+            incrementalResolutionValidation_lastUnit,
+            fullUnit);
+      } on IncrementalResolutionMismatch catch (mismatch, stack) {
+        String failure = mismatch.message;
+        String message =
+            'Incremental resolution mismatch:\n$failure\nat\n$stack';
+        AnalysisEngine.instance.logger.logError(message);
+      }
+    }
+    incrementalResolutionValidation_lastUnitSource = null;
+    incrementalResolutionValidation_lastLibrarySource = null;
+    incrementalResolutionValidation_lastUnit = null;
+  }
 }
 
 /**
@@ -5833,6 +5853,72 @@
 }
 
 /**
+ * Information about single piece of data in the cache.
+ */
+abstract class AnalysisContextStatistics_CacheRow {
+  /**
+   * List of possible states which can be queried.
+   */
+  static const List<CacheState> STATES = const <CacheState>[
+      CacheState.ERROR,
+      CacheState.FLUSHED,
+      CacheState.IN_PROCESS,
+      CacheState.INVALID,
+      CacheState.VALID];
+
+  /**
+   * Return the number of entries whose state is [CacheState.ERROR].
+   */
+  int get errorCount;
+
+  /**
+   * Return the number of entries whose state is [CacheState.FLUSHED].
+   */
+  int get flushedCount;
+
+  /**
+   * Return the number of entries whose state is [CacheState.IN_PROCESS].
+   */
+  int get inProcessCount;
+
+  /**
+   * Return the number of entries whose state is [CacheState.INVALID].
+   */
+  int get invalidCount;
+
+  /**
+   * Return the name of the data represented by this object.
+   */
+  String get name;
+
+  /**
+   * Return the number of entries whose state is [CacheState.VALID].
+   */
+  int get validCount;
+
+  /**
+   * Return the number of entries whose state is [state].
+   */
+  int getCount(CacheState state);
+}
+
+/**
+ * Information about a single partition in the cache.
+ */
+abstract class AnalysisContextStatistics_PartitionData {
+  /**
+   * Return the number of entries in the partition that have an AST structure in one state or
+   * another.
+   */
+  int get astCount;
+
+  /**
+   * Return the total number of entries in the partition.
+   */
+  int get totalCount;
+}
+
+/**
  * Implementation of the [AnalysisContextStatistics].
  */
 class AnalysisContextStatisticsImpl implements AnalysisContextStatistics {
@@ -5949,72 +6035,6 @@
 }
 
 /**
- * Information about single piece of data in the cache.
- */
-abstract class AnalysisContextStatistics_CacheRow {
-  /**
-   * List of possible states which can be queried.
-   */
-  static const List<CacheState> STATES = const <CacheState>[
-      CacheState.ERROR,
-      CacheState.FLUSHED,
-      CacheState.IN_PROCESS,
-      CacheState.INVALID,
-      CacheState.VALID];
-
-  /**
-   * Return the number of entries whose state is [CacheState.ERROR].
-   */
-  int get errorCount;
-
-  /**
-   * Return the number of entries whose state is [CacheState.FLUSHED].
-   */
-  int get flushedCount;
-
-  /**
-   * Return the number of entries whose state is [CacheState.IN_PROCESS].
-   */
-  int get inProcessCount;
-
-  /**
-   * Return the number of entries whose state is [CacheState.INVALID].
-   */
-  int get invalidCount;
-
-  /**
-   * Return the name of the data represented by this object.
-   */
-  String get name;
-
-  /**
-   * Return the number of entries whose state is [CacheState.VALID].
-   */
-  int get validCount;
-
-  /**
-   * Return the number of entries whose state is [state].
-   */
-  int getCount(CacheState state);
-}
-
-/**
- * Information about a single partition in the cache.
- */
-abstract class AnalysisContextStatistics_PartitionData {
-  /**
-   * Return the number of entries in the partition that have an AST structure in one state or
-   * another.
-   */
-  int get astCount;
-
-  /**
-   * Return the total number of entries in the partition.
-   */
-  int get totalCount;
-}
-
-/**
  * Instances of the class `AnalysisDelta` indicate changes to the types of analysis that
  * should be performed.
  */
@@ -6510,7 +6530,7 @@
   /**
    * The maximum number of sources for which data should be kept in the cache.
    */
-  static int DEFAULT_CACHE_SIZE = 64;
+  static const int DEFAULT_CACHE_SIZE = 64;
 
   /**
    * The default value for enabling deferred loading.
@@ -6878,6 +6898,32 @@
 }
 
 /**
+ * A `CachedResult` is a single analysis result that is stored in a
+ * [SourceEntry].
+ */
+class CachedResult<E> {
+  /**
+   * The state of the cached value.
+   */
+  CacheState state;
+
+  /**
+   * The value being cached, or `null` if there is no value (for example, when
+   * the [state] is [CacheState.INVALID].
+   */
+  E value;
+
+  /**
+   * Initialize a newly created result holder to represent the value of data
+   * described by the given [descriptor].
+   */
+  CachedResult(DataDescriptor descriptor) {
+    state = CacheState.INVALID;
+    value = descriptor.defaultValue;
+  }
+}
+
+/**
  * Instances of the class `CachePartition` implement a single partition in an LRU cache of
  * information related to analysis.
  */
@@ -7198,63 +7244,36 @@
 }
 
 /**
- * A `CachedResult` is a single analysis result that is stored in a
- * [SourceEntry].
- */
-class CachedResult<E> {
-  /**
-   * The state of the cached value.
-   */
-  CacheState state;
-
-  /**
-   * The value being cached, or `null` if there is no value (for example, when
-   * the [state] is [CacheState.INVALID].
-   */
-  E value;
-
-  /**
-   * Initialize a newly created result holder to represent the value of data
-   * described by the given [descriptor].
-   */
-  CachedResult(DataDescriptor descriptor) {
-    state = CacheState.INVALID;
-    value = descriptor.defaultValue;
-  }
-}
-
-/**
- * The interface `ChangeNotice` defines the behavior of objects that represent a change to the
- * analysis results associated with a given source.
+ * An object that represents a change to the analysis results associated with a
+ * given source.
  */
 abstract class ChangeNotice implements AnalysisErrorInfo {
   /**
-   * Return the fully resolved AST that changed as a result of the analysis, or `null` if the
-   * AST was not changed.
-   *
-   * @return the fully resolved AST that changed as a result of the analysis
+   * The parsed, but maybe not resolved Dart AST that changed as a result of
+   * the analysis, or `null` if the AST was not changed.
    */
-  CompilationUnit get compilationUnit;
+  CompilationUnit get parsedDartUnit;
 
   /**
-   * Return the fully resolved HTML that changed as a result of the analysis, or `null` if the
-   * HTML was not changed.
-   *
-   * @return the fully resolved HTML that changed as a result of the analysis
+   * The fully resolved Dart AST that changed as a result of the analysis, or
+   * `null` if the AST was not changed.
    */
-  ht.HtmlUnit get htmlUnit;
+  CompilationUnit get resolvedDartUnit;
+
+  /**
+   * The fully resolved HTML AST that changed as a result of the analysis, or
+   * `null` if the AST was not changed.
+   */
+  ht.HtmlUnit get resolvedHtmlUnit;
 
   /**
    * Return the source for which the result is being reported.
-   *
-   * @return the source for which the result is being reported
    */
   Source get source;
 }
 
 /**
- * Instances of the class `ChangeNoticeImpl` represent a change to the analysis results
- * associated with a given source.
+ * An implementation of a [ChangeNotice].
  */
 class ChangeNoticeImpl implements ChangeNotice {
   /**
@@ -7268,25 +7287,32 @@
   final Source source;
 
   /**
-   * The fully resolved AST that changed as a result of the analysis, or `null` if the AST was
-   * not changed.
+   * The parsed, but maybe not resolved Dart AST that changed as a result of
+   * the analysis, or `null` if the AST was not changed.
    */
-  CompilationUnit compilationUnit;
+  CompilationUnit parsedDartUnit;
 
   /**
-   * The fully resolved HTML that changed as a result of the analysis, or `null` if the HTML
-   * was not changed.
+   * The fully resolved Dart AST that changed as a result of the analysis, or
+   * `null` if the AST was not changed.
    */
-  ht.HtmlUnit htmlUnit;
+  CompilationUnit resolvedDartUnit;
 
   /**
-   * The errors that changed as a result of the analysis, or `null` if errors were not
-   * changed.
+   * The fully resolved HTML AST that changed as a result of the analysis, or
+   * `null` if the AST was not changed.
+   */
+  ht.HtmlUnit resolvedHtmlUnit;
+
+  /**
+   * The errors that changed as a result of the analysis, or `null` if errors
+   * were not changed.
    */
   List<AnalysisError> _errors;
 
   /**
-   * The line information associated with the source, or `null` if errors were not changed.
+   * The line information associated with the source, or `null` if errors were
+   * not changed.
    */
   LineInfo _lineInfo;
 
@@ -7304,11 +7330,8 @@
   LineInfo get lineInfo => _lineInfo;
 
   /**
-   * Set the errors that changed as a result of the analysis to the given errors and set the line
-   * information to the given line information.
-   *
-   * @param errors the errors that changed as a result of the analysis
-   * @param lineInfo the line information associated with the source
+   * Set the errors that changed as a result of the analysis to the given
+   * [errors] and set the line information to the given [lineInfo].
    */
   void setErrors(List<AnalysisError> errors, LineInfo lineInfo) {
     this._errors = errors;
@@ -8148,6 +8171,18 @@
   }
 
   /**
+   * Invalidate all of the parse and resolution information associated with
+   * this source.
+   */
+  void invalidateParseInformation() {
+    setState(SOURCE_KIND, CacheState.INVALID);
+    setState(PARSE_ERRORS, CacheState.INVALID);
+    setState(PARSED_UNIT, CacheState.INVALID);
+    _containingLibraries.clear();
+    _discardCachedResolutionInformation(true);
+  }
+
+  /**
    * Record that an [exception] occurred while attempting to build the element
    * model for the source represented by this entry in the context of the given
    * [library]. This will set the state of all resolution-based information as
@@ -8886,16 +8921,16 @@
   /// The element model for the library being analyzed.
   final LibraryElement libraryElement;
 
-  /// Initialize a newly created task to perform lint checking over these
-  /// [_units] belonging to this [libraryElement] within the given [context].
-  GenerateDartLintsTask(context, this._units, this.libraryElement)
-      : super(context);
-
   /// A mapping of analyzed sources to their associated lint warnings.
   /// May be [null] if the task has not been performed or if analysis did not
   /// complete normally.
   HashMap<Source, List<AnalysisError>> lintMap;
 
+  /// Initialize a newly created task to perform lint checking over these
+  /// [_units] belonging to this [libraryElement] within the given [context].
+  GenerateDartLintsTask(context, this._units, this.libraryElement)
+      : super(context);
+
   @override
   String get taskDescription {
     Source librarySource = libraryElement.source;
@@ -9005,7 +9040,10 @@
       TimestampedData<String> data = context.getContents(source);
       _content = data.data;
       _modificationTime = data.modificationTime;
-      AnalysisEngine.instance.instrumentationService.logFileRead(source.fullName, _modificationTime, _content);
+      AnalysisEngine.instance.instrumentationService.logFileRead(
+          source.fullName,
+          _modificationTime,
+          _content);
     } catch (exception, stackTrace) {
       throw new AnalysisException(
           "Could not get contents of $source",
@@ -9142,6 +9180,7 @@
    * source files should also be invalidated.
    */
   void invalidateAllResolutionInformation(bool invalidateUris) {
+    setState(RESOLVED_UNIT, CacheState.INVALID);
     setState(ELEMENT, CacheState.INVALID);
     setState(RESOLUTION_ERRORS, CacheState.INVALID);
     setState(HINTS, CacheState.INVALID);
@@ -9150,6 +9189,16 @@
     }
   }
 
+  /**
+   * Invalidate all of the parse and resolution information associated with
+   * this source.
+   */
+  void invalidateParseInformation() {
+    setState(PARSE_ERRORS, CacheState.INVALID);
+    setState(PARSED_UNIT, CacheState.INVALID);
+    invalidateAllResolutionInformation(true);
+  }
+
   @override
   void recordContentError(CaughtException exception) {
     super.recordContentError(exception);
@@ -9574,6 +9623,13 @@
  */
 abstract class InternalAnalysisContext implements AnalysisContext {
   /**
+   * Allow the client to supply its own content cache.  This will take the
+   * place of the content cache created by default, allowing clients to share
+   * the content cache between contexts.
+   */
+  set contentCache(ContentCache value);
+
+  /**
    * Return an array containing all of the sources that have been marked as priority sources.
    * Clients must not modify the returned array.
    *
@@ -9656,6 +9712,25 @@
   Namespace getPublicNamespace(LibraryElement library);
 
   /**
+   * Respond to a change which has been made to the given [source] file.
+   * [originalContents] is the former contents of the file, and [newContents]
+   * is the updated contents.  If [notify] is true, a source changed event is
+   * triggered.
+   *
+   * Normally it should not be necessary for clinets to call this function,
+   * since it will be automatically invoked in response to a call to
+   * [applyChanges] or [setContents].  However, if this analysis context is
+   * sharing its content cache with other contexts, then the client must
+   * manually update the content cache and call this function for each context.
+   *
+   * Return `true` if the change was significant to this context (i.e. [source]
+   * is either implicitly or explicitly analyzed by this context, and a change
+   * actually occurred).
+   */
+  bool handleContentsChanged(Source source, String originalContents,
+      String newContents, bool notify);
+
+  /**
    * Given a table mapping the source for the libraries represented by the corresponding elements to
    * the elements representing the libraries, record those mappings.
    *
diff --git a/pkg/analyzer/lib/src/generated/incremental_resolution_validator.dart b/pkg/analyzer/lib/src/generated/incremental_resolution_validator.dart
index 2f9e3a0..2b9afd0 100644
--- a/pkg/analyzer/lib/src/generated/incremental_resolution_validator.dart
+++ b/pkg/analyzer/lib/src/generated/incremental_resolution_validator.dart
@@ -781,6 +781,11 @@
     _visitNode(node.expression, other.expression);
   }
 
+  void _assertNode(AstNode a, AstNode b) {
+    _expectEquals(a.offset, b.offset);
+    _expectEquals(a.length, b.length);
+  }
+
   void _expectEquals(actual, expected) {
     if (actual != expected) {
       String message = '';
@@ -863,10 +868,12 @@
   }
 
   void _visitExpression(Expression a, Expression b) {
+//    print('[${a.offset}] |$a| vs. [${b.offset}] |$b|');
     _verifyType(a.staticType, b.staticType);
     _verifyType(a.propagatedType, b.propagatedType);
     _verifyElement(a.staticParameterElement, b.staticParameterElement);
     _verifyElement(a.propagatedParameterElement, b.propagatedParameterElement);
+    _assertNode(a, b);
   }
 
   void _visitList(NodeList nodeList, NodeList otherList) {
@@ -882,8 +889,7 @@
       _expectIsNull(other);
     } else {
       this.other = other;
-      _expectEquals(node.offset, other.offset);
-      _expectEquals(node.length, other.length);
+      _assertNode(node, other);
       node.accept(this);
     }
   }
diff --git a/pkg/analyzer/lib/src/generated/incremental_resolver.dart b/pkg/analyzer/lib/src/generated/incremental_resolver.dart
index 2088c51..b009946 100644
--- a/pkg/analyzer/lib/src/generated/incremental_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/incremental_resolver.dart
@@ -7,6 +7,8 @@
 import 'dart:collection';
 import 'dart:math' as math;
 
+import 'package:analyzer/src/services/lint.dart';
+
 import 'ast.dart';
 import 'element.dart';
 import 'engine.dart';
@@ -18,7 +20,6 @@
 import 'resolver.dart';
 import 'scanner.dart';
 import 'source.dart';
-import 'utilities_collection.dart';
 import 'utilities_dart.dart';
 
 
@@ -839,11 +840,6 @@
   List<AnalysisError> _lints = AnalysisError.NO_ERRORS;
 
   /**
-   * The elements that should be resolved because of API changes.
-   */
-  HashSet<Element> _resolutionQueue = new HashSet<Element>();
-
-  /**
    * Initialize a newly created incremental resolver to resolve a node in the
    * given source in the given library.
    */
@@ -884,8 +880,6 @@
       _generateLints(rootNode);
       // update entry errors
       _updateEntry();
-      // resolve queue in response of API changes
-      _resolveQueue();
       // OK
       return true;
     } finally {
@@ -932,11 +926,6 @@
     if (matchKind == DeclarationMatchKind.MATCH) {
       return true;
     }
-    // try to resolve a simple API change
-    if (_resolveApiChanges && matchKind == DeclarationMatchKind.MISMATCH_OK) {
-      _fillResolutionQueue(matcher);
-      return true;
-    }
     // mismatch that cannot be incrementally fixed
     return false;
   }
@@ -960,22 +949,6 @@
           node is MethodDeclaration ||
           node is TopLevelVariableDeclaration;
 
-  void _fillResolutionQueue(DeclarationMatcher matcher) {
-    HashSet<Element> removedElements = matcher._removedElements;
-    logger.log('${removedElements.length} elements removed');
-    for (Element removedElement in removedElements) {
-      AnalysisContextImpl context = removedElement.context;
-      IntSet users = removedElement.users;
-      while (!users.isEmpty) {
-        int id = users.remove();
-        Element removedElementUser = context.findElementById(id);
-        _resolutionQueue.add(removedElementUser);
-      }
-    }
-    // TODO(scheglov) a method change might also require its class, and
-    // subclasses resolution
-  }
-
   /**
    * Starting at [node], find the smallest AST node that can be resolved
    * independently of any other nodes. Return the node that was found.
@@ -1055,36 +1028,6 @@
     }
   }
 
-  /**
-   * Resolves elements [_resolutionQueue].
-   *
-   * TODO(scheglov) work in progress
-  *
-  * TODO(scheglov) revisit later. Each task duration should be kept short.
-   */
-  void _resolveQueue() {
-    logger.log('${_resolutionQueue.length} elements in the resolution queue');
-    for (Element element in _resolutionQueue) {
-      // TODO(scheglov) in general, we should not call Element.node, it
-      // might perform complete unit resolution.
-      logger.enter('resolve $element');
-      try {
-        AstNode node = element.node;
-        CompilationUnitElement unit =
-            element.getAncestor((e) => e is CompilationUnitElement);
-        IncrementalResolver resolver =
-            new IncrementalResolver(_units, unit, node.offset, node.end, node.end);
-        resolver._resolveReferences(node);
-        resolver._verify(node);
-        resolver._generateHints(node);
-        resolver._generateLints(node);
-        resolver._updateEntry();
-      } finally {
-        logger.exit();
-      }
-    }
-  }
-
   _resolveReferences(AstNode node) {
     LoggingTimer timer = logger.startTimer();
     try {
@@ -1261,9 +1204,20 @@
   bool resolve(String newCode) {
     logger.enter('diff/resolve $_unitSource');
     try {
+      // prepare old unit
       CompilationUnit oldUnit = _units[_unitSource];
+      if (!_areCurlyBracketsBalanced(oldUnit.beginToken)) {
+        logger.log('Unbalanced number of curly brackets in the old unit.');
+        return false;
+      }
       _unitElement = oldUnit.element;
+      // prepare new unit
       CompilationUnit newUnit = _parseUnit(newCode);
+      if (!_areCurlyBracketsBalanced(newUnit.beginToken)) {
+        logger.log('Unbalanced number of curly brackets in the new unit.');
+        return false;
+      }
+      // find difference
       _TokenPair firstPair =
           _findFirstDifferentToken(oldUnit.beginToken, newUnit.beginToken);
       _TokenPair lastPair =
@@ -1485,6 +1439,17 @@
     _entry.setValue(DartEntry.PARSE_ERRORS, _newParseErrors);
   }
 
+  /**
+   * Checks if [token] has a balanced number of open and closed curly brackets.
+   */
+  static bool _areCurlyBracketsBalanced(Token token) {
+    int numOpen = _getTokenCount(token, TokenType.OPEN_CURLY_BRACKET);
+    int numOpen2 =
+        _getTokenCount(token, TokenType.STRING_INTERPOLATION_EXPRESSION);
+    int numClosed = _getTokenCount(token, TokenType.CLOSE_CURLY_BRACKET);
+    return numOpen + numOpen2 == numClosed;
+  }
+
   static _TokenDifferenceKind _compareToken(Token oldToken, Token newToken,
       int delta) {
     if (oldToken == null && newToken == null) {
@@ -1580,7 +1545,6 @@
     return oldBeginToken;
   }
 
-
   static List<AstNode> _getParents(AstNode node) {
     List<AstNode> parents = <AstNode>[];
     while (node != null) {
@@ -1590,6 +1554,21 @@
     return parents;
   }
 
+
+  /**
+   * Returns number of tokens with the given [type].
+   */
+  static int _getTokenCount(Token token, TokenType type) {
+    int count = 0;
+    while (token.type != TokenType.EOF) {
+      if (token.type == type) {
+        count++;
+      }
+      token = token.next;
+    }
+    return count;
+  }
+
   /**
    * Set the given [comment] as a "precedingComments" for [parent].
    */
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 77daa8d..ae4bded 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -4470,54 +4470,6 @@
 }
 
 
-/// Traverses a library's worth of dart code at a time to generate lint warnings
-/// over the set of sources.
-///
-/// See [LintCode].
-class LintGenerator {
-
-  /// A global container for contributed verifiers.
-  static final List<LintVerifier> VERIFIERS = <LintVerifier>[];
-
-  final Iterable<CompilationUnit> _compilationUnits;
-  final AnalysisErrorListener _errorListener;
-  final Iterable<LintVerifier> _verifiers;
-
-  LintGenerator(this._compilationUnits, this._errorListener,
-      [Iterable<LintVerifier> verifiers])
-      : _verifiers = verifiers != null ? verifiers : VERIFIERS;
-
-  void generate() {
-    TimeCounter_TimeCounterHandle timeCounter =
-        PerformanceStatistics.lint.start();
-    try {
-      _compilationUnits.forEach((cu) {
-        if (cu.element != null) {
-          _generate(cu, cu.element.source);
-        }
-      });
-    } finally {
-      timeCounter.stop();
-    }
-  }
-
-  void _generate(CompilationUnit unit, Source source) {
-    ErrorReporter errorReporter = new ErrorReporter(_errorListener, source);
-    _verifiers.forEach((verifier) {
-      verifier.reporter = errorReporter;
-      return unit.accept(verifier);
-    });
-  }
-}
-
-/// Implementers contribute lint warnings via the provided error [reporter].
-abstract class LintVerifier extends RecursiveAstVisitor<Object> {
-  /// Used to report lint warnings.
-  /// NOTE: this is set by the framework before visit begins.
-  ErrorReporter reporter;
-}
-
-
 /**
  * Instances of the class {@code HtmlTagInfo} record information about the tags used in an HTML
  * file.
@@ -9249,6 +9201,7 @@
   }
 }
 
+
 /**
  * This class is used to replace uses of `HashMap<String, ExecutableElement>` which are not as
  * performant as this class.
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index 6b87673..f503831 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -16,6 +16,11 @@
 import 'sdk.dart' show DartSdk;
 
 /**
+ * A function that is used to handle [ContentCache] entries.
+ */
+typedef void ContentCacheVisitor(Source source, int stamp, String contents);
+
+/**
  * Instances of class `ContentCache` hold content used to override the default content of a
  * [Source].
  */
@@ -33,6 +38,16 @@
   HashMap<Source, int> _stampMap = new HashMap<Source, int>();
 
   /**
+   * Visit all entries of this cache.
+   */
+  void accept(ContentCacheVisitor visitor) {
+    _contentMap.forEach((Source source, String contents) {
+      int stamp = _stampMap[source];
+      visitor(source, stamp, contents);
+    });
+  }
+
+  /**
    * Return the contents of the given source, or `null` if this cache does not override the
    * contents of the source.
    *
diff --git a/pkg/analyzer/lib/src/generated/source_io.dart b/pkg/analyzer/lib/src/generated/source_io.dart
index 58aee24..ba147e3a 100644
--- a/pkg/analyzer/lib/src/generated/source_io.dart
+++ b/pkg/analyzer/lib/src/generated/source_io.dart
@@ -87,6 +87,12 @@
  * Instances of the class `FileBasedSource` implement a source that represents a file.
  */
 class FileBasedSource implements Source {
+
+  /**
+   * A function that changes the way that files are read off of disk.
+   */
+  static Function fileReadMode = (String s) => s;
+
   /**
    * The URI from which this source was originally derived.
    */
@@ -146,7 +152,7 @@
   TimestampedData<String> get contentsFromFile {
     return new TimestampedData<String>(
         file.lastModified(),
-        file.readAsStringSync());
+        fileReadMode(file.readAsStringSync()));
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/utilities_collection.dart b/pkg/analyzer/lib/src/generated/utilities_collection.dart
index 22012ff..47dd4f6 100644
--- a/pkg/analyzer/lib/src/generated/utilities_collection.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_collection.dart
@@ -469,33 +469,6 @@
 }
 
 /**
- * An efficient [int] set.
- * Currently not really efficient.
- */
-class IntSet {
-  HashSet<int> _set = new HashSet<int>();
-
-  bool get isEmpty {
-    return _set.isEmpty;
-  }
-
-  void add(int value) {
-    _set.add(value);
-  }
-
-  int remove() {
-    int value = _set.first;
-    _set.remove(value);
-    return value;
-  }
-
-  @override
-  String toString() {
-    return _set.toString();
-  }
-}
-
-/**
  * The class `ListUtilities` defines utility methods useful for working with [List
  ].
  */
diff --git a/pkg/analyzer/lib/src/generated/visitors.dart b/pkg/analyzer/lib/src/generated/visitors.dart
new file mode 100644
index 0000000..4e3101c
--- /dev/null
+++ b/pkg/analyzer/lib/src/generated/visitors.dart
@@ -0,0 +1,771 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 engine.ast.visitors;
+
+import 'package:analyzer/src/generated/ast.dart';
+
+/// An [AstVisitor] that delegates calls to visit methods to all [delegates]
+/// before calling [visitChildren].
+class DelegatingAstVisitor<T> implements AstVisitor<T> {
+
+  Iterable<AstVisitor<T>> _delegates;
+  DelegatingAstVisitor(this._delegates);
+
+  @override
+  T visitAdjacentStrings(AdjacentStrings node) {
+    _delegates.forEach((delegate) => delegate.visitAdjacentStrings(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitAnnotation(Annotation node) {
+    _delegates.forEach((delegate) => delegate.visitAnnotation(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitArgumentList(ArgumentList node) {
+    _delegates.forEach((delegate) => delegate.visitArgumentList(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitAsExpression(AsExpression node) {
+    _delegates.forEach((delegate) => delegate.visitAsExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitAssertStatement(AssertStatement node) {
+    _delegates.forEach((delegate) => delegate.visitAssertStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitAssignmentExpression(AssignmentExpression node) {
+    _delegates.forEach((delegate) => delegate.visitAssignmentExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitAwaitExpression(AwaitExpression node) {
+    _delegates.forEach((delegate) => delegate.visitAwaitExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitBinaryExpression(BinaryExpression node) {
+    _delegates.forEach((delegate) => delegate.visitBinaryExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitBlock(Block node) {
+    _delegates.forEach((delegate) => delegate.visitBlock(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitBlockFunctionBody(BlockFunctionBody node) {
+    _delegates.forEach((delegate) => delegate.visitBlockFunctionBody(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitBooleanLiteral(BooleanLiteral node) {
+    _delegates.forEach((delegate) => delegate.visitBooleanLiteral(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitBreakStatement(BreakStatement node) {
+    _delegates.forEach((delegate) => delegate.visitBreakStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitCascadeExpression(CascadeExpression node) {
+    _delegates.forEach((delegate) => delegate.visitCascadeExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitCatchClause(CatchClause node) {
+    _delegates.forEach((delegate) => delegate.visitCatchClause(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitClassDeclaration(ClassDeclaration node) {
+    _delegates.forEach((delegate) => delegate.visitClassDeclaration(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitClassTypeAlias(ClassTypeAlias node) {
+    _delegates.forEach((delegate) => delegate.visitClassTypeAlias(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitComment(Comment node) {
+    _delegates.forEach((delegate) => delegate.visitComment(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitCommentReference(CommentReference node) {
+    _delegates.forEach((delegate) => delegate.visitCommentReference(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitCompilationUnit(CompilationUnit node) {
+    _delegates.forEach((delegate) => delegate.visitCompilationUnit(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitConditionalExpression(ConditionalExpression node) {
+    _delegates.forEach((delegate) => delegate.visitConditionalExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitConstructorDeclaration(ConstructorDeclaration node) {
+    _delegates.forEach(
+        (delegate) => delegate.visitConstructorDeclaration(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    _delegates.forEach(
+        (delegate) => delegate.visitConstructorFieldInitializer(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitConstructorName(ConstructorName node) {
+    _delegates.forEach((delegate) => delegate.visitConstructorName(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitContinueStatement(ContinueStatement node) {
+    _delegates.forEach((delegate) => delegate.visitContinueStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitDeclaredIdentifier(DeclaredIdentifier node) {
+    _delegates.forEach((delegate) => delegate.visitDeclaredIdentifier(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitDefaultFormalParameter(DefaultFormalParameter node) {
+    _delegates.forEach(
+        (delegate) => delegate.visitDefaultFormalParameter(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitDoStatement(DoStatement node) {
+    _delegates.forEach((delegate) => delegate.visitDoStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitDoubleLiteral(DoubleLiteral node) {
+    _delegates.forEach((delegate) => delegate.visitDoubleLiteral(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitEmptyFunctionBody(EmptyFunctionBody node) {
+    _delegates.forEach((delegate) => delegate.visitEmptyFunctionBody(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitEmptyStatement(EmptyStatement node) {
+    _delegates.forEach((delegate) => delegate.visitEmptyStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    _delegates.forEach(
+        (delegate) => delegate.visitEnumConstantDeclaration(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitEnumDeclaration(EnumDeclaration node) {
+    _delegates.forEach((delegate) => delegate.visitEnumDeclaration(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitExportDirective(ExportDirective node) {
+    _delegates.forEach((delegate) => delegate.visitExportDirective(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    _delegates.forEach(
+        (delegate) => delegate.visitExpressionFunctionBody(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitExpressionStatement(ExpressionStatement node) {
+    _delegates.forEach((delegate) => delegate.visitExpressionStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitExtendsClause(ExtendsClause node) {
+    _delegates.forEach((delegate) => delegate.visitExtendsClause(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitFieldDeclaration(FieldDeclaration node) {
+    _delegates.forEach((delegate) => delegate.visitFieldDeclaration(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitFieldFormalParameter(FieldFormalParameter node) {
+    _delegates.forEach((delegate) => delegate.visitFieldFormalParameter(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitForEachStatement(ForEachStatement node) {
+    _delegates.forEach((delegate) => delegate.visitForEachStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitForStatement(ForStatement node) {
+    _delegates.forEach((delegate) => delegate.visitForStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitFormalParameterList(FormalParameterList node) {
+    _delegates.forEach((delegate) => delegate.visitFormalParameterList(node));
+    node.visitChildren(this);
+    return null;
+  }
+  @override
+  T visitFunctionDeclaration(FunctionDeclaration node) {
+    _delegates.forEach((delegate) => delegate.visitFunctionDeclaration(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    _delegates.forEach(
+        (delegate) => delegate.visitFunctionDeclarationStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitFunctionExpression(FunctionExpression node) {
+    _delegates.forEach((delegate) => delegate.visitFunctionExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    _delegates.forEach(
+        (delegate) => delegate.visitFunctionExpressionInvocation(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitFunctionTypeAlias(FunctionTypeAlias node) {
+    _delegates.forEach((delegate) => delegate.visitFunctionTypeAlias(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    _delegates.forEach(
+        (delegate) => delegate.visitFunctionTypedFormalParameter(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitHideCombinator(HideCombinator node) {
+    _delegates.forEach((delegate) => delegate.visitHideCombinator(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitIfStatement(IfStatement node) {
+    _delegates.forEach((delegate) => delegate.visitIfStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitImplementsClause(ImplementsClause node) {
+    _delegates.forEach((delegate) => delegate.visitImplementsClause(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitImportDirective(ImportDirective node) {
+    _delegates.forEach((delegate) => delegate.visitImportDirective(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitIndexExpression(IndexExpression node) {
+    _delegates.forEach((delegate) => delegate.visitIndexExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitInstanceCreationExpression(InstanceCreationExpression node) {
+    _delegates.forEach(
+        (delegate) => delegate.visitInstanceCreationExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitIntegerLiteral(IntegerLiteral node) {
+    _delegates.forEach((delegate) => delegate.visitIntegerLiteral(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitInterpolationExpression(InterpolationExpression node) {
+    _delegates.forEach(
+        (delegate) => delegate.visitInterpolationExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitInterpolationString(InterpolationString node) {
+    _delegates.forEach((delegate) => delegate.visitInterpolationString(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitIsExpression(IsExpression node) {
+    _delegates.forEach((delegate) => delegate.visitIsExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitLabel(Label node) {
+    _delegates.forEach((delegate) => delegate.visitLabel(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitLabeledStatement(LabeledStatement node) {
+    _delegates.forEach((delegate) => delegate.visitLabeledStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitLibraryDirective(LibraryDirective node) {
+    _delegates.forEach((delegate) => delegate.visitLibraryDirective(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitLibraryIdentifier(LibraryIdentifier node) {
+    _delegates.forEach((delegate) => delegate.visitLibraryIdentifier(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitListLiteral(ListLiteral node) {
+    _delegates.forEach((delegate) => delegate.visitListLiteral(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitMapLiteral(MapLiteral node) {
+    _delegates.forEach((delegate) => delegate.visitMapLiteral(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitMapLiteralEntry(MapLiteralEntry node) {
+    _delegates.forEach((delegate) => delegate.visitMapLiteralEntry(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitMethodDeclaration(MethodDeclaration node) {
+    _delegates.forEach((delegate) => delegate.visitMethodDeclaration(node));
+    node.visitChildren(this);
+    return null;
+  }
+  @override
+  T visitMethodInvocation(MethodInvocation node) {
+    _delegates.forEach((delegate) => delegate.visitMethodInvocation(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitNamedExpression(NamedExpression node) {
+    _delegates.forEach((delegate) => delegate.visitNamedExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitNativeClause(NativeClause node) {
+    _delegates.forEach((delegate) => delegate.visitNativeClause(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitNativeFunctionBody(NativeFunctionBody node) {
+    _delegates.forEach((delegate) => delegate.visitNativeFunctionBody(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitNullLiteral(NullLiteral node) {
+    _delegates.forEach((delegate) => delegate.visitNullLiteral(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitParenthesizedExpression(ParenthesizedExpression node) {
+    _delegates.forEach(
+        (delegate) => delegate.visitParenthesizedExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitPartDirective(PartDirective node) {
+    _delegates.forEach((delegate) => delegate.visitPartDirective(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitPartOfDirective(PartOfDirective node) {
+    _delegates.forEach((delegate) => delegate.visitPartOfDirective(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitPostfixExpression(PostfixExpression node) {
+    _delegates.forEach((delegate) => delegate.visitPostfixExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitPrefixExpression(PrefixExpression node) {
+    _delegates.forEach((delegate) => delegate.visitPrefixExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+  @override
+  T visitPrefixedIdentifier(PrefixedIdentifier node) {
+    _delegates.forEach((delegate) => delegate.visitPrefixedIdentifier(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitPropertyAccess(PropertyAccess node) {
+    _delegates.forEach((delegate) => delegate.visitPropertyAccess(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T
+      visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+    _delegates.forEach(
+        (delegate) => delegate.visitRedirectingConstructorInvocation(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitRethrowExpression(RethrowExpression node) {
+    _delegates.forEach((delegate) => delegate.visitRethrowExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitReturnStatement(ReturnStatement node) {
+    _delegates.forEach((delegate) => delegate.visitReturnStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitScriptTag(ScriptTag node) {
+    _delegates.forEach((delegate) => delegate.visitScriptTag(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitShowCombinator(ShowCombinator node) {
+    _delegates.forEach((delegate) => delegate.visitShowCombinator(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitSimpleFormalParameter(SimpleFormalParameter node) {
+    _delegates.forEach((delegate) => delegate.visitSimpleFormalParameter(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitSimpleIdentifier(SimpleIdentifier node) {
+    _delegates.forEach((delegate) => delegate.visitSimpleIdentifier(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitSimpleStringLiteral(SimpleStringLiteral node) {
+    _delegates.forEach((delegate) => delegate.visitSimpleStringLiteral(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitStringInterpolation(StringInterpolation node) {
+    _delegates.forEach((delegate) => delegate.visitStringInterpolation(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    _delegates.forEach(
+        (delegate) => delegate.visitSuperConstructorInvocation(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitSuperExpression(SuperExpression node) {
+    _delegates.forEach((delegate) => delegate.visitSuperExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitSwitchCase(SwitchCase node) {
+    _delegates.forEach((delegate) => delegate.visitSwitchCase(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitSwitchDefault(SwitchDefault node) {
+    _delegates.forEach((delegate) => delegate.visitSwitchDefault(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitSwitchStatement(SwitchStatement node) {
+    _delegates.forEach((delegate) => delegate.visitSwitchStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitSymbolLiteral(SymbolLiteral node) {
+    _delegates.forEach((delegate) => delegate.visitSymbolLiteral(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitThisExpression(ThisExpression node) {
+    _delegates.forEach((delegate) => delegate.visitThisExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitThrowExpression(ThrowExpression node) {
+    _delegates.forEach((delegate) => delegate.visitThrowExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    _delegates.forEach(
+        (delegate) => delegate.visitTopLevelVariableDeclaration(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitTryStatement(TryStatement node) {
+    _delegates.forEach((delegate) => delegate.visitTryStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitTypeArgumentList(TypeArgumentList node) {
+    _delegates.forEach((delegate) => delegate.visitTypeArgumentList(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitTypeName(TypeName node) {
+    _delegates.forEach((delegate) => delegate.visitTypeName(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitTypeParameter(TypeParameter node) {
+    _delegates.forEach((delegate) => delegate.visitTypeParameter(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitTypeParameterList(TypeParameterList node) {
+    _delegates.forEach((delegate) => delegate.visitTypeParameterList(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitVariableDeclaration(VariableDeclaration node) {
+    _delegates.forEach((delegate) => delegate.visitVariableDeclaration(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitVariableDeclarationList(VariableDeclarationList node) {
+    _delegates.forEach(
+        (delegate) => delegate.visitVariableDeclarationList(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    _delegates.forEach(
+        (delegate) => delegate.visitVariableDeclarationStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitWhileStatement(WhileStatement node) {
+    _delegates.forEach((delegate) => delegate.visitWhileStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitWithClause(WithClause node) {
+    _delegates.forEach((delegate) => delegate.visitWithClause(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitYieldStatement(YieldStatement node) {
+    _delegates.forEach((delegate) => delegate.visitYieldStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+}
diff --git a/pkg/analyzer/lib/src/services/lint.dart b/pkg/analyzer/lib/src/services/lint.dart
new file mode 100644
index 0000000..c0edb2c
--- /dev/null
+++ b/pkg/analyzer/lib/src/services/lint.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 lint;
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/utilities_general.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/visitors.dart';
+
+
+/// Implementers contribute lint warnings via the provided error [reporter].
+abstract class Linter {
+  /// Used to report lint warnings.
+  /// NOTE: this is set by the framework before visit begins.
+  ErrorReporter reporter;
+
+  /// Return a visitor to be passed to compilation units to perform lint
+  /// analysis.
+  /// Lint errors are reported via this [Linter]'s error [reporter].
+  AstVisitor getVisitor();
+}
+
+/// Traverses a library's worth of dart code at a time to generate lint warnings
+/// over the set of sources.
+///
+/// See [LintCode].
+class LintGenerator {
+
+  /// A global container for contributed linters.
+  static final List<Linter> LINTERS = <Linter>[];
+
+  final Iterable<CompilationUnit> _compilationUnits;
+  final AnalysisErrorListener _errorListener;
+  final Iterable<Linter> _linters;
+
+  LintGenerator(this._compilationUnits, this._errorListener,
+      [Iterable<Linter> linters])
+      : _linters = linters != null ? linters : LINTERS;
+
+  void generate() {
+    TimeCounter_TimeCounterHandle timeCounter =
+        PerformanceStatistics.lint.start();
+    try {
+      _compilationUnits.forEach((cu) {
+        if (cu.element != null) {
+          _generate(cu, cu.element.source);
+        }
+      });
+    } finally {
+      timeCounter.stop();
+    }
+  }
+
+  void _generate(CompilationUnit unit, Source source) {
+    ErrorReporter errorReporter = new ErrorReporter(_errorListener, source);
+    _linters.forEach((l) => l.reporter = errorReporter);
+    Iterable<AstVisitor> visitors = _linters.map((l) => l.getVisitor());
+    unit.accept(new DelegatingAstVisitor(visitors.where((v) => v != null)));
+  }
+}
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/task/general.dart b/pkg/analyzer/lib/src/task/general.dart
new file mode 100644
index 0000000..25feb6f
--- /dev/null
+++ b/pkg/analyzer/lib/src/task/general.dart
@@ -0,0 +1,70 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 analyzer.src.task.general;
+
+import 'package:analyzer/src/generated/engine.dart' hide AnalysisTask;
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/task/general.dart';
+import 'package:analyzer/task/model.dart';
+
+/**
+ * A task that gets the contents of the source associated with an analysis
+ * target.
+ */
+class GetContentTask extends AnalysisTask {
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'GET_CONTENT',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[CONTENT, MODIFICATION_TIME]);
+
+  /**
+   * Initialize a newly created task to access the content of the source
+   * associated with the given [target] in the given [context].
+   */
+  GetContentTask(InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  String get description {
+    Source source = target.source;
+    if (source == null) {
+      return "get contents of <unknown source>";
+    }
+    return "get contents of ${source.fullName}";
+  }
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  internalPerform() {
+    Source source = getRequiredSource();
+
+    TimestampedData<String> data = context.getContents(source);
+    outputs[CONTENT] = data.data;
+    outputs[MODIFICATION_TIME] = data.modificationTime;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the given [target].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    return <String, TaskInput>{};
+  }
+
+  /**
+   * Create a [GetContentTask] based on the given [target] in the given
+   * [context].
+   */
+  static GetContentTask createTask(AnalysisContext context,
+      AnalysisTarget target) {
+    return new GetContentTask(context, target);
+  }
+}
diff --git a/pkg/analyzer/lib/src/task/inputs.dart b/pkg/analyzer/lib/src/task/inputs.dart
new file mode 100644
index 0000000..d99055f
--- /dev/null
+++ b/pkg/analyzer/lib/src/task/inputs.dart
@@ -0,0 +1,379 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 analyzer.src.task.inputs;
+
+import 'dart:collection';
+
+import 'package:analyzer/task/model.dart';
+
+/**
+ * A function that converts an arbitrary object into a [TaskInput]. This is
+ * used, for example, by a [ListBasedTaskInput] to create task inputs for each
+ * value in a list of values.
+ */
+typedef TaskInput<E> GenerateTaskInputs<E>(Object object);
+
+/**
+ * An input to an [AnalysisTask] that is computed by the following steps. First
+ * another (base) task input is used to compute a [List]-valued result. An input
+ * generator function is then used to map each element of that list to a task
+ * input. Finally, each of the task inputs are used to access analysis results,
+ * and the list of the analysis results is used as the input to the task.
+ */
+class ListBasedTaskInput<B, E> implements TaskInput<List<E>> {
+  /**
+   * The accessor used to access the list of elements being mapped.
+   */
+  final TaskInput<B> baseAccessor;
+
+  /**
+   * The function used to convert an element in the list returned by the
+   * [baseAccessor] to a task input.
+   */
+  GenerateTaskInputs<E> generateTaskInputs;
+
+  /**
+   * Initialize a result accessor to use the given [baseAccessor] to access a
+   * list of values that can be passed to the given [generateTaskInputs] to generate
+   * a list of task inputs that can be used to access the elements of the input
+   * being accessed.
+   */
+  ListBasedTaskInput(this.baseAccessor, this.generateTaskInputs);
+
+  @override
+  TaskInputBuilder<List<E>> createBuilder() =>
+      new ListBasedTaskInputBuilder<B, E>(this);
+}
+
+/**
+ * A [TaskInputBuilder] used to build an input based on a [ListBasedTaskInput].
+ */
+class ListBasedTaskInputBuilder<B, E> implements TaskInputBuilder<List<E>> {
+  /**
+   * The input being built.
+   */
+  final ListBasedTaskInput<B, E> input;
+
+  /**
+   * The builder used to build the current result.
+   */
+  TaskInputBuilder currentBuilder;
+
+  /**
+   * The list of values computed by the [input]'s base accessor.
+   */
+  List _baseList = null;
+
+  /**
+   * The index in the [_baseList] of the value for which a value is currently
+   * being built.
+   */
+  int _baseListIndex = -1;
+
+  /**
+   * The list of values being built.
+   */
+  List<E> _resultValue = null;
+
+  /**
+   * Initialize a newly created task input builder that computes the result
+   * specified by the given [input].
+   */
+  ListBasedTaskInputBuilder(this.input);
+
+  @override
+  ResultDescriptor get currentResult {
+    if (currentBuilder == null) {
+      return null;
+    }
+    return currentBuilder.currentResult;
+  }
+
+  @override
+  AnalysisTarget get currentTarget {
+    if (currentBuilder == null) {
+      return null;
+    }
+    return currentBuilder.currentTarget;
+  }
+
+  @override
+  void set currentValue(Object value) {
+    if (currentBuilder == null) {
+      throw new StateError(
+          'Cannot set the result value when there is no current result');
+    }
+    currentBuilder.currentValue = value;
+  }
+
+  @override
+  List<E> get inputValue {
+    if (currentBuilder != null || _resultValue == null) {
+      throw new StateError('Result value has not been created');
+    }
+    return _resultValue;
+  }
+
+  @override
+  bool moveNext() {
+    if (currentBuilder == null) {
+      if (_resultValue == null) {
+        // This is the first time moveNext has been invoked, so start by
+        // computing the list of values from which the results will be derived.
+        currentBuilder = input.baseAccessor.createBuilder();
+        return currentBuilder.moveNext();
+      } else {
+        // We have already computed all of the results, so just return false.
+        return false;
+      }
+    }
+    if (currentBuilder.moveNext()) {
+      return true;
+    }
+    if (_resultValue == null) {
+      // We have finished computing the list of values from which the results
+      // will be derived.
+      _baseList = currentBuilder.inputValue;
+      _baseListIndex = 0;
+      _resultValue = <E>[];
+    } else {
+      // We have finished computing one of the elements in the result list.
+      _resultValue.add(currentBuilder.inputValue);
+      _baseListIndex++;
+    }
+    if (_baseListIndex >= _baseList.length) {
+      currentBuilder = null;
+      return false;
+    }
+    currentBuilder =
+        input.generateTaskInputs(_baseList[_baseListIndex]).createBuilder();
+    return currentBuilder.moveNext();
+  }
+}
+
+/**
+ * An input to an [AnalysisTask] that is computed by accessing a single result
+ * defined on a single target.
+ */
+class SimpleTaskInput<V> implements TaskInput<V> {
+  /**
+   * The target on which the result is defined.
+   */
+  final AnalysisTarget target;
+
+  /**
+   * The result to be accessed.
+   */
+  final ResultDescriptor<V> result;
+
+  /**
+   * Initialize a newly created task input that computes the input by accessing
+   * the given [result] associated with the given [target].
+   */
+  SimpleTaskInput(this.target, this.result);
+
+  @override
+  TaskInputBuilder<V> createBuilder() => new SimpleTaskInputBuilder<V>(this);
+}
+
+/**
+ * A [TaskInputBuilder] used to build an input based on a [SimpleTaskInput].
+ */
+class SimpleTaskInputBuilder<V> implements TaskInputBuilder<V> {
+  /**
+   * The state value indicating that the builder is positioned before the single
+   * result.
+   */
+  static const _BEFORE = -1;
+
+  /**
+   * The state value indicating that the builder is positioned at the single
+   * result.
+   */
+  static const _AT = 0;
+
+  /**
+   * The state value indicating that the builder is positioned after the single
+   * result.
+   */
+  static const _AFTER = 1;
+
+  /**
+   * The input being built.
+   */
+  final SimpleTaskInput<V> input;
+
+  /**
+   * The value of the input being built.
+   */
+  V _resultValue = null;
+
+  /**
+   * The state of the builder.
+   */
+  int _state = _BEFORE;
+
+  /**
+   * A flag indicating whether the result value was explicitly set.
+   */
+  bool _resultSet = false;
+
+  /**
+   * Initialize a newly created task input builder that computes the result
+   * specified by the given [input].
+   */
+  SimpleTaskInputBuilder(this.input);
+
+  @override
+  ResultDescriptor get currentResult => _state == _AT ? input.result : null;
+
+  @override
+  AnalysisTarget get currentTarget => _state == _AT ? input.target : null;
+
+  @override
+  void set currentValue(Object value) {
+    if (_state != _AT) {
+      throw new StateError(
+          'Cannot set the result value when there is no current result');
+    }
+    _resultValue = value as V;
+    _resultSet = true;
+  }
+
+  @override
+  V get inputValue {
+    if (_state != _AFTER) {
+      throw new StateError('Result value has not been created');
+    }
+    return _resultValue;
+  }
+
+  @override
+  bool moveNext() {
+    if (_state == _BEFORE) {
+      _state = _AT;
+      return true;
+    } else {
+      if (!_resultSet) {
+        throw new StateError(
+            'The value of the current result must be set before moving to the next result.');
+      }
+      _state = _AFTER;
+      return false;
+    }
+  }
+}
+
+/**
+ * A [TaskInputBuilder] used to build an input based on one or more other task
+ * inputs. The task inputs to be built are specified by a table mapping the name
+ * of the input to the task used to access the input's value.
+ */
+class TopLevelTaskInputBuilder implements TaskInputBuilder<Map<String, Object>>
+    {
+  /**
+   * The descriptors describing the inputs to be built.
+   */
+  final Map<String, TaskInput> inputDescriptors;
+
+  /**
+   * The names of the inputs. There are the keys from the [inputDescriptors] in
+   * an indexable form.
+   */
+  List<String> inputNames;
+
+  /**
+   * The index of the input name associated with the current result and target.
+   */
+  int nameIndex = -1;
+
+  /**
+   * The builder used to build the current result.
+   */
+  TaskInputBuilder currentBuilder;
+
+  /**
+   * The inputs that are being or have been built. The map will be incomplete
+   * unless the method [moveNext] returns `false`.
+   */
+  final Map<String, Object> inputs = new HashMap<String, Object>();
+
+  /**
+   * Initialize a newly created task input builder to build the inputs described
+   * by the given [inputDescriptors].
+   */
+  TopLevelTaskInputBuilder(this.inputDescriptors) {
+    inputNames = inputDescriptors.keys.toList();
+  }
+
+  @override
+  ResultDescriptor get currentResult {
+    if (currentBuilder == null) {
+      return null;
+    }
+    return currentBuilder.currentResult;
+  }
+
+  @override
+  AnalysisTarget get currentTarget {
+    if (currentBuilder == null) {
+      return null;
+    }
+    return currentBuilder.currentTarget;
+  }
+
+  @override
+  void set currentValue(Object value) {
+    if (currentBuilder == null) {
+      throw new StateError(
+          'Cannot set the result value when there is no current result');
+    }
+    currentBuilder.currentValue = value;
+  }
+
+  @override
+  Map<String, Object> get inputValue {
+    if (nameIndex < inputNames.length) {
+      throw new StateError('Result value has not been created');
+    }
+    return inputs;
+  }
+
+  /**
+   * Assuming that there is a current input, return its name.
+   */
+  String get _currentName => inputNames[nameIndex];
+
+  @override
+  bool moveNext() {
+    if (nameIndex >= inputNames.length) {
+      // We have already computed all of the results, so just return false.
+      return false;
+    }
+    if (nameIndex < 0) {
+      // This is the first time moveNext has been invoked, so we just determine
+      // whether there are any results to be computed.
+      nameIndex = 0;
+    } else {
+      if (currentBuilder.moveNext()) {
+        // We are still working on building the value associated with the
+        // current name.
+        return true;
+      }
+      inputs[_currentName] = currentBuilder.inputValue;
+      nameIndex++;
+    }
+    if (nameIndex >= inputNames.length) {
+      // There is no next value, so we're done.
+      return false;
+    }
+    currentBuilder = inputDescriptors[_currentName].createBuilder();
+    // NOTE: This assumes that every builder will require at least one result
+    // value to be created. If that assumption is every broken, this method will
+    // need to be changed to advance until we find a builder that does require
+    // a result to be computed (or run out of builders).
+    return currentBuilder.moveNext();
+  }
+}
diff --git a/pkg/analyzer/lib/src/task/manager.dart b/pkg/analyzer/lib/src/task/manager.dart
new file mode 100644
index 0000000..71986ab
--- /dev/null
+++ b/pkg/analyzer/lib/src/task/manager.dart
@@ -0,0 +1,106 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 analyzer.src.task.manager;
+
+import 'dart:collection';
+
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/task/model.dart';
+
+/**
+ * An object that manages the information about the tasks that have been
+ * defined.
+ */
+class TaskManager {
+  /**
+   * A table mapping [ResultDescriptor]s to a list of [TaskDescriptor]s
+   * for the tasks that can be used to compute the result.
+   */
+  Map<ResultDescriptor, List<TaskDescriptor>> taskMap =
+      new HashMap<ResultDescriptor, List<TaskDescriptor>>();
+
+  /**
+   * A list of the results that are to be computed for all sources within an
+   * analysis root.
+   */
+  Set<ResultDescriptor> generalResults = new Set<ResultDescriptor>();
+
+  /**
+   * A list of the results that are to be computed for priority sources.
+   */
+  Set<ResultDescriptor> priorityResults = new Set<ResultDescriptor>();
+
+  /**
+   * Add the given [result] to the list of results that are to be computed for
+   * all sources within an analysis root.
+   */
+  void addGeneralResult(ResultDescriptor result) {
+    generalResults.add(result);
+  }
+
+  /**
+   * Add the given [result] to the list of results that are to be computed for
+   * priority sources.
+   */
+  void addPriorityResult(ResultDescriptor result) {
+    priorityResults.add(result);
+  }
+
+  /**
+   * Add the given [descriptor] to the list of analysis task descriptors that
+   * can be used to compute analysis results.
+   */
+  void addTaskDescriptor(TaskDescriptor descriptor) {
+    descriptor.results.forEach((ResultDescriptor result) {
+      //
+      // Add the result to the task map.
+      //
+      List<TaskDescriptor> descriptors = taskMap[result];
+      if (descriptors == null) {
+        descriptors = <TaskDescriptor>[];
+        taskMap[result] = descriptors;
+      }
+      descriptors.add(descriptor);
+    });
+  }
+
+  /**
+   * Find a task that will compute the given [result] for the given [target].
+   */
+  TaskDescriptor findTask(AnalysisTarget target, ResultDescriptor result) {
+    List<TaskDescriptor> descriptors = taskMap[result];
+    if (descriptors == null) {
+      throw new AnalysisException(
+          'No tasks registered to compute $result for $target');
+    }
+    return _findBestTask(descriptors);
+  }
+
+  /**
+   * Remove the given [result] from the list of results that are to be computed
+   * for all sources within an analysis root.
+   */
+  void removeGeneralResult(ResultDescriptor result) {
+    generalResults.remove(result);
+  }
+
+  /**
+   * Remove the given [result] from the list of results that are to be computed
+   * for priority sources.
+   */
+  void removePriorityResult(ResultDescriptor result) {
+    priorityResults.remove(result);
+  }
+
+  /**
+   * Given a list of task [descriptors] that can be used to compute some
+   * unspecified result, return the descriptor that will compute the result with
+   * the least amount of work.
+   */
+  TaskDescriptor _findBestTask(List<TaskDescriptor> descriptors) {
+    // TODO(brianwilkerson) Improve this implementation.
+    return descriptors[0];
+  }
+}
diff --git a/pkg/analyzer/lib/src/task/model.dart b/pkg/analyzer/lib/src/task/model.dart
new file mode 100644
index 0000000..36878d3
--- /dev/null
+++ b/pkg/analyzer/lib/src/task/model.dart
@@ -0,0 +1,113 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 analyzer.src.task.model;
+
+import 'package:analyzer/src/generated/engine.dart' hide AnalysisTask;
+import 'package:analyzer/src/task/inputs.dart';
+import 'package:analyzer/task/model.dart';
+
+/**
+ * A concrete implementation of a [ContributionPoint].
+ */
+class ContributionPointImpl<V> extends ResultDescriptorImpl<V> implements
+    ContributionPoint<V> {
+  /**
+   * The results that contribute to this result.
+   */
+  final List<ResultDescriptor<V>> contributors = <ResultDescriptor<V>>[];
+
+  /**
+   * Initialize a newly created contribution point to have the given [name].
+   */
+  ContributionPointImpl(String name) : super(name, null);
+
+  /**
+   * Record that the given analysis [result] contibutes to this result.
+   */
+  void recordContributor(ResultDescriptor<V> result) {
+    contributors.add(result);
+  }
+}
+
+/**
+ * A concrete implementation of a [ResultDescriptor].
+ */
+class ResultDescriptorImpl<V> implements ResultDescriptor<V> {
+  /**
+   * The name of the result, used for debugging.
+   */
+  final String name;
+
+  /**
+   * Return the default value for results described by this descriptor.
+   */
+  final V defaultValue;
+
+  /**
+   * Initialize a newly created analysis result to have the given [name] and
+   * [defaultValue]. If a contribution point is specified, then this result will
+   * contribute to it.
+   */
+  ResultDescriptorImpl(this.name, this.defaultValue,
+      {ContributionPoint contributesTo}) {
+    if (contributesTo is ContributionPointImpl) {
+      contributesTo.recordContributor(this);
+    }
+  }
+
+  @override
+  TaskInput<V> inputFor(AnalysisTarget target) =>
+      new SimpleTaskInput<V>(target, this);
+
+  @override
+  String toString() => name;
+}
+
+/**
+ * A concrete implementation of a [TaskDescriptor].
+ */
+class TaskDescriptorImpl implements TaskDescriptor {
+  /**
+   * The name of the described task, used for debugging.
+   */
+  final String name;
+
+  /**
+   * The function used to build the analysis task.
+   */
+  final BuildTask buildTask;
+
+  /**
+   * The function used to build the inputs to the task.
+   */
+  @override
+  final CreateTaskInputs createTaskInputs;
+
+  /**
+   * A list of the analysis results that will be computed by the described task.
+   */
+  @override
+  final List<ResultDescriptor> results;
+
+  /**
+   * Initialize a newly created task descriptor to have the given [name] and to
+   * describe a task that takes the inputs built using the given [createTaskInputs],
+   * and produces the given [results]. The [buildTask] will be used to create
+   * the instance of [AnalysisTask] thusly described.
+   */
+  TaskDescriptorImpl(this.name, this.buildTask, this.createTaskInputs,
+      this.results);
+
+  @override
+  AnalysisTask createTask(AnalysisContext context, AnalysisTarget target,
+      Map<String, dynamic> inputs) {
+    AnalysisTask task = buildTask(context, target);
+    task.inputs = inputs;
+    return task;
+  }
+
+  @override
+  String toString() => name;
+}
diff --git a/pkg/analyzer/lib/src/task/targets.dart b/pkg/analyzer/lib/src/task/targets.dart
new file mode 100644
index 0000000..8c55f51
--- /dev/null
+++ b/pkg/analyzer/lib/src/task/targets.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 analyzer.src.task.targets;
+
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/task/model.dart';
+
+/**
+ * A `SourceTarget` is a [Source] that can be used as an [AnalysisTarget].
+ */
+class SourceTarget implements AnalysisTarget {
+  /**
+   * The source being represented as a target.
+   */
+  final Source source;
+
+  /**
+   * Initialize a newly created target to represent the given [source].
+   */
+  SourceTarget(this.source);
+
+  @override
+  int get hashCode => source.hashCode;
+
+  @override
+  bool operator ==(Object object) {
+    return object is SourceTarget && object.source == source;
+  }
+}
diff --git a/pkg/analyzer/lib/task/dart.dart b/pkg/analyzer/lib/task/dart.dart
new file mode 100644
index 0000000..4b016fe
--- /dev/null
+++ b/pkg/analyzer/lib/task/dart.dart
@@ -0,0 +1,110 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 analyzer.task.dart;
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/task/general.dart';
+import 'package:analyzer/task/model.dart';
+
+/**
+ * The compilation unit associated with a [Source] after it has had all
+ * declarations bound to the element defined by the declaration.
+ *
+ * The result is only available for targets representing a Dart compilation unit.
+ */
+final ResultDescriptor<CompilationUnit> BUILT_UNIT =
+    new ResultDescriptor<CompilationUnit>('BUILT_UNIT', null);
+
+/**
+ * The element model associated with a single compilation unit.
+ *
+ * The result is only available for targets representing a Dart compilation unit.
+ */
+final ResultDescriptor<CompilationUnitElement> COMPILATION_UNIT_ELEMENT =
+    new ResultDescriptor<CompilationUnitElement>('COMPILATION_UNIT_ELEMENT', null);
+
+/**
+ * The sources of the libraries that are exported from a library.
+ *
+ * The list will be empty if there are no exported libraries, but will not be
+ * `null`.
+ *
+ * The result is only available for targets representing a Dart library.
+ */
+final ResultDescriptor<List<Source>> EXPORTED_LIBRARIES =
+    new ResultDescriptor<List<Source>>('EXPORTED_LIBRARIES', Source.EMPTY_ARRAY);
+
+/**
+ * The sources of the libraries that are imported into a library.
+ *
+ * The list will be empty if there are no imported libraries, but will not be
+ * `null`.
+ *
+ * The result is only available for targets representing a Dart library.
+ */
+final ResultDescriptor<List<Source>> IMPORTED_LIBRARIES =
+    new ResultDescriptor<List<Source>>('IMPORTED_LIBRARIES', Source.EMPTY_ARRAY);
+
+/**
+ * The sources of the parts that are included in a library.
+ *
+ * The list will be empty if there are no parts, but will not be `null`. The
+ * list does *not* include the source for the defining compilation unit.
+ *
+ * The result is only available for targets representing a Dart library.
+ */
+final ResultDescriptor<List<Source>> INCLUDED_PARTS =
+    new ResultDescriptor<List<Source>>('INCLUDED_PARTS', Source.EMPTY_ARRAY);
+
+/**
+ * The errors produced while parsing a compilation unit.
+ *
+ * The list will be empty if there were no errors, but will not be `null`.
+ *
+ * The result is only available for targets representing a Dart compilation unit.
+ */
+final ResultDescriptor<List<AnalysisError>> PARSE_ERRORS =
+    new ResultDescriptor<List<AnalysisError>>(
+        'PARSE_ERRORS',
+        AnalysisError.NO_ERRORS,
+        contributesTo: ANALYSIS_ERRORS);
+
+/**
+ * The compilation unit AST produced while parsing a compilation unit.
+ *
+ * The AST structure will not have resolution information associated with it.
+ *
+ * The result is only available for targets representing a Dart compilation unit.
+ */
+final ResultDescriptor<CompilationUnit> PARSED_UNIT =
+    new ResultDescriptor<CompilationUnit>('PARSED_UNIT', null);
+
+/**
+ * The errors produced while scanning a compilation unit.
+ *
+ * The list will be empty if there were no errors, but will not be `null`.
+ *
+ * The result is only available for targets representing a Dart compilation unit.
+ */
+final ResultDescriptor<List<AnalysisError>> SCAN_ERRORS =
+    new ResultDescriptor<List<AnalysisError>>(
+        'SCAN_ERRORS',
+        AnalysisError.NO_ERRORS,
+        contributesTo: ANALYSIS_ERRORS);
+
+/**
+ * The token stream produced while scanning a compilation unit.
+ *
+ * The value is the first token in the file, or the special end-of-file marker
+ * at the end of the stream if the file does not contain any tokens.
+ *
+ * The result is only available for targets representing a Dart compilation unit.
+ */
+final ResultDescriptor<Token> TOKEN_STREAM =
+    new ResultDescriptor<Token>('TOKEN_STREAM', null);
diff --git a/pkg/analyzer/lib/task/general.dart b/pkg/analyzer/lib/task/general.dart
new file mode 100644
index 0000000..3a92c30
--- /dev/null
+++ b/pkg/analyzer/lib/task/general.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 analyzer.task.general;
+
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/task/model.dart';
+
+/**
+ * The analysis errors associated with a target.
+ *
+ * The value combines errors represented by multiple other results.
+ */
+// TODO(brianwilkerson) If we want to associate errors with targets smaller than
+// a file, we will need other contribution points to collect them. In which case
+// we might want to rename this and/or document that it applies to files. For
+// that matter, we might also want to have one that applies to Dart files and a
+// different one that applies to HTML files, because the list of errors being
+// combined is likely to be different.
+final ContributionPoint<List<AnalysisError>> ANALYSIS_ERRORS =
+    new ContributionPoint<List<AnalysisError>>('ANALYSIS_ERRORS');
+
+/**
+ * The contents of a single file.
+ */
+final ResultDescriptor<String> CONTENT =
+    new ResultDescriptor<String>('CONTENT', null);
+
+/**
+ * The line information for a single file.
+ */
+final ResultDescriptor<LineInfo> LINE_INFO =
+    new ResultDescriptor<LineInfo>('LINE_INFO', null);
+
+/**
+ * The modification time of a file.
+ */
+final ResultDescriptor<int> MODIFICATION_TIME =
+    new ResultDescriptor<int>('MODIFICATION_TIME', -1);
+
+/**
+ * The kind of a [Source].
+ */
+final ResultDescriptor<SourceKind> SOURCE_KIND =
+    new ResultDescriptor<SourceKind>('SOURCE_KIND', SourceKind.UNKNOWN);
diff --git a/pkg/analyzer/lib/task/model.dart b/pkg/analyzer/lib/task/model.dart
new file mode 100644
index 0000000..7254f19
--- /dev/null
+++ b/pkg/analyzer/lib/task/model.dart
@@ -0,0 +1,336 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 analyzer.task.model;
+
+import 'dart:collection';
+
+import 'package:analyzer/src/generated/engine.dart' hide AnalysisTask;
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/task/model.dart';
+
+/**
+ * A function that takes an analysis [context] and an analysis [target] and
+ * returns an analysis task. Such functions are passed to a [TaskDescriptor] to
+ * be used to create the described task.
+ */
+typedef AnalysisTask BuildTask(AnalysisContext context, AnalysisTarget target);
+
+/**
+ * A function that takes the target for which a task will produce results and
+ * returns a map from input names to descriptions of the analysis results needed
+ * by the task in order for the task to be performed. Such functions are passed
+ * to a [TaskDescriptor] to be used to determine the inputs needed by the task.
+ */
+typedef Map<String, TaskInput> CreateTaskInputs(AnalysisTarget target);
+
+/**
+ * An object with which an analysis result can be associated.
+ *
+ * Clients are allowed to subtype this class when creating new kinds of targets.
+ * Instances of this type are used in hashed data structures, so subtypes are
+ * required to correctly implement [==] and [hashCode].
+ */
+abstract class AnalysisTarget {
+  /**
+   * Return the source associated with this target, or `null` if this target is
+   * not associated with a source.
+   */
+  Source get source;
+}
+
+/**
+ * An object used to compute one or more analysis results associated with a
+ * single target.
+ *
+ * Clients are expected to extend this class when creating new tasks.
+ */
+abstract class AnalysisTask {
+  /**
+   * A table mapping the types of analysis tasks to stopwatches used to compute
+   * how much time was spent executing each kind of task.
+   */
+  static final Map<Type, Stopwatch> stopwatchMap =
+      new HashMap<Type, Stopwatch>();
+
+  /**
+   * The context in which the task is to be performed.
+   */
+  final AnalysisContext context;
+
+  /**
+   * The target for which result values are being produced.
+   */
+  final AnalysisTarget target;
+
+  /**
+   * A table mapping input names to input values.
+   */
+  Map<String, dynamic> inputs;
+
+  /**
+   * A table mapping result descriptors whose values are produced by this task
+   * to the values that were produced.
+   */
+  Map<ResultDescriptor, dynamic> outputs =
+      new HashMap<ResultDescriptor, dynamic>();
+
+  /**
+   * The exception that was thrown while performing this task, or `null` if the
+   * task completed successfully.
+   */
+  CaughtException caughtException;
+
+  /**
+   * Initialize a newly created task to perform analysis within the given
+   * [context] in order to produce results for the given [target].
+   */
+  AnalysisTask(this.context, this.target);
+
+  /**
+   * Return a textual description of this task.
+   */
+  String get description;
+
+  /**
+   * Return the descriptor that describes this task.
+   */
+  TaskDescriptor get descriptor;
+
+  /**
+   * Return the value of the input with the given [name]. Throw an exception if
+   * the input value is not defined.
+   */
+  Object getRequiredInput(String name) {
+    if (inputs == null || !inputs.containsKey(name)) {
+      throw new AnalysisException("Could not $description: missing $name");
+    }
+    return inputs[name];
+  }
+
+  /**
+   * Return the source associated with the target. Throw an exception if
+   * the target is not associated with a source.
+   */
+  Source getRequiredSource() {
+    Source source = target.source;
+    if (source == null) {
+      throw new AnalysisException("Could not $description: missing source");
+    }
+    return source;
+  }
+
+  /**
+   * Perform this analysis task, protected by an exception handler.
+   *
+   * This method should throw an [AnalysisException] if an exception occurs
+   * while performing the task. If other kinds of exceptions are thrown they
+   * will be wrapped in an [AnalysisException].
+   *
+   * If no exception is thrown, this method must fully populate the [outputs]
+   * map (have a key/value pair for each result that this task is expected to
+   * produce).
+   */
+  void internalPerform();
+
+  /**
+   * Perform this analysis task. When this method returns, either the [outputs]
+   * map should be fully populated (have a key/value pair for each result that
+   * this task is expected to produce) or the [caughtException] should be set.
+   *
+   * Clients should not override this method.
+   */
+  void perform() {
+    try {
+      _safelyPerform();
+    } on AnalysisException catch (exception, stackTrace) {
+      caughtException = new CaughtException(exception, stackTrace);
+      AnalysisEngine.instance.logger.logInformation(
+          "Task failed: ${description}",
+          caughtException);
+    }
+  }
+
+  @override
+  String toString() => description;
+
+  /**
+   * Perform this analysis task, ensuring that all exceptions are wrapped in an
+   * [AnalysisException].
+   *
+   * Clients should not override this method.
+   */
+  void _safelyPerform() {
+    try {
+      Stopwatch stopwatch = stopwatchMap[runtimeType];
+      if (stopwatch == null) {
+        stopwatch = new Stopwatch();
+        stopwatchMap[runtimeType] = stopwatch;
+      }
+      stopwatch.start();
+      try {
+        internalPerform();
+      } finally {
+        stopwatch.stop();
+      }
+    } on AnalysisException catch (exception) {
+      rethrow;
+    } catch (exception, stackTrace) {
+      throw new AnalysisException(
+          'Unexpected exception while performing $description',
+          new CaughtException(exception, stackTrace));
+    }
+  }
+}
+
+/**
+ * A [ResultDescriptor] that denotes an analysis result that is a union of
+ * one or more other results.
+ *
+ * Clients are not expected to subtype this class.
+ */
+abstract class ContributionPoint<V> extends ResultDescriptor<V> {
+  /**
+   * Initialize a newly created contribution point to have the given [name].
+   */
+  factory ContributionPoint(String name) = ContributionPointImpl;
+
+  /**
+   * Return a list containing the descriptors of the results that are unioned
+   * together to comprise the value of this result.
+   *
+   * Clients must not modify the returned list.
+   */
+  List<ResultDescriptor<V>> get contributors;
+}
+
+/**
+ * A description of an analysis result that can be computed by an [AnalysisTask].
+ *
+ * Clients are not expected to subtype this class.
+ */
+abstract class ResultDescriptor<V> {
+  /**
+   * Initialize a newly created analysis result to have the given [name]. If a
+   * contribution point is specified, then this result will contribute to it.
+   */
+  factory ResultDescriptor(String name, V defaultValue,
+      {ContributionPoint<V> contributesTo}) = ResultDescriptorImpl;
+
+  /**
+   * Return the default value for results described by this descriptor.
+   */
+  V get defaultValue;
+
+  /**
+   * Return a task input that can be used to compute this result for the given
+   * [target].
+   */
+  TaskInput<V> inputFor(AnalysisTarget target);
+}
+
+/**
+ * A description of an [AnalysisTask].
+ */
+abstract class TaskDescriptor {
+  /**
+   * Initialize a newly created task descriptor to have the given [name] and to
+   * describe a task that takes the inputs built using the given [inputBuilder],
+   * and produces the given [results]. The [buildTask] will be used to create
+   * the instance of [AnalysisTask] thusly described.
+   */
+  factory TaskDescriptor(String name, BuildTask buildTask,
+      CreateTaskInputs inputBuilder, List<ResultDescriptor> results) =
+      TaskDescriptorImpl;
+
+  /**
+   * Return the builder used to build the inputs to the task.
+   */
+  CreateTaskInputs get createTaskInputs;
+
+  /**
+   * Return a list of the analysis results that will be computed by this task.
+   */
+  List<ResultDescriptor> get results;
+
+  /**
+   * Create and return a task that is described by this descriptor that can be
+   * used to compute results based on the given [inputs].
+   */
+  AnalysisTask createTask(AnalysisContext context, AnalysisTarget target,
+      Map<String, dynamic> inputs);
+}
+
+/**
+ * A description of an input to an [AnalysisTask] that can be used to compute
+ * that input.
+ *
+ * Clients are not expected to subtype this class.
+ */
+abstract class TaskInput<V> {
+  /**
+   * Create and return a builder that can be used to build this task input.
+   */
+  TaskInputBuilder<V> createBuilder();
+}
+
+/**
+ * An object used to build the value associated with a single [TaskInput].
+ *
+ * All builders work by requesting one or more results (each result being
+ * associated with a target). The interaction pattern is modeled after the class
+ * [Iterator], in which the method [moveNext] is invoked to move from one result
+ * request to the next. The getters [currentResult] and [currentTarget] are used
+ * to get the result and target of the current request. The value of the result
+ * must be supplied using the [currentValue] setter before [moveNext] can be
+ * invoked to move to the next request. When [moveNext] returns `false`,
+ * indicating that there are no more requests, the method [inputValue] can be
+ * used to access the value of the input that was built.
+ *
+ * Clients are not expected to subtype this class.
+ */
+abstract class TaskInputBuilder<V> {
+  /**
+   * Return the result that needs to be computed, or `null` if [moveNext] has
+   * not been invoked or if the last invocation of [moveNext] returned `false`.
+   */
+  ResultDescriptor get currentResult;
+
+  /**
+   * Return the target for which the result needs to be computed, or `null` if
+   * [moveNext] has not been invoked or if the last invocation of [moveNext]
+   * returned `false`.
+   */
+  AnalysisTarget get currentTarget;
+
+  /**
+   * Set the [value] that was computed for the current result.
+   *
+   * Throws a [StateError] if [moveNext] has not been invoked or if the last
+   * invocation of [moveNext] returned `false`.
+   */
+  void set currentValue(Object value);
+
+  /**
+   * Return the [value] that was computed by this builder.
+   *
+   * Throws a [StateError] if [moveNext] has not been invoked or if the last
+   * invocation of [moveNext] returned `true`.
+   */
+  V get inputValue;
+
+  /**
+   * Move to the next result that needs to be computed in order to build the
+   * inputs for a task. Return `true` if there is another result that needs to
+   * be computed, or `false` if the inputs have been computed.
+   *
+   * It is safe to invoke [moveNext] after it has returned `false`. In this case
+   * [moveNext] has no effect and will again return `false`.
+   *
+   * Throws a [StateError] if the value of the current result has not been
+   * provided using [currentValue].
+   */
+  bool moveNext();
+}
diff --git a/pkg/analyzer/test/generated/all_the_rest_test.dart b/pkg/analyzer/test/generated/all_the_rest_test.dart
index 5852a91..3c1f95b 100644
--- a/pkg/analyzer/test/generated/all_the_rest_test.dart
+++ b/pkg/analyzer/test/generated/all_the_rest_test.dart
@@ -9,6 +9,7 @@
 
 import 'dart:collection';
 
+import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/src/generated/ast.dart' hide ConstantEvaluator;
 import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/element.dart';
@@ -7384,6 +7385,48 @@
     expect(source.shortName, "exist.dart");
   }
 
+  void test_fileReadMode() {
+    expect(FileBasedSource.fileReadMode('a'), 'a');
+    expect(FileBasedSource.fileReadMode('a\n'), 'a\n');
+    expect(FileBasedSource.fileReadMode('ab'), 'ab');
+    expect(FileBasedSource.fileReadMode('abc'), 'abc');
+    expect(FileBasedSource.fileReadMode('a\nb'), 'a\nb');
+    expect(FileBasedSource.fileReadMode('a\rb'), 'a\rb');
+    expect(FileBasedSource.fileReadMode('a\r\nb'), 'a\r\nb');
+  }
+
+  void test_fileReadMode_changed() {
+    FileBasedSource.fileReadMode = (String s) => s + 'xyz';
+    expect(FileBasedSource.fileReadMode('a'), 'axyz');
+    expect(FileBasedSource.fileReadMode('a\n'), 'a\nxyz');
+    expect(FileBasedSource.fileReadMode('ab'), 'abxyz');
+    expect(FileBasedSource.fileReadMode('abc'), 'abcxyz');
+    FileBasedSource.fileReadMode = (String s) => s;
+  }
+
+  void test_fileReadMode_normalize_eol_always() {
+    FileBasedSource.fileReadMode =
+        PhysicalResourceProvider.NORMALIZE_EOL_ALWAYS;
+    expect(FileBasedSource.fileReadMode('a'), 'a');
+
+    // '\n' -> '\n' as first, last and only character
+    expect(FileBasedSource.fileReadMode('\n'), '\n');
+    expect(FileBasedSource.fileReadMode('a\n'), 'a\n');
+    expect(FileBasedSource.fileReadMode('\na'), '\na');
+
+    // '\r\n' -> '\n' as first, last and only character
+    expect(FileBasedSource.fileReadMode('\r\n'), '\n');
+    expect(FileBasedSource.fileReadMode('a\r\n'), 'a\n');
+    expect(FileBasedSource.fileReadMode('\r\na'), '\na');
+
+    // '\r' -> '\n' as first, last and only character
+    expect(FileBasedSource.fileReadMode('\r'), '\n');
+    expect(FileBasedSource.fileReadMode('a\r'), 'a\n');
+    expect(FileBasedSource.fileReadMode('\ra'), '\na');
+
+    FileBasedSource.fileReadMode = (String s) => s;
+  }
+
   void test_hashCode() {
     JavaFile file1 = FileUtilities2.createFile("/does/not/exist.dart");
     JavaFile file2 = FileUtilities2.createFile("/does/not/exist.dart");
diff --git a/pkg/analyzer/test/generated/engine_test.dart b/pkg/analyzer/test/generated/engine_test.dart
index fb15c2c..9951999 100644
--- a/pkg/analyzer/test/generated/engine_test.dart
+++ b/pkg/analyzer/test/generated/engine_test.dart
@@ -29,6 +29,7 @@
 import 'package:analyzer/src/generated/testing/ast_factory.dart';
 import 'package:analyzer/src/generated/testing/element_factory.dart';
 import 'package:analyzer/src/generated/utilities_collection.dart';
+import 'package:analyzer/src/services/lint.dart';
 import 'package:analyzer/src/string_source.dart';
 import 'package:analyzer/src/task/task_dart.dart';
 import 'package:typed_mock/typed_mock.dart';
@@ -1691,10 +1692,11 @@
         isNotNull,
         reason: "libB resolved 2");
     AnalysisErrorInfo errors = _context.getErrors(htmlSource);
-    expect(
-        !_hasAnalysisErrorWithErrorSeverity(errors),
-        isTrue,
-        reason: "htmlSource doesn't have errors");
+    // TODO (danrubel) commented out to fix red bots
+//    expect(
+//        !_hasAnalysisErrorWithErrorSeverity(errors),
+//        isTrue,
+//        reason: "htmlSource doesn't have errors");
   }
 
   void test_performAnalysisTask_importedLibraryDelete() {
@@ -4016,10 +4018,6 @@
     GenerateDartLintsTask task = new GenerateDartLintsTask(null, null, null);
     expect(task.exception, isNull);
   }
-  void test_lintMap() {
-    GenerateDartLintsTask task = new GenerateDartLintsTask(null, null, null);
-    expect(task.lintMap, isNull);
-  }
   void test_libraryElement() {
     InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
     LibraryElement element = ElementFactory.library(context, "lib");
@@ -4027,6 +4025,10 @@
         new GenerateDartLintsTask(context, null, element);
     expect(task.libraryElement, same(element));
   }
+  void test_lintMap() {
+    GenerateDartLintsTask task = new GenerateDartLintsTask(null, null, null);
+    expect(task.lintMap, isNull);
+  }
 
   void test_perform() {
     InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
@@ -4070,55 +4072,6 @@
 }
 
 @reflectiveTest
-class LintGeneratorTest extends EngineTestCase {
-  void test_generate() {
-
-    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
-    ChangeSet changeSet = new ChangeSet();
-    Source librarySource =
-        new FileBasedSource.con1(FileUtilities2.createFile("/test.dart"));
-    changeSet.addedSource(librarySource);
-    context.applyChanges(changeSet);
-    context.setContents(librarySource, r'''
-library lib;
-''');
-
-    CompilationUnit unit =
-        context.resolveCompilationUnit2(librarySource, librarySource);
-    List<CompilationUnit> units = <CompilationUnit>[];
-    units.add(unit);
-
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-
-    LintGeneratorTest_Verifier verifier = new LintGeneratorTest_Verifier();
-
-    LintGenerator lintGenerator =
-        new LintGenerator(units, errorListener, [verifier]);
-    lintGenerator.generate();
-
-    verifier.testExpectations();
-  }
-}
-
-
-class LintGeneratorTest_Verifier extends LintVerifier {
-
-  bool visited;
-
-  @override
-  Object visitCompilationUnit(CompilationUnit node) {
-    visited = true;
-    return null;
-  }
-
-  testExpectations() {
-    expect(reporter, isNotNull);
-    expect(visited, isTrue);
-  }
-}
-
-
-@reflectiveTest
 class GetContentTaskTest extends EngineTestCase {
   void test_accept() {
     Source source = new TestSource('/test.dart', '');
@@ -4168,7 +4121,6 @@
   bool visitGetContentTask(GetContentTask task) => true;
 }
 
-
 class GetContentTaskTestTV_perform_exception extends TestTaskVisitor<bool> {
   @override
   bool visitGetContentTask(GetContentTask task) {
@@ -4954,7 +4906,6 @@
 }
 
 
-
 class IncrementalAnalysisTaskTestTV_assertTask extends
     TestTaskVisitor<CompilationUnit> {
   IncrementalAnalysisTask task;
@@ -4967,6 +4918,94 @@
 
 
 @reflectiveTest
+class LintGeneratorTest extends EngineTestCase {
+  void test_generate() {
+
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    ChangeSet changeSet = new ChangeSet();
+    Source librarySource =
+        new FileBasedSource.con1(FileUtilities2.createFile("/test.dart"));
+    changeSet.addedSource(librarySource);
+    context.applyChanges(changeSet);
+    context.setContents(librarySource, r'''
+library lib;
+''');
+
+    CompilationUnit unit =
+        context.resolveCompilationUnit2(librarySource, librarySource);
+    List<CompilationUnit> units = <CompilationUnit>[];
+    units.add(unit);
+
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+
+    LintGeneratorTest_Linter linter = new LintGeneratorTest_Linter();
+
+    LintGenerator lintGenerator =
+        new LintGenerator(units, errorListener, [linter]);
+    lintGenerator.generate();
+
+    linter.testExpectations();
+  }
+
+  void test_generate_null_visitor() {
+
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    ChangeSet changeSet = new ChangeSet();
+    Source librarySource =
+        new FileBasedSource.con1(FileUtilities2.createFile("/test.dart"));
+    changeSet.addedSource(librarySource);
+    context.applyChanges(changeSet);
+    context.setContents(librarySource, r'''
+library lib;
+''');
+
+    CompilationUnit unit =
+        context.resolveCompilationUnit2(librarySource, librarySource);
+    List<CompilationUnit> units = <CompilationUnit>[];
+    units.add(unit);
+
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+
+    Linter badLinter = new LintGeneratorTest_Linter_Null_Visitor();
+    LintGeneratorTest_Linter goodLinter = new LintGeneratorTest_Linter();
+
+    LintGenerator lintGenerator =
+        new LintGenerator(units, errorListener, [badLinter, goodLinter]);
+    // Test that generate does not fall down with a null visitor
+    lintGenerator.generate();
+    // Well-formed linter should still get called
+    goodLinter.testExpectations();
+  }
+
+}
+
+
+class LintGeneratorTest_Linter extends Linter with SimpleAstVisitor<Object> {
+
+  bool visited;
+
+  @override
+  AstVisitor getVisitor() => this;
+
+  testExpectations() {
+    expect(reporter, isNotNull);
+    expect(visited, isTrue);
+  }
+
+  @override
+  Object visitCompilationUnit(CompilationUnit node) {
+    visited = true;
+    return null;
+  }
+}
+
+class LintGeneratorTest_Linter_Null_Visitor extends Linter {
+  @override
+  AstVisitor getVisitor() => null;
+}
+
+
+@reflectiveTest
 class ParseDartTaskTest extends EngineTestCase {
   void test_accept() {
     ParseDartTask task = new ParseDartTask(null, null, null, null);
@@ -5870,6 +5909,10 @@
     fail("Unexpected invocation of setAnalysisPriorityOrder");
   }
   @override
+  set contentCache(ContentCache value) {
+    fail("Unexpected invocation of setContentCache");
+  }
+  @override
   DeclaredVariables get declaredVariables {
     fail("Unexpected invocation of getDeclaredVariables");
     return null;
@@ -6103,6 +6146,12 @@
     return null;
   }
   @override
+  bool handleContentsChanged(Source source, String originalContents,
+      String newContents, bool notify) {
+    fail("Unexpected invocation of handleContentsChanged");
+    return false;
+  }
+  @override
   bool isClientLibrary(Source librarySource) {
     fail("Unexpected invocation of isClientLibrary");
     return false;
@@ -6161,7 +6210,6 @@
   void setContents(Source source, String contents) {
     fail("Unexpected invocation of setContents");
   }
-
   @override
   void visitCacheItems(void callback(Source source, SourceEntry dartEntry,
       DataDescriptor rowDesc, CacheState state)) {
@@ -6805,6 +6853,11 @@
     return null;
   }
   @override
+  E visitGenerateDartLintsTask(GenerateDartLintsTask task) {
+    fail("Unexpectedly invoked visitGenerateDartLintsTask");
+    return null;
+  }
+  @override
   E visitGetContentTask(GetContentTask task) {
     fail("Unexpectedly invoked visitGetContentsTask");
     return null;
@@ -6845,17 +6898,12 @@
     fail("Unexpectedly invoked visitResolveHtmlTask");
     return null;
   }
+
   @override
   E visitScanDartTask(ScanDartTask task) {
     fail("Unexpectedly invoked visitScanDartTask");
     return null;
   }
-
-  @override
-  E visitGenerateDartLintsTask(GenerateDartLintsTask task) {
-    fail("Unexpectedly invoked visitGenerateDartLintsTask");
-    return null;
-  }
 }
 
 
diff --git a/pkg/analyzer/test/generated/incremental_resolver_test.dart b/pkg/analyzer/test/generated/incremental_resolver_test.dart
index b45db86..2c8f00a 100644
--- a/pkg/analyzer/test/generated/incremental_resolver_test.dart
+++ b/pkg/analyzer/test/generated/incremental_resolver_test.dart
@@ -2089,24 +2089,6 @@
     log.logger = log.NULL_LOGGER;
   }
 
-  void test_api_method_edit_returnType() {
-    _resolveUnit(r'''
-class A {
-  int m() {
-    return null;
-  }
-}
-main() {
-  A a = new A();
-  int v = a.m();
-  print(v);
-}
-''');
-    _resolve(_editString('int m', 'String m'), _isDeclaration);
-    // We don't add or fix an error, but we verify that type of "v"
-    // is updated from "int" to "String".
-  }
-
   void test_classMemberAccessor_body() {
     _resolveUnit(r'''
 class A {
@@ -2789,6 +2771,58 @@
 ''', expectedSuccess: false);
   }
 
+  void test_false_unbalancedCurlyBrackets_inNew() {
+    _resolveUnit(r'''
+class A {
+  aaa() {
+    if (true) {
+      1;
+    }
+  }
+
+  bbb() {
+    print(0123456789);
+  }
+}''');
+    _updateAndValidate(r'''
+class A {
+  aaa() {
+      1;
+    }
+  }
+
+  bbb() {
+    print(0123456789);
+  }
+}''', expectedSuccess: false);
+  }
+
+  void test_false_unbalancedCurlyBrackets_inOld() {
+    _resolveUnit(r'''
+class A {
+  aaa() {
+      1;
+    }
+  }
+
+  bbb() {
+    print(0123456789);
+  }
+}''');
+    _updateAndValidate(r'''
+class A {
+  aaa() {
+    if (true) {
+      1;
+    }
+  }
+
+  bbb() {
+    print(0123456789);
+  }
+}''', expectedSuccess: false);
+  }
+
   void test_fieldClassField_propagatedType() {
     _resolveUnit(r'''
 class A {
@@ -3344,21 +3378,23 @@
     // "newUnit", so all clients will get it using the usual way.
     AnalysisResult analysisResult = analysisContext.performAnalysisTask();
     ChangeNotice notice = analysisResult.changeNotices[0];
-    expect(notice.compilationUnit, same(newUnit));
+    expect(notice.resolvedDartUnit, same(newUnit));
     // Resolve "newCode" from scratch.
     if (compareWithFull) {
       _resetWithIncremental(false);
+      source = addSource(newCode + ' ');
       source = addSource(newCode);
       _runTasks();
       LibraryElement library = resolve(source);
       CompilationUnit fullNewUnit = resolveCompilationUnit(source, library);
+      // Validate tokens.
+      _assertEqualTokens(newUnit, fullNewUnit);
       // Validate that "incremental" and "full" units have the same resolution.
       try {
         assertSameResolution(newUnit, fullNewUnit, validateTypes: true);
       } on IncrementalResolutionMismatch catch (mismatch) {
         fail(mismatch.message);
       }
-      _assertEqualTokens(newUnit, fullNewUnit);
       List<AnalysisError> newFullErrors =
           analysisContext.getErrors(source).errors;
       _assertEqualErrors(newErrors, newFullErrors);
@@ -3367,6 +3403,7 @@
   }
 
   static void _assertEqualToken(Token incrToken, Token fullToken) {
+//    print('[${incrToken.offset}] |$incrToken| vs. [${fullToken.offset}] |$fullToken|');
     expect(incrToken.type, fullToken.type);
     expect(incrToken.offset, fullToken.offset);
     expect(incrToken.length, fullToken.length);
diff --git a/pkg/analyzer/test/generated/static_warning_code_test.dart b/pkg/analyzer/test/generated/static_warning_code_test.dart
index 716899a..0f379ad 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -5,7 +5,6 @@
 library engine.static_warning_code_test;
 
 import 'package:analyzer/src/generated/error.dart';
-import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:unittest/unittest.dart';
 
diff --git a/pkg/analyzer/test/instrumentation/instrumentation_test.dart b/pkg/analyzer/test/instrumentation/instrumentation_test.dart
index ec2aa7c..30de819 100644
--- a/pkg/analyzer/test/instrumentation/instrumentation_test.dart
+++ b/pkg/analyzer/test/instrumentation/instrumentation_test.dart
@@ -105,6 +105,22 @@
     service.logResponse(message);
     assertNormal(server, InstrumentationService.TAG_RESPONSE, message);
   }
+
+  void test_logVersion() {
+    TestInstrumentationServer server = new TestInstrumentationServer();
+    InstrumentationService service = new InstrumentationService(server);
+    service.logVersion(
+        'myUuid',
+        'someClientId',
+        'someClientVersion',
+        'aServerVersion',
+        'anSdkVersion');
+    expect(server.normalChannel.toString(), '');
+    expect(
+        server.priorityChannel.toString(),
+        endsWith(
+            ':myUuid:someClientId:someClientVersion:aServerVersion:anSdkVersion\n'));
+  }
 }
 
 @reflectiveTest
diff --git a/pkg/analyzer/test/src/task/inputs_test.dart b/pkg/analyzer/test/src/task/inputs_test.dart
new file mode 100644
index 0000000..4f9ba16
--- /dev/null
+++ b/pkg/analyzer/test/src/task/inputs_test.dart
@@ -0,0 +1,441 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 test.src.task.inputs_test;
+
+import 'package:analyzer/src/task/inputs.dart';
+import 'package:analyzer/src/task/model.dart';
+import 'package:analyzer/src/task/targets.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../generated/test_support.dart';
+import '../../reflective_tests.dart';
+import 'package:analyzer/task/model.dart';
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(ListBasedTaskInputTest);
+  runReflectiveTests(ListBasedTaskInputBuilderTest);
+  runReflectiveTests(SimpleTaskInputTest);
+  runReflectiveTests(SimpleTaskInputBuilderTest);
+  runReflectiveTests(TopLevelTaskInputBuilderTest);
+}
+
+@reflectiveTest
+class ListBasedTaskInputBuilderTest extends EngineTestCase {
+  static final SourceTarget target1 = new SourceTarget(null);
+  static final ResultDescriptorImpl result1 =
+      new ResultDescriptorImpl('result1', null);
+  static final ResultDescriptorImpl result2 =
+      new ResultDescriptorImpl('result2', null);
+  static final ListBasedTaskInput input = new ListBasedTaskInput(
+      result1.inputFor(target1),
+      (element) => result2.inputFor(element));
+
+  test_create() {
+    ListBasedTaskInputBuilder builder = new ListBasedTaskInputBuilder(input);
+    expect(builder, isNotNull);
+    expect(builder.input, input);
+  }
+
+  test_currentResult_afterOneMoveNext() {
+    ListBasedTaskInputBuilder builder = new ListBasedTaskInputBuilder(input);
+    builder.moveNext();
+    expect(builder.currentResult, result1);
+  }
+
+  test_currentResult_afterComplete() {
+    ListBasedTaskInputBuilder builder = new ListBasedTaskInputBuilder(input);
+    builder.moveNext();
+    builder.currentValue = [];
+    builder.moveNext();
+    expect(builder.currentResult, null);
+  }
+
+  test_currentResult_beforeMoveNext() {
+    ListBasedTaskInputBuilder builder = new ListBasedTaskInputBuilder(input);
+    expect(builder.currentResult, null);
+  }
+
+  test_currentTarget_afterOneMoveNext() {
+    ListBasedTaskInputBuilder builder = new ListBasedTaskInputBuilder(input);
+    builder.moveNext();
+    expect(builder.currentTarget, target1);
+  }
+
+  test_currentTarget_afterComplete() {
+    ListBasedTaskInputBuilder builder = new ListBasedTaskInputBuilder(input);
+    builder.moveNext();
+    builder.currentValue = [];
+    builder.moveNext();
+    expect(builder.currentTarget, null);
+  }
+
+  test_currentTarget_beforeMoveNext() {
+    ListBasedTaskInputBuilder builder = new ListBasedTaskInputBuilder(input);
+    expect(builder.currentTarget, null);
+  }
+
+  test_currentValue_afterOneMoveNext() {
+    ListBasedTaskInputBuilder builder = new ListBasedTaskInputBuilder(input);
+    builder.moveNext();
+    builder.currentValue = [];
+  }
+
+  test_currentValue_beforeMoveNext() {
+    ListBasedTaskInputBuilder builder = new ListBasedTaskInputBuilder(input);
+    expect(() {
+      builder.currentValue = [];
+    }, throwsStateError);
+  }
+
+  test_inputValue_afterOneMoveNext() {
+    ListBasedTaskInputBuilder builder = new ListBasedTaskInputBuilder(input);
+    builder.moveNext();
+    expect(() => builder.inputValue, throwsStateError);
+  }
+
+  test_inputValue_afterComplete() {
+    SourceTarget target2 = new SourceTarget(null);
+    SourceTarget target3 = new SourceTarget(null);
+    String value2 = 'value2';
+    String value3 = 'value3';
+    ListBasedTaskInputBuilder builder = new ListBasedTaskInputBuilder(input);
+    builder.moveNext(); // Advance to requesting the list
+    builder.currentValue = [target2, target3];
+    builder.moveNext(); // Advance to requesting result2 for target2
+    builder.currentValue = value2;
+    builder.moveNext(); // Advance to requesting result2 for target3
+    builder.currentValue = value3;
+    builder.moveNext(); // Advance to the end
+    var inputValue = builder.inputValue;
+    expect(inputValue, new isInstanceOf<List>());
+    List list = inputValue;
+    expect(list.length, 2);
+    expect(list[0], value2);
+    expect(list[1], value3);
+  }
+
+  test_inputValue_beforeMoveNext() {
+    ListBasedTaskInputBuilder builder = new ListBasedTaskInputBuilder(input);
+    expect(() => builder.inputValue, throwsStateError);
+  }
+
+  test_moveNext_withoutSet() {
+    ListBasedTaskInputBuilder builder = new ListBasedTaskInputBuilder(input);
+    expect(builder.moveNext(), true);
+    expect(() => builder.moveNext(), throwsStateError);
+  }
+
+  test_moveNext_withSet() {
+    ListBasedTaskInputBuilder builder = new ListBasedTaskInputBuilder(input);
+    expect(builder.moveNext(), true);
+    builder.currentValue = [];
+    expect(builder.moveNext(), false);
+    expect(builder.moveNext(), false);
+  }
+}
+
+@reflectiveTest
+class ListBasedTaskInputTest extends EngineTestCase {
+  static final SourceTarget target = new SourceTarget(null);
+  static final ResultDescriptorImpl result =
+      new ResultDescriptorImpl('result', null);
+
+  test_create() {
+    SimpleTaskInput baseAccessor = result.inputFor(target);
+    GenerateTaskInputs generate = (object) {};
+    ListBasedTaskInput input = new ListBasedTaskInput(baseAccessor, generate);
+    expect(input, isNotNull);
+    expect(input.baseAccessor, baseAccessor);
+    expect(input.generateTaskInputs, equals(generate));
+  }
+
+  test_createBuilder() {
+    SimpleTaskInput baseAccessor = result.inputFor(target);
+    GenerateTaskInputs generate = (object) {};
+    ListBasedTaskInput input = new ListBasedTaskInput(baseAccessor, generate);
+    expect(input.createBuilder(), isNotNull);
+  }
+}
+
+@reflectiveTest
+class SimpleTaskInputBuilderTest extends EngineTestCase {
+  static final SourceTarget target = new SourceTarget(null);
+  static final ResultDescriptorImpl result =
+      new ResultDescriptorImpl('result', null);
+  static final SimpleTaskInput input = new SimpleTaskInput(target, result);
+
+  test_create() {
+    SimpleTaskInputBuilder builder = new SimpleTaskInputBuilder(input);
+    expect(builder, isNotNull);
+    expect(builder.input, input);
+  }
+
+  test_currentResult_afterOneMoveNext() {
+    SimpleTaskInputBuilder builder = new SimpleTaskInputBuilder(input);
+    builder.moveNext();
+    expect(builder.currentResult, result);
+  }
+
+  test_currentResult_afterComplete() {
+    SimpleTaskInputBuilder builder = new SimpleTaskInputBuilder(input);
+    builder.moveNext();
+    builder.currentValue = 'value';
+    builder.moveNext();
+    expect(builder.currentResult, null);
+  }
+
+  test_currentResult_beforeMoveNext() {
+    SimpleTaskInputBuilder builder = new SimpleTaskInputBuilder(input);
+    expect(builder.currentResult, null);
+  }
+
+  test_currentTarget_afterOneMoveNext() {
+    SimpleTaskInputBuilder builder = new SimpleTaskInputBuilder(input);
+    builder.moveNext();
+    expect(builder.currentTarget, target);
+  }
+
+  test_currentTarget_afterComplete() {
+    SimpleTaskInputBuilder builder = new SimpleTaskInputBuilder(input);
+    builder.moveNext();
+    builder.currentValue = 'value';
+    builder.moveNext();
+    expect(builder.currentTarget, null);
+  }
+
+  test_currentTarget_beforeMoveNext() {
+    SimpleTaskInputBuilder builder = new SimpleTaskInputBuilder(input);
+    expect(builder.currentTarget, null);
+  }
+
+  test_currentValue_afterOneMoveNext() {
+    SimpleTaskInputBuilder builder = new SimpleTaskInputBuilder(input);
+    builder.moveNext();
+    builder.currentValue = 'value';
+  }
+
+  test_currentValue_beforeMoveNext() {
+    SimpleTaskInputBuilder builder = new SimpleTaskInputBuilder(input);
+    expect(() {
+      builder.currentValue = 'value';
+    }, throwsStateError);
+  }
+
+  test_inputValue_afterOneMoveNext() {
+    SimpleTaskInputBuilder builder = new SimpleTaskInputBuilder(input);
+    builder.moveNext();
+    expect(() => builder.inputValue, throwsStateError);
+  }
+
+  test_inputValue_afterComplete() {
+    SimpleTaskInputBuilder builder = new SimpleTaskInputBuilder(input);
+    builder.moveNext();
+    String value = 'value';
+    builder.currentValue = value;
+    builder.moveNext();
+    expect(builder.inputValue, value);
+  }
+
+  test_inputValue_beforeMoveNext() {
+    SimpleTaskInputBuilder builder = new SimpleTaskInputBuilder(input);
+    expect(() => builder.inputValue, throwsStateError);
+  }
+
+  test_moveNext_withoutSet() {
+    SimpleTaskInputBuilder builder = new SimpleTaskInputBuilder(input);
+    expect(builder.moveNext(), true);
+    expect(() => builder.moveNext(), throwsStateError);
+  }
+
+  test_moveNext_withSet() {
+    SimpleTaskInputBuilder builder = new SimpleTaskInputBuilder(input);
+    expect(builder.moveNext(), true);
+    builder.currentValue = 'value';
+    expect(builder.moveNext(), false);
+    expect(builder.moveNext(), false);
+  }
+}
+
+@reflectiveTest
+class SimpleTaskInputTest extends EngineTestCase {
+  static final SourceTarget target = new SourceTarget(null);
+  static final ResultDescriptorImpl result =
+      new ResultDescriptorImpl('result', null);
+
+  test_create() {
+    SimpleTaskInput input = new SimpleTaskInput(target, result);
+    expect(input, isNotNull);
+    expect(input.target, target);
+    expect(input.result, result);
+  }
+
+  test_createBuilder() {
+    SimpleTaskInput input = new SimpleTaskInput(target, result);
+    expect(input.createBuilder(), new isInstanceOf<SimpleTaskInputBuilder>());
+  }
+}
+
+@reflectiveTest
+class TopLevelTaskInputBuilderTest extends EngineTestCase {
+  static final SourceTarget target = new SourceTarget(null);
+  static final ResultDescriptorImpl result1 =
+      new ResultDescriptorImpl('result1', null);
+  static final ResultDescriptorImpl result2 =
+      new ResultDescriptorImpl('result2', null);
+  static final SimpleTaskInput input1 = new SimpleTaskInput(target, result1);
+  static final SimpleTaskInput input2 = new SimpleTaskInput(target, result2);
+
+  test_create() {
+    Map<String, TaskInput> inputDescriptors = {};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    expect(builder, isNotNull);
+    expect(builder.inputDescriptors, inputDescriptors);
+  }
+
+  test_currentResult_afterOneMoveNext() {
+    Map<String, TaskInput> inputDescriptors = {
+      'one': input1,
+      'two': input2
+    };
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    builder.moveNext();
+    expect(builder.currentResult, result1);
+  }
+
+  test_currentResult_afterComplete() {
+    Map<String, TaskInput> inputDescriptors = {
+      'one': input1
+    };
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    builder.moveNext();
+    builder.currentValue = 'value1';
+    builder.moveNext();
+    expect(builder.currentResult, null);
+  }
+
+  test_currentResult_beforeMoveNext() {
+    Map<String, TaskInput> inputDescriptors = {};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    expect(builder.currentResult, null);
+  }
+
+  test_currentTarget_afterOneMoveNext() {
+    Map<String, TaskInput> inputDescriptors = {
+      'one': input1
+    };
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    builder.moveNext();
+    expect(builder.currentTarget, target);
+  }
+
+  test_currentTarget_afterComplete() {
+    Map<String, TaskInput> inputDescriptors = {
+      'one': input1
+    };
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    builder.moveNext();
+    builder.currentValue = 'value1';
+    builder.moveNext();
+    expect(builder.currentTarget, null);
+  }
+
+  test_currentTarget_beforeMoveNext() {
+    Map<String, TaskInput> inputDescriptors = {};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    expect(builder.currentTarget, null);
+  }
+
+  test_currentValue_afterOneMoveNext() {
+    Map<String, TaskInput> inputDescriptors = {
+      'one': input1
+    };
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    builder.moveNext();
+    builder.currentValue = 'value1';
+  }
+
+  test_currentValue_beforeMoveNext() {
+    Map<String, TaskInput> inputDescriptors = {
+      'one': input1
+    };
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    expect(() {
+      builder.currentValue = 'value1';
+    }, throwsStateError);
+  }
+
+  test_inputValue_afterOneMoveNext() {
+    Map<String, TaskInput> inputDescriptors = {
+      'one': input1
+    };
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    builder.moveNext();
+    expect(() => builder.inputValue, throwsStateError);
+  }
+
+  test_inputValue_afterComplete() {
+    String key1 = 'one';
+    String key2 = 'two';
+    String value1 = 'value1';
+    String value2 = 'value2';
+    Map<String, TaskInput> inputDescriptors = {
+      key1: input1,
+      key2: input2
+    };
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    builder.moveNext(); // Advance to requesting result1 for target
+    builder.currentValue = value1;
+    builder.moveNext(); // Advance to requesting result2 for target
+    builder.currentValue = value2;
+    builder.moveNext(); // Advance to the end
+    var inputValue = builder.inputValue;
+    expect(inputValue, new isInstanceOf<Map>());
+    Map inputs = inputValue;
+    expect(inputs.length, 2);
+    expect(inputs, containsPair(key1, value1));
+    expect(inputs, containsPair(key2, value2));
+  }
+
+  test_inputValue_beforeMoveNext() {
+    Map<String, TaskInput> inputDescriptors = {};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    expect(() => builder.inputValue, throwsStateError);
+  }
+
+  test_moveNext_withoutSet() {
+    Map<String, TaskInput> inputDescriptors = {
+      'one': input1
+    };
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    expect(builder.moveNext(), true);
+    expect(() => builder.moveNext(), throwsStateError);
+  }
+
+  test_moveNext_withSet() {
+    Map<String, TaskInput> inputDescriptors = {
+      'one': input1
+    };
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    expect(builder.moveNext(), true);
+    builder.currentValue = 'value1';
+    expect(builder.moveNext(), false);
+    expect(builder.moveNext(), false);
+  }
+}
diff --git a/pkg/analyzer/test/src/task/manager_test.dart b/pkg/analyzer/test/src/task/manager_test.dart
new file mode 100644
index 0000000..3d02ac6
--- /dev/null
+++ b/pkg/analyzer/test/src/task/manager_test.dart
@@ -0,0 +1,134 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 test.src.task.manager_test;
+
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/task/manager.dart';
+import 'package:analyzer/src/task/targets.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../generated/test_support.dart';
+import '../../reflective_tests.dart';
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(TaskManagerTest);
+}
+
+@reflectiveTest
+class TaskManagerTest extends EngineTestCase {
+  static final ResultDescriptor result1 = new ResultDescriptor('result1', null);
+  static final ResultDescriptor result2 = new ResultDescriptor('result2', null);
+
+  test_addGeneralResult() {
+    TaskManager manager = new TaskManager();
+    manager.addGeneralResult(result1);
+    Set<ResultDescriptor> results = manager.generalResults;
+    expect(results, unorderedEquals([result1]));
+  }
+
+  test_addPriorityResult() {
+    TaskManager manager = new TaskManager();
+    manager.addPriorityResult(result1);
+    Set<ResultDescriptor> results = manager.priorityResults;
+    expect(results, unorderedEquals([result1]));
+  }
+
+  test_addTaskDescriptor() {
+    TaskManager manager = new TaskManager();
+    TaskDescriptor descriptor =
+        new TaskDescriptor('task', null, null, [result1]);
+    manager.addTaskDescriptor(descriptor);
+    expect(manager.taskMap.length, 1);
+  }
+
+  test_constructor() {
+    TaskManager manager = new TaskManager();
+    expect(manager, isNotNull);
+    expect(manager.generalResults, isEmpty);
+    expect(manager.priorityResults, isEmpty);
+  }
+
+  test_findTask_defined() {
+    TaskManager manager = new TaskManager();
+    TaskDescriptor descriptor =
+        new TaskDescriptor('task', null, null, [result1]);
+    manager.addTaskDescriptor(descriptor);
+    AnalysisTarget target = new SourceTarget(null);
+    expect(manager.findTask(target, result1), descriptor);
+  }
+
+  test_findTask_empty() {
+    TaskManager manager = new TaskManager();
+    AnalysisTarget target = new SourceTarget(null);
+    expect(
+        () => manager.findTask(target, result1),
+        throwsA(new isInstanceOf<AnalysisException>()));
+  }
+
+  test_findTask_multiple() {
+    TaskManager manager = new TaskManager();
+    TaskDescriptor descriptor1 =
+        new TaskDescriptor('task1', null, null, [result1]);
+    manager.addTaskDescriptor(descriptor1);
+    TaskDescriptor descriptor2 =
+        new TaskDescriptor('task2', null, null, [result1]);
+    manager.addTaskDescriptor(descriptor2);
+    TaskDescriptor descriptor3 =
+        new TaskDescriptor('task3', null, null, [result2]);
+    manager.addTaskDescriptor(descriptor3);
+
+    AnalysisTarget target = new SourceTarget(null);
+    TaskDescriptor task = manager.findTask(target, result1);
+    expect(task == descriptor1 || task == descriptor2, true);
+  }
+
+  test_findTask_undefined() {
+    TaskManager manager = new TaskManager();
+    TaskDescriptor descriptor =
+        new TaskDescriptor('task', null, null, [result1]);
+    manager.addTaskDescriptor(descriptor);
+    AnalysisTarget target = new SourceTarget(null);
+    expect(
+        () => manager.findTask(target, result2),
+        throwsA(new isInstanceOf<AnalysisException>()));
+  }
+
+  test_removeGeneralResult_absent() {
+    TaskManager manager = new TaskManager();
+    manager.addGeneralResult(result1);
+    Set<ResultDescriptor> results = manager.generalResults;
+    expect(results, unorderedEquals([result1]));
+  }
+
+  test_removeGeneralResult_present() {
+    TaskManager manager = new TaskManager();
+    manager.addGeneralResult(result1);
+    manager.addGeneralResult(result2);
+    Set<ResultDescriptor> results = manager.generalResults;
+    expect(results, unorderedEquals([result1, result2]));
+    manager.removeGeneralResult(result1);
+    expect(results, unorderedEquals([result2]));
+  }
+
+  test_removePriorityResult_absent() {
+    TaskManager manager = new TaskManager();
+    manager.addPriorityResult(result1);
+    manager.removePriorityResult(result2);
+    Set<ResultDescriptor> results = manager.priorityResults;
+    expect(results, unorderedEquals([result1]));
+  }
+
+  test_removePriorityResult_present() {
+    TaskManager manager = new TaskManager();
+    manager.addPriorityResult(result1);
+    manager.addPriorityResult(result2);
+    Set<ResultDescriptor> results = manager.priorityResults;
+    expect(results, unorderedEquals([result1, result2]));
+    manager.removePriorityResult(result1);
+    expect(results, unorderedEquals([result2]));
+  }
+}
diff --git a/pkg/analyzer/test/src/task/model_test.dart b/pkg/analyzer/test/src/task/model_test.dart
new file mode 100644
index 0000000..9fdf41e
--- /dev/null
+++ b/pkg/analyzer/test/src/task/model_test.dart
@@ -0,0 +1,162 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 test.src.task.model_test;
+
+import 'package:analyzer/src/generated/engine.dart' hide AnalysisTask;
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/task/model.dart';
+import 'package:analyzer/src/task/targets.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../generated/test_support.dart';
+import '../../reflective_tests.dart';
+import 'test_support.dart';
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(AnalysisTaskTest);
+  runReflectiveTests(ContributionPointImplTest);
+  runReflectiveTests(ResultDescriptorImplTest);
+  runReflectiveTests(TaskDescriptorImplTest);
+}
+
+@reflectiveTest
+class AnalysisTaskTest extends EngineTestCase {
+  test_getRequiredInput_missingKey() {
+    SourceTarget target = new SourceTarget(new TestSource());
+    AnalysisTask task = new TestAnalysisTask(null, target);
+    task.inputs = {
+      'a': 'b'
+    };
+    expect(
+        () => task.getRequiredInput('c'),
+        throwsA(new isInstanceOf<AnalysisException>()));
+  }
+
+  test_getRequiredInput_noInputs() {
+    SourceTarget target = new SourceTarget(new TestSource());
+    AnalysisTask task = new TestAnalysisTask(null, target);
+    expect(
+        () => task.getRequiredInput('x'),
+        throwsA(new isInstanceOf<AnalysisException>()));
+  }
+
+  test_getRequiredInput_valid() {
+    SourceTarget target = new SourceTarget(new TestSource());
+    AnalysisTask task = new TestAnalysisTask(null, target);
+    String key = 'a';
+    String value = 'b';
+    task.inputs = {
+      key: value
+    };
+    expect(task.getRequiredInput(key), value);
+  }
+
+  test_getRequiredSource() {
+    Source source = new TestSource();
+    SourceTarget target = new SourceTarget(source);
+    AnalysisTask task = new TestAnalysisTask(null, target);
+    expect(task.getRequiredSource(), source);
+  }
+}
+
+@reflectiveTest
+class ContributionPointImplTest extends EngineTestCase {
+  test_contributors_empty() {
+    ContributionPointImpl point = new ContributionPointImpl('point');
+    List<ResultDescriptor> contributors = point.contributors;
+    expect(contributors, isEmpty);
+  }
+
+  test_contributors_nonEmpty() {
+    ResultDescriptorImpl result1 = new ResultDescriptorImpl('result1', null);
+    ResultDescriptorImpl result2 = new ResultDescriptorImpl('result2', null);
+    ContributionPointImpl point = new ContributionPointImpl('point');
+    point.recordContributor(result1);
+    point.recordContributor(result2);
+    List<ResultDescriptor> contributors = point.contributors;
+    expect(contributors, isNotNull);
+    expect(contributors, hasLength(2));
+    if (!(contributors[0] == result1 && contributors[1] == result2) ||
+        (contributors[0] == result2 && contributors[1] == result1)) {
+      fail("Invalid contributors: $contributors");
+    }
+  }
+
+  test_create() {
+    expect(new ContributionPointImpl('name'), isNotNull);
+  }
+
+  test_name() {
+    String name = 'point';
+    ContributionPointImpl point = new ContributionPointImpl(name);
+    expect(point.name, name);
+  }
+}
+
+@reflectiveTest
+class ResultDescriptorImplTest extends EngineTestCase {
+  test_create_withContribution() {
+    ContributionPointImpl point = new ContributionPointImpl('point');
+    ResultDescriptorImpl result =
+        new ResultDescriptorImpl('result', null, contributesTo: point);
+    expect(result, isNotNull);
+    List<ResultDescriptor> contributors = point.contributors;
+    expect(contributors, unorderedEquals([result]));
+  }
+
+  test_create_withoutContribution() {
+    expect(new ResultDescriptorImpl('name', null), isNotNull);
+  }
+
+  test_inputFor() {
+    SourceTarget target = new SourceTarget(null);
+    ResultDescriptorImpl result = new ResultDescriptorImpl('result', null);
+    TaskInput input = result.inputFor(target);
+    expect(input, isNotNull);
+  }
+
+  test_name() {
+    String name = 'result';
+    ResultDescriptorImpl result = new ResultDescriptorImpl(name, null);
+    expect(result.name, name);
+  }
+}
+
+@reflectiveTest
+class TaskDescriptorImplTest extends EngineTestCase {
+  test_create() {
+    String name = 'name';
+    BuildTask buildTask = (context, target) {};
+    CreateTaskInputs createTaskInputs = (target) {};
+    List<ResultDescriptor> results = <ResultDescriptor>[];
+    TaskDescriptorImpl descriptor =
+        new TaskDescriptorImpl(name, buildTask, createTaskInputs, results);
+    expect(descriptor, isNotNull);
+    expect(descriptor.name, name);
+    expect(descriptor.buildTask, equals(buildTask));
+    expect(descriptor.createTaskInputs, equals(createTaskInputs));
+    expect(descriptor.results, results);
+  }
+
+  test_createTask() {
+    BuildTask buildTask =
+        (context, target) => new TestAnalysisTask(context, target);
+    CreateTaskInputs createTaskInputs = (target) {};
+    List<ResultDescriptor> results = <ResultDescriptor>[];
+    TaskDescriptorImpl descriptor =
+        new TaskDescriptorImpl('name', buildTask, createTaskInputs, results);
+    AnalysisContext context = null;
+    SourceTarget target = new SourceTarget(null);
+    Map<String, dynamic> inputs = {};
+    AnalysisTask createTask = descriptor.createTask(context, target, inputs);
+    expect(createTask, isNotNull);
+    expect(createTask.context, context);
+    expect(createTask.inputs, inputs);
+    expect(createTask.target, target);
+  }
+}
diff --git a/pkg/analyzer/test/src/task/targets_test.dart b/pkg/analyzer/test/src/task/targets_test.dart
new file mode 100644
index 0000000..eb25284
--- /dev/null
+++ b/pkg/analyzer/test/src/task/targets_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 test.src.task.targets_test;
+
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/task/targets.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../generated/test_support.dart';
+import '../../reflective_tests.dart';
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(SourceTargetTest);
+}
+
+@reflectiveTest
+class SourceTargetTest extends EngineTestCase {
+  test_create() {
+    Source source = new TestSource();
+    SourceTarget target = new SourceTarget(source);
+    expect(target, isNotNull);
+    expect(target.source, source);
+  }
+}
diff --git a/pkg/analyzer/test/src/task/test_all.dart b/pkg/analyzer/test/src/task/test_all.dart
new file mode 100644
index 0000000..86c790f
--- /dev/null
+++ b/pkg/analyzer/test/src/task/test_all.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 test.src.task;
+
+import 'package:unittest/unittest.dart';
+
+import 'inputs_test.dart' as inputs_test;
+import 'manager_test.dart' as manager_test;
+import 'model_test.dart' as model_test;
+import 'targets_test.dart' as targets_test;
+
+/// Utility for manually running all tests.
+main() {
+  groupSep = ' | ';
+  group('task tests', () {
+    inputs_test.main();
+    manager_test.main();
+    model_test.main();
+    targets_test.main();
+  });
+}
diff --git a/pkg/analyzer/test/src/task/test_support.dart b/pkg/analyzer/test/src/task/test_support.dart
new file mode 100644
index 0000000..85297f6
--- /dev/null
+++ b/pkg/analyzer/test/src/task/test_support.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 test.src.task.test_support;
+
+import 'package:analyzer/src/generated/engine.dart' hide AnalysisTask;
+import 'package:analyzer/task/model.dart';
+
+class TestAnalysisTask extends AnalysisTask {
+  TestAnalysisTask(AnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  String get description => 'Test task';
+
+  @override
+  TaskDescriptor get descriptor => null;
+
+  @override
+  internalPerform() {
+  }
+}
diff --git a/pkg/analyzer/test/src/test_all.dart b/pkg/analyzer/test/src/test_all.dart
new file mode 100644
index 0000000..d29d023
--- /dev/null
+++ b/pkg/analyzer/test/src/test_all.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 test.src;
+
+import 'package:unittest/unittest.dart';
+
+import 'task/test_all.dart' as task;
+
+/// Utility for manually running all tests.
+main() {
+  groupSep = ' | ';
+  group('generated tests', () {
+    task.main();
+  });
+}
diff --git a/pkg/analyzer/test/test_all.dart b/pkg/analyzer/test/test_all.dart
index fb65cbb..56de8fd 100644
--- a/pkg/analyzer/test/test_all.dart
+++ b/pkg/analyzer/test/test_all.dart
@@ -14,6 +14,7 @@
 import 'options_test.dart' as options;
 import 'parse_compilation_unit_test.dart' as parse_compilation_unit;
 import 'source/test_all.dart' as source;
+import 'src/test_all.dart' as src;
 import 'task/test_all.dart' as task;
 import 'cancelable_future_test.dart' as cancelable_future_test;
 
@@ -31,6 +32,7 @@
     options.main();
     parse_compilation_unit.main();
     source.main();
+    src.main();
     task.main();
   });
 }
diff --git a/pkg/analyzer2dart/lib/src/cps_generator.dart b/pkg/analyzer2dart/lib/src/cps_generator.dart
index 369b5da..03cc77a 100644
--- a/pkg/analyzer2dart/lib/src/cps_generator.dart
+++ b/pkg/analyzer2dart/lib/src/cps_generator.dart
@@ -50,6 +50,9 @@
 /// Visitor that converts analyzer AST nodes into CPS ir nodes.

 class CpsGeneratingVisitor extends SemanticVisitor<ir.Node>

     with IrBuilderMixin<AstNode> {

+  /// Promote the type of [irBuilder] to [DartIrBuilder].

+  /// The JS backend requires closure conversion which we do not support yet.

+  DartIrBuilder get irBuilder => super.irBuilder;

   final analyzer.Element element;

   final ElementConverter converter;

 

@@ -68,7 +71,7 @@
         new DartIrBuilder(DART_CONSTANT_SYSTEM,

                           element,

                           // TODO(johnniwinther): Supported closure variables.

-                          new NullClosureVariableInfo()),

+                          new NullCapturedVariableInfo()),

         () {

       irBuilder.buildFieldInitializerHeader();

       ir.Primitive initializer = build(node.initializer);

@@ -83,7 +86,7 @@
         new DartIrBuilder(DART_CONSTANT_SYSTEM,

                           element,

                           // TODO(johnniwinther): Supported closure variables.

-                          new NullClosureVariableInfo()),

+                          new NullCapturedVariableInfo()),

         () {

       irBuilder.buildFunctionHeader(

           function.parameters.map(converter.convertElement));

@@ -443,16 +446,21 @@
   @override

   visitForStatement(ForStatement node) {

     // TODO(johnniwinther): Support `for` as a jump target.

+    List<dart2js.LocalElement> loopVariables = <dart2js.LocalElement>[];

     SubbuildFunction buildInitializer;

     if (node.variables != null) {

       buildInitializer = subbuild(node.variables);

+      for (VariableDeclaration variable in node.variables.variables) {

+        loopVariables.add(converter.convertElement(variable.element));

+      }

     } else {

       buildInitializer = subbuild(node.initialization);

     }

     irBuilder.buildFor(buildInitializer: buildInitializer,

                        buildCondition: subbuild(node.condition),

                        buildBody: subbuild(node.body),

-                       buildUpdate: subbuildSequence(node.updaters));

+                       buildUpdate: subbuildSequence(node.updaters),

+                       loopVariables: loopVariables);

   }

 

   @override

@@ -520,6 +528,6 @@
   }

 }

 

-class NullClosureVariableInfo extends ClosureVariableInfo {

+class NullCapturedVariableInfo extends DartCapturedVariableInfo {

   Iterable get capturedVariables => const [];

 }

diff --git a/pkg/analyzer2dart/test/end2end_data.dart b/pkg/analyzer2dart/test/end2end_data.dart
index 9904703..50eafcd 100644
--- a/pkg/analyzer2dart/test/end2end_data.dart
+++ b/pkg/analyzer2dart/test/end2end_data.dart
@@ -760,10 +760,9 @@
 }
 ''', '''
 main(a) {
-  var i, v0 = a.iterator;
+  var v0 = a.iterator;
   while (v0.moveNext()) {
-    i = v0.current;
-    print(i);
+    print(v0.current);
   }
 }
 '''),
diff --git a/pkg/analyzer2dart/test/sexpr_data.dart b/pkg/analyzer2dart/test/sexpr_data.dart
index 2d1185f..699192a 100644
--- a/pkg/analyzer2dart/test/sexpr_data.dart
+++ b/pkg/analyzer2dart/test/sexpr_data.dart
@@ -35,9 +35,9 @@
 }
 ''', '''
 (FunctionDefinition main () return ()
-  (LetCont (k0 (v0)
+  (LetCont ((k0 (v0)
       (LetPrim (v1 (Constant (Null)))
-        (InvokeContinuation return (v1))))
+        (InvokeContinuation return (v1)))))
     (InvokeStatic foo () k0)))
 ''')
   ]),
@@ -121,9 +121,9 @@
 ''', '''
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Null)))
-    (LetCont (k0 (v1)
+    (LetCont ((k0 (v1)
         (LetPrim (v2 (Constant (Null)))
-          (InvokeContinuation return (v2))))
+          (InvokeContinuation return (v2)))))
       (InvokeStatic foo (v0) k0))))
 '''),
 
@@ -137,13 +137,13 @@
 ''', '''
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Null)))
-    (LetCont (k0 (v1)
+    (LetCont ((k0 (v1)
         (LetPrim (v2 (Constant (Int 0)))
           (LetPrim (v3 (Constant (String "")))
-            (LetCont (k1 (v4)
+            (LetCont ((k1 (v4)
                 (LetPrim (v5 (Constant (Null)))
-                  (InvokeContinuation return (v5))))
-              (InvokeStatic bar (v2 v3) k1)))))
+                  (InvokeContinuation return (v5)))))
+              (InvokeStatic bar (v2 v3) k1))))))
       (InvokeStatic foo (v0) k0))))
 '''),
 
@@ -155,8 +155,8 @@
 ''', '''
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Null)))
-    (LetCont (k0 (v1)
-        (InvokeContinuation return (v1)))
+    (LetCont ((k0 (v1)
+        (InvokeContinuation return (v1))))
       (InvokeStatic foo (v0) k0))))
 '''),
   ]),
@@ -232,11 +232,11 @@
 ''', '''
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
-    (LetCont (k0 (v1)
+    (LetCont ((k0 (v1)
         (LetPrim (v2 (Constant (String "")))
-          (LetCont (k1 (v3)
-              (InvokeContinuation return (v2)))
-            (InvokeStatic print (v2) k1))))
+          (LetCont ((k1 (v3)
+              (InvokeContinuation return (v2))))
+            (InvokeStatic print (v2) k1)))))
       (InvokeStatic print (v0) k0))))
 '''),
 
@@ -249,11 +249,11 @@
 }
 ''', '''
 (FunctionDefinition main (a) return ()
-  (LetCont (k0 (v0)
+  (LetCont ((k0 (v0)
       (LetPrim (v1 (Constant (String "")))
-        (LetCont (k1 (v2)
-            (InvokeContinuation return (v1)))
-          (InvokeStatic print (v1) k1))))
+        (LetCont ((k1 (v2)
+            (InvokeContinuation return (v1))))
+          (InvokeStatic print (v1) k1)))))
     (InvokeStatic print (a) k0)))
 '''),
 
@@ -267,16 +267,16 @@
 }
 ''', '''
 (FunctionDefinition main (a) return ()
-  (LetCont (k0 (v0)
-      (LetCont (k1 (v1)
-          (InvokeContinuation return (v0)))
-        (InvokeStatic print (v0) k1)))
-    (LetCont (k2 ()
+  (LetCont ((k0 (v0)
+      (LetCont ((k1 (v1)
+          (InvokeContinuation return (v0))))
+        (InvokeStatic print (v0) k1))))
+    (LetCont ((k2 ()
         (LetPrim (v2 (Constant (String "")))
           (InvokeContinuation k0 (v2))))
-      (LetCont (k3 ()
-          (InvokeContinuation k0 (a)))
-        (Branch (IsTrue a) k2 k3)))))
+              (k3 ()
+        (InvokeContinuation k0 (a))))
+      (Branch (IsTrue a) k2 k3))))
 '''),
   ]),
 
@@ -287,8 +287,8 @@
 }
 ''', '''
 (FunctionDefinition main (a) return ()
-  (LetCont (k0 (v0)
-      (InvokeContinuation return (v0)))
+  (LetCont ((k0 (v0)
+      (InvokeContinuation return (v0))))
     (InvokeMethod a foo () k0)))
 '''),
 
@@ -300,8 +300,8 @@
 ''', '''
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (String "")))
-    (LetCont (k0 (v1)
-        (InvokeContinuation return (v1)))
+    (LetCont ((k0 (v1)
+        (InvokeContinuation return (v1))))
       (InvokeMethod v0 foo () k0))))
 '''),
     ]),
@@ -314,8 +314,8 @@
 ''', '''
 (FunctionDefinition main (a) return ()
   (LetPrim (v0 (Constant (Int 0)))
-    (LetCont (k0 (v1)
-        (InvokeContinuation return (v1)))
+    (LetCont ((k0 (v1)
+        (InvokeContinuation return (v1))))
       (InvokeMethod a foo (v0) k0))))
 '''),
 
@@ -329,8 +329,8 @@
   (LetPrim (v0 (Constant (String "")))
     (LetPrim (v1 (Constant (Int 0)))
       (LetPrim (v2 (Constant (Int 1)))
-        (LetCont (k0 (v3)
-            (InvokeContinuation return (v3)))
+        (LetCont ((k0 (v3)
+            (InvokeContinuation return (v3))))
           (InvokeMethod v0 foo (v1 v2) k0))))))
 '''),
     ]),
@@ -344,8 +344,8 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
     (LetPrim (v1 (Constant (String "")))
-      (LetCont (k0 (v2)
-          (InvokeContinuation return (v2)))
+      (LetCont ((k0 (v2)
+          (InvokeContinuation return (v2))))
         (InvokeMethod v0 + (v1) k0)))))
 '''),
 
@@ -357,8 +357,8 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
     (LetPrim (v1 (Constant (String "")))
-      (LetCont (k0 (v2)
-          (InvokeContinuation return (v2)))
+      (LetCont ((k0 (v2)
+          (InvokeContinuation return (v2))))
         (InvokeMethod v0 - (v1) k0)))))
 '''),
 
@@ -370,8 +370,8 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
     (LetPrim (v1 (Constant (String "")))
-      (LetCont (k0 (v2)
-          (InvokeContinuation return (v2)))
+      (LetCont ((k0 (v2)
+          (InvokeContinuation return (v2))))
         (InvokeMethod v0 * (v1) k0)))))
 '''),
 
@@ -383,8 +383,8 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
     (LetPrim (v1 (Constant (String "")))
-      (LetCont (k0 (v2)
-          (InvokeContinuation return (v2)))
+      (LetCont ((k0 (v2)
+          (InvokeContinuation return (v2))))
         (InvokeMethod v0 / (v1) k0)))))
 '''),
 
@@ -396,8 +396,8 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
     (LetPrim (v1 (Constant (String "")))
-      (LetCont (k0 (v2)
-          (InvokeContinuation return (v2)))
+      (LetCont ((k0 (v2)
+          (InvokeContinuation return (v2))))
         (InvokeMethod v0 ~/ (v1) k0)))))
 '''),
 
@@ -409,8 +409,8 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
     (LetPrim (v1 (Constant (String "")))
-      (LetCont (k0 (v2)
-          (InvokeContinuation return (v2)))
+      (LetCont ((k0 (v2)
+          (InvokeContinuation return (v2))))
         (InvokeMethod v0 < (v1) k0)))))
 '''),
 
@@ -422,8 +422,8 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
     (LetPrim (v1 (Constant (String "")))
-      (LetCont (k0 (v2)
-          (InvokeContinuation return (v2)))
+      (LetCont ((k0 (v2)
+          (InvokeContinuation return (v2))))
         (InvokeMethod v0 <= (v1) k0)))))
 '''),
 
@@ -435,8 +435,8 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
     (LetPrim (v1 (Constant (String "")))
-      (LetCont (k0 (v2)
-          (InvokeContinuation return (v2)))
+      (LetCont ((k0 (v2)
+          (InvokeContinuation return (v2))))
         (InvokeMethod v0 > (v1) k0)))))
 '''),
 
@@ -448,8 +448,8 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
     (LetPrim (v1 (Constant (String "")))
-      (LetCont (k0 (v2)
-          (InvokeContinuation return (v2)))
+      (LetCont ((k0 (v2)
+          (InvokeContinuation return (v2))))
         (InvokeMethod v0 >= (v1) k0)))))
 '''),
 
@@ -461,8 +461,8 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
     (LetPrim (v1 (Constant (String "")))
-      (LetCont (k0 (v2)
-          (InvokeContinuation return (v2)))
+      (LetCont ((k0 (v2)
+          (InvokeContinuation return (v2))))
         (InvokeMethod v0 << (v1) k0)))))
 '''),
 
@@ -474,8 +474,8 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
     (LetPrim (v1 (Constant (String "")))
-      (LetCont (k0 (v2)
-          (InvokeContinuation return (v2)))
+      (LetCont ((k0 (v2)
+          (InvokeContinuation return (v2))))
         (InvokeMethod v0 >> (v1) k0)))))
 '''),
 
@@ -487,8 +487,8 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
     (LetPrim (v1 (Constant (String "")))
-      (LetCont (k0 (v2)
-          (InvokeContinuation return (v2)))
+      (LetCont ((k0 (v2)
+          (InvokeContinuation return (v2))))
         (InvokeMethod v0 & (v1) k0)))))
 '''),
 
@@ -500,8 +500,8 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
     (LetPrim (v1 (Constant (String "")))
-      (LetCont (k0 (v2)
-          (InvokeContinuation return (v2)))
+      (LetCont ((k0 (v2)
+          (InvokeContinuation return (v2))))
         (InvokeMethod v0 | (v1) k0)))))
 '''),
 
@@ -513,8 +513,8 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
     (LetPrim (v1 (Constant (String "")))
-      (LetCont (k0 (v2)
-          (InvokeContinuation return (v2)))
+      (LetCont ((k0 (v2)
+          (InvokeContinuation return (v2))))
         (InvokeMethod v0 ^ (v1) k0)))))
 '''),
 
@@ -526,8 +526,8 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
     (LetPrim (v1 (Constant (String "")))
-      (LetCont (k0 (v2)
-          (InvokeContinuation return (v2)))
+      (LetCont ((k0 (v2)
+          (InvokeContinuation return (v2))))
         (InvokeMethod v0 == (v1) k0)))))
 '''),
 
@@ -539,16 +539,16 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
     (LetPrim (v1 (Constant (String "")))
-      (LetCont (k0 (v2)
-          (LetCont (k1 (v3)
-              (InvokeContinuation return (v3)))
-            (LetCont (k2 ()
+      (LetCont ((k0 (v2)
+          (LetCont ((k1 (v3)
+              (InvokeContinuation return (v3))))
+            (LetCont ((k2 ()
                 (LetPrim (v4 (Constant (Bool false)))
                   (InvokeContinuation k1 (v4))))
-              (LetCont (k3 ()
-                  (LetPrim (v5 (Constant (Bool true)))
-                    (InvokeContinuation k1 (v5))))
-                (Branch (IsTrue v2) k2 k3)))))
+                      (k3 ()
+                (LetPrim (v5 (Constant (Bool true)))
+                  (InvokeContinuation k1 (v5)))))
+              (Branch (IsTrue v2) k2 k3)))))
         (InvokeMethod v0 == (v1) k0)))))
 '''),
 
@@ -559,21 +559,21 @@
 ''', '''
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
-    (LetCont (k0 (v1)
-        (InvokeContinuation return (v1)))
-      (LetCont (k1 ()
+    (LetCont ((k0 (v1)
+        (InvokeContinuation return (v1))))
+      (LetCont ((k1 ()
           (LetPrim (v2 (Constant (String "")))
-            (LetCont (k2 ()
+            (LetCont ((k2 ()
                 (LetPrim (v3 (Constant (Bool true)))
                   (InvokeContinuation k0 (v3))))
-              (LetCont (k3 ()
-                  (LetPrim (v4 (Constant (Bool false)))
-                    (InvokeContinuation k0 (v4))))
-                (Branch (IsTrue v2) k2 k3)))))
-        (LetCont (k4 ()
-            (LetPrim (v5 (Constant (Bool false)))
-              (InvokeContinuation k0 (v5))))
-          (Branch (IsTrue v0) k1 k4))))))
+                      (k3 ()
+                (LetPrim (v4 (Constant (Bool false)))
+                  (InvokeContinuation k0 (v4)))))
+              (Branch (IsTrue v2) k2 k3))))
+                (k4 ()
+          (LetPrim (v5 (Constant (Bool false)))
+            (InvokeContinuation k0 (v5)))))
+        (Branch (IsTrue v0) k1 k4)))))
 '''),
 
     const TestSpec('''
@@ -583,21 +583,21 @@
 ''', '''
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
-    (LetCont (k0 (v1)
-        (InvokeContinuation return (v1)))
-      (LetCont (k1 ()
+    (LetCont ((k0 (v1)
+        (InvokeContinuation return (v1))))
+      (LetCont ((k1 ()
           (LetPrim (v2 (Constant (Bool true)))
             (InvokeContinuation k0 (v2))))
-        (LetCont (k2 ()
-            (LetPrim (v3 (Constant (String "")))
-              (LetCont (k3 ()
-                  (LetPrim (v4 (Constant (Bool true)))
-                    (InvokeContinuation k0 (v4))))
-                (LetCont (k4 ()
-                    (LetPrim (v5 (Constant (Bool false)))
-                      (InvokeContinuation k0 (v5))))
-                  (Branch (IsTrue v3) k3 k4)))))
-          (Branch (IsTrue v0) k1 k2))))))
+                (k2 ()
+          (LetPrim (v3 (Constant (String "")))
+            (LetCont ((k3 ()
+                (LetPrim (v4 (Constant (Bool true)))
+                  (InvokeContinuation k0 (v4))))
+                      (k4 ()
+                (LetPrim (v5 (Constant (Bool false)))
+                  (InvokeContinuation k0 (v5)))))
+              (Branch (IsTrue v3) k3 k4)))))
+        (Branch (IsTrue v0) k1 k2)))))
 '''),
 
     const TestSpec('''
@@ -609,10 +609,10 @@
   (LetPrim (v0 (Constant (Int 0)))
     (LetPrim (v1 (Constant (String "")))
       (LetPrim (v2 (Constant (Int 2)))
-        (LetCont (k0 (v3)
-            (LetCont (k1 (v4)
-                (InvokeContinuation return (v4)))
-              (InvokeMethod v0 + (v3) k1)))
+        (LetCont ((k0 (v3)
+            (LetCont ((k1 (v4)
+                (InvokeContinuation return (v4))))
+              (InvokeMethod v0 + (v3) k1))))
           (InvokeMethod v1 * (v2) k0))))))
 '''),
 
@@ -624,11 +624,11 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
     (LetPrim (v1 (Constant (String "")))
-      (LetCont (k0 (v2)
+      (LetCont ((k0 (v2)
           (LetPrim (v3 (Constant (Int 2)))
-            (LetCont (k1 (v4)
-                (InvokeContinuation return (v4)))
-              (InvokeMethod v2 + (v3) k1))))
+            (LetCont ((k1 (v4)
+                (InvokeContinuation return (v4))))
+              (InvokeMethod v2 + (v3) k1)))))
         (InvokeMethod v0 * (v1) k0)))))
 '''),
     ]),
@@ -642,17 +642,17 @@
 }
 ''', '''
 (FunctionDefinition main (a) return ()
-  (LetCont (k0 ()
+  (LetCont ((k0 ()
       (LetPrim (v0 (Constant (Null)))
-        (InvokeContinuation return (v0))))
-    (LetCont (k1 ()
+        (InvokeContinuation return (v0)))))
+    (LetCont ((k1 ()
         (LetPrim (v1 (Constant (Int 0)))
-          (LetCont (k2 (v2)
-              (InvokeContinuation k0 ()))
+          (LetCont ((k2 (v2)
+              (InvokeContinuation k0 ())))
             (InvokeStatic print (v1) k2))))
-      (LetCont (k3 ()
-          (InvokeContinuation k0 ()))
-        (Branch (IsTrue a) k1 k3)))))
+              (k3 ()
+        (InvokeContinuation k0 ())))
+      (Branch (IsTrue a) k1 k3))))
 '''),
 
     const TestSpec('''
@@ -665,20 +665,20 @@
 }
 ''', '''
 (FunctionDefinition main (a) return ()
-  (LetCont (k0 ()
+  (LetCont ((k0 ()
       (LetPrim (v0 (Constant (Null)))
-        (InvokeContinuation return (v0))))
-    (LetCont (k1 ()
+        (InvokeContinuation return (v0)))))
+    (LetCont ((k1 ()
         (LetPrim (v1 (Constant (Int 0)))
-          (LetCont (k2 (v2)
-              (InvokeContinuation k0 ()))
+          (LetCont ((k2 (v2)
+              (InvokeContinuation k0 ())))
             (InvokeStatic print (v1) k2))))
-      (LetCont (k3 ()
-          (LetPrim (v3 (Constant (Int 1)))
-            (LetCont (k4 (v4)
-                (InvokeContinuation k0 ()))
-              (InvokeStatic print (v3) k4))))
-        (Branch (IsTrue a) k1 k3)))))
+              (k3 ()
+        (LetPrim (v3 (Constant (Int 1)))
+          (LetCont ((k4 (v4)
+              (InvokeContinuation k0 ())))
+            (InvokeStatic print (v3) k4)))))
+      (Branch (IsTrue a) k1 k3))))
 '''),
 
     const TestSpec('''
@@ -692,23 +692,23 @@
 }
 ''', '''
 (FunctionDefinition main (a) return ()
-  (LetCont (k0 ()
+  (LetCont ((k0 ()
       (LetPrim (v0 (Constant (Null)))
-        (InvokeContinuation return (v0))))
-    (LetCont (k1 ()
+        (InvokeContinuation return (v0)))))
+    (LetCont ((k1 ()
         (LetPrim (v1 (Constant (Int 0)))
-          (LetCont (k2 (v2)
-              (InvokeContinuation k0 ()))
+          (LetCont ((k2 (v2)
+              (InvokeContinuation k0 ())))
             (InvokeStatic print (v1) k2))))
-      (LetCont (k3 ()
-          (LetPrim (v3 (Constant (Int 1)))
-            (LetCont (k4 (v4)
-                (LetPrim (v5 (Constant (Int 2)))
-                  (LetCont (k5 (v6)
-                      (InvokeContinuation k0 ()))
-                    (InvokeStatic print (v5) k5))))
-              (InvokeStatic print (v3) k4))))
-        (Branch (IsTrue a) k1 k3)))))
+              (k3 ()
+        (LetPrim (v3 (Constant (Int 1)))
+          (LetCont ((k4 (v4)
+              (LetPrim (v5 (Constant (Int 2)))
+                (LetCont ((k5 (v6)
+                    (InvokeContinuation k0 ())))
+                  (InvokeStatic print (v5) k5)))))
+            (InvokeStatic print (v3) k4)))))
+      (Branch (IsTrue a) k1 k3))))
 '''),
     ]),
 
@@ -719,19 +719,19 @@
 }
 ''', '''
 (FunctionDefinition main (a) return ()
-  (LetCont (k0 (v0)
-      (InvokeContinuation return (v0)))
-    (LetCont (k1 ()
+  (LetCont ((k0 (v0)
+      (InvokeContinuation return (v0))))
+    (LetCont ((k1 ()
         (LetPrim (v1 (Constant (Int 0)))
-          (LetCont (k2 (v2)
-              (InvokeContinuation k0 (v2)))
+          (LetCont ((k2 (v2)
+              (InvokeContinuation k0 (v2))))
             (InvokeStatic print (v1) k2))))
-      (LetCont (k3 ()
-          (LetPrim (v3 (Constant (Int 1)))
-            (LetCont (k4 (v4)
-                (InvokeContinuation k0 (v4)))
-              (InvokeStatic print (v3) k4))))
-        (Branch (IsTrue a) k1 k3)))))
+              (k3 ()
+        (LetPrim (v3 (Constant (Int 1)))
+          (LetCont ((k4 (v4)
+              (InvokeContinuation k0 (v4))))
+            (InvokeStatic print (v3) k4)))))
+      (Branch (IsTrue a) k1 k3))))
 '''),
     ]),
 
@@ -761,13 +761,13 @@
 }
 ''', '''
 (FunctionDefinition main (a) return ()
-  (LetCont (k0 ()
+  (LetCont ((k0 ()
       (LetPrim (v0 (Constant (Int 0)))
         (InvokeContinuation return (v0))))
-    (LetCont (k1 ()
-        (LetPrim (v1 (Constant (Int 2)))
-          (InvokeContinuation return (v1))))
-      (Branch (IsTrue a) k0 k1))))
+            (k1 ()
+      (LetPrim (v1 (Constant (Int 2)))
+        (InvokeContinuation return (v1)))))
+    (Branch (IsTrue a) k0 k1)))
 '''),
 
     const TestSpec('''
@@ -784,19 +784,19 @@
 }
 ''', '''
 (FunctionDefinition main (a) return ()
-  (LetCont (k0 ()
+  (LetCont ((k0 ()
       (LetPrim (v0 (Constant (Int 0)))
-        (LetCont (k1 (v1)
+        (LetCont ((k1 (v1)
             (LetPrim (v2 (Constant (Int 0)))
-              (InvokeContinuation return (v2))))
+              (InvokeContinuation return (v2)))))
           (InvokeStatic print (v0) k1))))
-    (LetCont (k2 ()
-        (LetPrim (v3 (Constant (Int 2)))
-          (LetCont (k3 (v4)
-              (LetPrim (v5 (Constant (Int 2)))
-                (InvokeContinuation return (v5))))
-            (InvokeStatic print (v3) k3))))
-      (Branch (IsTrue a) k0 k2))))
+            (k2 ()
+      (LetPrim (v3 (Constant (Int 2)))
+        (LetCont ((k3 (v4)
+            (LetPrim (v5 (Constant (Int 2)))
+              (InvokeContinuation return (v5)))))
+          (InvokeStatic print (v3) k3)))))
+    (Branch (IsTrue a) k0 k2)))
 '''),
   ]),
 
@@ -807,9 +807,9 @@
 }
 ''', '''
 (FunctionDefinition main (a) return ()
-  (LetCont (k0 (v0)
+  (LetCont ((k0 (v0)
       (LetPrim (v1 (Constant (Null)))
-        (InvokeContinuation return (v1))))
+        (InvokeContinuation return (v1)))))
     (InvokeConstructor Object () k0)))
 '''),
 
@@ -820,9 +820,9 @@
 ''', '''
 (FunctionDefinition main (a) return ()
   (LetPrim (v0 (Constant (String "")))
-    (LetCont (k0 (v1)
+    (LetCont ((k0 (v1)
         (LetPrim (v2 (Constant (Null)))
-          (InvokeContinuation return (v2))))
+          (InvokeContinuation return (v2)))))
       (InvokeConstructor Deprecated (v0) k0))))
 '''),
   ]),
@@ -943,14 +943,14 @@
 }
 ''', '''
 (FunctionDefinition main () return ()
-  (LetCont* (k0 ()
+  (LetCont ((rec k0 ()
       (LetPrim (v0 (Constant (Bool true)))
-        (LetCont (k1 ()
+        (LetCont ((k1 ()
             (LetPrim (v1 (Constant (Null)))
               (InvokeContinuation return (v1))))
-          (LetCont (k2 ()
-              (InvokeContinuation* k0 ()))
-            (Branch (IsTrue v0) k2 k1)))))
+                  (k2 ()
+            (InvokeContinuation rec k0 ())))
+          (Branch (IsTrue v0) k2 k1)))))
     (InvokeContinuation k0 ())))
 '''),
 
@@ -963,21 +963,21 @@
 ''', '''
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
-    (LetCont* (k0 (v1)
+    (LetCont ((rec k0 (v1)
         (LetPrim (v2 (Constant (Int 10)))
-          (LetCont (k1 (v3)
-              (LetCont (k2 ()
+          (LetCont ((k1 (v3)
+              (LetCont ((k2 ()
                   (LetPrim (v4 (Constant (Null)))
                     (InvokeContinuation return (v4))))
-                (LetCont (k3 ()
-                    (LetCont (k4 (v5)
-                        (LetPrim (v6 (Constant (Int 1)))
-                          (LetCont (k5 (v7)
-                              (InvokeContinuation* k0 (v7)))
-                            (InvokeMethod v1 + (v6) k5))))
-                      (InvokeStatic print (v1) k4)))
-                  (Branch (IsTrue v3) k3 k2))))
-            (InvokeMethod v1 < (v2) k1))))
+                        (k3 ()
+                  (LetCont ((k4 (v5)
+                      (LetPrim (v6 (Constant (Int 1)))
+                        (LetCont ((k5 (v7)
+                            (InvokeContinuation rec k0 (v7))))
+                          (InvokeMethod v1 + (v6) k5)))))
+                    (InvokeStatic print (v1) k4))))
+                (Branch (IsTrue v3) k3 k2))))
+            (InvokeMethod v1 < (v2) k1)))))
       (InvokeContinuation k0 (v0)))))
 '''),
 
@@ -990,21 +990,21 @@
 ''', '''
 (FunctionDefinition main (i) return ()
   (LetPrim (v0 (Constant (Int 0)))
-    (LetCont* (k0 (v1)
+    (LetCont ((rec k0 (v1)
         (LetPrim (v2 (Constant (Int 10)))
-          (LetCont (k1 (v3)
-              (LetCont (k2 ()
+          (LetCont ((k1 (v3)
+              (LetCont ((k2 ()
                   (LetPrim (v4 (Constant (Null)))
                     (InvokeContinuation return (v4))))
-                (LetCont (k3 ()
-                    (LetCont (k4 (v5)
-                        (LetPrim (v6 (Constant (Int 1)))
-                          (LetCont (k5 (v7)
-                              (InvokeContinuation* k0 (v7)))
-                            (InvokeMethod v1 + (v6) k5))))
-                      (InvokeStatic print (v1) k4)))
-                  (Branch (IsTrue v3) k3 k2))))
-            (InvokeMethod v1 < (v2) k1))))
+                        (k3 ()
+                  (LetCont ((k4 (v5)
+                      (LetPrim (v6 (Constant (Int 1)))
+                        (LetCont ((k5 (v7)
+                            (InvokeContinuation rec k0 (v7))))
+                          (InvokeMethod v1 + (v6) k5)))))
+                    (InvokeStatic print (v1) k4))))
+                (Branch (IsTrue v3) k3 k2))))
+            (InvokeMethod v1 < (v2) k1)))))
       (InvokeContinuation k0 (v0)))))
 '''),
   ]),
@@ -1016,14 +1016,14 @@
 }
 ''', '''
 (FunctionDefinition main () return ()
-  (LetCont* (k0 ()
+  (LetCont ((rec k0 ()
       (LetPrim (v0 (Constant (Bool true)))
-        (LetCont (k1 ()
+        (LetCont ((k1 ()
             (LetPrim (v1 (Constant (Null)))
               (InvokeContinuation return (v1))))
-          (LetCont (k2 ()
-              (InvokeContinuation* k0 ()))
-            (Branch (IsTrue v0) k2 k1)))))
+                  (k2 ()
+            (InvokeContinuation rec k0 ())))
+          (Branch (IsTrue v0) k2 k1)))))
     (InvokeContinuation k0 ())))
 '''),
 
@@ -1038,21 +1038,21 @@
 ''', '''
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
-    (LetCont* (k0 (v1)
+    (LetCont ((rec k0 (v1)
         (LetPrim (v2 (Constant (Int 10)))
-          (LetCont (k1 (v3)
-              (LetCont (k2 ()
+          (LetCont ((k1 (v3)
+              (LetCont ((k2 ()
                   (LetPrim (v4 (Constant (Null)))
                     (InvokeContinuation return (v4))))
-                (LetCont (k3 ()
-                    (LetCont (k4 (v5)
-                        (LetPrim (v6 (Constant (Int 1)))
-                          (LetCont (k5 (v7)
-                              (InvokeContinuation* k0 (v7)))
-                            (InvokeMethod v1 + (v6) k5))))
-                      (InvokeStatic print (v1) k4)))
-                  (Branch (IsTrue v3) k3 k2))))
-            (InvokeMethod v1 < (v2) k1))))
+                        (k3 ()
+                  (LetCont ((k4 (v5)
+                      (LetPrim (v6 (Constant (Int 1)))
+                        (LetCont ((k5 (v7)
+                            (InvokeContinuation rec k0 (v7))))
+                          (InvokeMethod v1 + (v6) k5)))))
+                    (InvokeStatic print (v1) k4))))
+                (Branch (IsTrue v3) k3 k2))))
+            (InvokeMethod v1 < (v2) k1)))))
       (InvokeContinuation k0 (v0)))))
 '''),
   ]),
@@ -1064,8 +1064,8 @@
 }
 ''', '''
 (FunctionDefinition main (a) return ()
-  (LetCont (k0 (v0)
-      (InvokeContinuation return (v0)))
+  (LetCont ((k0 (v0)
+      (InvokeContinuation return (v0))))
     (TypeOperator is a String k0)))
 '''),
 
@@ -1075,8 +1075,8 @@
 }
 ''', '''
 (FunctionDefinition main (a) return ()
-  (LetCont (k0 (v0)
-      (InvokeContinuation return (v0)))
+  (LetCont ((k0 (v0)
+      (InvokeContinuation return (v0))))
     (TypeOperator is a List<String> k0)))
 '''),
 
@@ -1086,8 +1086,8 @@
 }
 ''', '''
 (FunctionDefinition main (a) return ()
-  (LetCont (k0 (v0)
-      (InvokeContinuation return (v0)))
+  (LetCont ((k0 (v0)
+      (InvokeContinuation return (v0))))
     (TypeOperator is a Comparator<String> k0)))
 '''),
 
@@ -1097,16 +1097,16 @@
 }
 ''', '''
 (FunctionDefinition main (a) return ()
-  (LetCont (k0 (v0)
-      (LetCont (k1 (v1)
-          (InvokeContinuation return (v1)))
-        (LetCont (k2 ()
+  (LetCont ((k0 (v0)
+      (LetCont ((k1 (v1)
+          (InvokeContinuation return (v1))))
+        (LetCont ((k2 ()
             (LetPrim (v2 (Constant (Bool false)))
               (InvokeContinuation k1 (v2))))
-          (LetCont (k3 ()
-              (LetPrim (v3 (Constant (Bool true)))
-                (InvokeContinuation k1 (v3))))
-            (Branch (IsTrue v0) k2 k3)))))
+                  (k3 ()
+            (LetPrim (v3 (Constant (Bool true)))
+              (InvokeContinuation k1 (v3)))))
+          (Branch (IsTrue v0) k2 k3)))))
     (TypeOperator is a String k0)))
 '''),
 
@@ -1116,8 +1116,8 @@
 }
 ''', '''
 (FunctionDefinition main (a) return ()
-  (LetCont (k0 (v0)
-      (InvokeContinuation return (v0)))
+  (LetCont ((k0 (v0)
+      (InvokeContinuation return (v0))))
     (TypeOperator as a String k0)))
 '''),
   ]),
@@ -1133,22 +1133,22 @@
 }
 ''', '''
 (FunctionDefinition main (a) return ()
-  (LetCont (k0 (v0)
-      (LetCont* (k1 (v1)
-          (LetCont (k2 (v2)
-              (LetCont (k3 ()
+  (LetCont ((k0 (v0)
+      (LetCont ((rec k1 (v1)
+          (LetCont ((k2 (v2)
+              (LetCont ((k3 ()
                   (LetPrim (v3 (Constant (Null)))
                     (InvokeContinuation return (v3))))
-                (LetCont (k4 ()
-                    (LetPrim (v4 (Constant (Null)))
-                      (LetCont (k5 (v5)
-                          (LetCont (k6 (v6)
-                              (InvokeContinuation* k1 (v1)))
-                            (InvokeStatic print (v5) k6)))
-                        (InvokeMethod v0 current () k5))))
-                  (Branch (IsTrue v2) k4 k3))))
-            (InvokeMethod v0 moveNext () k2)))
-        (InvokeContinuation k1 (a))))
+                        (k4 ()
+                  (LetPrim (v4 (Constant (Null)))
+                    (LetCont ((k5 (v5)
+                        (LetCont ((k6 (v6)
+                            (InvokeContinuation rec k1 (v1))))
+                          (InvokeStatic print (v5) k6))))
+                      (InvokeMethod v0 current () k5)))))
+                (Branch (IsTrue v2) k4 k3))))
+            (InvokeMethod v0 moveNext () k2))))
+        (InvokeContinuation k1 (a)))))
     (InvokeMethod a iterator () k0)))
 '''),
 
@@ -1162,25 +1162,25 @@
 }
 ''', '''
 (FunctionDefinition main (a) return ()
-  (LetCont (k0 (v0)
-      (LetCont* (k1 (v1)
-          (LetCont (k2 (v2)
-              (LetCont (k3 ()
+  (LetCont ((k0 (v0)
+      (LetCont ((rec k1 (v1)
+          (LetCont ((k2 (v2)
+              (LetCont ((k3 ()
                   (LetPrim (v3 (Constant (Null)))
                     (InvokeContinuation return (v3))))
-                (LetCont (k4 ()
-                    (LetPrim (v4 (Constant (Null)))
-                      (LetCont (k5 (v5)
-                          (LetCont (k6 (v6)
-                              (LetPrim (v7 (Constant (Int 0)))
-                                (LetCont (k7 (v8)
-                                    (InvokeContinuation* k1 (v1)))
-                                  (InvokeStatic print (v7) k7))))
-                            (InvokeStatic print (v5) k6)))
-                        (InvokeMethod v0 current () k5))))
-                  (Branch (IsTrue v2) k4 k3))))
-            (InvokeMethod v0 moveNext () k2)))
-        (InvokeContinuation k1 (a))))
+                        (k4 ()
+                  (LetPrim (v4 (Constant (Null)))
+                    (LetCont ((k5 (v5)
+                        (LetCont ((k6 (v6)
+                            (LetPrim (v7 (Constant (Int 0)))
+                              (LetCont ((k7 (v8)
+                                  (InvokeContinuation rec k1 (v1))))
+                                (InvokeStatic print (v7) k7)))))
+                          (InvokeStatic print (v5) k6))))
+                      (InvokeMethod v0 current () k5)))))
+                (Branch (IsTrue v2) k4 k3))))
+            (InvokeMethod v0 moveNext () k2))))
+        (InvokeContinuation k1 (a)))))
     (InvokeMethod a iterator () k0)))
 '''),
 
@@ -1194,21 +1194,21 @@
 ''', '''
 (FunctionDefinition main (a) return ()
   (LetPrim (v0 (Constant (Null)))
-    (LetCont (k0 (v1)
-        (LetCont* (k1 (v2 v3)
-            (LetCont (k2 (v4)
-                (LetCont (k3 ()
+    (LetCont ((k0 (v1)
+        (LetCont ((rec k1 (v2 v3)
+            (LetCont ((k2 (v4)
+                (LetCont ((k3 ()
                     (LetPrim (v5 (Constant (Null)))
                       (InvokeContinuation return (v5))))
-                  (LetCont (k4 ()
-                      (LetCont (k5 (v6)
-                          (LetCont (k6 (v7)
-                              (InvokeContinuation* k1 (v2 v6)))
-                            (InvokeStatic print (v6) k6)))
-                        (InvokeMethod v1 current () k5)))
-                    (Branch (IsTrue v4) k4 k3))))
-              (InvokeMethod v1 moveNext () k2)))
-          (InvokeContinuation k1 (a v0))))
+                          (k4 ()
+                    (LetCont ((k5 (v6)
+                        (LetCont ((k6 (v7)
+                            (InvokeContinuation rec k1 (v2 v6))))
+                          (InvokeStatic print (v6) k6))))
+                      (InvokeMethod v1 current () k5))))
+                  (Branch (IsTrue v4) k4 k3))))
+              (InvokeMethod v1 moveNext () k2))))
+          (InvokeContinuation k1 (a v0)))))
       (InvokeMethod a iterator () k0))))
 '''),
   ]),
@@ -1225,8 +1225,8 @@
       (FunctionDefinition local () return ()
         (LetPrim (v1 (Constant (Null)))
           (InvokeContinuation return (v1))))))
-    (LetCont (k0 (v2)
-        (InvokeContinuation return (v2)))
+    (LetCont ((k0 (v2)
+        (InvokeContinuation return (v2))))
       (InvokeMethod v0 call () k0))))
 '''),
 
@@ -1242,8 +1242,8 @@
       (FunctionDefinition local () return ()
         (LetPrim (v1 (Constant (Null)))
           (InvokeContinuation return (v1))))))
-    (LetCont (k0 (v2)
-        (InvokeContinuation return (v2)))
+    (LetCont ((k0 (v2)
+        (InvokeContinuation return (v2))))
       (InvokeMethod v0 call () k0))))
 '''),
 
@@ -1257,8 +1257,8 @@
       (FunctionDefinition  () return ()
         (LetPrim (v1 (Constant (Null)))
           (InvokeContinuation return (v1))))))
-    (LetCont (k0 (v2)
-        (InvokeContinuation return (v2)))
+    (LetCont ((k0 (v2)
+        (InvokeContinuation return (v2))))
       (InvokeMethod v0 call () k0))))
 '''),
 
@@ -1269,23 +1269,23 @@
 }
 ''', '''
 (FunctionDefinition main (a) return ()
-  (LetCont (k0 (v0)
-      (LetCont (k1 (v1)
-          (InvokeContinuation return (v1)))
-        (InvokeMethod v0 call () k1)))
-    (LetCont (k2 ()
+  (LetCont ((k0 (v0)
+      (LetCont ((k1 (v1)
+          (InvokeContinuation return (v1))))
+        (InvokeMethod v0 call () k1))))
+    (LetCont ((k2 ()
         (LetPrim (v2 (CreateFunction
             (FunctionDefinition  () return ()
               (LetPrim (v3 (Constant (Int 0)))
                 (InvokeContinuation return (v3))))))
           (InvokeContinuation k0 (v2))))
-      (LetCont (k3 ()
-          (LetPrim (v4 (CreateFunction
-              (FunctionDefinition  () return ()
-                (LetPrim (v5 (Constant (Int 1)))
-                  (InvokeContinuation return (v5))))))
-            (InvokeContinuation k0 (v4))))
-        (Branch (IsTrue a) k2 k3)))))
+              (k3 ()
+        (LetPrim (v4 (CreateFunction
+            (FunctionDefinition  () return ()
+              (LetPrim (v5 (Constant (Int 1)))
+                (InvokeContinuation return (v5))))))
+          (InvokeContinuation k0 (v4)))))
+      (Branch (IsTrue a) k2 k3))))
 '''),
   ]),
 
@@ -1298,8 +1298,8 @@
 ''', const {
       'main': '''
 (FunctionDefinition main (args) return ()
-  (LetCont (k0 (v0)
-      (InvokeContinuation return (v0)))
+  (LetCont ((k0 (v0)
+      (InvokeContinuation return (v0))))
     (InvokeStatic field () k0)))
 ''',
       'field': '''
@@ -1314,8 +1314,8 @@
 ''', const {
       'main': '''
 (FunctionDefinition main (args) return ()
-  (LetCont (k0 (v0)
-      (InvokeContinuation return (v0)))
+  (LetCont ((k0 (v0)
+      (InvokeContinuation return (v0))))
     (InvokeStatic field () k0)))
 ''',
       'field': '''
@@ -1332,8 +1332,8 @@
 ''', const {
       'main': '''
 (FunctionDefinition main (args) return ()
-  (LetCont (k0 (v0)
-      (InvokeContinuation return (v0)))
+  (LetCont ((k0 (v0)
+      (InvokeContinuation return (v0))))
     (InvokeStatic field () k0)))
 ''',
       'field': '''
@@ -1350,12 +1350,12 @@
 }
 ''', '''
 (FunctionDefinition main (args) return ()
-  (LetCont (k0 (v0)
-      (LetCont (k1 (v1)
-          (LetCont (k2 (v2)
-              (InvokeContinuation return (v2)))
-            (InvokeStatic field () k2)))
-        (InvokeStatic field (v0) k1)))
+  (LetCont ((k0 (v0)
+      (LetCont ((k1 (v1)
+          (LetCont ((k2 (v2)
+              (InvokeContinuation return (v2))))
+            (InvokeStatic field () k2))))
+        (InvokeStatic field (v0) k1))))
     (InvokeMethod args length () k0)))
 '''),
   ]),
@@ -1369,17 +1369,17 @@
 }
 ''', '''
 (FunctionDefinition main (x foo) return (foo)
-  (LetCont (k0 (v0)
+  (LetCont ((k0 (v0)
       (LetPrim (v1 (CreateFunction
           (FunctionDefinition getFoo () return ()
             (LetPrim (v2 (GetClosureVariable foo))
               (InvokeContinuation return (v2))))))
-        (LetCont (k1 (v3)
-            (LetCont (k2 (v4)
+        (LetCont ((k1 (v3)
+            (LetCont ((k2 (v4)
                 (LetPrim (v5 (Constant (Null)))
-                  (InvokeContinuation return (v5))))
-              (InvokeStatic print (v3) k2)))
-          (InvokeMethod v1 call () k1))))
+                  (InvokeContinuation return (v5)))))
+              (InvokeStatic print (v3) k2))))
+          (InvokeMethod v1 call () k1)))))
     (InvokeStatic print (x) k0)))
 ''', skipInAnalyzerFrontend: true)
   ]),
diff --git a/pkg/browser/lib/dart.js b/pkg/browser/lib/dart.js
index 4dd825d..b1f97b1 100644
--- a/pkg/browser/lib/dart.js
+++ b/pkg/browser/lib/dart.js
@@ -26,6 +26,22 @@
         // than one script.
         document.currentScript = script;
         parent.replaceChild(script, scripts[i]);
+
+        // Support for incremental compilation.
+        script.onload = function (event) {
+          var script = event.target;
+          if (self.$dart_unsafe_incremental_support) {
+            new WebSocket(script.src.replace(/^http/, 'ws')).onmessage =
+              function (event) {
+                var patch = String(event.data);
+                self.$dart_unsafe_incremental_support.patch(patch);
+                script.dispatchEvent(
+                  new CustomEvent(
+                    "dart_program_updated",
+                    { bubbles: true, detail: { patch: patch } }));
+              };
+          }
+        };
       }
     }
   }
diff --git a/pkg/browser/pubspec.yaml b/pkg/browser/pubspec.yaml
index 3bf88f1..af9396f 100644
--- a/pkg/browser/pubspec.yaml
+++ b/pkg/browser/pubspec.yaml
@@ -1,5 +1,5 @@
 name: browser
-version: 0.10.0+2
+version: 0.10.1
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: >
diff --git a/pkg/compiler/lib/src/apiimpl.dart b/pkg/compiler/lib/src/apiimpl.dart
index 6f9250d..ab20472 100644
--- a/pkg/compiler/lib/src/apiimpl.dart
+++ b/pkg/compiler/lib/src/apiimpl.dart
@@ -86,6 +86,8 @@
                 hasOption(options, '--enable-experimental-mirrors'),
             enableAsyncAwait: hasOption(options, '--enable-async'),
             enableEnums: hasOption(options, '--enable-enum'),
+            generateCodeWithCompileTimeErrors:
+                hasOption(options, '--generate-code-with-compile-time-errors'),
             allowNativeExtensions:
                 hasOption(options, '--allow-native-extensions')) {
     tasks.addAll([
@@ -208,24 +210,30 @@
     // [node] to be valid.
     elements.Element element = currentElement;
     void reportReadError(exception) {
-      withCurrentElement(element, () {
-        reportError(node,
-                    leg.MessageKind.READ_SCRIPT_ERROR,
-                    {'uri': readableUri, 'exception': exception});
-      });
+      if (element == null || node == null) {
+        reportError(
+            new leg.SourceSpan(readableUri, 0, 0),
+            leg.MessageKind.READ_SELF_ERROR,
+            {'uri': readableUri, 'exception': exception});
+      } else {
+        withCurrentElement(element, () {
+          reportError(
+              node,
+              leg.MessageKind.READ_SCRIPT_ERROR,
+              {'uri': readableUri, 'exception': exception});
+        });
+      }
     }
 
     Uri resourceUri = translateUri(node, readableUri);
-    String resourceUriString = resourceUri.toString();
+    String resourceUriString = '$resourceUri';
     if (resourceUri.scheme == 'dart-ext') {
       if (!allowNativeExtensions) {
         withCurrentElement(element, () {
           reportError(node, leg.MessageKind.DART_EXT_NOT_SUPPORTED);
         });
       }
-      return new Future.value(new leg.Script(readableUri, resourceUri,
-          new StringSourceFile(resourceUriString,
-              "// Synthetic source file generated for '$readableUri'.")));
+      return synthesizeScript(node, readableUri);
     }
 
     // TODO(johnniwinther): Wrap the result from [provider] in a specialized
@@ -249,10 +257,21 @@
       return new leg.Script(readableUri, resourceUri, sourceFile);
     }).catchError((error) {
       reportReadError(error);
-      return null;
+      return synthesizeScript(node, readableUri);
     });
   }
 
+  Future<leg.Script> synthesizeScript(leg.Spannable node, Uri readableUri) {
+    Uri resourceUri = translateUri(node, readableUri);
+    return new Future.value(
+        new leg.Script(
+            readableUri, resourceUri,
+            new StringSourceFile(
+                '$resourceUri',
+                "// Synthetic source file generated for '$readableUri'."),
+            isSynthesized: true));
+  }
+
   /**
    * Translates a readable URI into a resource URI.
    *
diff --git a/pkg/compiler/lib/src/closure.dart b/pkg/compiler/lib/src/closure.dart
index 46219a33..93e7bb2 100644
--- a/pkg/compiler/lib/src/closure.dart
+++ b/pkg/compiler/lib/src/closure.dart
@@ -731,6 +731,18 @@
     node.visitChildren(this);
   }
 
+  visitLiteralList(LiteralList node) {
+    DartType type = elements.getType(node);
+    analyzeType(type);
+    node.visitChildren(this);
+  }
+
+  visitLiteralMap(LiteralMap node) {
+    DartType type = elements.getType(node);
+    analyzeType(type);
+    node.visitChildren(this);
+  }
+
   void analyzeTypeVariables(DartType type) {
     type.forEachTypeVariable((TypeVariableType typeVariable) {
       // Field initializers are inlined and access the type variable as
diff --git a/pkg/compiler/lib/src/compile_time_constants.dart b/pkg/compiler/lib/src/compile_time_constants.dart
index 24bacbe..271ff8d 100644
--- a/pkg/compiler/lib/src/compile_time_constants.dart
+++ b/pkg/compiler/lib/src/compile_time_constants.dart
@@ -954,6 +954,7 @@
    * parameters (like [:this.x:]), also updates the [fieldValues] map.
    */
   void assignArgumentsToParameters(List<AstConstant> arguments) {
+    if (constructor.isErroneous) return;
     // Assign arguments to parameters.
     FunctionSignature signature = constructor.functionSignature;
     int index = 0;
@@ -1065,6 +1066,7 @@
    * native JavaScript constructor.
    */
   void evaluateConstructorFieldValues(List<AstConstant> arguments) {
+    if (constructor.isErroneous) return;
     compiler.withCurrentElement(constructor, () {
       assignArgumentsToParameters(arguments);
       evaluateConstructorInitializers();
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 1d31f07..6b15e9b 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -145,10 +145,6 @@
     world.registerSelectorUse(selector);
   }
 
-  void registerFactoryWithTypeArguments() {
-    world.registerFactoryWithTypeArguments(this);
-  }
-
   void registerConstSymbol(String name) {
     backend.registerConstSymbol(name, this);
   }
@@ -173,6 +169,10 @@
     world.registerStaticUse(element);
   }
 
+  void registerDirectInvocation(Element element) {
+    world.registerStaticUse(element);
+  }
+
   void registerInstantiation(InterfaceType type) {
     world.registerInstantiatedType(type, this);
   }
@@ -278,6 +278,8 @@
 
   List<CompilerTask> get tasks;
 
+  bool get canHandleCompilationFailed;
+
   void onResolutionComplete() {}
 
   ItemCompilationContext createItemCompilationContext() {
@@ -748,14 +750,14 @@
   /// If `true` native extension syntax is supported by the frontend.
   final bool allowNativeExtensions;
 
-  api.CompilerOutputProvider outputProvider;
+  /// Output provider from user of Compiler API.
+  api.CompilerOutputProvider userOutputProvider;
+
+  /// Generate output even when there are compile-time errors.
+  final bool generateCodeWithCompileTimeErrors;
 
   bool disableInlining = false;
 
-  /// True if compilation was aborted with a [CompilerCancelledException]. Only
-  /// set after Future retuned by [run] has completed.
-  bool compilerWasCancelled = false;
-
   List<Uri> librariesToAnalyzeWhenRun;
 
   Tracer tracer;
@@ -837,6 +839,9 @@
   Element boolEnvironment;
   Element stringEnvironment;
 
+  /// Tracks elements with compile-time errors.
+  final Set<Element> elementsWithCompileTimeErrors = new Set<Element>();
+
   fromEnvironment(String name) => null;
 
   Element get currentElement => _currentElement;
@@ -866,8 +871,6 @@
       }
       hasCrashed = true;
       rethrow;
-    } on CompilerCancelledException catch (ex) {
-      rethrow;
     } on StackOverflowError catch (ex) {
       // We cannot report anything useful in this case, because we
       // do not have enough stack space.
@@ -956,7 +959,16 @@
   static const int PHASE_COMPILING = 3;
   int phase;
 
-  bool compilationFailed = false;
+  bool compilationFailedInternal = false;
+
+  bool get compilationFailed => compilationFailedInternal;
+
+  void set compilationFailed(bool value) {
+    if (value) {
+      elementsWithCompileTimeErrors.add(currentElement);
+    }
+    compilationFailedInternal = value;
+  }
 
   bool hasCrashed = false;
 
@@ -996,6 +1008,7 @@
             this.enableAsyncAwait: false,
             this.enableEnums: false,
             this.allowNativeExtensions: false,
+            this.generateCodeWithCompileTimeErrors: false,
             api.CompilerOutputProvider outputProvider,
             List<String> strips: const []})
       : this.disableTypeInferenceFlag =
@@ -1006,7 +1019,7 @@
         this.analyzeAllFlag = analyzeAllFlag,
         this.hasIncrementalSupport = hasIncrementalSupport,
         cacheStrategy = new CacheStrategy(hasIncrementalSupport),
-        this.outputProvider = (outputProvider == null)
+        this.userOutputProvider = (outputProvider == null)
             ? NullSink.outputProvider
             : outputProvider {
     if (hasIncrementalSupport) {
@@ -1073,7 +1086,9 @@
 
   bool get compileAll => false;
 
-  bool get disableTypeInference => disableTypeInferenceFlag;
+  bool get disableTypeInference {
+    return disableTypeInferenceFlag || compilationFailed;
+  }
 
   int getNextFreeClassId() => nextFreeClassId++;
 
@@ -1162,12 +1177,6 @@
     totalCompileTime.start();
 
     return new Future.sync(() => runCompiler(uri)).catchError((error) {
-      if (error is CompilerCancelledException) {
-        compilerWasCancelled = true;
-        log('Error: $error');
-        return false;
-      }
-
       try {
         if (!hasCrashed) {
           hasCrashed = true;
@@ -1390,7 +1399,8 @@
     _coreTypes.iterableClass = lookupCoreClass('Iterable');
     _coreTypes.symbolClass = lookupCoreClass('Symbol');
     if (!missingCoreClasses.isEmpty) {
-      internalError(coreLibrary,
+      internalError(
+          coreLibrary,
           'dart:core library does not contain required classes: '
           '$missingCoreClasses');
     }
@@ -1449,11 +1459,7 @@
         });
       }
     }).then((_) {
-      if (!compilationFailed) {
-        // TODO(johnniwinther): Reenable analysis of programs with load failures
-        // when these are handled as erroneous libraries/compilation units.
-        compileLoadedLibraries();
-      }
+      compileLoadedLibraries();
     });
   }
 
@@ -1516,7 +1522,9 @@
         mainFunction = errorElement;
       }
     }
-    if (errorElement != null && errorElement.isSynthesized) {
+    if (errorElement != null &&
+        errorElement.isSynthesized &&
+        !mainApp.isSynthesized) {
       reportWarning(
           errorElement, errorElement.messageKind,
           errorElement.messageArguments);
@@ -1552,7 +1560,6 @@
     processQueue(enqueuer.resolution, mainFunction);
     enqueuer.resolution.logSummary(log);
 
-    if (compilationFailed) return;
     if (!showPackageWarnings && !suppressWarnings) {
       suppressedWarnings.forEach((Uri uri, SuppressionInfo info) {
         MessageKind kind = MessageKind.HIDDEN_WARNINGS_HINTS;
@@ -1569,10 +1576,18 @@
             api.Diagnostic.HINT);
       });
     }
+
+    // TODO(sigurdm): The dart backend should handle failed compilations.
+    if (compilationFailed && !backend.canHandleCompilationFailed) {
+      return;
+    }
+
     if (analyzeOnly) {
-      if (!analyzeAll) {
+      if (!analyzeAll && !compilationFailed) {
         // No point in reporting unused code when [analyzeAll] is true: all
         // code is artificially used.
+        // If compilation failed, it is possible that the error prevents the
+        // compiler from analyzing all the code.
         reportUnusedCode();
       }
       return;
@@ -1614,8 +1629,6 @@
     processQueue(enqueuer.codegen, mainFunction);
     enqueuer.codegen.logSummary(log);
 
-    if (compilationFailed) return;
-
     int programSize = backend.assembleProgram();
 
     if (dumpInfo) {
@@ -1679,8 +1692,7 @@
       withCurrentElement(work.element, () => work.run(this, world));
     });
     world.queueIsClosed = true;
-    if (compilationFailed) return;
-    assert(world.checkNoEnqueuedInvokedInstanceMethods());
+    assert(compilationFailed || world.checkNoEnqueuedInvokedInstanceMethods());
   }
 
   /**
@@ -1936,6 +1948,13 @@
     return null;
   }
 
+  /// Compatible with [readScript] and used by [LibraryLoader] to create
+  /// synthetic scripts to recover from read errors and bad URIs.
+  Future<Script> synthesizeScript(Spannable node, Uri readableUri) {
+    unimplemented(node, 'Compiler.synthesizeScript');
+    return null;
+  }
+
   Element lookupElementIn(ScopeContainerElement container, String name) {
     Element element = container.localLookup(name);
     if (element == null) {
@@ -2084,6 +2103,15 @@
     }
     backend.forgetElement(element);
   }
+
+  bool elementHasCompileTimeError(Element element) {
+    return elementsWithCompileTimeErrors.contains(element);
+  }
+
+  EventSink<String> outputProvider(String name, String extension) {
+    if (compilationFailed) return new NullSink('$name.$extension');
+    return userOutputProvider(name, extension);
+  }
 }
 
 class CompilerTask {
@@ -2129,21 +2157,6 @@
   }
 }
 
-/// Don't throw this error. It immediately aborts the compiler which causes the
-/// following problems:
-///
-/// 1. No further errors and warnings are reported.
-/// 2. Breaks incremental compilation.
-class CompilerCancelledException extends Error {
-  final String reason;
-  CompilerCancelledException(this.reason);
-
-  String toString() {
-    String banner = 'compiler cancelled';
-    return (reason != null) ? '$banner: $reason' : '$banner';
-  }
-}
-
 class SourceSpan implements Spannable {
   final Uri uri;
   final int begin;
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
index 4f42e9d..2de6fd1 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
@@ -14,8 +14,9 @@
 import '../scanner/scannerlib.dart' show Token, isUserDefinableOperator;
 import '../universe/universe.dart' show SelectorKind;
 import 'cps_ir_nodes.dart' as ir;
-import '../elements/modelx.dart' show SynthesizedConstructorElementX;
-import '../closure.dart';
+import '../elements/modelx.dart' show SynthesizedConstructorElementX,
+    ConstructorBodyElementX, FunctionSignatureX;
+import '../closure.dart' hide ClosureScope;
 import '../closure.dart' as closurelib;
 import '../js_backend/js_backend.dart' show JavaScriptBackend;
 
@@ -179,32 +180,8 @@
   }
 }
 
-/// Shared state between IrBuilders of nested functions.
-class IrBuilderClosureState {
-  /// Maps local variables to their corresponding [ClosureVariable] object.
-  final Map<Local, ir.ClosureVariable> local2closure =
-      <Local, ir.ClosureVariable>{};
-
-  /// Maps functions to the list of closure variables declared in that function.
-  final Map<ExecutableElement, List<ir.ClosureVariable>> function2closures =
-      <ExecutableElement, List<ir.ClosureVariable>>{};
-
-  /// Returns the closure variables declared in the given function.
-  List<ir.ClosureVariable> getClosureList(ExecutableElement element) {
-    return function2closures.putIfAbsent(element, () => <ir.ClosureVariable>[]);
-  }
-
-  /// Creates a closure variable for the given local.
-  void makeClosureVariable(Local local) {
-    ir.ClosureVariable variable =
-        new ir.ClosureVariable(local.executableContext, local);
-    local2closure[local] = variable;
-    getClosureList(local.executableContext).add(variable);
-  }
-}
-
 /// Shared state between delimited IrBuilders within the same function.
-class IrBuilderSharedState {
+class IrBuilderDelimitedState {
   final ConstantSystem constantSystem;
 
   /// A stack of collectors for breaks.
@@ -221,14 +198,7 @@
 
   final List<ir.Definition> functionParameters = <ir.Definition>[];
 
-  /// Maps boxed locals to their location. These locals are not part of
-  /// the environment.
-  final Map<Local, ClosureLocation> boxedVariables = {};
-
-  /// If non-null, this refers to the receiver (`this`) in the enclosing method.
-  ir.Primitive receiver;
-
-  IrBuilderSharedState(this.constantSystem, this.currentElement);
+  IrBuilderDelimitedState(this.constantSystem, this.currentElement);
 }
 
 /// A factory for building the cps IR.
@@ -240,36 +210,60 @@
 
   void declareLocalVariable(LocalVariableElement element,
                             {ir.Primitive initialValue});
-  void declareLocalFunction(LocalFunctionElement element, Object function);
-  ir.Primitive buildFunctionExpression(Object function);
   ir.Primitive buildLocalGet(LocalElement element);
   ir.Primitive buildLocalSet(LocalElement element, ir.Primitive value);
 
   /// Called when entering a nested function with free variables.
-  /// The free variables should subsequently be accessible using [buildLocalGet]
+  ///
+  /// The free variables must subsequently be accessible using [buildLocalGet]
   /// and [buildLocalSet].
-  void _buildClosureEnvironmentSetup(ClosureEnvironment env);
+  void _enterClosureEnvironment(ClosureEnvironment env);
 
-  /// Enter a scope that declares boxed variables. The boxed variables must
-  /// subsequently be accessible using [buildLocalGet], [buildLocalSet], etc.
-  void _buildClosureScopeSetup(ClosureScope scope);
+  /// Called when entering a function body or loop body.
+  ///
+  /// This is not called for for-loops, which instead use the methods
+  /// [_enterForLoopInitializer], [_enterForLoopBody], and [_enterForLoopUpdate]
+  /// due to their special scoping rules.
+  ///
+  /// The boxed variables declared in this scope must subsequently be available
+  /// using [buildLocalGet], [buildLocalSet], etc.
+  void _enterScope(ClosureScope scope);
+
+  /// Called before building the initializer of a for-loop.
+  ///
+  /// The loop variables will subsequently be declared using
+  /// [declareLocalVariable].
+  void _enterForLoopInitializer(ClosureScope scope,
+                                List<LocalElement> loopVariables);
+
+  /// Called before building the body of a for-loop.
+  void _enterForLoopBody(ClosureScope scope,
+                         List<LocalElement> loopVariables);
+
+  /// Called before building the update of a for-loop.
+  void _enterForLoopUpdate(ClosureScope scope,
+                           List<LocalElement> loopVariables);
 
   /// Add the given function parameter to the IR, and bind it in the environment
   /// or put it in its box, if necessary.
   void _createFunctionParameter(ParameterElement parameterElement);
 
-  /// Called before the update expression of a for-loop. A new box should be
-  /// created for [scope] and the values from the old box should be copied over.
-  void _migrateLoopVariables(ClosureScope scope);
+  /// Returns the list of closure variables declared in the given function or
+  /// field initializer.
+  List<ir.ClosureVariable> _getDeclaredClosureVariables(ExecutableElement elm);
+
+  /// Creates an access to the receiver from the current (or enclosing) method.
+  ///
+  /// If inside a closure class, [buildThis] will redirect access through
+  /// closure fields in order to access the receiver from the enclosing method.
+  ir.Primitive buildThis();
 
   // TODO(johnniwinther): Make these field final and remove the default values
   // when [IrBuilder] is a property of [IrBuilderVisitor] instead of a mixin.
 
   final List<ir.Parameter> _parameters = <ir.Parameter>[];
 
-  IrBuilderSharedState state;
-
-  IrBuilderClosureState closure;
+  IrBuilderDelimitedState state;
 
   /// A map from variable indexes to their values.
   ///
@@ -306,8 +300,7 @@
 
   /// Initialize a new top-level IR builder.
   void _init(ConstantSystem constantSystem, ExecutableElement currentElement) {
-    state = new IrBuilderSharedState(constantSystem, currentElement);
-    closure = new IrBuilderClosureState();
+    state = new IrBuilderDelimitedState(constantSystem, currentElement);
     environment = new Environment.empty();
   }
 
@@ -320,7 +313,6 @@
   IrBuilder makeDelimitedBuilder() {
     return _makeInstance()
         ..state = state
-        ..closure = closure
         ..environment = new Environment.from(environment);
   }
 
@@ -335,7 +327,6 @@
   IrBuilder makeRecursiveBuilder() {
     IrBuilder inner = _makeInstance()
         ..state = state
-        ..closure = closure
         ..environment = new Environment.empty();
     environment.index2variable.forEach(inner.createLocalParameter);
     return inner;
@@ -344,8 +335,7 @@
   /// Construct a builder for an inner function.
   IrBuilder makeInnerFunctionBuilder(ExecutableElement currentElement) {
     return _makeInstance()
-        ..state = new IrBuilderSharedState(state.constantSystem, currentElement)
-        ..closure = closure
+        ..state = new IrBuilderDelimitedState(state.constantSystem, currentElement)
         ..environment = new Environment.empty();
   }
 
@@ -353,15 +343,16 @@
 
 
   void buildFieldInitializerHeader({ClosureScope closureScope}) {
-    _buildClosureScopeSetup(closureScope);
+    _enterScope(closureScope);
   }
 
-  void buildFunctionHeader(Iterable<ParameterElement> parameters,
-                          {ClosureScope closureScope,
-                           ClosureEnvironment closureEnvironment}) {
-    _buildClosureEnvironmentSetup(closureEnvironment);
-    _buildClosureScopeSetup(closureScope);
+  List<ir.Primitive> buildFunctionHeader(Iterable<ParameterElement> parameters,
+                                        {ClosureScope closureScope,
+                                         ClosureEnvironment env}) {
+    _enterClosureEnvironment(env);
+    _enterScope(closureScope);
     parameters.forEach(_createFunctionParameter);
+    return _parameters;
   }
 
   /// Creates a parameter for [local] and adds it to the current environment.
@@ -409,11 +400,13 @@
         (k) => new ir.InvokeStatic(element, selector, k, arguments));
   }
 
-  ir.Primitive _buildInvokeSuper(Selector selector,
+  ir.Primitive _buildInvokeSuper(Element target,
+                                 Selector selector,
                                  List<ir.Primitive> arguments) {
     assert(isOpen);
     return _continueWithExpression(
-        (k) => new ir.InvokeSuperMethod(selector, k, arguments));
+        (k) => new ir.InvokeMethodDirectly(
+            buildThis(), target, selector, k, arguments));
   }
 
   ir.Primitive _buildInvokeDynamic(ir.Primitive receiver,
@@ -534,23 +527,23 @@
 
     // Build the term
     //   let cont join(x, ..., result) = [] in
-    //   let cont then() = [[thenPart]]; join(v, ...) in
-    //   let cont else() = [[elsePart]]; join(v, ...) in
+    //   let cont then() = [[thenPart]]; join(v, ...)
+    //        and else() = [[elsePart]]; join(v, ...)
+    //   in
     //     if condition (then, else)
     ir.Continuation thenContinuation = new ir.Continuation([]);
     ir.Continuation elseContinuation = new ir.Continuation([]);
     thenContinuation.body = thenBuilder._root;
     elseContinuation.body = elseBuilder._root;
     add(new ir.LetCont(joinContinuation,
-            new ir.LetCont(thenContinuation,
-                new ir.LetCont(elseContinuation,
-                    new ir.Branch(new ir.IsTrue(condition),
-                                  thenContinuation,
-                                  elseContinuation)))));
+            new ir.LetCont.many(<ir.Continuation>[thenContinuation,
+                                                  elseContinuation],
+                new ir.Branch(new ir.IsTrue(condition),
+                              thenContinuation,
+                              elseContinuation))));
     return (thenValue == elseValue)
         ? thenValue
         : joinContinuation.parameters.last;
-
   }
 
   /**
@@ -615,7 +608,8 @@
       ir.RunnableBody body = makeRunnableBody();
       return new ir.FunctionDefinition(
           element, state.functionParameters, body,
-          state.localConstants, defaults, closure.getClosureList(element));
+          state.localConstants, defaults,
+          _getDeclaredClosureVariables(element));
     }
   }
 
@@ -635,37 +629,29 @@
     return new ir.ConstructorDefinition(
         element, state.functionParameters, body, initializers,
         state.localConstants, defaults,
-        closure.getClosureList(element));
+        _getDeclaredClosureVariables(element));
   }
 
   /// Create a super invocation where the method name and the argument structure
   /// are defined by [selector] and the argument values are defined by
   /// [arguments].
-  ir.Primitive buildSuperInvocation(Selector selector,
-                                    List<ir.Primitive> arguments) {
-    return _buildInvokeSuper(selector, arguments);
-  }
-
-  /// Create a getter invocation on the super class where the getter name is
-  /// defined by [selector].
-  ir.Primitive buildSuperGet(Selector selector) {
-    assert(selector.isGetter);
-    return _buildInvokeSuper(selector, const <ir.Primitive>[]);
-  }
+  ir.Primitive buildSuperInvocation(Element target,
+                                    Selector selector,
+                                    List<ir.Primitive> arguments);
 
   /// Create a setter invocation on the super class where the setter name and
   /// argument are defined by [selector] and [value], respectively.
-  ir.Primitive buildSuperSet(Selector selector, ir.Primitive value) {
-    assert(selector.isSetter);
-    _buildInvokeSuper(selector, <ir.Primitive>[value]);
-    return value;
+  void buildSuperSet(Element target, Selector selector, ir.Primitive value) {
+    buildSuperInvocation(target, selector, [value]);
   }
 
   /// Create an index set invocation on the super class with the provided
   /// [index] and [value].
-  ir.Primitive buildSuperIndexSet(ir.Primitive index,
+  ir.Primitive buildSuperIndexSet(Element target,
+                                  ir.Primitive index,
                                   ir.Primitive value) {
-    _buildInvokeSuper(new Selector.indexSet(), <ir.Primitive>[index, value]);
+    _buildInvokeSuper(target, new Selector.indexSet(),
+        <ir.Primitive>[index, value]);
     return value;
   }
 
@@ -788,18 +774,25 @@
     buildElsePart(elseBuilder);
 
     // Build the term
-    // (Result =) let cont then() = [[thenPart]] in
-    //            let cont else() = [[elsePart]] in
+    // (Result =) let cont then() = [[thenPart]]
+    //                 and else() = [[elsePart]]
+    //            in
     //              if condition (then, else)
     ir.Continuation thenContinuation = new ir.Continuation([]);
     ir.Continuation elseContinuation = new ir.Continuation([]);
-    ir.Expression letElse =
-        new ir.LetCont(elseContinuation,
-          new ir.Branch(new ir.IsTrue(condition),
-                        thenContinuation,
-                        elseContinuation));
-    ir.Expression letThen = new ir.LetCont(thenContinuation, letElse);
-    ir.Expression result = letThen;
+    // If exactly one of the then and else continuation bodies is open (i.e.,
+    // the other one has an exit on all paths), then Continuation.plug expects
+    // that continuation to be listed first.  Arbitrarily use [then, else]
+    // order otherwise.
+    List<ir.Continuation> arms = !thenBuilder.isOpen && elseBuilder.isOpen
+        ? <ir.Continuation>[elseContinuation, thenContinuation]
+        : <ir.Continuation>[thenContinuation, elseContinuation];
+
+    ir.Expression result =
+        new ir.LetCont.many(arms,
+            new ir.Branch(new ir.IsTrue(condition),
+                          thenContinuation,
+                          elseContinuation));
 
     ir.Continuation joinContinuation;  // Null if there is no join.
     if (thenBuilder.isOpen && elseBuilder.isOpen) {
@@ -827,12 +820,10 @@
     if (joinContinuation == null) {
       // At least one subexpression is closed.
       if (thenBuilder.isOpen) {
-        _current =
-            (thenBuilder._root == null) ? letThen : thenBuilder._current;
+        if (thenBuilder._root != null) _current = thenBuilder._current;
         environment = thenBuilder.environment;
       } else if (elseBuilder.isOpen) {
-        _current =
-            (elseBuilder._root == null) ? letElse : elseBuilder._current;
+        if (elseBuilder._root != null) _current = elseBuilder._current;
         environment = elseBuilder.environment;
       } else {
         _current = null;
@@ -870,12 +861,16 @@
   /// The [closureScope] identifies variables that should be boxed in this loop.
   /// This includes variables declared inside the body of the loop as well as
   /// in the for-loop initializer.
+  ///
+  /// [loopVariables] is the list of variables declared in the for-loop
+  /// initializer.
   void buildFor({SubbuildFunction buildInitializer,
                  SubbuildFunction buildCondition,
                  SubbuildFunction buildBody,
                  SubbuildFunction buildUpdate,
                  JumpTarget target,
-                 ClosureScope closureScope}) {
+                 ClosureScope closureScope,
+                 List<LocalElement> loopVariables}) {
     assert(isOpen);
 
     // For loops use four named continuations: the entry to the condition,
@@ -900,19 +895,7 @@
     // invocation of the continue continuation (i.e., no continues in the
     // body), the continue continuation is inlined in the body.
 
-    // If the variables declared in the initializer must be boxed, we must
-    // create the box before entering the loop and renew the box at the end
-    // of the loop.
-    bool hasBoxedLoopVariables = closureScope != null &&
-                                 !closureScope.boxedLoopVariables.isEmpty;
-
-    // If a variable declared in the initializer must be boxed, we should
-    // create the box before initializing these variables.
-    // Otherwise, it is best to create the box inside the body so we don't have
-    // to create a box before the loop AND at the end of the loop.
-    if (hasBoxedLoopVariables) {
-      _buildClosureScopeSetup(closureScope);
-    }
+    _enterForLoopInitializer(closureScope, loopVariables);
 
     buildInitializer(this);
 
@@ -930,11 +913,7 @@
 
     IrBuilder bodyBuilder = condBuilder.makeDelimitedBuilder();
 
-    // If we did not yet create a box for the boxed variables, we must create it
-    // here. This saves us from
-    if (!hasBoxedLoopVariables) {
-      bodyBuilder._buildClosureScopeSetup(closureScope);
-    }
+    bodyBuilder._enterForLoopBody(closureScope, loopVariables);
 
     buildBody(bodyBuilder);
     assert(state.breakCollectors.last == breakCollector);
@@ -950,20 +929,20 @@
     IrBuilder updateBuilder = hasContinues
         ? condBuilder.makeRecursiveBuilder()
         : bodyBuilder;
-    if (hasBoxedLoopVariables) {
-      updateBuilder._migrateLoopVariables(closureScope);
-    }
+    updateBuilder._enterForLoopUpdate(closureScope, loopVariables);
     buildUpdate(updateBuilder);
 
     // Create body entry and loop exit continuations and a branch to them.
     ir.Continuation bodyContinuation = new ir.Continuation([]);
     ir.Continuation exitContinuation = new ir.Continuation([]);
+    // Note the order of continuations: the first one is the one that will
+    // be filled by LetCont.plug.
     ir.LetCont branch =
-        new ir.LetCont(exitContinuation,
-            new ir.LetCont(bodyContinuation,
-                new ir.Branch(new ir.IsTrue(condition),
-                              bodyContinuation,
-                              exitContinuation)));
+        new ir.LetCont.many(<ir.Continuation>[exitContinuation,
+                                              bodyContinuation],
+            new ir.Branch(new ir.IsTrue(condition),
+                          bodyContinuation,
+                          exitContinuation));
     // If there are breaks in the body, then there must be a join-point
     // continuation for the normal exit and the breaks.
     bool hasBreaks = !breakCollector.isEmpty;
@@ -996,7 +975,8 @@
     if (hasContinues) {
       continueContinuation.body = updateBuilder._root;
       bodyContinuation.body =
-          new ir.LetCont(continueContinuation, bodyBuilder._root);
+          new ir.LetCont(continueContinuation,
+              bodyBuilder._root);
     } else {
       bodyContinuation.body = bodyBuilder._root;
     }
@@ -1009,7 +989,8 @@
       _current = branch;
       environment = condBuilder.environment;
       breakCollector.addJump(this);
-      letJoin.continuation = createJoin(environment.length, breakCollector);
+      letJoin.continuations =
+          <ir.Continuation>[createJoin(environment.length, breakCollector)];
       _current = letJoin;
     } else {
       _current = condBuilder._current;
@@ -1078,7 +1059,7 @@
     state.continueCollectors.add(continueCollector);
 
     IrBuilder bodyBuilder = condBuilder.makeDelimitedBuilder();
-    bodyBuilder._buildClosureScopeSetup(closureScope);
+    bodyBuilder._enterScope(closureScope);
     if (buildVariableDeclaration != null) {
       buildVariableDeclaration(bodyBuilder);
     }
@@ -1107,12 +1088,14 @@
     // Create body entry and loop exit continuations and a branch to them.
     ir.Continuation bodyContinuation = new ir.Continuation([]);
     ir.Continuation exitContinuation = new ir.Continuation([]);
+    // Note the order of continuations: the first one is the one that will
+    // be filled by LetCont.plug.
     ir.LetCont branch =
-        new ir.LetCont(exitContinuation,
-            new ir.LetCont(bodyContinuation,
-                new ir.Branch(new ir.IsTrue(condition),
-                              bodyContinuation,
-                              exitContinuation)));
+        new ir.LetCont.many(<ir.Continuation>[exitContinuation,
+                                              bodyContinuation],
+            new ir.Branch(new ir.IsTrue(condition),
+                          bodyContinuation,
+                          exitContinuation));
     // If there are breaks in the body, then there must be a join-point
     // continuation for the normal exit and the breaks.
     bool hasBreaks = !breakCollector.isEmpty;
@@ -1139,7 +1122,8 @@
       _current = branch;
       environment = condBuilder.environment;
       breakCollector.addJump(this);
-      letJoin.continuation = createJoin(environment.length, breakCollector);
+      letJoin.continuations =
+          <ir.Continuation>[createJoin(environment.length, breakCollector)];
       _current = letJoin;
     } else {
       _current = condBuilder._current;
@@ -1183,7 +1167,7 @@
     state.continueCollectors.add(continueCollector);
 
     IrBuilder bodyBuilder = condBuilder.makeDelimitedBuilder();
-    bodyBuilder._buildClosureScopeSetup(closureScope);
+    bodyBuilder._enterScope(closureScope);
     buildBody(bodyBuilder);
     assert(state.breakCollectors.last == breakCollector);
     assert(state.continueCollectors.last == continueCollector);
@@ -1193,12 +1177,14 @@
     // Create body entry and loop exit continuations and a branch to them.
     ir.Continuation bodyContinuation = new ir.Continuation([]);
     ir.Continuation exitContinuation = new ir.Continuation([]);
+    // Note the order of continuations: the first one is the one that will
+    // be filled by LetCont.plug.
     ir.LetCont branch =
-        new ir.LetCont(exitContinuation,
-            new ir.LetCont(bodyContinuation,
-                new ir.Branch(new ir.IsTrue(condition),
-                              bodyContinuation,
-                              exitContinuation)));
+        new ir.LetCont.many(<ir.Continuation>[exitContinuation,
+                                              bodyContinuation],
+            new ir.Branch(new ir.IsTrue(condition),
+                          bodyContinuation,
+                          exitContinuation));
     // If there are breaks in the body, then there must be a join-point
     // continuation for the normal exit and the breaks.
     bool hasBreaks = !breakCollector.isEmpty;
@@ -1224,7 +1210,8 @@
       _current = branch;
       environment = condBuilder.environment;
       breakCollector.addJump(this);
-      letJoin.continuation = createJoin(environment.length, breakCollector);
+      letJoin.continuations =
+          <ir.Continuation>[createJoin(environment.length, breakCollector)];
       _current = letJoin;
     } else {
       _current = condBuilder._current;
@@ -1324,11 +1311,11 @@
         ..plug(new ir.InvokeContinuation(joinContinuation, [trueConstant]));
 
     add(new ir.LetCont(joinContinuation,
-          new ir.LetCont(thenContinuation,
-            new ir.LetCont(elseContinuation,
+          new ir.LetCont.many(<ir.Continuation>[thenContinuation,
+                                                elseContinuation],
               new ir.Branch(new ir.IsTrue(condition),
                             thenContinuation,
-                            elseContinuation)))));
+                            elseContinuation))));
     return resultParameter;
   }
 
@@ -1407,11 +1394,11 @@
     rightFalseContinuation.body = rightFalseBuilder._root;
     // The right subexpression has two continuations.
     rightBuilder.add(
-        new ir.LetCont(rightTrueContinuation,
-            new ir.LetCont(rightFalseContinuation,
-                new ir.Branch(new ir.IsTrue(rightValue),
-                              rightTrueContinuation,
-                              rightFalseContinuation))));
+        new ir.LetCont.many(<ir.Continuation>[rightTrueContinuation,
+                                              rightFalseContinuation],
+            new ir.Branch(new ir.IsTrue(rightValue),
+                          rightTrueContinuation,
+                          rightFalseContinuation)));
     // Depending on the operator, the left subexpression's continuations are
     // either the right subexpression or an invocation of the join-point
     // continuation.
@@ -1424,27 +1411,16 @@
     }
 
     add(new ir.LetCont(joinContinuation,
-            new ir.LetCont(leftTrueContinuation,
-                new ir.LetCont(leftFalseContinuation,
-                    new ir.Branch(new ir.IsTrue(leftValue),
-                                  leftTrueContinuation,
-                                  leftFalseContinuation)))));
+            new ir.LetCont.many(<ir.Continuation>[leftTrueContinuation,
+                                                  leftFalseContinuation],
+                new ir.Branch(new ir.IsTrue(leftValue),
+                              leftTrueContinuation,
+                              leftFalseContinuation))));
     // There is always a join parameter for the result value, because it
     // is different on at least two paths.
     return joinContinuation.parameters.last;
   }
 
-  /// Creates an access to the receiver from the current (or enclosing) method.
-  ///
-  /// If inside a closure class, [buildThis] will redirect access through
-  /// closure fields in order to access the receiver from the enclosing method.
-  ir.Primitive buildThis() {
-    if (state.receiver != null) return state.receiver;
-    ir.Primitive thisPrim = new ir.This();
-    add(new ir.LetPrim(thisPrim));
-    return thisPrim;
-  }
-
   /// Create a non-recursive join-point continuation.
   ///
   /// Given the environment length at the join point and a list of
@@ -1551,6 +1527,39 @@
   }
 }
 
+/// Shared state between DartIrBuilders within the same method.
+class DartIrBuilderSharedState {
+  /// Maps local variables to their corresponding [ClosureVariable] object.
+  final Map<Local, ir.ClosureVariable> local2closure =
+      <Local, ir.ClosureVariable>{};
+
+  /// Maps functions to the list of closure variables declared in that function.
+  final Map<ExecutableElement, List<ir.ClosureVariable>> function2closures =
+      <ExecutableElement, List<ir.ClosureVariable>>{};
+
+  final DartCapturedVariableInfo closureVariables;
+
+  /// Returns the closure variables declared in the given function.
+  List<ir.ClosureVariable> getClosureList(ExecutableElement element) {
+    return function2closures.putIfAbsent(element, () => <ir.ClosureVariable>[]);
+  }
+
+  /// Creates a closure variable for the given local.
+  void makeClosureVariable(Local local) {
+    ir.ClosureVariable variable =
+        new ir.ClosureVariable(local.executableContext, local);
+    local2closure[local] = variable;
+    getClosureList(local.executableContext).add(variable);
+  }
+
+  /// Closure variables that should temporarily be treated as registers.
+  final Set<Local> registerizedClosureVariables = new Set<Local>();
+
+  DartIrBuilderSharedState(this.closureVariables) {
+    closureVariables.capturedVariables.forEach(makeClosureVariable);
+  }
+}
+
 /// Dart-specific subclass of [IrBuilder].
 ///
 /// Inner functions are represented by a [FunctionDefinition] with the
@@ -1559,38 +1568,80 @@
 /// Captured variables are translated to ref cells (see [ClosureVariable])
 /// using [GetClosureVariable] and [SetClosureVariable].
 class DartIrBuilder extends IrBuilder {
-  ClosureVariableInfo closureVariables;
+  final DartIrBuilderSharedState dartState;
 
-  IrBuilder _makeInstance() => new DartIrBuilder._blank(closureVariables);
-  DartIrBuilder._blank(this.closureVariables);
+  IrBuilder _makeInstance() => new DartIrBuilder._blank(dartState);
+  DartIrBuilder._blank(this.dartState);
 
   DartIrBuilder(ConstantSystem constantSystem,
                 ExecutableElement currentElement,
-                this.closureVariables) {
+                DartCapturedVariableInfo  closureVariables)
+      : dartState = new DartIrBuilderSharedState(closureVariables) {
     _init(constantSystem, currentElement);
-    closureVariables.capturedVariables.forEach(closure.makeClosureVariable);
   }
 
-  /// True if [local] is stored in a [ClosureVariable].
+  /// True if [local] should currently be accessed from a [ClosureVariable].
   bool isInClosureVariable(Local local) {
-    return closure.local2closure.containsKey(local);
+    return dartState.local2closure.containsKey(local) &&
+           !dartState.registerizedClosureVariables.contains(local);
   }
 
   /// Gets the [ClosureVariable] containing the value of [local].
   ir.ClosureVariable getClosureVariable(Local local) {
-    return closure.local2closure[local];
+    return dartState.local2closure[local];
   }
 
-  void _buildClosureScopeSetup(ClosureScope scope) {
+  void _enterScope(ClosureScope scope) {
     assert(scope == null);
   }
 
-  void _buildClosureEnvironmentSetup(ClosureEnvironment env) {
+  void _enterClosureEnvironment(ClosureEnvironment env) {
     assert(env == null);
   }
 
-  void _migrateLoopVariables(ClosureScope scope) {
+  void _enterForLoopInitializer(ClosureScope scope,
+                                List<LocalElement> loopVariables) {
     assert(scope == null);
+    for (LocalElement loopVariable in loopVariables) {
+      if (dartState.local2closure.containsKey(loopVariable)) {
+        // Temporarily keep the loop variable in a primitive.
+        // The loop variable will be added to environment when
+        // [declareLocalVariable] is called.
+        dartState.registerizedClosureVariables.add(loopVariable);
+      }
+    }
+  }
+
+  void _enterForLoopBody(ClosureScope scope,
+                         List<LocalElement> loopVariables) {
+    assert(scope == null);
+    for (LocalElement loopVariable in loopVariables) {
+      if (dartState.local2closure.containsKey(loopVariable)) {
+        // Move from primitive into ClosureVariable.
+        dartState.registerizedClosureVariables.remove(loopVariable);
+        add(new ir.SetClosureVariable(getClosureVariable(loopVariable),
+                                      environment.lookup(loopVariable),
+                                      isDeclaration: true));
+      }
+    }
+  }
+
+  void _enterForLoopUpdate(ClosureScope scope,
+                           List<LocalElement> loopVariables) {
+    assert(scope == null);
+    // Move captured loop variables back into the local environment.
+    // The update expression will use the values we put in the environment,
+    // and then the environments for the initializer and update will be
+    // joined at the head of the body.
+    for (LocalElement loopVariable in loopVariables) {
+      if (isInClosureVariable(loopVariable)) {
+        ir.ClosureVariable closureVariable = getClosureVariable(loopVariable);
+        ir.Primitive get = new ir.GetClosureVariable(closureVariable);
+        add(new ir.LetPrim(get));
+        environment.update(loopVariable, get);
+        dartState.registerizedClosureVariables.add(loopVariable);
+      }
+    }
   }
 
   void _createFunctionParameter(ParameterElement parameterElement) {
@@ -1646,8 +1697,10 @@
   ir.Primitive buildLocalGet(LocalElement local) {
     assert(isOpen);
     if (isInClosureVariable(local)) {
-      ir.Primitive result = new ir.GetClosureVariable(getClosureVariable(local));
-      result.useElementAsHint(local);
+      // Do not use [local] as a hint on [result]. The variable should always
+      // be inlined, but the hint prevents it.
+      ir.Primitive result =
+          new ir.GetClosureVariable(getClosureVariable(local));
       add(new ir.LetPrim(result));
       return result;
     } else {
@@ -1667,7 +1720,35 @@
     return value;
   }
 
+  List<ir.ClosureVariable> _getDeclaredClosureVariables(
+      ExecutableElement element) {
+    return dartState.getClosureList(element);
+  }
 
+  ir.Primitive buildThis() {
+    ir.Primitive thisPrim = new ir.This();
+    add(new ir.LetPrim(thisPrim));
+    return thisPrim;
+  }
+
+  ir.Primitive buildSuperInvocation(Element target,
+                                    Selector selector,
+                                    List<ir.Primitive> arguments) {
+    return _buildInvokeSuper(target, selector, arguments);
+  }
+
+}
+
+/// State shared between JsIrBuilders within the same function.
+///
+/// Note that this is not shared between builders of nested functions.
+class JsIrBuilderSharedState {
+  /// Maps boxed locals to their location. These locals are not part of
+  /// the environment.
+  final Map<Local, ClosureLocation> boxedVariables = {};
+
+  /// If non-null, this refers to the receiver (`this`) in the enclosing method.
+  ir.Primitive receiver;
 }
 
 /// JS-specific subclass of [IrBuilder].
@@ -1675,14 +1756,17 @@
 /// Inner functions are represented by a [ClosureClassElement], and captured
 /// variables are boxed as necessary using [CreateBox], [GetField], [SetField].
 class JsIrBuilder extends IrBuilder {
-  IrBuilder _makeInstance() => new JsIrBuilder._blank();
-  JsIrBuilder._blank();
+  final JsIrBuilderSharedState jsState;
 
-  JsIrBuilder(ConstantSystem constantSystem, ExecutableElement currentElement) {
+  IrBuilder _makeInstance() => new JsIrBuilder._blank(jsState);
+  JsIrBuilder._blank(this.jsState);
+
+  JsIrBuilder(ConstantSystem constantSystem, ExecutableElement currentElement)
+      : jsState = new JsIrBuilderSharedState() {
     _init(constantSystem, currentElement);
   }
 
-  void _buildClosureEnvironmentSetup(ClosureEnvironment env) {
+  void _enterClosureEnvironment(ClosureEnvironment env) {
     if (env == null) return;
 
     // Obtain a reference to the function object (this).
@@ -1693,7 +1777,7 @@
     env.freeVariables.forEach((Local local, ClosureLocation location) {
       if (location.isBox) {
         // Boxed variables are loaded from their box on-demand.
-        state.boxedVariables[local] = location;
+        jsState.boxedVariables[local] = location;
       } else {
         // Unboxed variables are loaded from the function object immediately.
         // This includes BoxLocals which are themselves unboxed variables.
@@ -1706,7 +1790,7 @@
     // If the function captures a reference to the receiver from the
     // enclosing method, remember which primitive refers to the receiver object.
     if (env.thisLocal != null && env.freeVariables.containsKey(env.thisLocal)) {
-      state.receiver = environment.lookup(env.thisLocal);
+      jsState.receiver = environment.lookup(env.thisLocal);
     }
 
     // If the function has a self-reference, use the value of `this`.
@@ -1715,16 +1799,16 @@
     }
   }
 
-  void _buildClosureScopeSetup(ClosureScope scope) {
+  void _enterScope(ClosureScope scope) {
     if (scope == null) return;
     ir.CreateBox boxPrim = new ir.CreateBox();
     add(new ir.LetPrim(boxPrim));
     environment.extend(scope.box, boxPrim);
     boxPrim.useElementAsHint(scope.box);
     scope.capturedVariables.forEach((Local local, ClosureLocation location) {
-      assert(!state.boxedVariables.containsKey(local));
+      assert(!jsState.boxedVariables.containsKey(local));
       if (location.isBox) {
-        state.boxedVariables[local] = location;
+        jsState.boxedVariables[local] = location;
       }
     });
   }
@@ -1733,7 +1817,7 @@
     ir.Parameter parameter = new ir.Parameter(parameterElement);
     _parameters.add(parameter);
     state.functionParameters.add(parameter);
-    ClosureLocation location = state.boxedVariables[parameterElement];
+    ClosureLocation location = jsState.boxedVariables[parameterElement];
     if (location != null) {
       add(new ir.SetField(environment.lookup(location.box),
                           location.field,
@@ -1749,7 +1833,7 @@
     if (initialValue == null) {
       initialValue = buildNullLiteral();
     }
-    ClosureLocation location = state.boxedVariables[variableElement];
+    ClosureLocation location = jsState.boxedVariables[variableElement];
     if (location != null) {
       add(new ir.SetField(environment.lookup(location.box),
                           location.field,
@@ -1772,7 +1856,7 @@
     for (ClosureFieldElement field in classElement.closureFields) {
       arguments.add(environment.lookup(field.local));
     }
-    ir.Primitive closure = new ir.CreateClosureClass(classElement, arguments);
+    ir.Primitive closure = new ir.CreateInstance(classElement, arguments);
     add(new ir.LetPrim(closure));
     return closure;
   }
@@ -1780,7 +1864,7 @@
   /// Create a read access of [local].
   ir.Primitive buildLocalGet(LocalElement local) {
     assert(isOpen);
-    ClosureLocation location = state.boxedVariables[local];
+    ClosureLocation location = jsState.boxedVariables[local];
     if (location != null) {
       ir.Primitive result = new ir.GetField(environment.lookup(location.box),
                                             location.field);
@@ -1795,7 +1879,7 @@
   /// Create a write access to [local] with the provided [value].
   ir.Primitive buildLocalSet(LocalElement local, ir.Primitive value) {
     assert(isOpen);
-    ClosureLocation location = state.boxedVariables[local];
+    ClosureLocation location = jsState.boxedVariables[local];
     if (location != null) {
       add(new ir.SetField(environment.lookup(location.box),
                           location.field,
@@ -1807,8 +1891,30 @@
     return value;
   }
 
-  void _migrateLoopVariables(ClosureScope scope) {
+  void _enterForLoopInitializer(ClosureScope scope,
+                                List<LocalElement> loopVariables) {
     if (scope == null) return;
+    // If there are no boxed loop variables, don't create the box here, let
+    // it be created inside the body instead.
+    if (scope.boxedLoopVariables.isEmpty) return;
+    _enterScope(scope);
+  }
+
+  void _enterForLoopBody(ClosureScope scope,
+                         List<LocalElement> loopVariables) {
+    if (scope == null) return;
+    // If there are boxed loop variables, the box has already been created
+    // at the initializer.
+    if (!scope.boxedLoopVariables.isEmpty) return;
+    _enterScope(scope);
+  }
+
+  void _enterForLoopUpdate(ClosureScope scope,
+                           List<LocalElement> loopVariables) {
+    if (scope == null) return;
+    // If there are no boxed loop variables, then the box is created inside the
+    // body, so there is no need to explicitly renew it.
+    if (scope.boxedLoopVariables.isEmpty) return;
     ir.Primitive box = environment.lookup(scope.box);
     ir.Primitive newBox = new ir.CreateBox();
     newBox.useElementAsHint(scope.box);
@@ -1822,6 +1928,67 @@
     environment.update(scope.box, newBox);
   }
 
+  List<ir.ClosureVariable> _getDeclaredClosureVariables(
+      ExecutableElement element) {
+    return <ir.ClosureVariable>[];
+  }
+
+  ir.Primitive buildThis() {
+    if (jsState.receiver != null) return jsState.receiver;
+    ir.Primitive thisPrim = new ir.This();
+    add(new ir.LetPrim(thisPrim));
+    return thisPrim;
+  }
+
+  ir.Primitive buildSuperInvocation(Element target,
+                                    Selector selector,
+                                    List<ir.Primitive> arguments) {
+    // Direct calls to FieldElements are currently problematic because the
+    // backend will not issue a getter for the field unless it finds a dynamic
+    // access that matches its getter.
+    // As a workaround, we generate GetField for this case, although ideally
+    // this should be the result of inlining the field's getter.
+    if (target is FieldElement) {
+      if (selector.isGetter) {
+        ir.Primitive get = new ir.GetField(buildThis(), target);
+        add(new ir.LetPrim(get));
+        return get;
+      } else {
+        assert(selector.isSetter);
+        add(new ir.SetField(buildThis(), target, arguments.single));
+        return arguments.single;
+      }
+    } else {
+      return _buildInvokeSuper(target, selector, arguments);
+    }
+  }
+
+  ir.Primitive buildInvokeDirectly(FunctionElement target,
+                                   ir.Primitive receiver,
+                                   List<ir.Primitive> arguments) {
+    assert(isOpen);
+    Selector selector =
+        new Selector.call(target.name, target.library, arguments.length);
+    return _continueWithExpression(
+        (k) => new ir.InvokeMethodDirectly(
+            receiver, target, selector, k, arguments));
+  }
+
+  /// Loads parameters to a constructor body into the environment.
+  ///
+  /// The header for a constructor body differs from other functions in that
+  /// some parameters are already boxed, and the box is passed as an argument
+  /// instead of being created in the header.
+  void buildConstructorBodyHeader(Iterable<Local> parameters,
+                                  ClosureScope closureScope) {
+    for (Local param in parameters) {
+      ir.Parameter parameter = createLocalParameter(param);
+      state.functionParameters.add(parameter);
+    }
+    if (closureScope != null) {
+      jsState.boxedVariables.addAll(closureScope.capturedVariables);
+    }
+  }
 }
 
 
@@ -1877,9 +2044,10 @@
   ClosureEnvironment(this.selfReference, this.thisLocal, this.freeVariables);
 }
 
-/// Information about which variables are captured in a closure.
+/// Information about which variables are captured by a nested function.
+///
 /// This is used by the [DartIrBuilder] instead of [ClosureScope] and
 /// [ClosureEnvironment].
-abstract class ClosureVariableInfo {
+abstract class DartCapturedVariableInfo {
   Iterable<Local> get capturedVariables;
 }
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_visitor.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_visitor.dart
index 25a9ff9..ec796da 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_visitor.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_visitor.dart
@@ -42,7 +42,9 @@
     return compiler.withCurrentElement(element, () {
       SourceFile sourceFile = elementSourceFile(element);
       IrBuilderVisitor builder =
-          new IrBuilderVisitor(elementsMapping, compiler, sourceFile);
+          compiler.backend is JavaScriptBackend
+          ? new JsIrBuilderVisitor(elementsMapping, compiler, sourceFile)
+          : new DartIrBuilderVisitor(elementsMapping, compiler, sourceFile);
       return builder.buildExecutable(element);
     });
   }
@@ -82,13 +84,14 @@
     return result;
   }
 
-  SourceFile elementSourceFile(Element element) {
-    if (element is FunctionElement) {
-      FunctionElement functionElement = element;
-      if (functionElement.patch != null) element = functionElement.patch;
-    }
-    return element.compilationUnit.script.file;
+}
+
+SourceFile elementSourceFile(Element element) {
+  if (element is FunctionElement) {
+    FunctionElement functionElement = element;
+    if (functionElement.patch != null) element = functionElement.patch;
   }
+  return element.compilationUnit.script.file;
 }
 
 class _GetterElements {
@@ -104,11 +107,10 @@
  * to the [builder] and return the last added statement for trees that represent
  * an expression.
  */
-class IrBuilderVisitor extends ResolvedVisitor<ir.Primitive>
+abstract class IrBuilderVisitor extends ResolvedVisitor<ir.Primitive>
     with IrBuilderMixin<ast.Node> {
   final Compiler compiler;
   final SourceFile sourceFile;
-  ClosureClassMap closureMap;
 
   // In SSA terms, join-point continuation parameters are the phis and the
   // continuation invocation arguments are the corresponding phi inputs.  To
@@ -132,119 +134,17 @@
   IrBuilderVisitor(TreeElements elements, this.compiler, this.sourceFile)
       : super(elements);
 
-  /// True if using the JavaScript backend; we use this to determine how
-  /// closures should be translated.
-  bool get isJavaScriptBackend => compiler.backend is JavaScriptBackend;
-
   /**
    * Builds the [ir.ExecutableDefinition] for an executable element. In case the
    * function uses features that cannot be expressed in the IR, this element
    * returns `null`.
    */
-  ir.ExecutableDefinition buildExecutable(ExecutableElement element) {
-    return nullIfGiveup(() {
-      if (element is FieldElement) {
-        return buildField(element);
-      } else if (element is FunctionElement) {
-        return buildFunction(element);
-      } else {
-        compiler.internalError(element, "Unexpected element type $element");
-      }
-    });
-  }
+  ir.ExecutableDefinition buildExecutable(ExecutableElement element);
 
-  Map mapValues(Map map, dynamic fn(dynamic)) {
-    Map result = {};
-    map.forEach((key,value) {
-      result[key] = fn(value);
-    });
-    return result;
-  }
+  ClosureScope getClosureScopeForNode(ast.Node node);
+  ClosureEnvironment getClosureEnvironment();
 
-  // Converts closure.dart's CapturedVariable into a ClosureLocation.
-  // There is a 1:1 corresponce between these; we do this because the IR builder
-  // should not depend on synthetic elements.
-  ClosureLocation getLocation(CapturedVariable v) {
-    if (v is BoxFieldElement) {
-      return new ClosureLocation(v.box, v);
-    } else {
-      ClosureFieldElement field = v;
-      return new ClosureLocation(null, field);
-    }
-  }
 
-  /// If the current function is a nested function with free variables (or a
-  /// captured reference to `this`), this returns a [ClosureEnvironment]
-  /// indicating how to access these.
-  ClosureEnvironment getClosureEnvironment() {
-    if (closureMap == null) return null; // dart2dart does not use closureMap.
-    if (closureMap.closureElement == null) return null;
-    return new ClosureEnvironment(
-        closureMap.closureElement,
-        closureMap.thisLocal,
-        mapValues(closureMap.freeVariableMap, getLocation));
-  }
-
-  /// If [node] has declarations for variables that should be boxed, this
-  /// returns a [ClosureScope] naming a box to create, and enumerating the
-  /// variables that should be stored in the box.
-  ///
-  /// Also see [ClosureScope].
-  ClosureScope getClosureScope(ast.Node node) {
-    if (closureMap == null) return null; // dart2dart does not use closureMap.
-    closurelib.ClosureScope scope = closureMap.capturingScopes[node];
-    if (scope == null) return null;
-    // We translate a ClosureScope from closure.dart into IR builder's variant
-    // because the IR builder should not depend on the synthetic elements
-    // created in closure.dart.
-    return new ClosureScope(scope.boxElement,
-                            mapValues(scope.capturedVariables, getLocation),
-                            scope.boxedLoopVariables);
-  }
-
-  IrBuilder makeIRBuilder(ast.Node node, ExecutableElement element) {
-    if (isJavaScriptBackend) {
-      closureMap = compiler.closureToClassMapper.computeClosureToClassMapping(
-          element,
-          node,
-          elements);
-      return new JsIrBuilder(compiler.backend.constantSystem, element);
-    } else {
-      DetectClosureVariables closures = new DetectClosureVariables(elements);
-      if (!element.isSynthesized) {
-        closures.visit(node);
-      }
-      return new DartIrBuilder(compiler.backend.constantSystem,
-                               element,
-                               closures);
-    }
-  }
-
-  /// Returns a [ir.FieldDefinition] describing the initializer of [element].
-  ir.FieldDefinition buildField(FieldElement element) {
-    assert(invariant(element, element.isImplementation));
-    ast.VariableDefinitions definitions = element.node;
-    ast.Node fieldDefinition =
-        definitions.definitions.nodes.first;
-    if (definitions.modifiers.isConst) {
-      // TODO(sigurdm): Just return const value.
-    }
-    assert(fieldDefinition != null);
-    assert(elements[fieldDefinition] != null);
-
-    IrBuilder builder = makeIRBuilder(fieldDefinition, element);
-
-    return withBuilder(builder, () {
-      builder.buildFieldInitializerHeader(
-          closureScope: getClosureScope(fieldDefinition));
-      ir.Primitive initializer;
-      if (fieldDefinition is ast.SendSet) {
-        ast.SendSet sendSet = fieldDefinition;
-        initializer = visit(sendSet.arguments.first);
-      }
-      return builder.makeFieldDefinition(initializer);
-    });
-  }
 
   ir.FunctionDefinition _makeFunctionBody(FunctionElement element,
                                           ast.FunctionExpression node) {
@@ -253,8 +153,8 @@
     signature.orderedForEachParameter(parameters.add);
 
     irBuilder.buildFunctionHeader(parameters,
-                                  closureScope: getClosureScope(node),
-                                  closureEnvironment: getClosureEnvironment());
+                                  closureScope: getClosureScopeForNode(node),
+                                  env: getClosureEnvironment());
 
     List<ConstantExpression> defaults = new List<ConstantExpression>();
     signature.orderedOptionalParameters.forEach((ParameterElement element) {
@@ -352,28 +252,6 @@
     return result;
   }
 
-  ir.FunctionDefinition buildFunction(FunctionElement element) {
-    assert(invariant(element, element.isImplementation));
-    ast.FunctionExpression node = element.node;
-
-    Iterable<Entity> usedFromClosure;
-    if (!element.isSynthesized) {
-      assert(node != null);
-      assert(elements[node] != null);
-    } else {
-      SynthesizedConstructorElementX constructor = element;
-      if (!constructor.isDefaultConstructor) {
-        giveup(null, 'cannot handle synthetic forwarding constructors');
-      }
-
-      usedFromClosure = <Entity>[];
-    }
-
-    IrBuilder builder = makeIRBuilder(node, element);
-
-    return withBuilder(builder, () => _makeFunctionBody(element, node));
-  }
-
   ir.Primitive visit(ast.Node node) => node.accept(this);
 
   // ==== Statements ====
@@ -410,15 +288,12 @@
   }
 
   visitFor(ast.For node) {
-    // TODO(asgerf): Handle closure variables declared in a for-loop.
-    if (!isJavaScriptBackend && node.initializer is ast.VariableDefinitions) {
+    List<LocalElement> loopVariables = <LocalElement>[];
+    if (node.initializer is ast.VariableDefinitions) {
       ast.VariableDefinitions definitions = node.initializer;
-      for (ast.Node definition in definitions.definitions.nodes) {
-        LocalElement element = elements[definition];
-        DartIrBuilder dartIrBuilder = irBuilder;
-        if (dartIrBuilder.isInClosureVariable(element)) {
-          return giveup(definition, 'Closure variable in for loop initializer');
-        }
+      for (ast.Node node in definitions.definitions.nodes) {
+        LocalElement loopVariable = elements[node];
+        loopVariables.add(loopVariable);
       }
     }
 
@@ -428,7 +303,8 @@
         buildCondition: subbuild(node.condition),
         buildBody: subbuild(node.body),
         buildUpdate: subbuildSequence(node.update),
-        closureScope: getClosureScope(node),
+        closureScope: getClosureScopeForNode(node),
+        loopVariables: loopVariables,
         target: target);
   }
 
@@ -468,7 +344,8 @@
       });
       joinContinuation = new ir.Continuation(parameters);
       irBuilder.invokeFullJoin(joinContinuation, jumps, recursive: false);
-      irBuilder.add(new ir.LetCont(joinContinuation, innerBuilder._root));
+      irBuilder.add(new ir.LetCont(joinContinuation,
+          innerBuilder._root));
       for (int i = 0; i < irBuilder.environment.length; ++i) {
         irBuilder.environment.index2value[i] = parameters[i];
       }
@@ -487,7 +364,7 @@
         buildCondition: subbuild(node.condition),
         buildBody: subbuild(node.body),
         target: elements.getTargetDefinition(node),
-        closureScope: getClosureScope(node));
+        closureScope: getClosureScopeForNode(node));
   }
 
   visitForIn(ast.ForIn node) {
@@ -507,7 +384,7 @@
         variableSelector: selector,
         buildBody: subbuild(node.body),
         target: elements.getTargetDefinition(node),
-        closureScope: getClosureScope(node));
+        closureScope: getClosureScopeForNode(node));
   }
 
   ir.Primitive visitVariableDefinitions(ast.VariableDefinitions node) {
@@ -747,7 +624,7 @@
       assert(selector.kind == SelectorKind.GETTER ||
              selector.kind == SelectorKind.INDEX);
       if (isSuperCall(node)) {
-        result = irBuilder.buildSuperInvocation(selector, arguments);
+        result = irBuilder.buildSuperInvocation(element, selector, arguments);
       } else {
         result =
             irBuilder.buildDynamicInvocation(receiver, selector, arguments);
@@ -848,11 +725,12 @@
       return visitGetterSend(node);
     } else {
       Selector selector = elements.getSelector(node);
+      Element target = elements[node];
       List<ir.Primitive> arguments = new List<ir.Primitive>();
       for (ast.Node n in node.arguments) {
         arguments.add(visit(n));
       }
-      return irBuilder.buildSuperInvocation(selector, arguments);
+      return irBuilder.buildSuperInvocation(target, selector, arguments);
     }
   }
 
@@ -944,7 +822,7 @@
 
     if (Elements.isLocal(element)) {
       irBuilder.buildLocalSet(element, valueToStore);
-    } else if ((!node.isSuperCall && Elements.isErroneousElement(element)) ||
+    } else if ((!node.isSuperCall && Elements.isErroneous(element)) ||
                 Elements.isStaticOrTopLevel(element)) {
       irBuilder.buildStaticSet(
           element, elements.getSelector(node), valueToStore);
@@ -955,13 +833,13 @@
           selector.kind == SelectorKind.INDEX);
       if (selector.isIndexSet) {
         if (isSuperCall(node)) {
-          irBuilder.buildSuperIndexSet(index, valueToStore);
+          irBuilder.buildSuperIndexSet(element, index, valueToStore);
         } else {
           irBuilder.buildDynamicIndexSet(receiver, index, valueToStore);
         }
       } else {
         if (isSuperCall(node)) {
-          irBuilder.buildSuperSet(selector, valueToStore);
+          irBuilder.buildSuperSet(element, selector, valueToStore);
         } else {
           irBuilder.buildDynamicSet(receiver, selector, valueToStore);
         }
@@ -1018,39 +896,6 @@
     return irBuilder.buildConstantLiteral(constant);
   }
 
-  /// Returns the backend-specific representation of an inner function.
-  Object makeSubFunction(ast.FunctionExpression node) {
-    if (isJavaScriptBackend) {
-      ClosureClassMap innerMap =
-          compiler.closureToClassMapper.getMappingForNestedFunction(node);
-      ClosureClassElement closureClass = innerMap.closureClassElement;
-      return closureClass;
-    } else {
-      FunctionElement element = elements[node];
-      assert(invariant(element, element.isImplementation));
-
-      IrBuilder builder = irBuilder.makeInnerFunctionBuilder(element);
-
-      return withBuilder(builder, () => _makeFunctionBody(element, node));
-    }
-  }
-
-  ir.Primitive visitFunctionExpression(ast.FunctionExpression node) {
-    return irBuilder.buildFunctionExpression(makeSubFunction(node));
-  }
-
-  visitFunctionDeclaration(ast.FunctionDeclaration node) {
-    LocalFunctionElement element = elements[node.function];
-    Object inner = makeSubFunction(node.function);
-    irBuilder.declareLocalFunction(element, inner);
-  }
-
-  static final String ABORT_IRNODE_BUILDER = "IrNode builder aborted";
-
-  dynamic giveup(ast.Node node, [String reason]) {
-    throw ABORT_IRNODE_BUILDER;
-  }
-
   ir.ExecutableDefinition nullIfGiveup(ir.ExecutableDefinition action()) {
     try {
       return action();
@@ -1067,19 +912,29 @@
   }
 }
 
-/// Classifies local variables and local functions as 'closure variables'.
-/// A closure variable is one that is accessed from an inner function nested
-/// one or more levels inside the one that declares it.
-class DetectClosureVariables extends ast.Visitor
-                             implements ClosureVariableInfo {
+final String ABORT_IRNODE_BUILDER = "IrNode builder aborted";
+
+dynamic giveup(ast.Node node, [String reason]) {
+  throw ABORT_IRNODE_BUILDER;
+}
+
+/// Classifies local variables and local functions as captured, if they
+/// are accessed from within a nested function.
+///
+/// This class is specific to the [DartIrBuilder], in that it gives up if it
+/// sees a feature that is currently unsupport by that builder. In particular,
+/// loop variables captured in a for-loop initializer, condition, or update
+/// expression are unsupported.
+class DartCapturedVariables extends ast.Visitor
+                             implements DartCapturedVariableInfo {
   final TreeElements elements;
-  DetectClosureVariables(this.elements);
+  DartCapturedVariables(this.elements);
 
   FunctionElement currentFunction;
   bool insideInitializer = false;
   Set<Local> capturedVariables = new Set<Local>();
 
-  void markAsClosureVariable(Local local) {
+  void markAsCaptured(Local local) {
     capturedVariables.add(local);
   }
 
@@ -1089,13 +944,32 @@
     node.visitChildren(this);
   }
 
+  visitFor(ast.For node) {
+    if (node.initializer != null) visit(node.initializer);
+    if (node.condition != null) visit(node.condition);
+    if (node.update != null) visit(node.update);
+
+    // Give up if a variable was captured outside of the loop body.
+    if (node.initializer is ast.VariableDefinitions) {
+      ast.VariableDefinitions definitions = node.initializer;
+      for (ast.Node node in definitions.definitions.nodes) {
+        LocalElement loopVariable = elements[node];
+        if (capturedVariables.contains(loopVariable)) {
+          return giveup(node, 'For-loop variable captured in loop header');
+        }
+      }
+    }
+
+    if (node.body != null) visit(node.body);
+  }
+
   void handleSend(ast.Send node) {
     Element element = elements[node];
     if (Elements.isLocal(element) &&
         !element.isConst &&
         element.enclosingElement != currentFunction) {
       LocalElement local = element;
-      markAsClosureVariable(local);
+      markAsCaptured(local);
     }
   }
 
@@ -1118,7 +992,7 @@
       // they still need to be boxed.  As a simplification, we treat them as if
       // they are captured by a closure (i.e., they do outlive the activation of
       // the function).
-      markAsClosureVariable(local);
+      markAsCaptured(local);
     }
     node.visitChildren(this);
   }
@@ -1135,3 +1009,544 @@
     currentFunction = oldFunction;
   }
 }
+
+/// IR builder specific to the Dart backend, coupled to the [DartIrBuilder].
+class DartIrBuilderVisitor extends IrBuilderVisitor {
+  /// Promote the type of [irBuilder] to [DartIrBuilder].
+  DartIrBuilder get irBuilder => super.irBuilder;
+
+  DartIrBuilderVisitor(TreeElements elements,
+                   Compiler compiler,
+                   SourceFile sourceFile)
+      : super(elements, compiler, sourceFile);
+
+  DartIrBuilder makeIRBuilder(ast.Node node, ExecutableElement element) {
+    DartCapturedVariables closures = new DartCapturedVariables(elements);
+    if (!element.isSynthesized) {
+      closures.visit(node);
+    }
+    return new DartIrBuilder(compiler.backend.constantSystem,
+                             element,
+                             closures);
+  }
+
+  /// Recursively builds the IR for the given nested function.
+  ir.FunctionDefinition makeSubFunction(ast.FunctionExpression node) {
+    FunctionElement element = elements[node];
+    assert(invariant(element, element.isImplementation));
+
+    IrBuilder builder = irBuilder.makeInnerFunctionBuilder(element);
+
+    return withBuilder(builder, () => _makeFunctionBody(element, node));
+  }
+
+  ir.Primitive visitFunctionExpression(ast.FunctionExpression node) {
+    return irBuilder.buildFunctionExpression(makeSubFunction(node));
+  }
+
+  visitFunctionDeclaration(ast.FunctionDeclaration node) {
+    LocalFunctionElement element = elements[node.function];
+    Object inner = makeSubFunction(node.function);
+    irBuilder.declareLocalFunction(element, inner);
+  }
+
+  ClosureScope getClosureScopeForNode(ast.Node node) => null;
+  ClosureEnvironment getClosureEnvironment() => null;
+
+  ir.ExecutableDefinition buildExecutable(ExecutableElement element) {
+    return nullIfGiveup(() {
+      if (element is FieldElement) {
+        return buildField(element);
+      } else if (element is FunctionElement) {
+        return buildFunction(element);
+      } else {
+        compiler.internalError(element, "Unexpected element type $element");
+      }
+    });
+  }
+
+  /// Returns a [ir.FieldDefinition] describing the initializer of [element].
+  ir.FieldDefinition buildField(FieldElement element) {
+    assert(invariant(element, element.isImplementation));
+    ast.VariableDefinitions definitions = element.node;
+    ast.Node fieldDefinition = definitions.definitions.nodes.first;
+    if (definitions.modifiers.isConst) {
+      // TODO(sigurdm): Just return const value.
+    }
+    assert(fieldDefinition != null);
+    assert(elements[fieldDefinition] != null);
+
+    IrBuilder builder = makeIRBuilder(fieldDefinition, element);
+
+    return withBuilder(builder, () {
+      builder.buildFieldInitializerHeader(
+          closureScope: getClosureScopeForNode(fieldDefinition));
+      ir.Primitive initializer;
+      if (fieldDefinition is ast.SendSet) {
+        ast.SendSet sendSet = fieldDefinition;
+        initializer = visit(sendSet.arguments.first);
+      }
+      return builder.makeFieldDefinition(initializer);
+    });
+  }
+
+  ir.FunctionDefinition buildFunction(FunctionElement element) {
+    assert(invariant(element, element.isImplementation));
+    ast.FunctionExpression node = element.node;
+
+    if (!element.isSynthesized) {
+      assert(node != null);
+      assert(elements[node] != null);
+    } else {
+      SynthesizedConstructorElementX constructor = element;
+      if (!constructor.isDefaultConstructor) {
+        giveup(null, 'cannot handle synthetic forwarding constructors');
+      }
+    }
+
+    IrBuilder builder = makeIRBuilder(node, element);
+
+    return withBuilder(builder, () => _makeFunctionBody(element, node));
+  }
+}
+
+/// IR builder specific to the JavaScript backend, coupled to the [JsIrBuilder].
+class JsIrBuilderVisitor extends IrBuilderVisitor {
+  /// Promote the type of [irBuilder] to [JsIrBuilder].
+  JsIrBuilder get irBuilder => super.irBuilder;
+
+  /// Result of closure conversion for the current body of code.
+  ///
+  /// Will be initialized upon entering the body of a function.
+  /// It is computed by the [ClosureTranslator].
+  ClosureClassMap closureMap;
+
+  /// During construction of a constructor factory, [fieldValues] maps fields
+  /// to the primitive containing their initial value.
+  Map<FieldElement, ir.Primitive> fieldValues = <FieldElement, ir.Primitive>{};
+
+  JsIrBuilderVisitor(TreeElements elements,
+                     Compiler compiler,
+                     SourceFile sourceFile)
+      : super(elements, compiler, sourceFile);
+
+  /// Builds the IR for creating an instance of the closure class corresponding
+  /// to the given nested function.
+  ClosureClassElement makeSubFunction(ast.FunctionExpression node) {
+    ClosureClassMap innerMap =
+        compiler.closureToClassMapper.getMappingForNestedFunction(node);
+    ClosureClassElement closureClass = innerMap.closureClassElement;
+    return closureClass;
+  }
+
+  ir.Primitive visitFunctionExpression(ast.FunctionExpression node) {
+    return irBuilder.buildFunctionExpression(makeSubFunction(node));
+  }
+
+  visitFunctionDeclaration(ast.FunctionDeclaration node) {
+    LocalFunctionElement element = elements[node.function];
+    Object inner = makeSubFunction(node.function);
+    irBuilder.declareLocalFunction(element, inner);
+  }
+
+  Map mapValues(Map map, dynamic fn(dynamic)) {
+    Map result = {};
+    map.forEach((key, value) {
+      result[key] = fn(value);
+    });
+    return result;
+  }
+
+  /// Converts closure.dart's CapturedVariable into a ClosureLocation.
+  /// There is a 1:1 corresponce between these; we do this because the
+  /// IR builder should not depend on synthetic elements.
+  ClosureLocation getLocation(CapturedVariable v) {
+    if (v is BoxFieldElement) {
+      return new ClosureLocation(v.box, v);
+    } else {
+      ClosureFieldElement field = v;
+      return new ClosureLocation(null, field);
+    }
+  }
+
+  /// If the current function is a nested function with free variables (or a
+  /// captured reference to `this`), returns a [ClosureEnvironment]
+  /// indicating how to access these.
+  ClosureEnvironment getClosureEnvironment() {
+    if (closureMap.closureElement == null) return null;
+    return new ClosureEnvironment(
+        closureMap.closureElement,
+        closureMap.thisLocal,
+        mapValues(closureMap.freeVariableMap, getLocation));
+  }
+
+  /// If [node] has declarations for variables that should be boxed,
+  /// returns a [ClosureScope] naming a box to create, and enumerating the
+  /// variables that should be stored in the box.
+  ///
+  /// Also see [ClosureScope].
+  ClosureScope getClosureScopeForNode(ast.Node node) {
+    closurelib.ClosureScope scope = closureMap.capturingScopes[node];
+    if (scope == null) return null;
+    // We translate a ClosureScope from closure.dart into IR builder's variant
+    // because the IR builder should not depend on the synthetic elements
+    // created in closure.dart.
+    return new ClosureScope(scope.boxElement,
+                            mapValues(scope.capturedVariables, getLocation),
+                            scope.boxedLoopVariables);
+  }
+
+  /// Returns the [ClosureScope] for any function, possibly different from the
+  /// one currently being built.
+  ClosureScope getClosureScopeForFunction(FunctionElement function) {
+    ClosureClassMap map =
+        compiler.closureToClassMapper.computeClosureToClassMapping(
+            function,
+            function.node,
+            elements);
+    closurelib.ClosureScope scope = map.capturingScopes[function.node];
+    if (scope == null) return null;
+    return new ClosureScope(scope.boxElement,
+                            mapValues(scope.capturedVariables, getLocation),
+                            scope.boxedLoopVariables);
+  }
+
+  ir.ExecutableDefinition buildExecutable(ExecutableElement element) {
+    return nullIfGiveup(() {
+      switch (element.kind) {
+        case ElementKind.GENERATIVE_CONSTRUCTOR:
+          return buildConstructor(element);
+
+        case ElementKind.GENERATIVE_CONSTRUCTOR_BODY:
+          return buildConstructorBody(element);
+
+        case ElementKind.FUNCTION:
+        case ElementKind.GETTER:
+        case ElementKind.SETTER:
+          return buildFunction(element);
+
+        default:
+          compiler.internalError(element, "Unexpected element type $element");
+      }
+    });
+  }
+
+  /// Builds the IR for an [expression] taken from a different [context].
+  ///
+  /// Such expressions need to be compiled with a different [sourceFile] and
+  /// [elements] mapping.
+  ir.Primitive inlineExpression(AstElement context, ast.Expression expression) {
+    JsIrBuilderVisitor visitor = new JsIrBuilderVisitor(
+        context.resolvedAst.elements,
+        compiler,
+        elementSourceFile(context));
+    return visitor.withBuilder(irBuilder, () => visitor.visit(expression));
+  }
+
+  /// Builds the IR for a given constructor.
+  ///
+  /// 1. Evaluates all own or inherited field initializers.
+  /// 2. Creates the object and assigns its fields.
+  /// 3. Calls constructor body and super constructor bodies.
+  /// 4. Returns the created object.
+  ir.FunctionDefinition buildConstructor(ConstructorElement constructor) {
+    constructor = constructor.implementation;
+    ClassElement classElement = constructor.enclosingClass.implementation;
+
+    JsIrBuilder builder =
+        new JsIrBuilder(compiler.backend.constantSystem, constructor);
+
+    return withBuilder(builder, () {
+      // Setup parameters and create a box if anything is captured.
+      List<ParameterElement> parameters = [];
+      constructor.functionSignature.orderedForEachParameter(parameters.add);
+      builder.buildFunctionHeader(parameters,
+          closureScope: getClosureScopeForFunction(constructor));
+
+      // -- Step 1: evaluate field initializers ---
+      // Evaluate field initializers in constructor and super constructors.
+      List<ConstructorElement> constructorList = <ConstructorElement>[];
+      evaluateConstructorFieldInitializers(constructor, constructorList);
+
+      // All parameters in all constructors are now bound in the environment.
+      // BoxLocals for captured parameters are also in the environment.
+      // The initial value of all fields are now bound in [fieldValues].
+
+      // --- Step 2: create the object ---
+      // Get the initial field values in the canonical order.
+      List<ir.Primitive> instanceArguments = <ir.Primitive>[];
+      classElement.forEachInstanceField((ClassElement c, FieldElement field) {
+        ir.Primitive value = fieldValues[field];
+        if (value != null) {
+          instanceArguments.add(fieldValues[field]);
+        } else {
+          assert(Elements.isNativeOrExtendsNative(c));
+          // Native fields are initialized elsewhere.
+        }
+      }, includeSuperAndInjectedMembers: true);
+      ir.Primitive instance =
+          new ir.CreateInstance(classElement, instanceArguments);
+      irBuilder.add(new ir.LetPrim(instance));
+
+      // --- Step 3: call constructor bodies ---
+      for (ConstructorElement target in constructorList) {
+        ConstructorBodyElement bodyElement = getConstructorBody(target);
+        if (bodyElement == null) continue; // Skip if constructor has no body.
+        List<ir.Primitive> bodyArguments = <ir.Primitive>[];
+        for (Local param in getConstructorBodyParameters(bodyElement)) {
+          bodyArguments.add(irBuilder.environment.lookup(param));
+        }
+        irBuilder.buildInvokeDirectly(bodyElement, instance, bodyArguments);
+      }
+
+      // --- step 4: return the created object ----
+      irBuilder.buildReturn(instance);
+
+      return irBuilder.makeFunctionDefinition([]);
+    });
+  }
+
+  /// Evaluates all field initializers on [constructor] and all constructors
+  /// invoked through `this()` or `super()` ("superconstructors").
+  ///
+  /// The resulting field values will be available in [fieldValues]. The values
+  /// are not stored in any fields.
+  ///
+  /// This procedure assumes that the parameters to [constructor] are available
+  /// in the IR builder's environment.
+  ///
+  /// The parameters to superconstructors are, however, assumed *not* to be in
+  /// the environment, but will be put there by this procedure.
+  ///
+  /// All constructors will be added to [supers], with superconstructors first.
+  void evaluateConstructorFieldInitializers(ConstructorElement constructor,
+                                            List<ConstructorElement> supers) {
+    // Evaluate declaration-site field initializers.
+    ClassElement enclosingClass = constructor.enclosingClass.implementation;
+    enclosingClass.forEachInstanceField((ClassElement c, FieldElement field) {
+      if (field.initializer != null) {
+        fieldValues[field] = inlineExpression(field, field.initializer);
+      } else {
+        if (Elements.isNativeOrExtendsNative(c)) {
+          // Native field is initialized elsewhere.
+        } else {
+          // Fields without an initializer default to null.
+          // This value will be overwritten below if an initializer is found.
+          fieldValues[field] = irBuilder.buildNullLiteral();
+        }
+      }
+    });
+    // Evaluate initializing parameters, e.g. `Foo(this.x)`.
+    constructor.functionSignature.orderedForEachParameter(
+        (ParameterElement parameter) {
+      if (parameter.isInitializingFormal) {
+        InitializingFormalElement fieldParameter = parameter;
+        fieldValues[fieldParameter.fieldElement] =
+            irBuilder.buildLocalGet(parameter);
+      }
+    });
+    // Evaluate constructor initializers, e.g. `Foo() : x = 50`.
+    ast.FunctionExpression node = constructor.node;
+    bool hasConstructorCall = false; // Has this() or super() initializer?
+    if (node != null && node.initializers != null) {
+      for(ast.Node initializer in node.initializers) {
+        if (initializer is ast.SendSet) {
+          // Field initializer.
+          FieldElement field = elements[initializer];
+          fieldValues[field] =
+              inlineExpression(constructor, initializer.arguments.head);
+        } else if (initializer is ast.Send) {
+          // Super or this initializer.
+          ConstructorElement target = elements[initializer].implementation;
+          Selector selector = elements.getSelector(initializer);
+          List<ir.Primitive> arguments = initializer.arguments.mapToList(visit);
+          loadArguments(target, selector, arguments);
+          evaluateConstructorFieldInitializers(target, supers);
+          hasConstructorCall = true;
+        } else {
+          compiler.internalError(initializer,
+                                 "Unexpected initializer type $initializer");
+        }
+      }
+    }
+    // If no super() or this() was found, also call default superconstructor.
+    if (!hasConstructorCall && !enclosingClass.isObject) {
+      ClassElement superClass = enclosingClass.superclass;
+      Selector selector =
+          new Selector.callDefaultConstructor(enclosingClass.library);
+      FunctionElement target = superClass.lookupConstructor(selector);
+      if (target == null) {
+        compiler.internalError(superClass, "No default constructor available.");
+      }
+      evaluateConstructorFieldInitializers(target, supers);
+    }
+    // Add this constructor after the superconstructors.
+    supers.add(constructor);
+  }
+
+  /// In preparation of inlining (part of) [target], the [arguments] are moved
+  /// into the environment bindings for the corresponding parameters.
+  ///
+  /// Defaults for optional arguments are evaluated in order to ensure
+  /// all parameters are available in the environment.
+  void loadArguments(FunctionElement target,
+                     Selector selector,
+                     List<ir.Primitive> arguments) {
+    target = target.implementation;
+    FunctionSignature signature = target.functionSignature;
+
+    // Establish a scope in case parameters are captured.
+    ClosureScope scope = getClosureScopeForFunction(target);
+    irBuilder._enterScope(scope);
+
+    // Load required parameters
+    int index = 0;
+    signature.forEachRequiredParameter((ParameterElement param) {
+      irBuilder.declareLocalVariable(param, initialValue: arguments[index]);
+      index++;
+    });
+
+    // Load optional parameters, evaluating default values for omitted ones.
+    signature.forEachOptionalParameter((ParameterElement param) {
+      ir.Primitive value;
+      // Load argument if provided.
+      if (signature.optionalParametersAreNamed) {
+        int translatedIndex = selector.namedArguments.indexOf(param.name);
+        if (translatedIndex != -1) {
+          value = arguments[translatedIndex];
+        }
+      } else if (index < arguments.length) {
+        value = arguments[index];
+      }
+      // Load default if argument was not provided.
+      if (value == null) {
+        if (param.initializer != null) {
+          value = visit(param.initializer);
+        } else {
+          value = irBuilder.buildNullLiteral();
+        }
+      }
+      irBuilder.declareLocalVariable(param, initialValue: value);
+      index++;
+    });
+  }
+
+  /**
+   * Returns the constructor body associated with the given constructor or
+   * creates a new constructor body, if none can be found.
+   *
+   * Returns `null` if the constructor does not have a body.
+   */
+  ConstructorBodyElement getConstructorBody(FunctionElement constructor) {
+    // TODO(asgerf): This is largely inherited from the SSA builder.
+    // The ConstructorBodyElement has an invalid function signature, but we
+    // cannot add a BoxLocal as parameter, because BoxLocal is not an element.
+    // Instead of forging ParameterElements to forge a FunctionSignature, we
+    // need a way to create backend methods without creating more fake elements.
+
+    assert(constructor.isGenerativeConstructor);
+    assert(invariant(constructor, constructor.isImplementation));
+    if (constructor.isSynthesized) return null;
+    ast.FunctionExpression node = constructor.node;
+    // If we know the body doesn't have any code, we don't generate it.
+    if (!node.hasBody()) return null;
+    if (node.hasEmptyBody()) return null;
+    ClassElement classElement = constructor.enclosingClass;
+    ConstructorBodyElement bodyElement;
+    classElement.forEachBackendMember((Element backendMember) {
+      if (backendMember.isGenerativeConstructorBody) {
+        ConstructorBodyElement body = backendMember;
+        if (body.constructor == constructor) {
+          bodyElement = backendMember;
+        }
+      }
+    });
+    if (bodyElement == null) {
+      bodyElement = new ConstructorBodyElementX(constructor);
+      classElement.addBackendMember(bodyElement);
+
+      if (constructor.isPatch) {
+        // Create origin body element for patched constructors.
+        ConstructorBodyElementX patch = bodyElement;
+        ConstructorBodyElementX origin =
+            new ConstructorBodyElementX(constructor.origin);
+        origin.applyPatch(patch);
+        classElement.origin.addBackendMember(bodyElement.origin);
+      }
+    }
+    assert(bodyElement.isGenerativeConstructorBody);
+    return bodyElement;
+  }
+
+  /// The list of parameters to send from the generative constructor
+  /// to the generative constructor body.
+  ///
+  /// Boxed parameters are not in the list, instead, a [BoxLocal] is passed
+  /// containing the boxed parameters.
+  ///
+  /// For example, given the following constructor,
+  ///
+  ///     Foo(x, y) : field = (() => ++x) { print(x + y) }
+  ///
+  /// the argument `x` would be replaced by a [BoxLocal]:
+  ///
+  ///     Foo_body(box0, y) { print(box0.x + y) }
+  ///
+  List<Local> getConstructorBodyParameters(ConstructorBodyElement body) {
+    List<Local> parameters = <Local>[];
+    ClosureScope scope = getClosureScopeForFunction(body.constructor);
+    if (scope != null) {
+      parameters.add(scope.box);
+    }
+    body.functionSignature.orderedForEachParameter((ParameterElement param) {
+      if (scope != null && scope.capturedVariables.containsKey(param)) {
+        // Do not pass this parameter; the box will carry its value.
+      } else {
+        parameters.add(param);
+      }
+    });
+    return parameters;
+  }
+
+  /// Builds the IR for the body of a constructor.
+  ///
+  /// This function is invoked from one or more "factory" constructors built by
+  /// [buildConstructor].
+  ir.FunctionDefinition buildConstructorBody(ConstructorBodyElement body) {
+    ConstructorElement constructor = body.constructor;
+    ast.FunctionExpression node = constructor.node;
+    closureMap = compiler.closureToClassMapper.computeClosureToClassMapping(
+        constructor,
+        node,
+        elements);
+
+    JsIrBuilder builder =
+        new JsIrBuilder(compiler.backend.constantSystem, body);
+
+    return withBuilder(builder, () {
+      irBuilder.buildConstructorBodyHeader(getConstructorBodyParameters(body),
+                                           getClosureScopeForNode(node));
+      visit(node.body);
+      return irBuilder.makeFunctionDefinition([]);
+    });
+  }
+
+  ir.FunctionDefinition buildFunction(FunctionElement element) {
+    assert(invariant(element, element.isImplementation));
+    ast.FunctionExpression node = element.node;
+
+    assert(!element.isSynthesized);
+    assert(node != null);
+    assert(elements[node] != null);
+
+    closureMap = compiler.closureToClassMapper.computeClosureToClassMapping(
+        element,
+        node,
+        elements);
+    IrBuilder builder =
+        new JsIrBuilder(compiler.backend.constantSystem, element);
+    return withBuilder(builder, () => _makeFunctionBody(element, node));
+  }
+
+}
+
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
index 430eb6d..00e3252 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
@@ -124,20 +124,32 @@
 }
 
 
-/// Binding a continuation: 'let cont k(v) = E in E'.  The bound continuation
-/// is in scope in the body and the continuation parameter is in scope in the
-/// continuation body.
-/// During one-pass construction a LetCont with an empty continuation body is
-/// used to represent the one-level context 'let cont k(v) = [] in E'.
+/// Binding continuations.
+///
+/// let cont k0(v0 ...) = E0
+///          k1(v1 ...) = E1
+///          ...
+///   in E
+///
+/// The bound continuations are in scope in the body and the continuation
+/// parameters are in scope in the respective continuation bodies.
+/// During one-pass construction a LetCont whose first continuation has an empty
+/// body is used to represent the one-level context
+/// 'let cont ... k(v) = [] ... in E'.
 class LetCont extends Expression implements InteriorNode {
-  Continuation continuation;
+  List<Continuation> continuations;
   Expression body;
 
-  LetCont(this.continuation, this.body);
+  LetCont(Continuation continuation, this.body)
+      : continuations = <Continuation>[continuation];
+
+  LetCont.many(this.continuations, this.body);
 
   Expression plug(Expression expr) {
-    assert(continuation != null && continuation.body == null);
-    return continuation.body = expr;
+    assert(continuations != null &&
+           continuations.isNotEmpty &&
+           continuations.first.body == null);
+    return continuations.first.body = expr;
   }
 
   accept(Visitor visitor) => visitor.visitLetCont(this);
@@ -156,7 +168,7 @@
 ///
 ///     child.parent = parent;
 ///     parent.body  = child;
-abstract class InteriorNode implements Node {
+abstract class InteriorNode extends Node {
   Expression body;
 }
 
@@ -188,7 +200,7 @@
 /// Invoke a method, operator, getter, setter, or index getter/setter.
 /// Converting a method to a function object is treated as a getter invocation.
 class InvokeMethod extends Expression implements Invoke {
-  final Reference<Primitive> receiver;
+  Reference<Primitive> receiver;
   final Selector selector;
   final Reference<Continuation> continuation;
   final List<Reference<Primitive>> arguments;
@@ -220,17 +232,37 @@
   accept(Visitor visitor) => visitor.visitInvokeMethod(this);
 }
 
-/// Invoke a method, operator, getter, setter, or index getter/setter from the
-/// super class in tail position.
-class InvokeSuperMethod extends Expression implements Invoke {
+/// Invoke [target] on [receiver], bypassing dispatch and override semantics.
+///
+/// That is, if [receiver] is an instance of a class that overrides [target]
+/// with a different implementation, the overriding implementation is bypassed
+/// and [target]'s implementation is invoked.
+///
+/// As with [InvokeMethod], this can be used to invoke a method, operator,
+/// getter, setter, or index getter/setter.
+///
+/// If it is known that [target] does not use its receiver argument, then
+/// [receiver] may refer to a null constant primitive. This happens for direct
+/// invocations to intercepted methods, where the effective receiver is instead
+/// passed as a formal parameter.
+///
+/// When targeting Dart, this instruction is used to represent super calls.
+/// Here, [receiver] must always be a reference to `this`, and [target] must be
+/// a method that is available in the super class.
+class InvokeMethodDirectly extends Expression implements Invoke {
+  Reference<Primitive> receiver;
+  final Element target;
   final Selector selector;
   final Reference<Continuation> continuation;
   final List<Reference<Primitive>> arguments;
 
-  InvokeSuperMethod(this.selector,
-                    Continuation cont,
-                    List<Primitive> args)
-      : continuation = new Reference<Continuation>(cont),
+  InvokeMethodDirectly(Primitive receiver,
+                       this.target,
+                       this.selector,
+                       Continuation cont,
+                       List<Primitive> args)
+      : this.receiver = new Reference<Primitive>(receiver),
+        continuation = new Reference<Continuation>(cont),
         arguments = _referenceList(args) {
     assert(selector != null);
     assert(selector.kind == SelectorKind.CALL ||
@@ -241,7 +273,7 @@
            (selector.kind == SelectorKind.INDEX && arguments.length == 2));
   }
 
-  accept(Visitor visitor) => visitor.visitInvokeSuperMethod(this);
+  accept(Visitor visitor) => visitor.visitInvokeMethodDirectly(this);
 }
 
 /// Non-const call to a constructor. The [target] may be a generative
@@ -496,18 +528,18 @@
   accept(Visitor visitor) => visitor.visitCreateBox(this);
 }
 
-/// Instantiates a synthetic class created by closure conversion.
-class CreateClosureClass extends Primitive implements JsSpecificNode {
-  final ClosureClassElement classElement;
+/// Creates an instance of a class and initializes its fields.
+class CreateInstance extends Primitive implements JsSpecificNode {
+  final ClassElement classElement;
 
-  /// Values and boxes for locals captured by the closure.
-  /// The order corresponds to [ClosureClassElement.closureFields].
+  /// Initial values for the fields on the class.
+  /// The order corresponds to the order of fields on the class.
   final List<Reference<Primitive>> arguments;
 
-  CreateClosureClass(this.classElement, List<Primitive> arguments)
+  CreateInstance(this.classElement, List<Primitive> arguments)
       : this.arguments = _referenceList(arguments);
 
-  accept(Visitor visitor) => visitor.visitCreateClosureClass(this);
+  accept(Visitor visitor) => visitor.visitCreateInstance(this);
 }
 
 class Identical extends Primitive implements JsSpecificNode {
@@ -598,6 +630,12 @@
     super.hint = hint;
   }
 
+  // In addition to a parent pointer to the containing Continuation or
+  // FunctionDefinition, parameters have an index into the list of parameters
+  // bound by the parent.  This gives constant-time access to the continuation
+  // from the parent.
+  int parent_index;
+
   accept(Visitor visitor) => visitor.visitParameter(this);
 }
 
@@ -608,6 +646,11 @@
   final List<Parameter> parameters;
   Expression body = null;
 
+  // In addition to a parent pointer to the containing LetCont, continuations
+  // have an index into the list of continuations bound by the LetCont.  This
+  // gives constant-time access to the continuation from the parent.
+  int parent_index;
+
   // A continuation is recursive if it has any recursive invocations.
   bool isRecursive = false;
 
@@ -643,7 +686,7 @@
 
   /// `true` if this field has no initializer.
   ///
-  /// If `true` [body] and [returnContinuation] are `null`.
+  /// If `true` [body] is `null`.
   ///
   /// This is different from a initializer that is `null`. Consider this class:
   ///
@@ -672,16 +715,15 @@
   accept(Visitor v) => v.visitClosureVariable(this);
 }
 
-class RunnableBody implements InteriorNode {
+class RunnableBody extends InteriorNode {
   Expression body;
   final Continuation returnContinuation;
-  Node parent;
   RunnableBody(this.body, this.returnContinuation);
   accept(Visitor visitor) => visitor.visitRunnableBody(this);
 }
 
 /// A function definition, consisting of parameters and a body.  The parameters
-/// include a distinguished continuation parameter.
+/// include a distinguished continuation parameter (held by the body).
 class FunctionDefinition extends Node
     implements ExecutableDefinition {
   final FunctionElement element;
@@ -715,27 +757,24 @@
 
   /// Returns `true` if this function is abstract or external.
   ///
-  /// If `true`, [body] and [returnContinuation] are `null` and [localConstants]
-  /// is empty.
+  /// If `true`, [body] is `null` and [localConstants] is empty.
   bool get isAbstract => body == null;
 }
 
 abstract class Initializer extends Node {}
 
-class FieldInitializer implements Initializer {
+class FieldInitializer extends Initializer {
   final FieldElement element;
   final RunnableBody body;
-  Node parent;
 
   FieldInitializer(this.element, this.body);
   accept(Visitor visitor) => visitor.visitFieldInitializer(this);
 }
 
-class SuperInitializer implements Initializer {
+class SuperInitializer extends Initializer {
   final ConstructorElement target;
   final List<RunnableBody> arguments;
   final Selector selector;
-  Node parent;
   SuperInitializer(this.target, this.arguments, this.selector);
   accept(Visitor visitor) => visitor.visitSuperInitializer(this);
 }
@@ -800,7 +839,7 @@
   T visitInvokeStatic(InvokeStatic node) => visitExpression(node);
   T visitInvokeContinuation(InvokeContinuation node) => visitExpression(node);
   T visitInvokeMethod(InvokeMethod node) => visitExpression(node);
-  T visitInvokeSuperMethod(InvokeSuperMethod node) => visitExpression(node);
+  T visitInvokeMethodDirectly(InvokeMethodDirectly node) => visitExpression(node);
   T visitInvokeConstructor(InvokeConstructor node) => visitExpression(node);
   T visitConcatenateStrings(ConcatenateStrings node) => visitExpression(node);
   T visitBranch(Branch node) => visitExpression(node);
@@ -822,7 +861,7 @@
   T visitClosureVariable(ClosureVariable node) => visitDefinition(node);
   T visitGetField(GetField node) => visitDefinition(node);
   T visitCreateBox(CreateBox node) => visitDefinition(node);
-  T visitCreateClosureClass(CreateClosureClass node) => visitDefinition(node);
+  T visitCreateInstance(CreateInstance node) => visitDefinition(node);
 
   // Conditions.
   T visitIsTrue(IsTrue node) => visitCondition(node);
@@ -850,6 +889,7 @@
   processRunnableBody(RunnableBody node) {}
   visitRunnableBody(RunnableBody node) {
     processRunnableBody(node);
+    visit(node.returnContinuation);
     visit(node.body);
   }
 
@@ -903,7 +943,7 @@
   processLetCont(LetCont node) {}
   visitLetCont(LetCont node) {
     processLetCont(node);
-    visit(node.continuation);
+    node.continuations.forEach(visit);
     visit(node.body);
   }
 
@@ -929,9 +969,10 @@
     node.arguments.forEach(processReference);
   }
 
-  processInvokeSuperMethod(InvokeSuperMethod node) {}
-  visitInvokeSuperMethod(InvokeSuperMethod node) {
-    processInvokeSuperMethod(node);
+  processInvokeMethodDirectly(InvokeMethodDirectly node) {}
+  visitInvokeMethodDirectly(InvokeMethodDirectly node) {
+    processInvokeMethodDirectly(node);
+    processReference(node.receiver);
     processReference(node.continuation);
     node.arguments.forEach(processReference);
   }
@@ -1028,7 +1069,7 @@
   visitContinuation(Continuation node) {
     processContinuation(node);
     node.parameters.forEach(visitParameter);
-    visit(node.body);
+    if (node.body != null) visit(node.body);
   }
 
   // Conditions.
@@ -1053,9 +1094,9 @@
     processReference(node.input);
   }
 
-  processCreateClosureClass(CreateClosureClass node) {}
-  visitCreateClosureClass(CreateClosureClass node) {
-    processCreateClosureClass(node);
+  processCreateInstance(CreateInstance node) {}
+  visitCreateInstance(CreateInstance node) {
+    processCreateInstance(node);
     node.arguments.forEach(processReference);
   }
 
@@ -1176,7 +1217,7 @@
   }
 
   void visitSuperInitializer(SuperInitializer node) {
-    node.arguments.forEach((RunnableBody argument) => visit(argument.body));
+    node.arguments.forEach(visit);
   }
 
   void visitLetPrim(LetPrim node) {
@@ -1186,7 +1227,7 @@
   }
 
   void visitLetCont(LetCont node) {
-    visit(node.continuation);
+    node.continuations.forEach(visit);
     visit(node.body);
   }
 
@@ -1203,7 +1244,8 @@
     node.arguments.forEach(visitReference);
   }
 
-  void visitInvokeSuperMethod(InvokeSuperMethod node) {
+  void visitInvokeMethodDirectly(InvokeMethodDirectly node) {
+    visitReference(node.receiver);
     node.arguments.forEach(visitReference);
   }
 
@@ -1294,7 +1336,7 @@
   void visitCreateBox(CreateBox node) {
   }
 
-  void visitCreateClosureClass(CreateClosureClass node) {
+  void visitCreateInstance(CreateInstance node) {
     node.arguments.forEach(visitReference);
   }
 
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart
index 8496f54..a23b683 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart
@@ -76,20 +76,31 @@
   }
 
   String visitLetCont(LetCont node) {
-    String cont = newContinuationName(node.continuation);
-    // TODO(karlklose): this should be changed to `.map(visit).join(' ')`  and
-    // should recurse to [visit].  Currently we can't do that, because the
-    // unstringifier_test produces [LetConts] with dummy arguments on them.
-    String parameters = node.continuation.parameters
-        .map((p) => '${decorator(p, newValueName(p))}')
-        .join(' ');
-    String contBody =
-        indentBlock(() => indentBlock(() => visit(node.continuation.body)));
+    String conts;
+    bool first = true;
+    for (Continuation continuation in node.continuations) {
+      String name = newContinuationName(continuation);
+      if (continuation.isRecursive) name = 'rec $name';
+      // TODO(karlklose): this should be changed to `.map(visit).join(' ')`  and
+      // should recurse to [visit].  Currently we can't do that, because the
+      // unstringifier_test produces [LetConts] with dummy arguments on them.
+      String parameters = continuation.parameters
+          .map((p) => '${decorator(p, newValueName(p))}')
+          .join(' ');
+      String body =
+          indentBlock(() => indentBlock(() => visit(continuation.body)));
+      if (first) {
+        first = false;
+        conts = '($name ($parameters)\n$body)';
+      } else {
+        // Each subsequent line is indented additional spaces to align it
+        // with the previous continuation.
+        String indent = '$indentation${' ' * '(LetCont ('.length}';
+        conts = '$conts\n$indent($name ($parameters)\n$body)';
+      }
+    }
     String body = indentBlock(() => visit(node.body));
-    String op = node.continuation.isRecursive ? 'LetCont*' : 'LetCont';
-    return '$indentation($op ($cont ($parameters)\n'
-           '$contBody)\n'
-           '$body)';
+    return '$indentation($LetCont ($conts)\n$body)';
   }
 
   String formatArguments(Invoke node) {
@@ -99,7 +110,7 @@
         node.arguments.getRange(0, positionalArgumentCount).map(access));
     for (int i = 0; i < node.selector.namedArgumentCount; ++i) {
       String name = node.selector.namedArguments[i];
-      Definition arg = node.arguments[positionalArgumentCount + i].definition;
+      String arg = access(node.arguments[positionalArgumentCount + i]);
       args.add("($name: $arg)");
     }
     return '(${args.join(' ')})';
@@ -120,11 +131,12 @@
     return '$indentation(InvokeMethod $rcv $name $args $cont)';
   }
 
-  String visitInvokeSuperMethod(InvokeSuperMethod node) {
+  String visitInvokeMethodDirectly(InvokeMethodDirectly node) {
+    String receiver = access(node.receiver);
     String name = node.selector.name;
     String cont = access(node.continuation);
     String args = formatArguments(node);
-    return '$indentation(InvokeSuperMethod $name $args $cont)';
+    return '$indentation(InvokeMethodDirectly $receiver $name $args $cont)';
   }
 
   String visitInvokeConstructor(InvokeConstructor node) {
@@ -146,11 +158,10 @@
   }
 
   String visitInvokeContinuation(InvokeContinuation node) {
-    String cont = access(node.continuation);
+    String name = access(node.continuation);
+    if (node.isRecursive) name = 'rec $name';
     String args = node.arguments.map(access).join(' ');
-    String op =
-        node.isRecursive ? 'InvokeContinuation*' : 'InvokeContinuation';
-    return '$indentation($op $cont ($args))';
+    return '$indentation($InvokeContinuation $name ($args))';
   }
 
   String visitBranch(Branch node) {
@@ -246,10 +257,10 @@
     return '(CreateBox)';
   }
 
-  String visitCreateClosureClass(CreateClosureClass node) {
+  String visitCreateInstance(CreateInstance node) {
     String className = node.classElement.name;
     String arguments = node.arguments.map(access).join(' ');
-    return '(CreateClosureClass $className ($arguments))';
+    return '(CreateInstance $className ($arguments))';
   }
 
   String visitIdentical(Identical node) {
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
index c4d5f1f..23e6b3b 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
@@ -112,8 +112,10 @@
   visitLetCont(cps_ir.LetCont node) {
     if (IR_TRACE_LET_CONT) {
       String dummy = names.name(node);
-      String id = names.name(node.continuation);
-      printStmt(dummy, "LetCont $id = <$id>");
+      for (cps_ir.Continuation continuation in node.continuations) {
+        String id = names.name(continuation);
+        printStmt(dummy, "LetCont $id = <$id>");
+      }
     }
     visit(node.body);
   }
@@ -136,13 +138,14 @@
         "InvokeMethod $receiver $callName ($args) $kont");
   }
 
-  visitInvokeSuperMethod(cps_ir.InvokeSuperMethod node) {
+  visitInvokeMethodDirectly(cps_ir.InvokeMethodDirectly node) {
     String dummy = names.name(node);
+    String receiver = formatReference(node.receiver);
     String callName = node.selector.name;
     String args = node.arguments.map(formatReference).join(', ');
     String kont = formatReference(node.continuation);
     printStmt(dummy,
-        "InvokeSuperMethod $callName ($args) $kont");
+        "InvokeMethodDirectly $receiver $callName ($args) $kont");
   }
 
   visitInvokeConstructor(cps_ir.InvokeConstructor node) {
@@ -270,10 +273,10 @@
     return 'CreateBox';
   }
 
-  visitCreateClosureClass(cps_ir.CreateClosureClass node) {
+  visitCreateInstance(cps_ir.CreateInstance node) {
     String className = node.classElement.name;
     String arguments = node.arguments.map(formatReference).join(', ');
-    return 'CreateClosureClass $className ($arguments)';
+    return 'CreateInstance $className ($arguments)';
   }
 
   visitIdentical(cps_ir.Identical node) {
@@ -422,7 +425,7 @@
   }
 
   visitLetCont(cps_ir.LetCont exp) {
-    visit(exp.continuation);
+    exp.continuations.forEach(visit);
     visit(exp.body);
   }
 
diff --git a/pkg/compiler/lib/src/cps_ir/optimizers.dart b/pkg/compiler/lib/src/cps_ir/optimizers.dart
index 33a455f..cbf4ef5 100644
--- a/pkg/compiler/lib/src/cps_ir/optimizers.dart
+++ b/pkg/compiler/lib/src/cps_ir/optimizers.dart
@@ -51,4 +51,4 @@
     if (!root.hasInitializer) return;
     rewriteExecutableDefinition(root);
   }
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/cps_ir/redundant_phi.dart b/pkg/compiler/lib/src/cps_ir/redundant_phi.dart
index ec665c1..c4964c0 100644
--- a/pkg/compiler/lib/src/cps_ir/redundant_phi.dart
+++ b/pkg/compiler/lib/src/cps_ir/redundant_phi.dart
@@ -141,7 +141,7 @@
   }
 
   void processLetCont(LetCont node) {
-    workSet.add(node.continuation);
+    node.continuations.forEach(workSet.add);
   }
 }
 
diff --git a/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart b/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart
index 089921b..e161922 100644
--- a/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart
+++ b/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart
@@ -9,7 +9,6 @@
  * in 'Compiling with Continuations, Continued' by Andrew Kennedy.
  */
 class ShrinkingReducer extends PassMixin {
-  _RedexVisitor _redexVisitor;
   Set<_ReductionTask> _worklist;
 
   static final _DeletedNode _DELETED = new _DeletedNode();
@@ -18,13 +17,13 @@
   @override
   void rewriteExecutableDefinition(ExecutableDefinition root) {
     _worklist = new Set<_ReductionTask>();
-    _redexVisitor = new _RedexVisitor(_worklist);
+    _RedexVisitor redexVisitor = new _RedexVisitor(_worklist);
 
     // Set all parent pointers.
     new ParentVisitor().visit(root);
 
     // Sweep over the term, collecting redexes into the worklist.
-    _redexVisitor.visit(root);
+    redexVisitor.visit(root);
 
     // Process the worklist.
     while (_worklist.isNotEmpty) {
@@ -46,8 +45,27 @@
     node.parent = _DELETED;
   }
 
+  /// Remove a given continuation from the CPS graph.  The LetCont itself is
+  /// removed if the given continuation is the only binding.
+  void _removeContinuation(Continuation cont) {
+    LetCont parent = cont.parent;
+    if (parent.continuations.length == 1) {
+      assert(cont.parent_index == 0);
+      _removeNode(parent);
+    } else {
+      List<Continuation> continuations = parent.continuations;
+      for (int i = cont.parent_index; i < continuations.length - 1; ++i) {
+        Continuation current = continuations[i + 1];
+        continuations[i] = current;
+        current.parent_index = i;
+      }
+      continuations.removeLast();
+    }
+    cont.parent = _DELETED;
+  }
+
   void _processTask(_ReductionTask task) {
-    // Lazily skip tasks for deleted nodes.
+    // Skip tasks for deleted nodes.
     if (task.node.parent == _DELETED) {
       return;
     }
@@ -65,6 +83,9 @@
       case _ReductionKind.ETA_CONT:
         _reduceEtaCont(task);
         break;
+      case _ReductionKind.DEAD_PARAMETER:
+        _reduceDeadParameter(task);
+        break;
       default:
         assert(false);
     }
@@ -80,7 +101,7 @@
     _removeNode(letPrim);
 
     // Perform bookkeeping on removed body and scan for new redexes.
-    new _RemovalRedexVisitor(_worklist).visit(letPrim.primitive);
+    new _RemovalVisitor(_worklist).visit(letPrim.primitive);
   }
 
   /// Applies the dead-cont reduction:
@@ -89,11 +110,11 @@
     assert(_isDeadCont(task.node));
 
     // Remove dead continuation.
-    LetCont letCont = task.node;
-    _removeNode(letCont);
+    Continuation cont = task.node;
+    _removeContinuation(cont);
 
     // Perform bookkeeping on removed body and scan for new redexes.
-    new _RemovalRedexVisitor(_worklist).visit(letCont.continuation);
+    new _RemovalVisitor(_worklist).visit(cont);
   }
 
   /// Applies the beta-cont-lin reduction:
@@ -111,9 +132,8 @@
     }
 
     // Remove the continuation.
-    LetCont letCont = task.node;
-    Continuation cont = letCont.continuation;
-    _removeNode(letCont);
+    Continuation cont = task.node;
+    _removeContinuation(cont);
 
     // Replace its invocation with the continuation body.
     InvokeContinuation invoke = cont.firstRef.parent;
@@ -128,8 +148,8 @@
       argRef.definition.substituteFor(cont.parameters[i]);
     }
 
-    // Perform bookkeeping on removed body and scan for new redexes.
-    new _RemovalRedexVisitor(_worklist).visit(invoke);
+    // Perform bookkeeping on substituted body and scan for new redexes.
+    new _RemovalVisitor(_worklist).visit(invoke);
   }
 
   /// Applies the eta-cont reduction:
@@ -147,9 +167,8 @@
     }
 
     // Remove the continuation.
-    LetCont letCont   = task.node;
-    Continuation cont = letCont.continuation;
-    _removeNode(letCont);
+    Continuation cont = task.node;
+    _removeContinuation(cont);
 
     InvokeContinuation invoke = cont.body;
     Continuation wrappedCont = invoke.continuation.definition;
@@ -158,21 +177,89 @@
     wrappedCont.substituteFor(cont);
 
     // Perform bookkeeping on removed body and scan for new redexes.
-    new _RemovalRedexVisitor(_worklist).visit(cont);
+    new _RemovalVisitor(_worklist).visit(cont);
+  }
+
+  void _reduceDeadParameter(_ReductionTask task) {
+    // Continuation eta-reduction can destroy a dead parameter redex.  For
+    // example, in the term:
+    //
+    // let cont k0(v0) = /* v0 is not used */ in
+    //   let cont k1(v1) = k0(v1) in
+    //     call foo () k1
+    //
+    // Continuation eta-reduction of k1 gives:
+    //
+    // let cont k0(v0) = /* v0 is not used */ in
+    //   call foo () k0
+    //
+    // Where the dead parameter reduction is no longer valid because we do not
+    // allow removing the paramter of call continuations.  We disallow such eta
+    // reductions in [_isEtaCont].
+    assert(_isDeadParameter(task.node));
+
+    Parameter parameter = task.node;
+    Continuation continuation = parameter.parent;
+    int index = parameter.parent_index;
+
+    // Remove the index'th argument from each invocation.
+    Reference<Continuation> current = continuation.firstRef;
+    while (current != null) {
+      InvokeContinuation invoke = current.parent;
+      Reference<Primitive> argument = invoke.arguments[index];
+      argument.unlink();
+      // Removing an argument can create a dead parameter or dead value redex.
+      if (argument.definition is Parameter) {
+        if (_isDeadParameter(argument.definition)) {
+          _worklist.add(new _ReductionTask(_ReductionKind.DEAD_PARAMETER,
+                                           argument.definition));
+        }
+      } else {
+        Node parent = argument.definition.parent;
+        if (parent is LetPrim) {
+          if (_isDeadVal(parent)) {
+            _worklist.add(new _ReductionTask(_ReductionKind.DEAD_VAL, parent));
+          }
+        }
+      }
+      invoke.arguments.removeAt(index);
+      current = current.next;
+    }
+    // Copy the parameters above index down.
+    List<Parameter> parameters = continuation.parameters;
+    for (int i = index; i < parameters.length - 1; ++i) {
+      Parameter p = parameters[i + 1];
+      parameters[i] = p;
+      p.parent_index = i;
+    }
+    parameters.removeLast();
+
+    // Removing an unused parameter can create an eta-redex.
+    if (_isEtaCont(continuation)) {
+      _worklist.add(new _ReductionTask(_ReductionKind.ETA_CONT, continuation));
+    }
   }
 }
 
 /// Returns true iff the bound primitive is unused.
 bool _isDeadVal(LetPrim node) => !node.primitive.hasAtLeastOneUse;
 
-/// Returns true iff the bound continuation is unused.
-bool _isDeadCont(LetCont node) => !node.continuation.hasAtLeastOneUse;
+/// Returns true iff the continuation is unused.
+bool _isDeadCont(Continuation cont) {
+  return !cont.isReturnContinuation && !cont.hasAtLeastOneUse;
+}
 
-/// Returns true iff the bound continuation is used exactly once, and that
-/// use is as the receiver of a continuation invocation.
-bool _isBetaContLin(LetCont node) {
-  Continuation cont = node.continuation;
-  if (!cont.hasExactlyOneUse) {
+/// Returns true iff the continuation has a body (i.e., it is not the return
+/// continuation), it is used exactly once, and that use is as the continuation
+/// of a continuation invocation.
+bool _isBetaContLin(Continuation cont) {
+  // There is a restriction on continuation eta-redexes that the body is not an
+  // invocation of the return continuation, because that leads to worse code
+  // when translating back to direct style (it duplicates returns).  There is no
+  // such restriction here because continuation beta-reduction is only performed
+  // for singly referenced continuations. Thus, there is no possibility of code
+  // duplication.
+  if (cont.isReturnContinuation || !cont.hasExactlyOneUse) {
     return false;
   }
 
@@ -182,34 +269,73 @@
   }
 
   return false;
-
 }
 
-/// Returns true iff the bound continuation consists of a continuation
+/// Returns true iff the continuation consists of a continuation
 /// invocation, passing on all parameters. Special cases exist (see below).
-bool _isEtaCont(LetCont node) {
-  Continuation cont = node.continuation;
-  if (!(cont.body is InvokeContinuation)) {
+bool _isEtaCont(Continuation cont) {
+  if (cont.isReturnContinuation || cont.body is! InvokeContinuation) {
     return false;
   }
 
   InvokeContinuation invoke = cont.body;
   Continuation invokedCont = invoke.continuation.definition;
 
-  // Do not eta-reduce return join-points since the resulting code is worse
+  // Do not eta-reduce return join-points since the direct-style code is worse
   // in the common case (i.e. returns are moved inside `if` branches).
   if (invokedCont.isReturnContinuation) {
     return false;
   }
 
+  // Do not perform reductions replace a function call continuation with a
+  // non-call continuation.  The invoked continuation is definitely not a call
+  // continuation, because it has a direct invocation in this continuation's
+  // body.
+  bool isCallContinuation(Continuation continuation) {
+    Reference<Continuation> current = cont.firstRef;
+    while (current != null) {
+      if (current.parent is InvokeContinuation) {
+        InvokeContinuation invoke = current.parent;
+        if (invoke.continuation.definition == continuation) return false;
+      }
+      current = current.next;
+    }
+    return true;
+  }
+  if (isCallContinuation(cont)) {
+    return false;
+  }
+
   // Translation to direct style generates different statements for recursive
-  // and non-recursive invokes. It should be possible to apply eta-cont, but
-  // higher order continuations require escape analysis, left as a possibility
-  // for future improvements.
+  // and non-recursive invokes. It should still be possible to apply eta-cont if
+  // this is not a self-invocation.
+  //
+  // TODO(kmillikin): Remove this restriction if it makes sense to do so.
   if (invoke.isRecursive) {
     return false;
   }
 
+  // If cont has more parameters than the invocation has arguments, the extra
+  // parameters will be dead and dead-parameter will eventually create the
+  // eta-redex if possible.
+  //
+  // If the invocation's arguments are simply a permutation of cont's
+  // parameters, then there is likewise a possible reduction that involves
+  // rewriting the invocations of cont.  We are missing that reduction here.
+  //
+  // If cont has fewer parameters than the invocation has arguments then a
+  // reduction would still possible, since the extra invocation arguments must
+  // be in scope at all the invocations of cont.  For example:
+  //
+  // let cont k1(x1) = k0(x0, x1) in E -eta-> E'
+  // where E' has k0(x0, v) substituted for each k1(v).
+  //
+  // HOWEVER, adding continuation parameters is unlikely to be an optimization
+  // since it duplicates assignments used in direct-style to implement parameter
+  // passing.
+  //
+  // TODO(kmillikin): find real occurrences of these patterns, and see if they
+  // can be optimized.
   if (cont.parameters.length != invoke.arguments.length) {
     return false;
   }
@@ -225,6 +351,28 @@
   return true;
 }
 
+bool _isDeadParameter(Parameter parameter) {
+  // We cannot remove function parameters as an intraprocedural optimization.
+  if (parameter.parent is! Continuation || parameter.hasAtLeastOneUse) {
+    return false;
+  }
+
+  // We cannot remove the parameter to a call continuation, because the
+  // resulting expression will not be well-formed (call continuations have
+  // exactly one argument).  The return continuation is a call continuation, so
+  // we cannot remove its dummy parameter.
+  Continuation continuation = parameter.parent;
+  if (continuation.isReturnContinuation) return false;
+  Reference<Continuation> current = continuation.firstRef;
+  while (current != null) {
+    if (current.parent is! InvokeContinuation) return false;
+    InvokeContinuation invoke = current.parent;
+    if (invoke.continuation.definition != continuation) return false;
+    current = current.next;
+  }
+  return true;
+}
+
 /// Traverses a term and adds any found redexes to the worklist.
 class _RedexVisitor extends RecursiveVisitor {
   final Set<_ReductionTask> worklist;
@@ -232,37 +380,51 @@
   _RedexVisitor(this.worklist);
 
   void processLetPrim(LetPrim node) {
-    if (node.parent == ShrinkingReducer._DELETED) {
-      return;
-    } else if (_isDeadVal(node)) {
+    if (_isDeadVal(node)) {
       worklist.add(new _ReductionTask(_ReductionKind.DEAD_VAL, node));
     }
   }
 
-  void processLetCont(LetCont node) {
-    if (node.parent == ShrinkingReducer._DELETED) {
-      return;
-    } else if (_isDeadCont(node)) {
+  void processContinuation(Continuation node) {
+    // Continuation beta- and eta-redexes can overlap, namely when an eta-redex
+    // is invoked exactly once.  We prioritize continuation beta-redexes over
+    // eta-redexes because some reductions (e.g., dead parameter elimination)
+    // can destroy a continuation eta-redex.  If we prioritized eta- over
+    // beta-redexes, this would implicitly "create" the corresponding beta-redex
+    // (in the sense that it would still apply) and the algorithm would not
+    // detect it.
+    if (_isDeadCont(node)) {
       worklist.add(new _ReductionTask(_ReductionKind.DEAD_CONT, node));
-    } else if (_isEtaCont(node)) {
-      worklist.add(new _ReductionTask(_ReductionKind.ETA_CONT, node));
     } else if (_isBetaContLin(node)){
       worklist.add(new _ReductionTask(_ReductionKind.BETA_CONT_LIN, node));
+    } else if (_isEtaCont(node)) {
+      worklist.add(new _ReductionTask(_ReductionKind.ETA_CONT, node));
+    }
+  }
+
+  void processParameter(Parameter node) {
+    if (_isDeadParameter(node)) {
+      worklist.add(new _ReductionTask(_ReductionKind.DEAD_PARAMETER, node));
     }
   }
 }
 
-/// Traverses a deleted CPS term, marking existing tasks associated with a node
-/// within the term as deleted (which causes them to be skipped lazily when
-/// popped from the worklist), and adding newly created redexes to the worklist.
-class _RemovalRedexVisitor extends _RedexVisitor {
-  _RemovalRedexVisitor(Set<_ReductionTask> worklist) : super(worklist);
+/// Traverses a deleted CPS term, marking nodes that might participate in a
+/// redex as deleted and adding newly created redexes to the worklist.
+///
+/// Deleted nodes that might participate in a reduction task are marked so that
+/// any corresponding tasks can be skipped.  Nodes are marked so by setting
+/// their parent to the deleted sentinel.
+class _RemovalVisitor extends RecursiveVisitor {
+  final Set<_ReductionTask> worklist;
+
+  _RemovalVisitor(this.worklist);
 
   void processLetPrim(LetPrim node) {
     node.parent = ShrinkingReducer._DELETED;
   }
 
-  void processLetCont(LetCont node) {
+  void processContinuation(Continuation node) {
     node.parent = ShrinkingReducer._DELETED;
   }
 
@@ -272,20 +434,28 @@
     if (reference.definition is Primitive) {
       Primitive primitive = reference.definition;
       Node parent = primitive.parent;
+      // The parent might be the deleted sentinel, or it might be a
+      // Continuation or FunctionDefinition if the primitive is an argument.
       if (parent is LetPrim && _isDeadVal(parent)) {
         worklist.add(new _ReductionTask(_ReductionKind.DEAD_VAL, parent));
       }
     } else if (reference.definition is Continuation) {
       Continuation cont = reference.definition;
-      if (cont.isRecursive && cont.hasAtMostOneUse) {
-        // Convert recursive to nonrecursive continuations.
-        // If the continuation is still in use, it is either dead and will be
-        // removed, or it is called nonrecursively outside its body.
-        cont.isRecursive = false;
-      }
       Node parent = cont.parent;
-      if (parent is LetCont && _isDeadCont(parent)) {
-        worklist.add(new _ReductionTask(_ReductionKind.DEAD_CONT, parent));
+      // The parent might be the deleted sentinel, or it might be a
+      // RunnableBody if the continuation is the return continuation.
+      if (parent is LetCont) {
+        if (cont.isRecursive && cont.hasAtMostOneUse) {
+          // Convert recursive to nonrecursive continuations.  If the
+          // continuation is still in use, it is either dead and will be
+          // removed, or it is called nonrecursively outside its body.
+          cont.isRecursive = false;
+        }
+        if (_isDeadCont(cont)) {
+          worklist.add(new _ReductionTask(_ReductionKind.DEAD_CONT, cont));
+        } else if (_isBetaContLin(cont)) {
+          worklist.add(new _ReductionTask(_ReductionKind.BETA_CONT_LIN, cont));
+        }
       }
     }
   }
@@ -293,19 +463,27 @@
 
 /// Traverses the CPS term and sets node.parent for each visited node.
 class ParentVisitor extends RecursiveVisitor {
-
   processFunctionDefinition(FunctionDefinition node) {
     node.body.parent = node;
-    node.parameters.forEach((Definition p) => p.parent = node);
+    int index = 0;
+    node.parameters.forEach((Definition parameter) {
+      parameter.parent = node;
+      if (parameter is Parameter) parameter.parent_index = index++;
+    });
   }
 
   processRunnableBody(RunnableBody node) {
+    node.returnContinuation.parent = node;
     node.body.parent = node;
   }
 
   processConstructorDefinition(ConstructorDefinition node) {
     node.body.parent = node;
-    node.parameters.forEach((Definition p) => p.parent = node);
+    int index = 0;
+    node.parameters.forEach((Parameter parameter) {
+      parameter.parent = node;
+      parameter.parent_index = index++;
+    });
     node.initializers.forEach((Initializer i) => i.parent = node);
   }
 
@@ -326,13 +504,17 @@
   }
 
   processLetCont(LetCont node) {
-    node.continuation.parent = node;
+    int index = 0;
+    node.continuations.forEach((Continuation continuation) {
+      continuation.parent = node;
+      continuation.parent_index = index++;
+    });
     node.body.parent = node;
   }
 
   processInvokeStatic(InvokeStatic node) {
-    node.continuation.parent = node;
     node.arguments.forEach((Reference ref) => ref.parent = node);
+    node.continuation.parent = node;
   }
 
   processInvokeContinuation(InvokeContinuation node) {
@@ -346,7 +528,8 @@
     node.arguments.forEach((Reference ref) => ref.parent = node);
   }
 
-  processInvokeSuperMethod(InvokeSuperMethod node) {
+  processInvokeMethodDirectly(InvokeMethodDirectly node) {
+    node.receiver.parent = node;
     node.continuation.parent = node;
     node.arguments.forEach((Reference ref) => ref.parent = node);
   }
@@ -400,8 +583,12 @@
   }
 
   processContinuation(Continuation node) {
-    node.body.parent = node;
-    node.parameters.forEach((Parameter param) => param.parent = node);
+    if (node.body != null) node.body.parent = node;
+    int index = 0;
+    node.parameters.forEach((Parameter parameter) {
+      parameter.parent = node;
+      parameter.parent_index = index++;
+    });
   }
 
   // Conditions.
@@ -431,7 +618,7 @@
     node.object.parent = node;
   }
 
-  processCreateClosureClass(CreateClosureClass node) {
+  processCreateInstance(CreateInstance node) {
     node.arguments.forEach((Reference ref) => ref.parent = node);
   }
 
@@ -450,6 +637,8 @@
   static const _ReductionKind BETA_CONT_LIN =
       const _ReductionKind('beta-cont-lin', 2);
   static const _ReductionKind ETA_CONT = const _ReductionKind('eta-cont', 3);
+  static const _ReductionKind DEAD_PARAMETER =
+      const _ReductionKind('dead-parameter', 4);
 
   String toString() => name;
 }
@@ -461,14 +650,12 @@
   final Node node;
 
   int get hashCode {
-    assert(kind.hashCode < (1 << 2));
-    return (node.hashCode << 2) | kind.hashCode;
+    assert(kind.hashCode < (1 << 3));
+    return (node.hashCode << 3) | kind.hashCode;
   }
 
   _ReductionTask(this.kind, this.node) {
-    // If new node types are added, they must be marked as deleted in
-    // [[_RemovalRedexVisitor]].
-    assert(node is LetCont || node is LetPrim);
+    assert(node is Continuation || node is LetPrim || node is Parameter);
   }
 
   bool operator==(_ReductionTask that) {
diff --git a/pkg/compiler/lib/src/cps_ir/type_propagation.dart b/pkg/compiler/lib/src/cps_ir/type_propagation.dart
index c68a917..c6dd7ab 100644
--- a/pkg/compiler/lib/src/cps_ir/type_propagation.dart
+++ b/pkg/compiler/lib/src/cps_ir/type_propagation.dart
@@ -539,7 +539,7 @@
     }
    }
 
-  void visitInvokeSuperMethod(InvokeSuperMethod node) {
+  void visitInvokeMethodDirectly(InvokeMethodDirectly node) {
     Continuation cont = node.continuation.definition;
     setReachable(cont);
 
@@ -799,7 +799,7 @@
     setValue(node, nonConst());
   }
 
-  void visitCreateClosureClass(CreateClosureClass node) {
+  void visitCreateInstance(CreateInstance node) {
     setValue(node, nonConst());
   }
 }
@@ -874,4 +874,4 @@
       return new _AbstractValue.nonConst(typeSystem.join(this.type, that.type));
     }
   }
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 80be4a7..fc3b766 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -343,9 +343,10 @@
     new OptionHandler('--enable-async', setEnableAsync),
     new OptionHandler('--enable-enum', passThrough),
     new OptionHandler('--allow-native-extensions', setAllowNativeExtensions),
-    new OptionHandler('-D.+=.*', addInEnvironment),
+    new OptionHandler('--generate-code-with-compile-time-errors', passThrough),
 
-    // The following two options must come last.
+    // The following three options must come last.
+    new OptionHandler('-D.+=.*', addInEnvironment),
     new OptionHandler('-.*', (String argument) {
       helpAndFail("Unknown option '$argument'.");
     }),
@@ -609,6 +610,9 @@
     You can inspect the generated file with the viewer at:
     https://dart-lang.github.io/dump-info-visualizer/
 
+  --generate-code-with-compile-time-errors
+    Generates output even if the program contains compile-time errors. Use the
+    exit code to determine if compilation failed.
 '''.trim());
 }
 
diff --git a/pkg/compiler/lib/src/dart_backend/backend.dart b/pkg/compiler/lib/src/dart_backend/backend.dart
index 8498f24..18cfaae 100644
--- a/pkg/compiler/lib/src/dart_backend/backend.dart
+++ b/pkg/compiler/lib/src/dart_backend/backend.dart
@@ -49,6 +49,8 @@
   final Set<ClassElement> _userImplementedPlatformClasses =
       new Set<ClassElement>();
 
+  bool get canHandleCompilationFailed => false;
+
   /**
    * Tells whether it is safe to remove type declarations from variables,
    * functions parameters. It becomes not safe if:
diff --git a/pkg/compiler/lib/src/dart_backend/backend_ast_emitter.dart b/pkg/compiler/lib/src/dart_backend/backend_ast_emitter.dart
index 26a0fa5..01a9ae0 100644
--- a/pkg/compiler/lib/src/dart_backend/backend_ast_emitter.dart
+++ b/pkg/compiler/lib/src/dart_backend/backend_ast_emitter.dart
@@ -777,8 +777,12 @@
   }
 
   @override
-  Expression visitInvokeSuperMethod(tree.InvokeSuperMethod exp,
-                                    BuilderContext<Statement> context) {
+  Expression visitInvokeMethodDirectly(tree.InvokeMethodDirectly exp,
+                                       BuilderContext<Statement> context) {
+    // When targeting Dart, InvokeMethodDirectly is only used for super calls.
+    // The receiver is known to be `this`, and the target method is a method
+    // on the super class. So we just translate it as a method call with the
+    // super receiver.
     return emitMethodCall(exp, new SuperReceiver(), context);
   }
 
@@ -905,7 +909,7 @@
   visitCreateBox(tree.CreateBox node, arg) => errorUnsupportedNode(node);
 
   @override
-  visitCreateClosureClass(tree.CreateClosureClass node, arg) {
+  visitCreateInstance(tree.CreateInstance node, arg) {
     return errorUnsupportedNode(node);
   }
 
diff --git a/pkg/compiler/lib/src/dart_backend/placeholder_collector.dart b/pkg/compiler/lib/src/dart_backend/placeholder_collector.dart
index 60f3fe8..7b69462 100644
--- a/pkg/compiler/lib/src/dart_backend/placeholder_collector.dart
+++ b/pkg/compiler/lib/src/dart_backend/placeholder_collector.dart
@@ -469,7 +469,7 @@
     Element constructor = treeElements[send];
     assert(constructor != null);
     assert(send.receiver == null);
-    if (!Elements.isErroneousElement(constructor)) {
+    if (!Elements.isErroneous(constructor)) {
       tryMakeConstructorPlaceholder(node.send.selector, constructor);
       // TODO(smok): Should this be in visitNamedArgument?
       // Field names can be exposed as names of optional arguments, e.g.
@@ -510,7 +510,7 @@
 
   visitSendSet(SendSet send) {
     Element element = treeElements[send];
-    if (Elements.isErroneousElement(element)) {
+    if (Elements.isErroneous(element)) {
       // Complicated case: constructs like receiver.selector++ can resolve
       // to ErroneousElement.  Fortunately, receiver.selector still
       // can be resoved via treeElements[send.selector], that's all
diff --git a/pkg/compiler/lib/src/dart_backend/renamer.dart b/pkg/compiler/lib/src/dart_backend/renamer.dart
index 21bef08..f13af6f 100644
--- a/pkg/compiler/lib/src/dart_backend/renamer.dart
+++ b/pkg/compiler/lib/src/dart_backend/renamer.dart
@@ -135,7 +135,7 @@
 
   String _renameGlobal(Entity entity) {
     assert(entity is! Element ||
-           Elements.isErroneousElement(entity) ||
+           Elements.isErroneous(entity) ||
            Elements.isStaticOrTopLevel(entity) ||
            entity is TypeVariableElement);
     // TODO(smok): We may want to reuse class static field and method names.
diff --git a/pkg/compiler/lib/src/dart_types.dart b/pkg/compiler/lib/src/dart_types.dart
index db5d2b8..5a60a72 100644
--- a/pkg/compiler/lib/src/dart_types.dart
+++ b/pkg/compiler/lib/src/dart_types.dart
@@ -1479,8 +1479,9 @@
         return intersection.first;
       }
     }
-    invariant(CURRENT_ELEMENT_SPANNABLE, false,
-        message: 'No least upper bound computed for $a and $b.');
+
+    compiler.internalError(CURRENT_ELEMENT_SPANNABLE,
+        'No least upper bound computed for $a and $b.');
     return null;
   }
 
diff --git a/pkg/compiler/lib/src/elements/elements.dart b/pkg/compiler/lib/src/elements/elements.dart
index 9012b51..c676422 100644
--- a/pkg/compiler/lib/src/elements/elements.dart
+++ b/pkg/compiler/lib/src/elements/elements.dart
@@ -428,7 +428,7 @@
   static bool isUnresolved(Element e) {
     return e == null || e.isErroneous;
   }
-  static bool isErroneousElement(Element e) => e != null && e.isErroneous;
+  static bool isErroneous(Element e) => e != null && e.isErroneous;
 
   /// Unwraps [element] reporting any warnings attached to it, if any.
   static Element unwrap(Element element,
diff --git a/pkg/compiler/lib/src/elements/modelx.dart b/pkg/compiler/lib/src/elements/modelx.dart
index 903f205..0531a73 100644
--- a/pkg/compiler/lib/src/elements/modelx.dart
+++ b/pkg/compiler/lib/src/elements/modelx.dart
@@ -329,7 +329,9 @@
 }
 
 /// A constructor that was synthesized to recover from a compile-time error.
-class ErroneousConstructorElementX extends ErroneousElementX {
+class ErroneousConstructorElementX extends ErroneousElementX
+    with PatchMixin<FunctionElement>, AnalyzableElementX
+    implements ConstructorElementX {
   // TODO(ahe): Instead of subclassing [ErroneousElementX], this class should
   // be more like [ErroneousFieldElementX]. In particular, its kind should be
   // [ElementKind.GENERATIVE_CONSTRUCTOR], and it shouldn't throw as much.
@@ -340,6 +342,76 @@
       String name,
       Element enclosing)
       : super(messageKind, messageArguments, name, enclosing);
+
+  bool get isRedirectingFactory => false;
+
+  get definingElement {
+    throw new UnsupportedError("definingElement");
+  }
+
+  get asyncMarker {
+    throw new UnsupportedError("asyncMarker");
+  }
+
+  set asyncMarker(_) {
+    throw new UnsupportedError("asyncMarker=");
+  }
+
+  get internalEffectiveTarget {
+    throw new UnsupportedError("internalEffectiveTarget");
+  }
+
+  set internalEffectiveTarget(_) {
+    throw new UnsupportedError("internalEffectiveTarget=");
+  }
+
+  get effectiveTargetType {
+    throw new UnsupportedError("effectiveTargetType");
+  }
+
+  set effectiveTargetType(_) {
+    throw new UnsupportedError("effectiveTargetType=");
+  }
+
+  get typeCache {
+    throw new UnsupportedError("typeCache");
+  }
+
+  set typeCache(_) {
+    throw new UnsupportedError("typeCache=");
+  }
+
+  get immediateRedirectionTarget {
+    throw new UnsupportedError("immediateRedirectionTarget");
+  }
+
+  set immediateRedirectionTarget(_) {
+    throw new UnsupportedError("immediateRedirectionTarget=");
+  }
+
+  get functionSignatureCache {
+    throw new UnsupportedError("functionSignatureCache");
+  }
+
+  set functionSignatureCache(_) {
+    throw new UnsupportedError("functionSignatureCache=");
+  }
+
+  get nestedClosures {
+    throw new UnsupportedError("nestedClosures");
+  }
+
+  set nestedClosures(_) {
+    throw new UnsupportedError("nestedClosures=");
+  }
+
+  bool get hasNoBody => false;
+
+  bool get _hasNoBody => false;
+
+  void set effectiveTarget(_) {
+    throw new UnsupportedError("effectiveTarget=");
+  }
 }
 
 /// A message attached to a [WarnOnUseElementX].
@@ -441,6 +513,8 @@
   accept(ElementVisitor visitor) => visitor.visitAmbiguousElement(this);
 
   bool get isTopLevel => false;
+
+  DynamicType get type => const DynamicType();
 }
 
 /// Element synthesized to diagnose an ambiguous import.
@@ -479,6 +553,8 @@
       Element enclosingElement, Element existingElement, Element newElement)
       : super(messageKind, messageArguments, enclosingElement, existingElement,
               newElement);
+
+  bool get isErroneous => true;
 }
 
 class ScopeX {
@@ -756,6 +832,10 @@
     extends ElementX with AnalyzableElementX, PatchMixin<LibraryElementX>
     implements LibraryElement {
   final Uri canonicalUri;
+
+  /// True if the constructing script was synthesized.
+  final bool isSynthesized;
+
   CompilationUnitElement entryCompilationUnit;
   Link<CompilationUnitElement> compilationUnits =
       const Link<CompilationUnitElement>();
@@ -787,6 +867,7 @@
                   [Uri canonicalUri, LibraryElementX origin])
     : this.canonicalUri =
           ((canonicalUri == null) ? script.readableUri : canonicalUri),
+      this.isSynthesized = script.isSynthesized,
       super(script.name, ElementKind.LIBRARY, null) {
     entryCompilationUnit = new CompilationUnitElementX(script, this);
     if (origin != null) {
@@ -1834,7 +1915,7 @@
   }
 
   ConstructorElement get effectiveTarget {
-    if (Elements.isErroneousElement(immediateRedirectionTarget)) {
+    if (Elements.isErroneous(immediateRedirectionTarget)) {
       return immediateRedirectionTarget;
     }
     assert(!isRedirectingFactory || internalEffectiveTarget != null);
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
index 9d04cd1..e00b750 100644
--- a/pkg/compiler/lib/src/enqueue.dart
+++ b/pkg/compiler/lib/src/enqueue.dart
@@ -569,15 +569,6 @@
            !type.element.enclosingElement.isTypedef);
   }
 
-  /**
-   * If a factory constructor is used with type arguments, we lose track
-   * which arguments could be used to create instances of classes that use their
-   * type variables as expressions, so we have to remember if we saw such a use.
-   */
-  void registerFactoryWithTypeArguments(Registry registry) {
-    universe.usingFactoryWithTypeArguments = true;
-  }
-
   void registerCallMethodWithFreeTypeVariables(
       Element element,
       Registry registry) {
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart b/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart
index c2b3e41..6743561 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart
@@ -150,6 +150,13 @@
             ? null
             : new VariableScope<T>.deepCopyOf(other.parent);
 
+  VariableScope.topLevelCopyOf(VariableScope<T> other)
+      : variables = other.variables == null
+            ? null
+            : new Map<Local, T>.from(other.variables),
+        block = other.block,
+        parent = other.parent;
+
   T operator [](Local variable) {
     T result;
     if (variables == null || (result = variables[variable]) == null) {
@@ -401,6 +408,16 @@
         inferrer = other.inferrer,
         compiler = other.compiler;
 
+  LocalsHandler.topLevelCopyOf(LocalsHandler<T> other)
+      : locals = new VariableScope<T>.topLevelCopyOf(other.locals),
+        fieldScope = new FieldInitializationScope<T>.from(other.fieldScope),
+        captured = other.captured,
+        capturedAndBoxed = other.capturedAndBoxed,
+        tryBlock = other.tryBlock,
+        types = other.types,
+        inferrer = other.inferrer,
+        compiler = other.compiler;
+
   T use(Local local) {
     if (capturedAndBoxed.containsKey(local)) {
       return inferrer.typeOfElement(capturedAndBoxed[local]);
@@ -906,11 +923,26 @@
       LocalsHandler<T> saved = locals;
       locals = new LocalsHandler<T>.from(locals, node);
       updateIsChecks(isChecks, usePositive: true);
-      if (!oldAccumulateIsChecks) {
+      LocalsHandler<T> narrowed;
+      if (oldAccumulateIsChecks) {
+        narrowed = new LocalsHandler<T>.topLevelCopyOf(locals);
+      } else {
         accumulateIsChecks = false;
         isChecks = oldIsChecks;
       }
       visit(node.arguments.head);
+      if (oldAccumulateIsChecks) {
+
+        bool invalidatedInRightHandSide (Send test) {
+          Element receiver = elements[test.receiver];
+          if (receiver is LocalElement) {
+            return narrowed.locals[receiver] != locals.locals[receiver];
+          }
+          return false;
+        }
+
+        isChecks.removeWhere(invalidatedInRightHandSide);
+      }
       saved.mergeDiamondFlow(locals, null);
       locals = saved;
       return types.boolType;
diff --git a/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart b/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
index 7c7b867..0a3060e 100644
--- a/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
+++ b/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
@@ -855,7 +855,7 @@
       ArgumentsTypes operatorArguments = new ArgumentsTypes<T>([rhsType], null);
       T getterType;
       T newType;
-      if (Elements.isErroneousElement(element)) {
+      if (Elements.isErroneous(element)) {
         getterType = types.dynamicType;
         newType = types.dynamicType;
       } else if (Elements.isStaticOrTopLevelField(element)) {
@@ -904,7 +904,7 @@
                           T rhsType,
                           ast.Node rhs) {
     ArgumentsTypes arguments = new ArgumentsTypes<T>([rhsType], null);
-    if (Elements.isErroneousElement(element)) {
+    if (Elements.isErroneous(element)) {
       // Code will always throw.
     } else if (Elements.isStaticOrTopLevelField(element)) {
       handleStaticSend(node, setterSelector, element, arguments);
@@ -1123,7 +1123,7 @@
       return visitDynamicSend(node);
     } else if (Elements.isStaticOrTopLevelFunction(element)) {
       return handleStaticSend(node, selector, element, null);
-    } else if (Elements.isErroneousElement(element)) {
+    } else if (Elements.isErroneous(element)) {
       return types.dynamicType;
     } else if (element.isLocal) {
       LocalElement local = element;
@@ -1282,7 +1282,7 @@
   }
   T visitRedirectingFactoryBody(ast.RedirectingFactoryBody node) {
     Element element = elements.getRedirectingTargetConstructor(node);
-    if (Elements.isErroneousElement(element)) {
+    if (Elements.isErroneous(element)) {
       recordReturnType(types.dynamicType);
     } else {
       // We don't create a selector for redirecting factories, and
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
index bea6f60..36aee09 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
@@ -857,19 +857,32 @@
         ? compiler.world.allFunctions.filter(typedSelector)
         : targets;
 
+    // Add calls to new targets to the graph.
+    targets.where((target) => !oldTargets.contains(target)).forEach((element) {
+      MemberTypeInformation callee =
+          inferrer.types.getInferredTypeOf(element);
+      callee.addCall(caller, call);
+      callee.addUser(this);
+      inferrer.updateParameterAssignments(
+          this, element, arguments, typedSelector, remove: false,
+          addToQueue: true);
+    });
+
+    // Walk over the old targets, and remove calls that cannot happen
+    // anymore.
+    oldTargets.where((target) => !targets.contains(target)).forEach((element) {
+      MemberTypeInformation callee =
+          inferrer.types.getInferredTypeOf(element);
+      callee.removeCall(caller, call);
+      callee.removeUser(this);
+      inferrer.updateParameterAssignments(
+          this, element, arguments, typedSelector, remove: true,
+          addToQueue: true);
+    });
+
     // Walk over the found targets, and compute the joined union type mask
     // for all these targets.
-    TypeMask newType = inferrer.types.joinTypeMasks(targets.map((element) {
-      if (!oldTargets.contains(element)) {
-        MemberTypeInformation callee =
-            inferrer.types.getInferredTypeOf(element);
-        callee.addCall(caller, call);
-        callee.addUser(this);
-        inferrer.updateParameterAssignments(
-            this, element, arguments, typedSelector, remove: false,
-            addToQueue: true);
-      }
-
+    return inferrer.types.joinTypeMasks(targets.map((element) {
       // If [canReachAll] is true, then we are iterating over all
       // targets that satisfy the untyped selector. We skip the return
       // type of the targets that can only be reached through
@@ -914,22 +927,6 @@
         return inferrer.typeOfElementWithSelector(element, typedSelector).type;
       }
     }));
-
-    // Walk over the old targets, and remove calls that cannot happen
-    // anymore.
-    oldTargets.forEach((element) {
-      if (!targets.contains(element)) {
-        MemberTypeInformation callee =
-            inferrer.types.getInferredTypeOf(element);
-        callee.removeCall(caller, call);
-        callee.removeUser(this);
-        inferrer.updateParameterAssignments(
-            this, element, arguments, typedSelector, remove: true,
-            addToQueue: true);
-      }
-    });
-
-    return newType;
   }
 
   void giveUp(TypeGraphInferrerEngine inferrer, {bool clearAssignments: true}) {
diff --git a/pkg/compiler/lib/src/js/builder.dart b/pkg/compiler/lib/src/js/builder.dart
index c79d537..3eeca5e 100644
--- a/pkg/compiler/lib/src/js/builder.dart
+++ b/pkg/compiler/lib/src/js/builder.dart
@@ -516,10 +516,11 @@
       '*': 5, '/': 5, '%': 5
   };
   static final UNARY_OPERATORS =
-      ['++', '--', '+', '-', '~', '!', 'typeof', 'void', 'delete'].toSet();
+      ['++', '--', '+', '-', '~', '!', 'typeof', 'void', 'delete', 'await']
+        .toSet();
 
   static final OPERATORS_THAT_LOOK_LIKE_IDENTIFIERS =
-      ['typeof', 'void', 'delete', 'in', 'instanceof'].toSet();
+      ['typeof', 'void', 'delete', 'in', 'instanceof', 'await'].toSet();
 
   static int category(int code) {
     if (code >= CATEGORIES.length) return OTHER;
@@ -793,10 +794,22 @@
         break;
       }
     }
-
+    AsyncModifier asyncModifier;
+    if (acceptString('async')) {
+      if (acceptString('*')) {
+        asyncModifier = const AsyncModifier.asyncStar();
+      } else {
+        asyncModifier = const AsyncModifier.async();
+      }
+    } else if (acceptString('sync')) {
+      if (!acceptString('*')) error("Only sync* is valid - sync is implied");
+      asyncModifier = const AsyncModifier.syncStar();
+    } else {
+      asyncModifier = const AsyncModifier.sync();
+    }
     expectCategory(LBRACE);
     Block block = parseBlock();
-    return new Fun(params, block);
+    return new Fun(params, block, asyncModifier: asyncModifier);
   }
 
   Expression parseObjectInitializer() {
@@ -918,7 +931,8 @@
   Expression parseUnaryHigh() {
     String operator = lastToken;
     if (lastCategory == SYMBOL && UNARY_OPERATORS.contains(operator) &&
-        (acceptString("++") || acceptString("--"))) {
+        (acceptString("++") || acceptString("--") || acceptString('await'))) {
+      if (operator == "await") return new Await(parsePostfix());
       return new Prefix(operator, parsePostfix());
     }
     return parsePostfix();
@@ -929,6 +943,7 @@
     if (lastCategory == SYMBOL && UNARY_OPERATORS.contains(operator) &&
         operator != "++" && operator != "--") {
       expectCategory(SYMBOL);
+      if (operator == "await") return new Await(parsePostfix());
       return new Prefix(operator, parseUnaryLow());
     }
     return parseUnaryHigh();
@@ -1091,21 +1106,29 @@
         return new ExpressionStatement(declarations);
       }
 
-      if (lastToken == 'case' ||
-          lastToken == 'do' ||
-          lastToken == 'while' ||
-          lastToken == 'switch' ||
-          lastToken == 'with') {
+      if (acceptString('while')) return parseWhile();
+
+      if (acceptString('do')) return parseDo();
+
+      if (acceptString('switch')) return parseSwitch();
+
+      if (lastToken == 'case') error("Case outside switch.");
+
+      if (lastToken == 'default') error("Default outside switch.");
+
+      if (lastToken == 'with') {
         error('Not implemented in mini parser');
       }
     }
 
-
-    // TODO:  label: statement
-
     bool checkForInterpolatedStatement = lastCategory == HASH;
 
     Expression expression = parseExpression();
+
+    if (expression is VariableUse && acceptCategory(COLON)) {
+      return new LabeledStatement(expression.name, parseStatement());
+    }
+
     expectSemicolon();
 
     if (checkForInterpolatedStatement) {
@@ -1235,6 +1258,60 @@
     return new Try(body, catchPart, finallyPart);
   }
 
+  SwitchClause parseSwitchClause() {
+    Expression expression = null;
+    if (acceptString('case')) {
+      expression = parseExpression();
+      expectCategory(COLON);
+    } else {
+      if (!acceptString('default')) {
+        error('expected case or default');
+      }
+      expectCategory(COLON);
+    }
+    List statements = new List<Statement>();
+    while (lastCategory != RBRACE &&
+           lastToken != 'case' &&
+           lastToken != 'default') {
+      statements.add(parseStatement());
+    }
+    return expression == null
+        ? new Default(new Block(statements))
+        : new Case(expression, new Block(statements));
+  }
+
+  Statement parseWhile() {
+    expectCategory(LPAREN);
+    Expression condition = parseExpression();
+    expectCategory(RPAREN);
+    Statement body = parseStatement();
+    return new While(condition, body);
+  }
+
+  Statement parseDo() {
+    Statement body = parseStatement();
+    if (lastToken != "while") error("Missing while after do body.");
+    getToken();
+    expectCategory(LPAREN);
+    Expression condition = parseExpression();
+    expectCategory(RPAREN);
+    expectSemicolon();
+    return new Do(body, condition);
+  }
+
+  Statement parseSwitch() {
+    expectCategory(LPAREN);
+    Expression key = parseExpression();
+    expectCategory(RPAREN);
+    expectCategory(LBRACE);
+    List<SwitchClause> clauses = new List<SwitchClause>();
+    while(lastCategory != RBRACE) {
+      clauses.add(parseSwitchClause());
+    }
+    expectCategory(RBRACE);
+    return new Switch(key, clauses);
+  }
+
   Catch parseCatch() {
     expectCategory(LPAREN);
     String identifier = lastToken;
diff --git a/pkg/compiler/lib/src/js/nodes.dart b/pkg/compiler/lib/src/js/nodes.dart
index d5c574e..e5b57f6 100644
--- a/pkg/compiler/lib/src/js/nodes.dart
+++ b/pkg/compiler/lib/src/js/nodes.dart
@@ -60,6 +60,8 @@
   T visitProperty(Property node);
   T visitRegExpLiteral(RegExpLiteral node);
 
+  T visitAwait(Await node);
+
   T visitComment(Comment node);
 
   T visitInterpolatedExpression(InterpolatedExpression node);
@@ -165,6 +167,8 @@
 
   // Ignore comments by default.
   T visitComment(Comment node) => null;
+
+  T visitAwait(Await node) => visitExpression(node);
 }
 
 abstract class Node {
@@ -847,8 +851,9 @@
 class Fun extends Expression {
   final List<Parameter> params;
   final Block body;
+  final AsyncModifier asyncModifier;
 
-  Fun(this.params, this.body);
+  Fun(this.params, this.body, {this.asyncModifier: const AsyncModifier.sync()});
 
   accept(NodeVisitor visitor) => visitor.visitFun(this);
 
@@ -862,6 +867,16 @@
   int get precedenceLevel => CALL;
 }
 
+class AsyncModifier {
+  final bool isAsync;
+  final bool isYielding;
+
+  const AsyncModifier.sync() : isAsync = false, isYielding = false;
+  const AsyncModifier.async() : isAsync = true, isYielding = false;
+  const AsyncModifier.asyncStar() : isAsync = true, isYielding = true;
+  const AsyncModifier.syncStar() : isAsync = false, isYielding = true;
+}
+
 class PropertyAccess extends Expression {
   final Expression receiver;
   final Expression selector;
@@ -1091,6 +1106,25 @@
 }
 
 /**
+ * An asynchronous await.
+ *
+ * Not part of javascript. We desugar this expression before outputting.
+ * Should only occur in a [Fun] with `asyncModifier` async or asyncStar.
+ */
+class Await extends Expression {
+  /** The awaited expression. */
+  final Expression expression;
+
+  Await(this.expression);
+
+  int get precedenceLevel => UNARY;
+  accept(NodeVisitor visitor) => visitor.visitAwait(this);
+  void visitChildren(NodeVisitor visitor) => expression.accept(visitor);
+  Await _clone() => new Await(expression);
+
+}
+
+/**
  * A comment.
  *
  * Extends [Statement] so we can add comments before statements in
diff --git a/pkg/compiler/lib/src/js/printer.dart b/pkg/compiler/lib/src/js/printer.dart
index 1e43895..19d6c3f 100644
--- a/pkg/compiler/lib/src/js/printer.dart
+++ b/pkg/compiler/lib/src/js/printer.dart
@@ -6,7 +6,7 @@
 
 class Printer extends Indentation implements NodeVisitor {
   final bool shouldCompressOutput;
-  leg.Compiler compiler;
+  leg.DiagnosticListener diagnosticListener;
   CodeBuffer outBuffer;
   bool inForInit = false;
   bool atStatementBegin = false;
@@ -19,14 +19,14 @@
   static final identifierCharacterRegExp = new RegExp(r'^[a-zA-Z_0-9$]');
   static final expressionContinuationRegExp = new RegExp(r'^[-+([]');
 
-  Printer(leg.Compiler compiler, DumpInfoTask monitor,
-          { allowVariableMinification: true })
-      : shouldCompressOutput = compiler.enableMinification,
+  Printer(leg.DiagnosticListener diagnosticListener, DumpInfoTask monitor,
+          { bool enableMinification: false, allowVariableMinification: true })
+      : shouldCompressOutput = enableMinification,
         monitor = monitor,
-        this.compiler = compiler,
+        diagnosticListener = diagnosticListener,
         outBuffer = new CodeBuffer(),
-        danglingElseVisitor = new DanglingElseVisitor(compiler),
-        localNamer = determineRenamer(compiler.enableMinification,
+        danglingElseVisitor = new DanglingElseVisitor(diagnosticListener),
+        localNamer = determineRenamer(enableMinification,
                                       allowVariableMinification);
 
   static LocalNamer determineRenamer(bool shouldCompressOutput,
@@ -440,6 +440,19 @@
                           newInForInit: false, newAtStatementBegin: false);
     }
     out(")");
+    switch (fun.asyncModifier) {
+      case const AsyncModifier.sync():
+        break;
+      case const AsyncModifier.async():
+        out(' async');
+        break;
+      case const AsyncModifier.syncStar():
+        out(' sync*');
+        break;
+      case const AsyncModifier.asyncStar():
+        out(' async*');
+        break;
+    }
     blockBody(fun.body, needsSeparation: false, needsNewline: false);
     localNamer.leaveScope();
   }
@@ -620,7 +633,8 @@
         rightPrecedenceRequirement = UNARY;
         break;
       default:
-        compiler.internalError(NO_LOCATION_SPANNABLE, "Forgot operator: $op");
+        diagnosticListener
+            .internalError(NO_LOCATION_SPANNABLE, "Forgot operator: $op");
     }
 
     visitNestedExpression(left, leftPrecedenceRequirement,
@@ -857,7 +871,7 @@
     List<String> parts = template.split('#');
     int inputsLength = inputs == null ? 0 : inputs.length;
     if (parts.length != inputsLength + 1) {
-      compiler.internalError(NO_LOCATION_SPANNABLE,
+      diagnosticListener.internalError(NO_LOCATION_SPANNABLE,
           'Wrong number of arguments for JS: $template');
     }
     // Code that uses JS must take care of operator precedences, and
@@ -905,6 +919,11 @@
       }
     }
   }
+
+  void visitAwait(Await node) {
+    out("await ");
+    visit(node.expression);
+  }
 }
 
 
@@ -980,14 +999,15 @@
  * as then-statement in an [If] that has an else branch.
  */
 class DanglingElseVisitor extends BaseVisitor<bool> {
-  leg.Compiler compiler;
+  leg.DiagnosticListener diagnosticListener;
 
-  DanglingElseVisitor(this.compiler);
+  DanglingElseVisitor(this.diagnosticListener);
 
   bool visitProgram(Program node) => false;
 
   bool visitNode(Statement node) {
-    compiler.internalError(NO_LOCATION_SPANNABLE, "Forgot node: $node");
+    diagnosticListener
+        .internalError(NO_LOCATION_SPANNABLE, "Forgot node: $node");
     return null;
   }
 
@@ -1031,6 +1051,7 @@
                         bool allowVariableMinification: true}) {
   Printer printer =
       new Printer(compiler, monitor,
+                  enableMinification: compiler.enableMinification,
                   allowVariableMinification: allowVariableMinification);
   printer.visit(node);
   return printer.outBuffer;
diff --git a/pkg/compiler/lib/src/js/template.dart b/pkg/compiler/lib/src/js/template.dart
index 6237adc..ce57d09 100644
--- a/pkg/compiler/lib/src/js/template.dart
+++ b/pkg/compiler/lib/src/js/template.dart
@@ -88,7 +88,7 @@
     instantiator = generator.compile(ast);
     positionalArgumentCount = generator.analysis.count;
     Set<String> names = generator.analysis.holeNames;
-    holeNames = names.isEmpty ? null : names.toList(growable:false);
+    holeNames = names.toList(growable:false);
   }
 
   /// Instantiates the template with the given [arguments].
@@ -408,8 +408,21 @@
     throw new UnimplementedError('$this.$name');
   }
 
-  Instantiator visitWhile(While node) => TODO('visitWhile');
-  Instantiator visitDo(Do node) => TODO('visitDo');
+  Instantiator visitWhile(While node) {
+    Instantiator makeCondition = visit(node.condition);
+    Instantiator makeBody = visit(node.body);
+    return (arguments) {
+      return new While(makeCondition(arguments), makeBody(arguments));
+    };
+  }
+
+  Instantiator visitDo(Do node) {
+    Instantiator makeBody = visit(node.body);
+    Instantiator makeCondition = visit(node.condition);
+    return (arguments) {
+      return new Do(makeBody(arguments), makeCondition(arguments));
+    };
+  }
 
   Instantiator visitContinue(Continue node) =>
       (arguments) => new Continue(node.targetLabel);
@@ -427,7 +440,6 @@
     return (arguments) => new Throw(makeExpression(arguments));
   }
 
-
   Instantiator visitTry(Try node) {
     Instantiator makeBody = visit(node.body);
     Instantiator makeCatch = visitNullable(node.catchPart);
@@ -443,9 +455,30 @@
         makeDeclaration(arguments), makeBody(arguments));
   }
 
-  Instantiator visitSwitch(Switch node) => TODO('visitSwitch');
-  Instantiator visitCase(Case node) => TODO('visitCase');
-  Instantiator visitDefault(Default node) => TODO('visitDefault');
+  Instantiator visitSwitch(Switch node) {
+    Instantiator makeKey = visit(node.key);
+    Iterable<Instantiator> makeCases = node.cases.map(visit);
+    return (arguments) {
+      return new Switch(makeKey(arguments),
+          makeCases.map((Instantiator makeCase) => makeCase(arguments))
+                   .toList());
+    };
+  }
+
+  Instantiator visitCase(Case node) {
+    Instantiator makeExpression = visit(node.expression);
+    Instantiator makeBody = visit(node.body);
+    return (arguments) {
+      return new Case(makeExpression(arguments), makeBody(arguments));
+    };
+  }
+
+  Instantiator visitDefault(Default node) {
+    Instantiator makeBody = visit(node.body);
+    return (arguments) {
+      return new Default(makeBody(arguments));
+    };
+  }
 
   Instantiator visitFunctionDeclaration(FunctionDeclaration node) {
     Instantiator makeName = visit(node.name);
@@ -658,6 +691,13 @@
       (arguments) => new RegExpLiteral(node.pattern);
 
   Instantiator visitComment(Comment node) => TODO('visitComment');
+
+  Instantiator visitAwait(Await node) {
+    Instantiator makeExpression = visit(node.expression);
+    return (arguments) {
+      return new Await(makeExpression(arguments));
+    };
+  }
 }
 
 /**
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index d57e9a2..975581c 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -441,6 +441,8 @@
 
   PatchResolverTask patchResolverTask;
 
+  bool get canHandleCompilationFailed => true;
+
   JavaScriptBackend(Compiler compiler, bool generateSourceMap)
       : namer = determineNamer(compiler),
         oneShotInterceptors = new Map<String, Selector>(),
@@ -1200,6 +1202,11 @@
 
   void codegen(CodegenWorkItem work) {
     Element element = work.element;
+    if (compiler.elementHasCompileTimeError(element)) {
+      generatedCode[element] = jsAst.js(
+          "function () { throw new Error('Compile time error in $element') }");
+      return;
+    }
     var kind = element.kind;
     if (kind == ElementKind.TYPEDEF) return;
     if (element.isConstructor && element.enclosingClass == jsNullClass) {
@@ -1465,6 +1472,16 @@
         element == jsFixedArrayClass;
   }
 
+  bool mayGenerateInstanceofCheck(DartType type) {
+    // We can use an instanceof check for raw types that have no subclass that
+    // is mixed-in or in an implements clause.
+
+    if (!type.isRaw) return false;
+    ClassElement classElement = type.element;
+    if (isInterceptorClass(classElement)) return false;
+    return compiler.world.hasOnlySubclasses(classElement);
+  }
+
   Element getExceptionUnwrapper() {
     return findHelper('unwrapException');
   }
diff --git a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
index cf32d70..d97abb4 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
@@ -181,6 +181,7 @@
   @override
   js.Expression visitInvokeConstructor(tree_ir.InvokeConstructor node) {
     if (node.constant != null) return giveup(node);
+    registry.registerInstantiatedClass(node.target.enclosingClass);
     return buildStaticInvoke(node.selector,
                              node.target,
                              visitArguments(node.arguments));
@@ -213,9 +214,22 @@
   }
 
   @override
-  js.Expression visitInvokeSuperMethod(tree_ir.InvokeSuperMethod node) {
-    return giveup(node);
-    // TODO: implement visitInvokeSuperMethod
+  js.Expression visitInvokeMethodDirectly(tree_ir.InvokeMethodDirectly node) {
+    registry.registerDirectInvocation(node.target.declaration);
+    if (node.target is ConstructorBodyElement) {
+      // A constructor body cannot be overriden or intercepted, so we can
+      // use the short form for this invocation.
+      // TODO(asgerf): prevent name clash between constructor bodies.
+      return js.js('#.#(#)',
+          [visitExpression(node.receiver),
+           glue.instanceMethodName(node.target),
+           visitArguments(node.arguments)]);
+    }
+    return js.js('#.#.call(#, #)',
+        [glue.prototypeAccess(node.target.enclosingClass),
+         glue.invocationName(node.selector),
+         visitExpression(node.receiver),
+         visitArguments(node.arguments)]);
   }
 
   @override
@@ -430,9 +444,9 @@
   }
 
   @override
-  js.Expression visitCreateClosureClass(tree_ir.CreateClosureClass node) {
+  js.Expression visitCreateInstance(tree_ir.CreateInstance node) {
     registry.registerInstantiatedClass(node.classElement);
-    return new js.New(glue.closureClassConstructorAccess(node.classElement),
+    return new js.New(glue.constructorAccess(node.classElement),
                       node.arguments.map(visitExpression).toList());
   }
 
diff --git a/pkg/compiler/lib/src/js_backend/codegen/glue.dart b/pkg/compiler/lib/src/js_backend/codegen/glue.dart
index bac9e33..11f6494 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/glue.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/glue.dart
@@ -73,6 +73,10 @@
     return _backend.isInterceptedSelector(selector);
   }
 
+  bool isInterceptedMethod(Element element) {
+    return _backend.isInterceptedMethod(element);
+  }
+
   Set<ClassElement> getInterceptedClassesOn(Selector selector) {
     return _backend.getInterceptedClassesOn(selector.name);
   }
@@ -81,12 +85,22 @@
     _backend.registerSpecializedGetInterceptor(classes);
   }
 
-  js.Expression closureClassConstructorAccess(ClosureClassElement element) {
-    return _backend.emitter.closureClassConstructorAccess(element);
+  js.Expression constructorAccess(ClassElement element) {
+    return _backend.emitter.constructorAccess(element);
   }
 
   String instanceFieldPropertyName(Element field) {
     return _namer.instanceFieldPropertyName(field);
   }
 
+  String instanceMethodName(FunctionElement element) {
+    return _namer.instanceMethodName(element);
+  }
+
+  js.Expression prototypeAccess(ClassElement e,
+                                {bool hasBeenInstantiated: false}) {
+    return _emitter.prototypeAccess(e,
+        hasBeenInstantiated: hasBeenInstantiated);
+  }
+
 }
diff --git a/pkg/compiler/lib/src/js_backend/codegen/js_tree_builder.dart b/pkg/compiler/lib/src/js_backend/codegen/js_tree_builder.dart
index b21bb5e..9b8ed20 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/js_tree_builder.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/js_tree_builder.dart
@@ -64,8 +64,8 @@
     return new CreateBox();
   }
 
-  Expression visitCreateClosureClass(cps_ir.CreateClosureClass node) {
-    return new CreateClosureClass(
+  Expression visitCreateInstance(cps_ir.CreateInstance node) {
+    return new CreateInstance(
         node.classElement,
         node.arguments.map(getVariableReference).toList());
   }
diff --git a/pkg/compiler/lib/src/js_backend/codegen/task.dart b/pkg/compiler/lib/src/js_backend/codegen/task.dart
index 0068a21..69be520 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/task.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/task.dart
@@ -96,8 +96,7 @@
 
   cps.FunctionDefinition compileToCpsIR(AstElement element) {
     // TODO(sigurdm): Support these constructs.
-    if (element.isGenerativeConstructorBody ||
-        element.isNative ||
+    if (element.isNative ||
         element.isField) {
       giveUp('unsupported element kind: ${element.name}:${element.kind}');
     }
diff --git a/pkg/compiler/lib/src/js_backend/codegen/unsugar.dart b/pkg/compiler/lib/src/js_backend/codegen/unsugar.dart
index 41eeb38..4433c6f 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/unsugar.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/unsugar.dart
@@ -6,7 +6,7 @@
 import '../../cps_ir/optimizers.dart';
 import '../../constants/expressions.dart';
 import '../../constants/values.dart';
-import '../../elements/elements.dart' show ClassElement;
+import '../../elements/elements.dart' show ClassElement, FieldElement;
 import '../../js_backend/codegen/glue.dart';
 import '../../dart2jslib.dart' show Selector;
 
@@ -38,6 +38,15 @@
             new TrueConstantValue()));
   }
 
+  void insertLetPrim(Primitive primitive, Expression node) {
+    LetPrim let = new LetPrim(primitive);
+    InteriorNode parent = node.parent;
+    parent.body = let;
+    let.body = node;
+    node.parent = let;
+    let.parent = parent;
+  }
+
   processInvokeMethod(InvokeMethod node) {
     Selector selector = node.selector;
     if (!_glue.isInterceptedSelector(selector)) return;
@@ -50,23 +59,26 @@
     Set<ClassElement> interceptedClasses =
         _glue.getInterceptedClassesOn(selector);
     _glue.registerSpecializedGetInterceptor(interceptedClasses);
-    InteriorNode parent = node.parent;
+
     Primitive receiver = node.receiver.definition;
     Primitive intercepted = new Interceptor(receiver, interceptedClasses);
-    List<Reference<Primitive>> arguments =
-        new List<Reference<Primitive>>.generate(node.arguments.length + 1,
-        (int index) {
-          return index == 0 ? new Reference<Primitive>(receiver)
-                            : node.arguments[index - 1];
-    });
-    LetPrim newNode = new LetPrim(intercepted,
-        new InvokeMethod.internal(new Reference<Primitive>(intercepted),
-            selector,
-            new Reference<Continuation>(node.continuation.definition),
-            arguments));
-    node.continuation.unlink();
-    node.receiver.unlink();
-    parent.body = newNode;
+    insertLetPrim(intercepted, node);
+    node.arguments.insert(0, node.receiver);
+    node.receiver = new Reference<Primitive>(intercepted);
+  }
+
+  Primitive makeNull() {
+    NullConstantValue nullConst = new NullConstantValue();
+    return new Constant(new PrimitiveConstantExpression(nullConst));
+  }
+
+  processInvokeMethodDirectly(InvokeMethodDirectly node) {
+    if (_glue.isInterceptedMethod(node.target)) {
+      Primitive nullPrim = makeNull();
+      insertLetPrim(nullPrim, node);
+      node.arguments.insert(0, node.receiver);
+      node.receiver = new Reference<Primitive>(nullPrim);
+    }
   }
 
   processBranch(Branch node) {
diff --git a/pkg/compiler/lib/src/js_backend/js_backend.dart b/pkg/compiler/lib/src/js_backend/js_backend.dart
index e621f38..20e3840 100644
--- a/pkg/compiler/lib/src/js_backend/js_backend.dart
+++ b/pkg/compiler/lib/src/js_backend/js_backend.dart
@@ -5,7 +5,6 @@
 library js_backend;
 
 import 'dart:async' show EventSink, Future;
-import 'dart:collection' show Queue, LinkedHashMap, LinkedHashSet;
 
 import 'package:_internal/compiler/js_lib/shared/embedded_names.dart'
     as embeddedNames;
@@ -34,7 +33,6 @@
     ElementVisitor;
 import '../js_backend/codegen/task.dart';
 import 'patch_resolver.dart';
-import '../deferred_load.dart';
 
 part 'backend.dart';
 part 'checked_mode_helpers.dart';
@@ -44,6 +42,5 @@
 part 'custom_elements_analysis.dart';
 part 'minify_namer.dart';
 part 'namer.dart';
-part 'native_emitter.dart';
 part 'runtime_types.dart';
 part 'type_variable_handler.dart';
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index c87708c..7508513 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -993,7 +993,7 @@
     }
   }
 
-  String get incrementalHelperName => r'$dart_unsafe_eval';
+  String get incrementalHelperName => r'$dart_unsafe_incremental_support';
 
   jsAst.Expression get accessIncrementalHelper {
     assert(compiler.hasIncrementalSupport);
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index bf008f1..f8aa7b1 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -32,6 +32,9 @@
 
   JavaScriptBackend get backend => compiler.backend;
 
+  String get getFunctionThatReturnsNullName
+      => backend.namer.getMappedInstanceName('functionThatReturnsNull');
+
   RuntimeTypes(Compiler compiler)
       : this.compiler = compiler,
         representationGenerator = new TypeRepresentationGenerator(compiler),
@@ -60,7 +63,10 @@
     checkedBounds.add(bound);
   }
 
-  bool usingFactoryWithTypeArguments = false;
+  // TODO(21969): remove this and analyze instantiated types and factory calls
+  // instead to find out which types are instantiated, if finitely many, or if
+  // we have to use the more imprecise generic algorithm.
+  bool get cannotDetermineInstantiatedTypesPrecisely => true;
 
   /**
    * Compute type arguments of classes that use one of their type variables in
@@ -77,7 +83,7 @@
     // nothing to do.
     if (classesUsingChecks.isEmpty) return;
     Set<DartType> instantiatedTypes = universe.instantiatedTypes;
-    if (universe.usingFactoryWithTypeArguments) {
+    if (cannotDetermineInstantiatedTypesPrecisely) {
       for (DartType type in instantiatedTypes) {
         if (type.kind != TypeKind.INTERFACE) continue;
         InterfaceType interface = type;
@@ -855,6 +861,7 @@
  * of the representation consult the documentation of
  * [getSupertypeSubstitution].
  */
+//TODO(floitsch): Remove support for non-function substitutions.
 class Substitution {
   final bool isFunction;
   final List<DartType> arguments;
@@ -878,13 +885,38 @@
           rti.backend.namer.safeVariableName(variable.name));
     }
 
-    jsAst.Expression value =
-        rti.getSubstitutionRepresentation(arguments, use);
-    if (isFunction) {
+    if (arguments.every((DartType type) => type.isDynamic)) {
+      return rti.backend.emitter.emitter.generateFunctionThatReturnsNull();
+    } else {
+      jsAst.Expression value =
+          rti.getSubstitutionRepresentation(arguments, use);
+      if (isFunction) {
+        Iterable<jsAst.Expression> formals = parameters.map(declaration);
+        return js('function(#) { return # }', [formals, value]);
+      } else {
+        return js('function() { return # }', value);
+      }
+    }
+  }
+
+  jsAst.Expression getCodeForVariable(int index, RuntimeTypes rti) {
+    jsAst.Expression declaration(TypeVariableType variable) {
+      return new jsAst.Parameter(
+          rti.backend.namer.safeVariableName(variable.name));
+    }
+
+    jsAst.Expression use(TypeVariableType variable) {
+      return new jsAst.VariableUse(
+          rti.backend.namer.safeVariableName(variable.name));
+    }
+
+    if (arguments[index].isDynamic) {
+      return rti.backend.emitter.emitter.generateFunctionThatReturnsNull();
+    } else {
+      jsAst.Expression value =
+          rti.getTypeRepresentation(arguments[index], use);
       Iterable<jsAst.Expression> formals = parameters.map(declaration);
       return js('function(#) { return # }', [formals, value]);
-    } else {
-      return js('function() { return # }', value);
     }
   }
 }
diff --git a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
index f2f48ca..d7e1578 100644
--- a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
@@ -40,4 +40,75 @@
     return js('function(#, v) { return #.# = v; }',
         [args, receiver, fieldName]);
   }
+
+  /**
+   * Documentation wanted -- johnniwinther
+   *
+   * Invariant: [member] must be a declaration element.
+   */
+  Map<String, jsAst.Expression> generateCallStubsForGetter(
+      Element member, Set<Selector> selectors) {
+    assert(invariant(member, member.isDeclaration));
+
+    // If the method is intercepted, the stub gets the
+    // receiver explicitely and we need to pass it to the getter call.
+    bool isInterceptedMethod = backend.isInterceptedMethod(member);
+    bool isInterceptorClass =
+        backend.isInterceptorClass(member.enclosingClass);
+
+    const String receiverArgumentName = r'$receiver';
+
+    jsAst.Expression buildGetter() {
+      jsAst.Expression receiver =
+          js(isInterceptorClass ? receiverArgumentName : 'this');
+      if (member.isGetter) {
+        String getterName = namer.getterName(member);
+        if (isInterceptedMethod) {
+          return js('this.#(#)', [getterName, receiver]);
+        }
+        return js('#.#()', [receiver, getterName]);
+      } else {
+        String fieldName = namer.instanceFieldPropertyName(member);
+        return js('#.#', [receiver, fieldName]);
+      }
+    }
+
+    Map<String, jsAst.Expression> generatedStubs = <String, jsAst.Expression>{};
+
+    // Two selectors may match but differ only in type.  To avoid generating
+    // identical stubs for each we track untyped selectors which already have
+    // stubs.
+    Set<Selector> generatedSelectors = new Set<Selector>();
+    for (Selector selector in selectors) {
+      if (selector.applies(member, compiler.world)) {
+        selector = selector.asUntyped;
+        if (generatedSelectors.contains(selector)) continue;
+        generatedSelectors.add(selector);
+
+        String invocationName = namer.invocationName(selector);
+        Selector callSelector = new Selector.callClosureFrom(selector);
+        String closureCallName = namer.invocationName(callSelector);
+
+        List<jsAst.Parameter> parameters = <jsAst.Parameter>[];
+        List<jsAst.Expression> arguments = <jsAst.Expression>[];
+        if (isInterceptedMethod) {
+          parameters.add(new jsAst.Parameter(receiverArgumentName));
+        }
+
+        for (int i = 0; i < selector.argumentCount; i++) {
+          String name = 'arg$i';
+          parameters.add(new jsAst.Parameter(name));
+          arguments.add(js('#', name));
+        }
+
+        jsAst.Fun function = js(
+            'function(#) { return #.#(#); }',
+            [ parameters, buildGetter(), closureCallName, arguments]);
+
+        generatedStubs[invocationName] = function;
+      }
+    }
+
+    return generatedStubs;
+  }
 }
diff --git a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
index db34000..e7d9421 100644
--- a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
+++ b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
@@ -120,15 +120,11 @@
     return emitter.typeAccess(e);
   }
 
-  jsAst.Expression closureClassConstructorAccess(ClosureClassElement e) {
-    return emitter.closureClassConstructorAccess(e);
-  }
-
   void registerReadTypeVariable(TypeVariableElement element) {
     readTypeVariables.add(element);
   }
 
-  Set<ClassElement> interceptorsReferencedFromConstants() {
+  Set<ClassElement> computeInterceptorsReferencedFromConstants() {
     Set<ClassElement> classes = new Set<ClassElement>();
     JavaScriptConstantCompiler handler = backend.constants;
     List<ConstantValue> constants = handler.getConstantsForEmission();
@@ -163,7 +159,7 @@
     );
 
     // Add interceptors referenced by constants.
-    needed.addAll(interceptorsReferencedFromConstants());
+    needed.addAll(computeInterceptorsReferencedFromConstants());
 
     // Add unneeded interceptors to the [unneededClasses] set.
     for (ClassElement interceptor in backend.interceptedClasses) {
@@ -415,18 +411,16 @@
 
       computeAllNeededEntities();
 
-      Program program;
-      if (USE_NEW_EMITTER) {
-        program = new ProgramBuilder(compiler, namer, this).buildProgram();
-      }
-      return emitter.emitProgram(program);
+      ProgramBuilder programBuilder = new ProgramBuilder(compiler, namer, this);
+      return emitter.emitProgram(programBuilder);
     });
   }
 }
 
 abstract class Emitter {
-  /// Emits [program] and returns the size of the generated output.
-  int emitProgram(Program program);
+  /// Uses the [programBuilder] to generate a model of the program, emits
+  /// the program, and returns the size of the generated output.
+  int emitProgram(ProgramBuilder programBuilder);
 
   /// Returns the JS function that must be invoked to get the value of the
   /// lazily initialized static.
@@ -462,8 +456,8 @@
   /// Returns the JS expression representing the type [e].
   jsAst.Expression typeAccess(Element e);
 
-  /// Returns the JS constructor for the given closure class [e].
-  jsAst.Expression closureClassConstructorAccess(ClosureClassElement e);
+  /// Returns the JS expression representing a function that returns 'null'
+  jsAst.Expression generateFunctionThatReturnsNull();
 
   int compareConstants(ConstantValue a, ConstantValue b);
   bool isConstantInlinedOrAlreadyEmitted(ConstantValue constant);
diff --git a/pkg/compiler/lib/src/js_emitter/js_emitter.dart b/pkg/compiler/lib/src/js_emitter/js_emitter.dart
index aeb48b5..ce6441c 100644
--- a/pkg/compiler/lib/src/js_emitter/js_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/js_emitter.dart
@@ -4,7 +4,6 @@
 
 library dart2js.js_emitter;
 
-import 'dart:async';
 import 'dart:convert';
 
 import '../common.dart';
@@ -30,7 +29,7 @@
     ParameterElement,
     TypeVariableElement;
 
-import '../hash/sha1.dart' show hashOfString;
+import '../hash/sha1.dart' show Hasher;
 
 import '../helpers/helpers.dart';  // Included for debug helpers.
 
@@ -89,12 +88,12 @@
 import 'package:_internal/compiler/js_lib/shared/embedded_names.dart'
     as embeddedNames;
 
-import '../hash/sha1.dart';
-
+import '../native/native.dart' as native;
 part 'class_stub_generator.dart';
 part 'code_emitter_task.dart';
 part 'helpers.dart';
 part 'interceptor_stub_generator.dart';
+part 'native_emitter.dart';
 part 'native_generator.dart';
 part 'type_test_generator.dart';
 part 'type_test_registry.dart';
@@ -109,4 +108,3 @@
 part 'old_emitter/metadata_emitter.dart';
 part 'old_emitter/nsm_emitter.dart';
 part 'old_emitter/reflection_data_parser.dart';
-part 'old_emitter/type_test_emitter.dart';
diff --git a/pkg/compiler/lib/src/js_emitter/model.dart b/pkg/compiler/lib/src/js_emitter/model.dart
index 42597a0..7d011ad 100644
--- a/pkg/compiler/lib/src/js_emitter/model.dart
+++ b/pkg/compiler/lib/src/js_emitter/model.dart
@@ -7,15 +7,24 @@
 import '../js/js.dart' as js show Expression;
 import '../constants/values.dart' show ConstantValue;
 
+import '../deferred_load.dart' show OutputUnit;
+
 import '../common.dart';
 
 class Program {
-  final List<Output> outputs;
+  final List<Fragment> fragments;
+  final List<Class> nativeClasses;
   final bool outputContainsConstantList;
-  /// A map from load id to the list of outputs that need to be loaded.
-  final Map<String, List<Output>> loadMap;
+  /// A map from load id to the list of fragments that need to be loaded.
+  final Map<String, List<Fragment>> loadMap;
 
-  Program(this.outputs, this.outputContainsConstantList, this.loadMap);
+  Program(this.fragments,
+          this.nativeClasses,
+          this.outputContainsConstantList,
+          this.loadMap);
+
+  bool get isSplit => fragments.length > 1;
+  Iterable<Fragment> get deferredFragments => fragments.skip(1);
 }
 
 /**
@@ -31,11 +40,14 @@
 /**
  * This class represents one output file.
  *
- * If no library is deferred, there is only one [Output] of type [MainOutput].
+ * If no library is deferred, there is only one [Fragment] of type
+ * [MainFragment].
  */
-abstract class Output {
-  bool get isMainOutput => mainOutput == this;
-  MainOutput get mainOutput;
+abstract class Fragment {
+  /// The outputUnit should only be used during the transition to the new model.
+  /// Uses indicate missing information in the model.
+  final OutputUnit outputUnit;
+
   final List<Library> libraries;
   final List<Constant> constants;
   // TODO(floitsch): should we move static fields into libraries or classes?
@@ -46,56 +58,64 @@
   /// Output file name without extension.
   final String outputFileName;
 
-  Output(this.outputFileName,
-         this.libraries,
-         this.staticNonFinalFields,
-         this.staticLazilyInitializedFields,
-         this.constants);
+  Fragment(this.outputUnit,
+           this.outputFileName,
+           this.libraries,
+           this.staticNonFinalFields,
+           this.staticLazilyInitializedFields,
+           this.constants);
+
+  bool get isMainFragment => mainFragment == this;
+  MainFragment get mainFragment;
 }
 
 /**
  * The main output file.
  *
- * This code emitted from this [Output] must be loaded first. It can then load
- * other [DeferredOutput]s.
+ * This code emitted from this [Fragment] must be loaded first. It can then load
+ * other [DeferredFragment]s.
  */
-class MainOutput extends Output {
+class MainFragment extends Fragment {
   final js.Expression main;
   final List<Holder> holders;
 
-  MainOutput(String outputFileName,
-             this.main,
-             List<Library> libraries,
-             List<StaticField> staticNonFinalFields,
-             List<StaticField> staticLazilyInitializedFields,
-             List<Constant> constants,
-             this.holders)
-      : super(outputFileName,
+  MainFragment(OutputUnit outputUnit,
+               String outputFileName,
+               this.main,
+               List<Library> libraries,
+               List<StaticField> staticNonFinalFields,
+               List<StaticField> staticLazilyInitializedFields,
+               List<Constant> constants,
+               this.holders)
+      : super(outputUnit,
+              outputFileName,
               libraries,
               staticNonFinalFields,
               staticLazilyInitializedFields,
               constants);
 
-  MainOutput get mainOutput => this;
+  MainFragment get mainFragment => this;
 }
 
 /**
  * An output (file) for deferred code.
  */
-class DeferredOutput extends Output {
-  final MainOutput mainOutput;
+class DeferredFragment extends Fragment {
+  final MainFragment mainFragment;
   final String name;
 
-  List<Holder> get holders => mainOutput.holders;
+  List<Holder> get holders => mainFragment.holders;
 
-  DeferredOutput(String outputFileName,
-                 this.name,
-                 this.mainOutput,
-                 List<Library> libraries,
-                 List<StaticField> staticNonFinalFields,
-                 List<StaticField> staticLazilyInitializedFields,
-                 List<Constant> constants)
-      : super(outputFileName,
+  DeferredFragment(OutputUnit outputUnit,
+                   String outputFileName,
+                   this.name,
+                   this.mainFragment,
+                   List<Library> libraries,
+                   List<StaticField> staticNonFinalFields,
+                   List<StaticField> staticLazilyInitializedFields,
+                   List<Constant> constants)
+      : super(outputUnit,
+              outputFileName,
               libraries,
               staticNonFinalFields,
               staticLazilyInitializedFields,
@@ -110,7 +130,11 @@
   Constant(this.name, this.holder, this.value);
 }
 
-class Library {
+abstract class FieldContainer {
+  List<Field> get staticFieldsForReflection;
+}
+
+class Library implements FieldContainer {
   /// The element should only be used during the transition to the new model.
   /// Uses indicate missing information in the model.
   final Element element;
@@ -119,7 +143,10 @@
   final List<StaticMethod> statics;
   final List<Class> classes;
 
-  Library(this.element, this.uri, this.statics, this.classes);
+  final List<Field> staticFieldsForReflection;
+
+  Library(this.element, this.uri, this.statics, this.classes,
+          this.staticFieldsForReflection);
 }
 
 class StaticField {
@@ -140,7 +167,7 @@
               this.isFinal, this.isLazy);
 }
 
-class Class {
+class Class implements FieldContainer {
   /// The element should only be used during the transition to the new model.
   /// Uses indicate missing information in the model.
   final Element element;
@@ -149,19 +176,34 @@
   final Holder holder;
   Class _superclass;
   final List<Method> methods;
-  final List<InstanceField> fields;
+  final List<Field> fields;
+  final List<StubMethod> isChecks;
+  final List<StubMethod> callStubs;
+  final List<Field> staticFieldsForReflection;
   final bool onlyForRti;
   final bool isDirectlyInstantiated;
+  final bool isNative;
+
+  // If the class implements a function type, and the type is encoded in the
+  // metatada table, then this field contains the index into that field.
+  final int functionTypeIndex;
 
   /// Whether the class must be evaluated eagerly.
   bool isEager = false;
 
-  Class(this.element,
-        this.name, this.holder, this.methods, this.fields,
+  Class(this.element, this.name, this.holder,
+        this.methods,
+        this.fields,
+        this.staticFieldsForReflection,
+        this.callStubs,
+        this.isChecks,
+        this.functionTypeIndex,
         {this.onlyForRti,
-         this.isDirectlyInstantiated}) {
+         this.isDirectlyInstantiated,
+         this.isNative}) {
     assert(onlyForRti != null);
     assert(isDirectlyInstantiated != null);
+    assert(isNative != null);
   }
 
   bool get isMixinApplication => false;
@@ -180,16 +222,24 @@
 class MixinApplication extends Class {
   Class _mixinClass;
 
-  MixinApplication(Element element,
-                   String name, Holder holder,
-                   List<Method> methods,
-                   List<InstanceField> fields,
+  MixinApplication(Element element, String name, Holder holder,
+                   List<Field> instanceFields,
+                   List<Field> staticFieldsForReflection,
+                   List<StubMethod> callStubs,
+                   List<StubMethod> isChecks,
+                   int functionTypeIndex,
                    {bool onlyForRti,
                     bool isDirectlyInstantiated})
       : super(element,
-              name, holder, methods, fields,
+              name, holder,
+              const <Method>[],
+              instanceFields,
+              staticFieldsForReflection,
+              callStubs,
+              isChecks, functionTypeIndex,
               onlyForRti: onlyForRti,
-              isDirectlyInstantiated: isDirectlyInstantiated);
+              isDirectlyInstantiated: isDirectlyInstantiated,
+              isNative: false);
 
   bool get isMixinApplication => true;
   Class get mixinClass => _mixinClass;
@@ -199,12 +249,17 @@
   }
 }
 
-class InstanceField {
+/// A field.
+///
+/// In general represents an instance field, but for reflection may also
+/// represent static fields.
+class Field {
   /// The element should only be used during the transition to the new model.
   /// Uses indicate missing information in the model.
   final Element element;
 
   final String name;
+  final String accessorName;
 
   /// 00: Does not need any getter.
   /// 01:  function() { return this.field; }
@@ -218,11 +273,18 @@
   /// 11:  function(receiver, value) { this.field = value; }
   final int setterFlags;
 
+  final bool needsCheckedSetter;
+
   // TODO(floitsch): support renamed fields.
-  InstanceField(this.element, this.name, this.getterFlags, this.setterFlags);
+  Field(this.element, this.name, this.accessorName,
+        this.getterFlags, this.setterFlags,
+        this.needsCheckedSetter);
 
   bool get needsGetter => getterFlags != 0;
-  bool get needsSetter => setterFlags != 0;
+  bool get needsUncheckedSetter => setterFlags != 0;
+
+  bool get needsInterceptedGetter => getterFlags > 1;
+  bool get needsInterceptedSetter => setterFlags > 1;
 }
 
 class Method {
@@ -232,20 +294,28 @@
 
   final String name;
   final js.Expression code;
-  Method(this.element, this.name, this.code);
+  final bool needsTearOff;
+
+  Method(this.element, this.name, this.code, {this.needsTearOff}) {
+    assert(needsTearOff != null);
+  }
 }
 
 class StubMethod extends Method {
-  StubMethod(String name, js.Expression code) : super(null, name, code);
+  StubMethod(String name, js.Expression code,
+             {bool needsTearOff, Element element })
+      : super(element, name, code, needsTearOff: needsTearOff);
 }
 
 class StaticMethod extends Method {
   final Holder holder;
-  StaticMethod(Element element, String name, this.holder, js.Expression code)
-      : super(element, name, code);
+  StaticMethod(Element element, String name, this.holder, js.Expression code,
+               {bool needsTearOff})
+      : super(element, name, code, needsTearOff: needsTearOff);
 }
 
 class StaticStubMethod extends StaticMethod {
-  StaticStubMethod(String name, Holder holder, js.Expression code)
-      : super(null, name, holder, code);
+  StaticStubMethod(String name, Holder holder, js.Expression code,
+                   {bool needsTearOff})
+      : super(null, name, holder, code, needsTearOff: needsTearOff);
 }
diff --git a/pkg/compiler/lib/src/js_backend/native_emitter.dart b/pkg/compiler/lib/src/js_emitter/native_emitter.dart
similarity index 60%
rename from pkg/compiler/lib/src/js_backend/native_emitter.dart
rename to pkg/compiler/lib/src/js_emitter/native_emitter.dart
index 60f1155..90c2521 100644
--- a/pkg/compiler/lib/src/js_backend/native_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/native_emitter.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.
 
-part of js_backend;
+part of dart2js.js_emitter;
 
 class NativeEmitter {
 
@@ -10,8 +10,8 @@
 
   final CodeEmitterTask emitterTask;
 
-  // Native classes found in the application.
-  Set<ClassElement> nativeClasses = new Set<ClassElement>();
+  // Whether the application contains native classes.
+  bool hasNativeClasses = false;
 
   // Caches the native subtypes of a native class.
   Map<ClassElement, List<ClassElement>> subtypes;
@@ -43,7 +43,10 @@
   }
 
   /**
-   * Writes code to associate dispatch tags with interceptors to [nativeBuffer].
+   * Prepares native classes for emission. Returns the reduced list of classes.
+   *
+   * Removes trivial classes (that can be represented by a super type) and
+   * generates properties that have to be added to classes (native or not).
    *
    * The interceptors are filtered to avoid emitting trivial interceptors.  For
    * example, if the program contains no code that can distinguish between the
@@ -57,71 +60,71 @@
    * 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.
+   * of native classes.  *Only* the native classes are returned. The order of
+   * the returned classes is unchanged. (That is, the returned output might
+   * just have classes removed).
    *
-   * [additionalProperties] is used to collect properties that are pushed up
+   * [allAdditionalProperties] is used to collect properties that are pushed up
    * from the above optimizations onto a non-native class, e.g, `Interceptor`.
    */
-  void generateNativeClasses(
-      List<ClassElement> classes,
-      Map<ClassElement, Map<String, jsAst.Expression>> additionalProperties) {
+  List<Class> prepareNativeClasses(
+      List<Class> classes,
+      Map<Class, Map<String, jsAst.Expression>> allAdditionalProperties) {
     // Compute a pre-order traversal of the subclass forest.  We actually want a
     // post-order traversal but it is easier to compute the pre-order and use it
     // in reverse.
 
-    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)) return;
-      seen.add(element);
-      walk(element.superclass);
-      preOrder.add(element);
+    hasNativeClasses = classes.isNotEmpty;
+
+    List<Class> preOrder = <Class>[];
+    Set<Class> seen = new Set<Class>();
+
+    Class objectClass = null;
+    Class jsInterceptorClass = null;
+    void walk(Class cls) {
+      if (cls.element == compiler.objectClass) {
+        objectClass = cls;
+        return;
+      }
+      if (cls.element == backend.jsInterceptorClass) {
+        jsInterceptorClass = cls;
+        return;
+      }
+      if (seen.contains(cls)) return;
+      seen.add(cls);
+      walk(cls.superclass);
+      preOrder.add(cls);
     }
     classes.forEach(walk);
 
-    // Generate code for each native class into [ClassBuilder]s.
-
-    Map<ClassElement, ClassBuilder> builders =
-        new Map<ClassElement, ClassBuilder>();
-    for (ClassElement classElement in classes) {
-      if (classElement.isNative) {
-        ClassBuilder builder = generateNativeClass(classElement);
-        builders[classElement] = builder;
-      }
-    }
-
     // Find which classes are needed and which are non-leaf classes.  Any class
     // that is not needed can be treated as a leaf class equivalent to some
     // needed class.
 
-    Set<ClassElement> neededClasses = new Set<ClassElement>();
-    Set<ClassElement> nonleafClasses = new Set<ClassElement>();
+    Set<Class> neededClasses = new Set<Class>();
+    Set<Class> nonleafClasses = new Set<Class>();
 
-    Map<ClassElement, List<ClassElement>> extensionPoints =
-        computeExtensionPoints(preOrder);
+    Map<Class, List<Class>> extensionPoints = computeExtensionPoints(preOrder);
 
-    neededClasses.add(compiler.objectClass);
+    neededClasses.add(objectClass);
 
-    Set<ClassElement> neededByConstant =
-        emitterTask.interceptorsReferencedFromConstants();
-    Set<ClassElement> modifiedClasses =
-        emitterTask.typeTestRegistry.classesModifiedByEmitRuntimeTypeSupport();
+    Set<ClassElement> neededByConstant = emitterTask
+        .computeInterceptorsReferencedFromConstants();
+    Set<ClassElement> modifiedClasses = emitterTask.typeTestRegistry
+        .computeClassesModifiedByEmitRuntimeTypeSupport();
 
-    for (ClassElement classElement in preOrder.reversed) {
+    for (Class cls in preOrder.reversed) {
+      ClassElement classElement = cls.element;
       // Post-order traversal ensures we visit the subclasses before their
       // superclass.  This makes it easy to tell if a class is needed because a
       // subclass is needed.
-      ClassBuilder builder = builders[classElement];
       bool needed = false;
-      if (builder == null) {
+      if (!cls.isNative) {
         // Mixin applications (native+mixin) are non-native, so [classElement]
         // has already been emitted as a regular class.  Mark [classElement] as
         // 'needed' to ensure the native superclass is needed.
         needed = true;
-      } else if (!builder.isTrivial) {
+      } else if (!isTrivialClass(cls)) {
         needed = true;
       } else if (neededByConstant.contains(classElement)) {
         needed = true;
@@ -129,45 +132,43 @@
         // TODO(9556): Remove this test when [emitRuntimeTypeSupport] no longer
         // adds information to a class prototype or constructor.
         needed = true;
-      } else if (extensionPoints.containsKey(classElement)) {
+      } else if (extensionPoints.containsKey(cls)) {
         needed = true;
       }
-      if (classElement.isNative &&
+      if (cls.isNative &&
           native.nativeTagsForcedNonLeaf(classElement)) {
         needed = true;
-        nonleafClasses.add(classElement);
+        nonleafClasses.add(cls);
       }
 
-      if (needed || neededClasses.contains(classElement)) {
-        neededClasses.add(classElement);
-        neededClasses.add(classElement.superclass);
-        nonleafClasses.add(classElement.superclass);
+      if (needed || neededClasses.contains(cls)) {
+        neededClasses.add(cls);
+        neededClasses.add(cls.superclass);
+        nonleafClasses.add(cls.superclass);
       }
     }
 
     // Collect all the tags that map to each native class.
 
-    Map<ClassElement, Set<String>> leafTags =
-        new Map<ClassElement, Set<String>>();
-    Map<ClassElement, Set<String>> nonleafTags =
-        new Map<ClassElement, Set<String>>();
+    Map<Class, Set<String>> leafTags = new Map<Class, Set<String>>();
+    Map<Class, Set<String>> nonleafTags = new Map<Class, Set<String>>();
 
-    for (ClassElement classElement in classes) {
-      if (!classElement.isNative) continue;
-      List<String> nativeTags = native.nativeTagsOfClass(classElement);
+    for (Class cls in classes) {
+      if (!cls.isNative) continue;
+      List<String> nativeTags = native.nativeTagsOfClass(cls.element);
 
-      if (nonleafClasses.contains(classElement) ||
-          extensionPoints.containsKey(classElement)) {
+      if (nonleafClasses.contains(cls) ||
+          extensionPoints.containsKey(cls)) {
         nonleafTags
-            .putIfAbsent(classElement, () => new Set<String>())
+            .putIfAbsent(cls, () => new Set<String>())
             .addAll(nativeTags);
       } else {
-        ClassElement sufficingInterceptor = classElement;
+        Class sufficingInterceptor = cls;
         while (!neededClasses.contains(sufficingInterceptor)) {
           sufficingInterceptor = sufficingInterceptor.superclass;
         }
-        if (sufficingInterceptor == compiler.objectClass) {
-          sufficingInterceptor = backend.jsInterceptorClass;
+        if (sufficingInterceptor == objectClass) {
+          sufficingInterceptor = jsInterceptorClass;
         }
         leafTags
             .putIfAbsent(sufficingInterceptor, () => new Set<String>())
@@ -179,7 +180,7 @@
     // by getNativeInterceptor and custom elements.
     if (compiler.enqueuer.codegen.nativeEnqueuer
         .hasInstantiatedNativeClasses()) {
-      void generateClassInfo(ClassElement classElement) {
+      void generateClassInfo(Class cls) {
         // Property has the form:
         //
         //    "%": "leafTag1|leafTag2|...;nonleafTag1|...;Class1|Class2|...",
@@ -192,10 +193,10 @@
           return (tags.toList()..sort()).join('|');
         }
 
-        List<ClassElement> extensions = extensionPoints[classElement];
+        List<Class> extensions = extensionPoints[cls];
 
-        String leafStr = formatTags(leafTags[classElement]);
-        String nonleafStr = formatTags(nonleafTags[classElement]);
+        String leafStr = formatTags(leafTags[cls]);
+        String nonleafStr = formatTags(nonleafTags[cls]);
 
         StringBuffer sb = new StringBuffer(leafStr);
         if (nonleafStr != '') {
@@ -203,43 +204,33 @@
         }
         if (extensions != null) {
           sb..write(';')
-            ..writeAll(extensions.map(backend.namer.getNameOfClass), '|');
+            ..writeAll(extensions.map((Class cls) => cls.name), '|');
         }
         String encoding = sb.toString();
 
-        ClassBuilder builder = builders[classElement];
-        if (builder == null) {
-          // No builder because this is an intermediate mixin application or
-          // Interceptor - these are not direct native classes.
-          if (encoding != '') {
-            Map<String, jsAst.Expression> properties =
-                additionalProperties.putIfAbsent(classElement,
-                    () => new LinkedHashMap<String, jsAst.Expression>());
-            properties[backend.namer.nativeSpecProperty] = js.string(encoding);
-          }
-        } else {
-          builder.addProperty(
-              backend.namer.nativeSpecProperty, js.string(encoding));
+        if (cls.isNative || encoding != '') {
+          Map<String, jsAst.Expression> properties =
+              allAdditionalProperties.putIfAbsent(cls,
+                  () => new Map<String, jsAst.Expression>());
+          properties[backend.namer.nativeSpecProperty] = js.string(encoding);
         }
       }
-      generateClassInfo(backend.jsInterceptorClass);
-      for (ClassElement classElement in classes) {
-        generateClassInfo(classElement);
+      generateClassInfo(jsInterceptorClass);
+      for (Class cls in classes) {
+        if (!cls.isNative || neededClasses.contains(cls)) {
+          generateClassInfo(cls);
+        }
       }
     }
 
-    // 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].
-        emitterTask.oldEmitter.classEmitter.emitClassBuilderWithReflectionData(
-            backend.namer.getNameOfClass(classElement),
-            classElement, builders[classElement],
-            emitterTask.oldEmitter.getElementDescriptor(classElement));
-        emitterTask.oldEmitter.needsClassSupport = true;
-      }
-    }
+    // TODO(sra): Issue #13731- this is commented out as part of custom
+    // element constructor work.
+    // (floitsch: was run on every native class.)
+    //assert(!classElement.hasBackendMembers);
+
+    return classes
+        .where((Class cls) => cls.isNative && neededClasses.contains(cls))
+        .toList();
   }
 
   /**
@@ -247,78 +238,44 @@
    * 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);
+  Map<Class, List<Class>> computeExtensionPoints(List<Class> classes) {
+    Class nativeSuperclassOf(Class cls) {
+      if (cls == null) return null;
+      if (cls.isNative) return cls;
+      return nativeSuperclassOf(cls.superclass);
     }
 
-    ClassElement nativeAncestorOf(ClassElement element) {
-      return nativeSuperclassOf(element.superclass);
+    Class nativeAncestorOf(Class cls) {
+      return nativeSuperclassOf(cls.superclass);
     }
 
-    Map<ClassElement, List<ClassElement>> map =
-        new Map<ClassElement, List<ClassElement>>();
+    Map<Class, List<Class>> map = new Map<Class, List<Class>>();
 
-    for (ClassElement classElement in classes) {
-      if (classElement.isNative) continue;
-      ClassElement nativeAncestor = nativeAncestorOf(classElement);
+    for (Class cls in classes) {
+      if (cls.isNative) continue;
+      Class nativeAncestor = nativeAncestorOf(cls);
       if (nativeAncestor != null) {
         map
-          .putIfAbsent(nativeAncestor, () => <ClassElement>[])
-          .add(classElement);
+          .putIfAbsent(nativeAncestor, () => <Class>[])
+          .add(cls);
       }
     }
     return map;
   }
 
-  ClassBuilder generateNativeClass(ClassElement classElement) {
-    // TODO(sra): Issue #13731- this is commented out as part of custom element
-    // constructor work.
-    //assert(!classElement.hasBackendMembers);
-    nativeClasses.add(classElement);
-
-    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;
+  bool isTrivialClass(Class cls) {
+    bool needsAccessor(Field field) {
+      return field.needsGetter ||
+          field.needsUncheckedSetter ||
+          field.needsCheckedSetter;
     }
 
-    String superName = backend.namer.getNameOfClass(superclass);
-
-    ClassBuilder builder;
-    if (compiler.hasIncrementalSupport) {
-      builder = cachedBuilders[classElement];
-      if (builder != null) return builder;
-      builder = new ClassBuilder(classElement, backend.namer);
-      cachedBuilders[classElement] = builder;
-    } else {
-      builder = new ClassBuilder(classElement, backend.namer);
-    }
-    builder.superName = superName;
-
-    emitterTask.oldEmitter.classEmitter.emitClassConstructor(
-        classElement, builder);
-    bool hasFields = emitterTask.oldEmitter.classEmitter.emitFields(
-        classElement, builder, classIsNative: true);
-    int propertyCount = builder.properties.length;
-    emitterTask.oldEmitter.classEmitter.emitClassGettersSetters(
-        classElement, builder);
-    emitterTask.oldEmitter.classEmitter.emitInstanceMembers(
-        classElement, builder);
-    emitterTask.oldEmitter.typeTestEmitter.emitIsTests(classElement, builder);
-
-    if (!hasFields &&
-        builder.properties.length == propertyCount &&
-        superclass is! MixinApplicationElement) {
-      builder.isTrivial = true;
-    }
-
-    return builder;
+    return
+        cls.methods.isEmpty &&
+        cls.isChecks.isEmpty &&
+        cls.callStubs.isEmpty &&
+        !cls.superclass.isMixinApplication &&
+        !cls.fields.any(needsAccessor);
   }
 
   void finishGenerateNativeClasses() {
@@ -447,7 +404,7 @@
       return prop;
     }
 
-    if (!nativeClasses.isEmpty) {
+    if (hasNativeClasses) {
       // If the native emitter has been asked to take care of the
       // noSuchMethod handlers, we do that now.
       if (handleNoSuchMethod) {
diff --git a/pkg/compiler/lib/src/js_emitter/new_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/new_emitter/emitter.dart
index c3df243..98691d2 100644
--- a/pkg/compiler/lib/src/js_emitter/new_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/new_emitter/emitter.dart
@@ -4,6 +4,7 @@
 
 library dart2js.new_js_emitter.emitter;
 
+import '../program_builder.dart' show ProgramBuilder;
 import '../model.dart';
 import 'model_emitter.dart';
 import '../../common.dart';
@@ -11,8 +12,7 @@
 import '../../js/js.dart' as js;
 
 import '../../js_backend/js_backend.dart' show Namer, JavaScriptBackend;
-import '../../js_emitter/js_emitter.dart' as emitterTask show
-    CodeEmitterTask,
+import '../js_emitter.dart' as emitterTask show
     Emitter;
 
 class Emitter implements emitterTask.Emitter {
@@ -26,7 +26,8 @@
         _emitter = new ModelEmitter(compiler, namer);
 
   @override
-  int emitProgram(Program program) {
+  int emitProgram(ProgramBuilder programBuilder) {
+    Program program = programBuilder.buildProgram();
     return _emitter.emitProgram(program);
   }
 
@@ -73,6 +74,12 @@
   }
 
   @override
+  // TODO(herhut): Use a single shared function.
+  js.Expression generateFunctionThatReturnsNull() {
+    return js.js('function() {}');
+  }
+
+  @override
   js.Expression constantReference(ConstantValue value) {
     return _emitter.constantEmitter.reference(value);
   }
@@ -134,10 +141,5 @@
   }
 
   @override
-  js.PropertyAccess closureClassConstructorAccess(ClassElement element) {
-    return _globalPropertyAccess(element);
-  }
-
-  @override
   void invalidateCaches() {}
 }
diff --git a/pkg/compiler/lib/src/js_emitter/new_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/new_emitter/model_emitter.dart
index 668a0e3..a2b1c62 100644
--- a/pkg/compiler/lib/src/js_emitter/new_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/new_emitter/model_emitter.dart
@@ -46,18 +46,19 @@
   }
 
   int emitProgram(Program program) {
-    List<Output> outputs = program.outputs;
-    MainOutput mainUnit = outputs.first;
-    js.Statement mainAst = emitMainUnit(program);
+    List<Fragment> fragments = program.fragments;
+    MainFragment mainFragment = fragments.first;
+    js.Statement mainAst = emitMainFragment(program);
     String mainCode = js.prettyPrint(mainAst, compiler).getText();
-    compiler.outputProvider(mainUnit.outputFileName, 'js')
+    compiler.outputProvider(mainFragment.outputFileName, 'js')
         ..add(buildGeneratedBy(compiler))
         ..add(mainCode)
         ..close();
     int totalSize = mainCode.length;
 
-    outputs.skip(1).forEach((DeferredOutput deferredUnit) {
-      js.Expression ast = emitDeferredUnit(deferredUnit, mainUnit.holders);
+    fragments.skip(1).forEach((DeferredFragment deferredUnit) {
+      js.Expression ast =
+          emitDeferredFragment(deferredUnit, mainFragment.holders);
       String code = js.prettyPrint(ast, compiler).getText();
       totalSize += code.length;
       compiler.outputProvider(deferredUnit.outputFileName, deferredExtension)
@@ -79,11 +80,11 @@
     return '// Generated by dart2js, the Dart to JavaScript compiler$suffix.\n';
   }
 
-  js.Statement emitMainUnit(Program program) {
-    MainOutput unit = program.outputs.first;
-    List<js.Expression> elements = unit.libraries.map(emitLibrary).toList();
+  js.Statement emitMainFragment(Program program) {
+    MainFragment fragment = program.fragments.first;
+    List<js.Expression> elements = fragment.libraries.map(emitLibrary).toList();
     elements.add(
-        emitLazilyInitializedStatics(unit.staticLazilyInitializedFields));
+        emitLazilyInitializedStatics(fragment.staticLazilyInitializedFields));
 
     js.Statement nativeBoilerplate;
     if (NativeGenerator.needsIsolateAffinityTagInitialization(backend)) {
@@ -102,16 +103,16 @@
     return js.js.statement(
         boilerplate,
         {'deferredInitializer': emitDeferredInitializerGlobal(program.loadMap),
-         'holders': emitHolders(unit.holders),
+         'holders': emitHolders(fragment.holders),
          'cyclicThrow':
            backend.emitter.staticFunctionAccess(backend.getCyclicThrowHelper()),
          'outputContainsConstantList': program.outputContainsConstantList,
          'embeddedGlobals': emitEmbeddedGlobals(program.loadMap),
-         'constants': emitConstants(unit.constants),
-         'staticNonFinals': emitStaticNonFinalFields(unit.staticNonFinalFields),
+         'constants': emitConstants(fragment.constants),
+         'staticNonFinals': emitStaticNonFinalFields(fragment.staticNonFinalFields),
          'nativeBoilerplate': nativeBoilerplate,
-         'eagerClasses': emitEagerClassInitializations(unit.libraries),
-         'main': unit.main,
+         'eagerClasses': emitEagerClassInitializations(fragment.libraries),
+         'main': fragment.main,
          'code': code});
   }
 
@@ -145,7 +146,7 @@
     return js.js.uncachedExpressionTemplate('makeConstList(#)');
   }
 
-  js.Block emitEmbeddedGlobals(Map<String, List<Output>> loadMap) {
+  js.Block emitEmbeddedGlobals(Map<String, List<Fragment>> loadMap) {
     List<js.Property> globals = <js.Property>[];
 
     if (loadMap.isNotEmpty) {
@@ -165,24 +166,25 @@
     return new js.Block(statements);
   }
 
-  List<js.Property> emitLoadUrisAndHashes(Map<String, List<Output>> loadMap) {
-    js.ArrayInitializer outputUris(List<Output> outputs) {
-      return js.stringArray(outputs.map((DeferredOutput output) =>
-          "${output.outputFileName}$deferredExtension"));
+  List<js.Property> emitLoadUrisAndHashes(Map<String, List<Fragment>> loadMap) {
+    js.ArrayInitializer outputUris(List<Fragment> fragments) {
+      return js.stringArray(fragments.map((DeferredFragment fragment) =>
+          "${fragment.outputFileName}$deferredExtension"));
     }
-    js.ArrayInitializer outputHashes(List<Output> outputs) {
+    js.ArrayInitializer outputHashes(List<Fragment> fragments) {
       // TODO(floitsch): the hash must depend on the generated code.
       return js.numArray(
-          outputs.map((DeferredOutput output) => output.hashCode));
+          fragments.map((DeferredFragment fragment) => fragment.hashCode));
     }
 
     List<js.Property> uris = new List<js.Property>(loadMap.length);
     List<js.Property> hashes = new List<js.Property>(loadMap.length);
     int count = 0;
-    loadMap.forEach((String loadId, List<Output> outputList) {
-      uris[count] = new js.Property(js.string(loadId), outputUris(outputList));
+    loadMap.forEach((String loadId, List<Fragment> fragmentList) {
+      uris[count] =
+          new js.Property(js.string(loadId), outputUris(fragmentList));
       hashes[count] =
-          new js.Property(js.string(loadId), outputHashes(outputList));
+          new js.Property(js.string(loadId), outputHashes(fragmentList));
       count++;
     });
 
@@ -214,16 +216,17 @@
     return new js.Property(js.string(INITIALIZE_LOADED_HUNK), function);
   }
 
-  js.Expression emitDeferredUnit(DeferredOutput unit, List<Holder> holders) {
+  js.Expression emitDeferredFragment(DeferredFragment fragment,
+                                     List<Holder> holders) {
     // TODO(floitsch): initialize eager classes.
     // TODO(floitsch): the hash must depend on the output.
     int hash = this.hashCode;
-    if (unit.constants.isNotEmpty) {
+    if (fragment.constants.isNotEmpty) {
       throw new UnimplementedError("constants in deferred units");
     }
     js.ArrayInitializer content =
-        new js.ArrayInitializer(unit.libraries.map(emitLibrary)
-                                              .toList(growable: false));
+        new js.ArrayInitializer(fragment.libraries.map(emitLibrary)
+                                                  .toList(growable: false));
     return js.js("$deferredInitializersGlobal[$hash] = #", content);
   }
 
@@ -282,25 +285,16 @@
   }
 
   js.Expression _generateConstructor(Class cls) {
-    List<String> allFieldNames = <String>[];
+    List<String> fieldNames = <String>[];
 
     // If the class is not directly instantiated we only need it for inheritance
     // or RTI. In either case we don't need its fields.
-    if (cls.isDirectlyInstantiated) {
-      Class currentClass = cls;
-      while (currentClass != null) {
-        // Mixins are not allowed to inject fields.
-        assert(!currentClass.isMixinApplication ||
-               (currentClass as MixinApplication).mixinClass.fields.isEmpty);
-
-        allFieldNames.addAll(
-            currentClass.fields.map((InstanceField field) => field.name));
-        currentClass = currentClass.superclass;
-      }
+    if (cls.isDirectlyInstantiated && !cls.isNative) {
+      fieldNames = cls.fields.map((Field field) => field.name).toList();
     }
     String name = cls.name;
-    String parameters = allFieldNames.join(', ');
-    String assignments = allFieldNames
+    String parameters = fieldNames.join(', ');
+    String assignments = fieldNames
         .map((String field) => "this.$field = $field;\n")
         .join();
     String code = 'function $name($parameters) { $assignments }';
@@ -308,7 +302,7 @@
     return template.instantiate(const []);
   }
 
-  Method _generateGetter(InstanceField field) {
+  Method _generateGetter(Field field) {
     String getterTemplateFor(int flags) {
       switch (flags) {
         case 1: return "function() { return this[#]; }";
@@ -321,10 +315,10 @@
     js.Expression fieldName = js.string(field.name);
     js.Expression code = js.js(getterTemplateFor(field.getterFlags), fieldName);
     String getterName = "${namer.getterPrefix}${field.name}";
-    return new StubMethod(getterName, code);
+    return new StubMethod(getterName, code, needsTearOff: false);
   }
 
-  Method _generateSetter(InstanceField field) {
+  Method _generateSetter(Field field) {
     String setterTemplateFor(int flags) {
       switch (flags) {
         case 1: return "function(val) { return this[#] = val; }";
@@ -336,16 +330,16 @@
     js.Expression fieldName = js.string(field.name);
     js.Expression code = js.js(setterTemplateFor(field.setterFlags), fieldName);
     String setterName = "${namer.setterPrefix}${field.name}";
-    return new StubMethod(setterName, code);
+    return new StubMethod(setterName, code, needsTearOff: false);
   }
 
   Iterable<Method> _generateGettersSetters(Class cls) {
     Iterable<Method> getters = cls.fields
-        .where((InstanceField field) => field.needsGetter)
+        .where((Field field) => field.needsGetter)
         .map(_generateGetter);
 
     Iterable<Method> setters = cls.fields
-        .where((InstanceField field) => field.needsSetter)
+        .where((Field field) => field.needsUncheckedSetter)
         .map(_generateSetter);
 
     return [getters, setters].expand((x) => x);
@@ -368,8 +362,10 @@
       elements.add(_generateConstructor(cls));
     }
     Iterable<Method> methods = cls.methods;
+    Iterable<Method> isChecks = cls.isChecks;
     Iterable<Method> gettersSetters = _generateGettersSetters(cls);
-    Iterable<Method> allMethods = [methods, gettersSetters].expand((x) => x);
+    Iterable<Method> allMethods =
+        [methods, isChecks, gettersSetters].expand((x) => x);
     elements.addAll(allMethods.expand((e) => [js.string(e.name), e.code]));
     return unparse(compiler, new js.ArrayInitializer(elements));
   }
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/class_builder.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/class_builder.dart
index c065090..2cc8254 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/class_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/class_builder.dart
@@ -18,9 +18,6 @@
   final Element element;
   final Namer namer;
 
-  /// Set to true by user if class is indistinguishable from its superclass.
-  bool isTrivial = false;
-
   ClassBuilder(this.element, this.namer);
 
   // Has the same signature as [DefineStubFunction].
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/class_emitter.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/class_emitter.dart
index 6a83815..88c5f61 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/class_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/class_emitter.dart
@@ -11,20 +11,15 @@
 
   /**
    * Documentation wanted -- johnniwinther
-   *
-   * Invariant: [classElement] must be a declaration element.
    */
-  void generateClass(ClassElement classElement,
-                     ClassBuilder properties,
-                     Map<String, jsAst.Expression> additionalProperties) {
-    final onlyForRti =
-        emitter.typeTestRegistry.rtiNeededClasses.contains(classElement);
+  void emitClass(Class cls,
+                 ClassBuilder enclosingBuilder,
+                 Map<String, jsAst.Expression> additionalProperties) {
+    ClassElement classElement = cls.element;
 
     assert(invariant(classElement, classElement.isDeclaration));
-    assert(invariant(classElement, !classElement.isNative || onlyForRti));
 
     emitter.needsClassSupport = true;
-    String className = namer.getNameOfClass(classElement);
 
     ClassElement superclass = classElement.superclass;
     String superName = "";
@@ -32,19 +27,22 @@
       superName = namer.getNameOfClass(superclass);
     }
 
-    if (classElement.isMixinApplication) {
-      String mixinName = namer.getNameOfClass(computeMixinClass(classElement));
+    if (cls.isMixinApplication) {
+      MixinApplication mixinApplication = cls;
+      String mixinName = mixinApplication.mixinClass.name;
       superName = '$superName+$mixinName';
       emitter.needsMixinSupport = true;
     }
 
     ClassBuilder builder = new ClassBuilder(classElement, namer);
     builder.superName = superName;
-    emitClassConstructor(classElement, builder, onlyForRti: onlyForRti);
-    emitFields(classElement, builder, onlyForRti: onlyForRti);
-    emitClassGettersSetters(classElement, builder, onlyForRti: onlyForRti);
-    emitInstanceMembers(classElement, builder, onlyForRti: onlyForRti);
-    emitter.typeTestEmitter.emitIsTests(classElement, builder);
+    emitConstructorsForCSP(cls);
+    emitFields(cls, builder);
+    emitCheckedClassSetters(cls, builder);
+    emitClassGettersSettersForCSP(cls, builder);
+    emitInstanceMembers(cls, builder);
+    emitCallStubs(cls, builder);
+    emitRuntimeTypeInformation(cls, builder);
     if (additionalProperties != null) {
       additionalProperties.forEach(builder.addProperty);
     }
@@ -59,157 +57,125 @@
 
     emitTypeVariableReaders(classElement, builder);
 
-    emitClassBuilderWithReflectionData(
-        className, classElement, builder, properties);
+    emitClassBuilderWithReflectionData(cls, builder, enclosingBuilder);
   }
+  /**
+  * Emits the precompiled constructor when in CSP mode.
+  */
+  void emitConstructorsForCSP(Class cls) {
+    List<String> fieldNames = <String>[];
 
-  void emitClassConstructor(ClassElement classElement,
-                            ClassBuilder builder,
-                            {bool onlyForRti: false}) {
-    List<String> fields = <String>[];
-    if (!onlyForRti && !classElement.isNative) {
-      visitFields(classElement, false,
-                  (Element member,
-                   String name,
-                   String accessorName,
-                   bool needsGetter,
-                   bool needsSetter,
-                   bool needsCheckedSetter) {
-        fields.add(name);
-      });
+    if (!compiler.useContentSecurityPolicy) return;
+
+    if (!cls.onlyForRti && !cls.isNative) {
+      fieldNames = cls.fields.map((Field field) => field.name).toList();
     }
 
+    ClassElement classElement = cls.element;
+
     jsAst.Expression constructorAst =
-        _stubGenerator.generateClassConstructor(classElement, fields);
+        _stubGenerator.generateClassConstructor(classElement, fieldNames);
 
     String constructorName = namer.getNameOfClass(classElement);
     OutputUnit outputUnit =
         compiler.deferredLoadTask.outputUnitForElement(classElement);
     emitter.emitPrecompiledConstructor(
-        outputUnit, constructorName, constructorAst, fields);
+        outputUnit, constructorName, constructorAst, fieldNames);
   }
 
   /// Returns `true` if fields added.
-  bool emitFields(Element element,
+  bool emitFields(FieldContainer container,
                   ClassBuilder builder,
                   { bool classIsNative: false,
-                    bool emitStatics: false,
-                    bool onlyForRti: false }) {
-    assert(!emitStatics || !onlyForRti);
-    if (element.isLibrary) {
-      assert(invariant(element, emitStatics));
-    } else if (!element.isClass) {
-      throw new SpannableAssertionFailure(
-          element, 'Must be a ClassElement or a LibraryElement');
+                    bool emitStatics: false }) {
+    Iterable<Field> fields;
+    if (container is Class) {
+      if (emitStatics) {
+        fields = container.staticFieldsForReflection;
+      } else if (container.onlyForRti) {
+        return false;
+      } else {
+        fields = container.fields;
+      }
+    } else {
+      assert(container is Library);
+      assert(emitStatics);
+      fields = container.staticFieldsForReflection;
     }
+
     var fieldMetadata = [];
     bool hasMetadata = false;
     bool fieldsAdded = false;
 
-    if (!onlyForRti) {
-      visitFields(element, emitStatics,
-                  (VariableElement field,
-                   String name,
-                   String accessorName,
-                   bool needsGetter,
-                   bool needsSetter,
-                   bool needsCheckedSetter) {
-        // Ignore needsCheckedSetter - that is handled below.
-        bool needsAccessor = (needsGetter || needsSetter);
-        // We need to output the fields for non-native classes so we can auto-
-        // generate the constructor.  For native classes there are no
-        // constructors, so we don't need the fields unless we are generating
-        // accessors at runtime.
-        if (!classIsNative || needsAccessor) {
-          var metadata = emitter.metadataEmitter.buildMetadataFunction(field);
-          if (metadata != null) {
-            hasMetadata = true;
-          } else {
-            metadata = new jsAst.LiteralNull();
-          }
-          fieldMetadata.add(metadata);
-          recordMangledField(field, accessorName,
-              namer.privateName(field.library, field.name));
-          String fieldName = name;
-          String fieldCode = '';
-          String reflectionMarker = '';
-          if (!needsAccessor) {
-            // Emit field for constructor generation.
-            assert(!classIsNative);
-          } else {
-            // Emit (possibly renaming) field name so we can add accessors at
-            // runtime.
-            if (name != accessorName) {
-              fieldName = '$accessorName:$name';
-            }
+    for (Field field in fields) {
+      VariableElement fieldElement = field.element;
+      String name = field.name;
+      String accessorName = field.accessorName;
+      bool needsGetter = field.needsGetter;
+      bool needsSetter = field.needsUncheckedSetter;
 
-            int getterCode = 0;
-            if (needsAccessor && backend.fieldHasInterceptedGetter(field)) {
-              emitter.interceptorEmitter.interceptorInvocationNames.add(
-                  namer.getterName(field));
-            }
-            if (needsAccessor && backend.fieldHasInterceptedGetter(field)) {
-              emitter.interceptorEmitter.interceptorInvocationNames.add(
-                  namer.setterName(field));
-            }
-            if (needsGetter) {
-              if (field.isInstanceMember) {
-                // 01:  function() { return this.field; }
-                // 10:  function(receiver) { return receiver.field; }
-                // 11:  function(receiver) { return this.field; }
-                bool isIntercepted = backend.fieldHasInterceptedGetter(field);
-                getterCode += isIntercepted ? 2 : 0;
-                getterCode += backend.isInterceptorClass(element) ? 0 : 1;
-                // TODO(sra): 'isInterceptorClass' might not be the correct test
-                // for methods forced to use the interceptor convention because
-                // the method's class was elsewhere mixed-in to an interceptor.
-                assert(!field.isInstanceMember || getterCode != 0);
-                if (isIntercepted) {
-                  emitter.interceptorEmitter.interceptorInvocationNames.add(
-                      namer.getterName(field));
-                }
-              } else {
-                getterCode = 1;
-              }
-            }
-            int setterCode = 0;
-            if (needsSetter) {
-              if (field.isInstanceMember) {
-                // 01:  function(value) { this.field = value; }
-                // 10:  function(receiver, value) { receiver.field = value; }
-                // 11:  function(receiver, value) { this.field = value; }
-                bool isIntercepted = backend.fieldHasInterceptedSetter(field);
-                setterCode += isIntercepted ? 2 : 0;
-                setterCode += backend.isInterceptorClass(element) ? 0 : 1;
-                assert(!field.isInstanceMember || setterCode != 0);
-                if (isIntercepted) {
-                  emitter.interceptorEmitter.interceptorInvocationNames.add(
-                      namer.setterName(field));
-                }
-              } else {
-                setterCode = 1;
-              }
-            }
-            int code = getterCode + (setterCode << 2);
-            if (code == 0) {
-              compiler.internalError(field,
-                  'Field code is 0 ($element/$field).');
-            } else {
-              fieldCode = FIELD_CODE_CHARACTERS[code - FIRST_FIELD_CODE];
-            }
-          }
-          if (backend.isAccessibleByReflection(field)) {
-            DartType type = field.type;
-            reflectionMarker = '-${emitter.metadataEmitter.reifyType(type)}';
-          }
-          String builtFieldname = '$fieldName$fieldCode$reflectionMarker';
-          builder.addField(builtFieldname);
-          // Add 1 because adding a field to the class also requires a comma
-          compiler.dumpInfoTask.recordFieldNameSize(field,
-              builtFieldname.length + 1);
-          fieldsAdded = true;
+        // Ignore needsCheckedSetter - that is handled below.
+      bool needsAccessor = (needsGetter || needsSetter);
+      // We need to output the fields for non-native classes so we can auto-
+      // generate the constructor.  For native classes there are no
+      // constructors, so we don't need the fields unless we are generating
+      // accessors at runtime.
+      bool needsFieldsForConstructor = !emitStatics && !classIsNative;
+      if (needsFieldsForConstructor || needsAccessor) {
+        var metadata =
+            emitter.metadataEmitter.buildMetadataFunction(fieldElement);
+        if (metadata != null) {
+          hasMetadata = true;
+        } else {
+          metadata = new jsAst.LiteralNull();
         }
-      });
+        fieldMetadata.add(metadata);
+        recordMangledField(fieldElement, accessorName,
+            namer.privateName(fieldElement.library, fieldElement.name));
+        String fieldName = name;
+        String fieldCode = '';
+        String reflectionMarker = '';
+        if (!needsAccessor) {
+          // Emit field for constructor generation.
+          assert(!classIsNative);
+        } else {
+          // Emit (possibly renaming) field name so we can add accessors at
+          // runtime.
+          if (name != accessorName) {
+            fieldName = '$accessorName:$name';
+          }
+
+          if (field.needsInterceptedGetter) {
+            emitter.interceptorEmitter.interceptorInvocationNames.add(
+                namer.getterName(fieldElement));
+          }
+          // TODO(16168): The setter creator only looks at the getter-name.
+          // Even though the setter could avoid the interceptor convention we
+          // currently still need to add the additional argument.
+          if (field.needsInterceptedGetter || field.needsInterceptedSetter) {
+            emitter.interceptorEmitter.interceptorInvocationNames.add(
+                namer.setterName(fieldElement));
+          }
+
+          int code = field.getterFlags + (field.setterFlags << 2);
+          if (code == 0) {
+            compiler.internalError(fieldElement,
+                'Field code is 0 ($fieldElement).');
+          } else {
+            fieldCode = FIELD_CODE_CHARACTERS[code - FIRST_FIELD_CODE];
+          }
+        }
+        if (backend.isAccessibleByReflection(fieldElement)) {
+          DartType type = fieldElement.type;
+          reflectionMarker = '-${emitter.metadataEmitter.reifyType(type)}';
+        }
+        String builtFieldname = '$fieldName$fieldCode$reflectionMarker';
+        builder.addField(builtFieldname);
+        // Add 1 because adding a field to the class also requires a comma
+        compiler.dumpInfoTask.recordFieldNameSize(fieldElement,
+            builtFieldname.length + 1);
+        fieldsAdded = true;
+      }
     }
 
     if (hasMetadata) {
@@ -218,31 +184,44 @@
     return fieldsAdded;
   }
 
-  void emitClassGettersSetters(ClassElement classElement,
-                               ClassBuilder builder,
-                               {bool onlyForRti: false}) {
-    if (onlyForRti) return;
+  /// Emits checked setters for fields.
+  void emitCheckedClassSetters(Class cls, ClassBuilder builder) {
+    if (cls.onlyForRti) return;
 
-    visitFields(classElement, false,
-                (VariableElement member,
-                 String name,
-                 String accessorName,
-                 bool needsGetter,
-                 bool needsSetter,
-                 bool needsCheckedSetter) {
+    for (Field field in cls.fields) {
+      if (field.needsCheckedSetter) {
+        assert(!field.needsUncheckedSetter);
+        compiler.withCurrentElement(field.element, () {
+          generateCheckedSetter(
+              field.element, field.name, field.accessorName, builder);
+        });
+      }
+    }
+  }
+
+  /// Emits getters/setters for fields if compiling in CSP mode.
+  void emitClassGettersSettersForCSP(Class cls, ClassBuilder builder) {
+
+    if (!compiler.useContentSecurityPolicy || cls.onlyForRti) return;
+
+    for (Field field in cls.fields) {
+      Element member = field.element;
       compiler.withCurrentElement(member, () {
-        if (needsCheckedSetter) {
-          assert(!needsSetter);
-          generateCheckedSetter(member, name, accessorName, builder);
+        if (field.needsGetter) {
+          emitGetterForCSP(member, field.name, field.accessorName, builder);
         }
-        if (needsGetter) {
-          generateGetter(member, name, accessorName, builder);
-        }
-        if (needsSetter) {
-          generateSetter(member, name, accessorName, builder);
+        if (field.needsUncheckedSetter) {
+          emitSetterForCSP(member, field.name, field.accessorName, builder);
         }
       });
-    });
+    }
+  }
+
+  void emitCallStubs(Class cls, ClassBuilder builder) {
+    for (Method method in cls.callStubs) {
+      jsAst.Property property = builder.addProperty(method.name, method.code);
+      compiler.dumpInfoTask.registerElementAst(method.element, property);
+    }
   }
 
   /**
@@ -250,12 +229,12 @@
    *
    * Invariant: [classElement] must be a declaration element.
    */
-  void emitInstanceMembers(ClassElement classElement,
-                           ClassBuilder builder,
-                           {bool onlyForRti: false}) {
+  void emitInstanceMembers(Class cls,
+                           ClassBuilder builder) {
+    ClassElement classElement = cls.element;
     assert(invariant(classElement, classElement.isDeclaration));
 
-    if (onlyForRti || classElement.isMixinApplication) return;
+    if (cls.onlyForRti || cls.isMixinApplication) return;
 
     void visitMember(ClassElement enclosing, Element member) {
       assert(invariant(classElement, member.isDeclaration));
@@ -280,10 +259,24 @@
     }
   }
 
-  void emitClassBuilderWithReflectionData(String className,
-                                          ClassElement classElement,
+  /// Emits the members from the model.
+  void emitRuntimeTypeInformation(Class cls, ClassBuilder builder) {
+    assert(builder.functionType == null);
+    if (cls.functionTypeIndex != null) {
+      builder.functionType = '${cls.functionTypeIndex}';
+    }
+
+    for (Method method in cls.isChecks) {
+      builder.addProperty(method.name, method.code);
+    }
+  }
+
+  void emitClassBuilderWithReflectionData(Class cls,
                                           ClassBuilder classBuilder,
                                           ClassBuilder enclosingBuilder) {
+    ClassElement classElement = cls.element;
+    String className = cls.name;
+
     var metadata = emitter.metadataEmitter.buildMetadataFunction(classElement);
     if (metadata != null) {
       classBuilder.addProperty("@", metadata);
@@ -305,7 +298,7 @@
 
     List<jsAst.Property> statics = new List<jsAst.Property>();
     ClassBuilder staticsBuilder = new ClassBuilder(classElement, namer);
-    if (emitFields(classElement, staticsBuilder, emitStatics: true)) {
+    if (emitFields(cls, staticsBuilder, emitStatics: true)) {
       jsAst.ObjectInitializer initializer =
         staticsBuilder.toObjectInitializer();
       compiler.dumpInfoTask.registerElementAst(classElement,
@@ -506,8 +499,8 @@
         member, setterName, builder, isGetter: false);
   }
 
-  void generateGetter(Element member, String fieldName, String accessorName,
-                      ClassBuilder builder) {
+  void emitGetterForCSP(Element member, String fieldName, String accessorName,
+                        ClassBuilder builder) {
     jsAst.Expression function =
         _stubGenerator.generateGetter(member, fieldName);
 
@@ -525,8 +518,8 @@
     }
   }
 
-  void generateSetter(Element member, String fieldName, String accessorName,
-                      ClassBuilder builder) {
+  void emitSetterForCSP(Element member, String fieldName, String accessorName,
+                        ClassBuilder builder) {
     jsAst.Expression function =
         _stubGenerator.generateSetter(member, fieldName);
 
@@ -576,22 +569,21 @@
                               ClassBuilder builder,
                               TypeVariableElement element) {
     String name = namer.readTypeVariableName(element);
-    jsAst.Expression index =
-        js.number(RuntimeTypes.getTypeVariableIndex(element));
+    int index = RuntimeTypes.getTypeVariableIndex(element);
     jsAst.Expression computeTypeVariable;
 
     Substitution substitution =
         backend.rti.computeSubstitution(
             cls, element.typeDeclaration, alwaysGenerateFunction: true);
     if (substitution != null) {
-      jsAst.Expression typeArguments =
+      computeTypeVariable =
           js(r'#.apply(null, this.$builtinTypeInfo)',
-             substitution.getCode(backend.rti));
-      computeTypeVariable = js('#[#]', [typeArguments, index]);
+             substitution.getCodeForVariable(index, backend.rti));
     } else {
       // TODO(ahe): These can be generated dynamically.
       computeTypeVariable =
-          js(r'this.$builtinTypeInfo && this.$builtinTypeInfo[#]', index);
+          js(r'this.$builtinTypeInfo && this.$builtinTypeInfo[#]',
+              js.number(index));
     }
     jsAst.Expression convertRtiToRuntimeType = emitter
         .staticFunctionAccess(backend.findHelper('convertRtiToRuntimeType'));
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/container_builder.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/container_builder.dart
index 7f53cbd..e79e424 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/container_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/container_builder.dart
@@ -240,90 +240,6 @@
     }
   }
 
-  /**
-   * Documentation wanted -- johnniwinther
-   *
-   * Invariant: [member] must be a declaration element.
-   */
-  void emitCallStubForGetter(Element member,
-                             Set<Selector> selectors,
-                             AddPropertyFunction addProperty) {
-    assert(invariant(member, member.isDeclaration));
-    LibraryElement memberLibrary = member.library;
-    // If the method is intercepted, the stub gets the
-    // receiver explicitely and we need to pass it to the getter call.
-    bool isInterceptedMethod = backend.isInterceptedMethod(member);
-    bool isInterceptorClass =
-        backend.isInterceptorClass(member.enclosingClass);
-
-    const String receiverArgumentName = r'$receiver';
-
-    jsAst.Expression buildGetter() {
-      jsAst.Expression receiver =
-          js(isInterceptorClass ? receiverArgumentName : 'this');
-      if (member.isGetter) {
-        String getterName = namer.getterName(member);
-        if (isInterceptedMethod) {
-          return js('this.#(#)', [getterName, receiver]);
-        }
-        return js('#.#()', [receiver, getterName]);
-      } else {
-        String fieldName = namer.instanceFieldPropertyName(member);
-        return js('#.#', [receiver, fieldName]);
-      }
-    }
-
-    // Two selectors may match but differ only in type.  To avoid generating
-    // identical stubs for each we track untyped selectors which already have
-    // stubs.
-    Set<Selector> generatedSelectors = new Set<Selector>();
-    for (Selector selector in selectors) {
-      if (selector.applies(member, compiler.world)) {
-        selector = selector.asUntyped;
-        if (generatedSelectors.contains(selector)) continue;
-        generatedSelectors.add(selector);
-
-        String invocationName = namer.invocationName(selector);
-        Selector callSelector = new Selector.callClosureFrom(selector);
-        String closureCallName = namer.invocationName(callSelector);
-
-        List<jsAst.Parameter> parameters = <jsAst.Parameter>[];
-        List<jsAst.Expression> arguments = <jsAst.Expression>[];
-        if (isInterceptedMethod) {
-          parameters.add(new jsAst.Parameter(receiverArgumentName));
-        }
-
-        for (int i = 0; i < selector.argumentCount; i++) {
-          String name = 'arg$i';
-          parameters.add(new jsAst.Parameter(name));
-          arguments.add(js('#', name));
-        }
-
-        jsAst.Fun function = js(
-            'function(#) { return #.#(#); }',
-            [ parameters, buildGetter(), closureCallName, arguments]);
-
-        compiler.dumpInfoTask.registerElementAst(member,
-            addProperty(invocationName, function));
-      }
-    }
-  }
-
-  /**
-   * Documentation wanted -- johnniwinther
-   *
-   * Invariant: [member] must be a declaration element.
-   */
-  void emitExtraAccessors(Element member, ClassBuilder builder) {
-    assert(invariant(member, member.isDeclaration));
-    if (member.isGetter || member.isField) {
-      Set<Selector> selectors = compiler.codegenWorld.invokedNames[member.name];
-      if (selectors != null && !selectors.isEmpty) {
-        emitCallStubForGetter(member, selectors, builder.addProperty);
-      }
-    }
-  }
-
   void addMember(Element member, ClassBuilder builder) {
     assert(invariant(member, member.isDeclaration));
 
@@ -338,7 +254,6 @@
       compiler.internalError(member,
           'Unexpected kind: "${member.kind}".');
     }
-    if (member.isInstanceMember) emitExtraAccessors(member, builder);
   }
 
   void addMemberMethod(FunctionElement member, ClassBuilder builder) {
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
index 4adec5d..aaca01c 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
@@ -12,7 +12,6 @@
   final ContainerBuilder containerBuilder = new ContainerBuilder();
   final ClassEmitter classEmitter = new ClassEmitter();
   final NsmEmitter nsmEmitter = new NsmEmitter();
-  final TypeTestEmitter typeTestEmitter = new TypeTestEmitter();
   final InterceptorEmitter interceptorEmitter = new InterceptorEmitter();
   final MetadataEmitter metadataEmitter = new MetadataEmitter();
 
@@ -53,8 +52,8 @@
   final Map<String, String> mangledGlobalFieldNames = <String, String>{};
   final Set<String> recordedMangledNames = new Set<String>();
 
-  final Map<ClassElement, Map<String, jsAst.Expression>> additionalProperties =
-      new Map<ClassElement, Map<String, jsAst.Expression>>();
+  final Map<Class, Map<String, jsAst.Expression>> additionalProperties =
+      new Map<Class, Map<String, jsAst.Expression>>();
 
   List<TypedefElement> get typedefsNeededForReflection =>
       task.typedefsNeededForReflection;
@@ -106,7 +105,6 @@
     containerBuilder.emitter = this;
     classEmitter.emitter = this;
     nsmEmitter.emitter = this;
-    typeTestEmitter.emitter = this;
     interceptorEmitter.emitter = this;
     metadataEmitter.emitter = this;
   }
@@ -231,11 +229,6 @@
     return globalPropertyAccess(element);
   }
 
-  @override
-  jsAst.PropertyAccess closureClassConstructorAccess(ClosureClassElement e) {
-    return globalPropertyAccess(e);
-  }
-
   List<jsAst.Statement> buildTrivialNsmHandlers(){
     return nsmEmitter.buildTrivialNsmHandlers();
   }
@@ -430,11 +423,6 @@
           var hasOwnProperty = Object.prototype.hasOwnProperty;
           return function (constructor, superConstructor) {
             if (superConstructor == null) {
-              // TODO(21896): this test shouldn't be necessary. Without it
-              // we have a crash in language/mixin_only_for_rti and
-              // pkg/analysis_server/tool/spec/check_all_test.
-              if (constructor == null) return;
-
               // Fix up the the Dart Object class' prototype.
               var prototype = constructor.prototype;
               prototype.constructor = constructor;
@@ -489,17 +477,12 @@
             var mixinClass = s[1];
             finishClass(mixinClass);
             var mixin = allClasses[mixinClass];
-            // TODO(21896): this test shouldn't be necessary. Without it
-            // we have a crash in language/mixin_only_for_rti and
-            // pkg/analysis_server/tool/spec/check_all_test.
-            if (mixin) {
-              var mixinPrototype = mixin.prototype;
-              var clsPrototype = allClasses[cls].prototype;
-              for (var d in mixinPrototype) {
-                if (hasOwnProperty.call(mixinPrototype, d) &&
-                    !hasOwnProperty.call(clsPrototype, d))
-                  clsPrototype[d] = mixinPrototype[d];
-              }
+            var mixinPrototype = mixin.prototype;
+            var clsPrototype = allClasses[cls].prototype;
+            for (var d in mixinPrototype) {
+              if (hasOwnProperty.call(mixinPrototype, d) &&
+                  !hasOwnProperty.call(clsPrototype, d))
+                clsPrototype[d] = mixinPrototype[d];
             }
           }
         }
@@ -732,30 +715,37 @@
              cspPrecompiledConstructorNamesFor(outputUnit))]);
   }
 
-  void generateClass(ClassElement classElement, ClassBuilder properties) {
+  void emitClass(Class cls, ClassBuilder enclosingBuilder) {
+    ClassElement classElement = cls.element;
     compiler.withCurrentElement(classElement, () {
       if (compiler.hasIncrementalSupport) {
-        ClassBuilder builder =
+        ClassBuilder cachedBuilder =
             cachedClassBuilders.putIfAbsent(classElement, () {
               ClassBuilder builder = new ClassBuilder(classElement, namer);
-              classEmitter.generateClass(
-                  classElement, builder, additionalProperties[classElement]);
+              classEmitter.emitClass(
+                  cls, builder, additionalProperties[cls]);
               return builder;
             });
-        invariant(classElement, builder.fields.isEmpty);
-        invariant(classElement, builder.superName == null);
-        invariant(classElement, builder.functionType == null);
-        invariant(classElement, builder.fieldMetadata == null);
-        properties.properties.addAll(builder.properties);
+        invariant(classElement, cachedBuilder.fields.isEmpty);
+        invariant(classElement, cachedBuilder.superName == null);
+        invariant(classElement, cachedBuilder.functionType == null);
+        invariant(classElement, cachedBuilder.fieldMetadata == null);
+        enclosingBuilder.properties.addAll(cachedBuilder.properties);
       } else {
-        classEmitter.generateClass(
-            classElement, properties, additionalProperties[classElement]);
+        classEmitter.emitClass(
+            cls, enclosingBuilder, additionalProperties[cls]);
       }
     });
   }
 
-  void emitStaticFunctions(List<Element> staticFunctions) {
-    for (Element element in staticFunctions) {
+  void emitStaticFunctions(Iterable<Method> staticFunctions) {
+    if (staticFunctions == null) return;
+    // We need to filter out null-elements for the interceptors.
+    Iterable<Element> elements = staticFunctions
+        .where((Method method) => method.element != null)
+        .map((Method method) => method.element);
+
+    for (Element element in elements) {
       ClassBuilder builder = new ClassBuilder(element, namer);
       containerBuilder.addMember(element, builder);
       getElementDescriptor(element).properties.addAll(builder.properties);
@@ -876,24 +866,28 @@
     return namer.constantName(a).compareTo(namer.constantName(b));
   }
 
-  void emitCompileTimeConstants(CodeOutput output, OutputUnit outputUnit) {
-    List<ConstantValue> constants = outputConstantLists[outputUnit];
-    if (constants == null) return;
+  void emitCompileTimeConstants(CodeOutput output,
+                                List<Constant> constants,
+                                {bool isMainFragment}) {
+    assert(isMainFragment != null);
+
+    if (constants.isEmpty) return;
     CodeOutput constantOutput = output;
-    if (compiler.hasIncrementalSupport && outputUnit.isMainOutput) {
+    if (compiler.hasIncrementalSupport && isMainFragment) {
       constantOutput = cachedEmittedConstantsBuffer;
     }
-    for (ConstantValue constant in constants) {
-      if (compiler.hasIncrementalSupport && outputUnit.isMainOutput) {
-        if (cachedEmittedConstants.contains(constant)) continue;
-        cachedEmittedConstants.add(constant);
+    for (Constant constant in constants) {
+      ConstantValue constantValue = constant.value;
+      if (compiler.hasIncrementalSupport && isMainFragment) {
+        if (cachedEmittedConstants.contains(constantValue)) continue;
+        cachedEmittedConstants.add(constantValue);
       }
-      jsAst.Expression init = buildConstantInitializer(constant);
+      jsAst.Expression init = buildConstantInitializer(constantValue);
       constantOutput.addBuffer(jsAst.prettyPrint(init, compiler,
                                          monitor: compiler.dumpInfoTask));
       constantOutput.add('$N');
     }
-    if (compiler.hasIncrementalSupport && outputUnit.isMainOutput) {
+    if (compiler.hasIncrementalSupport && isMainFragment) {
       output.addBuffer(constantOutput);
     }
   }
@@ -927,6 +921,21 @@
     output.add(N);
   }
 
+  void emitFunctionThatReturnsNull(CodeOutput output) {
+    output.addBuffer(
+        jsAst.prettyPrint(
+            js.statement('#.# = function() {}',
+                         [backend.namer.currentIsolate,
+                          backend.rti.getFunctionThatReturnsNullName]),
+            compiler, monitor: compiler.dumpInfoTask));
+    output.add(N);
+  }
+
+  jsAst.Expression generateFunctionThatReturnsNull() {
+    return js("#.#", [backend.namer.currentIsolate,
+                      backend.rti.getFunctionThatReturnsNullName]);
+  }
+
   /// Returns the code equivalent to:
   ///   `function(args) { $.startRootIsolate(X.main$closure(), args); }`
   jsAst.Expression buildIsolateSetupClosure(Element appMain,
@@ -1252,22 +1261,6 @@
     cspPrecompiledConstructorNamesFor(outputUnit).add(js('#', constructorName));
   }
 
-  void emitLibraries(Iterable<LibraryElement> libraries) {
-    if (libraries.isEmpty) return;
-
-    // TODO(karlklose): document what kinds of fields this loop adds to the
-    // library class builder.
-    for (LibraryElement element in libraries) {
-      LibraryElement library = element;
-      ClassBuilder builder = new ClassBuilder(library, namer);
-      if (classEmitter.emitFields(library, builder, emitStatics: true)) {
-        jsAst.ObjectInitializer initializer = builder.toObjectInitializer();
-        compiler.dumpInfoTask.registerElementAst(builder.element, initializer);
-        getElementDescriptor(library).properties.addAll(initializer.properties);
-      }
-    }
-  }
-
   void emitTypedefs() {
     OutputUnit mainOutputUnit = compiler.deferredLoadTask.mainOutputUnit;
 
@@ -1275,7 +1268,6 @@
     // TODO(karlklose): unify required classes and typedefs to declarations
     // and have builders for each kind.
     for (TypedefElement typedef in typedefsNeededForReflection) {
-      OutputUnit mainUnit = compiler.deferredLoadTask.mainOutputUnit;
       LibraryElement library = typedef.library;
       // TODO(karlklose): add a TypedefBuilder and move this code there.
       DartType type = typedef.alias;
@@ -1369,8 +1361,25 @@
     }
   }
 
-  void emitMainOutputUnit(Map<OutputUnit, String> deferredLoadHashes,
+  void emitLibrary(Library library) {
+    LibraryElement libraryElement = library.element;
+
+    emitStaticFunctions(library.statics);
+
+    ClassBuilder libraryBuilder = getElementDescriptor(libraryElement);
+    for (Class cls in library.classes) {
+      emitClass(cls, libraryBuilder);
+    }
+
+    classEmitter.emitFields(library, libraryBuilder, emitStatics: true);
+  }
+
+  void emitMainOutputUnit(Program program,
+                          Map<OutputUnit, String> deferredLoadHashes,
                           CodeBuffer nativeBuffer) {
+    Fragment mainFragment = program.fragments.first;
+    OutputUnit mainOutputUnit = mainFragment.outputUnit;
+
     LineColumnCollector lineColumnCollector;
     List<CodeOutputListener> codeOutputListeners;
     if (generateSourceMap) {
@@ -1378,13 +1387,12 @@
       codeOutputListeners = <CodeOutputListener>[lineColumnCollector];
     }
 
-    OutputUnit mainOutputUnit = compiler.deferredLoadTask.mainOutputUnit;
     CodeOutput mainOutput =
         new StreamCodeOutput(compiler.outputProvider('', 'js'),
                              codeOutputListeners);
     outputBuffers[mainOutputUnit] = mainOutput;
 
-    bool isProgramSplit = compiler.deferredLoadTask.isProgramSplit;
+    bool isProgramSplit = program.isSplit;
 
     mainOutput.add(buildGeneratedBy());
     addComment(HOOKS_API_USAGE, mainOutput);
@@ -1464,23 +1472,12 @@
     mainOutput.add('init()$N$n');
     mainOutput.add('$isolateProperties$_=$_$isolatePropertiesName$N');
 
-    emitStaticFunctions(task.outputStaticLists[mainOutputUnit]);
-
-    List<ClassElement> classes = task.outputClassLists[mainOutputUnit];
-    if (classes != null) {
-      for (ClassElement element in classes) {
-        generateClass(element, getElementDescriptor(element));
-      }
-    }
-
-    if (compiler.enableMinification) {
-      mainOutput.add(';');
-    }
+    emitFunctionThatReturnsNull(mainOutput);
+    mainFragment.libraries.forEach(emitLibrary);
 
     Iterable<LibraryElement> libraries =
         task.outputLibraryLists[mainOutputUnit];
     if (libraries == null) libraries = [];
-    emitLibraries(libraries);
     emitTypedefs();
     emitMangledNames(mainOutput);
 
@@ -1518,7 +1515,8 @@
     // which may need getInterceptor (and one-shot interceptor) methods, so
     // we have to make sure that [emitGetInterceptorMethods] and
     // [emitOneShotInterceptors] have been called.
-    emitCompileTimeConstants(mainOutput, mainOutputUnit);
+    emitCompileTimeConstants(
+        mainOutput, mainFragment.constants, isMainFragment: true);
 
     emitDeferredBoilerPlate(mainOutput, deferredLoadHashes);
 
@@ -1737,32 +1735,22 @@
   /// identifies the code of the output-unit. It does not include
   /// boilerplate JS code, like the sourcemap directives or the hash
   /// itself.
-  Map<OutputUnit, String> emitDeferredOutputUnits() {
-    if (!compiler.deferredLoadTask.isProgramSplit) return const {};
+  Map<OutputUnit, String> emitDeferredOutputUnits(Program program) {
+    if (!program.isSplit) return const {};
 
     Map<OutputUnit, CodeBuffer> outputBuffers =
         new Map<OutputUnit, CodeBuffer>();
 
-    for (OutputUnit outputUnit in compiler.deferredLoadTask.allOutputUnits) {
-      if (outputUnit == compiler.deferredLoadTask.mainOutputUnit) continue;
+    for (Fragment fragment in program.deferredFragments) {
+      OutputUnit outputUnit = fragment.outputUnit;
 
-      List<Element> functions = task.outputStaticLists[outputUnit];
-      if (functions != null) {
-        emitStaticFunctions(functions);
-      }
 
-      List<ClassElement> classes = task.outputClassLists[outputUnit];
-      if (classes != null) {
-        for (ClassElement element in classes) {
-          generateClass(element, getElementDescriptor(element));
-        }
-      }
+      fragment.libraries.forEach(emitLibrary);
 
       if (elementDescriptors.isNotEmpty) {
         Iterable<LibraryElement> libraries =
             task.outputLibraryLists[outputUnit];
         if (libraries == null) libraries = [];
-        emitLibraries(libraries);
 
         // TODO(johnniwinther): Avoid creating [CodeBuffer]s.
         CodeBuffer buffer = new CodeBuffer();
@@ -1774,20 +1762,28 @@
       }
     }
 
-    return emitDeferredCode(outputBuffers);
+    return emitDeferredCode(program, outputBuffers);
   }
 
-  CodeBuffer buildNativesBuffer() {
+  CodeBuffer buildNativesBuffer(Program program) {
     // Emit native classes on [nativeBuffer].
     // TODO(johnniwinther): Avoid creating a [CodeBuffer].
     final CodeBuffer nativeBuffer = new CodeBuffer();
 
-    if (nativeClasses.isEmpty) return nativeBuffer;
+    if (program.nativeClasses.isEmpty) return nativeBuffer;
 
 
     addComment('Native classes', nativeBuffer);
 
-    nativeEmitter.generateNativeClasses(nativeClasses, additionalProperties);
+    List<Class> neededClasses =
+        nativeEmitter.prepareNativeClasses(program.nativeClasses,
+                                           additionalProperties);
+
+    for (Class cls in neededClasses) {
+      assert(cls.isNative);
+      ClassBuilder enclosingBuilder = getElementDescriptor(cls.element);
+      emitClass(cls, enclosingBuilder);
+    }
 
     nativeEmitter.finishGenerateNativeClasses();
     nativeEmitter.assembleCode(nativeBuffer);
@@ -1795,7 +1791,10 @@
     return nativeBuffer;
   }
 
-  int emitProgram(Program program) {
+  int emitProgram(ProgramBuilder programBuilder) {
+    Program program = programBuilder.buildProgram(
+        storeFunctionTypesInMetadata: true);
+
     // Shorten the code by using [namer.currentIsolate] as temporary.
     isolateProperties = namer.currentIsolate;
 
@@ -1804,9 +1803,10 @@
     // identifies the code of the output-unit. It does not include
     // boilerplate JS code, like the sourcemap directives or the hash
     // itself.
-    Map<OutputUnit, String> deferredLoadHashes = emitDeferredOutputUnits();
-    CodeBuffer nativeBuffer = buildNativesBuffer();
-    emitMainOutputUnit(deferredLoadHashes, nativeBuffer);
+    Map<OutputUnit, String> deferredLoadHashes =
+        emitDeferredOutputUnits(program);
+    CodeBuffer nativeBuffer = buildNativesBuffer(program);
+    emitMainOutputUnit(program, deferredLoadHashes, nativeBuffer);
 
     if (backend.requiresPreamble &&
         !backend.htmlLibraryIsLoaded) {
@@ -1929,12 +1929,13 @@
   /// Returns a mapping from outputUnit to a hash of the corresponding hunk that
   /// can be used for calling the initializer.
   Map<OutputUnit, String> emitDeferredCode(
+      Program program,
       Map<OutputUnit, CodeBuffer> deferredBuffers) {
 
     Map<OutputUnit, String> hunkHashes = new Map<OutputUnit, String>();
 
-    for (OutputUnit outputUnit in compiler.deferredLoadTask.allOutputUnits) {
-      if (outputUnit == compiler.deferredLoadTask.mainOutputUnit) continue;
+    for (Fragment fragment in program.deferredFragments) {
+      OutputUnit outputUnit = fragment.outputUnit;
 
       CodeOutput libraryDescriptorBuffer = deferredBuffers[outputUnit];
 
@@ -1998,7 +1999,8 @@
       // access the wrong object.
       output.add("${namer.currentIsolate}$_=${_}arguments[1]$N");
 
-      emitCompileTimeConstants(output, outputUnit);
+      emitCompileTimeConstants(
+          output, fragment.constants, isMainFragment: false);
       emitStaticNonFinalFieldInitializations(output, outputUnit);
       output.add('}$N');
 
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/reflection_data_parser.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/reflection_data_parser.dart
index 993db08..9eacb14 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/reflection_data_parser.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/reflection_data_parser.dart
@@ -423,7 +423,7 @@
   if (compiler.hasIncrementalSupport) {
     incrementalSupport.add(
         js.statement(
-            r'self.$dart_unsafe_eval.addStubs = addStubs;'));
+            '#.addStubs = addStubs;', [namer.accessIncrementalHelper]));
   }
 
   return js('''
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/type_test_emitter.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/type_test_emitter.dart
deleted file mode 100644
index af0bd0c..0000000
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/type_test_emitter.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart2js.js_emitter;
-
-class TypeTestEmitter extends CodeEmitterHelper {
-  void emitIsTests(ClassElement classElement, ClassBuilder builder) {
-    assert(builder.functionType == null);
-    TypeTestGenerator generator =
-        new TypeTestGenerator(compiler, emitter.task, namer);
-    TypeTestProperties typeTests = generator.generateIsTests(classElement);
-    typeTests.properties.forEach(builder.addProperty);
-    if (typeTests.functionTypeIndex != null) {
-      builder.functionType = '${typeTests.functionTypeIndex}';
-    }
-  }
-}
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder.dart
index 79885e03..4e2f555 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder.dart
@@ -15,11 +15,9 @@
     JavaScriptBackend,
     JavaScriptConstantCompiler;
 
-import '../closure.dart' show ClosureFieldElement;
-
-import 'js_emitter.dart' as emitterTask show
+import 'js_emitter.dart' show
+    ClassStubGenerator,
     CodeEmitterTask,
-    Emitter,
     InterceptorStubGenerator,
     TypeTestGenerator,
     TypeTestProperties;
@@ -32,10 +30,13 @@
 class ProgramBuilder {
   final Compiler _compiler;
   final Namer namer;
-  final emitterTask.CodeEmitterTask _task;
+  final CodeEmitterTask _task;
 
   final Registry _registry;
 
+  /// True if the program should store function types in the metadata.
+  bool _storeFunctionTypesInMetadata = false;
+
   ProgramBuilder(Compiler compiler,
                  this.namer,
                  this._task)
@@ -49,48 +50,63 @@
   /// update the superclass in the [Class].
   final Map<ClassElement, Class> _classes = <ClassElement, Class>{};
 
-  /// Mapping from [OutputUnit] to constructed [Output]. We need this to
+  /// Mapping from [OutputUnit] to constructed [Fragment]. We need this to
   /// generate the deferredLoadingMap (to know which hunks to load).
-  final Map<OutputUnit, Output> _outputs = <OutputUnit, Output>{};
+  final Map<OutputUnit, Fragment> _outputs = <OutputUnit, Fragment>{};
 
   /// Mapping from [ConstantValue] to constructed [Constant]. We need this to
   /// update field-initializers to point to the ConstantModel.
   final Map<ConstantValue, Constant> _constants = <ConstantValue, Constant>{};
 
-  Program buildProgram() {
+  Program buildProgram({bool storeFunctionTypesInMetadata: false}) {
+    this._storeFunctionTypesInMetadata = storeFunctionTypesInMetadata;
+    // Note: In rare cases (mostly tests) output units can be empty. This
+    // happens when the deferred code is dead-code eliminated but we still need
+    // to check that the library has been loaded.
+    _compiler.deferredLoadTask.allOutputUnits.forEach(
+        _registry.registerOutputUnit);
     _task.outputClassLists.forEach(_registry.registerElements);
     _task.outputStaticLists.forEach(_registry.registerElements);
     _task.outputConstantLists.forEach(_registerConstants);
+    _task.outputStaticNonFinalFieldLists.forEach(_registry.registerElements);
 
     // TODO(kasperl): There's code that implicitly needs access to the special
     // $ holder so we have to register that. Can we track if we have to?
     _registry.registerHolder(r'$');
 
-    MainOutput mainOutput = _buildMainOutput(_registry.mainFragment);
-    Iterable<Output> deferredOutputs = _registry.deferredFragments
-        .map((fragment) => _buildDeferredOutput(mainOutput, fragment));
+    MainFragment mainOutput = _buildMainOutput(_registry.mainLibrariesMap);
+    Iterable<Fragment> deferredOutputs = _registry.deferredLibrariesMap
+        .map((librariesMap) => _buildDeferredOutput(mainOutput, librariesMap));
 
-    List<Output> outputs = new List<Output>(_registry.fragmentCount);
+    List<Fragment> outputs = new List<Fragment>(_registry.librariesMapCount);
     outputs[0] = mainOutput;
     outputs.setAll(1, deferredOutputs);
 
-    Program result =
-        new Program(outputs, _task.outputContainsConstantList, _buildLoadMap());
+    List<Class> nativeClasses = _task.nativeClasses
+        .map((ClassElement classElement) {
+          Class result = _classes[classElement];
+          return (result == null) ? _buildClass(classElement) : result;
+        })
+        .toList();
 
     // Resolve the superclass references after we've processed all the classes.
     _classes.forEach((ClassElement element, Class c) {
       if (element.superclass != null) {
         c.setSuperclass(_classes[element.superclass]);
+        assert(c.superclass != null);
       }
-      if (element.isMixinApplication) {
-        MixinApplication mixinApplication = c;
-        mixinApplication.setMixinClass(_classes[computeMixinClass(element)]);
+      if (c is MixinApplication) {
+        c.setMixinClass(_classes[computeMixinClass(element)]);
+        assert(c.mixinClass != null);
       }
     });
 
     _markEagerClasses();
 
-    return result;
+    return new Program(outputs,
+                       nativeClasses,
+                       _task.outputContainsConstantList,
+                       _buildLoadMap());
   }
 
   void _markEagerClasses() {
@@ -98,13 +114,13 @@
   }
 
   /// Builds a map from loadId to outputs-to-load.
-  Map<String, List<Output>> _buildLoadMap() {
+  Map<String, List<Fragment>> _buildLoadMap() {
     List<OutputUnit> convertHunks(List<OutputUnit> hunks) {
       return hunks.map((OutputUnit unit) => _outputs[unit])
           .toList(growable: false);
     }
 
-    Map<String, List<Output>> loadMap = <String, List<Output>>{};
+    Map<String, List<Fragment>> loadMap = <String, List<Fragment>>{};
     _compiler.deferredLoadTask.hunksToLoad
         .forEach((String loadId, List<OutputUnit> outputUnits) {
       loadMap[loadId] = outputUnits
@@ -114,46 +130,50 @@
     return loadMap;
   }
 
-  MainOutput _buildMainOutput(Fragment fragment) {
+  MainFragment _buildMainOutput(LibrariesMap librariesMap) {
     // Construct the main output from the libraries and the registered holders.
-    MainOutput result = new MainOutput(
+    MainFragment result = new MainFragment(
+        librariesMap.outputUnit,
         "",  // The empty string is the name for the main output file.
         backend.emitter.staticFunctionAccess(_compiler.mainFunction),
-        _buildLibraries(fragment),
-        _buildStaticNonFinalFields(fragment),
-        _buildStaticLazilyInitializedFields(fragment),
-        _buildConstants(fragment),
+        _buildLibraries(librariesMap),
+        _buildStaticNonFinalFields(librariesMap),
+        _buildStaticLazilyInitializedFields(librariesMap),
+        _buildConstants(librariesMap),
         _registry.holders.toList(growable: false));
-    _outputs[fragment.outputUnit] = result;
+    _outputs[librariesMap.outputUnit] = result;
     return result;
   }
 
-  DeferredOutput _buildDeferredOutput(MainOutput mainOutput,
-                                      Fragment fragment) {
-    DeferredOutput result = new DeferredOutput(
-        backend.deferredPartFileName(fragment.name, addExtension: false),
-                                     fragment.name,
+  DeferredFragment _buildDeferredOutput(MainFragment mainOutput,
+                                      LibrariesMap librariesMap) {
+    DeferredFragment result = new DeferredFragment(
+        librariesMap.outputUnit,
+        backend.deferredPartFileName(librariesMap.name, addExtension: false),
+                                     librariesMap.name,
         mainOutput,
-        _buildLibraries(fragment),
-        _buildStaticNonFinalFields(fragment),
-        _buildStaticLazilyInitializedFields(fragment),
-        _buildConstants(fragment));
-    _outputs[fragment.outputUnit] = result;
+        _buildLibraries(librariesMap),
+        _buildStaticNonFinalFields(librariesMap),
+        _buildStaticLazilyInitializedFields(librariesMap),
+        _buildConstants(librariesMap));
+    _outputs[librariesMap.outputUnit] = result;
     return result;
   }
 
-  List<Constant> _buildConstants(Fragment fragment) {
+  List<Constant> _buildConstants(LibrariesMap librariesMap) {
     List<ConstantValue> constantValues =
-        _task.outputConstantLists[fragment.outputUnit];
+        _task.outputConstantLists[librariesMap.outputUnit];
     if (constantValues == null) return const <Constant>[];
     return constantValues.map((ConstantValue value) => _constants[value])
         .toList(growable: false);
   }
 
-  List<StaticField> _buildStaticNonFinalFields(Fragment fragment) {
+  List<StaticField> _buildStaticNonFinalFields(LibrariesMap librariesMap) {
     // TODO(floitsch): handle static non-final fields correctly with deferred
     // libraries.
-    if (fragment != _registry.mainFragment) return const <StaticField>[];
+    if (librariesMap != _registry.mainLibrariesMap) {
+      return const <StaticField>[];
+    }
     Iterable<VariableElement> staticNonFinalFields =
         backend.constants.getStaticNonFinalFieldsForEmission();
     return Elements.sortedByPosition(staticNonFinalFields)
@@ -173,10 +193,13 @@
                            isFinal, isLazy);
   }
 
-  List<StaticField> _buildStaticLazilyInitializedFields(Fragment fragment) {
+  List<StaticField> _buildStaticLazilyInitializedFields(
+      LibrariesMap librariesMap) {
     // TODO(floitsch): lazy fields should just be in their respective
     // libraries.
-    if (fragment != _registry.mainFragment) return const <StaticField>[];
+    if (librariesMap != _registry.mainLibrariesMap) {
+      return const <StaticField>[];
+    }
 
     JavaScriptConstantCompiler handler = backend.constants;
     List<VariableElement> lazyFields =
@@ -203,10 +226,10 @@
                            isFinal, isLazy);
   }
 
-  List<Library> _buildLibraries(Fragment fragment) {
-    List<Library> libraries = new List<Library>(fragment.length);
+  List<Library> _buildLibraries(LibrariesMap librariesMap) {
+    List<Library> libraries = new List<Library>(librariesMap.length);
     int count = 0;
-    fragment.forEach((LibraryElement library, List<Element> elements) {
+    librariesMap.forEach((LibraryElement library, List<Element> elements) {
       libraries[count++] = _buildLibrary(library, elements);
     });
     return libraries;
@@ -218,12 +241,9 @@
     String uri = library.canonicalUri.toString();
 
     List<StaticMethod> statics = elements
-        .where((e) => e is FunctionElement).map(_buildStaticMethod).toList();
-
-    statics.addAll(elements
         .where((e) => e is FunctionElement)
-        .where((e) => universe.staticFunctionsNeedingGetter.contains(e))
-        .map(_buildStaticMethodTearOff));
+        .map(_buildStaticMethod)
+        .toList();
 
     if (library == backend.interceptorsLibrary) {
       statics.addAll(_generateGetInterceptorMethods());
@@ -235,12 +255,40 @@
         .map(_buildClass)
         .toList(growable: false);
 
-    return new Library(library, uri, statics, classes);
+    bool visitStatics = true;
+    List<Field> staticFieldsForReflection = _buildFields(library, visitStatics);
+
+    return new Library(library, uri, statics, classes,
+                       staticFieldsForReflection);
+  }
+
+  /// HACK for Try.
+  ///
+  /// Returns a class that contains the fields of a class.
+  Class buildClassWithFieldsForTry(ClassElement element) {
+    bool onlyForRti = _task.typeTestRegistry.rtiNeededClasses.contains(element);
+
+    List<Field> instanceFields =
+        onlyForRti ? const <Field>[] : _buildFields(element, false);
+
+    String name = namer.getNameOfClass(element);
+    String holderName = namer.globalObjectFor(element);
+    Holder holder = _registry.registerHolder(holderName);
+    bool isInstantiated =
+        _compiler.codegenWorld.directlyInstantiatedClasses.contains(element);
+
+    return new Class(
+        element, name, holder, [], instanceFields, [], [], [], null,
+        isDirectlyInstantiated: isInstantiated,
+        onlyForRti: onlyForRti,
+        isNative: element.isNative);
   }
 
   Class _buildClass(ClassElement element) {
+    bool onlyForRti = _task.typeTestRegistry.rtiNeededClasses.contains(element);
+
     List<Method> methods = [];
-    List<InstanceField> fields = [];
+    List<StubMethod> callStubs = <StubMethod>[];
 
     void visitMember(ClassElement enclosing, Element member) {
       assert(invariant(element, member.isDeclaration));
@@ -250,8 +298,19 @@
         js.Expression code = backend.generatedCode[member];
         // TODO(kasperl): Figure out under which conditions code is null.
         if (code != null) methods.add(_buildMethod(member, code));
-      } else if (member.isField && !member.isStatic) {
-        fields.add(_buildInstanceField(member, enclosing));
+      }
+      if (member.isGetter || member.isField) {
+        Set<Selector> selectors =
+            _compiler.codegenWorld.invokedNames[member.name];
+        if (selectors != null && !selectors.isEmpty) {
+          ClassStubGenerator generator =
+              new ClassStubGenerator(_compiler, namer, backend);
+          Map<String, js.Expression> callStubsForMember =
+              generator.generateCallStubsForGetter(member, selectors);
+          callStubsForMember.forEach((String name, js.Expression code) {
+            callStubs.add(_buildStubMethod(name, code, element: member));
+          });
+        }
       }
     }
 
@@ -259,46 +318,57 @@
 
     // MixinApplications run through the members of their mixin. Here, we are
     // only interested in direct members.
-    if (!element.isMixinApplication) {
+    if (!onlyForRti && !element.isMixinApplication) {
       implementation.forEachMember(visitMember, includeBackendMembers: true);
     }
 
-    emitterTask.TypeTestGenerator generator =
-        new emitterTask.TypeTestGenerator(_compiler, _task, namer);
-    emitterTask.TypeTestProperties typeTests =
-        generator.generateIsTests(element);
+    List<Field> instanceFields =
+        onlyForRti ? const <Field>[] : _buildFields(element, false);
+    List<Field> staticFieldsForReflection =
+        onlyForRti ? const <Field>[] : _buildFields(element, true);
 
-    // At this point a mixin application must not have any methods or fields.
-    // Type-tests might be added to mixin applications, too.
-    assert(!element.isMixinApplication || methods.isEmpty);
-    assert(!element.isMixinApplication || fields.isEmpty);
+    TypeTestGenerator generator =
+        new TypeTestGenerator(_compiler, _task, namer);
+    TypeTestProperties typeTests =
+        generator.generateIsTests(
+            element,
+            storeFunctionTypeInMetadata: _storeFunctionTypesInMetadata);
 
-    // TODO(floitsch): we should not add the code here, but have a list of
-    // is/as classes in the Class object.
-    // The individual emitters should then call the type test generator to
-    // generate the code.
+    List<StubMethod> isChecks = <StubMethod>[];
     typeTests.properties.forEach((String name, js.Node code) {
-      methods.add(_buildStubMethod(name, code));
+      isChecks.add(_buildStubMethod(name, code));
     });
 
     String name = namer.getNameOfClass(element);
     String holderName = namer.globalObjectFor(element);
     Holder holder = _registry.registerHolder(holderName);
-    bool onlyForRti = _task.typeTestRegistry.rtiNeededClasses.contains(element);
     bool isInstantiated =
         _compiler.codegenWorld.directlyInstantiatedClasses.contains(element);
 
     Class result;
-    if (element.isMixinApplication) {
+    if (element.isMixinApplication && !onlyForRti) {
+      assert(!element.isNative);
+      assert(methods.isEmpty);
+
       result = new MixinApplication(element,
-                                    name, holder, methods, fields,
+                                    name, holder,
+                                    instanceFields,
+                                    staticFieldsForReflection,
+                                    callStubs,
+                                    isChecks,
+                                    typeTests.functionTypeIndex,
                                     isDirectlyInstantiated: isInstantiated,
                                     onlyForRti: onlyForRti);
     } else {
       result = new Class(element,
-                         name, holder, methods, fields,
+                         name, holder, methods, instanceFields,
+                         staticFieldsForReflection,
+                         callStubs,
+                         isChecks,
+                         typeTests.functionTypeIndex,
                          isDirectlyInstantiated: isInstantiated,
-                         onlyForRti: onlyForRti);
+                         onlyForRti: onlyForRti,
+                         isNative: element.isNative);
     }
     _classes[element] = result;
     return result;
@@ -306,11 +376,18 @@
 
   Method _buildMethod(FunctionElement element, js.Expression code) {
     String name = namer.getNameOfInstanceMember(element);
-    return new Method(element, name, code);
+    // TODO(floitsch): compute `needsTearOff`.
+    return new Method(element, name, code, needsTearOff: false);
   }
 
-  Method _buildStubMethod(String name, js.Expression code) {
-    return new StubMethod(name, code);
+  /// Builds a stub method.
+  ///
+  /// Stub methods may have an element that can be used for code-size
+  /// attribution.
+  Method _buildStubMethod(String name, js.Expression code,
+                          {Element element}) {
+    // TODO(floitsch): compute `needsTearOff`.
+    return new StubMethod(name, code, needsTearOff: false, element: element);
   }
 
   // The getInterceptor methods directly access the prototype of classes.
@@ -328,8 +405,8 @@
   }
 
   Iterable<StaticMethod> _generateGetInterceptorMethods() {
-    emitterTask.InterceptorStubGenerator stubGenerator =
-        new emitterTask.InterceptorStubGenerator(_compiler, namer, backend);
+    InterceptorStubGenerator stubGenerator =
+        new InterceptorStubGenerator(_compiler, namer, backend);
 
     String holderName = namer.globalObjectFor(backend.interceptorsLibrary);
     Holder holder = _registry.registerHolder(holderName);
@@ -340,69 +417,60 @@
     return names.map((String name) {
       Set<ClassElement> classes = specializedGetInterceptors[name];
       js.Expression code = stubGenerator.generateGetInterceptorMethod(classes);
-      return new StaticStubMethod(name, holder, code);
+      // TODO(floitsch): compute `needsTearOff`.
+      return new StaticStubMethod(name, holder, code, needsTearOff: false);
     });
   }
 
-  bool _fieldNeedsGetter(VariableElement field) {
-    assert(field.isField);
-    if (_fieldAccessNeverThrows(field)) return false;
-    return backend.shouldRetainGetter(field)
-        || _compiler.codegenWorld.hasInvokedGetter(field, _compiler.world);
-  }
+  List<Field> _buildFields(Element holder, bool visitStatics) {
+    List<Field> fields = <Field>[];
+    _task.oldEmitter.classEmitter.visitFields(
+        holder, visitStatics, (VariableElement field,
+                               String name,
+                               String accessorName,
+                               bool needsGetter,
+                               bool needsSetter,
+                               bool needsCheckedSetter) {
+      assert(invariant(field, field.isDeclaration));
 
-  bool _fieldNeedsSetter(VariableElement field) {
-    assert(field.isField);
-    if (_fieldAccessNeverThrows(field)) return false;
-    return (!field.isFinal && !field.isConst)
-        && (backend.shouldRetainSetter(field)
-            || _compiler.codegenWorld.hasInvokedSetter(field, _compiler.world));
-  }
-
-  // We never access a field in a closure (a captured variable) without knowing
-  // that it is there.  Therefore we don't need to use a getter (that will throw
-  // if the getter method is missing), but can always access the field directly.
-  bool _fieldAccessNeverThrows(VariableElement field) {
-    return field is ClosureFieldElement;
-  }
-
-  InstanceField _buildInstanceField(VariableElement field,
-                                    ClassElement holder) {
-    assert(invariant(field, field.isDeclaration));
-    String name = namer.fieldPropertyName(field);
-
-    int getterFlags = 0;
-    if (_fieldNeedsGetter(field)) {
-      bool isIntercepted = backend.fieldHasInterceptedGetter(field);
-      if (isIntercepted) {
-        getterFlags += 2;
-        if (backend.isInterceptorClass(holder)) {
-          getterFlags += 1;
+      int getterFlags = 0;
+      if (needsGetter) {
+        if (visitStatics || !backend.fieldHasInterceptedGetter(field)) {
+          getterFlags = 1;
+        } else {
+          getterFlags += 2;
+          // TODO(sra): 'isInterceptorClass' might not be the correct test
+          // for methods forced to use the interceptor convention because
+          // the method's class was elsewhere mixed-in to an interceptor.
+          if (!backend.isInterceptorClass(holder)) {
+            getterFlags += 1;
+          }
         }
-      } else {
-        getterFlags = 1;
       }
-    }
 
-    int setterFlags = 0;
-    if (_fieldNeedsSetter(field)) {
-      bool isIntercepted = backend.fieldHasInterceptedSetter(field);
-      if (isIntercepted) {
-        setterFlags += 2;
-        if (backend.isInterceptorClass(holder)) {
-          setterFlags += 1;
+      int setterFlags = 0;
+      if (needsSetter) {
+        if (visitStatics || !backend.fieldHasInterceptedSetter(field)) {
+          setterFlags = 1;
+        } else {
+          setterFlags += 2;
+          if (!backend.isInterceptorClass(holder)) {
+            setterFlags += 1;
+          }
         }
-      } else {
-        setterFlags = 1;
       }
-    }
 
-    return new InstanceField(field, name, getterFlags, setterFlags);
+      fields.add(new Field(field, name, accessorName,
+                           getterFlags, setterFlags,
+                           needsCheckedSetter));
+    });
+
+    return fields;
   }
 
   Iterable<StaticMethod> _generateOneShotInterceptors() {
-    emitterTask.InterceptorStubGenerator stubGenerator =
-        new emitterTask.InterceptorStubGenerator(_compiler, namer, backend);
+    InterceptorStubGenerator stubGenerator =
+        new InterceptorStubGenerator(_compiler, namer, backend);
 
     String holderName = namer.globalObjectFor(backend.interceptorsLibrary);
     Holder holder = _registry.registerHolder(holderName);
@@ -410,7 +478,7 @@
     List<String> names = backend.oneShotInterceptors.keys.toList()..sort();
     return names.map((String name) {
       js.Expression code = stubGenerator.generateOneShotInterceptor(name);
-      return new StaticStubMethod(name, holder, code);
+      return new StaticStubMethod(name, holder, code, needsTearOff: false);
     });
   }
 
@@ -418,21 +486,17 @@
     String name = namer.getNameOfMember(element);
     String holder = namer.globalObjectFor(element);
     js.Expression code = backend.generatedCode[element];
+    bool needsTearOff =
+        universe.staticFunctionsNeedingGetter.contains(element);
+    // TODO(floitsch): add tear-off name: namer.getStaticClosureName(element).
     return new StaticMethod(element,
-                            name, _registry.registerHolder(holder), code);
-  }
-
-  StaticMethod _buildStaticMethodTearOff(FunctionElement element) {
-    String name = namer.getStaticClosureName(element);
-    String holder = namer.globalObjectFor(element);
-    // TODO(kasperl): This clearly doesn't work yet.
-    js.Expression code = js.string("<<unimplemented>>");
-    return new StaticMethod(element,
-                            name, _registry.registerHolder(holder), code);
+                            name, _registry.registerHolder(holder), code,
+                            needsTearOff: needsTearOff);
   }
 
   void _registerConstants(OutputUnit outputUnit,
-                          List<ConstantValue> constantValues) {
+                          Iterable<ConstantValue> constantValues) {
+    // `constantValues` is null if an outputUnit doesn't contain any constants.
     if (constantValues == null) return;
     for (ConstantValue constantValue in constantValues) {
       _registry.registerConstant(outputUnit, constantValue);
@@ -442,6 +506,6 @@
       Holder holder = _registry.registerHolder(constantObject);
       Constant constant = new Constant(name, holder, constantValue);
       _constants[constantValue] = constant;
-    };
+    }
   }
 }
diff --git a/pkg/compiler/lib/src/js_emitter/registry.dart b/pkg/compiler/lib/src/js_emitter/registry.dart
index e0115b1..d8dfff0 100644
--- a/pkg/compiler/lib/src/js_emitter/registry.dart
+++ b/pkg/compiler/lib/src/js_emitter/registry.dart
@@ -4,11 +4,13 @@
 
 part of dart2js.js_emitter.program_builder;
 
-/// A Fragment maps [LibraryElement]s to their [Element]s.
+/// Maps [LibraryElement]s to their [Element]s.
 ///
 /// Fundamentally, this class nicely encapsulates a
 /// `Map<LibraryElement, List<Element>>`.
-class Fragment {
+///
+/// There exists exactly one instance per [OutputUnit].
+class LibrariesMap {
   final Map<LibraryElement, List<Element>> _mapping =
       <LibraryElement, List<Element>>{};
 
@@ -17,13 +19,13 @@
   LibraryElement _lastLibrary;
   List<Element> _lastElements;
 
-  /// A unique name representing this fragment.
+  /// A unique name representing this instance.
   final String name;
   final OutputUnit outputUnit;
 
-  Fragment.main(this.outputUnit) : name = "";
+  LibrariesMap.main(this.outputUnit) : name = "";
 
-  Fragment.deferred(this.outputUnit, this.name) {
+  LibrariesMap.deferred(this.outputUnit, this.name) {
     assert(name != "");
   }
 
@@ -44,65 +46,72 @@
 
 /// Keeps track of all elements and holders.
 ///
-/// This class assigns each registered element to its [Fragment] (which are in
-/// bijection with [OutputUnit]s).
+/// This class assigns each registered element to its [LibrariesMap] (which are
+/// in bijection with [OutputUnit]s).
 ///
 /// Registered holders are assigned a name.
 class Registry {
   final Compiler _compiler;
   final Map<String, Holder> _holdersMap = <String, Holder>{};
-  final Map<OutputUnit, Fragment> _deferredFragmentsMap =
-      <OutputUnit, Fragment>{};
+  final Map<OutputUnit, LibrariesMap> _deferredLibrariesMap =
+      <OutputUnit, LibrariesMap>{};
 
   /// Cache for the last seen output unit.
   OutputUnit _lastOutputUnit;
-  Fragment _lastFragment;
+  LibrariesMap _lastLibrariesMap;
 
   DeferredLoadTask get _deferredLoadTask => _compiler.deferredLoadTask;
   Iterable<Holder> get holders => _holdersMap.values;
-  Iterable<Fragment> get deferredFragments => _deferredFragmentsMap.values;
-  // Add one for the main fragment.
-  int get fragmentCount => _deferredFragmentsMap.length + 1;
+  Iterable<LibrariesMap> get deferredLibrariesMap =>
+      _deferredLibrariesMap.values;
 
-  Fragment mainFragment;
+  // Add one for the main libraries map.
+  int get librariesMapCount => _deferredLibrariesMap.length + 1;
+
+  LibrariesMap mainLibrariesMap;
 
   Registry(this._compiler);
 
   bool get _isProgramSplit => _deferredLoadTask.isProgramSplit;
   OutputUnit get _mainOutputUnit => _deferredLoadTask.mainOutputUnit;
 
-  Fragment _mapUnitToFragment(OutputUnit targetUnit) {
-    if (targetUnit == _lastOutputUnit) return _lastFragment;
+  LibrariesMap _mapUnitToLibrariesMap(OutputUnit targetUnit) {
+    if (targetUnit == _lastOutputUnit) return _lastLibrariesMap;
 
-    if (mainFragment == null) {
-      mainFragment = new Fragment.main(_deferredLoadTask.mainOutputUnit);
-    }
+    LibrariesMap result = (targetUnit == _mainOutputUnit)
+        ? mainLibrariesMap
+        : _deferredLibrariesMap[targetUnit];
 
-    Fragment result;
-    if (targetUnit == _mainOutputUnit) {
-      result = mainFragment;
-    } else {
-      String name = targetUnit.name;
-      result = _deferredFragmentsMap.putIfAbsent(
-          targetUnit, () => new Fragment.deferred(targetUnit, name));
-    }
+    assert(result != null);
     _lastOutputUnit = targetUnit;
-    _lastFragment = result;
+    _lastLibrariesMap = result;
     return result;
   }
 
-  /// Adds all elements to their respective libraries in the correct fragment.
-  void registerElements(OutputUnit outputUnit, List<Element> elements) {
-    Fragment targetFragment = _mapUnitToFragment(outputUnit);
+  void registerOutputUnit(OutputUnit outputUnit) {
+    if (outputUnit == _mainOutputUnit) {
+      assert(mainLibrariesMap == null);
+      mainLibrariesMap =
+          new LibrariesMap.main(_deferredLoadTask.mainOutputUnit);
+    } else {
+      assert(!_deferredLibrariesMap.containsKey(outputUnit));
+      String name = outputUnit.name;
+      _deferredLibrariesMap[outputUnit] =
+          new LibrariesMap.deferred(outputUnit, name);
+    }
+  }
+
+  /// Adds all elements to their respective libraries in the correct
+  /// libraries map.
+  void registerElements(OutputUnit outputUnit, Iterable<Element> elements) {
+    LibrariesMap targetLibrariesMap = _mapUnitToLibrariesMap(outputUnit);
     for (Element element in Elements.sortedByPosition(elements)) {
-      targetFragment.add(element.library, element);
+      targetLibrariesMap.add(element.library, element);
     }
   }
 
   void registerConstant(OutputUnit outputUnit, ConstantValue constantValue) {
-    // We just need to make sure that the target fragment is registered.
-    // Otherwise a fragment that contains only constants is not built.
-    _mapUnitToFragment(outputUnit);
+    // Ignore for now.
   }
 
   Holder registerHolder(String name) {
diff --git a/pkg/compiler/lib/src/js_emitter/type_test_registry.dart b/pkg/compiler/lib/src/js_emitter/type_test_registry.dart
index ead7fd3..b9b1ba9 100644
--- a/pkg/compiler/lib/src/js_emitter/type_test_registry.dart
+++ b/pkg/compiler/lib/src/js_emitter/type_test_registry.dart
@@ -49,7 +49,7 @@
    * complete.  Not all classes will go away while constructors are referenced
    * from type substitutions.
    */
-  Set<ClassElement> classesModifiedByEmitRuntimeTypeSupport() {
+  Set<ClassElement> computeClassesModifiedByEmitRuntimeTypeSupport() {
     TypeChecks typeChecks = backend.rti.requiredChecks;
     Set<ClassElement> result = new Set<ClassElement>();
     for (ClassElement cls in typeChecks) {
diff --git a/pkg/compiler/lib/src/library_loader.dart b/pkg/compiler/lib/src/library_loader.dart
index 1b34560..3e5ddde 100644
--- a/pkg/compiler/lib/src/library_loader.dart
+++ b/pkg/compiler/lib/src/library_loader.dart
@@ -488,7 +488,7 @@
                 new CompilationUnitElementX(sourceScript, library);
             compiler.withCurrentElement(unit, () {
               compiler.scanner.scan(unit);
-              if (unit.partTag == null) {
+              if (unit.partTag == null && !sourceScript.isSynthesized) {
                 compiler.reportError(unit, MessageKind.MISSING_PART_OF_TAG);
               }
             });
@@ -525,17 +525,19 @@
                                        LibraryElement importingLibrary,
                                        Uri resolvedUri,
                                        [Node node]) {
-    // TODO(johnniwinther): Create erroneous library elements for missing
-    // libraries.
     Uri readableUri =
         compiler.translateResolvedUri(importingLibrary, resolvedUri, node);
-    if (readableUri == null) return new Future.value();
     LibraryElement library = libraryCanonicalUriMap[resolvedUri];
     if (library != null) {
       return new Future.value(library);
     }
+    var readScript = compiler.readScript;
+    if (readableUri == null) {
+      readableUri = resolvedUri;
+      readScript = compiler.synthesizeScript;
+    }
     return compiler.withCurrentElement(importingLibrary, () {
-      return compiler.readScript(node, readableUri).then((Script script) {
+      return readScript(node, readableUri).then((Script script) {
         if (script == null) return null;
         LibraryElement element =
             createLibrarySync(handler, script, resolvedUri);
diff --git a/pkg/compiler/lib/src/native/native.dart b/pkg/compiler/lib/src/native/native.dart
index 3bba978..cf1d062 100644
--- a/pkg/compiler/lib/src/native/native.dart
+++ b/pkg/compiler/lib/src/native/native.dart
@@ -14,7 +14,7 @@
     show ClassElementX, FunctionElementX, LibraryElementX;
 import '../js/js.dart' as js;
 import '../js_backend/js_backend.dart';
-import '../js_emitter/js_emitter.dart' show CodeEmitterTask;
+import '../js_emitter/js_emitter.dart' show CodeEmitterTask, NativeEmitter;
 import '../resolution/resolution.dart' show ResolverVisitor;
 import '../scanner/scannerlib.dart';
 import '../ssa/ssa.dart';
diff --git a/pkg/compiler/lib/src/patch_parser.dart b/pkg/compiler/lib/src/patch_parser.dart
index 51b5cac..80bf4c4 100644
--- a/pkg/compiler/lib/src/patch_parser.dart
+++ b/pkg/compiler/lib/src/patch_parser.dart
@@ -170,7 +170,14 @@
       Listener patchListener = new PatchElementListener(compiler,
                                                         compilationUnit,
                                                         idGenerator);
-      new PartialParser(patchListener).parseUnit(tokens);
+      try {
+        new PartialParser(patchListener).parseUnit(tokens);
+      } on ParserError catch (e) {
+        // No need to recover from a parser error in platform libraries, user
+        // will never see this if the libraries are tested correctly.
+        compiler.internalError(
+            compilationUnit, "Parser error in patch file: $e");
+      }
     });
   }
 
@@ -182,8 +189,15 @@
     measure(() => compiler.withCurrentElement(element, () {
       MemberListener listener = new MemberListener(compiler, element);
       Parser parser = new PatchClassElementParser(listener);
-      Token token = parser.parseTopLevelDeclaration(element.beginToken);
-      assert(identical(token, element.endToken.next));
+      try {
+        Token token = parser.parseTopLevelDeclaration(element.beginToken);
+        assert(identical(token, element.endToken.next));
+      } on ParserError catch (e) {
+        // No need to recover from a parser error in platform libraries, user
+        // will never see this if the libraries are tested correctly.
+        compiler.internalError(
+            element, "Parser error in patch file: $e");
+      }
       element.cachedNode = listener.popNode();
       assert(listener.nodes.isEmpty);
 
diff --git a/pkg/compiler/lib/src/resolution/members.dart b/pkg/compiler/lib/src/resolution/members.dart
index 74ec34e..d33f3f0 100644
--- a/pkg/compiler/lib/src/resolution/members.dart
+++ b/pkg/compiler/lib/src/resolution/members.dart
@@ -437,7 +437,7 @@
 
   TreeElements resolve(Element element) {
     return measure(() {
-      if (Elements.isErroneousElement(element)) return null;
+      if (Elements.isErroneous(element)) return null;
 
       processMetadata([result]) {
         for (MetadataAnnotation metadata in element.metadata) {
@@ -620,7 +620,7 @@
           }
           return registry.mapping;
         } else {
-          assert(element.isDeferredLoaderGetter);
+          assert(element.isDeferredLoaderGetter || element.isErroneous);
           return _ensureTreeElements(element);
         }
       } else {
@@ -743,7 +743,8 @@
       Element nextTarget = target.immediateRedirectionTarget;
       if (seen.contains(nextTarget)) {
         error(node, MessageKind.CYCLIC_REDIRECTING_FACTORY);
-        return;
+        targetType = target.enclosingClass.thisType;
+        break;
       }
       seen.add(target);
       target = nextTarget;
@@ -771,9 +772,10 @@
           message: 'No TreeElements cached for $factory.'));
       FunctionExpression functionNode = factory.parseNode(compiler);
       RedirectingFactoryBody redirectionNode = functionNode.body;
-      InterfaceType factoryType = treeElements.getType(redirectionNode);
-
-      targetType = targetType.substByContext(factoryType);
+      DartType factoryType = treeElements.getType(redirectionNode);
+      if (!factoryType.isDynamic) {
+        targetType = targetType.substByContext(factoryType);
+      }
       factory.effectiveTarget = target;
       factory.effectiveTargetType = targetType;
     }
@@ -1853,7 +1855,8 @@
         visitor.warning(node, messageKind, messageArguments);
       }
       if (erroneousElement == null) {
-         erroneousElement = new ErroneousElementX(
+        registry.registerThrowRuntimeError();
+        erroneousElement = new ErroneousElementX(
             messageKind, messageArguments, typeName.source,
             visitor.enclosingElement);
       }
@@ -1873,10 +1876,13 @@
           ambiguous.messageKind, ambiguous.messageArguments);
       ambiguous.diagnose(registry.mapping.analyzedElement, compiler);
     } else if (element.isErroneous) {
-      ErroneousElement erroneousElement = element;
-      type = reportFailureAndCreateType(
-          erroneousElement.messageKind, erroneousElement.messageArguments,
-          erroneousElement: erroneousElement);
+      if (element is ErroneousElement) {
+        type = reportFailureAndCreateType(
+            element.messageKind, element.messageArguments,
+            erroneousElement: element);
+      } else {
+        type = const DynamicType();
+      }
     } else if (!element.impliesType) {
       type = reportFailureAndCreateType(
           MessageKind.NOT_A_TYPE, {'node': node.typeName});
@@ -2051,7 +2057,9 @@
 
   /// Register [node] as the definition of [element].
   void defineLocalVariable(Node node, LocalVariableElement element) {
-    invariant(node, element != null);
+    if (element == null) {
+      throw compiler.internalError(node, 'element is null');
+    }
     checkLocalDefinitionName(node, element);
     registry.defineElement(node, element);
   }
@@ -3144,7 +3152,6 @@
       }
       if (redirectionTarget == constructor) {
         compiler.reportError(node, MessageKind.CYCLIC_REDIRECTING_FACTORY);
-        return;
       }
     }
 
@@ -3289,9 +3296,6 @@
     // TODO(johniwinther): Avoid registration of `type` in face of redirecting
     // factory constructors.
     registry.registerInstantiatedType(type);
-    if (constructor.isFactoryConstructor && !type.typeArguments.isEmpty) {
-      registry.registerFactoryWithTypeArguments();
-    }
     if (constructor.isGenerativeConstructor && cls.isAbstract) {
       warning(node, MessageKind.ABSTRACT_CLASS_INSTANTIATION);
       registry.registerAbstractClassInstantiation();
@@ -4174,9 +4178,13 @@
     : super(compiler, classElement, registry);
 
   DartType visitClassNode(ClassNode node) {
-    invariant(node, element != null);
-    invariant(element, element.resolutionState == STATE_STARTED,
-        message: () => 'cyclic resolution of class $element');
+    if (element == null) {
+      throw compiler.internalError(node, 'element is null');
+    }
+    if (element.resolutionState != STATE_STARTED) {
+      throw compiler.internalError(element,
+          'cyclic resolution of class $element');
+    }
 
     InterfaceType type = element.computeType(compiler);
     scope = new TypeDeclarationScope(scope, element);
@@ -4250,6 +4258,9 @@
       }
       FunctionElement constructor =
           new SynthesizedConstructorElementX.forDefault(superMember, element);
+      if (superMember.isErroneous) {
+        compiler.elementsWithCompileTimeErrors.add(constructor);
+      }
       element.setDefaultConstructor(constructor, compiler);
     }
     return element.computeType(compiler);
@@ -4261,9 +4272,13 @@
       compiler.reportError(node, MessageKind.EXPERIMENTAL_ENUMS);
     }
 
-    invariant(node, element != null);
-    invariant(element, element.resolutionState == STATE_STARTED,
-        message: () => 'cyclic resolution of class $element');
+    if (element == null) {
+      throw compiler.internalError(node, 'element is null');
+    }
+    if (element.resolutionState != STATE_STARTED) {
+      throw compiler.internalError(element,
+          'cyclic resolution of class $element');
+    }
 
     InterfaceType enumType = element.computeType(compiler);
     element.supertype = compiler.objectClass.computeType(compiler);
@@ -4301,9 +4316,13 @@
   }
 
   DartType visitNamedMixinApplication(NamedMixinApplication node) {
-    invariant(node, element != null);
-    invariant(element, element.resolutionState == STATE_STARTED,
-        message: () => 'cyclic resolution of class $element');
+    if (element == null) {
+      throw compiler.internalError(node, 'element is null');
+    }
+    if (element.resolutionState != STATE_STARTED) {
+      throw compiler.internalError(element,
+          'cyclic resolution of class $element');
+    }
 
     if (identical(node.classKeyword.stringValue, 'typedef')) {
       // TODO(aprelev@gmail.com): Remove this deprecation diagnostic
@@ -4857,7 +4876,13 @@
             element, diagnosticNode, element.name, MessageKind.NOT_A_TYPE,
             {'node': diagnosticNode});
       }
+    } else if (element.isErroneous && element is! ErroneousElementX) {
+      element = new ErroneousConstructorElementX(
+          MessageKind.NOT_A_TYPE, {'node': diagnosticNode},
+          element.name, element);
+      registry.registerThrowRuntimeError();
     }
+
     if (type == null) {
       if (Elements.isUnresolved(element)) {
         type = const DynamicType();
@@ -4929,17 +4954,20 @@
       element = new ErroneousConstructorElementX(
           MessageKind.CANNOT_INSTANTIATE_TYPEDEF,
           {'typedefName': name}, name, resolver.enclosingElement);
+      registry.registerThrowRuntimeError();
     } else if (element.isTypeVariable) {
       error(node, MessageKind.CANNOT_INSTANTIATE_TYPE_VARIABLE,
             {'typeVariableName': name});
       element = new ErroneousConstructorElementX(
           MessageKind.CANNOT_INSTANTIATE_TYPE_VARIABLE,
           {'typeVariableName': name}, name, resolver.enclosingElement);
+      registry.registerThrowRuntimeError();
     } else if (!element.isClass && !element.isPrefix) {
       error(node, MessageKind.NOT_A_TYPE, {'node': name});
       element = new ErroneousConstructorElementX(
           MessageKind.NOT_A_TYPE, {'node': name}, name,
           resolver.enclosingElement);
+      registry.registerThrowRuntimeError();
     }
     return element;
   }
diff --git a/pkg/compiler/lib/src/resolution/registry.dart b/pkg/compiler/lib/src/resolution/registry.dart
index 3ed66e5..eeaa2a8 100644
--- a/pkg/compiler/lib/src/resolution/registry.dart
+++ b/pkg/compiler/lib/src/resolution/registry.dart
@@ -298,10 +298,6 @@
     world.registerInstantiatedType(type, this);
   }
 
-  void registerFactoryWithTypeArguments() {
-    world.registerFactoryWithTypeArguments(this);
-  }
-
   void registerAbstractClassInstantiation() {
     backend.resolutionCallbacks.onAbstractClassInstantiation(this);
   }
diff --git a/pkg/compiler/lib/src/scanner/class_element_parser.dart b/pkg/compiler/lib/src/scanner/class_element_parser.dart
index f0b0020..ccd251d 100644
--- a/pkg/compiler/lib/src/scanner/class_element_parser.dart
+++ b/pkg/compiler/lib/src/scanner/class_element_parser.dart
@@ -49,11 +49,30 @@
       compiler.parser.measure(() {
         MemberListener listener = new MemberListener(compiler, this);
         Parser parser = new ClassElementParser(listener);
-        Token token = parser.parseTopLevelDeclaration(beginToken);
-        assert(identical(token, endToken.next));
-        cachedNode = listener.popNode();
-        assert(invariant(beginToken, listener.nodes.isEmpty,
-            message: "Non-empty listener stack: ${listener.nodes}"));
+        try {
+          Token token = parser.parseTopLevelDeclaration(beginToken);
+          assert(identical(token, endToken.next));
+          cachedNode = listener.popNode();
+          assert(
+              invariant(
+                  beginToken, listener.nodes.isEmpty,
+                  message: "Non-empty listener stack: ${listener.nodes}"));
+        } on ParserError catch (e) {
+          // TODO(ahe): Often, a ParserError is thrown while parsing the class
+          // body. This means that the stack actually contains most of the
+          // information synthesized below. Consider rewriting the parser so
+          // endClassDeclaration is called before parsing the class body.
+          Identifier name = new Identifier(findMyName(beginToken));
+          NodeList typeParameters = null;
+          Node supertype = null;
+          NodeList interfaces = listener.makeNodeList(0, null, null, ",");
+          Token extendsKeyword = null;
+          NodeList body = listener.makeNodeList(0, beginToken, endToken, null);
+          cachedNode = new ClassNode(
+              Modifiers.EMPTY, name, typeParameters, supertype, interfaces,
+              beginToken, extendsKeyword, body, endToken);
+          hasParseError = true;
+        }
       });
       compiler.patchParser.measure(() {
         if (isPatched) {
diff --git a/pkg/compiler/lib/src/scanner/listener.dart b/pkg/compiler/lib/src/scanner/listener.dart
index 338b5dc..0ef1f5d 100644
--- a/pkg/compiler/lib/src/scanner/listener.dart
+++ b/pkg/compiler/lib/src/scanner/listener.dart
@@ -805,9 +805,10 @@
 
   bool suppressParseErrors = false;
 
-  ElementListener(DiagnosticListener listener,
-                  this.compilationUnitElement,
-                  this.idGenerator)
+  ElementListener(
+      DiagnosticListener listener,
+      this.compilationUnitElement,
+      this.idGenerator)
       : this.listener = listener,
         stringValidator = new StringValidator(listener),
         interpolationScope = const Link<StringQuoting>();
@@ -1465,13 +1466,10 @@
 
   /// Don't call this method. Should only be used as a last resort when there
   /// is no feasible way to recover from a parser error.
-  void reportFatalError(Spannable spannable,
-                        String message) {
-    listener.reportError(
-        spannable, MessageKind.GENERIC, {'text': message});
-    // Some parse errors are infeasible to recover from, so we abort
-    // compilation instead.
-    throw new CompilerCancelledException(message);
+  void reportFatalError(Spannable spannable, String message) {
+    reportError(spannable, MessageKind.GENERIC, {'text': message});
+    // Some parse errors are infeasible to recover from, so we throw an error.
+    throw new ParserError(message);
   }
 
   void reportError(Spannable spannable,
@@ -1487,28 +1485,11 @@
 }
 
 class NodeListener extends ElementListener {
-  final bool throwOnFatalError;
-
   NodeListener(
       DiagnosticListener listener,
-      CompilationUnitElement element,
-      {bool this.throwOnFatalError: false})
+      CompilationUnitElement element)
     : super(listener, element, null);
 
-  /// Don't call this method. Should only be used as a last resort when there
-  /// is no feasible way to recover from a parser error.
-  void reportFatalError(Spannable spannable,
-                        String message) {
-    if (throwOnFatalError) {
-      if (!currentMemberHasParseError && !suppressParseErrors) {
-        reportError(spannable, MessageKind.GENERIC, {'text': message});
-      }
-      throw new ParserError(message);
-    } else {
-      super.reportFatalError(spannable, message);
-    }
-  }
-
   void addLibraryTag(LibraryTag tag) {
     pushNode(tag);
   }
@@ -2337,7 +2318,7 @@
         p.parseFunction(beginToken, getOrSet);
       }
     }
-    cachedNode = parse(listener, this, parseFunction);
+    cachedNode = parse(listener, this, declarationSite, parseFunction);
     return cachedNode;
   }
 
@@ -2346,6 +2327,8 @@
   void reusePartialFunctionMixin() {
     cachedNode = null;
   }
+
+  DeclarationSite get declarationSite;
 }
 
 class PartialFunctionElement extends FunctionElementX
@@ -2407,13 +2390,8 @@
     if (definitions != null) return definitions;
     listener.withCurrentElement(element, () {
       definitions = parse(
-          listener, element,
-          (Parser parser) {
-            if (hasParseError) {
-              parser.listener.suppressParseErrors = true;
-            }
-            return parser.parseMember(beginToken);
-          });
+          listener, element, declarationSite,
+          (Parser parser) => parser.parseMember(beginToken));
 
       if (!hasParseError &&
           !definitions.modifiers.isVar &&
@@ -2463,9 +2441,9 @@
 
   Node parseNode(DiagnosticListener listener) {
     if (cachedNode != null) return cachedNode;
-    cachedNode = parse(listener,
-                       this,
-                       (p) => p.parseTopLevelDeclaration(token));
+    cachedNode = parse(
+        listener, this, declarationSite,
+        (p) => p.parseTopLevelDeclaration(token));
     return cachedNode;
   }
 
@@ -2473,13 +2451,22 @@
 }
 
 /// A [MetadataAnnotation] which is constructed on demand.
-class PartialMetadataAnnotation extends MetadataAnnotationX {
-  final Token beginToken;
+class PartialMetadataAnnotation extends MetadataAnnotationX
+    implements PartialElement {
+  Token beginToken; // TODO(ahe): Make this final when issue 22065 is fixed.
+
   final Token tokenAfterEndToken;
+
   Expression cachedNode;
 
+  bool hasParseError = false;
+
   PartialMetadataAnnotation(this.beginToken, this.tokenAfterEndToken);
 
+  bool get isErroneous => hasParseError;
+
+  DeclarationSite get declarationSite => this;
+
   Token get endToken {
     Token token = beginToken;
     while (token.kind != EOF_TOKEN) {
@@ -2490,10 +2477,15 @@
     return token;
   }
 
+  void set endToken(_) {
+    throw new UnsupportedError("endToken=");
+  }
+
   Node parseNode(DiagnosticListener listener) {
     if (cachedNode != null) return cachedNode;
     Metadata metadata = parse(listener,
                               annotatedElement,
+                              declarationSite,
                               (p) => p.parseMetadata(beginToken));
     cachedNode = metadata.expression;
     return cachedNode;
@@ -2507,20 +2499,21 @@
   }
 }
 
-Node parse(DiagnosticListener diagnosticListener,
-           Element element,
-           doParse(Parser parser)) {
+Node parse(
+    DiagnosticListener diagnosticListener,
+    Element element,
+    PartialElement partial,
+    doParse(Parser parser)) {
   CompilationUnitElement unit = element.compilationUnit;
-  NodeListener listener =
-      new NodeListener(diagnosticListener, unit, throwOnFatalError: true);
+  NodeListener listener = new NodeListener(diagnosticListener, unit);
   listener.memberErrors = listener.memberErrors.prepend(false);
   try {
+    if (partial.hasParseError) {
+      listener.suppressParseErrors = true;
+    }
     doParse(new Parser(listener));
   } on ParserError catch (e) {
-    if (element is PartialElement) {
-      PartialElement partial = element as PartialElement;
-      partial.hasParseError = true;
-    }
+    partial.hasParseError = true;
     return new ErrorNode(element.position, e.reason);
   }
   Node node = listener.popNode();
diff --git a/pkg/compiler/lib/src/scanner/parser.dart b/pkg/compiler/lib/src/scanner/parser.dart
index 8e64787..2d7efe9 100644
--- a/pkg/compiler/lib/src/scanner/parser.dart
+++ b/pkg/compiler/lib/src/scanner/parser.dart
@@ -896,8 +896,13 @@
     token = parseFunctionBody(token, false, externalModifier != null);
     yieldIsKeyword = previousYieldIsKeyword;
     awaitIsKeyword = previousAwaitIsKeyword;
-    listener.endTopLevelMethod(start, getOrSet, token);
-    return token.next;
+    Token endToken = token;
+    token = token.next;
+    if (token.kind == BAD_INPUT_TOKEN) {
+      token = listener.unexpected(token);
+    }
+    listener.endTopLevelMethod(start, getOrSet, endToken);
+    return token;
   }
 
   Link<Token> findMemberName(Token token) {
diff --git a/pkg/compiler/lib/src/scanner/parser_task.dart b/pkg/compiler/lib/src/scanner/parser_task.dart
index 0a9b849..af9a013 100644
--- a/pkg/compiler/lib/src/scanner/parser_task.dart
+++ b/pkg/compiler/lib/src/scanner/parser_task.dart
@@ -16,7 +16,12 @@
     return measure(() {
       NodeListener listener = new NodeListener(compiler, null);
       Parser parser = new Parser(listener);
-      parser.parseUnit(token);
+      try {
+        parser.parseUnit(token);
+      } on ParserError catch (e) {
+        assert(invariant(token, compiler.compilationFailed));
+        return listener.makeNodeList(0, null, null, '\n');
+      }
       Node result = listener.popNode();
       assert(listener.nodes.isEmpty);
       return result;
diff --git a/pkg/compiler/lib/src/scanner/scanner_task.dart b/pkg/compiler/lib/src/scanner/scanner_task.dart
index ccfbc0e..ac560cb 100644
--- a/pkg/compiler/lib/src/scanner/scanner_task.dart
+++ b/pkg/compiler/lib/src/scanner/scanner_task.dart
@@ -61,7 +61,11 @@
       ElementListener listener =
           new ElementListener(compiler, compilationUnit, idGenerator);
       PartialParser parser = new PartialParser(listener);
-      parser.parseUnit(tokens);
+      try {
+        parser.parseUnit(tokens);
+      } on ParserError catch (e) {
+        assert(invariant(compilationUnit, compiler.compilationFailed));
+      }
     });
   }
 }
diff --git a/pkg/compiler/lib/src/script.dart b/pkg/compiler/lib/src/script.dart
index 54bd631..fcdf890 100644
--- a/pkg/compiler/lib/src/script.dart
+++ b/pkg/compiler/lib/src/script.dart
@@ -22,7 +22,12 @@
    */
   final Uri resourceUri;
 
-  Script(this.readableUri, this.resourceUri, this.file);
+  /// This script was synthesized.
+  final bool isSynthesized;
+
+  Script(
+      this.readableUri, this.resourceUri, this.file,
+      {this.isSynthesized: false});
 
   String get text => (file == null) ? null : file.slowText();
   String get name => (file == null) ? null : file.filename;
diff --git a/pkg/compiler/lib/src/source_file_provider.dart b/pkg/compiler/lib/src/source_file_provider.dart
index 978156c..f254a5e 100644
--- a/pkg/compiler/lib/src/source_file_provider.dart
+++ b/pkg/compiler/lib/src/source_file_provider.dart
@@ -53,9 +53,13 @@
     try {
       source = readAll(resourceUri.toFilePath());
     } on FileSystemException catch (ex) {
+      OSError ose = ex.osError;
+      String detail = (ose != null && ose.message != null)
+          ? ' (${ose.message})'
+          : '';
       return new Future.error(
-          "Error reading '${relativize(cwd, resourceUri, isWindows)}' "
-          "(${ex.osError})");
+          "Error reading '${relativize(cwd, resourceUri, isWindows)}'"
+          "$detail");
     }
     dartCharactersRead += source.length;
     sourceFiles[resourceUri.toString()] =
@@ -203,8 +207,9 @@
         print(file.getLocationMessage(
           color(message), begin, end, colorize: color));
       } else {
-        print('${provider.relativizeUri(uri)}@$begin+${end - begin}:'
-              ' [$kind] ${color(message)}');
+        String position = end - begin > 0 ? '@$begin+${end - begin}' : '';
+        print('${provider.relativizeUri(uri)}$position:\n'
+              '${color(message)}');
       }
     }
     if (fatal && ++fatalCount >= throwOnErrorCount && throwOnError) {
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index fe451e2..1b10d11 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -1218,6 +1218,9 @@
 
     // Ensure that [element] is an implementation element.
     element = element.implementation;
+
+    if (compiler.elementHasCompileTimeError(element)) return false;
+
     FunctionElement function = element;
     bool insideLoop = loopNesting > 0 || graph.calledInLoop;
 
@@ -1840,6 +1843,9 @@
           handleConstantForOptionalParameter,
           compiler.world);
       if (!match) {
+        if (compiler.elementHasCompileTimeError(constructor)) {
+          return;
+        }
         // If this fails, the selector we constructed for the call to a
         // forwarding constructor in a mixin application did not match the
         // constructor (which, for example, may happen when the libraries are
@@ -1935,6 +1941,7 @@
     assert(invariant(classElement, classElement.isImplementation));
     classElement.forEachInstanceField(
         (ClassElement enclosingClass, VariableElement member) {
+          if (compiler.elementHasCompileTimeError(member)) return;
           compiler.withCurrentElement(member, () {
             TreeElements definitions = member.treeElements;
             ast.Node node = member.node;
@@ -2020,7 +2027,8 @@
           if (value == null) {
             // Uninitialized native fields are pre-initialized by the native
             // implementation.
-            assert(isNativeUpgradeFactory);
+            assert(invariant(
+                member, isNativeUpgradeFactory || compiler.compilationFailed));
           } else {
             fields.add(member);
             DartType type = localsHandler.substInContext(member.type);
@@ -3208,11 +3216,18 @@
       push(new HStatic(element.declaration, backend.nonNullType));
       // TODO(ahe): This should be registered in codegen.
       registry.registerGetOfStaticFunction(element.declaration);
-    } else if (Elements.isErroneousElement(element)) {
-      // An erroneous element indicates an unresolved static getter.
-      generateThrowNoSuchMethod(send,
-                                noSuchMethodTargetSymbolString(element, 'get'),
-                                argumentNodes: const Link<ast.Node>());
+    } else if (Elements.isErroneous(element)) {
+      if (element is ErroneousElement) {
+        // An erroneous element indicates an unresolved static getter.
+        generateThrowNoSuchMethod(
+            send,
+            noSuchMethodTargetSymbolString(element, 'get'),
+            argumentNodes: const Link<ast.Node>());
+      } else {
+        // TODO(ahe): Do something like the above, that is, emit a runtime
+        // error.
+        stack.add(graph.addConstantNull(compiler));
+      }
     } else {
       LocalElement local = element;
       stack.add(localsHandler.readLocal(local));
@@ -3258,13 +3273,18 @@
         addWithPosition(new HStaticStore(element, value), location);
       }
       stack.add(value);
-    } else if (Elements.isErroneousElement(element)) {
-      List<HInstruction> arguments =
-          send == null ? const <HInstruction>[] : <HInstruction>[value];
-      // An erroneous element indicates an unresolved static setter.
-      generateThrowNoSuchMethod(location,
-                                noSuchMethodTargetSymbolString(element, 'set'),
-                                argumentValues: arguments);
+    } else if (Elements.isErroneous(element)) {
+      if (element is ErroneousElement) {
+        List<HInstruction> arguments =
+            send == null ? const <HInstruction>[] : <HInstruction>[value];
+        // An erroneous element indicates an unresolved static setter.
+        generateThrowNoSuchMethod(
+            location, noSuchMethodTargetSymbolString(element, 'set'),
+            argumentValues: arguments);
+      } else {
+        // TODO(ahe): Do something like [generateWrongArgumentCountError].
+        stack.add(graph.addConstantNull(compiler));
+      }
     } else {
       stack.add(value);
       LocalElement local = element;
@@ -3422,7 +3442,8 @@
       if (backend.hasDirectCheckFor(type)) {
         return new HIs.direct(type, expression, backend.boolType);
       }
-      // TODO(johnniwinther): Avoid interceptor if unneeded.
+      // The interceptor is not always needed.  It is removed by optimization
+      // when the receiver type or tested type permit.
       return new HIs.raw(
           type, expression, invokeInterceptor(expression), backend.boolType);
     }
@@ -4287,6 +4308,11 @@
         constructorDeclaration.computeEffectiveTargetType(type);
     expectedType = localsHandler.substInContext(expectedType);
 
+    if (compiler.elementHasCompileTimeError(constructor)) {
+      // TODO(ahe): Do something like [generateWrongArgumentCountError].
+      stack.add(graph.addConstantNull(compiler));
+      return;
+    }
     if (checkTypeVariableBounds(node, type)) return;
 
     var inputs = <HInstruction>[];
@@ -4305,11 +4331,6 @@
                                          send.arguments,
                                          constructor.implementation));
 
-    if (constructor.isFactoryConstructor &&
-        !expectedType.typeArguments.isEmpty) {
-      registry.registerFactoryWithTypeArguments();
-    }
-
     TypeMask elementType = computeType(constructor);
     if (isFixedListConstructorCall) {
       if (!inputs[0].isNumber(compiler)) {
@@ -4475,11 +4496,16 @@
       return;
     }
     if (element.isErroneous) {
-      // An erroneous element indicates that the funciton could not be resolved
-      // (a warning has been issued).
-      generateThrowNoSuchMethod(node,
-                                noSuchMethodTargetSymbolString(element),
-                                argumentNodes: node.arguments);
+      if (element is ErroneousElement) {
+        // An erroneous element indicates that the funciton could not be
+        // resolved (a warning has been issued).
+        generateThrowNoSuchMethod(node,
+                                  noSuchMethodTargetSymbolString(element),
+                                  argumentNodes: node.arguments);
+      } else {
+        // TODO(ahe): Do something like [generateWrongArgumentCountError].
+        stack.add(graph.addConstantNull(compiler));
+      }
       return;
     }
     invariant(element, !element.isGenerativeConstructor);
@@ -4654,11 +4680,16 @@
   visitNewExpression(ast.NewExpression node) {
     Element element = elements[node.send];
     final bool isSymbolConstructor = element == compiler.symbolConstructor;
-    if (!Elements.isErroneousElement(element)) {
+    if (!Elements.isErroneous(element)) {
       ConstructorElement function = element;
       element = function.effectiveTarget;
     }
-    if (Elements.isErroneousElement(element)) {
+    if (Elements.isErroneous(element)) {
+      if (element is !ErroneousElement) {
+        // TODO(ahe): Do something like [generateWrongArgumentCountError].
+        stack.add(graph.addConstantNull(compiler));
+        return;
+      }
       ErroneousElement error = element;
       if (error.messageKind == MessageKind.CANNOT_FIND_CONSTRUCTOR) {
         generateThrowNoSuchMethod(
@@ -5418,10 +5449,6 @@
         functionElement.computeEffectiveTargetType(type);
     expectedType = localsHandler.substInContext(expectedType);
 
-    if (constructor.isFactoryConstructor) {
-      registry.registerFactoryWithTypeArguments();
-    }
-
     ClassElement cls = constructor.enclosingClass;
 
     if (backend.classNeedsRti(cls)) {
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index 4c97c46..0d4b389 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -2304,6 +2304,19 @@
     if (!negative) push(new js.Prefix('!', pop()));
   }
 
+  void checkTypeViaInstanceof(
+      HInstruction input, DartType type, bool negative) {
+    registry.registerIsCheck(type);
+
+    use(input);
+
+    js.Expression jsClassReference =
+        backend.emitter.constructorAccess(type.element);
+    push(js.js('# instanceof #', [pop(), jsClassReference]));
+    if (negative) push(new js.Prefix('!', pop()));
+    registry.registerInstantiatedType(type);
+  }
+
   void handleNumberOrStringSupertypeCheck(HInstruction input,
                                           HInstruction interceptor,
                                           DartType type,
@@ -2421,6 +2434,10 @@
         js.Expression numTest = pop();
         checkBigInt(input, relation);
         push(new js.Binary(negative ? '||' : '&&', numTest, pop()), node);
+      } else if (node.useInstanceOf) {
+        assert(interceptor == null);
+        checkTypeViaInstanceof(input, type, negative);
+        attachLocationToLast(node);
       } else if (Elements.isNumberOrStringSupertype(element, compiler)) {
         handleNumberOrStringSupertypeCheck(
             input, interceptor, type, negative: negative);
diff --git a/pkg/compiler/lib/src/ssa/codegen_helpers.dart b/pkg/compiler/lib/src/ssa/codegen_helpers.dart
index 3b5c557..88e5505 100644
--- a/pkg/compiler/lib/src/ssa/codegen_helpers.dart
+++ b/pkg/compiler/lib/src/ssa/codegen_helpers.dart
@@ -384,9 +384,14 @@
     analyzeInputs(instruction, 0);
   }
 
-  // The codegen might use the input multiple times, so it must not be
-  // set generate at use site.
-  void visitIs(HIs instruction) {}
+  void visitIs(HIs instruction) {
+    // In the general case the input might be used multple multiple times, so it
+    // must not be set generate at use site.  If the code will generate
+    // 'instanceof' then we can generate at use site.
+    if (instruction.useInstanceOf) {
+      analyzeInputs(instruction, 0);
+    }
+  }
 
   // A bounds check method must not have its first input generated at use site,
   // because it's using it twice.
diff --git a/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart b/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
index 79a527c..3a0f467 100644
--- a/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
+++ b/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
@@ -10,15 +10,18 @@
  * 1) If the interceptor is for an object whose type is known, it
  * tries to use a constant interceptor instead.
  *
- * 2) It specializes interceptors based on the selectors it is being
- * called with.
+ * 2) Interceptors are specialized based on the selector it is used with.
  *
- * 3) If we know the object is not intercepted, we just use it
+ * 3) If we know the object is not intercepted, we just use the object
  * instead.
  *
- * 4) It replaces all interceptors that are used only once with
- * one-shot interceptors. It saves code size and makes the receiver of
- * an intercepted call a candidate for being generated at use site.
+ * 4) Single use interceptors at dynamic invoke sites are replaced with 'one
+ * shot interceptors' which are synthesized static helper functions that fetch
+ * the interceptor and then call the method.  This saves code size and makes the
+ * receiver of an intercepted call a candidate for being generated at use site.
+ *
+ * 5) Some HIs operations on an interceptor are replaced with a HIs version that
+ * uses 'instanceof' rather than testing a type flag.
  *
  */
 class SsaSimplifyInterceptors extends HBaseVisitor
@@ -56,6 +59,17 @@
     if (!invoke.isInterceptedCall) return false;
     var interceptor = invoke.inputs[0];
     if (interceptor is! HInterceptor) return false;
+
+    // TODO(sra): Move this per-call code to visitInterceptor.
+    //
+    // The interceptor is visited first, so we get here only when the
+    // interceptor was not rewritten to a single shared replacement.  I'm not
+    // sure we should substitute a constant interceptor on a per-call basis if
+    // the interceptor is already available in a local variable, but it is
+    // possible that all uses can be rewritten to use different constants.
+
+    // TODO(sra): Also do self-interceptor rewrites on a per-use basis.
+
     HInstruction constant = tryComputeConstantInterceptor(
         invoke.inputs[1], interceptor.interceptedClasses);
     if (constant != null) {
@@ -238,8 +252,18 @@
       }
     }
 
+    node.interceptedClasses = interceptedClasses;
+
     HInstruction receiver = node.receiver;
 
+    // TODO(sra): We should consider each use individually and then all uses
+    // together.  Each use might permit a different rewrite due to a refined
+    // receiver type.  Self-interceptor rewrites are always beneficial since the
+    // receiver is live at a invocation.  Constant-interceptor rewrites are only
+    // guaranteed to be beneficial if they can eliminate the need for the
+    // interceptor or reduce the uses to one that can be simplified with a
+    // one-shot interceptor or optimized is-check.
+
     if (canUseSelfForInterceptor(receiver, interceptedClasses)) {
       return rewriteToUseSelfAsInterceptor(node, receiver);
     }
@@ -252,32 +276,50 @@
       return false;
     }
 
-    node.interceptedClasses = interceptedClasses;
-
-    // Try creating a one-shot interceptor.
+    // Try creating a one-shot interceptor or optimized is-check
     if (compiler.hasIncrementalSupport) return false;
     if (node.usedBy.length != 1) return false;
-    if (node.usedBy[0] is !HInvokeDynamic) return false;
+    HInstruction user = node.usedBy.single;
 
-    HInvokeDynamic user = node.usedBy[0];
-
-    // If [node] was loop hoisted, we keep the interceptor.
+    // If the interceptor [node] was loop hoisted, we keep the interceptor.
     if (!user.hasSameLoopHeaderAs(node)) return false;
 
-    // Replace the user with a [HOneShotInterceptor].
-    HConstant nullConstant = graph.addConstantNull(compiler);
-    List<HInstruction> inputs = new List<HInstruction>.from(user.inputs);
-    inputs[0] = nullConstant;
-    HOneShotInterceptor interceptor = new HOneShotInterceptor(
-        user.selector, inputs, user.instructionType, node.interceptedClasses);
-    interceptor.sourcePosition = user.sourcePosition;
-    interceptor.sourceElement = user.sourceElement;
+    bool replaceUserWith(HInstruction replacement) {
+      HBasicBlock block = user.block;
+      block.addAfter(user, replacement);
+      block.rewrite(user, replacement);
+      block.remove(user);
+      return false;
+    }
 
-    HBasicBlock block = user.block;
-    block.addAfter(user, interceptor);
-    block.rewrite(user, interceptor);
-    block.remove(user);
-    return true;
+    if (user is HIs) {
+      // See if we can rewrite the is-check to use 'instanceof', i.e. rewrite
+      // "getInterceptor(x).$isT" to "x instanceof T".
+      if (node == user.interceptor) {
+        JavaScriptBackend backend = compiler.backend;
+        if (backend.mayGenerateInstanceofCheck(user.typeExpression)) {
+          HInstruction instanceofCheck = new HIs.instanceOf(
+              user.typeExpression, user.expression, user.instructionType);
+          instanceofCheck.sourcePosition = user.sourcePosition;
+          instanceofCheck.sourceElement = user.sourceElement;
+          return replaceUserWith(instanceofCheck);
+        }
+      }
+    } else if (user is HInvokeDynamic) {
+      if (node == user.inputs[0]) {
+        // Replace the user with a [HOneShotInterceptor].
+        HConstant nullConstant = graph.addConstantNull(compiler);
+        List<HInstruction> inputs = new List<HInstruction>.from(user.inputs);
+        inputs[0] = nullConstant;
+        HOneShotInterceptor oneShotInterceptor = new HOneShotInterceptor(
+            user.selector, inputs, user.instructionType, interceptedClasses);
+        oneShotInterceptor.sourcePosition = user.sourcePosition;
+        oneShotInterceptor.sourceElement = user.sourceElement;
+        return replaceUserWith(oneShotInterceptor);
+      }
+    }
+
+    return false;
   }
 
   bool rewriteToUseSelfAsInterceptor(HInterceptor node, HInstruction receiver) {
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index a8050bd..7337b7b 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -2421,12 +2421,20 @@
 
   final DartType typeExpression;
   final int kind;
+  final bool useInstanceOf;
 
   HIs.direct(DartType typeExpression,
              HInstruction expression,
              TypeMask type)
       : this.internal(typeExpression, [expression], RAW_CHECK, type);
 
+  // Pre-verified that the check can be done using 'instanceof'.
+  HIs.instanceOf(DartType typeExpression,
+                 HInstruction expression,
+                 TypeMask type)
+      : this.internal(typeExpression, [expression], RAW_CHECK, type,
+          useInstanceOf: true);
+
   HIs.raw(DartType typeExpression,
           HInstruction expression,
           HInterceptor interceptor,
@@ -2446,7 +2454,8 @@
                TypeMask type)
       : this.internal(typeExpression, [expression, call], VARIABLE_CHECK, type);
 
-  HIs.internal(this.typeExpression, List<HInstruction> inputs, this.kind, type)
+  HIs.internal(this.typeExpression, List<HInstruction> inputs, this.kind,
+      TypeMask type, {bool this.useInstanceOf: false})
       : super(inputs, type) {
     assert(kind >= RAW_CHECK && kind <= VARIABLE_CHECK);
     setUseGvn();
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index 38bf3cf..9aa51f0 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -1843,6 +1843,7 @@
     memorySet.registerAllocation(instruction);
     int argumentIndex = 0;
     instruction.element.forEachInstanceField((_, Element member) {
+      if (compiler.elementHasCompileTimeError(member)) return;
       memorySet.registerFieldValue(
           member, instruction, instruction.inputs[argumentIndex++]);
     }, includeSuperAndInjectedMembers: true);
diff --git a/pkg/compiler/lib/src/ssa/ssa.dart b/pkg/compiler/lib/src/ssa/ssa.dart
index e702138..2b56162 100644
--- a/pkg/compiler/lib/src/ssa/ssa.dart
+++ b/pkg/compiler/lib/src/ssa/ssa.dart
@@ -20,7 +20,7 @@
 import '../helpers/helpers.dart';
 import '../js/js.dart' as js;
 import '../js_backend/js_backend.dart';
-import '../js_emitter/js_emitter.dart' show CodeEmitterTask;
+import '../js_emitter/js_emitter.dart' show CodeEmitterTask, NativeEmitter;
 import '../native/native.dart' as native;
 import '../scanner/scannerlib.dart'
     show PartialFunctionElement, Token, PLUS_TOKEN;
@@ -31,7 +31,6 @@
 import '../types/constants.dart' show computeTypeMask;
 import '../universe/universe.dart';
 import '../util/util.dart';
-import '../js_backend/codegen/task.dart';
 
 part 'builder.dart';
 part 'codegen.dart';
diff --git a/pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart b/pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart
index c02a739..abf3627 100644
--- a/pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart
+++ b/pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart
@@ -193,7 +193,8 @@
     return node;
   }
 
-  Expression visitInvokeSuperMethod(InvokeSuperMethod node) {
+  Expression visitInvokeMethodDirectly(InvokeMethodDirectly node) {
+    node.receiver = visitExpression(node.receiver);
     _rewriteList(node.arguments);
     return node;
   }
@@ -331,7 +332,7 @@
     return node;
   }
 
-  Expression visitCreateClosureClass(CreateClosureClass node) {
+  Expression visitCreateInstance(CreateInstance node) {
     _rewriteList(node.arguments);
     return node;
   }
diff --git a/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart b/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart
index 91f0b75..3bb2206 100644
--- a/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart
+++ b/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart
@@ -192,10 +192,11 @@
     return node;
   }
 
-  Expression visitInvokeSuperMethod(InvokeSuperMethod node) {
+  Expression visitInvokeMethodDirectly(InvokeMethodDirectly node) {
     for (int i = node.arguments.length - 1; i >= 0; --i) {
       node.arguments[i] = visitExpression(node.arguments[i]);
     }
+    node.receiver = visitExpression(node.receiver);
     return node;
   }
 
@@ -409,8 +410,8 @@
 
   Statement visitSetField(SetField node) {
     node.next = visitStatement(node.next);
-    node.object = visitExpression(node.object);
     node.value = visitExpression(node.value);
+    node.object = visitExpression(node.object);
     return node;
   }
 
@@ -423,7 +424,7 @@
     return node;
   }
 
-  Expression visitCreateClosureClass(CreateClosureClass node) {
+  Expression visitCreateInstance(CreateInstance node) {
     for (int i = node.arguments.length - 1; i >= 0; --i) {
       node.arguments[i] = visitExpression(node.arguments[i]);
     }
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
index 4cc853c..3a017d9 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
@@ -189,16 +189,28 @@
         body, initializers, node.localConstants, node.defaultParameterValues);
   }
 
-
+  /// Returns a list of variables corresponding to the arguments to a method
+  /// call or similar construct.
+  ///
+  /// The `readCount` for these variables will be incremented.
+  ///
+  /// The list will be typed as a list of [Expression] to allow inplace updates
+  /// on the list during the rewrite phases.
   List<Expression> translateArguments(List<cps_ir.Reference> args) {
     return new List<Expression>.generate(args.length,
          (int index) => getVariableReference(args[index]),
          growable: false);
   }
 
+  /// Returns the list of variables corresponding to the arguments to a join
+  /// continuation.
+  ///
+  /// The `readCount` of these variables will not be incremented. Instead,
+  /// [buildPhiAssignments] will handle the increment, if necessary.
   List<Variable> translatePhiArguments(List<cps_ir.Reference> args) {
     return new List<Variable>.generate(args.length,
-         (int index) => getVariableReference(args[index]));
+         (int index) => getVariable(args[index].definition),
+         growable: false);
   }
 
   Statement buildContinuationAssignment(
@@ -247,6 +259,8 @@
 
     Statement first, current;
     void addAssignment(Variable dst, Variable src) {
+      ++src.readCount;
+      // `dst.writeCount` will be updated by the Assign constructor.
       if (first == null) {
         first = current = new Assign(dst, src, null);
       } else {
@@ -345,22 +359,34 @@
   }
 
   Statement visitLetCont(cps_ir.LetCont node) {
-    Label label;
-    if (node.continuation.hasMultipleUses) {
-      label = new Label();
-      labels[node.continuation] = label;
+    // Introduce labels for continuations that need them.
+    for (cps_ir.Continuation continuation in node.continuations) {
+      if (continuation.hasMultipleUses) {
+        labels[continuation] = new Label();
+      }
     }
     Statement body = visit(node.body);
-    // The continuation's body is not always translated directly here because
-    // it may have been already translated:
+    // Continuations are bound at the same level, but they have to be
+    // translated as if nested.  This is because the body can invoke any
+    // of them from anywhere, so it must be nested inside all of them.
+    //
+    // The continuation bodies are not always translated directly here because
+    // they may have been already translated:
     //   * For singly-used continuations, the continuation's body is
     //     translated at the site of the continuation invocation.
     //   * For recursive continuations, there is a single non-recursive
     //     invocation.  The continuation's body is translated at the site
     //     of the non-recursive continuation invocation.
     // See visitInvokeContinuation for the implementation.
-    if (label == null || node.continuation.isRecursive) return body;
-    return new LabeledStatement(label, body, visit(node.continuation.body));
+    Statement current = body;
+    for (cps_ir.Continuation continuation in node.continuations.reversed) {
+      Label label = labels[continuation];
+      if (label != null && !continuation.isRecursive) {
+        current =
+            new LabeledStatement(label, current, visit(continuation.body));
+      }
+    }
+    return current;
   }
 
   Statement visitInvokeStatic(cps_ir.InvokeStatic node) {
@@ -377,9 +403,11 @@
     return continueWithExpression(node.continuation, invoke);
   }
 
-  Statement visitInvokeSuperMethod(cps_ir.InvokeSuperMethod node) {
+  Statement visitInvokeMethodDirectly(cps_ir.InvokeMethodDirectly node) {
+    Expression receiver = getVariableReference(node.receiver);
     List<Expression> arguments = translateArguments(node.arguments);
-    Expression invoke = new InvokeSuperMethod(node.selector, arguments);
+    Expression invoke = new InvokeMethodDirectly(receiver, node.target,
+        node.selector, arguments);
     return continueWithExpression(node.continuation, invoke);
   }
 
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
index 4aaacef..ab74fa1 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
@@ -159,15 +159,19 @@
   }
 }
 
-class InvokeSuperMethod extends Expression implements Invoke {
+/// Invoke [target] on [receiver], bypassing ordinary dispatch semantics.
+class InvokeMethodDirectly extends Expression implements Invoke {
+  Expression receiver;
+  final Element target;
   final Selector selector;
   final List<Expression> arguments;
 
-  InvokeSuperMethod(this.selector, this.arguments);
+  InvokeMethodDirectly(this.receiver, this.target, this.selector,
+      this.arguments);
 
-  accept(ExpressionVisitor visitor) => visitor.visitInvokeSuperMethod(this);
+  accept(ExpressionVisitor visitor) => visitor.visitInvokeMethodDirectly(this);
   accept1(ExpressionVisitor1 visitor, arg) {
-    return visitor.visitInvokeSuperMethod(this, arg);
+    return visitor.visitInvokeMethodDirectly(this, arg);
   }
 }
 
@@ -658,15 +662,15 @@
   accept1(ExpressionVisitor1 visitor, arg) => visitor.visitCreateBox(this, arg);
 }
 
-class CreateClosureClass extends Expression implements JsSpecificNode {
-  ClosureClassElement classElement;
+class CreateInstance extends Expression implements JsSpecificNode {
+  ClassElement classElement;
   List<Expression> arguments;
 
-  CreateClosureClass(this.classElement, this.arguments);
+  CreateInstance(this.classElement, this.arguments);
 
-  accept(ExpressionVisitor visitor) => visitor.visitCreateClosureClass(this);
+  accept(ExpressionVisitor visitor) => visitor.visitCreateInstance(this);
   accept1(ExpressionVisitor1 visitor, arg) {
-    return visitor.visitCreateClosureClass(this, arg);
+    return visitor.visitCreateInstance(this, arg);
   }
 }
 
@@ -697,7 +701,7 @@
   E visitVariable(Variable node);
   E visitInvokeStatic(InvokeStatic node);
   E visitInvokeMethod(InvokeMethod node);
-  E visitInvokeSuperMethod(InvokeSuperMethod node);
+  E visitInvokeMethodDirectly(InvokeMethodDirectly node);
   E visitInvokeConstructor(InvokeConstructor node);
   E visitConcatenateStrings(ConcatenateStrings node);
   E visitConstant(Constant node);
@@ -714,7 +718,7 @@
   E visitSuperInitializer(SuperInitializer node);
   E visitGetField(GetField node);
   E visitCreateBox(CreateBox node);
-  E visitCreateClosureClass(CreateClosureClass node);
+  E visitCreateInstance(CreateInstance node);
 }
 
 abstract class ExpressionVisitor1<E, A> {
@@ -722,7 +726,7 @@
   E visitVariable(Variable node, A arg);
   E visitInvokeStatic(InvokeStatic node, A arg);
   E visitInvokeMethod(InvokeMethod node, A arg);
-  E visitInvokeSuperMethod(InvokeSuperMethod node, A arg);
+  E visitInvokeMethodDirectly(InvokeMethodDirectly node, A arg);
   E visitInvokeConstructor(InvokeConstructor node, A arg);
   E visitConcatenateStrings(ConcatenateStrings node, A arg);
   E visitConstant(Constant node, A arg);
@@ -739,7 +743,7 @@
   E visitSuperInitializer(SuperInitializer node, A arg);
   E visitGetField(GetField node, A arg);
   E visitCreateBox(CreateBox node, A arg);
-  E visitCreateClosureClass(CreateClosureClass node, A arg);
+  E visitCreateInstance(CreateInstance node, A arg);
 }
 
 abstract class StatementVisitor<S> {
@@ -800,7 +804,8 @@
     node.arguments.forEach(visitExpression);
   }
 
-  visitInvokeSuperMethod(InvokeSuperMethod node) {
+  visitInvokeMethodDirectly(InvokeMethodDirectly node) {
+    visitExpression(node.receiver);
     node.arguments.forEach(visitExpression);
   }
 
@@ -918,7 +923,7 @@
   visitCreateBox(CreateBox node) {
   }
 
-  visitCreateClosureClass(CreateClosureClass node) {
+  visitCreateInstance(CreateInstance node) {
     node.arguments.forEach(visitExpression);
   }
 }
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart
index 9620b57..38d9c6f 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart
@@ -333,10 +333,12 @@
     return "$receiver.$name($args)";
   }
 
-  String visitInvokeSuperMethod(InvokeSuperMethod node) {
+  String visitInvokeMethodDirectly(InvokeMethodDirectly node) {
+    String receiver = visitExpression(node.receiver);
+    String host = node.target.enclosingClass.name;
     String name = node.selector.name;
     String args = formatArguments(node);
-    return "super.$name($args)";
+    return "$receiver.$host::$name($args)";
   }
 
   String visitInvokeConstructor(InvokeConstructor node) {
@@ -445,10 +447,10 @@
     return 'CreateBox';
   }
 
-  String visitCreateClosureClass(CreateClosureClass node) {
+  String visitCreateInstance(CreateInstance node) {
     String className = node.classElement.name;
     String arguments = node.arguments.map(visitExpression).join(', ');
-    return 'CreateClosure $className($arguments)';
+    return 'CreateInstance $className($arguments)';
   }
 
 }
diff --git a/pkg/compiler/lib/src/typechecker.dart b/pkg/compiler/lib/src/typechecker.dart
index 61dbd7d..26272a9 100644
--- a/pkg/compiler/lib/src/typechecker.dart
+++ b/pkg/compiler/lib/src/typechecker.dart
@@ -1118,7 +1118,7 @@
         DartType type = analyze(node.selector);
         return analyzeInvocation(node, new TypeAccess(type));
       }
-    } else if (Elements.isErroneousElement(element) && selector == null) {
+    } else if (Elements.isErroneous(element) && selector == null) {
       // exp() where exp is an erroneous construct like `new Unresolved()`.
       DartType type = analyze(node.selector);
       return analyzeInvocation(node, new TypeAccess(type));
diff --git a/pkg/compiler/lib/src/universe/universe.dart b/pkg/compiler/lib/src/universe/universe.dart
index 34d6f58..b731637 100644
--- a/pkg/compiler/lib/src/universe/universe.dart
+++ b/pkg/compiler/lib/src/universe/universe.dart
@@ -93,8 +93,6 @@
    */
   final Set<Element> closurizedMembers = new Set<Element>();
 
-  bool usingFactoryWithTypeArguments = false;
-
   /// All directly instantiated classes, that is, classes with a generative
   /// constructor that has been called directly and not only through a
   /// super-call.
diff --git a/pkg/compiler/lib/src/use_unused_api.dart b/pkg/compiler/lib/src/use_unused_api.dart
index 359aa9b..2713e0d 100644
--- a/pkg/compiler/lib/src/use_unused_api.dart
+++ b/pkg/compiler/lib/src/use_unused_api.dart
@@ -252,8 +252,7 @@
     ..buildBooleanLiteral(null)
     ..buildNullLiteral()
     ..buildStringLiteral(null)
-    ..buildDynamicGet(null, null)
-    ..buildSuperGet(null);
+    ..buildDynamicGet(null, null);
 }
 
 useCompiler(dart2jslib.Compiler compiler) {
diff --git a/pkg/compiler/lib/src/warnings.dart b/pkg/compiler/lib/src/warnings.dart
index 908d9cf..f2f5449 100644
--- a/pkg/compiler/lib/src/warnings.dart
+++ b/pkg/compiler/lib/src/warnings.dart
@@ -40,7 +40,7 @@
  *
  * 8. Do not try to be cute or funny. It is extremely frustrating to work on a
  * product that crashes with a "tongue-in-cheek" message, especially if you did
- * not want to use this product to begin with with.
+ * not want to use this product to begin with.
  *
  * 9. Do not lie, that is, do not write error messages containing phrases like
  * "can't happen".  If the user ever saw this message, it would be a
@@ -1515,6 +1515,11 @@
 main() {}
 """]);
 
+  static const MessageKind READ_SELF_ERROR = const MessageKind(
+      "#{exception}",
+      // Don't know how to fix since the underlying error is unknown.
+      howToFix: DONT_KNOW_HOW_TO_FIX);
+
   static const MessageKind EXTRANEOUS_MODIFIER = const MessageKind(
       "Can't have modifier '#{modifier}' here.",
       howToFix: "Try removing '#{modifier}'.",
@@ -2381,9 +2386,8 @@
 * Your app imports dart:mirrors via:''''''
 $IMPORT_EXPERIMENTAL_MIRRORS_PADDING#{importChain}
 *
-* Starting with Dart 1.9, you must use the
-* --enable-experimental-mirrors command-line flag to opt-in.
-* You can begin using this flag now if mirrors support is critical.
+* You can disable this message by using the --enable-experimental-mirrors
+* command-line flag.
 *
 * To learn what to do next, please visit:
 *    http://dartlang.org/dart2js-reflection
diff --git a/pkg/crypto/lib/crypto.dart b/pkg/crypto/lib/crypto.dart
index 5125912..892626f 100644
--- a/pkg/crypto/lib/crypto.dart
+++ b/pkg/crypto/lib/crypto.dart
@@ -9,6 +9,7 @@
 library crypto;
 
 import 'dart:math';
+import 'dart:typed_data';
 
 part 'src/crypto_utils.dart';
 part 'src/hash_utils.dart';
diff --git a/pkg/crypto/lib/src/hash_utils.dart b/pkg/crypto/lib/src/hash_utils.dart
index 1d90e69..c39ddd0 100644
--- a/pkg/crypto/lib/src/hash_utils.dart
+++ b/pkg/crypto/lib/src/hash_utils.dart
@@ -25,8 +25,8 @@
   final int _chunkSizeInWords;
   final int _digestSizeInWords;
   final bool _bigEndianWords;
-  final List<int> _currentChunk;
-  final List<int> _h;
+  final Uint32List _currentChunk;
+  final Uint32List _h;
   int _lengthInBytes = 0;
   List<int> _pendingData;
   bool _digestCalled = false;
@@ -35,8 +35,8 @@
             int digestSizeInWords,
             bool this._bigEndianWords)
       : _pendingData = [],
-        _currentChunk = new List(chunkSizeInWords),
-        _h = new List(digestSizeInWords),
+        _currentChunk = new Uint32List(chunkSizeInWords),
+        _h = new Uint32List(digestSizeInWords),
         _chunkSizeInWords = chunkSizeInWords,
         _digestSizeInWords = digestSizeInWords;
 
@@ -69,7 +69,7 @@
   }
 
   // One round of the hash computation.
-  void _updateHash(List<int> m);
+  void _updateHash(Uint32List m);
 
   // Helper methods.
   int _add32(x, y) => (x + y) & _MASK_32;
@@ -103,8 +103,8 @@
   }
 
   // Convert a 32-bit word to four bytes.
-  List<int> _wordToBytes(int word) {
-    List<int> bytes = new List(_BYTES_PER_WORD);
+  Uint32List _wordToBytes(int word) {
+    Uint32List bytes = new Uint32List(_BYTES_PER_WORD);
     bytes[0] = (word >> (_bigEndianWords ? 24 : 0)) & _MASK_8;
     bytes[1] = (word >> (_bigEndianWords ? 16 : 8)) & _MASK_8;
     bytes[2] = (word >> (_bigEndianWords ? 8 : 16)) & _MASK_8;
diff --git a/pkg/crypto/lib/src/md5.dart b/pkg/crypto/lib/src/md5.dart
index 07b567e..54bf3be 100644
--- a/pkg/crypto/lib/src/md5.dart
+++ b/pkg/crypto/lib/src/md5.dart
@@ -44,7 +44,7 @@
 
   // Compute one iteration of the MD5 algorithm with a chunk of
   // 16 32-bit pieces.
-  void _updateHash(List<int> m) {
+  void _updateHash(Uint32List m) {
     assert(m.length == 16);
 
     var a = _h[0];
diff --git a/pkg/crypto/lib/src/sha1.dart b/pkg/crypto/lib/src/sha1.dart
index 0b55b8d..6e8ea48 100644
--- a/pkg/crypto/lib/src/sha1.dart
+++ b/pkg/crypto/lib/src/sha1.dart
@@ -8,10 +8,10 @@
  * SHA1 hash function implementation.
  */
 class SHA1 extends _HashBase {
-  final List<int> _w;
+  final Uint32List _w;
 
   // Construct a SHA1 hasher object.
-  SHA1() : _w = new List(80), super(16, 5, true) {
+  SHA1() : _w = new Uint32List(80), super(16, 5, true) {
     _h[0] = 0x67452301;
     _h[1] = 0xEFCDAB89;
     _h[2] = 0x98BADCFE;
@@ -26,7 +26,7 @@
 
   // Compute one iteration of the SHA1 algorithm with a chunk of
   // 16 32-bit pieces.
-  void _updateHash(List<int> m) {
+  void _updateHash(Uint32List m) {
     assert(m.length == 16);
 
     var a = _h[0];
diff --git a/pkg/crypto/lib/src/sha256.dart b/pkg/crypto/lib/src/sha256.dart
index 88b701e..f36561f 100644
--- a/pkg/crypto/lib/src/sha256.dart
+++ b/pkg/crypto/lib/src/sha256.dart
@@ -8,10 +8,10 @@
  * SHA256 hash function implementation.
  */
 class SHA256 extends _HashBase {
-  final List<int> _w;
+  final Uint32List _w;
 
   // Construct a SHA256 hasher object.
-  SHA256() : _w = new List(64), super(16, 8, true) {
+  SHA256() : _w = new Uint32List(64), super(16, 8, true) {
     // Initial value of the hash parts. First 32 bits of the fractional parts
     // of the square roots of the first 8 prime numbers.
     _h[0] = 0x6a09e667;
@@ -57,7 +57,7 @@
 
   // Compute one iteration of the SHA256 algorithm with a chunk of
   // 16 32-bit pieces.
-  void _updateHash(List<int> M) {
+  void _updateHash(Uint32List M) {
     assert(M.length == 16);
 
     // Prepare message schedule.
diff --git a/pkg/dart2js_incremental/lib/caching_compiler.dart b/pkg/dart2js_incremental/lib/caching_compiler.dart
index 0d0a145..7a88715 100644
--- a/pkg/dart2js_incremental/lib/caching_compiler.dart
+++ b/pkg/dart2js_incremental/lib/caching_compiler.dart
@@ -38,15 +38,12 @@
       compiler.libraryRoot != libraryRoot ||
       !compiler.hasIncrementalSupport ||
       compiler.hasCrashed ||
-      compiler.compilerWasCancelled ||
       compiler.enqueuer.resolution.hasEnqueuedReflectiveElements ||
       compiler.deferredLoadTask.isProgramSplit) {
     if (compiler != null && compiler.hasIncrementalSupport) {
       print('***FLUSH***');
       if (compiler.hasCrashed) {
         print('Unable to reuse compiler due to crash.');
-      } else if (compiler.compilerWasCancelled) {
-        print('Unable to reuse compiler due to cancel.');
       } else if (compiler.enqueuer.resolution.hasEnqueuedReflectiveElements) {
         print('Unable to reuse compiler due to dart:mirrors.');
       } else if (compiler.deferredLoadTask.isProgramSplit) {
@@ -90,7 +87,7 @@
       }
     }
     compiler
-        ..outputProvider = outputProvider
+        ..userOutputProvider = outputProvider
         ..provider = inputProvider
         ..handler = diagnosticHandler
         ..enqueuer.resolution.queueIsClosed = false
@@ -125,12 +122,8 @@
     backend.emitter.oldEmitter.interceptorEmitter
         ..interceptorInvocationNames.clear();
 
-    backend.emitter.oldEmitter.metadataEmitter
-        ..globalMetadata.clear()
-        ..globalMetadataMap.clear();
-
     backend.emitter.nativeEmitter
-        ..nativeClasses.clear()
+        ..hasNativeClasses = false
         ..nativeMethods.clear();
 
     backend.emitter.readTypeVariables.clear();
@@ -139,8 +132,6 @@
         ..outputBuffers.clear()
         ..isolateProperties = null
         ..classesCollector = null
-        ..neededClasses.clear()
-        ..outputClassLists.clear()
         ..nativeClasses.clear()
         ..mangledFieldNames.clear()
         ..mangledGlobalFieldNames.clear()
@@ -150,7 +141,13 @@
         ..elementDescriptors.clear();
 
     backend.emitter
-        ..outputContainsConstantList = false;
+        ..outputContainsConstantList = false
+        ..neededClasses.clear()
+        ..outputClassLists.clear()
+        ..outputConstantLists.clear()
+        ..outputStaticLists.clear()
+        ..outputStaticNonFinalFieldLists.clear()
+        ..outputLibraryLists.clear();
 
     backend
         ..preMirrorsMethodCount = 0;
diff --git a/pkg/dart2js_incremental/lib/compiler.dart b/pkg/dart2js_incremental/lib/compiler.dart
new file mode 100644
index 0000000..6e86667
--- /dev/null
+++ b/pkg/dart2js_incremental/lib/compiler.dart
@@ -0,0 +1,203 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. 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' show
+    EventSink,
+    Future,
+    Stream,
+    StreamController,
+    StreamSubscription;
+
+import 'package:dart2js_incremental/dart2js_incremental.dart' show
+    IncrementalCompilationFailed,
+    IncrementalCompiler;
+
+import 'package:compiler/src/source_file_provider.dart' show
+    FormattingDiagnosticHandler;
+
+import 'watcher.dart';
+
+main(List<String> arguments) {
+  int updateCount = 0;
+  StreamSubscription<CompilerEvent> subscription =
+      compile(Uri.base.resolve(arguments.first)).listen(null);
+  subscription.onData((CompilerEvent event) {
+    switch (event.kind) {
+      case IncrementalKind.FULL:
+        updateCount = 0;
+        print('// Compiled JavaScript:');
+        print(event['.js']);
+        break;
+
+      case IncrementalKind.INCREMENTAL:
+        Stopwatch sw = event.stopwatch..start();
+        String updates = '${event.compiler.allUpdates()}';
+        sw.stop();
+
+        print('// Patch after ${++updateCount} updates,');
+        print('// computed in ${sw.elapsedMicroseconds/1000000} seconds:');
+        print(updates);
+        break;
+
+      case IncrementalKind.ERROR:
+        updateCount = 0;
+        print("Compilation failed");
+        break;
+
+      default:
+        throw "Unknown kind: ${event.kind}";
+    }
+  });
+  subscription.onError((error, StackTrace trace) {
+    if (error is IncrementalCompilationFailed) {
+      print("Incremental compilation failed due to:\n${error.reason}");
+    } else {
+      throw error;
+    }
+  });
+}
+
+Stream<CompilerEvent> compile(Uri originalInput) {
+  StreamController<CompilerEvent> controller =
+      new StreamController<CompilerEvent>();
+  compileToStream(originalInput, controller);
+  return controller.stream;
+}
+
+compileToStream(
+    Uri originalInput,
+    StreamController<CompilerEvent> controller) async {
+  var watcher = new Watcher();
+
+  Uri libraryRoot = Uri.base.resolve('sdk/');
+  Uri packageRoot = Uri.base.resolve('packages/');
+
+  FormattingDiagnosticHandler diagnosticHandler =
+      new FormattingDiagnosticHandler();
+
+  OutputProvider outputProvider = new OutputProvider();
+
+  void resilientDiagnosticHandler(
+      Uri uri, int begin, int end, String message, kind) {
+    try {
+      diagnosticHandler(uri, begin, end, message, kind);
+    } catch (e) {
+      String name = diagnosticHandler.provider.relativizeUri(uri);
+      print('$name@$begin+${end - begin}: [$kind] $message}');
+    }
+  }
+
+  Future inputProvider(Uri uri) {
+    if (uri.scheme == "file") {
+      if (!'$uri'.startsWith('$libraryRoot')) {
+        watcher.watchFile(uri);
+      }
+    }
+    return diagnosticHandler.provider(uri);
+  }
+
+  while (true) {
+    Stopwatch sw = new Stopwatch()..start();
+    IncrementalCompiler compiler = new IncrementalCompiler(
+        libraryRoot: libraryRoot,
+        packageRoot: packageRoot,
+        inputProvider: inputProvider,
+        diagnosticHandler: resilientDiagnosticHandler,
+        outputProvider: outputProvider);
+
+    bool success = await compiler.compile(originalInput);
+    sw.stop();
+    if (success) {
+      controller.add(
+          new CompilerEvent(
+              IncrementalKind.FULL, compiler, outputProvider.output, sw));
+    } else {
+      controller.add(
+          new CompilerEvent(
+              IncrementalKind.ERROR, compiler, outputProvider.output, sw));
+    }
+
+    while (await watcher.hasChanges()) {
+      try {
+        Map<Uri, Uri> changes = watcher.readChanges();
+
+        sw = new Stopwatch()..start();
+        String updates = await compiler.compileUpdates(changes);
+        sw.stop();
+
+        controller.add(
+            new CompilerEvent(
+                IncrementalKind.INCREMENTAL, compiler, outputProvider.output,
+                sw, updates: updates));
+
+      } on IncrementalCompilationFailed catch (error, trace) {
+        controller.addError(error, trace);
+        break;
+      }
+    }
+  }
+}
+
+/// Output provider which collects output in [output].
+class OutputProvider {
+  final Map<String, String> output = new Map<String, String>();
+
+  EventSink<String> call(String name, String extension) {
+    return new StringEventSink((String data) {
+      output['$name.$extension'] = data;
+    });
+  }
+
+  String operator[](String key) => output[key];
+}
+
+/// Helper class to collect sources.
+class StringEventSink implements EventSink<String> {
+  List<String> data = <String>[];
+
+  final Function onClose;
+
+  StringEventSink(this.onClose);
+
+  void add(String event) {
+    if (data == null) throw 'StringEventSink is closed.';
+    data.add(event);
+  }
+
+  void addError(errorEvent, [StackTrace stackTrace]) {
+    throw 'addError($errorEvent, $stackTrace)';
+  }
+
+  void close() {
+    if (data != null) {
+      onClose(data.join());
+      data = null;
+    }
+  }
+}
+
+enum IncrementalKind {
+  FULL,
+  INCREMENTAL,
+  ERROR,
+}
+
+class CompilerEvent {
+  final IncrementalKind kind;
+
+  final IncrementalCompiler compiler;
+
+  final Map<String, String> _output;
+
+  final Stopwatch stopwatch;
+
+  final String updates;
+
+  CompilerEvent(
+      this.kind, this.compiler, this._output, this.stopwatch, {this.updates});
+
+  String operator[](String key) => _output[key];
+}
diff --git a/pkg/dart2js_incremental/lib/dart2js_incremental.dart b/pkg/dart2js_incremental/lib/dart2js_incremental.dart
index cada67c..2adb61f 100644
--- a/pkg/dart2js_incremental/lib/dart2js_incremental.dart
+++ b/pkg/dart2js_incremental/lib/dart2js_incremental.dart
@@ -41,6 +41,7 @@
 const List<String> INCREMENTAL_OPTIONS = const <String>[
     '--disable-type-inference',
     '--incremental-support',
+    '--generate-code-with-compile-time-errors',
     '--no-source-maps', // TODO(ahe): Remove this.
 ];
 
@@ -57,8 +58,6 @@
 
   Compiler _compiler;
 
-  bool get compilerWasCancelled => _compiler.compilerWasCancelled;
-
   IncrementalCompiler({
       this.libraryRoot,
       this.packageRoot,
@@ -147,12 +146,13 @@
   String allUpdates() {
     jsAst.Node updates = jsAst.js.escapedString(_updates.join(""));
 
+    JavaScriptBackend backend = _compiler.backend;
+
     jsAst.FunctionDeclaration mainRunner = jsAst.js.statement(r"""
 function dartMainRunner(main, args) {
-  $dart_unsafe_eval.patch(#);
+  #helper.patch(#updates + "\n//# sourceURL=initial_patch.js\n");
   return main(args);
-}""", updates);
-
+}""", {'updates': updates, 'helper': backend.namer.accessIncrementalHelper});
 
     jsAst.Printer printer = new jsAst.Printer(_compiler, null);
     printer.blockOutWithoutBraces(mainRunner);
diff --git a/pkg/dart2js_incremental/lib/library_updater.dart b/pkg/dart2js_incremental/lib/library_updater.dart
index a3017b1..f0dc55a 100644
--- a/pkg/dart2js_incremental/lib/library_updater.dart
+++ b/pkg/dart2js_incremental/lib/library_updater.dart
@@ -15,6 +15,7 @@
 import 'package:compiler/src/dart2jslib.dart' show
     Compiler,
     EnqueueTask,
+    MessageKind,
     Script;
 
 import 'package:compiler/src/elements/elements.dart' show
@@ -65,6 +66,11 @@
     MemberInfo,
     computeMixinClass;
 
+import 'package:compiler/src/js_emitter/model.dart' show
+    Class;
+import 'package:compiler/src/js_emitter/program_builder.dart' show
+    ProgramBuilder;
+
 import 'package:_internal/compiler/js_lib/shared/embedded_names.dart'
     as embeddedNames;
 
@@ -844,7 +850,7 @@
         jsAst.Node superAccess = emitter.constructorAccess(superclass);
         inherits.add(
             js.statement(
-                r'#.inheritFrom(#, #)', [helper, classAccess, superAccess]));
+                r'this.inheritFrom(#, #)', [classAccess, superAccess]));
       }
     }
 
@@ -861,9 +867,8 @@
       jsAst.Node classAccess = emitter.constructorAccess(cls);
       updates.add(
           js.statement(
-              r'# = #.schemaChange(#, #, #)',
-              [classAccess, helper,
-               invokeDefineClass(cls), classAccess, superAccess]));
+              r'# = this.schemaChange(#, #, #)',
+              [classAccess, invokeDefineClass(cls), classAccess, superAccess]));
     }
 
     for (RemovalUpdate update in removals) {
@@ -898,11 +903,11 @@
     }
 
     updates.add(js.statement(r'''
-if (#helper.pendingStubs) {
-  #helper.pendingStubs.map(function(e) { return e(); });
-  #helper.pendingStubs = void 0;
+if (this.pendingStubs) {
+  this.pendingStubs.map(function(e) { return e(); });
+  this.pendingStubs = void 0;
 }
-''', {'helper': helper}));
+'''));
 
     if (updates.length == 1) {
       return prettyPrintJs(updates.single);
@@ -918,10 +923,9 @@
         r'''
 (new Function(
     "$collectedClasses", "$desc",
-    #helper.defineClass(#name, #computeFields) +"\n;return " + #name))(
+    this.defineClass(#name, #computeFields) +"\n;return " + #name))(
         {#name: #descriptor})''',
-        {'helper': helper,
-         'name': js.string(name),
+        {'name': js.string(name),
          'computeFields': js.stringArray(computeFields(cls)),
          'descriptor': descriptor});
   }
@@ -954,8 +958,8 @@
         emitter.generateEmbeddedGlobalAccess(embeddedNames.GLOBAL_FUNCTIONS);
 
     return js.statement(
-        r'#.addMethod(#, #, #, #, #)',
-        [helper, partialDescriptor, js.string(name), holder,
+        r'this.addMethod(#, #, #, #, #)',
+        [partialDescriptor, js.string(name), holder,
          new jsAst.LiteralBool(isStatic), globalFunctionsAccess]);
   }
 
@@ -1460,8 +1464,6 @@
   ContainerBuilder get containerBuilder => emitter.oldEmitter.containerBuilder;
 
   EnqueueTask get enqueuer => compiler.enqueuer;
-
-  jsAst.Expression get helper => namer.accessIncrementalHelper;
 }
 
 class EmitterHelper extends JsFeatures {
@@ -1471,9 +1473,11 @@
 
   ClassEmitter get classEmitter => backend.emitter.oldEmitter.classEmitter;
 
-  List<String> computeFields(ClassElement cls) {
+  List<String> computeFields(ClassElement classElement) {
+    Class cls = new ProgramBuilder(compiler, namer, emitter)
+        .buildClassWithFieldsForTry(classElement);
     // TODO(ahe): Rewrite for new emitter.
-    ClassBuilder builder = new ClassBuilder(cls, namer);
+    ClassBuilder builder = new ClassBuilder(classElement, namer);
     classEmitter.emitFields(cls, builder);
     return builder.fields;
   }
diff --git a/pkg/dart2js_incremental/lib/server.dart b/pkg/dart2js_incremental/lib/server.dart
new file mode 100644
index 0000000..d2dc9a2
--- /dev/null
+++ b/pkg/dart2js_incremental/lib/server.dart
@@ -0,0 +1,301 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart2js_incremental.server;
+
+import 'dart:io';
+
+import 'dart:async' show
+    Completer,
+    Future,
+    Stream,
+    StreamController,
+    StreamSubscription;
+
+import 'dart:convert' show
+    HtmlEscape,
+    JSON,
+    UTF8;
+
+import 'src/options.dart';
+
+import 'compiler.dart' show
+    CompilerEvent,
+    IncrementalKind,
+    compile;
+
+class Conversation {
+  HttpRequest request;
+  HttpResponse response;
+
+  static const String PACKAGES_PATH = '/packages';
+
+  static const String CONTENT_TYPE = HttpHeaders.CONTENT_TYPE;
+
+  static Uri documentRoot = Uri.base;
+
+  static Uri packageRoot = Uri.base.resolve('packages/');
+
+  static Map<Uri, Future<String>> generatedFiles =
+      new Map<Uri, Future<String>>();
+
+  static Map<Uri, StreamController<String>> updateControllers =
+      new Map<Uri, StreamController<String>>();
+
+  Conversation(this.request, this.response);
+
+  onClosed(_) {
+    if (response.statusCode == HttpStatus.OK) return;
+    print('Request for ${request.uri} ${response.statusCode}');
+  }
+
+  Future notFound(Uri uri) {
+    response
+        ..headers.set(CONTENT_TYPE, 'text/html')
+        ..statusCode = HttpStatus.NOT_FOUND
+        ..write(htmlInfo("Not Found", "The file '$uri' could not be found."));
+    return response.close();
+  }
+
+  Future badRequest(String problem) {
+    response
+        ..headers.set(CONTENT_TYPE, 'text/html')
+        ..statusCode = HttpStatus.BAD_REQUEST
+        ..write(
+            htmlInfo("Bad request", "Bad request '${request.uri}': $problem"));
+    return response.close();
+  }
+
+  Future handleSocket() async {
+    StreamController<String> controller = updateControllers[request.uri];
+    if (controller != null) {
+      WebSocket socket = await WebSocketTransformer.upgrade(request);
+      print(
+          "Patches to ${request.uri} will be pushed to "
+          "${request.connectionInfo.remoteAddress.host}:"
+          "${request.connectionInfo.remotePort}.");
+      controller.stream.pipe(socket);
+    } else {
+      response.done
+          .then(onClosed)
+          .catchError(onError);
+      return await notFound(request.uri);
+    }
+  }
+
+  Future handle() {
+    response.done
+        .then(onClosed)
+        .catchError(onError);
+
+    Uri uri = request.uri;
+    if (uri.path.endsWith('/')) {
+      uri = uri.resolve('index.html');
+    }
+    if (uri.path.contains('..') || uri.path.contains('%')) {
+      return notFound(uri);
+    }
+    String path = uri.path;
+    Uri root = documentRoot;
+    if (path.startsWith('${PACKAGES_PATH}/')) {
+      root = packageRoot;
+      path = path.substring(PACKAGES_PATH.length);
+    }
+
+    Uri resolvedRequest = root.resolve('.$path');
+    switch (request.method) {
+      case 'GET':
+        return handleGet(resolvedRequest);
+      default:
+        String method = const HtmlEscape().convert(request.method);
+        return badRequest("Unsupported method: '$method'");
+    }
+  }
+
+  Future handleGet(Uri uri) async {
+    String path = uri.path;
+    var f = new File.fromUri(uri);
+    if (!await f.exists()) {
+      return await handleNonExistingFile(uri);
+    } else {
+      setContentType(path);
+    }
+    return await f.openRead().pipe(response);
+  }
+
+  void setContentType(String path) {
+    if (path.endsWith('.html')) {
+      response.headers.set(CONTENT_TYPE, 'text/html');
+    } else if (path.endsWith('.dart')) {
+      response.headers.set(CONTENT_TYPE, 'application/dart');
+    } else if (path.endsWith('.js')) {
+      response.headers.set(CONTENT_TYPE, 'application/javascript');
+    } else if (path.endsWith('.ico')) {
+      response.headers.set(CONTENT_TYPE, 'image/x-icon');
+    } else if (path.endsWith('.appcache')) {
+      response.headers.set(CONTENT_TYPE, 'text/cache-manifest');
+    } else if (path.endsWith('.css')) {
+      response.headers.set(CONTENT_TYPE, 'text/css');
+    } else if (path.endsWith('.png')) {
+      response.headers.set(CONTENT_TYPE, 'image/png');
+    }
+  }
+
+  Future handleNonExistingFile(Uri uri) async {
+    String path = uri.path;
+    String generated = await generatedFiles[request.uri];
+    if (generated != null) {
+      print("Serving ${request.uri} from memory.");
+      setContentType(path);
+      response.write(generated);
+      return await response.close();
+    }
+    if (path.endsWith('.dart.js')) {
+      Uri dartScript = uri.resolve(path.substring(0, path.length - 3));
+      if (await new File.fromUri(dartScript).exists()) {
+        return await compileToJavaScript(dartScript);
+      }
+    }
+    return await notFound(request.uri);
+  }
+
+  compileToJavaScript(Uri dartScript) {
+    Uri outputUri = request.uri;
+    Completer<String> completer = new Completer<String>();
+    generatedFiles[outputUri] = completer.future;
+    StreamController controller = updateControllers[outputUri];
+    if (controller != null) {
+      controller.close();
+    }
+    updateControllers[outputUri] = new StreamController<String>.broadcast();
+    print("Compiling $dartScript to $outputUri.");
+    StreamSubscription<CompilerEvent> subscription;
+    subscription = compile(dartScript).listen((CompilerEvent event) {
+      subscription.onData(
+          (CompilerEvent event) => onCompilerEvent(completer, event));
+      if (event.kind != IncrementalKind.FULL) {
+        notFound(request.uri);
+        // TODO(ahe): Do something about this situation.
+      } else {
+        print("Done compiling $dartScript to $outputUri.");
+        completer.complete(event['.js']);
+        setContentType(outputUri.path);
+        response.write(event['.js']);
+        response.close();
+      }
+    });
+  }
+
+  onCompilerEvent(Completer completer, CompilerEvent event) {
+    Uri outputUri = request.uri;
+    print("Got ${event.kind} for $outputUri");
+
+    switch (event.kind) {
+      case IncrementalKind.FULL:
+        generatedFiles[outputUri] = new Future.value(event['.js']);
+        break;
+
+      case IncrementalKind.INCREMENTAL:
+        generatedFiles[outputUri] = completer.future.then(
+            (String full) => '$full\n\n${event.compiler.allUpdates()}');
+        pushUpdates(event.updates);
+        break;
+
+      case IncrementalKind.ERROR:
+        generatedFiles.removeKey(outputUri);
+        break;
+    }
+  }
+
+  void pushUpdates(String updates) {
+    if (updates == null) return;
+    StreamController<String> controller = updateControllers[request.uri];
+    if (controller == null) return;
+    print("Adding updates to controller");
+    controller.add(updates);
+  }
+
+  Future dispatch() async {
+    try {
+      return await WebSocketTransformer.isUpgradeRequest(request)
+          ? handleSocket()
+          : handle();
+    } catch (e, s) {
+      onError(e, s);
+    }
+  }
+
+  static Future onRequest(HttpRequest request) async {
+    HttpResponse response = request.response;
+    try {
+      return await new Conversation(request, response).dispatch();
+    } catch (e, s) {
+      try {
+        onStaticError(e, s);
+        return await response.close();
+      } catch (e, s) {
+        onStaticError(e, s);
+      }
+    }
+  }
+
+  Future onError(error, [stack]) async {
+    try {
+      onStaticError(error, stack);
+      return await response.close();
+    } catch (e, s) {
+      onStaticError(e, s);
+    }
+  }
+
+  static void onStaticError(error, [stack]) {
+    if (error is HttpException) {
+      print('Error: ${error.message}');
+    } else {
+      print('Error: ${error}');
+    }
+    if (stack != null) {
+      print(stack);
+    }
+  }
+
+  String htmlInfo(String title, String text) {
+    // No script injection, please.
+    title = const HtmlEscape().convert(title);
+    text = const HtmlEscape().convert(text);
+    return """
+<!DOCTYPE html>
+<html lang='en'>
+<head>
+<title>$title</title>
+</head>
+<body>
+<h1>$title</h1>
+<p style='white-space:pre'>$text</p>
+</body>
+</html>
+""";
+  }
+}
+
+main(List<String> arguments) async {
+  Options options = Options.parse(arguments);
+  if (options == null) {
+    exit(1);
+  }
+  if (!options.arguments.isEmpty) {
+    Conversation.documentRoot = Uri.base.resolve(options.arguments.single);
+  }
+  Conversation.packageRoot = options.packageRoot;
+  String host = options.host;
+  int port = options.port;
+  try {
+    HttpServer server = await HttpServer.bind(host, port);
+    print('HTTP server started on http://$host:${server.port}/');
+    server.listen(Conversation.onRequest, onError: Conversation.onStaticError);
+  } catch (e) {
+    print("HttpServer.bind error: $e");
+    exit(1);
+  };
+}
diff --git a/pkg/dart2js_incremental/lib/src/options.dart b/pkg/dart2js_incremental/lib/src/options.dart
new file mode 100644
index 0000000..ba1260f
--- /dev/null
+++ b/pkg/dart2js_incremental/lib/src/options.dart
@@ -0,0 +1,134 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart2js_incremental.options;
+
+class Options {
+  final List<String> arguments;
+  final Uri packageRoot;
+  final String host;
+  final int port;
+
+  Options({this.arguments, this.packageRoot, this.host, this.port});
+
+  static String extractArgument(String option, String short, {String long}) {
+    if (option.startsWith(short)) {
+      return option.substring(short.length);
+    }
+    if (long != null && option.startsWith(long)) {
+      return option.substring(long.length);
+    }
+    return null;
+  }
+
+  static Options parse(List<String> commandLine) {
+    Iterator<String> iterator = commandLine.iterator;
+    List<String> arguments = <String>[];
+    Uri packageRoot;
+    String host = "127.0.0.1";
+    int port = 0;
+    bool showHelp = false;
+    List<String> unknownOptions = <String>[];
+
+    LOOP: while (iterator.moveNext()) {
+      String option = iterator.current;
+      switch (option) {
+        case "-p":
+          iterator.moveNext();
+          packageRoot = Uri.base.resolve(iterator.current);
+          continue;
+
+        case "-h":
+          iterator.moveNext();
+          host = iterator.current;
+          continue;
+
+        case "-n":
+          iterator.moveNext();
+          port = int.parse(iterator.current);
+          continue;
+
+        case "--help":
+          showHelp = true;
+          continue;
+
+        case "--":
+          break LOOP;
+
+        default:
+          String argument;
+
+          argument = extractArgument(option, "-p", long: "--package-root");
+          if (argument != null) {
+            packageRoot = Uri.base.resolve(argument);
+            continue;
+          }
+
+          argument = extractArgument(option, "-h", long: "--host");
+          if (argument != null) {
+            host = argument;
+            continue;
+          }
+
+          argument = extractArgument(option, "-n", long: "--port");
+          if (argument != null) {
+            port = int.parse(option);
+            continue;
+          }
+
+          if (option.startsWith("-")) {
+            unknownOptions.add(option);
+            continue;
+          }
+
+          arguments.add(option);
+          break;
+      }
+    }
+    if (showHelp) {
+      print(USAGE);
+    }
+    if (!unknownOptions.isEmpty) {
+      print(USAGE);
+      print("Unknown options: '${unknownOptions.join('\', \'')}'");
+      return null;
+    }
+    while (iterator.moveNext()) {
+      arguments.add(iterator.current);
+    }
+    if (arguments.length > 1) {
+      print(USAGE);
+      print("Extra arguments: '${arguments.skip(1).join('\', \'')}'");
+      return null;
+    }
+    if (packageRoot == null) {
+      packageRoot = Uri.base.resolve('packages/');
+    }
+    return new Options(
+        arguments: arguments, packageRoot: packageRoot, host: host, port: port);
+  }
+}
+
+const String USAGE = """
+Usage: server.dart [options] [--] documentroot
+
+Development web server which serves files relative to [documentroot]. If a file
+is missing, and the requested file name ends with '.dart.js', the server will
+look for a file with the same name save '.js', compile it to JavaScript, and
+serve that file instead.
+
+Supported options:
+
+  -p<path>, --package-root=<path>
+    Where to find packages, that is, "package:..." imports.
+
+  -h<name>, --host=<name>
+    Host name to bind the web server to (default 127.0.0.1).
+
+  -n<port>, --port=<port>
+    Port number to bind the web server to.
+
+  --help
+    Show this message.
+""";
diff --git a/pkg/dart2js_incremental/lib/watcher.dart b/pkg/dart2js_incremental/lib/watcher.dart
new file mode 100644
index 0000000..a212f6d
--- /dev/null
+++ b/pkg/dart2js_incremental/lib/watcher.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart2js_incremental.watcher;
+
+import 'dart:io';
+
+import 'dart:async';
+
+class Watcher {
+  final Set<String> _watchedDirectories = new Set<String>();
+
+  final Map<String, Set<Uri>> _watchedFiles = new Map<String, Set<Uri>>();
+
+  final Set<Uri> _changes = new Set<Uri>();
+
+  bool _hasEarlyChanges = false;
+
+  Completer<bool> _changesCompleter;
+
+  Future<bool> hasChanges() {
+    if (_changesCompleter == null && _hasEarlyChanges) {
+      return new Future.value(true);
+    }
+    _changesCompleter = new Completer<bool>();
+    return _changesCompleter.future;
+  }
+
+  void _onFileSystemEvent(FileSystemEvent event) {
+    Set<Uri> uris = _watchedFiles[event.path];
+    if (uris == null) return;
+    _changes.addAll(uris);
+    if (_changesCompleter == null) {
+      _hasEarlyChanges = true;
+    } else if (!_changesCompleter.isCompleted) {
+      _changesCompleter.complete(true);
+    }
+  }
+
+  Map<Uri, Uri> readChanges() {
+    if (_changes.isEmpty) {
+      throw new StateError("No changes");
+    }
+    Map<Uri, Uri> result = new Map<Uri, Uri>();
+    for (Uri uri in _changes) {
+      result[uri] = uri;
+    }
+    _changes.clear();
+    return result;
+  }
+
+  void watchFile(Uri uri) {
+    String realpath = new File.fromUri(uri).resolveSymbolicLinksSync();
+    _watchedFiles.putIfAbsent(realpath, () => new Set<Uri>()).add(uri);
+    Directory directory = new File(realpath).parent;
+    if (_watchedDirectories.add(directory.path)) {
+      print("Watching ${directory.path}");
+      directory.watch().listen(_onFileSystemEvent);
+    }
+  }
+}
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 440a191..00d94ee 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -51,9 +51,12 @@
 
 analyzer/test/enum_test: Fail # Issue 21323
 
+analysis_server/test/*: Skip # Issue 22161
 analysis_server/test/search/element_references_test: Pass, Slow
 analysis_server/test/services/index/store/codec_test: Pass, Slow
+analysis_server/test/domain_completion_test: Pass, Slow
 analysis_server/test/edit/assists_test: Pass, Slow
+analysis_server/test/edit/format_test: Pass, Slow
 
 # Analysis server integration tests don't make sense to run under
 # dart2js, since the code under test always runs in the Dart vm as a
@@ -94,6 +97,7 @@
 
 [ $compiler == dart2js && ($runtime == chrome || $runtime == ff) ]
 collection/test/unmodifiable_collection_test: Skip # Times out. Issue 22050
+async/test/stream_zip_test: Skip # Times out. Issue 22050
 
 [ $runtime == vm || $runtime == d8 || $runtime == jsshell ]
 third_party/angular_tests/browser_test: Skip # uses dart:html
diff --git a/runtime/BUILD.gn b/runtime/BUILD.gn
index 4c12262..440b574 100644
--- a/runtime/BUILD.gn
+++ b/runtime/BUILD.gn
@@ -73,6 +73,7 @@
 
   script = "../tools/make_version.py"
   args = [
+    "--quiet",
     "--output", rebase_path(output, root_build_dir),
     "--input", rebase_path("vm/version_in.cc", root_build_dir),
   ]
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index 9fc4bd1..0a437f1 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -368,14 +368,21 @@
     errno = ENOENT;
     return NULL;
   }
-  size_t target_size = link_stats.st_size;
-  char* target_name = reinterpret_cast<char*>(malloc(target_size + 1));
-  size_t read_size = NO_RETRY_EXPECTED(
-      readlink(pathname, target_name, target_size + 1));
-  if (read_size != target_size) {
-    free(target_name);
+  // Don't rely on the link_stats.st_size for the size of the link
+  // target. For some filesystems, e.g. procfs, this value is always
+  // 0. Also the link might have changed before the readlink call.
+  const int kBufferSize = PATH_MAX + 1;
+  char target[kBufferSize];
+  size_t target_size = TEMP_FAILURE_RETRY(
+      readlink(pathname, target, kBufferSize));
+  if (target_size <= 0) {
     return NULL;
   }
+  char* target_name = reinterpret_cast<char*>(malloc(target_size + 1));
+  if (target_name == NULL) {
+    return NULL;
+  }
+  memmove(target_name, target, target_size);
   target_name[target_size] = '\0';
   return target_name;
 }
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc
index ce3b5f4..9fc33c5 100644
--- a/runtime/bin/file_macos.cc
+++ b/runtime/bin/file_macos.cc
@@ -329,13 +329,20 @@
     errno = ENOENT;
     return NULL;
   }
-  size_t target_size = link_stats.st_size;
-  char* target_name = reinterpret_cast<char*>(malloc(target_size + 1));
-  size_t read_size = readlink(pathname, target_name, target_size + 1);
-  if (read_size != target_size) {
-    free(target_name);
+  // Don't rely on the link_stats.st_size for the size of the link
+  // target. The link might have changed before the readlink call.
+  const int kBufferSize = 1024;
+  char target[kBufferSize];
+  size_t target_size = TEMP_FAILURE_RETRY(
+      readlink(pathname, target, kBufferSize));
+  if (target_size <= 0) {
     return NULL;
   }
+  char* target_name = reinterpret_cast<char*>(malloc(target_size + 1));
+  if (target_name == NULL) {
+    return NULL;
+  }
+  memmove(target_name, target, target_size);
   target_name[target_size] = '\0';
   return target_name;
 }
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index 62e7961..67b97f5 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -45,7 +45,7 @@
 
 void File::Close() {
   ASSERT(handle_->fd() >= 0);
-  if (handle_->fd() == _fileno(stdout)) {
+  if (handle_->fd() == _fileno(stdout) || handle_->fd() == _fileno(stderr)) {
     int fd = _open("NUL", _O_WRONLY);
     ASSERT(fd >= 0);
     _dup2(fd, handle_->fd());
diff --git a/runtime/bin/filter_patch.dart b/runtime/bin/filter_patch.dart
index d8109fd..3a32170 100644
--- a/runtime/bin/filter_patch.dart
+++ b/runtime/bin/filter_patch.dart
@@ -31,15 +31,15 @@
 }
 
 patch class _Filter {
-  /* patch */ static _Filter newZLibDeflateFilter(bool gzip, int level,
-                                                  int windowBits, int memLevel,
-                                                  int strategy,
-                                                  List<int> dictionary,
-                                                  bool raw) =>
+  /* patch */ static _Filter _newZLibDeflateFilter(bool gzip, int level,
+                                                   int windowBits, int memLevel,
+                                                   int strategy,
+                                                   List<int> dictionary,
+                                                   bool raw) =>
       new _ZLibDeflateFilter(gzip, level, windowBits, memLevel, strategy,
                              dictionary, raw);
-  /* patch */ static _Filter newZLibInflateFilter(int windowBits,
-                                                  List<int> dictionary,
-                                                  bool raw) =>
+  /* patch */ static _Filter _newZLibInflateFilter(int windowBits,
+                                                   List<int> dictionary,
+                                                   bool raw) =>
       new _ZLibInflateFilter(windowBits, dictionary, raw);
 }
diff --git a/runtime/bin/io_natives.cc b/runtime/bin/io_natives.cc
index b8050cf..f8503a3 100644
--- a/runtime/bin/io_natives.cc
+++ b/runtime/bin/io_natives.cc
@@ -44,7 +44,7 @@
   V(Platform_ExecutableArguments, 0)                                           \
   V(Platform_PackageRoot, 0)                                                   \
   V(Platform_GetVersion, 0)                                                    \
-  V(Process_Start, 10)                                                         \
+  V(Process_Start, 11)                                                         \
   V(Process_Wait, 5)                                                           \
   V(Process_Kill, 3)                                                           \
   V(Process_SetExitCode, 1)                                                    \
@@ -90,7 +90,7 @@
   V(Stdin_SetEchoMode, 1)                                                      \
   V(Stdin_GetLineMode, 0)                                                      \
   V(Stdin_SetLineMode, 1)                                                      \
-  V(Stdout_GetTerminalSize, 0)                                                 \
+  V(Stdout_GetTerminalSize, 1)                                                 \
   V(StringToSystemEncoding, 1)                                                 \
   V(SystemEncodingToString, 1)
 
diff --git a/runtime/bin/io_service_patch.dart b/runtime/bin/io_service_patch.dart
index d00f9f2..add622f 100644
--- a/runtime/bin/io_service_patch.dart
+++ b/runtime/bin/io_service_patch.dart
@@ -11,7 +11,7 @@
   static Map<int, Completer> _messageMap = {};
   static int _id = 0;
 
-  /* patch */ static Future dispatch(int request, List data) {
+  /* patch */ static Future _dispatch(int request, List data) {
     int id;
     do {
       id = _getNextId();
diff --git a/runtime/bin/process.cc b/runtime/bin/process.cc
index fecb5aa..5203530 100644
--- a/runtime/bin/process.cc
+++ b/runtime/bin/process.cc
@@ -65,7 +65,7 @@
   intptr_t process_stdout;
   intptr_t process_stderr;
   intptr_t exit_event;
-  Dart_Handle status_handle = Dart_GetNativeArgument(args, 9);
+  Dart_Handle status_handle = Dart_GetNativeArgument(args, 10);
   Dart_Handle path_handle = Dart_GetNativeArgument(args, 1);
   // The Dart code verifies that the path implements the String
   // interface. However, only builtin Strings are handled by
@@ -118,10 +118,11 @@
       return;
     }
   }
-  Dart_Handle stdin_handle = Dart_GetNativeArgument(args, 5);
-  Dart_Handle stdout_handle = Dart_GetNativeArgument(args, 6);
-  Dart_Handle stderr_handle = Dart_GetNativeArgument(args, 7);
-  Dart_Handle exit_handle = Dart_GetNativeArgument(args, 8);
+  bool detached = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 5));
+  Dart_Handle stdin_handle = Dart_GetNativeArgument(args, 6);
+  Dart_Handle stdout_handle = Dart_GetNativeArgument(args, 7);
+  Dart_Handle stderr_handle = Dart_GetNativeArgument(args, 8);
+  Dart_Handle exit_handle = Dart_GetNativeArgument(args, 9);
   intptr_t pid = -1;
   char* os_error_message = NULL;
 
@@ -131,6 +132,7 @@
                                   working_directory,
                                   string_environment,
                                   environment_length,
+                                  detached,
                                   &process_stdout,
                                   &process_stdin,
                                   &process_stderr,
@@ -138,10 +140,12 @@
                                   &exit_event,
                                   &os_error_message);
   if (error_code == 0) {
-    Socket::SetSocketIdNativeField(stdin_handle, process_stdin);
-    Socket::SetSocketIdNativeField(stdout_handle, process_stdout);
-    Socket::SetSocketIdNativeField(stderr_handle, process_stderr);
-    Socket::SetSocketIdNativeField(exit_handle, exit_event);
+    if (!detached) {
+      Socket::SetSocketIdNativeField(stdin_handle, process_stdin);
+      Socket::SetSocketIdNativeField(stdout_handle, process_stdout);
+      Socket::SetSocketIdNativeField(stderr_handle, process_stderr);
+      Socket::SetSocketIdNativeField(exit_handle, exit_event);
+    }
     Process::SetProcessIdNativeField(process, pid);
   } else {
     DartUtils::SetIntegerField(
diff --git a/runtime/bin/process.h b/runtime/bin/process.h
index b2fb60f..1892122 100644
--- a/runtime/bin/process.h
+++ b/runtime/bin/process.h
@@ -87,6 +87,7 @@
                    const char* working_directory,
                    char* environment[],
                    intptr_t environment_length,
+                   bool detached,
                    intptr_t* in,
                    intptr_t* out,
                    intptr_t* err,
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index 32e4982..58faa04 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -258,12 +258,37 @@
 }
 
 
+static void ReportPid(int exec_control_fd, int pid) {
+  // In the case of starting a detached process the actual pid of that process
+  // is communicated using the exec control pipe.
+  int bytes_written =
+      FDUtils::WriteToBlocking(exec_control_fd, &pid, sizeof(pid));
+  ASSERT(bytes_written == sizeof(int));
+  USE(bytes_written);
+}
+
+
+static void ReadChildError(int exec_control_fd, char** error_message) {
+  const int kMaxMessageSize = 256;
+  char* message = static_cast<char*>(malloc(kMaxMessageSize));
+  if (message != NULL) {
+    FDUtils::ReadFromBlocking(exec_control_fd, message, kMaxMessageSize);
+    message[kMaxMessageSize - 1] = '\0';
+    *error_message = message;
+  } else {
+    static const char* no_message = "Cannot get error message, out of memory";
+    *error_message = const_cast<char*>(no_message);
+  }
+}
+
+
 int Process::Start(const char* path,
                    char* arguments[],
                    intptr_t arguments_length,
                    const char* working_directory,
                    char* environment[],
                    intptr_t environment_length,
+                   bool detach,
                    intptr_t* in,
                    intptr_t* out,
                    intptr_t* err,
@@ -271,70 +296,61 @@
                    intptr_t* exit_event,
                    char** os_error_message) {
   pid_t pid;
-  int read_in[2];  // Pipe for stdout to child process.
-  int read_err[2];  // Pipe for stderr to child process.
-  int write_out[2];  // Pipe for stdin to child process.
-  int exec_control[2];  // Pipe to get the result from exec.
+  int read_in[2] = {-1, -1};  // Pipe for stdout to child process.
+  int read_err[2] = {-1, -1};  // Pipe for stderr to child process.
+  int write_out[2] = {-1, -1};  // Pipe for stdin to child process.
+  int exec_control[2] = {-1, -1};  // Pipe to get the result from exec.
   int result;
 
-  result = TEMP_FAILURE_RETRY(pipe(read_in));
-  if (result < 0) {
-    SetChildOsErrorMessage(os_error_message);
-    Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
-    return errno;
-  }
-  FDUtils::SetCloseOnExec(read_in[0]);
-
-  result = TEMP_FAILURE_RETRY(pipe(read_err));
-  if (result < 0) {
-    SetChildOsErrorMessage(os_error_message);
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-    Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
-    return errno;
-  }
-  FDUtils::SetCloseOnExec(read_err[0]);
-
-  result = TEMP_FAILURE_RETRY(pipe(write_out));
-  if (result < 0) {
-    SetChildOsErrorMessage(os_error_message);
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
-    Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
-    return errno;
-  }
-  FDUtils::SetCloseOnExec(write_out[1]);
-
   result = TEMP_FAILURE_RETRY(pipe(exec_control));
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
     Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
   FDUtils::SetCloseOnExec(exec_control[0]);
   FDUtils::SetCloseOnExec(exec_control[1]);
 
+  // For a detached process the pipe to connect stdout is still used for
+  // signaling when to do the first fork.
+  result = TEMP_FAILURE_RETRY(pipe(read_in));
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
     VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
     VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
-    Log::PrintErr("fcntl failed: %s\n", *os_error_message);
+    Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
+  FDUtils::SetCloseOnExec(read_in[0]);
+
+  // For detached processes the pipe to connect stderr and stdin are not used.
+  if (!detach) {
+    result = TEMP_FAILURE_RETRY(pipe(read_err));
+    if (result < 0) {
+      SetChildOsErrorMessage(os_error_message);
+      VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+      VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+      Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
+      return errno;
+    }
+    FDUtils::SetCloseOnExec(read_err[0]);
+
+    result = TEMP_FAILURE_RETRY(pipe(write_out));
+    if (result < 0) {
+      SetChildOsErrorMessage(os_error_message);
+      VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+      VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+      Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
+      return errno;
+    }
+    FDUtils::SetCloseOnExec(write_out[1]);
+  }
 
   char** program_arguments = new char*[arguments_length + 2];
   program_arguments[0] = const_cast<char*>(path);
@@ -356,14 +372,16 @@
   if (pid < 0) {
     SetChildOsErrorMessage(os_error_message);
     delete[] program_arguments;
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
     VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
     VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    if (!detach) {
+      VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+      VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+      VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+    }
     return errno;
   } else if (pid == 0) {
     // Wait for parent process before setting up the child process.
@@ -373,40 +391,96 @@
       perror("Failed receiving notification message");
       exit(1);
     }
+    if (detach) {
+      // For a detached process the pipe to connect stdout is only used for
+      // signaling when to do the first fork.
+      VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+      // Fork once more to start a new session.
+      pid = TEMP_FAILURE_RETRY(fork());
+      if (pid < 0) {
+        ReportChildError(exec_control[1]);
+      } else if (pid == 0) {
+        // Start a new session.
+        if (TEMP_FAILURE_RETRY(setsid()) == -1) {
+          ReportChildError(exec_control[1]);
+        } else {
+          // Do a final fork to not be the session leader.
+          pid = TEMP_FAILURE_RETRY(fork());
+          if (pid < 0) {
+            ReportChildError(exec_control[1]);
+          } else if (pid == 0) {
+            // Close all open file descriptors except for exec_control[1].
+            int max_fds = sysconf(_SC_OPEN_MAX);
+            if (max_fds == -1) max_fds = _POSIX_OPEN_MAX;
+            for (int fd = 0; fd < max_fds; fd++) {
+              if (fd != exec_control[1]) {
+                VOID_TEMP_FAILURE_RETRY(close(fd));
+              }
+            }
 
-    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
-    VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+            // Re-open stdin, stdout and stderr and connect them to /dev/null.
+            // The loop above should already have closed all of them, so
+            // creating new file descriptors should start at STDIN_FILENO.
+            int fd = TEMP_FAILURE_RETRY(open("/dev/null", O_RDWR));
+            if (fd != STDIN_FILENO) {
+              ReportChildError(exec_control[1]);
+            }
+            if (TEMP_FAILURE_RETRY(dup2(STDIN_FILENO, STDOUT_FILENO)) !=
+                STDOUT_FILENO) {
+              ReportChildError(exec_control[1]);
+            }
+            if (TEMP_FAILURE_RETRY(dup2(STDIN_FILENO, STDERR_FILENO)) !=
+                STDERR_FILENO) {
+              ReportChildError(exec_control[1]);
+            }
 
-    if (TEMP_FAILURE_RETRY(dup2(write_out[0], STDIN_FILENO)) == -1) {
+            // Report the final PID and do the exec.
+            ReportPid(exec_control[1], getpid());  // getpid cannot fail.
+            VOID_TEMP_FAILURE_RETRY(
+                execvp(path, const_cast<char* const*>(program_arguments)));
+            ReportChildError(exec_control[1]);
+          } else {
+            exit(0);
+          }
+        }
+      } else {
+        exit(0);
+      }
+    } else {
+      VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+      VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+
+      if (TEMP_FAILURE_RETRY(dup2(write_out[0], STDIN_FILENO)) == -1) {
+        ReportChildError(exec_control[1]);
+      }
+      VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+
+      if (TEMP_FAILURE_RETRY(dup2(read_in[1], STDOUT_FILENO)) == -1) {
+        ReportChildError(exec_control[1]);
+      }
+      VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+
+      if (TEMP_FAILURE_RETRY(dup2(read_err[1], STDERR_FILENO)) == -1) {
+        ReportChildError(exec_control[1]);
+      }
+      VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+
+      if (working_directory != NULL && chdir(working_directory) == -1) {
+        ReportChildError(exec_control[1]);
+      }
+
+      if (program_environment != NULL) {
+        environ = program_environment;
+      }
+
+      VOID_TEMP_FAILURE_RETRY(
+          execvp(path, const_cast<char* const*>(program_arguments)));
+
       ReportChildError(exec_control[1]);
     }
-    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
-
-    if (TEMP_FAILURE_RETRY(dup2(read_in[1], STDOUT_FILENO)) == -1) {
-      ReportChildError(exec_control[1]);
-    }
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-
-    if (TEMP_FAILURE_RETRY(dup2(read_err[1], STDERR_FILENO)) == -1) {
-      ReportChildError(exec_control[1]);
-    }
-    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
-
-    if (working_directory != NULL &&
-        TEMP_FAILURE_RETRY(chdir(working_directory)) == -1) {
-      ReportChildError(exec_control[1]);
-    }
-
-    if (program_environment != NULL) {
-      environ = program_environment;
-    }
-
-    TEMP_FAILURE_RETRY(
-        execvp(path, const_cast<char* const*>(program_arguments)));
-
-    ReportChildError(exec_control[1]);
   }
 
   // Be sure to listen for exit-codes, now we have a child-process.
@@ -417,25 +491,27 @@
   delete[] program_arguments;
   delete[] program_environment;
 
-  int event_fds[2];
-  result = TEMP_FAILURE_RETRY(pipe(event_fds));
-  if (result < 0) {
-    SetChildOsErrorMessage(os_error_message);
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
-    Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
-    return errno;
-  }
-  FDUtils::SetCloseOnExec(event_fds[0]);
-  FDUtils::SetCloseOnExec(event_fds[1]);
+  if (!detach) {
+    int event_fds[2];
+    result = pipe(event_fds);
+    if (result < 0) {
+      SetChildOsErrorMessage(os_error_message);
+      VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+      VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+      VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+      Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
+      return errno;
+    }
+    FDUtils::SetCloseOnExec(event_fds[0]);
+    FDUtils::SetCloseOnExec(event_fds[1]);
 
-  ProcessInfoList::AddProcess(pid, event_fds[1]);
-  *exit_event = event_fds[0];
-  FDUtils::SetNonBlocking(event_fds[0]);
+    ProcessInfoList::AddProcess(pid, event_fds[1]);
+    *exit_event = event_fds[0];
+    FDUtils::SetNonBlocking(event_fds[0]);
+  }
 
   // Notify child process to start.
   char msg = '1';
@@ -444,43 +520,59 @@
     perror("Failed sending notification message");
   }
 
-  // Read exec result from child. If no data is returned the exec was
-  // successful and the exec call closed the pipe. Otherwise the errno
-  // is written to the pipe.
   VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
+  bool failed = false;
   int child_errno;
   int bytes_read = -1;
   ASSERT(sizeof(child_errno) == sizeof(errno));
-  bytes_read =
-      FDUtils::ReadFromBlocking(
-          exec_control[0], &child_errno, sizeof(child_errno));
-  if (bytes_read == sizeof(child_errno)) {
-    static const int kMaxMessageSize = 256;
-    char* message = static_cast<char*>(malloc(kMaxMessageSize));
-    bytes_read = FDUtils::ReadFromBlocking(exec_control[0],
-                                           message,
-                                           kMaxMessageSize);
-    message[kMaxMessageSize - 1] = '\0';
-    *os_error_message = message;
+  if (!detach) {
+    // Read exec result from child. If no data is returned the exec was
+    // successful and the exec call closed the pipe. Otherwise the errno
+    // is written to the pipe.
+    bytes_read =
+        FDUtils::ReadFromBlocking(
+            exec_control[0], &child_errno, sizeof(child_errno));
+    if (bytes_read == sizeof(child_errno)) {
+      ReadChildError(exec_control[0], os_error_message);
+      failed = true;
+    }
+  } else {
+    // Read exec result from child. If only pid data is returned the exec was
+    // successful and the exec call closed the pipe. Otherwise the errno
+    // is written to the pipe as well.
+    int result[2];
+    ASSERT(sizeof(int) == sizeof(child_errno));
+    bytes_read =
+        FDUtils::ReadFromBlocking(
+            exec_control[0], result, sizeof(result));
+    if (bytes_read == sizeof(int)) {
+      pid = result[0];
+    } else if (bytes_read == 2 * sizeof(int)) {
+      pid = result[0];
+      child_errno = result[1];
+      ReadChildError(exec_control[0], os_error_message);
+      failed = true;
+    }
   }
   VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
 
   // Return error code if any failures.
-  if (bytes_read != 0) {
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+  if (failed) {
+    if (!detach) {
+      VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+      VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+      VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
 
-    // Since exec() failed, we're not interested in the exit code.
-    // We close the reading side of the exit code pipe here.
-    // GetProcessExitCodes will get a broken pipe error when it tries to write
-    // to the writing side of the pipe and it will ignore the error.
-    VOID_TEMP_FAILURE_RETRY(close(*exit_event));
-    *exit_event = -1;
-
+      // Since exec() failed, we're not interested in the exit code.
+      // We close the reading side of the exit code pipe here.
+      // GetProcessExitCodes will get a broken pipe error when it tries to write
+      // to the writing side of the pipe and it will ignore the error.
+      VOID_TEMP_FAILURE_RETRY(close(*exit_event));
+      *exit_event = -1;
+    }
     if (bytes_read == -1) {
       return errno;  // Read failed.
     } else {
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index e7bcd80..3b56f0a 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -256,12 +256,37 @@
 }
 
 
+static void ReportPid(int exec_control_fd, int pid) {
+  // In the case of starting a detached process the actual pid of that process
+  // is communicated using the exec control pipe.
+  int bytes_written =
+      FDUtils::WriteToBlocking(exec_control_fd, &pid, sizeof(pid));
+  ASSERT(bytes_written == sizeof(int));
+  USE(bytes_written);
+}
+
+
+static void ReadChildError(int exec_control_fd, char** error_message) {
+  const int kMaxMessageSize = 256;
+  char* message = static_cast<char*>(malloc(kMaxMessageSize));
+  if (message != NULL) {
+    FDUtils::ReadFromBlocking(exec_control_fd, message, kMaxMessageSize);
+    message[kMaxMessageSize - 1] = '\0';
+    *error_message = message;
+  } else {
+    static const char* no_message = "Cannot get error message, out of memory";
+    *error_message = const_cast<char*>(no_message);
+  }
+}
+
+
 int Process::Start(const char* path,
                    char* arguments[],
                    intptr_t arguments_length,
                    const char* working_directory,
                    char* environment[],
                    intptr_t environment_length,
+                   bool detach,
                    intptr_t* in,
                    intptr_t* out,
                    intptr_t* err,
@@ -269,70 +294,61 @@
                    intptr_t* exit_event,
                    char** os_error_message) {
   pid_t pid;
-  int read_in[2];  // Pipe for stdout to child process.
-  int read_err[2];  // Pipe for stderr to child process.
-  int write_out[2];  // Pipe for stdin to child process.
-  int exec_control[2];  // Pipe to get the result from exec.
+  int read_in[2] = {-1, -1};  // Pipe for stdout to child process.
+  int read_err[2] = {-1, -1};  // Pipe for stderr to child process.
+  int write_out[2] = {-1, -1};  // Pipe for stdin to child process.
+  int exec_control[2] = {-1, -1};  // Pipe to get the result from exec.
   int result;
 
-  result = pipe(read_in);
+  result = TEMP_FAILURE_RETRY(pipe(exec_control));
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
     Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
-  FDUtils::SetCloseOnExec(read_in[0]);
-
-  result = pipe(read_err);
-  if (result < 0) {
-    SetChildOsErrorMessage(os_error_message);
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-    Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
-    return errno;
-  }
-  FDUtils::SetCloseOnExec(read_err[0]);
-
-  result = pipe(write_out);
-  if (result < 0) {
-    SetChildOsErrorMessage(os_error_message);
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
-    Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
-    return errno;
-  }
-  FDUtils::SetCloseOnExec(write_out[1]);
-
-  result = pipe(exec_control);
-  if (result < 0) {
-    SetChildOsErrorMessage(os_error_message);
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
-    Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
-    return errno;
-  }
   FDUtils::SetCloseOnExec(exec_control[0]);
   FDUtils::SetCloseOnExec(exec_control[1]);
 
+  // For a detached process the pipe to connect stdout is still used for
+  // signaling when to do the first fork.
+  result = TEMP_FAILURE_RETRY(pipe(read_in));
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
     VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
     VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
-    Log::PrintErr("fcntl failed: %s\n", *os_error_message);
+    Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
+  FDUtils::SetCloseOnExec(read_in[0]);
+
+  // For detached processes the pipe to connect stderr and stdin are not used.
+  if (!detach) {
+    result = TEMP_FAILURE_RETRY(pipe(read_err));
+    if (result < 0) {
+      SetChildOsErrorMessage(os_error_message);
+      VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+      VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+      Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
+      return errno;
+    }
+    FDUtils::SetCloseOnExec(read_err[0]);
+
+    result = TEMP_FAILURE_RETRY(pipe(write_out));
+    if (result < 0) {
+      SetChildOsErrorMessage(os_error_message);
+      VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+      VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+      Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
+      return errno;
+    }
+    FDUtils::SetCloseOnExec(write_out[1]);
+  }
 
   char** program_arguments = new char*[arguments_length + 2];
   program_arguments[0] = const_cast<char*>(path);
@@ -354,14 +370,16 @@
   if (pid < 0) {
     SetChildOsErrorMessage(os_error_message);
     delete[] program_arguments;
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
     VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
     VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    if (!detach) {
+      VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+      VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+      VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+    }
     return errno;
   } else if (pid == 0) {
     // Wait for parent process before setting up the child process.
@@ -371,38 +389,96 @@
       perror("Failed receiving notification message");
       exit(1);
     }
+    if (detach) {
+      // For a detached process the pipe to connect stdout is only used for
+      // signaling when to do the first fork.
+      VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+      // Fork once more to start a new session.
+      pid = TEMP_FAILURE_RETRY(fork());
+      if (pid < 0) {
+        ReportChildError(exec_control[1]);
+      } else if (pid == 0) {
+        // Start a new session.
+        if (TEMP_FAILURE_RETRY(setsid()) == -1) {
+          ReportChildError(exec_control[1]);
+        } else {
+          // Do a final fork to not be the session leader.
+          pid = TEMP_FAILURE_RETRY(fork());
+          if (pid < 0) {
+            ReportChildError(exec_control[1]);
+          } else if (pid == 0) {
+            // Close all open file descriptors except for exec_control[1].
+            int max_fds = sysconf(_SC_OPEN_MAX);
+            if (max_fds == -1) max_fds = _POSIX_OPEN_MAX;
+            for (int fd = 0; fd < max_fds; fd++) {
+              if (fd != exec_control[1]) {
+                VOID_TEMP_FAILURE_RETRY(close(fd));
+              }
+            }
 
-    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
-    VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+            // Re-open stdin, stdout and stderr and connect them to /dev/null.
+            // The loop above should already have closed all of them, so
+            // creating new file descriptors should start at STDIN_FILENO.
+            int fd = TEMP_FAILURE_RETRY(open("/dev/null", O_RDWR));
+            if (fd != STDIN_FILENO) {
+              ReportChildError(exec_control[1]);
+            }
+            if (TEMP_FAILURE_RETRY(dup2(STDIN_FILENO, STDOUT_FILENO)) !=
+                STDOUT_FILENO) {
+              ReportChildError(exec_control[1]);
+            }
+            if (TEMP_FAILURE_RETRY(dup2(STDIN_FILENO, STDERR_FILENO)) !=
+                STDERR_FILENO) {
+              ReportChildError(exec_control[1]);
+            }
 
-    if (TEMP_FAILURE_RETRY(dup2(write_out[0], STDIN_FILENO)) == -1) {
+            // Report the final PID and do the exec.
+            ReportPid(exec_control[1], getpid());  // getpid cannot fail.
+            VOID_TEMP_FAILURE_RETRY(
+                execvp(path, const_cast<char* const*>(program_arguments)));
+            ReportChildError(exec_control[1]);
+          } else {
+            exit(0);
+          }
+        }
+      } else {
+        exit(0);
+      }
+    } else {
+      VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+      VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+
+      if (TEMP_FAILURE_RETRY(dup2(write_out[0], STDIN_FILENO)) == -1) {
+        ReportChildError(exec_control[1]);
+      }
+      VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+
+      if (TEMP_FAILURE_RETRY(dup2(read_in[1], STDOUT_FILENO)) == -1) {
+        ReportChildError(exec_control[1]);
+      }
+      VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+
+      if (TEMP_FAILURE_RETRY(dup2(read_err[1], STDERR_FILENO)) == -1) {
+        ReportChildError(exec_control[1]);
+      }
+      VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+
+      if (working_directory != NULL && chdir(working_directory) == -1) {
+        ReportChildError(exec_control[1]);
+      }
+
+      if (program_environment != NULL) {
+        environ = program_environment;
+      }
+
+      VOID_TEMP_FAILURE_RETRY(
+          execvp(path, const_cast<char* const*>(program_arguments)));
+
       ReportChildError(exec_control[1]);
     }
-    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
-
-    if (TEMP_FAILURE_RETRY(dup2(read_in[1], STDOUT_FILENO)) == -1) {
-      ReportChildError(exec_control[1]);
-    }
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-
-    if (TEMP_FAILURE_RETRY(dup2(read_err[1], STDERR_FILENO)) == -1) {
-      ReportChildError(exec_control[1]);
-    }
-    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
-
-    if (working_directory != NULL && chdir(working_directory) == -1) {
-      ReportChildError(exec_control[1]);
-    }
-
-    if (program_environment != NULL) {
-      environ = program_environment;
-    }
-
-    execvp(path, const_cast<char* const*>(program_arguments));
-
-    ReportChildError(exec_control[1]);
   }
 
   // Be sure to listen for exit-codes, now we have a child-process.
@@ -413,25 +489,27 @@
   delete[] program_arguments;
   delete[] program_environment;
 
-  int event_fds[2];
-  result = pipe(event_fds);
-  if (result < 0) {
-    SetChildOsErrorMessage(os_error_message);
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
-    Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
-    return errno;
-  }
-  FDUtils::SetCloseOnExec(event_fds[0]);
-  FDUtils::SetCloseOnExec(event_fds[1]);
+  if (!detach) {
+    int event_fds[2];
+    result = pipe(event_fds);
+    if (result < 0) {
+      SetChildOsErrorMessage(os_error_message);
+      VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+      VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+      VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+      Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
+      return errno;
+    }
+    FDUtils::SetCloseOnExec(event_fds[0]);
+    FDUtils::SetCloseOnExec(event_fds[1]);
 
-  ProcessInfoList::AddProcess(pid, event_fds[1]);
-  *exit_event = event_fds[0];
-  FDUtils::SetNonBlocking(event_fds[0]);
+    ProcessInfoList::AddProcess(pid, event_fds[1]);
+    *exit_event = event_fds[0];
+    FDUtils::SetNonBlocking(event_fds[0]);
+  }
 
   // Notify child process to start.
   char msg = '1';
@@ -440,43 +518,59 @@
     perror("Failed sending notification message");
   }
 
-  // Read exec result from child. If no data is returned the exec was
-  // successful and the exec call closed the pipe. Otherwise the errno
-  // is written to the pipe.
   VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
+  bool failed = false;
   int child_errno;
   int bytes_read = -1;
   ASSERT(sizeof(child_errno) == sizeof(errno));
-  bytes_read =
-      FDUtils::ReadFromBlocking(
-          exec_control[0], &child_errno, sizeof(child_errno));
-  if (bytes_read == sizeof(child_errno)) {
-    static const int kMaxMessageSize = 256;
-    char* message = static_cast<char*>(malloc(kMaxMessageSize));
-    bytes_read = FDUtils::ReadFromBlocking(exec_control[0],
-                                           message,
-                                           kMaxMessageSize);
-    message[kMaxMessageSize - 1] = '\0';
-    *os_error_message = message;
+  if (!detach) {
+    // Read exec result from child. If no data is returned the exec was
+    // successful and the exec call closed the pipe. Otherwise the errno
+    // is written to the pipe.
+    bytes_read =
+        FDUtils::ReadFromBlocking(
+            exec_control[0], &child_errno, sizeof(child_errno));
+    if (bytes_read == sizeof(child_errno)) {
+      ReadChildError(exec_control[0], os_error_message);
+      failed = true;
+    }
+  } else {
+    // Read exec result from child. If only pid data is returned the exec was
+    // successful and the exec call closed the pipe. Otherwise the errno
+    // is written to the pipe as well.
+    int result[2];
+    ASSERT(sizeof(int) == sizeof(child_errno));
+    bytes_read =
+        FDUtils::ReadFromBlocking(
+            exec_control[0], result, sizeof(result));
+    if (bytes_read == sizeof(int)) {
+      pid = result[0];
+    } else if (bytes_read == 2 * sizeof(int)) {
+      pid = result[0];
+      child_errno = result[1];
+      ReadChildError(exec_control[0], os_error_message);
+      failed = true;
+    }
   }
   VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
 
   // Return error code if any failures.
-  if (bytes_read != 0) {
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+  if (failed) {
+    if (!detach) {
+      VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+      VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+      VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
 
-    // Since exec() failed, we're not interested in the exit code.
-    // We close the reading side of the exit code pipe here.
-    // GetProcessExitCodes will get a broken pipe error when it tries to write
-    // to the writing side of the pipe and it will ignore the error.
-    VOID_TEMP_FAILURE_RETRY(close(*exit_event));
-    *exit_event = -1;
-
+      // Since exec() failed, we're not interested in the exit code.
+      // We close the reading side of the exit code pipe here.
+      // GetProcessExitCodes will get a broken pipe error when it tries to write
+      // to the writing side of the pipe and it will ignore the error.
+      VOID_TEMP_FAILURE_RETRY(close(*exit_event));
+      *exit_event = -1;
+    }
     if (bytes_read == -1) {
       return errno;  // Read failed.
     } else {
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index 9734522..a6d9301 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -258,12 +258,37 @@
 }
 
 
+static void ReportPid(int exec_control_fd, int pid) {
+  // In the case of starting a detached process the actual pid of that process
+  // is communicated using the exec control pipe.
+  int bytes_written =
+      FDUtils::WriteToBlocking(exec_control_fd, &pid, sizeof(pid));
+  ASSERT(bytes_written == sizeof(int));
+  USE(bytes_written);
+}
+
+
+static void ReadChildError(int exec_control_fd, char** error_message) {
+  const int kMaxMessageSize = 256;
+  char* message = static_cast<char*>(malloc(kMaxMessageSize));
+  if (message != NULL) {
+    FDUtils::ReadFromBlocking(exec_control_fd, message, kMaxMessageSize);
+    message[kMaxMessageSize - 1] = '\0';
+    *error_message = message;
+  } else {
+    static const char* no_message = "Cannot get error message, out of memory";
+    *error_message = const_cast<char*>(no_message);
+  }
+}
+
+
 int Process::Start(const char* path,
                    char* arguments[],
                    intptr_t arguments_length,
                    const char* working_directory,
                    char* environment[],
                    intptr_t environment_length,
+                   bool detach,
                    intptr_t* in,
                    intptr_t* out,
                    intptr_t* err,
@@ -271,70 +296,61 @@
                    intptr_t* exit_event,
                    char** os_error_message) {
   pid_t pid;
-  int read_in[2];  // Pipe for stdout to child process.
-  int read_err[2];  // Pipe for stderr to child process.
-  int write_out[2];  // Pipe for stdin to child process.
-  int exec_control[2];  // Pipe to get the result from exec.
+  int read_in[2] = {-1, -1};  // Pipe for stdout to child process.
+  int read_err[2] = {-1, -1};  // Pipe for stderr to child process.
+  int write_out[2] = {-1, -1};  // Pipe for stdin to child process.
+  int exec_control[2] = {-1, -1};  // Pipe to get the result from exec.
   int result;
 
-  result = TEMP_FAILURE_RETRY(pipe(read_in));
-  if (result < 0) {
-    SetChildOsErrorMessage(os_error_message);
-    Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
-    return errno;
-  }
-  FDUtils::SetCloseOnExec(read_in[0]);
-
-  result = TEMP_FAILURE_RETRY(pipe(read_err));
-  if (result < 0) {
-    SetChildOsErrorMessage(os_error_message);
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-    Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
-    return errno;
-  }
-  FDUtils::SetCloseOnExec(read_err[0]);
-
-  result = TEMP_FAILURE_RETRY(pipe(write_out));
-  if (result < 0) {
-    SetChildOsErrorMessage(os_error_message);
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
-    Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
-    return errno;
-  }
-  FDUtils::SetCloseOnExec(write_out[1]);
-
   result = TEMP_FAILURE_RETRY(pipe(exec_control));
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
     Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
   FDUtils::SetCloseOnExec(exec_control[0]);
   FDUtils::SetCloseOnExec(exec_control[1]);
 
+  // For a detached process the pipe to connect stdout is still used for
+  // signaling when to do the first fork.
+  result = TEMP_FAILURE_RETRY(pipe(read_in));
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
     VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
     VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
-    Log::PrintErr("fcntl failed: %s\n", *os_error_message);
+    Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
+  FDUtils::SetCloseOnExec(read_in[0]);
+
+  // For detached processes the pipe to connect stderr and stdin are not used.
+  if (!detach) {
+    result = TEMP_FAILURE_RETRY(pipe(read_err));
+    if (result < 0) {
+      SetChildOsErrorMessage(os_error_message);
+      VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+      VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+      Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
+      return errno;
+    }
+    FDUtils::SetCloseOnExec(read_err[0]);
+
+    result = TEMP_FAILURE_RETRY(pipe(write_out));
+    if (result < 0) {
+      SetChildOsErrorMessage(os_error_message);
+      VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+      VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+      Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
+      return errno;
+    }
+    FDUtils::SetCloseOnExec(write_out[1]);
+  }
 
   char** program_arguments = new char*[arguments_length + 2];
   program_arguments[0] = const_cast<char*>(path);
@@ -356,14 +372,16 @@
   if (pid < 0) {
     SetChildOsErrorMessage(os_error_message);
     delete[] program_arguments;
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
     VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
     VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    if (detach) {
+      VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+      VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+      VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+    }
     return errno;
   } else if (pid == 0) {
     // Wait for parent process before setting up the child process.
@@ -373,40 +391,97 @@
       perror("Failed receiving notification message");
       exit(1);
     }
+    if (detach) {
+      // For a detached process the pipe to connect stdout is only used for
+      // signaling when to do the first fork.
+      VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+      // Fork once more to start a new session.
+      pid = TEMP_FAILURE_RETRY(fork());
+      if (pid < 0) {
+        ReportChildError(exec_control[1]);
+      } else if (pid == 0) {
+        // Start a new session.
+        if (TEMP_FAILURE_RETRY(setsid()) == -1) {
+          ReportChildError(exec_control[1]);
+        } else {
+          // Do a final fork to not be the session leader.
+          pid = TEMP_FAILURE_RETRY(fork());
+          if (pid < 0) {
+            ReportChildError(exec_control[1]);
+          } else if (pid == 0) {
+            // Close all open file descriptors except for exec_control[1].
+            int max_fds = sysconf(_SC_OPEN_MAX);
+            if (max_fds == -1) max_fds = _POSIX_OPEN_MAX;
+            for (int fd = 0; fd < max_fds; fd++) {
+              if (fd != exec_control[1]) {
+                VOID_TEMP_FAILURE_RETRY(close(fd));
+              }
+            }
 
-    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
-    VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+            // Re-open stdin, stdout and stderr and connect them to /dev/null.
+            // The loop above should already have closed all of them, so
+            // creating new file descriptors should start at STDIN_FILENO.
+            int fd = TEMP_FAILURE_RETRY(open("/dev/null", O_RDWR));
+            if (fd != STDIN_FILENO) {
+              ReportChildError(exec_control[1]);
+            }
+            if (TEMP_FAILURE_RETRY(dup2(STDIN_FILENO, STDOUT_FILENO)) !=
+                STDOUT_FILENO) {
+              ReportChildError(exec_control[1]);
+            }
+            if (TEMP_FAILURE_RETRY(dup2(STDIN_FILENO, STDERR_FILENO)) !=
+                STDERR_FILENO) {
+              ReportChildError(exec_control[1]);
+            }
 
-    if (TEMP_FAILURE_RETRY(dup2(write_out[0], STDIN_FILENO)) == -1) {
+            // Report the final PID and do the exec.
+            ReportPid(exec_control[1], getpid());  // getpid cannot fail.
+            VOID_TEMP_FAILURE_RETRY(
+                execvp(path, const_cast<char* const*>(program_arguments)));
+            ReportChildError(exec_control[1]);
+          } else {
+            exit(0);
+          }
+        }
+      } else {
+        exit(0);
+      }
+    } else {
+      VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+      VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+
+      if (TEMP_FAILURE_RETRY(dup2(write_out[0], STDIN_FILENO)) == -1) {
+        ReportChildError(exec_control[1]);
+      }
+      VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+
+      if (TEMP_FAILURE_RETRY(dup2(read_in[1], STDOUT_FILENO)) == -1) {
+        ReportChildError(exec_control[1]);
+      }
+      VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+
+      if (TEMP_FAILURE_RETRY(dup2(read_err[1], STDERR_FILENO)) == -1) {
+        ReportChildError(exec_control[1]);
+      }
+      VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+
+      if (working_directory != NULL &&
+          TEMP_FAILURE_RETRY(chdir(working_directory)) == -1) {
+        ReportChildError(exec_control[1]);
+      }
+
+      if (program_environment != NULL) {
+        environ = program_environment;
+      }
+
+      VOID_TEMP_FAILURE_RETRY(
+          execvp(path, const_cast<char* const*>(program_arguments)));
+
       ReportChildError(exec_control[1]);
     }
-    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
-
-    if (TEMP_FAILURE_RETRY(dup2(read_in[1], STDOUT_FILENO)) == -1) {
-      ReportChildError(exec_control[1]);
-    }
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-
-    if (TEMP_FAILURE_RETRY(dup2(read_err[1], STDERR_FILENO)) == -1) {
-      ReportChildError(exec_control[1]);
-    }
-    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
-
-    if (working_directory != NULL &&
-        TEMP_FAILURE_RETRY(chdir(working_directory)) == -1) {
-      ReportChildError(exec_control[1]);
-    }
-
-    if (program_environment != NULL) {
-      environ = program_environment;
-    }
-
-    VOID_TEMP_FAILURE_RETRY(
-        execvp(path, const_cast<char* const*>(program_arguments)));
-
-    ReportChildError(exec_control[1]);
   }
 
   // Be sure to listen for exit-codes, now we have a child-process.
@@ -417,25 +492,27 @@
   delete[] program_arguments;
   delete[] program_environment;
 
-  int event_fds[2];
-  result = TEMP_FAILURE_RETRY(pipe(event_fds));
-  if (result < 0) {
-    SetChildOsErrorMessage(os_error_message);
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
-    Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
-    return errno;
-  }
-  FDUtils::SetCloseOnExec(event_fds[0]);
-  FDUtils::SetCloseOnExec(event_fds[1]);
+  if (!detach) {
+    int event_fds[2];
+    result = TEMP_FAILURE_RETRY(pipe(event_fds));
+    if (result < 0) {
+      SetChildOsErrorMessage(os_error_message);
+      VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+      VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+      VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+      Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
+      return errno;
+    }
+    FDUtils::SetCloseOnExec(event_fds[0]);
+    FDUtils::SetCloseOnExec(event_fds[1]);
 
-  ProcessInfoList::AddProcess(pid, event_fds[1]);
-  *exit_event = event_fds[0];
-  FDUtils::SetNonBlocking(event_fds[0]);
+    ProcessInfoList::AddProcess(pid, event_fds[1]);
+    *exit_event = event_fds[0];
+    FDUtils::SetNonBlocking(event_fds[0]);
+  }
 
   // Notify child process to start.
   char msg = '1';
@@ -448,39 +525,58 @@
   // successful and the exec call closed the pipe. Otherwise the errno
   // is written to the pipe.
   VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
+  bool failed = false;
   int child_errno;
   int bytes_read = -1;
   ASSERT(sizeof(child_errno) == sizeof(errno));
-  bytes_read =
-      FDUtils::ReadFromBlocking(
-          exec_control[0], &child_errno, sizeof(child_errno));
-  if (bytes_read == sizeof(child_errno)) {
-    static const int kMaxMessageSize = 256;
-    char* message = static_cast<char*>(malloc(kMaxMessageSize));
-    bytes_read = FDUtils::ReadFromBlocking(exec_control[0],
-                                           message,
-                                           kMaxMessageSize);
-    message[kMaxMessageSize - 1] = '\0';
-    *os_error_message = message;
+  if (!detach) {
+    // Read exec result from child. If no data is returned the exec was
+    // successful and the exec call closed the pipe. Otherwise the errno
+    // is written to the pipe.
+    bytes_read =
+        FDUtils::ReadFromBlocking(
+            exec_control[0], &child_errno, sizeof(child_errno));
+    if (bytes_read == sizeof(child_errno)) {
+      ReadChildError(exec_control[0], os_error_message);
+      failed = true;
+    }
+  } else {
+    // Read exec result from child. If only pid data is returned the exec was
+    // successful and the exec call closed the pipe. Otherwise the errno
+    // is written to the pipe as well.
+    int result[2];
+    ASSERT(sizeof(int) == sizeof(child_errno));
+    bytes_read =
+        FDUtils::ReadFromBlocking(
+            exec_control[0], result, sizeof(result));
+    if (bytes_read == sizeof(int)) {
+      pid = result[0];
+    } else if (bytes_read == 2 * sizeof(int)) {
+      pid = result[0];
+      child_errno = result[1];
+      ReadChildError(exec_control[0], os_error_message);
+      failed = true;
+    }
   }
   VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
 
   // Return error code if any failures.
-  if (bytes_read != 0) {
-    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
-    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
-    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+  if (failed) {
+    if (!detach) {
+      VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+      VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+      VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+      VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
 
-    // Since exec() failed, we're not interested in the exit code.
-    // We close the reading side of the exit code pipe here.
-    // GetProcessExitCodes will get a broken pipe error when it tries to write
-    // to the writing side of the pipe and it will ignore the error.
-    VOID_TEMP_FAILURE_RETRY(close(*exit_event));
-    *exit_event = -1;
-
+      // Since exec() failed, we're not interested in the exit code.
+      // We close the reading side of the exit code pipe here.
+      // GetProcessExitCodes will get a broken pipe error when it tries to write
+      // to the writing side of the pipe and it will ignore the error.
+      VOID_TEMP_FAILURE_RETRY(close(*exit_event));
+      *exit_event = -1;
+    }
     if (bytes_read == -1) {
       return errno;  // Read failed.
     } else {
diff --git a/runtime/bin/process_patch.dart b/runtime/bin/process_patch.dart
index 22b08aa..d188381 100644
--- a/runtime/bin/process_patch.dart
+++ b/runtime/bin/process_patch.dart
@@ -21,13 +21,15 @@
       {String workingDirectory,
        Map<String, String> environment,
        bool includeParentEnvironment: true,
-       bool runInShell: false}) {
+       bool runInShell: false,
+       bool detach: false}) {
     _ProcessImpl process = new _ProcessImpl(executable,
                                             arguments,
                                             workingDirectory,
                                             environment,
                                             includeParentEnvironment,
-                                            runInShell);
+                                            runInShell,
+                                            detach);
     return process._start();
   }
 
@@ -173,7 +175,8 @@
                String this._workingDirectory,
                Map<String, String> environment,
                bool includeParentEnvironment,
-               bool runInShell) : super() {
+               bool runInShell,
+               bool detach) : super() {
     _processes[_serviceId] = this;
     if (runInShell) {
       arguments = _getShellArguments(path, arguments);
@@ -230,16 +233,24 @@
       });
     }
 
-    // stdin going to process.
-    _stdin = new _StdSink(new _Socket._writePipe());
-    _stdin._sink._owner = this;
-    // stdout coming from process.
-    _stdout = new _StdStream(new _Socket._readPipe());
-    _stdout._stream._owner = this;
-    // stderr coming from process.
-    _stderr = new _StdStream(new _Socket._readPipe());
-    _stderr._stream._owner = this;
-    _exitHandler = new _Socket._readPipe();
+    if (detach is !bool) {
+      throw new ArgumentError("Detach is not a boolean: $detach");
+    }
+    _detach = detach;
+
+
+    if (!detach) {
+      // stdin going to process.
+      _stdin = new _StdSink(new _Socket._writePipe());
+      _stdin._sink._owner = this;
+      // stdout coming from process.
+      _stdout = new _StdStream(new _Socket._readPipe());
+      _stdout._stream._owner = this;
+      // stderr coming from process.
+      _stderr = new _StdStream(new _Socket._readPipe());
+      _stderr._stream._owner = this;
+      _exitHandler = new _Socket._readPipe();
+    }
     _ended = false;
     _started = false;
   }
@@ -363,19 +374,24 @@
 
   Future<Process> _start() {
     var completer = new Completer();
+    if (!_detach) {
+      _exitCode = new Completer<int>();
+    }
     // TODO(ager): Make the actual process starting really async instead of
     // simulating it with a timer.
     Timer.run(() {
       var status = new _ProcessStartStatus();
-      bool success = _startNative(_path,
-                                  _arguments,
-                                  _workingDirectory,
-                                  _environment,
-                                  _stdin._sink._nativeSocket,
-                                  _stdout._stream._nativeSocket,
-                                  _stderr._stream._nativeSocket,
-                                  _exitHandler._nativeSocket,
-                                  status);
+      bool success =
+          _startNative(_path,
+                       _arguments,
+                       _workingDirectory,
+                       _environment,
+                       _detach,
+                       _detach ? null : _stdin._sink._nativeSocket,
+                       _detach ? null : _stdout._stream._nativeSocket,
+                       _detach ? null : _stderr._stream._nativeSocket,
+                       _detach ? null : _exitHandler._nativeSocket,
+                       status);
       if (!success) {
         completer.completeError(
             new ProcessException(_path,
@@ -389,32 +405,35 @@
 
       // Setup an exit handler to handle internal cleanup and possible
       // callback when a process terminates.
-      int exitDataRead = 0;
-      final int EXIT_DATA_SIZE = 8;
-      List<int> exitDataBuffer = new List<int>(EXIT_DATA_SIZE);
-      _exitHandler.listen((data) {
+      if (!_detach) {
+        int exitDataRead = 0;
+        final int EXIT_DATA_SIZE = 8;
+        List<int> exitDataBuffer = new List<int>(EXIT_DATA_SIZE);
+        _exitHandler.listen((data) {
 
-        int exitCode(List<int> ints) {
-          var code = _intFromBytes(ints, 0);
-          var negative = _intFromBytes(ints, 4);
-          assert(negative == 0 || negative == 1);
-          return (negative == 0) ? code : -code;
-        }
+          int exitCode(List<int> ints) {
+            var code = _intFromBytes(ints, 0);
+            var negative = _intFromBytes(ints, 4);
+            assert(negative == 0 || negative == 1);
+            return (negative == 0) ? code : -code;
+          }
 
-        void handleExit() {
-          _ended = true;
-          _exitCode.complete(exitCode(exitDataBuffer));
-          // Kill stdin, helping hand if the user forgot to do it.
-          _stdin._sink.destroy();
-          _processes.remove(_serviceId);
-        }
+          void handleExit() {
+            _ended = true;
+            _exitCode.complete(exitCode(exitDataBuffer));
+            // Kill stdin, helping hand if the user forgot to do it.
+            _stdin._sink.destroy();
+            _processes.remove(_serviceId);
+          }
 
-        exitDataBuffer.setRange(exitDataRead, exitDataRead + data.length, data);
-        exitDataRead += data.length;
-        if (exitDataRead == EXIT_DATA_SIZE) {
-          handleExit();
-        }
-      });
+          exitDataBuffer.setRange(
+              exitDataRead, exitDataRead + data.length, data);
+          exitDataRead += data.length;
+          if (exitDataRead == EXIT_DATA_SIZE) {
+            handleExit();
+          }
+        });
+      }
 
       completer.complete(this);
     });
@@ -424,10 +443,12 @@
   ProcessResult _runAndWait(Encoding stdoutEncoding,
                             Encoding stderrEncoding) {
     var status = new _ProcessStartStatus();
+    _exitCode = new Completer<int>();
     bool success = _startNative(_path,
                                 _arguments,
                                 _workingDirectory,
                                 _environment,
+                                false,
                                 _stdin._sink._nativeSocket,
                                 _stdout._stream._nativeSocket,
                                 _stderr._stream._nativeSocket,
@@ -464,6 +485,7 @@
                     List<String> arguments,
                     String workingDirectory,
                     List<String> environment,
+                    bool detach,
                     _NativeSocket stdin,
                     _NativeSocket stdout,
                     _NativeSocket stderr,
@@ -487,7 +509,7 @@
     return _stdin;
   }
 
-  Future<int> get exitCode => _exitCode.future;
+  Future<int> get exitCode => _exitCode != null ? _exitCode.future : null;
 
   bool kill([ProcessSignal signal = ProcessSignal.SIGTERM]) {
     if (signal is! ProcessSignal) {
@@ -507,6 +529,7 @@
   List<String> _arguments;
   String _workingDirectory;
   List<String> _environment;
+  bool _detach;
   // Private methods of Socket are used by _in, _out, and _err.
   _StdSink _stdin;
   _StdStream _stdout;
@@ -514,7 +537,7 @@
   Socket _exitHandler;
   bool _ended;
   bool _started;
-  final Completer<int> _exitCode = new Completer<int>();
+  Completer<int> _exitCode;
 }
 
 
@@ -584,7 +607,8 @@
                                  workingDirectory,
                                  environment,
                                  includeParentEnvironment,
-                                 runInShell);
+                                 runInShell,
+                                 false);
   return process._runAndWait(stdoutEncoding, stderrEncoding);
 }
 
diff --git a/runtime/bin/process_win.cc b/runtime/bin/process_win.cc
index 860eee0..8d6b992 100644
--- a/runtime/bin/process_win.cc
+++ b/runtime/bin/process_win.cc
@@ -306,7 +306,7 @@
 
 static int SetOsErrorMessage(char** os_error_message) {
   int error_code = GetLastError();
-  static const int kMaxMessageLength = 256;
+  const int kMaxMessageLength = 256;
   wchar_t message[kMaxMessageLength];
   FormatMessageIntoBuffer(error_code, message, kMaxMessageLength);
   *os_error_message = StringUtils::WideToUtf8(message);
@@ -314,6 +314,26 @@
 }
 
 
+// Open an inheritable handle to NUL.
+static HANDLE OpenNul() {
+  SECURITY_ATTRIBUTES inherit_handle;
+  inherit_handle.nLength = sizeof(SECURITY_ATTRIBUTES);
+  inherit_handle.bInheritHandle = TRUE;
+  inherit_handle.lpSecurityDescriptor = NULL;
+  HANDLE nul = CreateFile(L"NUL",
+                          GENERIC_READ | GENERIC_WRITE,
+                          0,
+                          &inherit_handle,
+                          OPEN_EXISTING,
+                          0,
+                          NULL);
+  if (nul == INVALID_HANDLE_VALUE) {
+    Log::PrintErr("CloseHandle failed %d\n", GetLastError());
+  }
+  return nul;
+}
+
+
 typedef BOOL (WINAPI *InitProcThreadAttrListFn)(
     LPPROC_THREAD_ATTRIBUTE_LIST, DWORD, DWORD, PSIZE_T);
 
@@ -385,6 +405,7 @@
                    const char* working_directory,
                    char* environment[],
                    intptr_t environment_length,
+                   bool detach,
                    intptr_t* in,
                    intptr_t* out,
                    intptr_t* err,
@@ -405,29 +426,56 @@
     return status;
   }
 
-  if (!CreateProcessPipe(stdin_handles, pipe_names[0], kInheritRead)) {
-    int error_code = SetOsErrorMessage(os_error_message);
-    CloseProcessPipes(
-        stdin_handles, stdout_handles, stderr_handles, exit_handles);
-    return error_code;
-  }
-  if (!CreateProcessPipe(stdout_handles, pipe_names[1], kInheritWrite)) {
-    int error_code = SetOsErrorMessage(os_error_message);
-    CloseProcessPipes(
-        stdin_handles, stdout_handles, stderr_handles, exit_handles);
-    return error_code;
-  }
-  if (!CreateProcessPipe(stderr_handles, pipe_names[2], kInheritWrite)) {
-    int error_code = SetOsErrorMessage(os_error_message);
-    CloseProcessPipes(
-        stdin_handles, stdout_handles, stderr_handles, exit_handles);
-    return error_code;
-  }
-  if (!CreateProcessPipe(exit_handles, pipe_names[3], kInheritNone)) {
-    int error_code = SetOsErrorMessage(os_error_message);
-    CloseProcessPipes(
-        stdin_handles, stdout_handles, stderr_handles, exit_handles);
-    return error_code;
+  if (!detach) {
+    // Open pipes for stdin, stdout, stderr and for communicating the exit
+    // code.
+    if (!CreateProcessPipe(stdin_handles, pipe_names[0], kInheritRead)) {
+      int error_code = SetOsErrorMessage(os_error_message);
+      CloseProcessPipes(
+          stdin_handles, stdout_handles, stderr_handles, exit_handles);
+      return error_code;
+    }
+    if (!CreateProcessPipe(stdout_handles, pipe_names[1], kInheritWrite)) {
+      int error_code = SetOsErrorMessage(os_error_message);
+      CloseProcessPipes(
+          stdin_handles, stdout_handles, stderr_handles, exit_handles);
+      return error_code;
+    }
+    if (!CreateProcessPipe(stderr_handles, pipe_names[2], kInheritWrite)) {
+      int error_code = SetOsErrorMessage(os_error_message);
+      CloseProcessPipes(
+          stdin_handles, stdout_handles, stderr_handles, exit_handles);
+      return error_code;
+    }
+    if (!CreateProcessPipe(exit_handles, pipe_names[3], kInheritNone)) {
+      int error_code = SetOsErrorMessage(os_error_message);
+      CloseProcessPipes(
+          stdin_handles, stdout_handles, stderr_handles, exit_handles);
+      return error_code;
+    }
+  } else {
+    // Open NUL for stdin, stdout and stderr.
+    stdin_handles[kReadHandle] = OpenNul();
+    if (stdin_handles[kReadHandle] == INVALID_HANDLE_VALUE) {
+      int error_code = SetOsErrorMessage(os_error_message);
+      CloseProcessPipes(
+          stdin_handles, stdout_handles, stderr_handles, exit_handles);
+      return error_code;
+    }
+    stdout_handles[kWriteHandle] = OpenNul();
+    if (stdout_handles[kWriteHandle] == INVALID_HANDLE_VALUE) {
+      int error_code = SetOsErrorMessage(os_error_message);
+      CloseProcessPipes(
+          stdin_handles, stdout_handles, stderr_handles, exit_handles);
+      return error_code;
+    }
+    stderr_handles[kWriteHandle] = OpenNul();
+    if (stderr_handles[kWriteHandle] == INVALID_HANDLE_VALUE) {
+      int error_code = SetOsErrorMessage(os_error_message);
+      CloseProcessPipes(
+          stdin_handles, stdout_handles, stderr_handles, exit_handles);
+      return error_code;
+    }
   }
 
   // Setup info structures.
@@ -582,6 +630,9 @@
   // Create process.
   DWORD creation_flags =
       EXTENDED_STARTUPINFO_PRESENT | CREATE_UNICODE_ENVIRONMENT;
+  if (detach) {
+    creation_flags |= DETACHED_PROCESS;
+  }
   BOOL result = CreateProcessW(NULL,   // ApplicationName
                                command_line,
                                NULL,   // ProcessAttributes
@@ -592,7 +643,6 @@
                                system_working_directory,
                                reinterpret_cast<STARTUPINFOW*>(&startup_info),
                                &process_info);
-
   // Deallocate command-line and environment block strings.
   delete[] command_line;
   delete[] environment_block;
@@ -612,22 +662,24 @@
     return error_code;
   }
 
-  ProcessInfoList::AddProcess(process_info.dwProcessId,
-                              process_info.hProcess,
-                              exit_handles[kWriteHandle]);
-
-  // Connect the three std streams.
-  FileHandle* stdin_handle = new FileHandle(stdin_handles[kWriteHandle]);
   CloseHandle(stdin_handles[kReadHandle]);
-  FileHandle* stdout_handle = new FileHandle(stdout_handles[kReadHandle]);
   CloseHandle(stdout_handles[kWriteHandle]);
-  FileHandle* stderr_handle = new FileHandle(stderr_handles[kReadHandle]);
   CloseHandle(stderr_handles[kWriteHandle]);
-  FileHandle* exit_handle = new FileHandle(exit_handles[kReadHandle]);
-  *in = reinterpret_cast<intptr_t>(stdout_handle);
-  *out = reinterpret_cast<intptr_t>(stdin_handle);
-  *err = reinterpret_cast<intptr_t>(stderr_handle);
-  *exit_handler = reinterpret_cast<intptr_t>(exit_handle);
+  if (!detach) {
+    ProcessInfoList::AddProcess(process_info.dwProcessId,
+                                process_info.hProcess,
+                                exit_handles[kWriteHandle]);
+
+    // Connect the three std streams.
+    FileHandle* stdin_handle = new FileHandle(stdin_handles[kWriteHandle]);
+    FileHandle* stdout_handle = new FileHandle(stdout_handles[kReadHandle]);
+    FileHandle* stderr_handle = new FileHandle(stderr_handles[kReadHandle]);
+    FileHandle* exit_handle = new FileHandle(exit_handles[kReadHandle]);
+    *in = reinterpret_cast<intptr_t>(stdout_handle);
+    *out = reinterpret_cast<intptr_t>(stdin_handle);
+    *err = reinterpret_cast<intptr_t>(stderr_handle);
+    *exit_handler = reinterpret_cast<intptr_t>(exit_handle);
+  }
 
   CloseHandle(process_info.hThread);
 
@@ -833,16 +885,22 @@
 
 
 bool Process::Kill(intptr_t id, int signal) {
-  USE(signal);  // signal is not used on windows.
+  USE(signal);  // signal is not used on Windows.
   HANDLE process_handle;
   HANDLE wait_handle;
   HANDLE exit_pipe;
+  // First check the process info list for the process to get a handle to it.
   bool success = ProcessInfoList::LookupProcess(id,
                                                 &process_handle,
                                                 &wait_handle,
                                                 &exit_pipe);
-  // The process is already dead.
-  if (!success) return false;
+  // For detached processes we don't have the process registered in the
+  // process info list. Try to look it up through the OS.
+  if (!success) {
+    process_handle = OpenProcess(PROCESS_TERMINATE, FALSE, id);
+    // The process is already dead.
+    if (process_handle == INVALID_HANDLE_VALUE) return false;
+  }
   BOOL result = TerminateProcess(process_handle, -1);
   return result ? true : false;
 }
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index ab5019b..c2cc587 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -329,7 +329,7 @@
 
   static Future<List<InternetAddress>> lookup(
       String host, {InternetAddressType type: InternetAddressType.ANY}) {
-    return _IOService.dispatch(_SOCKET_LOOKUP, [host, type._value])
+    return _IOService._dispatch(_SOCKET_LOOKUP, [host, type._value])
         .then((response) {
           if (isErrorResponse(response)) {
             throw createError(response, "Failed host lookup: '$host'");
@@ -343,7 +343,7 @@
   }
 
   static Future<InternetAddress> reverseLookup(InternetAddress addr) {
-    return _IOService.dispatch(_SOCKET_REVERSE_LOOKUP, [addr._in_addr])
+    return _IOService._dispatch(_SOCKET_REVERSE_LOOKUP, [addr._in_addr])
         .then((response) {
           if (isErrorResponse(response)) {
             throw createError(response, "Failed reverse host lookup", addr);
@@ -357,7 +357,7 @@
       bool includeLoopback: false,
       bool includeLinkLocal: false,
       InternetAddressType type: InternetAddressType.ANY}) {
-    return _IOService.dispatch(_SOCKET_LIST_INTERFACES, [type._value])
+    return _IOService._dispatch(_SOCKET_LIST_INTERFACES, [type._value])
         .then((response) {
           if (isErrorResponse(response)) {
             throw createError(response, "Failed listing interfaces");
diff --git a/runtime/bin/stdio.cc b/runtime/bin/stdio.cc
index ab3b8a2..f0dc923 100644
--- a/runtime/bin/stdio.cc
+++ b/runtime/bin/stdio.cc
@@ -45,8 +45,20 @@
 
 
 void FUNCTION_NAME(Stdout_GetTerminalSize)(Dart_NativeArguments args) {
+  if (!Dart_IsInteger(Dart_GetNativeArgument(args, 0))) {
+    OSError os_error(-1, "Invalid argument", OSError::kUnknown);
+    Dart_Handle err = DartUtils::NewDartOSError(&os_error);
+    if (Dart_IsError(err)) Dart_PropagateError(err);
+    Dart_SetReturnValue(args, err);
+    return;
+  }
+  intptr_t fd = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 0));
+  if (fd != 1 && fd != 2) {
+    Dart_PropagateError(Dart_NewApiError("Terminal fd must be 1 or 2"));
+  }
+
   int size[2];
-  if (Stdout::GetTerminalSize(size)) {
+  if (Stdout::GetTerminalSize(fd, size)) {
     Dart_Handle list = Dart_NewList(2);
     Dart_ListSetAt(list, 0, Dart_NewInteger(size[0]));
     Dart_ListSetAt(list, 1, Dart_NewInteger(size[1]));
diff --git a/runtime/bin/stdio.h b/runtime/bin/stdio.h
index 646629d..99e2cd5 100644
--- a/runtime/bin/stdio.h
+++ b/runtime/bin/stdio.h
@@ -32,7 +32,7 @@
 
 class Stdout {
  public:
-  static bool GetTerminalSize(int size[2]);
+  static bool GetTerminalSize(intptr_t fd, int size[2]);
 
  private:
   DISALLOW_ALLOCATION();
@@ -43,4 +43,3 @@
 }  // namespace dart
 
 #endif  // BIN_STDIO_H_
-
diff --git a/runtime/bin/stdio_android.cc b/runtime/bin/stdio_android.cc
index d0ba85e..a02a8e3 100644
--- a/runtime/bin/stdio_android.cc
+++ b/runtime/bin/stdio_android.cc
@@ -65,9 +65,9 @@
 }
 
 
-bool Stdout::GetTerminalSize(int size[2]) {
+bool Stdout::GetTerminalSize(intptr_t fd, int size[2]) {
   struct winsize w;
-  if (NO_RETRY_EXPECTED(ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0) &&
+  if (NO_RETRY_EXPECTED(ioctl(fd, TIOCGWINSZ, &w) == 0) &&
       (w.ws_col != 0 || w.ws_row != 0)) {
     size[0] = w.ws_col;
     size[1] = w.ws_row;
@@ -80,4 +80,3 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_ANDROID)
-
diff --git a/runtime/bin/stdio_linux.cc b/runtime/bin/stdio_linux.cc
index dee8c38..c01a771 100644
--- a/runtime/bin/stdio_linux.cc
+++ b/runtime/bin/stdio_linux.cc
@@ -65,9 +65,9 @@
 }
 
 
-bool Stdout::GetTerminalSize(int size[2]) {
+bool Stdout::GetTerminalSize(intptr_t fd, int size[2]) {
   struct winsize w;
-  if (NO_RETRY_EXPECTED(ioctl(STDOUT_FILENO, TIOCGWINSZ, &w)) == 0 &&
+  if (NO_RETRY_EXPECTED(ioctl(fd, TIOCGWINSZ, &w)) == 0 &&
       (w.ws_col != 0 || w.ws_row != 0)) {
     size[0] = w.ws_col;
     size[1] = w.ws_row;
@@ -80,4 +80,3 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_LINUX)
-
diff --git a/runtime/bin/stdio_macos.cc b/runtime/bin/stdio_macos.cc
index be736bd..24f0414 100644
--- a/runtime/bin/stdio_macos.cc
+++ b/runtime/bin/stdio_macos.cc
@@ -65,9 +65,9 @@
 }
 
 
-bool Stdout::GetTerminalSize(int size[2]) {
+bool Stdout::GetTerminalSize(intptr_t fd, int size[2]) {
   struct winsize w;
-  if (NO_RETRY_EXPECTED(ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0) &&
+  if (NO_RETRY_EXPECTED(ioctl(fd, TIOCGWINSZ, &w) == 0) &&
       (w.ws_col != 0 || w.ws_row != 0)) {
     size[0] = w.ws_col;
     size[1] = w.ws_row;
diff --git a/runtime/bin/stdio_patch.dart b/runtime/bin/stdio_patch.dart
index d400306..ffc4703 100644
--- a/runtime/bin/stdio_patch.dart
+++ b/runtime/bin/stdio_patch.dart
@@ -17,20 +17,13 @@
   }
 
   static _getStdioOutputStream(int fd) {
-    wrap(sink) {
-      if (fd == 1) {
-        return new Stdout._(sink);
-      } else {
-        return new _StdSink(sink);
-      }
-    }
     assert(fd == 1 || fd == 2);
     switch (_getStdioHandleType(fd)) {
       case _STDIO_HANDLE_TYPE_TERMINAL:
       case _STDIO_HANDLE_TYPE_PIPE:
       case _STDIO_HANDLE_TYPE_SOCKET:
       case _STDIO_HANDLE_TYPE_FILE:
-        return wrap(new IOSink(new _FileStreamConsumer.fromStdio(fd)));
+        return new Stdout._(new IOSink(new _StdConsumer(fd)), fd);
       default:
         throw new FileSystemException("Unsupported stdin type");
     }
@@ -63,27 +56,27 @@
 }
 
 patch class Stdout {
-  /* patch */ bool get hasTerminal {
+  /* patch */ bool _hasTerminal(int fd) {
     try {
-      _terminalSize;
+      _terminalSize(fd);
       return true;
     } catch (_) {
       return false;
     }
   }
 
-  /* patch */ int get terminalColumns => _terminalSize[0];
-  /* patch */ int get terminalLines => _terminalSize[1];
+  /* patch */ int _terminalColumns(int fd) => _terminalSize(fd)[0];
+  /* patch */ int _terminalLines(int fd) => _terminalSize(fd)[1];
 
-  static List get _terminalSize {
-    var size = _getTerminalSize();
+  static List _terminalSize(int fd) {
+    var size = _getTerminalSize(fd);
     if (size is! List) {
       throw new StdoutException("Could not get terminal size", size);
     }
     return size;
   }
 
-  static _getTerminalSize() native "Stdout_GetTerminalSize";
+  static _getTerminalSize(int fd) native "Stdout_GetTerminalSize";
 }
 
 
diff --git a/runtime/bin/stdio_win.cc b/runtime/bin/stdio_win.cc
index 24ceb32..ec479c0 100644
--- a/runtime/bin/stdio_win.cc
+++ b/runtime/bin/stdio_win.cc
@@ -65,8 +65,13 @@
 }
 
 
-bool Stdout::GetTerminalSize(int size[2]) {
-  HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
+bool Stdout::GetTerminalSize(intptr_t fd, int size[2]) {
+  HANDLE h;
+  if (fd == 1) {
+    h = GetStdHandle(STD_OUTPUT_HANDLE);
+  } else {
+    h = GetStdHandle(STD_ERROR_HANDLE);
+  }
   CONSOLE_SCREEN_BUFFER_INFO info;
   if (!GetConsoleScreenBufferInfo(h, &info)) return false;
   size[0] = info.srWindow.Right - info.srWindow.Left + 1;
diff --git a/runtime/lib/convert_patch.dart b/runtime/lib/convert_patch.dart
index d8ca287..7b143ac 100644
--- a/runtime/lib/convert_patch.dart
+++ b/runtime/lib/convert_patch.dart
@@ -30,6 +30,13 @@
     // TODO(lrn): Recognize a fused decoder where the next step is JsonDecoder.
     return super.fuse(next);
   }
+
+  // Allow intercepting of UTF8 decoding when builtin lists are passed.
+  /* patch */
+  static String _convertIntercepted(
+      bool allowMalformed, List<int> codeUnits, int start, int end) {
+    return null;  // This call was not intercepted.
+  }
 }
 
 class _JsonUtf8Decoder extends Converter<List<int>, Object> {
@@ -216,11 +223,7 @@
   }
 
   String getString() {
-    var list = this.list;
-    if (length < list.length) {
-      list = new Uint8List.view(list.buffer, 0, length);
-    }
-    String result = new String.fromCharCodes(list);
+    String result = new String.fromCharCodes(list, 0, length);
     return result;
   }
 
@@ -548,8 +551,13 @@
    * underlying source.
    *
    * This is used for string literals that contain no escapes.
+   *
+   * The [bits] integer is an upper bound on the code point in the range
+   * from `start` to `end`.
+   * Usually found by doing bitwise or of all the values.
+   * The function may choose to optimize depending on the value.
    */
-  String getString(int start, int end);
+  String getString(int start, int end, int bits);
 
   /**
    * Parse a slice of the current chunk as an integer.
@@ -557,7 +565,8 @@
    * The format is expected to be correct.
    */
   int parseInt(int start, int end) {
-    return int.parse(getString(start, end));
+    const int asciiBits = 0x7f;  // Integer literals are ASCII only.
+    return int.parse(getString(start, end, asciiBits));
   }
 
   /**
@@ -568,7 +577,8 @@
    * built exactly during parsing.
    */
   double parseDouble(int start, int end) {
-    return double.parse(getString(start, end));
+    const int asciiBits = 0x7f;  // Double literals are ASCII only.
+    return double.parse(getString(start, end, asciiBits));
   }
 
   /**
@@ -971,8 +981,10 @@
     // Initial position is right after first '"'.
     int start = position;
     int end = chunkEnd;
+    int bits = 0;
     while (position < end) {
       int char = getChar(position++);
+      bits |= char;  // Includes final '"', but that never matters.
       // BACKSLASH is larger than QUOTE and SPACE.
       if (char > BACKSLASH) {
         continue;
@@ -981,10 +993,10 @@
         beginString();
         int sliceEnd = position - 1;
         if (start < sliceEnd) addSliceToString(start, sliceEnd);
-        return parseStringToBuffer(position - 1);
+        return parseStringToBuffer(sliceEnd);
       }
       if (char == QUOTE) {
-        listener.handleString(getString(start, position - 1));
+        listener.handleString(getString(start, position - 1, bits));
         return position;
       }
       if (char < SPACE) {
@@ -1322,7 +1334,7 @@
 
   int getChar(int position) => chunk.codeUnitAt(position);
 
-  String getString(int start, int end) {
+  String getString(int start, int end, int bits) {
     return chunk.substring(start, end);
   }
 
@@ -1668,7 +1680,11 @@
 
   int getChar(int position) => chunk[position];
 
-  String getString(int start, int end) {
+  String getString(int start, int end, int bits) {
+    const int maxAsciiChar = 0x7f;
+    if (bits <= maxAsciiChar) {
+      return new String.fromCharCodes(chunk, start, end);
+    }
     beginString();
     if (start < end) addSliceToString(start, end);
     String result = endString();
@@ -1701,7 +1717,7 @@
   }
 
   double parseDouble(int start, int end) {
-    String string = getString(start, end);
+    String string = getString(start, end, 0x7f);
     return _parseDouble(string, 0, string.length);
   }
 }
diff --git a/runtime/lib/growable_array.dart b/runtime/lib/growable_array.dart
index a572475..bd79837 100644
--- a/runtime/lib/growable_array.dart
+++ b/runtime/lib/growable_array.dart
@@ -152,7 +152,12 @@
 
   void addAll(Iterable<T> iterable) {
     var len = length;
-    if (iterable is EfficientLength) {
+    final cid = ClassID.getID(iterable);
+    final isVMList =
+        (cid == ClassID.cidArray) ||
+        (cid == ClassID.cidGrowableObjectArray) ||
+        (cid == ClassID.cidImmutableArray);
+    if (isVMList || (iterable is EfficientLength)) {
       var cap = _capacity;
       // Pregrow if we know iterable.length.
       var iterLen = iterable.length;
@@ -163,6 +168,16 @@
         } while (newLen > cap);
         _grow(cap);
       }
+      if (isVMList) {
+        if (identical(iterable, this)) {
+          throw new ConcurrentModificationError(this);
+        }
+        this._setLength(newLen);
+        for (int i = 0; i < iterLen; i++) {
+          this[len++] = iterable[i];
+        }
+        return;
+      }
     }
     Iterator it = iterable.iterator;
     if (!it.moveNext()) return;
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index ad999b5..c05335a 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+#include "lib/mirrors.h"
+
 #include "lib/invocation_mirror.h"
 #include "vm/bootstrap_natives.h"
 #include "vm/class_finalizer.h"
@@ -588,7 +590,7 @@
   Object& result = Object::Handle();
   ArgumentsDescriptor args_descriptor(args_descriptor_array);
   if (function.IsNull() ||
-      !function.is_visible() ||
+      !function.is_reflectable() ||
       !function.AreValidArguments(args_descriptor, NULL)) {
     result = DartEntry::InvokeNoSuchMethod(receiver,
                                            target_name,
@@ -639,7 +641,7 @@
     getter = klass.LookupStaticFunction(internal_getter_name);
   }
 
-  if (!getter.IsNull() && getter.is_visible()) {
+  if (!getter.IsNull() && getter.is_reflectable()) {
     // Invoke the getter and return the result.
     const Object& result = Object::Handle(
         DartEntry::InvokeFunction(getter, Object::empty_array()));
@@ -674,7 +676,7 @@
     Function& getter = Function::Handle(
         klass.LookupStaticFunction(internal_getter_name));
 
-    if (getter.IsNull() || !getter.is_visible()) {
+    if (getter.IsNull() || !getter.is_reflectable()) {
       if (getter.IsNull()) {
         getter = klass.LookupStaticFunction(getter_name);
         if (!getter.IsNull()) {
@@ -1040,7 +1042,7 @@
   Function& func = Function::Handle();
   for (intptr_t i = 0; i < num_functions; i++) {
     func ^= functions.At(i);
-    if (func.is_visible() &&
+    if (func.is_reflectable() &&
         (func.kind() == RawFunction::kRegularFunction ||
         func.kind() == RawFunction::kGetterFunction ||
         func.kind() == RawFunction::kSetterFunction)) {
@@ -1075,7 +1077,7 @@
   Function& func = Function::Handle();
   for (intptr_t i = 0; i < num_functions; i++) {
     func ^= functions.At(i);
-    if (func.is_visible() && func.kind() == RawFunction::kConstructor) {
+    if (func.is_reflectable() && func.kind() == RawFunction::kConstructor) {
       constructor_mirror = CreateMethodMirror(func, owner_mirror);
       constructor_mirrors.Add(constructor_mirror);
     }
@@ -1127,9 +1129,10 @@
       }
     } else if (entry.IsFunction()) {
       const Function& func = Function::Cast(entry);
-      if (func.kind() == RawFunction::kRegularFunction ||
+      if (func.is_reflectable() &&
+          (func.kind() == RawFunction::kRegularFunction ||
           func.kind() == RawFunction::kGetterFunction ||
-          func.kind() == RawFunction::kSetterFunction) {
+          func.kind() == RawFunction::kSetterFunction)) {
         member_mirror = CreateMethodMirror(func, owner_mirror);
         member_mirrors.Add(member_mirror);
       }
@@ -1424,7 +1427,7 @@
 
   if (function.IsNull() ||
       !function.AreValidArguments(args_descriptor, NULL) ||
-      !function.is_visible()) {
+      !function.is_reflectable()) {
     ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
                       function_name,
                       function,
@@ -1477,7 +1480,7 @@
     const Array& args = Array::Handle(Array::New(kNumArgs));
     args.SetAt(0, value);
 
-    if (setter.IsNull() || !setter.is_visible()) {
+    if (setter.IsNull() || !setter.is_reflectable()) {
       ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
                         internal_setter_name,
                         setter,
@@ -1538,7 +1541,7 @@
 
   if (lookup_constructor.IsNull() ||
       !(lookup_constructor.IsConstructor() || lookup_constructor.IsFactory()) ||
-      !lookup_constructor.is_visible()) {
+      !lookup_constructor.is_reflectable()) {
     // Pretend we didn't find the constructor at all when the arity is wrong
     // so as to produce the same NoSuchMethodError as the non-reflective case.
     lookup_constructor = Function::null();
@@ -1616,7 +1619,7 @@
 
   ArgumentsDescriptor args_descriptor(args_descriptor_array);
   if (!redirected_constructor.AreValidArguments(args_descriptor, NULL) ||
-      !redirected_constructor.is_visible()) {
+      !redirected_constructor.is_reflectable()) {
     // Pretend we didn't find the constructor at all when the arity is wrong
     // so as to produce the same NoSuchMethodError as the non-reflective case.
     redirected_constructor = Function::null();
@@ -1716,7 +1719,7 @@
 
   if (function.IsNull() ||
       !function.AreValidArguments(args_descriptor, NULL) ||
-      !function.is_visible()) {
+      !function.is_reflectable()) {
     ThrowNoSuchMethod(Instance::null_instance(),
                       function_name,
                       function,
@@ -1772,7 +1775,7 @@
     const Array& args = Array::Handle(Array::New(kNumArgs));
     args.SetAt(0, value);
 
-    if (setter.IsNull() || !setter.is_visible()) {
+    if (setter.IsNull() || !setter.is_reflectable()) {
       ThrowNoSuchMethod(Instance::null_instance(),
                         internal_setter_name,
                         setter,
diff --git a/runtime/lib/mirrors.h b/runtime/lib/mirrors.h
index e22c1f4..90fcdc6 100644
--- a/runtime/lib/mirrors.h
+++ b/runtime/lib/mirrors.h
@@ -7,12 +7,6 @@
 
 namespace dart {
 
-class Instance;
-
-void HandleMirrorsMessage(Isolate* isolate,
-                          Dart_Port reply_port,
-                          const Instance& message);
-
 }  // namespace dart
 
 #endif  // LIB_MIRRORS_H_
diff --git a/runtime/lib/stacktrace.cc b/runtime/lib/stacktrace.cc
index 3e02ca9..6c40ecc 100644
--- a/runtime/lib/stacktrace.cc
+++ b/runtime/lib/stacktrace.cc
@@ -38,17 +38,13 @@
   ASSERT(frame != NULL);  // We expect to find a dart invocation frame.
   Code& code = Code::Handle();
   Smi& offset = Smi::Handle();
-  bool catch_frame_skipped = false;  // Tracks if catch frame has been skipped.
+  intptr_t frames_to_skip = 2;  // _setupFullStackTrace and the catch frame.
   while (frame != NULL) {
     if (frame->IsDartFrame()) {
       code = frame->LookupDartCode();
       offset = Smi::New(frame->pc() - code.EntryPoint());
-      if (!catch_frame_skipped) {
-        const Function& func = Function::Handle(code.function());
-        // Skip over hidden native, and mark first visible frame as catch frame.
-        if (func.is_visible()) {
-          catch_frame_skipped = true;
-        }
+      if (frames_to_skip > 0) {
+        frames_to_skip--;
       } else {
         code_list.Add(code);
         pc_offset_list.Add(offset);
diff --git a/runtime/lib/string.cc b/runtime/lib/string.cc
index 5b450f4..2dd69e5 100644
--- a/runtime/lib/string.cc
+++ b/runtime/lib/string.cc
@@ -103,6 +103,155 @@
 }
 
 
+
+// Return the bitwise-or of all characters in the slice from start to end.
+static uint16_t CharacterLimit(const String& string,
+                               intptr_t start, intptr_t end) {
+  ASSERT(string.IsTwoByteString() || string.IsExternalTwoByteString());
+  // Maybe do loop unrolling, and handle two uint16_t in a single uint32_t
+  // operation.
+  NoGCScope no_gc;
+  uint16_t result = 0;
+  if (string.IsTwoByteString()) {
+    for (intptr_t i = start; i < end; i++) {
+      result |= TwoByteString::CharAt(string, i);
+    }
+  } else {
+    for (intptr_t i = start; i < end; i++) {
+      result |= ExternalTwoByteString::CharAt(string, i);
+    }
+  }
+  return result;
+}
+
+static const intptr_t kLengthSize = 11;
+static const intptr_t kLengthMask = (1 << kLengthSize) - 1;
+
+static bool CheckSlicesOneByte(const String& base,
+                               const Array& matches,
+                               const int len) {
+  Instance& object = Instance::Handle();
+  // Check each slice for one-bytedness.
+  for (intptr_t i = 0; i < len; i++) {
+    object ^= matches.At(i);
+    if (object.IsSmi()) {
+      intptr_t slice_start = Smi::Cast(object).Value();
+      intptr_t slice_end;
+      if (slice_start < 0) {
+        intptr_t bits = -slice_start;
+        slice_start = bits >> kLengthSize;
+        slice_end = slice_start + (bits & kLengthMask);
+      } else {
+        i++;
+        if (i >= len) {
+          // Bad format, handled later.
+          return false;
+        }
+        object ^= matches.At(i);
+        if (!object.IsSmi()) {
+          // Bad format, handled later.
+          return false;
+        }
+        slice_end = Smi::Cast(object).Value();
+      }
+      uint16_t char_limit = CharacterLimit(base, slice_start, slice_end);
+      if (char_limit > 0xff) {
+        return false;
+      }
+    }
+  }
+  return true;
+}
+
+
+DEFINE_NATIVE_ENTRY(StringBase_joinReplaceAllResult, 4) {
+  const String& base = String::CheckedHandle(arguments->NativeArgAt(0));
+  GET_NON_NULL_NATIVE_ARGUMENT(GrowableObjectArray,
+                               matches_growable, arguments->NativeArgAt(1));
+  GET_NON_NULL_NATIVE_ARGUMENT(Smi, length_obj, arguments->NativeArgAt(2));
+  GET_NON_NULL_NATIVE_ARGUMENT(Bool, is_onebyte_obj, arguments->NativeArgAt(3));
+
+  intptr_t len = matches_growable.Length();
+  const Array& matches = Array::Handle(isolate, matches_growable.data());
+
+  const intptr_t length = length_obj.Value();
+  if (length < 0) {
+    Exceptions::ThrowArgumentError(length_obj);
+  }
+
+  // Start out assuming result is one-byte if replacements are.
+  bool is_onebyte = is_onebyte_obj.value();
+  if (is_onebyte) {
+    // If any of the base string slices are not one-byte, the result will be
+    // a two-byte string.
+    if (!base.IsOneByteString() && !base.IsExternalOneByteString()) {
+      is_onebyte = CheckSlicesOneByte(base, matches, len);
+    }
+  }
+
+  const intptr_t base_length = base.Length();
+  String& result = String::Handle(isolate);
+  if (is_onebyte) {
+    result ^= OneByteString::New(length, Heap::kNew);
+  } else {
+    result ^= TwoByteString::New(length, Heap::kNew);
+  }
+  Instance& object = Instance::Handle(isolate);
+  intptr_t write_index = 0;
+  for (intptr_t i = 0; i < len; i++) {
+    object ^= matches.At(i);
+    if (object.IsSmi()) {
+      intptr_t slice_start = Smi::Cast(object).Value();
+      intptr_t slice_length = -1;
+      // Slices with limited ranges are stored in a single negative Smi.
+      if (slice_start < 0) {
+        intptr_t bits = -slice_start;
+        slice_start = bits >> kLengthSize;
+        slice_length = bits & kLengthMask;
+      } else {
+        i++;
+        if (i < len) {  // Otherwise slice_length stays at -1.
+          object ^= matches.At(i);
+          if (object.IsSmi()) {
+            intptr_t slice_end = Smi::Cast(object).Value();
+            slice_length = slice_end - slice_start;
+          }
+        }
+      }
+      if (slice_length > 0) {
+        if (0 <= slice_start &&
+            slice_start + slice_length <= base_length &&
+            write_index + slice_length <= length) {
+          String::Copy(result, write_index,
+                       base, slice_start,
+                       slice_length);
+          write_index += slice_length;
+          continue;
+        }
+      }
+      // Either the slice_length was zero,
+      // or the first smi was positive and not followed by another smi,
+      // or the smis were not a valid slice of the base string,
+      // or the slice was too large to fit in the result.
+      // Something is wrong with the matches array!
+      Exceptions::ThrowArgumentError(matches_growable);
+    } else if (object.IsString()) {
+      const String& replacement = String::Cast(object);
+      intptr_t replacement_length = replacement.Length();
+      if (write_index + replacement_length > length) {
+        // Invalid input data, either in matches list or the total length.
+        Exceptions::ThrowArgumentError(matches_growable);
+      }
+      String::Copy(result, write_index, replacement, 0, replacement_length);
+      write_index += replacement_length;
+    }
+  }
+  if (write_index < length) {
+    Exceptions::ThrowArgumentError(matches_growable);
+  }
+  return result.raw();
+}
+
 DEFINE_NATIVE_ENTRY(OneByteString_substringUnchecked, 3) {
   const String& receiver = String::CheckedHandle(arguments->NativeArgAt(0));
   ASSERT(receiver.IsOneByteString());
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
index 3a1fd71..f22b6e1 100644
--- a/runtime/lib/string_patch.dart
+++ b/runtime/lib/string_patch.dart
@@ -40,6 +40,35 @@
  * implementations, e.g., _OneByteString.
  */
 class _StringBase {
+  // Constants used by replaceAll encoding of string slices between matches.
+  // A string slice (start+length) is encoded in a single Smi to save memory
+  // overhead in the common case.
+  // We use fewer bits for length (11 bits) than for the start index (19+ bits).
+  // For long strings, it's possible to have many large indices,
+  // but it's unlikely to have many long lengths since slices don't overlap.
+  // If there are few matches in a long string, then there are few long slices,
+  // and if there are many matches, there'll likely be many short slices.
+  //
+  // Encoding is: 0((start << _lengthBits) | length)
+
+  // Number of bits used by length.
+  // This is the shift used to encode and decode the start index.
+  static const int _lengthBits = 11;
+  // The maximal allowed length value in an encoded slice.
+  static const int _maxLengthValue = (1 << _lengthBits) - 1;
+  // Mask of length in encoded smi value.
+  static const int _lengthMask = _maxLengthValue;
+  static const int _startBits = _maxUnsignedSmiBits - _lengthBits;
+  // Maximal allowed start index value in an encoded slice.
+  static const int _maxStartValue = (1 << _startBits) - 1;
+  // We pick 30 as a safe lower bound on available bits in a negative smi.
+  // TODO(lrn): Consider allowing more bits for start on 64-bit systems.
+  static const int _maxUnsignedSmiBits = 30;
+
+  // For longer strings, calling into C++ to create the result of a
+  // [replaceAll] is faster than [_joinReplaceAllOneByteResult].
+  // TODO(lrn): See if this limit can be tweaked.
+  static const int _maxJoinReplaceOneByteStringLength = 500;
 
   factory _StringBase._uninstantiable() {
     throw new UnsupportedError(
@@ -487,26 +516,141 @@
            "${this.substring(match.end)}";
   }
 
-  String replaceAll(Pattern pattern, String replacement) {
-    if (pattern is! Pattern) {
-      throw new ArgumentError("${pattern} is not a Pattern");
+
+  static int _addReplaceSlice(List matches, int start, int end) {
+    int length = end - start;
+    if (length > 0) {
+      if (length <= _maxLengthValue && start <= _maxStartValue) {
+        matches.add(-((start << _lengthBits) | length));
+      } else {
+        matches.add(start);
+        matches.add(end);
+      }
     }
-    if (replacement is! String) {
-      throw new ArgumentError(
-          "${replacement} is not a String or Match->String function");
-    }
-    StringBuffer buffer = new StringBuffer();
-    int startIndex = 0;
-    for (Match match in pattern.allMatches(this)) {
-      buffer..write(this.substring(startIndex, match.start))
-            ..write(replacement);
-      startIndex = match.end;
-    }
-    return (buffer..write(this.substring(startIndex))).toString();
+    return length;
   }
 
+  String replaceAll(Pattern pattern, String replacement) {
+    if (pattern == null) throw new ArgumentError.notNull("pattern");
+    if (replacement == null) throw new ArgumentError.notNull("replacement");
+    List matches = [];
+    int length = 0;
+    int replacementLength = replacement.length;
+    int startIndex = 0;
+    if (replacementLength == 0) {
+      int count = 0;
+      for (Match match in pattern.allMatches(this)) {
+        length += _addReplaceSlice(matches, startIndex, match.start);
+        startIndex = match.end;
+      }
+    } else {
+      for (Match match in pattern.allMatches(this)) {
+        length += _addReplaceSlice(matches, startIndex, match.start);
+        matches.add(replacement);
+        length += replacementLength;
+        startIndex = match.end;
+      }
+    }
+    length += _addReplaceSlice(matches, startIndex, this.length);
+    bool replacementIsOneByte = (replacement is _OneByteString) ||
+                                (replacement is _ExternalOneByteString);
+    if (replacementIsOneByte && length < _maxJoinReplaceOneByteStringLength) {
+      // TODO(lrn): Is there a cut-off point, or is runtime always faster?
+      bool thisIsOneByte = (this is _OneByteString) ||
+                           (this is _ExternalOneByteString);
+      if (replacementIsOneByte && thisIsOneByte) {
+        return _joinReplaceAllOneByteResult(this, matches, length);
+      }
+    }
+    return _joinReplaceAllResult(this, matches, length,
+                                 replacementIsOneByte);
+  }
+
+  /**
+   * As [_joinReplaceAllResult], but knowing that the result
+   * is always a [_OneByteString].
+   */
+  static String _joinReplaceAllOneByteResult(String base,
+                                             List matches,
+                                             int length) {
+    _OneByteString result = _OneByteString._allocate(length);
+    int writeIndex = 0;
+    for (int i = 0; i < matches.length; i++) {
+      var entry = matches[i];
+      if (entry is _Smi) {
+        int sliceStart = entry;
+        int sliceEnd;
+        if (sliceStart < 0) {
+          int bits = -sliceStart;
+          int sliceLength = bits & _lengthMask;
+          sliceStart = bits >> _lengthBits;
+          sliceEnd = sliceStart + sliceLength;
+        } else {
+          i++;
+          // This function should only be called with valid matches lists.
+          // If the list is short, or sliceEnd is not an integer, one of
+          // the next few lines will throw anyway.
+          assert(i < matches.length);
+          sliceEnd = matches[i];
+        }
+        for (int j = sliceStart; j < sliceEnd; j++) {
+          result._setAt(writeIndex++, base.codeUnitAt(j));
+        }
+      } else {
+        // Replacement is a one-byte string.
+        String replacement = entry;
+        for (int j = 0; j < replacement.length; j++) {
+          result._setAt(writeIndex++, replacement.codeUnitAt(j));
+        }
+      }
+    }
+    assert(writeIndex == length);
+    return result;
+  }
+
+  /**
+   * Combine the results of a [replaceAll] match into a new string.
+   *
+   * The [matches] lists contains Smi index pairs representing slices of
+   * [base] and [String]s to be put in between the slices.
+   *
+   * The total [length] of the resulting string is known, as is
+   * whether the replacement strings are one-byte strings.
+   * If they are, then we have to check the base string slices to know
+   * whether the result must be a one-byte string.
+   */
+  static String _joinReplaceAllResult(String base, List matches, int length,
+                                      bool replacementStringsAreOneByte)
+      native "StringBase_joinReplaceAllResult";
+
   String replaceAllMapped(Pattern pattern, String replace(Match match)) {
-    return splitMapJoin(pattern, onMatch: replace);
+    if (pattern == null) throw new ArgumentError.notNull("pattern");
+    if (replace == null) throw new ArgumentError.notNull("replace");
+    List matches = [];
+    int length = 0;
+    int startIndex = 0;
+    bool replacementStringsAreOneByte = true;
+    for (Match match in pattern.allMatches(this)) {
+      length += _addReplaceSlice(matches, startIndex, match.start);
+      String replacement = replace(match).toString();
+      matches.add(replacement);
+      length += replacement.length;
+      replacementStringsAreOneByte = replacementStringsAreOneByte &&
+          (replacement is _OneByteString ||
+           replacement is _ExternalOneByteString);
+      startIndex = match.end;
+    }
+    length += _addReplaceSlice(matches, startIndex, this.length);
+    if (replacementStringsAreOneByte &&
+        length < _maxJoinReplaceOneByteStringLength) {
+      bool thisIsOneByte = (this is _OneByteString) ||
+                           (this is _ExternalOneByteString);
+      if (thisIsOneByte) {
+        return _joinReplaceAllOneByteResult(this, matches, length);
+      }
+    }
+    return _joinReplaceAllResult(this, matches, length,
+                                 replacementStringsAreOneByte);
   }
 
   static String _matchString(Match match) => match[0];
diff --git a/runtime/lib/typed_data.cc b/runtime/lib/typed_data.cc
index 5f0003f..28b8147 100644
--- a/runtime/lib/typed_data.cc
+++ b/runtime/lib/typed_data.cc
@@ -202,7 +202,7 @@
 
 CLASS_LIST_TYPED_DATA(TYPED_DATA_NEW_NATIVE)
 
-#define TYPED_DATA_GETTER(getter, object, access_size)                         \
+#define TYPED_DATA_GETTER(getter, object, ctor, access_size)                   \
 DEFINE_NATIVE_ENTRY(TypedData_##getter, 2) {                                   \
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance, arguments->NativeArgAt(0)); \
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, offsetInBytes, arguments->NativeArgAt(1)); \
@@ -210,13 +210,13 @@
     const TypedData& array = TypedData::Cast(instance);                        \
     RangeCheck(offsetInBytes.Value(), access_size,                             \
                array.LengthInBytes(), access_size);                            \
-    return object::New(array.getter(offsetInBytes.Value()));                   \
+    return object::ctor(array.getter(offsetInBytes.Value()));                  \
   }                                                                            \
   if (instance.IsExternalTypedData()) {                                        \
     const ExternalTypedData& array = ExternalTypedData::Cast(instance);        \
     RangeCheck(offsetInBytes.Value(), access_size,                             \
                array.LengthInBytes(), access_size);                            \
-    return object::New(array.getter(offsetInBytes.Value()));                   \
+    return object::ctor(array.getter(offsetInBytes.Value()));                  \
   }                                                                            \
   const String& error = String::Handle(String::NewFormatted(                   \
       "Expected a TypedData object but found %s", instance.ToCString()));      \
@@ -254,94 +254,30 @@
   return Object::null();                                                       \
 }
 
-
-#define TYPED_DATA_UINT64_GETTER(getter, object)                               \
-DEFINE_NATIVE_ENTRY(TypedData_##getter, 2) {                                   \
-  GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance, arguments->NativeArgAt(0)); \
-  GET_NON_NULL_NATIVE_ARGUMENT(Smi, offsetInBytes, arguments->NativeArgAt(1)); \
-  uint64_t value = 0;                                                          \
-  if (instance.IsTypedData()) {                                                \
-    const TypedData& array = TypedData::Cast(instance);                        \
-    RangeCheck(offsetInBytes.Value(), 8, array.LengthInBytes(), 8);            \
-    value = array.getter(offsetInBytes.Value());                               \
-  } else if (instance.IsExternalTypedData()) {                                 \
-    const ExternalTypedData& array = ExternalTypedData::Cast(instance);        \
-    RangeCheck(offsetInBytes.Value(), 8, array.LengthInBytes(), 8);            \
-    value = array.getter(offsetInBytes.Value());                               \
-  } else {                                                                     \
-    const String& error = String::Handle(String::NewFormatted(                 \
-        "Expected a TypedData object but found %s", instance.ToCString()));    \
-    Exceptions::ThrowArgumentError(error);                                     \
-  }                                                                            \
-  return Integer::NewFromUint64(value);                                        \
-}                                                                              \
-
-
-// TODO(asiva): Consider truncating the bigint value if it does not fit into
-// a uint64_t value (see ASSERT(BigintOperations::FitsIntoUint64(bigint))).
-// TODO(regis): Shouldn't we throw an argument error if the bigint is too large
-// instead of assert faulting or truncating the bigint as suggested?
-#define TYPED_DATA_UINT64_SETTER(setter, object)                               \
-DEFINE_NATIVE_ENTRY(TypedData_##setter, 3) {                                   \
-  GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance, arguments->NativeArgAt(0)); \
-  GET_NON_NULL_NATIVE_ARGUMENT(Smi, offsetInBytes, arguments->NativeArgAt(1)); \
-  GET_NON_NULL_NATIVE_ARGUMENT(object, value, arguments->NativeArgAt(2));      \
-  uint64_t object_value;                                                       \
-  if (value.IsBigint()) {                                                      \
-    const Bigint& bigint = Bigint::Cast(value);                                \
-    ASSERT(bigint.FitsIntoUint64());                                           \
-    object_value = bigint.AsUint64Value();                                     \
-  } else {                                                                     \
-    ASSERT(value.IsMint() || value.IsSmi());                                   \
-    object_value = value.AsInt64Value();                                       \
-  }                                                                            \
-  if (instance.IsTypedData()) {                                                \
-    const TypedData& array = TypedData::Cast(instance);                        \
-    RangeCheck(offsetInBytes.Value(), 8, array.LengthInBytes(), 8);            \
-    array.setter(offsetInBytes.Value(), object_value);                         \
-  } else if (instance.IsExternalTypedData()) {                                 \
-    const ExternalTypedData& array = ExternalTypedData::Cast(instance);        \
-    RangeCheck(offsetInBytes.Value(), 8, array.LengthInBytes(), 8);            \
-    array.setter(offsetInBytes.Value(), object_value);                         \
-  } else {                                                                     \
-    const String& error = String::Handle(String::NewFormatted(                 \
-        "Expected a TypedData object but found %s", instance.ToCString()));    \
-    Exceptions::ThrowArgumentError(error);                                     \
-  }                                                                            \
-  return Object::null();                                                       \
-}
-
-
-#define TYPED_DATA_NATIVES(getter,                                             \
-                           setter,                                             \
+#define TYPED_DATA_NATIVES(type_name,                                          \
                            object,                                             \
+                           ctor,                                               \
                            get_object_value,                                   \
                            access_size,                                        \
                            access_type)                                        \
-  TYPED_DATA_GETTER(getter, object, access_size)                               \
-  TYPED_DATA_SETTER(setter, object, get_object_value, access_size, access_type)\
+  TYPED_DATA_GETTER(Get##type_name, object, ctor, access_size)                 \
+  TYPED_DATA_SETTER(Set##type_name, object,                                    \
+      get_object_value, access_size, access_type)                              \
 
-
-#define TYPED_DATA_UINT64_NATIVES(getter, setter, object)                      \
-  TYPED_DATA_UINT64_GETTER(getter, object)                                     \
-  TYPED_DATA_UINT64_SETTER(setter, object)                                     \
-
-
-TYPED_DATA_NATIVES(GetInt8, SetInt8, Smi, Value, 1, int8_t)
-TYPED_DATA_NATIVES(GetUint8, SetUint8, Smi, Value, 1, uint8_t)
-TYPED_DATA_NATIVES(GetInt16, SetInt16, Smi, Value, 2, int16_t)
-TYPED_DATA_NATIVES(GetUint16, SetUint16, Smi, Value, 2, uint16_t)
-TYPED_DATA_NATIVES(GetInt32, SetInt32, Integer, AsInt64Value, 4, int32_t)
-TYPED_DATA_NATIVES(GetUint32, SetUint32, Integer, AsInt64Value, 4, uint32_t)
-TYPED_DATA_NATIVES(GetInt64, SetInt64, Integer, AsInt64Value, 8, int64_t)
-TYPED_DATA_UINT64_NATIVES(GetUint64, SetUint64, Integer)
-TYPED_DATA_NATIVES(GetFloat32, SetFloat32, Double, value, 4, float)
-TYPED_DATA_NATIVES(GetFloat64, SetFloat64, Double, value, 8, double)
+TYPED_DATA_NATIVES(Int8, Integer, New, AsTruncatedUint32Value, 1, int8_t)
+TYPED_DATA_NATIVES(Uint8, Integer, New, AsTruncatedUint32Value, 1, uint8_t)
+TYPED_DATA_NATIVES(Int16, Integer, New, AsTruncatedUint32Value, 2, int16_t)
+TYPED_DATA_NATIVES(Uint16, Integer, New, AsTruncatedUint32Value, 2, uint16_t)
+TYPED_DATA_NATIVES(Int32, Integer, New, AsTruncatedUint32Value, 4, int32_t)
+TYPED_DATA_NATIVES(Uint32, Integer, New, AsTruncatedUint32Value, 4, uint32_t)
+TYPED_DATA_NATIVES(Int64, Integer, New, AsTruncatedInt64Value, 8, int64_t)
 TYPED_DATA_NATIVES(
-    GetFloat32x4, SetFloat32x4, Float32x4, value, 16, simd128_value_t)
-TYPED_DATA_NATIVES(GetInt32x4, SetInt32x4, Int32x4, value, 16, simd128_value_t)
-TYPED_DATA_NATIVES(
-    GetFloat64x2, SetFloat64x2, Float64x2, value, 16, simd128_value_t)
+    Uint64, Integer, NewFromUint64, AsTruncatedInt64Value, 8, uint64_t)
+TYPED_DATA_NATIVES(Float32, Double, New, value, 4, float)
+TYPED_DATA_NATIVES(Float64, Double, New, value, 8, double)
+TYPED_DATA_NATIVES(Float32x4, Float32x4, New,  value, 16, simd128_value_t)
+TYPED_DATA_NATIVES(Int32x4, Int32x4, New, value, 16, simd128_value_t)
+TYPED_DATA_NATIVES(Float64x2, Float64x2, New, value, 16, simd128_value_t)
 
 
 DEFINE_NATIVE_ENTRY(ByteData_ToEndianInt16, 2) {
diff --git a/runtime/lib/typed_data.dart b/runtime/lib/typed_data.dart
index 1b6c96b..84905ef 100644
--- a/runtime/lib/typed_data.dart
+++ b/runtime/lib/typed_data.dart
@@ -424,13 +424,13 @@
   void setRange(int start, int end, Iterable from, [int skipCount = 0]) {
     // Check ranges.
     if ((start < 0) || (start > length)) {
-      _throwRangeError(start, length + 1);
+      throw _newRangeError(start, length + 1);
     }
     if ((end < 0) || (end > length)) {
-      _throwRangeError(end, length + 1);
+      throw _newRangeError(end, length + 1);
     }
     if (start > end) {
-      _throwRangeError(start, end + 1);
+      throw _newRangeError(start, end + 1);
     }
     if (skipCount < 0) {
       throw new ArgumentError(skipCount);
@@ -844,14 +844,14 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getInt8(index);
   }
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setInt8(index, _toInt8(value));
   }
@@ -885,14 +885,14 @@
   // Methods implementing List interface.
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getUint8(index);
   }
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setUint8(index, _toUint8(value));
   }
@@ -925,14 +925,14 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getUint8(index);
   }
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setUint8(index, _toClampedUint8(value));
   }
@@ -967,14 +967,14 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedInt16(index);
   }
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedInt16(index, _toInt16(value));
   }
@@ -1017,14 +1017,14 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedUint16(index);
   }
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedUint16(index, _toUint16(value));
   }
@@ -1067,14 +1067,14 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedInt32(index);
   }
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedInt32(index, _toInt32(value));
   }
@@ -1117,14 +1117,14 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedUint32(index);
   }
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedUint32(index, _toUint32(value));
   }
@@ -1167,14 +1167,14 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedInt64(index);
   }
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedInt64(index, _toInt64(value));
   }
@@ -1217,14 +1217,14 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedUint64(index);
   }
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedUint64(index, _toUint64(value));
   }
@@ -1267,14 +1267,14 @@
 
   double operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedFloat32(index);
   }
 
   void operator[]=(int index, double value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedFloat32(index, value);
   }
@@ -1317,14 +1317,14 @@
 
   double operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedFloat64(index);
   }
 
   void operator[]=(int index, double value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedFloat64(index, value);
   }
@@ -1365,14 +1365,14 @@
 
   Float32x4 operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedFloat32x4(index);
   }
 
   void operator[]=(int index, Float32x4 value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedFloat32x4(index, value);
   }
@@ -1413,14 +1413,14 @@
 
   Int32x4 operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedInt32x4(index);
   }
 
   void operator[]=(int index, Int32x4 value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedInt32x4(index, value);
   }
@@ -1461,14 +1461,14 @@
 
   Float64x2 operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedFloat64x2(index);
   }
 
   void operator[]=(int index, Float64x2 value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedFloat64x2(index, value);
   }
@@ -1510,14 +1510,14 @@
   // Method(s) implementing the List interface.
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getInt8(index);
   }
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setInt8(index, value);
   }
@@ -1553,14 +1553,14 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getUint8(index);
   }
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setUint8(index, _toUint8(value));
   }
@@ -1595,14 +1595,14 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getUint8(index);
   }
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setUint8(index, _toClampedUint8(value));
   }
@@ -1638,14 +1638,14 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedInt16(index);
   }
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedInt16(index, _toInt16(value));
   }
@@ -1689,14 +1689,14 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedUint16(index);
   }
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedUint16(index, _toUint16(value));
   }
@@ -1740,14 +1740,14 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedInt32(index);
   }
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedInt32(index, _toInt32(value));
   }
@@ -1791,14 +1791,14 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedUint32(index);
   }
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedUint32(index, _toUint32(value));
   }
@@ -1842,14 +1842,14 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedInt64(index);
   }
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedInt64(index, _toInt64(value));
   }
@@ -1893,14 +1893,14 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedUint64(index);
   }
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedUint64(index, _toUint64(value));
   }
@@ -1944,14 +1944,14 @@
 
   double operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedFloat32(index);
   }
 
   void operator[]=(int index, double value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedFloat32(index, value);
   }
@@ -1995,14 +1995,14 @@
 
   double operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedFloat64(index);
   }
 
   void operator[]=(int index, double value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedFloat64(index, value);
   }
@@ -2046,14 +2046,14 @@
 
   Float32x4 operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedFloat32x4(index);
   }
 
   void operator[]=(int index, Float32x4 value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedFloat32x4(index, value);
   }
@@ -2097,14 +2097,14 @@
 
   Int32x4 operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedInt32x4(index);
   }
 
   void operator[]=(int index, Int32x4 value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedInt32x4(index, value);
   }
@@ -2148,14 +2148,14 @@
 
   Float64x2 operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _getIndexedFloat64x2(index);
   }
 
   void operator[]=(int index, Float64x2 value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _setIndexedFloat64x2(index, value);
   }
@@ -2476,7 +2476,7 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _typedData._getInt8(offsetInBytes +
                                (index * Int8List.BYTES_PER_ELEMENT));
@@ -2484,7 +2484,7 @@
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _typedData._setInt8(offsetInBytes + (index * Int8List.BYTES_PER_ELEMENT),
                         _toInt8(value));
@@ -2523,7 +2523,7 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _typedData._getUint8(offsetInBytes +
                                 (index * Uint8List.BYTES_PER_ELEMENT));
@@ -2531,7 +2531,7 @@
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _typedData._setUint8(offsetInBytes + (index * Uint8List.BYTES_PER_ELEMENT),
                          _toUint8(value));
@@ -2571,7 +2571,7 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _typedData._getUint8(offsetInBytes +
                                 (index * Uint8List.BYTES_PER_ELEMENT));
@@ -2579,7 +2579,7 @@
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _typedData._setUint8(offsetInBytes + (index * Uint8List.BYTES_PER_ELEMENT),
                          _toClampedUint8(value));
@@ -2619,7 +2619,7 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _typedData._getInt16(offsetInBytes +
                                 (index * Int16List.BYTES_PER_ELEMENT));
@@ -2627,7 +2627,7 @@
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _typedData._setInt16(offsetInBytes + (index * Int16List.BYTES_PER_ELEMENT),
                          _toInt16(value));
@@ -2667,7 +2667,7 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _typedData._getUint16(offsetInBytes +
                                  (index * Uint16List.BYTES_PER_ELEMENT));
@@ -2675,7 +2675,7 @@
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _typedData._setUint16(offsetInBytes + (index * Uint16List.BYTES_PER_ELEMENT),
                           _toUint16(value));
@@ -2715,7 +2715,7 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _typedData._getInt32(offsetInBytes +
                                 (index * Int32List.BYTES_PER_ELEMENT));
@@ -2723,7 +2723,7 @@
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _typedData._setInt32(offsetInBytes + (index * Int32List.BYTES_PER_ELEMENT),
                          _toInt32(value));
@@ -2763,7 +2763,7 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _typedData._getUint32(offsetInBytes +
                                  (index * Uint32List.BYTES_PER_ELEMENT));
@@ -2771,7 +2771,7 @@
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _typedData._setUint32(offsetInBytes + (index * Uint32List.BYTES_PER_ELEMENT),
                           _toUint32(value));
@@ -2811,7 +2811,7 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _typedData._getInt64(offsetInBytes +
                                 (index * Int64List.BYTES_PER_ELEMENT));
@@ -2819,7 +2819,7 @@
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _typedData._setInt64(offsetInBytes + (index * Int64List.BYTES_PER_ELEMENT),
                          _toInt64(value));
@@ -2859,7 +2859,7 @@
 
   int operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _typedData._getUint64(offsetInBytes +
                                  (index * Uint64List.BYTES_PER_ELEMENT));
@@ -2867,7 +2867,7 @@
 
   void operator[]=(int index, int value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _typedData._setUint64(offsetInBytes + (index * Uint64List.BYTES_PER_ELEMENT),
                           _toUint64(value));
@@ -2907,7 +2907,7 @@
 
   double operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _typedData._getFloat32(offsetInBytes +
                                   (index * Float32List.BYTES_PER_ELEMENT));
@@ -2915,7 +2915,7 @@
 
   void operator[]=(int index, double value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _typedData._setFloat32(offsetInBytes +
                            (index * Float32List.BYTES_PER_ELEMENT), value);
@@ -2955,7 +2955,7 @@
 
   double operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _typedData._getFloat64(offsetInBytes +
                                   (index * Float64List.BYTES_PER_ELEMENT));
@@ -2963,7 +2963,7 @@
 
   void operator[]=(int index, double value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _typedData._setFloat64(offsetInBytes +
                           (index * Float64List.BYTES_PER_ELEMENT), value);
@@ -3003,7 +3003,7 @@
 
   Float32x4 operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _typedData._getFloat32x4(offsetInBytes +
                                   (index * Float32x4List.BYTES_PER_ELEMENT));
@@ -3011,7 +3011,7 @@
 
   void operator[]=(int index, Float32x4 value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _typedData._setFloat32x4(offsetInBytes +
                              (index * Float32x4List.BYTES_PER_ELEMENT), value);
@@ -3051,7 +3051,7 @@
 
   Int32x4 operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _typedData._getInt32x4(offsetInBytes +
                                    (index * Int32x4List.BYTES_PER_ELEMENT));
@@ -3059,7 +3059,7 @@
 
   void operator[]=(int index, Int32x4 value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _typedData._setInt32x4(offsetInBytes +
                             (index * Int32x4List.BYTES_PER_ELEMENT), value);
@@ -3099,7 +3099,7 @@
 
   Float64x2 operator[](int index) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     return _typedData._getFloat64x2(offsetInBytes +
                                     (index * Float64x2List.BYTES_PER_ELEMENT));
@@ -3107,7 +3107,7 @@
 
   void operator[]=(int index, Float64x2 value) {
     if (index < 0 || index >= length) {
-      _throwRangeError(index, length);
+      throw _newRangeError(index, length);
     }
     _typedData._setFloat64x2(offsetInBytes +
                              (index * Float64x2List.BYTES_PER_ELEMENT), value);
@@ -3160,220 +3160,198 @@
 
   int getInt8(int byteOffset) {
     if (byteOffset < 0 || byteOffset >= length) {
-      _throwRangeError(byteOffset, length);
+      throw _newRangeError(byteOffset, length);
     }
     return _typedData._getInt8(_offset + byteOffset);
   }
   void setInt8(int byteOffset, int value) {
     if (byteOffset < 0 || byteOffset >= length) {
-      _throwRangeError(byteOffset, length);
+      throw _newRangeError(byteOffset, length);
     }
-    _typedData._setInt8(_offset + byteOffset, _toInt8(value));
+    _typedData._setInt8(_offset + byteOffset, value);
   }
 
   int getUint8(int byteOffset) {
     if (byteOffset < 0 || byteOffset >= length) {
-      _throwRangeError(byteOffset, length);
+      throw _newRangeError(byteOffset, length);
     }
     return _typedData._getUint8(_offset + byteOffset);
   }
   void setUint8(int byteOffset, int value) {
     if (byteOffset < 0 || byteOffset >= length) {
-      _throwRangeError(byteOffset, length);
+      throw _newRangeError(byteOffset, length);
     }
-    _typedData._setUint8(_offset + byteOffset, _toUint8(value));
+    _typedData._setUint8(_offset + byteOffset, value);
   }
 
   int getInt16(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
     if (byteOffset < 0 || byteOffset + 1 >= length) {
-      _throwRangeError(byteOffset + 1, length);
+      throw _newRangeError(byteOffset + 1, length);
     }
     var result = _typedData._getInt16(_offset + byteOffset);
     if (identical(endian, Endianness.HOST_ENDIAN)) {
       return result;
     }
-    return _toEndianInt16(result, endian._littleEndian);
+    return _byteSwap16(result).toSigned(16);
   }
   void setInt16(int byteOffset,
                 int value,
                 [Endianness endian = Endianness.BIG_ENDIAN]) {
     if (byteOffset < 0 || byteOffset + 1 >= length) {
-      _throwRangeError(byteOffset + 1, length);
+      throw _newRangeError(byteOffset + 1, length);
     }
-    var set_value = _toInt16(value);
-    if (!identical(endian, Endianness.HOST_ENDIAN)) {
-      set_value = _toEndianInt16(set_value, endian._littleEndian);
-    }
-    _typedData._setInt16(_offset + byteOffset, set_value);
+    _typedData._setInt16(_offset + byteOffset,
+        identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap16(value));
   }
 
   int getUint16(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
     if (byteOffset < 0 || byteOffset + 1 >= length) {
-      _throwRangeError(byteOffset + 1, length);
+      throw _newRangeError(byteOffset + 1, length);
     }
     var result = _typedData._getUint16(_offset + byteOffset);
     if (identical(endian, Endianness.HOST_ENDIAN)) {
       return result;
     }
-    return _toEndianUint16(result, endian._littleEndian);
+    return _byteSwap16(result);
   }
   void setUint16(int byteOffset,
                  int value,
                  [Endianness endian = Endianness.BIG_ENDIAN]) {
     if (byteOffset < 0 || byteOffset + 1 >= length) {
-      _throwRangeError(byteOffset + 1, length);
+      throw _newRangeError(byteOffset + 1, length);
     }
-    var set_value = _toUint16(value);
-    if (!identical(endian, Endianness.HOST_ENDIAN)) {
-      set_value = _toEndianUint16(set_value, endian._littleEndian);
-    }
-    _typedData._setUint16(_offset + byteOffset, set_value);
+    _typedData._setUint16(_offset + byteOffset,
+        identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap16(value));
   }
 
   int getInt32(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
     if (byteOffset < 0 || byteOffset + 3 >= length) {
-      _throwRangeError(byteOffset + 3, length);
+      throw _newRangeError(byteOffset + 3, length);
     }
     var result = _typedData._getInt32(_offset + byteOffset);
     if (identical(endian, Endianness.HOST_ENDIAN)) {
       return result;
     }
-    return _toEndianInt32(result, endian._littleEndian);
+    return _byteSwap32(result).toSigned(32);
   }
   void setInt32(int byteOffset,
                 int value,
                 [Endianness endian = Endianness.BIG_ENDIAN]) {
     if (byteOffset < 0 || byteOffset + 3 >= length) {
-      _throwRangeError(byteOffset + 3, length);
+      throw _newRangeError(byteOffset + 3, length);
     }
-    var set_value = _toInt32(value);
-    if (!identical(endian, Endianness.HOST_ENDIAN)) {
-      set_value = _toEndianInt32(set_value, endian._littleEndian);
-    }
-    _typedData._setInt32(_offset + byteOffset, set_value);
+    _typedData._setInt32(_offset + byteOffset,
+        identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap32(value));
   }
 
   int getUint32(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
     if (byteOffset < 0 || byteOffset + 3 >= length) {
-      _throwRangeError(byteOffset + 3, length);
+      throw _newRangeError(byteOffset + 3, length);
     }
     var result = _typedData._getUint32(_offset + byteOffset);
     if (identical(endian, Endianness.HOST_ENDIAN)) {
       return result;
     }
-    return _toEndianUint32(result, endian._littleEndian);
+    return _byteSwap32(result);
   }
   void setUint32(int byteOffset,
                  int value,
                  [Endianness endian = Endianness.BIG_ENDIAN]) {
     if (byteOffset < 0 || byteOffset + 3 >= length) {
-      _throwRangeError(byteOffset + 3, length);
+      throw _newRangeError(byteOffset + 3, length);
     }
-    var set_value = _toUint32(value);
-    if (!identical(endian, Endianness.HOST_ENDIAN)) {
-      set_value = _toEndianUint32(set_value, endian._littleEndian);
-    }
-    _typedData._setUint32(_offset + byteOffset, set_value);
+    _typedData._setUint32(_offset + byteOffset,
+        identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap32(value));
   }
 
   int getInt64(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
     if (byteOffset < 0 || byteOffset + 7 >= length) {
-      _throwRangeError(byteOffset + 7, length);
+      throw _newRangeError(byteOffset + 7, length);
     }
     var result = _typedData._getInt64(_offset + byteOffset);
     if (identical(endian, Endianness.HOST_ENDIAN)) {
       return result;
     }
-    return _toEndianInt64(result, endian._littleEndian);
+    return _byteSwap64(result).toSigned(64);
   }
   void setInt64(int byteOffset,
                 int value,
                 [Endianness endian = Endianness.BIG_ENDIAN]) {
     if (byteOffset < 0 || byteOffset + 7 >= length) {
-      _throwRangeError(byteOffset + 7, length);
+      throw _newRangeError(byteOffset + 7, length);
     }
-    var set_value = _toInt64(value);
-    if (!identical(endian, Endianness.HOST_ENDIAN)) {
-      set_value = _toEndianInt64(set_value, endian._littleEndian);
-    }
-    _typedData._setInt64(_offset + byteOffset, set_value);
+    _typedData._setInt64(_offset + byteOffset,
+        identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap64(value));
   }
 
   int getUint64(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
     if (byteOffset < 0 || byteOffset + 7 >= length) {
-      _throwRangeError(byteOffset + 7, length);
+      throw _newRangeError(byteOffset + 7, length);
     }
     var result = _typedData._getUint64(_offset + byteOffset);
     if (identical(endian, Endianness.HOST_ENDIAN)) {
       return result;
     }
-    return _toEndianUint64(result, endian._littleEndian);
+    return _byteSwap64(result);
   }
   void setUint64(int byteOffset,
                  int value,
                  [Endianness endian = Endianness.BIG_ENDIAN]) {
     if (byteOffset < 0 || byteOffset + 7 >= length) {
-      _throwRangeError(byteOffset + 7, length);
+      throw _newRangeError(byteOffset + 7, length);
     }
-    var set_value = _toUint64(value);
-    if (!identical(endian, Endianness.HOST_ENDIAN)) {
-      set_value = _toEndianUint64(set_value, endian._littleEndian);
-    }
-    _typedData._setUint64(_offset + byteOffset, set_value);
+    _typedData._setUint64(_offset + byteOffset,
+        identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap64(value));
   }
 
   double getFloat32(int byteOffset,
                     [Endianness endian = Endianness.BIG_ENDIAN]) {
     if (byteOffset < 0 || byteOffset + 3 >= length) {
-      _throwRangeError(byteOffset + 3, length);
+      throw _newRangeError(byteOffset + 3, length);
     }
     var result = _typedData._getFloat32(_offset + byteOffset);
     if (identical(endian, Endianness.HOST_ENDIAN)) {
       return result;
     }
-    return _toEndianFloat32(result, endian._littleEndian);
+    return _byteSwapFloat32(result);
   }
   void setFloat32(int byteOffset,
                   double value,
                   [Endianness endian = Endianness.BIG_ENDIAN]) {
     if (byteOffset < 0 || byteOffset + 3 >= length) {
-      _throwRangeError(byteOffset + 3, length);
+      throw _newRangeError(byteOffset + 3, length);
     }
-    var set_value = value;
-    if (!identical(endian, Endianness.HOST_ENDIAN)) {
-      set_value = _toEndianFloat32(set_value, endian._littleEndian);
-    }
-    _typedData._setFloat32(_offset + byteOffset, set_value);
+    _typedData._setFloat32(_offset + byteOffset,
+        identical(endian, Endianness.HOST_ENDIAN) ? value
+                                                  : _byteSwapFloat32(value));
   }
 
   double getFloat64(int byteOffset,
                     [Endianness endian = Endianness.BIG_ENDIAN]) {
     if (byteOffset < 0 || byteOffset + 7 >= length) {
-      _throwRangeError(byteOffset + 7, length);
+      throw _newRangeError(byteOffset + 7, length);
     }
     var result = _typedData._getFloat64(_offset + byteOffset);
     if (identical(endian, Endianness.HOST_ENDIAN)) {
       return result;
     }
-    return _toEndianFloat64(result, endian._littleEndian);
+    return _byteSwapFloat64(result);
   }
   void setFloat64(int byteOffset,
                   double value,
                   [Endianness endian = Endianness.BIG_ENDIAN]) {
     if (byteOffset < 0 || byteOffset + 7 >= length) {
-      _throwRangeError(byteOffset + 7, length);
+      throw _newRangeError(byteOffset + 7, length);
     }
-    var set_value = value;
-    if (!identical(endian, Endianness.HOST_ENDIAN)) {
-      set_value = _toEndianFloat64(set_value, endian._littleEndian);
-    }
-    _typedData._setFloat64(_offset + byteOffset, set_value);
+    _typedData._setFloat64(_offset + byteOffset,
+        identical(endian, Endianness.HOST_ENDIAN) ? value
+                                                  : _byteSwapFloat64(value));
   }
 
   Float32x4 getFloat32x4(int byteOffset,
                          [Endianness endian = Endianness.BIG_ENDIAN]) {
     if (byteOffset < 0 || byteOffset + 3 >= length) {
-      _throwRangeError(byteOffset + 3, length);
+      throw _newRangeError(byteOffset + 3, length);
     }
     // TODO(johnmccutchan) : Need to resolve this for endianity.
     return _typedData._getFloat32x4(_offset + byteOffset);
@@ -3382,39 +3360,50 @@
                     Float32x4 value,
                     [Endianness endian = Endianness.BIG_ENDIAN]) {
     if (byteOffset < 0 || byteOffset + 3 >= length) {
-      _throwRangeError(byteOffset + 3, length);
+      throw _newRangeError(byteOffset + 3, length);
     }
     // TODO(johnmccutchan) : Need to resolve this for endianity.
     _typedData._setFloat32x4(_offset + byteOffset, value);
 
   }
 
-
-  // Internal utility methods.
-
-  static int _toEndianInt16(int host_value, bool little_endian)
-      native "ByteData_ToEndianInt16";
-  static int _toEndianUint16(int host_value, bool little_endian)
-      native "ByteData_ToEndianUint16";
-  static int _toEndianInt32(int host_value, bool little_endian)
-      native "ByteData_ToEndianInt32";
-  static int _toEndianUint32(int host_value, bool little_endian)
-      native "ByteData_ToEndianUint32";
-  static int _toEndianInt64(int host_value, bool little_endian)
-      native "ByteData_ToEndianInt64";
-  static int _toEndianUint64(int host_value, bool little_endian)
-      native "ByteData_ToEndianUint64";
-  static double _toEndianFloat32(double host_value, bool little_endian)
-      native "ByteData_ToEndianFloat32";
-  static double _toEndianFloat64(double host_value, bool little_endian)
-      native "ByteData_ToEndianFloat64";
-
-
   final TypedData _typedData;
   final int _offset;
   final int length;
 }
 
+int _byteSwap16(int value) {
+  return ((value & 0xFF00) >> 8) |
+         ((value & 0x00FF) << 8);
+}
+
+int _byteSwap32(int value) {
+  value = ((value & 0xFF00FF00) >> 8)  | ((value & 0x00FF00FF) << 8);
+  value = ((value & 0xFFFF0000) >> 16) | ((value & 0x0000FFFF) << 16);
+  return value;
+}
+
+int _byteSwap64(int value) {
+  return (_byteSwap32(value) << 32) | _byteSwap32(value >> 32);
+}
+
+final _convU32 = new Uint32List(2);
+final _convF32 = new Float32List.view(_convU32.buffer);
+final _convF64 = new Float64List.view(_convU32.buffer);
+
+double _byteSwapFloat32(double value) {
+  _convF32[0] = value;
+  _convU32[0] = _byteSwap32(_convU32[0]);
+  return _convF32[0];
+}
+
+double _byteSwapFloat64(double value) {
+  _convF64[0] = value;
+  var lo = _convU32[0];
+  _convU32[0] = _byteSwap32(_convU32[1]);
+  _convU32[1] = _byteSwap32(lo);
+  return _convF64[0];
+}
 
 // Top level utility methods.
 int _toInt(int value, int mask) {
@@ -3500,7 +3489,7 @@
 }
 
 
-void _throwRangeError(int index, int length) {
+_newRangeError(int index, int length) {
   String message = "$index must be in the range [0..$length)";
-  throw new RangeError(message);
+  return new RangeError(message);
 }
diff --git a/runtime/observatory/lib/cli.dart b/runtime/observatory/lib/cli.dart
new file mode 100644
index 0000000..607c58a
--- /dev/null
+++ b/runtime/observatory/lib/cli.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 cli;
+
+import 'dart:async';
+
+part 'src/cli/command.dart';
diff --git a/runtime/observatory/lib/src/cli/command.dart b/runtime/observatory/lib/src/cli/command.dart
new file mode 100644
index 0000000..8c54a64
--- /dev/null
+++ b/runtime/observatory/lib/src/cli/command.dart
@@ -0,0 +1,174 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 cli;
+
+// Splits a line into a list of string args.
+List<String> _splitLine(String line) {
+  var args = line.split(' ').where((arg) {
+      return arg != ' ' && arg != '';
+    }).toList();
+  return args;
+}
+
+// Concatenates the first 'count' args.
+String _concatArgs(List<String> args, int count) {
+  if (count == 0) {
+    return '';
+  }
+  return '${args.sublist(0, count).join(" ")} ';
+}
+
+// Shared functionality for RootCommand and Command.
+abstract class _CommandBase {
+  _CommandBase(List<Command> children) {
+    assert(children != null);
+    _children.addAll(children);
+    for (var child in _children) {
+      child._parent = this;
+    }
+  }
+
+  // A command may optionally have sub-commands.
+  List<Command> _children = [];
+
+  _CommandBase _parent;
+  int get _depth => (_parent == null ? 0 : _parent._depth + 1);
+
+  // Override in subclasses to provide command-specific argument completion.
+  //
+  // Given a list of arguments to this command, provide a list of
+  // possible completions for those arguments.
+  List<String> complete(List<String> args) => [];
+
+  // Override in subclasses to provide command-specific execution.
+  Future run(List<String> args);
+
+  // Returns a list of local subcommands which match the args.
+  List<Command> _matchLocal(String arg, bool preferExact) {
+    var matches = new List<Command>();
+    for (var child in _children) {
+      if (child.name.startsWith(arg)) {
+        if (preferExact && child.name == arg) {
+          return [child];
+        }
+        matches.add(child);
+      }
+    }
+    return matches;
+  }
+
+  // Returns the set of commands could be triggered by a list of
+  // arguments.
+  List<Command> _match(List<String> args, bool preferExact) {
+    if (args.isEmpty) {
+      return [];
+    }    
+    bool lastArg = (args.length == 1);
+    var matches = _matchLocal(args[0], !lastArg || preferExact);
+    if (matches.isEmpty) {
+      return [];
+    } else if (matches.length == 1) {
+      var childMatches =  matches[0]._match(args.sublist(1), preferExact);
+      if (childMatches.isEmpty) {
+        return matches;
+      } else {
+        return childMatches;
+      }
+    } else {
+      return matches;
+    }
+  }
+
+  // Builds a list of completions for this command.
+  List<String> _buildCompletions(List<String> args,
+                                 bool addEmptyString) {
+    var completions = complete(args.sublist(_depth, args.length));
+    if (addEmptyString && completions.isEmpty && args[args.length - 1] == '') {
+      // Special case allowance for an empty particle at the end of
+      // the command.
+      completions = [''];
+    }
+    var prefix = _concatArgs(args, _depth);
+    return completions.map((str) => '${prefix}${str}').toList();
+  }
+
+}
+
+// The root of a tree of commands.
+class RootCommand extends _CommandBase {
+  RootCommand(List<Command> children) : super(children);
+
+  // Provides a list of possible completions for a line of text.
+  List<String> completeCommand(String line) {
+    var args = _splitLine(line);
+    bool showAll = line.endsWith(' ') || args.isEmpty;
+    if (showAll) {
+      // Adding an empty string to the end causes us to match all
+      // subcommands of the last command.
+      args.add('');
+    }
+    var commands =  _match(args, false);
+    if (commands.isEmpty) {
+      // No matching commands.
+      return [];
+    }
+    int matchLen = commands[0]._depth;
+    if (matchLen < args.length) {
+      // We were able to find a command which matches a prefix of the
+      // args, but not the full list.
+      if (commands.length == 1) {
+        // The matching command is unique.  Attempt to provide local
+        // argument completion from the command.
+        return commands[0]._buildCompletions(args, true);
+      } else {
+        // An ambiguous prefix match leaves us nowhere.  The user is
+        // typing a bunch of stuff that we don't know how to complete.
+        return [];
+      }
+    }
+
+    // We have found a set of commands which match all of the args.
+    // Return the completions strings.
+    var prefix = _concatArgs(args, args.length - 1);
+    var completions =
+        commands.map((command) => '${prefix}${command.name} ').toList();
+    if (showAll && matchLen == args.length) {
+      // If we are showing all possiblities, also include local
+      // completions for the parent command.
+      completions.addAll(commands[0]._parent._buildCompletions(args, false));
+    }
+    return completions;
+  }
+
+  // Runs a command.
+  Future runCommand(String line) {
+    var args = _splitLine(line);
+    var commands =  _match(args, true);
+    if (commands.isEmpty) {
+      // TODO(turnidge): Add a proper exception class for this.
+      return new Future.error('notfound');
+    } else if (commands.length == 1) {
+      return commands[0].run(args.sublist(commands[0]._depth));
+    } else {
+      // TODO(turnidge): Add a proper exception class for this.
+      return new Future.error('ambiguous');
+    }
+  }
+
+  Future run(List<String> args) {
+    throw 'should-not-execute-the-root-command';
+  }
+
+  toString() => 'RootCommand';
+}
+
+// A node in the command tree.
+abstract class Command extends _CommandBase {
+  Command(this.name, List<Command> children) : super(children);
+
+  final name;
+
+  toString() => 'Command(${name})';
+}
diff --git a/runtime/observatory/lib/src/elements/script_inset.dart b/runtime/observatory/lib/src/elements/script_inset.dart
index 814c45f..f7a0627 100644
--- a/runtime/observatory/lib/src/elements/script_inset.dart
+++ b/runtime/observatory/lib/src/elements/script_inset.dart
@@ -27,7 +27,8 @@
   @observable int endLine;
   @observable bool linesReady = false;
 
-  @observable List<ScriptLine> lines = toObservable([]);
+  // Contents are either ScriptLine or ScriptElipsis.
+  @observable List lines = toObservable([]);
 
   String makeLineId(int line) {
     return 'line-$line';
@@ -112,8 +113,30 @@
                : script.lines.length);
 
     lines.clear();
+    int blankLineCount = 0;
     for (int i = (startLine - 1); i <= (endLine - 1); i++) {
-      lines.add(script.lines[i]);
+      if (script.lines[i].isBlank) {
+        // Try to introduce elipses if there are 4 or more contiguous blank lines.
+        blankLineCount++;
+      } else {
+        if (blankLineCount > 0) {
+          int firstBlank = i - blankLineCount;
+          int lastBlank = i - 1;
+          if (blankLineCount < 4) {
+            // Too few blank lines for an elipsis.
+            for (int j = firstBlank; j  <= lastBlank; j++) {
+              lines.add(script.lines[j]);
+            }
+          } else {
+            // Add an elipsis for the skipped region.
+            lines.add(script.lines[firstBlank]);
+            lines.add(null);
+            lines.add(script.lines[lastBlank]);
+          }
+          blankLineCount = 0;
+        }
+        lines.add(script.lines[i]);
+      }
     }
     linesReady = true;
   }
diff --git a/runtime/observatory/lib/src/elements/script_inset.html b/runtime/observatory/lib/src/elements/script_inset.html
index 52b72e5..fb8c2dc 100644
--- a/runtime/observatory/lib/src/elements/script_inset.html
+++ b/runtime/observatory/lib/src/elements/script_inset.html
@@ -29,8 +29,12 @@
         background-color: #6cf;
       }
       .hitsNone, .hitsNotExecuted, .hitsExecuted {
+        display: table-cell;
+        vertical-align: top;
+        font: 400 14px consolas, courier, monospace;
         min-width: 32px;
         text-align: right;
+        color: #a8a8a8;
       }
       .hitsNotExecuted {
         background-color: #e66;
@@ -45,31 +49,42 @@
         <div class="sourceTable">
           <template if="{{ linesReady }}">
             <template repeat="{{ line in lines }}">
-              <div class="sourceRow" id="{{ makeLineId(line.line) }}">
-                <breakpoint-toggle line="{{ line }}"></breakpoint-toggle>
+              <template if="{{ line != null }}">
+                <div class="sourceRow" id="{{ makeLineId(line.line) }}">
+                  <breakpoint-toggle line="{{ line }}"></breakpoint-toggle>
 
-                <div class="sourceItem">&nbsp;</div>
+                  <div class="sourceItem">&nbsp;</div>
 
-                <template if="{{ line.hits == null ||
-                              line.hits < 0 }}">
-                  <div class="hitsNone">{{ line.line }}</div>
-                </template>
-                <template if="{{ line.hits == 0 }}">
-                  <div class="hitsNotExecuted">{{ line.line }}</div>
-                </template>
-                <template if="{{ line.hits > 0 }}">
-                  <div class="hitsExecuted">{{ line.line }}</div>
-                </template>
+                  <template if="{{ line.hits == null ||
+                                line.hits < 0 }}">
+                    <div class="hitsNone">{{ line.line }}</div>
+                  </template>
+                  <template if="{{ line.hits == 0 }}">
+                    <div class="hitsNotExecuted">{{ line.line }}</div>
+                  </template>
+                  <template if="{{ line.hits > 0 }}">
+                    <div class="hitsExecuted">{{ line.line }}</div>
+                  </template>
 
-                <div class="sourceItem">&nbsp;</div>
+                  <div class="sourceItem">&nbsp;</div>
 
-                <template if="{{ line.line == currentLine }}">
-                  <div class="sourceItemCurrent">{{line.text}}</div>
-                </template>
-                <template if="{{ line.line != currentLine }}">
-                  <div class="sourceItem">{{line.text}}</div>
-                </template>
+                  <template if="{{ line.line == currentLine }}">
+                    <div class="sourceItemCurrent">{{line.text}}</div>
+                  </template>
+                  <template if="{{ line.line != currentLine }}">
+                    <div class="sourceItem">{{line.text}}</div>
+                  </template>
               </div>
+              </template>
+
+              <template if="{{ line == null }}">
+                <breakpoint-toggle line="{{ null }}"></breakpoint-toggle>
+                <div class="sourceItem">&nbsp;</div>
+                <div class="hitsNone">...</div>
+                <div class="sourceItem">&nbsp;</div>
+                <div class="sourceItem"></div>
+              </template>
+
             </template>
           </template>
 
@@ -117,31 +132,37 @@
       }
     </style>
 
-    <template if="{{ line.possibleBpt && busy}}">
-      <div class="busyBreakpoint">B</div>
-    </template>
-
-    <template if="{{ line.bpt == null && !line.possibleBpt }}">
+    <template if="{{ line == null }}">
       <div class="emptyBreakpoint">&nbsp;</div>
     </template>
 
-    <template if="{{ line.bpt == null && line.possibleBpt && !busy}}">
-      <div class="possibleBreakpoint">
-        <a on-click="{{ toggleBreakpoint }}">B</a>
-      </div>
-    </template>
+    <template if="{{ line != null }}">
+      <template if="{{ line.possibleBpt && busy}}">
+        <div class="busyBreakpoint">B</div>
+      </template>
 
-    <template if="{{ line.bpt != null && !line.bpt['resolved'] && !busy}}">
-      <div class="unresolvedBreakpoint">
-        <a on-click="{{ toggleBreakpoint }}">B</a>
-      </div>
-    </template>
+      <template if="{{ line.bpt == null && !line.possibleBpt }}">
+        <div class="emptyBreakpoint">&nbsp;</div>
+      </template>
 
-    <template if="{{ line.bpt != null && line.bpt['resolved'] && !busy}}">
-      <div class="resolvedBreakpoint">
-        <a on-click="{{ toggleBreakpoint }}">B</a>
-      </div>
-    </template>
+      <template if="{{ line.bpt == null && line.possibleBpt && !busy}}">
+        <div class="possibleBreakpoint">
+          <a on-click="{{ toggleBreakpoint }}">B</a>
+        </div>
+      </template>
+
+      <template if="{{ line.bpt != null && !line.bpt['resolved'] && !busy}}">
+        <div class="unresolvedBreakpoint">
+          <a on-click="{{ toggleBreakpoint }}">B</a>
+        </div>
+      </template>
+
+      <template if="{{ line.bpt != null && line.bpt['resolved'] && !busy}}">
+        <div class="resolvedBreakpoint">
+          <a on-click="{{ toggleBreakpoint }}">B</a>
+        </div>
+      </template>
+    </template> <!-- line != null -->
 
   </template>
 </polymer-element>
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index 4a0842d..5e7ea08 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -697,12 +697,12 @@
   final ObjectGraph graph;
   final DateTime timeStamp;
   final Isolate isolate;
-  
+
   HeapSnapshot(this.isolate, ByteData data) :
       graph = new ObjectGraph(new ReadStream(data)),
       timeStamp = new DateTime.now() {
   }
-  
+
   List<Future<ServiceObject>> getMostRetained({int classId, int limit}) {
     var result = [];
     for (var v in graph.getMostRetained(classId: classId, limit: limit)) {
@@ -715,8 +715,8 @@
     }
     return result;
   }
-  
-  
+
+
 }
 
 /// State for a running isolate.
@@ -882,12 +882,12 @@
   @observable DartError error;
   @observable HeapSnapshot latestSnapshot;
   Completer<HeapSnapshot> _snapshotFetch;
-  
+
   void loadHeapSnapshot(ServiceEvent event) {
     latestSnapshot = new HeapSnapshot(this, event.data);
     _snapshotFetch.complete(latestSnapshot);
   }
-  
+
   Future<HeapSnapshot> fetchHeapSnapshot() {
     if (_snapshotFetch == null || _snapshotFetch.isCompleted) {
       get('graph');
@@ -1834,6 +1834,15 @@
   @observable ServiceMap bpt;
   @observable bool possibleBpt = true;
 
+  bool get isBlank {
+    // Compute isBlank on demand.
+    if (_isBlank == null) {
+      _isBlank = text.trim().isEmpty;
+    }
+    return _isBlank;
+  }
+  bool _isBlank;
+
   static bool _isTrivialToken(String token) {
     if (token == 'else') {
       return true;
@@ -2017,14 +2026,14 @@
 }
 
 class PcDescriptor extends Observable {
-  final int address;
+  final int pcOffset;
   @reflectable final int deoptId;
   @reflectable final int tokenPos;
   @reflectable final int tryIndex;
   @reflectable final String kind;
   @observable Script script;
   @observable String formattedLine;
-  PcDescriptor(this.address, this.deoptId, this.tokenPos, this.tryIndex,
+  PcDescriptor(this.pcOffset, this.deoptId, this.tokenPos, this.tryIndex,
                this.kind);
 
   @reflectable String formattedDeoptId() {
@@ -2065,7 +2074,6 @@
       new ObservableList<PcDescriptor>();
 
   PcDescriptors._empty(ServiceObjectOwner owner) : super._empty(owner) {
-    print('created PcDescriptors.');
   }
 
   void _update(ObservableMap m, bool mapIsRef) {
@@ -2077,13 +2085,13 @@
     size = m['size'];
     descriptors.clear();
     for (var descriptor in m['members']) {
-      var address = int.parse(descriptor['pc'], radix:16);
+      var pcOffset = int.parse(descriptor['pcOffset'], radix:16);
       var deoptId = descriptor['deoptId'];
       var tokenPos = descriptor['tokenPos'];
       var tryIndex = descriptor['tryIndex'];
       var kind = descriptor['kind'].trim();
       descriptors.add(
-          new PcDescriptor(address, deoptId, tokenPos, tryIndex, kind));
+          new PcDescriptor(pcOffset, deoptId, tokenPos, tryIndex, kind));
     }
   }
 }
@@ -2153,6 +2161,7 @@
 
 class CodeInstruction extends Observable {
   @observable final int address;
+  @observable final int pcOffset;
   @observable final String machine;
   @observable final String human;
   @observable CodeInstruction jumpTarget;
@@ -2164,7 +2173,7 @@
     return '${percent.toStringAsFixed(2)}%';
   }
 
-  CodeInstruction(this.address, this.machine, this.human);
+  CodeInstruction(this.address, this.pcOffset, this.machine, this.human);
 
   @reflectable bool get isComment => address == 0;
   @reflectable bool get hasDescriptors => descriptors.length > 0;
@@ -2451,11 +2460,13 @@
       var address = 0;  // Assume code comment.
       var machine = disassembly[i + 1];
       var human = disassembly[i + 2];
+      var pcOffset = 0;
       if (disassembly[i] != '') {
         // Not a code comment, extract address.
         address = int.parse(disassembly[i]);
+        pcOffset = address - startAddress;
       }
-      var instruction = new CodeInstruction(address, machine, human);
+      var instruction = new CodeInstruction(address, pcOffset, machine, human);
       instructions.add(instruction);
     }
     for (var instruction in instructions) {
@@ -2464,14 +2475,15 @@
   }
 
   void _processDescriptor(Map d) {
-    var address = int.parse(d['pc'], radix:16);
+    var pcOffset = int.parse(d['pcOffset'], radix:16);
+    var address = startAddress + pcOffset;
     var deoptId = d['deoptId'];
     var tokenPos = d['tokenPos'];
     var tryIndex = d['tryIndex'];
     var kind = d['kind'].trim();
     for (var instruction in instructions) {
       if (instruction.address == address) {
-        instruction.descriptors.add(new PcDescriptor(address,
+        instruction.descriptors.add(new PcDescriptor(pcOffset,
                                                      deoptId,
                                                      tokenPos,
                                                      tryIndex,
diff --git a/runtime/observatory/observatory.gypi b/runtime/observatory/observatory.gypi
index 7cc201d..9461174 100644
--- a/runtime/observatory/observatory.gypi
+++ b/runtime/observatory/observatory.gypi
@@ -12,6 +12,8 @@
       'type': 'none',
       'dependencies': [
         'dart_bootstrap#host',
+        # We use packages for building
+        '../pkg/pkg.gyp:pkg_packages#target',
       ],
       'toolsets': ['host'],
       'actions': [
@@ -19,6 +21,7 @@
           'action_name': 'get_obsevatory_dependencies',
           'inputs': [
             '../../tools/observatory_tool.py',
+            '<(SHARED_INTERMEDIATE_DIR)/packages.stamp',
             'pubspec.yaml',
           ],
           'outputs': [
@@ -178,6 +181,7 @@
           'inputs': [
             '../../tools/observatory_tool.py',
             '<(SHARED_INTERMEDIATE_DIR)/packages.stamp',
+            'pubspec.lock',
             '<@(_sources)',
           ],
           'outputs': [
diff --git a/runtime/observatory/test/command_test.dart b/runtime/observatory/test/command_test.dart
new file mode 100644
index 0000000..b87631e
--- /dev/null
+++ b/runtime/observatory/test/command_test.dart
@@ -0,0 +1,193 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. 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 'package:observatory/cli.dart';
+import 'package:unittest/unittest.dart';
+
+class TestCommand extends Command {
+  TestCommand(this.out, name, children) : super(name, children);
+  StringBuffer out;
+
+  Future run(List<String> args) {
+    out.write('executing ${name}(${args})\n');
+    return new Future.value(null);
+  }
+}
+
+class TestCompleteCommand extends Command {
+  TestCompleteCommand(this.out, name, children) : super(name, children);
+  StringBuffer out;
+
+  List<String> complete(List<String> args) {
+    var possibles = ['one ', 'two ', 'three '];
+    return possibles.where((possible) => possible.startsWith(args[0])).toList();
+  }
+
+  Future run(List<String> args) {
+    out.write('executing ${name}(${args})\n');
+    return new Future.value(null);
+  }
+}
+
+void testCommandComplete() {
+  RootCommand cmd =
+      new RootCommand([new TestCommand(null, 'alpha', []),
+
+                       new TestCommand(null, 'game', [
+                           new TestCommand(null, 'checkers', []),
+                           new TestCommand(null, 'chess', [])]),
+
+                       new TestCommand(null, 'gamera', [
+                           new TestCommand(null, 'london', []),
+                           new TestCommand(null, 'tokyo', []),
+                           new TestCommand(null, 'topeka', [])]),
+
+                       new TestCompleteCommand(null, 'count', [
+                           new TestCommand(null, 'chocula', [])])]);
+
+  // Show all commands.
+  expect(cmd.completeCommand(''),
+         equals(['alpha ', 'game ', 'gamera ', 'count ']));
+
+  // Substring completion.
+  expect(cmd.completeCommand('al'),
+         equals(['alpha ']));
+
+  // Full string completion.
+  expect(cmd.completeCommand('alpha'),
+         equals(['alpha ']));
+                      
+  // Extra space, no subcommands.
+  expect(cmd.completeCommand('alpha '),
+         equals(['alpha ']));
+
+  // Ambiguous completion.
+  expect(cmd.completeCommand('g'),
+         equals(['game ', 'gamera ']));
+
+  // Ambiguous completion, exact match not preferred.
+  expect(cmd.completeCommand('game'),
+         equals(['game ', 'gamera ']));
+
+  // Show all subcommands.
+  expect(cmd.completeCommand('gamera '),
+         equals(['gamera london ', 'gamera tokyo ', 'gamera topeka ']));
+
+  // Subcommand completion.
+  expect(cmd.completeCommand('gamera l'),
+         equals(['gamera london ']));
+
+  // Extra space, with subcommand.
+  expect(cmd.completeCommand('gamera london '),
+         equals(['gamera london ']));
+
+  // Ambiguous subcommand completion.
+  expect(cmd.completeCommand('gamera t'),
+         equals(['gamera tokyo ', 'gamera topeka ']));
+
+  // Ambiguous subcommand completion with substring prefix.
+  // Note that the prefix is left alone.
+  expect(cmd.completeCommand('gamer t'),
+         equals(['gamer tokyo ', 'gamer topeka ']));
+
+  // Ambiguous but exact prefix is preferred.
+  expect(cmd.completeCommand('game chec'),
+         equals(['game checkers ']));
+
+  // Ambiguous non-exact prefix means no matches.
+  expect(cmd.completeCommand('gam chec'),
+         equals([]));
+
+  // Locals + subcommands, show all.
+  expect(cmd.completeCommand('count '),
+         equals(['count chocula ',
+                 'count one ',
+                 'count two ',
+                 'count three ']));
+
+  // Locals + subcommands, single local match.
+  expect(cmd.completeCommand('count th '),
+         equals(['count three ']));
+
+  // Locals + subcommands, ambiguous local match.
+  expect(cmd.completeCommand('count t'),
+         equals(['count two ', 'count three ']));
+
+  // Locals + subcommands, single command match.
+  expect(cmd.completeCommand('co choc'),
+         equals(['co chocula ']));
+
+  // We gobble spare spaces, even in the prefix.
+  expect(cmd.completeCommand('    game    chec'), equals(['game checkers ']));
+}
+
+void testCommandRunSimple() {
+  // Run a simple command.
+  StringBuffer out = new StringBuffer();
+  RootCommand cmd = new RootCommand([new TestCommand(out, 'alpha', [])]);
+
+  // Full name dispatch works.  Argument passing works.
+  cmd.runCommand('alpha dog').then(expectAsync((_) {
+      expect(out.toString(), contains('executing alpha([dog])\n'));
+      out.clear();
+      // Substring dispatch works.
+      cmd.runCommand('al cat mouse').then(expectAsync((_) {
+          expect(out.toString(), contains('executing alpha([cat, mouse])\n'));
+      }));
+  }));
+}
+
+void testCommandRunSubcommand() {
+  // Run a simple command.
+  StringBuffer out = new StringBuffer();
+  RootCommand cmd =
+      new RootCommand([
+          new TestCommand(out, 'alpha', [
+              new TestCommand(out, 'beta', []),
+              new TestCommand(out, 'gamma', [])])]);
+      
+  cmd.runCommand('a b').then(expectAsync((_) {
+      expect(out.toString(), equals('executing beta([])\n'));
+      out.clear();
+      cmd.runCommand('alpha g ').then(expectAsync((_) {
+          expect(out.toString(), equals('executing gamma([])\n'));
+      }));
+  }));
+}
+
+void testCommandRunNotFound() {
+  // Run a simple command.
+  StringBuffer out = new StringBuffer();
+  RootCommand cmd = new RootCommand([new TestCommand(out, 'alpha', [])]);
+
+  cmd.runCommand('goose').catchError(expectAsync((e) {
+      expect(e, equals('notfound'));
+  }));
+}
+
+void testCommandRunAmbiguous() {
+  // Run a simple command.
+  StringBuffer out = new StringBuffer();
+  RootCommand cmd = new RootCommand([new TestCommand(out, 'alpha', []),
+                                     new TestCommand(out, 'ankle', [])]);
+
+  cmd.runCommand('a 55').catchError(expectAsync((e) {
+      expect(e, equals('ambiguous'));
+      out.clear();
+      cmd.runCommand('ankl 55').then(expectAsync((_) {
+          expect(out.toString(), equals('executing ankle([55])\n'));
+      }));
+  }));
+}
+
+main() {
+  test('command completion test suite', testCommandComplete);
+  test('run a simple command', testCommandRunSimple);
+  test('run a subcommand', testCommandRunSubcommand);
+  test('run a command which is not found', testCommandRunNotFound);
+  test('run a command which is ambiguous', testCommandRunAmbiguous);
+}
+
diff --git a/runtime/tools/create_snapshot_bin.py b/runtime/tools/create_snapshot_bin.py
index 7a05456..24095c6 100755
--- a/runtime/tools/create_snapshot_bin.py
+++ b/runtime/tools/create_snapshot_bin.py
@@ -30,6 +30,9 @@
   result.add_option("--script",
       action="store", type="string",
       help="Dart script for which snapshot is to be generated")
+  result.add_option("--package_root",
+      action="store", type="string",
+      help="path used to resolve package: imports.")
   result.add_option("--url_mapping",
       default=[],
       action="append",
@@ -75,6 +78,10 @@
   # Setup arguments to the snapshot generator binary.
   script_args = ["--error_on_bad_type", "--error_on_bad_override"]
 
+  # Pass along the package_root if there is one.
+  if options.package_root:
+    script_args.append(''.join([ "--package_root=", options.package_root]))
+
   # First setup the snapshot output filename.
   script_args.append(''.join([ "--snapshot=", options.output_bin ]))
 
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index b1afc4f..bbb204c 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -4,10 +4,15 @@
 
 config("libdart_vm_config") {
   libs = [
-    "pthread",
-    "rt",
     "dl",
   ]
+
+  if (!is_android) {
+    libs += [
+      "pthread",
+      "rt",
+    ]
+  }
 }
 
 
diff --git a/runtime/vm/allocation.cc b/runtime/vm/allocation.cc
index bbff55e..f3afc1e 100644
--- a/runtime/vm/allocation.cc
+++ b/runtime/vm/allocation.cc
@@ -10,23 +10,29 @@
 
 namespace dart {
 
-static void* Allocate(uword size, BaseIsolate* isolate) {
-  ASSERT(isolate != NULL);
-  ASSERT(isolate->current_zone() != NULL);
+static void* Allocate(uword size, Zone* zone) {
+  ASSERT(zone != NULL);
   if (size > static_cast<uword>(kIntptrMax)) {
     FATAL1("ZoneAllocated object has unexpectedly large size %" Pu "", size);
   }
-  return reinterpret_cast<void*>(isolate->current_zone()->AllocUnsafe(size));
+  return reinterpret_cast<void*>(zone->AllocUnsafe(size));
 }
 
 
 void* ZoneAllocated::operator new(uword size) {
-  return Allocate(size, Isolate::Current());
+  return Allocate(size, Isolate::Current()->current_zone());
 }
 
 
 void* ZoneAllocated::operator new(uword size, BaseIsolate* isolate) {
-  return Allocate(size, isolate);
+  ASSERT(isolate != NULL);
+  return Allocate(size, isolate->current_zone());
+}
+
+
+void* ZoneAllocated::operator new(uword size, Zone* zone) {
+  ASSERT(zone == Isolate::Current()->current_zone());
+  return Allocate(size, zone);
 }
 
 }  // namespace dart
diff --git a/runtime/vm/allocation.h b/runtime/vm/allocation.h
index d26ac2b..be59ce6 100644
--- a/runtime/vm/allocation.h
+++ b/runtime/vm/allocation.h
@@ -93,10 +93,14 @@
   // Implicitly allocate the object in the current zone.
   void* operator new(uword size);
 
+  // DEPRECATED: Use Zone version.
   // Implicitly allocate the object in the current zone given the current
   // isolate.
   void* operator new(uword size, BaseIsolate* isolate);
 
+  // Allocate the object in the given zone, which must be the current zone.
+  void* operator new(uword size, Zone* zone);
+
   // Ideally, the delete operator should be protected instead of
   // public, but unfortunately the compiler sometimes synthesizes
   // (unused) destructors for classes derived from ZoneObject, which
diff --git a/runtime/vm/assembler.h b/runtime/vm/assembler.h
index 4cb39d4..a671d63 100644
--- a/runtime/vm/assembler.h
+++ b/runtime/vm/assembler.h
@@ -205,6 +205,57 @@
   friend class AssemblerFixup;
 };
 
+
+// Pair type parameter for DirectChainedHashMap used for the constant pool.
+class ObjIndexPair {
+ public:
+  // Typedefs needed for the DirectChainedHashMap template.
+  typedef const Object* Key;
+  typedef intptr_t Value;
+  typedef ObjIndexPair Pair;
+
+  static const intptr_t kNoIndex = -1;
+
+  ObjIndexPair() : key_(NULL), value_(kNoIndex) { }
+
+  ObjIndexPair(Key key, Value value)
+     : key_(key->IsNotTemporaryScopedHandle()
+         ? key : &Object::ZoneHandle(key->raw())),
+       value_(value) { }
+
+  static Key KeyOf(Pair kv) { return kv.key_; }
+
+  static Value ValueOf(Pair kv) { return kv.value_; }
+
+  static intptr_t Hashcode(Key key) {
+    if (key->IsSmi()) {
+      return Smi::Cast(*key).Value();
+    }
+    if (key->IsDouble()) {
+      return static_cast<intptr_t>(
+          bit_cast<int32_t, float>(
+              static_cast<float>(Double::Cast(*key).value())));
+    }
+    if (key->IsMint()) {
+      return static_cast<intptr_t>(Mint::Cast(*key).value());
+    }
+    if (key->IsString()) {
+      return String::Cast(*key).Hash();
+    }
+    // TODO(fschneider): Add hash function for other classes commonly used as
+    // compile-time constants.
+    return key->GetClassId();
+  }
+
+  static inline bool IsKeyEqual(Pair kv, Key key) {
+    return kv.key_->raw() == key->raw();
+  }
+
+ private:
+  Key key_;
+  Value value_;
+};
+
 }  // namespace dart
 
 
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
index 8d1e57f..0268a62 100644
--- a/runtime/vm/assembler_arm.cc
+++ b/runtime/vm/assembler_arm.cc
@@ -1700,36 +1700,76 @@
 }
 
 
-void Assembler::VerifiedWrite(const Address& address, Register new_value) {
-  if (VerifiedMemory::enabled()) {
-    ASSERT(address.mode() == Address::Offset ||
-           address.mode() == Address::NegOffset);
-    // Allocate temporary registers (and check for register collisions).
-    RegList used = 0;
-    UseRegister(new_value, &used);
-    Register base = UseRegister(address.rn(), &used);
-    if (address.rm() != kNoRegister) UseRegister(address.rm(), &used);
-    Register old_value = AllocateRegister(&used);
-    Register shadow_value = AllocateRegister(&used);
-    PushList(used);
-    // Verify old value.
-    ldr(old_value, address);
-    Operand shadow_offset(GetVerifiedMemoryShadow());
-    add(base, base, shadow_offset);
-    ldr(shadow_value, address);
-    cmp(old_value, Operand(shadow_value));
-    Label ok;
-    b(&ok);
-    Stop("Write barrier verification failed");
-    Bind(&ok);
-    // Write new value.
-    str(new_value, address);
-    sub(base, base, shadow_offset);
-    str(new_value, address);
-    PopList(used);
-  } else {
-    str(new_value, address);
+void Assembler::VerifiedWrite(const Address& address,
+                              Register new_value,
+                              FieldContent old_content) {
+#if defined(DEBUG)
+  ASSERT(address.mode() == Address::Offset ||
+         address.mode() == Address::NegOffset);
+  // Allocate temporary registers (and check for register collisions).
+  RegList used = 0;
+  UseRegister(new_value, &used);
+  Register base = UseRegister(address.rn(), &used);
+  if (address.rm() != kNoRegister) {
+    UseRegister(address.rm(), &used);
   }
+  Register old_value = AllocateRegister(&used);
+  Register temp = AllocateRegister(&used);
+  PushList(used);
+  ldr(old_value, address);
+  // First check that 'old_value' contains 'old_content'.
+  // Smi test.
+  tst(old_value, Operand(kHeapObjectTag));
+  Label ok;
+  switch (old_content) {
+    case kOnlySmi:
+      b(&ok, EQ);  // Smi is OK.
+      Stop("Expected smi.");
+      break;
+    case kHeapObjectOrSmi:
+      b(&ok, EQ);  // Smi is OK.
+      // Non-smi case: Verify object pointer is word-aligned when untagged.
+      COMPILE_ASSERT(kHeapObjectTag == 1);
+      tst(old_value, Operand((kWordSize - 1) - kHeapObjectTag));
+      b(&ok, EQ);
+      Stop("Expected heap object or Smi");
+      break;
+    case kEmptyOrSmiOrNull:
+      b(&ok, EQ);  // Smi is OK.
+      // Non-smi case: Check for the special zap word or null.
+      // Note: Cannot use CompareImmediate, since IP may be in use.
+      LoadImmediate(temp, Heap::kZap32Bits);
+      cmp(old_value, Operand(temp));
+      b(&ok, EQ);
+      LoadImmediate(temp, reinterpret_cast<uint32_t>(Object::null()));
+      cmp(old_value, Operand(temp));
+      b(&ok, EQ);
+      Stop("Expected zapped, Smi or null");
+      break;
+    default:
+      UNREACHABLE();
+  }
+  Bind(&ok);
+  if (VerifiedMemory::enabled()) {
+    Operand shadow_offset(GetVerifiedMemoryShadow());
+    // Adjust the address to shadow.
+    add(base, base, shadow_offset);
+    ldr(temp, address);
+    cmp(old_value, Operand(temp));
+    Label match;
+    b(&match, EQ);
+    Stop("Write barrier verification failed");
+    Bind(&match);
+    // Write new value in shadow.
+    str(new_value, address);
+    // Restore original address.
+    sub(base, base, shadow_offset);
+  }
+  str(new_value, address);
+  PopList(used);
+#else
+  str(new_value, address);
+#endif  // DEBUG
 }
 
 
@@ -1738,7 +1778,7 @@
                                 Register value,
                                 bool can_value_be_smi) {
   ASSERT(object != value);
-  VerifiedWrite(dest, value);
+  VerifiedWrite(dest, value, kHeapObjectOrSmi);
   Label done;
   if (can_value_be_smi) {
     StoreIntoObjectFilter(object, value, &done);
@@ -1778,8 +1818,9 @@
 
 void Assembler::StoreIntoObjectNoBarrier(Register object,
                                          const Address& dest,
-                                         Register value) {
-  VerifiedWrite(dest, value);
+                                         Register value,
+                                         FieldContent old_content) {
+  VerifiedWrite(dest, value, old_content);
 #if defined(DEBUG)
   Label done;
   StoreIntoObjectFilter(object, value, &done);
@@ -1792,37 +1833,42 @@
 
 void Assembler::StoreIntoObjectNoBarrierOffset(Register object,
                                                int32_t offset,
-                                               Register value) {
+                                               Register value,
+                                               FieldContent old_content) {
   int32_t ignored = 0;
   if (Address::CanHoldStoreOffset(kWord, offset - kHeapObjectTag, &ignored)) {
-    StoreIntoObjectNoBarrier(object, FieldAddress(object, offset), value);
+    StoreIntoObjectNoBarrier(object, FieldAddress(object, offset), value,
+                             old_content);
   } else {
     AddImmediate(IP, object, offset - kHeapObjectTag);
-    StoreIntoObjectNoBarrier(object, Address(IP), value);
+    StoreIntoObjectNoBarrier(object, Address(IP), value, old_content);
   }
 }
 
 
 void Assembler::StoreIntoObjectNoBarrier(Register object,
                                          const Address& dest,
-                                         const Object& value) {
+                                         const Object& value,
+                                         FieldContent old_content) {
   ASSERT(value.IsSmi() || value.InVMHeap() ||
          (value.IsOld() && value.IsNotTemporaryScopedHandle()));
   // No store buffer update.
   LoadObject(IP, value);
-  VerifiedWrite(dest, IP);
+  VerifiedWrite(dest, IP, old_content);
 }
 
 
 void Assembler::StoreIntoObjectNoBarrierOffset(Register object,
                                                int32_t offset,
-                                               const Object& value) {
+                                               const Object& value,
+                                               FieldContent old_content) {
   int32_t ignored = 0;
   if (Address::CanHoldStoreOffset(kWord, offset - kHeapObjectTag, &ignored)) {
-    StoreIntoObjectNoBarrier(object, FieldAddress(object, offset), value);
+    StoreIntoObjectNoBarrier(object, FieldAddress(object, offset), value,
+                             old_content);
   } else {
     AddImmediate(IP, object, offset - kHeapObjectTag);
-    StoreIntoObjectNoBarrier(object, Address(IP), value);
+    StoreIntoObjectNoBarrier(object, Address(IP), value, old_content);
   }
 }
 
@@ -1879,15 +1925,14 @@
 
 
 void Assembler::StoreIntoSmiField(const Address& dest, Register value) {
-  // TODO(koda): Verify previous value was Smi.
-  VerifiedWrite(dest, value);
 #if defined(DEBUG)
   Label done;
   tst(value, Operand(kHeapObjectTag));
   b(&done, EQ);
-  Stop("Smi expected");
+  Stop("New value must be Smi.");
   Bind(&done);
 #endif  // defined(DEBUG)
+  VerifiedWrite(dest, value, kOnlySmi);
 }
 
 
@@ -3506,12 +3551,15 @@
     ASSERT(Isolate::Current() != Dart::vm_isolate());
     object_pool_ = GrowableObjectArray::New(Heap::kOld);
   }
-  for (intptr_t i = 0; i < object_pool_.Length(); i++) {
-    if (object_pool_.At(i) == obj.raw()) {
-      return i;
-    }
+
+  intptr_t index = object_pool_index_table_.Lookup(&obj);
+  if (index != ObjIndexPair::kNoIndex) {
+    return index;
   }
+
   object_pool_.Add(obj, Heap::kOld);
+  object_pool_index_table_.Insert(
+      ObjIndexPair(&obj, object_pool_.Length() - 1));
   return object_pool_.Length() - 1;
 }
 
diff --git a/runtime/vm/assembler_arm.h b/runtime/vm/assembler_arm.h
index 07d1bdb..c9f1c11 100644
--- a/runtime/vm/assembler_arm.h
+++ b/runtime/vm/assembler_arm.h
@@ -13,6 +13,7 @@
 #include "platform/utils.h"
 #include "vm/constants_arm.h"
 #include "vm/cpu.h"
+#include "vm/hash_map.h"
 #include "vm/object.h"
 #include "vm/simulator.h"
 
@@ -642,10 +643,12 @@
                                DRegister dtmp0, DRegister dtmp1,
                                Label* overflow);
 
-  // Load and Store. May clobber IP.
+  // Load and Store.
+  // These three do not clobber IP.
   void LoadPatchableImmediate(Register rd, int32_t value, Condition cond = AL);
   void LoadDecodableImmediate(Register rd, int32_t value, Condition cond = AL);
   void LoadImmediate(Register rd, int32_t value, Condition cond = AL);
+  // These two may clobber IP.
   void LoadSImmediate(SRegister sd, float value, Condition cond = AL);
   void LoadDImmediate(DRegister dd, double value,
                       Register scratch, Condition cond = AL);
@@ -662,6 +665,14 @@
   void PushObject(const Object& object);
   void CompareObject(Register rn, const Object& object);
 
+  // When storing into a heap object field, knowledge of the previous content
+  // is expressed through these constants.
+  enum FieldContent {
+    kEmptyOrSmiOrNull,  // Empty = garbage/zapped in release/debug mode.
+    kHeapObjectOrSmi,
+    kOnlySmi,
+  };
+
   void StoreIntoObject(Register object,  // Object we are storing into.
                        const Address& dest,  // Where we are storing into.
                        Register value,  // Value we are storing.
@@ -673,16 +684,27 @@
 
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
-                                Register value);
-  void StoreIntoObjectNoBarrierOffset(Register object,
-                                      int32_t offset,
-                                      Register value);
+                                Register value,
+                                FieldContent old_content = kHeapObjectOrSmi);
+  void InitializeFieldNoBarrier(Register object,
+                                const Address& dest,
+                                Register value) {
+    StoreIntoObjectNoBarrier(object, dest, value, kEmptyOrSmiOrNull);
+  }
+  void StoreIntoObjectNoBarrierOffset(
+      Register object,
+      int32_t offset,
+      Register value,
+      FieldContent old_content = kHeapObjectOrSmi);
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
-                                const Object& value);
-  void StoreIntoObjectNoBarrierOffset(Register object,
-                                      int32_t offset,
-                                      const Object& value);
+                                const Object& value,
+                                FieldContent old_content = kHeapObjectOrSmi);
+  void StoreIntoObjectNoBarrierOffset(
+      Register object,
+      int32_t offset,
+      const Object& value,
+      FieldContent old_content = kHeapObjectOrSmi);
 
   // Store value_even, value_odd, value_even, ... into the words in the address
   // range [begin, end), assumed to be uninitialized fields in object (tagged).
@@ -938,6 +960,10 @@
  private:
   AssemblerBuffer buffer_;  // Contains position independent code.
   GrowableObjectArray& object_pool_;  // Objects and patchable jump targets.
+
+  // Hashmap for fast lookup in object pool.
+  DirectChainedHashMap<ObjIndexPair> object_pool_index_table_;
+
   int32_t prologue_offset_;
 
   bool use_far_branches_;
@@ -1096,7 +1122,9 @@
                               Condition cond = AL);
   // Writes new_value to address and its shadow location, if enabled, after
   // verifying that its old value matches its shadow.
-  void VerifiedWrite(const Address& address, Register new_value);
+  void VerifiedWrite(const Address& address,
+                     Register new_value,
+                     FieldContent old_content);
 
   DISALLOW_ALLOCATION();
   DISALLOW_COPY_AND_ASSIGN(Assembler);
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc
index d56cb3c..5320242 100644
--- a/runtime/vm/assembler_arm64.cc
+++ b/runtime/vm/assembler_arm64.cc
@@ -40,16 +40,15 @@
     // at the same index.
     object_pool_.Add(Object::null_object(), Heap::kOld);
     patchable_pool_entries_.Add(kNotPatchable);
-    // Not adding Object::null() to the index table. It is at index 0 in the
-    // object pool, but the HashMap uses 0 to indicate not found.
+    object_pool_index_table_.Insert(ObjIndexPair(&Object::null_object(), 0));
 
     object_pool_.Add(Bool::True(), Heap::kOld);
     patchable_pool_entries_.Add(kNotPatchable);
-    object_pool_index_table_.Insert(ObjIndexPair(Bool::True().raw(), 1));
+    object_pool_index_table_.Insert(ObjIndexPair(&Bool::True(), 1));
 
     object_pool_.Add(Bool::False(), Heap::kOld);
     patchable_pool_entries_.Add(kNotPatchable);
-    object_pool_index_table_.Insert(ObjIndexPair(Bool::False().raw(), 2));
+    object_pool_index_table_.Insert(ObjIndexPair(&Bool::False(), 2));
 
     const Smi& vacant = Smi::Handle(Smi::New(0xfa >> kSmiTagShift));
     StubCode* stub_code = Isolate::Current()->stub_code();
@@ -455,15 +454,8 @@
   // If the object is not patchable, check if we've already got it in the
   // object pool.
   if (patchable == kNotPatchable) {
-    // Special case for Object::null(), which is always at object_pool_ index 0
-    // because Lookup() below returns 0 when the object is not mapped in the
-    // table.
-    if (obj.raw() == Object::null()) {
-      return 0;
-    }
-
-    intptr_t idx = object_pool_index_table_.Lookup(obj.raw());
-    if (idx != 0) {
+    intptr_t idx = object_pool_index_table_.Lookup(&obj);
+    if (idx != ObjIndexPair::kNoIndex) {
       ASSERT(patchable_pool_entries_[idx] == kNotPatchable);
       return idx;
     }
@@ -474,7 +466,7 @@
   if (patchable == kNotPatchable) {
     // The object isn't patchable. Record the index for fast lookup.
     object_pool_index_table_.Insert(
-        ObjIndexPair(obj.raw(), object_pool_.Length() - 1));
+        ObjIndexPair(&obj, object_pool_.Length() - 1));
   }
   return object_pool_.Length() - 1;
 }
@@ -511,10 +503,7 @@
   }
   ASSERT(object.IsNotTemporaryScopedHandle());
   ASSERT(object.IsOld());
-  return (Isolate::Current() != Dart::vm_isolate()) &&
-         // Not in the VMHeap, OR is one of the VMHeap objects we put in every
-         // object pool.
-         (!object.InVMHeap() || IsAlwaysInConstantPool(object));
+  return (Isolate::Current() != Dart::vm_isolate());
 }
 
 
diff --git a/runtime/vm/assembler_arm64.h b/runtime/vm/assembler_arm64.h
index a5755a6..cd934ac 100644
--- a/runtime/vm/assembler_arm64.h
+++ b/runtime/vm/assembler_arm64.h
@@ -1430,44 +1430,6 @@
   // Patchability of pool entries.
   GrowableArray<Patchability> patchable_pool_entries_;
 
-  // Pair type parameter for DirectChainedHashMap.
-  class ObjIndexPair {
-   public:
-    // TODO(zra): A WeakTable should be used here instead, but then it would
-    // also have to be possible to register and de-register WeakTables with the
-    // heap. Also, the Assembler would need to become a StackResource.
-    // Issue 13305. In the meantime...
-    // CAUTION: the RawObject* below is only safe because:
-    // The HashMap that will use this pair type will not contain any RawObject*
-    // keys that are not in the object_pool_ array. Since the keys will be
-    // visited by the GC when it visits the object_pool_, and since all objects
-    // in the object_pool_ are Old (and so will not be moved) the GC does not
-    // also need to visit the keys here in the HashMap.
-
-    // Typedefs needed for the DirectChainedHashMap template.
-    typedef RawObject* Key;
-    typedef intptr_t Value;
-    typedef ObjIndexPair Pair;
-
-    ObjIndexPair(Key key, Value value) : key_(key), value_(value) { }
-
-    static Key KeyOf(Pair kv) { return kv.key_; }
-
-    static Value ValueOf(Pair kv) { return kv.value_; }
-
-    static intptr_t Hashcode(Key key) {
-      return reinterpret_cast<intptr_t>(key) >> kObjectAlignmentLog2;
-    }
-
-    static inline bool IsKeyEqual(Pair kv, Key key) {
-      return kv.key_ == key;
-    }
-
-   private:
-    Key key_;
-    Value value_;
-  };
-
   // Hashmap for fast lookup in object pool.
   DirectChainedHashMap<ObjIndexPair> object_pool_index_table_;
 
diff --git a/runtime/vm/assembler_mips.cc b/runtime/vm/assembler_mips.cc
index f6a6220..b07004d 100644
--- a/runtime/vm/assembler_mips.cc
+++ b/runtime/vm/assembler_mips.cc
@@ -486,12 +486,15 @@
     ASSERT(Isolate::Current() != Dart::vm_isolate());
     object_pool_ = GrowableObjectArray::New(Heap::kOld);
   }
-  for (intptr_t i = 0; i < object_pool_.Length(); i++) {
-    if (object_pool_.At(i) == obj.raw()) {
-      return i;
-    }
+
+  intptr_t index = object_pool_index_table_.Lookup(&obj);
+  if (index != ObjIndexPair::kNoIndex) {
+    return index;
   }
+
   object_pool_.Add(obj, Heap::kOld);
+  object_pool_index_table_.Insert(
+      ObjIndexPair(&obj, object_pool_.Length() - 1));
   return object_pool_.Length() - 1;
 }
 
diff --git a/runtime/vm/assembler_mips.h b/runtime/vm/assembler_mips.h
index 54e84d8..2c0f3bb 100644
--- a/runtime/vm/assembler_mips.h
+++ b/runtime/vm/assembler_mips.h
@@ -12,6 +12,7 @@
 #include "platform/assert.h"
 #include "platform/utils.h"
 #include "vm/constants_mips.h"
+#include "vm/hash_map.h"
 #include "vm/object.h"
 #include "vm/simulator.h"
 
@@ -1613,6 +1614,10 @@
  private:
   AssemblerBuffer buffer_;
   GrowableObjectArray& object_pool_;  // Objects and patchable jump targets.
+
+  // Hashmap for fast lookup in object pool.
+  DirectChainedHashMap<ObjIndexPair> object_pool_index_table_;
+
   intptr_t prologue_offset_;
 
   bool use_far_branches_;
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index 169db47..8205ce8 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -8,6 +8,7 @@
 #include "vm/assembler.h"
 #include "vm/cpu.h"
 #include "vm/heap.h"
+#include "vm/instructions.h"
 #include "vm/locations.h"
 #include "vm/memory_region.h"
 #include "vm/runtime_entry.h"
@@ -37,16 +38,15 @@
     // at the same index.
     object_pool_.Add(Object::null_object(), Heap::kOld);
     patchable_pool_entries_.Add(kNotPatchable);
-    // Not adding Object::null() to the index table. It is at index 0 in the
-    // object pool, but the HashMap uses 0 to indicate not found.
+    object_pool_index_table_.Insert(ObjIndexPair(&Object::null_object(), 0));
 
     object_pool_.Add(Bool::True(), Heap::kOld);
     patchable_pool_entries_.Add(kNotPatchable);
-    object_pool_index_table_.Insert(ObjIndexPair(Bool::True().raw(), 1));
+    object_pool_index_table_.Insert(ObjIndexPair(&Bool::True(), 1));
 
     object_pool_.Add(Bool::False(), Heap::kOld);
     patchable_pool_entries_.Add(kNotPatchable);
-    object_pool_index_table_.Insert(ObjIndexPair(Bool::False().raw(), 2));
+    object_pool_index_table_.Insert(ObjIndexPair(&Bool::False(), 2));
 
     const Smi& vacant = Smi::Handle(Smi::New(0xfa >> kSmiTagShift));
 
@@ -2397,6 +2397,17 @@
   EmitUint8(0xD0 | (reg & 7));
 }
 
+
+void Assembler::bsrq(Register dst, Register src) {
+  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  Operand operand(src);
+  EmitOperandREX(dst, operand, REX_W);
+  EmitUint8(0x0F);
+  EmitUint8(0xBD);
+  EmitOperand(dst & 7, operand);
+}
+
+
 void Assembler::btq(Register base, Register offset) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   Operand operand(base);
@@ -2559,6 +2570,14 @@
 }
 
 
+void Assembler::jmp(const Address& dst) {
+  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  EmitOperandREX(4, dst, REX_NONE);
+  EmitUint8(0xFF);
+  EmitOperand(4, dst);
+}
+
+
 void Assembler::jmp(Label* label, bool near) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   if (VerifiedMemory::enabled()) {
@@ -2600,15 +2619,18 @@
 void Assembler::JmpPatchable(const ExternalLabel* label, Register pp) {
   ASSERT(allow_constant_pool());
   intptr_t call_start = buffer_.GetPosition();
-  LoadExternalLabel(TMP, label, kPatchable, pp);
-  jmp(TMP);
-  ASSERT((buffer_.GetPosition() - call_start) == kJmpExternalLabelSize);
+  const int32_t offset =
+      Array::element_offset(FindExternalLabel(label, kPatchable));
+  // Patchable jumps always use a 32-bit immediate encoding.
+  jmp(Address::AddressBaseImm32(pp, offset - kHeapObjectTag));
+  ASSERT((buffer_.GetPosition() - call_start) == JumpPattern::kLengthInBytes);
 }
 
 
 void Assembler::Jmp(const ExternalLabel* label, Register pp) {
-  LoadExternalLabel(TMP, label, kNotPatchable, pp);
-  jmp(TMP);
+  const int32_t offset =
+      Array::element_offset(FindExternalLabel(label, kNotPatchable));
+  jmp(Address(pp, offset - kHeapObjectTag));
 }
 
 
@@ -2772,15 +2794,8 @@
   // If the object is not patchable, check if we've already got it in the
   // object pool.
   if (patchable == kNotPatchable) {
-    // Special case for Object::null(), which is always at object_pool_ index 0
-    // because Lookup() below returns 0 when the object is not mapped in the
-    // table.
-    if (obj.raw() == Object::null()) {
-      return 0;
-    }
-
-    intptr_t idx = object_pool_index_table_.Lookup(obj.raw());
-    if (idx != 0) {
+    intptr_t idx = object_pool_index_table_.Lookup(&obj);
+    if (idx != ObjIndexPair::kNoIndex) {
       ASSERT(patchable_pool_entries_[idx] == kNotPatchable);
       return idx;
     }
@@ -2791,7 +2806,7 @@
   if (patchable == kNotPatchable) {
     // The object isn't patchable. Record the index for fast lookup.
     object_pool_index_table_.Insert(
-        ObjIndexPair(obj.raw(), object_pool_.Length() - 1));
+        ObjIndexPair(&obj, object_pool_.Length() - 1));
   }
   return object_pool_.Length() - 1;
 }
@@ -2842,10 +2857,7 @@
   }
   ASSERT(object.IsNotTemporaryScopedHandle());
   ASSERT(object.IsOld());
-  return (Isolate::Current() != Dart::vm_isolate()) &&
-         // Not in the VMHeap, OR is one of the VMHeap objects we put in every
-         // object pool.
-         (!object.InVMHeap() || IsAlwaysInConstantPool(object));
+  return (Isolate::Current() != Dart::vm_isolate());
 }
 
 
@@ -3416,61 +3428,26 @@
 
 
 void Assembler::LoadPoolPointer(Register pp) {
-  Label next;
-  call(&next);
-  Bind(&next);
-
   // Load new pool pointer.
+  const intptr_t kRIPRelativeMovqSize = 7;
+  const intptr_t entry_to_rip_offset = CodeSize() + kRIPRelativeMovqSize;
   const intptr_t object_pool_pc_dist =
-      Instructions::HeaderSize() - Instructions::object_pool_offset() +
-      CodeSize();
-  popq(pp);
-  movq(pp, Address(pp, -object_pool_pc_dist));
-}
-
-
-void Assembler::EnterDartFrame(intptr_t frame_size) {
-  EnterFrame(0);
-
-  Label dart_entry;
-  call(&dart_entry);
-  Bind(&dart_entry);
-  // The runtime system assumes that the code marker address is
-  // kEntryPointToPcMarkerOffset bytes from the entry.  If there is any code
-  // generated before entering the frame, the address needs to be adjusted.
-  const intptr_t object_pool_pc_dist =
-      Instructions::HeaderSize() - Instructions::object_pool_offset() +
-      CodeSize();
-  const intptr_t offset = EntryPointToPcMarkerOffset() - CodeSize();
-  if (offset != 0) {
-    addq(Address(RSP, 0), Immediate(offset));
-  }
-  // Save caller's pool pointer
-  pushq(PP);
-
-  // Load callee's pool pointer.
-  movq(PP, Address(RSP, 1 * kWordSize));
-  movq(PP, Address(PP, -object_pool_pc_dist - offset));
-
-  if (frame_size != 0) {
-    subq(RSP, Immediate(frame_size));
-  }
+      Instructions::HeaderSize() - Instructions::object_pool_offset();
+  movq(pp, Address::AddressRIPRelative(
+      -entry_to_rip_offset - object_pool_pc_dist));
+  ASSERT(CodeSize() == entry_to_rip_offset);
 }
 
 
 void Assembler::EnterDartFrameWithInfo(intptr_t frame_size,
                                        Register new_pp,
                                        Register pc_marker_override) {
-  if (pc_marker_override == kNoRegister) {
-    EnterDartFrame(frame_size);
-  } else {
-    EnterFrame(0);
-    pushq(pc_marker_override);
-    pushq(PP);
-    movq(PP, new_pp);
-    if (frame_size != 0) {
-      subq(RSP, Immediate(frame_size));
-    }
+  EnterFrame(0);
+  pushq(pc_marker_override);
+  pushq(PP);
+  movq(PP, new_pp);
+  if (frame_size != 0) {
+    subq(RSP, Immediate(frame_size));
   }
 }
 
@@ -3490,30 +3467,8 @@
 void Assembler::EnterOsrFrame(intptr_t extra_size,
                               Register new_pp,
                               Register pc_marker_override) {
-  if (pc_marker_override == kNoRegister) {
-    Label dart_entry;
-    call(&dart_entry);
-    Bind(&dart_entry);
-    // The runtime system assumes that the code marker address is
-    // kEntryPointToPcMarkerOffset bytes from the entry.  Since there is no
-    // code to set up the frame pointer, the address needs to be adjusted.
-    const intptr_t object_pool_pc_dist =
-        Instructions::HeaderSize() - Instructions::object_pool_offset() +
-        CodeSize();
-    const intptr_t offset = EntryPointToPcMarkerOffset() - CodeSize();
-    if (offset != 0) {
-      addq(Address(RSP, 0), Immediate(offset));
-    }
-
-    // Load callee's pool pointer.
-    movq(PP, Address(RSP, 0));
-    movq(PP, Address(PP, -object_pool_pc_dist - offset));
-
-    popq(Address(RBP, kPcMarkerSlotFromFp * kWordSize));
-  } else {
-    movq(Address(RBP, kPcMarkerSlotFromFp * kWordSize), pc_marker_override);
-    movq(PP, new_pp);
-  }
+  movq(Address(RBP, kPcMarkerSlotFromFp * kWordSize), pc_marker_override);
+  movq(PP, new_pp);
   if (extra_size != 0) {
     subq(RSP, Immediate(extra_size));
   }
@@ -3651,7 +3606,7 @@
   if (FLAG_inline_alloc) {
     Isolate* isolate = Isolate::Current();
     Heap* heap = isolate->heap();
-    Heap::Space space = heap->SpaceForAllocation(kArrayCid);
+    Heap::Space space = heap->SpaceForAllocation(cid);
     movq(instance, Immediate(heap->TopAddress(space)));
     movq(instance, Address(instance, 0));
     movq(end_address, RAX);
@@ -3671,7 +3626,7 @@
     movq(TMP, Immediate(heap->TopAddress(space)));
     movq(Address(TMP, 0), end_address);
     addq(instance, Immediate(kHeapObjectTag));
-    UpdateAllocationStatsWithSize(kArrayCid, instance_size, space);
+    UpdateAllocationStatsWithSize(cid, instance_size, space);
 
     // Initialize the tags.
     // instance: new object start as a tagged pointer.
diff --git a/runtime/vm/assembler_x64.h b/runtime/vm/assembler_x64.h
index 580a248..9b1da4d 100644
--- a/runtime/vm/assembler_x64.h
+++ b/runtime/vm/assembler_x64.h
@@ -224,6 +224,9 @@
     return *this;
   }
 
+  static Address AddressRIPRelative(int32_t disp) {
+    return Address(RIPRelativeDisp(disp));
+  }
   static Address AddressBaseImm32(Register base, int32_t disp) {
     return Address(base, disp, true);
   }
@@ -240,6 +243,16 @@
     }
     SetDisp32(disp);
   }
+
+  struct RIPRelativeDisp {
+    explicit RIPRelativeDisp(int32_t disp) : disp_(disp) { }
+    const int32_t disp_;
+  };
+
+  explicit Address(const RIPRelativeDisp& disp) {
+    SetModRM(0, static_cast<Register>(0x5));
+    SetDisp32(disp.disp_);
+  }
 };
 
 
@@ -353,7 +366,6 @@
   void call(const ExternalLabel* label);
 
   static const intptr_t kCallExternalLabelSize = 7;
-  static const intptr_t kJmpExternalLabelSize = 10;
 
   void pushq(Register reg);
   void pushq(const Address& address);
@@ -629,6 +641,8 @@
   void notl(Register reg);
   void notq(Register reg);
 
+  void bsrq(Register dst, Register src);
+
   void btq(Register base, Register offset);
 
   void enter(const Immediate& imm);
@@ -669,6 +683,7 @@
   void j(Condition condition, const ExternalLabel* label);
 
   void jmp(Register reg);
+  void jmp(const Address& address);
   // Note: verified_mem mode forces far jumps.
   void jmp(Label* label, bool near = kFarJump);
   void jmp(const ExternalLabel* label);
@@ -952,7 +967,7 @@
   //   movq rbp, rsp      (size is 3 bytes)
   //   call L             (size is 5 bytes)
   //   L:
-  static const intptr_t kEntryPointToPcMarkerOffset = 9;
+  static const intptr_t kEntryPointToPcMarkerOffset = 0;
   static intptr_t EntryPointToPcMarkerOffset() {
     return kEntryPointToPcMarkerOffset;
   }
@@ -1023,44 +1038,6 @@
   // Patchability of pool entries.
   GrowableArray<Patchability> patchable_pool_entries_;
 
-  // Pair type parameter for DirectChainedHashMap.
-  class ObjIndexPair {
-   public:
-    // TODO(zra): A WeakTable should be used here instead, but then it would
-    // also have to be possible to register and de-register WeakTables with the
-    // heap. Also, the Assembler would need to become a StackResource.
-    // Issue 13305. In the meantime...
-    // CAUTION: the RawObject* below is only safe because:
-    // The HashMap that will use this pair type will not contain any RawObject*
-    // keys that are not in the object_pool_ array. Since the keys will be
-    // visited by the GC when it visits the object_pool_, and since all objects
-    // in the object_pool_ are Old (and so will not be moved) the GC does not
-    // also need to visit the keys here in the HashMap.
-
-    // Typedefs needed for the DirectChainedHashMap template.
-    typedef RawObject* Key;
-    typedef intptr_t Value;
-    typedef ObjIndexPair Pair;
-
-    ObjIndexPair(Key key, Value value) : key_(key), value_(value) { }
-
-    static Key KeyOf(Pair kv) { return kv.key_; }
-
-    static Value ValueOf(Pair kv) { return kv.value_; }
-
-    static intptr_t Hashcode(Key key) {
-      return reinterpret_cast<intptr_t>(key) >> kObjectAlignmentLog2;
-    }
-
-    static inline bool IsKeyEqual(Pair kv, Key key) {
-      return kv.key_ == key;
-    }
-
-   private:
-    Key key_;
-    Value value_;
-  };
-
   // Hashmap for fast lookup in object pool.
   DirectChainedHashMap<ObjIndexPair> object_pool_index_table_;
 
diff --git a/runtime/vm/assembler_x64_test.cc b/runtime/vm/assembler_x64_test.cc
index a62341e..eafb765 100644
--- a/runtime/vm/assembler_x64_test.cc
+++ b/runtime/vm/assembler_x64_test.cc
@@ -620,9 +620,9 @@
 
 
 ASSEMBLER_TEST_GENERATE(Negate, assembler) {
-  __ movl(RCX, Immediate(42));
-  __ negl(RCX);
-  __ movl(RAX, RCX);
+  __ movq(RCX, Immediate(42));
+  __ negq(RCX);
+  __ movq(RAX, RCX);
   __ ret();
 }
 
@@ -633,6 +633,29 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(BitScanReverse, assembler) {
+  __ pushq(CallingConventions::kArg1Reg);
+  __ movq(RCX, Address(RSP, 0));
+  __ movq(RAX, Immediate(666));  // Marker for conditional write.
+  __ bsrq(RAX, RCX);
+  __ popq(RCX);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(BitScanReverse, test) {
+  typedef int (*Bsr)(int input);
+  Bsr call = reinterpret_cast<Bsr>(test->entry());
+  EXPECT_EQ(666, call(0));
+  EXPECT_EQ(0, call(1));
+  EXPECT_EQ(1, call(2));
+  EXPECT_EQ(1, call(3));
+  EXPECT_EQ(2, call(4));
+  EXPECT_EQ(5, call(42));
+  EXPECT_EQ(31, call(-1));
+}
+
+
 ASSEMBLER_TEST_GENERATE(MoveExtend, assembler) {
   __ movq(RDX, Immediate(0xffff));
   __ movzxb(RAX, RDX);  // RAX = 0xff
@@ -1808,6 +1831,20 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(JumpIndirect, assembler) {
+  ExternalLabel call1(reinterpret_cast<uword>(LeafReturn42));
+  __ movq(Address(CallingConventions::kArg1Reg, 0), Immediate(call1.address()));
+  __ jmp(Address(CallingConventions::kArg1Reg, 0));
+}
+
+
+ASSEMBLER_TEST_RUN(JumpIndirect, test) {
+  uword temp = 0;
+  typedef int (*JumpIndirect)(uword*);
+  EXPECT_EQ(42, reinterpret_cast<JumpIndirect>(test->entry())(&temp));
+}
+
+
 ASSEMBLER_TEST_GENERATE(SingleFPMoves, assembler) {
   __ movq(RAX, Immediate(bit_cast<int32_t, float>(234.0f)));
   __ movd(XMM0, RAX);
diff --git a/runtime/vm/ast_transformer.cc b/runtime/vm/ast_transformer.cc
index bbc26e1..ccb1333 100644
--- a/runtime/vm/ast_transformer.cc
+++ b/runtime/vm/ast_transformer.cc
@@ -6,11 +6,12 @@
 
 #include "vm/object_store.h"
 #include "vm/parser.h"
+#include "vm/thread.h"
 
 namespace dart {
 
-// Quick access to the locally defined isolate() method.
-#define I (isolate())
+// Quick access to the current zone.
+#define Z (thread()->zone())
 
 // Nodes that are unreachable from already parsed expressions.
 #define FOR_EACH_UNREACHABLE_NODE(V)                                           \
@@ -50,7 +51,7 @@
       temp_cnt_(0),
       parsed_function_(parsed_function),
       function_top_(function_top),
-      isolate_(Isolate::Current()) {
+      thread_(Thread::Current()) {
   ASSERT(function_top_ != NULL);
 }
 
@@ -64,14 +65,14 @@
 LocalVariable* AwaitTransformer::EnsureCurrentTempVar() {
   const char* await_temp_prefix = ":await_temp_var_";
   const String& cnt_str = String::ZoneHandle(
-      I, String::NewFormatted("%s%d", await_temp_prefix, temp_cnt_));
-  const String& symbol = String::ZoneHandle(I, Symbols::New(cnt_str));
+      Z, String::NewFormatted("%s%d", await_temp_prefix, temp_cnt_));
+  const String& symbol = String::ZoneHandle(Z, Symbols::New(cnt_str));
   ASSERT(!symbol.IsNull());
   // Look up the variable through the preamble scope.
   LocalVariable* await_tmp = preamble_->scope()->LookupVariable(symbol, false);
   if (await_tmp == NULL) {
     // If we need a new temp variable, we add it to the function's top scope.
-    await_tmp = new (I) LocalVariable(
+    await_tmp = new (Z) LocalVariable(
         Scanner::kNoSourcePos, symbol, Type::ZoneHandle(Type::DynamicType()));
     function_top_->AddVariable(await_tmp);
     // After adding it to the top scope, we can look it up from the preamble.
@@ -92,7 +93,7 @@
 
 LocalVariable* AwaitTransformer::AddToPreambleNewTempVar(AstNode* node) {
   LocalVariable* tmp_var = EnsureCurrentTempVar();
-  preamble_->Add(new(I) StoreLocalNode(Scanner::kNoSourcePos, tmp_var, node));
+  preamble_->Add(new(Z) StoreLocalNode(Scanner::kNoSourcePos, tmp_var, node));
   NextTempVar();
   return tmp_var;
 }
@@ -104,7 +105,7 @@
 
 
 void AwaitTransformer::VisitTypeNode(TypeNode* node) {
-  result_ = new(I) TypeNode(node->token_pos(), node->type());
+  result_ = new(Z) TypeNode(node->token_pos(), node->type());
 }
 
 
@@ -132,117 +133,117 @@
       preamble_->scope(), Symbols::AsyncOperationErrorParam());
 
   AstNode* transformed_expr = Transform(node->expr());
-  preamble_->Add(new(I) StoreLocalNode(
+  preamble_->Add(new(Z) StoreLocalNode(
       Scanner::kNoSourcePos, result_param, transformed_expr));
 
-  LoadLocalNode* load_result_param = new(I) LoadLocalNode(
+  LoadLocalNode* load_result_param = new(Z) LoadLocalNode(
       Scanner::kNoSourcePos, result_param);
 
   const Class& future_cls =
-      Class::ZoneHandle(I, I->object_store()->future_class());
+      Class::ZoneHandle(Z, thread()->isolate()->object_store()->future_class());
   ASSERT(!future_cls.IsNull());
   const AbstractType& future_type =
-      AbstractType::ZoneHandle(I, future_cls.RareType());
+      AbstractType::ZoneHandle(Z, future_cls.RareType());
   ASSERT(!future_type.IsNull());
 
   LocalScope* is_not_future_scope = ChainNewScope(preamble_->scope());
   SequenceNode* is_not_future_branch =
-      new (I) SequenceNode(Scanner::kNoSourcePos, is_not_future_scope);
+      new (Z) SequenceNode(Scanner::kNoSourcePos, is_not_future_scope);
 
   // if (:result_param is !Future) {
   //   :result_param = Future.value(:result_param);
   // }
   const Function& value_ctor = Function::ZoneHandle(
-      I, future_cls.LookupFunction(Symbols::FutureValue()));
+      Z, future_cls.LookupFunction(Symbols::FutureValue()));
   ASSERT(!value_ctor.IsNull());
-  ArgumentListNode* ctor_args = new (I) ArgumentListNode(Scanner::kNoSourcePos);
-  ctor_args->Add(new (I) LoadLocalNode(Scanner::kNoSourcePos, result_param));
+  ArgumentListNode* ctor_args = new (Z) ArgumentListNode(Scanner::kNoSourcePos);
+  ctor_args->Add(new (Z) LoadLocalNode(Scanner::kNoSourcePos, result_param));
   ConstructorCallNode* ctor_call =
-      new (I) ConstructorCallNode(Scanner::kNoSourcePos,
-                                  TypeArguments::ZoneHandle(I),
+      new (Z) ConstructorCallNode(Scanner::kNoSourcePos,
+                                  TypeArguments::ZoneHandle(Z),
                                   value_ctor,
                                   ctor_args);
-  is_not_future_branch->Add(new (I) StoreLocalNode(
+  is_not_future_branch->Add(new (Z) StoreLocalNode(
       Scanner::kNoSourcePos, result_param, ctor_call));
-  AstNode* is_not_future_test = new (I) ComparisonNode(
+  AstNode* is_not_future_test = new (Z) ComparisonNode(
       Scanner::kNoSourcePos,
       Token::kISNOT,
       load_result_param,
-      new (I) TypeNode(Scanner::kNoSourcePos, future_type));
-  preamble_->Add(new(I) IfNode(Scanner::kNoSourcePos,
+      new (Z) TypeNode(Scanner::kNoSourcePos, future_type));
+  preamble_->Add(new(Z) IfNode(Scanner::kNoSourcePos,
                                is_not_future_test,
                                is_not_future_branch,
                                NULL));
 
-  AwaitMarkerNode* await_marker = new (I) AwaitMarkerNode();
+  AwaitMarkerNode* await_marker = new (Z) AwaitMarkerNode();
   await_marker->set_scope(preamble_->scope());
   preamble_->Add(await_marker);
-  ArgumentListNode* args = new(I) ArgumentListNode(Scanner::kNoSourcePos);
+  ArgumentListNode* args = new(Z) ArgumentListNode(Scanner::kNoSourcePos);
 
-  args->Add(new(I) LoadLocalNode(Scanner::kNoSourcePos, async_op));
-  preamble_->Add(new (I) StoreLocalNode(
+  args->Add(new(Z) LoadLocalNode(Scanner::kNoSourcePos, async_op));
+  preamble_->Add(new (Z) StoreLocalNode(
       Scanner::kNoSourcePos,
       result_param,
-      new(I) InstanceCallNode(Scanner::kNoSourcePos,
+      new(Z) InstanceCallNode(Scanner::kNoSourcePos,
                               load_result_param,
                               Symbols::FutureThen(),
                               args)));
   const Library& core_lib = Library::Handle(Library::CoreLibrary());
   const Function& async_catch_helper = Function::ZoneHandle(
-      I, core_lib.LookupFunctionAllowPrivate(Symbols::AsyncCatchHelper()));
+      Z, core_lib.LookupFunctionAllowPrivate(Symbols::AsyncCatchHelper()));
   ASSERT(!async_catch_helper.IsNull());
-  ArgumentListNode* catch_helper_args = new (I) ArgumentListNode(
+  ArgumentListNode* catch_helper_args = new (Z) ArgumentListNode(
       Scanner::kNoSourcePos);
-  InstanceGetterNode* catch_error_getter = new (I) InstanceGetterNode(
+  InstanceGetterNode* catch_error_getter = new (Z) InstanceGetterNode(
       Scanner::kNoSourcePos,
       load_result_param,
       Symbols::FutureCatchError());
   catch_helper_args->Add(catch_error_getter);
-  catch_helper_args->Add(new (I) LoadLocalNode(
+  catch_helper_args->Add(new (Z) LoadLocalNode(
       Scanner::kNoSourcePos, async_op));
-  preamble_->Add(new (I) StaticCallNode(
+  preamble_->Add(new (Z) StaticCallNode(
       Scanner::kNoSourcePos,
       async_catch_helper,
       catch_helper_args));
-  ReturnNode* continuation_return = new(I) ReturnNode(Scanner::kNoSourcePos);
+  ReturnNode* continuation_return = new(Z) ReturnNode(Scanner::kNoSourcePos);
   continuation_return->set_return_type(ReturnNode::kContinuationTarget);
   preamble_->Add(continuation_return);
 
   // If this expression is part of a try block, also append the code for
   // restoring the saved try context that lives on the stack.
   const String& async_saved_try_ctx_name =
-      String::Handle(I, parsed_function_->async_saved_try_ctx_name());
+      String::Handle(Z, parsed_function_->async_saved_try_ctx_name());
   if (!async_saved_try_ctx_name.IsNull()) {
     LocalVariable* async_saved_try_ctx =
         GetVariableInScope(preamble_->scope(), async_saved_try_ctx_name);
-    preamble_->Add(new (I) StoreLocalNode(
+    preamble_->Add(new (Z) StoreLocalNode(
         Scanner::kNoSourcePos,
         parsed_function_->saved_try_ctx(),
-        new (I) LoadLocalNode(Scanner::kNoSourcePos, async_saved_try_ctx)));
+        new (Z) LoadLocalNode(Scanner::kNoSourcePos, async_saved_try_ctx)));
   }
 
-  LoadLocalNode* load_error_param = new (I) LoadLocalNode(
+  LoadLocalNode* load_error_param = new (Z) LoadLocalNode(
       Scanner::kNoSourcePos, error_param);
-  SequenceNode* error_ne_null_branch = new (I) SequenceNode(
+  SequenceNode* error_ne_null_branch = new (Z) SequenceNode(
       Scanner::kNoSourcePos, ChainNewScope(preamble_->scope()));
-  error_ne_null_branch->Add(new (I) ThrowNode(
+  error_ne_null_branch->Add(new (Z) ThrowNode(
       Scanner::kNoSourcePos,
       load_error_param,
       NULL));
-  preamble_->Add(new (I) IfNode(
+  preamble_->Add(new (Z) IfNode(
       Scanner::kNoSourcePos,
-      new (I) ComparisonNode(
+      new (Z) ComparisonNode(
           Scanner::kNoSourcePos,
           Token::kNE,
           load_error_param,
-          new (I) LiteralNode(Scanner::kNoSourcePos,
+          new (Z) LiteralNode(Scanner::kNoSourcePos,
                               Object::null_instance())),
           error_ne_null_branch,
           NULL));
 
-  LocalVariable* result = AddToPreambleNewTempVar(new(I) LoadLocalNode(
+  LocalVariable* result = AddToPreambleNewTempVar(new(Z) LoadLocalNode(
       Scanner::kNoSourcePos, result_param));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
@@ -268,19 +269,19 @@
   AstNode* result = NULL;
   const Token::Kind compare_logical_op = (logical_op == Token::kAND) ?
       Token::kEQ : Token::kNE;
-  SequenceNode* eval = new (I) SequenceNode(
+  SequenceNode* eval = new (Z) SequenceNode(
       Scanner::kNoSourcePos, ChainNewScope(preamble_->scope()));
   SequenceNode* saved_preamble = preamble_;
   preamble_ = eval;
   result = Transform(right);
   preamble_ = saved_preamble;
-  IfNode* right_body = new(I) IfNode(
+  IfNode* right_body = new(Z) IfNode(
       Scanner::kNoSourcePos,
-      new(I) ComparisonNode(
+      new(Z) ComparisonNode(
           Scanner::kNoSourcePos,
           compare_logical_op,
           new_left,
-          new(I) LiteralNode(Scanner::kNoSourcePos, Bool::True())),
+          new(Z) LiteralNode(Scanner::kNoSourcePos, Bool::True())),
       eval,
       NULL);
   preamble_->Add(right_body);
@@ -289,7 +290,7 @@
 
 
 LocalScope* AwaitTransformer::ChainNewScope(LocalScope* parent) {
-  return new (I) LocalScope(
+  return new (Z) LocalScope(
       parent, parent->function_level(), parent->loop_level());
 }
 
@@ -304,11 +305,11 @@
     new_right = Transform(node->right());
   }
   LocalVariable* result = AddToPreambleNewTempVar(
-      new(I) BinaryOpNode(node->token_pos(),
+      new(Z) BinaryOpNode(node->token_pos(),
                           node->kind(),
                           new_left,
                           new_right));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
@@ -318,12 +319,12 @@
   AstNode* new_left = Transform(node->left());
   AstNode* new_right = Transform(node->right());
   LocalVariable* result = AddToPreambleNewTempVar(
-      new(I) BinaryOpWithMask32Node(node->token_pos(),
+      new(Z) BinaryOpWithMask32Node(node->token_pos(),
                                     node->kind(),
                                     new_left,
                                     new_right,
                                     node->mask32()));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
@@ -331,19 +332,19 @@
   AstNode* new_left = Transform(node->left());
   AstNode* new_right = Transform(node->right());
   LocalVariable* result = AddToPreambleNewTempVar(
-      new(I) ComparisonNode(node->token_pos(),
+      new(Z) ComparisonNode(node->token_pos(),
                             node->kind(),
                             new_left,
                             new_right));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
 void AwaitTransformer::VisitUnaryOpNode(UnaryOpNode* node) {
   AstNode* new_operand = Transform(node->operand());
   LocalVariable* result = AddToPreambleNewTempVar(
-      new(I) UnaryOpNode(node->token_pos(), node->kind(), new_operand));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+      new(Z) UnaryOpNode(node->token_pos(), node->kind(), new_operand));
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
@@ -351,32 +352,32 @@
 //
 void AwaitTransformer::VisitConditionalExprNode(ConditionalExprNode* node) {
   AstNode* new_condition = Transform(node->condition());
-  SequenceNode* new_true = new (I) SequenceNode(
+  SequenceNode* new_true = new (Z) SequenceNode(
       Scanner::kNoSourcePos, ChainNewScope(preamble_->scope()));
   SequenceNode* saved_preamble = preamble_;
   preamble_ = new_true;
   AstNode* new_true_result = Transform(node->true_expr());
-  SequenceNode* new_false = new (I) SequenceNode(
+  SequenceNode* new_false = new (Z) SequenceNode(
       Scanner::kNoSourcePos, ChainNewScope(preamble_->scope()));
   preamble_ = new_false;
   AstNode* new_false_result = Transform(node->false_expr());
   preamble_ = saved_preamble;
-  IfNode* new_if = new(I) IfNode(Scanner::kNoSourcePos,
+  IfNode* new_if = new(Z) IfNode(Scanner::kNoSourcePos,
                                  new_condition,
                                  new_true,
                                  new_false);
   preamble_->Add(new_if);
   LocalVariable* result = AddToPreambleNewTempVar(
-      new(I) ConditionalExprNode(Scanner::kNoSourcePos,
+      new(Z) ConditionalExprNode(Scanner::kNoSourcePos,
                                  new_condition,
                                  new_true_result,
                                  new_false_result));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
 void AwaitTransformer::VisitArgumentListNode(ArgumentListNode* node) {
-  ArgumentListNode* new_args = new(I) ArgumentListNode(node->token_pos());
+  ArgumentListNode* new_args = new(Z) ArgumentListNode(node->token_pos());
   for (intptr_t i = 0; i < node->length(); i++) {
     new_args->Add(Transform(node->NodeAt(i)));
   }
@@ -390,16 +391,16 @@
   for (intptr_t i = 0; i < node->length(); i++) {
     new_elements.Add(Transform(node->ElementAt(i)));
   }
-  result_ = new(I) ArrayNode(node->token_pos(), node->type(), new_elements);
+  result_ = new(Z) ArrayNode(node->token_pos(), node->type(), new_elements);
 }
 
 
 void AwaitTransformer::VisitStringInterpolateNode(StringInterpolateNode* node) {
   ArrayNode* new_value = Transform(node->value())->AsArrayNode();
   LocalVariable* result = AddToPreambleNewTempVar(
-      new(I) StringInterpolateNode(node->token_pos(),
+      new(Z) StringInterpolateNode(node->token_pos(),
                                    new_value));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
@@ -409,11 +410,11 @@
     new_receiver = Transform(new_receiver);
   }
   LocalVariable* result = AddToPreambleNewTempVar(
-      new(I) ClosureNode(node->token_pos(),
+      new(Z) ClosureNode(node->token_pos(),
                          node->function(),
                          new_receiver,
                          node->scope()));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
@@ -422,11 +423,11 @@
   ArgumentListNode* new_args =
       Transform(node->arguments())->AsArgumentListNode();
   LocalVariable* result = AddToPreambleNewTempVar(
-      new(I) InstanceCallNode(node->token_pos(),
+      new(Z) InstanceCallNode(node->token_pos(),
                               new_receiver,
                               node->function_name(),
                               new_args));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
@@ -434,10 +435,10 @@
   ArgumentListNode* new_args =
       Transform(node->arguments())->AsArgumentListNode();
   LocalVariable* result = AddToPreambleNewTempVar(
-      new(I) StaticCallNode(node->token_pos(),
+      new(Z) StaticCallNode(node->token_pos(),
                             node->function(),
                             new_args));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
@@ -445,21 +446,21 @@
   ArgumentListNode* new_args =
       Transform(node->arguments())->AsArgumentListNode();
   LocalVariable* result = AddToPreambleNewTempVar(
-      new(I) ConstructorCallNode(node->token_pos(),
+      new(Z) ConstructorCallNode(node->token_pos(),
                                  node->type_arguments(),
                                  node->constructor(),
                                  new_args));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
 void AwaitTransformer::VisitInstanceGetterNode(InstanceGetterNode* node) {
   AstNode* new_receiver = Transform(node->receiver());
   LocalVariable* result = AddToPreambleNewTempVar(
-      new(I) InstanceGetterNode(node->token_pos(),
+      new(Z) InstanceGetterNode(node->token_pos(),
                                 new_receiver,
                                 node->field_name()));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
@@ -470,11 +471,11 @@
   }
   AstNode* new_value = Transform(node->value());
   LocalVariable* result = AddToPreambleNewTempVar(
-      new(I) InstanceSetterNode(node->token_pos(),
+      new(Z) InstanceSetterNode(node->token_pos(),
                                 new_receiver,
                                 node->field_name(),
                                 new_value));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
@@ -484,12 +485,12 @@
     new_receiver = Transform(new_receiver);
   }
   LocalVariable* result = AddToPreambleNewTempVar(
-      new(I) StaticGetterNode(node->token_pos(),
+      new(Z) StaticGetterNode(node->token_pos(),
                               new_receiver,
                               node->is_super_getter(),
                               node->cls(),
                               node->field_name()));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
@@ -500,47 +501,47 @@
   }
   AstNode* new_value = Transform(node->value());
   LocalVariable* result = AddToPreambleNewTempVar(
-      new(I) StaticSetterNode(node->token_pos(),
+      new(Z) StaticSetterNode(node->token_pos(),
                               new_receiver,
                               node->cls(),
                               node->field_name(),
                               new_value));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
 void AwaitTransformer::VisitLoadLocalNode(LoadLocalNode* node) {
   LocalVariable* result = AddToPreambleNewTempVar(
-      new(I) LoadLocalNode(node->token_pos(), &node->local()));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+      new(Z) LoadLocalNode(node->token_pos(), &node->local()));
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
 void AwaitTransformer::VisitStoreLocalNode(StoreLocalNode* node) {
   AstNode* new_value = Transform(node->value());
   LocalVariable* result = AddToPreambleNewTempVar(
-      new(I) StoreLocalNode(node->token_pos(),
+      new(Z) StoreLocalNode(node->token_pos(),
                             &node->local(),
                             new_value));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
 void AwaitTransformer::VisitLoadStaticFieldNode(LoadStaticFieldNode* node) {
   LocalVariable* result = AddToPreambleNewTempVar(
-      new(I) LoadStaticFieldNode(node->token_pos(),
+      new(Z) LoadStaticFieldNode(node->token_pos(),
                                  node->field()));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
 void AwaitTransformer::VisitStoreStaticFieldNode(StoreStaticFieldNode* node) {
   AstNode* new_value = Transform(node->value());
   LocalVariable* result = AddToPreambleNewTempVar(
-      new(I) StoreStaticFieldNode(node->token_pos(),
+      new(Z) StoreStaticFieldNode(node->token_pos(),
                                   node->field(),
                                   new_value));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
@@ -548,11 +549,11 @@
   AstNode* new_array = Transform(node->array());
   AstNode* new_index = Transform(node->index_expr());
   LocalVariable* result = AddToPreambleNewTempVar(
-      new(I) LoadIndexedNode(node->token_pos(),
+      new(Z) LoadIndexedNode(node->token_pos(),
                              new_array,
                              new_index,
                              node->super_class()));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
@@ -561,29 +562,29 @@
   AstNode* new_index = Transform(node->index_expr());
   AstNode* new_value = Transform(node->value());
   LocalVariable* result = AddToPreambleNewTempVar(
-      new(I) StoreIndexedNode(node->token_pos(),
+      new(Z) StoreIndexedNode(node->token_pos(),
                               new_array,
                               new_index,
                               new_value,
                               node->super_class()));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
 void AwaitTransformer::VisitAssignableNode(AssignableNode* node) {
   AstNode* new_expr = Transform(node->expr());
   LocalVariable* result = AddToPreambleNewTempVar(
-      new(I) AssignableNode(node->token_pos(),
+      new(Z) AssignableNode(node->token_pos(),
                             new_expr,
                             node->type(),
                             node->dst_name()));
-  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+  result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
 }
 
 
 void AwaitTransformer::VisitLetNode(LetNode* node) {
   // TODO(mlippautz): Check initializers and their temps.
-  LetNode* result = new(I) LetNode(node->token_pos());
+  LetNode* result = new(Z) LetNode(node->token_pos());
   for (intptr_t i = 0; i < node->nodes().length(); i++) {
     result->AddNode(Transform(node->nodes()[i]));
   }
@@ -595,7 +596,7 @@
   // TODO(mlippautz): Check if relevant.
   AstNode* new_exception = Transform(node->exception());
   AstNode* new_stacktrace = Transform(node->stacktrace());
-  result_ = new(I) ThrowNode(node->token_pos(),
+  result_ = new(Z) ThrowNode(node->token_pos(),
                              new_exception,
                              new_stacktrace);
 }
diff --git a/runtime/vm/ast_transformer.h b/runtime/vm/ast_transformer.h
index 822b6d1..6f2ad4f 100644
--- a/runtime/vm/ast_transformer.h
+++ b/runtime/vm/ast_transformer.h
@@ -11,6 +11,7 @@
 namespace dart {
 
 class ParsedFunction;
+class Thread;
 
 // Translate an AstNode containing an expression (that itself contains one or
 // more awaits) into a sequential representation where subexpressions are
@@ -63,7 +64,7 @@
 
   void NextTempVar() { temp_cnt_++; }
 
-  Isolate* isolate() const { return isolate_; }
+  Thread* thread() const { return thread_; }
 
   SequenceNode* preamble_;
   int32_t temp_cnt_;
@@ -71,7 +72,7 @@
   ParsedFunction* const parsed_function_;
   LocalScope* function_top_;
 
-  Isolate* isolate_;
+  Thread* thread_;
 
   DISALLOW_COPY_AND_ASSIGN(AwaitTransformer);
 };
diff --git a/runtime/vm/base_isolate.h b/runtime/vm/base_isolate.h
index 33d1836..eeaee60 100644
--- a/runtime/vm/base_isolate.h
+++ b/runtime/vm/base_isolate.h
@@ -19,6 +19,7 @@
   StackResource* top_resource() const { return top_resource_; }
   void set_top_resource(StackResource* value) { top_resource_ = value; }
 
+  // DEPRECATED: Use Thread::current_zone.
   Zone* current_zone() const { return current_zone_; }
   void set_current_zone(Zone* zone) { current_zone_ = zone; }
 
@@ -98,14 +99,6 @@
   static void AssertCurrent(BaseIsolate* isolate);
 #endif
 
-  uword vm_tag() const {
-    return vm_tag_;
-  }
-
-  void set_vm_tag(uword tag) {
-    vm_tag_ = tag;
-  }
-
  protected:
   BaseIsolate()
       : top_resource_(NULL),
@@ -115,8 +108,7 @@
         no_handle_scope_depth_(0),
         no_gc_scope_depth_(0),
 #endif
-        no_callback_scope_depth_(0),
-        vm_tag_(0)
+        no_callback_scope_depth_(0)
   {}
 
   ~BaseIsolate() {
@@ -131,7 +123,6 @@
   int32_t no_gc_scope_depth_;
 #endif
   int32_t no_callback_scope_depth_;
-  uword vm_tag_;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(BaseIsolate);
diff --git a/runtime/vm/bit_vector.h b/runtime/vm/bit_vector.h
index 4157968..af5122d 100644
--- a/runtime/vm/bit_vector.h
+++ b/runtime/vm/bit_vector.h
@@ -44,10 +44,10 @@
     friend class BitVector;
   };
 
-  BitVector(Isolate* isolate, intptr_t length)
+  BitVector(Zone* zone, intptr_t length)
       : length_(length),
         data_length_(SizeFor(length)),
-        data_(isolate->current_zone()->Alloc<uword>(data_length_)) {
+        data_(zone->Alloc<uword>(data_length_)) {
     Clear();
   }
 
diff --git a/runtime/vm/bit_vector_test.cc b/runtime/vm/bit_vector_test.cc
index 873b81a..4c803d9 100644
--- a/runtime/vm/bit_vector_test.cc
+++ b/runtime/vm/bit_vector_test.cc
@@ -8,10 +8,10 @@
 
 namespace dart {
 
-#define I Isolate::Current()
+#define Z Thread::Current()->zone()
 
 TEST_CASE(BitVector) {
-  { BitVector* v = new BitVector(I, 15);
+  { BitVector* v = new BitVector(Z, 15);
     v->Add(1);
     EXPECT_EQ(true, v->Contains(1));
     EXPECT_EQ(false, v->Contains(0));
@@ -33,7 +33,7 @@
     }
   }
 
-  { BitVector* v = new BitVector(I, 128);
+  { BitVector* v = new BitVector(Z, 128);
     v->Add(49);
     v->Add(62);
     v->Add(63);
@@ -55,9 +55,9 @@
     EXPECT(iter.Done());
   }
 
-  { BitVector* a = new BitVector(I, 128);
-    BitVector* b = new BitVector(I, 128);
-    BitVector* c = new BitVector(I, 128);
+  { BitVector* a = new BitVector(Z, 128);
+    BitVector* b = new BitVector(Z, 128);
+    BitVector* c = new BitVector(Z, 128);
     b->Add(0);
     b->Add(32);
     b->Add(64);
@@ -86,8 +86,8 @@
     EXPECT_EQ(false, a->Contains(96));
   }
 
-  { BitVector* a = new BitVector(I, 34);
-    BitVector* b = new BitVector(I, 34);
+  { BitVector* a = new BitVector(Z, 34);
+    BitVector* b = new BitVector(Z, 34);
     a->SetAll();
     b->Add(0);
     b->Add(1);
@@ -97,16 +97,16 @@
     EXPECT_EQ(true, a->Equals(*b));
   }
 
-  { BitVector* a = new BitVector(I, 2);
-    BitVector* b = new BitVector(I, 2);
+  { BitVector* a = new BitVector(Z, 2);
+    BitVector* b = new BitVector(Z, 2);
     a->SetAll();
     a->Remove(0);
     a->Remove(1);
     EXPECT_EQ(true, a->Equals(*b));
   }
 
-  { BitVector* a = new BitVector(I, 128);
-    BitVector* b = new BitVector(I, 128);
+  { BitVector* a = new BitVector(Z, 128);
+    BitVector* b = new BitVector(Z, 128);
     b->Add(0);
     b->Add(32);
     b->Add(64);
diff --git a/runtime/vm/bitfield.h b/runtime/vm/bitfield.h
index 4ef7766..6108065 100644
--- a/runtime/vm/bitfield.h
+++ b/runtime/vm/bitfield.h
@@ -14,6 +14,8 @@
 template<typename T, int position, int size>
 class BitField {
  public:
+  static const intptr_t kNextBit = position + size;
+
   // Tells whether the provided value fits into the bit field.
   static bool is_valid(T value) {
     return (static_cast<uword>(value) & ~((kUwordOne << size) - 1)) == 0;
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 2a1718f..2b14eb7 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -102,6 +102,7 @@
   V(ImmutableList_from, 4)                                                     \
   V(StringBase_createFromCodePoints, 3)                                        \
   V(StringBase_substringUnchecked, 3)                                          \
+  V(StringBase_joinReplaceAllResult, 4)                                        \
   V(StringBuffer_createStringFromUint16Array, 3)                               \
   V(OneByteString_substringUnchecked, 3)                                       \
   V(OneByteString_splitWithCharCode, 2)                                        \
diff --git a/runtime/vm/cha.cc b/runtime/vm/cha.cc
index b937357..fbb9142 100644
--- a/runtime/vm/cha.cc
+++ b/runtime/vm/cha.cc
@@ -12,24 +12,7 @@
 
 namespace dart {
 
-// Return true if the class is private to our internal libraries (not extendable
-// or implementable after startup). Therefore, we don't need to register
-// optimized code for invalidation for those classes.
-// TODO(fschneider): Allow more libraries.
-static bool IsKnownPrivateClass(const Class& type_class) {
-  if (!Library::IsPrivate(String::Handle(type_class.Name()))) return false;
-  const Library& library = Library::Handle(type_class.library());
-  if (library.raw() == Library::CoreLibrary()) return true;
-  if (library.raw() == Library::CollectionLibrary()) return true;
-  if (library.raw() == Library::TypedDataLibrary()) return true;
-  if (library.raw() == Library::MathLibrary()) return true;
-  return false;
-}
-
-
 void CHA::AddToLeafClasses(const Class& cls) {
-  if (IsKnownPrivateClass(cls)) return;
-
   for (intptr_t i = 0; i < leaf_classes_.length(); i++) {
     if (leaf_classes_[i]->raw() == cls.raw()) {
       return;
diff --git a/runtime/vm/class_table.cc b/runtime/vm/class_table.cc
index 1077723..c9a817c 100644
--- a/runtime/vm/class_table.cc
+++ b/runtime/vm/class_table.cc
@@ -5,6 +5,7 @@
 #include "vm/class_table.h"
 #include "vm/flags.h"
 #include "vm/freelist.h"
+#include "vm/growable_array.h"
 #include "vm/heap.h"
 #include "vm/object.h"
 #include "vm/raw_object.h"
@@ -16,6 +17,7 @@
 
 ClassTable::ClassTable()
     : top_(kNumPredefinedCids), capacity_(0), table_(NULL),
+      old_tables_(new MallocGrowableArray<RawClass**>()),
       class_heap_stats_table_(NULL),
       predefined_class_heap_stats_table_(NULL) {
   if (Dart::vm_isolate() == NULL) {
@@ -51,20 +53,32 @@
 ClassTable::ClassTable(ClassTable* original)
     : top_(original->top_),
       capacity_(original->top_),
-      table_(reinterpret_cast<RawClass**>(
-          calloc(original->top_, sizeof(RawClass*)))),
+      table_(original->table_),
+      old_tables_(NULL),
       class_heap_stats_table_(NULL),
       predefined_class_heap_stats_table_(NULL) {
-  for (intptr_t i = 1; i < top_; i++) {
-    table_[i] = original->At(i);
-  }
 }
 
 
 ClassTable::~ClassTable() {
-  free(table_);
-  free(predefined_class_heap_stats_table_);
-  free(class_heap_stats_table_);
+  if (old_tables_ != NULL) {
+    FreeOldTables();
+    delete old_tables_;
+    free(table_);
+    free(predefined_class_heap_stats_table_);
+    free(class_heap_stats_table_);
+  } else {
+    // This instance was a shallow copy. It doesn't own any memory.
+    ASSERT(predefined_class_heap_stats_table_ == NULL);
+    ASSERT(class_heap_stats_table_ == NULL);
+  }
+}
+
+
+void ClassTable::FreeOldTables() {
+  while (old_tables_->length() > 0) {
+    free(old_tables_->RemoveLast());
+  }
 }
 
 
@@ -87,9 +101,11 @@
   } else {
     if (top_ == capacity_) {
       // Grow the capacity of the class table.
+      // TODO(koda): Add ClassTable::Grow to share code.
       intptr_t new_capacity = capacity_ + capacity_increment_;
       RawClass** new_table = reinterpret_cast<RawClass**>(
-          realloc(table_, new_capacity * sizeof(RawClass*)));  // NOLINT
+          malloc(new_capacity * sizeof(RawClass*)));  // NOLINT
+      memmove(new_table, table_, capacity_ * sizeof(RawClass*));
       ClassHeapStats* new_stats_table = reinterpret_cast<ClassHeapStats*>(
           realloc(class_heap_stats_table_,
                   new_capacity * sizeof(ClassHeapStats)));  // NOLINT
@@ -98,7 +114,8 @@
         new_stats_table[i].Initialize();
       }
       capacity_ = new_capacity;
-      table_ = new_table;
+      old_tables_->Add(table_);
+      table_ = new_table;  // TODO(koda): This should use atomics.
       class_heap_stats_table_ = new_stats_table;
     }
     ASSERT(top_ < capacity_);
@@ -118,13 +135,15 @@
   ASSERT(index >= kNumPredefinedCids);
   if (index >= capacity_) {
     // Grow the capacity of the class table.
+    // TODO(koda): Add ClassTable::Grow to share code.
     intptr_t new_capacity = index + capacity_increment_;
     if (!Class::is_valid_id(index) || new_capacity < capacity_) {
       FATAL1("Fatal error in ClassTable::Register: invalid index %" Pd "\n",
              index);
     }
     RawClass** new_table = reinterpret_cast<RawClass**>(
-        realloc(table_, new_capacity * sizeof(RawClass*)));  // NOLINT
+        malloc(new_capacity * sizeof(RawClass*)));  // NOLINT
+    memmove(new_table, table_, capacity_ * sizeof(RawClass*));
     ClassHeapStats* new_stats_table = reinterpret_cast<ClassHeapStats*>(
         realloc(class_heap_stats_table_,
                 new_capacity * sizeof(ClassHeapStats)));  // NOLINT
@@ -133,7 +152,8 @@
       new_stats_table[i].Initialize();
     }
     capacity_ = new_capacity;
-    table_ = new_table;
+    old_tables_->Add(table_);
+    table_ = new_table;  // TODO(koda): This should use atomics.
     class_heap_stats_table_ = new_stats_table;
     ASSERT(capacity_increment_ >= 1);
   }
diff --git a/runtime/vm/class_table.h b/runtime/vm/class_table.h
index 579e761..4781e37 100644
--- a/runtime/vm/class_table.h
+++ b/runtime/vm/class_table.h
@@ -15,6 +15,7 @@
 class JSONArray;
 class JSONObject;
 class JSONStream;
+template<typename T> class MallocGrowableArray;
 class ObjectPointerVisitor;
 class RawClass;
 
@@ -121,11 +122,12 @@
 class ClassTable {
  public:
   ClassTable();
-  // Create a copy of the original class table only, without copying any of the
-  // stats data.
+  // Creates a shallow copy of the original class table for some read-only
+  // access, without support for stats data.
   explicit ClassTable(ClassTable* original);
   ~ClassTable();
 
+  // Thread-safe.
   RawClass* At(intptr_t index) const {
     ASSERT(IsValidIndex(index));
     return table_[index];
@@ -189,6 +191,9 @@
   void AllocationProfilePrintJSON(JSONStream* stream);
   void ResetAllocationAccumulators();
 
+  // Deallocates table copies. Do not call during concurrent access to table.
+  void FreeOldTables();
+
  private:
   friend class MarkingVisitor;
   friend class ScavengerVisitor;
@@ -201,7 +206,10 @@
   intptr_t top_;
   intptr_t capacity_;
 
+  // Copy-on-write is used for table_, with old copies stored in old_tables_.
   RawClass** table_;
+  MallocGrowableArray<RawClass**>* old_tables_;
+
   ClassHeapStats* class_heap_stats_table_;
 
   ClassHeapStats* predefined_class_heap_stats_table_;
diff --git a/runtime/vm/code_descriptors.cc b/runtime/vm/code_descriptors.cc
index c84d22f..1757c13 100644
--- a/runtime/vm/code_descriptors.cc
+++ b/runtime/vm/code_descriptors.cc
@@ -34,7 +34,7 @@
                                                has_try_index_));
   for (intptr_t i = 0; i < num_descriptors; i++) {
     descriptors.AddDescriptor(i,
-                              (entry_point + PcOffset(i)),
+                              PcOffset(i),
                               Kind(i),
                               DeoptId(i),
                               TokenPos(i),
diff --git a/runtime/vm/code_descriptors.h b/runtime/vm/code_descriptors.h
index e7daafb..d5ea730 100644
--- a/runtime/vm/code_descriptors.h
+++ b/runtime/vm/code_descriptors.h
@@ -176,7 +176,7 @@
       bool has_catch_all = ContainsDynamic(*list_[i].handler_types);
       handlers.SetHandlerInfo(i,
                               list_[i].outer_try_index,
-                              (entry_point + list_[i].pc_offset),
+                              list_[i].pc_offset,
                               list_[i].needs_stacktrace,
                               has_catch_all);
       handlers.SetHandledTypes(i, *list_[i].handler_types);
diff --git a/runtime/vm/code_descriptors_test.cc b/runtime/vm/code_descriptors_test.cc
index 5e68bea..9c760bb 100644
--- a/runtime/vm/code_descriptors_test.cc
+++ b/runtime/vm/code_descriptors_test.cc
@@ -13,6 +13,7 @@
 #include "vm/native_entry.h"
 #include "vm/parser.h"
 #include "vm/symbols.h"
+#include "vm/thread.h"
 #include "vm/unit_test.h"
 
 namespace dart {
@@ -22,7 +23,7 @@
 
 CODEGEN_TEST_GENERATE(StackmapCodegen, test) {
   ParsedFunction* parsed_function =
-      new ParsedFunction(Isolate::Current(), test->function());
+      new ParsedFunction(Thread::Current(), test->function());
   LiteralNode* l = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(1)));
   test->node_sequence()->Add(new ReturnNode(kPos, l));
   l = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(2)));
@@ -250,9 +251,7 @@
   int call_count = 0;
   PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kUnoptStaticCall);
   while (iter.MoveNext()) {
-    stackmap_table_builder->AddEntry(iter.Pc() - code.EntryPoint(),
-                                     stack_bitmap,
-                                     0);
+    stackmap_table_builder->AddEntry(iter.PcOffset(), stack_bitmap, 0);
     ++call_count;
   }
   // We can't easily check that we put the stackmap at the correct pc, but
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 90e5ba5..b520549 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -1661,4 +1661,22 @@
   field.EvaluateInitializer();
 }
 
+
+DEFINE_RUNTIME_ENTRY(GrowRegExpStack, 1) {
+  const Array& typed_data_cell = Array::CheckedHandle(arguments.ArgAt(0));
+  ASSERT(!typed_data_cell.IsNull() && typed_data_cell.Length() == 1);
+  const TypedData& old_data = TypedData::CheckedHandle(typed_data_cell.At(0));
+  ASSERT(!old_data.IsNull());
+  const intptr_t cid = old_data.GetClassId();
+  const intptr_t old_size = old_data.Length();
+  const intptr_t new_size = 2 * old_size;
+  const intptr_t elm_size = old_data.ElementSizeInBytes();
+  const TypedData& new_data =
+      TypedData::Handle(TypedData::New(cid, new_size, Heap::kOld));
+  TypedData::Copy(new_data, 0, old_data, 0, old_size * elm_size);
+  typed_data_cell.SetAt(0, new_data);
+  arguments.SetReturn(new_data);
+}
+
+
 }  // namespace dart
diff --git a/runtime/vm/code_generator.h b/runtime/vm/code_generator.h
index f1d3190..5c0312e 100644
--- a/runtime/vm/code_generator.h
+++ b/runtime/vm/code_generator.h
@@ -49,6 +49,7 @@
 DECLARE_RUNTIME_ENTRY(DeoptimizeMaterialize);
 DECLARE_RUNTIME_ENTRY(UpdateFieldCid);
 DECLARE_RUNTIME_ENTRY(InitStaticField);
+DECLARE_RUNTIME_ENTRY(GrowRegExpStack);
 
 const char* DeoptReasonToCString(ICData::DeoptReasonId deopt_reason);
 
diff --git a/runtime/vm/code_observers.cc b/runtime/vm/code_observers.cc
index dda3be2..331a4be 100644
--- a/runtime/vm/code_observers.cc
+++ b/runtime/vm/code_observers.cc
@@ -6,7 +6,7 @@
 #include "vm/code_observers.h"
 
 #include "vm/os.h"
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 
 namespace dart {
 
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index e19ee06..23b60d2 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -850,6 +850,17 @@
     OS::Print("}\n");
   }
 
+  const Array& object_pool = Array::Handle(
+      Instructions::Handle(code.instructions()).object_pool());
+  if (object_pool.Length() > 0) {
+    OS::Print("Object Pool: {\n");
+    for (intptr_t i = 0; i < object_pool.Length(); i++) {
+      OS::Print("  %" Pd ": %s\n", i,
+          Object::Handle(object_pool.At(i)).ToCString());
+    }
+    OS::Print("}\n");
+  }
+
   OS::Print("Stackmaps for function '%s' {\n", function_fullname);
   if (code.stackmaps() != Array::null()) {
     const Array& stackmap_table = Array::Handle(code.stackmaps());
@@ -931,15 +942,17 @@
                                        const Function& function,
                                        bool optimized,
                                        intptr_t osr_id) {
-  Isolate* isolate = Isolate::Current();
-  StackZone zone(isolate);
+  Thread* thread = Thread::Current();
+  Isolate* isolate = thread->isolate();
+  StackZone stack_zone(isolate);
+  Zone* zone = stack_zone.GetZone();
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
     TIMERSCOPE(isolate, time_compilation);
     Timer per_compile_timer(FLAG_trace_compiler, "Compilation time");
     per_compile_timer.Start();
-    ParsedFunction* parsed_function = new(isolate) ParsedFunction(
-        isolate, Function::ZoneHandle(isolate, function.raw()));
+    ParsedFunction* parsed_function = new(zone) ParsedFunction(
+        thread, Function::ZoneHandle(zone, function.raw()));
     if (FLAG_trace_compiler) {
       OS::Print("Compiling %s%sfunction: '%s' @ token %" Pd ", size %" Pd "\n",
                 (osr_id == Isolate::kNoDeoptId ? "" : "osr "),
@@ -1136,7 +1149,8 @@
 
 
 RawObject* Compiler::ExecuteOnce(SequenceNode* fragment) {
-  Isolate* isolate = Isolate::Current();
+  Thread* thread = Thread::Current();
+  Isolate* isolate = thread->isolate();
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
     if (FLAG_trace_compiler) {
@@ -1169,7 +1183,7 @@
     // We compile the function here, even though InvokeFunction() below
     // would compile func automatically. We are checking fewer invariants
     // here.
-    ParsedFunction* parsed_function = new ParsedFunction(isolate, func);
+    ParsedFunction* parsed_function = new ParsedFunction(thread, func);
     parsed_function->SetNodeSequence(fragment);
     parsed_function->set_default_parameter_values(Object::null_array());
     fragment->scope()->AddVariable(parsed_function->EnsureExpressionTemp());
diff --git a/runtime/vm/constant_propagator.cc b/runtime/vm/constant_propagator.cc
index 0c765f2..7662e8b 100644
--- a/runtime/vm/constant_propagator.cc
+++ b/runtime/vm/constant_propagator.cc
@@ -19,8 +19,9 @@
 DEFINE_FLAG(bool, trace_constant_propagation, false,
     "Print constant propagation and useless code elimination.");
 
-// Quick access to the locally defined isolate() method.
+// Quick access to the current zone and isolate.
 #define I (isolate())
+#define Z (graph_->zone())
 
 
 ConstantPropagator::ConstantPropagator(
@@ -30,10 +31,10 @@
       graph_(graph),
       unknown_(Object::unknown_constant()),
       non_constant_(Object::non_constant()),
-      reachable_(new(graph->isolate()) BitVector(
-          graph->isolate(), graph->preorder().length())),
-      marked_phis_(new(graph->isolate()) BitVector(
-          graph->isolate(), graph->max_virtual_register_number())),
+      reachable_(new(Z) BitVector(
+          Z, graph->preorder().length())),
+      marked_phis_(new(Z) BitVector(
+          Z, graph->max_virtual_register_number())),
       block_worklist_(),
       definition_worklist_(graph, 10) {}
 
@@ -258,6 +259,7 @@
   // TODO(vegorov) remove all code after DeoptimizeInstr as dead.
 }
 
+void ConstantPropagator::VisitGrowRegExpStack(GrowRegExpStackInstr* instr) { }
 
 Definition* ConstantPropagator::UnwrapPhi(Definition* defn) {
   if (defn->IsPhi()) {
@@ -1429,7 +1431,8 @@
   // Canonicalize branches that have no side-effects and where true- and
   // false-targets are the same.
   bool changed = false;
-  BitVector* empty_blocks = new(I) BitVector(I, graph_->preorder().length());
+  BitVector* empty_blocks = new(Z) BitVector(Z,
+      graph_->preorder().length());
   for (BlockIterator b = graph_->postorder_iterator();
        !b.Done();
        b.Advance()) {
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index b599644..ac51ad9 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -34,9 +34,13 @@
 
 DEFINE_FLAG(int, new_gen_semi_max_size, (kWordSize <= 4) ? 16 : 32,
             "Max size of new gen semi space in MB");
-DEFINE_FLAG(int, old_gen_heap_size, Heap::kHeapSizeInMB,
-            "Max size of old gen heap size in MB,"
+DEFINE_FLAG(int, old_gen_heap_size, 0,
+            "Max size of old gen heap size in MB, or 0 for unlimited,"
             "e.g: --old_gen_heap_size=1024 allows up to 1024MB old gen heap");
+DEFINE_FLAG(int, external_max_size, (kWordSize <= 4) ? 512 : 1024,
+            "Max total size of external allocations in MB, or 0 for unlimited,"
+            "e.g: --external_max_size=1024 allows up to 1024MB of externals");
+
 
 DECLARE_FLAG(bool, print_class_table);
 DECLARE_FLAG(bool, trace_isolates);
@@ -114,7 +118,8 @@
     HandleScope handle_scope(vm_isolate_);
     Heap::Init(vm_isolate_,
                0,  // New gen size 0; VM isolate should only allocate in old.
-               FLAG_old_gen_heap_size * MBInWords);
+               FLAG_old_gen_heap_size * MBInWords,
+               FLAG_external_max_size * MBInWords);
     ObjectStore::Init(vm_isolate_);
     TargetCPUFeatures::InitOnce();
     Object::InitOnce(vm_isolate_);
@@ -197,7 +202,8 @@
   HandleScope handle_scope(isolate);
   Heap::Init(isolate,
              FLAG_new_gen_semi_max_size * MBInWords,
-             FLAG_old_gen_heap_size * MBInWords);
+             FLAG_old_gen_heap_size * MBInWords,
+             FLAG_external_max_size * MBInWords);
   ObjectIdRing::Init(isolate);
   ObjectStore::Init(isolate);
 
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index ac26ef4..3bf0457 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -25,6 +25,7 @@
 #include "vm/native_entry.h"
 #include "vm/object.h"
 #include "vm/object_store.h"
+#include "vm/os_thread.h"
 #include "vm/port.h"
 #include "vm/profiler.h"
 #include "vm/resolver.h"
@@ -47,7 +48,7 @@
 DEFINE_FLAG(bool, trace_api, false,
             "Trace invocation of API calls (debug mode only)");
 
-ThreadLocalKey Api::api_native_key_ = Thread::kUnsetThreadLocalKey;
+ThreadLocalKey Api::api_native_key_ = OSThread::kUnsetThreadLocalKey;
 Dart_Handle Api::true_handle_ = NULL;
 Dart_Handle Api::false_handle_ = NULL;
 Dart_Handle Api::null_handle_ = NULL;
@@ -438,9 +439,9 @@
 
 
 void Api::InitOnce() {
-  ASSERT(api_native_key_ == Thread::kUnsetThreadLocalKey);
-  api_native_key_ = Thread::CreateThreadLocal();
-  ASSERT(api_native_key_ != Thread::kUnsetThreadLocalKey);
+  ASSERT(api_native_key_ == OSThread::kUnsetThreadLocalKey);
+  api_native_key_ = OSThread::CreateThreadLocal();
+  ASSERT(api_native_key_ != OSThread::kUnsetThreadLocalKey);
 }
 
 
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 444e040..402257b 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -2643,7 +2643,7 @@
   EXPECT_EQ(kSmallExternalSize,
             isolate->heap()->ExternalInWords(Heap::kOld) * kWordSize);
   // Large enough to trigger GC in old space. Not actually allocated.
-  const intptr_t kHugeExternalSize = Heap::kHeapSizeInMB * MB;
+  const intptr_t kHugeExternalSize = (kWordSize == 4) ? 513 * MB : 1025 * MB;
   Dart_NewWeakPersistentHandle(live,
                                NULL,
                                kHugeExternalSize,
@@ -7339,7 +7339,7 @@
   Isolate::SetInterruptCallback(IsolateInterruptTestCallback);
 
   sync = new Monitor();
-  int result = Thread::Start(BusyLoop_start, 0);
+  int result = OSThread::Start(BusyLoop_start, 0);
   EXPECT_EQ(0, result);
 
   {
diff --git a/runtime/vm/dart_api_state.h b/runtime/vm/dart_api_state.h
index 7e5fa0a..e9cf183 100644
--- a/runtime/vm/dart_api_state.h
+++ b/runtime/vm/dart_api_state.h
@@ -16,7 +16,7 @@
 #include "vm/object.h"
 #include "vm/os.h"
 #include "vm/raw_object.h"
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 #include "vm/visitor.h"
 
 #include "vm/handles_impl.h"
@@ -617,17 +617,18 @@
   ApiNativeScope() {
     // Currently no support for nesting native scopes.
     ASSERT(Current() == NULL);
-    Thread::SetThreadLocal(Api::api_native_key_, reinterpret_cast<uword>(this));
+    OSThread::SetThreadLocal(Api::api_native_key_,
+                                reinterpret_cast<uword>(this));
   }
 
   ~ApiNativeScope() {
     ASSERT(Current() == this);
-    Thread::SetThreadLocal(Api::api_native_key_, 0);
+    OSThread::SetThreadLocal(Api::api_native_key_, 0);
   }
 
   static inline ApiNativeScope* Current() {
     return reinterpret_cast<ApiNativeScope*>(
-        Thread::GetThreadLocal(Api::api_native_key_));
+        OSThread::GetThreadLocal(Api::api_native_key_));
   }
 
   Zone* zone() { return zone_.GetZone(); }
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 52f0024..6a14928 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -54,6 +54,26 @@
 };
 
 
+// Clears/restores Isolate::long_jump_base on construction/destruction.
+// Ensures that we do not attempt to long jump across Dart frames.
+class SuspendLongJumpScope : public StackResource {
+ public:
+  explicit SuspendLongJumpScope(Isolate* isolate)
+      : StackResource(isolate),
+        saved_long_jump_base_(isolate->long_jump_base()) {
+    isolate->set_long_jump_base(NULL);
+  }
+
+  ~SuspendLongJumpScope() {
+    ASSERT(isolate()->long_jump_base() == NULL);
+    isolate()->set_long_jump_base(saved_long_jump_base_);
+  }
+
+ private:
+  LongJumpScope* saved_long_jump_base_;
+};
+
+
 RawObject* DartEntry::InvokeFunction(const Function& function,
                                      const Array& arguments,
                                      const Array& arguments_descriptor) {
@@ -75,6 +95,7 @@
   ASSERT(!code.IsNull());
   ASSERT(Isolate::Current()->no_callback_scope_depth() == 0);
   ScopedIsolateStackLimits stack_limit(isolate);
+  SuspendLongJumpScope suspend_long_jump_scope(isolate);
 #if defined(USING_SIMULATOR)
 #if defined(ARCH_IS_64_BIT)
   // TODO(zra): Change to intptr_t so we have only one case.
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index b23640b..8cfa207 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -387,8 +387,9 @@
     token_pos_ = Scanner::kNoSourcePos;
     GetPcDescriptors();
     PcDescriptors::Iterator iter(pc_desc_, RawPcDescriptors::kAnyKind);
+    uword pc_offset = pc_ - code().EntryPoint();
     while (iter.MoveNext()) {
-      if (iter.Pc() == pc_) {
+      if (iter.PcOffset() == pc_offset) {
         try_index_ = iter.TryIndex();
         token_pos_ = iter.TokenPos();
         break;
@@ -905,7 +906,7 @@
 
 
 void DebuggerStackTrace::AddActivation(ActivationFrame* frame) {
-  if (FLAG_show_invisible_frames || frame->function().is_visible()) {
+  if (FLAG_show_invisible_frames || frame->function().is_debuggable()) {
     trace_.Add(frame);
   }
 }
@@ -1323,7 +1324,7 @@
     // pre-allocated trace (such as a stack overflow) or (b) because a stack has
     // fewer frames that the pre-allocated trace (such as memory exhaustion with
     // a shallow stack).
-    if (!function.IsNull() && function.is_visible()) {
+    if (!function.IsNull() && function.is_debuggable()) {
       code = ex_trace.CodeAtFrame(i);
       ASSERT(function.raw() == code.function());
       uword pc = code.EntryPoint() + Smi::Value(ex_trace.PcOffsetAtFrame(i));
@@ -1470,14 +1471,14 @@
     const TokenStream& tokens = TokenStream::Handle(script.tokens());
     const intptr_t begin_pos = best_fit_pos;
     const intptr_t end_of_line_pos = LastTokenOnLine(tokens, begin_pos);
-    uword lowest_pc = kUwordMax;
+    uword lowest_pc_offset = kUwordMax;
     PcDescriptors::Iterator iter(desc, kSafepointKind);
     while (iter.MoveNext()) {
       const intptr_t pos = iter.TokenPos();
       if ((pos != Scanner::kNoSourcePos) &&
           (begin_pos <= pos) && (pos <= end_of_line_pos) &&
-          (iter.Pc() < lowest_pc)) {
-        lowest_pc = iter.Pc();
+          (iter.PcOffset() < lowest_pc_offset)) {
+        lowest_pc_offset = iter.PcOffset();
         best_fit_pos = pos;
       }
     }
@@ -1501,22 +1502,23 @@
   Code& code = Code::Handle(func.unoptimized_code());
   ASSERT(!code.IsNull());
   PcDescriptors& desc = PcDescriptors::Handle(code.pc_descriptors());
-  uword lowest_pc = kUwordMax;
+  uword lowest_pc_offset = kUwordMax;
   RawPcDescriptors::Kind lowest_kind = RawPcDescriptors::kAnyKind;
   // Find the safe point with the lowest compiled code address
   // that maps to the token position of the source breakpoint.
   PcDescriptors::Iterator iter(desc, kSafepointKind);
   while (iter.MoveNext()) {
     if (iter.TokenPos() == bpt->token_pos_) {
-      if (iter.Pc() < lowest_pc) {
-        lowest_pc = iter.Pc();
+      if (iter.PcOffset() < lowest_pc_offset) {
+        lowest_pc_offset = iter.PcOffset();
         lowest_kind = iter.Kind();
       }
     }
   }
-  if (lowest_pc == kUwordMax) {
+  if (lowest_pc_offset == kUwordMax) {
     return;
   }
+  uword lowest_pc = code.EntryPoint() + lowest_pc_offset;
   CodeBreakpoint* code_bpt = GetCodeBreakpoint(lowest_pc);
   if (code_bpt == NULL) {
     // No code breakpoint for this code exists; create one.
diff --git a/runtime/vm/debugger_api_impl_test.cc b/runtime/vm/debugger_api_impl_test.cc
index b01eed0..1ee1773 100644
--- a/runtime/vm/debugger_api_impl_test.cc
+++ b/runtime/vm/debugger_api_impl_test.cc
@@ -1504,7 +1504,7 @@
   sync = new Monitor();
   EXPECT(interrupt_isolate_id == ILLEGAL_ISOLATE_ID);
   Dart_SetPausedEventHandler(InterruptIsolateHandler);
-  int result = Thread::Start(InterruptIsolateRun, 0);
+  int result = OSThread::Start(InterruptIsolateRun, 0);
   EXPECT_EQ(0, result);
 
   // Wait for the test isolate to be created.
diff --git a/runtime/vm/disassembler_x64.cc b/runtime/vm/disassembler_x64.cc
index 1791b4d..859ab9f 100644
--- a/runtime/vm/disassembler_x64.cc
+++ b/runtime/vm/disassembler_x64.cc
@@ -453,7 +453,7 @@
     case 0:
       if ((rm & 7) == 5) {
         int32_t disp = *reinterpret_cast<int32_t*>(modrmp + 1);
-        AppendToBuffer("[%#x]", disp);
+        AppendToBuffer("[rip%s%#x]", disp < 0 ? "-" : "+", Utils::Abs(disp));
         return 5;
       } else if ((rm & 7) == 4) {
         // Codes for SIB byte.
@@ -1522,17 +1522,17 @@
     // SETcc: Set byte on condition. Needs pointer to beginning of instruction.
     current = data + SetCC(data);
 
-  } else if ((opcode & 0xFE) == 0xA4 || (opcode & 0xFE) == 0xAC ||
-             opcode == 0xAB || opcode == 0xA3) {
+  } else if (((opcode & 0xFE) == 0xA4) || ((opcode & 0xFE) == 0xAC) ||
+             (opcode == 0xAB) || (opcode == 0xA3) || (opcode == 0xBD)) {
     // SHLD, SHRD (double-prec. shift), BTS (bit test and set), BT (bit test).
     AppendToBuffer("%s%c ", mnemonic, operand_size_code());
     int mod, regop, rm;
     get_modrm(*current, &mod, &regop, &rm);
     current += PrintRightOperand(current);
     AppendToBuffer(",%s", NameOfCPURegister(regop));
-    if (opcode == 0xAB || opcode == 0xA3) {
+    if ((opcode == 0xAB) || (opcode == 0xA3) || (opcode == 0xBD)) {
       // Done.
-    } else if (opcode == 0xA5 || opcode == 0xAD) {
+    } else if ((opcode == 0xA5) || (opcode == 0xAD)) {
       AppendToBuffer(",cl");
     } else {
       AppendToBuffer(",");
@@ -1586,6 +1586,8 @@
       return "movzxw";
     case 0xBE:
       return "movsxb";
+    case 0xBD:
+      return "bsr";
     case 0xBF:
       return "movsxw";
     case 0x12:
diff --git a/runtime/vm/elfgen.h b/runtime/vm/elfgen.h
index a17023b..f3fcd70 100644
--- a/runtime/vm/elfgen.h
+++ b/runtime/vm/elfgen.h
@@ -6,7 +6,7 @@
 #define VM_ELFGEN_H_
 
 #include "vm/lockers.h"
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 
 namespace dart {
 
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 0f8bdbb..4cb32fc 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -21,8 +21,6 @@
 
 DEFINE_FLAG(bool, print_stacktrace_at_throw, false,
             "Prints a stack trace everytime a throw occurs.");
-DEFINE_FLAG(bool, verbose_stacktrace, false,
-    "Stack traces will include methods marked invisible.");
 
 
 const char* Exceptions::kCastErrorDstName = "type cast";
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc
index 0db52a3..ec53580 100644
--- a/runtime/vm/flow_graph.cc
+++ b/runtime/vm/flow_graph.cc
@@ -22,7 +22,7 @@
 FlowGraph::FlowGraph(ParsedFunction* parsed_function,
                      GraphEntryInstr* graph_entry,
                      intptr_t max_block_id)
-  : isolate_(Isolate::Current()),
+  : thread_(Thread::Current()),
     parent_(),
     current_ssa_temp_index_(0),
     max_block_id_(max_block_id),
@@ -43,8 +43,7 @@
     loop_invariant_loads_(NULL),
     guarded_fields_(parsed_function->guarded_fields()),
     deferred_prefixes_(parsed_function->deferred_prefixes()),
-    captured_parameters_(
-        new(isolate_) BitVector(isolate_, variable_count())) {
+    captured_parameters_(new(zone()) BitVector(zone(), variable_count())) {
   DiscoverBlocks();
 }
 
@@ -98,7 +97,7 @@
   ConstantInstr* constant = constant_instr_pool_.Lookup(object);
   if (constant == NULL) {
     // Otherwise, allocate and add it to the pool.
-    constant = new(isolate()) ConstantInstr(
+    constant = new(zone()) ConstantInstr(
         Object::ZoneHandle(isolate(), object.raw()));
     constant->set_ssa_temp_index(alloc_ssa_temp_index());
 
@@ -224,7 +223,7 @@
 
 void FlowGraph::MergeBlocks() {
   bool changed = false;
-  BitVector* merged = new(isolate()) BitVector(isolate(), postorder().length());
+  BitVector* merged = new(zone()) BitVector(zone(), postorder().length());
   for (BlockIterator block_it = reverse_postorder_iterator();
        !block_it.Done();
        block_it.Advance()) {
@@ -372,7 +371,7 @@
 LivenessAnalysis::LivenessAnalysis(
   intptr_t variable_count,
   const GrowableArray<BlockEntryInstr*>& postorder)
-    : isolate_(Isolate::Current()),
+    : zone_(Thread::Current()->zone()),
       variable_count_(variable_count),
       postorder_(postorder),
       live_out_(postorder.length()),
@@ -429,9 +428,9 @@
 void LivenessAnalysis::Analyze() {
   const intptr_t block_count = postorder_.length();
   for (intptr_t i = 0; i < block_count; i++) {
-    live_out_.Add(new(isolate()) BitVector(isolate(), variable_count_));
-    kill_.Add(new(isolate()) BitVector(isolate(), variable_count_));
-    live_in_.Add(new(isolate()) BitVector(isolate(), variable_count_));
+    live_out_.Add(new(zone()) BitVector(zone(), variable_count_));
+    kill_.Add(new(zone()) BitVector(zone(), variable_count_));
+    live_in_.Add(new(zone()) BitVector(zone(), variable_count_));
   }
 
   ComputeInitialSets();
@@ -548,7 +547,7 @@
 void VariableLivenessAnalysis::ComputeInitialSets() {
   const intptr_t block_count = postorder_.length();
 
-  BitVector* last_loads = new(isolate()) BitVector(isolate(), variable_count_);
+  BitVector* last_loads = new(zone()) BitVector(zone(), variable_count_);
   for (intptr_t i = 0; i < block_count; i++) {
     BlockEntryInstr* block = postorder_[i];
 
@@ -674,7 +673,7 @@
     idom.Add(parent_[i]);
     semi.Add(i);
     label.Add(i);
-    dominance_frontier->Add(new(isolate()) BitVector(isolate(), size));
+    dominance_frontier->Add(new(zone()) BitVector(zone(), size));
   }
 
   // Loop over the blocks in reverse preorder (not including the graph
@@ -844,7 +843,7 @@
     // are unknown and so treated like parameters.
     intptr_t count = IsCompiledForOsr() ? variable_count() : parameter_count();
     for (intptr_t i = 0; i < count; ++i) {
-      ParameterInstr* param = new(isolate()) ParameterInstr(i, entry);
+      ParameterInstr* param = new(zone()) ParameterInstr(i, entry);
       param->set_ssa_temp_index(alloc_ssa_temp_index());  // New SSA temp.
       AddToInitialDefinitions(param);
       env.Add(param);
@@ -930,7 +929,7 @@
   } else if (block_entry->IsCatchBlockEntry()) {
     // Add real definitions for all locals and parameters.
     for (intptr_t i = 0; i < env->length(); ++i) {
-      ParameterInstr* param = new(isolate()) ParameterInstr(i, block_entry);
+      ParameterInstr* param = new(zone()) ParameterInstr(i, block_entry);
       param->set_ssa_temp_index(alloc_ssa_temp_index());  // New SSA temp.
       (*env)[i] = param;
       block_entry->AsCatchBlockEntry()->initial_definitions()->Add(param);
@@ -1109,7 +1108,7 @@
         PhiInstr* phi = (*successor->phis())[i];
         if (phi != NULL) {
           // Rename input operand.
-          Value* use = new(isolate()) Value((*env)[i]);
+          Value* use = new(zone()) Value((*env)[i]);
           phi->SetInputAt(pred_index, use);
         }
       }
@@ -1194,7 +1193,7 @@
 // Design & Implementation" (Muchnick) p192.
 BitVector* FlowGraph::FindLoop(BlockEntryInstr* m, BlockEntryInstr* n) const {
   GrowableArray<BlockEntryInstr*> stack;
-  BitVector* loop = new(isolate()) BitVector(isolate(), preorder_.length());
+  BitVector* loop = new(zone()) BitVector(zone(), preorder_.length());
 
   loop->Add(n->preorder_number());
   if (n != m) {
@@ -1218,7 +1217,7 @@
 
 ZoneGrowableArray<BlockEntryInstr*>* FlowGraph::ComputeLoops() const {
   ZoneGrowableArray<BlockEntryInstr*>* loop_headers =
-      new(isolate()) ZoneGrowableArray<BlockEntryInstr*>();
+      new(zone()) ZoneGrowableArray<BlockEntryInstr*>();
 
   for (BlockIterator it = postorder_iterator();
        !it.Done();
@@ -1279,7 +1278,7 @@
 
 
 void FlowGraph::ComputeBlockEffects() {
-  block_effects_ = new(isolate()) BlockEffects(this);
+  block_effects_ = new(zone()) BlockEffects(this);
 }
 
 
@@ -1287,11 +1286,11 @@
     : available_at_(flow_graph->postorder().length()) {
   // We are tracking a single effect.
   ASSERT(EffectSet::kLastEffect == 1);
-  Isolate* isolate = flow_graph->isolate();
+  Zone* zone = flow_graph->zone();
   const intptr_t block_count = flow_graph->postorder().length();
 
   // Set of blocks that contain side-effects.
-  BitVector* kill = new(isolate) BitVector(isolate, block_count);
+  BitVector* kill = new(zone) BitVector(zone, block_count);
 
   // Per block available-after sets. Block A is available after the block B if
   // and only if A is either equal to B or A is available at B and B contains no
@@ -1317,7 +1316,7 @@
     }
   }
 
-  BitVector* temp = new(isolate) BitVector(isolate, block_count);
+  BitVector* temp = new(zone) BitVector(zone, block_count);
 
   // Recompute available-at based on predecessors' available-after until the fix
   // point is reached.
@@ -1350,9 +1349,9 @@
         // Available-at changed: update it and recompute available-after.
         if (available_at_[block_num] == NULL) {
           current = available_at_[block_num] =
-              new(isolate) BitVector(isolate, block_count);
+              new(zone) BitVector(zone, block_count);
           available_after[block_num] =
-              new(isolate) BitVector(isolate, block_count);
+              new(zone) BitVector(zone, block_count);
           // Block is always available after itself.
           available_after[block_num]->Add(block_num);
         }
diff --git a/runtime/vm/flow_graph.h b/runtime/vm/flow_graph.h
index eb48373..ad8256f 100644
--- a/runtime/vm/flow_graph.h
+++ b/runtime/vm/flow_graph.h
@@ -10,6 +10,7 @@
 #include "vm/hash_map.h"
 #include "vm/intermediate_language.h"
 #include "vm/parser.h"
+#include "vm/thread.h"
 
 namespace dart {
 
@@ -149,7 +150,9 @@
     return current_ssa_temp_index();
   }
 
-  Isolate* isolate() const { return isolate_; }
+  Thread* thread() const { return thread_; }
+  Zone* zone() const { return thread()->zone(); }
+  Isolate* isolate() const { return thread()->isolate(); }
 
   intptr_t max_block_id() const { return max_block_id_; }
   void set_max_block_id(intptr_t id) { max_block_id_ = id; }
@@ -325,7 +328,7 @@
   // indicates membership in the loop.
   BitVector* FindLoop(BlockEntryInstr* m, BlockEntryInstr* n) const;
 
-  Isolate* isolate_;
+  Thread* thread_;
 
   // DiscoverBlocks computes parent_ and assigned_vars_ which are then used
   // if/when computing SSA.
@@ -411,9 +414,9 @@
   // for blocks until they stop changing.
   void ComputeLiveInAndLiveOutSets();
 
-  Isolate* isolate() const { return isolate_; }
+  Zone* zone() const { return zone_; }
 
-  Isolate* isolate_;
+  Zone* zone_;
 
   const intptr_t variable_count_;
 
@@ -469,7 +472,7 @@
                      intptr_t initial_capacity)
       : defs_(initial_capacity),
         contains_vector_(
-            new BitVector(flow_graph->isolate(),
+            new BitVector(flow_graph->zone(),
                           flow_graph->current_ssa_temp_index())) {
   }
 
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index d52bc59..5e41375 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -164,7 +164,7 @@
       Instruction* current = it.Current();
 
       // Initialize location summary for instruction.
-      current->InitializeLocationSummary(Isolate::Current(), true);  // opt
+      current->InitializeLocationSummary(zone(), true);  // opt
       LocationSummary* locs = current->locs();
 #if DEBUG
       locs->DiscoverWritableInputs();
@@ -540,7 +540,7 @@
   const intptr_t block_count = postorder_.length();
   ASSERT(postorder_.Last()->IsGraphEntry());
   BitVector* current_interference_set = NULL;
-  Isolate* isolate = flow_graph_.isolate();
+  Zone* zone = flow_graph_.zone();
   for (intptr_t i = 0; i < (block_count - 1); i++) {
     BlockEntryInstr* block = postorder_[i];
 
@@ -558,8 +558,8 @@
 
     BlockInfo* loop_header = block_info->loop_header();
     if ((loop_header != NULL) && (loop_header->last_block() == block)) {
-      current_interference_set = new(isolate) BitVector(
-          isolate, flow_graph_.max_virtual_register_number());
+      current_interference_set = new(zone) BitVector(
+          zone, flow_graph_.max_virtual_register_number());
       ASSERT(loop_header->backedge_interference() == NULL);
       // All values flowing into the loop header are live at the back-edge and
       // can interfere with phi moves.
@@ -882,8 +882,7 @@
     const intptr_t block_start_pos = block->start_pos();
     const intptr_t use_pos = current->lifetime_position() + 1;
 
-    Location* locations =
-        Isolate::Current()->current_zone()->Alloc<Location>(env->Length());
+    Location* locations = flow_graph_.zone()->Alloc<Location>(env->Length());
 
     for (intptr_t i = 0; i < env->Length(); ++i) {
       Value* value = env->ValueAt(i);
@@ -956,8 +955,7 @@
   }
 
   // Initialize location for every input of the MaterializeObject instruction.
-  Location* locations =
-      Isolate::Current()->current_zone()->Alloc<Location>(mat->InputCount());
+  Location* locations = flow_graph_.zone()->Alloc<Location>(mat->InputCount());
   mat->set_locations(locations);
 
   for (intptr_t i = 0; i < mat->InputCount(); ++i) {
@@ -2025,9 +2023,9 @@
 void ReachingDefs::AddPhi(PhiInstr* phi) {
   // TODO(johnmccutchan): Fix handling of PhiInstr with PairLocation.
   if (phi->reaching_defs() == NULL) {
-    Isolate* isolate = Isolate::Current();
-    phi->set_reaching_defs(new(isolate) BitVector(
-        isolate, flow_graph_.max_virtual_register_number()));
+    Zone* zone = flow_graph_.zone();
+    phi->set_reaching_defs(new(zone) BitVector(
+        zone, flow_graph_.max_virtual_register_number()));
 
     // Compute initial set reaching defs set.
     bool depends_on_phi = false;
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 033e0a1..108180a 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -4303,7 +4303,8 @@
 
 void FlowGraphBuilder::PruneUnreachable() {
   ASSERT(osr_id_ != Isolate::kNoDeoptId);
-  BitVector* block_marks = new(I) BitVector(I, last_used_block_id_ + 1);
+  Zone* zone = parsed_function()->zone();
+  BitVector* block_marks = new(zone) BitVector(zone, last_used_block_id_ + 1);
   bool found = graph_entry_->PruneUnreachable(this, graph_entry_, NULL, osr_id_,
                                               block_marks);
   ASSERT(found);
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index fca8342..31c4fbe 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -63,7 +63,7 @@
 #define RECOGNIZE_FACTORY(test_factory_symbol, cid, fp)                        \
     if (String::EqualsIgnoringPrivateKey(                                      \
         factory_name, Symbols::test_factory_symbol())) {                       \
-      ASSERT(factory.CheckSourceFingerprint(fp));                              \
+      CHECK_FINGERPRINT2(factory, test_factory_symbol, cid, fp);               \
       return cid;                                                              \
     }                                                                          \
 
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 886daf5..eb65502 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -51,6 +51,9 @@
     "Enable inlining of SIMD related method calls.");
 DEFINE_FLAG(bool, source_lines, false, "Emit source line as assembly comment.");
 
+// Quick access to the locally defined isolate() method.
+#define I (isolate())
+
 // Assign locations to incoming arguments, i.e., values pushed above spill slots
 // with PushArgument.  Recursively allocates from outermost to innermost
 // environment.
@@ -1125,7 +1128,8 @@
 void FlowGraphCompiler::AllocateRegistersLocally(Instruction* instr) {
   ASSERT(!is_optimizing());
 
-  instr->InitializeLocationSummary(isolate(), false);  // Not optimizing.
+  instr->InitializeLocationSummary(I->current_zone(),
+                                   false);  // Not optimizing.
   LocationSummary* locs = instr->locs();
 
   bool blocked_registers[kNumberOfCpuRegisters];
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index 6bd06e1..5f48473 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -1220,11 +1220,14 @@
 
 int32_t FlowGraphCompiler::EdgeCounterIncrementSizeInBytes() {
   // Used by CodePatcher; so must be constant across all code in an isolate.
+  int32_t size = 3 * Instr::kInstrSize;
 #if defined(DEBUG)
-  return (VerifiedMemory::enabled() ? 42 : 19) * Instr::kInstrSize;
-#else
-  return 3 * Instr::kInstrSize;
+  size += 35 * Instr::kInstrSize;
 #endif  // DEBUG
+  if (VerifiedMemory::enabled()) {
+    size += 20 * Instr::kInstrSize;
+  }
+  return size;
 }
 
 
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 33eb9e5..d1aeafe 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -978,78 +978,23 @@
 
 
 void FlowGraphCompiler::EmitFrameEntry() {
+  ASSERT(Assembler::EntryPointToPcMarkerOffset() == 0);
+
   const Function& function = parsed_function().function();
-  Register new_pp = kNoRegister;
-  Register new_pc = kNoRegister;
-  if (CanOptimizeFunction() &&
-      function.IsOptimizable() &&
-      (!is_optimizing() || may_reoptimize())) {
-    StubCode* stub_code = isolate()->stub_code();
-    const Register function_reg = RDI;
-    new_pp = R13;
-    new_pc = R12;
+  const Register new_pp = R13;
+  const Register new_pc = R12;
 
-    Label next;
-    __ nop(4);  // Need a fixed size sequence on frame entry.
-    __ call(&next);
-    __ Bind(&next);
+  // Load PC marker.
+  const intptr_t kRIPRelativeLeaqSize = 7;
+  const intptr_t entry_to_rip_offset = __ CodeSize() + kRIPRelativeLeaqSize;
+  __ leaq(new_pc, Address::AddressRIPRelative(-entry_to_rip_offset));
+  ASSERT(__ CodeSize() == entry_to_rip_offset);
 
-    const intptr_t object_pool_pc_dist =
-        Instructions::HeaderSize() - Instructions::object_pool_offset() +
-        __ CodeSize();
-    const intptr_t offset =
-        Assembler::EntryPointToPcMarkerOffset() - __ CodeSize();
-    __ popq(new_pc);
-    if (offset != 0) {
-      __ addq(new_pc, Immediate(offset));
-    }
+  // Load pool pointer.
+  const intptr_t object_pool_pc_dist =
+      Instructions::HeaderSize() - Instructions::object_pool_offset();
+  __ movq(new_pp, Address(new_pc, -object_pool_pc_dist));
 
-    // Load callee's pool pointer.
-    __ movq(new_pp, Address(new_pc, -object_pool_pc_dist - offset));
-
-    // Load function object using the callee's pool pointer.
-    __ LoadObject(function_reg, function, new_pp);
-
-    // Patch point is after the eventually inlined function object.
-    entry_patch_pc_offset_ = assembler()->CodeSize();
-
-    // Reoptimization of an optimized function is triggered by counting in
-    // IC stubs, but not at the entry of the function.
-    if (!is_optimizing()) {
-      __ incl(FieldAddress(function_reg, Function::usage_counter_offset()));
-    }
-    __ cmpl(
-        FieldAddress(function_reg, Function::usage_counter_offset()),
-        Immediate(GetOptimizationThreshold()));
-    ASSERT(function_reg == RDI);
-    __ J(GREATER_EQUAL, &stub_code->OptimizeFunctionLabel(), R13);
-  } else if (!flow_graph().IsCompiledForOsr()) {
-    // We have to load the PP here too because a load of an external label
-    // may be patched at the AddCurrentDescriptor below.
-    new_pp = R13;
-    new_pc = R12;
-
-    Label next;
-    __ nop(4);  // Need a fixed size sequence on frame entry.
-    __ call(&next);
-    __ Bind(&next);
-
-    const intptr_t object_pool_pc_dist =
-        Instructions::HeaderSize() - Instructions::object_pool_offset() +
-        __ CodeSize();
-    const intptr_t offset =
-        Assembler::EntryPointToPcMarkerOffset() - __ CodeSize();
-    __ popq(new_pc);
-    if (offset != 0) {
-      __ addq(new_pc, Immediate(offset));
-    }
-
-    // Load callee's pool pointer.
-    __ movq(new_pp, Address(new_pc, -object_pool_pc_dist - offset));
-
-    entry_patch_pc_offset_ = assembler()->CodeSize();
-  }
-  __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
     intptr_t extra_slots = StackSize()
         - flow_graph().num_stack_locals()
@@ -1057,7 +1002,33 @@
     ASSERT(extra_slots >= 0);
     __ EnterOsrFrame(extra_slots * kWordSize, new_pp, new_pc);
   } else {
+    if (CanOptimizeFunction() &&
+        function.IsOptimizable() &&
+        (!is_optimizing() || may_reoptimize())) {
+      const Register function_reg = RDI;
+      // Load function object using the callee's pool pointer.
+      __ LoadObject(function_reg, function, new_pp);
+
+      // Patch point is after the eventually inlined function object.
+      entry_patch_pc_offset_ = assembler()->CodeSize();
+
+      // Reoptimization of an optimized function is triggered by counting in
+      // IC stubs, but not at the entry of the function.
+      if (!is_optimizing()) {
+        __ incl(FieldAddress(function_reg, Function::usage_counter_offset()));
+      }
+      __ cmpl(
+          FieldAddress(function_reg, Function::usage_counter_offset()),
+          Immediate(GetOptimizationThreshold()));
+      ASSERT(function_reg == RDI);
+      __ J(GREATER_EQUAL,
+           &isolate()->stub_code()->OptimizeFunctionLabel(),
+           new_pp);
+    } else {
+      entry_patch_pc_offset_ = assembler()->CodeSize();
+    }
     ASSERT(StackSize() >= 0);
+    __ Comment("Enter frame");
     __ EnterDartFrameWithInfo(StackSize() * kWordSize, new_pp, new_pc);
   }
 }
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 2e8580a..f0ab75e 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -64,6 +64,9 @@
 DECLARE_FLAG(bool, print_flow_graph_optimized);
 DECLARE_FLAG(bool, verify_compiler);
 
+// Quick access to the current zone.
+#define Z (zone())
+
 #define TRACE_INLINING(statement)                                              \
   do {                                                                         \
     if (FLAG_trace_inlining) statement;                                        \
@@ -438,6 +441,7 @@
   TargetEntryInstr* BuildDecisionGraph();
 
   Isolate* isolate() const;
+  Zone* zone() const;
 
   CallSiteInliner* const owner_;
   PolymorphicInstanceCallInstr* const call_;
@@ -490,13 +494,18 @@
 
   FlowGraph* caller_graph() const { return caller_graph_; }
 
+  Thread* thread() const { return caller_graph_->thread(); }
   Isolate* isolate() const { return caller_graph_->isolate(); }
+  Zone* zone() const { return caller_graph_->zone(); }
 
   // Inlining heuristics based on Cooper et al. 2008.
   bool ShouldWeInline(const Function& callee,
                       intptr_t instr_count,
                       intptr_t call_site_count,
                       intptr_t const_arg_count) {
+    if (FlowGraphInliner::AlwaysInline(callee)) {
+      return true;
+    }
     if (inlined_size_ > FLAG_inlining_caller_size_threshold) {
       // Prevent methods becoming humongous and thus slow to compile.
       return false;
@@ -519,9 +528,6 @@
         (instr_count <= FLAG_inlining_constant_arguments_min_size_threshold)) {
       return true;
     }
-    if (FlowGraphInliner::AlwaysInline(callee)) {
-      return true;
-    }
     return false;
   }
 
@@ -585,9 +591,9 @@
                                   FlowGraph* graph) {
     ConstantInstr* constant = argument->definition()->AsConstant();
     if (constant != NULL) {
-      return new(isolate()) ConstantInstr(constant->value());
+      return new(Z) ConstantInstr(constant->value());
     } else {
-      return new(isolate()) ParameterInstr(i, graph->graph_entry());
+      return new(Z) ParameterInstr(i, graph->graph_entry());
     }
   }
 
@@ -674,12 +680,12 @@
 
       // Load IC data for the callee.
       ZoneGrowableArray<const ICData*>* ic_data_array =
-            new(isolate()) ZoneGrowableArray<const ICData*>();
+            new(Z) ZoneGrowableArray<const ICData*>();
       function.RestoreICDataMap(ic_data_array);
 
       // Build the callee graph.
       InlineExitCollector* exit_collector =
-          new(isolate()) InlineExitCollector(caller_graph_, call);
+          new(Z) InlineExitCollector(caller_graph_, call);
       FlowGraphBuilder builder(parsed_function,
                                *ic_data_array,
                                exit_collector,
@@ -698,7 +704,7 @@
       // without linking between the caller and callee graphs.
       // TODO(zerny): Put more information in the stubs, eg, type information.
       ZoneGrowableArray<Definition*>* param_stubs =
-          new(isolate()) ZoneGrowableArray<Definition*>(
+          new(Z) ZoneGrowableArray<Definition*>(
               function.NumParameters());
 
       // Create a parameter stub for each fixed positional parameter.
@@ -973,7 +979,7 @@
       CurrentContextInstr* context = (*defns)[i]->AsCurrentContext();
       if ((context != NULL) && context->HasUses()) {
         ASSERT(call->IsClosureCall());
-        LoadFieldInstr* context_load = new(isolate()) LoadFieldInstr(
+        LoadFieldInstr* context_load = new(Z) LoadFieldInstr(
             new Value((*arguments)[0]->definition()),
             Closure::context_offset(),
             AbstractType::ZoneHandle(isolate(), AbstractType::null()),
@@ -1010,7 +1016,7 @@
     }
     *in_cache = false;
     ParsedFunction* parsed_function =
-        new(isolate()) ParsedFunction(isolate(), function);
+        new(Z) ParsedFunction(thread(), function);
     Parser::ParseFunction(parsed_function);
     parsed_function->AllocateVariables();
     return parsed_function;
@@ -1172,7 +1178,7 @@
             Object::ZoneHandle(
                 parsed_function.default_parameter_values().At(
                     i - fixed_param_count));
-        ConstantInstr* constant = new(isolate()) ConstantInstr(object);
+        ConstantInstr* constant = new(Z) ConstantInstr(object);
         arguments->Add(NULL);
         param_stubs->Add(constant);
       }
@@ -1260,7 +1266,7 @@
       inlined_variants_(num_variants_),
       non_inlined_variants_(num_variants_),
       inlined_entries_(num_variants_),
-      exit_collector_(new(isolate())
+      exit_collector_(new(Z)
           InlineExitCollector(owner->caller_graph(), call)),
       caller_function_(caller_function) {
 }
@@ -1271,6 +1277,11 @@
 }
 
 
+Zone* PolymorphicInliner::zone() const {
+  return owner_->caller_graph()->zone();
+}
+
+
 // Inlined bodies are shared if two different class ids have the same
 // inlined target.  This sharing is represented by using three different
 // types of entries in the inlined_entries_ array:
@@ -1310,7 +1321,7 @@
             new TargetEntryInstr(owner_->caller_graph()->allocate_block_id(),
                                  old_target->try_index());
         new_target->InheritDeoptTarget(isolate(), new_join);
-        GotoInstr* new_goto = new(isolate()) GotoInstr(new_join);
+        GotoInstr* new_goto = new(Z) GotoInstr(new_join);
         new_goto->InheritDeoptTarget(isolate(), new_join);
         new_target->LinkTo(new_goto);
         new_target->set_last_instruction(new_goto);
@@ -1372,7 +1383,7 @@
   // hoisted above the inlined entry.
   ASSERT(arguments.length() > 0);
   Value* actual = arguments[0];
-  RedefinitionInstr* redefinition = new(isolate())
+  RedefinitionInstr* redefinition = new(Z)
       RedefinitionInstr(actual->Copy(isolate()));
   redefinition->set_ssa_temp_index(
       owner_->caller_graph()->alloc_ssa_temp_index());
@@ -1399,7 +1410,7 @@
     CurrentContextInstr* context = (*defns)[i]->AsCurrentContext();
     if ((context != NULL) && context->HasUses()) {
       ASSERT(call_data.call->IsClosureCall());
-      LoadFieldInstr* context_load = new(isolate()) LoadFieldInstr(
+      LoadFieldInstr* context_load = new(Z) LoadFieldInstr(
           new Value(redefinition),
           Closure::context_offset(),
           AbstractType::ZoneHandle(isolate(), AbstractType::null()),
@@ -1436,7 +1447,7 @@
   GrowableArray<Definition*> arguments(call_->ArgumentCount());
   Definition* receiver = call_->ArgumentAt(0);
     RedefinitionInstr* redefinition =
-        new(isolate()) RedefinitionInstr(new(isolate()) Value(receiver));
+        new(Z) RedefinitionInstr(new(Z) Value(receiver));
     redefinition->set_ssa_temp_index(
         owner_->caller_graph()->alloc_ssa_temp_index());
   if (optimizer.TryInlineRecognizedMethod(receiver_cid,
@@ -1449,11 +1460,11 @@
     // Create a graph fragment.
     redefinition->InsertAfter(entry);
     InlineExitCollector* exit_collector =
-        new(isolate()) InlineExitCollector(owner_->caller_graph(), call_);
+        new(Z) InlineExitCollector(owner_->caller_graph(), call_);
 
     ReturnInstr* result =
-        new(isolate()) ReturnInstr(call_->instance_call()->token_pos(),
-            new(isolate()) Value(last));
+        new(Z) ReturnInstr(call_->instance_call()->token_pos(),
+            new(Z) Value(last));
     owner_->caller_graph()->AppendTo(
         last,
         result,
@@ -1462,7 +1473,7 @@
     entry->set_last_instruction(result);
     exit_collector->AddExit(result);
     GraphEntryInstr* graph_entry =
-        new(isolate()) GraphEntryInstr(NULL,  // No parsed function.
+        new(Z) GraphEntryInstr(NULL,  // No parsed function.
                                        entry,
                                        Isolate::kNoDeoptId);  // No OSR id.
     // Update polymorphic inliner state.
@@ -1483,7 +1494,7 @@
 TargetEntryInstr* PolymorphicInliner::BuildDecisionGraph() {
   // Start with a fresh target entry.
   TargetEntryInstr* entry =
-      new(isolate()) TargetEntryInstr(
+      new(Z) TargetEntryInstr(
           owner_->caller_graph()->allocate_block_id(),
           call_->GetBlock()->try_index());
   entry->InheritDeoptTarget(isolate(), call_);
@@ -1498,7 +1509,7 @@
   // There are at least two variants including non-inlined ones, so we have
   // at least one branch on the class id.
   LoadClassIdInstr* load_cid =
-      new(isolate()) LoadClassIdInstr(new(isolate()) Value(receiver));
+      new(Z) LoadClassIdInstr(new(Z) Value(receiver));
   load_cid->set_ssa_temp_index(owner_->caller_graph()->alloc_ssa_temp_index());
   cursor = AppendInstruction(cursor, load_cid);
   for (intptr_t i = 0; i < inlined_variants_.length(); ++i) {
@@ -1508,12 +1519,12 @@
       // If it is the last variant use a check class id instruction which can
       // deoptimize, followed unconditionally by the body.
       RedefinitionInstr* cid_redefinition =
-          new RedefinitionInstr(new(isolate()) Value(load_cid));
+          new RedefinitionInstr(new(Z) Value(load_cid));
       cid_redefinition->set_ssa_temp_index(
           owner_->caller_graph()->alloc_ssa_temp_index());
       cursor = AppendInstruction(cursor, cid_redefinition);
-      CheckClassIdInstr* check_class_id = new(isolate()) CheckClassIdInstr(
-          new(isolate()) Value(cid_redefinition),
+      CheckClassIdInstr* check_class_id = new(Z) CheckClassIdInstr(
+          new(Z) Value(cid_redefinition),
           inlined_variants_[i].cid,
           call_->deopt_id());
       check_class_id->InheritDeoptTarget(isolate(), call_);
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index b89159c..2295106 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -47,8 +47,9 @@
 DECLARE_FLAG(bool, trace_type_check_elimination);
 DECLARE_FLAG(bool, warn_on_javascript_compatibility);
 
-// Quick access to the locally defined isolate() method.
+// Quick access to the current isolate and zone.
 #define I (isolate())
+#define Z (zone())
 
 static bool ShouldInlineSimd() {
   return FlowGraphCompiler::SupportsUnboxedSimd128();
@@ -177,12 +178,12 @@
     }
   }
 
-  const Array& args_desc_array = Array::Handle(I,
+  const Array& args_desc_array = Array::Handle(Z,
       ArgumentsDescriptor::New(call->ArgumentCount(), call->argument_names()));
   ArgumentsDescriptor args_desc(args_desc_array);
-  const Class& receiver_class = Class::Handle(I,
+  const Class& receiver_class = Class::Handle(Z,
       isolate()->class_table()->At(class_ids[0]));
-  const Function& function = Function::Handle(I,
+  const Function& function = Function::Handle(Z,
       Resolver::ResolveDynamicForReceiverClass(
           receiver_class,
           call->function_name(),
@@ -194,7 +195,7 @@
   // since it is attached to the assembly instruction itself.
   // TODO(srdjan): Prevent modification of ICData object that is
   // referenced in assembly code.
-  ICData& ic_data = ICData::ZoneHandle(I, ICData::New(
+  ICData& ic_data = ICData::ZoneHandle(Z, ICData::New(
       flow_graph_->parsed_function()->function(),
       call->function_name(),
       args_desc_array,
@@ -220,13 +221,13 @@
   }
 
   const Function& function =
-      Function::Handle(I, ic_data.GetTargetForReceiverClassId(cid));
+      Function::Handle(Z, ic_data.GetTargetForReceiverClassId(cid));
   // TODO(fschneider): Try looking up the function on the class if it is
   // not found in the ICData.
   if (!function.IsNull()) {
-    const ICData& new_ic_data = ICData::ZoneHandle(I, ICData::New(
-        Function::Handle(I, ic_data.owner()),
-        String::Handle(I, ic_data.target_name()),
+    const ICData& new_ic_data = ICData::ZoneHandle(Z, ICData::New(
+        Function::Handle(Z, ic_data.owner()),
+        String::Handle(Z, ic_data.target_name()),
         Object::empty_array(),  // Dummy argument descriptor.
         ic_data.deopt_id(),
         ic_data.NumArgsTested()));
@@ -259,7 +260,7 @@
 
   const bool with_checks = false;
   PolymorphicInstanceCallInstr* specialized =
-      new(I) PolymorphicInstanceCallInstr(call->instance_call(),
+      new(Z) PolymorphicInstanceCallInstr(call->instance_call(),
                                           ic_data,
                                           with_checks);
   call->ReplaceWith(specialized, current_iterator());
@@ -312,10 +313,10 @@
   ASSERT(bit_and_instr->IsBinarySmiOp() || bit_and_instr->IsBinaryMintOp());
   if (bit_and_instr->IsBinaryMintOp()) {
     // Replace Mint op with Smi op.
-    BinarySmiOpInstr* smi_op = new(I) BinarySmiOpInstr(
+    BinarySmiOpInstr* smi_op = new(Z) BinarySmiOpInstr(
         Token::kBIT_AND,
-        new(I) Value(left_instr),
-        new(I) Value(right_instr),
+        new(Z) Value(left_instr),
+        new(Z) Value(right_instr),
         Isolate::kNoDeoptId);  // BIT_AND cannot deoptimize.
     bit_and_instr->ReplaceWith(smi_op, current_iterator());
   }
@@ -331,10 +332,10 @@
                                                     intptr_t cid) {
   const intptr_t index_scale = Instance::ElementSizeFor(cid);
   ConstantInstr* index_instr =
-      flow_graph()->GetConstant(Smi::Handle(I, Smi::New(ix)));
+      flow_graph()->GetConstant(Smi::Handle(Z, Smi::New(ix)));
   LoadIndexedInstr* load =
-      new(I) LoadIndexedInstr(new(I) Value(instr),
-                                      new(I) Value(index_instr),
+      new(Z) LoadIndexedInstr(new(Z) Value(instr),
+                                      new(Z) Value(index_instr),
                                       index_scale,
                                       cid,
                                       Isolate::kNoDeoptId,
@@ -349,7 +350,7 @@
                                                          Representation rep,
                                                          intptr_t cid) {
   ExtractNthOutputInstr* extract =
-      new(I) ExtractNthOutputInstr(new(I) Value(instr), index, rep, cid);
+      new(Z) ExtractNthOutputInstr(new(Z) Value(instr), index, rep, cid);
   instr->ReplaceUsesWith(extract);
   flow_graph()->InsertAfter(instr, extract, NULL, FlowGraph::kValue);
 }
@@ -410,12 +411,12 @@
             MergedMathInstr::OutputIndexOf(other_binop->op_kind()),
             kTagged, kSmiCid);
 
-        ZoneGrowableArray<Value*>* args = new(I) ZoneGrowableArray<Value*>(2);
-        args->Add(new(I) Value(curr_instr->left()->definition()));
-        args->Add(new(I) Value(curr_instr->right()->definition()));
+        ZoneGrowableArray<Value*>* args = new(Z) ZoneGrowableArray<Value*>(2);
+        args->Add(new(Z) Value(curr_instr->left()->definition()));
+        args->Add(new(Z) Value(curr_instr->right()->definition()));
 
         // Replace with TruncDivMod.
-        MergedMathInstr* div_mod = new(I) MergedMathInstr(
+        MergedMathInstr* div_mod = new(Z) MergedMathInstr(
             args,
             curr_instr->deopt_id(),
             MergedMathInstr::kTruncDivMod);
@@ -470,11 +471,11 @@
             other_op,
             MergedMathInstr::OutputIndexOf(other_kind),
             kUnboxedDouble, kDoubleCid);
-        ZoneGrowableArray<Value*>* args = new(I) ZoneGrowableArray<Value*>(1);
-        args->Add(new(I) Value(curr_instr->value()->definition()));
+        ZoneGrowableArray<Value*>* args = new(Z) ZoneGrowableArray<Value*>(1);
+        args->Add(new(Z) Value(curr_instr->value()->definition()));
         // Replace with SinCos.
         MergedMathInstr* sin_cos =
-            new(I) MergedMathInstr(args,
+            new(Z) MergedMathInstr(args,
                                    curr_instr->DeoptimizationTarget(),
                                    MergedMathInstr::kSinCos);
         curr_instr->ReplaceWith(sin_cos, current_iterator());
@@ -635,7 +636,7 @@
   if (IsUnboxedInteger(from) && IsUnboxedInteger(to)) {
     const intptr_t deopt_id = (to == kUnboxedInt32) && (deopt_target != NULL) ?
       deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new(I) UnboxedIntConverterInstr(from,
+    converted = new(Z) UnboxedIntConverterInstr(from,
                                                 to,
                                                 use->CopyWithType(),
                                                 deopt_id);
@@ -666,7 +667,7 @@
     Definition* boxed = BoxInstr::Create(from, use->CopyWithType());
     use->BindTo(boxed);
     InsertBefore(insert_before, boxed, NULL, FlowGraph::kValue);
-    converted = UnboxInstr::Create(to, new(I) Value(boxed), deopt_id);
+    converted = UnboxInstr::Create(to, new(Z) Value(boxed), deopt_id);
   }
   ASSERT(converted != NULL);
   InsertBefore(insert_before, converted, use->instruction()->env(),
@@ -1017,7 +1018,7 @@
                                      Instruction* insert_before) {
   if (to_check->Type()->ToCid() != kSmiCid) {
     InsertBefore(insert_before,
-                 new(I) CheckSmiInstr(new(I) Value(to_check),
+                 new(Z) CheckSmiInstr(new(Z) Value(to_check),
                                       deopt_id,
                                       insert_before->token_pos()),
                  deopt_environment,
@@ -1032,12 +1033,12 @@
                                                intptr_t token_pos) {
   if ((unary_checks.NumberOfUsedChecks() == 1) &&
       unary_checks.HasReceiverClassId(kSmiCid)) {
-    return new(I) CheckSmiInstr(new(I) Value(to_check),
+    return new(Z) CheckSmiInstr(new(Z) Value(to_check),
                                 deopt_id,
                                 token_pos);
   }
-  return new(I) CheckClassInstr(
-      new(I) Value(to_check), deopt_id, unary_checks, token_pos);
+  return new(Z) CheckClassInstr(
+      new(Z) Value(to_check), deopt_id, unary_checks, token_pos);
 }
 
 
@@ -1055,7 +1056,7 @@
 
 void FlowGraphOptimizer::AddReceiverCheck(InstanceCallInstr* call) {
   AddCheckClass(call->ArgumentAt(0),
-                ICData::ZoneHandle(I, call->ic_data()->AsUnaryClassChecks()),
+                ICData::ZoneHandle(Z, call->ic_data()->AsUnaryClassChecks()),
                 call->deopt_id(),
                 call->env(),
                 call);
@@ -1166,50 +1167,15 @@
 }
 
 
-bool FlowGraphOptimizer::TryReplaceWithStoreIndexed(InstanceCallInstr* call) {
+bool FlowGraphOptimizer::TryReplaceWithIndexedOp(InstanceCallInstr* call) {
   // Check for monomorphic IC data.
   if (!call->HasICData()) return false;
   const ICData& ic_data =
-      ICData::Handle(I, call->ic_data()->AsUnaryClassChecks());
+      ICData::Handle(Z, call->ic_data()->AsUnaryClassChecks());
   if (ic_data.NumberOfChecks() != 1) {
     return false;
   }
-  ASSERT(ic_data.NumberOfUsedChecks() == 1);
-  ASSERT(ic_data.HasOneTarget());
-
-  const Function& target = Function::Handle(I, ic_data.GetTargetAt(0));
-  TargetEntryInstr* entry;
-  Definition* last;
-  if (!TryInlineRecognizedMethod(ic_data.GetReceiverClassIdAt(0),
-                                 target,
-                                 call,
-                                 call->ArgumentAt(0),
-                                 call->token_pos(),
-                                 *call->ic_data(),
-                                 &entry, &last)) {
-    return false;
-  }
-  // Insert receiver class check.
-  AddReceiverCheck(call);
-  // Remove the original push arguments.
-  for (intptr_t i = 0; i < call->ArgumentCount(); ++i) {
-    PushArgumentInstr* push = call->PushArgumentAt(i);
-    push->ReplaceUsesWith(push->value()->definition());
-    push->RemoveFromGraph();
-  }
-  // Replace all uses of this definition with the result.
-  call->ReplaceUsesWith(last);
-  // Finally insert the sequence other definition in place of this one in the
-  // graph.
-  call->previous()->LinkTo(entry->next());
-  entry->UnuseAllInputs();  // Entry block is not in the graph.
-  last->LinkTo(call);
-  // Remove through the iterator.
-  ASSERT(current_iterator()->Current() == call);
-  current_iterator()->RemoveCurrentFromGraph();
-  call->set_previous(NULL);
-  call->set_next(NULL);
-  return true;
+  return TryReplaceInstanceCallWithInline(call);
 }
 
 
@@ -1219,7 +1185,6 @@
     Instruction* call,
     Definition* receiver,
     intptr_t token_pos,
-    const ICData* ic_data,
     const ICData& value_check,
     TargetEntryInstr** entry,
     Definition** last) {
@@ -1230,7 +1195,7 @@
   Definition* index = call->ArgumentAt(1);
   Definition* stored_value = call->ArgumentAt(2);
 
-  *entry = new(I) TargetEntryInstr(flow_graph()->allocate_block_id(),
+  *entry = new(Z) TargetEntryInstr(flow_graph()->allocate_block_id(),
                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(I, call);
   Instruction* cursor = *entry;
@@ -1239,19 +1204,19 @@
     // needed here because we insert a deoptimizing smi-check for the case
     // the index is not a smi.
     const AbstractType& value_type =
-        AbstractType::ZoneHandle(I, target.ParameterTypeAt(2));
+        AbstractType::ZoneHandle(Z, target.ParameterTypeAt(2));
     Definition* instantiator = NULL;
     Definition* type_args = NULL;
     switch (array_cid) {
       case kArrayCid:
       case kGrowableObjectArrayCid: {
-        const Class& instantiator_class =  Class::Handle(I, target.Owner());
+        const Class& instantiator_class =  Class::Handle(Z, target.Owner());
         intptr_t type_arguments_field_offset =
             instantiator_class.type_arguments_field_offset();
         LoadFieldInstr* load_type_args =
-            new(I) LoadFieldInstr(new(I) Value(array),
+            new(Z) LoadFieldInstr(new(Z) Value(array),
                                   type_arguments_field_offset,
-                                  Type::ZoneHandle(I),  // No type.
+                                  Type::ZoneHandle(Z),  // No type.
                                   call->token_pos());
         cursor = flow_graph()->AppendTo(cursor,
                                         load_type_args,
@@ -1302,10 +1267,10 @@
         UNREACHABLE();
     }
     AssertAssignableInstr* assert_value =
-        new(I) AssertAssignableInstr(token_pos,
-                                     new(I) Value(stored_value),
-                                     new(I) Value(instantiator),
-                                     new(I) Value(type_args),
+        new(Z) AssertAssignableInstr(token_pos,
+                                     new(Z) Value(stored_value),
+                                     new(Z) Value(instantiator),
+                                     new(Z) Value(type_args),
                                      value_type,
                                      Symbols::Value(),
                                      call->deopt_id());
@@ -1346,24 +1311,24 @@
 
   if (array_cid == kTypedDataFloat32ArrayCid) {
     stored_value =
-        new(I) DoubleToFloatInstr(
-            new(I) Value(stored_value), call->deopt_id());
+        new(Z) DoubleToFloatInstr(
+            new(Z) Value(stored_value), call->deopt_id());
     cursor = flow_graph()->AppendTo(cursor,
                                     stored_value,
                                     NULL,
                                     FlowGraph::kValue);
   } else if (array_cid == kTypedDataInt32ArrayCid) {
-    stored_value = new(I) UnboxInt32Instr(
+    stored_value = new(Z) UnboxInt32Instr(
         UnboxInt32Instr::kTruncate,
-        new(I) Value(stored_value),
+        new(Z) Value(stored_value),
         call->deopt_id());
     cursor = flow_graph()->AppendTo(cursor,
                                     stored_value,
                                     call->env(),
                                     FlowGraph::kValue);
   } else if (array_cid == kTypedDataUint32ArrayCid) {
-    stored_value = new(I) UnboxUint32Instr(
-        new(I) Value(stored_value),
+    stored_value = new(Z) UnboxUint32Instr(
+        new(Z) Value(stored_value),
         call->deopt_id());
     ASSERT(stored_value->AsUnboxInteger()->is_truncating());
     cursor = flow_graph()->AppendTo(cursor,
@@ -1373,9 +1338,9 @@
   }
 
   const intptr_t index_scale = Instance::ElementSizeFor(array_cid);
-  *last = new(I) StoreIndexedInstr(new(I) Value(array),
-                                   new(I) Value(index),
-                                   new(I) Value(stored_value),
+  *last = new(Z) StoreIndexedInstr(new(Z) Value(array),
+                                   new(Z) Value(index),
+                                   new(Z) Value(stored_value),
                                    needs_store_barrier,
                                    index_scale,
                                    array_cid,
@@ -1397,7 +1362,7 @@
                                                    const ICData& ic_data,
                                                    TargetEntryInstr** entry,
                                                    Definition** last) {
-  ICData& value_check = ICData::ZoneHandle(I);
+  ICData& value_check = ICData::ZoneHandle(Z);
   MethodRecognizer::Kind kind = MethodRecognizer::RecognizeKind(target);
   switch (kind) {
     // Recognized [] operators.
@@ -1411,29 +1376,29 @@
     case MethodRecognizer::kExternalUint8ClampedArrayGetIndexed:
     case MethodRecognizer::kInt16ArrayGetIndexed:
     case MethodRecognizer::kUint16ArrayGetIndexed:
-      return InlineGetIndexed(kind, call, receiver, ic_data, entry, last);
+      return InlineGetIndexed(kind, call, receiver, entry, last);
     case MethodRecognizer::kFloat32ArrayGetIndexed:
     case MethodRecognizer::kFloat64ArrayGetIndexed:
       if (!CanUnboxDouble()) {
         return false;
       }
-      return InlineGetIndexed(kind, call, receiver, ic_data, entry, last);
+      return InlineGetIndexed(kind, call, receiver, entry, last);
     case MethodRecognizer::kFloat32x4ArrayGetIndexed:
     case MethodRecognizer::kFloat64x2ArrayGetIndexed:
       if (!ShouldInlineSimd()) {
         return false;
       }
-      return InlineGetIndexed(kind, call, receiver, ic_data, entry, last);
+      return InlineGetIndexed(kind, call, receiver, entry, last);
     case MethodRecognizer::kInt32ArrayGetIndexed:
     case MethodRecognizer::kUint32ArrayGetIndexed:
       if (!CanUnboxInt32()) return false;
-      return InlineGetIndexed(kind, call, receiver, ic_data, entry, last);
+      return InlineGetIndexed(kind, call, receiver, entry, last);
 
     case MethodRecognizer::kInt64ArrayGetIndexed:
       if (!ShouldInlineInt64ArrayOps()) {
         return false;
       }
-      return InlineGetIndexed(kind, call, receiver, ic_data, entry, last);
+      return InlineGetIndexed(kind, call, receiver, entry, last);
     // Recognized []= operators.
     case MethodRecognizer::kObjectArraySetIndexed:
     case MethodRecognizer::kGrowableArraySetIndexed:
@@ -1441,7 +1406,7 @@
         value_check = ic_data.AsUnaryClassChecksForArgNr(2);
       }
       return InlineSetIndexed(kind, target, call, receiver, token_pos,
-                              &ic_data, value_check, entry, last);
+                              value_check, entry, last);
     case MethodRecognizer::kInt8ArraySetIndexed:
     case MethodRecognizer::kUint8ArraySetIndexed:
     case MethodRecognizer::kUint8ClampedArraySetIndexed:
@@ -1454,7 +1419,7 @@
       }
       value_check = ic_data.AsUnaryClassChecksForArgNr(2);
       return InlineSetIndexed(kind, target, call, receiver, token_pos,
-                              &ic_data, value_check, entry, last);
+                              value_check, entry, last);
     case MethodRecognizer::kInt32ArraySetIndexed:
     case MethodRecognizer::kUint32ArraySetIndexed:
       // Check that value is always smi or mint. We use Int32/Uint32 unboxing
@@ -1464,13 +1429,13 @@
         return false;
       }
       return InlineSetIndexed(kind, target, call, receiver, token_pos,
-                              &ic_data, value_check, entry, last);
+                              value_check, entry, last);
     case MethodRecognizer::kInt64ArraySetIndexed:
       if (!ShouldInlineInt64ArrayOps()) {
         return false;
       }
       return InlineSetIndexed(kind, target, call, receiver, token_pos,
-                              &ic_data, value_check, entry, last);
+                              value_check, entry, last);
     case MethodRecognizer::kFloat32ArraySetIndexed:
     case MethodRecognizer::kFloat64ArraySetIndexed:
       if (!CanUnboxDouble()) {
@@ -1482,7 +1447,7 @@
       }
       value_check = ic_data.AsUnaryClassChecksForArgNr(2);
       return InlineSetIndexed(kind, target, call, receiver, token_pos,
-                              &ic_data, value_check, entry, last);
+                              value_check, entry, last);
     case MethodRecognizer::kFloat32x4ArraySetIndexed:
       if (!ShouldInlineSimd()) {
         return false;
@@ -1493,7 +1458,7 @@
       }
       value_check = ic_data.AsUnaryClassChecksForArgNr(2);
       return InlineSetIndexed(kind, target, call, receiver, token_pos,
-                              &ic_data, value_check, entry, last);
+                              value_check, entry, last);
     case MethodRecognizer::kFloat64x2ArraySetIndexed:
       if (!ShouldInlineSimd()) {
         return false;
@@ -1504,115 +1469,115 @@
       }
       value_check = ic_data.AsUnaryClassChecksForArgNr(2);
       return InlineSetIndexed(kind, target, call, receiver, token_pos,
-                              &ic_data, value_check, entry, last);
+                              value_check, entry, last);
     case MethodRecognizer::kByteArrayBaseGetInt8:
-      return InlineByteArrayViewLoad(call, receiver, receiver_cid,
+      return InlineByteArrayBaseLoad(call, receiver, receiver_cid,
                                      kTypedDataInt8ArrayCid,
                                      ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseGetUint8:
-      return InlineByteArrayViewLoad(call, receiver, receiver_cid,
+      return InlineByteArrayBaseLoad(call, receiver, receiver_cid,
                                      kTypedDataUint8ArrayCid,
                                      ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseGetInt16:
-      return InlineByteArrayViewLoad(call, receiver, receiver_cid,
+      return InlineByteArrayBaseLoad(call, receiver, receiver_cid,
                                      kTypedDataInt16ArrayCid,
                                      ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseGetUint16:
-      return InlineByteArrayViewLoad(call, receiver, receiver_cid,
+      return InlineByteArrayBaseLoad(call, receiver, receiver_cid,
                                      kTypedDataUint16ArrayCid,
                                      ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseGetInt32:
       if (!CanUnboxInt32()) {
         return false;
       }
-      return InlineByteArrayViewLoad(call, receiver, receiver_cid,
+      return InlineByteArrayBaseLoad(call, receiver, receiver_cid,
                                      kTypedDataInt32ArrayCid,
                                      ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseGetUint32:
       if (!CanUnboxInt32()) {
         return false;
       }
-      return InlineByteArrayViewLoad(call, receiver, receiver_cid,
+      return InlineByteArrayBaseLoad(call, receiver, receiver_cid,
                                      kTypedDataUint32ArrayCid,
                                      ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseGetFloat32:
       if (!CanUnboxDouble()) {
         return false;
       }
-      return InlineByteArrayViewLoad(call, receiver, receiver_cid,
+      return InlineByteArrayBaseLoad(call, receiver, receiver_cid,
                                      kTypedDataFloat32ArrayCid,
                                      ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseGetFloat64:
       if (!CanUnboxDouble()) {
         return false;
       }
-      return InlineByteArrayViewLoad(call, receiver, receiver_cid,
+      return InlineByteArrayBaseLoad(call, receiver, receiver_cid,
                                      kTypedDataFloat64ArrayCid,
                                      ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseGetFloat32x4:
       if (!ShouldInlineSimd()) {
         return false;
       }
-      return InlineByteArrayViewLoad(call, receiver, receiver_cid,
+      return InlineByteArrayBaseLoad(call, receiver, receiver_cid,
                                      kTypedDataFloat32x4ArrayCid,
                                      ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseGetInt32x4:
       if (!ShouldInlineSimd()) {
         return false;
       }
-      return InlineByteArrayViewLoad(call, receiver, receiver_cid,
+      return InlineByteArrayBaseLoad(call, receiver, receiver_cid,
                                      kTypedDataInt32x4ArrayCid,
                                      ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseSetInt8:
-      return InlineByteArrayViewStore(target, call, receiver, receiver_cid,
+      return InlineByteArrayBaseStore(target, call, receiver, receiver_cid,
                                       kTypedDataInt8ArrayCid,
                                       ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseSetUint8:
-      return InlineByteArrayViewStore(target, call, receiver, receiver_cid,
+      return InlineByteArrayBaseStore(target, call, receiver, receiver_cid,
                                       kTypedDataUint8ArrayCid,
                                       ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseSetInt16:
-      return InlineByteArrayViewStore(target, call, receiver, receiver_cid,
+      return InlineByteArrayBaseStore(target, call, receiver, receiver_cid,
                                       kTypedDataInt16ArrayCid,
                                       ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseSetUint16:
-      return InlineByteArrayViewStore(target, call, receiver, receiver_cid,
+      return InlineByteArrayBaseStore(target, call, receiver, receiver_cid,
                                       kTypedDataUint16ArrayCid,
                                       ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseSetInt32:
-      return InlineByteArrayViewStore(target, call, receiver, receiver_cid,
+      return InlineByteArrayBaseStore(target, call, receiver, receiver_cid,
                                       kTypedDataInt32ArrayCid,
                                       ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseSetUint32:
-      return InlineByteArrayViewStore(target, call, receiver, receiver_cid,
+      return InlineByteArrayBaseStore(target, call, receiver, receiver_cid,
                                       kTypedDataUint32ArrayCid,
                                       ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseSetFloat32:
       if (!CanUnboxDouble()) {
         return false;
       }
-      return InlineByteArrayViewStore(target, call, receiver, receiver_cid,
+      return InlineByteArrayBaseStore(target, call, receiver, receiver_cid,
                                       kTypedDataFloat32ArrayCid,
                                       ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseSetFloat64:
       if (!CanUnboxDouble()) {
         return false;
       }
-      return InlineByteArrayViewStore(target, call, receiver, receiver_cid,
+      return InlineByteArrayBaseStore(target, call, receiver, receiver_cid,
                                       kTypedDataFloat64ArrayCid,
                                       ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseSetFloat32x4:
       if (!ShouldInlineSimd()) {
         return false;
       }
-      return InlineByteArrayViewStore(target, call, receiver, receiver_cid,
+      return InlineByteArrayBaseStore(target, call, receiver, receiver_cid,
                                       kTypedDataFloat32x4ArrayCid,
                                       ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseSetInt32x4:
       if (!ShouldInlineSimd()) {
         return false;
       }
-      return InlineByteArrayViewStore(target, call, receiver, receiver_cid,
+      return InlineByteArrayBaseStore(target, call, receiver, receiver_cid,
                                       kTypedDataInt32x4ArrayCid,
                                       ic_data, entry, last);
     case MethodRecognizer::kStringBaseCodeUnitAt:
@@ -1641,7 +1606,7 @@
   // Insert index smi check.
   *cursor = flow_graph()->AppendTo(
       *cursor,
-      new(I) CheckSmiInstr(new(I) Value(index),
+      new(Z) CheckSmiInstr(new(Z) Value(index),
                            call->deopt_id(),
                            call->token_pos()),
       call->env(),
@@ -1649,10 +1614,10 @@
 
   // Insert array length load and bounds check.
   LoadFieldInstr* length =
-      new(I) LoadFieldInstr(
-          new(I) Value(*array),
+      new(Z) LoadFieldInstr(
+          new(Z) Value(*array),
           CheckArrayBoundInstr::LengthOffsetFor(array_cid),
-          Type::ZoneHandle(I, Type::SmiType()),
+          Type::ZoneHandle(Z, Type::SmiType()),
           call->token_pos());
   length->set_is_immutable(
       CheckArrayBoundInstr::IsFixedLengthArrayType(array_cid));
@@ -1665,9 +1630,9 @@
                                    FlowGraph::kValue);
 
   *cursor = flow_graph()->AppendTo(*cursor,
-                                   new(I) CheckArrayBoundInstr(
-                                       new(I) Value(length),
-                                       new(I) Value(index),
+                                   new(Z) CheckArrayBoundInstr(
+                                       new(Z) Value(length),
+                                       new(Z) Value(index),
                                        call->deopt_id()),
                                    call->env(),
                                    FlowGraph::kEffect);
@@ -1675,10 +1640,10 @@
   if (array_cid == kGrowableObjectArrayCid) {
     // Insert data elements load.
     LoadFieldInstr* elements =
-        new(I) LoadFieldInstr(
-            new(I) Value(*array),
+        new(Z) LoadFieldInstr(
+            new(Z) Value(*array),
             GrowableObjectArray::data_offset(),
-            Type::ZoneHandle(I, Type::DynamicType()),
+            Type::ZoneHandle(Z, Type::DynamicType()),
             call->token_pos());
     elements->set_result_cid(kArrayCid);
     *cursor = flow_graph()->AppendTo(*cursor,
@@ -1690,7 +1655,7 @@
     array_cid = kArrayCid;
   } else if (RawObject::IsExternalTypedDataClassId(array_cid)) {
     LoadUntaggedInstr* elements =
-        new(I) LoadUntaggedInstr(new(I) Value(*array),
+        new(Z) LoadUntaggedInstr(new(Z) Value(*array),
                                  ExternalTypedData::data_offset());
     *cursor = flow_graph()->AppendTo(*cursor,
                                      elements,
@@ -1705,7 +1670,6 @@
 bool FlowGraphOptimizer::InlineGetIndexed(MethodRecognizer::Kind kind,
                                           Instruction* call,
                                           Definition* receiver,
-                                          const ICData& ic_data,
                                           TargetEntryInstr** entry,
                                           Definition** last) {
   intptr_t array_cid = MethodKindToCid(kind);
@@ -1713,7 +1677,7 @@
 
   Definition* array = receiver;
   Definition* index = call->ArgumentAt(1);
-  *entry = new(I) TargetEntryInstr(flow_graph()->allocate_block_id(),
+  *entry = new(Z) TargetEntryInstr(flow_graph()->allocate_block_id(),
                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(I, call);
   Instruction* cursor = *entry;
@@ -1733,8 +1697,8 @@
 
   // Array load and return.
   intptr_t index_scale = Instance::ElementSizeFor(array_cid);
-  *last = new(I) LoadIndexedInstr(new(I) Value(array),
-                                  new(I) Value(index),
+  *last = new(Z) LoadIndexedInstr(new(Z) Value(array),
+                                  new(Z) Value(index),
                                   index_scale,
                                   array_cid,
                                   deopt_id,
@@ -1746,7 +1710,7 @@
       FlowGraph::kValue);
 
   if (array_cid == kTypedDataFloat32ArrayCid) {
-    *last = new(I) FloatToDoubleInstr(new(I) Value(*last), deopt_id);
+    *last = new(Z) FloatToDoubleInstr(new(Z) Value(*last), deopt_id);
     flow_graph()->AppendTo(cursor,
                            *last,
                            deopt_id != Isolate::kNoDeoptId ? call->env() : NULL,
@@ -1756,54 +1720,6 @@
 }
 
 
-bool FlowGraphOptimizer::TryReplaceWithLoadIndexed(InstanceCallInstr* call) {
-  // Check for monomorphic IC data.
-  if (!call->HasICData()) return false;
-  const ICData& ic_data =
-      ICData::Handle(I, call->ic_data()->AsUnaryClassChecks());
-  if (ic_data.NumberOfChecks() != 1) {
-    return false;
-  }
-  ASSERT(ic_data.NumberOfUsedChecks() == 1);
-  ASSERT(ic_data.HasOneTarget());
-
-  const Function& target = Function::Handle(I, ic_data.GetTargetAt(0));
-  TargetEntryInstr* entry;
-  Definition* last;
-  if (!TryInlineRecognizedMethod(ic_data.GetReceiverClassIdAt(0),
-                                 target,
-                                 call,
-                                 call->ArgumentAt(0),
-                                 call->token_pos(),
-                                 *call->ic_data(),
-                                 &entry, &last)) {
-    return false;
-  }
-
-  // Insert receiver class check.
-  AddReceiverCheck(call);
-  // Remove the original push arguments.
-  for (intptr_t i = 0; i < call->ArgumentCount(); ++i) {
-    PushArgumentInstr* push = call->PushArgumentAt(i);
-    push->ReplaceUsesWith(push->value()->definition());
-    push->RemoveFromGraph();
-  }
-  // Replace all uses of this definition with the result.
-  call->ReplaceUsesWith(last);
-  // Finally insert the sequence other definition in place of this one in the
-  // graph.
-  call->previous()->LinkTo(entry->next());
-  entry->UnuseAllInputs();  // Entry block is not in the graph.
-  last->LinkTo(call);
-  // Remove through the iterator.
-  ASSERT(current_iterator()->Current() == call);
-  current_iterator()->RemoveCurrentFromGraph();
-  call->set_previous(NULL);
-  call->set_next(NULL);
-  return true;
-}
-
-
 // Return true if d is a string of length one (a constant or result from
 // from string-from-char-code instruction.
 static bool IsLengthOneString(Definition* d) {
@@ -1847,12 +1763,12 @@
       const String& str = String::Cast(left_const->value());
       ASSERT(str.Length() == 1);
       ConstantInstr* char_code_left = flow_graph()->GetConstant(
-          Smi::ZoneHandle(I, Smi::New(static_cast<intptr_t>(str.CharAt(0)))));
-      left_val = new(I) Value(char_code_left);
+          Smi::ZoneHandle(Z, Smi::New(static_cast<intptr_t>(str.CharAt(0)))));
+      left_val = new(Z) Value(char_code_left);
     } else if (left->IsStringFromCharCode()) {
       // Use input of string-from-charcode as left value.
       StringFromCharCodeInstr* instr = left->AsStringFromCharCode();
-      left_val = new(I) Value(instr->char_code()->definition());
+      left_val = new(Z) Value(instr->char_code()->definition());
       to_remove_left = instr;
     } else {
       // IsLengthOneString(left) should have been false.
@@ -1864,11 +1780,11 @@
     if (right->IsStringFromCharCode()) {
       // Skip string-from-char-code, and use its input as right value.
       StringFromCharCodeInstr* right_instr = right->AsStringFromCharCode();
-      right_val = new(I) Value(right_instr->char_code()->definition());
+      right_val = new(Z) Value(right_instr->char_code()->definition());
       to_remove_right = right_instr;
     } else {
       const ICData& unary_checks_1 =
-          ICData::ZoneHandle(I, call->ic_data()->AsUnaryClassChecksForArgNr(1));
+          ICData::ZoneHandle(Z, call->ic_data()->AsUnaryClassChecksForArgNr(1));
       AddCheckClass(right,
                     unary_checks_1,
                     call->deopt_id(),
@@ -1877,14 +1793,14 @@
       // String-to-char-code instructions returns -1 (illegal charcode) if
       // string is not of length one.
       StringToCharCodeInstr* char_code_right =
-          new(I) StringToCharCodeInstr(new(I) Value(right), kOneByteStringCid);
+          new(Z) StringToCharCodeInstr(new(Z) Value(right), kOneByteStringCid);
       InsertBefore(call, char_code_right, call->env(), FlowGraph::kValue);
-      right_val = new(I) Value(char_code_right);
+      right_val = new(Z) Value(char_code_right);
     }
 
     // Comparing char-codes instead of strings.
     EqualityCompareInstr* comp =
-        new(I) EqualityCompareInstr(call->token_pos(),
+        new(Z) EqualityCompareInstr(call->token_pos(),
                                     op_kind,
                                     left_val,
                                     right_val,
@@ -1929,13 +1845,13 @@
     }
   } else if (HasOnlyTwoOf(ic_data, kSmiCid)) {
     InsertBefore(call,
-                 new(I) CheckSmiInstr(new(I) Value(left),
+                 new(Z) CheckSmiInstr(new(Z) Value(left),
                                       call->deopt_id(),
                                       call->token_pos()),
                  call->env(),
                  FlowGraph::kEffect);
     InsertBefore(call,
-                 new(I) CheckSmiInstr(new(I) Value(right),
+                 new(Z) CheckSmiInstr(new(Z) Value(right),
                                       call->deopt_id(),
                                       call->token_pos()),
                  call->env(),
@@ -1955,9 +1871,9 @@
         return false;
       } else {
         InsertBefore(call,
-                     new(I) CheckEitherNonSmiInstr(
-                         new(I) Value(left),
-                         new(I) Value(right),
+                     new(Z) CheckEitherNonSmiInstr(
+                         new(Z) Value(left),
+                         new(Z) Value(right),
                          call->deopt_id()),
                      call->env(),
                      FlowGraph::kEffect);
@@ -1975,7 +1891,7 @@
                                               smi_or_null,
                                               smi_or_null)) {
       const ICData& unary_checks_0 =
-          ICData::ZoneHandle(I, call->ic_data()->AsUnaryClassChecks());
+          ICData::ZoneHandle(Z, call->ic_data()->AsUnaryClassChecks());
       AddCheckClass(left,
                     unary_checks_0,
                     call->deopt_id(),
@@ -1983,7 +1899,7 @@
                     call);
 
       const ICData& unary_checks_1 =
-          ICData::ZoneHandle(I, call->ic_data()->AsUnaryClassChecksForArgNr(1));
+          ICData::ZoneHandle(Z, call->ic_data()->AsUnaryClassChecksForArgNr(1));
       AddCheckClass(right,
                     unary_checks_1,
                     call->deopt_id(),
@@ -1997,10 +1913,10 @@
       if ((right_const != NULL && right_const->value().IsNull()) ||
           (left_const != NULL && left_const->value().IsNull())) {
         StrictCompareInstr* comp =
-            new(I) StrictCompareInstr(call->token_pos(),
+            new(Z) StrictCompareInstr(call->token_pos(),
                                       Token::kEQ_STRICT,
-                                      new(I) Value(left),
-                                      new(I) Value(right),
+                                      new(Z) Value(left),
+                                      new(Z) Value(right),
                                       false);  // No number check.
         ReplaceCall(call, comp);
         return true;
@@ -2009,10 +1925,10 @@
     }
   }
   ASSERT(cid != kIllegalCid);
-  EqualityCompareInstr* comp = new(I) EqualityCompareInstr(call->token_pos(),
+  EqualityCompareInstr* comp = new(Z) EqualityCompareInstr(call->token_pos(),
                                                            op_kind,
-                                                           new(I) Value(left),
-                                                           new(I) Value(right),
+                                                           new(Z) Value(left),
+                                                           new(Z) Value(right),
                                                            cid,
                                                            call->deopt_id());
   ReplaceCall(call, comp);
@@ -2032,13 +1948,13 @@
   intptr_t cid = kIllegalCid;
   if (HasOnlyTwoOf(ic_data, kSmiCid)) {
     InsertBefore(call,
-                 new(I) CheckSmiInstr(new(I) Value(left),
+                 new(Z) CheckSmiInstr(new(Z) Value(left),
                                       call->deopt_id(),
                                       call->token_pos()),
                  call->env(),
                  FlowGraph::kEffect);
     InsertBefore(call,
-                 new(I) CheckSmiInstr(new(I) Value(right),
+                 new(Z) CheckSmiInstr(new(Z) Value(right),
                                       call->deopt_id(),
                                       call->token_pos()),
                  call->env(),
@@ -2058,9 +1974,9 @@
         return false;
       } else {
         InsertBefore(call,
-                     new(I) CheckEitherNonSmiInstr(
-                         new(I) Value(left),
-                         new(I) Value(right),
+                     new(Z) CheckEitherNonSmiInstr(
+                         new(Z) Value(left),
+                         new(Z) Value(right),
                          call->deopt_id()),
                      call->env(),
                      FlowGraph::kEffect);
@@ -2071,10 +1987,10 @@
     return false;
   }
   ASSERT(cid != kIllegalCid);
-  RelationalOpInstr* comp = new(I) RelationalOpInstr(call->token_pos(),
+  RelationalOpInstr* comp = new(Z) RelationalOpInstr(call->token_pos(),
                                                      op_kind,
-                                                     new(I) Value(left),
-                                                     new(I) Value(right),
+                                                     new(Z) Value(left),
+                                                     new(Z) Value(right),
                                                      cid,
                                                      call->deopt_id());
   ReplaceCall(call, comp);
@@ -2154,7 +2070,7 @@
             ? kMintCid
             : kSmiCid;
       } else if (HasTwoMintOrSmi(ic_data) &&
-                 HasOnlyOneSmi(ICData::Handle(I,
+                 HasOnlyOneSmi(ICData::Handle(Z,
                      ic_data.AsUnaryClassChecksForArgNr(1)))) {
         // Don't generate mint code if the IC data is marked because of an
         // overflow.
@@ -2194,32 +2110,32 @@
     // returns a double for two smis.
     if (op_kind != Token::kDIV) {
       InsertBefore(call,
-                   new(I) CheckEitherNonSmiInstr(
-                       new(I) Value(left),
-                       new(I) Value(right),
+                   new(Z) CheckEitherNonSmiInstr(
+                       new(Z) Value(left),
+                       new(Z) Value(right),
                        call->deopt_id()),
                    call->env(),
                    FlowGraph::kEffect);
     }
 
     BinaryDoubleOpInstr* double_bin_op =
-        new(I) BinaryDoubleOpInstr(op_kind,
-                                   new(I) Value(left),
-                                   new(I) Value(right),
+        new(Z) BinaryDoubleOpInstr(op_kind,
+                                   new(Z) Value(left),
+                                   new(Z) Value(right),
                                    call->deopt_id(), call->token_pos());
     ReplaceCall(call, double_bin_op);
   } else if (operands_type == kMintCid) {
     if (!FlowGraphCompiler::SupportsUnboxedMints()) return false;
     if ((op_kind == Token::kSHR) || (op_kind == Token::kSHL)) {
       ShiftMintOpInstr* shift_op =
-          new(I) ShiftMintOpInstr(
-              op_kind, new(I) Value(left), new(I) Value(right),
+          new(Z) ShiftMintOpInstr(
+              op_kind, new(Z) Value(left), new(Z) Value(right),
               call->deopt_id());
       ReplaceCall(call, shift_op);
     } else {
       BinaryMintOpInstr* bin_op =
-          new(I) BinaryMintOpInstr(
-              op_kind, new(I) Value(left), new(I) Value(right),
+          new(Z) BinaryMintOpInstr(
+              op_kind, new(Z) Value(left), new(Z) Value(right),
               call->deopt_id());
       ReplaceCall(call, bin_op);
     }
@@ -2237,18 +2153,18 @@
         // Insert smi check and attach a copy of the original environment
         // because the smi operation can still deoptimize.
         InsertBefore(call,
-                     new(I) CheckSmiInstr(new(I) Value(left),
+                     new(Z) CheckSmiInstr(new(Z) Value(left),
                                           call->deopt_id(),
                                           call->token_pos()),
                      call->env(),
                      FlowGraph::kEffect);
         ConstantInstr* constant =
-            flow_graph()->GetConstant(Smi::Handle(I,
+            flow_graph()->GetConstant(Smi::Handle(Z,
                 Smi::New(Smi::Cast(obj).Value() - 1)));
         BinarySmiOpInstr* bin_op =
-            new(I) BinarySmiOpInstr(Token::kBIT_AND,
-                                    new(I) Value(left),
-                                    new(I) Value(constant),
+            new(Z) BinarySmiOpInstr(Token::kBIT_AND,
+                                    new(Z) Value(left),
+                                    new(Z) Value(constant),
                                     call->deopt_id());
         ReplaceCall(call, bin_op);
         return true;
@@ -2259,9 +2175,9 @@
     AddCheckSmi(left, call->deopt_id(), call->env(), call);
     AddCheckSmi(right, call->deopt_id(), call->env(), call);
     BinarySmiOpInstr* bin_op =
-        new(I) BinarySmiOpInstr(op_kind,
-                                new(I) Value(left),
-                                new(I) Value(right),
+        new(Z) BinarySmiOpInstr(op_kind,
+                                new(Z) Value(left),
+                                new(Z) Value(right),
                                 call->deopt_id());
     ReplaceCall(call, bin_op);
   } else {
@@ -2278,10 +2194,10 @@
       right = temp;
     }
     BinarySmiOpInstr* bin_op =
-        new(I) BinarySmiOpInstr(
+        new(Z) BinarySmiOpInstr(
             op_kind,
-            new(I) Value(left),
-            new(I) Value(right),
+            new(Z) Value(left),
+            new(Z) Value(right),
             call->deopt_id());
     ReplaceCall(call, bin_op);
   }
@@ -2296,24 +2212,24 @@
   Definition* unary_op = NULL;
   if (HasOnlyOneSmi(*call->ic_data())) {
     InsertBefore(call,
-                 new(I) CheckSmiInstr(new(I) Value(input),
+                 new(Z) CheckSmiInstr(new(Z) Value(input),
                                       call->deopt_id(),
                                       call->token_pos()),
                  call->env(),
                  FlowGraph::kEffect);
-    unary_op = new(I) UnarySmiOpInstr(
-        op_kind, new(I) Value(input), call->deopt_id());
+    unary_op = new(Z) UnarySmiOpInstr(
+        op_kind, new(Z) Value(input), call->deopt_id());
   } else if ((op_kind == Token::kBIT_NOT) &&
              HasOnlySmiOrMint(*call->ic_data()) &&
              FlowGraphCompiler::SupportsUnboxedMints()) {
-    unary_op = new(I) UnaryMintOpInstr(
-        op_kind, new(I) Value(input), call->deopt_id());
+    unary_op = new(Z) UnaryMintOpInstr(
+        op_kind, new(Z) Value(input), call->deopt_id());
   } else if (HasOnlyOneDouble(*call->ic_data()) &&
              (op_kind == Token::kNEGATE) &&
              CanUnboxDouble()) {
     AddReceiverCheck(call);
-    unary_op = new(I) UnaryDoubleOpInstr(
-        Token::kNEGATE, new(I) Value(input), call->deopt_id());
+    unary_op = new(Z) UnaryDoubleOpInstr(
+        Token::kNEGATE, new(Z) Value(input), call->deopt_id());
   } else {
     return false;
   }
@@ -2352,9 +2268,9 @@
       callee_receiver->IsParameter() &&
       (callee_receiver->AsParameter()->index() == 0)) {
     const String& name = (kind == RawFunction::kMethodExtractor)
-        ? String::Handle(I, Field::NameFromGetter(call->function_name()))
+        ? String::Handle(Z, Field::NameFromGetter(call->function_name()))
         : call->function_name();
-    return isolate()->cha()->HasOverride(Class::Handle(I, function.Owner()),
+    return isolate()->cha()->HasOverride(Class::Handle(Z, function.Owner()),
                                          name);
   }
   return true;
@@ -2365,24 +2281,24 @@
   ASSERT(call->HasICData());
   const ICData& ic_data = *call->ic_data();
   ASSERT(ic_data.HasOneTarget());
-  Function& target = Function::Handle(I);
+  Function& target = Function::Handle(Z);
   GrowableArray<intptr_t> class_ids;
   ic_data.GetCheckAt(0, &class_ids, &target);
   ASSERT(class_ids.length() == 1);
   // Inline implicit instance getter.
   const String& field_name =
-      String::Handle(I, Field::NameFromGetter(call->function_name()));
+      String::Handle(Z, Field::NameFromGetter(call->function_name()));
   const Field& field =
-      Field::ZoneHandle(I, GetField(class_ids[0], field_name));
+      Field::ZoneHandle(Z, GetField(class_ids[0], field_name));
   ASSERT(!field.IsNull());
 
   if (InstanceCallNeedsClassCheck(call, RawFunction::kImplicitGetter)) {
     AddReceiverCheck(call);
   }
-  LoadFieldInstr* load = new(I) LoadFieldInstr(
-      new(I) Value(call->ArgumentAt(0)),
+  LoadFieldInstr* load = new(Z) LoadFieldInstr(
+      new(Z) Value(call->ArgumentAt(0)),
       &field,
-      AbstractType::ZoneHandle(I, field.type()),
+      AbstractType::ZoneHandle(Z, field.type()),
       call->token_pos());
   load->set_is_immutable(field.is_final());
   if (field.guarded_cid() != kIllegalCid) {
@@ -2415,7 +2331,7 @@
   }
   AddCheckClass(call->ArgumentAt(0),
                 ICData::ZoneHandle(
-                    I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                 call->deopt_id(),
                 call->env(),
                 call);
@@ -2449,17 +2365,17 @@
     }
   }
   if (getter == MethodRecognizer::kFloat32x4GetSignMask) {
-    Simd32x4GetSignMaskInstr* instr = new(I) Simd32x4GetSignMaskInstr(
+    Simd32x4GetSignMaskInstr* instr = new(Z) Simd32x4GetSignMaskInstr(
         getter,
-        new(I) Value(call->ArgumentAt(0)),
+        new(Z) Value(call->ArgumentAt(0)),
         call->deopt_id());
     ReplaceCall(call, instr);
     return true;
   } else if (getter == MethodRecognizer::kFloat32x4ShuffleMix) {
-    Simd32x4ShuffleMixInstr* instr = new(I) Simd32x4ShuffleMixInstr(
+    Simd32x4ShuffleMixInstr* instr = new(Z) Simd32x4ShuffleMixInstr(
         getter,
-        new(I) Value(call->ArgumentAt(0)),
-        new(I) Value(call->ArgumentAt(1)),
+        new(Z) Value(call->ArgumentAt(0)),
+        new(Z) Value(call->ArgumentAt(1)),
         mask,
         call->deopt_id());
     ReplaceCall(call, instr);
@@ -2470,9 +2386,9 @@
            (getter == MethodRecognizer::kFloat32x4ShuffleY) ||
            (getter == MethodRecognizer::kFloat32x4ShuffleZ) ||
            (getter == MethodRecognizer::kFloat32x4ShuffleW));
-    Simd32x4ShuffleInstr* instr = new(I) Simd32x4ShuffleInstr(
+    Simd32x4ShuffleInstr* instr = new(Z) Simd32x4ShuffleInstr(
         getter,
-        new(I) Value(call->ArgumentAt(0)),
+        new(Z) Value(call->ArgumentAt(0)),
         mask,
         call->deopt_id());
     ReplaceCall(call, instr);
@@ -2490,15 +2406,15 @@
   }
   AddCheckClass(call->ArgumentAt(0),
                 ICData::ZoneHandle(
-                    I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                 call->deopt_id(),
                 call->env(),
                 call);
   if ((getter == MethodRecognizer::kFloat64x2GetX) ||
       (getter == MethodRecognizer::kFloat64x2GetY)) {
-    Simd64x2ShuffleInstr* instr = new(I) Simd64x2ShuffleInstr(
+    Simd64x2ShuffleInstr* instr = new(Z) Simd64x2ShuffleInstr(
         getter,
-        new(I) Value(call->ArgumentAt(0)),
+        new(Z) Value(call->ArgumentAt(0)),
         0,
         call->deopt_id());
     ReplaceCall(call, instr);
@@ -2516,7 +2432,7 @@
   }
   AddCheckClass(call->ArgumentAt(0),
                 ICData::ZoneHandle(
-                    I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                 call->deopt_id(),
                 call->env(),
                 call);
@@ -2550,33 +2466,33 @@
     }
   }
   if (getter == MethodRecognizer::kInt32x4GetSignMask) {
-    Simd32x4GetSignMaskInstr* instr = new(I) Simd32x4GetSignMaskInstr(
+    Simd32x4GetSignMaskInstr* instr = new(Z) Simd32x4GetSignMaskInstr(
         getter,
-        new(I) Value(call->ArgumentAt(0)),
+        new(Z) Value(call->ArgumentAt(0)),
         call->deopt_id());
     ReplaceCall(call, instr);
     return true;
   } else if (getter == MethodRecognizer::kInt32x4ShuffleMix) {
-    Simd32x4ShuffleMixInstr* instr = new(I) Simd32x4ShuffleMixInstr(
+    Simd32x4ShuffleMixInstr* instr = new(Z) Simd32x4ShuffleMixInstr(
         getter,
-        new(I) Value(call->ArgumentAt(0)),
-        new(I) Value(call->ArgumentAt(1)),
+        new(Z) Value(call->ArgumentAt(0)),
+        new(Z) Value(call->ArgumentAt(1)),
         mask,
         call->deopt_id());
     ReplaceCall(call, instr);
     return true;
   } else if (getter == MethodRecognizer::kInt32x4Shuffle) {
-    Simd32x4ShuffleInstr* instr = new(I) Simd32x4ShuffleInstr(
+    Simd32x4ShuffleInstr* instr = new(Z) Simd32x4ShuffleInstr(
         getter,
-        new(I) Value(call->ArgumentAt(0)),
+        new(Z) Value(call->ArgumentAt(0)),
         mask,
         call->deopt_id());
     ReplaceCall(call, instr);
     return true;
   } else {
-    Int32x4GetFlagInstr* instr = new(I) Int32x4GetFlagInstr(
+    Int32x4GetFlagInstr* instr = new(Z) Int32x4GetFlagInstr(
         getter,
-        new(I) Value(call->ArgumentAt(0)),
+        new(Z) Value(call->ArgumentAt(0)),
         call->deopt_id());
     ReplaceCall(call, instr);
     return true;
@@ -2595,21 +2511,21 @@
   // Type check left.
   AddCheckClass(left,
                 ICData::ZoneHandle(
-                    I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                 call->deopt_id(),
                 call->env(),
                 call);
   // Type check right.
   AddCheckClass(right,
                 ICData::ZoneHandle(
-                    I, call->ic_data()->AsUnaryClassChecksForArgNr(1)),
+                    Z, call->ic_data()->AsUnaryClassChecksForArgNr(1)),
                 call->deopt_id(),
                 call->env(),
                 call);
   // Replace call.
   BinaryFloat32x4OpInstr* float32x4_bin_op =
-      new(I) BinaryFloat32x4OpInstr(
-          op_kind, new(I) Value(left), new(I) Value(right),
+      new(Z) BinaryFloat32x4OpInstr(
+          op_kind, new(Z) Value(left), new(Z) Value(right),
           call->deopt_id());
   ReplaceCall(call, float32x4_bin_op);
 
@@ -2628,21 +2544,21 @@
   // Type check left.
   AddCheckClass(left,
                 ICData::ZoneHandle(
-                    I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                 call->deopt_id(),
                 call->env(),
                 call);
   // Type check right.
   AddCheckClass(right,
-                ICData::ZoneHandle(I,
+                ICData::ZoneHandle(Z,
                     call->ic_data()->AsUnaryClassChecksForArgNr(1)),
                 call->deopt_id(),
                 call->env(),
                 call);
   // Replace call.
   BinaryInt32x4OpInstr* int32x4_bin_op =
-      new(I) BinaryInt32x4OpInstr(
-          op_kind, new(I) Value(left), new(I) Value(right),
+      new(Z) BinaryInt32x4OpInstr(
+          op_kind, new(Z) Value(left), new(Z) Value(right),
           call->deopt_id());
   ReplaceCall(call, int32x4_bin_op);
   return true;
@@ -2673,8 +2589,8 @@
                 call);
   // Replace call.
   BinaryFloat64x2OpInstr* float64x2_bin_op =
-      new(I) BinaryFloat64x2OpInstr(
-          op_kind, new(I) Value(left), new(I) Value(right),
+      new(Z) BinaryFloat64x2OpInstr(
+          op_kind, new(Z) Value(left), new(Z) Value(right),
           call->deopt_id());
   ReplaceCall(call, float64x2_bin_op);
   return true;
@@ -2696,7 +2612,7 @@
     return false;
   }
 
-  const Function& target = Function::Handle(I, ic_data.GetTargetAt(0));
+  const Function& target = Function::Handle(Z, ic_data.GetTargetAt(0));
   if (target.kind() != RawFunction::kImplicitGetter) {
     // Non-implicit getters are inlined like normal methods by conventional
     // inlining in FlowGraphInliner.
@@ -2709,8 +2625,7 @@
 
 bool FlowGraphOptimizer::TryReplaceInstanceCallWithInline(
     InstanceCallInstr* call) {
-  ASSERT(call->HasICData());
-  Function& target = Function::Handle(I);
+  Function& target = Function::Handle(Z);
   GrowableArray<intptr_t> class_ids;
   call->ic_data()->GetCheckAt(0, &class_ids, &target);
   const intptr_t receiver_cid = class_ids[0];
@@ -2760,8 +2675,8 @@
     Instruction* cursor) {
 
   cursor = flow_graph()->AppendTo(cursor,
-                                  new(I) CheckSmiInstr(
-                                      new(I) Value(index),
+                                  new(Z) CheckSmiInstr(
+                                      new(Z) Value(index),
                                       call->deopt_id(),
                                       call->token_pos()),
                                   call->env(),
@@ -2771,10 +2686,10 @@
   // Treat length loads as mutable (i.e. affected by side effects) to avoid
   // hoisting them since we can't hoist the preceding class-check. This
   // is because of externalization of strings that affects their class-id.
-  LoadFieldInstr* length = new(I) LoadFieldInstr(
-      new(I) Value(str),
+  LoadFieldInstr* length = new(Z) LoadFieldInstr(
+      new(Z) Value(str),
       String::length_offset(),
-      Type::ZoneHandle(I, Type::SmiType()),
+      Type::ZoneHandle(Z, Type::SmiType()),
       str->token_pos());
   length->set_result_cid(kSmiCid);
   length->set_recognized_kind(MethodRecognizer::kStringBaseLength);
@@ -2782,16 +2697,16 @@
   cursor = flow_graph()->AppendTo(cursor, length, NULL, FlowGraph::kValue);
   // Bounds check.
   cursor = flow_graph()->AppendTo(cursor,
-                                   new(I) CheckArrayBoundInstr(
-                                       new(I) Value(length),
-                                       new(I) Value(index),
+                                   new(Z) CheckArrayBoundInstr(
+                                       new(Z) Value(length),
+                                       new(Z) Value(index),
                                        call->deopt_id()),
                                    call->env(),
                                    FlowGraph::kEffect);
 
-  LoadIndexedInstr* load_indexed = new(I) LoadIndexedInstr(
-      new(I) Value(str),
-      new(I) Value(index),
+  LoadIndexedInstr* load_indexed = new(Z) LoadIndexedInstr(
+      new(Z) Value(str),
+      new(Z) Value(index),
       Instance::ElementSizeFor(cid),
       cid,
       Isolate::kNoDeoptId,
@@ -2819,7 +2734,7 @@
   Definition* str = call->ArgumentAt(0);
   Definition* index = call->ArgumentAt(1);
 
-  *entry = new(I) TargetEntryInstr(flow_graph()->allocate_block_id(),
+  *entry = new(Z) TargetEntryInstr(flow_graph()->allocate_block_id(),
                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(I, call);
 
@@ -2841,14 +2756,14 @@
   Definition* str = call->ArgumentAt(0);
   Definition* index = call->ArgumentAt(1);
 
-  *entry = new(I) TargetEntryInstr(flow_graph()->allocate_block_id(),
+  *entry = new(Z) TargetEntryInstr(flow_graph()->allocate_block_id(),
                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(I, call);
 
   *last = PrepareInlineStringIndexOp(call, cid, str, index, *entry);
 
-  StringFromCharCodeInstr* char_at = new(I) StringFromCharCodeInstr(
-      new(I) Value(*last), cid);
+  StringFromCharCodeInstr* char_at = new(Z) StringFromCharCodeInstr(
+      new(Z) Value(*last), cid);
 
   flow_graph()->AppendTo(*last, char_at, NULL, FlowGraph::kValue);
   *last = char_at;
@@ -2865,14 +2780,14 @@
   Definition* left = call->ArgumentAt(0);
   Definition* right = call->ArgumentAt(1);
 
-  *entry = new(I) TargetEntryInstr(flow_graph()->allocate_block_id(),
+  *entry = new(Z) TargetEntryInstr(flow_graph()->allocate_block_id(),
                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(I, call);
   // Arguments are checked. No need for class check.
   BinaryDoubleOpInstr* double_bin_op =
-      new(I) BinaryDoubleOpInstr(op_kind,
-                                 new(I) Value(left),
-                                 new(I) Value(right),
+      new(Z) BinaryDoubleOpInstr(op_kind,
+                                 new(Z) Value(left),
+                                 new(Z) Value(right),
                                  call->deopt_id(), call->token_pos());
   flow_graph()->AppendTo(*entry, double_bin_op, call->env(), FlowGraph::kValue);
   *last = double_bin_op;
@@ -2886,12 +2801,12 @@
     MethodRecognizer::Kind recognized_kind) {
   AddReceiverCheck(call);
   ZoneGrowableArray<Value*>* args =
-      new(I) ZoneGrowableArray<Value*>(call->ArgumentCount());
+      new(Z) ZoneGrowableArray<Value*>(call->ArgumentCount());
   for (intptr_t i = 0; i < call->ArgumentCount(); i++) {
-    args->Add(new(I) Value(call->ArgumentAt(i)));
+    args->Add(new(Z) Value(call->ArgumentAt(i)));
   }
   InvokeMathCFunctionInstr* invoke =
-      new(I) InvokeMathCFunctionInstr(args,
+      new(Z) InvokeMathCFunctionInstr(args,
                                       call->deopt_id(),
                                       recognized_kind,
                                       call->token_pos());
@@ -2930,7 +2845,7 @@
     return false;
   }
 
-  Function& target = Function::Handle(I);
+  Function& target = Function::Handle(Z);
   GrowableArray<intptr_t> class_ids;
   ic_data.GetCheckAt(0, &class_ids, &target);
   MethodRecognizer::Kind recognized_kind =
@@ -2942,10 +2857,10 @@
     // This is an internal method, no need to check argument types.
     Definition* array = call->ArgumentAt(0);
     Definition* value = call->ArgumentAt(1);
-    StoreInstanceFieldInstr* store = new(I) StoreInstanceFieldInstr(
+    StoreInstanceFieldInstr* store = new(Z) StoreInstanceFieldInstr(
         GrowableObjectArray::data_offset(),
-        new(I) Value(array),
-        new(I) Value(value),
+        new(Z) Value(array),
+        new(Z) Value(value),
         kEmitStoreBarrier,
         call->token_pos());
     ReplaceCall(call, store);
@@ -2959,10 +2874,10 @@
     // range.
     Definition* array = call->ArgumentAt(0);
     Definition* value = call->ArgumentAt(1);
-    StoreInstanceFieldInstr* store = new(I) StoreInstanceFieldInstr(
+    StoreInstanceFieldInstr* store = new(Z) StoreInstanceFieldInstr(
         GrowableObjectArray::length_offset(),
-        new(I) Value(array),
-        new(I) Value(value),
+        new(Z) Value(array),
+        new(Z) Value(value),
         kNoStoreBarrier,
         call->token_pos());
     ReplaceCall(call, store);
@@ -2984,10 +2899,10 @@
       Definition* str = call->ArgumentAt(0);
       Definition* index = call->ArgumentAt(1);
       Definition* value = call->ArgumentAt(2);
-      StoreIndexedInstr* store_op = new(I) StoreIndexedInstr(
-          new(I) Value(str),
-          new(I) Value(index),
-          new(I) Value(value),
+      StoreIndexedInstr* store_op = new(Z) StoreIndexedInstr(
+          new(Z) Value(str),
+          new(Z) Value(index),
+          new(Z) Value(value),
           kNoStoreBarrier,
           1,  // Index scale
           kOneByteStringCid,
@@ -3005,14 +2920,14 @@
     if (class_ids[0] == kSmiCid) {
       AddReceiverCheck(call);
       ReplaceCall(call,
-                  new(I) SmiToDoubleInstr(
-                      new(I) Value(call->ArgumentAt(0)),
+                  new(Z) SmiToDoubleInstr(
+                      new(Z) Value(call->ArgumentAt(0)),
                       call->token_pos()));
       return true;
     } else if ((class_ids[0] == kMintCid) && CanConvertUnboxedMintToDouble()) {
       AddReceiverCheck(call);
       ReplaceCall(call,
-                  new(I) MintToDoubleInstr(new(I) Value(call->ArgumentAt(0)),
+                  new(Z) MintToDoubleInstr(new(Z) Value(call->ArgumentAt(0)),
                                            call->deopt_id()));
       return true;
     }
@@ -3031,12 +2946,12 @@
         Definition* d2i_instr = NULL;
         if (ic_data.HasDeoptReason(ICData::kDeoptDoubleToSmi)) {
           // Do not repeatedly deoptimize because result didn't fit into Smi.
-          d2i_instr =  new(I) DoubleToIntegerInstr(
-              new(I) Value(input), call);
+          d2i_instr =  new(Z) DoubleToIntegerInstr(
+              new(Z) Value(input), call);
         } else {
           // Optimistically assume result fits into Smi.
-          d2i_instr = new(I) DoubleToSmiInstr(
-              new(I) Value(input), call->deopt_id());
+          d2i_instr = new(Z) DoubleToSmiInstr(
+              new(Z) Value(input), call->deopt_id());
         }
         ReplaceCall(call, d2i_instr);
         return true;
@@ -3053,7 +2968,7 @@
         } else {
           AddReceiverCheck(call);
           DoubleToDoubleInstr* d2d_instr =
-              new(I) DoubleToDoubleInstr(new(I) Value(call->ArgumentAt(0)),
+              new(Z) DoubleToDoubleInstr(new(Z) Value(call->ArgumentAt(0)),
                                          recognized_kind, call->deopt_id());
           ReplaceCall(call, d2d_instr);
         }
@@ -3094,47 +3009,47 @@
     switch (recognized_kind) {
       // ByteArray getters.
       case MethodRecognizer::kByteArrayBaseGetInt8:
-        return BuildByteArrayViewLoad(call, kTypedDataInt8ArrayCid);
+        return BuildByteArrayBaseLoad(call, kTypedDataInt8ArrayCid);
       case MethodRecognizer::kByteArrayBaseGetUint8:
-        return BuildByteArrayViewLoad(call, kTypedDataUint8ArrayCid);
+        return BuildByteArrayBaseLoad(call, kTypedDataUint8ArrayCid);
       case MethodRecognizer::kByteArrayBaseGetInt16:
-        return BuildByteArrayViewLoad(call, kTypedDataInt16ArrayCid);
+        return BuildByteArrayBaseLoad(call, kTypedDataInt16ArrayCid);
       case MethodRecognizer::kByteArrayBaseGetUint16:
-        return BuildByteArrayViewLoad(call, kTypedDataUint16ArrayCid);
+        return BuildByteArrayBaseLoad(call, kTypedDataUint16ArrayCid);
       case MethodRecognizer::kByteArrayBaseGetInt32:
-        return BuildByteArrayViewLoad(call, kTypedDataInt32ArrayCid);
+        return BuildByteArrayBaseLoad(call, kTypedDataInt32ArrayCid);
       case MethodRecognizer::kByteArrayBaseGetUint32:
-        return BuildByteArrayViewLoad(call, kTypedDataUint32ArrayCid);
+        return BuildByteArrayBaseLoad(call, kTypedDataUint32ArrayCid);
       case MethodRecognizer::kByteArrayBaseGetFloat32:
-        return BuildByteArrayViewLoad(call, kTypedDataFloat32ArrayCid);
+        return BuildByteArrayBaseLoad(call, kTypedDataFloat32ArrayCid);
       case MethodRecognizer::kByteArrayBaseGetFloat64:
-        return BuildByteArrayViewLoad(call, kTypedDataFloat64ArrayCid);
+        return BuildByteArrayBaseLoad(call, kTypedDataFloat64ArrayCid);
       case MethodRecognizer::kByteArrayBaseGetFloat32x4:
-        return BuildByteArrayViewLoad(call, kTypedDataFloat32x4ArrayCid);
+        return BuildByteArrayBaseLoad(call, kTypedDataFloat32x4ArrayCid);
       case MethodRecognizer::kByteArrayBaseGetInt32x4:
-        return BuildByteArrayViewLoad(call, kTypedDataInt32x4ArrayCid);
+        return BuildByteArrayBaseLoad(call, kTypedDataInt32x4ArrayCid);
 
       // ByteArray setters.
       case MethodRecognizer::kByteArrayBaseSetInt8:
-        return BuildByteArrayViewStore(call, kTypedDataInt8ArrayCid);
+        return BuildByteArrayBaseStore(call, kTypedDataInt8ArrayCid);
       case MethodRecognizer::kByteArrayBaseSetUint8:
-        return BuildByteArrayViewStore(call, kTypedDataUint8ArrayCid);
+        return BuildByteArrayBaseStore(call, kTypedDataUint8ArrayCid);
       case MethodRecognizer::kByteArrayBaseSetInt16:
-        return BuildByteArrayViewStore(call, kTypedDataInt16ArrayCid);
+        return BuildByteArrayBaseStore(call, kTypedDataInt16ArrayCid);
       case MethodRecognizer::kByteArrayBaseSetUint16:
-        return BuildByteArrayViewStore(call, kTypedDataUint16ArrayCid);
+        return BuildByteArrayBaseStore(call, kTypedDataUint16ArrayCid);
       case MethodRecognizer::kByteArrayBaseSetInt32:
-        return BuildByteArrayViewStore(call, kTypedDataInt32ArrayCid);
+        return BuildByteArrayBaseStore(call, kTypedDataInt32ArrayCid);
       case MethodRecognizer::kByteArrayBaseSetUint32:
-        return BuildByteArrayViewStore(call, kTypedDataUint32ArrayCid);
+        return BuildByteArrayBaseStore(call, kTypedDataUint32ArrayCid);
       case MethodRecognizer::kByteArrayBaseSetFloat32:
-        return BuildByteArrayViewStore(call, kTypedDataFloat32ArrayCid);
+        return BuildByteArrayBaseStore(call, kTypedDataFloat32ArrayCid);
       case MethodRecognizer::kByteArrayBaseSetFloat64:
-        return BuildByteArrayViewStore(call, kTypedDataFloat64ArrayCid);
+        return BuildByteArrayBaseStore(call, kTypedDataFloat64ArrayCid);
       case MethodRecognizer::kByteArrayBaseSetFloat32x4:
-        return BuildByteArrayViewStore(call, kTypedDataFloat32x4ArrayCid);
+        return BuildByteArrayBaseStore(call, kTypedDataFloat32x4ArrayCid);
       case MethodRecognizer::kByteArrayBaseSetInt32x4:
-        return BuildByteArrayViewStore(call, kTypedDataInt32x4ArrayCid);
+        return BuildByteArrayBaseStore(call, kTypedDataInt32x4ArrayCid);
       default:
         // Unsupported method.
         return false;
@@ -3176,9 +3091,9 @@
         return false;
       }
       BinarySmiOpInstr* left_shift =
-          new(I) BinarySmiOpInstr(Token::kSHL,
-                                  new(I) Value(value),
-                                  new(I) Value(count),
+          new(Z) BinarySmiOpInstr(Token::kSHL,
+                                  new(Z) Value(value),
+                                  new(Z) Value(count),
                                   call->deopt_id());
       left_shift->mark_truncating();
       if ((kBitsPerWord == 32) && (mask_value == 0xffffffffLL)) {
@@ -3187,9 +3102,9 @@
       } else {
         InsertBefore(call, left_shift, call->env(), FlowGraph::kValue);
         BinarySmiOpInstr* bit_and =
-            new(I) BinarySmiOpInstr(Token::kBIT_AND,
-                                    new(I) Value(left_shift),
-                                    new(I) Value(int32_mask),
+            new(Z) BinarySmiOpInstr(Token::kBIT_AND,
+                                    new(Z) Value(left_shift),
+                                    new(Z) Value(int32_mask),
                                     call->deopt_id());
         ReplaceCall(call, bit_and);
       }
@@ -3197,22 +3112,22 @@
     }
 
     if (HasTwoMintOrSmi(ic_data) &&
-        HasOnlyOneSmi(ICData::Handle(I,
+        HasOnlyOneSmi(ICData::Handle(Z,
                                      ic_data.AsUnaryClassChecksForArgNr(1)))) {
       if (!FlowGraphCompiler::SupportsUnboxedMints() ||
           ic_data.HasDeoptReason(ICData::kDeoptBinaryMintOp)) {
         return false;
       }
       ShiftMintOpInstr* left_shift =
-          new(I) ShiftMintOpInstr(Token::kSHL,
-                                  new(I) Value(value),
-                                  new(I) Value(count),
+          new(Z) ShiftMintOpInstr(Token::kSHL,
+                                  new(Z) Value(value),
+                                  new(Z) Value(count),
                                   call->deopt_id());
       InsertBefore(call, left_shift, call->env(), FlowGraph::kValue);
       BinaryMintOpInstr* bit_and =
-          new(I) BinaryMintOpInstr(Token::kBIT_AND,
-                                   new(I) Value(left_shift),
-                                   new(I) Value(int32_mask),
+          new(Z) BinaryMintOpInstr(Token::kBIT_AND,
+                                   new(Z) Value(left_shift),
+                                   new(Z) Value(int32_mask),
                                    call->deopt_id());
       ReplaceCall(call, bit_and);
       return true;
@@ -3229,35 +3144,35 @@
     return false;
   }
   if (recognized_kind == MethodRecognizer::kFloat32x4Zero) {
-    Float32x4ZeroInstr* zero = new(I) Float32x4ZeroInstr();
+    Float32x4ZeroInstr* zero = new(Z) Float32x4ZeroInstr();
     ReplaceCall(call, zero);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat32x4Splat) {
     Float32x4SplatInstr* splat =
-        new(I) Float32x4SplatInstr(
-            new(I) Value(call->ArgumentAt(1)), call->deopt_id());
+        new(Z) Float32x4SplatInstr(
+            new(Z) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, splat);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat32x4Constructor) {
     Float32x4ConstructorInstr* con =
-        new(I) Float32x4ConstructorInstr(
-            new(I) Value(call->ArgumentAt(1)),
-            new(I) Value(call->ArgumentAt(2)),
-            new(I) Value(call->ArgumentAt(3)),
-            new(I) Value(call->ArgumentAt(4)),
+        new(Z) Float32x4ConstructorInstr(
+            new(Z) Value(call->ArgumentAt(1)),
+            new(Z) Value(call->ArgumentAt(2)),
+            new(Z) Value(call->ArgumentAt(3)),
+            new(Z) Value(call->ArgumentAt(4)),
             call->deopt_id());
     ReplaceCall(call, con);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat32x4FromInt32x4Bits) {
     Int32x4ToFloat32x4Instr* cast =
-        new(I) Int32x4ToFloat32x4Instr(
-            new(I) Value(call->ArgumentAt(1)), call->deopt_id());
+        new(Z) Int32x4ToFloat32x4Instr(
+            new(Z) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, cast);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat32x4FromFloat64x2) {
     Float64x2ToFloat32x4Instr* cast =
-        new(I) Float64x2ToFloat32x4Instr(
-            new(I) Value(call->ArgumentAt(1)), call->deopt_id());
+        new(Z) Float64x2ToFloat32x4Instr(
+            new(Z) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, cast);
     return true;
   }
@@ -3272,27 +3187,27 @@
     return false;
   }
   if (recognized_kind == MethodRecognizer::kFloat64x2Zero) {
-    Float64x2ZeroInstr* zero = new(I) Float64x2ZeroInstr();
+    Float64x2ZeroInstr* zero = new(Z) Float64x2ZeroInstr();
     ReplaceCall(call, zero);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat64x2Splat) {
     Float64x2SplatInstr* splat =
-        new(I) Float64x2SplatInstr(
-            new(I) Value(call->ArgumentAt(1)), call->deopt_id());
+        new(Z) Float64x2SplatInstr(
+            new(Z) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, splat);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat64x2Constructor) {
     Float64x2ConstructorInstr* con =
-        new(I) Float64x2ConstructorInstr(
-            new(I) Value(call->ArgumentAt(1)),
-            new(I) Value(call->ArgumentAt(2)),
+        new(Z) Float64x2ConstructorInstr(
+            new(Z) Value(call->ArgumentAt(1)),
+            new(Z) Value(call->ArgumentAt(2)),
             call->deopt_id());
     ReplaceCall(call, con);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat64x2FromFloat32x4) {
     Float32x4ToFloat64x2Instr* cast =
-        new(I) Float32x4ToFloat64x2Instr(
-            new(I) Value(call->ArgumentAt(1)), call->deopt_id());
+        new(Z) Float32x4ToFloat64x2Instr(
+            new(Z) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, cast);
     return true;
   }
@@ -3308,27 +3223,27 @@
   }
   if (recognized_kind == MethodRecognizer::kInt32x4BoolConstructor) {
     Int32x4BoolConstructorInstr* con =
-        new(I) Int32x4BoolConstructorInstr(
-            new(I) Value(call->ArgumentAt(1)),
-            new(I) Value(call->ArgumentAt(2)),
-            new(I) Value(call->ArgumentAt(3)),
-            new(I) Value(call->ArgumentAt(4)),
+        new(Z) Int32x4BoolConstructorInstr(
+            new(Z) Value(call->ArgumentAt(1)),
+            new(Z) Value(call->ArgumentAt(2)),
+            new(Z) Value(call->ArgumentAt(3)),
+            new(Z) Value(call->ArgumentAt(4)),
             call->deopt_id());
     ReplaceCall(call, con);
     return true;
   } else if (recognized_kind == MethodRecognizer::kInt32x4FromFloat32x4Bits) {
     Float32x4ToInt32x4Instr* cast =
-        new(I) Float32x4ToInt32x4Instr(
-            new(I) Value(call->ArgumentAt(1)), call->deopt_id());
+        new(Z) Float32x4ToInt32x4Instr(
+            new(Z) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, cast);
     return true;
   } else if (recognized_kind == MethodRecognizer::kInt32x4Constructor) {
     Int32x4ConstructorInstr* con =
-        new(I) Int32x4ConstructorInstr(
-            new(I) Value(call->ArgumentAt(1)),
-            new(I) Value(call->ArgumentAt(2)),
-            new(I) Value(call->ArgumentAt(3)),
-            new(I) Value(call->ArgumentAt(4)),
+        new(Z) Int32x4ConstructorInstr(
+            new(Z) Value(call->ArgumentAt(1)),
+            new(Z) Value(call->ArgumentAt(2)),
+            new(Z) Value(call->ArgumentAt(3)),
+            new(Z) Value(call->ArgumentAt(4)),
             call->deopt_id());
     ReplaceCall(call, con);
     return true;
@@ -3365,15 +3280,15 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       // Replace call.
       Float32x4ComparisonInstr* cmp =
-          new(I) Float32x4ComparisonInstr(recognized_kind,
-                                          new(I) Value(left),
-                                          new(I) Value(right),
+          new(Z) Float32x4ComparisonInstr(recognized_kind,
+                                          new(Z) Value(left),
+                                          new(Z) Value(right),
                                           call->deopt_id());
       ReplaceCall(call, cmp);
       return true;
@@ -3385,15 +3300,15 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       Float32x4MinMaxInstr* minmax =
-          new(I) Float32x4MinMaxInstr(
+          new(Z) Float32x4MinMaxInstr(
               recognized_kind,
-              new(I) Value(left),
-              new(I) Value(right),
+              new(Z) Value(left),
+              new(Z) Value(right),
               call->deopt_id());
       ReplaceCall(call, minmax);
       return true;
@@ -3404,7 +3319,7 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
@@ -3412,9 +3327,9 @@
       // this is done so that the double value is loaded into the output
       // register and can be destroyed.
       Float32x4ScaleInstr* scale =
-          new(I) Float32x4ScaleInstr(recognized_kind,
-                                     new(I) Value(right),
-                                     new(I) Value(left),
+          new(Z) Float32x4ScaleInstr(recognized_kind,
+                                     new(Z) Value(right),
+                                     new(Z) Value(left),
                                      call->deopt_id());
       ReplaceCall(call, scale);
       return true;
@@ -3425,13 +3340,13 @@
       Definition* left = call->ArgumentAt(0);
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       Float32x4SqrtInstr* sqrt =
-          new(I) Float32x4SqrtInstr(recognized_kind,
-                                    new(I) Value(left),
+          new(Z) Float32x4SqrtInstr(recognized_kind,
+                                    new(Z) Value(left),
                                     call->deopt_id());
       ReplaceCall(call, sqrt);
       return true;
@@ -3445,13 +3360,13 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
-      Float32x4WithInstr* with = new(I) Float32x4WithInstr(recognized_kind,
-                                                           new(I) Value(left),
-                                                           new(I) Value(right),
+      Float32x4WithInstr* with = new(Z) Float32x4WithInstr(recognized_kind,
+                                                           new(Z) Value(left),
+                                                           new(Z) Value(right),
                                                            call->deopt_id());
       ReplaceCall(call, with);
       return true;
@@ -3462,13 +3377,13 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       Float32x4ZeroArgInstr* zeroArg =
-          new(I) Float32x4ZeroArgInstr(
-              recognized_kind, new(I) Value(left), call->deopt_id());
+          new(Z) Float32x4ZeroArgInstr(
+              recognized_kind, new(Z) Value(left), call->deopt_id());
       ReplaceCall(call, zeroArg);
       return true;
     }
@@ -3479,14 +3394,14 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
-      Float32x4ClampInstr* clamp = new(I) Float32x4ClampInstr(
-          new(I) Value(left),
-          new(I) Value(lower),
-          new(I) Value(upper),
+      Float32x4ClampInstr* clamp = new(Z) Float32x4ClampInstr(
+          new(Z) Value(left),
+          new(Z) Value(lower),
+          new(Z) Value(upper),
           call->deopt_id());
       ReplaceCall(call, clamp);
       return true;
@@ -3522,13 +3437,13 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       Float64x2ZeroArgInstr* zeroArg =
-          new(I) Float64x2ZeroArgInstr(
-              recognized_kind, new(I) Value(left), call->deopt_id());
+          new(Z) Float64x2ZeroArgInstr(
+              recognized_kind, new(Z) Value(left), call->deopt_id());
       ReplaceCall(call, zeroArg);
       return true;
     }
@@ -3542,14 +3457,14 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       Float64x2OneArgInstr* zeroArg =
-          new(I) Float64x2OneArgInstr(recognized_kind,
-                                      new(I) Value(left),
-                                      new(I) Value(right),
+          new(Z) Float64x2OneArgInstr(recognized_kind,
+                                      new(Z) Value(left),
+                                      new(Z) Value(right),
                                       call->deopt_id());
       ReplaceCall(call, zeroArg);
       return true;
@@ -3586,14 +3501,14 @@
       // Type check left.
       AddCheckClass(mask,
                     ICData::ZoneHandle(
-                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
-      Int32x4SelectInstr* select = new(I) Int32x4SelectInstr(
-          new(I) Value(mask),
-          new(I) Value(trueValue),
-          new(I) Value(falseValue),
+      Int32x4SelectInstr* select = new(Z) Int32x4SelectInstr(
+          new(Z) Value(mask),
+          new(Z) Value(trueValue),
+          new(Z) Value(falseValue),
           call->deopt_id());
       ReplaceCall(call, select);
       return true;
@@ -3607,14 +3522,14 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        Z, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
-      Int32x4SetFlagInstr* setFlag = new(I) Int32x4SetFlagInstr(
+      Int32x4SetFlagInstr* setFlag = new(Z) Int32x4SetFlagInstr(
           recognized_kind,
-          new(I) Value(left),
-          new(I) Value(flag),
+          new(Z) Value(left),
+          new(Z) Value(flag),
           call->deopt_id());
       ReplaceCall(call, setFlag);
       return true;
@@ -3625,7 +3540,7 @@
 }
 
 
-bool FlowGraphOptimizer::InlineByteArrayViewLoad(Instruction* call,
+bool FlowGraphOptimizer::InlineByteArrayBaseLoad(Instruction* call,
                                                  Definition* receiver,
                                                  intptr_t array_cid,
                                                  intptr_t view_cid,
@@ -3635,12 +3550,12 @@
   ASSERT(array_cid != kIllegalCid);
   Definition* array = receiver;
   Definition* index = call->ArgumentAt(1);
-  *entry = new(I) TargetEntryInstr(flow_graph()->allocate_block_id(),
+  *entry = new(Z) TargetEntryInstr(flow_graph()->allocate_block_id(),
                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(I, call);
   Instruction* cursor = *entry;
 
-  array_cid = PrepareInlineByteArrayViewOp(call,
+  array_cid = PrepareInlineByteArrayBaseOp(call,
                                            array_cid,
                                            view_cid,
                                            &array,
@@ -3654,8 +3569,8 @@
     deopt_id = (kSmiBits >= 32) ? Isolate::kNoDeoptId : call->deopt_id();
   }
 
-  *last = new(I) LoadIndexedInstr(new(I) Value(array),
-                                  new(I) Value(index),
+  *last = new(Z) LoadIndexedInstr(new(Z) Value(array),
+                                  new(Z) Value(index),
                                   1,
                                   view_cid,
                                   deopt_id,
@@ -3667,7 +3582,7 @@
       FlowGraph::kValue);
 
   if (view_cid == kTypedDataFloat32ArrayCid) {
-    *last = new(I) FloatToDoubleInstr(new(I) Value(*last), deopt_id);
+    *last = new(Z) FloatToDoubleInstr(new(Z) Value(*last), deopt_id);
     flow_graph()->AppendTo(cursor,
                            *last,
                            deopt_id != Isolate::kNoDeoptId ? call->env() : NULL,
@@ -3677,7 +3592,7 @@
 }
 
 
-bool FlowGraphOptimizer::InlineByteArrayViewStore(const Function& target,
+bool FlowGraphOptimizer::InlineByteArrayBaseStore(const Function& target,
                                                   Instruction* call,
                                                   Definition* receiver,
                                                   intptr_t array_cid,
@@ -3688,12 +3603,12 @@
   ASSERT(array_cid != kIllegalCid);
   Definition* array = receiver;
   Definition* index = call->ArgumentAt(1);
-  *entry = new(I) TargetEntryInstr(flow_graph()->allocate_block_id(),
+  *entry = new(Z) TargetEntryInstr(flow_graph()->allocate_block_id(),
                                    call->GetBlock()->try_index());
   (*entry)->InheritDeoptTarget(I, call);
   Instruction* cursor = *entry;
 
-  array_cid = PrepareInlineByteArrayViewOp(call,
+  array_cid = PrepareInlineByteArrayBaseOp(call,
                                            array_cid,
                                            view_cid,
                                            &array,
@@ -3710,7 +3625,7 @@
     i_call = call->AsInstanceCall();
   }
   ASSERT(i_call != NULL);
-  ICData& value_check = ICData::ZoneHandle(I);
+  ICData& value_check = ICData::ZoneHandle(Z);
   switch (view_cid) {
     case kTypedDataInt8ArrayCid:
     case kTypedDataUint8ArrayCid:
@@ -3783,24 +3698,24 @@
   }
 
   if (view_cid == kTypedDataFloat32ArrayCid) {
-    stored_value = new(I) DoubleToFloatInstr(
-        new(I) Value(stored_value), call->deopt_id());
+    stored_value = new(Z) DoubleToFloatInstr(
+        new(Z) Value(stored_value), call->deopt_id());
     cursor = flow_graph()->AppendTo(cursor,
                                     stored_value,
                                     NULL,
                                     FlowGraph::kValue);
   } else if (view_cid == kTypedDataInt32ArrayCid) {
-    stored_value = new(I) UnboxInt32Instr(
+    stored_value = new(Z) UnboxInt32Instr(
         UnboxInt32Instr::kTruncate,
-        new(I) Value(stored_value),
+        new(Z) Value(stored_value),
         call->deopt_id());
     cursor = flow_graph()->AppendTo(cursor,
                                     stored_value,
                                     call->env(),
                                     FlowGraph::kValue);
   } else if (view_cid == kTypedDataUint32ArrayCid) {
-    stored_value = new(I) UnboxUint32Instr(
-        new(I) Value(stored_value),
+    stored_value = new(Z) UnboxUint32Instr(
+        new(Z) Value(stored_value),
         call->deopt_id());
     ASSERT(stored_value->AsUnboxInteger()->is_truncating());
     cursor = flow_graph()->AppendTo(cursor,
@@ -3810,9 +3725,9 @@
   }
 
   StoreBarrierType needs_store_barrier = kNoStoreBarrier;
-  *last = new(I) StoreIndexedInstr(new(I) Value(array),
-                                   new(I) Value(index),
-                                   new(I) Value(stored_value),
+  *last = new(Z) StoreIndexedInstr(new(Z) Value(array),
+                                   new(Z) Value(index),
+                                   new(Z) Value(stored_value),
                                    needs_store_barrier,
                                    1,  // Index scale
                                    view_cid,
@@ -3829,7 +3744,7 @@
 
 
 
-intptr_t FlowGraphOptimizer::PrepareInlineByteArrayViewOp(
+intptr_t FlowGraphOptimizer::PrepareInlineByteArrayBaseOp(
     Instruction* call,
     intptr_t array_cid,
     intptr_t view_cid,
@@ -3838,18 +3753,18 @@
     Instruction** cursor) {
   // Insert byte_index smi check.
   *cursor = flow_graph()->AppendTo(*cursor,
-                                   new(I) CheckSmiInstr(
-                                       new(I) Value(byte_index),
+                                   new(Z) CheckSmiInstr(
+                                       new(Z) Value(byte_index),
                                        call->deopt_id(),
                                        call->token_pos()),
                                    call->env(),
                                    FlowGraph::kEffect);
 
   LoadFieldInstr* length =
-      new(I) LoadFieldInstr(
-          new(I) Value(*array),
+      new(Z) LoadFieldInstr(
+          new(Z) Value(*array),
           CheckArrayBoundInstr::LengthOffsetFor(array_cid),
-          Type::ZoneHandle(I, Type::SmiType()),
+          Type::ZoneHandle(Z, Type::SmiType()),
           call->token_pos());
   length->set_is_immutable(true);
   length->set_result_cid(kSmiCid);
@@ -3862,11 +3777,11 @@
 
   intptr_t element_size = Instance::ElementSizeFor(array_cid);
   ConstantInstr* bytes_per_element =
-      flow_graph()->GetConstant(Smi::Handle(I, Smi::New(element_size)));
+      flow_graph()->GetConstant(Smi::Handle(Z, Smi::New(element_size)));
   BinarySmiOpInstr* len_in_bytes =
-      new(I) BinarySmiOpInstr(Token::kMUL,
-                              new(I) Value(length),
-                              new(I) Value(bytes_per_element),
+      new(Z) BinarySmiOpInstr(Token::kMUL,
+                              new(Z) Value(length),
+                              new(Z) Value(bytes_per_element),
                               call->deopt_id());
   *cursor = flow_graph()->AppendTo(*cursor, len_in_bytes, call->env(),
                                    FlowGraph::kValue);
@@ -3876,11 +3791,11 @@
   intptr_t adjustment = Instance::ElementSizeFor(view_cid) - 1;
   if (adjustment > 0) {
     ConstantInstr* length_adjustment =
-        flow_graph()->GetConstant(Smi::Handle(I, Smi::New(adjustment)));
+        flow_graph()->GetConstant(Smi::Handle(Z, Smi::New(adjustment)));
     adjusted_length =
-        new(I) BinarySmiOpInstr(Token::kSUB,
-                                new(I) Value(len_in_bytes),
-                                new(I) Value(length_adjustment),
+        new(Z) BinarySmiOpInstr(Token::kSUB,
+                                new(Z) Value(len_in_bytes),
+                                new(Z) Value(length_adjustment),
                                 call->deopt_id());
     *cursor = flow_graph()->AppendTo(*cursor, adjusted_length, call->env(),
                                      FlowGraph::kValue);
@@ -3888,26 +3803,26 @@
 
   // Check adjusted_length > 0.
   ConstantInstr* zero =
-      flow_graph()->GetConstant(Smi::Handle(I, Smi::New(0)));
+      flow_graph()->GetConstant(Smi::Handle(Z, Smi::New(0)));
   *cursor = flow_graph()->AppendTo(*cursor,
-                                   new(I) CheckArrayBoundInstr(
-                                       new(I) Value(adjusted_length),
-                                       new(I) Value(zero),
+                                   new(Z) CheckArrayBoundInstr(
+                                       new(Z) Value(adjusted_length),
+                                       new(Z) Value(zero),
                                        call->deopt_id()),
                                    call->env(),
                                    FlowGraph::kEffect);
   // Check 0 <= byte_index < adjusted_length.
   *cursor = flow_graph()->AppendTo(*cursor,
-                                   new(I) CheckArrayBoundInstr(
-                                       new(I) Value(adjusted_length),
-                                       new(I) Value(byte_index),
+                                   new(Z) CheckArrayBoundInstr(
+                                       new(Z) Value(adjusted_length),
+                                       new(Z) Value(byte_index),
                                        call->deopt_id()),
                                    call->env(),
                                    FlowGraph::kEffect);
 
   if (RawObject::IsExternalTypedDataClassId(array_cid)) {
     LoadUntaggedInstr* elements =
-        new(I) LoadUntaggedInstr(new(I) Value(*array),
+        new(Z) LoadUntaggedInstr(new(Z) Value(*array),
                                  ExternalTypedData::data_offset());
     *cursor = flow_graph()->AppendTo(*cursor,
                                      elements,
@@ -3919,7 +3834,7 @@
 }
 
 
-bool FlowGraphOptimizer::BuildByteArrayViewLoad(InstanceCallInstr* call,
+bool FlowGraphOptimizer::BuildByteArrayBaseLoad(InstanceCallInstr* call,
                                                 intptr_t view_cid) {
   const bool simd_view = (view_cid == kTypedDataFloat32x4ArrayCid) ||
                          (view_cid == kTypedDataInt32x4ArrayCid);
@@ -3935,7 +3850,7 @@
 }
 
 
-bool FlowGraphOptimizer::BuildByteArrayViewStore(InstanceCallInstr* call,
+bool FlowGraphOptimizer::BuildByteArrayBaseStore(InstanceCallInstr* call,
                                                  intptr_t view_cid) {
   const bool simd_view = (view_cid == kTypedDataFloat32x4ArrayCid) ||
                          (view_cid == kTypedDataInt32x4ArrayCid);
@@ -3966,7 +3881,7 @@
   if (!type.IsInstantiated() || type.IsMalformedOrMalbounded()) {
     return Bool::null();
   }
-  const Class& type_class = Class::Handle(I, type.type_class());
+  const Class& type_class = Class::Handle(Z, type.type_class());
   const intptr_t num_type_args = type_class.NumTypeArguments();
   if (num_type_args > 0) {
     // Only raw types can be directly compared, thus disregarding type
@@ -3974,7 +3889,7 @@
     const intptr_t num_type_params = type_class.NumTypeParameters();
     const intptr_t from_index = num_type_args - num_type_params;
     const TypeArguments& type_arguments =
-        TypeArguments::Handle(I, type.arguments());
+        TypeArguments::Handle(Z, type.arguments());
     const bool is_raw_type = type_arguments.IsNull() ||
         type_arguments.IsRaw(from_index, num_type_params);
     if (!is_raw_type) {
@@ -3984,8 +3899,8 @@
   }
 
   const ClassTable& class_table = *isolate()->class_table();
-  Bool& prev = Bool::Handle(I);
-  Class& cls = Class::Handle(I);
+  Bool& prev = Bool::Handle(Z);
+  Class& cls = Class::Handle(Z);
 
   bool results_differ = false;
   for (int i = 0; i < ic_data.NumberOfChecks(); i++) {
@@ -3994,9 +3909,9 @@
       return Bool::null();
     }
     const bool is_subtype = cls.IsSubtypeOf(
-        TypeArguments::Handle(I),
+        TypeArguments::Handle(Z),
         type_class,
-        TypeArguments::Handle(I),
+        TypeArguments::Handle(Z),
         NULL);
     results->Add(cls.id());
     results->Add(is_subtype);
@@ -4108,7 +4023,7 @@
   const bool negate = Bool::Cast(
       call->ArgumentAt(4)->OriginalDefinition()->AsConstant()->value()).value();
   const ICData& unary_checks =
-      ICData::ZoneHandle(I, call->ic_data()->AsUnaryClassChecks());
+      ICData::ZoneHandle(Z, call->ic_data()->AsUnaryClassChecks());
   if (FLAG_warn_on_javascript_compatibility &&
       !unary_checks.IssuedJSWarning() &&
       (type.IsIntType() || type.IsDoubleType() || !type.IsInstantiated())) {
@@ -4120,16 +4035,16 @@
   }
   if (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks) {
     ZoneGrowableArray<intptr_t>* results =
-        new(I) ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
+        new(Z) ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
     Bool& as_bool =
-        Bool::ZoneHandle(I, InstanceOfAsBool(unary_checks, type, results));
+        Bool::ZoneHandle(Z, InstanceOfAsBool(unary_checks, type, results));
     if (as_bool.IsNull()) {
       if (results->length() == unary_checks.NumberOfChecks() * 2) {
         const bool can_deopt = TryExpandTestCidsResult(results, type);
-        TestCidsInstr* test_cids = new(I) TestCidsInstr(
+        TestCidsInstr* test_cids = new(Z) TestCidsInstr(
             call->token_pos(),
             negate ? Token::kISNOT : Token::kIS,
-            new(I) Value(left),
+            new(Z) Value(left),
             *results,
             can_deopt ? call->deopt_id() : Isolate::kNoDeoptId);
         // Remove type.
@@ -4157,31 +4072,31 @@
   }
 
   if (TypeCheckAsClassEquality(type)) {
-    LoadClassIdInstr* left_cid = new(I) LoadClassIdInstr(new(I) Value(left));
+    LoadClassIdInstr* left_cid = new(Z) LoadClassIdInstr(new(Z) Value(left));
     InsertBefore(call,
                  left_cid,
                  NULL,
                  FlowGraph::kValue);
-    const intptr_t type_cid = Class::Handle(I, type.type_class()).id();
+    const intptr_t type_cid = Class::Handle(Z, type.type_class()).id();
     ConstantInstr* cid =
-        flow_graph()->GetConstant(Smi::Handle(I, Smi::New(type_cid)));
+        flow_graph()->GetConstant(Smi::Handle(Z, Smi::New(type_cid)));
 
     StrictCompareInstr* check_cid =
-        new(I) StrictCompareInstr(
+        new(Z) StrictCompareInstr(
             call->token_pos(),
             negate ? Token::kNE_STRICT : Token::kEQ_STRICT,
-            new(I) Value(left_cid),
-            new(I) Value(cid),
+            new(Z) Value(left_cid),
+            new(Z) Value(cid),
             false);  // No number check.
     ReplaceCall(call, check_cid);
     return;
   }
 
   InstanceOfInstr* instance_of =
-      new(I) InstanceOfInstr(call->token_pos(),
-                             new(I) Value(left),
-                             new(I) Value(instantiator),
-                             new(I) Value(type_args),
+      new(Z) InstanceOfInstr(call->token_pos(),
+                             new(Z) Value(left),
+                             new(Z) Value(instantiator),
+                             new(Z) Value(type_args),
                              type,
                              negate,
                              call->deopt_id());
@@ -4199,7 +4114,7 @@
       AbstractType::Cast(call->ArgumentAt(3)->AsConstant()->value());
   ASSERT(!type.IsMalformedOrMalbounded());
   const ICData& unary_checks =
-      ICData::ZoneHandle(I, call->ic_data()->AsUnaryClassChecks());
+      ICData::ZoneHandle(Z, call->ic_data()->AsUnaryClassChecks());
   if (FLAG_warn_on_javascript_compatibility &&
       !unary_checks.IssuedJSWarning() &&
       (type.IsIntType() || type.IsDoubleType() || !type.IsInstantiated())) {
@@ -4211,8 +4126,8 @@
   }
   if (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks) {
     ZoneGrowableArray<intptr_t>* results =
-        new(I) ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
-    const Bool& as_bool = Bool::ZoneHandle(I,
+        new(Z) ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
+    const Bool& as_bool = Bool::ZoneHandle(Z,
         InstanceOfAsBool(unary_checks, type, results));
     if (as_bool.raw() == Bool::True().raw()) {
       AddReceiverCheck(call);
@@ -4229,13 +4144,13 @@
       return;
     }
   }
-  const String& dst_name = String::ZoneHandle(I,
+  const String& dst_name = String::ZoneHandle(Z,
       Symbols::New(Exceptions::kCastErrorDstName));
   AssertAssignableInstr* assert_as =
-      new(I) AssertAssignableInstr(call->token_pos(),
-                                   new(I) Value(left),
-                                   new(I) Value(instantiator),
-                                   new(I) Value(type_args),
+      new(Z) AssertAssignableInstr(call->token_pos(),
+                                   new(Z) Value(left),
+                                   new(Z) Value(instantiator),
+                                   new(Z) Value(type_args),
                                    type,
                                    dst_name,
                                    call->deopt_id());
@@ -4263,7 +4178,7 @@
   }
 
   const ICData& unary_checks =
-      ICData::ZoneHandle(I, instr->ic_data()->AsUnaryClassChecks());
+      ICData::ZoneHandle(Z, instr->ic_data()->AsUnaryClassChecks());
 
   const intptr_t max_checks = (op_kind == Token::kEQ)
       ? FLAG_max_equality_polymorphic_checks
@@ -4275,10 +4190,10 @@
     return;
   }
 
-  if ((op_kind == Token::kASSIGN_INDEX) && TryReplaceWithStoreIndexed(instr)) {
+  if ((op_kind == Token::kASSIGN_INDEX) && TryReplaceWithIndexedOp(instr)) {
     return;
   }
-  if ((op_kind == Token::kINDEX) && TryReplaceWithLoadIndexed(instr)) {
+  if ((op_kind == Token::kINDEX) && TryReplaceWithIndexedOp(instr)) {
     return;
   }
 
@@ -4316,18 +4231,18 @@
     // Check if the single target is a polymorphic target, if it is,
     // we don't have one target.
     const Function& target =
-        Function::Handle(I, unary_checks.GetTargetAt(0));
+        Function::Handle(Z, unary_checks.GetTargetAt(0));
     const bool polymorphic_target = MethodRecognizer::PolymorphicTarget(target);
     has_one_target = !polymorphic_target;
   }
 
   if (has_one_target) {
     RawFunction::Kind function_kind =
-        Function::Handle(I, unary_checks.GetTargetAt(0)).kind();
+        Function::Handle(Z, unary_checks.GetTargetAt(0)).kind();
     if (!InstanceCallNeedsClassCheck(instr, function_kind)) {
       const bool call_with_checks = false;
       PolymorphicInstanceCallInstr* call =
-          new(I) PolymorphicInstanceCallInstr(instr, unary_checks,
+          new(Z) PolymorphicInstanceCallInstr(instr, unary_checks,
                                               call_with_checks);
       instr->ReplaceWith(call, current_iterator());
       return;
@@ -4345,7 +4260,7 @@
       call_with_checks = true;
     }
     PolymorphicInstanceCallInstr* call =
-        new(I) PolymorphicInstanceCallInstr(instr, unary_checks,
+        new(Z) PolymorphicInstanceCallInstr(instr, unary_checks,
                                             call_with_checks);
     instr->ReplaceWith(call, current_iterator());
   }
@@ -4375,8 +4290,8 @@
   }
   if (unary_kind != MathUnaryInstr::kIllegal) {
     MathUnaryInstr* math_unary =
-        new(I) MathUnaryInstr(unary_kind,
-                              new(I) Value(call->ArgumentAt(0)),
+        new(Z) MathUnaryInstr(unary_kind,
+                              new(Z) Value(call->ArgumentAt(0)),
                               call->deopt_id());
     ReplaceCall(call, math_unary);
   } else if ((recognized_kind == MethodRecognizer::kFloat32x4Zero) ||
@@ -4417,14 +4332,14 @@
         result_cid = kSmiCid;
       }
       if (result_cid != kIllegalCid) {
-        MathMinMaxInstr* min_max = new(I) MathMinMaxInstr(
+        MathMinMaxInstr* min_max = new(Z) MathMinMaxInstr(
             recognized_kind,
-            new(I) Value(call->ArgumentAt(0)),
-            new(I) Value(call->ArgumentAt(1)),
+            new(Z) Value(call->ArgumentAt(0)),
+            new(Z) Value(call->ArgumentAt(1)),
             call->deopt_id(),
             result_cid);
         const ICData& unary_checks =
-            ICData::ZoneHandle(I, ic_data.AsUnaryClassChecks());
+            ICData::ZoneHandle(Z, ic_data.AsUnaryClassChecks());
         AddCheckClass(min_max->left()->definition(),
                       unary_checks,
                       call->deopt_id(),
@@ -4443,12 +4358,12 @@
     // InvokeMathCFunctionInstr requires unboxed doubles. UnboxDouble
     // instructions contain type checks and conversions to double.
     ZoneGrowableArray<Value*>* args =
-        new(I) ZoneGrowableArray<Value*>(call->ArgumentCount());
+        new(Z) ZoneGrowableArray<Value*>(call->ArgumentCount());
     for (intptr_t i = 0; i < call->ArgumentCount(); i++) {
-      args->Add(new(I) Value(call->ArgumentAt(i)));
+      args->Add(new(Z) Value(call->ArgumentAt(i)));
     }
     InvokeMathCFunctionInstr* invoke =
-        new(I) InvokeMathCFunctionInstr(args,
+        new(Z) InvokeMathCFunctionInstr(args,
                                         call->deopt_id(),
                                         recognized_kind,
                                         call->token_pos());
@@ -4461,33 +4376,33 @@
           Definition* arg = call->ArgumentAt(1);
           AddCheckSmi(arg, call->deopt_id(), call->env(), call);
           ReplaceCall(call,
-                      new(I) SmiToDoubleInstr(new(I) Value(arg),
+                      new(Z) SmiToDoubleInstr(new(Z) Value(arg),
                                               call->token_pos()));
         } else if (ArgIsAlways(kMintCid, ic_data, 1) &&
                    CanConvertUnboxedMintToDouble()) {
           Definition* arg = call->ArgumentAt(1);
           ReplaceCall(call,
-                      new(I) MintToDoubleInstr(new(I) Value(arg),
+                      new(Z) MintToDoubleInstr(new(Z) Value(arg),
                                                call->deopt_id()));
         }
       }
     }
   } else if (call->function().IsFactory()) {
     const Class& function_class =
-        Class::Handle(I, call->function().Owner());
+        Class::Handle(Z, call->function().Owner());
     if ((function_class.library() == Library::CoreLibrary()) ||
         (function_class.library() == Library::TypedDataLibrary())) {
       intptr_t cid = FactoryRecognizer::ResultCid(call->function());
       switch (cid) {
         case kArrayCid: {
-          Value* type = new(I) Value(call->ArgumentAt(0));
-          Value* num_elements = new(I) Value(call->ArgumentAt(1));
+          Value* type = new(Z) Value(call->ArgumentAt(0));
+          Value* num_elements = new(Z) Value(call->ArgumentAt(1));
           if (num_elements->BindsToConstant() &&
               num_elements->BoundConstant().IsSmi()) {
             intptr_t length = Smi::Cast(num_elements->BoundConstant()).Value();
             if (length >= 0 && length <= Array::kMaxElements) {
               CreateArrayInstr* create_array =
-                  new(I) CreateArrayInstr(
+                  new(Z) CreateArrayInstr(
                       call->token_pos(), type, num_elements);
               ReplaceCall(call, create_array);
             }
@@ -4510,13 +4425,13 @@
     // usage count of at least 1/kGetterSetterRatio of the getter usage count.
     // This is to avoid unboxing fields where the setter is never or rarely
     // executed.
-    const Field& field = Field::ZoneHandle(I, instr->field().raw());
-    const String& field_name = String::Handle(I, field.name());
-    const Class& owner = Class::Handle(I, field.owner());
+    const Field& field = Field::ZoneHandle(Z, instr->field().raw());
+    const String& field_name = String::Handle(Z, field.name());
+    const Class& owner = Class::Handle(Z, field.owner());
     const Function& getter =
-        Function::Handle(I, owner.LookupGetterFunction(field_name));
+        Function::Handle(Z, owner.LookupGetterFunction(field_name));
     const Function& setter =
-        Function::Handle(I, owner.LookupSetterFunction(field_name));
+        Function::Handle(Z, owner.LookupSetterFunction(field_name));
     bool result = !getter.IsNull()
                && !setter.IsNull()
                && (setter.usage_counter() > 0)
@@ -4544,7 +4459,7 @@
   instr->ReplaceWith(replacement, current_iterator());
 
   StoreInstanceFieldInstr* store =
-      new(I) StoreInstanceFieldInstr(Context::parent_offset(),
+      new(Z) StoreInstanceFieldInstr(Context::parent_offset(),
                                      new Value(replacement),
                                      new Value(flow_graph_->constant_null()),
                                      kNoStoreBarrier,
@@ -4556,7 +4471,7 @@
   Definition* cursor = store;
   for (intptr_t i = 0; i < instr->num_context_variables(); ++i) {
     store =
-        new(I) StoreInstanceFieldInstr(Context::variable_offset(i),
+        new(Z) StoreInstanceFieldInstr(Context::variable_offset(i),
                                        new Value(replacement),
                                        new Value(flow_graph_->constant_null()),
                                        kNoStoreBarrier,
@@ -4599,7 +4514,7 @@
     // inlining.
     return false;
   }
-  Function& target = Function::Handle(I);
+  Function& target = Function::Handle(Z);
   intptr_t class_id;
   unary_ic_data.GetOneClassCheckAt(0, &class_id, &target);
   if (target.kind() != RawFunction::kImplicitSetter) {
@@ -4608,9 +4523,9 @@
   }
   // Inline implicit instance setter.
   const String& field_name =
-      String::Handle(I, Field::NameFromSetter(instr->function_name()));
+      String::Handle(Z, Field::NameFromSetter(instr->function_name()));
   const Field& field =
-      Field::ZoneHandle(I, GetField(class_id, field_name));
+      Field::ZoneHandle(Z, GetField(class_id, field_name));
   ASSERT(!field.IsNull());
 
   if (InstanceCallNeedsClassCheck(instr, RawFunction::kImplicitSetter)) {
@@ -4619,8 +4534,8 @@
   StoreBarrierType needs_store_barrier = kEmitStoreBarrier;
   if (ArgIsAlways(kSmiCid, *instr->ic_data(), 1)) {
     InsertBefore(instr,
-                 new(I) CheckSmiInstr(
-                     new(I) Value(instr->ArgumentAt(1)),
+                 new(Z) CheckSmiInstr(
+                     new(Z) Value(instr->ArgumentAt(1)),
                      instr->deopt_id(),
                      instr->token_pos()),
                  instr->env(),
@@ -4630,8 +4545,8 @@
 
   if (field.guarded_cid() != kDynamicCid) {
     InsertBefore(instr,
-                 new(I) GuardFieldClassInstr(
-                     new(I) Value(instr->ArgumentAt(1)),
+                 new(Z) GuardFieldClassInstr(
+                     new(Z) Value(instr->ArgumentAt(1)),
                       field,
                       instr->deopt_id()),
                  instr->env(),
@@ -4640,8 +4555,8 @@
 
   if (field.needs_length_check()) {
     InsertBefore(instr,
-                 new(I) GuardFieldLengthInstr(
-                     new(I) Value(instr->ArgumentAt(1)),
+                 new(Z) GuardFieldLengthInstr(
+                     new(Z) Value(instr->ArgumentAt(1)),
                       field,
                       instr->deopt_id()),
                  instr->env(),
@@ -4649,10 +4564,10 @@
   }
 
   // Field guard was detached.
-  StoreInstanceFieldInstr* store = new(I) StoreInstanceFieldInstr(
+  StoreInstanceFieldInstr* store = new(Z) StoreInstanceFieldInstr(
       field,
-      new(I) Value(instr->ArgumentAt(0)),
-      new(I) Value(instr->ArgumentAt(1)),
+      new(Z) Value(instr->ArgumentAt(0)),
+      new(Z) Value(instr->ArgumentAt(1)),
       needs_store_barrier,
       instr->token_pos());
 
@@ -4748,7 +4663,7 @@
   // BitVector containing SSA indexes of all processed definitions. Used to skip
   // those candidates that belong to dependency graph of another candidate.
   BitVector* processed =
-      new(I) BitVector(I, flow_graph_->current_ssa_temp_index());
+      new(Z) BitVector(Z, flow_graph_->current_ssa_temp_index());
 
   // Worklist used to collect dependency graph.
   DefinitionWorklist worklist(flow_graph_, candidates.length());
@@ -4872,7 +4787,7 @@
 
         if (defn->IsBinarySmiOp()) {
           BinarySmiOpInstr* smi_op = defn->AsBinarySmiOp();
-          BinaryInt32OpInstr* int32_op = new(I) BinaryInt32OpInstr(
+          BinaryInt32OpInstr* int32_op = new(Z) BinaryInt32OpInstr(
             smi_op->op_kind(),
             smi_op->left()->CopyWithType(),
             smi_op->right()->CopyWithType(),
@@ -5173,6 +5088,24 @@
 //     - X[*] - non-constant index inside an allocated object X;
 //     - X[C] - constant index inside an allocated object X.
 //
+// Constant indexed places are divided into two subcategories:
+//
+//   - Access to homogeneous array-like objects: Array, ImmutableArray,
+//     OneByteString, TwoByteString. These objects can only be accessed
+//     on element by element basis with all elements having the same size.
+//     This means X[C] aliases X[K] if and only if C === K.
+//   - TypedData accesses. TypedData allow to read one of the primitive
+//     data types at the given byte offset. When TypedData is accessed through
+//     index operator on a typed array or a typed array view it is guaranteed
+//     that the byte offset is always aligned by the element size. We write
+//     these accesses as X[C|S], where C is constant byte offset and S is size
+//     of the data type. Obviously X[C|S] and X[K|U] alias if and only if either
+//     C = RoundDown(K, S) or K = RoundDown(C, U).
+//     Note that not all accesses to typed data are aligned: e.g. ByteData
+//     allows unanaligned access through it's get*/set* methods.
+//     Check in Place::SetIndex ensures that we never create a place X[C|S]
+//     such that C is not aligned by S.
+//
 // Separating allocations from other objects improves precision of the
 // load forwarding pass because of the following two properties:
 //
@@ -5208,10 +5141,38 @@
     kConstantIndexed,
   };
 
+  // Size of the element accessed by constant index. Size is only important
+  // for TypedData because those accesses can alias even when constant indexes
+  // are not the same: X[0|4] aliases X[0|2] and X[2|2].
+  enum ElementSize {
+    // If indexed access is not a TypedData access then element size is not
+    // important because there is only a single possible access size depending
+    // on the receiver - X[C] aliases X[K] if and only if C == K.
+    // This is the size set for Array, ImmutableArray, OneByteString and
+    // TwoByteString accesses.
+    kNoSize,
+
+    // 1 byte (Int8List, Uint8List, Uint8ClampedList).
+    kInt8,
+
+    // 2 bytes (Int16List, Uint16List).
+    kInt16,
+
+    // 4 bytes (Int32List, Uint32List, Float32List).
+    kInt32,
+
+    // 8 bytes (Int64List, Uint64List, Float64List).
+    kInt64,
+
+    // 16 bytes (Int32x4List, Float32x4List, Float64x2List).
+    kInt128,
+
+    kLargestElementSize = kInt128,
+  };
+
   Place(const Place& other)
       : ValueObject(),
-        kind_(other.kind_),
-        representation_(other.representation_),
+        flags_(other.flags_),
         instance_(other.instance_),
         raw_selector_(other.raw_selector_),
         id_(other.id_) {
@@ -5220,21 +5181,20 @@
   // Construct a place from instruction if instruction accesses any place.
   // Otherwise constructs kNone place.
   Place(Instruction* instr, bool* is_load, bool* is_store)
-      : kind_(kNone),
-        representation_(kNoRepresentation),
+      : flags_(0),
         instance_(NULL),
         raw_selector_(0),
         id_(0) {
     switch (instr->tag()) {
       case Instruction::kLoadField: {
         LoadFieldInstr* load_field = instr->AsLoadField();
-        representation_ = load_field->representation();
+        set_representation(load_field->representation());
         instance_ = load_field->instance()->definition()->OriginalDefinition();
         if (load_field->field() != NULL) {
-          kind_ = kField;
+          set_kind(kField);
           field_ = load_field->field();
         } else {
-          kind_ = kVMField;
+          set_kind(kVMField);
           offset_in_bytes_ = load_field->offset_in_bytes();
         }
         *is_load = true;
@@ -5244,14 +5204,14 @@
       case Instruction::kStoreInstanceField: {
         StoreInstanceFieldInstr* store =
             instr->AsStoreInstanceField();
-        representation_ = store->RequiredInputRepresentation(
-            StoreInstanceFieldInstr::kValuePos);
+        set_representation(store->RequiredInputRepresentation(
+            StoreInstanceFieldInstr::kValuePos));
         instance_ = store->instance()->definition()->OriginalDefinition();
         if (!store->field().IsNull()) {
-          kind_ = kField;
+          set_kind(kField);
           field_ = &store->field();
         } else {
-          kind_ = kVMField;
+          set_kind(kVMField);
           offset_in_bytes_ = store->offset_in_bytes();
         }
         *is_store = true;
@@ -5259,35 +5219,39 @@
       }
 
       case Instruction::kLoadStaticField:
-        kind_ = kField;
-        representation_ = instr->AsLoadStaticField()->representation();
+        set_kind(kField);
+        set_representation(instr->AsLoadStaticField()->representation());
         field_ = &instr->AsLoadStaticField()->StaticField();
         *is_load = true;
         break;
 
       case Instruction::kStoreStaticField:
-        kind_ = kField;
-        representation_ = instr->AsStoreStaticField()->
-            RequiredInputRepresentation(StoreStaticFieldInstr::kValuePos);
+        set_kind(kField);
+        set_representation(instr->AsStoreStaticField()->
+            RequiredInputRepresentation(StoreStaticFieldInstr::kValuePos));
         field_ = &instr->AsStoreStaticField()->field();
         *is_store = true;
         break;
 
       case Instruction::kLoadIndexed: {
         LoadIndexedInstr* load_indexed = instr->AsLoadIndexed();
-        representation_ = load_indexed->representation();
+        set_representation(load_indexed->representation());
         instance_ = load_indexed->array()->definition()->OriginalDefinition();
-        SetIndex(load_indexed->index()->definition());
+        SetIndex(load_indexed->index()->definition(),
+                 load_indexed->index_scale(),
+                 load_indexed->class_id());
         *is_load = true;
         break;
       }
 
       case Instruction::kStoreIndexed: {
         StoreIndexedInstr* store_indexed = instr->AsStoreIndexed();
-        representation_ = store_indexed->
-            RequiredInputRepresentation(StoreIndexedInstr::kValuePos);
+        set_representation(store_indexed->
+            RequiredInputRepresentation(StoreIndexedInstr::kValuePos));
         instance_ = store_indexed->array()->definition()->OriginalDefinition();
-        SetIndex(store_indexed->index()->definition());
+        SetIndex(store_indexed->index()->definition(),
+                 store_indexed->index_scale(),
+                 store_indexed->class_id());
         *is_store = true;
         break;
       }
@@ -5298,9 +5262,12 @@
   }
 
   // Create object representing *[*] alias.
-  static Place* CreateAnyInstanceAnyIndexAlias(Isolate* isolate,
+  static Place* CreateAnyInstanceAnyIndexAlias(Zone* zone,
                                                intptr_t id) {
-    return Wrap(isolate, Place(kIndexed, NULL, 0), id);
+    return Wrap(zone, Place(
+        EncodeFlags(kIndexed, kNoRepresentation, kNoSize),
+        NULL,
+        0), id);
   }
 
   // Return least generic alias for this place. Given that aliases are
@@ -5315,10 +5282,12 @@
   //      respectively;
   //    - for non-constant indexed places X[i] we drop information about the
   //      index obtaining alias X[*].
+  //    - we drop information about representation, but keep element size
+  //      if any.
   //
   Place ToAlias() const {
     return Place(
-        kind_,
+        RepresentationBits::update(kNoRepresentation, flags_),
         (DependsOnInstance() && IsAllocation(instance())) ? instance() : NULL,
         (kind() == kIndexed) ? 0 : raw_selector_);
   }
@@ -5343,20 +5312,41 @@
   // wild-card dependent alias *.f, *.@offs, *[C] or *[*] respectively.
   Place CopyWithoutInstance() const {
     ASSERT(DependsOnInstance());
-    return Place(kind_, NULL, raw_selector_);
+    return Place(flags_, NULL, raw_selector_);
   }
 
   // Given alias X[C] or *[C] return X[*] and *[*] respectively.
   Place CopyWithoutIndex() const {
-    ASSERT(kind_ == kConstantIndexed);
-    return Place(kIndexed, instance_, 0);
+    ASSERT(kind() == kConstantIndexed);
+    return Place(EncodeFlags(kIndexed, kNoRepresentation, kNoSize),
+                 instance_,
+                 0);
   }
 
+  // Given alias X[ByteOffs|S] and a larger element size S', return
+  // alias X[RoundDown(ByteOffs, S')|S'] - this is the byte offset of a larger
+  // typed array element that contains this typed array element.
+  // In other words this method computes the only possible place with the given
+  // size that can alias this place (due to alignment restrictions).
+  // For example for X[9|kInt8] and target size kInt32 we would return
+  // X[8|kInt32].
+  Place ToLargerElement(ElementSize to) const {
+    ASSERT(kind() == kConstantIndexed);
+    ASSERT(element_size() != kNoSize);
+    ASSERT(element_size() < to);
+    return Place(ElementSizeBits::update(to, flags_),
+                 instance_,
+                 RoundByteOffset(to, index_constant_));
+  }
+
+
   intptr_t id() const { return id_; }
 
-  Kind kind() const { return kind_; }
+  Kind kind() const { return KindBits::decode(flags_); }
 
-  Representation representation() const { return representation_; }
+  Representation representation() const {
+    return RepresentationBits::decode(flags_);
+  }
 
   Definition* instance() const {
     ASSERT(DependsOnInstance());
@@ -5369,22 +5359,26 @@
   }
 
   const Field& field() const {
-    ASSERT(kind_ == kField);
+    ASSERT(kind() == kField);
     return *field_;
   }
 
   intptr_t offset_in_bytes() const {
-    ASSERT(kind_ == kVMField);
+    ASSERT(kind() == kVMField);
     return offset_in_bytes_;
   }
 
   Definition* index() const {
-    ASSERT(kind_ == kIndexed);
+    ASSERT(kind() == kIndexed);
     return index_;
   }
 
+  ElementSize element_size() const {
+    return ElementSizeBits::decode(flags_);
+  }
+
   intptr_t index_constant() const {
-    ASSERT(kind_ == kConstantIndexed);
+    ASSERT(kind() == kConstantIndexed);
     return index_constant_;
   }
 
@@ -5398,7 +5392,7 @@
   }
 
   const char* ToCString() const {
-    switch (kind_) {
+    switch (kind()) {
       case kNone:
         return "<none>";
 
@@ -5426,10 +5420,18 @@
             DefinitionName(index()));
 
       case kConstantIndexed:
-        return Isolate::Current()->current_zone()->PrintToString(
-            "<%s[%" Pd "]>",
-            DefinitionName(instance()),
-            index_constant());
+        if (element_size() == kNoSize) {
+          return Isolate::Current()->current_zone()->PrintToString(
+              "<%s[%" Pd "]>",
+              DefinitionName(instance()),
+              index_constant());
+        } else {
+          return Isolate::Current()->current_zone()->PrintToString(
+              "<%s[%" Pd "|%" Pd "]>",
+              DefinitionName(instance()),
+              index_constant(),
+              ElementSizeMultiplier(element_size()));
+        }
     }
     UNREACHABLE();
     return "<?>";
@@ -5440,19 +5442,18 @@
   }
 
   intptr_t Hashcode() const {
-    return (kind_ * 63 + reinterpret_cast<intptr_t>(instance_)) * 31 +
-        representation_ * 15 + FieldHashcode();
+    return (flags_ * 63 + reinterpret_cast<intptr_t>(instance_)) * 31 +
+        FieldHashcode();
   }
 
   bool Equals(const Place* other) const {
-    return (kind_ == other->kind_) &&
-        (representation_ == other->representation_) &&
+    return (flags_ == other->flags_) &&
         (instance_ == other->instance_) &&
         SameField(other);
   }
 
   // Create a zone allocated copy of this place and assign given id to it.
-  static Place* Wrap(Isolate* isolate, const Place& place, intptr_t id);
+  static Place* Wrap(Zone* zone, const Place& place, intptr_t id);
 
   static bool IsAllocation(Definition* defn) {
     return (defn != NULL) &&
@@ -5464,37 +5465,132 @@
   }
 
  private:
-  Place(Kind kind, Definition* instance, intptr_t selector)
-      : kind_(kind),
-        representation_(kNoRepresentation),
+  Place(uword flags, Definition* instance, intptr_t selector)
+      : flags_(flags),
         instance_(instance),
         raw_selector_(selector),
         id_(0) {
   }
 
   bool SameField(const Place* other) const {
-    return (kind_ == kField) ? (field().raw() == other->field().raw())
-                             : (offset_in_bytes_ == other->offset_in_bytes_);
+    return (kind() == kField) ? (field().raw() == other->field().raw())
+                              : (offset_in_bytes_ == other->offset_in_bytes_);
   }
 
   intptr_t FieldHashcode() const {
-    return (kind_ == kField) ? reinterpret_cast<intptr_t>(field().raw())
-                             : offset_in_bytes_;
+    return (kind() == kField) ? reinterpret_cast<intptr_t>(field().raw())
+                              : offset_in_bytes_;
   }
 
-  void SetIndex(Definition* index) {
+  void set_representation(Representation rep) {
+    flags_ = RepresentationBits::update(rep, flags_);
+  }
+
+  void set_kind(Kind kind) {
+    flags_ = KindBits::update(kind, flags_);
+  }
+
+  void set_element_size(ElementSize scale) {
+    flags_ = ElementSizeBits::update(scale, flags_);
+  }
+
+  void SetIndex(Definition* index, intptr_t scale, intptr_t class_id) {
     ConstantInstr* index_constant = index->AsConstant();
     if ((index_constant != NULL) && index_constant->value().IsSmi()) {
-      kind_ = kConstantIndexed;
-      index_constant_ = Smi::Cast(index_constant->value()).Value();
-    } else {
-      kind_ = kIndexed;
-      index_ = index;
+      const intptr_t index_value = Smi::Cast(index_constant->value()).Value();
+      const ElementSize size = ElementSizeFor(class_id);
+      const bool is_typed_data = (size != kNoSize);
+
+      // If we are writing into the typed data scale the index to
+      // get byte offset. Otherwise ignore the scale.
+      if (!is_typed_data) {
+        scale = 1;
+      }
+
+      // Guard against potential multiplication overflow and negative indices.
+      if ((0 <= index_value) && (index_value < (kMaxInt32 / scale))) {
+        const intptr_t scaled_index = index_value * scale;
+
+        // Guard against unaligned byte offsets.
+        if (!is_typed_data ||
+            Utils::IsAligned(scaled_index, ElementSizeMultiplier(size))) {
+          set_kind(kConstantIndexed);
+          set_element_size(size);
+          index_constant_ = scaled_index;
+          return;
+        }
+      }
+
+      // Fallthrough: create generic _[*] place.
+    }
+
+    set_kind(kIndexed);
+    index_ = index;
+  }
+
+  static uword EncodeFlags(Kind kind, Representation rep, ElementSize scale) {
+    ASSERT((kind == kConstantIndexed) || (scale == kNoSize));
+    return KindBits::encode(kind) |
+        RepresentationBits::encode(rep) |
+        ElementSizeBits::encode(scale);
+  }
+
+  static ElementSize ElementSizeFor(intptr_t class_id) {
+    switch (class_id) {
+      case kArrayCid:
+      case kImmutableArrayCid:
+      case kOneByteStringCid:
+      case kTwoByteStringCid:
+        // Object arrays and strings do not allow accessing them through
+        // different types. No need to attach scale.
+        return kNoSize;
+
+      case kTypedDataInt8ArrayCid:
+      case kTypedDataUint8ArrayCid:
+      case kTypedDataUint8ClampedArrayCid:
+      case kExternalTypedDataUint8ArrayCid:
+      case kExternalTypedDataUint8ClampedArrayCid:
+        return kInt8;
+
+      case kTypedDataInt16ArrayCid:
+      case kTypedDataUint16ArrayCid:
+        return kInt16;
+
+      case kTypedDataInt32ArrayCid:
+      case kTypedDataUint32ArrayCid:
+      case kTypedDataFloat32ArrayCid:
+        return kInt32;
+
+      case kTypedDataInt64ArrayCid:
+      case kTypedDataUint64ArrayCid:
+      case kTypedDataFloat64ArrayCid:
+        return kInt64;
+
+      case kTypedDataInt32x4ArrayCid:
+      case kTypedDataFloat32x4ArrayCid:
+      case kTypedDataFloat64x2ArrayCid:
+        return kInt128;
+
+      default:
+        UNREACHABLE();
+        return kNoSize;
     }
   }
 
-  Kind kind_;
-  Representation representation_;
+  static intptr_t ElementSizeMultiplier(ElementSize size) {
+    return 1 << (static_cast<intptr_t>(size) - static_cast<intptr_t>(kInt8));
+  }
+
+  static intptr_t RoundByteOffset(ElementSize size, intptr_t offset) {
+    return offset & ~(ElementSizeMultiplier(size) - 1);
+  }
+
+  typedef BitField<Kind, 0, 3> KindBits;
+  typedef BitField<Representation, KindBits::kNextBit, 11> RepresentationBits;
+  typedef BitField<
+      ElementSize, RepresentationBits::kNextBit, 3> ElementSizeBits;
+
+  uword flags_;
   Definition* instance_;
   union {
     intptr_t raw_selector_;
@@ -5519,8 +5615,8 @@
 };
 
 
-Place* Place::Wrap(Isolate* isolate, const Place& place, intptr_t id) {
-  Place* wrapped = (new(isolate) ZonePlace(place))->place();
+Place* Place::Wrap(Zone* zone, const Place& place, intptr_t id) {
+  Place* wrapped = (new(zone) ZonePlace(place))->place();
   wrapped->id_ = id;
   return wrapped;
 }
@@ -5576,20 +5672,21 @@
 // those that are affected by calls.
 class AliasedSet : public ZoneAllocated {
  public:
-  AliasedSet(Isolate* isolate,
+  AliasedSet(Zone* zone,
              DirectChainedHashMap<PointerKeyValueTrait<Place> >* places_map,
              ZoneGrowableArray<Place*>* places,
              PhiPlaceMoves* phi_moves)
-      : isolate_(isolate),
+      : zone_(zone),
         places_map_(places_map),
         places_(*places),
         phi_moves_(phi_moves),
         aliases_(5),
         aliases_map_(),
+        typed_data_access_sizes_(),
         representatives_(),
         killed_(),
-        aliased_by_effects_(new(isolate) BitVector(isolate, places->length())) {
-    InsertAlias(Place::CreateAnyInstanceAnyIndexAlias(isolate_,
+        aliased_by_effects_(new(zone) BitVector(zone, places->length())) {
+    InsertAlias(Place::CreateAnyInstanceAnyIndexAlias(zone_,
         kAnyInstanceAnyIndexAlias));
     for (intptr_t i = 0; i < places_.length(); i++) {
       AddRepresentative(places_[i]);
@@ -5694,6 +5791,13 @@
           EnsureSet(&representatives_, kUnknownInstanceConstantIndexedAlias)->
               Add(place->id());
         }
+
+        // Collect all element sizes used to access TypedData arrays in
+        // the function. This is used to skip sizes without representatives
+        // when computing kill sets.
+        if (alias->element_size() != Place::kNoSize) {
+          typed_data_access_sizes_.Add(alias->element_size());
+        }
       } else if ((alias->kind() == Place::kIndexed) &&
                  CanBeAliased(place->instance())) {
         EnsureSet(&representatives_, kAnyAllocationIndexedAlias)->
@@ -5737,11 +5841,12 @@
   const Place* CanonicalizeAlias(const Place& alias) {
     const Place* canonical = aliases_map_.Lookup(&alias);
     if (canonical == NULL) {
-      canonical = Place::Wrap(isolate_,
+      canonical = Place::Wrap(zone_,
                               alias,
                               kAnyInstanceAnyIndexAlias + aliases_.length());
       InsertAlias(canonical);
     }
+    ASSERT(aliases_map_.Lookup(&alias) == canonical);
     return canonical;
   }
 
@@ -5757,7 +5862,7 @@
 
     BitVector* set = (*sets)[alias];
     if (set == NULL) {
-      (*sets)[alias] = set = new(isolate_) BitVector(isolate_, max_place_id());
+      (*sets)[alias] = set = new(zone_) BitVector(zone_, max_place_id());
     }
     return set;
   }
@@ -5811,6 +5916,39 @@
         break;
 
       case Place::kConstantIndexed:  // Either X[C] or *[C] alias.
+        if (alias->element_size() != Place::kNoSize) {
+          const bool has_aliased_instance =
+              (alias->instance() != NULL) && CanBeAliased(alias->instance());
+
+          // If this is a TypedData access then X[C|S] aliases larger elements
+          // covering this one X[RoundDown(C, S')|S'] for all S' > S and
+          // all smaller elements being covered by this one X[C'|S'] for
+          // some S' < S and all C' such that C = RoundDown(C', S).
+          // In the loop below it's enough to only propagate aliasing to
+          // larger aliases because propagation is symmetric: smaller aliases
+          // (if there are any) would update kill set for this alias when they
+          // are visited.
+          for (intptr_t i = static_cast<intptr_t>(alias->element_size()) + 1;
+               i <= Place::kLargestElementSize;
+               i++) {
+            // Skip element sizes that a guaranteed to have no representatives.
+            if (!typed_data_access_sizes_.Contains(alias->element_size())) {
+              continue;
+            }
+
+            // X[C|S] aliases with X[RoundDown(C, S')|S'] and likewise
+            // *[C|S] aliases with *[RoundDown(C, S')|S'].
+            const Place larger_alias =
+                alias->ToLargerElement(static_cast<Place::ElementSize>(i));
+            CrossAlias(alias, larger_alias);
+            if (has_aliased_instance) {
+              // If X is an aliased instance then X[C|S] aliases
+              // with *[RoundDown(C, S')|S'].
+              CrossAlias(alias, larger_alias.CopyWithoutInstance());
+            }
+          }
+        }
+
         if (alias->instance() == NULL) {
           // *[C] aliases with X[C], X[*], *[*].
           AddAllRepresentatives(alias, kAnyAllocationIndexedAlias);
@@ -5990,7 +6128,7 @@
     }
   }
 
-  Isolate* isolate_;
+  Zone* zone_;
 
   DirectChainedHashMap<PointerKeyValueTrait<Place> >* places_map_;
 
@@ -6003,6 +6141,8 @@
   GrowableArray<const Place*> aliases_;
   DirectChainedHashMap<PointerKeyValueTrait<const Place> > aliases_map_;
 
+  SmallSet<Place::ElementSize> typed_data_access_sizes_;
+
   // Maps alias id to set of ids of places representing the alias.
   // Place represents an alias if this alias is least generic alias for
   // the place.
@@ -6063,8 +6203,10 @@
 static PhiPlaceMoves* ComputePhiMoves(
     DirectChainedHashMap<PointerKeyValueTrait<Place> >* map,
     ZoneGrowableArray<Place*>* places) {
-  Isolate* isolate = Isolate::Current();
-  PhiPlaceMoves* phi_moves = new(isolate) PhiPlaceMoves();
+  Thread* thread = Thread::Current();
+  Isolate* isolate = thread->isolate();
+  Zone* zone = thread->zone();
+  PhiPlaceMoves* phi_moves = new(zone) PhiPlaceMoves();
 
   for (intptr_t i = 0; i < places->length(); i++) {
     Place* place = (*places)[i];
@@ -6083,7 +6225,7 @@
 
         Place* result = map->Lookup(&input_place);
         if (result == NULL) {
-          result = Place::Wrap(isolate, input_place, places->length());
+          result = Place::Wrap(zone, input_place, places->length());
           map->Insert(result);
           places->Add(result);
           if (FLAG_trace_optimization) {
@@ -6116,9 +6258,9 @@
     CSEMode mode) {
   // Loads representing different expression ids will be collected and
   // used to build per offset kill sets.
-  Isolate* isolate = graph->isolate();
+  Zone* zone = graph->zone();
   ZoneGrowableArray<Place*>* places =
-      new(isolate) ZoneGrowableArray<Place*>(10);
+      new(zone) ZoneGrowableArray<Place*>(10);
 
   bool has_loads = false;
   bool has_stores = false;
@@ -6138,7 +6280,7 @@
 
       Place* result = map->Lookup(&place);
       if (result == NULL) {
-        result = Place::Wrap(isolate, place, places->length());
+        result = Place::Wrap(zone, place, places->length());
         map->Insert(result);
         places->Add(result);
 
@@ -6163,7 +6305,7 @@
   PhiPlaceMoves* phi_moves = ComputePhiMoves(map, places);
 
   // Build aliasing sets mapping aliases to loads.
-  return new(isolate) AliasedSet(isolate, map, places, phi_moves);
+  return new(zone) AliasedSet(zone, map, places, phi_moves);
 }
 
 
@@ -6186,9 +6328,9 @@
     const intptr_t num_blocks = graph_->preorder().length();
     for (intptr_t i = 0; i < num_blocks; i++) {
       out_.Add(NULL);
-      gen_.Add(new(I) BitVector(I, aliased_set_->max_place_id()));
-      kill_.Add(new(I) BitVector(I, aliased_set_->max_place_id()));
-      in_.Add(new(I) BitVector(I, aliased_set_->max_place_id()));
+      gen_.Add(new(Z) BitVector(Z, aliased_set_->max_place_id()));
+      kill_.Add(new(Z) BitVector(Z, aliased_set_->max_place_id()));
+      in_.Add(new(Z) BitVector(Z, aliased_set_->max_place_id()));
 
       exposed_values_.Add(NULL);
       out_values_.Add(NULL);
@@ -6200,6 +6342,7 @@
   }
 
   Isolate* isolate() const { return graph_->isolate(); }
+  Zone* zone() const { return graph_->zone(); }
 
   static bool OptimizeGraph(FlowGraph* graph) {
     ASSERT(FLAG_load_cse);
@@ -6426,7 +6569,7 @@
           // the block entry.
           if (exposed_values == NULL) {
             static const intptr_t kMaxExposedValuesInitialSize = 5;
-            exposed_values = new(I) ZoneGrowableArray<Definition*>(
+            exposed_values = new(Z) ZoneGrowableArray<Definition*>(
                 Utils::Minimum(kMaxExposedValuesInitialSize,
                                aliased_set_->max_place_id()));
           }
@@ -6474,10 +6617,10 @@
   // Compute OUT sets by propagating them iteratively until fix point
   // is reached.
   void ComputeOutSets() {
-    BitVector* temp = new(I) BitVector(I, aliased_set_->max_place_id());
+    BitVector* temp = new(Z) BitVector(Z, aliased_set_->max_place_id());
     BitVector* forwarded_loads =
-        new(I) BitVector(I, aliased_set_->max_place_id());
-    BitVector* temp_out = new(I) BitVector(I, aliased_set_->max_place_id());
+        new(Z) BitVector(Z, aliased_set_->max_place_id());
+    BitVector* temp_out = new(Z) BitVector(Z, aliased_set_->max_place_id());
 
     bool changed = true;
     while (changed) {
@@ -6529,7 +6672,7 @@
           if ((block_out == NULL) || !block_out->Equals(*temp)) {
             if (block_out == NULL) {
               block_out = out_[preorder_number] =
-                  new(I) BitVector(I, aliased_set_->max_place_id());
+                  new(Z) BitVector(Z, aliased_set_->max_place_id());
             }
             block_out->CopyFrom(temp);
             changed = true;
@@ -6582,7 +6725,7 @@
               MergeIncomingValues(block, place_id) : NULL;
           if ((in_value == NULL) &&
               (in_[preorder_number]->Contains(place_id))) {
-            PhiInstr* phi = new(I) PhiInstr(block->AsJoinEntry(),
+            PhiInstr* phi = new(Z) PhiInstr(block->AsJoinEntry(),
                                             block->PredecessorCount());
             phi->set_place_id(place_id);
             pending_phis.Add(phi);
@@ -6656,7 +6799,7 @@
         graph_->LoopHeaders();
 
     ZoneGrowableArray<BitVector*>* invariant_loads =
-        new(I) ZoneGrowableArray<BitVector*>(loop_headers.length());
+        new(Z) ZoneGrowableArray<BitVector*>(loop_headers.length());
 
     for (intptr_t i = 0; i < loop_headers.length(); i++) {
       BlockEntryInstr* header = loop_headers[i];
@@ -6666,7 +6809,7 @@
         continue;
       }
 
-      BitVector* loop_gen = new(I) BitVector(I, aliased_set_->max_place_id());
+      BitVector* loop_gen = new(Z) BitVector(Z, aliased_set_->max_place_id());
       for (BitVector::Iterator loop_it(header->loop_info());
            !loop_it.Done();
            loop_it.Advance()) {
@@ -6722,7 +6865,7 @@
     }
 
     // Incoming values are different. Phi is required to merge.
-    PhiInstr* phi = new(I) PhiInstr(
+    PhiInstr* phi = new(Z) PhiInstr(
         block->AsJoinEntry(), block->PredecessorCount());
     phi->set_place_id(place_id);
     FillPhiInputs(phi);
@@ -6745,7 +6888,7 @@
       // To prevent using them we additionally mark definitions themselves
       // as replaced and store a pointer to the replacement.
       Definition* replacement = (*pred_out_values)[place_id]->Replacement();
-      Value* input = new(I) Value(replacement);
+      Value* input = new(Z) Value(replacement);
       phi->SetInputAt(i, input);
       replacement->AddInputUse(input);
     }
@@ -6818,7 +6961,7 @@
 
     worklist_.Clear();
     if (in_worklist_ == NULL) {
-      in_worklist_ = new(I) BitVector(I, graph_->current_ssa_temp_index());
+      in_worklist_ = new(Z) BitVector(Z, graph_->current_ssa_temp_index());
     } else {
       in_worklist_->Clear();
     }
@@ -6941,7 +7084,7 @@
 
     congruency_worklist_.Clear();
     if (in_worklist_ == NULL) {
-      in_worklist_ = new(I) BitVector(I, graph_->current_ssa_temp_index());
+      in_worklist_ = new(Z) BitVector(Z, graph_->current_ssa_temp_index());
     } else {
       in_worklist_->Clear();
     }
@@ -7046,7 +7189,7 @@
 
   ZoneGrowableArray<Definition*>* CreateBlockOutValues() {
     ZoneGrowableArray<Definition*>* out =
-        new(I) ZoneGrowableArray<Definition*>(aliased_set_->max_place_id());
+        new(Z) ZoneGrowableArray<Definition*>(aliased_set_->max_place_id());
     for (intptr_t i = 0; i < aliased_set_->max_place_id(); i++) {
       out->Add(NULL);
     }
@@ -7152,8 +7295,8 @@
   }
 
   virtual void ComputeInitialSets() {
-    Isolate* isolate = graph_->isolate();
-    BitVector* all_places = new(isolate) BitVector(isolate,
+    Zone* zone = graph_->zone();
+    BitVector* all_places = new(zone) BitVector(zone,
         aliased_set_->max_place_id());
     all_places->SetAll();
     for (BlockIterator block_it = graph_->postorder_iterator();
@@ -7199,7 +7342,7 @@
             // candidates for the global store elimination.
             if (exposed_stores == NULL) {
               const intptr_t kMaxExposedStoresInitialSize = 5;
-              exposed_stores = new(isolate) ZoneGrowableArray<Instruction*>(
+              exposed_stores = new(zone) ZoneGrowableArray<Instruction*>(
                   Utils::Minimum(kMaxExposedStoresInitialSize,
                                  aliased_set_->max_place_id()));
             }
@@ -8309,7 +8452,7 @@
     Definition* alloc,
     const ZoneGrowableArray<const Object*>& slots) {
   ZoneGrowableArray<Value*>* values =
-      new(I) ZoneGrowableArray<Value*>(slots.length());
+      new(Z) ZoneGrowableArray<Value*>(slots.length());
 
   // All loads should be inserted before the first materialization so that
   // IR follows the following pattern: loads, materializations, deoptimizing
@@ -8319,28 +8462,28 @@
   // Insert load instruction for every field.
   for (intptr_t i = 0; i < slots.length(); i++) {
     LoadFieldInstr* load = slots[i]->IsField()
-        ? new(I) LoadFieldInstr(
-            new(I) Value(alloc),
+        ? new(Z) LoadFieldInstr(
+            new(Z) Value(alloc),
             &Field::Cast(*slots[i]),
-            AbstractType::ZoneHandle(I),
+            AbstractType::ZoneHandle(Z),
             alloc->token_pos())
-        : new(I) LoadFieldInstr(
-            new(I) Value(alloc),
+        : new(Z) LoadFieldInstr(
+            new(Z) Value(alloc),
             Smi::Cast(*slots[i]).Value(),
-            AbstractType::ZoneHandle(I),
+            AbstractType::ZoneHandle(Z),
             alloc->token_pos());
     flow_graph_->InsertBefore(
         load_point, load, NULL, FlowGraph::kValue);
-    values->Add(new(I) Value(load));
+    values->Add(new(Z) Value(load));
   }
 
   MaterializeObjectInstr* mat = NULL;
   if (alloc->IsAllocateObject()) {
-    mat = new(I) MaterializeObjectInstr(
+    mat = new(Z) MaterializeObjectInstr(
         alloc->AsAllocateObject(), slots, values);
   } else {
     ASSERT(alloc->IsAllocateUninitializedContext());
-    mat = new(I) MaterializeObjectInstr(
+    mat = new(Z) MaterializeObjectInstr(
         alloc->AsAllocateUninitializedContext(), slots, values);
   }
 
@@ -8364,7 +8507,7 @@
   // Mark MaterializeObject as an environment use of this allocation.
   // This will allow us to discover it when we are looking for deoptimization
   // exits for another allocation that potentially flows into this one.
-  Value* val = new(I) Value(alloc);
+  Value* val = new(Z) Value(alloc);
   val->set_instruction(mat);
   alloc->AddEnvUse(val);
 
@@ -8439,7 +8582,7 @@
 void AllocationSinking::InsertMaterializations(Definition* alloc) {
   // Collect all fields that are written for this instance.
   ZoneGrowableArray<const Object*>* slots =
-      new(I) ZoneGrowableArray<const Object*>(5);
+      new(Z) ZoneGrowableArray<const Object*>(5);
 
   for (Value* use = alloc->input_use_list();
        use != NULL;
@@ -8449,7 +8592,7 @@
       if (!store->field().IsNull()) {
         AddSlot(slots, store->field());
       } else {
-        AddSlot(slots, Smi::ZoneHandle(I, Smi::New(store->offset_in_bytes())));
+        AddSlot(slots, Smi::ZoneHandle(Z, Smi::New(store->offset_in_bytes())));
       }
     }
   }
@@ -8459,7 +8602,7 @@
     ASSERT(alloc_object->ArgumentCount() == 1);
     intptr_t type_args_offset =
         alloc_object->cls().type_arguments_field_offset();
-    AddSlot(slots, Smi::ZoneHandle(I, Smi::New(type_args_offset)));
+    AddSlot(slots, Smi::ZoneHandle(Z, Smi::New(type_args_offset)));
   }
 
   // Collect all instructions that mention this object in the environment.
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index ce2290d..44a72a1 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -81,21 +81,18 @@
 
   void SpecializePolymorphicInstanceCall(PolymorphicInstanceCallInstr* call);
 
-  bool TryReplaceWithStoreIndexed(InstanceCallInstr* call);
+  bool TryReplaceWithIndexedOp(InstanceCallInstr* call);
   bool InlineSetIndexed(MethodRecognizer::Kind kind,
                         const Function& target,
                         Instruction* call,
                         Definition* receiver,
                         intptr_t token_pos,
-                        const ICData* ic_data,
                         const ICData& value_check,
                         TargetEntryInstr** entry,
                         Definition** last);
-  bool TryReplaceWithLoadIndexed(InstanceCallInstr* call);
   bool InlineGetIndexed(MethodRecognizer::Kind kind,
                         Instruction* call,
                         Definition* receiver,
-                        const ICData& ic_data,
                         TargetEntryInstr** entry,
                         Definition** last);
   intptr_t PrepareInlineIndexedOp(Instruction* call,
@@ -155,7 +152,7 @@
                       TargetEntryInstr** entry,
                       Definition** last);
 
-  bool InlineByteArrayViewLoad(Instruction* call,
+  bool InlineByteArrayBaseLoad(Instruction* call,
                                Definition* receiver,
                                intptr_t array_cid,
                                intptr_t view_cid,
@@ -163,7 +160,7 @@
                                TargetEntryInstr** entry,
                                Definition** last);
 
-  bool InlineByteArrayViewStore(const Function& target,
+  bool InlineByteArrayBaseStore(const Function& target,
                                 Instruction* call,
                                 Definition* receiver,
                                 intptr_t array_cid,
@@ -172,16 +169,16 @@
                                 TargetEntryInstr** entry,
                                 Definition** last);
 
-  intptr_t PrepareInlineByteArrayViewOp(Instruction* call,
+  intptr_t PrepareInlineByteArrayBaseOp(Instruction* call,
                                         intptr_t array_cid,
                                         intptr_t view_cid,
                                         Definition** array,
                                         Definition* index,
                                         Instruction** cursor);
 
-  bool BuildByteArrayViewLoad(InstanceCallInstr* call,
+  bool BuildByteArrayBaseLoad(InstanceCallInstr* call,
                               intptr_t view_cid);
-  bool BuildByteArrayViewStore(InstanceCallInstr* call,
+  bool BuildByteArrayBaseStore(InstanceCallInstr* call,
                                intptr_t view_cid);
 
   // Insert a check of 'to_check' determined by 'unary_checks'.  If the
@@ -257,6 +254,7 @@
   bool TryStringLengthOneEquality(InstanceCallInstr* call, Token::Kind op_kind);
 
   Isolate* isolate() const { return flow_graph_->isolate(); }
+  Zone* zone() const { return flow_graph_->zone(); }
 
   FlowGraph* flow_graph_;
 
@@ -414,6 +412,7 @@
   void EliminateAllocation(Definition* alloc);
 
   Isolate* isolate() const { return flow_graph_->isolate(); }
+  Zone* zone() const { return flow_graph_->zone(); }
 
   FlowGraph* flow_graph_;
 
diff --git a/runtime/vm/flow_graph_range_analysis.cc b/runtime/vm/flow_graph_range_analysis.cc
index f62b524..866a38c 100644
--- a/runtime/vm/flow_graph_range_analysis.cc
+++ b/runtime/vm/flow_graph_range_analysis.cc
@@ -761,9 +761,10 @@
   if (FLAG_trace_range_analysis) {
     FlowGraphPrinter::PrintGraph("Range Analysis (BEFORE)", flow_graph_);
   }
-
+  Zone* zone = flow_graph_->zone();
   // Initialize bitvector for quick filtering of int values.
-  BitVector* set = new(I) BitVector(I, flow_graph_->current_ssa_temp_index());
+  BitVector* set = new(zone) BitVector(zone,
+      flow_graph_->current_ssa_temp_index());
   for (intptr_t i = 0; i < values_.length(); i++) {
     set->Add(values_[i]->ssa_temp_index());
   }
@@ -1657,8 +1658,9 @@
   ASSERT(flow_graph_ != NULL);
   isolate_ = flow_graph_->isolate();
   ASSERT(isolate_ != NULL);
+  Zone* zone = flow_graph_->zone();
   selected_uint32_defs_ =
-      new(I) BitVector(I, flow_graph_->current_ssa_temp_index());
+      new(zone) BitVector(zone, flow_graph_->current_ssa_temp_index());
 }
 
 
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index 770030d..2fd8919 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -28,11 +28,11 @@
 FlowGraphTypePropagator::FlowGraphTypePropagator(FlowGraph* flow_graph)
     : FlowGraphVisitor(flow_graph->reverse_postorder()),
       flow_graph_(flow_graph),
-      visited_blocks_(new(flow_graph->isolate()) BitVector(
-          flow_graph->isolate(), flow_graph->reverse_postorder().length())),
+      visited_blocks_(new(flow_graph->zone()) BitVector(
+          flow_graph->zone(), flow_graph->reverse_postorder().length())),
       types_(flow_graph->current_ssa_temp_index()),
-      in_worklist_(new(flow_graph->isolate()) BitVector(
-          flow_graph->isolate(), flow_graph->current_ssa_temp_index())),
+      in_worklist_(new(flow_graph->zone()) BitVector(
+          flow_graph->zone(), flow_graph->current_ssa_temp_index())),
       asserts_(NULL),
       collected_asserts_(NULL) {
   for (intptr_t i = 0; i < flow_graph->current_ssa_temp_index(); i++) {
diff --git a/runtime/vm/freelist.cc b/runtime/vm/freelist.cc
index e82ce5d..00a4691 100644
--- a/runtime/vm/freelist.cc
+++ b/runtime/vm/freelist.cc
@@ -10,7 +10,7 @@
 #include "vm/lockers.h"
 #include "vm/object.h"
 #include "vm/raw_object.h"
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 
 namespace dart {
 
diff --git a/runtime/vm/freelist.h b/runtime/vm/freelist.h
index 910b81b..38cad7f 100644
--- a/runtime/vm/freelist.h
+++ b/runtime/vm/freelist.h
@@ -9,7 +9,7 @@
 #include "vm/allocation.h"
 #include "vm/bit_set.h"
 #include "vm/raw_object.h"
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 
 namespace dart {
 
diff --git a/runtime/vm/handles.cc b/runtime/vm/handles.cc
index 5093be5..6a8d6ca 100644
--- a/runtime/vm/handles.cc
+++ b/runtime/vm/handles.cc
@@ -43,17 +43,17 @@
 }
 
 
-uword VMHandles::AllocateHandle(Isolate* isolate) {
+uword VMHandles::AllocateHandle(Zone* zone) {
   return Handles<kVMHandleSizeInWords,
                  kVMHandlesPerChunk,
-                 kOffsetOfRawPtr>::AllocateHandle(isolate);
+                 kOffsetOfRawPtr>::AllocateHandle(zone);
 }
 
 
-uword VMHandles::AllocateZoneHandle(Isolate* isolate) {
+uword VMHandles::AllocateZoneHandle(Zone* zone) {
   return Handles<kVMHandleSizeInWords,
                  kVMHandlesPerChunk,
-                 kOffsetOfRawPtr>::AllocateZoneHandle(isolate);
+                 kOffsetOfRawPtr>::AllocateZoneHandle(zone);
 }
 
 
diff --git a/runtime/vm/handles.h b/runtime/vm/handles.h
index 8a216ff..52ba6e8 100644
--- a/runtime/vm/handles.h
+++ b/runtime/vm/handles.h
@@ -112,11 +112,11 @@
   // Allocates a handle in the current handle scope. This handle is valid only
   // in the current handle scope and is destroyed when the current handle
   // scope ends.
-  static uword AllocateHandle(Isolate* isolate);
+  static uword AllocateHandle(Zone* zone);
 
   // Allocates a handle in the current zone. This handle will be destroyed
   // when the current zone is destroyed.
-  static uword AllocateZoneHandle(Isolate* isolate);
+  static uword AllocateZoneHandle(Zone* zone);
 
   // Returns true if specified handle is a zone handle.
   static bool IsZoneHandle(uword handle);
@@ -268,14 +268,14 @@
   // Visit all object pointers stored in the various handles.
   void VisitObjectPointers(ObjectPointerVisitor* visitor);
 
-  // Allocates a handle in the current handle scope. This handle is valid only
-  // in the current handle scope and is destroyed when the current handle
-  // scope ends.
-  static uword AllocateHandle(Isolate* isolate);
+  // Allocates a handle in the current handle scope of 'zone', which must be
+  // the current zone. This handle is valid only in the current handle scope
+  // and is destroyed when the current handle scope ends.
+  static uword AllocateHandle(Zone* zone);
 
-  // Allocates a handle in the current zone. This handle will be destroyed
-  // when the current zone is destroyed.
-  static uword AllocateZoneHandle(Isolate* isolate);
+  // Allocates a handle in 'zone', which must be the current zone. This handle
+  // will be destroyed when the current zone is destroyed.
+  static uword AllocateZoneHandle(Zone* zone);
 
   // Returns true if specified handle is a zone handle.
   static bool IsZoneHandle(uword handle);
diff --git a/runtime/vm/handles_impl.h b/runtime/vm/handles_impl.h
index a40a671..a299b45 100644
--- a/runtime/vm/handles_impl.h
+++ b/runtime/vm/handles_impl.h
@@ -6,6 +6,7 @@
 #define VM_HANDLES_IMPL_H_
 
 #include "vm/heap.h"
+#include "vm/thread.h"
 #include "vm/visitor.h"
 
 namespace dart {
@@ -85,36 +86,41 @@
 }
 
 
-// Figure out the current handle scope using the current Isolate and
+// Figure out the current handle scope using the current Zone and
 // allocate a handle in that scope. The function assumes that a
-// current Isolate, current zone and current handle scope exist. It
-// asserts for this appropriately.
+// current handle scope exists. It asserts for this appropriately.
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
 uword Handles<kHandleSizeInWords,
               kHandlesPerChunk,
-              kOffsetOfRawPtr>::AllocateHandle(Isolate* isolate) {
+              kOffsetOfRawPtr>::AllocateHandle(Zone* zone) {
+#if defined(DEBUG)
+  Thread* thread = Thread::Current();
+  ASSERT(thread->zone() == zone);
+  Isolate* isolate = thread->isolate();
   ASSERT(isolate != NULL);
-  ASSERT(isolate->current_zone() != NULL);
   ASSERT(isolate->top_handle_scope() != NULL);
   ASSERT(isolate->no_handle_scope_depth() == 0);
-  Handles* handles = isolate->current_zone()->handles();
+#endif  // DEBUG
+  Handles* handles = zone->handles();
   ASSERT(handles != NULL);
   return handles->AllocateScopedHandle();
 }
 
 
-// Figure out the current zone using the current Isolate and
-// allocate a handle in that zone. The function assumes that a
-// current Isolate and current zone exist. It asserts for
+// The function assumes that 'zone' is the current zone and asserts for
 // this appropriately.
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
 uword Handles<kHandleSizeInWords,
               kHandlesPerChunk,
-              kOffsetOfRawPtr>::AllocateZoneHandle(Isolate* isolate) {
+              kOffsetOfRawPtr>::AllocateZoneHandle(Zone* zone) {
+#if defined(DEBUG)
+  Thread* thread = Thread::Current();
+  ASSERT(thread->zone() == zone);
+  Isolate* isolate = thread->isolate();
   ASSERT(isolate != NULL);
-  ASSERT(isolate->current_zone() != NULL);
   ASSERT(isolate->no_handle_scope_depth() == 0);
-  Handles* handles = isolate->current_zone()->handles();
+#endif  // DEBUG
+  Handles* handles = zone->handles();
   ASSERT(handles != NULL);
   uword address = handles->AllocateHandleInZone();
   return address;
diff --git a/runtime/vm/hash_map.h b/runtime/vm/hash_map.h
index babaeca..37fdc9b 100644
--- a/runtime/vm/hash_map.h
+++ b/runtime/vm/hash_map.h
@@ -31,8 +31,8 @@
   void Clear() {
     if (!IsEmpty()) {
       count_ = 0;
-      memset(array_, 0, sizeof(HashMapListElement) * array_size_);
-      memset(lists_, 0, sizeof(HashMapListElement) * lists_size_);
+      InitArray(array_, array_size_);
+      InitArray(lists_, lists_size_);
       lists_[0].next = kNil;
       for (intptr_t i = 1; i < lists_size_; ++i) {
         lists_[i].next = i - 1;
@@ -44,11 +44,18 @@
  protected:
   // A linked list of T values.  Stored in arrays.
   struct HashMapListElement {
+    HashMapListElement() : kv(), next(kNil) { }
     typename KeyValueTrait::Pair kv;
     intptr_t next;  // Index in the array of the next list element.
   };
   static const intptr_t kNil = -1;  // The end of a linked list
 
+  static void InitArray(HashMapListElement* array, intptr_t size) {
+    for (intptr_t i = 0; i < size; ++i) {
+      array[i] = HashMapListElement();
+    }
+  }
+
   // Must be a power of 2.
   static const intptr_t kInitialSize = 16;
 
@@ -71,7 +78,7 @@
     DirectChainedHashMap<KeyValueTrait>::
         Lookup(typename KeyValueTrait::Key key) const {
   const typename KeyValueTrait::Value kNoValue =
-      static_cast<typename KeyValueTrait::Value>(0);
+      KeyValueTrait::ValueOf(typename KeyValueTrait::Pair());
 
   uword hash = static_cast<uword>(KeyValueTrait::Hashcode(key));
   uword pos = Bound(hash);
@@ -112,7 +119,7 @@
 template <typename KeyValueTrait>
 void DirectChainedHashMap<KeyValueTrait>::Resize(intptr_t new_size) {
   const typename KeyValueTrait::Value kNoValue =
-      static_cast<typename KeyValueTrait::Value>(0);
+      KeyValueTrait::ValueOf(typename KeyValueTrait::Pair());
 
   ASSERT(new_size > count_);
   // Hashing the values into the new array has no more collisions than in the
@@ -125,7 +132,7 @@
 
   HashMapListElement* new_array =
       Isolate::Current()->current_zone()->Alloc<HashMapListElement>(new_size);
-  memset(new_array, 0, sizeof(HashMapListElement) * new_size);
+  InitArray(new_array, new_size);
 
   HashMapListElement* old_array = array_;
   intptr_t old_size = array_size_;
@@ -164,7 +171,7 @@
   HashMapListElement* new_lists =
       Isolate::Current()->current_zone()->
       Alloc<HashMapListElement>(new_size);
-  memset(new_lists, 0, sizeof(HashMapListElement) * new_size);
+  InitArray(new_lists, new_size);
 
   HashMapListElement* old_lists = lists_;
   intptr_t old_size = lists_size_;
@@ -186,7 +193,7 @@
 void DirectChainedHashMap<KeyValueTrait>::
     Insert(typename KeyValueTrait::Pair kv) {
   const typename KeyValueTrait::Value kNoValue =
-      static_cast<typename KeyValueTrait::Value>(0);
+      KeyValueTrait::ValueOf(typename KeyValueTrait::Pair());
 
   ASSERT(KeyValueTrait::ValueOf(kv) != kNoValue);
   // Resizing when half of the hashtable is filled up.
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index 40c51b8..aec0a7dc 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -43,7 +43,8 @@
 
 Heap::Heap(Isolate* isolate,
            intptr_t max_new_gen_semi_words,
-           intptr_t max_old_gen_words)
+           intptr_t max_old_gen_words,
+           intptr_t max_external_words)
     : isolate_(isolate),
       read_only_(false),
       gc_in_progress_(false),
@@ -57,7 +58,7 @@
   new_space_ = new Scavenger(this,
                              max_new_gen_semi_words,
                              kNewObjectAlignmentOffset);
-  old_space_ = new PageSpace(this, max_old_gen_words);
+  old_space_ = new PageSpace(this, max_old_gen_words, max_external_words);
   stats_.num_ = 0;
 }
 
@@ -434,9 +435,13 @@
 
 void Heap::Init(Isolate* isolate,
                 intptr_t max_new_gen_words,
-                intptr_t max_old_gen_words) {
+                intptr_t max_old_gen_words,
+                intptr_t max_external_words) {
   ASSERT(isolate->heap() == NULL);
-  Heap* heap = new Heap(isolate, max_new_gen_words, max_old_gen_words);
+  Heap* heap = new Heap(isolate,
+                        max_new_gen_words,
+                        max_old_gen_words,
+                        max_external_words);
   isolate->set_heap(heap);
 }
 
diff --git a/runtime/vm/heap.h b/runtime/vm/heap.h
index aa11c73..1649ab2 100644
--- a/runtime/vm/heap.h
+++ b/runtime/vm/heap.h
@@ -58,11 +58,6 @@
     kGCTestCase,
   };
 
-  // Default allocation sizes in MB for the old gen and code heaps.
-  static const intptr_t kHeapSizeInMWords = 128;
-  static const intptr_t kHeapSizeInMB = kHeapSizeInMWords * kWordSize;
-  static const intptr_t kCodeHeapSizeInMB = 18;
-
 #if defined(DEBUG)
   // Pattern for unused new space and swept old space.
   static const uint64_t kZap64Bits = 0xf3f3f3f3f3f3f3f3;
@@ -161,7 +156,8 @@
   // Initialize the heap and register it with the isolate.
   static void Init(Isolate* isolate,
                    intptr_t max_new_gen_words,
-                   intptr_t max_old_gen_words);
+                   intptr_t max_old_gen_words,
+                   intptr_t max_external_words);
 
   // Verify that all pointers in the heap point to the heap.
   bool Verify(MarkExpectation mark_expectation = kForbidMarked) const;
@@ -284,7 +280,8 @@
 
   Heap(Isolate* isolate,
        intptr_t max_new_gen_semi_words,  // Max capacity of new semi-space.
-       intptr_t max_old_gen_words);
+       intptr_t max_old_gen_words,
+       intptr_t max_external_words);
 
   uword AllocateNew(intptr_t size);
   uword AllocateOld(intptr_t size, HeapPage::PageType type);
diff --git a/runtime/vm/instructions_x64.cc b/runtime/vm/instructions_x64.cc
index f01afbb..a531e66 100644
--- a/runtime/vm/instructions_x64.cc
+++ b/runtime/vm/instructions_x64.cc
@@ -37,28 +37,6 @@
 }
 
 
-uword CallPattern::TargetAddress() const {
-  ASSERT(IsValid());
-  return *reinterpret_cast<uword*>(start() + 2);
-}
-
-
-void CallPattern::SetTargetAddress(uword target) const {
-  ASSERT(IsValid());
-  *reinterpret_cast<uword*>(start() + 2) = target;
-  CPU::FlushICache(start() + 2, kWordSize);
-}
-
-
-const int* CallPattern::pattern() const {
-  // movq $target, TMP
-  // callq *TMP
-  static const int kCallPattern[kLengthInBytes] =
-      {0x49, 0xBB, -1, -1, -1, -1, -1, -1, -1, -1, 0x41, 0xFF, 0xD3};
-  return kCallPattern;
-}
-
-
 uword JumpPattern::TargetAddress() const {
   ASSERT(IsValid());
   int index = InstructionPattern::IndexFromPPLoad(start() + 3);
@@ -76,10 +54,9 @@
 
 
 const int* JumpPattern::pattern() const {
-  //  00: 4d 8b 9d imm32  mov R11, [R13 + off]
-  //  07: 41 ff e3        jmpq R11
+  //  07: 41 ff a7 imm32  jmpq [reg + off]
   static const int kJumpPattern[kLengthInBytes] =
-      {0x4D, 0x8B, -1, -1, -1, -1, -1, 0x41, 0xFF, 0xE3};
+      {0x41, 0xFF, -1, -1, -1, -1, -1};
   return kJumpPattern;
 }
 
diff --git a/runtime/vm/instructions_x64.h b/runtime/vm/instructions_x64.h
index ced627c..9e02313 100644
--- a/runtime/vm/instructions_x64.h
+++ b/runtime/vm/instructions_x64.h
@@ -56,29 +56,6 @@
 };
 
 
-class CallPattern : public InstructionPattern {
- public:
-  CallPattern(uword pc, const Code& code)
-      : InstructionPattern(pc),
-        code_(code) {}
-  static int InstructionLength() {
-    return kLengthInBytes;
-  }
-  uword TargetAddress() const;
-  void SetTargetAddress(uword new_target) const;
-  virtual int pattern_length_in_bytes() const {
-    return kLengthInBytes;
-  }
-
- private:
-  static const int kLengthInBytes = 13;
-  virtual const int* pattern() const;
-  const Code& code_;
-
-  DISALLOW_COPY_AND_ASSIGN(CallPattern);
-};
-
-
 class JumpPattern : public InstructionPattern {
  public:
   JumpPattern(uword pc, const Code& code)
@@ -93,8 +70,8 @@
     return kLengthInBytes;
   }
 
+  static const int kLengthInBytes = 7;
  private:
-  static const int kLengthInBytes = 10;
   virtual const int* pattern() const;
   const Array& object_pool_;
 
diff --git a/runtime/vm/instructions_x64_test.cc b/runtime/vm/instructions_x64_test.cc
index 0e8ee09..b9e3eb2 100644
--- a/runtime/vm/instructions_x64_test.cc
+++ b/runtime/vm/instructions_x64_test.cc
@@ -21,14 +21,6 @@
 }
 
 
-ASSEMBLER_TEST_RUN(Call, test) {
-  StubCode* stub_code = Isolate::Current()->stub_code();
-  CallPattern call(test->entry(), test->code());
-  EXPECT_EQ(stub_code->InvokeDartCodeLabel().address(),
-            call.TargetAddress());
-}
-
-
 static intptr_t prologue_code_size = -1;
 
 
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 3608370..7cf206c 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -217,7 +217,7 @@
   ASSERT(IsDenseSwitch());
   intptr_t mask = 0;
   for (intptr_t i = 0; i < cids_.length(); ++i) {
-    mask |= 1 << (cids_[i] - cids_[0]);
+    mask |= static_cast<intptr_t>(1) << (cids_[i] - cids_[0]);
   }
   return mask;
 }
@@ -1944,12 +1944,12 @@
 }
 
 
-LocationSummary* DebugStepCheckInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DebugStepCheckInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   return locs;
 }
 
@@ -2544,14 +2544,14 @@
 
 #define __ compiler->assembler()->
 
-LocationSummary* GraphEntryInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* GraphEntryInstr::MakeLocationSummary(Zone* zone,
                                                       bool optimizing) const {
   UNREACHABLE();
   return NULL;
 }
 
 
-LocationSummary* JoinEntryInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* JoinEntryInstr::MakeLocationSummary(Zone* zone,
                                                      bool optimizing) const {
   UNREACHABLE();
   return NULL;
@@ -2571,7 +2571,7 @@
 }
 
 
-LocationSummary* TargetEntryInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* TargetEntryInstr::MakeLocationSummary(Zone* zone,
                                                        bool optimizing) const {
   UNREACHABLE();
   return NULL;
@@ -2633,8 +2633,8 @@
 
 
 LocationSummary* IndirectEntryInstr::MakeLocationSummary(
-    Isolate* isolate, bool optimizing) const {
-  return JoinEntryInstr::MakeLocationSummary(isolate, optimizing);
+    Zone* zone, bool optimizing) const {
+  return JoinEntryInstr::MakeLocationSummary(zone, optimizing);
 }
 
 
@@ -2643,7 +2643,7 @@
 }
 
 
-LocationSummary* PhiInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* PhiInstr::MakeLocationSummary(Zone* zone,
                                                bool optimizing) const {
   UNREACHABLE();
   return NULL;
@@ -2655,7 +2655,7 @@
 }
 
 
-LocationSummary* RedefinitionInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* RedefinitionInstr::MakeLocationSummary(Zone* zone,
                                                         bool optimizing) const {
   UNREACHABLE();
   return NULL;
@@ -2667,7 +2667,7 @@
 }
 
 
-LocationSummary* ParameterInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ParameterInstr::MakeLocationSummary(Zone* zone,
                                                      bool optimizing) const {
   UNREACHABLE();
   return NULL;
@@ -2689,7 +2689,7 @@
 }
 
 
-LocationSummary* ParallelMoveInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ParallelMoveInstr::MakeLocationSummary(Zone* zone,
                                                         bool optimizing) const {
   return NULL;
 }
@@ -2700,7 +2700,7 @@
 }
 
 
-LocationSummary* ConstraintInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ConstraintInstr::MakeLocationSummary(Zone* zone,
                                                       bool optimizing) const {
   UNREACHABLE();
   return NULL;
@@ -2713,7 +2713,7 @@
 
 
 LocationSummary* MaterializeObjectInstr::MakeLocationSummary(
-    Isolate* isolate, bool optimizing) const {
+    Zone* zone, bool optimizing) const {
   UNREACHABLE();
   return NULL;
 }
@@ -2740,7 +2740,7 @@
 }
 
 
-LocationSummary* CurrentContextInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CurrentContextInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   // Only appears in initial definitions, never in normal code.
   UNREACHABLE();
@@ -2754,9 +2754,9 @@
 }
 
 
-LocationSummary* PushTempInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* PushTempInstr::MakeLocationSummary(Zone* zone,
                                                     bool optimizing) const {
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                1,
                                Location::NoLocation(),
                                LocationSummary::kNoCall);
@@ -2769,14 +2769,14 @@
 }
 
 
-LocationSummary* DropTempsInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DropTempsInstr::MakeLocationSummary(Zone* zone,
                                                      bool optimizing) const {
   return (InputCount() == 1)
-      ? LocationSummary::Make(isolate,
+      ? LocationSummary::Make(zone,
                               1,
                               Location::SameAsFirstInput(),
                               LocationSummary::kNoCall)
-      : LocationSummary::Make(isolate,
+      : LocationSummary::Make(zone,
                               0,
                               Location::NoLocation(),
                               LocationSummary::kNoCall);
@@ -2806,9 +2806,9 @@
 }
 
 
-LocationSummary* InstanceCallInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* InstanceCallInstr::MakeLocationSummary(Zone* zone,
                                                         bool optimizing) const {
-  return MakeCallSummary(isolate);
+  return MakeCallSummary(zone);
 }
 
 
@@ -2937,9 +2937,9 @@
 }
 
 
-LocationSummary* StaticCallInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StaticCallInstr::MakeLocationSummary(Zone* zone,
                                                       bool optimizing) const {
-  return MakeCallSummary(isolate);
+  return MakeCallSummary(zone);
 }
 
 
@@ -2988,9 +2988,9 @@
 }
 
 
-LocationSummary* DeoptimizeInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DeoptimizeInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
-  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall);
+  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
 }
 
 
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index a12992d..609f89e 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -561,6 +561,7 @@
   M(BoxInt32)                                                                  \
   M(UnboxInt32)                                                                \
   M(UnboxedIntConverter)                                                       \
+  M(GrowRegExpStack)                                                           \
   M(Deoptimize)
 
 #define FOR_EACH_ABSTRACT_INSTRUCTION(M)                                       \
@@ -587,7 +588,7 @@
   DEFINE_INSTRUCTION_TYPE_CHECK(type)
 
 #define DECLARE_INSTRUCTION_BACKEND()                                          \
-  virtual LocationSummary* MakeLocationSummary(Isolate* isolate,               \
+  virtual LocationSummary* MakeLocationSummary(Zone* zone,                     \
                                                bool optimizing) const;         \
   virtual void EmitNativeCode(FlowGraphCompiler* compiler);                    \
 
@@ -725,15 +726,15 @@
 
   bool HasLocs() const { return locs_ != NULL; }
 
-  virtual LocationSummary* MakeLocationSummary(Isolate* isolate,
+  virtual LocationSummary* MakeLocationSummary(Zone* zone,
                                                bool is_optimizing) const = 0;
 
-  void InitializeLocationSummary(Isolate* isolate, bool optimizing) {
+  void InitializeLocationSummary(Zone* zone, bool optimizing) {
     ASSERT(locs_ == NULL);
-    locs_ = MakeLocationSummary(isolate, optimizing);
+    locs_ = MakeLocationSummary(zone, optimizing);
   }
 
-  static LocationSummary* MakeCallSummary(Isolate* isolate);
+  static LocationSummary* MakeCallSummary(Zone* zone);
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     UNIMPLEMENTED();
@@ -7793,6 +7794,24 @@
 };
 
 
+class GrowRegExpStackInstr : public TemplateDefinition<1, Throws> {
+ public:
+  explicit GrowRegExpStackInstr(Value* typed_data_cell) {
+    SetInputAt(0, typed_data_cell);
+  }
+
+  Value* typed_data_cell() const { return inputs_[0]; }
+
+  virtual bool CanDeoptimize() const { return MayThrow(); }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+
+  DECLARE_INSTRUCTION(GrowRegExpStack);
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(GrowRegExpStackInstr);
+};
+
+
 #undef DECLARE_INSTRUCTION
 
 class Environment : public ZoneAllocated {
@@ -8034,8 +8053,7 @@
 
 // Helper macros for platform ports.
 #define DEFINE_UNIMPLEMENTED_INSTRUCTION(Name)                                \
-  LocationSummary* Name::MakeLocationSummary(                                 \
-      Isolate* isolate, bool opt) const {                                     \
+  LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const {    \
     UNIMPLEMENTED();                                                          \
     return NULL;                                                              \
   }                                                                           \
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 1c2eb89..40cddcf 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -33,20 +33,20 @@
 
 // Generic summary for call instructions that have all arguments pushed
 // on the stack and return the result in a fixed register R0.
-LocationSummary* Instruction::MakeCallSummary(Isolate* isolate) {
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, 0, 0, LocationSummary::kCall);
+LocationSummary* Instruction::MakeCallSummary(Zone* zone) {
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, 0, 0, LocationSummary::kCall);
   result->set_out(0, Location::RegisterLocation(R0));
   return result;
 }
 
 
-LocationSummary* PushArgumentInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* PushArgumentInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::AnyOrConstant(value()));
   return locs;
 }
@@ -71,12 +71,12 @@
 }
 
 
-LocationSummary* ReturnInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ReturnInstr::MakeLocationSummary(Zone* zone,
                                                   bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   return locs;
 }
@@ -138,9 +138,9 @@
 }
 
 
-LocationSummary* IfThenElseInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* IfThenElseInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
-  comparison()->InitializeLocationSummary(isolate, opt);
+  comparison()->InitializeLocationSummary(zone, opt);
   return comparison()->locs();
 }
 
@@ -198,12 +198,12 @@
 }
 
 
-LocationSummary* ClosureCallInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ClosureCallInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));  // Function.
   summary->set_out(0, Location::RegisterLocation(R0));
   return summary;
@@ -248,9 +248,9 @@
 }
 
 
-LocationSummary* LoadLocalInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadLocalInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -263,9 +263,9 @@
 }
 
 
-LocationSummary* StoreLocalInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StoreLocalInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                1,
                                Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
@@ -280,9 +280,9 @@
 }
 
 
-LocationSummary* ConstantInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -298,12 +298,12 @@
 }
 
 
-LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = (representation_ == kUnboxedInt32) ? 0 : 1;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (representation_ == kUnboxedInt32) {
     locs->set_out(0, Location::RequiresRegister());
   } else {
@@ -343,12 +343,12 @@
 }
 
 
-LocationSummary* AssertAssignableInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* AssertAssignableInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));  // Value.
   summary->set_in(1, Location::RegisterLocation(R2));  // Instantiator.
   summary->set_in(2, Location::RegisterLocation(R1));  // Type arguments.
@@ -357,12 +357,12 @@
 }
 
 
-LocationSummary* AssertBooleanInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* AssertBooleanInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -426,13 +426,13 @@
 }
 
 
-LocationSummary* EqualityCompareInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* EqualityCompareInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   if (operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::Pair(Location::RequiresRegister(),
                                    Location::RequiresRegister()));
     locs->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -442,8 +442,8 @@
   }
   if (operation_cid() == kDoubleCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RequiresFpuRegister());
     locs->set_in(1, Location::RequiresFpuRegister());
     locs->set_out(0, Location::RequiresRegister());
@@ -451,8 +451,8 @@
   }
   if (operation_cid() == kSmiCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
@@ -704,12 +704,12 @@
 }
 
 
-LocationSummary* TestSmiInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* TestSmiInstr::MakeLocationSummary(Zone* zone,
                                                    bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -749,12 +749,12 @@
 }
 
 
-LocationSummary* TestCidsInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* TestCidsInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
   locs->set_out(0, Location::RequiresRegister());
@@ -822,14 +822,14 @@
 }
 
 
-LocationSummary* RelationalOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* RelationalOpInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::Pair(Location::RequiresRegister(),
                                    Location::RequiresRegister()));
     locs->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -838,16 +838,16 @@
     return locs;
   }
   if (operation_cid() == kDoubleCid) {
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     summary->set_out(0, Location::RequiresRegister());
     return summary;
   }
   ASSERT(operation_cid() == kSmiCid);
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RegisterOrConstant(left()));
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -919,9 +919,9 @@
 }
 
 
-LocationSummary* NativeCallInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* NativeCallInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
-  return MakeCallSummary(isolate);
+  return MakeCallSummary(zone);
 }
 
 
@@ -974,11 +974,11 @@
 }
 
 
-LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   // TODO(fschneider): Allow immediate operands for the char code.
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -995,10 +995,10 @@
 }
 
 
-LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -1017,12 +1017,12 @@
 }
 
 
-LocationSummary* StringInterpolateInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StringInterpolateInstr::MakeLocationSummary(Zone* zone,
                                                              bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));
   summary->set_out(0, Location::RegisterLocation(R0));
   return summary;
@@ -1045,10 +1045,10 @@
 }
 
 
-LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -1067,10 +1067,10 @@
 }
 
 
-LocationSummary* LoadClassIdInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadClassIdInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -1194,12 +1194,12 @@
 }
 
 
-LocationSummary* LoadIndexedInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadIndexedInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   bool needs_base = false;
   if (CanBeImmediateIndex(index(), class_id(), IsExternal(),
@@ -1373,7 +1373,7 @@
 }
 
 
-LocationSummary* StoreIndexedInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StoreIndexedInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 3;
   LocationSummary* locs;
@@ -1383,8 +1383,8 @@
                           false,  // Store.
                           &needs_base)) {
     const intptr_t kNumTemps = needs_base ? 1 : 0;
-    locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
     // CanBeImmediateIndex must return false for unsafe smis.
     locs->set_in(1, Location::Constant(index()->definition()->AsConstant()));
@@ -1393,8 +1393,8 @@
     }
   } else {
     const intptr_t kNumTemps = 0;
-    locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
     locs->set_in(1, Location::WritableRegister());
   }
@@ -1544,7 +1544,7 @@
 }
 
 
-LocationSummary* GuardFieldClassInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* GuardFieldClassInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
 
@@ -1567,8 +1567,8 @@
     num_temps++;
   }
 
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, num_temps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, num_temps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
 
   for (intptr_t i = 0; i < num_temps; i++) {
@@ -1711,13 +1711,13 @@
 }
 
 
-LocationSummary* GuardFieldLengthInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* GuardFieldLengthInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   if (!opt || (field().guarded_list_length() == Field::kUnknownFixedLength)) {
     const intptr_t kNumTemps = 3;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     // We need temporaries for field object, length offset and expected length.
     summary->set_temp(0, Location::RequiresRegister());
@@ -1728,8 +1728,8 @@
     // TODO(vegorov): can use TMP when length is small enough to fit into
     // immediate.
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_temp(0, Location::RequiresRegister());
     return summary;
@@ -1873,13 +1873,13 @@
 
 
 
-LocationSummary* LoadCodeUnitsInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadCodeUnitsInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const bool might_box = (representation() == kTagged) && !can_pack_into_smi();
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = might_box ? 1 : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps,
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps,
       might_box ? LocationSummary::kCallOnSlowPath : LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
@@ -1985,14 +1985,14 @@
 }
 
 
-LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps =
       (IsUnboxedStore() && opt) ? 2 :
           ((IsPotentialUnboxedStore()) ? 3 : 0);
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps,
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps,
           ((IsUnboxedStore() && opt && is_potential_unboxed_initialization_) ||
            IsPotentialUnboxedStore())
           ? LocationSummary::kCallOnSlowPath
@@ -2198,24 +2198,30 @@
       __ StoreIntoObjectNoBarrierOffset(
           instance_reg,
           offset_in_bytes_,
-          locs()->in(1).constant());
+          locs()->in(1).constant(),
+          is_object_reference_initialization_ ?
+              Assembler::kEmptyOrSmiOrNull :
+              Assembler::kHeapObjectOrSmi);
     } else {
       const Register value_reg = locs()->in(1).reg();
       __ StoreIntoObjectNoBarrierOffset(instance_reg,
                                         offset_in_bytes_,
-                                        value_reg);
+                                        value_reg,
+                                        is_object_reference_initialization_ ?
+                                            Assembler::kEmptyOrSmiOrNull :
+                                            Assembler::kHeapObjectOrSmi);
     }
   }
   __ Bind(&skip_store);
 }
 
 
-LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -2234,10 +2240,10 @@
 }
 
 
-LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, 1, 1, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, 1, 1, LocationSummary::kNoCall);
   locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
                                               : Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
@@ -2260,12 +2266,12 @@
 }
 
 
-LocationSummary* InstanceOfInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* InstanceOfInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));
   summary->set_in(1, Location::RegisterLocation(R2));
   summary->set_in(2, Location::RegisterLocation(R1));
@@ -2288,12 +2294,12 @@
 }
 
 
-LocationSummary* CreateArrayInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CreateArrayInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(kElementTypePos, Location::RegisterLocation(R1));
   locs->set_in(kLengthPos, Location::RegisterLocation(R2));
   locs->set_out(0, Location::RegisterLocation(R0));
@@ -2320,12 +2326,12 @@
   // R3: new object end address.
 
   // Store the type argument field.
-  __ StoreIntoObjectNoBarrier(R0,
+  __ InitializeFieldNoBarrier(R0,
                               FieldAddress(R0, Array::type_arguments_offset()),
                               kElemTypeReg);
 
   // Set the length field.
-  __ StoreIntoObjectNoBarrier(R0,
+  __ InitializeFieldNoBarrier(R0,
                               FieldAddress(R0, Array::length_offset()),
                               kLengthReg);
 
@@ -2400,15 +2406,15 @@
 }
 
 
-LocationSummary* LoadFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadFieldInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps =
       (IsUnboxedLoad() && opt) ? 1 :
           ((IsPotentialUnboxedLoad()) ? 3 : 0);
 
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps,
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps,
           (opt && !IsPotentialUnboxedLoad())
           ? LocationSummary::kNoCall
           : LocationSummary::kCallOnSlowPath);
@@ -2544,12 +2550,12 @@
 }
 
 
-LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2577,11 +2583,11 @@
 
 
 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2646,13 +2652,13 @@
 
 
 LocationSummary* AllocateUninitializedContextInstr::MakeLocationSummary(
-    Isolate* isolate,
+    Zone* zone,
     bool opt) const {
   ASSERT(opt);
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 3;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   locs->set_temp(0, Location::RegisterLocation(R1));
   locs->set_temp(1, Location::RegisterLocation(R2));
   locs->set_temp(2, Location::RegisterLocation(R3));
@@ -2718,12 +2724,12 @@
 }
 
 
-LocationSummary* AllocateContextInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* AllocateContextInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_temp(0, Location::RegisterLocation(R1));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2744,12 +2750,12 @@
 }
 
 
-LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_temp(0, Location::RegisterLocation(R1));
   return locs;
@@ -2781,12 +2787,12 @@
 }
 
 
-LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CloneContextInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2809,7 +2815,7 @@
 }
 
 
-LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   UNREACHABLE();
   return NULL;
@@ -2847,12 +2853,12 @@
 }
 
 
-LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs,
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   summary->set_temp(0, Location::RequiresRegister());
@@ -3032,7 +3038,7 @@
 }
 
 
-LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   // Calculate number of temporaries.
@@ -3052,8 +3058,8 @@
              (TargetCPUFeatures::arm_version() != ARMv7)) {
     num_temps = 1;
   }
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, num_temps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, num_temps, LocationSummary::kNoCall);
   if (op_kind() == Token::kTRUNCDIV) {
     summary->set_in(0, Location::RequiresRegister());
     if (RightIsPowerOfTwoConstant()) {
@@ -3418,7 +3424,7 @@
 }
 
 
-LocationSummary* BinaryInt32OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryInt32OpInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   // Calculate number of temporaries.
@@ -3430,8 +3436,8 @@
              (TargetCPUFeatures::arm_version() != ARMv7)) {
     num_temps = 1;
   }
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, num_temps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, num_temps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RegisterOrSmiConstant(right()));
   if (((op_kind() == Token::kSHL) && can_overflow()) ||
@@ -3628,15 +3634,15 @@
 }
 
 
-LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Zone* zone,
                                                              bool opt) const {
   intptr_t left_cid = left()->Type()->ToCid();
   intptr_t right_cid = right()->Type()->ToCid();
   ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   return summary;
@@ -3665,12 +3671,12 @@
 }
 
 
-LocationSummary* BoxInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs,
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
@@ -3709,13 +3715,13 @@
 }
 
 
-LocationSummary* UnboxInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const bool needs_temp = CanDeoptimize();
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = needs_temp ? 1 : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (needs_temp) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -3835,14 +3841,14 @@
 }
 
 
-LocationSummary* BoxInteger32Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
                                                    bool opt) const {
   ASSERT((from_representation() == kUnboxedInt32) ||
          (from_representation() == kUnboxedUint32));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate,
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone,
       kNumInputs,
       kNumTemps,
       ValueFitsSmi() ? LocationSummary::kNoCall
@@ -3899,12 +3905,12 @@
 }
 
 
-LocationSummary* BoxInt64Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInt64Instr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate,
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone,
       kNumInputs,
       kNumTemps,
       ValueFitsSmi() ? LocationSummary::kNoCall
@@ -3975,15 +3981,15 @@
 }
 
 
-LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   ASSERT((representation() == kUnboxedInt32) ||
          (representation() == kUnboxedUint32));
   ASSERT((representation() != kUnboxedUint32) || is_truncating());
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = CanDeoptimize() ? 1 : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (kNumTemps > 0) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -4023,12 +4029,12 @@
 }
 
 
-LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4050,12 +4056,12 @@
 }
 
 
-LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Zone* zone,
                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4078,12 +4084,12 @@
 }
 
 
-LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(Zone* zone,
                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4127,12 +4133,12 @@
 }
 
 
-LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   // Low (< Q7) Q registers are needed for the vcvtds and vmovs instructions.
   summary->set_in(0, Location::FpuRegisterLocation(Q5));
   summary->set_out(0, Location::FpuRegisterLocation(Q6));
@@ -4208,12 +4214,12 @@
 }
 
 
-LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   // Low (< Q7) Q registers are needed for the vcvtds and vmovs instructions.
   summary->set_in(0, Location::FpuRegisterLocation(Q4));
   summary->set_in(1, Location::FpuRegisterLocation(Q5));
@@ -4265,12 +4271,12 @@
 }
 
 
-LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(Zone* zone,
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::FpuRegisterLocation(Q5));
   summary->set_temp(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
@@ -4307,11 +4313,11 @@
 
 
 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4339,12 +4345,12 @@
 }
 
 
-LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -4356,12 +4362,12 @@
 }
 
 
-LocationSummary* Float32x4SplatInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4SplatInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4382,12 +4388,12 @@
 }
 
 
-LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Zone* zone,
                                                                bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4427,12 +4433,12 @@
 }
 
 
-LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4457,12 +4463,12 @@
 }
 
 
-LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   summary->set_temp(0, Location::RequiresFpuRegister());
@@ -4490,12 +4496,12 @@
 }
 
 
-LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4519,12 +4525,12 @@
 }
 
 
-LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4547,12 +4553,12 @@
 }
 
 
-LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4571,12 +4577,12 @@
 }
 
 
-LocationSummary* Float32x4WithInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4WithInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   // Low (< 7) Q registers are needed for the vmovs instruction.
@@ -4620,12 +4626,12 @@
 }
 
 
-LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4642,12 +4648,12 @@
 }
 
 
-LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4676,12 +4682,12 @@
 }
 
 
-LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -4693,12 +4699,12 @@
 }
 
 
-LocationSummary* Float64x2SplatInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float64x2SplatInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4722,11 +4728,11 @@
 
 
 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4751,11 +4757,11 @@
 
 
 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   // Low (< 7) Q registers are needed for the vcvtsd instruction.
   summary->set_out(0, Location::FpuRegisterLocation(Q6));
@@ -4782,11 +4788,11 @@
 
 
 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   // Low (< 7) Q registers are needed for the vcvtsd instruction.
   summary->set_out(0, Location::FpuRegisterLocation(Q6));
@@ -4810,12 +4816,12 @@
 }
 
 
-LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
   if (representation() == kTagged) {
     ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask);
@@ -4876,12 +4882,12 @@
 }
 
 
-LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4950,11 +4956,11 @@
 
 
 LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_in(2, Location::RequiresRegister());
@@ -4979,11 +4985,11 @@
 
 
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_in(2, Location::RequiresRegister());
@@ -5022,12 +5028,12 @@
 }
 
 
-LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   // Low (< 7) Q registers are needed for the vmovrs instruction.
   summary->set_in(0, Location::FpuRegisterLocation(Q6));
   summary->set_out(0, Location::RequiresRegister());
@@ -5068,12 +5074,12 @@
 }
 
 
-LocationSummary* Int32x4SelectInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32x4SelectInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -5103,12 +5109,12 @@
 }
 
 
-LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -5149,12 +5155,12 @@
 }
 
 
-LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -5171,12 +5177,12 @@
 }
 
 
-LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -5199,13 +5205,13 @@
 }
 
 
-LocationSummary* MathUnaryInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* MathUnaryInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
     const intptr_t kNumInputs = 1;
     const intptr_t kNumTemps = TargetCPUFeatures::hardfp_supported() ? 0 : 4;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kCall);
     summary->set_in(0, Location::FpuRegisterLocation(Q0));
     summary->set_out(0, Location::FpuRegisterLocation(Q0));
     if (!TargetCPUFeatures::hardfp_supported()) {
@@ -5220,8 +5226,8 @@
          (kind() == MathUnaryInstr::kDoubleSquare));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -5257,10 +5263,10 @@
 
 
 LocationSummary* CaseInsensitiveCompareUC16Instr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, InputCount(), kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));
   summary->set_in(1, Location::RegisterLocation(R1));
   summary->set_in(2, Location::RegisterLocation(R2));
@@ -5278,13 +5284,13 @@
 }
 
 
-LocationSummary* MathMinMaxInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* MathMinMaxInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   if (result_cid() == kDoubleCid) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     // Reuse the left register so that code can be made shorter.
@@ -5295,8 +5301,8 @@
   ASSERT(result_cid() == kSmiCid);
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   // Reuse the left register so that code can be made shorter.
@@ -5364,12 +5370,12 @@
 }
 
 
-LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   // We make use of 3-operand instructions by not requiring result register
   // to be identical to first input register as on Intel.
@@ -5399,12 +5405,12 @@
 }
 
 
-LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -5418,12 +5424,12 @@
 }
 
 
-LocationSummary* Int32ToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32ToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -5438,12 +5444,12 @@
 }
 
 
-LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -5459,7 +5465,7 @@
 }
 
 
-LocationSummary* MintToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* MintToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -5471,12 +5477,12 @@
 }
 
 
-LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::RegisterLocation(R1));
   result->set_out(0, Location::RegisterLocation(R0));
   return result;
@@ -5525,12 +5531,12 @@
 }
 
 
-LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresRegister());
   return result;
@@ -5556,7 +5562,7 @@
 }
 
 
-LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -5568,12 +5574,12 @@
 }
 
 
-LocationSummary* DoubleToFloatInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DoubleToFloatInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   // Low (<= Q7) Q registers are needed for the conversion instructions.
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::FpuRegisterLocation(Q7));
@@ -5589,12 +5595,12 @@
 }
 
 
-LocationSummary* FloatToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* FloatToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   // Low (<= Q7) Q registers are needed for the conversion instructions.
   result->set_in(0, Location::FpuRegisterLocation(Q7));
   result->set_out(0, Location::RequiresFpuRegister());
@@ -5610,14 +5616,14 @@
 }
 
 
-LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(Zone* zone,
                                                                bool opt) const {
   ASSERT((InputCount() == 1) || (InputCount() == 2));
   const intptr_t kNumTemps =
       (TargetCPUFeatures::hardfp_supported()) ?
         ((recognized_kind() == MethodRecognizer::kMathDoublePow) ? 1 : 0) : 4;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, InputCount(), kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::FpuRegisterLocation(Q0));
   if (InputCount() == 2) {
     result->set_in(1, Location::FpuRegisterLocation(Q1));
@@ -5797,13 +5803,13 @@
 }
 
 
-LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   // Only use this instruction in optimized code.
   ASSERT(opt);
   const intptr_t kNumInputs = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, 0, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, 0, LocationSummary::kNoCall);
   if (representation() == kUnboxedDouble) {
     if (index() == 0) {
       summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
@@ -5847,13 +5853,13 @@
 }
 
 
-LocationSummary* MergedMathInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* MergedMathInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   if (kind() == MergedMathInstr::kTruncDivMod) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 2;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::RequiresRegister());
     summary->set_temp(0, Location::RequiresRegister());
@@ -5935,8 +5941,8 @@
 
 
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
-  return MakeCallSummary(isolate);
+    Zone* zone, bool opt) const {
+  return MakeCallSummary(zone);
 }
 
 
@@ -5975,9 +5981,9 @@
 }
 
 
-LocationSummary* BranchInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BranchInstr::MakeLocationSummary(Zone* zone,
                                                   bool opt) const {
-  comparison()->InitializeLocationSummary(isolate, opt);
+  comparison()->InitializeLocationSummary(zone, opt);
   // Branches don't produce a result.
   comparison()->locs()->set_out(0, Location::NoLocation());
   return comparison()->locs();
@@ -5989,13 +5995,13 @@
 }
 
 
-LocationSummary* CheckClassInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckClassInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const bool need_mask_temp = IsDenseSwitch() && !IsDenseMask(ComputeCidMask());
   const intptr_t kNumTemps = !IsNullCheck() ? (need_mask_temp ? 2 : 1) : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (!IsNullCheck()) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -6066,12 +6072,12 @@
 }
 
 
-LocationSummary* CheckSmiInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckSmiInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -6087,12 +6093,12 @@
 }
 
 
-LocationSummary* CheckClassIdInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckClassIdInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -6106,12 +6112,12 @@
 }
 
 
-LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
   locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
   return locs;
@@ -6184,12 +6190,12 @@
 }
 
 
-LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -6273,12 +6279,12 @@
 }
 
 
-LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_in(1, Location::WritableRegisterOrSmiConstant(right()));
@@ -6419,12 +6425,12 @@
 }
 
 
-LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_out(0, Location::Pair(Location::RequiresRegister(),
@@ -6471,12 +6477,12 @@
 }
 
 
-LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
@@ -6514,12 +6520,12 @@
 }
 
 
-LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RegisterOrSmiConstant(right()));
   summary->set_temp(0, Location::RequiresRegister());
@@ -6584,12 +6590,12 @@
 }
 
 
-LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -6607,12 +6613,12 @@
 }
 
 
-LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Zone* zone,
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (from() == kUnboxedMint) {
     ASSERT((to() == kUnboxedUint32) || (to() == kUnboxedInt32));
     summary->set_in(0, Location::Pair(Location::RequiresRegister(),
@@ -6683,9 +6689,9 @@
 }
 
 
-LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ThrowInstr::MakeLocationSummary(Zone* zone,
                                                  bool opt) const {
-  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
+  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
 }
 
 
@@ -6699,9 +6705,9 @@
 }
 
 
-LocationSummary* ReThrowInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ReThrowInstr::MakeLocationSummary(Zone* zone,
                                                    bool opt) const {
-  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
+  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
 }
 
 
@@ -6723,9 +6729,9 @@
 }
 
 
-LocationSummary* GotoInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* GotoInstr::MakeLocationSummary(Zone* zone,
                                                 bool opt) const {
-  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall);
+  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
 }
 
 
@@ -6755,13 +6761,13 @@
 }
 
 
-LocationSummary* IndirectGotoInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* IndirectGotoInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
 
-  LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
   summary->set_in(0, Location::RequiresRegister());
   summary->set_temp(0, Location::RequiresRegister());
@@ -6789,20 +6795,20 @@
 }
 
 
-LocationSummary* StrictCompareInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StrictCompareInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (needs_number_check()) {
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kCall);
     locs->set_in(0, Location::RegisterLocation(R0));
     locs->set_in(1, Location::RegisterLocation(R1));
     locs->set_out(0, Location::RegisterLocation(R0));
     return locs;
   }
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
   // If a constant has more than one use, make sure it is loaded in register
   // so that multiple immediate loads can be avoided.
@@ -6881,9 +6887,9 @@
 }
 
 
-LocationSummary* BooleanNegateInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BooleanNegateInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                1,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -6900,9 +6906,9 @@
 }
 
 
-LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* AllocateObjectInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
-  return MakeCallSummary(isolate);
+  return MakeCallSummary(zone);
 }
 
 
@@ -6932,6 +6938,34 @@
 #endif
 }
 
+
+LocationSummary* GrowRegExpStackInstr::MakeLocationSummary(
+    Zone* zone, bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_in(0, Location::RegisterLocation(R0));
+  locs->set_out(0, Location::RegisterLocation(R0));
+  return locs;
+}
+
+
+void GrowRegExpStackInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register typed_data = locs()->in(0).reg();
+  const Register result = locs()->out(0).reg();
+  __ PushObject(Object::null_object());
+  __ Push(typed_data);
+  compiler->GenerateRuntimeCall(Scanner::kNoSourcePos,  // No token position.
+                                deopt_id(),
+                                kGrowRegExpStackRuntimeEntry,
+                                1,
+                                locs());
+  __ Drop(1);
+  __ Pop(result);
+}
+
+
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_ARM
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index 4e9794f..0ecb339 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -31,20 +31,20 @@
 
 // Generic summary for call instructions that have all arguments pushed
 // on the stack and return the result in a fixed register R0.
-LocationSummary* Instruction::MakeCallSummary(Isolate* isolate) {
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, 0, 0, LocationSummary::kCall);
+LocationSummary* Instruction::MakeCallSummary(Zone* zone) {
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, 0, 0, LocationSummary::kCall);
   result->set_out(0, Location::RegisterLocation(R0));
   return result;
 }
 
 
-LocationSummary* PushArgumentInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* PushArgumentInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::AnyOrConstant(value()));
   return locs;
 }
@@ -69,12 +69,12 @@
 }
 
 
-LocationSummary* ReturnInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ReturnInstr::MakeLocationSummary(Zone* zone,
                                                   bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   return locs;
 }
@@ -136,9 +136,9 @@
 }
 
 
-LocationSummary* IfThenElseInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* IfThenElseInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
-  comparison()->InitializeLocationSummary(isolate, opt);
+  comparison()->InitializeLocationSummary(zone, opt);
   return comparison()->locs();
 }
 
@@ -193,12 +193,12 @@
 }
 
 
-LocationSummary* ClosureCallInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ClosureCallInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));  // Function.
   summary->set_out(0, Location::RegisterLocation(R0));
   return summary;
@@ -243,9 +243,9 @@
 }
 
 
-LocationSummary* LoadLocalInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadLocalInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -258,9 +258,9 @@
 }
 
 
-LocationSummary* StoreLocalInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StoreLocalInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                1,
                                Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
@@ -275,9 +275,9 @@
 }
 
 
-LocationSummary* ConstantInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -293,12 +293,12 @@
 }
 
 
-LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
   const Location out = (representation_ == kUnboxedInt32) ?
       Location::RequiresRegister() : Location::RequiresFpuRegister();
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                out,
                                LocationSummary::kNoCall);
@@ -330,12 +330,12 @@
 }
 
 
-LocationSummary* AssertAssignableInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* AssertAssignableInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));  // Value.
   summary->set_in(1, Location::RegisterLocation(R2));  // Instantiator.
   summary->set_in(2, Location::RegisterLocation(R1));  // Type arguments.
@@ -344,12 +344,12 @@
 }
 
 
-LocationSummary* AssertBooleanInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* AssertBooleanInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -472,13 +472,13 @@
 }
 
 
-LocationSummary* EqualityCompareInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* EqualityCompareInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   if (operation_cid() == kDoubleCid) {
     const intptr_t kNumTemps =  0;
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RequiresFpuRegister());
     locs->set_in(1, Location::RequiresFpuRegister());
     locs->set_out(0, Location::RequiresRegister());
@@ -486,8 +486,8 @@
   }
   if (operation_cid() == kSmiCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
@@ -579,12 +579,12 @@
 }
 
 
-LocationSummary* TestSmiInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* TestSmiInstr::MakeLocationSummary(Zone* zone,
                                                    bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -624,12 +624,12 @@
 }
 
 
-LocationSummary* TestCidsInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* TestCidsInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
   locs->set_out(0, Location::RequiresRegister());
@@ -699,21 +699,21 @@
 }
 
 
-LocationSummary* RelationalOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* RelationalOpInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (operation_cid() == kDoubleCid) {
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     summary->set_out(0, Location::RequiresRegister());
     return summary;
   }
   ASSERT(operation_cid() == kSmiCid);
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RegisterOrConstant(left()));
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -772,9 +772,9 @@
 }
 
 
-LocationSummary* NativeCallInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* NativeCallInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
-  return MakeCallSummary(isolate);
+  return MakeCallSummary(zone);
 }
 
 
@@ -827,11 +827,11 @@
 }
 
 
-LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   // TODO(fschneider): Allow immediate operands for the char code.
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -850,10 +850,10 @@
 }
 
 
-LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -873,12 +873,12 @@
 }
 
 
-LocationSummary* StringInterpolateInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StringInterpolateInstr::MakeLocationSummary(Zone* zone,
                                                              bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));
   summary->set_out(0, Location::RegisterLocation(R0));
   return summary;
@@ -901,10 +901,10 @@
 }
 
 
-LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -923,10 +923,10 @@
 }
 
 
-LocationSummary* LoadClassIdInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadClassIdInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -1034,12 +1034,12 @@
 }
 
 
-LocationSummary* LoadIndexedInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadIndexedInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   if (CanBeImmediateIndex(index(), class_id(), IsExternal())) {
     locs->set_in(1, Location::Constant(index()->definition()->AsConstant()));
@@ -1149,12 +1149,12 @@
 }
 
 
-LocationSummary* LoadCodeUnitsInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadCodeUnitsInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
@@ -1236,12 +1236,12 @@
 }
 
 
-LocationSummary* StoreIndexedInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StoreIndexedInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   if (CanBeImmediateIndex(index(), class_id(), IsExternal())) {
     locs->set_in(1, Location::Constant(index()->definition()->AsConstant()));
@@ -1403,7 +1403,7 @@
 }
 
 
-LocationSummary* GuardFieldClassInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* GuardFieldClassInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
 
@@ -1426,8 +1426,8 @@
     num_temps++;
   }
 
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, num_temps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, num_temps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
 
   for (intptr_t i = 0; i < num_temps; i++) {
@@ -1570,13 +1570,13 @@
 }
 
 
-LocationSummary* GuardFieldLengthInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* GuardFieldLengthInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   if (!opt || (field().guarded_list_length() == Field::kUnknownFixedLength)) {
     const intptr_t kNumTemps = 3;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     // We need temporaries for field object, length offset and expected length.
     summary->set_temp(0, Location::RequiresRegister());
@@ -1584,8 +1584,8 @@
     summary->set_temp(2, Location::RequiresRegister());
     return summary;
   } else {
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, 0, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, 0, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     return summary;
   }
@@ -1745,14 +1745,14 @@
 }
 
 
-LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps =
       (IsUnboxedStore() && opt) ? 2 :
           ((IsPotentialUnboxedStore()) ? 2 : 0);
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps,
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps,
           ((IsUnboxedStore() && opt && is_potential_unboxed_initialization_) ||
            IsPotentialUnboxedStore())
           ? LocationSummary::kCallOnSlowPath
@@ -1948,12 +1948,12 @@
 }
 
 
-LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -1972,10 +1972,10 @@
 }
 
 
-LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, 1, 1, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, 1, 1, LocationSummary::kNoCall);
   locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
                                               : Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
@@ -1997,12 +1997,12 @@
 }
 
 
-LocationSummary* InstanceOfInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* InstanceOfInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));
   summary->set_in(1, Location::RegisterLocation(R2));
   summary->set_in(2, Location::RegisterLocation(R1));
@@ -2025,12 +2025,12 @@
 }
 
 
-LocationSummary* CreateArrayInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CreateArrayInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(kElementTypePos, Location::RegisterLocation(R1));
   locs->set_in(kLengthPos, Location::RegisterLocation(R2));
   locs->set_out(0, Location::RegisterLocation(R0));
@@ -2140,14 +2140,14 @@
 }
 
 
-LocationSummary* LoadFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadFieldInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps =
       (IsUnboxedLoad() && opt) ? 1 :
           ((IsPotentialUnboxedLoad()) ? 1 : 0);
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps,
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps,
       (opt && !IsPotentialUnboxedLoad())
           ? LocationSummary::kNoCall
           : LocationSummary::kCallOnSlowPath);
@@ -2274,12 +2274,12 @@
 }
 
 
-LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2307,11 +2307,11 @@
 
 
 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2375,13 +2375,13 @@
 
 
 LocationSummary* AllocateUninitializedContextInstr::MakeLocationSummary(
-    Isolate* isolate,
+    Zone* zone,
     bool opt) const {
   ASSERT(opt);
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 3;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   locs->set_temp(0, Location::RegisterLocation(R1));
   locs->set_temp(1, Location::RegisterLocation(R2));
   locs->set_temp(2, Location::RegisterLocation(R3));
@@ -2448,12 +2448,12 @@
 }
 
 
-LocationSummary* AllocateContextInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* AllocateContextInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_temp(0, Location::RegisterLocation(R1));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2473,12 +2473,12 @@
                          locs());
 }
 
-LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_temp(0, Location::RegisterLocation(R1));
   return locs;
@@ -2510,12 +2510,12 @@
 }
 
 
-LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CloneContextInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2538,7 +2538,7 @@
 }
 
 
-LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   UNREACHABLE();
   return NULL;
@@ -2576,12 +2576,12 @@
 }
 
 
-LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_temp(0, Location::RequiresRegister());
   return summary;
 }
@@ -2788,14 +2788,14 @@
 }
 
 
-LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps =
       (((op_kind() == Token::kSHL) && can_overflow()) ||
        (op_kind() == Token::kSHR)) ? 1 : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (op_kind() == Token::kTRUNCDIV) {
     summary->set_in(0, Location::RequiresRegister());
     if (RightIsPowerOfTwoConstant()) {
@@ -3071,15 +3071,15 @@
 }
 
 
-LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Zone* zone,
                                                              bool opt) const {
   intptr_t left_cid = left()->Type()->ToCid();
   intptr_t right_cid = right()->Type()->ToCid();
   ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   return summary;
@@ -3106,12 +3106,12 @@
 }
 
 
-LocationSummary* BoxInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInstr::MakeLocationSummary(Zone* zone,
                                                bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_temp(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
@@ -3147,12 +3147,12 @@
 }
 
 
-LocationSummary* UnboxInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxInstr::MakeLocationSummary(Zone* zone,
                                                  bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3250,14 +3250,14 @@
 }
 
 
-LocationSummary* BoxInteger32Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   ASSERT((from_representation() == kUnboxedInt32) ||
          (from_representation() == kUnboxedUint32));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate,
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone,
       kNumInputs,
       kNumTemps,
       LocationSummary::kNoCall);
@@ -3287,12 +3287,12 @@
 DEFINE_UNIMPLEMENTED_INSTRUCTION(BoxInt64Instr)
 
 
-LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -3331,12 +3331,12 @@
 }
 
 
-LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3358,12 +3358,12 @@
 }
 
 
-LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Zone* zone,
                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3386,12 +3386,12 @@
 }
 
 
-LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(Zone* zone,
                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3414,12 +3414,12 @@
 }
 
 
-LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3469,12 +3469,12 @@
 }
 
 
-LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3500,12 +3500,12 @@
 }
 
 
-LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(Zone* zone,
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
   LocationSummary* summary =  new LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_temp(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
@@ -3539,11 +3539,11 @@
 
 
 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -3571,12 +3571,12 @@
 }
 
 
-LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -3588,12 +3588,12 @@
 }
 
 
-LocationSummary* Float32x4SplatInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4SplatInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3612,12 +3612,12 @@
 }
 
 
-LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Zone* zone,
                                                                bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3657,12 +3657,12 @@
 }
 
 
-LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3687,12 +3687,12 @@
 }
 
 
-LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3718,12 +3718,12 @@
 }
 
 
-LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3747,12 +3747,12 @@
 }
 
 
-LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3775,12 +3775,12 @@
 }
 
 
-LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -3799,12 +3799,12 @@
 }
 
 
-LocationSummary* Float32x4WithInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4WithInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3840,12 +3840,12 @@
 }
 
 
-LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3862,12 +3862,12 @@
 }
 
 
-LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3890,12 +3890,12 @@
 }
 
 
-LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -3907,12 +3907,12 @@
 }
 
 
-LocationSummary* Float64x2SplatInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float64x2SplatInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3927,11 +3927,11 @@
 
 
 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3949,11 +3949,11 @@
 
 
 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3978,11 +3978,11 @@
 
 
 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4004,12 +4004,12 @@
 }
 
 
-LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
   if (representation() == kTagged) {
     ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask);
@@ -4058,12 +4058,12 @@
 }
 
 
-LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4100,11 +4100,11 @@
 
 
 LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_in(2, Location::RequiresRegister());
@@ -4129,11 +4129,11 @@
 
 
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 1;
   LocationSummary* summary = new LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_in(2, Location::RequiresRegister());
@@ -4178,12 +4178,12 @@
 }
 
 
-LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -4217,12 +4217,12 @@
 }
 
 
-LocationSummary* Int32x4SelectInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32x4SelectInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 1;
   LocationSummary* summary = new LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4252,12 +4252,12 @@
 }
 
 
-LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4295,12 +4295,12 @@
 }
 
 
-LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4317,12 +4317,12 @@
 }
 
 
-LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4345,13 +4345,13 @@
 }
 
 
-LocationSummary* MathUnaryInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* MathUnaryInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
     const intptr_t kNumInputs = 1;
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kCall);
     summary->set_in(0, Location::FpuRegisterLocation(V0));
     summary->set_out(0, Location::FpuRegisterLocation(V0));
     return summary;
@@ -4360,8 +4360,8 @@
          (kind() == MathUnaryInstr::kDoubleSquare));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4386,10 +4386,10 @@
 
 
 LocationSummary* CaseInsensitiveCompareUC16Instr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, InputCount(), kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));
   summary->set_in(1, Location::RegisterLocation(R1));
   summary->set_in(2, Location::RegisterLocation(R2));
@@ -4407,13 +4407,13 @@
 }
 
 
-LocationSummary* MathMinMaxInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* MathMinMaxInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   if (result_cid() == kDoubleCid) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     // Reuse the left register so that code can be made shorter.
@@ -4423,8 +4423,8 @@
   ASSERT(result_cid() == kSmiCid);
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   // Reuse the left register so that code can be made shorter.
@@ -4493,12 +4493,12 @@
 }
 
 
-LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   // We make use of 3-operand instructions by not requiring result register
   // to be identical to first input register as on Intel.
@@ -4531,12 +4531,12 @@
 }
 
 
-LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4550,12 +4550,12 @@
 }
 
 
-LocationSummary* Int32ToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32ToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -4569,12 +4569,12 @@
 }
 
 
-LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -4589,7 +4589,7 @@
 }
 
 
-LocationSummary* MintToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* MintToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -4601,12 +4601,12 @@
 }
 
 
-LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::RegisterLocation(R1));
   result->set_out(0, Location::RegisterLocation(R0));
   return result;
@@ -4656,12 +4656,12 @@
 }
 
 
-LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresRegister());
   return result;
@@ -4689,7 +4689,7 @@
 }
 
 
-LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -4701,12 +4701,12 @@
 }
 
 
-LocationSummary* DoubleToFloatInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DoubleToFloatInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -4720,12 +4720,12 @@
 }
 
 
-LocationSummary* FloatToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* FloatToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -4739,13 +4739,13 @@
 }
 
 
-LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(Zone* zone,
                                                                bool opt) const {
   ASSERT((InputCount() == 1) || (InputCount() == 2));
   const intptr_t kNumTemps =
       (recognized_kind() == MethodRecognizer::kMathDoublePow) ? 1 : 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, InputCount(), kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::FpuRegisterLocation(V0));
   if (InputCount() == 2) {
     result->set_in(1, Location::FpuRegisterLocation(V1));
@@ -4880,13 +4880,13 @@
 }
 
 
-LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   // Only use this instruction in optimized code.
   ASSERT(opt);
   const intptr_t kNumInputs = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, 0, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, 0, LocationSummary::kNoCall);
   if (representation() == kUnboxedDouble) {
     if (index() == 0) {
       summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
@@ -4930,13 +4930,13 @@
 }
 
 
-LocationSummary* MergedMathInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* MergedMathInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   if (kind() == MergedMathInstr::kTruncDivMod) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::RequiresRegister());
     // Output is a pair of registers.
@@ -5012,8 +5012,8 @@
 
 
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
-  return MakeCallSummary(isolate);
+    Zone* zone, bool opt) const {
+  return MakeCallSummary(zone);
 }
 
 
@@ -5052,9 +5052,9 @@
 }
 
 
-LocationSummary* BranchInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BranchInstr::MakeLocationSummary(Zone* zone,
                                                   bool opt) const {
-  comparison()->InitializeLocationSummary(isolate, opt);
+  comparison()->InitializeLocationSummary(zone, opt);
   // Branches don't produce a result.
   comparison()->locs()->set_out(0, Location::NoLocation());
   return comparison()->locs();
@@ -5066,13 +5066,13 @@
 }
 
 
-LocationSummary* CheckClassInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckClassInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const bool need_mask_temp = IsDenseSwitch() && !IsDenseMask(ComputeCidMask());
   const intptr_t kNumTemps = !IsNullCheck() ? (need_mask_temp ? 2 : 1) : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (!IsNullCheck()) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -5143,12 +5143,12 @@
 }
 
 
-LocationSummary* CheckClassIdInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckClassIdInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -5162,12 +5162,12 @@
 }
 
 
-LocationSummary* CheckSmiInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckSmiInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -5183,12 +5183,12 @@
 }
 
 
-LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
   locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
   return locs;
@@ -5247,7 +5247,7 @@
 }
 
 
-LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -5265,7 +5265,7 @@
 }
 
 
-LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -5277,7 +5277,7 @@
 }
 
 
-LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -5310,12 +5310,12 @@
 DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryInt32OpInstr)
 
 
-LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Zone* zone,
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (from() == kUnboxedMint) {
     UNREACHABLE();
   } else if (to() == kUnboxedMint) {
@@ -5367,9 +5367,9 @@
 }
 
 
-LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ThrowInstr::MakeLocationSummary(Zone* zone,
                                                  bool opt) const {
-  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
+  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
 }
 
 
@@ -5383,9 +5383,9 @@
 }
 
 
-LocationSummary* ReThrowInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ReThrowInstr::MakeLocationSummary(Zone* zone,
                                                    bool opt) const {
-  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
+  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
 }
 
 
@@ -5407,9 +5407,9 @@
 }
 
 
-LocationSummary* GotoInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* GotoInstr::MakeLocationSummary(Zone* zone,
                                                 bool opt) const {
-  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall);
+  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
 }
 
 
@@ -5439,13 +5439,13 @@
 }
 
 
-LocationSummary* IndirectGotoInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* IndirectGotoInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
 
-  LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
   summary->set_in(0, Location::RequiresRegister());
   summary->set_temp(0, Location::RequiresRegister());
@@ -5473,20 +5473,20 @@
 }
 
 
-LocationSummary* StrictCompareInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StrictCompareInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (needs_number_check()) {
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kCall);
     locs->set_in(0, Location::RegisterLocation(R0));
     locs->set_in(1, Location::RegisterLocation(R1));
     locs->set_out(0, Location::RegisterLocation(R0));
     return locs;
   }
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterOrConstant(left()));
   // Only one of the inputs can be a constant. Choose register if the first one
   // is a constant.
@@ -5558,9 +5558,9 @@
 }
 
 
-LocationSummary* BooleanNegateInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BooleanNegateInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                1,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -5578,9 +5578,9 @@
 }
 
 
-LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* AllocateObjectInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
-  return MakeCallSummary(isolate);
+  return MakeCallSummary(zone);
 }
 
 
@@ -5610,6 +5610,34 @@
 #endif
 }
 
+
+LocationSummary* GrowRegExpStackInstr::MakeLocationSummary(
+    Zone* zone, bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_in(0, Location::RegisterLocation(R0));
+  locs->set_out(0, Location::RegisterLocation(R0));
+  return locs;
+}
+
+
+void GrowRegExpStackInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register typed_data = locs()->in(0).reg();
+  const Register result = locs()->out(0).reg();
+  __ PushObject(Object::null_object(), PP);
+  __ Push(typed_data);
+  compiler->GenerateRuntimeCall(Scanner::kNoSourcePos,  // No token position.
+                                deopt_id(),
+                                kGrowRegExpStackRuntimeEntry,
+                                1,
+                                locs());
+  __ Drop(1);
+  __ Pop(result);
+}
+
+
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_ARM64
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 79978e9..7c73c86 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -32,22 +32,22 @@
 
 // Generic summary for call instructions that have all arguments pushed
 // on the stack and return the result in a fixed register EAX.
-LocationSummary* Instruction::MakeCallSummary(Isolate* isolate) {
+LocationSummary* Instruction::MakeCallSummary(Zone* zone) {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   result->set_out(0, Location::RegisterLocation(EAX));
   return result;
 }
 
 
-LocationSummary* PushArgumentInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* PushArgumentInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::AnyOrConstant(value()));
   return locs;
 }
@@ -70,12 +70,12 @@
 }
 
 
-LocationSummary* ReturnInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ReturnInstr::MakeLocationSummary(Zone* zone,
                                                   bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterLocation(EAX));
   return locs;
 }
@@ -112,13 +112,13 @@
 }
 
 
-LocationSummary* LoadLocalInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadLocalInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t stack_index = (local().index() < 0)
       ? kFirstLocalSlotFromFp - local().index()
       : kParamEndSlotFromFp - local().index();
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::StackSlot(stack_index),
                                LocationSummary::kNoCall);
@@ -131,10 +131,10 @@
 }
 
 
-LocationSummary* StoreLocalInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StoreLocalInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
@@ -149,10 +149,10 @@
 }
 
 
-LocationSummary* ConstantInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 0;
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -168,13 +168,13 @@
 }
 
 
-LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps =
       (constant_address() == 0) && (representation() != kUnboxedInt32) ? 1 : 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (representation() == kUnboxedDouble) {
     locs->set_out(0, Location::RequiresFpuRegister());
   } else {
@@ -215,12 +215,12 @@
 }
 
 
-LocationSummary* AssertAssignableInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* AssertAssignableInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(EAX));  // Value.
   summary->set_in(1, Location::RegisterLocation(ECX));  // Instantiator.
   summary->set_in(2, Location::RegisterLocation(EDX));  // Type arguments.
@@ -229,12 +229,12 @@
 }
 
 
-LocationSummary* AssertBooleanInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* AssertBooleanInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(EAX));
   locs->set_out(0, Location::RegisterLocation(EAX));
   return locs;
@@ -298,13 +298,13 @@
 }
 
 
-LocationSummary* EqualityCompareInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* EqualityCompareInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   if (operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::Pair(Location::RequiresRegister(),
                                    Location::RequiresRegister()));
     locs->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -314,8 +314,8 @@
   }
   if (operation_cid() == kDoubleCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RequiresFpuRegister());
     locs->set_in(1, Location::RequiresFpuRegister());
     locs->set_out(0, Location::RequiresRegister());
@@ -323,8 +323,8 @@
   }
   if (operation_cid() == kSmiCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
@@ -617,12 +617,12 @@
 }
 
 
-LocationSummary* TestSmiInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* TestSmiInstr::MakeLocationSummary(Zone* zone,
                                                    bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -663,12 +663,12 @@
 
 
 
-LocationSummary* TestCidsInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* TestCidsInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
   locs->set_out(0, Location::RequiresRegister());
@@ -735,14 +735,14 @@
 }
 
 
-LocationSummary* RelationalOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* RelationalOpInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::Pair(Location::RequiresRegister(),
                                    Location::RequiresRegister()));
     locs->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -751,16 +751,16 @@
     return locs;
   }
   if (operation_cid() == kDoubleCid) {
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     summary->set_out(0, Location::RequiresRegister());
     return summary;
   }
   ASSERT(operation_cid() == kSmiCid);
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RegisterOrConstant(left()));
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -810,9 +810,9 @@
 }
 
 
-LocationSummary* NativeCallInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* NativeCallInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
-  return MakeCallSummary(isolate);
+  return MakeCallSummary(zone);
 }
 
 
@@ -858,11 +858,11 @@
 }
 
 
-LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   // TODO(fschneider): Allow immediate operands for the char code.
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -881,10 +881,10 @@
 }
 
 
-LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -908,12 +908,12 @@
 }
 
 
-LocationSummary* StringInterpolateInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StringInterpolateInstr::MakeLocationSummary(Zone* zone,
                                                              bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(EAX));
   summary->set_out(0, Location::RegisterLocation(EAX));
   return summary;
@@ -936,10 +936,10 @@
 }
 
 
-LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
@@ -958,10 +958,10 @@
 }
 
 
-LocationSummary* LoadClassIdInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadClassIdInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -1059,12 +1059,12 @@
 }
 
 
-LocationSummary* LoadIndexedInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadIndexedInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   if (CanBeImmediateIndex(index(), class_id())) {
     // CanBeImmediateIndex must return false for unsafe smis.
@@ -1229,12 +1229,12 @@
 }
 
 
-LocationSummary* StoreIndexedInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StoreIndexedInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   if (CanBeImmediateIndex(index(), class_id())) {
     // CanBeImmediateIndex must return false for unsafe smis.
@@ -1389,7 +1389,7 @@
 }
 
 
-LocationSummary* GuardFieldClassInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* GuardFieldClassInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
 
@@ -1409,8 +1409,8 @@
     num_temps++;
   }
 
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, num_temps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, num_temps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
 
   for (intptr_t i = 0; i < num_temps; i++) {
@@ -1557,13 +1557,13 @@
 }
 
 
-LocationSummary* GuardFieldLengthInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* GuardFieldLengthInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   if (!opt || (field().guarded_list_length() == Field::kUnknownFixedLength)) {
     const intptr_t kNumTemps = 3;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     // We need temporaries for field object, length offset and expected length.
     summary->set_temp(0, Location::RequiresRegister());
@@ -1571,8 +1571,8 @@
     summary->set_temp(2, Location::RequiresRegister());
     return summary;
   } else {
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, 0, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, 0, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     return summary;
   }
@@ -1710,14 +1710,14 @@
 };
 
 
-LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps =
       (IsUnboxedStore() && opt) ? 2 :
           ((IsPotentialUnboxedStore()) ? 3 : 0);
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps,
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps,
           ((IsUnboxedStore() && opt && is_potential_unboxed_initialization_) ||
            IsPotentialUnboxedStore())
           ? LocationSummary::kCallOnSlowPath
@@ -1945,12 +1945,12 @@
 }
 
 
-LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   // By specifying same register as input, our simple register allocator can
   // generate better code.
@@ -1971,10 +1971,10 @@
 }
 
 
-LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, 1, 1, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, 1, 1, LocationSummary::kNoCall);
   locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
                                               : Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
@@ -1997,12 +1997,12 @@
 }
 
 
-LocationSummary* InstanceOfInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* InstanceOfInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(EAX));
   summary->set_in(1, Location::RegisterLocation(ECX));
   summary->set_in(2, Location::RegisterLocation(EDX));
@@ -2027,12 +2027,12 @@
 
 // TODO(srdjan): In case of constant inputs make CreateArray kNoCall and
 // use slow path stub.
-LocationSummary* CreateArrayInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CreateArrayInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(ECX));
   locs->set_in(1, Location::RegisterLocation(EDX));
   locs->set_out(0, Location::RegisterLocation(EAX));
@@ -2142,15 +2142,15 @@
 }
 
 
-LocationSummary* LoadFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadFieldInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps =
       (IsUnboxedLoad() && opt) ? 1 :
           ((IsPotentialUnboxedLoad()) ? 2 : 0);
 
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps,
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps,
           (opt && !IsPotentialUnboxedLoad())
           ? LocationSummary::kNoCall
           : LocationSummary::kCallOnSlowPath);
@@ -2268,12 +2268,12 @@
 }
 
 
-LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(EAX));
   locs->set_out(0, Location::RegisterLocation(EAX));
   return locs;
@@ -2301,11 +2301,11 @@
 
 
 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(EAX));
   locs->set_out(0, Location::RegisterLocation(EAX));
   return locs;
@@ -2373,13 +2373,13 @@
 
 
 LocationSummary* AllocateUninitializedContextInstr::MakeLocationSummary(
-    Isolate* isolate,
+    Zone* zone,
     bool opt) const {
   ASSERT(opt);
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   locs->set_temp(0, Location::RegisterLocation(ECX));
   locs->set_out(0, Location::RegisterLocation(EAX));
   return locs;
@@ -2441,12 +2441,12 @@
 }
 
 
-LocationSummary* AllocateContextInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* AllocateContextInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_temp(0, Location::RegisterLocation(EDX));
   locs->set_out(0, Location::RegisterLocation(EAX));
   return locs;
@@ -2467,12 +2467,12 @@
 }
 
 
-LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(EAX));
   locs->set_temp(0, Location::RegisterLocation(ECX));
   return locs;
@@ -2505,12 +2505,12 @@
 }
 
 
-LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CloneContextInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(EAX));
   locs->set_out(0, Location::RegisterLocation(EAX));
   return locs;
@@ -2533,7 +2533,7 @@
 }
 
 
-LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   UNREACHABLE();
   return NULL;
@@ -2567,12 +2567,12 @@
 }
 
 
-LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs,
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   return summary;
@@ -2762,13 +2762,13 @@
 }
 
 
-LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   if (op_kind() == Token::kTRUNCDIV) {
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     if (RightIsPowerOfTwoConstant()) {
       summary->set_in(0, Location::RequiresRegister());
       ConstantInstr* right_constant = right()->definition()->AsConstant();
@@ -2787,8 +2787,8 @@
     return summary;
   } else if (op_kind() == Token::kMOD) {
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     // Both inputs must be writable because they will be untagged.
     summary->set_in(0, Location::RegisterLocation(EDX));
     summary->set_in(1, Location::WritableRegister());
@@ -2798,16 +2798,16 @@
     return summary;
   } else if (op_kind() == Token::kSHR) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
     summary->set_out(0, Location::SameAsFirstInput());
     return summary;
   } else if (op_kind() == Token::kSHL) {
     const intptr_t kNumTemps = can_overflow() ? 1 : 0;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
     if (can_overflow()) {
@@ -2817,8 +2817,8 @@
     return summary;
   } else {
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     ConstantInstr* constant = right()->definition()->AsConstant();
     if (constant != NULL) {
@@ -3071,7 +3071,7 @@
 }
 
 
-LocationSummary* BinaryInt32OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryInt32OpInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   if (op_kind() == Token::kTRUNCDIV) {
@@ -3082,16 +3082,16 @@
     return NULL;
   } else if (op_kind() == Token::kSHR) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
     summary->set_out(0, Location::SameAsFirstInput());
     return summary;
   } else if (op_kind() == Token::kSHL) {
     const intptr_t kNumTemps = can_overflow() ? 1 : 0;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
     if (can_overflow()) {
@@ -3101,8 +3101,8 @@
     return summary;
   } else {
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     ConstantInstr* constant = right()->definition()->AsConstant();
     if (constant != NULL) {
@@ -3233,12 +3233,12 @@
 }
 
 
-LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = (op_kind() == Token::kMUL) ? 1 : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (op_kind() == Token::kMUL) {
     summary->set_in(0, Location::RegisterLocation(EAX));
     summary->set_temp(0, Location::RegisterLocation(EDX));
@@ -3276,7 +3276,7 @@
 }
 
 
-LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Zone* zone,
                                                              bool opt) const {
   intptr_t left_cid = left()->Type()->ToCid();
   intptr_t right_cid = right()->Type()->ToCid();
@@ -3286,8 +3286,8 @@
                       && (left_cid != kSmiCid)
                       && (right_cid != kSmiCid);
   const intptr_t kNumTemps = need_temp ? 1 : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   if (need_temp) summary->set_temp(0, Location::RequiresRegister());
@@ -3319,12 +3319,12 @@
 }
 
 
-LocationSummary* BoxInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -3358,15 +3358,15 @@
 }
 
 
-LocationSummary* UnboxInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const bool needs_temp = CanDeoptimize() ||
       (CanConvertSmi() && (value()->Type()->ToCid() == kSmiCid));
 
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = needs_temp ? 1 : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (needs_temp) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -3485,12 +3485,12 @@
 }
 
 
-LocationSummary* BoxInteger32Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps,
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps,
       ValueFitsSmi() ? LocationSummary::kNoCall
                      : LocationSummary::kCallOnSlowPath);
   const bool needs_writable_input = ValueFitsSmi() ||
@@ -3538,12 +3538,12 @@
 }
 
 
-LocationSummary* BoxInt64Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInt64Instr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs,
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs,
                           kNumTemps,
                           ValueFitsSmi()
                               ? LocationSummary::kNoCall
@@ -3606,7 +3606,7 @@
 }
 
 
-LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t value_cid = value()->Type()->ToCid();
   const intptr_t kNumInputs = 1;
@@ -3622,8 +3622,8 @@
     }
   }
 
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   for (int i = 0; i < kNumTemps; i++) {
     summary->set_temp(i, Location::RequiresRegister());
@@ -3702,13 +3702,13 @@
 }
 
 
-LocationSummary* LoadCodeUnitsInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadCodeUnitsInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const bool might_box = (representation() == kTagged) && !can_pack_into_smi();
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = might_box ? 1 : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps,
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps,
       might_box ? LocationSummary::kCallOnSlowPath : LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   // The smi index is either untagged (element size == 1), or it is left smi
@@ -3817,12 +3817,12 @@
 }
 
 
-LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3846,12 +3846,12 @@
 }
 
 
-LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Zone* zone,
                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3875,12 +3875,12 @@
 }
 
 
-LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(Zone* zone,
                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3904,12 +3904,12 @@
 }
 
 
-LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -3947,12 +3947,12 @@
 }
 
 
-LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3975,12 +3975,12 @@
 }
 
 
-LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(Zone* zone,
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -3997,11 +3997,11 @@
 
 
 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4034,12 +4034,12 @@
 }
 
 
-LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -4051,12 +4051,12 @@
 }
 
 
-LocationSummary* Float32x4SplatInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4SplatInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4073,12 +4073,12 @@
 }
 
 
-LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Zone* zone,
                                                                bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4117,12 +4117,12 @@
 }
 
 
-LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4148,12 +4148,12 @@
 }
 
 
-LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4178,12 +4178,12 @@
 }
 
 
-LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4210,12 +4210,12 @@
 }
 
 
-LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4238,12 +4238,12 @@
 }
 
 
-LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4262,12 +4262,12 @@
 }
 
 
-LocationSummary* Float32x4WithInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4WithInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4331,12 +4331,12 @@
 }
 
 
-LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4348,12 +4348,12 @@
 }
 
 
-LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4378,12 +4378,12 @@
 
 
 
-LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -4395,12 +4395,12 @@
 }
 
 
-LocationSummary* Float64x2SplatInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float64x2SplatInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4414,11 +4414,11 @@
 
 
 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4438,11 +4438,11 @@
 
 
 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4456,11 +4456,11 @@
 
 
 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4473,12 +4473,12 @@
 }
 
 
-LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   if (representation() == kTagged) {
     ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask);
@@ -4516,12 +4516,12 @@
 }
 
 
-LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4571,11 +4571,11 @@
 
 
 LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_in(2, Location::RequiresRegister());
@@ -4602,11 +4602,11 @@
 
 
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_in(2, Location::RequiresRegister());
@@ -4664,12 +4664,12 @@
 }
 
 
-LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -4710,12 +4710,12 @@
 }
 
 
-LocationSummary* Int32x4SelectInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32x4SelectInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4745,12 +4745,12 @@
 }
 
 
-LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4802,12 +4802,12 @@
 }
 
 
-LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4819,12 +4819,12 @@
 }
 
 
-LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4860,13 +4860,13 @@
 }
 
 
-LocationSummary* MathUnaryInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* MathUnaryInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
     const intptr_t kNumInputs = 1;
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kCall);
     summary->set_in(0, Location::FpuRegisterLocation(XMM1));
     // EDI is chosen because it is callee saved so we do not need to back it
     // up before calling into the runtime.
@@ -4878,8 +4878,8 @@
          (kind() == MathUnaryInstr::kDoubleSquare));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   if (kind() == MathUnaryInstr::kDoubleSquare) {
     summary->set_out(0, Location::SameAsFirstInput());
@@ -4914,10 +4914,10 @@
 
 
 LocationSummary* CaseInsensitiveCompareUC16Instr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, InputCount(), kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(EAX));
   summary->set_in(1, Location::RegisterLocation(ECX));
   summary->set_in(2, Location::RegisterLocation(EDX));
@@ -4949,13 +4949,13 @@
 }
 
 
-LocationSummary* MathMinMaxInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* MathMinMaxInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   if (result_cid() == kDoubleCid) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     // Reuse the left register so that code can be made shorter.
@@ -4967,8 +4967,8 @@
   ASSERT(result_cid() == kSmiCid);
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   // Reuse the left register so that code can be made shorter.
@@ -5038,10 +5038,10 @@
 }
 
 
-LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
@@ -5068,12 +5068,12 @@
 }
 
 
-LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -5087,12 +5087,12 @@
 }
 
 
-LocationSummary* Int32ToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32ToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -5106,12 +5106,12 @@
 }
 
 
-LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::WritableRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -5126,12 +5126,12 @@
 }
 
 
-LocationSummary* MintToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* MintToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::Pair(Location::RequiresRegister(),
                                    Location::RequiresRegister()));
   result->set_out(0, Location::RequiresFpuRegister());
@@ -5161,12 +5161,12 @@
 }
 
 
-LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::RegisterLocation(ECX));
   result->set_out(0, Location::RegisterLocation(EAX));
   return result;
@@ -5207,12 +5207,12 @@
 }
 
 
-LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresRegister());
   return result;
@@ -5231,12 +5231,12 @@
 }
 
 
-LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -5262,12 +5262,12 @@
 }
 
 
-LocationSummary* DoubleToFloatInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DoubleToFloatInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::SameAsFirstInput());
   return result;
@@ -5279,12 +5279,12 @@
 }
 
 
-LocationSummary* FloatToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* FloatToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::SameAsFirstInput());
   return result;
@@ -5296,13 +5296,13 @@
 }
 
 
-LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(Zone* zone,
                                                                bool opt) const {
   ASSERT((InputCount() == 1) || (InputCount() == 2));
   const intptr_t kNumTemps =
       (recognized_kind() == MethodRecognizer::kMathDoublePow) ? 3 : 1;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, InputCount(), kNumTemps, LocationSummary::kCall);
   // EDI is chosen because it is callee saved so we do not need to back it
   // up before calling into the runtime.
   result->set_temp(0, Location::RegisterLocation(EDI));
@@ -5474,13 +5474,13 @@
 }
 
 
-LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   // Only use this instruction in optimized code.
   ASSERT(opt);
   const intptr_t kNumInputs = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, 0, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, 0, LocationSummary::kNoCall);
   if (representation() == kUnboxedDouble) {
     if (index() == 0) {
       summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
@@ -5524,13 +5524,13 @@
 }
 
 
-LocationSummary* MergedMathInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* MergedMathInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   if (kind() == MergedMathInstr::kTruncDivMod) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     // Both inputs must be writable because they will be untagged.
     summary->set_in(0, Location::RegisterLocation(EAX));
     summary->set_in(1, Location::WritableRegister());
@@ -5542,8 +5542,8 @@
   if (kind() == MergedMathInstr::kSinCos) {
     const intptr_t kNumInputs = 1;
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_out(0, Location::Pair(Location::RequiresFpuRegister(),
                                        Location::RequiresFpuRegister()));
@@ -5657,8 +5657,8 @@
 
 
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
-  return MakeCallSummary(isolate);
+    Zone* zone, bool opt) const {
+  return MakeCallSummary(zone);
 }
 
 
@@ -5697,9 +5697,9 @@
 }
 
 
-LocationSummary* BranchInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BranchInstr::MakeLocationSummary(Zone* zone,
                                                   bool opt) const {
-  comparison()->InitializeLocationSummary(isolate, opt);
+  comparison()->InitializeLocationSummary(zone, opt);
   // Branches don't produce a result.
   comparison()->locs()->set_out(0, Location::NoLocation());
   return comparison()->locs();
@@ -5711,13 +5711,13 @@
 }
 
 
-LocationSummary* CheckClassInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckClassInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const bool need_mask_temp = IsDenseSwitch() && !IsDenseMask(ComputeCidMask());
   const intptr_t kNumTemps = !IsNullCheck() ? (need_mask_temp ? 2 : 1) : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (!IsNullCheck()) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -5793,12 +5793,12 @@
 }
 
 
-LocationSummary* CheckSmiInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckSmiInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -5814,12 +5814,12 @@
 }
 
 
-LocationSummary* CheckClassIdInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckClassIdInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -5835,12 +5835,12 @@
 
 // Length: register or constant.
 // Index: register, constant or stack slot.
-LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (length()->definition()->IsConstant()) {
     locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
   } else {
@@ -5906,7 +5906,7 @@
 }
 
 
-LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   switch (op_kind()) {
@@ -5917,8 +5917,8 @@
     case Token::kSUB:
     case Token::kMUL: {
       const intptr_t kNumTemps = (op_kind() == Token::kMUL) ? 1 : 0;
-      LocationSummary* summary = new(isolate) LocationSummary(
-          isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+      LocationSummary* summary = new(zone) LocationSummary(
+          zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
       summary->set_in(0, (op_kind() == Token::kMUL)
           ? Location::Pair(Location::RegisterLocation(EAX),
                            Location::RegisterLocation(EDX))
@@ -6012,13 +6012,13 @@
 }
 
 
-LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps =
       (op_kind() == Token::kSHL) && CanDeoptimize() ? 2 : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
@@ -6213,12 +6213,12 @@
 }
 
 
-LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_out(0, Location::SameAsFirstInput());
@@ -6269,12 +6269,12 @@
 }
 
 
-LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
   summary->set_out(0, Location::SameAsFirstInput());
@@ -6354,12 +6354,12 @@
 }
 
 
-LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -6376,12 +6376,12 @@
 }
 
 
-LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Zone* zone,
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if ((from() == kUnboxedInt32 || from() == kUnboxedUint32) &&
       (to() == kUnboxedInt32 || to() == kUnboxedUint32)) {
     summary->set_in(0, Location::RequiresRegister());
@@ -6461,9 +6461,9 @@
 }
 
 
-LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ThrowInstr::MakeLocationSummary(Zone* zone,
                                                  bool opt) const {
-  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
+  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
 }
 
 
@@ -6478,9 +6478,9 @@
 }
 
 
-LocationSummary* ReThrowInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ReThrowInstr::MakeLocationSummary(Zone* zone,
                                                    bool opt) const {
-  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
+  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
 }
 
 
@@ -6502,9 +6502,9 @@
 }
 
 
-LocationSummary* GotoInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* GotoInstr::MakeLocationSummary(Zone* zone,
                                                 bool opt) const {
-  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall);
+  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
 }
 
 
@@ -6534,13 +6534,13 @@
 }
 
 
-LocationSummary* IndirectGotoInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* IndirectGotoInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
 
-  LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
   summary->set_in(0, Location::RequiresRegister());
   summary->set_temp(0, Location::RequiresRegister());
@@ -6567,20 +6567,20 @@
 }
 
 
-LocationSummary* StrictCompareInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StrictCompareInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (needs_number_check()) {
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kCall);
     locs->set_in(0, Location::RegisterLocation(EAX));
     locs->set_in(1, Location::RegisterLocation(ECX));
     locs->set_out(0, Location::RegisterLocation(EAX));
     return locs;
   }
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterOrConstant(left()));
   // Only one of the inputs can be a constant. Choose register if the first one
   // is a constant.
@@ -6658,9 +6658,9 @@
 }
 
 
-LocationSummary* IfThenElseInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* IfThenElseInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
-  comparison()->InitializeLocationSummary(isolate, opt);
+  comparison()->InitializeLocationSummary(zone, opt);
   // TODO(vegorov): support byte register constraints in the register allocator.
   comparison()->locs()->set_out(0, Location::RegisterLocation(EDX));
   return comparison()->locs();
@@ -6716,12 +6716,12 @@
 }
 
 
-LocationSummary* ClosureCallInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ClosureCallInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(EAX));  // Function.
   summary->set_out(0, Location::RegisterLocation(EAX));
   return summary;
@@ -6766,9 +6766,9 @@
 }
 
 
-LocationSummary* BooleanNegateInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BooleanNegateInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                1,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -6788,9 +6788,9 @@
 }
 
 
-LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* AllocateObjectInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
-  return MakeCallSummary(isolate);
+  return MakeCallSummary(zone);
 }
 
 
@@ -6819,6 +6819,34 @@
 #endif
 }
 
+
+LocationSummary* GrowRegExpStackInstr::MakeLocationSummary(
+    Zone* zone, bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_in(0, Location::RegisterLocation(EAX));
+  locs->set_out(0, Location::RegisterLocation(EAX));
+  return locs;
+}
+
+
+void GrowRegExpStackInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register typed_data = locs()->in(0).reg();
+  const Register result = locs()->out(0).reg();
+  __ PushObject(Object::null_object());
+  __ pushl(typed_data);
+  compiler->GenerateRuntimeCall(Scanner::kNoSourcePos,  // No token position.
+                                deopt_id(),
+                                kGrowRegExpStackRuntimeEntry,
+                                1,
+                                locs());
+  __ Drop(1);
+  __ popl(result);
+}
+
+
 }  // namespace dart
 
 #undef __
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 5f79413..9ad50ae 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -32,20 +32,20 @@
 
 // Generic summary for call instructions that have all arguments pushed
 // on the stack and return the result in a fixed register V0.
-LocationSummary* Instruction::MakeCallSummary(Isolate* isolate) {
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, 0, 0, LocationSummary::kCall);
+LocationSummary* Instruction::MakeCallSummary(Zone* zone) {
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, 0, 0, LocationSummary::kCall);
   result->set_out(0, Location::RegisterLocation(V0));
   return result;
 }
 
 
-LocationSummary* PushArgumentInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* PushArgumentInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::AnyOrConstant(value()));
   return locs;
 }
@@ -71,12 +71,12 @@
 }
 
 
-LocationSummary* ReturnInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ReturnInstr::MakeLocationSummary(Zone* zone,
                                                   bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterLocation(V0));
   return locs;
 }
@@ -135,9 +135,9 @@
 }
 
 
-LocationSummary* IfThenElseInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* IfThenElseInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
-  comparison()->InitializeLocationSummary(isolate, opt);
+  comparison()->InitializeLocationSummary(zone, opt);
   return comparison()->locs();
 }
 
@@ -251,12 +251,12 @@
 }
 
 
-LocationSummary* ClosureCallInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ClosureCallInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(T0));  // Function.
   summary->set_out(0, Location::RegisterLocation(V0));
   return summary;
@@ -299,9 +299,9 @@
 }
 
 
-LocationSummary* LoadLocalInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadLocalInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -315,9 +315,9 @@
 }
 
 
-LocationSummary* StoreLocalInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StoreLocalInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                1,
                                Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
@@ -333,9 +333,9 @@
 }
 
 
-LocationSummary* ConstantInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -352,12 +352,12 @@
 }
 
 
-LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = (representation_ == kUnboxedInt32) ? 0 : 1;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (representation_ == kUnboxedInt32) {
     locs->set_out(0, Location::RequiresRegister());
   } else {
@@ -397,12 +397,12 @@
 }
 
 
-LocationSummary* AssertAssignableInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* AssertAssignableInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(A0));  // Value.
   summary->set_in(1, Location::RegisterLocation(A2));  // Instantiator.
   summary->set_in(2, Location::RegisterLocation(A1));  // Type arguments.
@@ -411,12 +411,12 @@
 }
 
 
-LocationSummary* AssertBooleanInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* AssertBooleanInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(A0));
   locs->set_out(0, Location::RegisterLocation(A0));
   return locs;
@@ -463,13 +463,13 @@
 }
 
 
-LocationSummary* EqualityCompareInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* EqualityCompareInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   if (operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::Pair(Location::RequiresRegister(),
                                    Location::RequiresRegister()));
     locs->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -479,8 +479,8 @@
   }
   if (operation_cid() == kDoubleCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RequiresFpuRegister());
     locs->set_in(1, Location::RequiresFpuRegister());
     locs->set_out(0, Location::RequiresRegister());
@@ -488,8 +488,8 @@
   }
   if (operation_cid() == kSmiCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
@@ -783,12 +783,12 @@
 }
 
 
-LocationSummary* TestSmiInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* TestSmiInstr::MakeLocationSummary(Zone* zone,
                                                    bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -827,12 +827,12 @@
 }
 
 
-LocationSummary* TestCidsInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* TestCidsInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
   locs->set_out(0, Location::RequiresRegister());
@@ -899,14 +899,14 @@
 }
 
 
-LocationSummary* RelationalOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* RelationalOpInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::Pair(Location::RequiresRegister(),
                                    Location::RequiresRegister()));
     locs->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -915,16 +915,16 @@
     return locs;
   }
   if (operation_cid() == kDoubleCid) {
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     summary->set_out(0, Location::RequiresRegister());
     return summary;
   }
   ASSERT(operation_cid() == kSmiCid);
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RegisterOrConstant(left()));
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -978,9 +978,9 @@
 }
 
 
-LocationSummary* NativeCallInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* NativeCallInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
-  return MakeCallSummary(isolate);
+  return MakeCallSummary(zone);
 }
 
 
@@ -1034,11 +1034,11 @@
 }
 
 
-LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   // TODO(fschneider): Allow immediate operands for the char code.
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -1060,10 +1060,10 @@
 }
 
 
-LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -1087,12 +1087,12 @@
 }
 
 
-LocationSummary* StringInterpolateInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StringInterpolateInstr::MakeLocationSummary(Zone* zone,
                                                              bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(A0));
   summary->set_out(0, Location::RegisterLocation(V0));
   return summary;
@@ -1115,10 +1115,10 @@
 }
 
 
-LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -1137,10 +1137,10 @@
 }
 
 
-LocationSummary* LoadClassIdInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadClassIdInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -1238,12 +1238,12 @@
 }
 
 
-LocationSummary* LoadIndexedInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadIndexedInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   if (CanBeImmediateIndex(index(), class_id(), IsExternal())) {
     locs->set_in(1, Location::Constant(index()->definition()->AsConstant()));
@@ -1353,12 +1353,12 @@
 }
 
 
-LocationSummary* LoadCodeUnitsInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadCodeUnitsInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
 
@@ -1443,12 +1443,12 @@
 }
 
 
-LocationSummary* StoreIndexedInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StoreIndexedInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   if (CanBeImmediateIndex(index(), class_id(), IsExternal())) {
     locs->set_in(1, Location::Constant(index()->definition()->AsConstant()));
@@ -1587,7 +1587,7 @@
 }
 
 
-LocationSummary* GuardFieldClassInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* GuardFieldClassInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
 
@@ -1607,8 +1607,8 @@
     num_temps++;
   }
 
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, num_temps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, num_temps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
 
   for (intptr_t i = 0; i < num_temps; i++) {
@@ -1757,21 +1757,21 @@
 }
 
 
-LocationSummary* GuardFieldLengthInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* GuardFieldLengthInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
 
   if (!opt || (field().guarded_list_length() == Field::kUnknownFixedLength)) {
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     // We need temporaries for field object.
     summary->set_temp(0, Location::RequiresRegister());
     return summary;
   } else {
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, 0, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, 0, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     return summary;
   }
@@ -1908,14 +1908,14 @@
 };
 
 
-LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps =
       (IsUnboxedStore() && opt) ? 2 :
           ((IsPotentialUnboxedStore()) ? 3 : 0);
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps,
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps,
           ((IsUnboxedStore() && opt && is_potential_unboxed_initialization_) ||
            IsPotentialUnboxedStore())
           ? LocationSummary::kCallOnSlowPath
@@ -2075,12 +2075,12 @@
 }
 
 
-LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -2100,10 +2100,10 @@
 }
 
 
-LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, 1, 1, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, 1, 1, LocationSummary::kNoCall);
   locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
                                               : Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
@@ -2127,12 +2127,12 @@
 }
 
 
-LocationSummary* InstanceOfInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* InstanceOfInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(A0));
   summary->set_in(1, Location::RegisterLocation(A2));
   summary->set_in(2, Location::RegisterLocation(A1));
@@ -2156,12 +2156,12 @@
 }
 
 
-LocationSummary* CreateArrayInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CreateArrayInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(A0));
   locs->set_in(1, Location::RegisterLocation(A1));
   locs->set_out(0, Location::RegisterLocation(V0));
@@ -2271,14 +2271,14 @@
 }
 
 
-LocationSummary* LoadFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadFieldInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps =
       (IsUnboxedLoad() && opt) ? 1 :
           ((IsPotentialUnboxedLoad()) ? 2 : 0);
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps,
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps,
           (opt && !IsPotentialUnboxedLoad())
           ? LocationSummary::kNoCall
           : LocationSummary::kCallOnSlowPath);
@@ -2362,12 +2362,12 @@
 }
 
 
-LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(T0));
   locs->set_out(0, Location::RegisterLocation(T0));
   return locs;
@@ -2403,11 +2403,11 @@
 
 
 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(T0));
   locs->set_out(0, Location::RegisterLocation(T0));
   return locs;
@@ -2478,13 +2478,13 @@
 
 
 LocationSummary* AllocateUninitializedContextInstr::MakeLocationSummary(
-    Isolate* isolate,
+    Zone* zone,
     bool opt) const {
   ASSERT(opt);
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 3;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   locs->set_temp(0, Location::RegisterLocation(T1));
   locs->set_temp(1, Location::RegisterLocation(T2));
   locs->set_temp(2, Location::RegisterLocation(T3));
@@ -2550,12 +2550,12 @@
 }
 
 
-LocationSummary* AllocateContextInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* AllocateContextInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_temp(0, Location::RegisterLocation(T1));
   locs->set_out(0, Location::RegisterLocation(V0));
   return locs;
@@ -2577,12 +2577,12 @@
 }
 
 
-LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(T0));
   locs->set_temp(0, Location::RegisterLocation(T1));
   return locs;
@@ -2618,12 +2618,12 @@
 }
 
 
-LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CloneContextInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(T0));
   locs->set_out(0, Location::RegisterLocation(T0));
   return locs;
@@ -2651,7 +2651,7 @@
 }
 
 
-LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   UNREACHABLE();
   return NULL;
@@ -2692,12 +2692,12 @@
 }
 
 
-LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs,
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   summary->set_temp(0, Location::RequiresRegister());
@@ -2886,7 +2886,7 @@
 }
 
 
-LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps =
@@ -2895,8 +2895,8 @@
        (op_kind() == Token::kTRUNCDIV) ||
        (((op_kind() == Token::kSHL) && can_overflow()) ||
          (op_kind() == Token::kSHR))) ? 1 : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (op_kind() == Token::kTRUNCDIV) {
     summary->set_in(0, Location::RequiresRegister());
     if (RightIsPowerOfTwoConstant()) {
@@ -3180,15 +3180,15 @@
 }
 
 
-LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Zone* zone,
                                                              bool opt) const {
   intptr_t left_cid = left()->Type()->ToCid();
   intptr_t right_cid = right()->Type()->ToCid();
   ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   return summary;
@@ -3217,12 +3217,12 @@
 }
 
 
-LocationSummary* BoxInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_temp(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
@@ -3242,12 +3242,12 @@
 }
 
 
-LocationSummary* UnboxInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (representation() == kUnboxedMint) {
     summary->set_out(0, Location::Pair(Location::RequiresRegister(),
@@ -3357,14 +3357,14 @@
 }
 
 
-LocationSummary* BoxInteger32Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   ASSERT((from_representation() == kUnboxedInt32) ||
          (from_representation() == kUnboxedUint32));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_temp(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
@@ -3414,12 +3414,12 @@
 }
 
 
-LocationSummary* BoxInt64Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInt64Instr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate,
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone,
       kNumInputs,
       kNumTemps,
       ValueFitsSmi() ? LocationSummary::kNoCall
@@ -3471,14 +3471,14 @@
 }
 
 
-LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   ASSERT((representation() == kUnboxedInt32) ||
          (representation() == kUnboxedUint32));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -3533,12 +3533,12 @@
 }
 
 
-LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3560,7 +3560,7 @@
 }
 
 
-LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Zone* zone,
                                                              bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3572,7 +3572,7 @@
 }
 
 
-LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(Zone* zone,
                                                              bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3584,7 +3584,7 @@
 }
 
 
-LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3597,7 +3597,7 @@
 
 
 
-LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3610,7 +3610,7 @@
 
 
 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3621,7 +3621,7 @@
 }
 
 
-LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3633,7 +3633,7 @@
 }
 
 
-LocationSummary* Float32x4SplatInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4SplatInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3645,7 +3645,7 @@
 }
 
 
-LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Zone* zone,
                                                                bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3657,7 +3657,7 @@
 }
 
 
-LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3669,7 +3669,7 @@
 }
 
 
-LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3681,7 +3681,7 @@
 }
 
 
-LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3693,7 +3693,7 @@
 }
 
 
-LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3705,7 +3705,7 @@
 }
 
 
-LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3717,7 +3717,7 @@
 }
 
 
-LocationSummary* Float32x4WithInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4WithInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3729,7 +3729,7 @@
 }
 
 
-LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3741,7 +3741,7 @@
 }
 
 
-LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3753,7 +3753,7 @@
 }
 
 
-LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3765,7 +3765,7 @@
 }
 
 
-LocationSummary* Float64x2SplatInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float64x2SplatInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3778,7 +3778,7 @@
 
 
 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3790,7 +3790,7 @@
 
 
 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3802,7 +3802,7 @@
 
 
 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3813,7 +3813,7 @@
 }
 
 
-LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3825,7 +3825,7 @@
 }
 
 
-LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3838,7 +3838,7 @@
 
 
 LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3850,7 +3850,7 @@
 
 
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3861,7 +3861,7 @@
 }
 
 
-LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3873,7 +3873,7 @@
 }
 
 
-LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(Zone* zone,
                                                                bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3885,7 +3885,7 @@
 }
 
 
-LocationSummary* Int32x4SelectInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32x4SelectInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3897,7 +3897,7 @@
 }
 
 
-LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3909,7 +3909,7 @@
 }
 
 
-LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3921,7 +3921,7 @@
 }
 
 
-LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3933,13 +3933,13 @@
 }
 
 
-LocationSummary* MathUnaryInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* MathUnaryInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
     const intptr_t kNumInputs = 1;
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kCall);
     summary->set_in(0, Location::FpuRegisterLocation(D6));
     summary->set_out(0, Location::FpuRegisterLocation(D0));
     return summary;
@@ -3948,8 +3948,8 @@
          (kind() == MathUnaryInstr::kDoubleSquare));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3970,10 +3970,10 @@
 
 
 LocationSummary* CaseInsensitiveCompareUC16Instr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, InputCount(), kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(A0));
   summary->set_in(1, Location::RegisterLocation(A1));
   summary->set_in(2, Location::RegisterLocation(A2));
@@ -3991,13 +3991,13 @@
 }
 
 
-LocationSummary* MathMinMaxInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* MathMinMaxInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   if (result_cid() == kDoubleCid) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     // Reuse the left register so that code can be made shorter.
@@ -4008,8 +4008,8 @@
   ASSERT(result_cid() == kSmiCid);
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   // Reuse the left register so that code can be made shorter.
@@ -4083,12 +4083,12 @@
 }
 
 
-LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   // We make use of 3-operand instructions by not requiring result register
   // to be identical to first input register as on Intel.
@@ -4117,12 +4117,12 @@
 }
 
 
-LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   summary->set_temp(0, Location::RequiresFpuRegister());
@@ -4142,12 +4142,12 @@
 }
 
 
-LocationSummary* Int32ToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32ToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -4162,12 +4162,12 @@
 }
 
 
-LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -4183,7 +4183,7 @@
 }
 
 
-LocationSummary* MintToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* MintToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -4195,12 +4195,12 @@
 }
 
 
-LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::RegisterLocation(T1));
   result->set_out(0, Location::RegisterLocation(V0));
   return result;
@@ -4243,12 +4243,12 @@
 }
 
 
-LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresRegister());
   return result;
@@ -4270,7 +4270,7 @@
 }
 
 
-LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -4282,12 +4282,12 @@
 }
 
 
-LocationSummary* DoubleToFloatInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DoubleToFloatInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::SameAsFirstInput());
   return result;
@@ -4301,12 +4301,12 @@
 }
 
 
-LocationSummary* FloatToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* FloatToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::SameAsFirstInput());
   return result;
@@ -4320,14 +4320,14 @@
 }
 
 
-LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(Zone* zone,
                                                                bool opt) const {
   // Calling convention on MIPS uses D6 and D7 to pass the first two
   // double arguments.
   ASSERT((InputCount() == 1) || (InputCount() == 2));
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, InputCount(), kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::FpuRegisterLocation(D6));
   if (InputCount() == 2) {
     result->set_in(1, Location::FpuRegisterLocation(D7));
@@ -4461,13 +4461,13 @@
 }
 
 
-LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   // Only use this instruction in optimized code.
   ASSERT(opt);
   const intptr_t kNumInputs = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, 0, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, 0, LocationSummary::kNoCall);
   if (representation() == kUnboxedDouble) {
     if (index() == 0) {
       summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
@@ -4511,13 +4511,13 @@
 }
 
 
-LocationSummary* MergedMathInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* MergedMathInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   if (kind() == MergedMathInstr::kTruncDivMod) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::RequiresRegister());
     summary->set_temp(0, Location::RequiresRegister());
@@ -4592,8 +4592,8 @@
 
 
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
-  return MakeCallSummary(isolate);
+    Zone* zone, bool opt) const {
+  return MakeCallSummary(zone);
 }
 
 
@@ -4632,9 +4632,9 @@
 }
 
 
-LocationSummary* BranchInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BranchInstr::MakeLocationSummary(Zone* zone,
                                                   bool opt) const {
-  comparison()->InitializeLocationSummary(isolate, opt);
+  comparison()->InitializeLocationSummary(zone, opt);
   // Branches don't produce a result.
   comparison()->locs()->set_out(0, Location::NoLocation());
   return comparison()->locs();
@@ -4647,13 +4647,13 @@
 }
 
 
-LocationSummary* CheckClassInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckClassInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const bool need_mask_temp = IsDenseSwitch() && !IsDenseMask(ComputeCidMask());
   const intptr_t kNumTemps = !IsNullCheck() ? (need_mask_temp ? 2 : 1) : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (!IsNullCheck()) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -4724,12 +4724,12 @@
 }
 
 
-LocationSummary* CheckSmiInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckSmiInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -4746,12 +4746,12 @@
 }
 
 
-LocationSummary* CheckClassIdInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckClassIdInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -4764,12 +4764,12 @@
 }
 
 
-LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
   locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
   return locs;
@@ -4818,12 +4818,12 @@
   }
 }
 
-LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -4912,12 +4912,12 @@
 }
 
 
-LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_in(1, Location::WritableRegisterOrSmiConstant(right()));
@@ -5084,12 +5084,12 @@
 }
 
 
-LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_out(0, Location::Pair(Location::RequiresRegister(),
@@ -5128,12 +5128,12 @@
 }
 
 
-LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
@@ -5172,12 +5172,12 @@
 }
 
 
-LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RegisterOrSmiConstant(right()));
   summary->set_temp(0, Location::RequiresRegister());
@@ -5241,12 +5241,12 @@
 }
 
 
-LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -5267,12 +5267,12 @@
 DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryInt32OpInstr)
 
 
-LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Zone* zone,
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (from() == kUnboxedMint) {
     ASSERT((to() == kUnboxedUint32) || (to() == kUnboxedInt32));
     summary->set_in(0, Location::Pair(Location::RequiresRegister(),
@@ -5342,9 +5342,9 @@
 }
 
 
-LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ThrowInstr::MakeLocationSummary(Zone* zone,
                                                  bool opt) const {
-  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
+  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
 }
 
 
@@ -5359,9 +5359,9 @@
 }
 
 
-LocationSummary* ReThrowInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ReThrowInstr::MakeLocationSummary(Zone* zone,
                                                    bool opt) const {
-  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
+  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
 }
 
 
@@ -5383,9 +5383,9 @@
 }
 
 
-LocationSummary* GotoInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* GotoInstr::MakeLocationSummary(Zone* zone,
                                                 bool opt) const {
-  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall);
+  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
 }
 
 
@@ -5416,13 +5416,13 @@
 }
 
 
-LocationSummary* IndirectGotoInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* IndirectGotoInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
 
-  LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
   summary->set_in(0, Location::RequiresRegister());
   summary->set_temp(0, Location::RequiresRegister());
@@ -5449,20 +5449,20 @@
 }
 
 
-LocationSummary* StrictCompareInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StrictCompareInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (needs_number_check()) {
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kCall);
     locs->set_in(0, Location::RegisterLocation(A0));
     locs->set_in(1, Location::RegisterLocation(A1));
     locs->set_out(0, Location::RegisterLocation(A0));
     return locs;
   }
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterOrConstant(left()));
   // Only one of the inputs can be a constant. Choose register if the first one
   // is a constant.
@@ -5536,9 +5536,9 @@
 }
 
 
-LocationSummary* BooleanNegateInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BooleanNegateInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                1,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -5556,9 +5556,9 @@
 }
 
 
-LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* AllocateObjectInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
-  return MakeCallSummary(isolate);
+  return MakeCallSummary(zone);
 }
 
 
@@ -5590,6 +5590,37 @@
 #endif
 }
 
+
+LocationSummary* GrowRegExpStackInstr::MakeLocationSummary(
+    Zone* zone, bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_in(0, Location::RegisterLocation(T0));
+  locs->set_out(0, Location::RegisterLocation(T0));
+  return locs;
+}
+
+
+void GrowRegExpStackInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register typed_data = locs()->in(0).reg();
+  const Register result = locs()->out(0).reg();
+  __ TraceSimMsg("GrowRegExpStackInstr");
+  __ addiu(SP, SP, Immediate(-2 * kWordSize));
+  __ LoadObject(TMP, Object::null_object());
+  __ sw(TMP, Address(SP, 1 * kWordSize));
+  __ sw(typed_data, Address(SP, 0 * kWordSize));
+  compiler->GenerateRuntimeCall(Scanner::kNoSourcePos,  // No token position.
+                                deopt_id(),
+                                kGrowRegExpStackRuntimeEntry,
+                                1,
+                                locs());
+  __ lw(result, Address(SP, 1 * kWordSize));
+  __ addiu(SP, SP, Immediate(2 * kWordSize));
+}
+
+
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_MIPS
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 867c335..893e662 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -32,20 +32,20 @@
 
 // Generic summary for call instructions that have all arguments pushed
 // on the stack and return the result in a fixed register RAX.
-LocationSummary* Instruction::MakeCallSummary(Isolate* isolate) {
-  LocationSummary* result = new(isolate) LocationSummary(
-      Isolate::Current(), 0, 0, LocationSummary::kCall);
+LocationSummary* Instruction::MakeCallSummary(Zone* zone) {
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, 0, 0, LocationSummary::kCall);
   result->set_out(0, Location::RegisterLocation(RAX));
   return result;
 }
 
 
-LocationSummary* PushArgumentInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* PushArgumentInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::AnyOrConstant(value()));
   return locs;
 }
@@ -68,12 +68,12 @@
 }
 
 
-LocationSummary* ReturnInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ReturnInstr::MakeLocationSummary(Zone* zone,
                                                   bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterLocation(RAX));
   return locs;
 }
@@ -136,9 +136,9 @@
 }
 
 
-LocationSummary* IfThenElseInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* IfThenElseInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
-  comparison()->InitializeLocationSummary(isolate, opt);
+  comparison()->InitializeLocationSummary(zone, opt);
   // TODO(vegorov): support byte register constraints in the register allocator.
   comparison()->locs()->set_out(0, Location::RegisterLocation(RDX));
   return comparison()->locs();
@@ -194,13 +194,13 @@
 }
 
 
-LocationSummary* LoadLocalInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadLocalInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t stack_index = (local().index() < 0)
       ? kFirstLocalSlotFromFp - local().index()
       : kParamEndSlotFromFp - local().index();
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::StackSlot(stack_index),
                                LocationSummary::kNoCall);
@@ -213,10 +213,10 @@
 }
 
 
-LocationSummary* StoreLocalInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StoreLocalInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
@@ -231,10 +231,10 @@
 }
 
 
-LocationSummary* ConstantInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 0;
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -250,12 +250,12 @@
 }
 
 
-LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   switch (representation()) {
     case kUnboxedDouble:
       locs->set_out(0, Location::RequiresFpuRegister());
@@ -296,12 +296,12 @@
 }
 
 
-LocationSummary* AssertAssignableInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* AssertAssignableInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(RAX));  // Value.
   summary->set_in(1, Location::RegisterLocation(RCX));  // Instantiator.
   summary->set_in(2, Location::RegisterLocation(RDX));  // Type arguments.
@@ -310,12 +310,12 @@
 }
 
 
-LocationSummary* AssertBooleanInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* AssertBooleanInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(RAX));
   locs->set_out(0, Location::RegisterLocation(RAX));
   return locs;
@@ -379,13 +379,13 @@
 }
 
 
-LocationSummary* EqualityCompareInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* EqualityCompareInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   if (operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RequiresRegister());
     locs->set_in(1, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
@@ -393,8 +393,8 @@
   }
   if (operation_cid() == kDoubleCid) {
     const intptr_t kNumTemps =  0;
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RequiresFpuRegister());
     locs->set_in(1, Location::RequiresFpuRegister());
     locs->set_out(0, Location::RequiresRegister());
@@ -402,8 +402,8 @@
   }
   if (operation_cid() == kSmiCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
@@ -572,12 +572,12 @@
 }
 
 
-LocationSummary* TestSmiInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* TestSmiInstr::MakeLocationSummary(Zone* zone,
                                                    bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -618,12 +618,12 @@
 
 
 
-LocationSummary* TestCidsInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* TestCidsInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
   locs->set_out(0, Location::RequiresRegister());
@@ -690,28 +690,28 @@
 }
 
 
-LocationSummary* RelationalOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* RelationalOpInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (operation_cid() == kDoubleCid) {
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     summary->set_out(0, Location::RequiresRegister());
     return summary;
   } else if (operation_cid() == kMintCid) {
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::RequiresRegister());
     summary->set_out(0, Location::RequiresRegister());
     return summary;
   }
   ASSERT(operation_cid() == kSmiCid);
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RegisterOrConstant(left()));
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -759,9 +759,9 @@
 }
 
 
-LocationSummary* NativeCallInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* NativeCallInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
-  return MakeCallSummary(isolate);
+  return MakeCallSummary(zone);
 }
 
 
@@ -809,11 +809,11 @@
 }
 
 
-LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   // TODO(fschneider): Allow immediate operands for the char code.
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -832,10 +832,10 @@
 }
 
 
-LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -859,12 +859,12 @@
 }
 
 
-LocationSummary* StringInterpolateInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StringInterpolateInstr::MakeLocationSummary(Zone* zone,
                                                              bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(RAX));
   summary->set_out(0, Location::RegisterLocation(RAX));
   return summary;
@@ -887,10 +887,10 @@
 }
 
 
-LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -909,10 +909,10 @@
 }
 
 
-LocationSummary* LoadClassIdInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadClassIdInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -1013,12 +1013,12 @@
 }
 
 
-LocationSummary* LoadIndexedInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadIndexedInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // The smi index is either untagged (element size == 1), or it is left smi
   // tagged (for all element sizes > 1).
@@ -1145,12 +1145,12 @@
 }
 
 
-LocationSummary* LoadCodeUnitsInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadCodeUnitsInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   // The smi index is either untagged (element size == 1), or it is left smi
   // tagged (for all element sizes > 1).
@@ -1238,12 +1238,12 @@
 }
 
 
-LocationSummary* StoreIndexedInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StoreIndexedInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // The smi index is either untagged (element size == 1), or it is left smi
   // tagged (for all element sizes > 1).
@@ -1407,7 +1407,7 @@
 }
 
 
-LocationSummary* GuardFieldClassInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* GuardFieldClassInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
 
@@ -1427,8 +1427,8 @@
     num_temps++;
   }
 
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, num_temps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, num_temps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
 
   for (intptr_t i = 0; i < num_temps; i++) {
@@ -1562,13 +1562,13 @@
 }
 
 
-LocationSummary* GuardFieldLengthInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* GuardFieldLengthInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   if (!opt || (field().guarded_list_length() == Field::kUnknownFixedLength)) {
     const intptr_t kNumTemps = 3;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     // We need temporaries for field object, length offset and expected length.
     summary->set_temp(0, Location::RequiresRegister());
@@ -1576,8 +1576,8 @@
     summary->set_temp(2, Location::RequiresRegister());
     return summary;
   } else {
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, 0, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, 0, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     return summary;
   }
@@ -1716,14 +1716,14 @@
 };
 
 
-LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps =
       (IsUnboxedStore() && opt) ? 2 :
           ((IsPotentialUnboxedStore()) ? 3 : 0);
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps,
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps,
           ((IsUnboxedStore() && opt && is_potential_unboxed_initialization_) ||
            IsPotentialUnboxedStore())
           ? LocationSummary::kCallOnSlowPath
@@ -1947,12 +1947,12 @@
 }
 
 
-LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -1971,10 +1971,10 @@
 }
 
 
-LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, 1, 1, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, 1, 1, LocationSummary::kNoCall);
   locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
                                               : Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
@@ -1997,12 +1997,12 @@
 }
 
 
-LocationSummary* InstanceOfInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* InstanceOfInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(RAX));
   summary->set_in(1, Location::RegisterLocation(RCX));
   summary->set_in(2, Location::RegisterLocation(RDX));
@@ -2027,12 +2027,12 @@
 
 // TODO(srdjan): In case of constant inputs make CreateArray kNoCall and
 // use slow path stub.
-LocationSummary* CreateArrayInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CreateArrayInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(RBX));
   locs->set_in(1, Location::RegisterLocation(R10));
   locs->set_out(0, Location::RegisterLocation(RAX));
@@ -2139,14 +2139,14 @@
 }
 
 
-LocationSummary* LoadFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* LoadFieldInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps =
       (IsUnboxedLoad() && opt) ? 1 :
           ((IsPotentialUnboxedLoad()) ? 2 : 0);
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps,
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps,
           (opt && !IsPotentialUnboxedLoad())
           ? LocationSummary::kNoCall
           : LocationSummary::kCallOnSlowPath);
@@ -2264,12 +2264,12 @@
 }
 
 
-LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(RAX));
   locs->set_out(0, Location::RegisterLocation(RAX));
   return locs;
@@ -2297,11 +2297,11 @@
 
 
 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(RAX));
   locs->set_out(0, Location::RegisterLocation(RAX));
   return locs;
@@ -2369,13 +2369,13 @@
 
 
 LocationSummary* AllocateUninitializedContextInstr::MakeLocationSummary(
-    Isolate* isolate,
+    Zone* zone,
     bool opt) const {
   ASSERT(opt);
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   locs->set_temp(0, Location::RegisterLocation(R10));
   locs->set_out(0, Location::RegisterLocation(RAX));
   return locs;
@@ -2437,12 +2437,12 @@
 }
 
 
-LocationSummary* AllocateContextInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* AllocateContextInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_temp(0, Location::RegisterLocation(R10));
   locs->set_out(0, Location::RegisterLocation(RAX));
   return locs;
@@ -2463,12 +2463,12 @@
 }
 
 
-LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(RAX));
   locs->set_temp(0, Location::RegisterLocation(RCX));
   return locs;
@@ -2501,12 +2501,12 @@
 }
 
 
-LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CloneContextInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(RAX));
   locs->set_out(0, Location::RegisterLocation(RAX));
   return locs;
@@ -2529,7 +2529,7 @@
 }
 
 
-LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   UNREACHABLE();
   return NULL;
@@ -2567,12 +2567,12 @@
 }
 
 
-LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs,
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   summary->set_temp(0, Location::RequiresRegister());
@@ -2797,7 +2797,7 @@
 }
 
 
-LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
 
@@ -2809,8 +2809,8 @@
       (op_kind() != Token::kMOD) &&
       CanBeImmediate(right_constant->value())) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::Constant(right_constant));
     summary->set_out(0, Location::SameAsFirstInput());
@@ -2819,8 +2819,8 @@
 
   if (op_kind() == Token::kTRUNCDIV) {
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     if (RightIsPowerOfTwoConstant()) {
       summary->set_in(0, Location::RequiresRegister());
       ConstantInstr* right_constant = right()->definition()->AsConstant();
@@ -2838,8 +2838,8 @@
     return summary;
   } else if (op_kind() == Token::kMOD) {
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     // Both inputs must be writable because they will be untagged.
     summary->set_in(0, Location::RegisterLocation(RDX));
     summary->set_in(1, Location::WritableRegister());
@@ -2849,16 +2849,16 @@
     return summary;
   } else if (op_kind() == Token::kSHR) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
     summary->set_out(0, Location::SameAsFirstInput());
     return summary;
   } else if (op_kind() == Token::kSHL) {
     const intptr_t kNumTemps = can_overflow() ? 1 : 0;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
     if (can_overflow()) {
@@ -2868,8 +2868,8 @@
     return summary;
   } else {
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     ConstantInstr* constant = right()->definition()->AsConstant();
     if (constant != NULL) {
@@ -3218,7 +3218,7 @@
 }
 
 
-LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Zone* zone,
                                                              bool opt) const {
   intptr_t left_cid = left()->Type()->ToCid();
   intptr_t right_cid = right()->Type()->ToCid();
@@ -3228,8 +3228,8 @@
                       && (left_cid != kSmiCid)
                       && (right_cid != kSmiCid);
   const intptr_t kNumTemps = need_temp ? 1 : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-    isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+    zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   if (need_temp) summary->set_temp(0, Location::RequiresRegister());
@@ -3261,12 +3261,12 @@
 }
 
 
-LocationSummary* BoxInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -3296,15 +3296,15 @@
 }
 
 
-LocationSummary* UnboxInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxInstr::MakeLocationSummary(Zone* zone,
                                                  bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   const bool needs_writable_input =
       (representation() != kUnboxedMint) &&
       (value()->Type()->ToNullableCid() != BoxCid());
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, needs_writable_input ? Location::WritableRegister()
                                           : Location::RequiresRegister());
   if (representation() == kUnboxedMint) {
@@ -3412,12 +3412,12 @@
 }
 
 
-LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = (!is_truncating() && CanDeoptimize()) ? 1 : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   if (kNumTemps > 0) {
@@ -3460,14 +3460,14 @@
 }
 
 
-LocationSummary* BoxInteger32Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
                                                    bool opt) const {
   ASSERT((from_representation() == kUnboxedInt32) ||
          (from_representation() == kUnboxedUint32));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate,
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone,
       kNumInputs,
       kNumTemps,
       LocationSummary::kNoCall);
@@ -3493,12 +3493,12 @@
 }
 
 
-LocationSummary* BoxInt64Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInt64Instr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate,
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone,
       kNumInputs,
       kNumTemps,
       ValueFitsSmi() ? LocationSummary::kNoCall
@@ -3525,12 +3525,12 @@
 }
 
 
-LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3554,12 +3554,12 @@
 }
 
 
-LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Zone* zone,
                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3583,12 +3583,12 @@
 }
 
 
-LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(Zone* zone,
                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3612,12 +3612,12 @@
 }
 
 
-LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -3655,12 +3655,12 @@
 }
 
 
-LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3683,12 +3683,12 @@
 }
 
 
-LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(Zone* zone,
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -3705,11 +3705,11 @@
 
 
 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -3742,12 +3742,12 @@
 }
 
 
-LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -3759,12 +3759,12 @@
 }
 
 
-LocationSummary* Float32x4SplatInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4SplatInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -3781,12 +3781,12 @@
 }
 
 
-LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Zone* zone,
                                                                bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3825,12 +3825,12 @@
 }
 
 
-LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3856,12 +3856,12 @@
 }
 
 
-LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3886,12 +3886,12 @@
 }
 
 
-LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -3918,12 +3918,12 @@
 }
 
 
-LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -3946,12 +3946,12 @@
 }
 
 
-LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -3970,12 +3970,12 @@
 }
 
 
-LocationSummary* Float32x4WithInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4WithInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4039,12 +4039,12 @@
 }
 
 
-LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4056,12 +4056,12 @@
 }
 
 
-LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4084,12 +4084,12 @@
 }
 
 
-LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -4101,12 +4101,12 @@
 }
 
 
-LocationSummary* Float64x2SplatInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float64x2SplatInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4120,11 +4120,11 @@
 
 
 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4144,11 +4144,11 @@
 
 
 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4162,11 +4162,11 @@
 
 
 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4179,12 +4179,12 @@
 }
 
 
-LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   if (representation() == kTagged) {
     ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask);
@@ -4222,12 +4222,12 @@
 }
 
 
-LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4277,11 +4277,11 @@
 
 
 LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_in(2, Location::RequiresRegister());
@@ -4308,11 +4308,11 @@
 
 
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_in(2, Location::RequiresRegister());
@@ -4377,12 +4377,12 @@
 }
 
 
-LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -4423,12 +4423,12 @@
 }
 
 
-LocationSummary* Int32x4SelectInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32x4SelectInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4458,12 +4458,12 @@
 }
 
 
-LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_temp(0, Location::RequiresRegister());
@@ -4525,12 +4525,12 @@
 }
 
 
-LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(Zone* zone,
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4542,12 +4542,12 @@
 }
 
 
-LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4583,7 +4583,7 @@
 }
 
 
-LocationSummary* MathUnaryInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* MathUnaryInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
     // Calling convention on x64 uses XMM0 and XMM1 to pass the first two
@@ -4592,8 +4592,8 @@
     // assumes that XMM0 is free at all times.
     // TODO(vegorov): allow XMM0 to be used.
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, InputCount(), kNumTemps, LocationSummary::kCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, InputCount(), kNumTemps, LocationSummary::kCall);
     summary->set_in(0, Location::FpuRegisterLocation(XMM1));
     // R13 is chosen because it is callee saved so we do not need to back it
     // up before calling into the runtime.
@@ -4605,8 +4605,8 @@
          (kind() == MathUnaryInstr::kDoubleSquare));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   if (kind() == MathUnaryInstr::kDoubleSquare) {
     summary->set_out(0, Location::SameAsFirstInput());
@@ -4640,10 +4640,10 @@
 
 
 LocationSummary* CaseInsensitiveCompareUC16Instr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
+    Zone* zone, bool opt) const {
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, InputCount(), kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(CallingConventions::kArg1Reg));
   summary->set_in(1, Location::RegisterLocation(CallingConventions::kArg2Reg));
   summary->set_in(2, Location::RegisterLocation(CallingConventions::kArg3Reg));
@@ -4670,10 +4670,10 @@
 }
 
 
-LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                kNumInputs,
                                Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
@@ -4704,12 +4704,12 @@
 }
 
 
-LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4723,13 +4723,13 @@
 }
 
 
-LocationSummary* MathMinMaxInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* MathMinMaxInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   if (result_cid() == kDoubleCid) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     // Reuse the left register so that code can be made shorter.
@@ -4740,8 +4740,8 @@
   ASSERT(result_cid() == kSmiCid);
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   // Reuse the left register so that code can be made shorter.
@@ -4813,12 +4813,12 @@
 }
 
 
-LocationSummary* Int32ToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* Int32ToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -4832,12 +4832,12 @@
 }
 
 
-LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::WritableRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -4852,7 +4852,7 @@
 }
 
 
-LocationSummary* MintToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* MintToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -4864,12 +4864,12 @@
 }
 
 
-LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::RegisterLocation(RCX));
   result->set_out(0, Location::RegisterLocation(RAX));
   result->set_temp(0, Location::RegisterLocation(RBX));
@@ -4917,12 +4917,12 @@
 }
 
 
-LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresRegister());
   result->set_temp(0, Location::RequiresRegister());
@@ -4950,12 +4950,12 @@
 }
 
 
-LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -4981,12 +4981,12 @@
 }
 
 
-LocationSummary* DoubleToFloatInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* DoubleToFloatInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::SameAsFirstInput());
   return result;
@@ -4998,12 +4998,12 @@
 }
 
 
-LocationSummary* FloatToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* FloatToDoubleInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::SameAsFirstInput());
   return result;
@@ -5015,7 +5015,7 @@
 }
 
 
-LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(Zone* zone,
                                                                bool opt) const {
   // Calling convention on x64 uses XMM0 and XMM1 to pass the first two
   // double arguments and XMM0 to return the result. Unfortunately
@@ -5025,8 +5025,8 @@
   ASSERT((InputCount() == 1) || (InputCount() == 2));
   const intptr_t kNumTemps =
       (recognized_kind() == MethodRecognizer::kMathDoublePow) ? 3 : 1;
-  LocationSummary* result = new(isolate) LocationSummary(
-      isolate, InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new(zone) LocationSummary(
+      zone, InputCount(), kNumTemps, LocationSummary::kCall);
   result->set_temp(0, Location::RegisterLocation(R13));
   result->set_in(0, Location::FpuRegisterLocation(XMM2));
   if (InputCount() == 2) {
@@ -5198,13 +5198,13 @@
 }
 
 
-LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(Zone* zone,
                                                             bool opt) const {
   // Only use this instruction in optimized code.
   ASSERT(opt);
   const intptr_t kNumInputs = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, 0, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, 0, LocationSummary::kNoCall);
   if (representation() == kUnboxedDouble) {
     if (index() == 0) {
       summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
@@ -5248,13 +5248,13 @@
 }
 
 
-LocationSummary* MergedMathInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* MergedMathInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   if (kind() == MergedMathInstr::kTruncDivMod) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     // Both inputs must be writable because they will be untagged.
     summary->set_in(0, Location::RegisterLocation(RAX));
     summary->set_in(1, Location::WritableRegister());
@@ -5265,8 +5265,8 @@
   if (kind() == MergedMathInstr::kSinCos) {
     const intptr_t kNumInputs = 1;
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kCall);
     // Because we always call into the runtime (LocationSummary::kCall) we
     // must specify each input, temp, and output register explicitly.
     summary->set_in(0, Location::FpuRegisterLocation(XMM1));
@@ -5424,8 +5424,8 @@
 
 
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
-    Isolate* isolate, bool opt) const {
-  return MakeCallSummary(isolate);
+    Zone* zone, bool opt) const {
+  return MakeCallSummary(zone);
 }
 
 
@@ -5464,9 +5464,9 @@
 }
 
 
-LocationSummary* BranchInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BranchInstr::MakeLocationSummary(Zone* zone,
                                                   bool opt) const {
-  comparison()->InitializeLocationSummary(isolate, opt);
+  comparison()->InitializeLocationSummary(zone, opt);
   // Branches don't produce a result.
   comparison()->locs()->set_out(0, Location::NoLocation());
   return comparison()->locs();
@@ -5478,13 +5478,13 @@
 }
 
 
-LocationSummary* CheckClassInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckClassInstr::MakeLocationSummary(Zone* zone,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const bool need_mask_temp = IsDenseSwitch() && !IsDenseMask(ComputeCidMask());
   const intptr_t kNumTemps = !IsNullCheck() ? (need_mask_temp ? 2 : 1) : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (!IsNullCheck()) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -5559,12 +5559,12 @@
 }
 
 
-LocationSummary* CheckSmiInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckSmiInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -5580,12 +5580,12 @@
 }
 
 
-LocationSummary* CheckClassIdInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckClassIdInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -5599,12 +5599,12 @@
 }
 
 
-LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
   locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
   return locs;
@@ -5690,12 +5690,12 @@
 }
 
 
-LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -5723,12 +5723,12 @@
 }
 
 
-LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -5762,12 +5762,12 @@
 }
 
 
-LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = can_overflow() ? 1 : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
   if (kNumTemps > 0) {
@@ -5868,12 +5868,12 @@
 }
 
 
-LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = (op_kind() == Token::kMUL) ? 1 : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -5933,12 +5933,12 @@
 }
 
 
-LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
   summary->set_out(0, Location::SameAsFirstInput());
@@ -6017,12 +6017,12 @@
 }
 
 
-LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -6042,12 +6042,12 @@
 DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryInt32OpInstr)
 
 
-LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Zone* zone,
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (from() == kUnboxedMint) {
     ASSERT((to() == kUnboxedUint32) || (to() == kUnboxedInt32));
     summary->set_in(0, Location::RequiresRegister());
@@ -6121,9 +6121,9 @@
 }
 
 
-LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ThrowInstr::MakeLocationSummary(Zone* zone,
                                                  bool opt) const {
-  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
+  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
 }
 
 
@@ -6137,9 +6137,9 @@
 }
 
 
-LocationSummary* ReThrowInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ReThrowInstr::MakeLocationSummary(Zone* zone,
                                                    bool opt) const {
-  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
+  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
 }
 
 
@@ -6161,9 +6161,9 @@
 }
 
 
-LocationSummary* GotoInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* GotoInstr::MakeLocationSummary(Zone* zone,
                                                 bool opt) const {
-  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall);
+  return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
 }
 
 
@@ -6193,13 +6193,13 @@
 }
 
 
-LocationSummary* IndirectGotoInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* IndirectGotoInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
 
-  LocationSummary* summary = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
   summary->set_in(0, Location::RequiresRegister());
   summary->set_temp(0, Location::RequiresRegister());
@@ -6225,20 +6225,20 @@
   __ jmp(target_address_reg);
 }
 
-LocationSummary* StrictCompareInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* StrictCompareInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (needs_number_check()) {
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* locs = new(zone) LocationSummary(
+        zone, kNumInputs, kNumTemps, LocationSummary::kCall);
     locs->set_in(0, Location::RegisterLocation(RAX));
     locs->set_in(1, Location::RegisterLocation(RCX));
     locs->set_out(0, Location::RegisterLocation(RAX));
     return locs;
   }
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterOrConstant(left()));
   // Only one of the inputs can be a constant. Choose register if the first one
   // is a constant.
@@ -6310,12 +6310,12 @@
 }
 
 
-LocationSummary* ClosureCallInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* ClosureCallInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(RAX));  // Function.
   summary->set_out(0, Location::RegisterLocation(RAX));
   return summary;
@@ -6360,9 +6360,9 @@
 }
 
 
-LocationSummary* BooleanNegateInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BooleanNegateInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
-  return LocationSummary::Make(isolate,
+  return LocationSummary::Make(zone,
                                1,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -6382,9 +6382,9 @@
 }
 
 
-LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* AllocateObjectInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
-  return MakeCallSummary(isolate);
+  return MakeCallSummary(zone);
 }
 
 
@@ -6414,6 +6414,34 @@
 #endif
 }
 
+
+LocationSummary* GrowRegExpStackInstr::MakeLocationSummary(
+    Zone* zone, bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_in(0, Location::RegisterLocation(RAX));
+  locs->set_out(0, Location::RegisterLocation(RAX));
+  return locs;
+}
+
+
+void GrowRegExpStackInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register typed_data = locs()->in(0).reg();
+  const Register result = locs()->out(0).reg();
+  __ PushObject(Object::null_object(), PP);
+  __ pushq(typed_data);
+  compiler->GenerateRuntimeCall(Scanner::kNoSourcePos,  // No token position.
+                                deopt_id(),
+                                kGrowRegExpStackRuntimeEntry,
+                                1,
+                                locs());
+  __ Drop(1);
+  __ popq(result);
+}
+
+
 }  // namespace dart
 
 #undef __
diff --git a/runtime/vm/intrinsifier.cc b/runtime/vm/intrinsifier.cc
index b0802ba..a9c3994 100644
--- a/runtime/vm/intrinsifier.cc
+++ b/runtime/vm/intrinsifier.cc
@@ -141,9 +141,9 @@
   FlowGraph* graph = new FlowGraph(parsed_function, graph_entry, block_id);
   const Function& function = parsed_function->function();
   switch (function.recognized_kind()) {
-#define EMIT_CASE(test_class_name, test_function_name, enum_name, fp)          \
+#define EMIT_CASE(class_name, function_name, enum_name, fp)                    \
     case MethodRecognizer::k##enum_name:                                       \
-      ASSERT(function.CheckSourceFingerprint(fp));                             \
+      CHECK_FINGERPRINT3(function, class_name, function_name, enum_name, fp);  \
       if (!Build_##enum_name(graph)) return false;                             \
       break;
 
@@ -185,9 +185,9 @@
     return;
   }
 
-#define EMIT_CASE(test_class_name, test_function_name, enum_name, fp)          \
+#define EMIT_CASE(class_name, function_name, enum_name, fp)                    \
     case MethodRecognizer::k##enum_name:                                       \
-      ASSERT(function.CheckSourceFingerprint(fp));                             \
+      CHECK_FINGERPRINT3(function, class_name, function_name, enum_name, fp);  \
       compiler->assembler()->Comment("Intrinsic");                             \
       enum_name(compiler->assembler());                                        \
       break;
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index e1d6590..c926ce1 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -117,7 +117,7 @@
   // Store backing array object in growable array object.
   __ ldr(R1, Address(SP, kArrayOffset));  // Data argument.
   // R0 is new, no barrier needed.
-  __ StoreIntoObjectNoBarrier(
+  __ InitializeFieldNoBarrier(
       R0,
       FieldAddress(R0, GrowableObjectArray::data_offset()),
       R1);
@@ -125,15 +125,17 @@
   // R0: new growable array object start as a tagged pointer.
   // Store the type argument field in the growable array object.
   __ ldr(R1, Address(SP, kTypeArgumentsOffset));  // Type argument.
-  __ StoreIntoObjectNoBarrier(
+  __ InitializeFieldNoBarrier(
       R0,
       FieldAddress(R0, GrowableObjectArray::type_arguments_offset()),
       R1);
 
   // Set the length field in the growable array object to 0.
   __ LoadImmediate(R1, 0);
-  __ StoreIntoSmiField(FieldAddress(R0, GrowableObjectArray::length_offset()),
-                       R1);
+  __ InitializeFieldNoBarrier(
+      R0,
+      FieldAddress(R0, GrowableObjectArray::length_offset()),
+      R1);
   __ Ret();  // Returns the newly allocated object in R0.
 
   __ Bind(&fall_through);
@@ -329,7 +331,7 @@
   /* R2: allocation size. */                                                   \
   /* R4: allocation stats address. */                                          \
   __ ldr(R3, Address(SP, kArrayLengthStackOffset));  /* Array length. */       \
-  __ StoreIntoObjectNoBarrier(R0,                                              \
+  __ InitializeFieldNoBarrier(R0,                                              \
                               FieldAddress(R0, type_name::length_offset()),    \
                               R3);                                             \
   /* Initialize all array elements to 0. */                                    \
@@ -1816,12 +1818,14 @@
   }
 
   // Set the length field using the saved length (R6).
-  __ StoreIntoObjectNoBarrier(R0,
+  __ InitializeFieldNoBarrier(R0,
                               FieldAddress(R0, String::length_offset()),
                               R6);
   // Clear hash.
   __ LoadImmediate(TMP, 0);
-  __ StoreIntoSmiField(FieldAddress(R0, String::hash_offset()), TMP);
+  __ InitializeFieldNoBarrier(R0,
+                              FieldAddress(R0, String::hash_offset()),
+                              TMP);
 
   __ IncrementAllocationStatsWithSize(R4, R2, cid, space);
   __ b(ok);
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc
index 4f80141..223ea5f 100644
--- a/runtime/vm/intrinsifier_x64.cc
+++ b/runtime/vm/intrinsifier_x64.cc
@@ -794,7 +794,18 @@
 
 
 void Intrinsifier::Smi_bitLength(Assembler* assembler) {
-  // TODO(sra): Implement using bsrq.
+  ASSERT(kSmiTagShift == 1);
+  __ movq(RAX, Address(RSP, + 1 * kWordSize));  // Index.
+  // XOR with sign bit to complement bits if value is negative.
+  __ movq(RCX, RAX);
+  __ sarq(RCX, Immediate(63));  // All 0 or all 1.
+  __ xorq(RAX, RCX);
+  // BSR does not write the destination register if source is zero.  Put a 1 in
+  // the Smi tag bit to ensure BSR writes to destination register.
+  __ orq(RAX, Immediate(kSmiTagMask));
+  __ bsrq(RAX, RAX);
+  __ SmiTag(RAX);
+  __ ret();
 }
 
 
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 0b3c156..a7e4661 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -29,7 +29,7 @@
 #include "vm/stub_code.h"
 #include "vm/symbols.h"
 #include "vm/tags.h"
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 #include "vm/thread_interrupter.h"
 #include "vm/timer.h"
 #include "vm/visitor.h"
@@ -272,7 +272,6 @@
 
 
 bool IsolateMessageHandler::HandleMessage(Message* message) {
-  StartIsolateScope start_scope(I);
   StackZone zone(I);
   HandleScope handle_scope(I);
   // TODO(turnidge): Rework collection total dart execution.  This can
@@ -436,7 +435,8 @@
   object##_handle_(NULL),
 
 Isolate::Isolate()
-    : store_buffer_(),
+    : vm_tag_(0),
+      store_buffer_(),
       message_notify_callback_(NULL),
       name_(NULL),
       start_time_(OS::GetCurrentTimeMicros()),
@@ -495,7 +495,8 @@
 }
 
 Isolate::Isolate(Isolate* original)
-    : store_buffer_(true),
+    : vm_tag_(0),
+      store_buffer_(true),
       class_table_(original->class_table()),
       message_notify_callback_(NULL),
       name_(NULL),
@@ -578,7 +579,7 @@
     old_current->set_thread_state(NULL);
     Profiler::EndExecution(old_current);
   }
-  Thread::SetThreadLocal(isolate_key, reinterpret_cast<uword>(current));
+  OSThread::SetThreadLocal(isolate_key, reinterpret_cast<uword>(current));
   if (current != NULL) {
     ASSERT(current->thread_state() == NULL);
     InterruptableThreadState* thread_state =
@@ -598,13 +599,13 @@
 // for a thread. Since an Isolate is the central repository for
 // storing all isolate specific information a single thread local key
 // is sufficient.
-ThreadLocalKey Isolate::isolate_key = Thread::kUnsetThreadLocalKey;
+ThreadLocalKey Isolate::isolate_key = OSThread::kUnsetThreadLocalKey;
 
 
 void Isolate::InitOnce() {
-  ASSERT(isolate_key == Thread::kUnsetThreadLocalKey);
-  isolate_key = Thread::CreateThreadLocal();
-  ASSERT(isolate_key != Thread::kUnsetThreadLocalKey);
+  ASSERT(isolate_key == OSThread::kUnsetThreadLocalKey);
+  isolate_key = OSThread::CreateThreadLocal();
+  ASSERT(isolate_key != OSThread::kUnsetThreadLocalKey);
   create_callback_ = NULL;
   isolates_list_monitor_ = new Monitor();
   ASSERT(isolates_list_monitor_ != NULL);
@@ -691,8 +692,8 @@
 // TODO(5411455): Use flag to override default value and Validate the
 // stack size by querying OS.
 uword Isolate::GetSpecifiedStackSize() {
-  ASSERT(Isolate::kStackSizeBuffer < Thread::GetMaxStackSize());
-  uword stack_size = Thread::GetMaxStackSize() - Isolate::kStackSizeBuffer;
+  ASSERT(Isolate::kStackSizeBuffer < OSThread::GetMaxStackSize());
+  uword stack_size = OSThread::GetMaxStackSize() - Isolate::kStackSizeBuffer;
   return stack_size;
 }
 
@@ -1073,7 +1074,8 @@
     while (old_space->tasks() > 0) {
       ml.Wait();
     }
-    heap_->Verify(kForbidMarked);
+    // The VM isolate keeps all objects marked.
+    heap_->Verify(this == Dart::vm_isolate() ? kRequireMarked : kForbidMarked);
   }
 #endif  // DEBUG
 
@@ -1363,7 +1365,7 @@
     ProfileIdle();
     return 1;
   }
-  ASSERT(state->id != Thread::kInvalidThreadId);
+  ASSERT(state->id != OSThread::kInvalidThreadId);
   ThreadInterrupter::InterruptThread(state);
   return 1;
 }
@@ -1567,31 +1569,46 @@
 
 
 RawObject* IsolateSpawnState::ResolveFunction() {
-  // Resolve the library.
-  Library& lib = Library::Handle();
-  if (library_url()) {
-    const String& lib_url = String::Handle(String::New(library_url()));
-    lib = Library::LookupLibrary(lib_url);
-    if (lib.IsNull() || lib.IsError()) {
-      const String& msg = String::Handle(String::NewFormatted(
-          "Unable to find library '%s'.", library_url()));
-      return LanguageError::New(msg);
-    }
-  } else {
-    lib = I->object_store()->root_library();
-  }
-  ASSERT(!lib.IsNull());
-
-  // Resolve the function.
   const String& func_name = String::Handle(String::New(function_name()));
 
+  if (library_url() == NULL) {
+    // Handle spawnUri lookup rules.
+    // Check whether the root library defines a main function.
+    const Library& lib = Library::Handle(I->object_store()->root_library());
+    Function& func = Function::Handle(lib.LookupLocalFunction(func_name));
+    if (func.IsNull()) {
+      // Check whether main is reexported from the root library.
+      const Object& obj = Object::Handle(lib.LookupReExport(func_name));
+      if (obj.IsFunction()) {
+        func ^= obj.raw();
+      }
+    }
+    if (func.IsNull()) {
+      const String& msg = String::Handle(String::NewFormatted(
+          "Unable to resolve function '%s' in script '%s'.",
+          function_name(), script_url()));
+      return LanguageError::New(msg);
+    }
+    return func.raw();
+  }
+
+  ASSERT(script_url() == NULL);
+  // Resolve the library.
+  const String& lib_url = String::Handle(String::New(library_url()));
+  const Library& lib = Library::Handle(Library::LookupLibrary(lib_url));
+  if (lib.IsNull() || lib.IsError()) {
+    const String& msg = String::Handle(String::NewFormatted(
+        "Unable to find library '%s'.", library_url()));
+    return LanguageError::New(msg);
+  }
+
+  // Resolve the function.
   if (class_name() == NULL) {
     const Function& func = Function::Handle(lib.LookupLocalFunction(func_name));
     if (func.IsNull()) {
       const String& msg = String::Handle(String::NewFormatted(
           "Unable to resolve function '%s' in library '%s'.",
-          function_name(),
-          (library_url() != NULL ? library_url() : script_url())));
+          function_name(), library_url()));
       return LanguageError::New(msg);
     }
     return func.raw();
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index d2fb921..3019f47 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -16,7 +16,7 @@
 #include "vm/random.h"
 #include "vm/store_buffer.h"
 #include "vm/tags.h"
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 #include "vm/trace_buffer.h"
 #include "vm/timer.h"
 
@@ -111,7 +111,7 @@
   ~Isolate();
 
   static inline Isolate* Current() {
-    return reinterpret_cast<Isolate*>(Thread::GetThreadLocal(isolate_key));
+    return reinterpret_cast<Isolate*>(OSThread::GetThreadLocal(isolate_key));
   }
 
   static void SetCurrent(Isolate* isolate);
@@ -199,6 +199,12 @@
     return OFFSET_OF(Isolate, top_exit_frame_info_);
   }
 
+  uword vm_tag() const {
+    return vm_tag_;
+  }
+  void set_vm_tag(uword tag) {
+    vm_tag_ = tag;
+  }
   static intptr_t vm_tag_offset() {
     return OFFSET_OF(Isolate, vm_tag_);
   }
@@ -214,10 +220,6 @@
 
   TimerList& timer_list() { return timer_list_; }
 
-  static intptr_t current_zone_offset() {
-    return OFFSET_OF(Isolate, current_zone_);
-  }
-
   void set_init_callback_data(void* value) {
     init_callback_data_ = value;
   }
@@ -632,6 +634,7 @@
 
   static ThreadLocalKey isolate_key;
 
+  uword vm_tag_;
   StoreBuffer store_buffer_;
   ClassTable class_table_;
   MegamorphicCacheTable megamorphic_cache_table_;
@@ -759,7 +762,10 @@
  public:
   explicit StartIsolateScope(Isolate* new_isolate)
       : new_isolate_(new_isolate), saved_isolate_(Isolate::Current()) {
-    ASSERT(new_isolate_ != NULL);
+    if (new_isolate_ == NULL) {
+      // Do nothing.
+      return;
+    }
     if (saved_isolate_ != new_isolate_) {
       ASSERT(Isolate::Current() == NULL);
       Isolate::SetCurrent(new_isolate_);
@@ -768,6 +774,10 @@
   }
 
   ~StartIsolateScope() {
+    if (new_isolate_ == NULL) {
+      // Do nothing.
+      return;
+    }
     if (saved_isolate_ != new_isolate_) {
       new_isolate_->ClearStackLimit();
       Isolate::SetCurrent(saved_isolate_);
diff --git a/runtime/vm/locations.cc b/runtime/vm/locations.cc
index 2419594..dd8cae5 100644
--- a/runtime/vm/locations.cc
+++ b/runtime/vm/locations.cc
@@ -23,7 +23,7 @@
 }
 
 
-LocationSummary::LocationSummary(Isolate* isolate,
+LocationSummary::LocationSummary(Zone* zone,
                                  intptr_t input_count,
                                  intptr_t temp_count,
                                  LocationSummary::ContainsCall contains_call)
@@ -35,18 +35,18 @@
 #if defined(DEBUG)
   writable_inputs_ = 0;
 #endif
-  input_locations_ = isolate->current_zone()->Alloc<Location>(num_inputs_);
-  temp_locations_ = isolate->current_zone()->Alloc<Location>(num_temps_);
+  input_locations_ = zone->Alloc<Location>(num_inputs_);
+  temp_locations_ = zone->Alloc<Location>(num_temps_);
 }
 
 
 LocationSummary* LocationSummary::Make(
-    Isolate* isolate,
+    Zone* zone,
     intptr_t input_count,
     Location out,
     LocationSummary::ContainsCall contains_call) {
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, input_count, 0, contains_call);
+  LocationSummary* summary = new(zone) LocationSummary(
+      zone, input_count, 0, contains_call);
   for (intptr_t i = 0; i < input_count; i++) {
     summary->set_in(i, Location::RequiresRegister());
   }
diff --git a/runtime/vm/locations.h b/runtime/vm/locations.h
index 0b9bf50..8a653ebc 100644
--- a/runtime/vm/locations.h
+++ b/runtime/vm/locations.h
@@ -445,10 +445,37 @@
 };
 
 
+template<typename T>
+class SmallSet {
+ public:
+  SmallSet() : data_(0) { }
+
+  explicit SmallSet(intptr_t data) : data_(data) { }
+
+  bool Contains(T value) const { return (data_ & ToMask(value)) != 0; }
+
+  void Add(T value) { data_ |= ToMask(value); }
+
+  void Remove(T value) { data_ &= ~ToMask(value); }
+
+  intptr_t data() const { return data_; }
+
+ private:
+  static intptr_t ToMask(T value) {
+    ASSERT(static_cast<intptr_t>(value) < (kWordSize * kBitsPerByte));
+    return 1 << static_cast<intptr_t>(value);
+  }
+
+  intptr_t data_;
+};
+
+
 class RegisterSet : public ValueObject {
  public:
-  RegisterSet() : cpu_registers_(0), untagged_cpu_registers_(0),
-                  fpu_registers_(0) {
+  RegisterSet()
+      : cpu_registers_(),
+        untagged_cpu_registers_(),
+        fpu_registers_() {
     ASSERT(kNumberOfCpuRegisters <= (kWordSize * kBitsPerByte));
     ASSERT(kNumberOfFpuRegisters <= (kWordSize * kBitsPerByte));
   }
@@ -456,21 +483,21 @@
 
   void Add(Location loc, Representation rep = kTagged) {
     if (loc.IsRegister()) {
-      cpu_registers_ |= (1 << loc.reg());
+      cpu_registers_.Add(loc.reg());
       if (rep != kTagged) {
         // CPU register contains an untagged value.
         MarkUntagged(loc);
       }
     } else if (loc.IsFpuRegister()) {
-      fpu_registers_ |= (1 << loc.fpu_reg());
+      fpu_registers_.Add(loc.fpu_reg());
     }
   }
 
   void Remove(Location loc) {
     if (loc.IsRegister()) {
-      cpu_registers_ &= ~(1 << loc.reg());
+      cpu_registers_.Remove(loc.reg());
     } else if (loc.IsFpuRegister()) {
-      fpu_registers_ &= ~(1 << loc.fpu_reg());
+      fpu_registers_.Remove(loc.fpu_reg());
     }
   }
 
@@ -504,36 +531,36 @@
 
   void MarkUntagged(Location loc) {
     ASSERT(loc.IsRegister());
-    untagged_cpu_registers_ |= (1 << loc.reg());
+    untagged_cpu_registers_.Add(loc.reg());
   }
 
   bool IsTagged(Register reg) const {
-    return (untagged_cpu_registers_ & (1 << reg)) == 0;
+    return !untagged_cpu_registers_.Contains(reg);
   }
 
   bool ContainsRegister(Register reg) const {
-    return Contains(cpu_registers_, reg);
+    return cpu_registers_.Contains(reg);
   }
 
   bool ContainsFpuRegister(FpuRegister fpu_reg) const {
-    return Contains(fpu_registers_, fpu_reg);
+    return fpu_registers_.Contains(fpu_reg);
   }
 
-  intptr_t CpuRegisterCount() const { return RegisterCount(cpu_registers_); }
-  intptr_t FpuRegisterCount() const { return RegisterCount(fpu_registers_); }
+  intptr_t CpuRegisterCount() const { return RegisterCount(cpu_registers()); }
+  intptr_t FpuRegisterCount() const { return RegisterCount(fpu_registers()); }
 
   static intptr_t RegisterCount(intptr_t registers);
   static bool Contains(intptr_t register_set, intptr_t reg) {
     return (register_set & (1 << reg)) != 0;
   }
 
-  intptr_t cpu_registers() const { return cpu_registers_; }
-  intptr_t fpu_registers() const { return fpu_registers_; }
+  intptr_t cpu_registers() const { return cpu_registers_.data(); }
+  intptr_t fpu_registers() const { return fpu_registers_.data(); }
 
  private:
-  intptr_t cpu_registers_;
-  intptr_t untagged_cpu_registers_;
-  intptr_t fpu_registers_;
+  SmallSet<Register> cpu_registers_;
+  SmallSet<Register> untagged_cpu_registers_;
+  SmallSet<FpuRegister> fpu_registers_;
 
   DISALLOW_COPY_AND_ASSIGN(RegisterSet);
 };
@@ -548,7 +575,7 @@
     kCallOnSlowPath
   };
 
-  LocationSummary(Isolate* isolate,
+  LocationSummary(Zone* zone,
                   intptr_t input_count,
                   intptr_t temp_count,
                   LocationSummary::ContainsCall contains_call);
@@ -645,7 +672,7 @@
 
   void PrintTo(BufferFormatter* f) const;
 
-  static LocationSummary* Make(Isolate* isolate,
+  static LocationSummary* Make(Zone* zone,
                                intptr_t input_count,
                                Location out,
                                ContainsCall contains_call);
diff --git a/runtime/vm/lockers.h b/runtime/vm/lockers.h
index 3a4f0b2..f3f5540 100644
--- a/runtime/vm/lockers.h
+++ b/runtime/vm/lockers.h
@@ -9,7 +9,7 @@
 #include "vm/allocation.h"
 #include "vm/globals.h"
 #include "vm/isolate.h"
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 
 namespace dart {
 
diff --git a/runtime/vm/message_handler.cc b/runtime/vm/message_handler.cc
index 741bbba..4a5ad31 100644
--- a/runtime/vm/message_handler.cc
+++ b/runtime/vm/message_handler.cc
@@ -137,6 +137,9 @@
 
 bool MessageHandler::HandleMessages(bool allow_normal_messages,
                                     bool allow_multiple_normal_messages) {
+  // If isolate() returns NULL StartIsolateScope does nothing.
+  StartIsolateScope start_isolate(isolate());
+
   // TODO(turnidge): Add assert that monitor_ is held here.
   bool result = true;
   Message::Priority min_priority = (allow_normal_messages && !paused()) ?
diff --git a/runtime/vm/message_handler.h b/runtime/vm/message_handler.h
index 93d2923..0e08377 100644
--- a/runtime/vm/message_handler.h
+++ b/runtime/vm/message_handler.h
@@ -7,7 +7,7 @@
 
 #include "vm/isolate.h"
 #include "vm/message.h"
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 #include "vm/thread_pool.h"
 
 namespace dart {
diff --git a/runtime/vm/message_handler_test.cc b/runtime/vm/message_handler_test.cc
index ccd476f..8132511 100644
--- a/runtime/vm/message_handler_test.cc
+++ b/runtime/vm/message_handler_test.cc
@@ -311,7 +311,7 @@
   info.handler = &handler;
   info.ports = ports;
   info.count = 10;
-  Thread::Start(SendMessages, reinterpret_cast<uword>(&info));
+  OSThread::Start(SendMessages, reinterpret_cast<uword>(&info));
   while (sleep < kMaxSleep && handler.message_count() < 11) {
     OS::Sleep(10);
     sleep += 10;
diff --git a/runtime/vm/method_recognizer.cc b/runtime/vm/method_recognizer.cc
index 84cd00a..fcfbdd6 100644
--- a/runtime/vm/method_recognizer.cc
+++ b/runtime/vm/method_recognizer.cc
@@ -50,7 +50,7 @@
     OS::PrintErr("Missing %s::%s\n", #class_name, #function_name);             \
     UNREACHABLE();                                                             \
   }                                                                            \
-  ASSERT(func.CheckSourceFingerprint(fp));                                     \
+  CHECK_FINGERPRINT3(func, class_name, function_name, enum_name, fp);          \
   func.set_recognized_kind(k##enum_name);
 
   RECOGNIZED_LIST(SET_RECOGNIZED_KIND);
@@ -61,7 +61,7 @@
     OS::PrintErr("Missing %s::%s\n", #class_name, #function_name);             \
     UNREACHABLE();                                                             \
   }                                                                            \
-  ASSERT(func.CheckSourceFingerprint(fp));                                     \
+  CHECK_FINGERPRINT3(func, class_name, function_name, dest, fp);               \
   func.setter(value);
 
 #define SET_IS_ALWAYS_INLINE(class_name, function_name, dest, fp)              \
diff --git a/runtime/vm/method_recognizer.h b/runtime/vm/method_recognizer.h
index 188fd4d..ba7d014 100644
--- a/runtime/vm/method_recognizer.h
+++ b/runtime/vm/method_recognizer.h
@@ -120,32 +120,32 @@
   V(_Int32x4, withFlagY, Int32x4WithFlagY, 1903359978)                         \
   V(_Int32x4, withFlagZ, Int32x4WithFlagZ, 862460960)                          \
   V(_Int32x4, withFlagW, Int32x4WithFlagW, 1095242907)                         \
-  V(_Float32Array, [], Float32ArrayGetIndexed, 1092936601)                     \
-  V(_Float32Array, []=, Float32ArraySetIndexed, 102284991)                     \
-  V(_Int8Array, [], Int8ArrayGetIndexed, 557513849)                            \
-  V(_Int8Array, []=, Int8ArraySetIndexed, 1135113150)                          \
-  V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 666955326)            \
-  V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 2053292453)          \
+  V(_Float32Array, [], Float32ArrayGetIndexed, 1535169225)                     \
+  V(_Float32Array, []=, Float32ArraySetIndexed, 626578817)                     \
+  V(_Int8Array, [], Int8ArrayGetIndexed, 138473967)                            \
+  V(_Int8Array, []=, Int8ArraySetIndexed, 1974948008)                          \
+  V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 900572864)            \
+  V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 1618616151)          \
   V(_ExternalUint8ClampedArray, [], ExternalUint8ClampedArrayGetIndexed,       \
-    1582819566)                                                                \
+    1375076880)                                                                \
   V(_ExternalUint8ClampedArray, []=, ExternalUint8ClampedArraySetIndexed,      \
-    879363679)                                                                 \
-  V(_Int16Array, [], Int16ArrayGetIndexed, 310411118)                          \
-  V(_Int16Array, []=, Int16ArraySetIndexed, 694766810)                         \
-  V(_Uint16Array, [], Uint16ArrayGetIndexed, 706695216)                        \
-  V(_Uint16Array, []=, Uint16ArraySetIndexed, 733443505)                       \
-  V(_Int32Array, [], Int32ArrayGetIndexed, 439384633)                          \
-  V(_Int32Array, []=, Int32ArraySetIndexed, 1570966684)                        \
-  V(_Uint32Array, [], Uint32ArrayGetIndexed, 1876956115)                       \
-  V(_Uint32Array, []=, Uint32ArraySetIndexed, 557491182)                       \
-  V(_Int64Array, [], Int64ArrayGetIndexed, 443139045)                          \
-  V(_Int64Array, []=, Int64ArraySetIndexed, 342796642)                         \
-  V(_Float32x4Array, [], Float32x4ArrayGetIndexed, 1702910322)                 \
-  V(_Float32x4Array, []=, Float32x4ArraySetIndexed, 157778603)                 \
-  V(_Int32x4Array, [], Int32x4ArrayGetIndexed, 1055075319)                     \
-  V(_Int32x4Array, []=, Int32x4ArraySetIndexed, 1185076213)                    \
-  V(_Float64x2Array, [], Float64x2ArrayGetIndexed, 524397755)                  \
-  V(_Float64x2Array, []=, Float64x2ArraySetIndexed, 1105348911)                \
+    1734046173)                                                                \
+  V(_Int16Array, [], Int16ArrayGetIndexed, 2007660358)                         \
+  V(_Int16Array, []=, Int16ArraySetIndexed, 1816201356)                        \
+  V(_Uint16Array, [], Uint16ArrayGetIndexed, 1089984866)                       \
+  V(_Uint16Array, []=, Uint16ArraySetIndexed, 1478733345)                      \
+  V(_Int32Array, [], Int32ArrayGetIndexed, 1705827339)                         \
+  V(_Int32Array, []=, Int32ArraySetIndexed, 42548988)                          \
+  V(_Uint32Array, [], Uint32ArrayGetIndexed, 1251606959)                       \
+  V(_Uint32Array, []=, Uint32ArraySetIndexed, 35369746)                        \
+  V(_Int64Array, [], Int64ArrayGetIndexed, 123397249)                          \
+  V(_Int64Array, []=, Int64ArraySetIndexed, 1286315154)                        \
+  V(_Float32x4Array, [], Float32x4ArrayGetIndexed, 1291435540)                 \
+  V(_Float32x4Array, []=, Float32x4ArraySetIndexed, 993794277)                 \
+  V(_Int32x4Array, [], Int32x4ArrayGetIndexed, 1120121805)                     \
+  V(_Int32x4Array, []=, Int32x4ArraySetIndexed, 900060207)                     \
+  V(_Float64x2Array, [], Float64x2ArrayGetIndexed, 408038297)                  \
+  V(_Float64x2Array, []=, Float64x2ArraySetIndexed, 1277140175)                \
   V(_Bigint, get:_neg, Bigint_getNeg, 1151543890)                              \
   V(_Bigint, get:_used, Bigint_getUsed, 1308559334)                            \
   V(_Bigint, get:_digits, Bigint_getDigits, 1408092463)                        \
@@ -273,12 +273,12 @@
   V(_Float64x2Array, ., TypedData_Float64x2Array_factory, 346534719)           \
 
 #define GRAPH_TYPED_DATA_INTRINSICS_LIST(V) \
-  V(_Uint8Array, [], Uint8ArrayGetIndexed, 252408403)                          \
-  V(_Uint8Array, []=, Uint8ArraySetIndexed, 1102579018)                        \
-  V(_ExternalUint8Array, [], ExternalUint8ArrayGetIndexed, 1915061214)         \
-  V(_ExternalUint8Array, []=, ExternalUint8ArraySetIndexed, 2992978)           \
-  V(_Float64Array, []=, Float64ArraySetIndexed, 407531405)                     \
-  V(_Float64Array, [], Float64ArrayGetIndexed, 2015337560)                     \
+  V(_Uint8Array, [], Uint8ArrayGetIndexed, 934520139)                          \
+  V(_Uint8Array, []=, Uint8ArraySetIndexed, 1193298978)                        \
+  V(_ExternalUint8Array, [], ExternalUint8ArrayGetIndexed, 937149728)          \
+  V(_ExternalUint8Array, []=, ExternalUint8ArraySetIndexed, 1465870106)        \
+  V(_Float64Array, []=, Float64ArraySetIndexed, 1400622753)                    \
+  V(_Float64Array, [], Float64ArrayGetIndexed, 1330768796)                     \
   V(_TypedList, get:length, TypedDataLength, 522595148)                        \
 
 #define GRAPH_CORE_INTRINSICS_LIST(V)                                          \
@@ -340,28 +340,48 @@
   V(_ImmutableList, [], ImmutableArrayGetIndexed, 1585504028)                  \
   V(_GrowableList, [], GrowableArrayGetIndexed, 514434920)                     \
   V(_GrowableList, []=, GrowableArraySetIndexed, 1698264861)                   \
-  V(_Float32Array, [], Float32ArrayGetIndexed, 1092936601)                     \
-  V(_Float32Array, []=, Float32ArraySetIndexed, 102284991)                     \
-  V(_Float64Array, [], Float64ArrayGetIndexed, 2015337560)                     \
-  V(_Float64Array, []=, Float64ArraySetIndexed, 407531405)                     \
-  V(_Int8Array, [], Int8ArrayGetIndexed, 557513849)                            \
-  V(_Int8Array, []=, Int8ArraySetIndexed, 1135113150)                          \
-  V(_Uint8Array, [], Uint8ArrayGetIndexed, 252408403)                          \
-  V(_Uint8Array, []=, Uint8ArraySetIndexed, 1102579018)                        \
-  V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 666955326)            \
-  V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 2053292453)          \
-  V(_Uint16Array, [], Uint16ArrayGetIndexed, 706695216)                        \
-  V(_Uint16Array, []=, Uint16ArraySetIndexed, 733443505)                       \
-  V(_Int16Array, [], Int16ArrayGetIndexed, 310411118)                          \
-  V(_Int16Array, []=, Int16ArraySetIndexed, 694766810)                         \
-  V(_Int32Array, [], Int32ArrayGetIndexed, 439384633)                          \
-  V(_Int32Array, []=, Int32ArraySetIndexed, 1570966684)                        \
-  V(_Int64Array, [], Int64ArrayGetIndexed, 443139045)                          \
-  V(_Int64Array, []=, Int64ArraySetIndexed, 342796642)                         \
-  V(_Uint8ArrayView, [], Uint8ArrayViewGetIndexed, 735017274)                  \
-  V(_Uint8ArrayView, []=, Uint8ArrayViewSetIndexed, 1913230218)                \
-  V(_Int8ArrayView, [], Int8ArrayViewGetIndexed, 1089555253)                   \
-  V(_Int8ArrayView, []=, Int8ArrayViewSetIndexed, 1088185083)                  \
+  V(_Float32Array, [], Float32ArrayGetIndexed, 1535169225)                     \
+  V(_Float32Array, []=, Float32ArraySetIndexed, 626578817)                     \
+  V(_Float64Array, [], Float64ArrayGetIndexed, 1330768796)                     \
+  V(_Float64Array, []=, Float64ArraySetIndexed, 1400622753)                    \
+  V(_Int8Array, [], Int8ArrayGetIndexed, 138473967)                            \
+  V(_Int8Array, []=, Int8ArraySetIndexed, 1974948008)                          \
+  V(_Uint8Array, [], Uint8ArrayGetIndexed, 934520139)                          \
+  V(_Uint8Array, []=, Uint8ArraySetIndexed, 1193298978)                        \
+  V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 900572864)            \
+  V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 1618616151)          \
+  V(_Uint16Array, [], Uint16ArrayGetIndexed, 1089984866)                       \
+  V(_Uint16Array, []=, Uint16ArraySetIndexed, 1478733345)                      \
+  V(_Int16Array, [], Int16ArrayGetIndexed, 2007660358)                         \
+  V(_Int16Array, []=, Int16ArraySetIndexed, 1816201356)                        \
+  V(_Int32Array, [], Int32ArrayGetIndexed, 1705827339)                         \
+  V(_Int32Array, []=, Int32ArraySetIndexed, 42548988)                          \
+  V(_Int64Array, [], Int64ArrayGetIndexed, 123397249)                          \
+  V(_Int64Array, []=, Int64ArraySetIndexed, 1286315154)                        \
+  V(_Uint8ArrayView, [], Uint8ArrayViewGetIndexed, 2146871134)                 \
+  V(_Uint8ArrayView, []=, Uint8ArrayViewSetIndexed, 1262816136)                \
+  V(_Int8ArrayView, [], Int8ArrayViewGetIndexed, 231994143)                    \
+  V(_Int8ArrayView, []=, Int8ArrayViewSetIndexed, 919877023)                   \
+  V(_ByteDataView, setInt8, ByteDataViewSetInt8, 809949404)                    \
+  V(_ByteDataView, setUint8, ByteDataViewSetUint8, 206282345)                  \
+  V(_ByteDataView, setInt16, ByteDataViewSetInt16, 989487799)                  \
+  V(_ByteDataView, setUint16, ByteDataViewSetUint16, 1118155962)               \
+  V(_ByteDataView, setInt32, ByteDataViewSetInt32, 1955213160)                 \
+  V(_ByteDataView, setUint32, ByteDataViewSetUint32, 284405389)                \
+  V(_ByteDataView, setInt64, ByteDataViewSetInt64, 486916661)                  \
+  V(_ByteDataView, setUint64, ByteDataViewSetUint64, 1432663320)               \
+  V(_ByteDataView, setFloat32, ByteDataViewSetFloat32, 733187060)              \
+  V(_ByteDataView, setFloat64, ByteDataViewSetFloat64, 1138577739)             \
+  V(_ByteDataView, getInt8, ByteDataViewGetInt8, 1383732403)                   \
+  V(_ByteDataView, getUint8, ByteDataViewGetUint8, 806641537)                  \
+  V(_ByteDataView, getInt16, ByteDataViewGetInt16, 76281079)                   \
+  V(_ByteDataView, getUint16, ByteDataViewGetUint16, 1136415701)               \
+  V(_ByteDataView, getInt32, ByteDataViewGetInt32, 865549439)                  \
+  V(_ByteDataView, getUint32, ByteDataViewGetUint32, 760435927)                \
+  V(_ByteDataView, getInt64, ByteDataViewGetInt64, 364361487)                  \
+  V(_ByteDataView, getUint64, ByteDataViewGetUint64, 565678407)                \
+  V(_ByteDataView, getFloat32, ByteDataViewGetFloat32, 924006540)              \
+  V(_ByteDataView, getFloat64, ByteDataViewGetFloat64, 1863927528)             \
   V(::, asin, MathASin, 1651042633)                                            \
   V(::, acos, MathACos, 1139647090)                                            \
   V(::, atan, MathATan, 1668754384)                                            \
@@ -440,6 +460,14 @@
   static void InitializeState();
 };
 
+
+#define CHECK_FINGERPRINT2(f, p0, p1, fp) \
+  ASSERT(f.CheckSourceFingerprint(#p0 ", " #p1, fp))
+
+#define CHECK_FINGERPRINT3(f, p0, p1, p2, fp) \
+  ASSERT(f.CheckSourceFingerprint(#p0 ", " #p1 ", " #p2, fp))
+
+
 }  // namespace dart
 
 #endif  // VM_METHOD_RECOGNIZER_H_
diff --git a/runtime/vm/native_symbol_win.cc b/runtime/vm/native_symbol_win.cc
index 459f376..09e5116 100644
--- a/runtime/vm/native_symbol_win.cc
+++ b/runtime/vm/native_symbol_win.cc
@@ -7,7 +7,7 @@
 
 #include "vm/lockers.h"
 #include "vm/native_symbol.h"
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 
 #include <dbghelp.h>  // NOLINT
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 4046022f..4a7eb49 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -73,7 +73,7 @@
 DECLARE_FLAG(bool, trace_compiler);
 DECLARE_FLAG(bool, trace_deoptimization);
 DECLARE_FLAG(bool, trace_deoptimization_verbose);
-DECLARE_FLAG(bool, verbose_stacktrace);
+DECLARE_FLAG(bool, show_invisible_frames);
 DECLARE_FLAG(charp, coverage_dir);
 DECLARE_FLAG(bool, write_protect_code);
 
@@ -160,98 +160,6 @@
 const double MegamorphicCache::kLoadFactor = 0.75;
 
 
-// The following functions are marked as invisible, meaning they will be hidden
-// in the stack trace and will be hidden from reflective access.
-// All mutators of canonical constants should be hidden from reflective access.
-// Additionally, private functions in dart:* that are native or constructors are
-// marked as invisible by the parser.
-#define INVISIBLE_CLASS_FUNCTIONS(V)                                           \
-  V(AsyncLibrary, _AsyncRun, _scheduleImmediate)                               \
-  V(CoreLibrary, StringBuffer, _addPart)                                       \
-  V(CoreLibrary, _Bigint, _ensureLength)                                       \
-  V(CoreLibrary, _Bigint, _clamp)                                              \
-  V(CoreLibrary, _Bigint, _absAdd)                                             \
-  V(CoreLibrary, _Bigint, _absSub)                                             \
-  V(CoreLibrary, _Bigint, _estQuotientDigit)                                   \
-  V(CoreLibrary, _Bigint, _mulAdd)                                             \
-  V(CoreLibrary, _Bigint, _sqrAdd)                                             \
-  V(CoreLibrary, _Double, _addFromInteger)                                     \
-  V(CoreLibrary, _Double, _moduloFromInteger)                                  \
-  V(CoreLibrary, _Double, _mulFromInteger)                                     \
-  V(CoreLibrary, _Double, _remainderFromInteger)                               \
-  V(CoreLibrary, _Double, _subFromInteger)                                     \
-  V(CoreLibrary, _Double, _truncDivFromInteger)                                \
-  V(CoreLibrary, _Montgomery, _mulMod)                                         \
-  V(CoreLibrary, int, _parse)                                                  \
-  V(CoreLibrary, int, _throwFormatException)                                   \
-
-
-#define INVISIBLE_LIBRARY_FUNCTIONS(V)                                         \
-  V(AsyncLibrary, _asyncRunCallback)                                           \
-  V(AsyncLibrary, _rootHandleUncaughtError)                                    \
-  V(AsyncLibrary, _scheduleAsyncCallback)                                      \
-  V(AsyncLibrary, _schedulePriorityAsyncCallback)                              \
-  V(AsyncLibrary, _setScheduleImmediateClosure)                                \
-  V(AsyncLibrary, _setTimerFactoryClosure)                                     \
-  V(IsolateLibrary, _isolateScheduleImmediate)                                 \
-  V(IsolateLibrary, _startIsolate)                                             \
-  V(IsolateLibrary, _startMainIsolate)                                         \
-  V(MirrorsLibrary, _n)                                                        \
-  V(MirrorsLibrary, _s)                                                        \
-  V(TypedDataLibrary, _toInt16)                                                \
-  V(TypedDataLibrary, _toInt32)                                                \
-  V(TypedDataLibrary, _toInt64)                                                \
-  V(TypedDataLibrary, _toInt8)                                                 \
-  V(TypedDataLibrary, _toUint16)                                               \
-  V(TypedDataLibrary, _toUint32)                                               \
-  V(TypedDataLibrary, _toUint64)                                               \
-  V(TypedDataLibrary, _toUint8)                                                \
-
-
-static void MarkClassFunctionAsInvisible(const Library& lib,
-                                         const char* class_name,
-                                         const char* function_name) {
-  ASSERT(!lib.IsNull());
-  const Class& cls = Class::Handle(
-      lib.LookupClassAllowPrivate(String::Handle(String::New(class_name))));
-  ASSERT(!cls.IsNull());
-  const Function& function =
-      Function::Handle(
-          cls.LookupFunctionAllowPrivate(
-              String::Handle(String::New(function_name))));
-  ASSERT(!function.IsNull());
-  function.set_is_visible(false);
-}
-
-static void MarkLibraryFunctionAsInvisible(const Library& lib,
-                                           const char* function_name) {
-  ASSERT(!lib.IsNull());
-  const Function& function =
-      Function::Handle(
-          lib.LookupFunctionAllowPrivate(
-              String::Handle(String::New(function_name))));
-  ASSERT(!function.IsNull());
-  function.set_is_visible(false);
-}
-
-
-static void MarkInvisibleFunctions() {
-#define MARK_FUNCTION(lib, class_name, function_name)                          \
-  MarkClassFunctionAsInvisible(Library::Handle(Library::lib()),                \
-      #class_name, #function_name);                                            \
-
-INVISIBLE_CLASS_FUNCTIONS(MARK_FUNCTION)
-#undef MARK_FUNCTION
-
-#define MARK_FUNCTION(lib, function_name)                                      \
-  MarkLibraryFunctionAsInvisible(Library::Handle(Library::lib()),              \
-      #function_name);                                                         \
-
-INVISIBLE_LIBRARY_FUNCTIONS(MARK_FUNCTION)
-#undef MARK_FUNCTION
-}
-
-
 // Takes a vm internal name and makes it suitable for external user.
 //
 // Examples:
@@ -1491,7 +1399,6 @@
   }
 
   ClassFinalizer::VerifyBootstrapClasses();
-  MarkInvisibleFunctions();
 
   // Set up the intrinsic state of all functions (core, math and typed data).
   Intrinsifier::InitializeState();
@@ -2673,7 +2580,7 @@
   }
   invocation.set_result_type(Type::Handle(Type::DynamicType()));
   invocation.set_is_debuggable(false);
-  invocation.set_is_visible(false);  // Not visible in stack trace.
+  invocation.set_is_reflectable(false);
   invocation.set_saved_args_desc(args_desc);
 
   return invocation.raw();
@@ -6200,7 +6107,7 @@
   result.set_is_abstract(is_abstract);
   result.set_is_external(is_external);
   result.set_is_native(is_native);
-  result.set_is_visible(true);  // Will be computed later.
+  result.set_is_reflectable(true);  // Will be computed later.
   result.set_is_debuggable(true);  // Will be computed later.
   result.set_is_intrinsic(false);
   result.set_is_redirecting(false);
@@ -6752,7 +6659,7 @@
 }
 
 
-bool Function::CheckSourceFingerprint(int32_t fp) const {
+bool Function::CheckSourceFingerprint(const char* prefix, int32_t fp) const {
   if (SourceFingerprint() != fp) {
     const bool recalculatingFingerprints = false;
     if (recalculatingFingerprints) {
@@ -6760,7 +6667,8 @@
       // to replace the old values.
       // sed -i .bak -f /tmp/newkeys runtime/vm/method_recognizer.h
       // sed -i .bak -f /tmp/newkeys runtime/vm/flow_graph_builder.h
-      OS::Print("s/%d/%d/\n", fp, SourceFingerprint());
+      OS::Print("s/V(%s, %d)/V(%s, %d)/\n",
+                prefix, fp, prefix, SourceFingerprint());
     } else {
       OS::Print("FP mismatch while recognizing method %s:"
                 " expecting %d found %d\n",
@@ -10435,14 +10343,6 @@
 }
 
 
-struct FpDiff {
-  FpDiff(int32_t old_, int32_t new_): old_fp(old_), new_fp(new_) {}
-  int32_t old_fp;
-  int32_t new_fp;
-};
-
-
-
 // Return Function::null() if function does not exist in libs.
 RawFunction* Library::GetFunction(const GrowableArray<Library*>& libs,
                                   const char* class_name,
@@ -10476,7 +10376,6 @@
 
 
 void Library::CheckFunctionFingerprints() {
-  GrowableArray<FpDiff> collected_fp_diffs;
   GrowableArray<Library*> all_libs;
   Function& func = Function::Handle();
   bool has_errors = false;
@@ -10486,11 +10385,8 @@
   if (func.IsNull()) {                                                         \
     has_errors = true;                                                         \
     OS::Print("Function not found %s.%s\n", #class_name, #function_name);      \
-  } else if (func.SourceFingerprint() != fp) {                                 \
-    has_errors = true;                                                         \
-    OS::Print("Wrong fingerprint for '%s': expecting %d found %d\n",           \
-        func.ToFullyQualifiedCString(), fp, func.SourceFingerprint());         \
-    collected_fp_diffs.Add(FpDiff(fp, func.SourceFingerprint()));              \
+  } else {                                                                     \
+    CHECK_FINGERPRINT3(func, class_name, function_name, dest, fp);             \
   }                                                                            \
 
   all_libs.Add(&Library::ZoneHandle(Library::CoreLibrary()));
@@ -10527,11 +10423,8 @@
     has_errors = true;                                                         \
     OS::Print("Function not found %s.%s\n", cls.ToCString(),                   \
         Symbols::factory_symbol().ToCString());                                \
-  } else if (func.SourceFingerprint() != fp) {                                 \
-    has_errors = true;                                                         \
-    OS::Print("Wrong fingerprint for '%s': expecting %d found %d\n",           \
-        func.ToFullyQualifiedCString(), fp, func.SourceFingerprint());         \
-    collected_fp_diffs.Add(FpDiff(fp, func.SourceFingerprint()));              \
+  } else {                                                                     \
+    CHECK_FINGERPRINT2(func, factory_symbol, cid, fp);                         \
   }                                                                            \
 
   RECOGNIZED_LIST_FACTORY_LIST(CHECK_FACTORY_FINGERPRINTS);
@@ -10539,11 +10432,6 @@
 #undef CHECK_FACTORY_FINGERPRINTS
 
   if (has_errors) {
-    for (intptr_t i = 0; i < collected_fp_diffs.length(); i++) {
-      OS::Print("s/%d/%d/\n",
-          collected_fp_diffs[i].old_fp, collected_fp_diffs[i].new_fp);
-    }
-    OS::Print("\n");
     FATAL("Fingerprint mismatch.");
   }
 }
@@ -10666,7 +10554,7 @@
     Iterator iter(*this, RawPcDescriptors::kAnyKind);
     while (iter.MoveNext()) {
       len += OS::SNPrint(NULL, 0, kFormat, addr_width,
-                         iter.Pc(),
+                         iter.PcOffset(),
                          KindAsStr(iter.Kind()),
                          iter.DeoptId(),
                          iter.TokenPos(),
@@ -10680,7 +10568,7 @@
   Iterator iter(*this, RawPcDescriptors::kAnyKind);
   while (iter.MoveNext()) {
     index += OS::SNPrint((buffer + index), (len - index), kFormat, addr_width,
-                         iter.Pc(),
+                         iter.PcOffset(),
                          KindAsStr(iter.Kind()),
                          iter.DeoptId(),
                          iter.TokenPos(),
@@ -10707,7 +10595,7 @@
   Iterator iter(*this, RawPcDescriptors::kAnyKind);
   while (iter.MoveNext()) {
     JSONObject descriptor(&members);
-    descriptor.AddPropertyF("pc", "%" Px "", iter.Pc());
+    descriptor.AddPropertyF("pcOffset", "%" Px "", iter.PcOffset());
     descriptor.AddProperty("kind", KindAsStr(iter.Kind()));
     descriptor.AddProperty("deoptId", iter.DeoptId());
     descriptor.AddProperty("tokenPos", iter.TokenPos());
@@ -10762,15 +10650,6 @@
 }
 
 
-uword PcDescriptors::GetPcForKind(RawPcDescriptors::Kind kind) const {
-  Iterator iter(*this, kind);
-  if (iter.MoveNext()) {
-    return iter.Pc();
-  }
-  return 0;
-}
-
-
 bool Stackmap::GetBit(intptr_t bit_index) const {
   ASSERT(InRange(bit_index));
   int byte_index = bit_index >> kBitsPerByteLog2;
@@ -11062,7 +10941,7 @@
 
 void ExceptionHandlers::SetHandlerInfo(intptr_t try_index,
                                        intptr_t outer_try_index,
-                                       intptr_t handler_pc,
+                                       uword handler_pc_offset,
                                        bool needs_stacktrace,
                                        bool has_catch_all) const {
   ASSERT((try_index >= 0) && (try_index < num_entries()));
@@ -11070,7 +10949,11 @@
   RawExceptionHandlers::HandlerInfo* info =
       UnsafeMutableNonPointer(&raw_ptr()->data()[try_index]);
   info->outer_try_index = outer_try_index;
-  info->handler_pc = handler_pc;
+  // Some C compilers warn about the comparison always being true when using <=
+  // due to limited range of data type.
+  ASSERT((handler_pc_offset == static_cast<uword>(kMaxUint32)) ||
+         (handler_pc_offset < static_cast<uword>(kMaxUint32)));
+  info->handler_pc_offset = handler_pc_offset;
   info->needs_stacktrace = needs_stacktrace;
   info->has_catch_all = has_catch_all;
 }
@@ -11084,9 +10967,9 @@
 }
 
 
-intptr_t ExceptionHandlers::HandlerPC(intptr_t try_index) const {
+uword ExceptionHandlers::HandlerPCOffset(intptr_t try_index) const {
   ASSERT((try_index >= 0) && (try_index < num_entries()));
-  return raw_ptr()->data()[try_index].handler_pc;
+  return raw_ptr()->data()[try_index].handler_pc_offset;
 }
 
 
@@ -11174,7 +11057,7 @@
     const intptr_t num_types = handled_types.Length();
     len += OS::SNPrint(NULL, 0, kFormat,
                        i,
-                       info.handler_pc,
+                       info.handler_pc_offset,
                        num_types,
                        info.outer_try_index);
     for (int k = 0; k < num_types; k++) {
@@ -11195,7 +11078,7 @@
                              (len - num_chars),
                              kFormat,
                              i,
-                             info.handler_pc,
+                             info.handler_pc_offset,
                              num_types,
                              info.outer_try_index);
     for (int k = 0; k < num_types; k++) {
@@ -12458,10 +12341,11 @@
 
 
 intptr_t Code::GetTokenIndexOfPC(uword pc) const {
+  uword pc_offset = pc - EntryPoint();
   const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
   PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
   while (iter.MoveNext()) {
-    if (iter.Pc() == pc) {
+    if (iter.PcOffset() == pc_offset) {
       return iter.TokenPos();
     }
   }
@@ -12475,7 +12359,8 @@
   PcDescriptors::Iterator iter(descriptors, kind);
   while (iter.MoveNext()) {
     if (iter.DeoptId() == deopt_id) {
-      uword pc = iter.Pc();
+      uword pc_offset = iter.PcOffset();
+      uword pc = EntryPoint() + pc_offset;
       ASSERT(ContainsInstructionAt(pc));
       return pc;
     }
@@ -12485,10 +12370,11 @@
 
 
 intptr_t Code::GetDeoptIdForOsr(uword pc) const {
+  uword pc_offset = pc - EntryPoint();
   const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
   PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kOsrEntry);
   while (iter.MoveNext()) {
-    if (iter.Pc() == pc) {
+    if (iter.PcOffset() == pc_offset) {
       return iter.DeoptId();
     }
   }
@@ -20262,7 +20148,7 @@
         OS::SNPrint(chars, truncated_len, "%s", kTruncated);
         frame_strings.Add(chars);
       }
-    } else if (function.is_visible() || FLAG_verbose_stacktrace) {
+    } else if (function.is_debuggable() || FLAG_show_invisible_frames) {
       code = CodeAtFrame(i);
       ASSERT(function.raw() == code.function());
       uword pc = code.EntryPoint() + Smi::Value(PcOffsetAtFrame(i));
@@ -20271,7 +20157,7 @@
         for (InlinedFunctionsIterator it(code, pc);
              !it.Done() && (*frame_index < max_frames); it.Advance()) {
           function = it.function();
-          if (function.is_visible() || FLAG_verbose_stacktrace) {
+          if (function.is_debuggable() || FLAG_show_invisible_frames) {
             code = it.code();
             ASSERT(function.raw() == code.function());
             uword pc = it.pc();
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 9adf134..bbded40 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -21,6 +21,7 @@
 #include "vm/report.h"
 #include "vm/scanner.h"
 #include "vm/tags.h"
+#include "vm/thread.h"
 #include "vm/verified_memory.h"
 
 namespace dart {
@@ -59,24 +60,32 @@
  public:  /* NOLINT */                                                         \
   Raw##object* raw() const { return reinterpret_cast<Raw##object*>(raw_); }    \
   bool Is##object() const { return true; }                                     \
-  static object& Handle(Isolate* isolate, Raw##object* raw_ptr) {              \
+  static object& Handle(Zone* zone, Raw##object* raw_ptr) {                    \
     object* obj =                                                              \
-        reinterpret_cast<object*>(VMHandles::AllocateHandle(isolate));         \
+      reinterpret_cast<object*>(VMHandles::AllocateHandle(zone));              \
     initializeHandle(obj, raw_ptr);                                            \
     return *obj;                                                               \
   }                                                                            \
-  static object& Handle() {                                                    \
-    return Handle(Isolate::Current(), object::null());                         \
+  /* DEPRECATED: Use Zone version. */                                          \
+  static object& Handle(Isolate* isolate, Raw##object* raw_ptr) {              \
+    return Handle(isolate->current_zone(), raw_ptr);                           \
   }                                                                            \
+  static object& Handle() {                                                    \
+    return Handle(Thread::Current()->zone(), object::null());                  \
+  }                                                                            \
+  static object& Handle(Zone* zone) {                                          \
+    return Handle(zone, object::null());                                       \
+  }                                                                            \
+  /* DEPRECATED: Use Zone version. */                                          \
   static object& Handle(Isolate* isolate) {                                    \
-    return Handle(isolate, object::null());                                    \
+    return Handle(isolate->current_zone(), object::null());                    \
   }                                                                            \
   static object& Handle(Raw##object* raw_ptr) {                                \
-    return Handle(Isolate::Current(), raw_ptr);                                \
+    return Handle(Thread::Current()->zone(), raw_ptr);                         \
   }                                                                            \
-  static object& CheckedHandle(Isolate* isolate, RawObject* raw_ptr) {         \
+  static object& CheckedHandle(Zone* zone, RawObject* raw_ptr) {               \
     object* obj =                                                              \
-        reinterpret_cast<object*>(VMHandles::AllocateHandle(isolate));         \
+        reinterpret_cast<object*>(VMHandles::AllocateHandle(zone));            \
     initializeHandle(obj, raw_ptr);                                            \
     if (!obj->Is##object()) {                                                  \
       FATAL2("Handle check failed: saw %s expected %s",                        \
@@ -84,33 +93,45 @@
     }                                                                          \
     return *obj;                                                               \
   }                                                                            \
-  static object& CheckedHandle(RawObject* raw_ptr) {                           \
-    return CheckedHandle(Isolate::Current(), raw_ptr);                         \
+  /* DEPRECATED: Use Zone version. */                                          \
+  static object& CheckedHandle(Isolate* isolate, RawObject* raw_ptr) {         \
+    return CheckedHandle(isolate->current_zone(), raw_ptr);                    \
   }                                                                            \
-  static object& ZoneHandle(Isolate* isolate, Raw##object* raw_ptr) {          \
+  static object& CheckedHandle(RawObject* raw_ptr) {                           \
+    return CheckedHandle(Thread::Current()->zone(), raw_ptr);                  \
+  }                                                                            \
+  static object& ZoneHandle(Zone* zone, Raw##object* raw_ptr) {                \
     object* obj = reinterpret_cast<object*>(                                   \
-        VMHandles::AllocateZoneHandle(isolate));                               \
+        VMHandles::AllocateZoneHandle(zone));                                  \
     initializeHandle(obj, raw_ptr);                                            \
     return *obj;                                                               \
   }                                                                            \
+  /* DEPRECATED: Use Zone version. */                                          \
+  static object& ZoneHandle(Isolate* isolate, Raw##object* raw_ptr) {          \
+    return ZoneHandle(isolate->current_zone(), raw_ptr);                       \
+  }                                                                            \
   static object* ReadOnlyHandle() {                                            \
     object* obj = reinterpret_cast<object*>(                                   \
         Dart::AllocateReadOnlyHandle());                                       \
     initializeHandle(obj, object::null());                                     \
     return obj;                                                                \
   }                                                                            \
+  static object& ZoneHandle(Zone* zone) {                                      \
+    return ZoneHandle(zone, object::null());                                   \
+  }                                                                            \
+  /* DEPRECATED: Use Zone version. */                                          \
   static object& ZoneHandle(Isolate* isolate) {                                \
-    return ZoneHandle(isolate, object::null());                                \
+    return ZoneHandle(isolate->current_zone(), object::null());                \
   }                                                                            \
   static object& ZoneHandle() {                                                \
-    return ZoneHandle(Isolate::Current(), object::null());                     \
+    return ZoneHandle(Thread::Current()->zone(), object::null());              \
   }                                                                            \
   static object& ZoneHandle(Raw##object* raw_ptr) {                            \
-    return ZoneHandle(Isolate::Current(), raw_ptr);                            \
+    return ZoneHandle(Thread::Current()->zone(), raw_ptr);                     \
   }                                                                            \
-  static object& CheckedZoneHandle(Isolate* isolate, RawObject* raw_ptr) {     \
+  static object& CheckedZoneHandle(Zone* zone, RawObject* raw_ptr) {           \
     object* obj = reinterpret_cast<object*>(                                   \
-        VMHandles::AllocateZoneHandle(isolate));                               \
+        VMHandles::AllocateZoneHandle(zone));                                  \
     initializeHandle(obj, raw_ptr);                                            \
     if (!obj->Is##object()) {                                                  \
       FATAL2("Handle check failed: saw %s expected %s",                        \
@@ -119,7 +140,7 @@
     return *obj;                                                               \
   }                                                                            \
   static object& CheckedZoneHandle(RawObject* raw_ptr) {                       \
-    return CheckedZoneHandle(Isolate::Current(), raw_ptr);                     \
+    return CheckedZoneHandle(Thread::Current()->zone(), raw_ptr);              \
   }                                                                            \
   /* T::Cast cannot be applied to a null Object, because the object vtable */  \
   /* is not setup for type T, although some methods are supposed to work   */  \
@@ -321,11 +342,15 @@
 
   bool IsNotTemporaryScopedHandle() const;
 
-  static Object& Handle(Isolate* isolate, RawObject* raw_ptr) {
-    Object* obj = reinterpret_cast<Object*>(VMHandles::AllocateHandle(isolate));
+  static Object& Handle(Zone* zone, RawObject* raw_ptr) {
+    Object* obj = reinterpret_cast<Object*>(VMHandles::AllocateHandle(zone));
     initializeHandle(obj, raw_ptr);
     return *obj;
   }
+  // DEPRECATED: Use Zone version.
+  static Object& Handle(Isolate* isolate, RawObject* raw_ptr) {
+    return Handle(isolate->current_zone(), raw_ptr);
+  }
   static Object* ReadOnlyHandle() {
     Object* obj = reinterpret_cast<Object*>(
         Dart::AllocateReadOnlyHandle());
@@ -337,8 +362,12 @@
     return Handle(Isolate::Current(), null_);
   }
 
+  static Object& Handle(Zone* zone) {
+    return Handle(zone, null_);
+  }
+  // DEPRECATED: Use Zone version.
   static Object& Handle(Isolate* isolate) {
-    return Handle(isolate, null_);
+    return Handle(isolate->current_zone(), null_);
   }
 
   static Object& Handle(RawObject* raw_ptr) {
@@ -347,7 +376,7 @@
 
   static Object& ZoneHandle(Isolate* isolate, RawObject* raw_ptr) {
     Object* obj = reinterpret_cast<Object*>(
-        VMHandles::AllocateZoneHandle(isolate));
+        VMHandles::AllocateZoneHandle(isolate->current_zone()));
     initializeHandle(obj, raw_ptr);
     return *obj;
   }
@@ -805,8 +834,8 @@
     raw_ = value;
   }
   static PassiveObject& Handle(Isolate* I, RawObject* raw_ptr) {
-    PassiveObject* obj =
-        reinterpret_cast<PassiveObject*>(VMHandles::AllocateHandle(I));
+    PassiveObject* obj = reinterpret_cast<PassiveObject*>(
+        VMHandles::AllocateHandle(I->current_zone()));
     obj->raw_ = raw_ptr;
     obj->set_vtable(0);
     return *obj;
@@ -817,12 +846,16 @@
   static PassiveObject& Handle() {
     return Handle(Isolate::Current(), Object::null());
   }
+  // DEPRECATED
+  // TODO(koda): Add Zone version.
   static PassiveObject& Handle(Isolate* I) {
     return Handle(I, Object::null());
   }
+  // DEPRECATED
+  // TODO(koda): Add Zone version.
   static PassiveObject& ZoneHandle(Isolate* I, RawObject* raw_ptr) {
     PassiveObject* obj = reinterpret_cast<PassiveObject*>(
-        VMHandles::AllocateZoneHandle(I));
+        VMHandles::AllocateZoneHandle(I->current_zone()));
     obj->raw_ = raw_ptr;
     obj->set_vtable(0);
     return *obj;
@@ -833,6 +866,8 @@
   static PassiveObject& ZoneHandle() {
     return ZoneHandle(Isolate::Current(), Object::null());
   }
+  // DEPRECATED
+  // TODO(koda): Add Zone version.
   static PassiveObject& ZoneHandle(Isolate* I) {
     return ZoneHandle(I, Object::null());
   }
@@ -2152,7 +2187,7 @@
   int32_t SourceFingerprint() const;
 
   // Return false and report an error if the fingerprint does not match.
-  bool CheckSourceFingerprint(int32_t fp) const;
+  bool CheckSourceFingerprint(const char* prefix, int32_t fp) const;
 
   // Works with map [deopt-id] -> ICData.
   void SaveICDataMap(
@@ -2169,11 +2204,32 @@
 
   void set_modifier(RawFunction::AsyncModifier value) const;
 
+  // static: Considered during class-side or top-level resolution rather than
+  //         instance-side resolution.
+  // const: Valid target of a const constructor call.
+  // abstract: Skipped during instance-side resolution.
+  // reflectable: Enumerated by mirrors, invocable by mirrors. False for private
+  //              functions of dart: libraries.
+  // debuggable: Valid location of a break point. True for functions with source
+  //             code; false for synthetic functions such as dispatchers. Also
+  //             used to decide whether to include a frame in stack traces.
+  // optimizable: Candidate for going through the optimizing compiler. False for
+  //              some functions known to be execute infrequently and functions
+  //              which have been de-optimized too many times.
+  // instrinsic: Has a hand-written assembly prologue.
+  // inlinable: Candidate for inlining. False for functions with features we
+  //            don't support during inlining (e.g., optional parameters),
+  //            functions which are too big, etc.
+  // native: Bridge to C/C++ code.
+  // redirecting: Redirecting generative or factory constructor.
+  // external: Just a declaration that expects to be defined in another patch
+  //           file.
+
 #define FOR_EACH_FUNCTION_KIND_BIT(V)                                          \
   V(Static, is_static)                                                         \
   V(Const, is_const)                                                           \
   V(Abstract, is_abstract)                                                     \
-  V(Visible, is_visible)                                                       \
+  V(Reflectable, is_reflectable)                                               \
   V(Debuggable, is_debuggable)                                                 \
   V(Optimizable, is_optimizable)                                               \
   V(Inlinable, is_inlinable)                                                   \
@@ -3182,14 +3238,14 @@
 class PcDescriptors : public Object {
  public:
   void AddDescriptor(intptr_t index,
-                     uword pc,
+                     uword pc_offset,
                      RawPcDescriptors::Kind kind,
                      int64_t deopt_id,
                      int64_t token_pos,  // Or deopt reason.
                      intptr_t try_index) const {  // Or deopt index.
     NoGCScope no_gc;
     RawPcDescriptors::PcDescriptorRec* rec = recAt(index);
-    rec->set_pc(pc);
+    rec->set_pc_offset(pc_offset);
     rec->set_kind(kind);
     ASSERT(Utils::IsInt(32, deopt_id));
     rec->set_deopt_id(static_cast<int32_t>(deopt_id));
@@ -3219,9 +3275,6 @@
 
   static RawPcDescriptors* New(intptr_t num_descriptors, bool has_try_index);
 
-  // Returns 0 if not found.
-  uword GetPcForKind(RawPcDescriptors::Kind kind) const;
-
   // Verify (assert) assumptions about pc descriptors in debug mode.
   void Verify(const Function& function) const;
 
@@ -3253,9 +3306,9 @@
       }
     }
 
-    uword Pc() const {
+    uword PcOffset() const {
       NoGCScope no_gc;
-      return descriptors_.recAt(current_ix_)->pc();
+      return descriptors_.recAt(current_ix_)->pc_offset();
     }
     intptr_t DeoptId() const {
       NoGCScope no_gc;
@@ -3393,13 +3446,13 @@
   void GetHandlerInfo(intptr_t try_index,
                       RawExceptionHandlers::HandlerInfo* info) const;
 
-  intptr_t HandlerPC(intptr_t try_index) const;
+  uword HandlerPCOffset(intptr_t try_index) const;
   intptr_t OuterTryIndex(intptr_t try_index) const;
   bool NeedsStacktrace(intptr_t try_index) const;
 
   void SetHandlerInfo(intptr_t try_index,
                       intptr_t outer_try_index,
-                      intptr_t handler_pc,
+                      uword handler_pc_offset,
                       bool needs_stacktrace,
                       bool has_catch_all) const;
 
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 8368a85..df9a50c 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -2733,10 +2733,10 @@
   exception_handlers ^= ExceptionHandlers::New(kNumEntries);
   const bool kNeedsStacktrace = true;
   const bool kNoStacktrace = false;
-  exception_handlers.SetHandlerInfo(0, -1, 20, kNeedsStacktrace, false);
-  exception_handlers.SetHandlerInfo(1, 0, 30, kNeedsStacktrace, false);
-  exception_handlers.SetHandlerInfo(2, -1, 40, kNoStacktrace, true);
-  exception_handlers.SetHandlerInfo(3, 1, 150, kNoStacktrace, true);
+  exception_handlers.SetHandlerInfo(0, -1, 20u, kNeedsStacktrace, false);
+  exception_handlers.SetHandlerInfo(1, 0, 30u, kNeedsStacktrace, false);
+  exception_handlers.SetHandlerInfo(2, -1, 40u, kNoStacktrace, true);
+  exception_handlers.SetHandlerInfo(3, 1, 150u, kNoStacktrace, true);
 
   extern void GenerateIncrement(Assembler* assembler);
   Assembler _assembler_;
@@ -2753,12 +2753,12 @@
   handlers.GetHandlerInfo(0, &info);
   EXPECT_EQ(-1, handlers.OuterTryIndex(0));
   EXPECT_EQ(-1, info.outer_try_index);
-  EXPECT_EQ(20, handlers.HandlerPC(0));
+  EXPECT_EQ(20u, handlers.HandlerPCOffset(0));
   EXPECT(handlers.NeedsStacktrace(0));
   EXPECT(!handlers.HasCatchAll(0));
-  EXPECT_EQ(20, info.handler_pc);
+  EXPECT_EQ(20u, info.handler_pc_offset);
   EXPECT_EQ(1, handlers.OuterTryIndex(3));
-  EXPECT_EQ(150, handlers.HandlerPC(3));
+  EXPECT_EQ(150u, handlers.HandlerPCOffset(3));
   EXPECT(!handlers.NeedsStacktrace(3));
   EXPECT(handlers.HasCatchAll(3));
 }
@@ -2790,7 +2790,7 @@
   EXPECT_EQ(true, iter.MoveNext());
   EXPECT_EQ(20, iter.TokenPos());
   EXPECT_EQ(1, iter.TryIndex());
-  EXPECT_EQ(static_cast<uword>(10), iter.Pc());
+  EXPECT_EQ(static_cast<uword>(10), iter.PcOffset());
   EXPECT_EQ(1, iter.DeoptId());
   EXPECT_EQ(RawPcDescriptors::kOther, iter.Kind());
 
@@ -2811,7 +2811,7 @@
   EXPECT_EQ(150, iter.TokenPos());
 
   EXPECT_EQ(3, iter.TryIndex());
-  EXPECT_EQ(static_cast<uword>(80), iter.Pc());
+  EXPECT_EQ(static_cast<uword>(80), iter.PcOffset());
   EXPECT_EQ(150, iter.TokenPos());
   EXPECT_EQ(RawPcDescriptors::kOther, iter.Kind());
 
@@ -2844,7 +2844,7 @@
   PcDescriptors::Iterator iter(pc_descs, RawPcDescriptors::kAnyKind);
 
   EXPECT_EQ(true, iter.MoveNext());
-  EXPECT_EQ(static_cast<uword>(10), iter.Pc());
+  EXPECT_EQ(static_cast<uword>(10), iter.PcOffset());
   EXPECT_EQ(-1, iter.TryIndex());
   EXPECT_EQ(1, iter.DeoptId());
   EXPECT_EQ(20, iter.TokenPos());
@@ -2856,7 +2856,7 @@
   EXPECT_EQ(true, iter.MoveNext());
 
   EXPECT_EQ(-1, iter.TryIndex());
-  EXPECT_EQ(static_cast<uword>(80), iter.Pc());
+  EXPECT_EQ(static_cast<uword>(80), iter.PcOffset());
   EXPECT_EQ(150, iter.TokenPos());
 
   EXPECT_EQ(false, iter.MoveNext());
diff --git a/runtime/vm/os_linux.cc b/runtime/vm/os_linux.cc
index 7a31892..3d513ec 100644
--- a/runtime/vm/os_linux.cc
+++ b/runtime/vm/os_linux.cc
@@ -25,7 +25,7 @@
 #include "vm/debuginfo.h"
 #include "vm/isolate.h"
 #include "vm/lockers.h"
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 #include "vm/vtune.h"
 #include "vm/zone.h"
 
diff --git a/runtime/vm/os_thread.h b/runtime/vm/os_thread.h
new file mode 100644
index 0000000..457f06e
--- /dev/null
+++ b/runtime/vm/os_thread.h
@@ -0,0 +1,112 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef VM_OS_THREAD_H_
+#define VM_OS_THREAD_H_
+
+#include "platform/globals.h"
+#include "vm/allocation.h"
+
+// Declare the OS-specific types ahead of defining the generic classes.
+#if defined(TARGET_OS_ANDROID)
+#include "vm/os_thread_android.h"
+#elif defined(TARGET_OS_LINUX)
+#include "vm/os_thread_linux.h"
+#elif defined(TARGET_OS_MACOS)
+#include "vm/os_thread_macos.h"
+#elif defined(TARGET_OS_WINDOWS)
+#include "vm/os_thread_win.h"
+#else
+#error Unknown target os.
+#endif
+
+namespace dart {
+
+class Isolate;
+
+// Low-level operations on OS platform threads.
+class OSThread : AllStatic {
+ public:
+  static ThreadLocalKey kUnsetThreadLocalKey;
+  static ThreadId kInvalidThreadId;
+
+  typedef void (*ThreadStartFunction) (uword parameter);
+
+  // Start a thread running the specified function. Returns 0 if the
+  // thread started successfuly and a system specific error code if
+  // the thread failed to start.
+  static int Start(ThreadStartFunction function, uword parameters);
+
+  static ThreadLocalKey CreateThreadLocal();
+  static void DeleteThreadLocal(ThreadLocalKey key);
+  static uword GetThreadLocal(ThreadLocalKey key) {
+    return ThreadInlineImpl::GetThreadLocal(key);
+  }
+  static void SetThreadLocal(ThreadLocalKey key, uword value);
+  static intptr_t GetMaxStackSize();
+  static ThreadId GetCurrentThreadId();
+  static bool Join(ThreadId id);
+  static intptr_t ThreadIdToIntPtr(ThreadId id);
+  static bool Compare(ThreadId a, ThreadId b);
+  static void GetThreadCpuUsage(ThreadId thread_id, int64_t* cpu_usage);
+};
+
+
+class Mutex {
+ public:
+  Mutex();
+  ~Mutex();
+
+  void Lock();
+  bool TryLock();
+  void Unlock();
+
+#if defined(DEBUG)
+  Isolate* Owner() const { return owner_; }
+#endif  // defined(DEBUG)
+
+ private:
+  MutexData data_;
+#if defined(DEBUG)
+  Isolate* owner_;
+#endif  // defined(DEBUG)
+
+  DISALLOW_COPY_AND_ASSIGN(Mutex);
+};
+
+
+class Monitor {
+ public:
+  enum WaitResult {
+    kNotified,
+    kTimedOut
+  };
+
+  static const int64_t kNoTimeout = 0;
+
+  Monitor();
+  ~Monitor();
+
+  void Enter();
+  void Exit();
+
+  // Wait for notification or timeout.
+  WaitResult Wait(int64_t millis);
+  WaitResult WaitMicros(int64_t micros);
+
+  // Notify waiting threads.
+  void Notify();
+  void NotifyAll();
+
+ private:
+  MonitorData data_;  // OS-specific data.
+
+  DISALLOW_COPY_AND_ASSIGN(Monitor);
+};
+
+
+}  // namespace dart
+
+
+#endif  // VM_OS_THREAD_H_
diff --git a/runtime/vm/thread_android.cc b/runtime/vm/os_thread_android.cc
similarity index 88%
rename from runtime/vm/thread_android.cc
rename to runtime/vm/os_thread_android.cc
index 84571c8..f4b5233 100644
--- a/runtime/vm/thread_android.cc
+++ b/runtime/vm/os_thread_android.cc
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "platform/globals.h"
+#include "platform/globals.h"  // NOLINT
 #if defined(TARGET_OS_ANDROID)
 
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 
 #include <errno.h>  // NOLINT
 #include <sys/time.h>  // NOLINT
@@ -57,15 +57,15 @@
 
 class ThreadStartData {
  public:
-  ThreadStartData(Thread::ThreadStartFunction function,
+  ThreadStartData(OSThread::ThreadStartFunction function,
                   uword parameter)
       : function_(function), parameter_(parameter) {}
 
-  Thread::ThreadStartFunction function() const { return function_; }
+  OSThread::ThreadStartFunction function() const { return function_; }
   uword parameter() const { return parameter_; }
 
  private:
-  Thread::ThreadStartFunction function_;
+  OSThread::ThreadStartFunction function_;
   uword parameter_;
 
   DISALLOW_COPY_AND_ASSIGN(ThreadStartData);
@@ -78,7 +78,7 @@
 static void* ThreadStart(void* data_ptr) {
   ThreadStartData* data = reinterpret_cast<ThreadStartData*>(data_ptr);
 
-  Thread::ThreadStartFunction function = data->function();
+  OSThread::ThreadStartFunction function = data->function();
   uword parameter = data->parameter();
   delete data;
 
@@ -89,7 +89,7 @@
 }
 
 
-int Thread::Start(ThreadStartFunction function, uword parameter) {
+int OSThread::Start(ThreadStartFunction function, uword parameter) {
   pthread_attr_t attr;
   int result = pthread_attr_init(&attr);
   RETURN_ON_PTHREAD_FAILURE(result);
@@ -97,7 +97,7 @@
   result = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
   RETURN_ON_PTHREAD_FAILURE(result);
 
-  result = pthread_attr_setstacksize(&attr, Thread::GetMaxStackSize());
+  result = pthread_attr_setstacksize(&attr, OSThread::GetMaxStackSize());
   RETURN_ON_PTHREAD_FAILURE(result);
 
   ThreadStartData* data = new ThreadStartData(function, parameter);
@@ -113,10 +113,11 @@
 }
 
 
-ThreadLocalKey Thread::kUnsetThreadLocalKey = static_cast<pthread_key_t>(-1);
-ThreadId Thread::kInvalidThreadId = static_cast<ThreadId>(0);
+ThreadLocalKey OSThread::kUnsetThreadLocalKey =
+    static_cast<pthread_key_t>(-1);
+ThreadId OSThread::kInvalidThreadId = static_cast<ThreadId>(0);
 
-ThreadLocalKey Thread::CreateThreadLocal() {
+ThreadLocalKey OSThread::CreateThreadLocal() {
   pthread_key_t key = kUnsetThreadLocalKey;
   int result = pthread_key_create(&key, NULL);
   VALIDATE_PTHREAD_RESULT(result);
@@ -125,48 +126,48 @@
 }
 
 
-void Thread::DeleteThreadLocal(ThreadLocalKey key) {
+void OSThread::DeleteThreadLocal(ThreadLocalKey key) {
   ASSERT(key != kUnsetThreadLocalKey);
   int result = pthread_key_delete(key);
   VALIDATE_PTHREAD_RESULT(result);
 }
 
 
-void Thread::SetThreadLocal(ThreadLocalKey key, uword value) {
+void OSThread::SetThreadLocal(ThreadLocalKey key, uword value) {
   ASSERT(key != kUnsetThreadLocalKey);
   int result = pthread_setspecific(key, reinterpret_cast<void*>(value));
   VALIDATE_PTHREAD_RESULT(result);
 }
 
 
-intptr_t Thread::GetMaxStackSize() {
+intptr_t OSThread::GetMaxStackSize() {
   const int kStackSize = (128 * kWordSize * KB);
   return kStackSize;
 }
 
 
-ThreadId Thread::GetCurrentThreadId() {
+ThreadId OSThread::GetCurrentThreadId() {
   return gettid();
 }
 
 
-bool Thread::Join(ThreadId id) {
+bool OSThread::Join(ThreadId id) {
   return false;
 }
 
 
-intptr_t Thread::ThreadIdToIntPtr(ThreadId id) {
+intptr_t OSThread::ThreadIdToIntPtr(ThreadId id) {
   ASSERT(sizeof(id) == sizeof(intptr_t));
   return static_cast<intptr_t>(id);
 }
 
 
-bool Thread::Compare(ThreadId a, ThreadId b) {
+bool OSThread::Compare(ThreadId a, ThreadId b) {
   return a == b;
 }
 
 
-void Thread::GetThreadCpuUsage(ThreadId thread_id, int64_t* cpu_usage) {
+void OSThread::GetThreadCpuUsage(ThreadId thread_id, int64_t* cpu_usage) {
   ASSERT(thread_id == GetCurrentThreadId());
   ASSERT(cpu_usage != NULL);
   struct timespec ts;
diff --git a/runtime/vm/thread_android.h b/runtime/vm/os_thread_android.h
similarity index 85%
copy from runtime/vm/thread_android.h
copy to runtime/vm/os_thread_android.h
index 7cb6de5..5ac0f81 100644
--- a/runtime/vm/thread_android.h
+++ b/runtime/vm/os_thread_android.h
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef VM_THREAD_ANDROID_H_
-#define VM_THREAD_ANDROID_H_
+#ifndef VM_OS_THREAD_ANDROID_H_
+#define VM_OS_THREAD_ANDROID_H_
 
-#if !defined(VM_THREAD_H_)
-#error Do not include thread_android.h directly; use thread.h instead.
+#if !defined(VM_OS_THREAD_H_)
+#error Do not include os_thread_android.h directly; use os_thread.h instead.
 #endif
 
 #include <pthread.h>
@@ -30,7 +30,7 @@
     return reinterpret_cast<uword>(pthread_getspecific(key));
   }
 
-  friend class Thread;
+  friend class OSThread;
 
   DISALLOW_ALLOCATION();
   DISALLOW_COPY_AND_ASSIGN(ThreadInlineImpl);
@@ -72,4 +72,4 @@
 
 }  // namespace dart
 
-#endif  // VM_THREAD_ANDROID_H_
+#endif  // VM_OS_THREAD_ANDROID_H_
diff --git a/runtime/vm/thread_linux.cc b/runtime/vm/os_thread_linux.cc
similarity index 88%
rename from runtime/vm/thread_linux.cc
rename to runtime/vm/os_thread_linux.cc
index 10599fe..a2b3cff 100644
--- a/runtime/vm/thread_linux.cc
+++ b/runtime/vm/os_thread_linux.cc
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "platform/globals.h"
+#include "platform/globals.h"  // NOLINT
 #if defined(TARGET_OS_LINUX)
 
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 
 #include <errno.h>  // NOLINT
 #include <sys/resource.h>  // NOLINT
@@ -58,15 +58,15 @@
 
 class ThreadStartData {
  public:
-  ThreadStartData(Thread::ThreadStartFunction function,
+  ThreadStartData(OSThread::ThreadStartFunction function,
                   uword parameter)
       : function_(function), parameter_(parameter) {}
 
-  Thread::ThreadStartFunction function() const { return function_; }
+  OSThread::ThreadStartFunction function() const { return function_; }
   uword parameter() const { return parameter_; }
 
  private:
-  Thread::ThreadStartFunction function_;
+  OSThread::ThreadStartFunction function_;
   uword parameter_;
 
   DISALLOW_COPY_AND_ASSIGN(ThreadStartData);
@@ -79,7 +79,7 @@
 static void* ThreadStart(void* data_ptr) {
   ThreadStartData* data = reinterpret_cast<ThreadStartData*>(data_ptr);
 
-  Thread::ThreadStartFunction function = data->function();
+  OSThread::ThreadStartFunction function = data->function();
   uword parameter = data->parameter();
   delete data;
 
@@ -90,7 +90,7 @@
 }
 
 
-int Thread::Start(ThreadStartFunction function, uword parameter) {
+int OSThread::Start(ThreadStartFunction function, uword parameter) {
   pthread_attr_t attr;
   int result = pthread_attr_init(&attr);
   RETURN_ON_PTHREAD_FAILURE(result);
@@ -98,7 +98,7 @@
   result = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
   RETURN_ON_PTHREAD_FAILURE(result);
 
-  result = pthread_attr_setstacksize(&attr, Thread::GetMaxStackSize());
+  result = pthread_attr_setstacksize(&attr, OSThread::GetMaxStackSize());
   RETURN_ON_PTHREAD_FAILURE(result);
 
   ThreadStartData* data = new ThreadStartData(function, parameter);
@@ -114,10 +114,11 @@
 }
 
 
-ThreadLocalKey Thread::kUnsetThreadLocalKey = static_cast<pthread_key_t>(-1);
-ThreadId Thread::kInvalidThreadId = static_cast<ThreadId>(0);
+ThreadLocalKey OSThread::kUnsetThreadLocalKey =
+    static_cast<pthread_key_t>(-1);
+ThreadId OSThread::kInvalidThreadId = static_cast<ThreadId>(0);
 
-ThreadLocalKey Thread::CreateThreadLocal() {
+ThreadLocalKey OSThread::CreateThreadLocal() {
   pthread_key_t key = kUnsetThreadLocalKey;
   int result = pthread_key_create(&key, NULL);
   VALIDATE_PTHREAD_RESULT(result);
@@ -126,48 +127,48 @@
 }
 
 
-void Thread::DeleteThreadLocal(ThreadLocalKey key) {
+void OSThread::DeleteThreadLocal(ThreadLocalKey key) {
   ASSERT(key != kUnsetThreadLocalKey);
   int result = pthread_key_delete(key);
   VALIDATE_PTHREAD_RESULT(result);
 }
 
 
-void Thread::SetThreadLocal(ThreadLocalKey key, uword value) {
+void OSThread::SetThreadLocal(ThreadLocalKey key, uword value) {
   ASSERT(key != kUnsetThreadLocalKey);
   int result = pthread_setspecific(key, reinterpret_cast<void*>(value));
   VALIDATE_PTHREAD_RESULT(result);
 }
 
 
-intptr_t Thread::GetMaxStackSize() {
+intptr_t OSThread::GetMaxStackSize() {
   const int kStackSize = (128 * kWordSize * KB);
   return kStackSize;
 }
 
 
-ThreadId Thread::GetCurrentThreadId() {
+ThreadId OSThread::GetCurrentThreadId() {
   return pthread_self();
 }
 
 
-bool Thread::Join(ThreadId id) {
+bool OSThread::Join(ThreadId id) {
   return false;
 }
 
 
-intptr_t Thread::ThreadIdToIntPtr(ThreadId id) {
+intptr_t OSThread::ThreadIdToIntPtr(ThreadId id) {
   ASSERT(sizeof(id) == sizeof(intptr_t));
   return static_cast<intptr_t>(id);
 }
 
 
-bool Thread::Compare(ThreadId a, ThreadId b) {
+bool OSThread::Compare(ThreadId a, ThreadId b) {
   return pthread_equal(a, b) != 0;
 }
 
 
-void Thread::GetThreadCpuUsage(ThreadId thread_id, int64_t* cpu_usage) {
+void OSThread::GetThreadCpuUsage(ThreadId thread_id, int64_t* cpu_usage) {
   ASSERT(thread_id == GetCurrentThreadId());
   ASSERT(cpu_usage != NULL);
   struct timespec ts;
diff --git a/runtime/vm/thread_android.h b/runtime/vm/os_thread_linux.h
similarity index 85%
copy from runtime/vm/thread_android.h
copy to runtime/vm/os_thread_linux.h
index 7cb6de5..840b36e 100644
--- a/runtime/vm/thread_android.h
+++ b/runtime/vm/os_thread_linux.h
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef VM_THREAD_ANDROID_H_
-#define VM_THREAD_ANDROID_H_
+#ifndef VM_OS_THREAD_LINUX_H_
+#define VM_OS_THREAD_LINUX_H_
 
-#if !defined(VM_THREAD_H_)
-#error Do not include thread_android.h directly; use thread.h instead.
+#if !defined(VM_OS_THREAD_H_)
+#error Do not include os_thread_linux.h directly; use os_thread.h instead.
 #endif
 
 #include <pthread.h>
@@ -30,7 +30,7 @@
     return reinterpret_cast<uword>(pthread_getspecific(key));
   }
 
-  friend class Thread;
+  friend class OSThread;
 
   DISALLOW_ALLOCATION();
   DISALLOW_COPY_AND_ASSIGN(ThreadInlineImpl);
@@ -72,4 +72,4 @@
 
 }  // namespace dart
 
-#endif  // VM_THREAD_ANDROID_H_
+#endif  // VM_OS_THREAD_LINUX_H_
diff --git a/runtime/vm/thread_macos.cc b/runtime/vm/os_thread_macos.cc
similarity index 89%
rename from runtime/vm/thread_macos.cc
rename to runtime/vm/os_thread_macos.cc
index 6a0cf5d..279425a 100644
--- a/runtime/vm/thread_macos.cc
+++ b/runtime/vm/os_thread_macos.cc
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "platform/globals.h"
+#include "platform/globals.h"  // NOLINT
 #if defined(TARGET_OS_MACOS)
 
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 
 #include <sys/errno.h>  // NOLINT
 #include <sys/types.h>  // NOLINT
@@ -50,15 +50,15 @@
 
 class ThreadStartData {
  public:
-  ThreadStartData(Thread::ThreadStartFunction function,
+  ThreadStartData(OSThread::ThreadStartFunction function,
                   uword parameter)
       : function_(function), parameter_(parameter) {}
 
-  Thread::ThreadStartFunction function() const { return function_; }
+  OSThread::ThreadStartFunction function() const { return function_; }
   uword parameter() const { return parameter_; }
 
  private:
-  Thread::ThreadStartFunction function_;
+  OSThread::ThreadStartFunction function_;
   uword parameter_;
 
   DISALLOW_COPY_AND_ASSIGN(ThreadStartData);
@@ -71,7 +71,7 @@
 static void* ThreadStart(void* data_ptr) {
   ThreadStartData* data = reinterpret_cast<ThreadStartData*>(data_ptr);
 
-  Thread::ThreadStartFunction function = data->function();
+  OSThread::ThreadStartFunction function = data->function();
   uword parameter = data->parameter();
   delete data;
 
@@ -82,7 +82,7 @@
 }
 
 
-int Thread::Start(ThreadStartFunction function, uword parameter) {
+int OSThread::Start(ThreadStartFunction function, uword parameter) {
   pthread_attr_t attr;
   int result = pthread_attr_init(&attr);
   RETURN_ON_PTHREAD_FAILURE(result);
@@ -90,7 +90,7 @@
   result = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
   RETURN_ON_PTHREAD_FAILURE(result);
 
-  result = pthread_attr_setstacksize(&attr, Thread::GetMaxStackSize());
+  result = pthread_attr_setstacksize(&attr, OSThread::GetMaxStackSize());
   RETURN_ON_PTHREAD_FAILURE(result);
 
   ThreadStartData* data = new ThreadStartData(function, parameter);
@@ -106,10 +106,11 @@
 }
 
 
-ThreadLocalKey Thread::kUnsetThreadLocalKey = static_cast<pthread_key_t>(-1);
-ThreadId Thread::kInvalidThreadId = reinterpret_cast<ThreadId>(NULL);
+ThreadLocalKey OSThread::kUnsetThreadLocalKey =
+    static_cast<pthread_key_t>(-1);
+ThreadId OSThread::kInvalidThreadId = reinterpret_cast<ThreadId>(NULL);
 
-ThreadLocalKey Thread::CreateThreadLocal() {
+ThreadLocalKey OSThread::CreateThreadLocal() {
   pthread_key_t key = kUnsetThreadLocalKey;
   int result = pthread_key_create(&key, NULL);
   VALIDATE_PTHREAD_RESULT(result);
@@ -118,48 +119,48 @@
 }
 
 
-void Thread::DeleteThreadLocal(ThreadLocalKey key) {
+void OSThread::DeleteThreadLocal(ThreadLocalKey key) {
   ASSERT(key != kUnsetThreadLocalKey);
   int result = pthread_key_delete(key);
   VALIDATE_PTHREAD_RESULT(result);
 }
 
 
-void Thread::SetThreadLocal(ThreadLocalKey key, uword value) {
+void OSThread::SetThreadLocal(ThreadLocalKey key, uword value) {
   ASSERT(key != kUnsetThreadLocalKey);
   int result = pthread_setspecific(key, reinterpret_cast<void*>(value));
   VALIDATE_PTHREAD_RESULT(result);
 }
 
 
-intptr_t Thread::GetMaxStackSize() {
+intptr_t OSThread::GetMaxStackSize() {
   const int kStackSize = (128 * kWordSize * KB);
   return kStackSize;
 }
 
 
-ThreadId Thread::GetCurrentThreadId() {
+ThreadId OSThread::GetCurrentThreadId() {
   return pthread_self();
 }
 
 
-bool Thread::Join(ThreadId id) {
+bool OSThread::Join(ThreadId id) {
   return false;
 }
 
 
-intptr_t Thread::ThreadIdToIntPtr(ThreadId id) {
+intptr_t OSThread::ThreadIdToIntPtr(ThreadId id) {
   ASSERT(sizeof(id) == sizeof(intptr_t));
   return reinterpret_cast<intptr_t>(id);
 }
 
 
-bool Thread::Compare(ThreadId a, ThreadId b) {
+bool OSThread::Compare(ThreadId a, ThreadId b) {
   return pthread_equal(a, b) != 0;
 }
 
 
-void Thread::GetThreadCpuUsage(ThreadId thread_id, int64_t* cpu_usage) {
+void OSThread::GetThreadCpuUsage(ThreadId thread_id, int64_t* cpu_usage) {
   ASSERT(thread_id == GetCurrentThreadId());
   ASSERT(cpu_usage != NULL);
   // TODO(johnmccutchan): Enable this after fixing issue with macos directory
diff --git a/runtime/vm/thread_android.h b/runtime/vm/os_thread_macos.h
similarity index 85%
rename from runtime/vm/thread_android.h
rename to runtime/vm/os_thread_macos.h
index 7cb6de5..d2b9143 100644
--- a/runtime/vm/thread_android.h
+++ b/runtime/vm/os_thread_macos.h
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef VM_THREAD_ANDROID_H_
-#define VM_THREAD_ANDROID_H_
+#ifndef VM_OS_THREAD_MACOS_H_
+#define VM_OS_THREAD_MACOS_H_
 
-#if !defined(VM_THREAD_H_)
-#error Do not include thread_android.h directly; use thread.h instead.
+#if !defined(VM_OS_THREAD_H_)
+#error Do not include os_thread_macos.h directly; use os_thread.h instead.
 #endif
 
 #include <pthread.h>
@@ -30,7 +30,7 @@
     return reinterpret_cast<uword>(pthread_getspecific(key));
   }
 
-  friend class Thread;
+  friend class OSThread;
 
   DISALLOW_ALLOCATION();
   DISALLOW_COPY_AND_ASSIGN(ThreadInlineImpl);
@@ -72,4 +72,4 @@
 
 }  // namespace dart
 
-#endif  // VM_THREAD_ANDROID_H_
+#endif  // VM_OS_THREAD_MACOS_H_
diff --git a/runtime/vm/thread_win.cc b/runtime/vm/os_thread_win.cc
similarity index 89%
rename from runtime/vm/thread_win.cc
rename to runtime/vm/os_thread_win.cc
index 6ea61c2..e240b50 100644
--- a/runtime/vm/thread_win.cc
+++ b/runtime/vm/os_thread_win.cc
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "platform/globals.h"
+#include "platform/globals.h"  // NOLINT
 #if defined(TARGET_OS_WINDOWS)
 
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 
 #include <process.h>  // NOLINT
 
@@ -16,14 +16,14 @@
 
 class ThreadStartData {
  public:
-  ThreadStartData(Thread::ThreadStartFunction function, uword parameter)
+  ThreadStartData(OSThread::ThreadStartFunction function, uword parameter)
       : function_(function), parameter_(parameter) {}
 
-  Thread::ThreadStartFunction function() const { return function_; }
+  OSThread::ThreadStartFunction function() const { return function_; }
   uword parameter() const { return parameter_; }
 
  private:
-  Thread::ThreadStartFunction function_;
+  OSThread::ThreadStartFunction function_;
   uword parameter_;
 
   DISALLOW_COPY_AND_ASSIGN(ThreadStartData);
@@ -36,7 +36,7 @@
 static unsigned int __stdcall ThreadEntry(void* data_ptr) {
   ThreadStartData* data = reinterpret_cast<ThreadStartData*>(data_ptr);
 
-  Thread::ThreadStartFunction function = data->function();
+  OSThread::ThreadStartFunction function = data->function();
   uword parameter = data->parameter();
   delete data;
 
@@ -52,10 +52,10 @@
 }
 
 
-int Thread::Start(ThreadStartFunction function, uword parameter) {
+int OSThread::Start(ThreadStartFunction function, uword parameter) {
   ThreadStartData* start_data = new ThreadStartData(function, parameter);
   uint32_t tid;
-  uintptr_t thread = _beginthreadex(NULL, Thread::GetMaxStackSize(),
+  uintptr_t thread = _beginthreadex(NULL, OSThread::GetMaxStackSize(),
                                     ThreadEntry, start_data, 0, &tid);
   if (thread == -1L || thread == 0) {
 #ifdef DEBUG
@@ -70,10 +70,10 @@
   return 0;
 }
 
-ThreadLocalKey Thread::kUnsetThreadLocalKey = TLS_OUT_OF_INDEXES;
-ThreadId Thread::kInvalidThreadId = 0;
+ThreadLocalKey OSThread::kUnsetThreadLocalKey = TLS_OUT_OF_INDEXES;
+ThreadId OSThread::kInvalidThreadId = 0;
 
-ThreadLocalKey Thread::CreateThreadLocal() {
+ThreadLocalKey OSThread::CreateThreadLocal() {
   ThreadLocalKey key = TlsAlloc();
   if (key == kUnsetThreadLocalKey) {
     FATAL1("TlsAlloc failed %d", GetLastError());
@@ -82,7 +82,7 @@
 }
 
 
-void Thread::DeleteThreadLocal(ThreadLocalKey key) {
+void OSThread::DeleteThreadLocal(ThreadLocalKey key) {
   ASSERT(key != kUnsetThreadLocalKey);
   BOOL result = TlsFree(key);
   if (!result) {
@@ -91,18 +91,18 @@
 }
 
 
-intptr_t Thread::GetMaxStackSize() {
+intptr_t OSThread::GetMaxStackSize() {
   const int kStackSize = (128 * kWordSize * KB);
   return kStackSize;
 }
 
 
-ThreadId Thread::GetCurrentThreadId() {
+ThreadId OSThread::GetCurrentThreadId() {
   return ::GetCurrentThreadId();
 }
 
 
-bool Thread::Join(ThreadId id) {
+bool OSThread::Join(ThreadId id) {
   HANDLE handle = OpenThread(SYNCHRONIZE, false, id);
   if (handle == INVALID_HANDLE_VALUE) {
     return false;
@@ -113,18 +113,18 @@
 }
 
 
-intptr_t Thread::ThreadIdToIntPtr(ThreadId id) {
+intptr_t OSThread::ThreadIdToIntPtr(ThreadId id) {
   ASSERT(sizeof(id) <= sizeof(intptr_t));
   return static_cast<intptr_t>(id);
 }
 
 
-bool Thread::Compare(ThreadId a, ThreadId b) {
+bool OSThread::Compare(ThreadId a, ThreadId b) {
   return a == b;
 }
 
 
-void Thread::GetThreadCpuUsage(ThreadId thread_id, int64_t* cpu_usage) {
+void OSThread::GetThreadCpuUsage(ThreadId thread_id, int64_t* cpu_usage) {
   static const int64_t kTimeEpoc = 116444736000000000LL;
   static const int64_t kTimeScaler = 10;  // 100 ns to us.
   // Although win32 uses 64-bit integers for representing timestamps,
@@ -156,7 +156,7 @@
 }
 
 
-void Thread::SetThreadLocal(ThreadLocalKey key, uword value) {
+void OSThread::SetThreadLocal(ThreadLocalKey key, uword value) {
   ASSERT(key != kUnsetThreadLocalKey);
   BOOL result = TlsSetValue(key, reinterpret_cast<void*>(value));
   if (!result) {
@@ -231,7 +231,7 @@
 
 
 ThreadLocalKey MonitorWaitData::monitor_wait_data_key_ =
-    Thread::kUnsetThreadLocalKey;
+    OSThread::kUnsetThreadLocalKey;
 
 
 Monitor::Monitor() {
@@ -260,9 +260,9 @@
 
 void MonitorWaitData::ThreadExit() {
   if (MonitorWaitData::monitor_wait_data_key_ !=
-      Thread::kUnsetThreadLocalKey) {
+      OSThread::kUnsetThreadLocalKey) {
     uword raw_wait_data =
-      Thread::GetThreadLocal(MonitorWaitData::monitor_wait_data_key_);
+      OSThread::GetThreadLocal(MonitorWaitData::monitor_wait_data_key_);
     if (raw_wait_data != 0) {
       MonitorWaitData* wait_data =
           reinterpret_cast<MonitorWaitData*>(raw_wait_data);
@@ -367,17 +367,17 @@
   // Ensure that the thread local key for monitor wait data objects is
   // initialized.
   ASSERT(MonitorWaitData::monitor_wait_data_key_ !=
-         Thread::kUnsetThreadLocalKey);
+         OSThread::kUnsetThreadLocalKey);
 
   // Get the MonitorWaitData object containing the event for this
   // thread from thread local storage. Create it if it does not exist.
   uword raw_wait_data =
-    Thread::GetThreadLocal(MonitorWaitData::monitor_wait_data_key_);
+    OSThread::GetThreadLocal(MonitorWaitData::monitor_wait_data_key_);
   MonitorWaitData* wait_data = NULL;
   if (raw_wait_data == 0) {
     HANDLE event = CreateEvent(NULL, FALSE, FALSE, NULL);
     wait_data = new MonitorWaitData(event);
-    Thread::SetThreadLocal(MonitorWaitData::monitor_wait_data_key_,
+    OSThread::SetThreadLocal(MonitorWaitData::monitor_wait_data_key_,
                            reinterpret_cast<uword>(wait_data));
   } else {
     wait_data = reinterpret_cast<MonitorWaitData*>(raw_wait_data);
diff --git a/runtime/vm/thread_win.h b/runtime/vm/os_thread_win.h
similarity index 92%
rename from runtime/vm/thread_win.h
rename to runtime/vm/os_thread_win.h
index 49f620c..27a5b14 100644
--- a/runtime/vm/thread_win.h
+++ b/runtime/vm/os_thread_win.h
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef VM_THREAD_WIN_H_
-#define VM_THREAD_WIN_H_
+#ifndef VM_OS_THREAD_WIN_H_
+#define VM_OS_THREAD_WIN_H_
 
-#if !defined(VM_THREAD_H_)
-#error Do not include thread_win.h directly; use thread.h instead.
+#if !defined(VM_OS_THREAD_H_)
+#error Do not include os_thread_win.h directly; use os_thread.h instead.
 #endif
 
 #include "platform/assert.h"
@@ -29,7 +29,7 @@
     return reinterpret_cast<uword>(TlsGetValue(key));
   }
 
-  friend class Thread;
+  friend class OSThread;
   friend unsigned int __stdcall ThreadEntry(void* data_ptr);
 
   DISALLOW_ALLOCATION();
@@ -118,4 +118,4 @@
 
 }  // namespace dart
 
-#endif  // VM_THREAD_WIN_H_
+#endif  // VM_OS_THREAD_WIN_H_
diff --git a/runtime/vm/os_win.cc b/runtime/vm/os_win.cc
index b0af73d..7c32ec6 100644
--- a/runtime/vm/os_win.cc
+++ b/runtime/vm/os_win.cc
@@ -13,7 +13,7 @@
 
 #include "platform/utils.h"
 #include "platform/assert.h"
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 #include "vm/vtune.h"
 
 namespace dart {
@@ -247,7 +247,7 @@
   }
   va_list args_copy;
   va_copy(args_copy, args);
-  int written =_vsnprintf(str, size, format, args_copy);
+  int written = _vsnprintf(str, size, format, args_copy);
   va_end(args_copy);
   if (written < 0) {
     // _vsnprintf returns -1 if the number of characters to be written is
@@ -315,7 +315,7 @@
   init_once_called = true;
   // Do not pop up a message box when abort is called.
   _set_abort_behavior(0, _WRITE_ABORT_MSG);
-  MonitorWaitData::monitor_wait_data_key_ = Thread::CreateThreadLocal();
+  MonitorWaitData::monitor_wait_data_key_ = OSThread::CreateThreadLocal();
   MonitorData::GetMonitorWaitDataForThread();
 }
 
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index 08b74de..a352273 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -10,7 +10,7 @@
 #include "vm/gc_sweeper.h"
 #include "vm/lockers.h"
 #include "vm/object.h"
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 #include "vm/verified_memory.h"
 #include "vm/virtual_memory.h"
 
@@ -62,8 +62,7 @@
   VirtualMemory* memory =
       VerifiedMemory::Reserve(size_in_words << kWordSizeLog2);
   if (memory == NULL) {
-    FATAL1("Out of memory while allocating %" Pd " words.\n",
-           size_in_words);
+    return NULL;
   }
   return Initialize(memory, type);
 }
@@ -133,7 +132,9 @@
 }
 
 
-PageSpace::PageSpace(Heap* heap, intptr_t max_capacity_in_words)
+PageSpace::PageSpace(Heap* heap,
+                     intptr_t max_capacity_in_words,
+                     intptr_t max_external_in_words)
     : freelist_(),
       heap_(heap),
       pages_lock_(new Mutex()),
@@ -145,6 +146,7 @@
       bump_top_(0),
       bump_end_(0),
       max_capacity_in_words_(max_capacity_in_words),
+      max_external_in_words_(max_external_in_words),
       tasks_lock_(new Monitor()),
       tasks_(0),
       page_space_controller_(heap,
@@ -180,6 +182,9 @@
 
 HeapPage* PageSpace::AllocatePage(HeapPage::PageType type) {
   HeapPage* page = HeapPage::Allocate(kPageSizeInWords, type);
+  if (page == NULL) {
+    return NULL;
+  }
 
   bool is_exec = (type == HeapPage::kExecutable);
 
@@ -214,6 +219,9 @@
 HeapPage* PageSpace::AllocateLargePage(intptr_t size, HeapPage::PageType type) {
   intptr_t page_size_in_words = LargePageSizeInWordsFor(size);
   HeapPage* page = HeapPage::Allocate(page_size_in_words, type);
+  if (page == NULL) {
+    return NULL;
+  }
   page->set_next(large_pages_);
   large_pages_ = page;
   IncreaseCapacityInWords(page_size_in_words);
@@ -309,7 +317,9 @@
        !page_space_controller_.NeedsGarbageCollection(after_allocation)) &&
       CanIncreaseCapacityInWords(kPageSizeInWords)) {
     HeapPage* page = AllocatePage(type);
-    ASSERT(page != NULL);
+    if (page == NULL) {
+      return 0;
+    }
     // Start of the newly allocated page is the allocated object.
     result = page->object_start();
     // Note: usage_.capacity_in_words is increased by AllocatePage.
@@ -733,6 +743,9 @@
     set_tasks(1);
   }
 
+  // Perform various cleanup that relies on no tasks interfering.
+  isolate->class_table()->FreeOldTables();
+
   NoHandleScope no_handles(isolate);
 
   if (FLAG_print_free_list_before_gc) {
diff --git a/runtime/vm/pages.h b/runtime/vm/pages.h
index 67f2086..06abc31 100644
--- a/runtime/vm/pages.h
+++ b/runtime/vm/pages.h
@@ -196,7 +196,9 @@
     kForceGrowth
   };
 
-  PageSpace(Heap* heap, intptr_t max_capacity_in_words);
+  PageSpace(Heap* heap,
+            intptr_t max_capacity_in_words,
+            intptr_t max_external_in_words);
   ~PageSpace();
 
   uword TryAllocate(intptr_t size,
@@ -269,7 +271,8 @@
   }
 
   bool NeedsExternalGC() const {
-    return UsedInWords() + ExternalInWords() > max_capacity_in_words_;
+    return (max_external_in_words_ != 0) &&
+        (ExternalInWords() > max_external_in_words_);
   }
 
   // TODO(koda): Unify protection handling.
@@ -382,6 +385,10 @@
   static intptr_t LargePageSizeInWordsFor(intptr_t size);
 
   bool CanIncreaseCapacityInWords(intptr_t increase_in_words) {
+    if (max_capacity_in_words_ == 0) {
+      // Unlimited.
+      return true;
+    }
     ASSERT(CapacityInWords() <= max_capacity_in_words_);
     return increase_in_words <= (max_capacity_in_words_ - CapacityInWords());
   }
@@ -405,6 +412,7 @@
 
   // Various sizes being tracked for this generation.
   intptr_t max_capacity_in_words_;
+  intptr_t max_external_in_words_;
   // NOTE: The capacity component of usage_ is updated by the concurrent
   // sweeper. Use (Increase)CapacityInWords(Locked) for thread-safe access.
   SpaceUsage usage_;
diff --git a/runtime/vm/pages_test.cc b/runtime/vm/pages_test.cc
index d30d270..131b2e6 100644
--- a/runtime/vm/pages_test.cc
+++ b/runtime/vm/pages_test.cc
@@ -9,7 +9,7 @@
 namespace dart {
 
 TEST_CASE(Pages) {
-  PageSpace* space = new PageSpace(NULL, 4 * MBInWords);
+  PageSpace* space = new PageSpace(NULL, 4 * MBInWords, 8 * MBInWords);
   EXPECT(!space->Contains(reinterpret_cast<uword>(&space)));
   uword block = space->TryAllocate(8 * kWordSize);
   EXPECT(block != 0);
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index c2bb941..8790f75 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -41,7 +41,6 @@
 DEFINE_FLAG(bool, enable_type_checks, false, "Enable type checks.");
 DEFINE_FLAG(bool, trace_parser, false, "Trace parser operations.");
 DEFINE_FLAG(bool, warn_mixin_typedef, true, "Warning on legacy mixin typedef.");
-DEFINE_FLAG(bool, enable_async, true, "Enable async operations.");
 DECLARE_FLAG(bool, error_on_bad_type);
 DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
 DECLARE_FLAG(bool, warn_on_javascript_compatibility);
@@ -62,8 +61,9 @@
                     "Enable checked mode.");
 
 
-// Quick access to the locally defined isolate() method.
-#define I (isolate())
+// Quick access to the current isolate and zone.
+#define I (thread()->isolate())
+#define Z (zone())
 
 
 #if defined(DEBUG)
@@ -132,7 +132,7 @@
 LocalVariable* ParsedFunction::EnsureExpressionTemp() {
   if (!has_expression_temp_var()) {
     LocalVariable* temp =
-        new (I) LocalVariable(function_.token_pos(),
+        new (Z) LocalVariable(function_.token_pos(),
                               Symbols::ExprTemp(),
                               Type::ZoneHandle(Type::DynamicType()));
     ASSERT(temp != NULL);
@@ -145,10 +145,10 @@
 
 void ParsedFunction::EnsureFinallyReturnTemp() {
   if (!has_finally_return_temp_var()) {
-    LocalVariable* temp = new(I) LocalVariable(
+    LocalVariable* temp = new(Z) LocalVariable(
         function_.token_pos(),
-        String::ZoneHandle(I, Symbols::New(":finally_ret_val")),
-        Type::ZoneHandle(I, Type::DynamicType()));
+        String::ZoneHandle(Z, Symbols::New(":finally_ret_val")),
+        Type::ZoneHandle(Z, Type::DynamicType()));
     ASSERT(temp != NULL);
     temp->set_is_final();
     set_finally_return_temp_var(temp);
@@ -180,7 +180,7 @@
       return;
     }
   }
-  deferred_prefixes_->Add(&LibraryPrefix::ZoneHandle(I, prefix.raw()));
+  deferred_prefixes_->Add(&LibraryPrefix::ZoneHandle(Z, prefix.raw()));
 }
 
 
@@ -308,9 +308,9 @@
 
 // For parsing a compilation unit.
 Parser::Parser(const Script& script, const Library& library, intptr_t token_pos)
-    : isolate_(Isolate::Current()),
-      script_(Script::Handle(isolate_, script.raw())),
-      tokens_iterator_(TokenStream::Handle(isolate_, script.tokens()),
+    : thread_(Thread::Current()),
+      script_(Script::Handle(zone(), script.raw())),
+      tokens_iterator_(TokenStream::Handle(zone(), script.tokens()),
                        token_pos),
       token_kind_(Token::kILLEGAL),
       current_block_(NULL),
@@ -319,10 +319,10 @@
       current_member_(NULL),
       allow_function_literals_(true),
       parsed_function_(NULL),
-      innermost_function_(Function::Handle(isolate_)),
-      literal_token_(LiteralToken::Handle(isolate_)),
-      current_class_(Class::Handle(isolate_)),
-      library_(Library::Handle(isolate_, library.raw())),
+      innermost_function_(Function::Handle(zone())),
+      literal_token_(LiteralToken::Handle(zone())),
+      current_class_(Class::Handle(zone())),
+      library_(Library::Handle(zone(), library.raw())),
       try_blocks_list_(NULL),
       last_used_try_index_(0),
       unregister_pending_function_(false),
@@ -336,9 +336,9 @@
 Parser::Parser(const Script& script,
                ParsedFunction* parsed_function,
                intptr_t token_position)
-    : isolate_(Isolate::Current()),
-      script_(Script::Handle(isolate_, script.raw())),
-      tokens_iterator_(TokenStream::Handle(isolate_, script.tokens()),
+    : thread_(Thread::Current()),
+      script_(Script::Handle(zone(), script.raw())),
+      tokens_iterator_(TokenStream::Handle(zone(), script.tokens()),
                        token_position),
       token_kind_(Token::kILLEGAL),
       current_block_(NULL),
@@ -347,13 +347,13 @@
       current_member_(NULL),
       allow_function_literals_(true),
       parsed_function_(parsed_function),
-      innermost_function_(Function::Handle(isolate_,
+      innermost_function_(Function::Handle(zone(),
                                            parsed_function->function().raw())),
-      literal_token_(LiteralToken::Handle(isolate_)),
-      current_class_(Class::Handle(isolate_,
+      literal_token_(LiteralToken::Handle(zone())),
+      current_class_(Class::Handle(zone(),
                                    parsed_function->function().Owner())),
-      library_(Library::Handle(isolate_, Class::Handle(
-          isolate_,
+      library_(Library::Handle(zone(), Class::Handle(
+          zone(),
           parsed_function->function().origin()).library())),
       try_blocks_list_(NULL),
       last_used_try_index_(0),
@@ -392,7 +392,7 @@
 void Parser::SetScript(const Script& script, intptr_t token_pos) {
   script_ = script.raw();
   tokens_iterator_.SetStream(
-      TokenStream::Handle(I, script.tokens()), token_pos);
+      TokenStream::Handle(Z, script.tokens()), token_pos);
   token_kind_ = Token::kILLEGAL;
 }
 
@@ -463,7 +463,7 @@
 
 String* Parser::CurrentLiteral() const {
   String& result =
-      String::ZoneHandle(I, tokens_iterator_.CurrentLiteral());
+      String::ZoneHandle(Z, tokens_iterator_.CurrentLiteral());
   return &result;
 }
 
@@ -480,7 +480,7 @@
   ASSERT(literal_token_.kind() == Token::kINTEGER);
   RawInteger* ri = Integer::RawCast(literal_token_.value());
   if (FLAG_throw_on_javascript_int_overflow) {
-    const Integer& i = Integer::Handle(I, ri);
+    const Integer& i = Integer::Handle(Z, ri);
     if (i.CheckJavascriptIntegerOverflow()) {
       ReportError(TokenPos(),
                   "Integer literal does not fit in a Javascript integer: %s.",
@@ -789,15 +789,17 @@
 
 RawObject* Parser::ParseFunctionParameters(const Function& func) {
   ASSERT(!func.IsNull());
-  Isolate* isolate = Isolate::Current();
-  StackZone zone(isolate);
+  Thread* thread = Thread::Current();
+  Isolate* isolate = thread->isolate();
+  StackZone stack_zone(isolate);
+  Zone* zone = stack_zone.GetZone();
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
-    const Script& script = Script::Handle(isolate, func.script());
-    const Class& owner = Class::Handle(isolate, func.Owner());
+    const Script& script = Script::Handle(zone, func.script());
+    const Class& owner = Class::Handle(zone, func.Owner());
     ASSERT(!owner.IsNull());
     ParsedFunction* parsed_function = new ParsedFunction(
-        isolate, Function::ZoneHandle(isolate, func.raw()));
+        thread, Function::ZoneHandle(zone, func.raw()));
     Parser parser(script, parsed_function, func.token_pos());
     parser.SkipFunctionPreamble();
     ParamList params;
@@ -834,16 +836,17 @@
 
 
 void Parser::ParseFunction(ParsedFunction* parsed_function) {
-  Isolate* isolate = Isolate::Current();
+  Isolate* isolate = parsed_function->isolate();
+  Zone* zone = parsed_function->zone();
   TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer);
   CompilerStats::num_functions_compiled++;
   ASSERT(isolate->long_jump_base()->IsSafeToJump());
   ASSERT(parsed_function != NULL);
   const Function& func = parsed_function->function();
-  const Script& script = Script::Handle(isolate, func.script());
+  const Script& script = Script::Handle(zone, func.script());
   Parser parser(script, parsed_function, func.token_pos());
   SequenceNode* node_sequence = NULL;
-  Array& default_parameter_values = Array::ZoneHandle(isolate, Array::null());
+  Array& default_parameter_values = Array::ZoneHandle(zone, Array::null());
   switch (func.kind()) {
     case RawFunction::kRegularFunction:
     case RawFunction::kClosureFunction:
@@ -925,16 +928,18 @@
 
 
 RawObject* Parser::ParseMetadata(const Class& cls, intptr_t token_pos) {
-  Isolate* isolate = Isolate::Current();
-  StackZone zone(isolate);
+  Thread* thread = Thread::Current();
+  Isolate* isolate = thread->isolate();
+  StackZone stack_zone(isolate);
+  Zone* zone = stack_zone.GetZone();
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
-    const Script& script = Script::Handle(isolate, cls.script());
+    const Script& script = Script::Handle(zone, cls.script());
     // Parsing metadata can involve following paths in the parser that are
     // normally used for expressions and assume current_function is non-null,
     // so we create a fake function to use as the current_function rather than
     // scattering special cases throughout the parser.
-    const Function& fake_function = Function::ZoneHandle(Function::New(
+    const Function& fake_function = Function::ZoneHandle(zone, Function::New(
         Symbols::At(),
         RawFunction::kRegularFunction,
         true,  // is_static
@@ -946,14 +951,14 @@
         token_pos));
     fake_function.set_is_debuggable(false);
     ParsedFunction* parsed_function =
-        new ParsedFunction(isolate, fake_function);
+        new ParsedFunction(thread, fake_function);
     Parser parser(script, parsed_function, token_pos);
     parser.set_current_class(cls);
 
     RawObject* metadata = parser.EvaluateMetadata();
     return metadata;
   } else {
-    Error& error = Error::Handle(isolate);
+    Error& error = Error::Handle(zone);
     error = isolate->object_store()->sticky_error();
     isolate->object_store()->clear_sticky_error();
     return error.raw();
@@ -966,7 +971,7 @@
 RawArray* Parser::EvaluateMetadata() {
   CheckToken(Token::kAT, "Metadata character '@' expected");
   GrowableObjectArray& meta_values =
-      GrowableObjectArray::Handle(I, GrowableObjectArray::New());
+      GrowableObjectArray::Handle(Z, GrowableObjectArray::New());
   while (CurrentToken() == Token::kAT) {
     ConsumeToken();
     intptr_t expr_pos = TokenPos();
@@ -974,7 +979,7 @@
       ExpectIdentifier("identifier expected");
     }
     // Reject expressions with deferred library prefix eagerly.
-    Object& obj = Object::Handle(I,
+    Object& obj = Object::Handle(Z,
                                  library_.LookupLocalObject(*CurrentLiteral()));
     if (!obj.IsNull() && obj.IsLibraryPrefix()) {
       if (LibraryPrefix::Cast(obj).is_deferred_load()) {
@@ -992,7 +997,7 @@
     } else {
       // Can be x, C.x, or L.C.x.
       expr = ParsePrimary();  // Consumes x, C or L.C.
-      Class& cls = Class::Handle(I);
+      Class& cls = Class::Handle(Z);
       if (expr->IsPrimaryNode()) {
         PrimaryNode* primary_node = expr->AsPrimaryNode();
         if (primary_node->primary().IsClass()) {
@@ -1015,7 +1020,7 @@
         ConsumeToken();
         const intptr_t ident_pos = TokenPos();
         String* ident = ExpectIdentifier("identifier expected");
-        const Field& field = Field::Handle(I, cls.LookupStaticField(*ident));
+        const Field& field = Field::Handle(Z, cls.LookupStaticField(*ident));
         if (field.IsNull()) {
           ReportError(ident_pos,
                       "Class '%s' has no field '%s'",
@@ -1048,7 +1053,7 @@
   OpenFunctionBlock(parsed_function()->function());
   intptr_t expr_pos = TokenPos();
   AstNode* expr = ParseExpr(kAllowConst, kConsumeCascades);
-  ReturnNode* ret = new(I) ReturnNode(expr_pos, expr);
+  ReturnNode* ret = new(Z) ReturnNode(expr_pos, expr);
   current_block_->statements->Add(ret);
   return CloseBlock();
 }
@@ -1057,17 +1062,19 @@
 ParsedFunction* Parser::ParseStaticFieldInitializer(const Field& field) {
   ASSERT(field.is_static());
   ASSERT(field.value() == Object::transition_sentinel().raw());
-  Isolate* isolate = Isolate::Current();
+  Thread* thread = Thread::Current();
+  // TODO(koda): Should there be a StackZone here?
+  Zone* zone = thread->zone();
 
-  const Class& script_cls = Class::Handle(isolate, field.origin());
-  const Script& script = Script::Handle(isolate, script_cls.script());
+  const Class& script_cls = Class::Handle(zone, field.origin());
+  const Script& script = Script::Handle(zone, script_cls.script());
 
-  const String& field_name = String::Handle(isolate, field.name());
-  String& init_name = String::Handle(isolate,
+  const String& field_name = String::Handle(zone, field.name());
+  String& init_name = String::Handle(zone,
       String::Concat(Symbols::InitPrefix(), field_name));
   init_name = Symbols::New(init_name);
 
-  const Function& initializer = Function::ZoneHandle(isolate,
+  const Function& initializer = Function::ZoneHandle(zone,
       Function::New(init_name,
                     RawFunction::kRegularFunction,
                     true,   // static
@@ -1077,17 +1084,17 @@
                     false,  // !native
                     Class::Handle(field.owner()),
                     field.token_pos()));
-  initializer.set_result_type(AbstractType::Handle(isolate, field.type()));
+  initializer.set_result_type(AbstractType::Handle(zone, field.type()));
   // Static initializer functions are hidden from the user.
   // Since they are only executed once, we avoid optimizing
   // and inlining them. After the field is initialized, the
   // compiler can eliminate the call to the static initializer.
-  initializer.set_is_visible(false);
+  initializer.set_is_reflectable(false);
   initializer.set_is_debuggable(false);
   initializer.SetIsOptimizable(false);
   initializer.set_is_inlinable(false);
 
-  ParsedFunction* parsed_function = new ParsedFunction(isolate, initializer);
+  ParsedFunction* parsed_function = new ParsedFunction(thread, initializer);
   Parser parser(script, parsed_function, field.token_pos());
 
   SequenceNode* body = parser.ParseStaticInitializer();
@@ -1110,8 +1117,9 @@
 
 RawObject* Parser::ParseFunctionFromSource(const Class& owning_class,
                                            const String& source) {
-  Isolate* isolate = Isolate::Current();
-  StackZone zone(isolate);
+  Thread* thread = Thread::Current();
+  Isolate* isolate = thread->isolate();
+  StackZone stack_zone(isolate);
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
     const String& uri = String::Handle(Symbols::New("dynamically-added"));
@@ -1132,7 +1140,7 @@
     const Function& func =
         Function::ZoneHandle(Function::RawCast(members.functions().At(0)));
     func.set_eval_script(script);
-    ParsedFunction* parsed_function = new ParsedFunction(isolate, func);
+    ParsedFunction* parsed_function = new ParsedFunction(thread, func);
     Parser::ParseFunction(parsed_function);
     return func.raw();
   } else {
@@ -1150,7 +1158,7 @@
   ParamList params;
   ASSERT(func.num_fixed_parameters() == 0);  // static.
   ASSERT(!func.HasOptionalParameters());
-  ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
+  ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved());
 
   // Build local scope for function and populate with the formal parameters.
   OpenFunctionBlock(func);
@@ -1158,9 +1166,9 @@
 
   intptr_t ident_pos = TokenPos();
   const String& field_name = *ExpectIdentifier("field name expected");
-  const Class& field_class = Class::Handle(I, func.Owner());
+  const Class& field_class = Class::Handle(Z, func.Owner());
   const Field& field =
-      Field::ZoneHandle(I, field_class.LookupStaticField(field_name));
+      Field::ZoneHandle(Z, field_class.LookupStaticField(field_name));
 
   // Static final fields must have an initializer.
   ExpectToken(Token::kASSIGN);
@@ -1185,7 +1193,7 @@
     // The runtime function will detect circular dependencies in expressions
     // and handle errors while evaluating the expression.
     current_block_->statements->Add(
-        new (I) InitStaticFieldNode(ident_pos, field));
+        new (Z) InitStaticFieldNode(ident_pos, field));
     ReturnNode* return_node =
         new ReturnNode(ident_pos,
                        new LoadStaticFieldNode(ident_pos, field));
@@ -1208,7 +1216,7 @@
   params.AddReceiver(ReceiverType(current_class()), ident_pos);
   ASSERT(func.num_fixed_parameters() == 1);  // receiver.
   ASSERT(!func.HasOptionalParameters());
-  ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
+  ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved());
 
   // Build local scope for function and populate with the formal parameters.
   OpenFunctionBlock(func);
@@ -1217,12 +1225,12 @@
   // Receiver is local 0.
   LocalVariable* receiver = current_block_->scope->VariableAt(0);
   LoadLocalNode* load_receiver = new LoadLocalNode(ident_pos, receiver);
-  String& field_name = String::Handle(I, func.name());
+  String& field_name = String::Handle(Z, func.name());
   field_name = Field::NameFromGetter(field_name);
 
-  const Class& field_class = Class::Handle(I, func.Owner());
+  const Class& field_class = Class::Handle(Z, func.Owner());
   const Field& field =
-      Field::ZoneHandle(I, field_class.LookupInstanceField(field_name));
+      Field::ZoneHandle(Z, field_class.LookupInstanceField(field_name));
   ASSERT(!field.IsNull());
 
   LoadInstanceFieldNode* load_field =
@@ -1244,10 +1252,10 @@
   // func.token_pos() points to the name of the field.
   const intptr_t ident_pos = func.token_pos();
   const String& field_name = *CurrentLiteral();
-  const Class& field_class = Class::ZoneHandle(I, func.Owner());
+  const Class& field_class = Class::ZoneHandle(Z, func.Owner());
   const Field& field =
-      Field::ZoneHandle(I, field_class.LookupInstanceField(field_name));
-  const AbstractType& field_type = AbstractType::ZoneHandle(I, field.type());
+      Field::ZoneHandle(Z, field_class.LookupInstanceField(field_name));
+  const AbstractType& field_type = AbstractType::ZoneHandle(Z, field.type());
 
   ParamList params;
   ASSERT(current_class().raw() == func.Owner());
@@ -1257,7 +1265,7 @@
                            &field_type);
   ASSERT(func.num_fixed_parameters() == 2);  // receiver, value.
   ASSERT(!func.HasOptionalParameters());
-  ASSERT(AbstractType::Handle(I, func.result_type()).IsVoidType());
+  ASSERT(AbstractType::Handle(Z, func.result_type()).IsVoidType());
 
   // Build local scope for function and populate with the formal parameters.
   OpenFunctionBlock(func);
@@ -1298,7 +1306,7 @@
 
   ClosureNode* closure = new ClosureNode(
       ident_pos,
-      Function::ZoneHandle(I, func.extracted_method_closure()),
+      Function::ZoneHandle(Z, func.extracted_method_closure()),
       load_receiver,
       NULL);
 
@@ -1321,8 +1329,8 @@
     ParamDesc p;
     char name[64];
     OS::SNPrint(name, 64, ":p%" Pd, i);
-    p.name = &String::ZoneHandle(I, Symbols::New(name));
-    p.type = &Type::ZoneHandle(I, Type::DynamicType());
+    p.name = &String::ZoneHandle(Z, Symbols::New(name));
+    p.type = &Type::ZoneHandle(Z, Type::DynamicType());
     params.parameters->Add(p);
     params.num_fixed_parameters++;
   }
@@ -1332,8 +1340,8 @@
   for (; i < desc.Count(); ++i) {
     ParamDesc p;
     intptr_t index = i - desc.PositionalCount();
-    p.name = &String::ZoneHandle(I, desc.NameAt(index));
-    p.type = &Type::ZoneHandle(I, Type::DynamicType());
+    p.name = &String::ZoneHandle(Z, desc.NameAt(index));
+    p.type = &Type::ZoneHandle(Z, Type::DynamicType());
     p.default_value = &Object::null_object();
     params.parameters->Add(p);
     params.num_optional_parameters++;
@@ -1357,7 +1365,7 @@
   ASSERT(func.token_pos() == 0);
   ASSERT(current_class().raw() == func.Owner());
 
-  ArgumentsDescriptor desc(Array::Handle(I, func.saved_args_desc()));
+  ArgumentsDescriptor desc(Array::Handle(Z, func.saved_args_desc()));
   ASSERT(desc.Count() > 0);
 
   // Set up scope for this function.
@@ -1372,27 +1380,27 @@
 
   if (desc.NamedCount() > 0) {
     const Array& arg_names =
-        Array::ZoneHandle(I, Array::New(desc.NamedCount()));
+        Array::ZoneHandle(Z, Array::New(desc.NamedCount()));
     for (intptr_t i = 0; i < arg_names.Length(); ++i) {
-      arg_names.SetAt(i, String::Handle(I, desc.NameAt(i)));
+      arg_names.SetAt(i, String::Handle(Z, desc.NameAt(i)));
     }
     func_args->set_names(arg_names);
   }
 
-  const String& func_name = String::ZoneHandle(I, func.name());
+  const String& func_name = String::ZoneHandle(Z, func.name());
   ArgumentListNode* arguments = BuildNoSuchMethodArguments(
       token_pos, func_name, *func_args, NULL, false);
   const intptr_t kNumArguments = 2;  // Receiver, InvocationMirror.
   ArgumentsDescriptor args_desc(
-      Array::Handle(I, ArgumentsDescriptor::New(kNumArguments)));
-  Function& no_such_method = Function::ZoneHandle(I,
-      Resolver::ResolveDynamicForReceiverClass(Class::Handle(I, func.Owner()),
+      Array::Handle(Z, ArgumentsDescriptor::New(kNumArguments)));
+  Function& no_such_method = Function::ZoneHandle(Z,
+      Resolver::ResolveDynamicForReceiverClass(Class::Handle(Z, func.Owner()),
                                                Symbols::NoSuchMethod(),
                                                args_desc));
   if (no_such_method.IsNull()) {
     // If noSuchMethod(i) is not found, call Object:noSuchMethod.
     no_such_method ^= Resolver::ResolveDynamicForReceiverClass(
-        Class::Handle(I, I->object_store()->object_class()),
+        Class::Handle(Z, I->object_store()->object_class()),
         Symbols::NoSuchMethod(),
         args_desc);
   }
@@ -1414,7 +1422,7 @@
   ASSERT(func.token_pos() == 0);
   ASSERT(current_class().raw() == func.Owner());
 
-  const Array& args_desc = Array::Handle(I, func.saved_args_desc());
+  const Array& args_desc = Array::Handle(Z, func.saved_args_desc());
   ArgumentsDescriptor desc(args_desc);
   ASSERT(desc.Count() > 0);
 
@@ -1426,16 +1434,16 @@
   ArgumentListNode* no_args = new ArgumentListNode(token_pos);
   LoadLocalNode* receiver = new LoadLocalNode(token_pos, scope->VariableAt(0));
 
-  const String& name = String::Handle(I, func.name());
-  const String& getter_name = String::ZoneHandle(I,
-      Symbols::New(String::Handle(I, Field::GetterName(name))));
-  InstanceCallNode* getter_call = new(I) InstanceCallNode(
+  const String& name = String::Handle(Z, func.name());
+  const String& getter_name = String::ZoneHandle(Z,
+      Symbols::New(String::Handle(Z, Field::GetterName(name))));
+  InstanceCallNode* getter_call = new(Z) InstanceCallNode(
       token_pos, receiver, getter_name, no_args);
 
   // Pass arguments 1..n to the closure call.
-  ArgumentListNode* args = new(I) ArgumentListNode(token_pos);
+  ArgumentListNode* args = new(Z) ArgumentListNode(token_pos);
   const Array& names = Array::Handle(
-      I, Array::New(desc.NamedCount(), Heap::kOld));
+      Z, Array::New(desc.NamedCount(), Heap::kOld));
   // Positional parameters.
   intptr_t i = 1;
   for (; i < desc.PositionalCount(); ++i) {
@@ -1443,13 +1451,13 @@
   }
   // Named parameters.
   for (; i < desc.Count(); i++) {
-    args->Add(new(I) LoadLocalNode(token_pos, scope->VariableAt(i)));
+    args->Add(new(Z) LoadLocalNode(token_pos, scope->VariableAt(i)));
     intptr_t index = i - desc.PositionalCount();
-    names.SetAt(index, String::Handle(I, desc.NameAt(index)));
+    names.SetAt(index, String::Handle(Z, desc.NameAt(index)));
   }
   args->set_names(names);
 
-  const Class& owner = Class::Handle(I, func.Owner());
+  const Class& owner = Class::Handle(Z, func.Owner());
   ASSERT(!owner.IsNull());
   AstNode* result = NULL;
   if (owner.IsSignatureClass() && name.Equals(Symbols::Call())) {
@@ -1529,7 +1537,7 @@
   bool this_seen = false;
 
   if (evaluate_metadata && (CurrentToken() == Token::kAT)) {
-    parameter.metadata = &Array::ZoneHandle(I, EvaluateMetadata());
+    parameter.metadata = &Array::ZoneHandle(Z, EvaluateMetadata());
   } else {
     SkipMetadata();
   }
@@ -1543,7 +1551,7 @@
     // The parameter type is the 'dynamic' type.
     // If this is an initializing formal, its type will be set to the type of
     // the respective field when the constructor is fully parsed.
-    parameter.type = &Type::ZoneHandle(I, Type::DynamicType());
+    parameter.type = &Type::ZoneHandle(Z, Type::DynamicType());
   }
   if (CurrentToken() == Token::kTHIS) {
     ConsumeToken();
@@ -1556,7 +1564,7 @@
     // This must later be changed to a closure type if we recognize
     // a closure/function type parameter. We check this at the end
     // of ParseFormalParameter.
-    parameter.type = &Type::ZoneHandle(I, Type::VoidType());
+    parameter.type = &Type::ZoneHandle(Z, Type::VoidType());
   }
   if (parameter.type == NULL) {
     // At this point, we must see an identifier for the type or the
@@ -1577,13 +1585,13 @@
       // mode, because they are part of the function type of closurized
       // functions appearing in type tests with typedefs.
       parameter.has_explicit_type = true;
-      parameter.type = &AbstractType::ZoneHandle(I,
+      parameter.type = &AbstractType::ZoneHandle(Z,
           ParseType(is_top_level_ ? ClassFinalizer::kResolveTypeParameters :
                                     ClassFinalizer::kCanonicalize));
     } else {
       // If this is an initializing formal, its type will be set to the type of
       // the respective field when the constructor is fully parsed.
-      parameter.type = &Type::ZoneHandle(I, Type::DynamicType());
+      parameter.type = &Type::ZoneHandle(Z, Type::DynamicType());
     }
   }
   if (!this_seen && (CurrentToken() == Token::kTHIS)) {
@@ -1623,7 +1631,7 @@
     if (!var_seen && !parameter.is_final) {
       // The parsed parameter type is actually the function result type.
       const AbstractType& result_type =
-          AbstractType::Handle(I, parameter.type->raw());
+          AbstractType::Handle(Z, parameter.type->raw());
 
       // Finish parsing the function type parameter.
       ParamList func_params;
@@ -1632,13 +1640,13 @@
       func_params.AddFinalParameter(
           TokenPos(),
           &Symbols::ClosureParameter(),
-          &Type::ZoneHandle(I, Type::DynamicType()));
+          &Type::ZoneHandle(Z, Type::DynamicType()));
 
       const bool no_explicit_default_values = false;
       ParseFormalParameterList(no_explicit_default_values, false, &func_params);
 
       // The field 'is_static' has no meaning for signature functions.
-      const Function& signature_function = Function::Handle(I,
+      const Function& signature_function = Function::Handle(Z,
           Function::New(*parameter.name,
                         RawFunction::kSignatureFunction,
                         /* is_static = */ false,
@@ -1651,12 +1659,12 @@
       signature_function.set_result_type(result_type);
       signature_function.set_is_debuggable(false);
       AddFormalParamsToFunction(&func_params, signature_function);
-      const String& signature = String::Handle(I,
+      const String& signature = String::Handle(Z,
                                                signature_function.Signature());
       // Lookup the signature class, i.e. the class whose name is the signature.
       // We only lookup in the current library, but not in its imports, and only
       // create a new canonical signature class if it does not exist yet.
-      Class& signature_class = Class::ZoneHandle(I,
+      Class& signature_class = Class::ZoneHandle(Z,
           library_.LookupLocalClass(signature));
       if (signature_class.IsNull()) {
         signature_class = Class::NewSignatureClass(signature,
@@ -1674,7 +1682,7 @@
       }
       ASSERT(signature_function.signature_class() == signature_class.raw());
       Type& signature_type =
-          Type::ZoneHandle(I, signature_class.SignatureType());
+          Type::ZoneHandle(Z, signature_class.SignatureType());
       if (!is_top_level_ && !signature_type.IsFinalized()) {
         signature_type ^= ClassFinalizer::FinalizeType(
             signature_class, signature_type, ClassFinalizer::kCanonicalize);
@@ -1814,12 +1822,12 @@
                                       ArgumentListNode* arguments,
                                       bool resolve_getter,
                                       bool* is_no_such_method) {
-  const Class& super_class = Class::Handle(I, current_class().SuperClass());
+  const Class& super_class = Class::Handle(Z, current_class().SuperClass());
   if (super_class.IsNull()) {
     ReportError(token_pos, "class '%s' does not have a superclass",
-                String::Handle(I, current_class().Name()).ToCString());
+                String::Handle(Z, current_class().Name()).ToCString());
   }
-  Function& super_func = Function::Handle(I,
+  Function& super_func = Function::Handle(Z,
       Resolver::ResolveDynamicAnyArgs(super_class, name));
   if (!super_func.IsNull() &&
       !super_func.AreValidArguments(arguments->length(),
@@ -1827,7 +1835,7 @@
                                     NULL)) {
     super_func = Function::null();
   } else if (super_func.IsNull() && resolve_getter) {
-    const String& getter_name = String::ZoneHandle(I, Field::GetterName(name));
+    const String& getter_name = String::ZoneHandle(Z, Field::GetterName(name));
     super_func = Resolver::ResolveDynamicAnyArgs(super_class, getter_name);
     ASSERT(super_func.IsNull() ||
            (super_func.kind() != RawFunction::kImplicitStaticFinalGetter));
@@ -1926,7 +1934,7 @@
 
   const bool kResolveGetter = true;
   bool is_no_such_method = false;
-  const Function& super_function = Function::ZoneHandle(I,
+  const Function& super_function = Function::ZoneHandle(Z,
       GetSuperFunction(supercall_pos,
                        function_name,
                        arguments,
@@ -1935,7 +1943,7 @@
   if (super_function.IsGetterFunction() ||
       super_function.IsImplicitGetterFunction()) {
     const Class& super_class =
-        Class::ZoneHandle(I, current_class().SuperClass());
+        Class::ZoneHandle(Z, current_class().SuperClass());
     AstNode* closure = new StaticGetterNode(supercall_pos,
                                             LoadReceiver(supercall_pos),
                                             /* is_super_getter */ true,
@@ -1970,13 +1978,13 @@
       (op == Token::kBIT_NOT)) {
     // Resolve the operator function in the superclass.
     const String& operator_function_name =
-        String::ZoneHandle(I, Symbols::New(Token::Str(op)));
+        String::ZoneHandle(Z, Symbols::New(Token::Str(op)));
     ArgumentListNode* op_arguments = new ArgumentListNode(super_pos);
     AstNode* receiver = LoadReceiver(super_pos);
     op_arguments->Add(receiver);
     const bool kResolveGetter = false;
     bool is_no_such_method = false;
-    const Function& super_operator = Function::ZoneHandle(I,
+    const Function& super_operator = Function::ZoneHandle(Z,
         GetSuperFunction(super_pos,
                          operator_function_name,
                          op_arguments,
@@ -2005,7 +2013,7 @@
     ExpectToken(Token::kRBRACK);
     AstNode* receiver = LoadReceiver(operator_pos);
     const Class& super_class =
-        Class::ZoneHandle(I, current_class().SuperClass());
+        Class::ZoneHandle(Z, current_class().SuperClass());
     ASSERT(!super_class.IsNull());
     super_op =
         new LoadIndexedNode(operator_pos, receiver, index_expr, super_class);
@@ -2031,10 +2039,10 @@
 
     // Resolve the operator function in the superclass.
     const String& operator_function_name =
-        String::ZoneHandle(I, Symbols::New(Token::Str(op)));
+        String::ZoneHandle(Z, Symbols::New(Token::Str(op)));
     const bool kResolveGetter = false;
     bool is_no_such_method = false;
-    const Function& super_operator = Function::ZoneHandle(I,
+    const Function& super_operator = Function::ZoneHandle(Z,
         GetSuperFunction(operator_pos,
                          operator_function_name,
                          op_arguments,
@@ -2057,13 +2065,13 @@
                                                intptr_t token_pos,
                                                AstNode* receiver) {
   Function& implicit_closure_function =
-      Function::ZoneHandle(I, func.ImplicitClosureFunction());
+      Function::ZoneHandle(Z, func.ImplicitClosureFunction());
   if (receiver != NULL) {
     // If we create an implicit instance closure from inside a closure of a
     // parameterized class, make sure that the receiver is captured as
     // instantiator.
     if (current_block_->scope->function_level() > 0) {
-      const Class& signature_class = Class::Handle(I,
+      const Class& signature_class = Class::Handle(Z,
           implicit_closure_function.signature_class());
       if (signature_class.NumTypeParameters() > 0) {
         CaptureInstantiator();
@@ -2077,28 +2085,28 @@
 AstNode* Parser::ParseSuperFieldAccess(const String& field_name,
                                        intptr_t field_pos) {
   TRACE_PARSER("ParseSuperFieldAccess");
-  const Class& super_class = Class::ZoneHandle(I, current_class().SuperClass());
+  const Class& super_class = Class::ZoneHandle(Z, current_class().SuperClass());
   if (super_class.IsNull()) {
     ReportError("class '%s' does not have a superclass",
-                String::Handle(I, current_class().Name()).ToCString());
+                String::Handle(Z, current_class().Name()).ToCString());
   }
   AstNode* implicit_argument = LoadReceiver(field_pos);
 
   const String& getter_name =
-      String::ZoneHandle(I, Field::GetterName(field_name));
-  const Function& super_getter = Function::ZoneHandle(I,
+      String::ZoneHandle(Z, Field::GetterName(field_name));
+  const Function& super_getter = Function::ZoneHandle(Z,
       Resolver::ResolveDynamicAnyArgs(super_class, getter_name));
   if (super_getter.IsNull()) {
     const String& setter_name =
-        String::ZoneHandle(I, Field::SetterName(field_name));
-    const Function& super_setter = Function::ZoneHandle(I,
+        String::ZoneHandle(Z, Field::SetterName(field_name));
+    const Function& super_setter = Function::ZoneHandle(Z,
         Resolver::ResolveDynamicAnyArgs(super_class, setter_name));
     if (super_setter.IsNull()) {
       // Check if this is an access to an implicit closure using 'super'.
       // If a function exists of the specified field_name then try
       // accessing it as a getter, at runtime we will handle this by
       // creating an implicit closure of the function and returning it.
-      const Function& super_function = Function::ZoneHandle(I,
+      const Function& super_function = Function::ZoneHandle(Z,
           Resolver::ResolveDynamicAnyArgs(super_class, field_name));
       if (!super_function.IsNull()) {
         // In case CreateAssignmentNode is called later on this
@@ -2120,16 +2128,16 @@
                                           intptr_t supercall_pos,
                                           LocalVariable* receiver,
                                           ArgumentListNode* forwarding_args) {
-  const Class& super_class = Class::Handle(I, cls.SuperClass());
+  const Class& super_class = Class::Handle(Z, cls.SuperClass());
   // Omit the implicit super() if there is no super class (i.e.
   // we're not compiling class Object), or if the super class is an
   // artificially generated "wrapper class" that has no constructor.
   if (super_class.IsNull() ||
       (super_class.num_native_fields() > 0 &&
-       Class::Handle(I, super_class.SuperClass()).IsObjectClass())) {
+       Class::Handle(Z, super_class.SuperClass()).IsObjectClass())) {
     return;
   }
-  String& super_ctor_name = String::Handle(I, super_class.Name());
+  String& super_ctor_name = String::Handle(Z, super_class.Name());
   super_ctor_name = String::Concat(super_ctor_name, Symbols::Dot());
 
   ArgumentListNode* arguments = new ArgumentListNode(supercall_pos);
@@ -2139,7 +2147,7 @@
   // Implicit construction phase parameter is second argument.
   AstNode* phase_parameter =
       new LiteralNode(supercall_pos,
-                      Smi::ZoneHandle(I, Smi::New(Function::kCtorPhaseAll)));
+                      Smi::ZoneHandle(Z, Smi::New(Function::kCtorPhaseAll)));
   arguments->Add(phase_parameter);
 
   // If this is a super call in a forwarding constructor, add the user-
@@ -2149,8 +2157,8 @@
     for (int i = 0; i < forwarding_args->length(); i++) {
       arguments->Add(forwarding_args->NodeAt(i));
     }
-    String& ctor_name = String::Handle(I, current_function().name());
-    String& class_name = String::Handle(I, cls.Name());
+    String& ctor_name = String::Handle(Z, current_function().name());
+    String& class_name = String::Handle(Z, cls.Name());
     if (ctor_name.Length() > class_name.Length() + 1) {
       // Generating a forwarding call to a named constructor 'C.n'.
       // Add the constructor name 'n' to the super constructor.
@@ -2160,24 +2168,24 @@
   }
 
   // Resolve super constructor function and check arguments.
-  const Function& super_ctor = Function::ZoneHandle(I,
+  const Function& super_ctor = Function::ZoneHandle(Z,
       super_class.LookupConstructor(super_ctor_name));
   if (super_ctor.IsNull()) {
       ReportError(supercall_pos,
                   "unresolved implicit call to super constructor '%s()'",
-                  String::Handle(I, super_class.Name()).ToCString());
+                  String::Handle(Z, super_class.Name()).ToCString());
   }
   if (current_function().is_const() && !super_ctor.is_const()) {
     ReportError(supercall_pos, "implicit call to non-const super constructor");
   }
 
-  String& error_message = String::Handle(I);
+  String& error_message = String::Handle(Z);
   if (!super_ctor.AreValidArguments(arguments->length(),
                                     arguments->names(),
                                     &error_message)) {
     ReportError(supercall_pos,
                 "invalid arguments passed to super constructor '%s()': %s",
-                String::Handle(I, super_class.Name()).ToCString(),
+                String::Handle(Z, super_class.Name()).ToCString(),
                 error_message.ToCString());
   }
   current_block_->statements->Add(
@@ -2191,9 +2199,9 @@
   ASSERT(CurrentToken() == Token::kSUPER);
   const intptr_t supercall_pos = TokenPos();
   ConsumeToken();
-  const Class& super_class = Class::Handle(I, cls.SuperClass());
+  const Class& super_class = Class::Handle(Z, cls.SuperClass());
   ASSERT(!super_class.IsNull());
-  String& ctor_name = String::Handle(I, super_class.Name());
+  String& ctor_name = String::Handle(Z, super_class.Name());
   ctor_name = String::Concat(ctor_name, Symbols::Dot());
   if (CurrentToken() == Token::kPERIOD) {
     ConsumeToken();
@@ -2212,7 +2220,7 @@
   // super initializer.
   AstNode* phase_parameter =
       new LiteralNode(supercall_pos,
-                      Smi::ZoneHandle(I, Smi::New(Function::kCtorPhaseAll)));
+                      Smi::ZoneHandle(Z, Smi::New(Function::kCtorPhaseAll)));
   arguments->Add(phase_parameter);
   // 'this' parameter must not be accessible to the other super call arguments.
   receiver->set_invisible(true);
@@ -2220,7 +2228,7 @@
   receiver->set_invisible(false);
 
   // Resolve the constructor.
-  const Function& super_ctor = Function::ZoneHandle(I,
+  const Function& super_ctor = Function::ZoneHandle(Z,
       super_class.LookupConstructor(ctor_name));
   if (super_ctor.IsNull()) {
     ReportError(supercall_pos,
@@ -2230,7 +2238,7 @@
   if (current_function().is_const() && !super_ctor.is_const()) {
     ReportError(supercall_pos, "super constructor must be const");
   }
-  String& error_message = String::Handle(I);
+  String& error_message = String::Handle(Z);
   if (!super_ctor.AreValidArguments(arguments->length(),
                                     arguments->names(),
                                     &error_message)) {
@@ -2268,26 +2276,26 @@
     ReportError(field_pos,
                 "initializer expression must be compile time constant.");
   }
-  Field& field = Field::ZoneHandle(I, cls.LookupInstanceField(field_name));
+  Field& field = Field::ZoneHandle(Z, cls.LookupInstanceField(field_name));
   if (field.IsNull()) {
     ReportError(field_pos, "unresolved reference to instance field '%s'",
                 field_name.ToCString());
   }
   EnsureExpressionTemp();
-  AstNode* instance = new(I) LoadLocalNode(field_pos, receiver);
+  AstNode* instance = new(Z) LoadLocalNode(field_pos, receiver);
   AstNode* initializer = CheckDuplicateFieldInit(field_pos,
       initialized_fields, instance, &field, init_expr);
   if (initializer == NULL) {
     initializer =
-        new(I) StoreInstanceFieldNode(field_pos, instance, field, init_expr);
+        new(Z) StoreInstanceFieldNode(field_pos, instance, field, init_expr);
   }
   return initializer;
 }
 
 
 void Parser::CheckFieldsInitialized(const Class& cls) {
-  const Array& fields = Array::Handle(I, cls.fields());
-  Field& field = Field::Handle(I);
+  const Array& fields = Array::Handle(Z, cls.fields());
+  Field& field = Field::Handle(Z);
   SequenceNode* initializers = current_block_->statements;
   for (int field_num = 0; field_num < fields.Length(); field_num++) {
     field ^= fields.At(field_num);
@@ -2310,7 +2318,7 @@
 
     if (found) continue;
 
-    field.RecordStore(Object::Handle(I));
+    field.RecordStore(Object::Handle(Z));
   }
 }
 
@@ -2320,14 +2328,14 @@
   // from a different class. We need to save and restore current
   // class, library, and token stream (script).
   ASSERT(current_class().raw() != field.origin());
-  const Class& saved_class = Class::Handle(I, current_class().raw());
-  const Library& saved_library = Library::Handle(I, library().raw());
-  const Script& saved_script = Script::Handle(I, script().raw());
+  const Class& saved_class = Class::Handle(Z, current_class().raw());
+  const Library& saved_library = Library::Handle(Z, library().raw());
+  const Script& saved_script = Script::Handle(Z, script().raw());
   const intptr_t saved_token_pos = TokenPos();
 
-  set_current_class(Class::Handle(I, field.origin()));
-  set_library(Library::Handle(I, current_class().library()));
-  SetScript(Script::Handle(I, current_class().script()),
+  set_current_class(Class::Handle(Z, field.origin()));
+  set_library(Library::Handle(Z, current_class().library()));
+  SetScript(Script::Handle(Z, current_class().script()),
             field.token_pos());
 
   ASSERT(IsIdentifier());
@@ -2356,13 +2364,13 @@
                  LocalVariable* receiver,
                  GrowableArray<Field*>* initialized_fields) {
   TRACE_PARSER("ParseInitializedInstanceFields");
-  const Array& fields = Array::Handle(I, cls.fields());
-  Field& f = Field::Handle(I);
+  const Array& fields = Array::Handle(Z, cls.fields());
+  Field& f = Field::Handle(Z);
   const intptr_t saved_pos = TokenPos();
   for (int i = 0; i < fields.Length(); i++) {
     f ^= fields.At(i);
     if (!f.is_static() && f.has_initializer()) {
-      Field& field = Field::ZoneHandle(I);
+      Field& field = Field::ZoneHandle(Z);
       field ^= fields.At(i);
       if (field.is_final()) {
         // Final fields with initializer expression may not be initialized
@@ -2443,46 +2451,46 @@
       //     List argumentNames,
       //     List existingArgumentNames);
 
-      ArgumentListNode* nsm_args = new(I) ArgumentListNode(init_pos);
+      ArgumentListNode* nsm_args = new(Z) ArgumentListNode(init_pos);
       // Object receiver.
       nsm_args->Add(instance);
 
       // String memberName.
       String& setter_name = String::ZoneHandle(field->name());
       setter_name = Field::SetterSymbol(setter_name);
-      nsm_args->Add(new(I) LiteralNode(init_pos, setter_name));
+      nsm_args->Add(new(Z) LiteralNode(init_pos, setter_name));
 
       // Smi invocation_type.
       const int invocation_type =
           InvocationMirror::EncodeType(InvocationMirror::kDynamic,
                                        InvocationMirror::kSetter);
-      nsm_args->Add(new(I) LiteralNode(
-          init_pos, Smi::ZoneHandle(I, Smi::New(invocation_type))));
+      nsm_args->Add(new(Z) LiteralNode(
+          init_pos, Smi::ZoneHandle(Z, Smi::New(invocation_type))));
 
       // List arguments.
       GrowableArray<AstNode*> setter_args;
       setter_args.Add(init_value);
-      ArrayNode* setter_args_array = new(I) ArrayNode(
+      ArrayNode* setter_args_array = new(Z) ArrayNode(
           init_pos,
-          Type::ZoneHandle(I, Type::ArrayType()),
+          Type::ZoneHandle(Z, Type::ArrayType()),
           setter_args);
       nsm_args->Add(setter_args_array);
 
       // List argumentNames.
       // The missing implicit setter of the field has no argument names.
-      nsm_args->Add(new(I) LiteralNode(init_pos, Array::ZoneHandle(I)));
+      nsm_args->Add(new(Z) LiteralNode(init_pos, Array::ZoneHandle(Z)));
 
       // List existingArgumentNames.
       // There is no setter for the final field, thus there are
       // no existing names.
-      nsm_args->Add(new(I) LiteralNode(init_pos, Array::ZoneHandle(I)));
+      nsm_args->Add(new(Z) LiteralNode(init_pos, Array::ZoneHandle(Z)));
 
       AstNode* nsm_call =
           MakeStaticCall(Symbols::NoSuchMethodError(),
           Library::PrivateCoreLibName(Symbols::ThrowNew()),
           nsm_args);
 
-      LetNode* let = new(I) LetNode(init_pos);
+      LetNode* let = new(Z) LetNode(init_pos);
       let->AddNode(init_value);
       let->AddNode(nsm_call);
       result = let;
@@ -2498,7 +2506,7 @@
     if (initialized_field->raw() == field->raw()) {
       ReportError(init_pos,
                   "duplicate initializer for field %s",
-                  String::Handle(I, field->name()).ToCString());
+                  String::Handle(Z, field->name()).ToCString());
     }
   }
   initialized_fields->Add(field);
@@ -2543,7 +2551,7 @@
   ASSERT(CurrentToken() == Token::kTHIS);
   const intptr_t call_pos = TokenPos();
   ConsumeToken();
-  String& ctor_name = String::Handle(I, cls.Name());
+  String& ctor_name = String::Handle(Z, cls.Name());
 
   ctor_name = String::Concat(ctor_name, Symbols::Dot());
   if (CurrentToken() == Token::kPERIOD) {
@@ -2566,12 +2574,12 @@
   ParseActualParameters(arguments, kAllowConst);
   receiver->set_invisible(false);
   // Resolve the constructor.
-  const Function& redirect_ctor = Function::ZoneHandle(I,
+  const Function& redirect_ctor = Function::ZoneHandle(Z,
       cls.LookupConstructor(ctor_name));
   if (redirect_ctor.IsNull()) {
     ReportError(call_pos, "constructor '%s' not found", ctor_name.ToCString());
   }
-  String& error_message = String::Handle(I);
+  String& error_message = String::Handle(Z);
   if (!redirect_ctor.AreValidArguments(arguments->length(),
                                        arguments->names(),
                                        &error_message)) {
@@ -2598,7 +2606,7 @@
   LocalVariable* phase_parameter =
       new LocalVariable(Scanner::kNoSourcePos,
                         Symbols::PhaseParameter(),
-                        Type::ZoneHandle(I, Type::SmiType()));
+                        Type::ZoneHandle(Z, Type::SmiType()));
   current_block_->scope->InsertParameterAt(1, phase_parameter);
 
   // Parse expressions of instance fields that have an explicit
@@ -2628,7 +2636,7 @@
     // TODO(hausner): Remove this limitation if the language spec indeed
     // allows optional parameters.
     if (func.HasOptionalParameters()) {
-      const Class& super_class = Class::Handle(I, current_class().SuperClass());
+      const Class& super_class = Class::Handle(Z, current_class().SuperClass());
       ReportError(ctor_pos,
                   "cannot generate an implicit mixin application constructor "
                   "forwarding to a super class constructor with optional "
@@ -2636,7 +2644,7 @@
                   "to class '%s' that redirects to the constructor with "
                   "optional parameters and invoke it via super from a "
                   "constructor of the class extending the mixin application",
-                  String::Handle(I, super_class.Name()).ToCString());
+                  String::Handle(Z, super_class.Name()).ToCString());
     }
 
     // Prepare user-defined arguments to be forwarded to super call.
@@ -2645,8 +2653,8 @@
     for (int i = 2; i < func.NumParameters(); i++) {
       LocalVariable* param = new LocalVariable(
           Scanner::kNoSourcePos,
-          String::ZoneHandle(I, func.ParameterNameAt(i)),
-          Type::ZoneHandle(I, Type::DynamicType()));
+          String::ZoneHandle(Z, func.ParameterNameAt(i)),
+          Type::ZoneHandle(Z, Type::DynamicType()));
       current_block_->scope->InsertParameterAt(i, param);
       forwarding_args->Add(new LoadLocalNode(Scanner::kNoSourcePos, param));
     }
@@ -2667,12 +2675,12 @@
 
 void Parser::CheckRecursiveInvocation() {
   const GrowableObjectArray& pending_functions =
-      GrowableObjectArray::Handle(I,
+      GrowableObjectArray::Handle(Z,
           I->object_store()->pending_functions());
   for (int i = 0; i < pending_functions.Length(); i++) {
     if (pending_functions.At(i) == current_function().raw()) {
       const String& fname =
-          String::Handle(I, current_function().UserVisibleName());
+          String::Handle(Z, current_function().UserVisibleName());
       ReportError("circular dependency for function %s", fname.ToCString());
     }
   }
@@ -2691,7 +2699,7 @@
   ASSERT(!func.IsFactory());
   ASSERT(!func.is_static());
   ASSERT(!func.IsLocalFunction());
-  const Class& cls = Class::Handle(I, func.Owner());
+  const Class& cls = Class::Handle(Z, func.Owner());
   ASSERT(!cls.IsNull());
 
   CheckRecursiveInvocation();
@@ -2720,7 +2728,7 @@
   params.AddFinalParameter(
       TokenPos(),
       &Symbols::PhaseParameter(),
-      &Type::ZoneHandle(I, Type::SmiType()));
+      &Type::ZoneHandle(Z, Type::SmiType()));
 
   if (func.is_const()) {
     params.SetImplicitlyFinal();
@@ -2728,7 +2736,7 @@
   ParseFormalParameterList(allow_explicit_default_values, false, &params);
 
   SetupDefaultsForOptionalParams(&params, default_parameter_values);
-  ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
+  ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved());
   ASSERT(func.NumParameters() == params.parameters->length());
 
   // Now populate function scope with the formal parameters.
@@ -2768,7 +2776,7 @@
       if (param.is_field_initializer) {
         const String& field_name = *param.name;
         Field& field =
-            Field::ZoneHandle(I, cls.LookupInstanceField(field_name));
+            Field::ZoneHandle(Z, cls.LookupInstanceField(field_name));
         if (field.IsNull()) {
           ReportError(param.name_pos,
                       "unresolved reference to instance field '%s'",
@@ -2782,7 +2790,7 @@
 
         if (!param.has_explicit_type) {
           const AbstractType& field_type =
-              AbstractType::ZoneHandle(I, field.type());
+              AbstractType::ZoneHandle(Z, field.type());
           param.type = &field_type;
           // Parameter type was already set to dynamic when parsing the class
           // declaration: fix it.
@@ -2805,7 +2813,7 @@
                                     &field,
                                     value);
         if (initializer == NULL) {
-          initializer = new(I) StoreInstanceFieldNode(
+          initializer = new(Z) StoreInstanceFieldNode(
               param.name_pos, instance, field, value);
         }
         current_block_->statements->Add(initializer);
@@ -2832,13 +2840,13 @@
     AstNode* phase_check = new BinaryOpNode(
         Scanner::kNoSourcePos, Token::kBIT_AND, phase_value,
         new LiteralNode(Scanner::kNoSourcePos,
-            Smi::ZoneHandle(I, Smi::New(Function::kCtorPhaseInit))));
+            Smi::ZoneHandle(Z, Smi::New(Function::kCtorPhaseInit))));
     AstNode* comparison =
         new ComparisonNode(Scanner::kNoSourcePos,
                            Token::kNE_STRICT,
                            phase_check,
                            new LiteralNode(TokenPos(),
-                                           Smi::ZoneHandle(I, Smi::New(0))));
+                                           Smi::ZoneHandle(Z, Smi::New(0))));
     AstNode* guarded_init_statements =
         new IfNode(Scanner::kNoSourcePos,
                    comparison,
@@ -2901,14 +2909,14 @@
     const Function& super_ctor = super_call->function();
     // Patch the initializer call so it only executes the super initializer.
     initializer_args->SetNodeAt(1, new LiteralNode(
-        body_pos, Smi::ZoneHandle(I, Smi::New(Function::kCtorPhaseInit))));
+        body_pos, Smi::ZoneHandle(Z, Smi::New(Function::kCtorPhaseInit))));
 
     ArgumentListNode* super_call_args = new ArgumentListNode(body_pos);
     // First argument is the receiver.
     super_call_args->Add(new LoadLocalNode(body_pos, receiver));
     // Second argument is the construction phase argument.
-    AstNode* phase_parameter = new(I) LiteralNode(
-        body_pos, Smi::ZoneHandle(I, Smi::New(Function::kCtorPhaseBody)));
+    AstNode* phase_parameter = new(Z) LiteralNode(
+        body_pos, Smi::ZoneHandle(Z, Smi::New(Function::kCtorPhaseBody)));
     super_call_args->Add(phase_parameter);
     super_call_args->set_names(initializer_args->names());
     for (int i = 2; i < initializer_args->length(); i++) {
@@ -2998,7 +3006,7 @@
                                 Array* default_parameter_values) {
   TRACE_PARSER("ParseFunc");
   Function& saved_innermost_function =
-      Function::Handle(I, innermost_function().raw());
+      Function::Handle(Z, innermost_function().raw());
   innermost_function_ = func.raw();
 
   // Save current try index. Try index starts at zero for each function.
@@ -3010,7 +3018,7 @@
   // temporaries are added.
   LocalVariable* saved_saved_try_ctx = parsed_function()->saved_try_ctx();
   const String& saved_async_saved_try_ctx_name =
-      String::Handle(I, parsed_function()->async_saved_try_ctx_name());
+      String::Handle(Z, parsed_function()->async_saved_try_ctx_name());
   parsed_function()->reset_saved_try_ctx_vars();
   LocalScope* saved_async_temp_scope = async_temp_scope_;
 
@@ -3033,7 +3041,7 @@
     params.AddFinalParameter(
         TokenPos(),
         &Symbols::ClosureParameter(),
-        &Type::ZoneHandle(I, Type::DynamicType()));
+        &Type::ZoneHandle(Z, Type::DynamicType()));
   } else if (!func.is_static()) {
     // Static functions do not have a receiver.
     ASSERT(current_class().raw() == func.Owner());
@@ -3044,7 +3052,7 @@
     params.AddFinalParameter(
         TokenPos(),
         &Symbols::TypeArgumentsParameter(),
-        &Type::ZoneHandle(I, Type::DynamicType()));
+        &Type::ZoneHandle(Z, Type::DynamicType()));
   }
   ASSERT((CurrentToken() == Token::kLPAREN) ||
          func.IsGetterFunction() ||
@@ -3060,7 +3068,7 @@
     // * A continuation error.
     //
     // If the error!=null we rethrow the error at the next await.
-    const Type& dynamic_type = Type::ZoneHandle(I, Type::DynamicType());
+    const Type& dynamic_type = Type::ZoneHandle(Z, Type::DynamicType());
     ParamDesc result_param;
     result_param.name = &Symbols::AsyncOperationParam();
     result_param.default_value = &Object::null_instance();
@@ -3075,7 +3083,7 @@
     params.has_optional_positional_parameters = true;
     SetupDefaultsForOptionalParams(&params, default_parameter_values);
     AddFormalParamsToScope(&params, current_block_->scope);
-    ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
+    ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved());
     ASSERT(func.NumParameters() == params.parameters->length());
     if (!Function::Handle(func.parent_function()).IsGetterFunction()) {
       // Parse and discard any formal parameters. They are accessed as
@@ -3094,7 +3102,7 @@
       AddFormalParamsToFunction(&params, func);
     }
     SetupDefaultsForOptionalParams(&params, default_parameter_values);
-    ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
+    ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved());
     ASSERT(func.NumParameters() == params.parameters->length());
 
     // Check whether the function has any field initializer formal parameters,
@@ -3130,7 +3138,7 @@
 
   OpenBlock();  // Open a nested scope for the outermost function block.
 
-  Function& async_closure = Function::ZoneHandle(I);
+  Function& async_closure = Function::ZoneHandle(Z);
   if (func.IsAsyncFunction() && !func.is_async_closure()) {
     // The code of an async function is synthesized. Disable debugging.
     func.set_is_debuggable(false);
@@ -3146,8 +3154,8 @@
   intptr_t end_token_pos = 0;
   if (CurrentToken() == Token::kLBRACE) {
     ConsumeToken();
-    if (String::Handle(I, func.name()).Equals(Symbols::EqualOperator())) {
-      const Class& owner = Class::Handle(I, func.Owner());
+    if (String::Handle(Z, func.name()).Equals(Symbols::EqualOperator())) {
+      const Class& owner = Class::Handle(Z, func.Owner());
       if (!owner.IsObjectClass()) {
         AddEqualityNullCheck();
       }
@@ -3157,9 +3165,9 @@
     ExpectToken(Token::kRBRACE);
   } else if (CurrentToken() == Token::kARROW) {
     ConsumeToken();
-    if (String::Handle(I, func.name()).Equals(
+    if (String::Handle(Z, func.name()).Equals(
         Symbols::EqualOperator())) {
-      const Class& owner = Class::Handle(I, func.Owner());
+      const Class& owner = Class::Handle(Z, func.Owner());
       if (!owner.IsObjectClass()) {
         AddEqualityNullCheck();
       }
@@ -3170,9 +3178,9 @@
     current_block_->statements->Add(new ReturnNode(expr_pos, expr));
     end_token_pos = TokenPos();
   } else if (IsLiteral("native")) {
-    if (String::Handle(I, func.name()).Equals(
+    if (String::Handle(Z, func.name()).Equals(
         Symbols::EqualOperator())) {
-      const Class& owner = Class::Handle(I, func.Owner());
+      const Class& owner = Class::Handle(Z, func.Owner());
       if (!owner.IsObjectClass()) {
         AddEqualityNullCheck();
       }
@@ -3182,7 +3190,7 @@
     ExpectSemicolon();
   } else if (func.is_external()) {
     // Body of an external method contains a single throw.
-    const String& function_name = String::ZoneHandle(I, func.name());
+    const String& function_name = String::ZoneHandle(Z, func.name());
     current_block_->statements->Add(
         ThrowNoSuchMethodError(TokenPos(),
                                Class::Handle(func.Owner()),
@@ -3224,7 +3232,7 @@
       new LoadLocalNode(Scanner::kNoSourcePos,
                         current_block_->scope->parent()->VariableAt(1));
   LiteralNode* null_operand =
-      new LiteralNode(Scanner::kNoSourcePos, Instance::ZoneHandle(I));
+      new LiteralNode(Scanner::kNoSourcePos, Instance::ZoneHandle(Z));
   ComparisonNode* check_arg =
       new ComparisonNode(Scanner::kNoSourcePos,
                          Token::kEQ_STRICT,
@@ -3312,7 +3320,7 @@
   // in the library scope and return in the common case where ident is
   // not a library prefix.
   LibraryPrefix& prefix =
-      LibraryPrefix::Handle(I, library_.LookupLocalLibraryPrefix(ident));
+      LibraryPrefix::Handle(Z, library_.LookupLocalLibraryPrefix(ident));
   if (prefix.IsNull()) {
     return LibraryPrefix::null();
   }
@@ -3379,14 +3387,14 @@
     method->params.AddFinalParameter(
         formal_param_pos,
         &Symbols::TypeArgumentsParameter(),
-        &Type::ZoneHandle(I, Type::DynamicType()));
+        &Type::ZoneHandle(Z, Type::DynamicType()));
   }
   // Constructors have an implicit parameter for the construction phase.
   if (method->IsConstructor()) {
     method->params.AddFinalParameter(
         TokenPos(),
         &Symbols::PhaseParameter(),
-        &Type::ZoneHandle(I, Type::SmiType()));
+        &Type::ZoneHandle(Z, Type::SmiType()));
   }
   if (are_implicitly_final) {
     method->params.SetImplicitlyFinal();
@@ -3417,13 +3425,13 @@
     if (method->IsGetter()) {
       expected_num_parameters = (method->has_static) ? 0 : 1;
       method->dict_name = method->name;
-      method->name = &String::ZoneHandle(I, Field::GetterSymbol(*method->name));
+      method->name = &String::ZoneHandle(Z, Field::GetterSymbol(*method->name));
     } else {
       ASSERT(method->IsSetter());
       expected_num_parameters = (method->has_static) ? 1 : 2;
-      method->dict_name = &String::ZoneHandle(I,
+      method->dict_name = &String::ZoneHandle(Z,
           String::Concat(*method->name, Symbols::Equals()));
-      method->name = &String::ZoneHandle(I, Field::SetterSymbol(*method->name));
+      method->name = &String::ZoneHandle(Z, Field::SetterSymbol(*method->name));
     }
     if ((method->params.num_fixed_parameters != expected_num_parameters) ||
         (method->params.num_optional_parameters != 0)) {
@@ -3433,8 +3441,8 @@
   }
 
   // Parse redirecting factory constructor.
-  Type& redirection_type = Type::Handle(I);
-  String& redirection_identifier = String::Handle(I);
+  Type& redirection_type = Type::Handle(Z);
+  String& redirection_identifier = String::Handle(Z);
   bool is_redirecting = false;
   if (method->IsFactory() && (CurrentToken() == Token::kASSIGN)) {
     // Default parameter values are disallowed in redirecting factories.
@@ -3454,19 +3462,19 @@
     const bool consume_unresolved_prefix =
         (LookaheadToken(3) == Token::kLT) ||
         (LookaheadToken(3) == Token::kPERIOD);
-    const AbstractType& type = AbstractType::Handle(I,
+    const AbstractType& type = AbstractType::Handle(Z,
         ParseType(ClassFinalizer::kResolveTypeParameters,
                   false,  // Deferred types not allowed.
                   consume_unresolved_prefix));
     if (!type.IsMalformed() && type.IsTypeParameter()) {
       // Replace the type with a malformed type and compile a throw when called.
       redirection_type = ClassFinalizer::NewFinalizedMalformedType(
-          Error::Handle(I),  // No previous error.
+          Error::Handle(Z),  // No previous error.
           script_,
           type_pos,
           "factory '%s' may not redirect to type parameter '%s'",
           method->name->ToCString(),
-          String::Handle(I, type.UserVisibleName()).ToCString());
+          String::Handle(Z, type.UserVisibleName()).ToCString());
     } else {
       // We handle malformed and malbounded redirection type at run time.
       redirection_type ^= type.raw();
@@ -3499,7 +3507,7 @@
       }
       ConsumeToken();  // Colon.
       ExpectToken(Token::kTHIS);
-      String& redir_name = String::ZoneHandle(I,
+      String& redir_name = String::ZoneHandle(Z,
           String::Concat(members->class_name(), Symbols::Dot()));
       if (CurrentToken() == Token::kPERIOD) {
         ConsumeToken();
@@ -3637,7 +3645,7 @@
   } else {
     function_kind = RawFunction::kRegularFunction;
   }
-  Function& func = Function::Handle(I,
+  Function& func = Function::Handle(Z,
       Function::New(*method->name,
                     function_kind,
                     method->has_static,
@@ -3651,13 +3659,8 @@
   func.set_end_token_pos(method_end_pos);
   func.set_is_redirecting(is_redirecting);
   func.set_modifier(async_modifier);
-  if (method->has_native && library_.is_dart_scheme() &&
-      library_.IsPrivate(*method->name)) {
-    func.set_is_visible(false);
-  }
-  if (method->IsFactoryOrConstructor() && library_.is_dart_scheme() &&
-      library_.IsPrivate(*method->name)) {
-    func.set_is_visible(false);
+  if (library_.is_dart_scheme() && library_.IsPrivate(*method->name)) {
+    func.set_is_reflectable(false);
   }
   if (method->metadata_pos > 0) {
     library_.AddFunctionMetadata(func, method->metadata_pos);
@@ -3704,10 +3707,10 @@
   if (!field->has_static && field->has_const) {
     ReportError(field->name_pos, "instance field may not be 'const'");
   }
-  Function& getter = Function::Handle(I);
-  Function& setter = Function::Handle(I);
-  Field& class_field = Field::ZoneHandle(I);
-  Instance& init_value = Instance::Handle(I);
+  Function& getter = Function::Handle(Z);
+  Function& setter = Function::Handle(Z);
+  Field& class_field = Field::ZoneHandle(Z);
+  Instance& init_value = Instance::Handle(Z);
   while (true) {
     bool has_initializer = CurrentToken() == Token::kASSIGN;
     bool has_simple_literal = false;
@@ -3769,7 +3772,7 @@
     if (field->has_static && has_initializer) {
       class_field.set_value(init_value);
       if (!has_simple_literal) {
-        String& getter_name = String::Handle(I,
+        String& getter_name = String::Handle(Z,
                                              Field::GetterSymbol(*field->name));
         getter = Function::New(getter_name,
                                RawFunction::kImplicitStaticFinalGetter,
@@ -3782,13 +3785,16 @@
                                field->name_pos);
         getter.set_result_type(*field->type);
         getter.set_is_debuggable(false);
+        if (library_.is_dart_scheme() && library_.IsPrivate(*field->name)) {
+          getter.set_is_reflectable(false);
+        }
         members->AddFunction(getter);
       }
     }
 
     // For instance fields, we create implicit getter and setter methods.
     if (!field->has_static) {
-      String& getter_name = String::Handle(I,
+      String& getter_name = String::Handle(Z,
                                            Field::GetterSymbol(*field->name));
       getter = Function::New(getter_name, RawFunction::kImplicitGetter,
                              field->has_static,
@@ -3807,7 +3813,7 @@
       members->AddFunction(getter);
       if (!field->has_final) {
         // Build a setter accessor for non-const fields.
-        String& setter_name = String::Handle(I,
+        String& setter_name = String::Handle(Z,
                                              Field::SetterSymbol(*field->name));
         setter = Function::New(setter_name, RawFunction::kImplicitSetter,
                                field->has_static,
@@ -3823,8 +3829,11 @@
         params.AddFinalParameter(TokenPos(),
                                  &Symbols::Value(),
                                  field->type);
-        setter.set_result_type(Type::Handle(I, Type::VoidType()));
+        setter.set_result_type(Type::Handle(Z, Type::VoidType()));
         setter.set_is_debuggable(false);
+        if (library_.is_dart_scheme() && library_.IsPrivate(*field->name)) {
+          setter.set_is_reflectable(false);
+        }
         AddFormalParamsToFunction(&params, setter);
         members->AddFunction(setter);
       }
@@ -3924,7 +3933,7 @@
     ConsumeToken();
     member.has_var = true;
     // The member type is the 'dynamic' type.
-    member.type = &Type::ZoneHandle(I, Type::DynamicType());
+    member.type = &Type::ZoneHandle(Z, Type::DynamicType());
   } else if (CurrentToken() == Token::kFACTORY) {
     ConsumeToken();
     if (member.has_static) {
@@ -3941,7 +3950,7 @@
     }
     ConsumeToken();
     ASSERT(member.type == NULL);
-    member.type = &Type::ZoneHandle(I, Type::VoidType());
+    member.type = &Type::ZoneHandle(Z, Type::VoidType());
   } else if (CurrentToken() == Token::kIDENT) {
     // This is either a type name or the name of a method/constructor/field.
     if ((member.type == NULL) && !member.has_factory) {
@@ -3961,7 +3970,7 @@
         // The declared type of fields is never ignored, even in unchecked mode,
         // because getters and setters could be closurized at some time (not
         // supported yet).
-        member.type = &AbstractType::ZoneHandle(I,
+        member.type = &AbstractType::ZoneHandle(Z,
             ParseType(ClassFinalizer::kResolveTypeParameters));
       }
     }
@@ -3988,16 +3997,16 @@
     }
     // Do not bypass class resolution by using current_class() directly, since
     // it may be a patch class.
-    const Object& result_type_class = Object::Handle(I,
-        UnresolvedClass::New(LibraryPrefix::Handle(I),
+    const Object& result_type_class = Object::Handle(Z,
+        UnresolvedClass::New(LibraryPrefix::Handle(Z),
                              *member.name,
                              member.name_pos));
     // The type arguments of the result type are the type parameters of the
     // current class. Note that in the case of a patch class, they are copied
     // from the class being patched.
-    member.type = &Type::ZoneHandle(I, Type::New(
+    member.type = &Type::ZoneHandle(Z, Type::New(
         result_type_class,
-        TypeArguments::Handle(I, current_class().type_parameters()),
+        TypeArguments::Handle(Z, current_class().type_parameters()),
         member.name_pos));
 
     // We must be dealing with a constructor or named constructor.
@@ -4036,7 +4045,7 @@
     // The grammar allows a return type, so member.type is not always NULL here.
     // If no return type is specified, the return type of the setter is dynamic.
     if (member.type == NULL) {
-      member.type = &Type::ZoneHandle(I, Type::DynamicType());
+      member.type = &Type::ZoneHandle(Z, Type::DynamicType());
     }
   } else if ((CurrentToken() == Token::kOPERATOR) && !member.has_var &&
              (LookaheadToken(1) != Token::kLPAREN) &&
@@ -4055,7 +4064,7 @@
     member.kind = RawFunction::kRegularFunction;
     member.name_pos = this->TokenPos();
     member.name =
-        &String::ZoneHandle(I, Symbols::New(Token::Str(member.operator_token)));
+        &String::ZoneHandle(Z, Symbols::New(Token::Str(member.operator_token)));
     ConsumeToken();
   } else if (IsIdentifier()) {
     member.name = CurrentLiteral();
@@ -4069,7 +4078,7 @@
   if (CurrentToken() == Token::kLPAREN || member.IsGetter()) {
     // Constructor or method.
     if (member.type == NULL) {
-      member.type = &Type::ZoneHandle(I, Type::DynamicType());
+      member.type = &Type::ZoneHandle(Z, Type::DynamicType());
     }
     ASSERT(member.IsFactory() == member.has_factory);
     ParseMethodOrConstructor(members, &member);
@@ -4083,7 +4092,7 @@
     }
     if (member.type == NULL) {
       if (member.has_final) {
-        member.type = &Type::ZoneHandle(I, Type::DynamicType());
+        member.type = &Type::ZoneHandle(Z, Type::DynamicType());
       } else {
         ReportError("missing 'var', 'final', 'const' or type"
                     " in field declaration");
@@ -4129,11 +4138,11 @@
   }
   ExpectToken(Token::kRBRACE);
 
-  Object& obj = Object::Handle(I, library_.LookupLocalObject(*enum_name));
+  Object& obj = Object::Handle(Z, library_.LookupLocalObject(*enum_name));
   if (!obj.IsNull()) {
     ReportError(enum_pos, "'%s' is already defined", enum_name->ToCString());
   }
-  Class& cls = Class::Handle(I);
+  Class& cls = Class::Handle(Z);
   cls = Class::New(*enum_name, script_, enum_pos);
   cls.set_library(library_);
   library_.AddClass(cls);
@@ -4142,7 +4151,7 @@
   if (metadata_pos >= 0) {
     library_.AddClassMetadata(cls, toplevel_class, metadata_pos);
   }
-  cls.set_super_type(Type::Handle(I, Type::ObjectType()));
+  cls.set_super_type(Type::Handle(Z, Type::ObjectType()));
   pending_classes.Add(cls, Heap::kOld);
 }
 
@@ -4168,9 +4177,9 @@
   if (FLAG_trace_parser) {
     OS::Print("TopLevel parsing class '%s'\n", class_name.ToCString());
   }
-  Class& cls = Class::Handle(I);
-  TypeArguments& orig_type_parameters = TypeArguments::Handle(I);
-  Object& obj = Object::Handle(I, library_.LookupLocalObject(class_name));
+  Class& cls = Class::Handle(Z);
+  TypeArguments& orig_type_parameters = TypeArguments::Handle(Z);
+  Object& obj = Object::Handle(Z, library_.LookupLocalObject(class_name));
   if (obj.IsNull()) {
     if (is_patch) {
       ReportError(classname_pos, "missing class '%s' cannot be patched",
@@ -4214,7 +4223,7 @@
   if (is_patch) {
     // Check that the new type parameters are identical to the original ones.
     const TypeArguments& new_type_parameters =
-        TypeArguments::Handle(I, cls.type_parameters());
+        TypeArguments::Handle(Z, cls.type_parameters());
     const int new_type_params_count =
         new_type_parameters.IsNull() ? 0 : new_type_parameters.Length();
     const int orig_type_params_count =
@@ -4224,12 +4233,12 @@
                   "class '%s' must be patched with identical type parameters",
                   class_name.ToCString());
     }
-    TypeParameter& new_type_param = TypeParameter::Handle(I);
-    TypeParameter& orig_type_param = TypeParameter::Handle(I);
-    String& new_name = String::Handle(I);
-    String& orig_name = String::Handle(I);
-    AbstractType& new_bound = AbstractType::Handle(I);
-    AbstractType& orig_bound = AbstractType::Handle(I);
+    TypeParameter& new_type_param = TypeParameter::Handle(Z);
+    TypeParameter& orig_type_param = TypeParameter::Handle(Z);
+    String& new_name = String::Handle(Z);
+    String& orig_name = String::Handle(Z);
+    AbstractType& new_bound = AbstractType::Handle(Z);
+    AbstractType& orig_bound = AbstractType::Handle(Z);
     for (int i = 0; i < new_type_params_count; i++) {
       new_type_param ^= new_type_parameters.TypeAt(i);
       orig_type_param ^= orig_type_parameters.TypeAt(i);
@@ -4272,13 +4281,13 @@
                 class_name.ToCString());
   }
 
-  AbstractType& super_type = Type::Handle(I);
+  AbstractType& super_type = Type::Handle(Z);
   if ((CurrentToken() == Token::kEXTENDS) || is_mixin_declaration) {
     ConsumeToken();  // extends or =
     const intptr_t type_pos = TokenPos();
     super_type = ParseType(ClassFinalizer::kResolveTypeParameters);
     if (super_type.IsMalformedOrMalbounded()) {
-      ReportError(Error::Handle(I, super_type.error()));
+      ReportError(Error::Handle(Z, super_type.error()));
     }
     if (super_type.IsDynamicType()) {
       // Unlikely here, since super type is not resolved yet.
@@ -4290,7 +4299,7 @@
       ReportError(type_pos,
                   "class '%s' may not extend type parameter '%s'",
                   class_name.ToCString(),
-                  String::Handle(I,
+                  String::Handle(Z,
                                  super_type.UserVisibleName()).ToCString());
     }
     // The class finalizer will check whether the super type is malbounded.
@@ -4343,7 +4352,7 @@
   CompilerStats::num_classes_compiled++;
   set_current_class(cls);
   is_top_level_ = true;
-  String& class_name = String::Handle(I, cls.Name());
+  String& class_name = String::Handle(Z, cls.Name());
   const intptr_t class_pos = TokenPos();
   ClassDesc members(cls, class_name, false, class_pos);
   while (CurrentToken() != Token::kLBRACE) {
@@ -4366,7 +4375,7 @@
   cls.AddFields(members.fields());
 
   // Creating a new array for functions marks the class as parsed.
-  const Array& array = Array::Handle(I, Array::MakeArray(members.functions()));
+  const Array& array = Array::Handle(Z, Array::MakeArray(members.functions()));
   cls.SetFunctions(array);
 
   // Add an implicit constructor if no explicit constructor is present.
@@ -4377,11 +4386,11 @@
 
   if (cls.is_patch()) {
     // Apply the changes to the patched class looked up above.
-    Object& obj = Object::Handle(I, library_.LookupLocalObject(class_name));
+    Object& obj = Object::Handle(Z, library_.LookupLocalObject(class_name));
     // The patched class must not be finalized yet.
     const Class& orig_class = Class::Cast(obj);
     ASSERT(!orig_class.is_finalized());
-    Error& error = Error::Handle(I);
+    Error& error = Error::Handle(Z);
     if (!orig_class.ApplyPatch(cls, &error)) {
       Report::LongJumpF(error, script_, class_pos, "applying patch failed");
     }
@@ -4393,12 +4402,12 @@
   TRACE_PARSER("ParseEnumDefinition");
   CompilerStats::num_classes_compiled++;
 
-  const String& enum_name = String::Handle(I, cls.Name());
+  const String& enum_name = String::Handle(Z, cls.Name());
   ClassDesc enum_members(cls, enum_name, false, cls.token_pos());
 
   // Add instance field 'final int index'.
-  Field& index_field = Field::ZoneHandle(I);
-  const Type& int_type = Type::Handle(I, Type::IntType());
+  Field& index_field = Field::ZoneHandle(Z);
+  const Type& int_type = Type::Handle(Z, Type::IntType());
   const Type& dynamic_type = Type::Handle(Type::DynamicType());
   index_field = Field::New(Symbols::Index(),
                            false,  // Not static.
@@ -4412,8 +4421,8 @@
 
   // Add implicit getter for index field.
   const String& getter_name =
-      String::Handle(I, Field::GetterSymbol(Symbols::Index()));
-  Function& getter = Function::Handle(I);
+      String::Handle(Z, Field::GetterSymbol(Symbols::Index()));
+  Function& getter = Function::Handle(Z);
   getter = Function::New(getter_name,
                          RawFunction::kImplicitGetter,
                          /* is_static = */ false,
@@ -4430,7 +4439,7 @@
   AddFormalParamsToFunction(&params, getter);
   enum_members.AddFunction(getter);
 
-  GrowableObjectArray& enum_names = GrowableObjectArray::Handle(I,
+  GrowableObjectArray& enum_names = GrowableObjectArray::Handle(Z,
       GrowableObjectArray::New(8, Heap::kOld));
   const String& name_prefix =
       String::Handle(String::Concat(enum_name, Symbols::Dot()));
@@ -4440,8 +4449,8 @@
 
   ConsumeToken();  // Enum type name.
   ExpectToken(Token::kLBRACE);
-  Field& enum_value = Field::Handle(I);
-  String& enum_value_name = String::Handle(I);
+  Field& enum_value = Field::Handle(Z);
+  String& enum_value_name = String::Handle(Z);
   intptr_t i = 0;
   GrowableArray<String*> declared_names(8);
 
@@ -4484,7 +4493,7 @@
     enum_members.AddField(enum_value);
     // Initialize the field with the ordinal value. It will be patched
     // later with the enum constant instance.
-    const Smi& ordinal_value = Smi::Handle(I, Smi::New(i));
+    const Smi& ordinal_value = Smi::Handle(Z, Smi::New(i));
     enum_value.set_value(ordinal_value);
     enum_value.RecordStore(ordinal_value);
     i++;
@@ -4505,11 +4514,11 @@
   ExpectToken(Token::kRBRACE);
 
   const Class& helper_class =
-      Class::Handle(I, Library::LookupCoreClass(Symbols::_EnumHelper()));
+      Class::Handle(Z, Library::LookupCoreClass(Symbols::_EnumHelper()));
   ASSERT(!helper_class.IsNull());
 
   // Add static field 'const List values'.
-  Field& values_field = Field::ZoneHandle(I);
+  Field& values_field = Field::ZoneHandle(Z);
   values_field = Field::New(Symbols::Values(),
                             /* is_static = */ true,
                             /* is_final = */ true,
@@ -4517,18 +4526,18 @@
                             /* is_synthetic = */ false,
                             cls,
                             cls.token_pos());
-  values_field.set_type(Type::Handle(I, Type::ArrayType()));
+  values_field.set_type(Type::Handle(Z, Type::ArrayType()));
   enum_members.AddField(values_field);
 
   // Allocate the immutable array containing the enumeration values.
   // The actual enum instance values will be patched in later.
-  const Array& values_array = Array::Handle(I, Array::New(i, Heap::kOld));
+  const Array& values_array = Array::Handle(Z, Array::New(i, Heap::kOld));
   values_field.set_value(values_array);
   values_field.RecordStore(values_array);
 
   // Create a static field that contains the list of enumeration names.
   // Clone the _enum_names field from the helper class.
-  Field& names_field = Field::Handle(I,
+  Field& names_field = Field::Handle(Z,
       helper_class.LookupStaticField(Symbols::_EnumNames()));
   ASSERT(!names_field.IsNull());
   names_field = names_field.Clone(cls);
@@ -4538,7 +4547,7 @@
   names_field.RecordStore(names_array);
 
   // Clone the toString() function from the helper class.
-  Function& to_string_func = Function::Handle(I,
+  Function& to_string_func = Function::Handle(Z,
       helper_class.LookupDynamicFunctionAllowPrivate(Symbols::toString()));
   ASSERT(!to_string_func.IsNull());
   to_string_func = to_string_func.Clone(cls);
@@ -4546,7 +4555,7 @@
 
   cls.AddFields(enum_members.fields());
   const Array& functions =
-      Array::Handle(I, Array::MakeArray(enum_members.functions()));
+      Array::Handle(Z, Array::MakeArray(enum_members.functions()));
   cls.SetFunctions(functions);
 }
 
@@ -4554,13 +4563,13 @@
 // Add an implicit constructor to the given class.
 void Parser::AddImplicitConstructor(const Class& cls) {
   // The implicit constructor is unnamed, has no explicit parameter.
-  String& ctor_name = String::ZoneHandle(I, cls.Name());
+  String& ctor_name = String::ZoneHandle(Z, cls.Name());
   ctor_name = String::Concat(ctor_name, Symbols::Dot());
   ctor_name = Symbols::New(ctor_name);
   // To indicate that this is an implicit constructor, we set the
   // token position and end token position of the function
   // to the token position of the class.
-  Function& ctor = Function::Handle(I,
+  Function& ctor = Function::Handle(Z,
       Function::New(ctor_name,
                     RawFunction::kConstructor,
                     /* is_static = */ false,
@@ -4573,7 +4582,7 @@
   ctor.set_end_token_pos(ctor.token_pos());
   ctor.set_is_debuggable(false);
   if (library_.is_dart_scheme() && library_.IsPrivate(ctor_name)) {
-    ctor.set_is_visible(false);
+    ctor.set_is_reflectable(false);
   }
 
   ParamList params;
@@ -4583,7 +4592,7 @@
   // Add implicit parameter for construction phase.
   params.AddFinalParameter(cls.token_pos(),
                            &Symbols::PhaseParameter(),
-                           &Type::ZoneHandle(I, Type::SmiType()));
+                           &Type::ZoneHandle(Z, Type::SmiType()));
 
   AddFormalParamsToFunction(&params, ctor);
   // The body of the constructor cannot modify the type of the constructed
@@ -4635,13 +4644,13 @@
     OS::Print("toplevel parsing mixin application alias class '%s'\n",
               class_name.ToCString());
   }
-  const Object& obj = Object::Handle(I, library_.LookupLocalObject(class_name));
+  const Object& obj = Object::Handle(Z, library_.LookupLocalObject(class_name));
   if (!obj.IsNull()) {
     ReportError(classname_pos, "'%s' is already defined",
                 class_name.ToCString());
   }
   const Class& mixin_application =
-      Class::Handle(I, Class::New(class_name, script_, classname_pos));
+      Class::Handle(Z, Class::New(class_name, script_, classname_pos));
   mixin_application.set_is_mixin_app_alias();
   library_.AddClass(mixin_application);
   set_current_class(mixin_application);
@@ -4656,13 +4665,13 @@
 
   const intptr_t type_pos = TokenPos();
   AbstractType& type =
-      AbstractType::Handle(I,
+      AbstractType::Handle(Z,
                            ParseType(ClassFinalizer::kResolveTypeParameters));
   if (type.IsTypeParameter()) {
     ReportError(type_pos,
                 "class '%s' may not extend type parameter '%s'",
                 class_name.ToCString(),
-                String::Handle(I, type.UserVisibleName()).ToCString());
+                String::Handle(Z, type.UserVisibleName()).ToCString());
   }
 
   CheckToken(Token::kWITH, "mixin application 'with Type' expected");
@@ -4740,7 +4749,7 @@
   }
 
   // Parse the result type of the function type.
-  AbstractType& result_type = Type::Handle(I, Type::DynamicType());
+  AbstractType& result_type = Type::Handle(Z, Type::DynamicType());
   if (CurrentToken() == Token::kVOID) {
     ConsumeToken();
     result_type = Type::VoidType();
@@ -4757,7 +4766,7 @@
   // Lookup alias name and report an error if it is already defined in
   // the library scope.
   const Object& obj =
-      Object::Handle(I, library_.LookupLocalObject(*alias_name));
+      Object::Handle(Z, library_.LookupLocalObject(*alias_name));
   if (!obj.IsNull()) {
     ReportError(alias_name_pos,
                 "'%s' is already defined", alias_name->ToCString());
@@ -4767,9 +4776,9 @@
   // signature function after it has been parsed. The type parameters, in order
   // to be properly finalized, need to be associated to this signature class as
   // they are parsed.
-  const Class& function_type_alias = Class::Handle(I,
+  const Class& function_type_alias = Class::Handle(Z,
       Class::NewSignatureClass(*alias_name,
-                               Function::Handle(I),
+                               Function::Handle(Z),
                                script_,
                                alias_name_pos));
   library_.AddClass(function_type_alias);
@@ -4791,13 +4800,13 @@
   func_params.AddFinalParameter(
       TokenPos(),
       &Symbols::ClosureParameter(),
-      &Type::ZoneHandle(I, Type::DynamicType()));
+      &Type::ZoneHandle(Z, Type::DynamicType()));
 
   const bool no_explicit_default_values = false;
   ParseFormalParameterList(no_explicit_default_values, false, &func_params);
   ExpectSemicolon();
   // The field 'is_static' has no meaning for signature functions.
-  Function& signature_function = Function::Handle(I,
+  Function& signature_function = Function::Handle(Z,
       Function::New(*alias_name,
                     RawFunction::kSignatureFunction,
                     /* is_static = */ false,
@@ -4814,7 +4823,7 @@
   // Patch the signature function in the signature class.
   function_type_alias.PatchSignatureFunction(signature_function);
 
-  const String& signature = String::Handle(I,
+  const String& signature = String::Handle(Z,
                                            signature_function.Signature());
   if (FLAG_trace_parser) {
     OS::Print("TopLevel parsing function type alias '%s'\n",
@@ -4824,7 +4833,7 @@
   // We only lookup in the current library, but not in its imports, and only
   // create a new canonical signature class if it does not exist yet.
   Class& signature_class =
-      Class::ZoneHandle(I, library_.LookupLocalClass(signature));
+      Class::ZoneHandle(Z, library_.LookupLocalClass(signature));
   if (signature_class.IsNull()) {
     signature_class = Class::NewSignatureClass(signature,
                                                signature_function,
@@ -4928,12 +4937,12 @@
   TRACE_PARSER("ParseTypeParameters");
   if (CurrentToken() == Token::kLT) {
     const GrowableObjectArray& type_parameters_array =
-        GrowableObjectArray::Handle(I, GrowableObjectArray::New());
+        GrowableObjectArray::Handle(Z, GrowableObjectArray::New());
     intptr_t index = 0;
-    TypeParameter& type_parameter = TypeParameter::Handle(I);
-    TypeParameter& existing_type_parameter = TypeParameter::Handle(I);
-    String& existing_type_parameter_name = String::Handle(I);
-    AbstractType& type_parameter_bound = Type::Handle(I);
+    TypeParameter& type_parameter = TypeParameter::Handle(Z);
+    TypeParameter& existing_type_parameter = TypeParameter::Handle(Z);
+    String& existing_type_parameter_name = String::Handle(Z);
+    AbstractType& type_parameter_bound = Type::Handle(Z);
     do {
       ConsumeToken();
       const intptr_t metadata_pos = SkipMetadata();
@@ -4977,7 +4986,7 @@
       ReportError("right angle bracket expected");
     }
     const TypeArguments& type_parameters =
-        TypeArguments::Handle(I,
+        TypeArguments::Handle(Z,
                               NewTypeArguments(type_parameters_array));
     cls.set_type_parameters(type_parameters);
     // Try to resolve the upper bounds, which will at least resolve the
@@ -5000,8 +5009,8 @@
   TRACE_PARSER("ParseTypeArguments");
   if (CurrentToken() == Token::kLT) {
     const GrowableObjectArray& types =
-        GrowableObjectArray::Handle(I, GrowableObjectArray::New());
-    AbstractType& type = AbstractType::Handle(I);
+        GrowableObjectArray::Handle(Z, GrowableObjectArray::New());
+    AbstractType& type = AbstractType::Handle(Z);
     do {
       ConsumeToken();
       type = ParseType(finalization);
@@ -5030,10 +5039,10 @@
   TRACE_PARSER("ParseInterfaceList");
   ASSERT(CurrentToken() == Token::kIMPLEMENTS);
   const GrowableObjectArray& all_interfaces =
-      GrowableObjectArray::Handle(I, GrowableObjectArray::New());
-  AbstractType& interface = AbstractType::Handle(I);
+      GrowableObjectArray::Handle(Z, GrowableObjectArray::New());
+  AbstractType& interface = AbstractType::Handle(Z);
   // First get all the interfaces already implemented by class.
-  Array& cls_interfaces = Array::Handle(I, cls.interfaces());
+  Array& cls_interfaces = Array::Handle(Z, cls.interfaces());
   for (intptr_t i = 0; i < cls_interfaces.Length(); i++) {
     interface ^= cls_interfaces.At(i);
     all_interfaces.Add(interface);
@@ -5046,7 +5055,7 @@
     if (interface.IsTypeParameter()) {
       ReportError(interface_pos,
                   "type parameter '%s' may not be used in interface list",
-                  String::Handle(I, interface.UserVisibleName()).ToCString());
+                  String::Handle(Z, interface.UserVisibleName()).ToCString());
     }
     all_interfaces.Add(interface);
   } while (CurrentToken() == Token::kCOMMA);
@@ -5059,8 +5068,8 @@
   TRACE_PARSER("ParseMixins");
   ASSERT(CurrentToken() == Token::kWITH);
   const GrowableObjectArray& mixin_types =
-      GrowableObjectArray::Handle(I, GrowableObjectArray::New());
-  AbstractType& mixin_type = AbstractType::Handle(I);
+      GrowableObjectArray::Handle(Z, GrowableObjectArray::New());
+  AbstractType& mixin_type = AbstractType::Handle(Z);
   do {
     ConsumeToken();
     mixin_type = ParseType(ClassFinalizer::kResolveTypeParameters);
@@ -5072,12 +5081,12 @@
     if (mixin_type.IsTypeParameter()) {
       ReportError(mixin_type.token_pos(),
                   "mixin type '%s' may not be a type parameter",
-                  String::Handle(I, mixin_type.UserVisibleName()).ToCString());
+                  String::Handle(Z, mixin_type.UserVisibleName()).ToCString());
     }
     mixin_types.Add(mixin_type);
   } while (CurrentToken() == Token::kCOMMA);
   return MixinAppType::New(super_type,
-      Array::Handle(I, Array::MakeArray(mixin_types)));
+      Array::Handle(Z, Array::MakeArray(mixin_types)));
 }
 
 
@@ -5089,10 +5098,10 @@
   const bool is_final = is_const || (CurrentToken() == Token::kFINAL);
   const bool is_static = true;
   const bool is_synthetic = false;
-  const AbstractType& type = AbstractType::ZoneHandle(I,
+  const AbstractType& type = AbstractType::ZoneHandle(Z,
       ParseConstFinalVarOrType(ClassFinalizer::kResolveTypeParameters));
-  Field& field = Field::Handle(I);
-  Function& getter = Function::Handle(I);
+  Field& field = Field::Handle(Z);
+  Function& getter = Function::Handle(Z);
   while (true) {
     const intptr_t name_pos = TokenPos();
     String& var_name = *ExpectIdentifier("variable name expected");
@@ -5105,7 +5114,7 @@
     // or final field implies a setter which throws a NoSuchMethodError,
     // thus we need to check for conflicts with existing setters and
     // getters.
-    String& accessor_name = String::Handle(I,
+    String& accessor_name = String::Handle(Z,
                                            Field::GetterName(var_name));
     if (library_.LookupLocalObject(accessor_name) != Object::null()) {
       ReportError(name_pos, "getter for '%s' is already defined",
@@ -5120,7 +5129,7 @@
     field = Field::New(var_name, is_static, is_final, is_const, is_synthetic,
                        current_class(), name_pos);
     field.set_type(type);
-    field.set_value(Instance::Handle(I, Instance::null()));
+    field.set_value(Instance::Handle(Z, Instance::null()));
     top_level->fields.Add(field);
     library_.AddObject(field, var_name);
     if (metadata_pos >= 0) {
@@ -5128,7 +5137,7 @@
     }
     if (CurrentToken() == Token::kASSIGN) {
       ConsumeToken();
-      Instance& field_value = Instance::Handle(I,
+      Instance& field_value = Instance::Handle(Z,
                                                Object::sentinel().raw());
       bool has_simple_literal = false;
       if (LookaheadToken(1) == Token::kSEMICOLON) {
@@ -5138,7 +5147,7 @@
       field.set_value(field_value);
       if (!has_simple_literal) {
         // Create a static final getter.
-        String& getter_name = String::Handle(I,
+        String& getter_name = String::Handle(Z,
                                              Field::GetterSymbol(var_name));
         getter = Function::New(getter_name,
                                RawFunction::kImplicitStaticFinalGetter,
@@ -5151,6 +5160,9 @@
                                name_pos);
         getter.set_result_type(type);
         getter.set_is_debuggable(false);
+        if (library_.is_dart_scheme() && library_.IsPrivate(var_name)) {
+          getter.set_is_reflectable(false);
+        }
         top_level->functions.Add(getter);
       }
     } else if (is_final) {
@@ -5171,9 +5183,6 @@
 
 RawFunction::AsyncModifier Parser::ParseFunctionModifier() {
   if (CurrentLiteral()->raw() == Symbols::Async().raw()) {
-    if (!FLAG_enable_async) {
-      ReportError("use flag --enable-async to enable async/await features");
-    }
     ConsumeToken();
     return RawFunction::kAsync;
   }
@@ -5185,7 +5194,7 @@
                                    intptr_t metadata_pos) {
   TRACE_PARSER("ParseTopLevelFunction");
   const intptr_t decl_begin_pos = TokenPos();
-  AbstractType& result_type = Type::Handle(I, Type::DynamicType());
+  AbstractType& result_type = Type::Handle(Z, Type::DynamicType());
   const bool is_static = true;
   bool is_external = false;
   bool is_patch = false;
@@ -5219,7 +5228,7 @@
     ReportError(name_pos, "missing '%s' cannot be patched",
                 func_name.ToCString());
   }
-  String& accessor_name = String::Handle(I,
+  String& accessor_name = String::Handle(Z,
                                          Field::GetterName(func_name));
   if (library_.LookupLocalObject(accessor_name) != Object::null()) {
     ReportError(name_pos, "'%s' is already defined as getter",
@@ -5260,7 +5269,7 @@
   } else {
     ReportError("function block expected");
   }
-  Function& func = Function::Handle(I,
+  Function& func = Function::Handle(Z,
       Function::New(func_name,
                     RawFunction::kRegularFunction,
                     is_static,
@@ -5273,11 +5282,8 @@
   func.set_result_type(result_type);
   func.set_end_token_pos(function_end_pos);
   func.set_modifier(func_modifier);
-  if (is_native) {
-    func.set_is_debuggable(false);
-    if (library_.is_dart_scheme() && library_.IsPrivate(func_name)) {
-      func.set_is_visible(false);
-    }
+  if (library_.is_dart_scheme() && library_.IsPrivate(func_name)) {
+    func.set_is_reflectable(false);
   }
   AddFormalParamsToFunction(&params, func);
   top_level->functions.Add(func);
@@ -5299,7 +5305,7 @@
   const bool is_static = true;
   bool is_external = false;
   bool is_patch = false;
-  AbstractType& result_type = AbstractType::Handle(I);
+  AbstractType& result_type = AbstractType::Handle(Z);
   if (is_patch_source() &&
       (CurrentToken() == Token::kIDENT) &&
       CurrentLiteral()->Equals("patch")) {
@@ -5338,7 +5344,7 @@
     const bool allow_explicit_default_values = true;
     ParseFormalParameterList(allow_explicit_default_values, false, &params);
   }
-  String& accessor_name = String::ZoneHandle(I);
+  String& accessor_name = String::ZoneHandle(Z);
   int expected_num_parameters = -1;
   if (is_getter) {
     expected_num_parameters = 0;
@@ -5402,7 +5408,7 @@
   } else {
     ReportError("function block expected");
   }
-  Function& func = Function::Handle(I,
+  Function& func = Function::Handle(Z,
       Function::New(accessor_name,
                     is_getter ? RawFunction::kGetterFunction :
                                 RawFunction::kSetterFunction,
@@ -5418,9 +5424,9 @@
   func.set_modifier(func_modifier);
   if (is_native) {
     func.set_is_debuggable(false);
-    if (library_.is_dart_scheme() && library_.IsPrivate(accessor_name)) {
-      func.set_is_visible(false);
-    }
+  }
+  if (library_.is_dart_scheme() && library_.IsPrivate(accessor_name)) {
+    func.set_is_reflectable(false);
   }
   AddFormalParamsToFunction(&params, func);
   top_level->functions.Add(func);
@@ -5459,7 +5465,7 @@
   if (Dart_IsError(result)) {
     // In case of an error we append an explanatory error message to the
     // error obtained from the library tag handler.
-    Error& prev_error = Error::Handle(I);
+    Error& prev_error = Error::Handle(Z);
     prev_error ^= Api::UnwrapHandle(result);
     Report::LongJumpF(prev_error, script_, token_pos, "library handler failed");
   }
@@ -5525,7 +5531,7 @@
     ConsumeToken();
     CheckToken(Token::kAS, "'as' expected");
   }
-  String& prefix = String::Handle(I);
+  String& prefix = String::Handle(Z);
   intptr_t prefix_pos = 0;
   if (is_import && (CurrentToken() == Token::kAS)) {
     ConsumeToken();
@@ -5533,13 +5539,13 @@
     prefix = ExpectIdentifier("prefix identifier expected")->raw();
   }
 
-  Array& show_names = Array::Handle(I);
-  Array& hide_names = Array::Handle(I);
+  Array& show_names = Array::Handle(Z);
+  Array& hide_names = Array::Handle(Z);
   if (is_deferred_import || IsLiteral("show") || IsLiteral("hide")) {
     GrowableObjectArray& show_list =
-        GrowableObjectArray::Handle(I, GrowableObjectArray::New());
+        GrowableObjectArray::Handle(Z, GrowableObjectArray::New());
     GrowableObjectArray& hide_list =
-        GrowableObjectArray::Handle(I, GrowableObjectArray::New());
+        GrowableObjectArray::Handle(Z, GrowableObjectArray::New());
     // Libraries imported through deferred import automatically hide
     // the name 'loadLibrary'.
     if (is_deferred_import) {
@@ -5570,7 +5576,7 @@
       CallLibraryTagHandler(Dart_kCanonicalizeUrl, import_pos, url));
 
   // Create a new library if it does not exist yet.
-  Library& library = Library::Handle(I, Library::LookupLibrary(canon_url));
+  Library& library = Library::Handle(Z, Library::LookupLibrary(canon_url));
   if (library.IsNull()) {
     library = Library::New(canon_url);
     library.Register();
@@ -5584,7 +5590,7 @@
     CallLibraryTagHandler(Dart_kImportTag, import_pos, canon_url);
   }
 
-  Namespace& ns = Namespace::Handle(I,
+  Namespace& ns = Namespace::Handle(Z,
       Namespace::New(library, show_names, hide_names));
   if (metadata_pos >= 0) {
     ns.AddMetadata(metadata_pos, current_class());
@@ -5593,7 +5599,7 @@
   if (is_import) {
     // Ensure that private dart:_ libraries are only imported into dart:
     // libraries.
-    const String& lib_url = String::Handle(I, library_.url());
+    const String& lib_url = String::Handle(Z, library_.url());
     if (canon_url.StartsWith(Symbols::DartSchemePrivate()) &&
         !lib_url.StartsWith(Symbols::DartScheme())) {
       ReportError(import_pos, "private library is not accessible");
@@ -5602,7 +5608,7 @@
       ASSERT(!is_deferred_import);
       library_.AddImport(ns);
     } else {
-      LibraryPrefix& library_prefix = LibraryPrefix::Handle(I);
+      LibraryPrefix& library_prefix = LibraryPrefix::Handle(Z);
       library_prefix = library_.LookupLocalLibraryPrefix(prefix);
       if (!library_prefix.IsNull()) {
         // Check that prefix names of deferred import clauses are
@@ -5681,9 +5687,9 @@
   // Core lib has not been explicitly imported, so we implicitly
   // import it here.
   if (!library_.ImportsCorelib()) {
-    Library& core_lib = Library::Handle(I, Library::CoreLibrary());
+    Library& core_lib = Library::Handle(Z, Library::CoreLibrary());
     ASSERT(!core_lib.IsNull());
-    const Namespace& core_ns = Namespace::Handle(I,
+    const Namespace& core_ns = Namespace::Handle(Z,
         Namespace::New(core_lib, Object::null_array(), Object::null_array()));
     library_.AddImport(core_ns);
   }
@@ -5722,11 +5728,11 @@
   // has been completed.
   ObjectStore* object_store = I->object_store();
   const GrowableObjectArray& pending_classes =
-      GrowableObjectArray::Handle(I, object_store->pending_classes());
+      GrowableObjectArray::Handle(Z, object_store->pending_classes());
   SetPosition(0);
   is_top_level_ = true;
   TopLevel top_level;
-  Class& toplevel_class = Class::Handle(I,
+  Class& toplevel_class = Class::Handle(Z,
       Class::New(Symbols::TopLevel(), script_, TokenPos()));
   toplevel_class.set_library(library_);
 
@@ -5737,7 +5743,7 @@
     ParsePartHeader();
   }
 
-  const Class& cls = Class::Handle(I);
+  const Class& cls = Class::Handle(Z);
   while (true) {
     set_current_class(cls);  // No current class.
     intptr_t metadata_pos = SkipMetadata();
@@ -5773,7 +5779,7 @@
   if ((top_level.fields.Length() > 0) || (top_level.functions.Length() > 0)) {
     toplevel_class.AddFields(top_level.fields);
 
-    const Array& array = Array::Handle(I,
+    const Array& array = Array::Handle(Z,
                                        Array::MakeArray(top_level.functions));
     toplevel_class.SetFunctions(array);
 
@@ -5784,10 +5790,10 @@
 
 
 void Parser::ChainNewBlock(LocalScope* outer_scope) {
-  Block* block = new(I) Block(
+  Block* block = new(Z) Block(
       current_block_,
       outer_scope,
-      new(I) SequenceNode(TokenPos(), outer_scope));
+      new(Z) SequenceNode(TokenPos(), outer_scope));
   current_block_ = block;
 }
 
@@ -5795,7 +5801,7 @@
 void Parser::OpenBlock() {
   ASSERT(current_block_ != NULL);
   LocalScope* outer_scope = current_block_->scope;
-  ChainNewBlock(new(I) LocalScope(
+  ChainNewBlock(new(Z) LocalScope(
       outer_scope, outer_scope->function_level(), outer_scope->loop_level()));
 }
 
@@ -5803,7 +5809,7 @@
 void Parser::OpenLoopBlock() {
   ASSERT(current_block_ != NULL);
   LocalScope* outer_scope = current_block_->scope;
-  ChainNewBlock(new(I) LocalScope(
+  ChainNewBlock(new(Z) LocalScope(
       outer_scope,
       outer_scope->function_level(),
       outer_scope->loop_level() + 1));
@@ -5815,20 +5821,20 @@
   if (current_block_ == NULL) {
     if (!func.IsLocalFunction()) {
       // We are compiling a non-nested function.
-      outer_scope = new(I) LocalScope(NULL, 0, 0);
+      outer_scope = new(Z) LocalScope(NULL, 0, 0);
     } else {
       // We are compiling the function of an invoked closure.
       // Restore the outer scope containing all captured variables.
       const ContextScope& context_scope =
-          ContextScope::Handle(I, func.context_scope());
+          ContextScope::Handle(Z, func.context_scope());
       ASSERT(!context_scope.IsNull());
-      outer_scope = new(I) LocalScope(
+      outer_scope = new(Z) LocalScope(
           LocalScope::RestoreOuterScope(context_scope), 0, 0);
     }
   } else {
     // We are parsing a nested function while compiling the enclosing function.
     outer_scope =
-        new(I) LocalScope(current_block_->scope,
+        new(Z) LocalScope(current_block_->scope,
                                   current_block_->scope->function_level() + 1,
                                   0);
   }
@@ -5851,7 +5857,7 @@
   OpenBlock();
   OpenBlock();
   const AbstractType& dynamic_type =
-      AbstractType::ZoneHandle(I, Type::DynamicType());
+      AbstractType::ZoneHandle(Z, Type::DynamicType());
   CatchParamDesc exception_param;
   CatchParamDesc stack_trace_param;
   exception_param.token_pos = Scanner::kNoSourcePos;
@@ -5873,10 +5879,10 @@
     // Generate code to load the exception object (:exception_var) into
     // the exception variable specified in this block.
     ASSERT(exception_var != NULL);
-    current_block_->statements->Add(new(I) StoreLocalNode(
+    current_block_->statements->Add(new(Z) StoreLocalNode(
         Scanner::kNoSourcePos,
         exception_param.var,
-        new(I) LoadLocalNode(Scanner::kNoSourcePos, exception_var)));
+        new(Z) LoadLocalNode(Scanner::kNoSourcePos, exception_var)));
   }
   LocalVariable* stack_trace_var =
       current_block_->scope->LookupVariable(Symbols::StackTraceVar(), false);
@@ -5884,15 +5890,15 @@
     // A stack trace variable is specified in this block, so generate code
     // to load the stack trace object (:stack_trace_var) into the stack
     // trace variable specified in this block.
-    ArgumentListNode* no_args = new(I) ArgumentListNode(Scanner::kNoSourcePos);
+    ArgumentListNode* no_args = new(Z) ArgumentListNode(Scanner::kNoSourcePos);
     ASSERT(stack_trace_var != NULL);
-    current_block_->statements->Add(new(I) StoreLocalNode(
+    current_block_->statements->Add(new(Z) StoreLocalNode(
         Scanner::kNoSourcePos,
         stack_trace_param.var,
-        new(I) LoadLocalNode(Scanner::kNoSourcePos, stack_trace_var)));
-    current_block_->statements->Add(new(I) InstanceCallNode(
+        new(Z) LoadLocalNode(Scanner::kNoSourcePos, stack_trace_var)));
+    current_block_->statements->Add(new(Z) InstanceCallNode(
         Scanner::kNoSourcePos,
-        new(I) LoadLocalNode(Scanner::kNoSourcePos, stack_trace_param.var),
+        new(Z) LoadLocalNode(Scanner::kNoSourcePos, stack_trace_param.var),
         Library::PrivateCoreLibName(Symbols::_setupFullStackTrace()),
         no_args));
   }
@@ -5922,17 +5928,17 @@
       Symbols::AsyncCompleter(), false);
   ASSERT(async_completer != NULL);
   ArgumentListNode* completer_args =
-      new (I) ArgumentListNode(Scanner::kNoSourcePos);
+      new (Z) ArgumentListNode(Scanner::kNoSourcePos);
   completer_args->Add(
-      new (I) LoadLocalNode(Scanner::kNoSourcePos, exception_param.var));
+      new (Z) LoadLocalNode(Scanner::kNoSourcePos, exception_param.var));
   completer_args->Add(
-      new (I) LoadLocalNode(Scanner::kNoSourcePos, stack_trace_param.var));
-  current_block_->statements->Add(new (I) InstanceCallNode(
+      new (Z) LoadLocalNode(Scanner::kNoSourcePos, stack_trace_param.var));
+  current_block_->statements->Add(new (Z) InstanceCallNode(
       Scanner::kNoSourcePos,
-      new (I) LoadLocalNode(Scanner::kNoSourcePos, async_completer),
+      new (Z) LoadLocalNode(Scanner::kNoSourcePos, async_completer),
       Symbols::CompleterCompleteError(),
       completer_args));
-  ReturnNode* return_node = new (I) ReturnNode(Scanner::kNoSourcePos);
+  ReturnNode* return_node = new (Z) ReturnNode(Scanner::kNoSourcePos);
   // Behavior like a continuation return, i.e,. don't call a completer.
   return_node->set_return_type(ReturnNode::kContinuation);
   current_block_->statements->Add(return_node);
@@ -5941,23 +5947,23 @@
   SequenceNode* catch_handler_list = CloseBlock();
 
   const GrowableObjectArray& handler_types =
-      GrowableObjectArray::Handle(I, GrowableObjectArray::New());
+      GrowableObjectArray::Handle(Z, GrowableObjectArray::New());
   handler_types.SetLength(0);
   handler_types.Add(*exception_param.type);
 
   TryBlocks* inner_try_block = PopTryBlock();
   const intptr_t try_index = inner_try_block->try_index();
 
-  CatchClauseNode* catch_clause = new (I) CatchClauseNode(
+  CatchClauseNode* catch_clause = new (Z) CatchClauseNode(
       Scanner::kNoSourcePos,
       catch_handler_list,
-      Array::ZoneHandle(I, Array::MakeArray(handler_types)),
+      Array::ZoneHandle(Z, Array::MakeArray(handler_types)),
       context_var,
       exception_var,
       stack_trace_var,
       CatchClauseNode::kInvalidTryIndex,
       true);
-  AstNode* try_catch_node = new (I) TryCatchNode(
+  AstNode* try_catch_node = new (Z) TryCatchNode(
       Scanner::kNoSourcePos,
       try_block,
       context_var,
@@ -5974,28 +5980,28 @@
   LocalVariable* context_var =
       current_block_->scope->LocalLookupVariable(Symbols::SavedTryContextVar());
   if (context_var == NULL) {
-    context_var = new(I) LocalVariable(
+    context_var = new(Z) LocalVariable(
         TokenPos(),
         Symbols::SavedTryContextVar(),
-        Type::ZoneHandle(I, Type::DynamicType()));
+        Type::ZoneHandle(Z, Type::DynamicType()));
     current_block_->scope->AddVariable(context_var);
   }
   LocalVariable* exception_var =
       current_block_->scope->LocalLookupVariable(Symbols::ExceptionVar());
   if (exception_var == NULL) {
-    exception_var = new(I) LocalVariable(
+    exception_var = new(Z) LocalVariable(
         TokenPos(),
         Symbols::ExceptionVar(),
-        Type::ZoneHandle(I, Type::DynamicType()));
+        Type::ZoneHandle(Z, Type::DynamicType()));
     current_block_->scope->AddVariable(exception_var);
   }
   LocalVariable* stack_trace_var =
       current_block_->scope->LocalLookupVariable(Symbols::StackTraceVar());
   if (stack_trace_var == NULL) {
-    stack_trace_var = new(I) LocalVariable(
+    stack_trace_var = new(Z) LocalVariable(
         TokenPos(),
         Symbols::StackTraceVar(),
-        Type::ZoneHandle(I, Type::DynamicType()));
+        Type::ZoneHandle(Z, Type::DynamicType()));
     current_block_->scope->AddVariable(stack_trace_var);
   }
 
@@ -6013,14 +6019,14 @@
 RawFunction* Parser::OpenAsyncFunction(intptr_t async_func_pos) {
   TRACE_PARSER("OpenAsyncFunction");
   AddAsyncClosureVariables();
-  Function& closure = Function::Handle(I);
+  Function& closure = Function::Handle(Z);
   bool is_new_closure = false;
 
   // Check whether a function for the asynchronous function body of
   // this async function has already been created by a previous
   // compilation of this function.
   const Function& found_func = Function::Handle(
-      I, current_class().LookupClosureFunction(async_func_pos));
+      Z, current_class().LookupClosureFunction(async_func_pos));
   if (!found_func.IsNull() &&
       (found_func.token_pos() == async_func_pos) &&
       (found_func.script() == innermost_function().script()) &&
@@ -6030,11 +6036,11 @@
   } else {
     // Create the closure containing the body of this async function.
     const String& async_func_name =
-        String::Handle(I, innermost_function().name());
-    String& closure_name = String::Handle(I,
+        String::Handle(Z, innermost_function().name());
+    String& closure_name = String::Handle(Z,
         String::NewFormatted("<%s_async_body>", async_func_name.ToCString()));
     closure = Function::NewClosureFunction(
-        String::Handle(I, Symbols::New(closure_name)),
+        String::Handle(Z, Symbols::New(closure_name)),
         innermost_function(),
         async_func_pos);
     closure.set_is_async_closure(true);
@@ -6043,7 +6049,7 @@
   }
   // Create the parameter list for the async body closure.
   ParamList closure_params;
-  const Type& dynamic_type = Type::ZoneHandle(I, Type::DynamicType());
+  const Type& dynamic_type = Type::ZoneHandle(Z, Type::DynamicType());
   closure_params.AddFinalParameter(
       async_func_pos, &Symbols::ClosureParameter(), &dynamic_type);
   ParamDesc result_param;
@@ -6064,20 +6070,20 @@
     AddFormalParamsToFunction(&closure_params, closure);
 
     // Create and set the signature class of the closure.
-    const String& sig = String::Handle(I, closure.Signature());
-    Class& sig_cls = Class::Handle(I, library_.LookupLocalClass(sig));
+    const String& sig = String::Handle(Z, closure.Signature());
+    Class& sig_cls = Class::Handle(Z, library_.LookupLocalClass(sig));
     if (sig_cls.IsNull()) {
       sig_cls =
           Class::NewSignatureClass(sig, closure, script_, closure.token_pos());
       library_.AddClass(sig_cls);
     }
     closure.set_signature_class(sig_cls);
-    const Type& sig_type = Type::Handle(I, sig_cls.SignatureType());
+    const Type& sig_type = Type::Handle(Z, sig_cls.SignatureType());
     if (!sig_type.IsFinalized()) {
       ClassFinalizer::FinalizeType(
           sig_cls, sig_type, ClassFinalizer::kCanonicalize);
     }
-    ASSERT(AbstractType::Handle(I, closure.result_type()).IsResolved());
+    ASSERT(AbstractType::Handle(Z, closure.result_type()).IsResolved());
     ASSERT(closure.NumParameters() == closure_params.parameters->length());
   }
   OpenFunctionBlock(closure);
@@ -6094,23 +6100,23 @@
   //   var :await_ctx_var;
   //   var :async_op;
   //   var :async_completer;
-  const Type& dynamic_type = Type::ZoneHandle(I, Type::DynamicType());
-  LocalVariable* await_jump_var = new (I) LocalVariable(
+  const Type& dynamic_type = Type::ZoneHandle(Z, Type::DynamicType());
+  LocalVariable* await_jump_var = new (Z) LocalVariable(
       Scanner::kNoSourcePos, Symbols::AwaitJumpVar(), dynamic_type);
   current_block_->scope->AddVariable(await_jump_var);
   current_block_->scope->CaptureVariable(Symbols::AwaitJumpVar());
   await_jump_var->set_is_captured();
-  LocalVariable* await_ctx_var = new (I) LocalVariable(
+  LocalVariable* await_ctx_var = new (Z) LocalVariable(
       Scanner::kNoSourcePos, Symbols::AwaitContextVar(), dynamic_type);
   current_block_->scope->AddVariable(await_ctx_var);
   current_block_->scope->CaptureVariable(Symbols::AwaitContextVar());
   await_ctx_var->set_is_captured();
-  LocalVariable* async_op_var = new (I) LocalVariable(
+  LocalVariable* async_op_var = new (Z) LocalVariable(
       Scanner::kNoSourcePos, Symbols::AsyncOperation(), dynamic_type);
   current_block_->scope->AddVariable(async_op_var);
   current_block_->scope->CaptureVariable(Symbols::AsyncOperation());
   async_op_var->set_is_captured();
-  LocalVariable* async_completer = new (I) LocalVariable(
+  LocalVariable* async_completer = new (Z) LocalVariable(
       Scanner::kNoSourcePos, Symbols::AsyncCompleter(), dynamic_type);
   current_block_->scope->AddVariable(async_completer);
   current_block_->scope->CaptureVariable(Symbols::AsyncCompleter());
@@ -6131,13 +6137,13 @@
 }
 
 
-static inline String& BuildAsyncSavedTryContextName(Isolate* isolate,
+static inline String& BuildAsyncSavedTryContextName(Zone* zone,
                                                     int16_t id) {
   const char* async_saved_prefix = ":async_saved_try_ctx_var_";
   // Can be a regular handle since we only use it to build an actual symbol.
-  const String& cnt_str = String::Handle(
+  const String& cnt_str = String::Handle(zone,
       String::NewFormatted("%s%d", async_saved_prefix, id));
-  return String::ZoneHandle(isolate, Symbols::New(cnt_str));
+  return String::ZoneHandle(zone, Symbols::New(cnt_str));
 }
 
 
@@ -6161,15 +6167,15 @@
   // been captured in the corresponding scope as the body has been parsed within
   // a nested block (contained in the async funtion's block).
   const Class& future =
-      Class::ZoneHandle(I, I->object_store()->future_class());
+      Class::ZoneHandle(Z, I->object_store()->future_class());
   ASSERT(!future.IsNull());
-  const Function& constructor = Function::ZoneHandle(I,
+  const Function& constructor = Function::ZoneHandle(Z,
       future.LookupFunction(Symbols::FutureMicrotask()));
   ASSERT(!constructor.IsNull());
   const Class& completer =
-      Class::ZoneHandle(I, I->object_store()->completer_class());
+      Class::ZoneHandle(Z, I->object_store()->completer_class());
   ASSERT(!completer.IsNull());
-  const Function& completer_constructor = Function::ZoneHandle(I,
+  const Function& completer_constructor = Function::ZoneHandle(Z,
       completer.LookupFunction(Symbols::CompleterConstructor()));
   ASSERT(!completer_constructor.IsNull());
 
@@ -6179,13 +6185,13 @@
   // Add to AST:
   //   :async_completer = new Completer();
   ArgumentListNode* empty_args =
-      new (I) ArgumentListNode(Scanner::kNoSourcePos);
-  ConstructorCallNode* completer_constructor_node = new (I) ConstructorCallNode(
+      new (Z) ArgumentListNode(Scanner::kNoSourcePos);
+  ConstructorCallNode* completer_constructor_node = new (Z) ConstructorCallNode(
       Scanner::kNoSourcePos,
-      TypeArguments::ZoneHandle(I),
+      TypeArguments::ZoneHandle(Z),
       completer_constructor,
       empty_args);
-  StoreLocalNode* store_completer = new (I) StoreLocalNode(
+  StoreLocalNode* store_completer = new (Z) StoreLocalNode(
       Scanner::kNoSourcePos,
       async_completer,
       completer_constructor_node);
@@ -6195,17 +6201,17 @@
   LocalVariable* jump_var = current_block_->scope->LookupVariable(
         Symbols::AwaitJumpVar(), false);
   LiteralNode* init_value =
-    new(I) LiteralNode(Scanner::kNoSourcePos, Smi::ZoneHandle(Smi::New(-1)));
+    new(Z) LiteralNode(Scanner::kNoSourcePos, Smi::ZoneHandle(Smi::New(-1)));
   current_block_->statements->Add(
-      new (I) StoreLocalNode(Scanner::kNoSourcePos, jump_var, init_value));
+      new (Z) StoreLocalNode(Scanner::kNoSourcePos, jump_var, init_value));
 
   // Add to AST:
   //   :async_op = <closure>;  (containing the original body)
   LocalVariable* async_op_var = current_block_->scope->LookupVariable(
       Symbols::AsyncOperation(), false);
-  ClosureNode* cn = new(I) ClosureNode(
+  ClosureNode* cn = new(Z) ClosureNode(
       Scanner::kNoSourcePos, closure, NULL, closure_body->scope());
-  StoreLocalNode* store_async_op = new (I) StoreLocalNode(
+  StoreLocalNode* store_async_op = new (Z) StoreLocalNode(
       Scanner::kNoSourcePos,
       async_op_var,
       cn);
@@ -6213,21 +6219,21 @@
 
   // Add to AST:
   //   new Future(:async_op);
-  ArgumentListNode* arguments = new (I) ArgumentListNode(Scanner::kNoSourcePos);
-  arguments->Add(new (I) LoadLocalNode(
+  ArgumentListNode* arguments = new (Z) ArgumentListNode(Scanner::kNoSourcePos);
+  arguments->Add(new (Z) LoadLocalNode(
       Scanner::kNoSourcePos, async_op_var));
-  ConstructorCallNode* future_node = new (I) ConstructorCallNode(
-      Scanner::kNoSourcePos, TypeArguments::ZoneHandle(I), constructor,
+  ConstructorCallNode* future_node = new (Z) ConstructorCallNode(
+      Scanner::kNoSourcePos, TypeArguments::ZoneHandle(Z), constructor,
       arguments);
   current_block_->statements->Add(future_node);
 
   // Add to AST:
   //   return :async_completer.future;
-  ReturnNode* return_node = new (I) ReturnNode(
+  ReturnNode* return_node = new (Z) ReturnNode(
       Scanner::kNoSourcePos,
-      new (I) InstanceGetterNode(
+      new (Z) InstanceGetterNode(
           Scanner::kNoSourcePos,
-          new (I) LoadLocalNode(
+          new (Z) LoadLocalNode(
               Scanner::kNoSourcePos,
               async_completer),
           Symbols::CompleterFuture()));
@@ -6313,7 +6319,7 @@
     ParamDesc& param_desc = (*params->parameters)[i];
     ASSERT(!is_top_level_ || param_desc.type->IsResolved());
     const String* name = param_desc.name;
-    LocalVariable* parameter = new(I) LocalVariable(
+    LocalVariable* parameter = new(Z) LocalVariable(
         param_desc.name_pos, *name, *param_desc.type);
     if (!scope->InsertParameterAt(i, parameter)) {
       ReportError(param_desc.name_pos,
@@ -6336,8 +6342,8 @@
                                       const Function& func) {
   ASSERT(func.is_native());
   TRACE_PARSER("ParseNativeFunctionBlock");
-  const Class& cls = Class::Handle(I, func.Owner());
-  const Library& library = Library::Handle(I, cls.library());
+  const Class& cls = Class::Handle(Z, func.Owner());
+  const Library& library = Library::Handle(Z, cls.library());
   ASSERT(func.NumParameters() == params->parameters->length());
 
   // Parse the function name out.
@@ -6359,11 +6365,11 @@
   // Now add the NativeBodyNode and return statement.
   Dart_NativeEntryResolver resolver = library.native_entry_resolver();
   bool is_bootstrap_native = Bootstrap::IsBootstapResolver(resolver);
-  current_block_->statements->Add(new(I) ReturnNode(
+  current_block_->statements->Add(new(Z) ReturnNode(
       TokenPos(),
-      new(I) NativeBodyNode(
+      new(Z) NativeBodyNode(
           TokenPos(),
-          Function::ZoneHandle(I, func.raw()),
+          Function::ZoneHandle(Z, func.raw()),
           native_name,
           native_function,
           current_block_->scope,
@@ -6413,14 +6419,14 @@
   if (receiver == NULL) {
     ReportError(token_pos, "illegal implicit access to receiver 'this'");
   }
-  return new(I) LoadLocalNode(TokenPos(), receiver);
+  return new(Z) LoadLocalNode(TokenPos(), receiver);
 }
 
 
 AstNode* Parser::CallGetter(intptr_t token_pos,
                             AstNode* object,
                             const String& name) {
-  return new(I) InstanceGetterNode(token_pos, object, name);
+  return new(Z) InstanceGetterNode(token_pos, object, name);
 }
 
 
@@ -6433,7 +6439,7 @@
   ASSERT(IsIdentifier());
   const intptr_t ident_pos = TokenPos();
   const String& ident = *CurrentLiteral();
-  LocalVariable* variable = new(I) LocalVariable(
+  LocalVariable* variable = new(Z) LocalVariable(
       ident_pos, ident, type);
   ConsumeToken();  // Variable identifier.
   AstNode* initialization = NULL;
@@ -6443,7 +6449,7 @@
     ConsumeToken();
     AstNode* expr = ParseAwaitableExpr(
         is_const, kConsumeCascades, await_preamble);
-    initialization = new(I) StoreLocalNode(
+    initialization = new(Z) StoreLocalNode(
         assign_pos, variable, expr);
     if (is_const) {
       ASSERT(expr->IsLiteralNode());
@@ -6454,9 +6460,9 @@
                 "missing initialization of 'final' or 'const' variable");
   } else {
     // Initialize variable with null.
-    AstNode* null_expr = new(I) LiteralNode(
-        ident_pos, Instance::ZoneHandle(I));
-    initialization = new(I) StoreLocalNode(
+    AstNode* null_expr = new(Z) LiteralNode(
+        ident_pos, Instance::ZoneHandle(Z));
+    initialization = new(Z) StoreLocalNode(
         ident_pos, variable, null_expr);
   }
 
@@ -6548,7 +6554,7 @@
   SkipMetadata();
   bool is_final = (CurrentToken() == Token::kFINAL);
   bool is_const = (CurrentToken() == Token::kCONST);
-  const AbstractType& type = AbstractType::ZoneHandle(I,
+  const AbstractType& type = AbstractType::ZoneHandle(Z,
       ParseConstFinalVarOrType(FLAG_enable_type_checks ?
           ClassFinalizer::kCanonicalize : ClassFinalizer::kIgnore));
   if (!IsIdentifier()) {
@@ -6588,7 +6594,7 @@
 
 AstNode* Parser::ParseFunctionStatement(bool is_literal) {
   TRACE_PARSER("ParseFunctionStatement");
-  AbstractType& result_type = AbstractType::Handle(I);
+  AbstractType& result_type = AbstractType::Handle(Z);
   const String* variable_name = NULL;
   const String* function_name = NULL;
 
@@ -6632,7 +6638,7 @@
   // and register it in the current class.
   // Note that we cannot share the same closure function between the closurized
   // and non-closurized versions of the same parent function.
-  Function& function = Function::ZoneHandle(I);
+  Function& function = Function::ZoneHandle(Z);
   bool is_new_closure = false;
   // TODO(hausner): There could be two different closures at the given
   // function_pos, one enclosed in a closurized function and one enclosed in the
@@ -6655,22 +6661,22 @@
   // passed as a function argument, or returned as a function result.
 
   LocalVariable* function_variable = NULL;
-  Type& function_type = Type::ZoneHandle(I);
+  Type& function_type = Type::ZoneHandle(Z);
   if (variable_name != NULL) {
     // Since the function type depends on the signature of the closure function,
     // it cannot be determined before the formal parameter list of the closure
     // function is parsed. Therefore, we set the function type to a new
     // parameterized type to be patched after the actual type is known.
     // We temporarily use the class of the Function interface.
-    const Class& unknown_signature_class = Class::Handle(I,
-        Type::Handle(I, Type::Function()).type_class());
+    const Class& unknown_signature_class = Class::Handle(Z,
+        Type::Handle(Z, Type::Function()).type_class());
     function_type = Type::New(unknown_signature_class,
-                              TypeArguments::Handle(I), function_pos);
+                              TypeArguments::Handle(Z), function_pos);
     function_type.SetIsFinalized();  // No finalization needed.
 
     // Add the function variable to the scope before parsing the function in
     // order to allow self reference from inside the function.
-    function_variable = new(I) LocalVariable(function_pos,
+    function_variable = new(Z) LocalVariable(function_pos,
                                              *variable_name,
                                              function_type);
     function_variable->set_is_final();
@@ -6694,15 +6700,15 @@
   }
 
   // Parse the local function.
-  Array& default_parameter_values = Array::Handle(I);
+  Array& default_parameter_values = Array::Handle(Z);
   SequenceNode* statements = Parser::ParseFunc(function,
                                                &default_parameter_values);
 
   // Now that the local function has formal parameters, lookup the signature
   // class in the current library (but not in its imports) and only create a new
   // canonical signature class if it does not exist yet.
-  const String& signature = String::Handle(I, function.Signature());
-  Class& signature_class = Class::ZoneHandle(I);
+  const String& signature = String::Handle(Z, function.Signature());
+  Class& signature_class = Class::ZoneHandle(Z);
   if (!is_new_closure) {
     signature_class = function.signature_class();
   }
@@ -6737,9 +6743,9 @@
 
   // Since the signature type is cached by the signature class, it may have
   // been finalized already.
-  Type& signature_type = Type::Handle(I,
+  Type& signature_type = Type::Handle(Z,
                                       signature_class.SignatureType());
-  TypeArguments& signature_type_arguments = TypeArguments::Handle(I,
+  TypeArguments& signature_type_arguments = TypeArguments::Handle(Z,
       signature_type.arguments());
 
   if (!signature_type.IsFinalized()) {
@@ -6795,14 +6801,14 @@
   // variables are not relevant for the compilation of the enclosing function.
   // This pruning is done by omitting to hook the local scope in its parent
   // scope in the constructor of LocalScope.
-  AstNode* closure = new(I) ClosureNode(
+  AstNode* closure = new(Z) ClosureNode(
       function_pos, function, NULL, statements->scope());
 
   if (function_variable == NULL) {
     ASSERT(is_literal);
     return closure;
   } else {
-    AstNode* initialization = new(I) StoreLocalNode(
+    AstNode* initialization = new(Z) StoreLocalNode(
         function_pos, function_variable, closure);
     return initialization;
   }
@@ -7211,7 +7217,7 @@
     ConsumeToken();
     false_branch = ParseNestedStatement(parsing_loop_body, NULL);
   }
-  AstNode* if_node = new(I) IfNode(
+  AstNode* if_node = new(Z) IfNode(
       if_pos, cond_expr, true_branch, false_branch);
   if (label != NULL) {
     current_block_->statements->Add(if_node);
@@ -7283,9 +7289,9 @@
     }
   }
   if (first_value.IsInteger()) {
-    return Type::Handle(I, Type::IntType()).type_class();
+    return Type::Handle(Z, Type::IntType()).type_class();
   } else if (first_value.IsString()) {
-    return Type::Handle(I, Type::StringType()).type_class();
+    return Type::Handle(Z, Type::StringType()).type_class();
   }
   return first_value.clazz();
 }
@@ -7298,7 +7304,7 @@
   bool default_seen = false;
   const intptr_t case_pos = TokenPos();
   // The case expressions node sequence does not own the enclosing scope.
-  SequenceNode* case_expressions = new(I) SequenceNode(case_pos, NULL);
+  SequenceNode* case_expressions = new(Z) SequenceNode(case_pos, NULL);
   while (CurrentToken() == Token::kCASE || CurrentToken() == Token::kDEFAULT) {
     if (CurrentToken() == Token::kCASE) {
       if (default_seen) {
@@ -7310,9 +7316,9 @@
       ASSERT(expr->IsLiteralNode());
       case_expr_values->Add(expr->AsLiteralNode());
 
-      AstNode* switch_expr_load = new(I) LoadLocalNode(
+      AstNode* switch_expr_load = new(Z) LoadLocalNode(
           case_pos, switch_expr_value);
-      AstNode* case_comparison = new(I) ComparisonNode(
+      AstNode* case_comparison = new(Z) ComparisonNode(
           expr_pos, Token::kEQ, expr, switch_expr_load);
       case_expressions->Add(case_comparison);
     } else {
@@ -7346,9 +7352,9 @@
       // End of this case clause. If there is a possible fall-through to
       // the next case clause, throw an implicit FallThroughError.
       if (!abrupt_completing_seen) {
-        ArgumentListNode* arguments = new(I) ArgumentListNode(TokenPos());
-        arguments->Add(new(I) LiteralNode(
-            TokenPos(), Integer::ZoneHandle(I, Integer::New(TokenPos()))));
+        ArgumentListNode* arguments = new(Z) ArgumentListNode(TokenPos());
+        arguments->Add(new(Z) LiteralNode(
+            TokenPos(), Integer::ZoneHandle(Z, Integer::New(TokenPos()))));
         current_block_->statements->Add(
             MakeStaticCall(Symbols::FallThroughError(),
                            Library::PrivateCoreLibName(Symbols::ThrowNew()),
@@ -7364,7 +7370,7 @@
     }
   }
   SequenceNode* statements = CloseBlock();
-  return new(I) CaseNode(case_pos, case_label,
+  return new(Z) CaseNode(case_pos, case_label,
       case_expressions, default_seen, switch_expr_value, statements);
 }
 
@@ -7390,15 +7396,15 @@
   // type of the case clause expressions. Therefore, we have to allocate
   // a new type representing dynamic and can't reuse the canonical
   // type object for dynamic.
-  const Type& temp_var_type = Type::ZoneHandle(I,
-       Type::New(Class::Handle(I, Object::dynamic_class()),
-                 TypeArguments::Handle(I),
+  const Type& temp_var_type = Type::ZoneHandle(Z,
+       Type::New(Class::Handle(Z, Object::dynamic_class()),
+                 TypeArguments::Handle(Z),
                  expr_pos));
   temp_var_type.SetIsFinalized();
-  LocalVariable* temp_variable = new(I) LocalVariable(
+  LocalVariable* temp_variable = new(Z) LocalVariable(
       expr_pos,  Symbols::SwitchExpr(), temp_var_type);
   current_block_->scope->AddVariable(temp_variable);
-  AstNode* save_switch_expr = new(I) StoreLocalNode(
+  AstNode* save_switch_expr = new(Z) StoreLocalNode(
       expr_pos, temp_variable, switch_expr);
   current_block_->statements->Add(save_switch_expr);
 
@@ -7417,7 +7423,7 @@
       case_label = current_block_->scope->LocalLookupLabel(*label_name);
       if (case_label == NULL) {
         // Label does not exist yet. Add it to scope of switch statement.
-        case_label = new(I) SourceLabel(
+        case_label = new(Z) SourceLabel(
             label_pos, *label_name, SourceLabel::kCase);
         current_block_->scope->AddLabel(case_label);
       } else if (case_label->kind() == SourceLabel::kForward) {
@@ -7453,7 +7459,7 @@
   // variable holding the switch expression to match the type of the
   // case clause constants.
   temp_var_type.set_type_class(
-      Class::Handle(I, CheckCaseExpressions(case_expr_values)));
+      Class::Handle(Z, CheckCaseExpressions(case_expr_values)));
 
   // Check for unresolved label references.
   SourceLabel* unresolved_label =
@@ -7465,7 +7471,7 @@
 
   SequenceNode* switch_body = CloseBlock();
   ExpectToken(Token::kRBRACE);
-  return new(I) SwitchNode(switch_pos, label, switch_body);
+  return new(Z) SwitchNode(switch_pos, label, switch_body);
 }
 
 
@@ -7482,7 +7488,7 @@
   ExpectToken(Token::kRPAREN);
   const bool parsing_loop_body =  true;
   SequenceNode* while_body = ParseNestedStatement(parsing_loop_body, label);
-  WhileNode* while_node = new (I) WhileNode(while_pos,
+  WhileNode* while_node = new (Z) WhileNode(while_pos,
                                             label,
                                             cond_expr,
                                             await_preamble,
@@ -7511,7 +7517,7 @@
   }
   ExpectToken(Token::kRPAREN);
   ExpectSemicolon();
-  return new(I) DoWhileNode(do_pos, label, cond_expr, dowhile_body);
+  return new(Z) DoWhileNode(do_pos, label, cond_expr, dowhile_body);
 }
 
 
@@ -7530,7 +7536,7 @@
     ReportError("Loop variable cannot be 'const'");
   }
   bool new_loop_var = false;
-  AbstractType& loop_var_type =  AbstractType::ZoneHandle(I);
+  AbstractType& loop_var_type =  AbstractType::ZoneHandle(Z);
   if (LookaheadToken(1) != Token::kIN) {
     // Declaration of a new loop variable.
     // Delay creation of the local variable until we know its actual
@@ -7555,36 +7561,36 @@
   // Build creation of implicit StreamIterator.
   // var :for-in-iter = new StreamIterator(stream_expr).
   const Class& stream_iterator_cls =
-      Class::ZoneHandle(I, I->object_store()->stream_iterator_class());
+      Class::ZoneHandle(Z, I->object_store()->stream_iterator_class());
   ASSERT(!stream_iterator_cls.IsNull());
   const Function& iterator_ctor =
-      Function::ZoneHandle(I, stream_iterator_cls.LookupFunction(
+      Function::ZoneHandle(Z, stream_iterator_cls.LookupFunction(
           Symbols::StreamIteratorConstructor()));
   ASSERT(!iterator_ctor.IsNull());
-  ArgumentListNode* ctor_args = new (I) ArgumentListNode(Scanner::kNoSourcePos);
+  ArgumentListNode* ctor_args = new (Z) ArgumentListNode(Scanner::kNoSourcePos);
   ctor_args->Add(stream_expr);
   ConstructorCallNode* ctor_call =
-      new (I) ConstructorCallNode(Scanner::kNoSourcePos,
-                              TypeArguments::ZoneHandle(I),
+      new (Z) ConstructorCallNode(Scanner::kNoSourcePos,
+                              TypeArguments::ZoneHandle(Z),
                               iterator_ctor,
                               ctor_args);
-  const AbstractType& iterator_type = Type::ZoneHandle(I, Type::DynamicType());
-  LocalVariable* iterator_var = new(I) LocalVariable(
+  const AbstractType& iterator_type = Type::ZoneHandle(Z, Type::DynamicType());
+  LocalVariable* iterator_var = new(Z) LocalVariable(
       stream_pos, Symbols::ForInIter(), iterator_type);
   current_block_->scope->AddVariable(iterator_var);
   AstNode* iterator_init =
-      new(I) StoreLocalNode(stream_pos, iterator_var, ctor_call);
+      new(Z) StoreLocalNode(stream_pos, iterator_var, ctor_call);
   current_block_->statements->Add(iterator_init);
 
   // Build while loop condition.
   // while (await :for-in-iter.moveNext())
-  ArgumentListNode* no_args = new(I) ArgumentListNode(stream_pos);
-  AstNode* iterator_moveNext = new(I) InstanceCallNode(
+  ArgumentListNode* no_args = new(Z) ArgumentListNode(stream_pos);
+  AstNode* iterator_moveNext = new(Z) InstanceCallNode(
       stream_pos,
-      new(I) LoadLocalNode(stream_pos, iterator_var),
+      new(Z) LoadLocalNode(stream_pos, iterator_var),
                            Symbols::MoveNext(),
                            no_args);
-  AstNode* await_moveNext = new (I) AwaitNode(stream_pos, iterator_moveNext);
+  AstNode* await_moveNext = new (Z) AwaitNode(stream_pos, iterator_moveNext);
   OpenBlock();
   AwaitTransformer at(current_block_->statements,
                       parsed_function(),
@@ -7602,9 +7608,9 @@
   current_block_->scope->AddLabel(label);
   const intptr_t loop_var_assignment_pos = TokenPos();
 
-  AstNode* iterator_current = new(I) InstanceGetterNode(
+  AstNode* iterator_current = new(Z) InstanceGetterNode(
       loop_var_assignment_pos,
-      new(I) LoadLocalNode(loop_var_assignment_pos, iterator_var),
+      new(Z) LoadLocalNode(loop_var_assignment_pos, iterator_var),
       Symbols::Current());
 
   // Generate assignment of next iterator value to loop variable.
@@ -7615,14 +7621,14 @@
     // Note that the variable token position needs to be inside the
     // loop block, so it gets put in the loop context level.
     LocalVariable* loop_var =
-        new(I) LocalVariable(loop_var_assignment_pos,
+        new(Z) LocalVariable(loop_var_assignment_pos,
                              *loop_var_name,
                              loop_var_type);;
     if (loop_var_is_final) {
       loop_var->set_is_final();
     }
     current_block_->scope->AddVariable(loop_var);
-    loop_var_assignment = new(I) StoreLocalNode(
+    loop_var_assignment = new(Z) StoreLocalNode(
         loop_var_assignment_pos, loop_var, iterator_current);
   } else {
     AstNode* loop_var_primary =
@@ -7649,7 +7655,7 @@
   }
   SequenceNode* for_loop_statement = CloseBlock();
 
-  WhileNode* while_node = new (I) WhileNode(await_for_pos,
+  WhileNode* while_node = new (Z) WhileNode(await_for_pos,
                                             label,
                                             transformed_await,
                                             await_preamble,
@@ -7670,7 +7676,7 @@
   const String* loop_var_name = NULL;
   intptr_t loop_var_pos = 0;
   bool new_loop_var = false;
-  AbstractType& loop_var_type =  AbstractType::ZoneHandle(I);
+  AbstractType& loop_var_type =  AbstractType::ZoneHandle(Z);
   if (LookaheadToken(1) == Token::kIN) {
     loop_var_pos = TokenPos();
     loop_var_name = ExpectIdentifier("variable name expected");
@@ -7698,23 +7704,23 @@
   // would refer to the compiler generated iterator and could confuse the user.
   // It is better to leave the iterator untyped and postpone the type error
   // until the loop variable is assigned to.
-  const AbstractType& iterator_type = Type::ZoneHandle(I, Type::DynamicType());
-  LocalVariable* iterator_var = new(I) LocalVariable(
+  const AbstractType& iterator_type = Type::ZoneHandle(Z, Type::DynamicType());
+  LocalVariable* iterator_var = new(Z) LocalVariable(
       collection_pos, Symbols::ForInIter(), iterator_type);
   current_block_->scope->AddVariable(iterator_var);
 
   // Generate initialization of iterator variable.
-  ArgumentListNode* no_args = new(I) ArgumentListNode(collection_pos);
-  AstNode* get_iterator = new(I) InstanceGetterNode(
+  ArgumentListNode* no_args = new(Z) ArgumentListNode(collection_pos);
+  AstNode* get_iterator = new(Z) InstanceGetterNode(
       collection_pos, collection_expr, Symbols::GetIterator());
   AstNode* iterator_init =
-      new(I) StoreLocalNode(collection_pos, iterator_var, get_iterator);
+      new(Z) StoreLocalNode(collection_pos, iterator_var, get_iterator);
   current_block_->statements->Add(iterator_init);
 
   // Generate while loop condition.
-  AstNode* iterator_moveNext = new(I) InstanceCallNode(
+  AstNode* iterator_moveNext = new(Z) InstanceCallNode(
       collection_pos,
-      new(I) LoadLocalNode(collection_pos, iterator_var),
+      new(Z) LoadLocalNode(collection_pos, iterator_var),
       Symbols::MoveNext(),
       no_args);
 
@@ -7726,9 +7732,9 @@
   current_block_->scope->AddLabel(label);
   const intptr_t loop_var_assignment_pos = TokenPos();
 
-  AstNode* iterator_current = new(I) InstanceGetterNode(
+  AstNode* iterator_current = new(Z) InstanceGetterNode(
       loop_var_assignment_pos,
-      new(I) LoadLocalNode(loop_var_assignment_pos, iterator_var),
+      new(Z) LoadLocalNode(loop_var_assignment_pos, iterator_var),
       Symbols::Current());
 
   // Generate assignment of next iterator value to loop variable.
@@ -7737,14 +7743,14 @@
     // The for loop variable is new for each iteration.
     // Create a variable and add it to the loop body scope.
     LocalVariable* loop_var =
-       new(I) LocalVariable(loop_var_assignment_pos,
+       new(Z) LocalVariable(loop_var_assignment_pos,
                             *loop_var_name,
                             loop_var_type);;
     if (loop_var_is_final) {
       loop_var->set_is_final();
     }
     current_block_->scope->AddVariable(loop_var);
-    loop_var_assignment = new(I) StoreLocalNode(
+    loop_var_assignment = new(Z) StoreLocalNode(
         loop_var_assignment_pos, loop_var, iterator_current);
   } else {
     AstNode* loop_var_primary =
@@ -7772,7 +7778,7 @@
 
   SequenceNode* for_loop_statement = CloseBlock();
 
-  AstNode* while_statement = new(I) WhileNode(
+  AstNode* while_statement = new(Z) WhileNode(
       forin_pos, label, iterator_moveNext, NULL, for_loop_statement);
   current_block_->statements->Add(while_statement);
 
@@ -7826,8 +7832,8 @@
   for (int i = 0; i < init_scope->num_variables(); i++) {
     if (init_scope->VariableAt(i)->is_captured() &&
         (init_scope->VariableAt(i)->owner() == init_scope)) {
-      SequenceNode* incr_sequence = new(I) SequenceNode(incr_pos, NULL);
-      incr_sequence->Add(new(I) CloneContextNode(for_pos));
+      SequenceNode* incr_sequence = new(Z) SequenceNode(incr_pos, NULL);
+      incr_sequence->Add(new(Z) CloneContextNode(for_pos));
       if (increment != NULL) {
         incr_sequence->Add(increment);
       }
@@ -7835,7 +7841,7 @@
       break;
     }
   }
-  AstNode* for_node = new(I) ForNode(
+  AstNode* for_node = new(Z) ForNode(
       for_pos,
       label,
       NodeAsSequenceNode(init_pos, initializer, NULL),
@@ -7852,24 +7858,24 @@
 AstNode* Parser::MakeStaticCall(const String& cls_name,
                                 const String& func_name,
                                 ArgumentListNode* arguments) {
-  const Class& cls = Class::Handle(I, Library::LookupCoreClass(cls_name));
+  const Class& cls = Class::Handle(Z, Library::LookupCoreClass(cls_name));
   ASSERT(!cls.IsNull());
-  const Function& func = Function::ZoneHandle(I,
+  const Function& func = Function::ZoneHandle(Z,
       Resolver::ResolveStatic(cls,
                               func_name,
                               arguments->length(),
                               arguments->names()));
   ASSERT(!func.IsNull());
-  return new(I) StaticCallNode(arguments->token_pos(), func, arguments);
+  return new(Z) StaticCallNode(arguments->token_pos(), func, arguments);
 }
 
 
 AstNode* Parser::MakeAssertCall(intptr_t begin, intptr_t end) {
-  ArgumentListNode* arguments = new(I) ArgumentListNode(begin);
-  arguments->Add(new(I) LiteralNode(begin,
-      Integer::ZoneHandle(I, Integer::New(begin))));
-  arguments->Add(new(I) LiteralNode(end,
-      Integer::ZoneHandle(I, Integer::New(end))));
+  ArgumentListNode* arguments = new(Z) ArgumentListNode(begin);
+  arguments->Add(new(Z) LiteralNode(begin,
+      Integer::ZoneHandle(Z, Integer::New(begin))));
+  arguments->Add(new(Z) LiteralNode(end,
+      Integer::ZoneHandle(Z, Integer::New(end))));
   return MakeStaticCall(Symbols::AssertionError(),
                         Library::PrivateCoreLibName(Symbols::ThrowNew()),
                         arguments);
@@ -7884,7 +7890,7 @@
     const intptr_t pos = condition->token_pos();
     condition = BuildClosureCall(pos,
                                  condition,
-                                 new(I) ArgumentListNode(pos));
+                                 new(Z) ArgumentListNode(pos));
   } else if (condition->IsConditionalExprNode()) {
     ConditionalExprNode* cond_expr = condition->AsConditionalExprNode();
     cond_expr->set_true_expr(InsertClosureCallNodes(cond_expr->true_expr()));
@@ -7908,9 +7914,9 @@
   const intptr_t condition_end = TokenPos();
   ExpectToken(Token::kRPAREN);
   condition = InsertClosureCallNodes(condition);
-  condition = new(I) UnaryOpNode(condition_pos, Token::kNOT, condition);
+  condition = new(Z) UnaryOpNode(condition_pos, Token::kNOT, condition);
   AstNode* assert_throw = MakeAssertCall(condition_pos, condition_end);
-  return new(I) IfNode(
+  return new(Z) IfNode(
       condition_pos,
       condition,
       NodeAsSequenceNode(condition_pos, assert_throw, NULL),
@@ -7923,7 +7929,7 @@
                                    CatchParamDesc* stack_trace_param,
                                    LocalScope* scope) {
   if (exception_param->name != NULL) {
-    LocalVariable* var = new(I) LocalVariable(
+    LocalVariable* var = new(Z) LocalVariable(
         exception_param->token_pos,
         *exception_param->name,
         *exception_param->type);
@@ -7933,7 +7939,7 @@
     exception_param->var = var;
   }
   if (stack_trace_param->name != NULL) {
-    LocalVariable* var = new(I) LocalVariable(
+    LocalVariable* var = new(Z) LocalVariable(
         stack_trace_param->token_pos,
         *stack_trace_param->name,
         *stack_trace_param->type);
@@ -7977,7 +7983,7 @@
 
 void Parser::PushTryBlock(Block* try_block) {
   intptr_t try_index = AllocateTryIndex();
-  TryBlocks* block = new(I) TryBlocks(
+  TryBlocks* block = new(Z) TryBlocks(
       try_block, try_blocks_list_, try_index);
   try_blocks_list_ = block;
 }
@@ -8055,10 +8061,10 @@
     CatchParamDesc stack_trace_param;
     if (IsLiteral("on")) {
       ConsumeToken();
-      exception_param.type = &AbstractType::ZoneHandle(I,
+      exception_param.type = &AbstractType::ZoneHandle(Z,
           ParseType(ClassFinalizer::kCanonicalize));
     } else {
-      exception_param.type = &AbstractType::ZoneHandle(I, Type::DynamicType());
+      exception_param.type = &AbstractType::ZoneHandle(Z, Type::DynamicType());
     }
     if (CurrentToken() == Token::kCATCH) {
       ConsumeToken();  // Consume the 'catch'.
@@ -8069,7 +8075,7 @@
         ConsumeToken();
         // TODO(hausner): Make implicit type be StackTrace, not dynamic.
         stack_trace_param.type =
-            &AbstractType::ZoneHandle(I, Type::DynamicType());
+            &AbstractType::ZoneHandle(Z, Type::DynamicType());
         stack_trace_param.token_pos = TokenPos();
         stack_trace_param.name = ExpectIdentifier("identifier expected");
       }
@@ -8089,8 +8095,8 @@
       // Generate code to load the exception object (:exception_var) into
       // the exception variable specified in this block.
       ASSERT(exception_var != NULL);
-      current_block_->statements->Add(new(I) StoreLocalNode(
-          catch_pos, exception_param.var, new(I) LoadLocalNode(
+      current_block_->statements->Add(new(Z) StoreLocalNode(
+          catch_pos, exception_param.var, new(Z) LoadLocalNode(
               catch_pos, exception_var)));
     }
     if (stack_trace_param.var != NULL) {
@@ -8098,14 +8104,14 @@
       // to load the stack trace object (:stack_trace_var) into the stack
       // trace variable specified in this block.
       *needs_stack_trace = true;
-      ArgumentListNode* no_args = new(I) ArgumentListNode(catch_pos);
+      ArgumentListNode* no_args = new(Z) ArgumentListNode(catch_pos);
       ASSERT(stack_trace_var != NULL);
-      current_block_->statements->Add(new(I) StoreLocalNode(
-          catch_pos, stack_trace_param.var, new(I) LoadLocalNode(
+      current_block_->statements->Add(new(Z) StoreLocalNode(
+          catch_pos, stack_trace_param.var, new(Z) LoadLocalNode(
               catch_pos, stack_trace_var)));
-      current_block_->statements->Add(new(I) InstanceCallNode(
+      current_block_->statements->Add(new(Z) InstanceCallNode(
           catch_pos,
-          new(I) LoadLocalNode(catch_pos, stack_trace_param.var),
+          new(Z) LoadLocalNode(catch_pos, stack_trace_param.var),
           Library::PrivateCoreLibName(Symbols::_setupFullStackTrace()),
           no_args));
     }
@@ -8145,10 +8151,10 @@
       // In the first case, unconditionally execute the catch body.  In the
       // second case, unconditionally throw.
       generic_catch_seen = true;
-      type_tests.Add(new(I) LiteralNode(catch_pos, Bool::True()));
+      type_tests.Add(new(Z) LiteralNode(catch_pos, Bool::True()));
       if (is_bad_type) {
         // Replace the body with one that throws.
-        SequenceNode* block = new(I) SequenceNode(catch_pos, NULL);
+        SequenceNode* block = new(Z) SequenceNode(catch_pos, NULL);
         block->Add(ThrowTypeError(catch_pos, *exception_param.type));
         catch_blocks.Last() = block;
       }
@@ -8164,14 +8170,14 @@
         // Make sure that the instantiator is captured.
         CaptureInstantiator();
       }
-      TypeNode* exception_type = new(I) TypeNode(
+      TypeNode* exception_type = new(Z) TypeNode(
           catch_pos, *exception_param.type);
-      AstNode* exception_value = new(I) LoadLocalNode(
+      AstNode* exception_value = new(Z) LoadLocalNode(
           catch_pos, exception_var);
       if (!exception_type->type().IsInstantiated()) {
         EnsureExpressionTemp();
       }
-      type_tests.Add(new(I) ComparisonNode(
+      type_tests.Add(new(Z) ComparisonNode(
           catch_pos, Token::kIS, exception_value, exception_type));
 
       // Do not add uninstantiated types (e.g. type parameter T or generic
@@ -8199,11 +8205,11 @@
     // There isn't a generic catch clause so create a clause body that
     // rethrows the exception.  This includes the case that there were no
     // catch clauses.
-    current = new(I) SequenceNode(handler_pos, NULL);
-    current->Add(new(I) ThrowNode(
+    current = new(Z) SequenceNode(handler_pos, NULL);
+    current->Add(new(Z) ThrowNode(
         handler_pos,
-        new(I) LoadLocalNode(handler_pos, exception_var),
-        new(I) LoadLocalNode(handler_pos, stack_trace_var)));
+        new(Z) LoadLocalNode(handler_pos, exception_var),
+        new(Z) LoadLocalNode(handler_pos, stack_trace_var)));
   } else if (type_tests.Last()->IsLiteralNode()) {
     ASSERT(type_tests.Last()->AsLiteralNode()->literal().raw() ==
            Bool::True().raw());
@@ -8242,7 +8248,7 @@
       }
     }
 
-    current_block_->statements->Add(new(I) IfNode(
+    current_block_->statements->Add(new(Z) IfNode(
         type_test->token_pos(), type_test, catch_block, current));
     current = CloseBlock();
   }
@@ -8252,19 +8258,19 @@
 
 void Parser::SetupSavedTryContext(LocalVariable* saved_try_context) {
   const String& async_saved_try_ctx_name =
-      BuildAsyncSavedTryContextName(I, last_used_try_index_ - 1);
-  LocalVariable* async_saved_try_ctx = new (I) LocalVariable(
+      BuildAsyncSavedTryContextName(Z, last_used_try_index_ - 1);
+  LocalVariable* async_saved_try_ctx = new (Z) LocalVariable(
       Scanner::kNoSourcePos,
       async_saved_try_ctx_name,
-      Type::ZoneHandle(I, Type::DynamicType()));
+      Type::ZoneHandle(Z, Type::DynamicType()));
   async_temp_scope_->AddVariable(async_saved_try_ctx);
   async_saved_try_ctx->set_is_captured();
   async_saved_try_ctx = current_block_->scope->LookupVariable(
       async_saved_try_ctx_name, false);
   ASSERT(async_saved_try_ctx != NULL);
   ASSERT(saved_try_context != NULL);
-  current_block_->statements->Add(new (I) StoreLocalNode(
-      Scanner::kNoSourcePos, async_saved_try_ctx, new (I) LoadLocalNode(
+  current_block_->statements->Add(new (Z) StoreLocalNode(
+      Scanner::kNoSourcePos, async_saved_try_ctx, new (Z) LoadLocalNode(
           Scanner::kNoSourcePos, saved_try_context)));
   parsed_function()->set_saved_try_ctx(saved_try_context);
   parsed_function()->set_async_saved_try_ctx_name(async_saved_try_ctx_name);
@@ -8285,15 +8291,15 @@
       Symbols::SavedTryContextVar(), false);
   ASSERT((saved_try_ctx != NULL) && !saved_try_ctx->is_captured());
   const String& async_saved_try_ctx_name =
-      BuildAsyncSavedTryContextName(I, try_index);
+      BuildAsyncSavedTryContextName(Z, try_index);
   LocalVariable* async_saved_try_ctx =
       target->scope()->LookupVariable(async_saved_try_ctx_name, false);
   ASSERT(async_saved_try_ctx != NULL);
   ASSERT(async_saved_try_ctx->is_captured());
-  target->Add(new (I) StoreLocalNode(
+  target->Add(new (Z) StoreLocalNode(
       Scanner::kNoSourcePos,
       saved_try_ctx,
-      new (I) LoadLocalNode(Scanner::kNoSourcePos, async_saved_try_ctx)));
+      new (Z) LoadLocalNode(Scanner::kNoSourcePos, async_saved_try_ctx)));
 
   parsed_function()->set_saved_try_ctx(saved_try_ctx);
   parsed_function()->set_async_saved_try_ctx_name(async_saved_try_ctx_name);
@@ -8319,28 +8325,28 @@
   LocalVariable* context_var =
       current_block_->scope->LocalLookupVariable(Symbols::SavedTryContextVar());
   if (context_var == NULL) {
-    context_var = new(I) LocalVariable(
+    context_var = new(Z) LocalVariable(
         TokenPos(),
         Symbols::SavedTryContextVar(),
-        Type::ZoneHandle(I, Type::DynamicType()));
+        Type::ZoneHandle(Z, Type::DynamicType()));
     current_block_->scope->AddVariable(context_var);
   }
   LocalVariable* exception_var =
       current_block_->scope->LocalLookupVariable(Symbols::ExceptionVar());
   if (exception_var == NULL) {
-    exception_var = new(I) LocalVariable(
+    exception_var = new(Z) LocalVariable(
         TokenPos(),
         Symbols::ExceptionVar(),
-        Type::ZoneHandle(I, Type::DynamicType()));
+        Type::ZoneHandle(Z, Type::DynamicType()));
     current_block_->scope->AddVariable(exception_var);
   }
   LocalVariable* stack_trace_var =
       current_block_->scope->LocalLookupVariable(Symbols::StackTraceVar());
   if (stack_trace_var == NULL) {
-    stack_trace_var = new(I) LocalVariable(
+    stack_trace_var = new(Z) LocalVariable(
         TokenPos(),
         Symbols::StackTraceVar(),
-        Type::ZoneHandle(I, Type::DynamicType()));
+        Type::ZoneHandle(Z, Type::DynamicType()));
     current_block_->scope->AddVariable(stack_trace_var);
   }
 
@@ -8377,7 +8383,7 @@
   try_blocks_list_->enter_catch();
   const intptr_t handler_pos = TokenPos();
   const GrowableObjectArray& handler_types =
-      GrowableObjectArray::Handle(I, GrowableObjectArray::New());
+      GrowableObjectArray::Handle(Z, GrowableObjectArray::New());
   bool needs_stack_trace = false;
   SequenceNode* catch_handler_list =
       ParseCatchClauses(handler_pos, exception_var, stack_trace_var,
@@ -8401,7 +8407,7 @@
         inner_try_block->GetNodeToInlineFinally(node_index);
     while (node_to_inline != NULL) {
       finally_block = ParseFinallyBlock();
-      InlinedFinallyNode* node = new(I) InlinedFinallyNode(finally_pos,
+      InlinedFinallyNode* node = new(Z) InlinedFinallyNode(finally_pos,
                                                            finally_block,
                                                            context_var,
                                                            outer_try_index);
@@ -8413,10 +8419,10 @@
     finally_block = ParseFinallyBlock();
   }
 
-  CatchClauseNode* catch_clause = new(I) CatchClauseNode(
+  CatchClauseNode* catch_clause = new(Z) CatchClauseNode(
       handler_pos,
       catch_handler_list,
-      Array::ZoneHandle(I, Array::MakeArray(handler_types)),
+      Array::ZoneHandle(Z, Array::MakeArray(handler_types)),
       context_var,
       exception_var,
       stack_trace_var,
@@ -8427,7 +8433,7 @@
   // Now create the try/catch ast node and return it. If there is a label
   // on the try/catch, close the block that's embedding the try statement
   // and attach the label to it.
-  AstNode* try_catch_node = new(I) TryCatchNode(
+  AstNode* try_catch_node = new(Z) TryCatchNode(
       try_pos, try_block, context_var, catch_clause, finally_block, try_index);
 
   if (try_label != NULL) {
@@ -8470,7 +8476,7 @@
       LocalScope* switch_scope = current_block_->scope->LookupSwitchScope();
       if (switch_scope != NULL) {
         // We found a switch scope. Enter a forward reference to the label.
-        target = new(I) SourceLabel(
+        target = new(Z) SourceLabel(
             TokenPos(), target_name, SourceLabel::kForward);
         switch_scope->AddLabel(target);
       }
@@ -8500,7 +8506,7 @@
     ReportError(jump_pos, "'%s' target must be in same function context",
                 Token::Str(jump_kind));
   }
-  return new(I) JumpNode(jump_pos, jump_kind, target);
+  return new(Z) JumpNode(jump_pos, jump_kind, target);
 }
 
 
@@ -8544,9 +8550,9 @@
                     "return of a value not allowed in constructors");
       }
       AstNode* expr = ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
-      statement = new(I) ReturnNode(statement_pos, expr);
+      statement = new(Z) ReturnNode(statement_pos, expr);
     } else {
-      statement = new(I) ReturnNode(statement_pos);
+      statement = new(Z) ReturnNode(statement_pos);
     }
     AddNodeForFinallyInlining(statement);
     ExpectSemicolon();
@@ -8603,10 +8609,10 @@
     LocalVariable* trace_var =
         scope->LocalLookupVariable(Symbols::StackTraceVar());
     ASSERT(trace_var != NULL);
-    statement = new(I) ThrowNode(
+    statement = new(Z) ThrowNode(
         statement_pos,
-        new(I) LoadLocalNode(statement_pos, excp_var),
-        new(I) LoadLocalNode(statement_pos, trace_var));
+        new(Z) LoadLocalNode(statement_pos, excp_var),
+        new(Z) LoadLocalNode(statement_pos, trace_var));
   } else {
     statement = ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
     ExpectSemicolon();
@@ -8762,20 +8768,20 @@
 
 
 AstNode* Parser::ThrowTypeError(intptr_t type_pos, const AbstractType& type) {
-  ArgumentListNode* arguments = new(I) ArgumentListNode(type_pos);
+  ArgumentListNode* arguments = new(Z) ArgumentListNode(type_pos);
   // Location argument.
-  arguments->Add(new(I) LiteralNode(
-      type_pos, Integer::ZoneHandle(I, Integer::New(type_pos))));
+  arguments->Add(new(Z) LiteralNode(
+      type_pos, Integer::ZoneHandle(Z, Integer::New(type_pos))));
   // Src value argument.
-  arguments->Add(new(I) LiteralNode(type_pos, Instance::ZoneHandle(I)));
+  arguments->Add(new(Z) LiteralNode(type_pos, Instance::ZoneHandle(Z)));
   // Dst type name argument.
-  arguments->Add(new(I) LiteralNode(type_pos, Symbols::Malformed()));
+  arguments->Add(new(Z) LiteralNode(type_pos, Symbols::Malformed()));
   // Dst name argument.
-  arguments->Add(new(I) LiteralNode(type_pos, Symbols::Empty()));
+  arguments->Add(new(Z) LiteralNode(type_pos, Symbols::Empty()));
   // Malformed type error or malbounded type error.
-  const Error& error = Error::Handle(I, type.error());
+  const Error& error = Error::Handle(Z, type.error());
   ASSERT(!error.IsNull());
-  arguments->Add(new(I) LiteralNode(type_pos, String::ZoneHandle(I,
+  arguments->Add(new(Z) LiteralNode(type_pos, String::ZoneHandle(Z,
       Symbols::New(error.ToErrorCString()))));
   return MakeStaticCall(Symbols::TypeError(),
                         Library::PrivateCoreLibName(Symbols::ThrowNew()),
@@ -8790,7 +8796,7 @@
                                         InvocationMirror::Call im_call,
                                         InvocationMirror::Type im_type,
                                         const Function* func) {
-  ArgumentListNode* arguments = new(I) ArgumentListNode(call_pos);
+  ArgumentListNode* arguments = new(Z) ArgumentListNode(call_pos);
   // Object receiver.
   // If the function is external and dynamic, pass the actual receiver,
   // otherwise, pass a class literal of the unresolved method's owner.
@@ -8798,38 +8804,38 @@
       func->is_external() && !func->is_static()) {
     arguments->Add(LoadReceiver(func->token_pos()));
   } else {
-    Type& type = Type::ZoneHandle(I,
-        Type::New(cls, TypeArguments::Handle(I), call_pos, Heap::kOld));
+    Type& type = Type::ZoneHandle(Z,
+        Type::New(cls, TypeArguments::Handle(Z), call_pos, Heap::kOld));
     type ^= ClassFinalizer::FinalizeType(
         current_class(), type, ClassFinalizer::kCanonicalize);
-    arguments->Add(new(I) LiteralNode(call_pos, type));
+    arguments->Add(new(Z) LiteralNode(call_pos, type));
   }
   // String memberName.
-  arguments->Add(new(I) LiteralNode(
-      call_pos, String::ZoneHandle(I, Symbols::New(function_name))));
+  arguments->Add(new(Z) LiteralNode(
+      call_pos, String::ZoneHandle(Z, Symbols::New(function_name))));
   // Smi invocation_type.
   if (cls.IsTopLevel()) {
     ASSERT(im_call == InvocationMirror::kStatic ||
            im_call == InvocationMirror::kTopLevel);
     im_call = InvocationMirror::kTopLevel;
   }
-  arguments->Add(new(I) LiteralNode(call_pos, Smi::ZoneHandle(I,
+  arguments->Add(new(Z) LiteralNode(call_pos, Smi::ZoneHandle(Z,
       Smi::New(InvocationMirror::EncodeType(im_call, im_type)))));
   // List arguments.
   if (function_arguments == NULL) {
-    arguments->Add(new(I) LiteralNode(call_pos, Array::ZoneHandle(I)));
+    arguments->Add(new(Z) LiteralNode(call_pos, Array::ZoneHandle(Z)));
   } else {
-    ArrayNode* array = new(I) ArrayNode(
+    ArrayNode* array = new(Z) ArrayNode(
         call_pos,
-        Type::ZoneHandle(I, Type::ArrayType()),
+        Type::ZoneHandle(Z, Type::ArrayType()),
         function_arguments->nodes());
     arguments->Add(array);
   }
   // List argumentNames.
   if (function_arguments == NULL) {
-    arguments->Add(new(I) LiteralNode(call_pos, Array::ZoneHandle(I)));
+    arguments->Add(new(Z) LiteralNode(call_pos, Array::ZoneHandle(Z)));
   } else {
-    arguments->Add(new(I) LiteralNode(call_pos, function_arguments->names()));
+    arguments->Add(new(Z) LiteralNode(call_pos, function_arguments->names()));
   }
 
   // List existingArgumentNames.
@@ -8837,13 +8843,13 @@
   // has done the lookup already. If there is a function with the same
   // name but incompatible parameters, inform the NoSuchMethodError what the
   // expected parameters are.
-  Function& function = Function::Handle(I);
+  Function& function = Function::Handle(Z);
   if (func != NULL) {
     function = func->raw();
   } else {
     function = cls.LookupStaticFunction(function_name);
   }
-  Array& array = Array::ZoneHandle(I);
+  Array& array = Array::ZoneHandle(Z);
   // An unpatched external function is treated as an unresolved function.
   if (!function.IsNull() && !function.is_external()) {
     // The constructor for NoSuchMethodError takes a list of existing
@@ -8859,9 +8865,9 @@
     // between dart2js and VM. Update the constructor to accept a string
     // describing the formal parameters of an incompatible call target.
     array = Array::New(1, Heap::kOld);
-    array.SetAt(0, String::Handle(I, function.UserVisibleFormalParameters()));
+    array.SetAt(0, String::Handle(Z, function.UserVisibleFormalParameters()));
   }
-  arguments->Add(new(I) LiteralNode(call_pos, array));
+  arguments->Add(new(Z) LiteralNode(call_pos, array));
 
   return MakeStaticCall(Symbols::NoSuchMethodError(),
                         Library::PrivateCoreLibName(Symbols::ThrowNew()),
@@ -8893,14 +8899,14 @@
           op_kind = Token::kISNOT;
         }
         const intptr_t type_pos = TokenPos();
-        const AbstractType& type = AbstractType::ZoneHandle(I,
+        const AbstractType& type = AbstractType::ZoneHandle(Z,
             ParseType(ClassFinalizer::kCanonicalize));
         if (!type.IsInstantiated() &&
             (current_block_->scope->function_level() > 0)) {
           // Make sure that the instantiator is captured.
           CaptureInstantiator();
         }
-        right_operand = new(I) TypeNode(type_pos, type);
+        right_operand = new(Z) TypeNode(type_pos, type);
         // In production mode, the type may be malformed.
         // In checked mode, the type may be malformed or malbounded.
         if (((op_kind == Token::kIS) || (op_kind == Token::kISNOT) ||
@@ -8910,7 +8916,7 @@
           // a type cast even if the tested value is null.
           // We need to evaluate the left operand for potential
           // side effects.
-          LetNode* let = new(I) LetNode(left_operand->token_pos());
+          LetNode* let = new(Z) LetNode(left_operand->token_pos());
           let->AddNode(left_operand);
           let->AddNode(ThrowTypeError(type_pos, type));
           left_operand = let;
@@ -8927,7 +8933,7 @@
             EnsureExpressionTemp();
           }
         }
-        left_operand = new(I) ComparisonNode(
+        left_operand = new(Z) ComparisonNode(
             op_pos, op_kind, left_operand, right_operand);
         break;  // Equality and relational operators cannot be chained.
       } else {
@@ -8952,7 +8958,7 @@
   }
   if (CurrentToken() == Token::kCOMMA) {
     // Collect comma-separated expressions in a non scope owning sequence node.
-    SequenceNode* list = new(I) SequenceNode(TokenPos(), NULL);
+    SequenceNode* list = new(Z) SequenceNode(TokenPos(), NULL);
     list->Add(expressions);
     while (CurrentToken() == Token::kCOMMA) {
       ConsumeToken();
@@ -8980,10 +8986,10 @@
                                                const char* s) {
   char name[64];
   OS::SNPrint(name, 64, ":%s%" Pd, s, token_pos);
-  LocalVariable* temp = new(I) LocalVariable(
+  LocalVariable* temp = new(Z) LocalVariable(
       token_pos,
-      String::ZoneHandle(I, Symbols::New(name)),
-      Type::ZoneHandle(I, Type::DynamicType()));
+      String::ZoneHandle(Z, Symbols::New(name)),
+      Type::ZoneHandle(Z, Type::DynamicType()));
   temp->set_is_final();
   current_block_->scope->AddVariable(temp);
   return temp;
@@ -9003,9 +9009,9 @@
       double left_double = Double::Cast(lhs_literal->literal()).value();
       double right_double = Double::Cast(rhs_literal->literal()).value();
       if (binary_op == Token::kDIV) {
-        const Double& dbl_obj = Double::ZoneHandle(I,
+        const Double& dbl_obj = Double::ZoneHandle(Z,
             Double::NewCanonical((left_double / right_double)));
-        return new(I) LiteralNode(op_pos, dbl_obj);
+        return new(Z) LiteralNode(op_pos, dbl_obj);
       }
     }
   }
@@ -9028,14 +9034,14 @@
             (lhs->AsBinaryOpNode()->kind() == Token::kSHL)) {
           // Merge SHL and BIT_AND into one "SHL with mask" node.
           BinaryOpNode* old = lhs->AsBinaryOpNode();
-          BinaryOpWithMask32Node* binop = new(I) BinaryOpWithMask32Node(
+          BinaryOpWithMask32Node* binop = new(Z) BinaryOpWithMask32Node(
               old->token_pos(), old->kind(), old->left(), old->right(), val);
           return binop;
         }
       }
     }
   }
-  return new(I) BinaryOpNode(op_pos, binary_op, lhs, rhs);
+  return new(Z) BinaryOpNode(op_pos, binary_op, lhs, rhs);
 }
 
 
@@ -9048,27 +9054,27 @@
     case Token::kASSIGN:
       return rhs;
     case Token::kASSIGN_ADD:
-      return new(I) BinaryOpNode(op_pos, Token::kADD, lhs, rhs);
+      return new(Z) BinaryOpNode(op_pos, Token::kADD, lhs, rhs);
     case Token::kASSIGN_SUB:
-      return new(I) BinaryOpNode(op_pos, Token::kSUB, lhs, rhs);
+      return new(Z) BinaryOpNode(op_pos, Token::kSUB, lhs, rhs);
     case Token::kASSIGN_MUL:
-      return new(I) BinaryOpNode(op_pos, Token::kMUL, lhs, rhs);
+      return new(Z) BinaryOpNode(op_pos, Token::kMUL, lhs, rhs);
     case Token::kASSIGN_TRUNCDIV:
-      return new(I) BinaryOpNode(op_pos, Token::kTRUNCDIV, lhs, rhs);
+      return new(Z) BinaryOpNode(op_pos, Token::kTRUNCDIV, lhs, rhs);
     case Token::kASSIGN_DIV:
-      return new(I) BinaryOpNode(op_pos, Token::kDIV, lhs, rhs);
+      return new(Z) BinaryOpNode(op_pos, Token::kDIV, lhs, rhs);
     case Token::kASSIGN_MOD:
-      return new(I) BinaryOpNode(op_pos, Token::kMOD, lhs, rhs);
+      return new(Z) BinaryOpNode(op_pos, Token::kMOD, lhs, rhs);
     case Token::kASSIGN_SHR:
-      return new(I) BinaryOpNode(op_pos, Token::kSHR, lhs, rhs);
+      return new(Z) BinaryOpNode(op_pos, Token::kSHR, lhs, rhs);
     case Token::kASSIGN_SHL:
-      return new(I) BinaryOpNode(op_pos, Token::kSHL, lhs, rhs);
+      return new(Z) BinaryOpNode(op_pos, Token::kSHL, lhs, rhs);
     case Token::kASSIGN_OR:
-      return new(I) BinaryOpNode(op_pos, Token::kBIT_OR, lhs, rhs);
+      return new(Z) BinaryOpNode(op_pos, Token::kBIT_OR, lhs, rhs);
     case Token::kASSIGN_AND:
-      return new(I) BinaryOpNode(op_pos, Token::kBIT_AND, lhs, rhs);
+      return new(Z) BinaryOpNode(op_pos, Token::kBIT_AND, lhs, rhs);
     case Token::kASSIGN_XOR:
-      return new(I) BinaryOpNode(op_pos, Token::kBIT_XOR, lhs, rhs);
+      return new(Z) BinaryOpNode(op_pos, Token::kBIT_XOR, lhs, rhs);
     default:
       ReportError(op_pos,
                   "internal error: ExpandAssignableOp '%s' unimplemented",
@@ -9088,7 +9094,7 @@
   if (expr->EvalConstExpr() == NULL) {
     ReportError(expr_pos, "expression is not a valid compile-time constant");
   }
-  return new(I) LiteralNode(
+  return new(Z) LiteralNode(
       expr_pos, EvaluateConstExpr(expr_pos, expr));
 }
 
@@ -9096,21 +9102,21 @@
 LetNode* Parser::PrepareCompoundAssignmentNodes(AstNode** expr) {
   AstNode* node = *expr;
   intptr_t token_pos = node->token_pos();
-  LetNode* result = new(I) LetNode(token_pos);
+  LetNode* result = new(Z) LetNode(token_pos);
   if (node->IsLoadIndexedNode()) {
     LoadIndexedNode* load_indexed = node->AsLoadIndexedNode();
     AstNode* array = load_indexed->array();
     AstNode* index = load_indexed->index_expr();
     if (!IsSimpleLocalOrLiteralNode(load_indexed->array())) {
       LocalVariable* t0 = result->AddInitializer(load_indexed->array());
-      array = new(I) LoadLocalNode(token_pos, t0);
+      array = new(Z) LoadLocalNode(token_pos, t0);
     }
     if (!IsSimpleLocalOrLiteralNode(load_indexed->index_expr())) {
       LocalVariable* t1 = result->AddInitializer(
           load_indexed->index_expr());
-      index = new(I) LoadLocalNode(token_pos, t1);
+      index = new(Z) LoadLocalNode(token_pos, t1);
     }
-    *expr = new(I) LoadIndexedNode(token_pos,
+    *expr = new(Z) LoadIndexedNode(token_pos,
                                    array,
                                    index,
                                    load_indexed->super_class());
@@ -9121,9 +9127,9 @@
     AstNode* receiver = getter->receiver();
     if (!IsSimpleLocalOrLiteralNode(getter->receiver())) {
       LocalVariable* t0 = result->AddInitializer(getter->receiver());
-      receiver = new(I) LoadLocalNode(token_pos, t0);
+      receiver = new(Z) LoadLocalNode(token_pos, t0);
     }
-    *expr = new(I) InstanceGetterNode(
+    *expr = new(Z) InstanceGetterNode(
         token_pos, receiver, getter->field_name());
     return result;
   }
@@ -9159,13 +9165,13 @@
                                       intptr_t left_pos) {
   AstNode* result = original->MakeAssignmentNode(rhs);
   if (result == NULL) {
-    String& name = String::ZoneHandle(I);
+    String& name = String::ZoneHandle(Z);
     const Class* target_cls = &current_class();
     if (original->IsTypeNode()) {
       name = Symbols::New(original->AsTypeNode()->TypeName());
     } else if (original->IsLoadStaticFieldNode()) {
       name = original->AsLoadStaticFieldNode()->field().name();
-      target_cls = &Class::Handle(I,
+      target_cls = &Class::Handle(Z,
           original->AsLoadStaticFieldNode()->field().owner());
     } else if ((left_ident != NULL) &&
                (original->IsLiteralNode() ||
@@ -9178,7 +9184,7 @@
     result = ThrowNoSuchMethodError(
         original->token_pos(),
         *target_cls,
-        String::Handle(I, Field::SetterName(name)),
+        String::Handle(Z, Field::SetterName(name)),
         NULL,  // No arguments.
         InvocationMirror::kStatic,
         original->IsLoadLocalNode() ?
@@ -9198,12 +9204,12 @@
 
 AstNode* Parser::ParseCascades(AstNode* expr) {
   intptr_t cascade_pos = TokenPos();
-  LetNode* cascade = new(I) LetNode(cascade_pos);
+  LetNode* cascade = new(Z) LetNode(cascade_pos);
   LocalVariable* cascade_receiver_var = cascade->AddInitializer(expr);
   while (CurrentToken() == Token::kCASCADE) {
     cascade_pos = TokenPos();
     LoadLocalNode* load_cascade_receiver =
-        new(I) LoadLocalNode(cascade_pos, cascade_receiver_var);
+        new(Z) LoadLocalNode(cascade_pos, cascade_receiver_var);
     if (Token::IsIdentifier(LookaheadToken(1))) {
       // Replace .. with . for ParseSelectors().
       token_kind_ = Token::kPERIOD;
@@ -9248,20 +9254,20 @@
   }
   // The result is an expression with the (side effects of the) cascade
   // sequence followed by the (value of the) receiver temp variable load.
-  cascade->AddNode(new(I) LoadLocalNode(cascade_pos, cascade_receiver_var));
+  cascade->AddNode(new(Z) LoadLocalNode(cascade_pos, cascade_receiver_var));
   return cascade;
 }
 
 
 // Convert loading of a static const field into a literal node.
-static AstNode* LiteralIfStaticConst(Isolate* iso, AstNode* expr) {
+static AstNode* LiteralIfStaticConst(Zone* zone, AstNode* expr) {
   if (expr->IsLoadStaticFieldNode()) {
     const Field& field = expr->AsLoadStaticFieldNode()->field();
     if (field.is_const()) {
       ASSERT(field.value() != Object::sentinel().raw());
       ASSERT(field.value() != Object::transition_sentinel().raw());
-      return new(iso) LiteralNode(expr->token_pos(),
-                             Instance::ZoneHandle(iso, field.value()));
+      return new(zone) LiteralNode(expr->token_pos(),
+                                   Instance::ZoneHandle(zone, field.value()));
     }
   }
   return expr;
@@ -9312,7 +9318,7 @@
       ReportError("expression expected after throw");
     }
     AstNode* expr = ParseExpr(require_compiletime_const, consume_cascades);
-    return new(I) ThrowNode(expr_pos, expr, NULL);
+    return new(Z) ThrowNode(expr_pos, expr, NULL);
   }
   AstNode* expr = ParseConditionalExpr();
   if (!Token::IsAssignmentOperator(CurrentToken())) {
@@ -9322,7 +9328,7 @@
     if (require_compiletime_const) {
       expr = FoldConstExpr(expr_pos, expr);
     } else {
-      expr = LiteralIfStaticConst(I, expr);
+      expr = LiteralIfStaticConst(Z, expr);
     }
     return expr;
   }
@@ -9350,7 +9356,7 @@
     let_expr->AddNode(assign_expr);
     return let_expr;
   } else {
-    AstNode* assigned_value = LiteralIfStaticConst(I, right_expr);
+    AstNode* assigned_value = LiteralIfStaticConst(Z, right_expr);
     AstNode* assign_expr =
         CreateAssignmentNode(expr, assigned_value, expr_ident, expr_pos);
     ASSERT(assign_expr != NULL);
@@ -9380,7 +9386,7 @@
     AstNode* expr1 = ParseExpr(kAllowConst, kNoCascades);
     ExpectToken(Token::kCOLON);
     AstNode* expr2 = ParseExpr(kAllowConst, kNoCascades);
-    expr = new(I) ConditionalExprNode(expr_pos, expr, expr1, expr2);
+    expr = new(Z) ConditionalExprNode(expr_pos, expr, expr1, expr2);
   }
   return expr;
 }
@@ -9394,7 +9400,7 @@
     TRACE_PARSER("ParseAwaitExpr");
     ConsumeToken();
     parsed_function()->record_await();
-    expr = new (I) AwaitNode(TokenPos(), ParseUnaryExpr());
+    expr = new (Z) AwaitNode(TokenPos(), ParseUnaryExpr());
   } else if (IsPrefixOperator(CurrentToken())) {
     Token::Kind unary_op = CurrentToken();
     if (unary_op == Token::kSUB) {
@@ -9421,11 +9427,11 @@
     LetNode* let_expr = PrepareCompoundAssignmentNodes(&expr);
     Token::Kind binary_op =
         (incr_op == Token::kINCR) ? Token::kADD : Token::kSUB;
-    BinaryOpNode* add = new(I) BinaryOpNode(
+    BinaryOpNode* add = new(Z) BinaryOpNode(
         op_pos,
         binary_op,
         expr,
-        new(I) LiteralNode(op_pos, Smi::ZoneHandle(I, Smi::New(1))));
+        new(Z) LiteralNode(op_pos, Smi::ZoneHandle(Z, Smi::New(1))));
     AstNode* store = CreateAssignmentNode(expr, add, expr_ident, expr_pos);
     ASSERT(store != NULL);
     let_expr->AddNode(store);
@@ -9445,15 +9451,15 @@
   const bool saved_mode = SetAllowFunctionLiterals(true);
   ArgumentListNode* arguments;
   if (implicit_arguments == NULL) {
-    arguments = new(I) ArgumentListNode(TokenPos());
+    arguments = new(Z) ArgumentListNode(TokenPos());
   } else {
     arguments = implicit_arguments;
   }
-  const GrowableObjectArray& names = GrowableObjectArray::Handle(I,
+  const GrowableObjectArray& names = GrowableObjectArray::Handle(Z,
       GrowableObjectArray::New(Heap::kOld));
   bool named_argument_seen = false;
   if (LookaheadToken(1) != Token::kRPAREN) {
-    String& arg_name = String::Handle(I);
+    String& arg_name = String::Handle(Z);
     do {
       ASSERT((CurrentToken() == Token::kLPAREN) ||
              (CurrentToken() == Token::kCOMMA));
@@ -9484,7 +9490,7 @@
   ExpectToken(Token::kRPAREN);
   SetAllowFunctionLiterals(saved_mode);
   if (named_argument_seen) {
-    arguments->set_names(Array::Handle(I, Array::MakeArray(names)));
+    arguments->set_names(Array::Handle(Z, Array::MakeArray(names)));
   }
   return arguments;
 }
@@ -9498,7 +9504,7 @@
   ASSERT(CurrentToken() == Token::kLPAREN);
   ArgumentListNode* arguments = ParseActualParameters(NULL, kAllowConst);
   const int num_arguments = arguments->length();
-  const Function& func = Function::ZoneHandle(I,
+  const Function& func = Function::ZoneHandle(Z,
       Resolver::ResolveStatic(cls,
                               func_name,
                               num_arguments,
@@ -9507,12 +9513,12 @@
     // Check if there is a static field of the same name, it could be a closure
     // and so we try and invoke the closure.
     AstNode* closure = NULL;
-    const Field& field = Field::ZoneHandle(I, cls.LookupStaticField(func_name));
-    Function& func = Function::ZoneHandle(I);
+    const Field& field = Field::ZoneHandle(Z, cls.LookupStaticField(func_name));
+    Function& func = Function::ZoneHandle(Z);
     if (field.IsNull()) {
       // No field, check if we have an explicit getter function.
       const String& getter_name =
-          String::ZoneHandle(I, Field::GetterName(func_name));
+          String::ZoneHandle(Z, Field::GetterName(func_name));
       const int kNumArguments = 0;  // no arguments.
       func = Resolver::ResolveStatic(cls,
                                      getter_name,
@@ -9520,11 +9526,11 @@
                                      Object::empty_array());
       if (!func.IsNull()) {
         ASSERT(func.kind() != RawFunction::kImplicitStaticFinalGetter);
-        closure = new(I) StaticGetterNode(
+        closure = new(Z) StaticGetterNode(
             call_pos,
             NULL,
             false,
-            Class::ZoneHandle(I, cls.raw()),
+            Class::ZoneHandle(Z, cls.raw()),
             func_name);
         return BuildClosureCall(call_pos, closure, arguments);
       }
@@ -9549,13 +9555,13 @@
     // source.
     if (!FLAG_warn_on_javascript_compatibility || is_patch_source()) {
       ASSERT(num_arguments == 2);
-      return new(I) ComparisonNode(ident_pos,
+      return new(Z) ComparisonNode(ident_pos,
                                    Token::kEQ_STRICT,
                                    arguments->NodeAt(0),
                                    arguments->NodeAt(1));
     }
   }
-  return new(I) StaticCallNode(call_pos, func, arguments);
+  return new(Z) StaticCallNode(call_pos, func, arguments);
 }
 
 
@@ -9564,7 +9570,7 @@
   const intptr_t call_pos = TokenPos();
   CheckToken(Token::kLPAREN);
   ArgumentListNode* arguments = ParseActualParameters(NULL, kAllowConst);
-  return new(I) InstanceCallNode(call_pos, receiver, func_name, arguments);
+  return new(Z) InstanceCallNode(call_pos, receiver, func_name, arguments);
 }
 
 
@@ -9589,18 +9595,18 @@
   }
   // The field is initialized.
   ASSERT(field.is_static());
-  const Class& field_owner = Class::ZoneHandle(I, field.owner());
-  const String& field_name = String::ZoneHandle(I, field.name());
-  const String& getter_name = String::Handle(I, Field::GetterName(field_name));
-  const Function& getter = Function::Handle(I,
+  const Class& field_owner = Class::ZoneHandle(Z, field.owner());
+  const String& field_name = String::ZoneHandle(Z, field.name());
+  const String& getter_name = String::Handle(Z, Field::GetterName(field_name));
+  const Function& getter = Function::Handle(Z,
       field_owner.LookupStaticFunction(getter_name));
   // Never load field directly if there is a getter (deterministic AST).
   if (getter.IsNull() || field.is_const()) {
-    return new(I) LoadStaticFieldNode(
-        ident_pos, Field::ZoneHandle(I, field.raw()));
+    return new(Z) LoadStaticFieldNode(
+        ident_pos, Field::ZoneHandle(Z, field.raw()));
   } else {
     ASSERT(getter.kind() == RawFunction::kImplicitStaticFinalGetter);
-    return new(I) StaticGetterNode(ident_pos,
+    return new(Z) StaticGetterNode(ident_pos,
                                    NULL,  // Receiver.
                                    false,  // is_super_getter.
                                    field_owner,
@@ -9615,12 +9621,12 @@
                                         bool consume_cascades) {
   TRACE_PARSER("ParseStaticFieldAccess");
   AstNode* access = NULL;
-  const Field& field = Field::ZoneHandle(I, cls.LookupStaticField(field_name));
-  Function& func = Function::ZoneHandle(I);
+  const Field& field = Field::ZoneHandle(Z, cls.LookupStaticField(field_name));
+  Function& func = Function::ZoneHandle(Z);
   if (field.IsNull()) {
     // No field, check if we have an explicit getter function.
     const String& getter_name =
-        String::ZoneHandle(I, Field::GetterName(field_name));
+        String::ZoneHandle(Z, Field::GetterName(field_name));
     const int kNumArguments = 0;  // no arguments.
     func = Resolver::ResolveStatic(cls,
                                    getter_name,
@@ -9638,16 +9644,16 @@
         // Create a getter call, which may later be turned into
         // a setter call, or else the backend will generate
         // a throw NoSuchMethodError().
-        access = new(I) StaticGetterNode(ident_pos,
+        access = new(Z) StaticGetterNode(ident_pos,
                                          NULL,
                                          false,
-                                         Class::ZoneHandle(I, cls.raw()),
+                                         Class::ZoneHandle(Z, cls.raw()),
                                          field_name);
       }
     } else {
       ASSERT(func.kind() != RawFunction::kImplicitStaticFinalGetter);
-      access = new(I) StaticGetterNode(
-          ident_pos, NULL, false, Class::ZoneHandle(I, cls.raw()), field_name);
+      access = new(Z) StaticGetterNode(
+          ident_pos, NULL, false, Class::ZoneHandle(Z, cls.raw()), field_name);
     }
   } else {
     access = GenerateStaticFieldLookup(field, ident_pos);
@@ -9672,11 +9678,11 @@
     String& name = String::CheckedZoneHandle(primary->primary().raw());
     if (current_function().is_static() ||
         current_function().IsInFactoryScope()) {
-      StaticGetterNode* getter = new(I) StaticGetterNode(
+      StaticGetterNode* getter = new(Z) StaticGetterNode(
           primary->token_pos(),
           NULL,  // No receiver.
           false,  // Not a super getter.
-          Class::ZoneHandle(I, current_class().raw()),
+          Class::ZoneHandle(Z, current_class().raw()),
           name);
       getter->set_is_deferred(primary->is_deferred_reference());
       return getter;
@@ -9693,7 +9699,7 @@
   ASSERT(primary->primary().IsFunction());
   const Function& func =
       Function::CheckedZoneHandle(primary->primary().raw());
-  const String& funcname = String::ZoneHandle(I, func.name());
+  const String& funcname = String::ZoneHandle(Z, func.name());
   if (func.is_static()) {
     // Static function access.
     ClosureNode* closure =
@@ -9729,7 +9735,7 @@
           left = LoadClosure(primary_node);
         } else if (primary_node->primary().IsTypeParameter()) {
           if (current_function().is_static()) {
-            const String& name = String::ZoneHandle(I,
+            const String& name = String::ZoneHandle(Z,
                 TypeParameter::Cast(primary_node->primary()).name());
             ReportError(primary_pos,
                         "cannot access type parameter '%s' "
@@ -9740,13 +9746,13 @@
             // Make sure that the instantiator is captured.
             CaptureInstantiator();
           }
-          TypeParameter& type_parameter = TypeParameter::ZoneHandle(I);
+          TypeParameter& type_parameter = TypeParameter::ZoneHandle(Z);
           type_parameter ^= ClassFinalizer::FinalizeType(
               current_class(),
               TypeParameter::Cast(primary_node->primary()),
               ClassFinalizer::kCanonicalize);
           ASSERT(!type_parameter.IsMalformed());
-          left = new(I) TypeNode(primary->token_pos(), type_parameter);
+          left = new(Z) TypeNode(primary->token_pos(), type_parameter);
         } else {
           // Super field access handled in ParseSuperFieldAccess(),
           // super calls handled in ParseSuperCall().
@@ -9768,7 +9774,7 @@
         }
       } else {
         // Field access.
-        Class& cls = Class::Handle(I);
+        Class& cls = Class::Handle(Z);
         if (left->IsPrimaryNode()) {
           PrimaryNode* primary_node = left->AsPrimaryNode();
           if (primary_node->primary().IsClass()) {
@@ -9805,17 +9811,17 @@
           array = LoadClosure(primary_node);
         } else if (primary_node->primary().IsClass()) {
           const Class& type_class = Class::Cast(primary_node->primary());
-          AbstractType& type = Type::ZoneHandle(I,
-              Type::New(type_class, TypeArguments::Handle(I),
+          AbstractType& type = Type::ZoneHandle(Z,
+              Type::New(type_class, TypeArguments::Handle(Z),
                         primary_pos, Heap::kOld));
           type ^= ClassFinalizer::FinalizeType(
               current_class(), type, ClassFinalizer::kCanonicalize);
           // Type may be malbounded, but not malformed.
           ASSERT(!type.IsMalformed());
-          array = new(I) TypeNode(primary_pos, type);
+          array = new(Z) TypeNode(primary_pos, type);
         } else if (primary_node->primary().IsTypeParameter()) {
           if (current_function().is_static()) {
-            const String& name = String::ZoneHandle(I,
+            const String& name = String::ZoneHandle(Z,
                 TypeParameter::Cast(primary_node->primary()).name());
             ReportError(primary_pos,
                         "cannot access type parameter '%s' "
@@ -9826,29 +9832,29 @@
             // Make sure that the instantiator is captured.
             CaptureInstantiator();
           }
-          TypeParameter& type_parameter = TypeParameter::ZoneHandle(I);
+          TypeParameter& type_parameter = TypeParameter::ZoneHandle(Z);
           type_parameter ^= ClassFinalizer::FinalizeType(
               current_class(),
               TypeParameter::Cast(primary_node->primary()),
               ClassFinalizer::kCanonicalize);
           ASSERT(!type_parameter.IsMalformed());
-          array = new(I) TypeNode(primary_pos, type_parameter);
+          array = new(Z) TypeNode(primary_pos, type_parameter);
         } else {
           UNREACHABLE();  // Internal parser error.
         }
       }
-      selector =  new(I) LoadIndexedNode(
-          bracket_pos, array, index, Class::ZoneHandle(I));
+      selector =  new(Z) LoadIndexedNode(
+          bracket_pos, array, index, Class::ZoneHandle(Z));
     } else if (CurrentToken() == Token::kLPAREN) {
       if (left->IsPrimaryNode()) {
         PrimaryNode* primary_node = left->AsPrimaryNode();
         const intptr_t primary_pos = primary_node->token_pos();
         if (primary_node->primary().IsFunction()) {
           const Function& func = Function::Cast(primary_node->primary());
-          const String& func_name = String::ZoneHandle(I, func.name());
+          const String& func_name = String::ZoneHandle(Z, func.name());
           if (func.is_static()) {
             // Parse static function call.
-            Class& cls = Class::Handle(I, func.Owner());
+            Class& cls = Class::Handle(Z, func.Owner());
             selector = ParseStaticCall(cls, func_name, primary_pos);
           } else {
             // Dynamic function call on implicit "this" parameter.
@@ -9880,7 +9886,7 @@
             selector = ParseInstanceCall(LoadReceiver(primary_pos), name);
           }
         } else if (primary_node->primary().IsTypeParameter()) {
-          const String& name = String::ZoneHandle(I,
+          const String& name = String::ZoneHandle(Z,
               TypeParameter::Cast(primary_node->primary()).name());
           if (current_function().is_static()) {
             // Treat as this.T(), because T is in scope.
@@ -9894,13 +9900,13 @@
           }
         } else if (primary_node->primary().IsClass()) {
           const Class& type_class = Class::Cast(primary_node->primary());
-          AbstractType& type = Type::ZoneHandle(I, Type::New(
-              type_class, TypeArguments::Handle(I), primary_pos));
+          AbstractType& type = Type::ZoneHandle(Z, Type::New(
+              type_class, TypeArguments::Handle(Z), primary_pos));
           type ^= ClassFinalizer::FinalizeType(
               current_class(), type, ClassFinalizer::kCanonicalize);
           // Type may be malbounded, but not malformed.
           ASSERT(!type.IsMalformed());
-          selector = new(I) TypeNode(primary_pos, type);
+          selector = new(Z) TypeNode(primary_pos, type);
         } else {
           UNREACHABLE();  // Internal parser error.
         }
@@ -9920,16 +9926,16 @@
           left = LoadClosure(primary_node);
         } else if (primary_node->primary().IsClass()) {
           const Class& type_class = Class::Cast(primary_node->primary());
-          AbstractType& type = Type::ZoneHandle(I, Type::New(
-              type_class, TypeArguments::Handle(I), primary_pos));
+          AbstractType& type = Type::ZoneHandle(Z, Type::New(
+              type_class, TypeArguments::Handle(Z), primary_pos));
           type = ClassFinalizer::FinalizeType(
               current_class(), type, ClassFinalizer::kCanonicalize);
           // Type may be malbounded, but not malformed.
           ASSERT(!type.IsMalformed());
-          left = new(I) TypeNode(primary_pos, type);
+          left = new(Z) TypeNode(primary_pos, type);
         } else if (primary_node->primary().IsTypeParameter()) {
           if (current_function().is_static()) {
-            const String& name = String::ZoneHandle(I,
+            const String& name = String::ZoneHandle(Z,
                 TypeParameter::Cast(primary_node->primary()).name());
             ReportError(primary_pos,
                         "cannot access type parameter '%s' "
@@ -9940,13 +9946,13 @@
             // Make sure that the instantiator is captured.
             CaptureInstantiator();
           }
-          TypeParameter& type_parameter = TypeParameter::ZoneHandle(I);
+          TypeParameter& type_parameter = TypeParameter::ZoneHandle(Z);
           type_parameter ^= ClassFinalizer::FinalizeType(
               current_class(),
               TypeParameter::Cast(primary_node->primary()),
               ClassFinalizer::kCanonicalize);
           ASSERT(!type_parameter.IsMalformed());
-          left = new(I) TypeNode(primary_pos, type_parameter);
+          left = new(Z) TypeNode(primary_pos, type_parameter);
         } else if (primary_node->IsSuper()) {
           // Return "super" to handle unary super operator calls,
           // or to report illegal use of "super" otherwise.
@@ -9983,17 +9989,17 @@
     LocalVariable* temp = let_expr->AddInitializer(expr);
     Token::Kind binary_op =
         (incr_op == Token::kINCR) ? Token::kADD : Token::kSUB;
-    BinaryOpNode* add = new(I) BinaryOpNode(
+    BinaryOpNode* add = new(Z) BinaryOpNode(
         expr_pos,
         binary_op,
-        new(I) LoadLocalNode(expr_pos, temp),
-        new(I) LiteralNode(expr_pos, Smi::ZoneHandle(I, Smi::New(1))));
+        new(Z) LoadLocalNode(expr_pos, temp),
+        new(Z) LiteralNode(expr_pos, Smi::ZoneHandle(Z, Smi::New(1))));
     AstNode* store = CreateAssignmentNode(expr, add, expr_ident, expr_pos);
     ASSERT(store != NULL);
     // The result is a pair of the (side effects of the) store followed by
     // the (value of the) initial value temp variable load.
     let_expr->AddNode(store);
-    let_expr->AddNode(new(I) LoadLocalNode(expr_pos, temp));
+    let_expr->AddNode(new(Z) LoadLocalNode(expr_pos, temp));
     return let_expr;
   }
   return expr;
@@ -10018,14 +10024,14 @@
   // Resolve class.
   if (!type->HasResolvedTypeClass()) {
     const UnresolvedClass& unresolved_class =
-        UnresolvedClass::Handle(I, type->unresolved_class());
+        UnresolvedClass::Handle(Z, type->unresolved_class());
     const String& unresolved_class_name =
-        String::Handle(I, unresolved_class.ident());
-    Class& resolved_type_class = Class::Handle(I);
+        String::Handle(Z, unresolved_class.ident());
+    Class& resolved_type_class = Class::Handle(Z);
     if (unresolved_class.library_prefix() == LibraryPrefix::null()) {
       if (!scope_class.IsNull()) {
         // First check if the type is a type parameter of the given scope class.
-        const TypeParameter& type_parameter = TypeParameter::Handle(I,
+        const TypeParameter& type_parameter = TypeParameter::Handle(Z,
             scope_class.LookupTypeParameter(unresolved_class_name));
         if (!type_parameter.IsNull()) {
           // A type parameter is considered to be a malformed type when
@@ -10033,23 +10039,23 @@
           if (ParsingStaticMember()) {
             ASSERT(scope_class.raw() == current_class().raw());
             *type = ClassFinalizer::NewFinalizedMalformedType(
-                Error::Handle(I),  // No previous error.
+                Error::Handle(Z),  // No previous error.
                 script_,
                 type->token_pos(),
                 "type parameter '%s' cannot be referenced "
                 "from static member",
-                String::Handle(I, type_parameter.name()).ToCString());
+                String::Handle(Z, type_parameter.name()).ToCString());
             return;
           }
           // A type parameter cannot be parameterized, so make the type
           // malformed if type arguments have previously been parsed.
-          if (!TypeArguments::Handle(I, type->arguments()).IsNull()) {
+          if (!TypeArguments::Handle(Z, type->arguments()).IsNull()) {
             *type = ClassFinalizer::NewFinalizedMalformedType(
-                Error::Handle(I),  // No previous error.
+                Error::Handle(Z),  // No previous error.
                 script_,
                 type_parameter.token_pos(),
                 "type parameter '%s' cannot be parameterized",
-                String::Handle(I, type_parameter.name()).ToCString());
+                String::Handle(Z, type_parameter.name()).ToCString());
             return;
           }
           *type = type_parameter.raw();
@@ -10065,7 +10071,7 @@
       }
     } else {
       LibraryPrefix& lib_prefix =
-          LibraryPrefix::Handle(I, unresolved_class.library_prefix());
+          LibraryPrefix::Handle(Z, unresolved_class.library_prefix());
       // Resolve class name in the scope of the library prefix.
       resolved_type_class =
           ResolveClassInPrefixScope(lib_prefix, unresolved_class_name);
@@ -10077,21 +10083,21 @@
       parameterized_type.set_type_class(resolved_type_class);
     } else if (finalization >= ClassFinalizer::kCanonicalize) {
       ClassFinalizer::FinalizeMalformedType(
-          Error::Handle(I),  // No previous error.
+          Error::Handle(Z),  // No previous error.
           script_,
           parameterized_type,
           "type '%s' is not loaded",
-          String::Handle(I, parameterized_type.UserVisibleName()).ToCString());
+          String::Handle(Z, parameterized_type.UserVisibleName()).ToCString());
       return;
     }
   }
   // Resolve type arguments, if any.
-  const TypeArguments& arguments = TypeArguments::Handle(I, type->arguments());
-      TypeArguments::Handle(I, type->arguments());
+  const TypeArguments& arguments = TypeArguments::Handle(Z, type->arguments());
+      TypeArguments::Handle(Z, type->arguments());
   if (!arguments.IsNull()) {
     const intptr_t num_arguments = arguments.Length();
     for (intptr_t i = 0; i < num_arguments; i++) {
-      AbstractType& type_argument = AbstractType::Handle(I,
+      AbstractType& type_argument = AbstractType::Handle(Z,
                                                          arguments.TypeAt(i));
       ResolveTypeFromClass(scope_class, finalization, &type_argument);
       arguments.SetTypeAt(i, type_argument);
@@ -10136,11 +10142,11 @@
 const AbstractType* Parser::ReceiverType(const Class& cls) {
   ASSERT(!cls.IsNull());
   const TypeArguments& type_arguments = TypeArguments::Handle(
-      I,
+      Z,
       (cls.NumTypeParameters() > 0) ?
           cls.type_parameters() : TypeArguments::null());
   AbstractType& type = AbstractType::ZoneHandle(
-      I, Type::New(cls, type_arguments, cls.token_pos()));
+      Z, Type::New(cls, type_arguments, cls.token_pos()));
   if (cls.is_type_finalized()) {
     type ^= ClassFinalizer::FinalizeType(
         cls, type, ClassFinalizer::kCanonicalizeWellFormed);
@@ -10167,7 +10173,7 @@
   }
   const char* error_str = NULL;
   Instance& result =
-      Instance::Handle(I, instance.CheckAndCanonicalize(&error_str));
+      Instance::Handle(Z, instance.CheckAndCanonicalize(&error_str));
   if (result.IsNull()) {
     ReportError(token_pos, "Invalid const object %s", error_str);
   }
@@ -10181,19 +10187,19 @@
 AstNode* Parser::RunStaticFieldInitializer(const Field& field,
                                            intptr_t field_ref_pos) {
   ASSERT(field.is_static());
-  const Class& field_owner = Class::ZoneHandle(I, field.owner());
-  const String& field_name = String::ZoneHandle(I, field.name());
-  const String& getter_name = String::Handle(I, Field::GetterName(field_name));
-  const Function& getter = Function::Handle(I,
+  const Class& field_owner = Class::ZoneHandle(Z, field.owner());
+  const String& field_name = String::ZoneHandle(Z, field.name());
+  const String& getter_name = String::Handle(Z, Field::GetterName(field_name));
+  const Function& getter = Function::Handle(Z,
       field_owner.LookupStaticFunction(getter_name));
-  const Instance& value = Instance::Handle(I, field.value());
+  const Instance& value = Instance::Handle(Z, field.value());
   if (value.raw() == Object::transition_sentinel().raw()) {
     if (field.is_const()) {
       ReportError("circular dependency while initializing static field '%s'",
                   field_name.ToCString());
     } else {
       // The implicit static getter will throw the exception if necessary.
-      return new(I) StaticGetterNode(
+      return new(Z) StaticGetterNode(
           field_ref_pos, NULL, false, field_owner, field_name);
     }
   } else if (value.raw() == Object::sentinel().raw()) {
@@ -10203,14 +10209,14 @@
     if (field.is_const()) {
       field.set_value(Object::transition_sentinel());
       const int kNumArguments = 0;  // no arguments.
-      const Function& func = Function::Handle(I,
+      const Function& func = Function::Handle(Z,
           Resolver::ResolveStatic(field_owner,
                                   getter_name,
                                   kNumArguments,
                                   Object::empty_array()));
       ASSERT(!func.IsNull());
       ASSERT(func.kind() == RawFunction::kImplicitStaticFinalGetter);
-      Object& const_value = Object::Handle(I);
+      Object& const_value = Object::Handle(Z);
       {
         PAUSETIMERSCOPE(I, time_compilation);
         const_value = DartEntry::InvokeFunction(func, Object::empty_array());
@@ -10225,7 +10231,7 @@
           field.set_value(Object::null_instance());
           // It is a compile-time error if evaluation of a compile-time constant
           // would raise an exception.
-          const String& field_name = String::Handle(I, field.name());
+          const String& field_name = String::Handle(Z, field.name());
           ReportErrors(error,
                        script_, field_ref_pos,
                        "error initializing const field '%s'",
@@ -10236,13 +10242,13 @@
         UNREACHABLE();
       }
       ASSERT(const_value.IsNull() || const_value.IsInstance());
-      Instance& instance = Instance::Handle(I);
+      Instance& instance = Instance::Handle(Z);
       instance ^= const_value.raw();
       instance = TryCanonicalize(instance, field_ref_pos);
       field.set_value(instance);
       return NULL;   // Constant
     } else {
-      return new(I) StaticGetterNode(
+      return new(Z) StaticGetterNode(
           field_ref_pos, NULL, false, field_owner, field_name);
     }
   }
@@ -10251,7 +10257,7 @@
     return NULL;
   }
   ASSERT(getter.kind() == RawFunction::kImplicitGetter);
-  return new(I) StaticGetterNode(
+  return new(Z) StaticGetterNode(
       field_ref_pos, NULL, false, field_owner, field_name);
 }
 
@@ -10265,8 +10271,8 @@
   // Constructors have 2 extra arguments: rcvr and construction phase.
   const int kNumExtraArgs = constructor.IsFactory() ? 1 : 2;
   const int num_arguments = arguments->length() + kNumExtraArgs;
-  const Array& arg_values = Array::Handle(I, Array::New(num_arguments));
-  Instance& instance = Instance::Handle(I);
+  const Array& arg_values = Array::Handle(Z, Array::New(num_arguments));
+  Instance& instance = Instance::Handle(Z);
   if (!constructor.IsFactory()) {
     instance = Instance::New(type_class, Heap::kOld);
     if (!type_arguments.IsNull()) {
@@ -10274,10 +10280,10 @@
         ReportError("type must be constant in const constructor");
       }
       instance.SetTypeArguments(
-          TypeArguments::Handle(I, type_arguments.Canonicalize()));
+          TypeArguments::Handle(Z, type_arguments.Canonicalize()));
     }
     arg_values.SetAt(0, instance);
-    arg_values.SetAt(1, Smi::Handle(I, Smi::New(Function::kCtorPhaseAll)));
+    arg_values.SetAt(1, Smi::Handle(Z, Smi::New(Function::kCtorPhaseAll)));
   } else {
     // Prepend type_arguments to list of arguments to factory.
     ASSERT(type_arguments.IsZoneHandle());
@@ -10289,9 +10295,9 @@
     ASSERT(arg->IsLiteralNode());
     arg_values.SetAt((i + kNumExtraArgs), arg->AsLiteralNode()->literal());
   }
-  const Array& args_descriptor = Array::Handle(I,
+  const Array& args_descriptor = Array::Handle(Z,
       ArgumentsDescriptor::New(num_arguments, arguments->names()));
-  Object& result = Object::Handle(I);
+  Object& result = Object::Handle(Z);
   {
     PAUSETIMERSCOPE(I, time_compilation);
     result = DartEntry::InvokeFunction(
@@ -10333,7 +10339,7 @@
   }
   if (local != NULL) {
     if (node != NULL) {
-      *node = new(I) LoadLocalNode(ident_pos, local);
+      *node = new(Z) LoadLocalNode(ident_pos, local);
     }
     return true;
   }
@@ -10341,14 +10347,14 @@
   // Try to find the identifier in the class scope of the current class.
   // If the current class is the result of a mixin application, we must
   // use the class scope of the class from which the function originates.
-  Class& cls = Class::Handle(I);
+  Class& cls = Class::Handle(Z);
   if (!current_class().IsMixinApplication()) {
     cls = current_class().raw();
   } else {
     cls = parsed_function()->function().origin();
   }
-  Function& func = Function::Handle(I, Function::null());
-  Field& field = Field::Handle(I, Field::null());
+  Function& func = Function::Handle(Z, Function::null());
+  Field& field = Field::Handle(Z, Field::null());
 
   // First check if a field exists.
   field = cls.LookupField(ident);
@@ -10371,8 +10377,8 @@
       func.IsStaticFunction() ||
       func.is_abstract())) {
     if (node != NULL) {
-      *node = new(I) PrimaryNode(
-          ident_pos, Function::ZoneHandle(I, func.raw()));
+      *node = new(Z) PrimaryNode(
+          ident_pos, Function::ZoneHandle(Z, func.raw()));
     }
     return true;
   }
@@ -10384,13 +10390,13 @@
     if (func.IsDynamicFunction() || func.is_abstract()) {
       if (node != NULL) {
         CheckInstanceFieldAccess(ident_pos, ident);
-        ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
+        ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved());
         *node = CallGetter(ident_pos, LoadReceiver(ident_pos), ident);
       }
       return true;
     } else if (func.IsStaticFunction()) {
       if (node != NULL) {
-        ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
+        ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved());
         // The static getter may later be changed into a dynamically
         // resolved instance setter if no static setter can
         // be found.
@@ -10400,10 +10406,10 @@
             (LookupReceiver(current_block_->scope, kTestOnly) != NULL)) {
           receiver = LoadReceiver(ident_pos);
         }
-        *node = new(I) StaticGetterNode(ident_pos,
+        *node = new(Z) StaticGetterNode(ident_pos,
                                         receiver,
                                         false,
-                                        Class::ZoneHandle(I, cls.raw()),
+                                        Class::ZoneHandle(Z, cls.raw()),
                                         ident);
       }
       return true;
@@ -10418,7 +10424,7 @@
         // a setter node. If there is no assignment we will get an error
         // when we try to invoke the getter.
         CheckInstanceFieldAccess(ident_pos, ident);
-        ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
+        ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved());
         *node = CallGetter(ident_pos, LoadReceiver(ident_pos), ident);
       }
       return true;
@@ -10428,11 +10434,11 @@
         // it could be followed by an assignment which will convert it to
         // a setter node. If there is no assignment we will get an error
         // when we try to invoke the getter.
-        *node = new(I) StaticGetterNode(
+        *node = new(Z) StaticGetterNode(
             ident_pos,
             NULL,
             false,
-            Class::ZoneHandle(I, cls.raw()),
+            Class::ZoneHandle(Z, cls.raw()),
             ident);
       }
       return true;
@@ -10449,7 +10455,7 @@
 
 RawClass* Parser::ResolveClassInCurrentLibraryScope(const String& name) {
   HANDLESCOPE(I);
-  const Object& obj = Object::Handle(I, library_.ResolveName(name));
+  const Object& obj = Object::Handle(Z, library_.ResolveName(name));
   if (obj.IsClass()) {
     return Class::Cast(obj).raw();
   }
@@ -10464,10 +10470,10 @@
                                                    const String& ident) {
   TRACE_PARSER("ResolveIdentInCurrentLibraryScope");
   HANDLESCOPE(I);
-  const Object& obj = Object::Handle(I, library_.ResolveName(ident));
+  const Object& obj = Object::Handle(Z, library_.ResolveName(ident));
   if (obj.IsClass()) {
     const Class& cls = Class::Cast(obj);
-    return new(I) PrimaryNode(ident_pos, Class::ZoneHandle(I, cls.raw()));
+    return new(Z) PrimaryNode(ident_pos, Class::ZoneHandle(Z, cls.raw()));
   } else if (obj.IsField()) {
     const Field& field = Field::Cast(obj);
     ASSERT(field.is_static());
@@ -10476,27 +10482,27 @@
     const Function& func = Function::Cast(obj);
     ASSERT(func.is_static());
     if (func.IsGetterFunction() || func.IsSetterFunction()) {
-      return new(I) StaticGetterNode(ident_pos,
+      return new(Z) StaticGetterNode(ident_pos,
                                      /* receiver */ NULL,
                                      /* is_super_getter */ false,
-                                     Class::ZoneHandle(I, func.Owner()),
+                                     Class::ZoneHandle(Z, func.Owner()),
                                      ident);
 
     } else {
-      return new(I) PrimaryNode(ident_pos, Function::ZoneHandle(I, func.raw()));
+      return new(Z) PrimaryNode(ident_pos, Function::ZoneHandle(Z, func.raw()));
     }
   } else {
     ASSERT(obj.IsNull() || obj.IsLibraryPrefix());
   }
   // Lexically unresolved primary identifiers are referenced by their name.
-  return new(I) PrimaryNode(ident_pos, ident);
+  return new(Z) PrimaryNode(ident_pos, ident);
 }
 
 
 RawClass* Parser::ResolveClassInPrefixScope(const LibraryPrefix& prefix,
                                             const String& name) {
   HANDLESCOPE(I);
-  const Object& obj = Object::Handle(I, prefix.LookupObject(name));
+  const Object& obj = Object::Handle(Z, prefix.LookupObject(name));
   if (obj.IsClass()) {
     return Class::Cast(obj).raw();
   }
@@ -10521,7 +10527,7 @@
     // name, so we need to explicitly reject private names here.
     return NULL;
   }
-  Object& obj = Object::Handle(I);
+  Object& obj = Object::Handle(Z);
   if (prefix.is_loaded()) {
     obj = prefix.LookupObject(ident);
   } else {
@@ -10539,7 +10545,7 @@
   } else if (obj.IsClass()) {
     const Class& cls = Class::Cast(obj);
     PrimaryNode* primary =
-        new(I) PrimaryNode(ident_pos, Class::ZoneHandle(I, cls.raw()));
+        new(Z) PrimaryNode(ident_pos, Class::ZoneHandle(Z, cls.raw()));
     primary->set_is_deferred(is_deferred);
     return primary;
   } else if (obj.IsField()) {
@@ -10559,17 +10565,17 @@
     const Function& func = Function::Cast(obj);
     ASSERT(func.is_static());
     if (func.IsGetterFunction() || func.IsSetterFunction()) {
-      StaticGetterNode* getter = new(I) StaticGetterNode(
+      StaticGetterNode* getter = new(Z) StaticGetterNode(
           ident_pos,
           /* receiver */ NULL,
           /* is_super_getter */ false,
-          Class::ZoneHandle(I, func.Owner()),
+          Class::ZoneHandle(Z, func.Owner()),
           ident);
       getter->set_is_deferred(is_deferred);
       return getter;
     } else {
-      PrimaryNode* primary = new(I) PrimaryNode(
-           ident_pos, Function::ZoneHandle(I, func.raw()));
+      PrimaryNode* primary = new(Z) PrimaryNode(
+           ident_pos, Function::ZoneHandle(Z, func.raw()));
       primary->set_is_deferred(is_deferred);
       return primary;
     }
@@ -10596,7 +10602,7 @@
   if (resolved == NULL) {
     // Check whether the identifier is a type parameter.
     if (!current_class().IsNull()) {
-      TypeParameter& type_parameter = TypeParameter::ZoneHandle(I,
+      TypeParameter& type_parameter = TypeParameter::ZoneHandle(Z,
           current_class().LookupTypeParameter(ident));
       if (!type_parameter.IsNull()) {
         if (current_block_->scope->function_level() > 0) {
@@ -10606,7 +10612,7 @@
         type_parameter ^= ClassFinalizer::FinalizeType(
             current_class(), type_parameter, ClassFinalizer::kCanonicalize);
         ASSERT(!type_parameter.IsMalformed());
-        return new(I) TypeNode(ident_pos, type_parameter);
+        return new(Z) TypeNode(ident_pos, type_parameter);
       }
     }
     // Not found in the local scope, and the name is not a type parameter.
@@ -10644,13 +10650,13 @@
       }
     } else if (primary->primary().IsClass()) {
       const Class& type_class = Class::Cast(primary->primary());
-      AbstractType& type = Type::ZoneHandle(I,
-          Type::New(type_class, TypeArguments::Handle(I), primary_pos));
+      AbstractType& type = Type::ZoneHandle(Z,
+          Type::New(type_class, TypeArguments::Handle(Z), primary_pos));
       type ^= ClassFinalizer::FinalizeType(
           current_class(), type, ClassFinalizer::kCanonicalize);
       // Type may be malbounded, but not malformed.
       ASSERT(!type.IsMalformed());
-      resolved = new(I) TypeNode(primary_pos, type);
+      resolved = new(Z) TypeNode(primary_pos, type);
     }
   }
   return resolved;
@@ -10666,8 +10672,8 @@
   TRACE_PARSER("ParseType");
   CheckToken(Token::kIDENT, "type name expected");
   intptr_t ident_pos = TokenPos();
-  LibraryPrefix& prefix = LibraryPrefix::Handle(I);
-  String& type_name = String::Handle(I);;
+  LibraryPrefix& prefix = LibraryPrefix::Handle(Z);
+  String& type_name = String::Handle(Z);;
 
   if (finalization == ClassFinalizer::kIgnore) {
     if (!is_top_level_ && (current_block_ != NULL)) {
@@ -10697,14 +10703,14 @@
       }
       ConsumeToken();  // Period token.
       ASSERT(IsIdentifier());
-      String& qualified_name = String::Handle(I, type_name.raw());
+      String& qualified_name = String::Handle(Z, type_name.raw());
       qualified_name = String::Concat(qualified_name, Symbols::Dot());
       qualified_name = String::Concat(qualified_name, *CurrentLiteral());
       ConsumeToken();
       // The type is malformed. Skip over its type arguments.
       ParseTypeArguments(ClassFinalizer::kIgnore);
       return ClassFinalizer::NewFinalizedMalformedType(
-          Error::Handle(I),  // No previous error.
+          Error::Handle(Z),  // No previous error.
           script_,
           ident_pos,
           "qualified name '%s' does not refer to a type",
@@ -10719,7 +10725,7 @@
       // The type is malformed. Skip over its type arguments.
       ParseTypeArguments(ClassFinalizer::kIgnore);
       return ClassFinalizer::NewFinalizedMalformedType(
-          Error::Handle(I),  // No previous error.
+          Error::Handle(Z),  // No previous error.
           script_,
           ident_pos,
           "using '%s' in this context is invalid",
@@ -10728,26 +10734,26 @@
     if (!prefix.IsNull() && prefix.is_deferred_load() && !allow_deferred_type) {
       ParseTypeArguments(ClassFinalizer::kIgnore);
       return ClassFinalizer::NewFinalizedMalformedType(
-          Error::Handle(I),  // No previous error.
+          Error::Handle(Z),  // No previous error.
           script_,
           ident_pos,
           "using deferred type '%s.%s' is invalid",
-          String::Handle(I, prefix.name()).ToCString(),
+          String::Handle(Z, prefix.name()).ToCString(),
           type_name.ToCString());
     }
   }
-  Object& type_class = Object::Handle(I);
+  Object& type_class = Object::Handle(Z);
   // Leave type_class as null if type finalization mode is kIgnore.
   if (finalization != ClassFinalizer::kIgnore) {
     type_class = UnresolvedClass::New(prefix, type_name, ident_pos);
   }
   TypeArguments& type_arguments = TypeArguments::Handle(
-      I, ParseTypeArguments(finalization));
+      Z, ParseTypeArguments(finalization));
   if (finalization == ClassFinalizer::kIgnore) {
     return Type::DynamicType();
   }
   AbstractType& type = AbstractType::Handle(
-      I, Type::New(type_class, type_arguments, ident_pos));
+      Z, Type::New(type_class, type_arguments, ident_pos));
   if (finalization >= ClassFinalizer::kResolveTypeParameters) {
     ResolveTypeFromClass(current_class(), finalization, &type);
     if (finalization >= ClassFinalizer::kCanonicalize) {
@@ -10762,7 +10768,7 @@
     intptr_t pos, const Function& constructor,
     const TypeArguments& type_arguments) {
   if (!type_arguments.IsNull()) {
-    const Class& constructor_class = Class::Handle(I, constructor.Owner());
+    const Class& constructor_class = Class::Handle(Z, constructor.Owner());
     ASSERT(!constructor_class.IsNull());
     ASSERT(constructor_class.is_finalized());
     ASSERT(type_arguments.IsCanonical());
@@ -10789,9 +10795,9 @@
   bool is_empty_literal = CurrentToken() == Token::kINDEX;
   ConsumeToken();
 
-  AbstractType& element_type = Type::ZoneHandle(I, Type::DynamicType());
+  AbstractType& element_type = Type::ZoneHandle(Z, Type::DynamicType());
   TypeArguments& list_type_arguments =
-      TypeArguments::ZoneHandle(I, type_arguments.raw());
+      TypeArguments::ZoneHandle(Z, type_arguments.raw());
   // If no type argument vector is provided, leave it as null, which is
   // equivalent to using dynamic as the type argument for the element type.
   if (!list_type_arguments.IsNull()) {
@@ -10819,8 +10825,8 @@
     }
   }
   ASSERT(list_type_arguments.IsNull() || (list_type_arguments.Length() == 1));
-  const Class& array_class = Class::Handle(I, I->object_store()->array_class());
-  Type& type = Type::ZoneHandle(I,
+  const Class& array_class = Class::Handle(Z, I->object_store()->array_class());
+  Type& type = Type::ZoneHandle(Z,
       Type::New(array_class, list_type_arguments, type_pos));
   type ^= ClassFinalizer::FinalizeType(
       current_class(), type, ClassFinalizer::kCanonicalize);
@@ -10835,7 +10841,7 @@
       if (FLAG_enable_type_checks &&
           !is_const &&
           !element_type.IsDynamicType()) {
-        element = new(I) AssignableNode(element_pos,
+        element = new(Z) AssignableNode(element_pos,
                                         element,
                                         element_type,
                                         Symbols::ListLiteralElement());
@@ -10854,10 +10860,10 @@
   if (is_const) {
     // Allocate and initialize the const list at compile time.
     Array& const_list =
-        Array::ZoneHandle(I, Array::New(element_list.length(), Heap::kOld));
+        Array::ZoneHandle(Z, Array::New(element_list.length(), Heap::kOld));
     const_list.SetTypeArguments(
-        TypeArguments::Handle(I, list_type_arguments.Canonicalize()));
-    Error& malformed_error = Error::Handle(I);
+        TypeArguments::Handle(Z, list_type_arguments.Canonicalize()));
+    Error& malformed_error = Error::Handle(Z);
     for (int i = 0; i < element_list.length(); i++) {
       AstNode* elem = element_list[i];
       // Arguments have been evaluated to a literal value already.
@@ -10868,7 +10874,7 @@
           (!elem->AsLiteralNode()->literal().IsNull() &&
            !elem->AsLiteralNode()->literal().IsInstanceOf(
                element_type,
-               TypeArguments::Handle(I),
+               TypeArguments::Handle(Z),
                &malformed_error))) {
         // If the failure is due to a malformed type error, display it instead.
         if (!malformed_error.IsNull()) {
@@ -10878,7 +10884,7 @@
                       "list literal element at index %d must be "
                       "a constant of type '%s'",
                       i,
-                      String::Handle(I,
+                      String::Handle(Z,
                           element_type.UserVisibleName()).ToCString());
         }
       }
@@ -10886,13 +10892,13 @@
     }
     const_list.MakeImmutable();
     const_list ^= TryCanonicalize(const_list, literal_pos);
-    return new(I) LiteralNode(literal_pos, const_list);
+    return new(Z) LiteralNode(literal_pos, const_list);
   } else {
     // Factory call at runtime.
     const Class& factory_class =
-        Class::Handle(I, Library::LookupCoreClass(Symbols::List()));
+        Class::Handle(Z, Library::LookupCoreClass(Symbols::List()));
     ASSERT(!factory_class.IsNull());
-    const Function& factory_method = Function::ZoneHandle(I,
+    const Function& factory_method = Function::ZoneHandle(Z,
         factory_class.LookupFactory(
             Library::PrivateCoreLibName(Symbols::ListLiteralFactory())));
     ASSERT(!factory_method.IsNull());
@@ -10903,12 +10909,12 @@
       CaptureInstantiator();
     }
     TypeArguments& factory_type_args =
-        TypeArguments::ZoneHandle(I, list_type_arguments.raw());
+        TypeArguments::ZoneHandle(Z, list_type_arguments.raw());
     // If the factory class extends other parameterized classes, adjust the
     // type argument vector.
     if (!factory_type_args.IsNull() && (factory_class.NumTypeArguments() > 1)) {
       ASSERT(factory_type_args.Length() == 1);
-      Type& factory_type = Type::Handle(I, Type::New(
+      Type& factory_type = Type::Handle(Z, Type::New(
           factory_class, factory_type_args, type_pos, Heap::kNew));
       factory_type ^= ClassFinalizer::FinalizeType(
           current_class(), factory_type, ClassFinalizer::kFinalize);
@@ -10916,14 +10922,14 @@
       ASSERT(factory_type_args.Length() == factory_class.NumTypeArguments());
     }
     factory_type_args = factory_type_args.Canonicalize();
-    ArgumentListNode* factory_param = new(I) ArgumentListNode(
+    ArgumentListNode* factory_param = new(Z) ArgumentListNode(
         literal_pos);
     if (element_list.length() == 0) {
       LiteralNode* empty_array_literal =
-          new(I) LiteralNode(TokenPos(), Object::empty_array());
+          new(Z) LiteralNode(TokenPos(), Object::empty_array());
       factory_param->Add(empty_array_literal);
     } else {
-      ArrayNode* list = new(I) ArrayNode(TokenPos(), type, element_list);
+      ArrayNode* list = new(Z) ArrayNode(TokenPos(), type, element_list);
       factory_param->Add(list);
     }
     return CreateConstructorCallNode(literal_pos,
@@ -10942,7 +10948,7 @@
   if (!type_arguments.IsNull() && !type_arguments.IsInstantiated()) {
     EnsureExpressionTemp();
   }
-  return new(I) ConstructorCallNode(
+  return new(Z) ConstructorCallNode(
       token_pos, type_arguments, constructor, arguments);
 }
 
@@ -10981,10 +10987,10 @@
   const intptr_t literal_pos = TokenPos();
   ConsumeToken();
 
-  AbstractType& key_type = Type::ZoneHandle(I, Type::DynamicType());
-  AbstractType& value_type = Type::ZoneHandle(I, Type::DynamicType());
+  AbstractType& key_type = Type::ZoneHandle(Z, Type::DynamicType());
+  AbstractType& value_type = Type::ZoneHandle(Z, Type::DynamicType());
   TypeArguments& map_type_arguments =
-      TypeArguments::ZoneHandle(I, type_arguments.raw());
+      TypeArguments::ZoneHandle(Z, type_arguments.raw());
   // If no type argument vector is provided, leave it as null, which is
   // equivalent to using dynamic as the type argument for the both key and value
   // types.
@@ -11028,7 +11034,7 @@
     if (FLAG_enable_type_checks &&
         !is_const &&
         !key_type.IsDynamicType()) {
-      key = new(I) AssignableNode(
+      key = new(Z) AssignableNode(
           key_pos, key, key_type, Symbols::ListLiteralElement());
     }
     if (is_const) {
@@ -11051,7 +11057,7 @@
     if (FLAG_enable_type_checks &&
         !is_const &&
         !value_type.IsDynamicType()) {
-      value = new(I) AssignableNode(
+      value = new(Z) AssignableNode(
           value_pos, value, value_type, Symbols::ListLiteralElement());
     }
     AddKeyValuePair(&kv_pairs_list, is_const, key, value);
@@ -11072,9 +11078,9 @@
 
     // First, create the canonicalized key-value pair array.
     Array& key_value_array =
-        Array::ZoneHandle(I, Array::New(kv_pairs_list.length(), Heap::kOld));
-    AbstractType& arg_type = Type::Handle(I);
-    Error& malformed_error = Error::Handle(I);
+        Array::ZoneHandle(Z, Array::New(kv_pairs_list.length(), Heap::kOld));
+    AbstractType& arg_type = Type::Handle(Z);
+    Error& malformed_error = Error::Handle(Z);
     for (int i = 0; i < kv_pairs_list.length(); i++) {
       AstNode* arg = kv_pairs_list[i];
       // Arguments have been evaluated to a literal value already.
@@ -11103,7 +11109,7 @@
                         "a constant of type '%s'",
                         ((i % 2) == 0) ? "key" : "value",
                         i >> 1,
-                        String::Handle(I,
+                        String::Handle(Z,
                                        arg_type.UserVisibleName()).ToCString());
           }
         }
@@ -11114,19 +11120,19 @@
     key_value_array ^= TryCanonicalize(key_value_array, TokenPos());
 
     // Construct the map object.
-    const Class& immutable_map_class = Class::Handle(I,
+    const Class& immutable_map_class = Class::Handle(Z,
         Library::LookupCoreClass(Symbols::ImmutableMap()));
     ASSERT(!immutable_map_class.IsNull());
     // If the immutable map class extends other parameterized classes, we need
     // to adjust the type argument vector. This is currently not the case.
     ASSERT(immutable_map_class.NumTypeArguments() == 2);
-    ArgumentListNode* constr_args = new(I) ArgumentListNode(TokenPos());
-    constr_args->Add(new(I) LiteralNode(literal_pos, key_value_array));
+    ArgumentListNode* constr_args = new(Z) ArgumentListNode(TokenPos());
+    constr_args->Add(new(Z) LiteralNode(literal_pos, key_value_array));
     const Function& map_constr =
-        Function::ZoneHandle(I, immutable_map_class.LookupConstructor(
+        Function::ZoneHandle(Z, immutable_map_class.LookupConstructor(
             Library::PrivateCoreLibName(Symbols::ImmutableMapConstructor())));
     ASSERT(!map_constr.IsNull());
-    const Object& constructor_result = Object::Handle(I,
+    const Object& constructor_result = Object::Handle(Z,
         EvaluateConstConstructorCall(immutable_map_class,
                                      map_type_arguments,
                                      map_constr,
@@ -11137,15 +11143,15 @@
                    "error executing const Map constructor");
     } else {
       const Instance& const_instance = Instance::Cast(constructor_result);
-      return new(I) LiteralNode(
-          literal_pos, Instance::ZoneHandle(I, const_instance.raw()));
+      return new(Z) LiteralNode(
+          literal_pos, Instance::ZoneHandle(Z, const_instance.raw()));
     }
   } else {
     // Factory call at runtime.
     const Class& factory_class =
-        Class::Handle(I, Library::LookupCoreClass(Symbols::Map()));
+        Class::Handle(Z, Library::LookupCoreClass(Symbols::Map()));
     ASSERT(!factory_class.IsNull());
-    const Function& factory_method = Function::ZoneHandle(I,
+    const Function& factory_method = Function::ZoneHandle(Z,
         factory_class.LookupFactory(
             Library::PrivateCoreLibName(Symbols::MapLiteralFactory())));
     ASSERT(!factory_method.IsNull());
@@ -11156,12 +11162,12 @@
       CaptureInstantiator();
     }
     TypeArguments& factory_type_args =
-        TypeArguments::ZoneHandle(I, map_type_arguments.raw());
+        TypeArguments::ZoneHandle(Z, map_type_arguments.raw());
     // If the factory class extends other parameterized classes, adjust the
     // type argument vector.
     if (!factory_type_args.IsNull() && (factory_class.NumTypeArguments() > 2)) {
       ASSERT(factory_type_args.Length() == 2);
-      Type& factory_type = Type::Handle(I, Type::New(
+      Type& factory_type = Type::Handle(Z, Type::New(
           factory_class, factory_type_args, type_pos, Heap::kNew));
       factory_type ^= ClassFinalizer::FinalizeType(
           current_class(), factory_type, ClassFinalizer::kFinalize);
@@ -11169,12 +11175,12 @@
       ASSERT(factory_type_args.Length() == factory_class.NumTypeArguments());
     }
     factory_type_args = factory_type_args.Canonicalize();
-    ArgumentListNode* factory_param = new(I) ArgumentListNode(literal_pos);
+    ArgumentListNode* factory_param = new(Z) ArgumentListNode(literal_pos);
     // The kv_pair array is temporary and of element type dynamic. It is passed
     // to the factory to initialize a properly typed map.
-    ArrayNode* kv_pairs = new(I) ArrayNode(
+    ArrayNode* kv_pairs = new(Z) ArrayNode(
         TokenPos(),
-        Type::ZoneHandle(I, Type::ArrayType()),
+        Type::ZoneHandle(Z, Type::ArrayType()),
         kv_pairs_list);
     factory_param->Add(kv_pairs);
     return CreateConstructorCallNode(literal_pos,
@@ -11195,7 +11201,7 @@
     ConsumeToken();
   }
   const intptr_t type_pos = TokenPos();
-  TypeArguments& type_arguments = TypeArguments::Handle(I,
+  TypeArguments& type_arguments = TypeArguments::Handle(Z,
       ParseTypeArguments(ClassFinalizer::kCanonicalize));
   // Malformed type arguments are mapped to dynamic, so we will not encounter
   // them here.
@@ -11218,7 +11224,7 @@
   ASSERT(CurrentToken() == Token::kHASH);
   ConsumeToken();
   intptr_t symbol_pos = TokenPos();
-  String& symbol = String::Handle(I);
+  String& symbol = String::Handle(Z);
   if (IsIdentifier()) {
     symbol = CurrentLiteral()->raw();
     ConsumeToken();
@@ -11238,15 +11244,15 @@
   // Call Symbol class constructor to create a symbol instance.
   const Class& symbol_class = Class::Handle(I->object_store()->symbol_class());
   ASSERT(!symbol_class.IsNull());
-  ArgumentListNode* constr_args = new(I) ArgumentListNode(symbol_pos);
-  constr_args->Add(new(I) LiteralNode(
-      symbol_pos, String::ZoneHandle(I, Symbols::New(symbol))));
-  const Function& constr = Function::ZoneHandle(I,
+  ArgumentListNode* constr_args = new(Z) ArgumentListNode(symbol_pos);
+  constr_args->Add(new(Z) LiteralNode(
+      symbol_pos, String::ZoneHandle(Z, Symbols::New(symbol))));
+  const Function& constr = Function::ZoneHandle(Z,
       symbol_class.LookupConstructor(Symbols::SymbolCtor()));
   ASSERT(!constr.IsNull());
-  const Object& result = Object::Handle(I,
+  const Object& result = Object::Handle(Z,
       EvaluateConstConstructorCall(symbol_class,
-                                   TypeArguments::Handle(I),
+                                   TypeArguments::Handle(Z),
                                    constr,
                                    constr_args));
   if (result.IsUnhandledException()) {
@@ -11255,8 +11261,8 @@
                  "error executing const Symbol constructor");
   }
   const Instance& instance = Instance::Cast(result);
-  return new(I) LiteralNode(symbol_pos,
-                            Instance::ZoneHandle(I, instance.raw()));
+  return new(Z) LiteralNode(symbol_pos,
+                            Instance::ZoneHandle(Z, instance.raw()));
 }
 
 
@@ -11288,7 +11294,7 @@
   const bool allow_deferred_type = !is_const;
   const bool consume_unresolved_prefix = (LookaheadToken(3) == Token::kLT) ||
                                          (LookaheadToken(3) == Token::kPERIOD);
-  AbstractType& type = AbstractType::Handle(I,
+  AbstractType& type = AbstractType::Handle(Z,
       ParseType(ClassFinalizer::kCanonicalizeWellFormed,
                 allow_deferred_type,
                 consume_unresolved_prefix));
@@ -11297,20 +11303,20 @@
   if (!type.IsMalformed() && (type.IsTypeParameter() || type.IsDynamicType())) {
     // Replace the type with a malformed type.
     type = ClassFinalizer::NewFinalizedMalformedType(
-        Error::Handle(I),  // No previous error.
+        Error::Handle(Z),  // No previous error.
         script_,
         type_pos,
         "%s'%s' cannot be instantiated",
         type.IsTypeParameter() ? "type parameter " : "",
         type.IsTypeParameter() ?
-            String::Handle(I, type.UserVisibleName()).ToCString() :
+            String::Handle(Z, type.UserVisibleName()).ToCString() :
             "dynamic");
   }
   // Attempting to instantiate an enum type is a compile-time error.
-  Class& type_class = Class::Handle(I, type.type_class());
+  Class& type_class = Class::Handle(Z, type.type_class());
   if (type_class.is_enum_class()) {
     ReportError(new_pos, "enum type '%s' can not be instantiated",
-                String::Handle(I, type_class.Name()).ToCString());
+                String::Handle(Z, type_class.Name()).ToCString());
   }
 
   // The grammar allows for an optional ('.' identifier)? after the type, which
@@ -11332,16 +11338,16 @@
   // malbounded type or report a compile-time error if the constructor is const.
   if (type.IsMalformedOrMalbounded()) {
     if (is_const) {
-      const Error& error = Error::Handle(I, type.error());
+      const Error& error = Error::Handle(Z, type.error());
       ReportError(error);
     }
     return ThrowTypeError(type_pos, type);
   }
 
   // Resolve the type and optional identifier to a constructor or factory.
-  String& type_class_name = String::Handle(I, type_class.Name());
+  String& type_class_name = String::Handle(Z, type_class.Name());
   TypeArguments& type_arguments =
-      TypeArguments::ZoneHandle(I, type.arguments());
+      TypeArguments::ZoneHandle(Z, type.arguments());
 
   // A constructor has an implicit 'this' parameter (instance to construct)
   // and a factory has an implicit 'this' parameter (type_arguments).
@@ -11350,12 +11356,12 @@
 
   // An additional type check of the result of a redirecting factory may be
   // required.
-  AbstractType& type_bound = AbstractType::ZoneHandle(I);
+  AbstractType& type_bound = AbstractType::ZoneHandle(Z);
 
   // Make sure that an appropriate constructor exists.
   String& constructor_name =
       BuildConstructorName(type_class_name, named_constructor);
-  Function& constructor = Function::ZoneHandle(I,
+  Function& constructor = Function::ZoneHandle(Z,
       type_class.LookupConstructor(constructor_name));
   if (constructor.IsNull()) {
     constructor = type_class.LookupFactory(constructor_name);
@@ -11366,13 +11372,13 @@
       // compile-time error if the constructor is const.
       if (is_const) {
         type = ClassFinalizer::NewFinalizedMalformedType(
-            Error::Handle(I),  // No previous error.
+            Error::Handle(Z),  // No previous error.
             script_,
             call_pos,
             "class '%s' has no constructor or factory named '%s'",
-            String::Handle(I, type_class.Name()).ToCString(),
+            String::Handle(Z, type_class.Name()).ToCString(),
             external_constructor_name.ToCString());
-        ReportError(Error::Handle(I, type.error()));
+        ReportError(Error::Handle(Z, type.error()));
       }
       return ThrowNoSuchMethodError(call_pos,
                                     type_class,
@@ -11383,12 +11389,12 @@
                                     NULL);  // No existing function.
     } else if (constructor.IsRedirectingFactory()) {
       ClassFinalizer::ResolveRedirectingFactory(type_class, constructor);
-      Type& redirect_type = Type::Handle(I, constructor.RedirectionType());
+      Type& redirect_type = Type::Handle(Z, constructor.RedirectionType());
       if (!redirect_type.IsMalformedOrMalbounded() &&
           !redirect_type.IsInstantiated()) {
         // The type arguments of the redirection type are instantiated from the
         // type arguments of the parsed type of the 'new' or 'const' expression.
-        Error& error = Error::Handle(I);
+        Error& error = Error::Handle(Z);
         redirect_type ^= redirect_type.InstantiateFrom(type_arguments, &error);
         if (!error.IsNull()) {
           redirect_type = ClassFinalizer::NewFinalizedMalformedType(
@@ -11396,12 +11402,12 @@
               script_,
               call_pos,
               "redirecting factory type '%s' cannot be instantiated",
-              String::Handle(I, redirect_type.UserVisibleName()).ToCString());
+              String::Handle(Z, redirect_type.UserVisibleName()).ToCString());
         }
       }
       if (redirect_type.IsMalformedOrMalbounded()) {
         if (is_const) {
-          ReportError(Error::Handle(I, redirect_type.error()));
+          ReportError(Error::Handle(Z, redirect_type.error()));
         }
         return ThrowTypeError(redirect_type.token_pos(), redirect_type);
       }
@@ -11428,22 +11434,22 @@
   ASSERT(!constructor.IsNull());
   if (type_class.is_abstract() && !constructor.IsFactory()) {
     // Evaluate arguments before throwing.
-    LetNode* result = new(I) LetNode(call_pos);
+    LetNode* result = new(Z) LetNode(call_pos);
     for (intptr_t i = 0; i < arguments->length(); ++i) {
       result->AddNode(arguments->NodeAt(i));
     }
-    ArgumentListNode* error_arguments = new(I) ArgumentListNode(type_pos);
-    error_arguments->Add(new(I) LiteralNode(
-        TokenPos(), Integer::ZoneHandle(I, Integer::New(type_pos))));
-    error_arguments->Add(new(I) LiteralNode(
-        TokenPos(), String::ZoneHandle(I, type_class_name.raw())));
+    ArgumentListNode* error_arguments = new(Z) ArgumentListNode(type_pos);
+    error_arguments->Add(new(Z) LiteralNode(
+        TokenPos(), Integer::ZoneHandle(Z, Integer::New(type_pos))));
+    error_arguments->Add(new(Z) LiteralNode(
+        TokenPos(), String::ZoneHandle(Z, type_class_name.raw())));
     result->AddNode(
         MakeStaticCall(Symbols::AbstractClassInstantiationError(),
                        Library::PrivateCoreLibName(Symbols::ThrowNew()),
                        error_arguments));
     return result;
   }
-  String& error_message = String::Handle(I);
+  String& error_message = String::Handle(Z);
   if (!constructor.AreValidArguments(arguments_length,
                                      arguments->names(),
                                      &error_message)) {
@@ -11454,7 +11460,7 @@
                   "invalid arguments passed to constructor '%s' "
                   "for class '%s': %s",
                   external_constructor_name.ToCString(),
-                  String::Handle(I, type_class.Name()).ToCString(),
+                  String::Handle(Z, type_class.Name()).ToCString(),
                   error_message.ToCString());
     }
     return ThrowNoSuchMethodError(call_pos,
@@ -11470,7 +11476,7 @@
   // compile-time error if the constructor is const.
   if (type.IsMalformedOrMalbounded()) {
     if (is_const) {
-      ReportError(Error::Handle(I, type.error()));
+      ReportError(Error::Handle(Z, type.error()));
     }
     return ThrowTypeError(type_pos, type);
   }
@@ -11485,7 +11491,7 @@
                   "const object creation",
                   external_constructor_name.ToCString());
     }
-    const Object& constructor_result = Object::Handle(I,
+    const Object& constructor_result = Object::Handle(Z,
         EvaluateConstConstructorCall(type_class,
                                      type_arguments,
                                      constructor,
@@ -11499,23 +11505,23 @@
     } else {
       // Const constructors can return null in the case where a const native
       // factory returns a null value. Thus we cannot use a Instance::Cast here.
-      Instance& const_instance = Instance::Handle(I);
+      Instance& const_instance = Instance::Handle(Z);
       const_instance ^= constructor_result.raw();
-      new_object = new(I) LiteralNode(
-          new_pos, Instance::ZoneHandle(I, const_instance.raw()));
+      new_object = new(Z) LiteralNode(
+          new_pos, Instance::ZoneHandle(Z, const_instance.raw()));
       if (!type_bound.IsNull()) {
         ASSERT(!type_bound.IsMalformed());
-        Error& malformed_error = Error::Handle(I);
+        Error& malformed_error = Error::Handle(Z);
         ASSERT(!is_top_level_);  // We cannot check unresolved types.
         if (!const_instance.IsInstanceOf(type_bound,
-                                         TypeArguments::Handle(I),
+                                         TypeArguments::Handle(Z),
                                          &malformed_error)) {
           type_bound = ClassFinalizer::NewFinalizedMalformedType(
               malformed_error,
               script_,
               new_pos,
               "const factory result is not an instance of '%s'",
-              String::Handle(I, type_bound.UserVisibleName()).ToCString());
+              String::Handle(Z, type_bound.UserVisibleName()).ToCString());
           new_object = ThrowTypeError(new_pos, type_bound);
         }
         type_bound = AbstractType::null();
@@ -11535,7 +11541,7 @@
         new_pos, type_arguments, constructor, arguments);
   }
   if (!type_bound.IsNull()) {
-    new_object = new(I) AssignableNode(
+    new_object = new(Z) AssignableNode(
          new_pos, new_object, type_bound, Symbols::FactoryResult());
   }
   return new_object;
@@ -11544,25 +11550,25 @@
 
 String& Parser::Interpolate(const GrowableArray<AstNode*>& values) {
   const Class& cls = Class::Handle(
-      I, Library::LookupCoreClass(Symbols::StringBase()));
+      Z, Library::LookupCoreClass(Symbols::StringBase()));
   ASSERT(!cls.IsNull());
-  const Function& func = Function::Handle(I, cls.LookupStaticFunction(
+  const Function& func = Function::Handle(Z, cls.LookupStaticFunction(
       Library::PrivateCoreLibName(Symbols::Interpolate())));
   ASSERT(!func.IsNull());
 
   // Build the array of literal values to interpolate.
-  const Array& value_arr = Array::Handle(I, Array::New(values.length()));
+  const Array& value_arr = Array::Handle(Z, Array::New(values.length()));
   for (int i = 0; i < values.length(); i++) {
     ASSERT(values[i]->IsLiteralNode());
     value_arr.SetAt(i, values[i]->AsLiteralNode()->literal());
   }
 
   // Build argument array to pass to the interpolation function.
-  const Array& interpolate_arg = Array::Handle(I, Array::New(1));
+  const Array& interpolate_arg = Array::Handle(Z, Array::New(1));
   interpolate_arg.SetAt(0, value_arr);
 
   // Call interpolation function.
-  Object& result = Object::Handle(I);
+  Object& result = Object::Handle(Z);
   {
     PAUSETIMERSCOPE(I, time_compilation);
     result = DartEntry::InvokeFunction(func, interpolate_arg);
@@ -11570,7 +11576,7 @@
   if (result.IsUnhandledException()) {
     ReportError("%s", Error::Cast(result).ToErrorCString());
   }
-  String& concatenated = String::ZoneHandle(I);
+  String& concatenated = String::ZoneHandle(Z);
   concatenated ^= result.raw();
   concatenated = Symbols::New(concatenated);
   return concatenated;
@@ -11593,7 +11599,7 @@
       (l1_token != Token::kINTERPOL_VAR) &&
       (l1_token != Token::kINTERPOL_START)) {
     // Common case: no interpolation.
-    primary = new(I) LiteralNode(literal_start, *CurrentLiteral());
+    primary = new(Z) LiteralNode(literal_start, *CurrentLiteral());
     ConsumeToken();
     return primary;
   }
@@ -11605,7 +11611,7 @@
     if (CurrentLiteral()->Length() > 0) {
       // Only add non-empty string sections to the values list
       // that will be concatenated.
-      values_list.Add(new(I) LiteralNode(TokenPos(), *CurrentLiteral()));
+      values_list.Add(new(Z) LiteralNode(TokenPos(), *CurrentLiteral()));
     }
     ConsumeToken();
     while ((CurrentToken() == Token::kINTERPOL_VAR) ||
@@ -11639,7 +11645,7 @@
             const_expr->IsBool() ||
             const_expr->IsNull())) {
           // Change expr into a literal.
-          expr = new(I) LiteralNode(expr_pos,
+          expr = new(Z) LiteralNode(expr_pos,
                                     EvaluateConstExpr(expr_pos, expr));
         } else {
           is_compiletime_const = false;
@@ -11650,25 +11656,25 @@
   }
   if (is_compiletime_const) {
     if (has_interpolation) {
-      primary = new(I) LiteralNode(literal_start, Interpolate(values_list));
+      primary = new(Z) LiteralNode(literal_start, Interpolate(values_list));
     } else {
-      const Array& strings = Array::Handle(I, Array::New(values_list.length()));
+      const Array& strings = Array::Handle(Z, Array::New(values_list.length()));
       for (int i = 0; i < values_list.length(); i++) {
         const Instance& part = values_list[i]->AsLiteralNode()->literal();
         ASSERT(part.IsString());
         strings.SetAt(i, String::Cast(part));
       }
-      String& lit = String::ZoneHandle(I,
+      String& lit = String::ZoneHandle(Z,
                                        String::ConcatAll(strings, Heap::kOld));
       lit = Symbols::New(lit);
-      primary = new(I) LiteralNode(literal_start, lit);
+      primary = new(Z) LiteralNode(literal_start, lit);
     }
   } else {
-    ArrayNode* values = new(I) ArrayNode(
+    ArrayNode* values = new(Z) ArrayNode(
         TokenPos(),
-        Type::ZoneHandle(I, Type::ArrayType()),
+        Type::ZoneHandle(Z, Type::ArrayType()),
         values_list);
-    primary = new(I) StringInterpolateNode(TokenPos(), values);
+    primary = new(Z) StringInterpolateNode(TokenPos(), values);
   }
   return primary;
 }
@@ -11687,17 +11693,17 @@
     CloseBlock();
   } else if (IsIdentifier()) {
     intptr_t qual_ident_pos = TokenPos();
-    const LibraryPrefix& prefix = LibraryPrefix::ZoneHandle(I, ParsePrefix());
+    const LibraryPrefix& prefix = LibraryPrefix::ZoneHandle(Z, ParsePrefix());
     String& ident = *CurrentLiteral();
     ConsumeToken();
     if (prefix.IsNull()) {
       if (!ResolveIdentInLocalScope(qual_ident_pos, ident, &primary)) {
         // Check whether the identifier is a type parameter.
         if (!current_class().IsNull()) {
-          TypeParameter& type_param = TypeParameter::ZoneHandle(I,
+          TypeParameter& type_param = TypeParameter::ZoneHandle(Z,
               current_class().LookupTypeParameter(ident));
           if (!type_param.IsNull()) {
-            return new(I) PrimaryNode(qual_ident_pos, type_param);
+            return new(Z) PrimaryNode(qual_ident_pos, type_param);
           }
         }
         // This is a non-local unqualified identifier so resolve the
@@ -11723,7 +11729,7 @@
           // let ParseSelectors() handle the loadLibrary call.
           SetPosition(qual_ident_pos);
           ConsumeToken();  // Prefix name.
-          primary = new(I) LiteralNode(qual_ident_pos, prefix);
+          primary = new(Z) LiteralNode(qual_ident_pos, prefix);
         } else {
           // TODO(hausner): Ideally we should generate the NoSuchMethodError
           // later, when we know more about how the unresolved name is used.
@@ -11735,7 +11741,7 @@
           // is used. We cheat a little here by looking at the next token
           // to determine whether we have an unresolved method call or
           // field access.
-          String& qualified_name = String::ZoneHandle(I, prefix.name());
+          String& qualified_name = String::ZoneHandle(Z, prefix.name());
           qualified_name = String::Concat(qualified_name, Symbols::Dot());
           qualified_name = String::Concat(qualified_name, ident);
           qualified_name = Symbols::New(qualified_name);
@@ -11758,20 +11764,20 @@
     if (local == NULL) {
       ReportError("receiver 'this' is not in scope");
     }
-    primary = new(I) LoadLocalNode(TokenPos(), local);
+    primary = new(Z) LoadLocalNode(TokenPos(), local);
     ConsumeToken();
   } else if (token == Token::kINTEGER) {
-    const Integer& literal = Integer::ZoneHandle(I, CurrentIntegerLiteral());
-    primary = new(I) LiteralNode(TokenPos(), literal);
+    const Integer& literal = Integer::ZoneHandle(Z, CurrentIntegerLiteral());
+    primary = new(Z) LiteralNode(TokenPos(), literal);
     ConsumeToken();
   } else if (token == Token::kTRUE) {
-    primary = new(I) LiteralNode(TokenPos(), Bool::True());
+    primary = new(Z) LiteralNode(TokenPos(), Bool::True());
     ConsumeToken();
   } else if (token == Token::kFALSE) {
-    primary = new(I) LiteralNode(TokenPos(), Bool::False());
+    primary = new(Z) LiteralNode(TokenPos(), Bool::False());
     ConsumeToken();
   } else if (token == Token::kNULL) {
-    primary = new(I) LiteralNode(TokenPos(), Instance::ZoneHandle(I));
+    primary = new(Z) LiteralNode(TokenPos(), Instance::ZoneHandle(Z));
     ConsumeToken();
   } else if (token == Token::kLPAREN) {
     ConsumeToken();
@@ -11780,11 +11786,11 @@
     SetAllowFunctionLiterals(saved_mode);
     ExpectToken(Token::kRPAREN);
   } else if (token == Token::kDOUBLE) {
-    Double& double_value = Double::ZoneHandle(I, CurrentDoubleLiteral());
+    Double& double_value = Double::ZoneHandle(Z, CurrentDoubleLiteral());
     if (double_value.IsNull()) {
       ReportError("invalid double literal");
     }
-    primary = new(I) LiteralNode(TokenPos(), double_value);
+    primary = new(Z) LiteralNode(TokenPos(), double_value);
     ConsumeToken();
   } else if (token == Token::kSTRING) {
     primary = ParseStringLiteral(true);
@@ -11814,13 +11820,13 @@
     }
     if (current_class().SuperClass() == Class::null()) {
       ReportError("class '%s' does not have a superclass",
-                  String::Handle(I, current_class().Name()).ToCString());
+                  String::Handle(Z, current_class().Name()).ToCString());
     }
     if (current_class().IsMixinApplication()) {
-      const Type& mixin_type = Type::Handle(I, current_class().mixin());
+      const Type& mixin_type = Type::Handle(Z, current_class().mixin());
       if (mixin_type.type_class() == current_function().origin()) {
         ReportError("method of mixin class '%s' may not refer to 'super'",
-                    String::Handle(I, Class::Handle(I,
+                    String::Handle(Z, Class::Handle(Z,
                         current_function().origin()).Name()).ToCString());
       }
     }
@@ -11840,7 +11846,7 @@
         (CurrentToken() == Token::kNE)) {
       primary = ParseSuperOperator();
     } else {
-      primary = new(I) PrimaryNode(super_pos, Symbols::Super());
+      primary = new(Z) PrimaryNode(super_pos, Symbols::Super());
     }
   } else {
     UnexpectedToken();
@@ -11864,24 +11870,24 @@
     ASSERT(field.is_const());
     ASSERT(field.value() != Object::sentinel().raw());
     ASSERT(field.value() != Object::transition_sentinel().raw());
-    return Instance::ZoneHandle(I, field.value());
+    return Instance::ZoneHandle(Z, field.value());
   } else {
     ASSERT(expr->EvalConstExpr() != NULL);
-    ReturnNode* ret = new(I) ReturnNode(expr->token_pos(), expr);
+    ReturnNode* ret = new(Z) ReturnNode(expr->token_pos(), expr);
     // Compile time constant expressions cannot reference anything from a
     // local scope.
-    LocalScope* empty_scope = new(I) LocalScope(NULL, 0, 0);
-    SequenceNode* seq = new(I) SequenceNode(expr->token_pos(), empty_scope);
+    LocalScope* empty_scope = new(Z) LocalScope(NULL, 0, 0);
+    SequenceNode* seq = new(Z) SequenceNode(expr->token_pos(), empty_scope);
     seq->Add(ret);
 
-    Object& result = Object::Handle(I, Compiler::ExecuteOnce(seq));
+    Object& result = Object::Handle(Z, Compiler::ExecuteOnce(seq));
     if (result.IsError()) {
       ReportErrors(Error::Cast(result),
                    script_, expr_pos,
                    "error evaluating constant expression");
     }
     ASSERT(result.IsInstance());
-    Instance& value = Instance::ZoneHandle(I);
+    Instance& value = Instance::ZoneHandle(Z);
     value ^= result.raw();
     value = TryCanonicalize(value, TokenPos());
     return value;
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index e951046..7af16e6 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -40,13 +40,14 @@
 // The class ParsedFunction holds the result of parsing a function.
 class ParsedFunction : public ZoneAllocated {
  public:
-  ParsedFunction(Isolate* isolate, const Function& function)
-      : function_(function),
-        code_(Code::Handle(isolate, function.unoptimized_code())),
+  ParsedFunction(Thread* thread, const Function& function)
+      : thread_(thread),
+        function_(function),
+        code_(Code::Handle(zone(), function.unoptimized_code())),
         node_sequence_(NULL),
         regexp_compile_data_(NULL),
         instantiator_(NULL),
-        default_parameter_values_(Array::ZoneHandle(isolate, Array::null())),
+        default_parameter_values_(Array::ZoneHandle(zone(), Array::null())),
         current_context_var_(NULL),
         expression_temp_var_(NULL),
         finally_return_temp_var_(NULL),
@@ -58,14 +59,13 @@
         num_stack_locals_(0),
         have_seen_await_expr_(false),
         saved_try_ctx_(NULL),
-        async_saved_try_ctx_name_(String::ZoneHandle(isolate, String::null())),
-        isolate_(isolate) {
+        async_saved_try_ctx_name_(String::ZoneHandle(zone(), String::null())) {
     ASSERT(function.IsZoneHandle());
     // Every function has a local variable for the current context.
-    LocalVariable* temp = new(isolate) LocalVariable(
+    LocalVariable* temp = new(zone()) LocalVariable(
         function.token_pos(),
         Symbols::CurrentContextVar(),
-        Type::ZoneHandle(isolate, Type::DynamicType()));
+        Type::ZoneHandle(zone(), Type::DynamicType()));
     ASSERT(temp != NULL);
     current_context_var_ = temp;
   }
@@ -170,9 +170,12 @@
     async_saved_try_ctx_name_ = String::null();
   }
 
-  Isolate* isolate() const { return isolate_; }
+  Thread* thread() const { return thread_; }
+  Isolate* isolate() const { return thread()->isolate(); }
+  Zone* zone() const { return thread()->zone(); }
 
  private:
+  Thread* thread_;
   const Function& function_;
   Code& code_;
   SequenceNode* node_sequence_;
@@ -193,8 +196,6 @@
   LocalVariable* saved_try_ctx_;
   String& async_saved_try_ctx_name_;
 
-  Isolate* isolate_;
-
   friend class Parser;
   DISALLOW_COPY_AND_ASSIGN(ParsedFunction);
 };
@@ -769,9 +770,11 @@
 
   RawInstance* TryCanonicalize(const Instance& instance, intptr_t token_pos);
 
-  Isolate* isolate() const { return isolate_; }
+  Thread* thread() const { return thread_; }
+  Isolate* isolate() const { return thread()->isolate(); }
+  Zone* zone() const { return thread()->zone(); }
 
-  Isolate* isolate_;  // Cached current isolate.
+  Thread* thread_;  // Cached current thread.
 
   Script& script_;
   TokenStream::Iterator tokens_iterator_;
diff --git a/runtime/vm/parser_test.cc b/runtime/vm/parser_test.cc
index 1fb592f..5b5db0f 100644
--- a/runtime/vm/parser_test.cc
+++ b/runtime/vm/parser_test.cc
@@ -10,6 +10,7 @@
 #include "vm/object.h"
 #include "vm/parser.h"
 #include "vm/symbols.h"
+#include "vm/thread.h"
 #include "vm/unit_test.h"
 
 namespace dart {
@@ -31,7 +32,7 @@
       Function::ZoneHandle(cls.LookupStaticFunction(funcname));
     EXPECT(!function.IsNull());
     ParsedFunction* parsed_function =
-        new ParsedFunction(Isolate::Current(), function);
+        new ParsedFunction(Thread::Current(), function);
     Parser::ParseFunction(parsed_function);
     EXPECT(parsed_function->node_sequence() != NULL);
     printf("Class %s function %s:\n", cname, fname);
diff --git a/runtime/vm/port.cc b/runtime/vm/port.cc
index f39cba0..cfb9ac8 100644
--- a/runtime/vm/port.cc
+++ b/runtime/vm/port.cc
@@ -9,7 +9,7 @@
 #include "vm/isolate.h"
 #include "vm/lockers.h"
 #include "vm/message_handler.h"
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 
 namespace dart {
 
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index e9e97b9..801668b 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1021,8 +1021,14 @@
 
   // Compressed version assumes try_index is always -1 and does not store it.
   struct PcDescriptorRec {
-    uword pc() const { return pc_; }
-    void set_pc(uword value) { pc_ = value; }
+    uword pc_offset() const { return pc_offset_; }
+    void set_pc_offset(uword value) {
+      // Some C compilers warn about the comparison always being true when using
+      // <= due to limited range of data type.
+      ASSERT((value == static_cast<uword>(kMaxUint32)) ||
+             (value < static_cast<uword>(kMaxUint32)));
+      pc_offset_ = value;
+    }
 
     Kind kind() const {
       return static_cast<Kind>(deopt_id_and_kind_ & kAnyKind);
@@ -1057,7 +1063,7 @@
       return (token_pos_ & 0x1) == 1;
     }
 
-    uword pc_;
+    uint32_t pc_offset_;
     int32_t deopt_id_and_kind_;  // Bits 31..8 -> deopt_id, bits 7..0 kind.
     int32_t token_pos_;  // Bits 31..1 -> token_pos, bit 1 -> compressed flag;
     int16_t try_index_;
@@ -1066,7 +1072,7 @@
   // This structure is only used to compute what the size of PcDescriptorRec
   // should be when the try_index_ field is omitted.
   struct CompressedPcDescriptorRec {
-    uword pc_;
+    uint32_t pc_offset_;
     int32_t deopt_id_and_kind_;
     int32_t token_pos_;
   };
@@ -1195,7 +1201,7 @@
   // The index into the ExceptionHandlers table corresponds to
   // the try_index of the handler.
   struct HandlerInfo {
-    intptr_t handler_pc;       // PC value of handler.
+    uint32_t handler_pc_offset;  // PC offset value of handler.
     int16_t outer_try_index;   // Try block index of enclosing try block.
     int8_t needs_stacktrace;   // True if a stacktrace is needed.
     int8_t has_catch_all;      // Catches all exceptions.
diff --git a/runtime/vm/regexp.h b/runtime/vm/regexp.h
index 5e8ce22..91e244a 100644
--- a/runtime/vm/regexp.h
+++ b/runtime/vm/regexp.h
@@ -7,6 +7,7 @@
 
 #include "vm/assembler.h"
 #include "vm/intermediate_language.h"
+#include "vm/flow_graph_compiler.h"
 #include "vm/object.h"
 #include "vm/regexp_assembler.h"
 
diff --git a/runtime/vm/regexp_assembler.cc b/runtime/vm/regexp_assembler.cc
index 4ecf4c1..a494b1f 100644
--- a/runtime/vm/regexp_assembler.cc
+++ b/runtime/vm/regexp_assembler.cc
@@ -36,6 +36,7 @@
 
 static const intptr_t kInvalidTryIndex = CatchClauseNode::kInvalidTryIndex;
 static const intptr_t kNoSourcePos = Scanner::kNoSourcePos;
+static const intptr_t kMinStackSize = 512;
 
 
 void PrintUtf16(uint16_t c) {
@@ -90,6 +91,7 @@
       ic_data_array_(ic_data_array),
       current_instruction_(NULL),
       stack_(NULL),
+      stack_pointer_(NULL),
       current_character_(NULL),
       current_position_(NULL),
       string_param_(NULL),
@@ -97,8 +99,7 @@
       start_index_param_(NULL),
       registers_count_(0),
       saved_registers_count_((capture_count + 1) * 2),
-      stack_array_(GrowableObjectArray::ZoneHandle(
-          isolate, GrowableObjectArray::New(16, Heap::kOld))),
+      stack_array_cell_(Array::ZoneHandle(isolate, Array::New(1, Heap::kOld))),
       // The registers array is allocated at a fixed size after assembly.
       registers_array_(TypedData::ZoneHandle(isolate, TypedData::null())) {
   switch (specialization_cid) {
@@ -111,6 +112,12 @@
 
   InitializeLocals();
 
+  // Allocate an initial stack backing of the minimum stack size. The stack
+  // backing is indirectly referred to so we can reuse it on subsequent matches
+  // even in the case where the backing has been enlarged and thus reallocated.
+  stack_array_cell_.SetAt(0, TypedData::Handle(isolate,
+    TypedData::New(kTypedDataInt32ArrayCid, kMinStackSize / 4, Heap::kOld)));
+
   // Create and generate all preset blocks.
   entry_block_ =
       new(isolate) GraphEntryInstr(
@@ -152,6 +159,7 @@
 
   // Create local variables and parameters.
   stack_ = Local(Symbols::stack());
+  stack_pointer_ = Local(Symbols::stack_pointer());
   registers_ = Local(Symbols::position_registers());
   current_character_ = Local(Symbols::current_character());
   current_position_ = Local(Symbols::current_position());
@@ -197,13 +205,13 @@
   ClearRegisters(0, saved_registers_count_ - 1);
 
   // Generate a local list variable to represent the backtracking stack.
-  StoreLocal(stack_, Bind(new(I) ConstantInstr(stack_array_)));
-  PushArgumentInstr* stack_push = PushLocal(stack_);
-  PushArgumentInstr* zero_push = PushArgument(Bind(Uint64Constant(0)));
-  Do(InstanceCall(InstanceCallDescriptor(
-      Library::PrivateCoreLibName(Symbols::_setLength())),
-      stack_push,
-      zero_push));
+  PushArgumentInstr* stack_cell_push =
+      PushArgument(Bind(new(I) ConstantInstr(stack_array_cell_)));
+  StoreLocal(stack_, Bind(InstanceCall(
+      InstanceCallDescriptor::FromToken(Token::kINDEX),
+      stack_cell_push,
+      PushArgument(Bind(Uint64Constant(0))))));
+  StoreLocal(stack_pointer_, Bind(Int64Constant(-1)));
 
   // Jump to the start block.
   current_instruction_->Goto(start_block_);
@@ -222,7 +230,7 @@
 
   PushArgumentInstr* block_offsets_push =
       PushArgument(Bind(new(I) ConstantInstr(offsets)));
-  PushArgumentInstr* block_id_push = PushArgument(PopStack());
+  PushArgumentInstr* block_id_push = PushArgument(Bind(PopStack()));
 
   Value* offset_value =
       Bind(InstanceCall(InstanceCallDescriptor::FromToken(Token::kINDEX),
@@ -897,20 +905,13 @@
 
   BlockLabel fallthrough;
 
-  PushArgumentInstr* stack_push = PushLocal(stack_);
-  Definition* stack_tip_def = InstanceCall(
-        InstanceCallDescriptor(String::ZoneHandle(
-                                 I, Field::GetterSymbol(Symbols::last()))),
-        stack_push);
+  Definition* head = PeekStack();
   Definition* cur_pos_def = LoadLocal(current_position_);
-
-  BranchOrBacktrack(Comparison(kNE, stack_tip_def, cur_pos_def),
+  BranchOrBacktrack(Comparison(kNE, head, cur_pos_def),
                     &fallthrough);
 
   // Pop, throwing away the value.
-  stack_push = PushLocal(stack_);
-  Do(InstanceCall(InstanceCallDescriptor(Symbols::removeLast()),
-                  stack_push));
+  Do(PopStack());
 
   BranchOrBacktrack(NULL, on_equal);
 
@@ -1527,7 +1528,7 @@
 
 void IRRegExpMacroAssembler::PopCurrentPosition() {
   TAG();
-  StoreLocal(current_position_, PopStack());
+  StoreLocal(current_position_, Bind(PopStack()));
 }
 
 
@@ -1536,24 +1537,46 @@
   ASSERT(reg < registers_count_);
   PushArgumentInstr* registers_push = PushLocal(registers_);
   PushArgumentInstr* index_push = PushRegisterIndex(reg);
-  PushArgumentInstr* pop_push = PushArgument(PopStack());
+  PushArgumentInstr* pop_push = PushArgument(Bind(PopStack()));
   StoreRegister(registers_push, index_push, pop_push);
 }
 
 
 void IRRegExpMacroAssembler::PushStack(Definition *definition) {
   PushArgumentInstr* stack_push = PushLocal(stack_);
+  PushArgumentInstr* stack_pointer_push = PushLocal(stack_pointer_);
+  StoreLocal(stack_pointer_,
+             Bind(Add(stack_pointer_push,
+                      PushArgument(Bind(Uint64Constant(1))))));
+  stack_pointer_push = PushLocal(stack_pointer_);
+  // TODO(zerny): bind value and push could break stack discipline.
   PushArgumentInstr* value_push = PushArgument(Bind(definition));
-  Do(InstanceCall(InstanceCallDescriptor(Symbols::add()),
+  Do(InstanceCall(InstanceCallDescriptor::FromToken(Token::kASSIGN_INDEX),
                   stack_push,
+                  stack_pointer_push,
                   value_push));
 }
 
 
-Value* IRRegExpMacroAssembler::PopStack() {
+Definition* IRRegExpMacroAssembler::PopStack() {
   PushArgumentInstr* stack_push = PushLocal(stack_);
-  return Bind(InstanceCall(InstanceCallDescriptor(Symbols::removeLast()),
-                           stack_push));
+  PushArgumentInstr* stack_pointer_push1 = PushLocal(stack_pointer_);
+  PushArgumentInstr* stack_pointer_push2 = PushLocal(stack_pointer_);
+  StoreLocal(stack_pointer_,
+             Bind(Sub(stack_pointer_push2,
+                      PushArgument(Bind(Uint64Constant(1))))));
+  return InstanceCall(InstanceCallDescriptor::FromToken(Token::kINDEX),
+                      stack_push,
+                      stack_pointer_push1);
+}
+
+
+Definition* IRRegExpMacroAssembler::PeekStack() {
+  PushArgumentInstr* stack_push = PushLocal(stack_);
+  PushArgumentInstr* stack_pointer_push = PushLocal(stack_pointer_);
+  return InstanceCall(InstanceCallDescriptor::FromToken(Token::kINDEX),
+                      stack_push,
+                      stack_pointer_push);
 }
 
 
@@ -1571,6 +1594,7 @@
 
   ConstantInstr* offset = Uint64Constant(indirect_target->indirect_id());
   PushStack(offset);
+  CheckStackLimit();
 }
 
 
@@ -1582,11 +1606,60 @@
 
 void IRRegExpMacroAssembler::PushRegister(intptr_t reg) {
   TAG();
+  // TODO(zerny): Refactor PushStack so it can be reused here.
   PushArgumentInstr* stack_push = PushLocal(stack_);
+  PushArgumentInstr* stack_pointer_push = PushLocal(stack_pointer_);
+  StoreLocal(stack_pointer_,
+             Bind(Add(stack_pointer_push,
+                      PushArgument(Bind(Uint64Constant(1))))));
+  stack_pointer_push = PushLocal(stack_pointer_);
+  // TODO(zerny): bind value and push could break stack discipline.
   PushArgumentInstr* value_push = PushArgument(LoadRegister(reg));
-  Do(InstanceCall(InstanceCallDescriptor(Symbols::add()),
+  Do(InstanceCall(InstanceCallDescriptor::FromToken(Token::kASSIGN_INDEX),
                   stack_push,
+                  stack_pointer_push,
                   value_push));
+  CheckStackLimit();
+}
+
+
+// Checks that (stack.capacity - stack_limit_slack) > stack_pointer.
+// This ensures that up to stack_limit_slack stack pushes can be
+// done without exhausting the stack space. If the check fails the
+// stack will be grown.
+void IRRegExpMacroAssembler::CheckStackLimit() {
+  TAG();
+  PushArgumentInstr* stack_push = PushLocal(stack_);
+  PushArgumentInstr* length_push = PushArgument(Bind(InstanceCall(
+      InstanceCallDescriptor(
+          String::ZoneHandle(Field::GetterSymbol(Symbols::Length()))),
+      stack_push)));
+  PushArgumentInstr* capacity_push = PushArgument(Bind(Sub(
+      length_push,
+      PushArgument(Bind(Uint64Constant(stack_limit_slack()))))));
+  PushArgumentInstr* stack_pointer_push = PushLocal(stack_pointer_);
+  BranchInstr* branch = new(I) BranchInstr(
+      Comparison(kGT, capacity_push, stack_pointer_push));
+  CloseBlockWith(branch);
+
+  BlockLabel grow_stack;
+  BlockLabel fallthrough;
+  *branch->true_successor_address() =
+      TargetWithJoinGoto(fallthrough.block());
+  *branch->false_successor_address() =
+      TargetWithJoinGoto(grow_stack.block());
+
+  BindBlock(&grow_stack);
+  GrowStack();
+
+  BindBlock(&fallthrough);
+}
+
+
+void IRRegExpMacroAssembler::GrowStack() {
+  TAG();
+  Value* cell = Bind(new(I) ConstantInstr(stack_array_cell_));
+  StoreLocal(stack_, Bind(new(I) GrowRegExpStackInstr(cell)));
 }
 
 
@@ -1595,19 +1668,11 @@
   StoreLocal(current_position_, LoadRegister(reg));
 }
 
-// Resets the size of the stack to the value stored in reg.
+// Resets the tip of the stack to the value stored in reg.
 void IRRegExpMacroAssembler::ReadStackPointerFromRegister(intptr_t reg) {
   TAG();
   ASSERT(reg < registers_count_);
-
-  PushArgumentInstr* stack_push = PushLocal(stack_);
-  PushArgumentInstr* length_push = PushArgument(LoadRegister(reg));
-
-  Do(InstanceCall(
-      InstanceCallDescriptor(
-          String::ZoneHandle(I, Field::SetterSymbol(Symbols::Length()))),
-      stack_push,
-      length_push));
+  StoreLocal(stack_pointer_, LoadRegister(reg));
 }
 
 void IRRegExpMacroAssembler::SetCurrentPositionFromEnd(intptr_t by)  {
@@ -1689,12 +1754,8 @@
 
   PushArgumentInstr* registers_push = PushLocal(registers_);
   PushArgumentInstr* index_push = PushRegisterIndex(reg);
-  PushArgumentInstr* stack_push = PushLocal(stack_);
-  PushArgumentInstr* length_push =
-      PushArgument(Bind(InstanceCall(InstanceCallDescriptor(
-          String::ZoneHandle(I, Field::GetterSymbol(Symbols::Length()))),
-                                     stack_push)));
-  StoreRegister(registers_push, index_push, length_push);
+  PushArgumentInstr* tip_push = PushLocal(stack_pointer_);
+  StoreRegister(registers_push, index_push, tip_push);
 }
 
 
diff --git a/runtime/vm/regexp_assembler.h b/runtime/vm/regexp_assembler.h
index 12edecb..ebca0c2 100644
--- a/runtime/vm/regexp_assembler.h
+++ b/runtime/vm/regexp_assembler.h
@@ -539,7 +539,10 @@
 
   // Accessors for our local stack_.
   void PushStack(Definition* definition);
-  Value* PopStack();
+  Definition* PopStack();
+  Definition* PeekStack();
+  void CheckStackLimit();
+  void GrowStack();
 
   // Prints the specified argument. Used for debugging.
   void Print(PushArgumentInstr* argument);
@@ -595,6 +598,7 @@
   // A list, acting as the runtime stack for both backtrack locations and
   // stored positions within the string.
   LocalVariable* stack_;
+  LocalVariable* stack_pointer_;
 
   // Stores the current character within the string.
   LocalVariable* current_character_;
@@ -629,7 +633,7 @@
   const intptr_t saved_registers_count_;
 
   // The actual array objects used for the stack and registers.
-  GrowableObjectArray& stack_array_;
+  Array& stack_array_cell_;
   TypedData& registers_array_;
 
   IdAllocator block_id_;
diff --git a/runtime/vm/signal_handler.h b/runtime/vm/signal_handler.h
index 27b6674..0c01741 100644
--- a/runtime/vm/signal_handler.h
+++ b/runtime/vm/signal_handler.h
@@ -12,12 +12,10 @@
 #include <signal.h>  // NOLINT
 #include <ucontext.h>  // NOLINT
 #elif defined(TARGET_OS_ANDROID)
-#include <android/api-level.h>  // NOLINT
-/* Android <= 19 doesn't have ucontext.h */
-#if __ANDROID_API__ <= 19
 #include <signal.h>  // NOLINT
+#if !defined(__BIONIC_HAVE_UCONTEXT_T)
 #include <asm/sigcontext.h>  // NOLINT
-// These are not defined on Android, so we have to define them here.
+// If ucontext_t is not defined on Android, define it here.
 typedef struct sigcontext mcontext_t;
 typedef struct ucontext {
   uint32_t uc_flags;
@@ -26,11 +24,7 @@
   struct sigcontext uc_mcontext;
   uint32_t uc_sigmask;
 } ucontext_t;
-#else
-// Android > 19 has ucontext.h
-#include <signal.h>  // NOLINT
-#include <ucontext.h>  // NOLINT
-#endif  // __ANDROID_API__ <= 19
+#endif  // !defined(__BIONIC_HAVE_UCONTEXT_T)
 #elif defined(TARGET_OS_MACOS)
 #include <signal.h>  // NOLINT
 #include <sys/ucontext.h>  // NOLINT
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index 350e79e4..4050429 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -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.
 
-#include <setjmp.h>
+#include <setjmp.h>  // NOLINT
 #include <stdlib.h>
 
 #include "vm/globals.h"
@@ -20,7 +20,7 @@
 #include "vm/lockers.h"
 #include "vm/native_arguments.h"
 #include "vm/stack_frame.h"
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 
 namespace dart {
 
@@ -255,13 +255,14 @@
 intptr_t SimulatorDebugger::GetApproximateTokenIndex(const Code& code,
                                                      uword pc) {
   intptr_t token_pos = -1;
+  uword pc_offset = pc - code.EntryPoint();
   const PcDescriptors& descriptors =
       PcDescriptors::Handle(code.pc_descriptors());
   PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
   while (iter.MoveNext()) {
-    if (iter.Pc() == pc) {
+    if (iter.PcOffset() == pc_offset) {
       return iter.TokenPos();
-    } else if ((token_pos <= 0) && (iter.Pc() > pc)) {
+    } else if ((token_pos <= 0) && (iter.PcOffset() > pc_offset)) {
       token_pos = iter.TokenPos();
     }
   }
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index ca93c26..cbb4dc7 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -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.
 
-#include <setjmp.h>
+#include <setjmp.h>  // NOLINT
 #include <stdlib.h>
 
 #include "vm/globals.h"
@@ -19,7 +19,7 @@
 #include "vm/lockers.h"
 #include "vm/native_arguments.h"
 #include "vm/stack_frame.h"
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 
 namespace dart {
 
@@ -273,13 +273,14 @@
 intptr_t SimulatorDebugger::GetApproximateTokenIndex(const Code& code,
                                                      uword pc) {
   intptr_t token_pos = -1;
+  uword pc_offset = pc - code.EntryPoint();
   const PcDescriptors& descriptors =
       PcDescriptors::Handle(code.pc_descriptors());
   PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
   while (iter.MoveNext()) {
-    if (iter.Pc() == pc) {
+    if (iter.PcOffset() == pc_offset) {
       return iter.TokenPos();
-    } else if ((token_pos <= 0) && (iter.Pc() > pc)) {
+    } else if ((token_pos <= 0) && (iter.PcOffset() > pc_offset)) {
       token_pos = iter.TokenPos();
     }
   }
diff --git a/runtime/vm/simulator_mips.cc b/runtime/vm/simulator_mips.cc
index 87ec3e3..b4db0f1 100644
--- a/runtime/vm/simulator_mips.cc
+++ b/runtime/vm/simulator_mips.cc
@@ -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.
 
-#include <setjmp.h>
+#include <setjmp.h>  // NOLINT
 #include <stdlib.h>
 
 #include "vm/globals.h"
@@ -19,7 +19,7 @@
 #include "vm/lockers.h"
 #include "vm/native_arguments.h"
 #include "vm/stack_frame.h"
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 
 namespace dart {
 
@@ -266,13 +266,14 @@
 intptr_t SimulatorDebugger::GetApproximateTokenIndex(const Code& code,
                                                      uword pc) {
   intptr_t token_pos = -1;
+  uword pc_offset = pc - code.EntryPoint();
   const PcDescriptors& descriptors =
       PcDescriptors::Handle(code.pc_descriptors());
   PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
   while (iter.MoveNext()) {
-    if (iter.Pc() == pc) {
+    if (iter.PcOffset() == pc_offset) {
       return iter.TokenPos();
-    } else if ((token_pos <= 0) && (iter.Pc() > pc)) {
+    } else if ((token_pos <= 0) && (iter.PcOffset() > pc_offset)) {
       token_pos = iter.TokenPos();
     }
   }
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 0eb9bb9..bd8b095 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -209,6 +209,7 @@
   if (code.IsNull()) {
     return false;  // Stub frames do not have exception handlers.
   }
+  uword pc_offset = pc() - code.EntryPoint();
 
   REUSABLE_EXCEPTION_HANDLERS_HANDLESCOPE(isolate);
   ExceptionHandlers& handlers = reused_exception_handlers_handle.Handle();
@@ -224,10 +225,10 @@
   PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
   while (iter.MoveNext()) {
     const intptr_t current_try_index = iter.TryIndex();
-    if ((iter.Pc() == pc()) && (current_try_index != -1)) {
+    if ((iter.PcOffset() == pc_offset) && (current_try_index != -1)) {
       RawExceptionHandlers::HandlerInfo handler_info;
       handlers.GetHandlerInfo(current_try_index, &handler_info);
-      *handler_pc = handler_info.handler_pc;
+      *handler_pc = code.EntryPoint() + handler_info.handler_pc_offset;
       *needs_stacktrace = handler_info.needs_stacktrace;
       *has_catch_all = handler_info.has_catch_all;
       return true;
@@ -242,12 +243,13 @@
   if (code.IsNull()) {
     return -1;  // Stub frames do not have token_pos.
   }
+  uword pc_offset = pc() - code.EntryPoint();
   const PcDescriptors& descriptors =
       PcDescriptors::Handle(code.pc_descriptors());
   ASSERT(!descriptors.IsNull());
   PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
   while (iter.MoveNext()) {
-    if (iter.Pc() == pc()) {
+    if (iter.PcOffset() == pc_offset) {
       return iter.TokenPos();
     }
   }
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index b12c7a7..a5b46fc 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -413,7 +413,7 @@
   Label loop;
   __ Bind(&loop);
   __ ldr(IP, Address(R1, kWordSize, Address::PreIndex));
-  __ StoreIntoObjectNoBarrier(R0, Address(R3, R2, LSL, 1), IP);
+  __ InitializeFieldNoBarrier(R0, Address(R3, R2, LSL, 1), IP);
   __ Bind(&enter);
   __ subs(R2, R2, Operand(Smi::RawValue(1)));  // R2 is Smi.
   __ b(&loop, PL);
@@ -679,12 +679,12 @@
   // R0: new object start as a tagged pointer.
   // R7: new object end address.
   // Store the type argument field.
-  __ StoreIntoObjectNoBarrier(R0,
+  __ InitializeFieldNoBarrier(R0,
                               FieldAddress(R0, Array::type_arguments_offset()),
                               R1);
 
   // Set the length field.
-  __ StoreIntoObjectNoBarrier(R0,
+  __ InitializeFieldNoBarrier(R0,
                               FieldAddress(R0, Array::length_offset()),
                               R2);
 
@@ -917,7 +917,7 @@
     // R3: next object start.
     // R6: allocation stats address.
     __ LoadImmediate(R4, reinterpret_cast<intptr_t>(Object::null()));
-    __ StoreIntoObjectNoBarrier(R0, FieldAddress(R0, Context::parent_offset()),
+    __ InitializeFieldNoBarrier(R0, FieldAddress(R0, Context::parent_offset()),
                                 R4);
 
     // Initialize the context variables.
@@ -1127,7 +1127,7 @@
       // Set the type arguments in the new object.
       __ ldr(R4, Address(SP, 0));
       FieldAddress type_args(R0, cls.type_arguments_field_offset());
-      __ StoreIntoObjectNoBarrier(R0, type_args, R4);
+      __ InitializeFieldNoBarrier(R0, type_args, R4);
     }
 
     // Done allocating and initializing the instance.
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 2dc9f24..c3e7b3e 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -339,6 +339,7 @@
   V(ClassID, "ClassID")                                                        \
   V(DartIsVM, "dart.isVM")                                                     \
   V(stack, ":stack")                                                           \
+  V(stack_pointer, ":stack_pointer")                                           \
   V(current_character, ":current_character")                                   \
   V(current_position, ":current_position")                                     \
   V(string_param_length, ":string_param_length")                               \
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 155312d..63837bd 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -1,110 +1,40 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 #ifndef VM_THREAD_H_
 #define VM_THREAD_H_
 
-#include "platform/globals.h"
-
-// Declare the OS-specific types ahead of defining the generic classes.
-#if defined(TARGET_OS_ANDROID)
-#include "vm/thread_android.h"
-#elif defined(TARGET_OS_LINUX)
-#include "vm/thread_linux.h"
-#elif defined(TARGET_OS_MACOS)
-#include "vm/thread_macos.h"
-#elif defined(TARGET_OS_WINDOWS)
-#include "vm/thread_win.h"
-#else
-#error Unknown target os.
-#endif
+#include "vm/isolate.h"
 
 namespace dart {
 
-class Isolate;
-
+// A VM thread; may be executing Dart code or performing helper tasks like
+// garbage collection.
 class Thread {
  public:
-  static ThreadLocalKey kUnsetThreadLocalKey;
-  static ThreadId kInvalidThreadId;
-
-  typedef void (*ThreadStartFunction) (uword parameter);
-
-  // Start a thread running the specified function. Returns 0 if the
-  // thread started successfuly and a system specific error code if
-  // the thread failed to start.
-  static int Start(ThreadStartFunction function, uword parameters);
-
-  static ThreadLocalKey CreateThreadLocal();
-  static void DeleteThreadLocal(ThreadLocalKey key);
-  static uword GetThreadLocal(ThreadLocalKey key) {
-    return ThreadInlineImpl::GetThreadLocal(key);
+  static Thread* Current() {
+    // For now, there is still just one thread per isolate, and the Thread
+    // class just aliases the Isolate*. Once all interfaces and uses have been
+    // updated to distinguish between isolates and threads, Thread will get its
+    // own thread-local storage key.
+    return reinterpret_cast<Thread*>(Isolate::Current());
   }
-  static void SetThreadLocal(ThreadLocalKey key, uword value);
-  static intptr_t GetMaxStackSize();
-  static ThreadId GetCurrentThreadId();
-  static bool Join(ThreadId id);
-  static intptr_t ThreadIdToIntPtr(ThreadId id);
-  static bool Compare(ThreadId a, ThreadId b);
-  static void GetThreadCpuUsage(ThreadId thread_id, int64_t* cpu_usage);
-};
 
+  // The topmost zone used for allocation in this thread.
+  Zone* zone() {
+    return reinterpret_cast<BaseIsolate*>(this)->current_zone();
+  }
 
-class Mutex {
- public:
-  Mutex();
-  ~Mutex();
-
-  void Lock();
-  bool TryLock();
-  void Unlock();
-
-#if defined(DEBUG)
-  Isolate* Owner() const { return owner_; }
-#endif  // defined(DEBUG)
+  // The isolate that this thread is operating on.
+  Isolate* isolate() {
+    return reinterpret_cast<Isolate*>(this);
+  }
 
  private:
-  MutexData data_;
-#if defined(DEBUG)
-  Isolate* owner_;
-#endif  // defined(DEBUG)
-
-  DISALLOW_COPY_AND_ASSIGN(Mutex);
+  DISALLOW_COPY_AND_ASSIGN(Thread);
 };
 
-
-class Monitor {
- public:
-  enum WaitResult {
-    kNotified,
-    kTimedOut
-  };
-
-  static const int64_t kNoTimeout = 0;
-
-  Monitor();
-  ~Monitor();
-
-  void Enter();
-  void Exit();
-
-  // Wait for notification or timeout.
-  WaitResult Wait(int64_t millis);
-  WaitResult WaitMicros(int64_t micros);
-
-  // Notify waiting threads.
-  void Notify();
-  void NotifyAll();
-
- private:
-  MonitorData data_;  // OS-specific data.
-
-  DISALLOW_COPY_AND_ASSIGN(Monitor);
-};
-
-
 }  // namespace dart
 
-
 #endif  // VM_THREAD_H_
diff --git a/runtime/vm/thread_interrupter.cc b/runtime/vm/thread_interrupter.cc
index 0dd983b..b2f5f1c 100644
--- a/runtime/vm/thread_interrupter.cc
+++ b/runtime/vm/thread_interrupter.cc
@@ -51,19 +51,20 @@
 bool ThreadInterrupter::initialized_ = false;
 bool ThreadInterrupter::shutdown_ = false;
 bool ThreadInterrupter::thread_running_ = false;
-ThreadId ThreadInterrupter::interrupter_thread_id_ = Thread::kInvalidThreadId;
+ThreadId ThreadInterrupter::interrupter_thread_id_ =
+    OSThread::kInvalidThreadId;
 Monitor* ThreadInterrupter::monitor_ = NULL;
 intptr_t ThreadInterrupter::interrupt_period_ = 1000;
 intptr_t ThreadInterrupter::current_wait_time_ = Monitor::kNoTimeout;
 ThreadLocalKey ThreadInterrupter::thread_state_key_ =
-    Thread::kUnsetThreadLocalKey;
+    OSThread::kUnsetThreadLocalKey;
 
 
 void ThreadInterrupter::InitOnce() {
   ASSERT(!initialized_);
-  ASSERT(thread_state_key_ == Thread::kUnsetThreadLocalKey);
-  thread_state_key_ = Thread::CreateThreadLocal();
-  ASSERT(thread_state_key_ != Thread::kUnsetThreadLocalKey);
+  ASSERT(thread_state_key_ == OSThread::kUnsetThreadLocalKey);
+  thread_state_key_ = OSThread::CreateThreadLocal();
+  ASSERT(thread_state_key_ != OSThread::kUnsetThreadLocalKey);
   monitor_ = new Monitor();
   ASSERT(monitor_ != NULL);
   initialized_ = true;
@@ -75,15 +76,15 @@
   if (FLAG_trace_thread_interrupter) {
     OS::Print("ThreadInterrupter starting up.\n");
   }
-  ASSERT(interrupter_thread_id_ == Thread::kInvalidThreadId);
+  ASSERT(interrupter_thread_id_ == OSThread::kInvalidThreadId);
   {
     MonitorLocker startup_ml(monitor_);
-    Thread::Start(ThreadMain, 0);
+    OSThread::Start(ThreadMain, 0);
     while (!thread_running_) {
       startup_ml.Wait();
     }
   }
-  ASSERT(interrupter_thread_id_ != Thread::kInvalidThreadId);
+  ASSERT(interrupter_thread_id_ != OSThread::kInvalidThreadId);
   if (FLAG_trace_thread_interrupter) {
     OS::Print("ThreadInterrupter running.\n");
   }
@@ -109,9 +110,9 @@
   // On Windows, a thread's exit-code can leak into the process's exit-code,
   // if exiting 'at same time' as the process ends. By joining with the thread
   // here, we avoid this race condition.
-  ASSERT(interrupter_thread_id_ != Thread::kInvalidThreadId);
-  Thread::Join(interrupter_thread_id_);
-  interrupter_thread_id_ = Thread::kInvalidThreadId;
+  ASSERT(interrupter_thread_id_ != OSThread::kInvalidThreadId);
+  OSThread::Join(interrupter_thread_id_);
+  interrupter_thread_id_ = OSThread::kInvalidThreadId;
 #else
   // On non-Windows platforms, just wait for the thread interrupter to signal
   // that it has exited the loop.
@@ -183,9 +184,9 @@
   InterruptableThreadState* state = CurrentThreadState();
   if (state == NULL) {
     // Create thread state object lazily.
-    ThreadId current_thread = Thread::GetCurrentThreadId();
+    ThreadId current_thread = OSThread::GetCurrentThreadId();
     if (FLAG_trace_thread_interrupter) {
-      intptr_t tid = Thread::ThreadIdToIntPtr(current_thread);
+      intptr_t tid = OSThread::ThreadIdToIntPtr(current_thread);
       OS::Print("ThreadInterrupter Tracking %p\n",
                 reinterpret_cast<void*>(tid));
     }
@@ -204,9 +205,9 @@
 void ThreadInterrupter::UpdateStateObject(ThreadInterruptCallback callback,
                                           void* data) {
   InterruptableThreadState* state = CurrentThreadState();
-  ThreadId current_thread = Thread::GetCurrentThreadId();
+  ThreadId current_thread = OSThread::GetCurrentThreadId();
   ASSERT(state != NULL);
-  ASSERT(Thread::Compare(state->id, Thread::GetCurrentThreadId()));
+  ASSERT(OSThread::Compare(state->id, OSThread::GetCurrentThreadId()));
   SetCurrentThreadState(NULL);
   // It is now safe to modify the state object. If an interrupt occurs,
   // the current thread state will be NULL.
@@ -214,7 +215,7 @@
   state->data = data;
   SetCurrentThreadState(state);
   if (FLAG_trace_thread_interrupter) {
-    intptr_t tid = Thread::ThreadIdToIntPtr(current_thread);
+    intptr_t tid = OSThread::ThreadIdToIntPtr(current_thread);
     if (callback == NULL) {
       OS::Print("ThreadInterrupter Cleared %p\n", reinterpret_cast<void*>(tid));
     } else {
@@ -231,13 +232,14 @@
 
 InterruptableThreadState* ThreadInterrupter::CurrentThreadState() {
   InterruptableThreadState* state = reinterpret_cast<InterruptableThreadState*>(
-      Thread::GetThreadLocal(thread_state_key_));
+      OSThread::GetThreadLocal(thread_state_key_));
   return state;
 }
 
 
 void ThreadInterrupter::SetCurrentThreadState(InterruptableThreadState* state) {
-  Thread::SetThreadLocal(thread_state_key_, reinterpret_cast<uword>(state));
+  OSThread::SetThreadLocal(thread_state_key_,
+                              reinterpret_cast<uword>(state));
 }
 
 
@@ -279,7 +281,7 @@
   {
     // Signal to main thread we are ready.
     MonitorLocker startup_ml(monitor_);
-    interrupter_thread_id_ = Thread::GetCurrentThreadId();
+    interrupter_thread_id_ = OSThread::GetCurrentThreadId();
     thread_running_ = true;
     startup_ml.Notify();
   }
diff --git a/runtime/vm/thread_interrupter.h b/runtime/vm/thread_interrupter.h
index 8731b9d..5d0e1ef 100644
--- a/runtime/vm/thread_interrupter.h
+++ b/runtime/vm/thread_interrupter.h
@@ -7,7 +7,7 @@
 
 #include "vm/allocation.h"
 #include "vm/signal_handler.h"
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 
 
 namespace dart {
diff --git a/runtime/vm/thread_interrupter_android.cc b/runtime/vm/thread_interrupter_android.cc
index 8fc8e33..8784b31 100644
--- a/runtime/vm/thread_interrupter_android.cc
+++ b/runtime/vm/thread_interrupter_android.cc
@@ -29,7 +29,7 @@
       // No interrupter state or callback.
       return;
     }
-    ASSERT(Thread::Compare(state->id, Thread::GetCurrentThreadId()));
+    ASSERT(OSThread::Compare(state->id, OSThread::GetCurrentThreadId()));
     // Extract thread state.
     ucontext_t* context = reinterpret_cast<ucontext_t*>(context_);
     mcontext_t mcontext = context->uc_mcontext;
diff --git a/runtime/vm/thread_interrupter_linux.cc b/runtime/vm/thread_interrupter_linux.cc
index b86b85e..b062f55 100644
--- a/runtime/vm/thread_interrupter_linux.cc
+++ b/runtime/vm/thread_interrupter_linux.cc
@@ -27,7 +27,7 @@
       // No interrupter state or callback.
       return;
     }
-    ASSERT(Thread::Compare(state->id, Thread::GetCurrentThreadId()));
+    ASSERT(OSThread::Compare(state->id, OSThread::GetCurrentThreadId()));
     // Extract thread state.
     ucontext_t* context = reinterpret_cast<ucontext_t*>(context_);
     mcontext_t mcontext = context->uc_mcontext;
diff --git a/runtime/vm/thread_interrupter_macos.cc b/runtime/vm/thread_interrupter_macos.cc
index 341f7c7..d6a0fc9 100644
--- a/runtime/vm/thread_interrupter_macos.cc
+++ b/runtime/vm/thread_interrupter_macos.cc
@@ -27,7 +27,7 @@
       // No interrupter state or callback.
       return;
     }
-    ASSERT(Thread::Compare(state->id, Thread::GetCurrentThreadId()));
+    ASSERT(OSThread::Compare(state->id, OSThread::GetCurrentThreadId()));
     // Extract thread state.
     ucontext_t* context = reinterpret_cast<ucontext_t*>(context_);
     mcontext_t mcontext = context->uc_mcontext;
diff --git a/runtime/vm/thread_interrupter_win.cc b/runtime/vm/thread_interrupter_win.cc
index 69e3481..8f0ed95 100644
--- a/runtime/vm/thread_interrupter_win.cc
+++ b/runtime/vm/thread_interrupter_win.cc
@@ -52,7 +52,7 @@
 
 
   static void Interrupt(InterruptableThreadState* state) {
-    ASSERT(!Thread::Compare(GetCurrentThreadId(), state->id));
+    ASSERT(!OSThread::Compare(GetCurrentThreadId(), state->id));
     HANDLE handle = OpenThread(THREAD_GET_CONTEXT |
                                THREAD_QUERY_INFORMATION |
                                THREAD_SUSPEND_RESUME,
diff --git a/runtime/vm/thread_linux.h b/runtime/vm/thread_linux.h
deleted file mode 100644
index 9987834..0000000
--- a/runtime/vm/thread_linux.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#ifndef VM_THREAD_LINUX_H_
-#define VM_THREAD_LINUX_H_
-
-#if !defined(VM_THREAD_H_)
-#error Do not include thread_linux.h directly; use thread.h instead.
-#endif
-
-#include <pthread.h>
-
-#include "platform/assert.h"
-#include "platform/globals.h"
-
-namespace dart {
-
-typedef pthread_key_t ThreadLocalKey;
-typedef pthread_t ThreadId;
-
-class ThreadInlineImpl {
- private:
-  ThreadInlineImpl() {}
-  ~ThreadInlineImpl() {}
-
-  static uword GetThreadLocal(ThreadLocalKey key) {
-    static ThreadLocalKey kUnsetThreadLocalKey = static_cast<pthread_key_t>(-1);
-    ASSERT(key != kUnsetThreadLocalKey);
-    return reinterpret_cast<uword>(pthread_getspecific(key));
-  }
-
-  friend class Thread;
-
-  DISALLOW_ALLOCATION();
-  DISALLOW_COPY_AND_ASSIGN(ThreadInlineImpl);
-};
-
-
-class MutexData {
- private:
-  MutexData() {}
-  ~MutexData() {}
-
-  pthread_mutex_t* mutex() { return &mutex_; }
-
-  pthread_mutex_t mutex_;
-
-  friend class Mutex;
-
-  DISALLOW_ALLOCATION();
-  DISALLOW_COPY_AND_ASSIGN(MutexData);
-};
-
-
-class MonitorData {
- private:
-  MonitorData() {}
-  ~MonitorData() {}
-
-  pthread_mutex_t* mutex() { return &mutex_; }
-  pthread_cond_t* cond() { return &cond_; }
-
-  pthread_mutex_t mutex_;
-  pthread_cond_t cond_;
-
-  friend class Monitor;
-
-  DISALLOW_ALLOCATION();
-  DISALLOW_COPY_AND_ASSIGN(MonitorData);
-};
-
-}  // namespace dart
-
-#endif  // VM_THREAD_LINUX_H_
diff --git a/runtime/vm/thread_macos.h b/runtime/vm/thread_macos.h
deleted file mode 100644
index f4f9b1a..0000000
--- a/runtime/vm/thread_macos.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#ifndef VM_THREAD_MACOS_H_
-#define VM_THREAD_MACOS_H_
-
-#if !defined(VM_THREAD_H_)
-#error Do not include thread_macos.h directly; use thread.h instead.
-#endif
-
-#include <pthread.h>
-
-#include "platform/assert.h"
-#include "platform/globals.h"
-
-namespace dart {
-
-typedef pthread_key_t ThreadLocalKey;
-typedef pthread_t ThreadId;
-
-class ThreadInlineImpl {
- private:
-  ThreadInlineImpl() {}
-  ~ThreadInlineImpl() {}
-
-  static uword GetThreadLocal(ThreadLocalKey key) {
-    static ThreadLocalKey kUnsetThreadLocalKey = static_cast<pthread_key_t>(-1);
-    ASSERT(key != kUnsetThreadLocalKey);
-    return reinterpret_cast<uword>(pthread_getspecific(key));
-  }
-
-  friend class Thread;
-
-  DISALLOW_ALLOCATION();
-  DISALLOW_COPY_AND_ASSIGN(ThreadInlineImpl);
-};
-
-
-class MutexData {
- private:
-  MutexData() {}
-  ~MutexData() {}
-
-  pthread_mutex_t* mutex() { return &mutex_; }
-
-  pthread_mutex_t mutex_;
-
-  friend class Mutex;
-
-  DISALLOW_ALLOCATION();
-  DISALLOW_COPY_AND_ASSIGN(MutexData);
-};
-
-
-class MonitorData {
- private:
-  MonitorData() {}
-  ~MonitorData() {}
-
-  pthread_mutex_t* mutex() { return &mutex_; }
-  pthread_cond_t* cond() { return &cond_; }
-
-  pthread_mutex_t mutex_;
-  pthread_cond_t cond_;
-
-  friend class Monitor;
-
-  DISALLOW_ALLOCATION();
-  DISALLOW_COPY_AND_ASSIGN(MonitorData);
-};
-
-}  // namespace dart
-
-#endif  // VM_THREAD_MACOS_H_
diff --git a/runtime/vm/thread_pool.cc b/runtime/vm/thread_pool.cc
index 02c6e5a..9e819b9 100644
--- a/runtime/vm/thread_pool.cc
+++ b/runtime/vm/thread_pool.cc
@@ -231,7 +231,7 @@
     ASSERT(task_ != NULL);
   }
 #endif
-  int result = Thread::Start(&Worker::Main, reinterpret_cast<uword>(this));
+  int result = OSThread::Start(&Worker::Main, reinterpret_cast<uword>(this));
   if (result != 0) {
     FATAL1("Could not start worker thread: result = %d.", result);
   }
diff --git a/runtime/vm/thread_pool.h b/runtime/vm/thread_pool.h
index d8475dc..792aef7 100644
--- a/runtime/vm/thread_pool.h
+++ b/runtime/vm/thread_pool.h
@@ -6,7 +6,7 @@
 #define VM_THREAD_POOL_H_
 
 #include "vm/globals.h"
-#include "vm/thread.h"
+#include "vm/os_thread.h"
 
 namespace dart {
 
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index 6722151..b0cb897 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -17,6 +17,7 @@
 #include "vm/disassembler.h"
 #include "vm/parser.h"
 #include "vm/symbols.h"
+#include "vm/thread.h"
 #include "vm/virtual_memory.h"
 
 using dart::bin::Builtin;
@@ -245,7 +246,7 @@
 void CodeGenTest::Compile() {
   if (function_.HasCode()) return;
   ParsedFunction* parsed_function =
-      new ParsedFunction(Isolate::Current(), function_);
+      new ParsedFunction(Thread::Current(), function_);
   parsed_function->SetNodeSequence(node_sequence_);
   parsed_function->set_instantiator(NULL);
   parsed_function->set_default_parameter_values(default_parameter_values_);
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index e869eb3..ee38ce6 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -313,6 +313,15 @@
     'os_linux.cc',
     'os_macos.cc',
     'os_test.cc',
+    'os_thread.h',
+    'os_thread_android.cc',
+    'os_thread_android.h',
+    'os_thread_linux.cc',
+    'os_thread_linux.h',
+    'os_thread_macos.cc',
+    'os_thread_macos.h',
+    'os_thread_win.cc',
+    'os_thread_win.h',
     'os_win.cc',
     'pages.cc',
     'pages.h',
@@ -414,10 +423,6 @@
     'tags.cc',
     'tags.h',
     'thread.h',
-    'thread_android.cc',
-    'thread_android.h',
-    'thread_linux.cc',
-    'thread_linux.h',
     'thread_interrupter.cc',
     'thread_interrupter.h',
     'thread_interrupter_android.cc',
@@ -425,14 +430,10 @@
     'thread_interrupter_macos.cc',
     'thread_interrupter_test.cc',
     'thread_interrupter_win.cc',
-    'thread_macos.cc',
-    'thread_macos.h',
     'thread_pool.cc',
     'thread_pool.h',
     'thread_pool_test.cc',
     'thread_test.cc',
-    'thread_win.cc',
-    'thread_win.h',
     'timer.cc',
     'timer.h',
     'token.cc',
diff --git a/sdk/lib/_internal/compiler/js_lib/convert_patch.dart b/sdk/lib/_internal/compiler/js_lib/convert_patch.dart
index f7eb2bd..bb4443e 100644
--- a/sdk/lib/_internal/compiler/js_lib/convert_patch.dart
+++ b/sdk/lib/_internal/compiler/js_lib/convert_patch.dart
@@ -400,4 +400,11 @@
   Converter<List<int>,dynamic> fuse(Converter<String, dynamic> next) {
     return super.fuse(next);
   }
+
+  // Currently not intercepting UTF8 decoding.
+  @patch
+  static String _convertIntercepted(bool allowMalformed, List<int> codeUnits,
+                                    int start, int end) {
+    return null;  // This call was not intercepted.
+  }
 }
diff --git a/sdk/lib/_internal/compiler/js_lib/core_patch.dart b/sdk/lib/_internal/compiler/js_lib/core_patch.dart
index 29ee778..3fe172b 100644
--- a/sdk/lib/_internal/compiler/js_lib/core_patch.dart
+++ b/sdk/lib/_internal/compiler/js_lib/core_patch.dart
@@ -14,6 +14,8 @@
                               stringJoinUnchecked,
                               objectHashCode;
 
+import 'dart:_native_typed_data' show NativeUint8List;
+
 String _symbolToString(Symbol symbol) => _symbol_dev.Symbol.getName(symbol);
 
 _symbolMapToStringMap(Map<Symbol, dynamic> map) {
@@ -275,26 +277,14 @@
   @patch
   factory String.fromCharCodes(Iterable<int> charCodes,
                                [int start = 0, int end]) {
-    // If possible, recognize typed lists too.
-    if (charCodes is! JSArray) {
-      return _stringFromIterable(charCodes, start, end);
-    }
 
-    List list = charCodes;
-    int len = list.length;
-    if (start < 0 || start > len) {
-      throw new RangeError.range(start, 0, len);
+    if (charCodes is JSArray) {
+      return _stringFromJSArray(charCodes, start, end);
     }
-    if (end == null) {
-      end = len;
-    } else if (end < start || end > len) {
-      throw new RangeError.range(end, start, len);
+    if (charCodes is NativeUint8List) {
+      return _stringFromUint8List(charCodes, start, end);
     }
-
-    if (start > 0 || end < len) {
-      list = list.sublist(start, end);
-    }
-    return Primitives.stringFromCharCodes(list);
+    return _stringFromIterable(charCodes, start, end);
   }
 
   @patch
@@ -308,6 +298,34 @@
         'String.fromEnvironment can only be used as a const constructor');
   }
 
+  static String _stringFromJSArray(List list, int start, int endOrNull) {
+    int len = list.length;
+    int end = _checkBounds(len, start, endOrNull);
+    if (start > 0 || end < len) {
+      list = list.sublist(start, end);
+    }
+    return Primitives.stringFromCharCodes(list);
+  }
+
+  static String _stringFromUint8List(
+      NativeUint8List charCodes, int start, int endOrNull) {
+    int len = charCodes.length;
+    int end = _checkBounds(len, start, endOrNull);
+    return Primitives.stringFromNativeUint8List(charCodes, start, end);
+  }
+
+  static int _checkBounds(int len, int start, int end) {
+    if (start < 0 || start > len) {
+      throw new RangeError.range(start, 0, len);
+    }
+    if (end == null) {
+      end = len;
+    } else if (end < start || end > len) {
+      throw new RangeError.range(end, start, len);
+    }
+    return end;
+  }
+
   static String _stringFromIterable(Iterable<int> charCodes,
                                     int start, int end) {
     if (start < 0) throw new RangeError.range(start, 0, charCodes.length);
diff --git a/sdk/lib/_internal/compiler/js_lib/io_patch.dart b/sdk/lib/_internal/compiler/js_lib/io_patch.dart
index c2c218a..dace4db 100644
--- a/sdk/lib/_internal/compiler/js_lib/io_patch.dart
+++ b/sdk/lib/_internal/compiler/js_lib/io_patch.dart
@@ -275,7 +275,8 @@
       {String workingDirectory,
        Map<String, String> environment,
        bool includeParentEnvironment: true,
-       bool runInShell: false}) {
+       bool runInShell: false,
+       bool detach: false}) {
     throw new UnsupportedError("Process.start");
   }
 
@@ -455,16 +456,16 @@
 @patch
 class _Filter {
   @patch
-  static _Filter newZLibDeflateFilter(bool gzip, int level,
-                                      int windowBits, int memLevel,
-                                      int strategy,
-                                      List<int> dictionary, bool raw) {
-    throw new UnsupportedError("newZLibDeflateFilter");
+  static _Filter _newZLibDeflateFilter(bool gzip, int level,
+                                       int windowBits, int memLevel,
+                                       int strategy,
+                                       List<int> dictionary, bool raw) {
+    throw new UnsupportedError("_newZLibDeflateFilter");
   }
   @patch
-  static _Filter newZLibInflateFilter(int windowBits,
-                                      List<int> dictionary, bool raw) {
-    throw new UnsupportedError("newZLibInflateFilter");
+  static _Filter _newZLibInflateFilter(int windowBits,
+                                       List<int> dictionary, bool raw) {
+    throw new UnsupportedError("_newZLibInflateFilter");
   }
 }
 
@@ -495,15 +496,15 @@
 @patch
 class Stdout {
   @patch
-  bool get hasTerminal {
+  bool _hasTerminal(int fd) {
     throw new UnsupportedError("Stdout.hasTerminal");
   }
   @patch
-  int get terminalColumns {
+  int _terminalColumns(int fd) {
     throw new UnsupportedError("Stdout.terminalColumns");
   }
   @patch
-  int get terminalLines {
+  int _terminalLines(int fd) {
     throw new UnsupportedError("Stdout.terminalLines");
   }
 }
@@ -524,7 +525,7 @@
 @patch
 class _IOService {
   @patch
-  static Future dispatch(int request, List data) {
-    throw new UnsupportedError("_IOService.dispatch");
+  static Future _dispatch(int request, List data) {
+    throw new UnsupportedError("_IOService._dispatch");
   }
 }
diff --git a/sdk/lib/_internal/compiler/js_lib/js_helper.dart b/sdk/lib/_internal/compiler/js_lib/js_helper.dart
index e578583..4cce9fd 100644
--- a/sdk/lib/_internal/compiler/js_lib/js_helper.dart
+++ b/sdk/lib/_internal/compiler/js_lib/js_helper.dart
@@ -60,6 +60,8 @@
 import 'dart:_internal' as _symbol_dev;
 import 'dart:_internal' show MappedIterable;
 
+import 'dart:_native_typed_data';
+
 import 'dart:_js_names' show
     extractKeys,
     mangledNames,
@@ -764,19 +766,17 @@
   // This is to avoid stack overflows due to very large argument arrays in
   // apply().  It fixes http://dartbug.com/6919
   static String _fromCharCodeApply(List<int> array) {
-    String result = "";
     const kMaxApply = 500;
     int end = array.length;
-    for (var i = 0; i < end; i += kMaxApply) {
-      var subarray;
-      if (end <= kMaxApply) {
-        subarray = array;
-      } else {
-        subarray = JS('JSExtendableArray', r'#.slice(#, #)', array,
-                      i, i + kMaxApply < end ? i + kMaxApply : end);
-      }
-      result = JS('String', '# + String.fromCharCode.apply(#, #)',
-                  result, null, subarray);
+    if (end <= kMaxApply) {
+      return JS('String', r'String.fromCharCode.apply(null, #)', array);
+    }
+    String result = '';
+    for (int i = 0; i < end; i += kMaxApply) {
+      int chunkEnd = (i + kMaxApply < end) ? i + kMaxApply : end;
+      result = JS('String',
+          r'# + String.fromCharCode.apply(null, #.slice(#, #))',
+          result, array, i, chunkEnd);
     }
     return result;
   }
@@ -806,6 +806,24 @@
     return _fromCharCodeApply(charCodes);
   }
 
+  // [start] and [end] are validated.
+  static String stringFromNativeUint8List(
+      NativeUint8List charCodes, int start, int end) {
+    const kMaxApply = 500;
+    if (end <= kMaxApply && start == 0 && end == charCodes.length) {
+      return JS('String', r'String.fromCharCode.apply(null, #)', charCodes);
+    }
+    String result = '';
+    for (int i = start; i < end; i += kMaxApply) {
+      int chunkEnd = (i + kMaxApply < end) ? i + kMaxApply : end;
+      result = JS('String',
+          r'# + String.fromCharCode.apply(null, #.subarray(#, #))',
+          result, charCodes, i, chunkEnd);
+    }
+    return result;
+  }
+
+
   static String stringFromCharCode(charCode) {
     if (0 <= charCode) {
       if (charCode <= 0xffff) {
@@ -3351,6 +3369,7 @@
         // context.
         JS('void', '(new Function(#))()', 'load("$uri")');
       } catch (error, stackTrace) {
+        _loadingLibraries[hunkName] = null;
         throw new DeferredLoadException("Loading $uri failed.");
       }
       return null;
@@ -3371,6 +3390,7 @@
       JS('void', '#.addEventListener("load", #, false)',
          xhr, convertDartClosureToJS((event) {
         if (JS('int', '#.status', xhr) != 200) {
+          _loadingLibraries[hunkName] = null;
           completer.completeError(
               new DeferredLoadException("Loading $uri failed."));
           return;
@@ -3381,6 +3401,7 @@
           // context.
           JS('void', '(new Function(#))()', code);
         } catch (error, stackTrace) {
+          _loadingLibraries[hunkName] = null;
           completer.completeError(
             new DeferredLoadException("Evaluating $uri failed."));
           return;
@@ -3389,6 +3410,7 @@
       }, 1));
 
       var fail = convertDartClosureToJS((event) {
+        _loadingLibraries[hunkName] = null;
         new DeferredLoadException("Loading $uri failed.");
       }, 1);
       JS('void', '#.addEventListener("error", #, false)', xhr, fail);
@@ -3411,6 +3433,7 @@
     }, 1));
     JS('', '#.addEventListener("error", #, false)',
        script, convertDartClosureToJS((event) {
+      _loadingLibraries[hunkName] = null;
       completer.completeError(
           new DeferredLoadException("Loading $uri failed."));
     }, 1));
diff --git a/sdk/lib/_internal/compiler/js_lib/js_rti.dart b/sdk/lib/_internal/compiler/js_lib/js_rti.dart
index 08c52dd..70bb241 100644
--- a/sdk/lib/_internal/compiler/js_lib/js_rti.dart
+++ b/sdk/lib/_internal/compiler/js_lib/js_rti.dart
@@ -37,7 +37,8 @@
  *     subtype check, if the type arguments to be used in the check do not
  *     depend on the type arguments of the object.
  *  3) A function mapping the type variables of the object to be checked to
- *     a list expression.
+ *     a list expression. The function may also return null, which is equivalent
+ *     to an array containing only null values.
  */
 
 part of _js_helper;
@@ -236,7 +237,7 @@
   assert(arguments == null || isJsArray(arguments));
   if (isJsFunction(substitution)) {
     substitution = invoke(substitution, arguments);
-    if (isJsArray(substitution)) {
+    if (substitution == null || isJsArray(substitution)) {
       arguments = substitution;
     } else if (isJsFunction(substitution)) {
       // TODO(johnniwinther): Check if this is still needed.
diff --git a/sdk/lib/_internal/pub/bin/pub.dart b/sdk/lib/_internal/pub/bin/pub.dart
index 67cefeb..e781f94 100644
--- a/sdk/lib/_internal/pub/bin/pub.dart
+++ b/sdk/lib/_internal/pub/bin/pub.dart
@@ -2,197 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
-import 'dart:io';
-
-import 'package:args/args.dart';
-import 'package:http/http.dart' as http;
-import 'package:path/path.dart' as path;
-import 'package:stack_trace/stack_trace.dart';
-
-import '../lib/src/command.dart';
-import '../lib/src/exceptions.dart';
-import '../lib/src/exit_codes.dart' as exit_codes;
-import '../lib/src/http.dart';
-import '../lib/src/io.dart';
-import '../lib/src/log.dart' as log;
-import '../lib/src/sdk.dart' as sdk;
-import '../lib/src/solver/version_solver.dart';
-import '../lib/src/utils.dart';
+import '../lib/src/command_runner.dart';
 
 void main(List<String> arguments) {
-  ArgResults options;
-
-  try {
-    options = PubCommand.pubArgParser.parse(arguments);
-  } on FormatException catch (e) {
-    log.error(e.message);
-    log.error('Run "pub help" to see available options.');
-    flushThenExit(exit_codes.USAGE);
-    return;
-  }
-
-  log.withPrejudice = options['with-prejudice'];
-
-  if (options['version']) {
-    log.message('Pub ${sdk.version}');
-    return;
-  }
-
-  if (options['help']) {
-    PubCommand.printGlobalUsage();
-    return;
-  }
-
-  if (options['trace']) {
-    log.recordTranscript();
-  }
-
-  switch (options['verbosity']) {
-    case 'normal': log.verbosity = log.Verbosity.NORMAL; break;
-    case 'io':     log.verbosity = log.Verbosity.IO; break;
-    case 'solver': log.verbosity = log.Verbosity.SOLVER; break;
-    case 'all':    log.verbosity = log.Verbosity.ALL; break;
-    default:
-      // No specific verbosity given, so check for the shortcut.
-      if (options['verbose']) {
-        log.verbosity = log.Verbosity.ALL;
-      }
-      break;
-  }
-
-  log.fine('Pub ${sdk.version}');
-
-  var cacheDir;
-  if (Platform.environment.containsKey('PUB_CACHE')) {
-    cacheDir = Platform.environment['PUB_CACHE'];
-  } else if (Platform.operatingSystem == 'windows') {
-    var appData = Platform.environment['APPDATA'];
-    cacheDir = path.join(appData, 'Pub', 'Cache');
-  } else {
-    cacheDir = '${Platform.environment['HOME']}/.pub-cache';
-  }
-
-  validatePlatform().then((_) => runPub(cacheDir, options, arguments));
-}
-
-/// Runs the appropriate pub command whose [arguments] have been parsed to
-/// [options] using the system cache in [cacheDir].
-///
-/// Handles and correctly reports any errors that occur while running.
-void runPub(String cacheDir, ArgResults options, List<String> arguments) {
-  var captureStackChains =
-      options['trace'] ||
-      options['verbose'] ||
-      options['verbosity'] == 'all';
-
-  captureErrors(() => invokeCommand(cacheDir, options),
-      captureStackChains: captureStackChains).catchError((error, Chain chain) {
-    log.exception(error, chain);
-
-    if (options['trace']) {
-      log.dumpTranscript();
-    } else if (!isUserFacingException(error)) {
-      log.error("""
-This is an unexpected error. Please run
-
-    pub --trace ${arguments.map((arg) => "'$arg'").join(' ')}
-
-and include the results in a bug report on http://dartbug.com/new.
-""");
-    }
-
-    return flushThenExit(chooseExitCode(error));
-  }).then((_) {
-    // Explicitly exit on success to ensure that any dangling dart:io handles
-    // don't cause the process to never terminate.
-    return flushThenExit(exit_codes.SUCCESS);
-  });
-}
-
-/// Returns the appropriate exit code for [exception], falling back on 1 if no
-/// appropriate exit code could be found.
-int chooseExitCode(exception) {
-  while (exception is WrappedException) exception = exception.innerError;
-
-  if (exception is HttpException || exception is http.ClientException ||
-      exception is SocketException || exception is PubHttpException ||
-      exception is DependencyNotFoundException) {
-    return exit_codes.UNAVAILABLE;
-  } else if (exception is FormatException || exception is DataException) {
-    return exit_codes.DATA;
-  } else if (exception is UsageException) {
-    return exit_codes.USAGE;
-  } else {
-    return 1;
-  }
-}
-
-/// Walks the command tree and runs the selected pub command.
-Future invokeCommand(String cacheDir, ArgResults mainOptions) async {
-  var commands = PubCommand.mainCommands;
-  var command;
-  var commandString = "pub";
-  var options = mainOptions;
-
-  while (commands.isNotEmpty) {
-    if (options.command == null) {
-      if (options.rest.isEmpty) {
-        if (command == null) {
-          // No top-level command was chosen.
-          PubCommand.printGlobalUsage();
-          return new Future.value();
-        }
-
-        command.usageError('Missing subcommand for "$commandString".');
-      } else {
-        if (command == null) {
-          PubCommand.usageErrorWithCommands(commands,
-              'Could not find a command named "${options.rest[0]}".');
-        }
-
-        command.usageError('Could not find a subcommand named '
-            '"${options.rest[0]}" for "$commandString".');
-      }
-    }
-
-    // Step into the command.
-    options = options.command;
-    command = commands[options.name];
-    commands = command.subcommands;
-    commandString += " ${options.name}";
-
-    if (options['help']) {
-      command.printUsage();
-      return new Future.value();
-    }
-  }
-
-  // Make sure there aren't unexpected arguments.
-  if (!command.takesArguments && options.rest.isNotEmpty) {
-    command.usageError(
-        'Command "${options.name}" does not take any arguments.');
-  }
-
-  try {
-    // TODO(rnystrom): Use await here when this is fixed:
-    // https://github.com/dart-lang/async_await/issues/40.
-    return command.run(cacheDir, mainOptions, options);
-  } finally {
-    command.cache.deleteTempDir();
-  }
-}
-
-/// Checks that pub is running on a supported platform.
-///
-/// If it isn't, it prints an error message and exits. Completes when the
-/// validation is done.
-Future validatePlatform() async {
-  if (Platform.operatingSystem != 'windows') return;
-
-  var result = await runProcess('ver', []);
-  if (result.stdout.join('\n').contains('XP')) {
-    log.error('Sorry, but pub is not supported on Windows XP.');
-    await flushThenExit(exit_codes.USAGE);
-  }
+  new PubCommandRunner().run(arguments);
 }
diff --git a/sdk/lib/_internal/pub/lib/src/barback/transformer_loader.dart b/sdk/lib/_internal/pub/lib/src/barback/transformer_loader.dart
index 2d9f333..031c384 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/transformer_loader.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/transformer_loader.dart
@@ -97,17 +97,13 @@
       return new Future.value(new Set());
     }
 
-    // TODO(nweiz): This is currently wrapped in a non-async closure to work
-    // around https://github.com/dart-lang/async_await/issues/51. When that
-    // issue is fixed, make this inline.
-    var transformer = () {
-      try {
-        return new Dart2JSTransformer.withSettings(_environment,
-            new BarbackSettings(config.configuration, _environment.mode));
-      } on FormatException catch (error, stackTrace) {
-        fail(error.message, error, stackTrace);
-      }
-    }();
+    var transformer;
+    try {
+      transformer = new Dart2JSTransformer.withSettings(_environment,
+          new BarbackSettings(config.configuration, _environment.mode));
+    } on FormatException catch (error, stackTrace) {
+      fail(error.message, error, stackTrace);
+    }
 
     // Handle any exclusions.
     _transformers[config] = new Set.from(
diff --git a/sdk/lib/_internal/pub/lib/src/command.dart b/sdk/lib/_internal/pub/lib/src/command.dart
index 0c92abd..3a16471 100644
--- a/sdk/lib/_internal/pub/lib/src/command.dart
+++ b/sdk/lib/_internal/pub/lib/src/command.dart
@@ -4,115 +4,37 @@
 
 library pub.command;
 
-import 'dart:async';
-import 'dart:math' as math;
-
 import 'package:args/args.dart';
+import 'package:args/command_runner.dart';
 import 'package:path/path.dart' as path;
 
-import 'command/build.dart';
-import 'command/cache.dart';
-import 'command/deps.dart';
-import 'command/downgrade.dart';
-import 'command/get.dart';
-import 'command/global.dart';
-import 'command/help.dart';
-import 'command/lish.dart';
-import 'command/list_package_dirs.dart';
-import 'command/run.dart';
-import 'command/serve.dart';
-import 'command/upgrade.dart';
-import 'command/uploader.dart';
-import 'command/version.dart';
 import 'entrypoint.dart';
-import 'exceptions.dart';
 import 'log.dart' as log;
 import 'global_packages.dart';
 import 'system_cache.dart';
-import 'utils.dart';
 
 /// The base class for commands for the pub executable.
 ///
 /// A command may either be a "leaf" command or it may be a parent for a set
 /// of subcommands. Only leaf commands are ever actually invoked. If a command
 /// has subcommands, then one of those must always be chosen.
-abstract class PubCommand {
-  /// The commands that pub understands.
-  static final Map<String, PubCommand> mainCommands = _initCommands();
-
-  /// The top-level [ArgParser] used to parse the pub command line.
-  static final pubArgParser = _initArgParser();
-
-  /// Displays usage information for the app.
-  static void printGlobalUsage() {
-    // Build up a buffer so it shows up as a single log entry.
-    var buffer = new StringBuffer();
-    buffer.writeln('Pub is a package manager for Dart.');
-    buffer.writeln();
-    buffer.writeln('Usage: pub <command> [arguments]');
-    buffer.writeln();
-    buffer.writeln('Global options:');
-    buffer.writeln(pubArgParser.getUsage());
-    buffer.writeln();
-    buffer.write(_listCommands(mainCommands));
-    buffer.writeln();
-    buffer.writeln(
-        'Run "pub help [command]" for more information about a command.');
-    buffer.writeln(
-        'See http://dartlang.org/tools/pub for detailed documentation.');
-
-    log.message(buffer);
-  }
-
-  /// Fails with a usage error [message] when trying to select from one of
-  /// [commands].
-  static void usageErrorWithCommands(Map<String, PubCommand> commands,
-                                String message) {
-    throw new UsageException(message, _listCommands(commands));
-  }
-
-  /// Writes [commands] in a nicely formatted list to [buffer].
-  static String _listCommands(Map<String, PubCommand> commands) {
-    // If there are no subcommands, do nothing.
-    if (commands.isEmpty) return "";
-
-    // Don't include aliases.
-    var names = commands.keys
-        .where((name) => !commands[name].aliases.contains(name));
-
-    // Filter out hidden ones, unless they are all hidden.
-    var visible = names.where((name) => !commands[name].hidden);
-    if (visible.isNotEmpty) names = visible;
-
-    // Show the commands alphabetically.
-    names = ordered(names);
-    var length = names.map((name) => name.length).reduce(math.max);
-    var isSubcommand = commands != mainCommands;
-
-    var buffer = new StringBuffer();
-    buffer.writeln('Available ${isSubcommand ? "sub" : ""}commands:');
-    for (var name in names) {
-      buffer.writeln('  ${padRight(name, length)}   '
-          '${commands[name].description.split("\n").first}');
+abstract class PubCommand extends Command {
+  SystemCache get cache {
+    if (_cache == null) {
+      _cache = new SystemCache.withSources(isOffline: isOffline);
     }
-
-    return buffer.toString();
+    return _cache;
   }
-
-  SystemCache get cache => _cache;
   SystemCache _cache;
 
-  GlobalPackages get globals => _globals;
+  GlobalPackages get globals {
+    if (_globals == null) {
+      _globals = new GlobalPackages(cache);
+    }
+    return _globals;
+  }
   GlobalPackages _globals;
 
-  /// The parsed options for the pub executable.
-  ArgResults get globalOptions => _globalOptions;
-  ArgResults _globalOptions;
-
-  /// The parsed options for this command.
-  ArgResults get commandOptions => _commandOptions;
-  ArgResults _commandOptions;
-
   /// Gets the [Entrypoint] package for the current working directory.
   ///
   /// This will load the pubspec and fail with an error if the current directory
@@ -120,59 +42,29 @@
   Entrypoint get entrypoint {
     // Lazy load it.
     if (_entrypoint == null) {
-      _entrypoint = new Entrypoint(path.current, _cache,
-          packageSymlinks: globalOptions['package-symlinks']);
+      _entrypoint = new Entrypoint(path.current, cache,
+          packageSymlinks: globalResults['package-symlinks']);
     }
     return _entrypoint;
   }
-
   Entrypoint _entrypoint;
 
-  /// 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 {
-    // Leaf commands are visible by default.
-    if (subcommands.isEmpty) return false;
-
-    // Otherwise, a command is hidden if all of its subcommands are.
-    return subcommands.values.every((subcommand) => subcommand.hidden);
-  }
-
-  /// How to invoke this command (e.g. `"pub get [package]"`).
-  String get usage;
-
   /// The URL for web documentation for this command.
   String get docUrl => null;
 
-  /// Whether or not this command takes arguments in addition to options.
-  ///
-  /// If false, pub will exit with an error if arguments are provided. This
-  /// only needs to be set in leaf commands.
-  bool get takesArguments => false;
-
   /// Override this and return `false` to disallow trailing options from being
   /// parsed after a non-option argument is parsed.
   bool get allowTrailingOptions => true;
 
-  /// Alternate names for this command.
-  ///
-  /// These names won't be used in the documentation, but they will work when
-  /// invoked on the command line.
-  final aliases = const <String>[];
-
-  /// The [ArgParser] for this command.
-  ArgParser get commandParser => _commandParser;
-  ArgParser _commandParser;
-
-  /// Subcommands exposed by this command.
-  ///
-  /// If empty, then this command has no subcommands. Otherwise, a subcommand
-  /// must be specified by the user. In that case, this command's [onRun] will
-  /// not be called and the subcommand's will.
-  final subcommands = <String, PubCommand>{};
+  ArgParser get argParser {
+    // Lazily initialize the parser because the superclass constructor requires
+    // it but we want to initialize it based on [allowTrailingOptions].
+    if (_argParser == null) {
+      _argParser = new ArgParser(allowTrailingOptions: allowTrailingOptions);
+    }
+    return _argParser;
+  }
+  ArgParser _argParser;
 
   /// Override this to use offline-only sources instead of hitting the network.
   ///
@@ -180,50 +72,13 @@
   /// it has no effect. This only needs to be set in leaf commands.
   bool get isOffline => false;
 
-  PubCommand() {
-    _commandParser = new ArgParser(allowTrailingOptions: allowTrailingOptions);
-
-    // Allow "--help" after a command to get command help.
-    commandParser.addFlag('help', abbr: 'h', negatable: false,
-        help: 'Print usage information for this command.');
+  String get usageFooter {
+    if (docUrl == null) return null;
+    return "See $docUrl for detailed documentation.";
   }
 
-  /// Runs this command using a system cache at [cacheDir] with [globalOptions]
-  /// and [options].
-  Future run(String cacheDir, ArgResults globalOptions, ArgResults options) {
-    _globalOptions = globalOptions;
-    _commandOptions = options;
-
-    _cache = new SystemCache.withSources(cacheDir, isOffline: isOffline);
-    _globals = new GlobalPackages(_cache);
-
-    return new Future.sync(onRun);
-  }
-
-  /// Override this to perform the specific command.
-  ///
-  /// Return a future that completes when the command is done or fails if the
-  /// command fails. If the command is synchronous, it may return `null`. Only
-  /// leaf command should override this.
-  Future onRun() {
-    // Leaf commands should override this and non-leaf commands should never
-    // call it.
-    assert(false);
-    return null;
-  }
-
-  /// Displays usage information for this command.
-  ///
-  /// If [description] is omitted, defaults to the command's description.
-  void printUsage([String description]) {
-    if (description == null) description = this.description;
-    log.message('$description\n\n${_getUsage()}');
-  }
-
-  /// Throw a [UsageException] for a usage error of this command with
-  /// [message].
-  void usageError(String message) {
-    throw new UsageException(message, _getUsage());
+  void printUsage() {
+    log.message(usage);
   }
 
   /// Parses a user-supplied integer [intString] named [name].
@@ -233,104 +88,7 @@
     try {
       return int.parse(intString);
     } on FormatException catch (_) {
-      usageError('Could not parse $name "$intString".');
+      usageException('Could not parse $name "$intString".');
     }
   }
-
-  /// Generates a string of usage information for this command.
-  String _getUsage() {
-    var buffer = new StringBuffer();
-    buffer.write('Usage: $usage');
-
-    var commandUsage = commandParser.getUsage();
-    if (!commandUsage.isEmpty) {
-      buffer.writeln();
-      buffer.writeln(commandUsage);
-    }
-
-    if (subcommands.isNotEmpty) {
-      buffer.writeln();
-      buffer.write(_listCommands(subcommands));
-    }
-
-    buffer.writeln();
-    buffer.writeln('Run "pub help" to see global options.');
-    if (docUrl != null) {
-      buffer.writeln("See $docUrl for detailed documentation.");
-    }
-
-    return buffer.toString();
-  }
-}
-
-_initCommands() {
-  var commands = {
-    'build': new BuildCommand(),
-    'cache': new CacheCommand(),
-    'deps': new DepsCommand(),
-    'downgrade': new DowngradeCommand(),
-    'global': new GlobalCommand(),
-    'get': new GetCommand(),
-    'help': new HelpCommand(),
-    'list-package-dirs': new ListPackageDirsCommand(),
-    'publish': new LishCommand(),
-    'run': new RunCommand(),
-    'serve': new ServeCommand(),
-    'upgrade': new UpgradeCommand(),
-    'uploader': new UploaderCommand(),
-    'version': new VersionCommand()
-  };
-
-  for (var command in commands.values.toList()) {
-    for (var alias in command.aliases) {
-      commands[alias] = command;
-    }
-  }
-
-  return commands;
-}
-
-/// Creates the top-level [ArgParser] used to parse the pub command line.
-ArgParser _initArgParser() {
-  var argParser = new ArgParser(allowTrailingOptions: true);
-
-  // Add the global options.
-  argParser.addFlag('help', abbr: 'h', negatable: false,
-      help: 'Print this usage information.');
-  argParser.addFlag('version', negatable: false,
-      help: 'Print pub version.');
-  argParser.addFlag('trace',
-       help: 'Print debugging information when an error occurs.');
-  argParser.addOption('verbosity',
-      help: 'Control output verbosity.',
-      allowed: ['normal', 'io', 'solver', 'all'],
-      allowedHelp: {
-        'normal': 'Show errors, warnings, and user messages.',
-        'io':     'Also show IO operations.',
-        'solver': 'Show steps during version resolution.',
-        'all':    'Show all output including internal tracing messages.'
-      });
-  argParser.addFlag('verbose', abbr: 'v', negatable: false,
-      help: 'Shortcut for "--verbosity=all".');
-  argParser.addFlag('with-prejudice', hide: !isAprilFools, negatable: false,
-      help: 'Execute commands with prejudice.');
-  argParser.addFlag('package-symlinks', hide: true, negatable: true,
-      defaultsTo: true);
-
-  // Register the commands.
-  PubCommand.mainCommands.forEach((name, command) {
-    _registerCommand(name, command, argParser);
-  });
-
-  return argParser;
-}
-
-/// Registers a [command] with [name] on [parser].
-void _registerCommand(String name, PubCommand command, ArgParser parser) {
-  parser.addCommand(name, command.commandParser);
-
-  // Recursively wire up any subcommands.
-  command.subcommands.forEach((name, subcommand) {
-    _registerCommand(name, subcommand, command.commandParser);
-  });
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command/barback.dart b/sdk/lib/_internal/pub/lib/src/command/barback.dart
index 6f67c39..8175e8f 100644
--- a/sdk/lib/_internal/pub/lib/src/command/barback.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/barback.dart
@@ -24,10 +24,8 @@
 
 /// Shared base class for [BuildCommand] and [ServeCommand].
 abstract class BarbackCommand extends PubCommand {
-  final takesArguments = true;
-
   /// The build mode.
-  BarbackMode get mode => new BarbackMode(commandOptions["mode"]);
+  BarbackMode get mode => new BarbackMode(argResults["mode"]);
 
   /// The directories in the entrypoint package that should be added to the
   /// build environment.
@@ -41,20 +39,20 @@
   List<String> get defaultSourceDirectories;
 
   BarbackCommand() {
-    commandParser.addOption("mode", defaultsTo: defaultMode.toString(),
+    argParser.addOption("mode", defaultsTo: defaultMode.toString(),
         help: "Mode to run transformers in.");
 
-    commandParser.addFlag("all",
+    argParser.addFlag("all",
         help: "Use all default source directories.",
         defaultsTo: false, negatable: false);
   }
 
-  Future onRun() {
+  Future run() {
     // Switch to JSON output if specified. We need to do this before parsing
     // the source directories so an error will be correctly reported in JSON
     // format.
-    log.json.enabled = commandOptions.options.contains("format") &&
-        commandOptions["format"] == "json";
+    log.json.enabled = argResults.options.contains("format") &&
+        argResults["format"] == "json";
 
     _parseSourceDirectories();
     return onRunTransformerCommand();
@@ -75,18 +73,18 @@
   ///
   /// Throws an exception if the arguments are invalid.
   void _parseSourceDirectories() {
-    if (commandOptions["all"]) {
+    if (argResults["all"]) {
       _addAllDefaultSources();
       return;
     }
 
     // If no directories were specified, use the defaults.
-    if (commandOptions.rest.isEmpty) {
+    if (argResults.rest.isEmpty) {
       _addDefaultSources();
       return;
     }
 
-    sourceDirectories.addAll(commandOptions.rest);
+    sourceDirectories.addAll(argResults.rest);
 
     // Prohibit "lib".
     var disallowed = sourceDirectories.where((dir) {
@@ -95,13 +93,13 @@
     });
 
     if (disallowed.isNotEmpty) {
-      usageError(_directorySentence(disallowed, "is", "are", "not allowed"));
+      usageException(_directorySentence(disallowed, "is", "are", "not allowed"));
     }
 
     // Make sure the source directories don't reach out of the package.
     var invalid = sourceDirectories.where((dir) => !path.isWithin('.', dir));
     if (invalid.isNotEmpty) {
-      usageError(_directorySentence(invalid, "isn't", "aren't",
+      usageException(_directorySentence(invalid, "isn't", "aren't",
           "in this package"));
     }
 
@@ -127,7 +125,7 @@
     }
 
     if (overlapping.isNotEmpty) {
-      usageError(_directorySentence(overlapping, "cannot", "cannot",
+      usageException(_directorySentence(overlapping, "cannot", "cannot",
           "overlap"));
     }
   }
@@ -135,8 +133,8 @@
   /// Handles "--all" by adding all default source directories that are
   /// present.
   void _addAllDefaultSources() {
-    if (commandOptions.rest.isNotEmpty) {
-      usageError(
+    if (argResults.rest.isNotEmpty) {
+      usageException(
           'Directory names are not allowed if "--all" is passed.');
     }
 
diff --git a/sdk/lib/_internal/pub/lib/src/command/build.dart b/sdk/lib/_internal/pub/lib/src/command/build.dart
index f1f6625..4b76909 100644
--- a/sdk/lib/_internal/pub/lib/src/command/build.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/build.dart
@@ -20,13 +20,14 @@
 
 /// Handles the `build` pub command.
 class BuildCommand extends BarbackCommand {
+  String get name => "build";
   String get description => "Apply transformers to build a package.";
-  String get usage => "pub build [options] [directories...]";
+  String get invocation => "pub build [options] [directories...]";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-build.html";
   List<String> get aliases => const ["deploy", "settle-up"];
 
   /// The path to the application's build output directory.
-  String get outputDirectory => commandOptions["output"];
+  String get outputDirectory => argResults["output"];
 
   List<String> get defaultSourceDirectories => ["web"];
 
@@ -34,11 +35,11 @@
   int builtFiles = 0;
 
   BuildCommand() {
-    commandParser.addOption("format",
+    argParser.addOption("format",
         help: "How output should be displayed.",
         allowed: ["text", "json"], defaultsTo: "text");
 
-    commandParser.addOption("output", abbr: "o",
+    argParser.addOption("output", abbr: "o",
         help: "Directory to write build outputs to.",
         defaultsTo: "build");
   }
diff --git a/sdk/lib/_internal/pub/lib/src/command/cache.dart b/sdk/lib/_internal/pub/lib/src/command/cache.dart
index f0559b76..432f096 100644
--- a/sdk/lib/_internal/pub/lib/src/command/cache.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/cache.dart
@@ -11,13 +11,14 @@
 
 /// Handles the `cache` pub command.
 class CacheCommand extends PubCommand {
+  String get name => "cache";
   String get description => "Work with the system cache.";
-  String get usage => "pub cache <subcommand>";
+  String get invocation => "pub cache <subcommand>";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-cache.html";
 
-  final subcommands = {
-    "add": new CacheAddCommand(),
-    "list": new CacheListCommand(),
-    "repair": new CacheRepairCommand()
-  };
+  CacheCommand() {
+    addSubcommand(new CacheAddCommand());
+    addSubcommand(new CacheListCommand());
+    addSubcommand(new CacheRepairCommand());
+  }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command/cache_add.dart b/sdk/lib/_internal/pub/lib/src/command/cache_add.dart
index 7a2b4f2..453ccbd 100644
--- a/sdk/lib/_internal/pub/lib/src/command/cache_add.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/cache_add.dart
@@ -15,43 +15,43 @@
 
 /// Handles the `cache add` pub command.
 class CacheAddCommand extends PubCommand {
+  String get name => "add";
   String get description => "Install a package.";
-  String get usage =>
+  String get invocation =>
       "pub cache add <package> [--version <constraint>] [--all]";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-cache.html";
-  bool get takesArguments => true;
 
   CacheAddCommand() {
-    commandParser.addFlag("all",
+    argParser.addFlag("all",
         help: "Install all matching versions.",
         negatable: false);
 
-    commandParser.addOption("version", abbr: "v",
+    argParser.addOption("version", abbr: "v",
         help: "Version constraint.");
   }
 
-  Future onRun() {
+  Future run() {
     // Make sure there is a package.
-    if (commandOptions.rest.isEmpty) {
-      usageError("No package to add given.");
+    if (argResults.rest.isEmpty) {
+      usageException("No package to add given.");
     }
 
     // Don't allow extra arguments.
-    if (commandOptions.rest.length > 1) {
-      var unexpected = commandOptions.rest.skip(1).map((arg) => '"$arg"');
+    if (argResults.rest.length > 1) {
+      var unexpected = argResults.rest.skip(1).map((arg) => '"$arg"');
       var arguments = pluralize("argument", unexpected.length);
-      usageError("Unexpected $arguments ${toSentence(unexpected)}.");
+      usageException("Unexpected $arguments ${toSentence(unexpected)}.");
     }
 
-    var package = commandOptions.rest.single;
+    var package = argResults.rest.single;
 
     // Parse the version constraint, if there is one.
     var constraint = VersionConstraint.any;
-    if (commandOptions["version"] != null) {
+    if (argResults["version"] != null) {
       try {
-        constraint = new VersionConstraint.parse(commandOptions["version"]);
+        constraint = new VersionConstraint.parse(argResults["version"]);
       } on FormatException catch (error) {
-        usageError(error.message);
+        usageException(error.message);
       }
     }
 
@@ -82,7 +82,7 @@
         });
       }
 
-      if (commandOptions["all"]) {
+      if (argResults["all"]) {
         // Install them in ascending order.
         versions.sort();
         return Future.forEach(versions, downloadVersion);
diff --git a/sdk/lib/_internal/pub/lib/src/command/cache_list.dart b/sdk/lib/_internal/pub/lib/src/command/cache_list.dart
index c4a2811..a9fa470 100644
--- a/sdk/lib/_internal/pub/lib/src/command/cache_list.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/cache_list.dart
@@ -4,7 +4,6 @@
 
 library pub.command.cache_list;
 
-import 'dart:async';
 import 'dart:convert';
 
 import '../command.dart';
@@ -13,11 +12,13 @@
 
 /// Handles the `cache list` pub command.
 class CacheListCommand extends PubCommand {
+  String get name => "list";
   String get description => "List packages in the system cache.";
-  String get usage => "pub cache list";
+  String get invocation => "pub cache list";
   bool get hidden => true;
+  bool get takesArguments => false;
 
-  Future onRun() {
+  void run() {
     // TODO(keertip): Add flag to list packages from non default sources.
     var packagesObj = <String, Map>{};
 
@@ -30,6 +31,5 @@
     // TODO(keertip): Add support for non-JSON format and check for --format
     // flag.
     log.message(JSON.encode({'packages': packagesObj}));
-    return null;
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command/cache_repair.dart b/sdk/lib/_internal/pub/lib/src/command/cache_repair.dart
index d5b3212..3e130e9 100644
--- a/sdk/lib/_internal/pub/lib/src/command/cache_repair.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/cache_repair.dart
@@ -15,11 +15,13 @@
 
 /// Handles the `cache repair` pub command.
 class CacheRepairCommand extends PubCommand {
+  String get name => "repair";
   String get description => "Reinstall cached packages.";
-  String get usage => "pub cache repair";
+  String get invocation => "pub cache repair";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-cache.html";
+  bool get takesArguments => false;
 
-  Future onRun() async {
+  Future run() async {
     var successes = 0;
     var failures = 0;
 
diff --git a/sdk/lib/_internal/pub/lib/src/command/deps.dart b/sdk/lib/_internal/pub/lib/src/command/deps.dart
index fd397b6..7b1bafc 100644
--- a/sdk/lib/_internal/pub/lib/src/command/deps.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/deps.dart
@@ -16,10 +16,12 @@
 
 /// Handles the `deps` pub command.
 class DepsCommand extends PubCommand {
+  String get name => "deps";
   String get description => "Print package dependencies.";
   List<String> get aliases => const ["dependencies", "tab"];
-  String get usage => "pub deps";
+  String get invocation => "pub deps";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-deps.html";
+  bool get takesArguments => false;
 
   /// The loaded package graph.
   PackageGraph _graph;
@@ -28,20 +30,20 @@
   StringBuffer _buffer;
 
   DepsCommand() {
-    commandParser.addOption("style", abbr: "s",
+    argParser.addOption("style", abbr: "s",
         help: "How output should be displayed.",
         allowed: ["compact", "tree", "list"],
         defaultsTo: "tree");
   }
 
-  Future onRun() {
+  Future run() {
     return entrypoint.loadPackageGraph().then((graph) {
       _graph = graph;
       _buffer = new StringBuffer();
 
       _buffer.writeln(_labelPackage(entrypoint.root));
 
-      switch (commandOptions["style"]) {
+      switch (argResults["style"]) {
         case "compact": _outputCompact(); break;
         case "list": _outputList(); break;
         case "tree": _outputTree(); break;
diff --git a/sdk/lib/_internal/pub/lib/src/command/downgrade.dart b/sdk/lib/_internal/pub/lib/src/command/downgrade.dart
index d3313a4..c48c1f0 100644
--- a/sdk/lib/_internal/pub/lib/src/command/downgrade.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/downgrade.dart
@@ -12,26 +12,26 @@
 
 /// Handles the `downgrade` pub command.
 class DowngradeCommand extends PubCommand {
+  String get name => "downgrade";
   String get description =>
       "Downgrade the current package's dependencies to oldest versions.\n\n"
       "This doesn't modify the lockfile, so it can be reset with \"pub get\".";
-  String get usage => "pub downgrade [dependencies...]";
-  bool get takesArguments => true;
+  String get invocation => "pub downgrade [dependencies...]";
 
-  bool get isOffline => commandOptions['offline'];
+  bool get isOffline => argResults['offline'];
 
   DowngradeCommand() {
-    commandParser.addFlag('offline',
+    argParser.addFlag('offline',
         help: 'Use cached packages instead of accessing the network.');
 
-    commandParser.addFlag('dry-run', abbr: 'n', negatable: false,
+    argParser.addFlag('dry-run', abbr: 'n', negatable: false,
         help: "Report what dependencies would change but don't change any.");
   }
 
-  Future onRun() async {
-    var dryRun = commandOptions['dry-run'];
+  Future run() async {
+    var dryRun = argResults['dry-run'];
     await entrypoint.acquireDependencies(SolveType.DOWNGRADE,
-        useLatest: commandOptions.rest, dryRun: dryRun);
+        useLatest: argResults.rest, dryRun: dryRun);
     if (isOffline) {
       log.warning("Warning: Downgrading when offline may not update you to "
           "the oldest versions of your dependencies.");
diff --git a/sdk/lib/_internal/pub/lib/src/command/get.dart b/sdk/lib/_internal/pub/lib/src/command/get.dart
index 7394e0c..d2fc513 100644
--- a/sdk/lib/_internal/pub/lib/src/command/get.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/get.dart
@@ -11,22 +11,23 @@
 
 /// Handles the `get` pub command.
 class GetCommand extends PubCommand {
+  String get name => "get";
   String get description => "Get the current package's dependencies.";
-  String get usage => "pub get";
+  String get invocation => "pub get";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-get.html";
   List<String> get aliases => const ["install"];
-  bool get isOffline => commandOptions["offline"];
+  bool get isOffline => argResults["offline"];
 
   GetCommand() {
-    commandParser.addFlag('offline',
+    argParser.addFlag('offline',
         help: 'Use cached packages instead of accessing the network.');
 
-    commandParser.addFlag('dry-run', abbr: 'n', negatable: false,
+    argParser.addFlag('dry-run', abbr: 'n', negatable: false,
         help: "Report what dependencies would change but don't change any.");
   }
 
-  Future onRun() {
+  Future run() {
     return entrypoint.acquireDependencies(SolveType.GET,
-        dryRun: commandOptions['dry-run']);
+        dryRun: argResults['dry-run']);
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command/global.dart b/sdk/lib/_internal/pub/lib/src/command/global.dart
index c1b1730..c2ddfd8 100644
--- a/sdk/lib/_internal/pub/lib/src/command/global.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/global.dart
@@ -12,13 +12,14 @@
 
 /// Handles the `global` pub command.
 class GlobalCommand extends PubCommand {
+  String get name => "global";
   String get description => "Work with global packages.";
-  String get usage => "pub global <subcommand>";
+  String get invocation => "pub global <subcommand>";
 
-  final subcommands = {
-    "activate": new GlobalActivateCommand(),
-    "deactivate": new GlobalDeactivateCommand(),
-    "list": new GlobalListCommand(),
-    "run": new GlobalRunCommand()
-  };
+  GlobalCommand() {
+    addSubcommand(new GlobalActivateCommand());
+    addSubcommand(new GlobalDeactivateCommand());
+    addSubcommand(new GlobalListCommand());
+    addSubcommand(new GlobalRunCommand());
+  }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command/global_activate.dart b/sdk/lib/_internal/pub/lib/src/command/global_activate.dart
index ea8172a..d4335c2 100644
--- a/sdk/lib/_internal/pub/lib/src/command/global_activate.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/global_activate.dart
@@ -13,47 +13,47 @@
 
 /// Handles the `global activate` pub command.
 class GlobalActivateCommand extends PubCommand {
+  String get name => "activate";
   String get description => "Make a package's executables globally available.";
-  String get usage => "pub global activate <package...>";
-  bool get takesArguments => true;
+  String get invocation => "pub global activate <package...>";
 
   GlobalActivateCommand() {
-    commandParser.addOption("source",
+    argParser.addOption("source",
         abbr: "s",
         help: "The source used to find the package.",
         allowed: ["git", "hosted", "path"],
         defaultsTo: "hosted");
 
-    commandParser.addFlag("no-executables", negatable: false,
+    argParser.addFlag("no-executables", negatable: false,
         help: "Do not put executables on PATH.");
 
-    commandParser.addOption("executable", abbr: "x",
+    argParser.addOption("executable", abbr: "x",
         help: "Executable(s) to place on PATH.",
         allowMultiple: true);
 
-    commandParser.addFlag("overwrite", negatable: false,
+    argParser.addFlag("overwrite", negatable: false,
         help: "Overwrite executables from other packages with the same name.");
   }
 
-  Future onRun() {
+  Future run() {
     // Default to `null`, which means all executables.
     var executables;
-    if (commandOptions.wasParsed("executable")) {
-      if (commandOptions.wasParsed("no-executables")) {
-        usageError("Cannot pass both --no-executables and --executable.");
+    if (argResults.wasParsed("executable")) {
+      if (argResults.wasParsed("no-executables")) {
+        usageException("Cannot pass both --no-executables and --executable.");
       }
 
-      executables = commandOptions["executable"];
-    } else if (commandOptions["no-executables"]) {
+      executables = argResults["executable"];
+    } else if (argResults["no-executables"]) {
       // An empty list means no executables.
       executables = [];
     }
 
-    var overwrite = commandOptions["overwrite"];
-    var args = commandOptions.rest;
+    var overwrite = argResults["overwrite"];
+    var args = argResults.rest;
 
     readArg([String error]) {
-      if (args.isEmpty) usageError(error);
+      if (args.isEmpty) usageException(error);
       var arg = args.first;
       args = args.skip(1);
       return arg;
@@ -63,10 +63,10 @@
       if (args.isEmpty) return;
       var unexpected = args.map((arg) => '"$arg"');
       var arguments = pluralize("argument", unexpected.length);
-      usageError("Unexpected $arguments ${toSentence(unexpected)}.");
+      usageException("Unexpected $arguments ${toSentence(unexpected)}.");
     }
 
-    switch (commandOptions["source"]) {
+    switch (argResults["source"]) {
       case "git":
         var repo = readArg("No Git repository given.");
         // TODO(rnystrom): Allow passing in a Git ref too.
@@ -83,7 +83,7 @@
           try {
             constraint = new VersionConstraint.parse(readArg());
           } on FormatException catch (error) {
-            usageError(error.message);
+            usageException(error.message);
           }
         }
 
diff --git a/sdk/lib/_internal/pub/lib/src/command/global_deactivate.dart b/sdk/lib/_internal/pub/lib/src/command/global_deactivate.dart
index 4e96655..595f6ff 100644
--- a/sdk/lib/_internal/pub/lib/src/command/global_deactivate.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/global_deactivate.dart
@@ -12,27 +12,25 @@
 
 /// Handles the `global deactivate` pub command.
 class GlobalDeactivateCommand extends PubCommand {
+  String get name => "deactivate";
   String get description => "Remove a previously activated package.";
-  String get usage => "pub global deactivate <package>";
-  bool get takesArguments => true;
+  String get invocation => "pub global deactivate <package>";
 
-  Future onRun() {
+  void run() {
     // Make sure there is a package.
-    if (commandOptions.rest.isEmpty) {
-      usageError("No package to deactivate given.");
+    if (argResults.rest.isEmpty) {
+      usageException("No package to deactivate given.");
     }
 
     // Don't allow extra arguments.
-    if (commandOptions.rest.length > 1) {
-      var unexpected = commandOptions.rest.skip(1).map((arg) => '"$arg"');
+    if (argResults.rest.length > 1) {
+      var unexpected = argResults.rest.skip(1).map((arg) => '"$arg"');
       var arguments = pluralize("argument", unexpected.length);
-      usageError("Unexpected $arguments ${toSentence(unexpected)}.");
+      usageException("Unexpected $arguments ${toSentence(unexpected)}.");
     }
 
-    if (!globals.deactivate(commandOptions.rest.first)) {
-      dataError("No active package ${log.bold(commandOptions.rest.first)}.");
+    if (!globals.deactivate(argResults.rest.first)) {
+      dataError("No active package ${log.bold(argResults.rest.first)}.");
     }
-
-    return null;
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command/global_list.dart b/sdk/lib/_internal/pub/lib/src/command/global_list.dart
index c498b42..1de1073 100644
--- a/sdk/lib/_internal/pub/lib/src/command/global_list.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/global_list.dart
@@ -10,12 +10,13 @@
 
 /// Handles the `global list` pub command.
 class GlobalListCommand extends PubCommand {
-  bool get allowTrailingOptions => false;
+  String get name => "list";
   String get description => 'List globally activated packages.';
-  String get usage => 'pub global list';
+  String get invocation => 'pub global list';
+  bool get allowTrailingOptions => false;
+  bool get takesArguments => false;
 
-  Future onRun() {
+  void run() {
     globals.listActivePackages();
-    return null;
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command/global_run.dart b/sdk/lib/_internal/pub/lib/src/command/global_run.dart
index 06783e5..7fc07a7 100644
--- a/sdk/lib/_internal/pub/lib/src/command/global_run.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/global_run.dart
@@ -15,28 +15,28 @@
 
 /// Handles the `global run` pub command.
 class GlobalRunCommand extends PubCommand {
-  bool get takesArguments => true;
-  bool get allowTrailingOptions => false;
+  String get name => "run";
   String get description =>
       "Run an executable from a globally activated package.\n"
       "NOTE: We are currently optimizing this command's startup time.";
-  String get usage => "pub global run <package>:<executable> [args...]";
+  String get invocation => "pub global run <package>:<executable> [args...]";
+  bool get allowTrailingOptions => false;
 
   /// The mode for barback transformers.
-  BarbackMode get mode => new BarbackMode(commandOptions["mode"]);
+  BarbackMode get mode => new BarbackMode(argResults["mode"]);
 
   GlobalRunCommand() {
-    commandParser.addOption("mode", defaultsTo: "release",
+    argParser.addOption("mode", defaultsTo: "release",
         help: 'Mode to run transformers in.');
   }
 
-  Future onRun() async {
-    if (commandOptions.rest.isEmpty) {
-      usageError("Must specify an executable to run.");
+  Future run() async {
+    if (argResults.rest.isEmpty) {
+      usageException("Must specify an executable to run.");
     }
 
     var package;
-    var executable = commandOptions.rest[0];
+    var executable = argResults.rest[0];
     if (executable.contains(":")) {
       var parts = split1(executable, ":");
       package = parts[0];
@@ -46,11 +46,11 @@
       package = executable;
     }
 
-    var args = commandOptions.rest.skip(1).toList();
+    var args = argResults.rest.skip(1).toList();
     if (p.split(executable).length > 1) {
       // TODO(nweiz): Use adjacent strings when the new async/await compiler
       // lands.
-      usageError('Cannot run an executable in a subdirectory of a global ' +
+      usageException('Cannot run an executable in a subdirectory of a global ' +
           'package.');
     }
 
diff --git a/sdk/lib/_internal/pub/lib/src/command/help.dart b/sdk/lib/_internal/pub/lib/src/command/help.dart
deleted file mode 100644
index d7df223..0000000
--- a/sdk/lib/_internal/pub/lib/src/command/help.dart
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library pub.command.help;
-
-import 'dart:async';
-
-import '../command.dart';
-
-/// Handles the `help` pub command.
-class HelpCommand extends PubCommand {
-  String get description => "Display help information for Pub.";
-  String get usage => "pub help [command]";
-  bool get takesArguments => true;
-
-  Future onRun() {
-    // Show the default help if no command was specified.
-    if (commandOptions.rest.isEmpty) {
-      PubCommand.printGlobalUsage();
-      return null;
-    }
-
-    // Walk the command tree to show help for the selected command or
-    // subcommand.
-    var commands = PubCommand.mainCommands;
-    var command = null;
-    var commandString = "pub";
-
-    for (var name in commandOptions.rest) {
-      if (commands.isEmpty) {
-        command.usageError(
-            'Command "$commandString" does not expect a subcommand.');
-      }
-
-      if (commands[name] == null) {
-        if (command == null) {
-          PubCommand.usageErrorWithCommands(commands,
-              'Could not find a command named "$name".');
-        }
-
-        command.usageError(
-            'Could not find a subcommand named "$name" for "$commandString".');
-      }
-
-      command = commands[name];
-      commands = command.subcommands;
-      commandString += " $name";
-    }
-
-    command.printUsage();
-    return null;
-  }
-}
diff --git a/sdk/lib/_internal/pub/lib/src/command/lish.dart b/sdk/lib/_internal/pub/lib/src/command/lish.dart
index 2b0a506..6783604 100644
--- a/sdk/lib/_internal/pub/lib/src/command/lish.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/lish.dart
@@ -20,16 +20,18 @@
 
 /// Handles the `lish` and `publish` pub commands.
 class LishCommand extends PubCommand {
+  String get name => "publish";
   String get description => "Publish the current package to pub.dartlang.org.";
-  String get usage => "pub publish [options]";
+  String get invocation => "pub publish [options]";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-lish.html";
   List<String> get aliases => const ["lish", "lush"];
+  bool get takesArguments => false;
 
   /// The URL of the server to which to upload the package.
   Uri get server {
     // An explicit argument takes precedence.
-    if (commandOptions.wasParsed('server')) {
-      return Uri.parse(commandOptions['server']);
+    if (argResults.wasParsed('server')) {
+      return Uri.parse(argResults['server']);
     }
 
     // Otherwise, use the one specified in the pubspec.
@@ -42,17 +44,17 @@
   }
 
   /// Whether the publish is just a preview.
-  bool get dryRun => commandOptions['dry-run'];
+  bool get dryRun => argResults['dry-run'];
 
   /// Whether the publish requires confirmation.
-  bool get force => commandOptions['force'];
+  bool get force => argResults['force'];
 
   LishCommand() {
-    commandParser.addFlag('dry-run', abbr: 'n', negatable: false,
+    argParser.addFlag('dry-run', abbr: 'n', negatable: false,
         help: 'Validate but do not publish the package.');
-    commandParser.addFlag('force', abbr: 'f', negatable: false,
+    argParser.addFlag('force', abbr: 'f', negatable: false,
         help: 'Publish without confirmation if there are no errors.');
-    commandParser.addOption('server', defaultsTo: HostedSource.defaultUrl,
+    argParser.addOption('server', defaultsTo: HostedSource.defaultUrl,
         help: 'The package server to which to upload this package.');
   }
 
@@ -106,9 +108,9 @@
     });
   }
 
-  Future onRun() {
+  Future run() {
     if (force && dryRun) {
-      usageError('Cannot use both --force and --dry-run.');
+      usageException('Cannot use both --force and --dry-run.');
     }
 
     if (entrypoint.root.pubspec.isPrivate) {
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
index ae6c9c3..9f6a1e2 100644
--- a/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart
@@ -14,17 +14,19 @@
 
 /// Handles the `list-package-dirs` pub command.
 class ListPackageDirsCommand extends PubCommand {
+  String get name => "list-package-dirs";
   String get description => "Print local paths to dependencies.";
-  String get usage => "pub list-package-dirs";
+  String get invocation => "pub list-package-dirs";
+  bool get takesArguments => false;
   bool get hidden => true;
 
   ListPackageDirsCommand() {
-    commandParser.addOption("format",
+    argParser.addOption("format",
         help: "How output should be displayed.",
         allowed: ["json"]);
   }
 
-  Future onRun() {
+  Future run() {
     log.json.enabled = true;
 
     if (!entrypoint.lockFileExists) {
diff --git a/sdk/lib/_internal/pub/lib/src/command/run.dart b/sdk/lib/_internal/pub/lib/src/command/run.dart
index 42a0d37..eca10b9 100644
--- a/sdk/lib/_internal/pub/lib/src/command/run.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/run.dart
@@ -16,27 +16,27 @@
 
 /// Handles the `run` pub command.
 class RunCommand extends PubCommand {
-  bool get takesArguments => true;
-  bool get allowTrailingOptions => false;
+  String get name => "run";
   String get description => "Run an executable from a package.\n"
       "NOTE: We are currently optimizing this command's startup time.";
-  String get usage => "pub run <executable> [args...]";
+  String get invocation => "pub run <executable> [args...]";
+  bool get allowTrailingOptions => false;
 
   RunCommand() {
-    commandParser.addOption("mode",
+    argParser.addOption("mode",
         help: 'Mode to run transformers in.\n'
               '(defaults to "release" for dependencies, "debug" for '
                 'entrypoint)');
   }
 
-  Future onRun() async {
-    if (commandOptions.rest.isEmpty) {
-      usageError("Must specify an executable to run.");
+  Future run() async {
+    if (argResults.rest.isEmpty) {
+      usageException("Must specify an executable to run.");
     }
 
     var package = entrypoint.root.name;
-    var executable = commandOptions.rest[0];
-    var args = commandOptions.rest.skip(1).toList();
+    var executable = argResults.rest[0];
+    var args = argResults.rest.skip(1).toList();
 
     // A command like "foo:bar" runs the "bar" script from the "foo" package.
     // If there is no colon prefix, default to the root package.
@@ -48,14 +48,14 @@
       if (p.split(executable).length > 1) {
       // TODO(nweiz): Use adjacent strings when the new async/await compiler
       // lands.
-        usageError("Cannot run an executable in a subdirectory of a " +
+        usageException("Cannot run an executable in a subdirectory of a " +
             "dependency.");
       }
     }
 
     var mode;
-    if (commandOptions['mode'] != null) {
-      mode = new BarbackMode(commandOptions['mode']);
+    if (argResults['mode'] != null) {
+      mode = new BarbackMode(argResults['mode']);
     } else if (package == entrypoint.root.name) {
       mode = BarbackMode.DEBUG;
     } else {
diff --git a/sdk/lib/_internal/pub/lib/src/command/serve.dart b/sdk/lib/_internal/pub/lib/src/command/serve.dart
index 1d7db15..32074fc 100644
--- a/sdk/lib/_internal/pub/lib/src/command/serve.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/serve.dart
@@ -19,35 +19,36 @@
 
 /// Handles the `serve` pub command.
 class ServeCommand extends BarbackCommand {
+  String get name => "serve";
   String get description =>
       'Run a local web development server.\n\n'
       'By default, this serves "web/" and "test/", but an explicit list of \n'
       'directories to serve can be provided as well.';
-  String get usage => "pub serve [directories...]";
+  String get invocation => "pub serve [directories...]";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-serve.html";
 
   PubPackageProvider _provider;
 
-  String get hostname => commandOptions['hostname'];
+  String get hostname => argResults['hostname'];
 
   /// The base port for the servers.
   ///
   /// This will print a usage error and exit if the specified port is invalid.
-  int get port => parseInt(commandOptions['port'], 'port');
+  int get port => parseInt(argResults['port'], 'port');
 
   /// The port for the admin UI.
   ///
   /// This will print a usage error and exit if the specified port is invalid.
   int get adminPort {
-    var adminPort = commandOptions['admin-port'];
+    var adminPort = argResults['admin-port'];
     return adminPort == null ? null : parseInt(adminPort, 'admin port');
   }
 
   /// `true` if Dart entrypoints should be compiled to JavaScript.
-  bool get useDart2JS => commandOptions['dart2js'];
+  bool get useDart2JS => argResults['dart2js'];
 
   /// `true` if the admin server URL should be displayed on startup.
-  bool get logAdminUrl => commandOptions['log-admin-url'];
+  bool get logAdminUrl => argResults['log-admin-url'];
 
   BarbackMode get defaultMode => BarbackMode.DEBUG;
 
@@ -58,9 +59,9 @@
   final _completer = new Completer();
 
   ServeCommand() {
-    commandParser.addOption('hostname', defaultsTo: 'localhost',
+    argParser.addOption('hostname', defaultsTo: 'localhost',
         help: 'The hostname to listen on.');
-    commandParser.addOption('port', defaultsTo: '8080',
+    argParser.addOption('port', defaultsTo: '8080',
         help: 'The base port to listen on.');
 
     // TODO(rnystrom): A hidden option to print the URL that the admin server
@@ -68,23 +69,23 @@
     // Socket interface, we don't want to show it to users, but the tests and
     // Editor need this logged to know what port to bind to.
     // Remove this (and always log) when #16954 is fixed.
-    commandParser.addFlag('log-admin-url', defaultsTo: false, hide: true);
+    argParser.addFlag('log-admin-url', defaultsTo: false, hide: true);
 
     // TODO(nweiz): Make this public when issue 16954 is fixed.
-    commandParser.addOption('admin-port', hide: true);
+    argParser.addOption('admin-port', hide: true);
 
-    commandParser.addFlag('dart2js', defaultsTo: true,
+    argParser.addFlag('dart2js', defaultsTo: true,
         help: 'Compile Dart to JavaScript.');
-    commandParser.addFlag('force-poll', defaultsTo: false,
+    argParser.addFlag('force-poll', defaultsTo: false,
         help: 'Force the use of a polling filesystem watcher.');
   }
 
   Future onRunTransformerCommand() async {
-    var port = parseInt(commandOptions['port'], 'port');
-    var adminPort = commandOptions['admin-port'] == null ? null :
-        parseInt(commandOptions['admin-port'], 'admin port');
+    var port = parseInt(argResults['port'], 'port');
+    var adminPort = argResults['admin-port'] == null ? null :
+        parseInt(argResults['admin-port'], 'admin port');
 
-    var watcherType = commandOptions['force-poll'] ?
+    var watcherType = argResults['force-poll'] ?
         WatcherType.POLLING : WatcherType.AUTO;
 
     var environment = await AssetEnvironment.create(entrypoint, mode,
diff --git a/sdk/lib/_internal/pub/lib/src/command/upgrade.dart b/sdk/lib/_internal/pub/lib/src/command/upgrade.dart
index 841a3ef..bd2389d 100644
--- a/sdk/lib/_internal/pub/lib/src/command/upgrade.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/upgrade.dart
@@ -12,27 +12,27 @@
 
 /// Handles the `upgrade` pub command.
 class UpgradeCommand extends PubCommand {
+  String get name => "upgrade";
   String get description =>
       "Upgrade the current package's dependencies to latest versions.";
-  String get usage => "pub upgrade [dependencies...]";
+  String get invocation => "pub upgrade [dependencies...]";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-upgrade.html";
   List<String> get aliases => const ["update"];
-  bool get takesArguments => true;
 
-  bool get isOffline => commandOptions['offline'];
+  bool get isOffline => argResults['offline'];
 
   UpgradeCommand() {
-    commandParser.addFlag('offline',
+    argParser.addFlag('offline',
         help: 'Use cached packages instead of accessing the network.');
 
-    commandParser.addFlag('dry-run', abbr: 'n', negatable: false,
+    argParser.addFlag('dry-run', abbr: 'n', negatable: false,
         help: "Report what dependencies would change but don't change any.");
   }
 
-  Future onRun() async {
-    var dryRun = commandOptions['dry-run'];
+  Future run() async {
+    var dryRun = argResults['dry-run'];
     await entrypoint.acquireDependencies(SolveType.UPGRADE,
-        useLatest: commandOptions.rest, dryRun: dryRun);
+        useLatest: argResults.rest, dryRun: dryRun);
     if (isOffline) {
       log.warning("Warning: Upgrading when offline may not update you to the "
                   "latest versions of your dependencies.");
diff --git a/sdk/lib/_internal/pub/lib/src/command/uploader.dart b/sdk/lib/_internal/pub/lib/src/command/uploader.dart
index f74915d..b66d7cc 100644
--- a/sdk/lib/_internal/pub/lib/src/command/uploader.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/uploader.dart
@@ -19,31 +19,31 @@
 
 /// Handles the `uploader` pub command.
 class UploaderCommand extends PubCommand {
+  String get name => "uploader";
   String get description =>
       "Manage uploaders for a package on pub.dartlang.org.";
-  String get usage => "pub uploader [options] {add/remove} <email>";
+  String get invocation => "pub uploader [options] {add/remove} <email>";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-uploader.html";
-  bool get takesArguments => true;
 
   /// The URL of the package hosting server.
-  Uri get server => Uri.parse(commandOptions['server']);
+  Uri get server => Uri.parse(argResults['server']);
 
   UploaderCommand() {
-    commandParser.addOption('server', defaultsTo: HostedSource.defaultUrl,
+    argParser.addOption('server', defaultsTo: HostedSource.defaultUrl,
         help: 'The package server on which the package is hosted.');
-    commandParser.addOption('package',
+    argParser.addOption('package',
         help: 'The package whose uploaders will be modified.\n'
               '(defaults to the current package)');
   }
 
-  Future onRun() {
-    if (commandOptions.rest.isEmpty) {
+  Future run() {
+    if (argResults.rest.isEmpty) {
       log.error('No uploader command given.');
       this.printUsage();
       return flushThenExit(exit_codes.USAGE);
     }
 
-    var rest = commandOptions.rest.toList();
+    var rest = argResults.rest.toList();
 
     // TODO(rnystrom): Use subcommands for these.
     var command = rest.removeAt(0);
@@ -58,7 +58,7 @@
     }
 
     return new Future.sync(() {
-      var package = commandOptions['package'];
+      var package = argResults['package'];
       if (package != null) return package;
       return new Entrypoint(path.current, cache).root.name;
     }).then((package) {
diff --git a/sdk/lib/_internal/pub/lib/src/command/version.dart b/sdk/lib/_internal/pub/lib/src/command/version.dart
index bab6c6b..de40572 100644
--- a/sdk/lib/_internal/pub/lib/src/command/version.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/version.dart
@@ -4,19 +4,17 @@
 
 library pub.command.version;
 
-import 'dart:async';
-
 import '../command.dart';
 import '../log.dart' as log;
 import '../sdk.dart' as sdk;
 
 /// Handles the `version` pub command.
 class VersionCommand extends PubCommand {
+  String get name => "version";
   String get description => "Print pub version.";
-  String get usage => "pub version";
+  String get invocation => "pub version";
 
-  Future onRun() {
+  void run() {
     log.message("Pub ${sdk.version}");
-    return null;
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command_runner.dart b/sdk/lib/_internal/pub/lib/src/command_runner.dart
new file mode 100644
index 0000000..287a469
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/command_runner.dart
@@ -0,0 +1,182 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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_runner;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:args/args.dart';
+import 'package:args/command_runner.dart';
+import 'package:http/http.dart' as http;
+import 'package:stack_trace/stack_trace.dart';
+
+import 'command/build.dart';
+import 'command/cache.dart';
+import 'command/deps.dart';
+import 'command/downgrade.dart';
+import 'command/get.dart';
+import 'command/global.dart';
+import 'command/lish.dart';
+import 'command/list_package_dirs.dart';
+import 'command/run.dart';
+import 'command/serve.dart';
+import 'command/upgrade.dart';
+import 'command/uploader.dart';
+import 'command/version.dart';
+import 'exceptions.dart';
+import 'exit_codes.dart' as exit_codes;
+import 'http.dart';
+import 'io.dart';
+import 'log.dart' as log;
+import 'sdk.dart' as sdk;
+import 'solver/version_solver.dart';
+import 'utils.dart';
+
+class PubCommandRunner extends CommandRunner {
+  String get usageFooter => "See http://dartlang.org/tools/pub for detailed "
+      "documentation.";
+
+  PubCommandRunner()
+      : super("pub", "Pub is a package manager for Dart.") {
+    argParser.addFlag('version', negatable: false,
+        help: 'Print pub version.');
+    argParser.addFlag('trace',
+         help: 'Print debugging information when an error occurs.');
+    argParser.addOption('verbosity',
+        help: 'Control output verbosity.',
+        allowed: ['normal', 'io', 'solver', 'all'],
+        allowedHelp: {
+          'normal': 'Show errors, warnings, and user messages.',
+          'io':     'Also show IO operations.',
+          'solver': 'Show steps during version resolution.',
+          'all':    'Show all output including internal tracing messages.'
+        });
+    argParser.addFlag('verbose', abbr: 'v', negatable: false,
+        help: 'Shortcut for "--verbosity=all".');
+    argParser.addFlag('with-prejudice', hide: !isAprilFools,
+        negatable: false, help: 'Execute commands with prejudice.');
+    argParser.addFlag('package-symlinks', hide: true, negatable: true,
+        defaultsTo: true);
+
+    addCommand(new BuildCommand());
+    addCommand(new CacheCommand());
+    addCommand(new DepsCommand());
+    addCommand(new DowngradeCommand());
+    addCommand(new GlobalCommand());
+    addCommand(new GetCommand());
+    addCommand(new ListPackageDirsCommand());
+    addCommand(new LishCommand());
+    addCommand(new RunCommand());
+    addCommand(new ServeCommand());
+    addCommand(new UpgradeCommand());
+    addCommand(new UploaderCommand());
+    addCommand(new VersionCommand());
+  }
+
+  Future run(List<String> arguments) async {
+    var options;
+    try {
+      options = super.parse(arguments);
+    } on UsageException catch (error) {
+      log.error(error.message);
+      await flushThenExit(exit_codes.USAGE);
+    }
+    await runCommand(options);
+  }
+
+  Future runCommand(ArgResults options) async {
+    log.withPrejudice = options['with-prejudice'];
+
+    if (options['version']) {
+      log.message('Pub ${sdk.version}');
+      return;
+    }
+
+    if (options['trace']) {
+      log.recordTranscript();
+    }
+
+    switch (options['verbosity']) {
+      case 'normal': log.verbosity = log.Verbosity.NORMAL; break;
+      case 'io':     log.verbosity = log.Verbosity.IO; break;
+      case 'solver': log.verbosity = log.Verbosity.SOLVER; break;
+      case 'all':    log.verbosity = log.Verbosity.ALL; break;
+      default:
+        // No specific verbosity given, so check for the shortcut.
+        if (options['verbose']) log.verbosity = log.Verbosity.ALL;
+        break;
+    }
+
+    log.fine('Pub ${sdk.version}');
+
+    await _validatePlatform();
+
+    var captureStackChains =
+        options['trace'] ||
+        options['verbose'] ||
+        options['verbosity'] == 'all';
+
+    try {
+      await captureErrors(() => super.runCommand(options),
+          captureStackChains: captureStackChains);
+
+      // Explicitly exit on success to ensure that any dangling dart:io handles
+      // don't cause the process to never terminate.
+      await flushThenExit(exit_codes.SUCCESS);
+    } catch (error, chain) {
+      log.exception(error, chain);
+
+      if (options['trace']) {
+        log.dumpTranscript();
+      } else if (!isUserFacingException(error)) {
+        log.error("""
+This is an unexpected error. Please run
+
+    pub --trace ${options.arguments.map((arg) => "'$arg'").join(' ')}
+
+and include the results in a bug report on http://dartbug.com/new.
+""");
+      }
+
+      await flushThenExit(_chooseExitCode(error));
+    }
+  }
+
+  void printUsage() {
+    log.message(usage);
+  }
+
+  /// Returns the appropriate exit code for [exception], falling back on 1 if no
+  /// appropriate exit code could be found.
+  int _chooseExitCode(exception) {
+    while (exception is WrappedException) exception = exception.innerError;
+
+    if (exception is HttpException || exception is http.ClientException ||
+        exception is SocketException || exception is PubHttpException ||
+        exception is DependencyNotFoundException) {
+      return exit_codes.UNAVAILABLE;
+    } else if (exception is FormatException || exception is DataException) {
+      return exit_codes.DATA;
+    } else if (exception is UsageException) {
+      return exit_codes.USAGE;
+    } else {
+      return 1;
+    }
+  }
+
+  /// Checks that pub is running on a supported platform.
+  ///
+  /// If it isn't, it prints an error message and exits. Completes when the
+  /// validation is done.
+  Future _validatePlatform() async {
+    if (Platform.operatingSystem != 'windows') return;
+
+    var result = await runProcess('ver', []);
+    if (result.stdout.join('\n').contains('XP')) {
+      log.error('Sorry, but pub is not supported on Windows XP.');
+      await flushThenExit(exit_codes.USAGE);
+    }
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/entrypoint.dart b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
index 811ae0b..d207147 100644
--- a/sdk/lib/_internal/pub/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
@@ -143,15 +143,14 @@
     var packageGraph = await loadPackageGraph(result);
     packageGraph.loadTransformerCache().clearIfOutdated(result.changedPackages);
 
-    // TODO(nweiz): Use await here when
-    // https://github.com/dart-lang/async_await/issues/51 is fixed.
-    return precompileDependencies(changed: result.changedPackages).then((_) {
-      return precompileExecutables(changed: result.changedPackages);
-    }).catchError((error, stackTrace) {
+    try {
+      await precompileDependencies(changed: result.changedPackages);
+      await precompileExecutables(changed: result.changedPackages);
+    } catch (error, stackTrace) {
       // Just log exceptions here. Since the method is just about acquiring
       // dependencies, it shouldn't fail unless that fails.
       log.exception(error, stackTrace);
-    });
+    }
   }
 
   /// Precompile any transformed dependencies of the entrypoint.
@@ -201,42 +200,43 @@
 
     if (dependenciesToPrecompile.isEmpty) return;
 
-    await log.progress("Precompiling dependencies", () async {
-      var packagesToLoad =
-          unionAll(dependenciesToPrecompile.map(graph.transitiveDependencies))
-          .map((package) => package.name).toSet();
+    try {
+      await log.progress("Precompiling dependencies", () async {
+        var packagesToLoad =
+            unionAll(dependenciesToPrecompile.map(graph.transitiveDependencies))
+            .map((package) => package.name).toSet();
 
-      var environment = await AssetEnvironment.create(this, BarbackMode.DEBUG,
-          packages: packagesToLoad, useDart2JS: false);
+        var environment = await AssetEnvironment.create(this, BarbackMode.DEBUG,
+            packages: packagesToLoad, useDart2JS: false);
 
-      /// Ignore barback errors since they'll be emitted via [getAllAssets]
-      /// below.
-      environment.barback.errors.listen((_) {});
+        /// Ignore barback errors since they'll be emitted via [getAllAssets]
+        /// below.
+        environment.barback.errors.listen((_) {});
 
-      // TODO(nweiz): only get assets from [dependenciesToPrecompile] so as not
-      // to trigger unnecessary lazy transformers.
-      var assets = await environment.barback.getAllAssets();
-      await waitAndPrintErrors(assets.map((asset) async {
-        if (!dependenciesToPrecompile.contains(asset.id.package)) return;
+        // TODO(nweiz): only get assets from [dependenciesToPrecompile] so as
+        // not to trigger unnecessary lazy transformers.
+        var assets = await environment.barback.getAllAssets();
+        await waitAndPrintErrors(assets.map((asset) async {
+          if (!dependenciesToPrecompile.contains(asset.id.package)) return;
 
-        var destPath = path.join(
-            depsDir, asset.id.package, path.fromUri(asset.id.path));
-        ensureDir(path.dirname(destPath));
-        await createFileFromStream(asset.read(), destPath);
-      }));
+          var destPath = path.join(
+              depsDir, asset.id.package, path.fromUri(asset.id.path));
+          ensureDir(path.dirname(destPath));
+          await createFileFromStream(asset.read(), destPath);
+        }));
 
-      log.message("Precompiled " +
-          toSentence(ordered(dependenciesToPrecompile).map(log.bold)) + ".");
-    }).catchError((error) {
-      // TODO(nweiz): Do this in a catch clause when async_await supports
-      // "rethrow" (https://github.com/dart-lang/async_await/issues/46).
+        log.message("Precompiled " +
+            toSentence(ordered(dependenciesToPrecompile).map(log.bold)) + ".");
+      });
+    } catch (_) {
       // TODO(nweiz): When barback does a better job of associating errors with
       // assets (issue 19491), catch and handle compilation errors on a
       // per-package basis.
-      dependenciesToPrecompile.forEach((package) =>
-          deleteEntry(path.join(depsDir, package)));
-      throw error;
-    });
+      for (var package in dependenciesToPrecompile) {
+        deleteEntry(path.join(depsDir, package));
+      }
+      rethrow;
+    }
   }
 
   /// Precompiles all executables from dependencies that don't transitively
diff --git a/sdk/lib/_internal/pub/lib/src/exceptions.dart b/sdk/lib/_internal/pub/lib/src/exceptions.dart
index 3f287f0..65dff3f 100644
--- a/sdk/lib/_internal/pub/lib/src/exceptions.dart
+++ b/sdk/lib/_internal/pub/lib/src/exceptions.dart
@@ -8,6 +8,7 @@
 import 'dart:isolate';
 
 import "package:analyzer/analyzer.dart";
+import 'package:args/command_runner.dart';
 import "package:http/http.dart" as http;
 import "package:stack_trace/stack_trace.dart";
 import "package:yaml/yaml.dart";
@@ -61,17 +62,6 @@
       : super(innerError.toString(), innerError, innerTrace);
 }
 
-/// A class for command usage exceptions.
-class UsageException extends ApplicationException {
-  /// The command usage information.
-  String _usage;
-
-  UsageException(String message, this._usage)
-      : super(message);
-
-  String toString() => "$message\n\n$_usage";
-}
-
 /// A class for errors in a command's input data.
 ///
 /// This corresponds to the [exit_codes.DATA] exit code.
@@ -124,5 +114,6 @@
     error is IsolateSpawnException ||
     error is IOException ||
     error is http.ClientException ||
-    error is YamlException;
+    error is YamlException ||
+    error is UsageException;
 }
diff --git a/sdk/lib/_internal/pub/lib/src/executable.dart b/sdk/lib/_internal/pub/lib/src/executable.dart
index 3810592..966b68f 100644
--- a/sdk/lib/_internal/pub/lib/src/executable.dart
+++ b/sdk/lib/_internal/pub/lib/src/executable.dart
@@ -106,32 +106,9 @@
     server = await environment.servePackageBinDirectory(package);
   }
 
-  // TODO(rnystrom): Use try/catch here when
-  // https://github.com/dart-lang/async_await/issues/4 is fixed.
-  return environment.barback.getAssetById(id).then((_) async {
-    var vmArgs = [];
-
-    // Run in checked mode.
-    // TODO(rnystrom): Make this configurable.
-    vmArgs.add("--checked");
-
-    // Get the URL of the executable, relative to the server's root directory.
-    var relativePath = p.url.relative(assetPath,
-        from: p.url.joinAll(p.split(server.rootDirectory)));
-    vmArgs.add(server.url.resolve(relativePath).toString());
-    vmArgs.addAll(args);
-
-    var process = await Process.start(Platform.executable, vmArgs);
-    // Note: we're not using process.std___.pipe(std___) here because
-    // that prevents pub from also writing to the output streams.
-    process.stderr.listen(stderr.add);
-    process.stdout.listen(stdout.add);
-    stdin.listen(process.stdin.add);
-
-    return process.exitCode;
-  }).catchError((error, stackTrace) {
-    if (error is! AssetNotFoundException) throw error;
-
+  try {
+    await environment.barback.getAssetById(id);
+  } on AssetNotFoundException catch (error, stackTrace) {
     var message = "Could not find ${log.bold(executable + ".dart")}";
     if (package != entrypoint.root.name) {
       message += " in package ${log.bold(server.package)}";
@@ -140,7 +117,28 @@
     log.error("$message.");
     log.fine(new Chain.forTrace(stackTrace));
     return exit_codes.NO_INPUT;
-  });
+  }
+
+  var vmArgs = [];
+
+  // Run in checked mode.
+  // TODO(rnystrom): Make this configurable.
+  vmArgs.add("--checked");
+
+  // Get the URL of the executable, relative to the server's root directory.
+  var relativePath = p.url.relative(assetPath,
+      from: p.url.joinAll(p.split(server.rootDirectory)));
+  vmArgs.add(server.url.resolve(relativePath).toString());
+  vmArgs.addAll(args);
+
+  var process = await Process.start(Platform.executable, vmArgs);
+  // Note: we're not using process.std___.pipe(std___) here because
+  // that prevents pub from also writing to the output streams.
+  process.stderr.listen(stderr.add);
+  process.stdout.listen(stdout.add);
+  stdin.listen(process.stdin.add);
+
+  return process.exitCode;
 }
 
 /// Runs the snapshot at [path] with [args] and hooks its stdout, stderr, and
diff --git a/sdk/lib/_internal/pub/lib/src/global_packages.dart b/sdk/lib/_internal/pub/lib/src/global_packages.dart
index 2a20aca..6ce58a7 100644
--- a/sdk/lib/_internal/pub/lib/src/global_packages.dart
+++ b/sdk/lib/_internal/pub/lib/src/global_packages.dart
@@ -282,52 +282,46 @@
   /// Finds the active package with [name].
   ///
   /// Returns an [Entrypoint] loaded with the active package if found.
-  Future<Entrypoint> find(String name) {
-    // TODO(rnystrom): Use async/await here when on __ catch is supported.
-    // See: https://github.com/dart-lang/async_await/issues/27
-    return new Future.sync(() {
-      var lockFilePath = _getLockFilePath(name);
-      var lockFile;
+  Future<Entrypoint> find(String name) async {
+    var lockFilePath = _getLockFilePath(name);
+    var lockFile;
+    try {
+      lockFile = new LockFile.load(lockFilePath, cache.sources);
+    } on IOException catch (error) {
+      var oldLockFilePath = p.join(_directory, '$name.lock');
       try {
-        lockFile = new LockFile.load(lockFilePath, cache.sources);
+        // TODO(nweiz): This looks for Dart 1.6's old lockfile location.
+        // Remove it when Dart 1.6 is old enough that we don't think anyone
+        // will have these lockfiles anymore (issue 20703).
+        lockFile = new LockFile.load(oldLockFilePath, cache.sources);
       } on IOException catch (error) {
-        var oldLockFilePath = p.join(_directory, '$name.lock');
-        try {
-          // TODO(nweiz): This looks for Dart 1.6's old lockfile location.
-          // Remove it when Dart 1.6 is old enough that we don't think anyone
-          // will have these lockfiles anymore (issue 20703).
-          lockFile = new LockFile.load(oldLockFilePath, cache.sources);
-        } on IOException catch (error) {
-          // If we couldn't read the lock file, it's not activated.
-          dataError("No active package ${log.bold(name)}.");
-        }
-
-        // Move the old lockfile to its new location.
-        ensureDir(p.dirname(lockFilePath));
-        new File(oldLockFilePath).renameSync(lockFilePath);
+        // If we couldn't read the lock file, it's not activated.
+        dataError("No active package ${log.bold(name)}.");
       }
 
-      // Load the package from the cache.
-      var id = lockFile.packages[name];
-      lockFile.packages.remove(name);
+      // Move the old lockfile to its new location.
+      ensureDir(p.dirname(lockFilePath));
+      new File(oldLockFilePath).renameSync(lockFilePath);
+    }
 
-      var source = cache.sources[id.source];
-      if (source is CachedSource) {
-        // For cached sources, the package itself is in the cache and the
-        // lockfile is the one we just loaded.
-        return cache.sources[id.source].getDirectory(id)
-            .then((dir) => new Package.load(name, dir, cache.sources))
-            .then((package) {
-          return new Entrypoint.inMemory(package, lockFile, cache);
-        });
-      }
+    // Load the package from the cache.
+    var id = lockFile.packages[name];
+    lockFile.packages.remove(name);
 
-      // For uncached sources (i.e. path), the ID just points to the real
-      // directory for the package.
-      assert(id.source == "path");
-      return new Entrypoint(PathSource.pathFromDescription(id.description),
-          cache);
-    });
+    var source = cache.sources[id.source];
+    if (source is CachedSource) {
+      // For cached sources, the package itself is in the cache and the
+      // lockfile is the one we just loaded.
+      var dir = await cache.sources[id.source].getDirectory(id);
+      var package = new Package.load(name, dir, cache.sources);
+      return new Entrypoint.inMemory(package, lockFile, cache);
+    }
+
+    // For uncached sources (i.e. path), the ID just points to the real
+    // directory for the package.
+    assert(id.source == "path");
+    return new Entrypoint(PathSource.pathFromDescription(id.description),
+        cache);
   }
 
   /// Runs [package]'s [executable] with [args].
diff --git a/sdk/lib/_internal/pub/lib/src/log.dart b/sdk/lib/_internal/pub/lib/src/log.dart
index 107970b..0b14ab3 100644
--- a/sdk/lib/_internal/pub/lib/src/log.dart
+++ b/sdk/lib/_internal/pub/lib/src/log.dart
@@ -9,6 +9,7 @@
 import 'dart:convert';
 import 'dart:io';
 
+import 'package:args/command_runner.dart';
 import 'package:path/path.dart' as p;
 import 'package:source_span/source_span.dart';
 import 'package:stack_trace/stack_trace.dart';
diff --git a/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart b/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
index 241fcb6..b339dd2 100644
--- a/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
+++ b/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
@@ -126,7 +126,7 @@
   ///
   /// Completes with a list of specific package versions if successful or an
   /// error if it failed to find a solution.
-  Future<SolveResult> solve() {
+  Future<SolveResult> solve() async {
     var stopwatch = new Stopwatch();
 
     _logParameters();
@@ -135,35 +135,35 @@
     var overrides = _overrides.values.toList();
     overrides.sort((a, b) => a.name.compareTo(b.name));
 
-    return newFuture(() {
+    try {
       stopwatch.start();
 
       // Pre-cache the root package's known pubspec.
       cache.cache(new PackageId.root(root), root.pubspec);
 
       _validateSdkConstraint(root.pubspec);
-      return _traverseSolution();
-    }).then((packages) {
+      var packages = await _traverseSolution();
       var pubspecs = new Map.fromIterable(packages,
           key: (id) => id.name,
           value: (id) => cache.getCachedPubspec(id));
 
+      packages = await Future.wait(
+          packages.map((id) => sources[id.source].resolveId(id)));
+
       return new SolveResult.success(sources, root, lockFile, packages,
           overrides, pubspecs, _getAvailableVersions(packages),
           attemptedSolutions);
-    }).catchError((error) {
-      if (error is! SolveFailure) throw error;
-
+    } on SolveFailure catch (error) {
       // Wrap a failure in a result so we can attach some other data.
       return new SolveResult.failure(sources, root, lockFile, overrides,
           error, attemptedSolutions);
-    }).whenComplete(() {
+    } finally {
       // Gather some solving metrics.
       var buffer = new StringBuffer();
       buffer.writeln('${runtimeType} took ${stopwatch.elapsed} seconds.');
       buffer.writeln(cache.describeResults());
       log.solver(buffer);
-    });
+    }
   }
 
   /// Generates a map containing all of the known available versions for each
diff --git a/sdk/lib/_internal/pub/lib/src/source/git.dart b/sdk/lib/_internal/pub/lib/src/source/git.dart
index 58ab066..dc4c8b3 100644
--- a/sdk/lib/_internal/pub/lib/src/source/git.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/git.dart
@@ -116,14 +116,34 @@
     return description;
   }
 
+  /// If [description] has a resolved ref, print it out in short-form.
+  ///
+  /// This helps distinguish different git commits with the same pubspec
+  /// version.
+  String formatDescription(String containingPath, description) {
+    if (description is Map && description.containsKey('resolved-ref')) {
+      return "${description['url']} at "
+          "${description['resolved-ref'].substring(0, 6)}";
+    } else {
+      return super.formatDescription(containingPath, description);
+    }
+  }
+
   /// Two Git descriptions are equal if both their URLs and their refs are
   /// equal.
   bool descriptionsEqual(description1, description2) {
     // TODO(nweiz): Do we really want to throw an error if you have two
     // dependencies on some repo, one of which specifies a ref and one of which
     // doesn't? If not, how do we handle that case in the version solver?
-    return _getUrl(description1) == _getUrl(description2) &&
-      _getRef(description1) == _getRef(description2);
+    if (_getUrl(description1) != _getUrl(description2)) return false;
+    if (_getRef(description1) != _getRef(description2)) return false;
+
+    if (description1 is Map && description1.containsKey('resolved-ref') &&
+        description2 is Map && description2.containsKey('resolved-ref')) {
+      return description1['resolved-ref'] == description2['resolved-ref'];
+    }
+
+    return true;
   }
 
   /// Attaches a specific commit to [id] to disambiguate it.
@@ -196,22 +216,22 @@
       var path = _repoCachePath(id);
       if (!entryExists(path)) {
         return _clone(_getUrl(id), path, mirror: true)
-            .then((_) => _revParse(id));
+            .then((_) => _getRev(id));
       }
 
       // If [id] didn't come from a lockfile, it may be using a symbolic
       // reference. We want to get the latest version of that reference.
       var description = id.description;
       if (description is! Map || !description.containsKey('resolved-ref')) {
-        return _updateRepoCache(id).then((_) => _revParse(id));
+        return _updateRepoCache(id).then((_) => _getRev(id));
       }
 
       // If [id] did come from a lockfile, then we want to avoid running "git
       // fetch" if possible to avoid networking time and errors. See if the
       // revision exists in the repo cache before updating it.
-      return _revParse(id).catchError((error) {
+      return _getRev(id).catchError((error) {
         if (error is! git.GitException) throw error;
-        return _updateRepoCache(id).then((_) => _revParse(id));
+        return _updateRepoCache(id).then((_) => _getRev(id));
       });
     });
   }
@@ -228,12 +248,12 @@
     });
   }
 
-  /// Runs "git rev-parse" in the canonical clone of the repository referred to
+  /// Runs "git rev-list" in the canonical clone of the repository referred to
   /// by [id] on the effective ref of [id].
   ///
   /// This assumes that the canonical clone already exists.
-  Future<String> _revParse(PackageId id) {
-    return git.run(["rev-parse", _getEffectiveRef(id)],
+  Future<String> _getRev(PackageId id) {
+    return git.run(["rev-list", "--max-count=1", _getEffectiveRef(id)],
         workingDir: _repoCachePath(id)).then((result) => result.first);
   }
 
diff --git a/sdk/lib/_internal/pub/lib/src/source/hosted.dart b/sdk/lib/_internal/pub/lib/src/source/hosted.dart
index 593f993..f1649d1 100644
--- a/sdk/lib/_internal/pub/lib/src/source/hosted.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/hosted.dart
@@ -134,9 +134,8 @@
       var url = _directoryToUrl(path.basename(serverDir));
       var packages = _getCachedPackagesInDirectory(path.basename(serverDir));
       packages.sort(Package.orderByNameAndVersion);
-      // TODO(nweiz): Use a normal for loop here when
-      // https://github.com/dart-lang/async_await/issues/72 is fixed.
-      await Future.forEach(packages, (package) async {
+
+      for (var package in packages) {
         try {
           await _download(url, package.name, package.version, package.dir);
           successes++;
@@ -150,7 +149,7 @@
 
           tryDeleteEntry(package.dir);
         }
-      });
+      }
     }
 
     return new Pair(successes, failures);
diff --git a/sdk/lib/_internal/pub/lib/src/system_cache.dart b/sdk/lib/_internal/pub/lib/src/system_cache.dart
index 6508615..424585da 100644
--- a/sdk/lib/_internal/pub/lib/src/system_cache.dart
+++ b/sdk/lib/_internal/pub/lib/src/system_cache.dart
@@ -5,6 +5,7 @@
 library pub.system_cache;
 
 import 'dart:async';
+import 'dart:io';
 
 import 'package:path/path.dart' as path;
 
@@ -33,15 +34,27 @@
   /// The sources from which to get packages.
   final sources = new SourceRegistry();
 
+  static String defaultDir = (() {
+    if (Platform.environment.containsKey('PUB_CACHE')) {
+      return Platform.environment['PUB_CACHE'];
+    } else if (Platform.operatingSystem == 'windows') {
+      var appData = Platform.environment['APPDATA'];
+      return path.join(appData, 'Pub', 'Cache');
+    } else {
+      return '${Platform.environment['HOME']}/.pub-cache';
+    }
+  })();
+
   /// Creates a new package cache which is backed by the given directory on the
   /// user's file system.
-  SystemCache(this.rootDir);
+  SystemCache([String rootDir])
+      : rootDir = rootDir == null ? SystemCache.defaultDir : rootDir;
 
   /// Creates a system cache and registers the standard set of sources.
   ///
   /// If [isOffline] is `true`, then the offline hosted source will be used.
   /// Defaults to `false`.
-  factory SystemCache.withSources(String rootDir, {bool isOffline: false}) {
+  factory SystemCache.withSources({String rootDir, bool isOffline: false}) {
     var cache = new SystemCache(rootDir);
     cache.register(new GitSource());
 
diff --git a/sdk/lib/_internal/pub/lib/src/utils.dart b/sdk/lib/_internal/pub/lib/src/utils.dart
index 4daec90..09575d7 100644
--- a/sdk/lib/_internal/pub/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub/lib/src/utils.dart
@@ -104,12 +104,14 @@
       } else {
         stackTrace = new Chain([]);
       }
-      completer.completeError(e, stackTrace);
+      if (!completer.isCompleted) completer.completeError(e, stackTrace);
     });
   };
 
   if (captureStackChains) {
-    Chain.capture(wrappedCallback, onError: completer.completeError);
+    Chain.capture(wrappedCallback, onError: (error, stackTrace) {
+      if (!completer.isCompleted) completer.completeError(error, stackTrace);
+    });
   } else {
     runZoned(wrappedCallback, onError: (e, stackTrace) {
       if (stackTrace == null) {
@@ -117,7 +119,7 @@
       } else {
         stackTrace = new Chain([new Trace.from(stackTrace)]);
       }
-      completer.completeError(e, stackTrace);
+      if (!completer.isCompleted) completer.completeError(e, stackTrace);
     });
   }
 
diff --git a/sdk/lib/_internal/pub/lib/src/validator/dependency.dart b/sdk/lib/_internal/pub/lib/src/validator/dependency.dart
index 7e6a933..37f55d7 100644
--- a/sdk/lib/_internal/pub/lib/src/validator/dependency.dart
+++ b/sdk/lib/_internal/pub/lib/src/validator/dependency.dart
@@ -37,10 +37,7 @@
   Future validate() async {
     var caretDeps = [];
 
-    // TODO(nweiz): Replace this with a real for/in loop when we update
-    // async_await.
-    await Future.forEach(entrypoint.root.pubspec.dependencies,
-        (dependency) async {
+    for (var dependency in entrypoint.root.pubspec.dependencies) {
       if (dependency.source != "hosted") {
         await _warnAboutSource(dependency);
       } else if (dependency.constraint.isAny) {
@@ -58,7 +55,7 @@
           caretDeps.add(dependency);
         }
       }
-    });
+    }
 
     if (caretDeps.isNotEmpty && !_caretAllowed) {
       _errorAboutCaretConstraints(caretDeps);
diff --git a/sdk/lib/_internal/pub/test/cache/add/bad_version_test.dart b/sdk/lib/_internal/pub/test/cache/add/bad_version_test.dart
index 687ecfe..c0df5aa 100644
--- a/sdk/lib/_internal/pub/test/cache/add/bad_version_test.dart
+++ b/sdk/lib/_internal/pub/test/cache/add/bad_version_test.dart
@@ -15,7 +15,7 @@
             Could not parse version "1.0". Unknown text at "1.0".
             
             Usage: pub cache add <package> [--version <constraint>] [--all]
-            -h, --help       Print usage information for this command.
+            -h, --help       Print this usage information.
                 --all        Install all matching versions.
             -v, --version    Version constraint.
 
diff --git a/sdk/lib/_internal/pub/test/cache/add/missing_package_arg_test.dart b/sdk/lib/_internal/pub/test/cache/add/missing_package_arg_test.dart
index be4216b..4229af7 100644
--- a/sdk/lib/_internal/pub/test/cache/add/missing_package_arg_test.dart
+++ b/sdk/lib/_internal/pub/test/cache/add/missing_package_arg_test.dart
@@ -15,7 +15,7 @@
             No package to add given.
             
             Usage: pub cache add <package> [--version <constraint>] [--all]
-            -h, --help       Print usage information for this command.
+            -h, --help       Print this usage information.
                 --all        Install all matching versions.
             -v, --version    Version constraint.
 
diff --git a/sdk/lib/_internal/pub/test/cache/add/unexpected_arguments_test.dart b/sdk/lib/_internal/pub/test/cache/add/unexpected_arguments_test.dart
index 05c2b76..0dec65a 100644
--- a/sdk/lib/_internal/pub/test/cache/add/unexpected_arguments_test.dart
+++ b/sdk/lib/_internal/pub/test/cache/add/unexpected_arguments_test.dart
@@ -15,7 +15,7 @@
             Unexpected arguments "bar" and "baz".
             
             Usage: pub cache add <package> [--version <constraint>] [--all]
-            -h, --help       Print usage information for this command.
+            -h, --help       Print this usage information.
                 --all        Install all matching versions.
             -v, --version    Version constraint.
 
diff --git a/sdk/lib/_internal/pub/test/get/git/check_out_and_upgrade_test.dart b/sdk/lib/_internal/pub/test/get/git/check_out_and_upgrade_test.dart
index f6dc6816..f2ff3bf 100644
--- a/sdk/lib/_internal/pub/test/get/git/check_out_and_upgrade_test.dart
+++ b/sdk/lib/_internal/pub/test/get/git/check_out_and_upgrade_test.dart
@@ -4,6 +4,8 @@
 
 library pub_tests;
 
+import 'package:scheduled_test/scheduled_test.dart';
+
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
@@ -39,7 +41,7 @@
       d.libPubspec('foo', '1.0.0')
     ]).commit();
 
-    pubUpgrade();
+    pubUpgrade(output: contains("Changed 1 dependency!"));
 
     // When we download a new version of the git package, we should re-use the
     // git/cache directory but create a new git/ directory.
diff --git a/sdk/lib/_internal/pub/test/get/git/check_out_unfetched_revision_of_cached_repo_test.dart b/sdk/lib/_internal/pub/test/get/git/check_out_unfetched_revision_of_cached_repo_test.dart
new file mode 100644
index 0000000..3ebc04c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/get/git/check_out_unfetched_revision_of_cached_repo_test.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../../lib/src/io.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  // Regression test for issue 20947.
+  integration('checks out an unfetched and locked revision of a cached '
+      'repository', () {
+    ensureGit();
+
+    // In order to get a lockfile that refers to a newer revision than is in the
+    // cache, we'll switch between two caches. First we ensure that the repo is
+    // in the first cache.
+    d.git('foo.git', [
+      d.libDir('foo'),
+      d.libPubspec('foo', '1.0.0')
+    ]).create();
+
+    d.appDir({"foo": {"git": "../foo.git"}}).create();
+
+    pubGet();
+
+    // Switch to a new cache.
+    schedule(() => renameDir(
+        p.join(sandboxDir, cachePath), p.join(sandboxDir, "$cachePath.old")));
+
+    // Make the lockfile point to a new revision of the git repository.
+    d.git('foo.git', [
+      d.libDir('foo', 'foo 2'),
+      d.libPubspec('foo', '1.0.0')
+    ]).commit();
+
+    pubUpgrade(output: contains("Changed 1 dependency!"));
+
+    // Switch back to the old cache.
+    schedule(() {
+      var cacheDir = p.join(sandboxDir, cachePath);
+      deleteEntry(cacheDir);
+      renameDir(p.join(sandboxDir, "$cachePath.old"), cacheDir);
+    });
+
+    // Get the updated version of the git dependency based on the lockfile.
+    pubGet();
+
+    d.dir(cachePath, [
+      d.dir('git', [
+        d.dir('cache', [d.gitPackageRepoCacheDir('foo')]),
+        d.gitPackageRevisionCacheDir('foo'),
+        d.gitPackageRevisionCacheDir('foo', 2)
+      ])
+    ]).validate();
+
+    d.dir(packagesPath, [
+      d.dir('foo', [
+        d.file('foo.dart', 'main() => "foo 2";')
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/activate/activate_git_after_hosted_test.dart b/sdk/lib/_internal/pub/test/global/activate/activate_git_after_hosted_test.dart
index d50561e..e524cbf 100644
--- a/sdk/lib/_internal/pub/test/global/activate/activate_git_after_hosted_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/activate_git_after_hosted_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:scheduled_test/scheduled_test.dart';
+
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
@@ -28,14 +30,17 @@
     schedulePub(args: ["global", "activate", "foo"]);
 
     schedulePub(args: ["global", "activate", "-sgit", "../foo.git"],
-        output: """
-            Package foo is currently active at version 1.0.0.
-            Resolving dependencies...
-            + foo 1.0.0 from git ../foo.git
-            Precompiling executables...
-            Loading source assets...
-            Precompiled foo:foo.
-            Activated foo 1.0.0 from Git repository "../foo.git".""");
+        output: allOf(
+            startsWith(
+                'Package foo is currently active at version 1.0.0.\n'
+                'Resolving dependencies...\n'
+                '+ foo 1.0.0 from git ../foo.git at '),
+            // Specific revision number goes here.
+            endsWith(
+                'Precompiling executables...\n'
+                'Loading source assets...\n'
+                'Precompiled foo:foo.\n'
+                'Activated foo 1.0.0 from Git repository "../foo.git".')));
 
     // Should now run the git one.
     var pub = pubRun(global: true, args: ["foo"]);
diff --git a/sdk/lib/_internal/pub/test/global/activate/git_package_test.dart b/sdk/lib/_internal/pub/test/global/activate/git_package_test.dart
index d6a887b..ad52145 100644
--- a/sdk/lib/_internal/pub/test/global/activate/git_package_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/git_package_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:scheduled_test/scheduled_test.dart';
+
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
@@ -18,12 +20,15 @@
     ]).create();
 
     schedulePub(args: ["global", "activate", "-sgit", "../foo.git"],
-        output: '''
-            Resolving dependencies...
-            + foo 1.0.0 from git ../foo.git
-            Precompiling executables...
-            Loading source assets...
-            Precompiled foo:foo.
-            Activated foo 1.0.0 from Git repository "../foo.git".''');
+        output: allOf(
+            startsWith(
+                'Resolving dependencies...\n'
+                '+ foo 1.0.0 from git ../foo.git at '),
+            // Specific revision number goes here.
+            endsWith(
+                'Precompiling executables...\n'
+                'Loading source assets...\n'
+                'Precompiled foo:foo.\n'
+                'Activated foo 1.0.0 from Git repository "../foo.git".')));
   });
 }
diff --git a/sdk/lib/_internal/pub/test/global/activate/reactivating_git_upgrades_test.dart b/sdk/lib/_internal/pub/test/global/activate/reactivating_git_upgrades_test.dart
index f328d26..19f895f 100644
--- a/sdk/lib/_internal/pub/test/global/activate/reactivating_git_upgrades_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/reactivating_git_upgrades_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:scheduled_test/scheduled_test.dart';
+
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
@@ -16,12 +18,15 @@
     ]).create();
 
     schedulePub(args: ["global", "activate", "-sgit", "../foo.git"],
-        output: '''
-            Resolving dependencies...
-            + foo 1.0.0 from git ../foo.git
-            Precompiling executables...
-            Loading source assets...
-            Activated foo 1.0.0 from Git repository "../foo.git".''');
+        output: allOf(
+            startsWith(
+                'Resolving dependencies...\n'
+                '+ foo 1.0.0 from git ../foo.git at '),
+            // Specific revision number goes here.
+            endsWith(
+                'Precompiling executables...\n'
+                'Loading source assets...\n'
+                'Activated foo 1.0.0 from Git repository "../foo.git".')));
 
     d.git('foo.git', [
       d.libPubspec("foo", "1.0.1")
@@ -29,12 +34,16 @@
 
     // Activating it again pulls down the latest commit.
     schedulePub(args: ["global", "activate", "-sgit", "../foo.git"],
-        output: '''
-            Package foo is currently active from Git repository "../foo.git".
-            Resolving dependencies...
-            + foo 1.0.1 from git ../foo.git
-            Precompiling executables...
-            Loading source assets...
-            Activated foo 1.0.1 from Git repository "../foo.git".''');
+        output: allOf(
+            startsWith(
+                'Package foo is currently active from Git repository '
+                  '"../foo.git".\n'
+                'Resolving dependencies...\n'
+                '+ foo 1.0.1 from git ../foo.git at '),
+            // Specific revision number goes here.
+            endsWith(
+                'Precompiling executables...\n'
+                'Loading source assets...\n'
+                'Activated foo 1.0.1 from Git repository "../foo.git".')));
   });
 }
diff --git a/sdk/lib/_internal/pub/test/global/deactivate/missing_package_arg_test.dart b/sdk/lib/_internal/pub/test/global/deactivate/missing_package_arg_test.dart
index 8cf9fc3..482947d 100644
--- a/sdk/lib/_internal/pub/test/global/deactivate/missing_package_arg_test.dart
+++ b/sdk/lib/_internal/pub/test/global/deactivate/missing_package_arg_test.dart
@@ -13,7 +13,7 @@
             No package to deactivate given.
 
             Usage: pub global deactivate <package>
-            -h, --help    Print usage information for this command.
+            -h, --help    Print this usage information.
 
             Run "pub help" to see global options.
             """,
diff --git a/sdk/lib/_internal/pub/test/global/deactivate/unexpected_arguments_test.dart b/sdk/lib/_internal/pub/test/global/deactivate/unexpected_arguments_test.dart
index a2563b5..f57fccc 100644
--- a/sdk/lib/_internal/pub/test/global/deactivate/unexpected_arguments_test.dart
+++ b/sdk/lib/_internal/pub/test/global/deactivate/unexpected_arguments_test.dart
@@ -13,7 +13,7 @@
             Unexpected arguments "bar" and "baz".
 
             Usage: pub global deactivate <package>
-            -h, --help    Print usage information for this command.
+            -h, --help    Print this usage information.
 
             Run "pub help" to see global options.
             """,
diff --git a/sdk/lib/_internal/pub/test/global/run/errors_if_outside_bin_test.dart b/sdk/lib/_internal/pub/test/global/run/errors_if_outside_bin_test.dart
index 237cb15..cb149bb 100644
--- a/sdk/lib/_internal/pub/test/global/run/errors_if_outside_bin_test.dart
+++ b/sdk/lib/_internal/pub/test/global/run/errors_if_outside_bin_test.dart
@@ -25,7 +25,7 @@
 Cannot run an executable in a subdirectory of a global package.
 
 Usage: pub global run <package>:<executable> [args...]
--h, --help    Print usage information for this command.
+-h, --help    Print this usage information.
     --mode    Mode to run transformers in.
               (defaults to "release")
 
diff --git a/sdk/lib/_internal/pub/test/global/run/missing_executable_arg_test.dart b/sdk/lib/_internal/pub/test/global/run/missing_executable_arg_test.dart
index 801ad73..01c798d 100644
--- a/sdk/lib/_internal/pub/test/global/run/missing_executable_arg_test.dart
+++ b/sdk/lib/_internal/pub/test/global/run/missing_executable_arg_test.dart
@@ -13,7 +13,7 @@
             Must specify an executable to run.
 
             Usage: pub global run <package>:<executable> [args...]
-            -h, --help    Print usage information for this command.
+            -h, --help    Print this usage information.
                 --mode    Mode to run transformers in.
                           (defaults to "release")
 
diff --git a/sdk/lib/_internal/pub/test/lish/force_cannot_be_combined_with_dry_run_test.dart b/sdk/lib/_internal/pub/test/lish/force_cannot_be_combined_with_dry_run_test.dart
index 49aaac3..331d799 100644
--- a/sdk/lib/_internal/pub/test/lish/force_cannot_be_combined_with_dry_run_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/force_cannot_be_combined_with_dry_run_test.dart
@@ -18,7 +18,7 @@
           Cannot use both --force and --dry-run.
           
           Usage: pub publish [options]
-          -h, --help       Print usage information for this command.
+          -h, --help       Print this usage information.
           -n, --dry-run    Validate but do not publish the package.
           -f, --force      Publish without confirmation if there are no errors.
               --server     The package server to which to upload this package.
diff --git a/sdk/lib/_internal/pub/test/package_list_files_test.dart b/sdk/lib/_internal/pub/test/package_list_files_test.dart
index 56d8fb8..079a6b9 100644
--- a/sdk/lib/_internal/pub/test/package_list_files_test.dart
+++ b/sdk/lib/_internal/pub/test/package_list_files_test.dart
@@ -116,7 +116,8 @@
 void scheduleEntrypoint() {
   schedule(() {
     root = path.join(sandboxDir, appPath);
-    entrypoint = new Entrypoint(root, new SystemCache.withSources(root));
+    entrypoint = new Entrypoint(root,
+        new SystemCache.withSources(rootDir: root));
   }, 'initializing entrypoint');
 
   currentSchedule.onComplete.schedule(() {
diff --git a/sdk/lib/_internal/pub/test/pub_test.dart b/sdk/lib/_internal/pub/test/pub_test.dart
index 525cd0f..d664fa7 100644
--- a/sdk/lib/_internal/pub/test/pub_test.dart
+++ b/sdk/lib/_internal/pub/test/pub_test.dart
@@ -9,123 +9,27 @@
 import '../lib/src/exit_codes.dart' as exit_codes;
 import 'test_pub.dart';
 
-final USAGE_STRING = """
-    Pub is a package manager for Dart.
-
-    Usage: pub <command> [arguments]
-
-    Global options:
-    -h, --help            Print this usage information.
-        --version         Print pub version.
-        --[no-]trace      Print debugging information when an error occurs.
-        --verbosity       Control output verbosity.
-
-              [all]       Show all output including internal tracing messages.
-              [io]        Also show IO operations.
-              [normal]    Show errors, warnings, and user messages.
-              [solver]    Show steps during version resolution.
-
-    -v, --verbose         Shortcut for "--verbosity=all".
-
-    Available commands:
-      build       Apply transformers to build a package.
-      cache       Work with the system cache.
-      deps        Print package dependencies.
-      downgrade   Downgrade the current package's dependencies to oldest versions.
-      get         Get the current package's dependencies.
-      global      Work with global packages.
-      help        Display help information for Pub.
-      publish     Publish the current package to pub.dartlang.org.
-      run         Run an executable from a package.
-      serve       Run a local web development server.
-      upgrade     Upgrade the current package's dependencies to latest versions.
-      uploader    Manage uploaders for a package on pub.dartlang.org.
-      version     Print pub version.
-
-    Run "pub help [command]" for more information about a command.
-    See http://dartlang.org/tools/pub for detailed documentation.
-    """;
-
-final VERSION_STRING = '''
-    Pub 0.1.2+3
-    ''';
-
 main() {
   initConfig();
 
   integration('running pub with no command displays usage', () {
-    schedulePub(args: [], output: USAGE_STRING);
-  });
+    schedulePub(args: [], output: """
+        Pub is a package manager for Dart.
 
-  integration('running pub with just --help displays usage', () {
-    schedulePub(args: ['--help'], output: USAGE_STRING);
-  });
+        Usage: pub <command> [arguments]
 
-  integration('running pub with just -h displays usage', () {
-    schedulePub(args: ['-h'], output: USAGE_STRING);
-  });
+        Global options:
+        -h, --help            Print this usage information.
+            --version         Print pub version.
+            --[no-]trace      Print debugging information when an error occurs.
+            --verbosity       Control output verbosity.
 
-  integration('running pub with --with-prejudice upcases everything', () {
-    schedulePub(args: ['--with-prejudice'], output: USAGE_STRING.toUpperCase());
-  });
+                  [all]       Show all output including internal tracing messages.
+                  [io]        Also show IO operations.
+                  [normal]    Show errors, warnings, and user messages.
+                  [solver]    Show steps during version resolution.
 
-  integration('running pub with --help after command shows command usage', () {
-    schedulePub(args: ['get', '--help'],
-        output: '''
-          Get the current package's dependencies.
-
-          Usage: pub get
-          -h, --help            Print usage information for this command.
-              --[no-]offline    Use cached packages instead of accessing the network.
-          -n, --dry-run         Report what dependencies would change but don't change any.
-
-          Run "pub help" to see global options.
-          See http://dartlang.org/tools/pub/cmd/pub-get.html for detailed documentation.
-    ''');
-  });
-
-  integration('running pub with -h after command shows command usage', () {
-    schedulePub(args: ['get', '-h'],
-        output: '''
-          Get the current package's dependencies.
-
-          Usage: pub get
-          -h, --help            Print usage information for this command.
-              --[no-]offline    Use cached packages instead of accessing the network.
-          -n, --dry-run         Report what dependencies would change but don't change any.
-
-          Run "pub help" to see global options.
-          See http://dartlang.org/tools/pub/cmd/pub-get.html for detailed documentation.
-    ''');
-  });
-
-  integration('running pub with --help after a command with subcommands shows '
-              'command usage', () {
-    schedulePub(args: ['cache', '--help'],
-        output: '''
-          Work with the system cache.
-
-          Usage: pub cache <subcommand>
-          -h, --help    Print usage information for this command.
-
-          Available subcommands:
-            add      Install a package.
-            repair   Reinstall cached packages.
-
-          Run "pub help" to see global options.
-          See http://dartlang.org/tools/pub/cmd/pub-cache.html for detailed documentation.
-     ''');
-  });
-
-
-  integration('running pub with just --version displays version', () {
-    schedulePub(args: ['--version'], output: VERSION_STRING);
-  });
-
-  integration('an unknown command displays an error message', () {
-    schedulePub(args: ['quylthulg'],
-        error: '''
-        Could not find a command named "quylthulg".
+        -v, --verbose         Shortcut for "--verbosity=all".
 
         Available commands:
           build       Apply transformers to build a package.
@@ -134,223 +38,20 @@
           downgrade   Downgrade the current package's dependencies to oldest versions.
           get         Get the current package's dependencies.
           global      Work with global packages.
-          help        Display help information for Pub.
+          help        Display help information for pub.
           publish     Publish the current package to pub.dartlang.org.
           run         Run an executable from a package.
           serve       Run a local web development server.
           upgrade     Upgrade the current package's dependencies to latest versions.
           uploader    Manage uploaders for a package on pub.dartlang.org.
           version     Print pub version.
-        ''',
-        exitCode: exit_codes.USAGE);
+
+        Run "pub help <command>" for more information about a command.
+        See http://dartlang.org/tools/pub for detailed documentation.
+        """);
   });
 
-  integration('an unknown subcommand displays an error message', () {
-    schedulePub(args: ['cache', 'quylthulg'],
-        error: '''
-        Could not find a subcommand named "quylthulg" for "pub cache".
-
-        Usage: pub cache <subcommand>
-        -h, --help    Print usage information for this command.
-
-        Available subcommands:
-          add      Install a package.
-          repair   Reinstall cached packages.
-
-        Run "pub help" to see global options.
-        See http://dartlang.org/tools/pub/cmd/pub-cache.html for detailed documentation.
-        ''',
-        exitCode: exit_codes.USAGE);
-  });
-
-  integration('an unknown option displays an error message', () {
-    schedulePub(args: ['--blorf'],
-        error: '''
-        Could not find an option named "blorf".
-        Run "pub help" to see available options.
-        ''',
-        exitCode: exit_codes.USAGE);
-  });
-
-  integration('an unknown command option displays an error message', () {
-    // TODO(rnystrom): When pub has command-specific options, a more precise
-    // error message would be good here.
-    schedulePub(args: ['version', '--blorf'],
-        error: '''
-        Could not find an option named "blorf".
-        Run "pub help" to see available options.
-        ''',
-        exitCode: exit_codes.USAGE);
-  });
-
-  integration('an unexpected argument displays an error message', () {
-    schedulePub(args: ['version', 'unexpected'],
-        error: '''
-        Command "version" does not take any arguments.
-
-        Usage: pub version
-         -h, --help    Print usage information for this command.
-
-        Run "pub help" to see global options.
-        ''',
-        exitCode: exit_codes.USAGE);
-  });
-
-  integration('a missing subcommand displays an error message', () {
-    schedulePub(args: ['cache'],
-        error: '''
-        Missing subcommand for "pub cache".
-
-        Usage: pub cache <subcommand>
-        -h, --help    Print usage information for this command.
-
-        Available subcommands:
-          add      Install a package.
-          repair   Reinstall cached packages.
-
-        Run "pub help" to see global options.
-        See http://dartlang.org/tools/pub/cmd/pub-cache.html for detailed documentation.
-        ''',
-        exitCode: exit_codes.USAGE);
-  });
-
-  group('help', () {
-    integration('shows global help if no command is given', () {
-      schedulePub(args: ['help'], output: USAGE_STRING);
-    });
-
-    integration('shows help for a command', () {
-      schedulePub(args: ['help', 'get'],
-          output: '''
-            Get the current package's dependencies.
-
-            Usage: pub get
-            -h, --help            Print usage information for this command.
-                --[no-]offline    Use cached packages instead of accessing the network.
-            -n, --dry-run         Report what dependencies would change but don't change any.
-
-            Run "pub help" to see global options.
-            See http://dartlang.org/tools/pub/cmd/pub-get.html for detailed documentation.
-            ''');
-    });
-
-    integration('shows help for a command', () {
-      schedulePub(args: ['help', 'publish'],
-          output: '''
-            Publish the current package to pub.dartlang.org.
-
-            Usage: pub publish [options]
-            -h, --help       Print usage information for this command.
-            -n, --dry-run    Validate but do not publish the package.
-            -f, --force      Publish without confirmation if there are no errors.
-                --server     The package server to which to upload this package.
-                             (defaults to "https://pub.dartlang.org")
-
-            Run "pub help" to see global options.
-            See http://dartlang.org/tools/pub/cmd/pub-lish.html for detailed documentation.
-            ''');
-    });
-
-    integration('shows non-truncated help', () {
-      schedulePub(args: ['help', 'serve'],
-          output: '''
-            Run a local web development server.
-
-            By default, this serves "web/" and "test/", but an explicit list of
-            directories to serve can be provided as well.
-
-            Usage: pub serve [directories...]
-            -h, --help               Print usage information for this command.
-                --mode               Mode to run transformers in.
-                                     (defaults to "debug")
-
-                --all                Use all default source directories.
-                --hostname           The hostname to listen on.
-                                     (defaults to "localhost")
-
-                --port               The base port to listen on.
-                                     (defaults to "8080")
-
-                --[no-]dart2js       Compile Dart to JavaScript.
-                                     (defaults to on)
-
-                --[no-]force-poll    Force the use of a polling filesystem watcher.
-
-            Run "pub help" to see global options.
-            See http://dartlang.org/tools/pub/cmd/pub-serve.html for detailed documentation.
-            ''');
-    });
-
-    integration('shows help for a subcommand', () {
-      schedulePub(args: ['help', 'cache', 'list'],
-          output: '''
-            List packages in the system cache.
-
-            Usage: pub cache list
-            -h, --help    Print usage information for this command.
-
-            Run "pub help" to see global options.
-            ''');
-    });
-
-    integration('an unknown help command displays an error message', () {
-      schedulePub(args: ['help', 'quylthulg'],
-          error: '''
-            Could not find a command named "quylthulg".
-
-            Available commands:
-              build       Apply transformers to build a package.
-              cache       Work with the system cache.
-              deps        Print package dependencies.
-              downgrade   Downgrade the current package's dependencies to oldest versions.
-              get         Get the current package's dependencies.
-              global      Work with global packages.
-              help        Display help information for Pub.
-              publish     Publish the current package to pub.dartlang.org.
-              run         Run an executable from a package.
-              serve       Run a local web development server.
-              upgrade     Upgrade the current package's dependencies to latest versions.
-              uploader    Manage uploaders for a package on pub.dartlang.org.
-              version     Print pub version.
-            ''',
-            exitCode: exit_codes.USAGE);
-    });
-
-    integration('an unknown help subcommand displays an error message', () {
-      schedulePub(args: ['help', 'cache', 'quylthulg'],
-          error: '''
-            Could not find a subcommand named "quylthulg" for "pub cache".
-
-            Usage: pub cache <subcommand>
-            -h, --help    Print usage information for this command.
-
-            Available subcommands:
-              add      Install a package.
-              repair   Reinstall cached packages.
-
-            Run "pub help" to see global options.
-            See http://dartlang.org/tools/pub/cmd/pub-cache.html for detailed documentation.
-            ''',
-            exitCode: exit_codes.USAGE);
-    });
-
-    integration('an unexpected help subcommand displays an error message', () {
-      schedulePub(args: ['help', 'version', 'badsubcommand'],
-          error: '''
-            Command "pub version" does not expect a subcommand.
-
-            Usage: pub version
-            -h, --help    Print usage information for this command.
-
-            Run "pub help" to see global options.
-            ''',
-            exitCode: exit_codes.USAGE);
-    });
-  });
-
-  group('version', () {
-    integration('displays the current version', () {
-      schedulePub(args: ['version'], output: VERSION_STRING);
-    });
+  integration('running pub with just --version displays version', () {
+    schedulePub(args: ['--version'], output: 'Pub 0.1.2+3');
   });
 }
diff --git a/sdk/lib/_internal/pub/test/pub_uploader_test.dart b/sdk/lib/_internal/pub/test/pub_uploader_test.dart
index fbfba2c..89054eb 100644
--- a/sdk/lib/_internal/pub/test/pub_uploader_test.dart
+++ b/sdk/lib/_internal/pub/test/pub_uploader_test.dart
@@ -20,7 +20,7 @@
 Manage uploaders for a package on pub.dartlang.org.
 
 Usage: pub uploader [options] {add/remove} <email>
--h, --help       Print usage information for this command.
+-h, --help       Print this usage information.
     --server     The package server on which the package is hosted.
                  (defaults to "https://pub.dartlang.org")
 
diff --git a/sdk/lib/_internal/pub/test/run/errors_if_no_executable_is_given_test.dart b/sdk/lib/_internal/pub/test/run/errors_if_no_executable_is_given_test.dart
index 40bbeb1..388d497 100644
--- a/sdk/lib/_internal/pub/test/run/errors_if_no_executable_is_given_test.dart
+++ b/sdk/lib/_internal/pub/test/run/errors_if_no_executable_is_given_test.dart
@@ -18,7 +18,7 @@
 Must specify an executable to run.
 
 Usage: pub run <executable> [args...]
--h, --help    Print usage information for this command.
+-h, --help    Print this usage information.
     --mode    Mode to run transformers in.
               (defaults to "release" for dependencies, "debug" for entrypoint)
 
diff --git a/sdk/lib/_internal/pub/test/run/errors_if_path_in_dependency_test.dart b/sdk/lib/_internal/pub/test/run/errors_if_path_in_dependency_test.dart
index 7686386..3874f35 100644
--- a/sdk/lib/_internal/pub/test/run/errors_if_path_in_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/run/errors_if_path_in_dependency_test.dart
@@ -25,7 +25,7 @@
 Cannot run an executable in a subdirectory of a dependency.
 
 Usage: pub run <executable> [args...]
--h, --help    Print usage information for this command.
+-h, --help    Print this usage information.
     --mode    Mode to run transformers in.
               (defaults to "release" for dependencies, "debug" for entrypoint)
 
diff --git a/sdk/lib/_internal/pub/test/serve/native_watch_replaced_file_test.dart b/sdk/lib/_internal/pub/test/serve/native_watch_replaced_file_test.dart
new file mode 100644
index 0000000..8a01ae1
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/native_watch_replaced_file_test.dart
@@ -0,0 +1,58 @@
+// 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 'dart:async';
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  // This is a regression test for http://dartbug.com/21402.
+  initConfig();
+  withBarbackVersions("any", () {
+    integration("picks up files replaced after serving started when using the "
+        "native watcher", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/src/transformer"]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", REWRITE_TRANSFORMER)
+        ])]),
+        d.dir("web", [
+          d.file("file.txt", "before"),
+        ]),
+        d.file("other", "after")
+      ]).create();
+
+      createLockFile("myapp", pkg: ["barback"]);
+
+      pubServe(args: ["--no-force-poll"]);
+      waitForBuildSuccess();
+      requestShouldSucceed("file.out", "before.out");
+
+      schedule(() {
+        // Replace file.txt by renaming other on top of it.
+        return new File(p.join(sandboxDir, appPath, "other"))
+            .rename(p.join(sandboxDir, appPath, "web", "file.txt"));
+      });
+
+      // Read the transformed file to ensure the change is actually noticed by
+      // pub and not that we just get the new file contents piped through
+      // without pub realizing they've changed.
+      waitForBuildSuccess();
+      requestShouldSucceed("file.out", "after.out");
+
+      endPubServe();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/snapshot/updates_snapshot_for_git_dependency_test.dart b/sdk/lib/_internal/pub/test/snapshot/updates_snapshot_for_git_dependency_test.dart
new file mode 100644
index 0000000..c1c1f68
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/snapshot/updates_snapshot_for_git_dependency_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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 p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("upgrades a snapshot when a git dependency is upgraded", () {
+    ensureGit();
+
+    d.git('foo.git', [
+      d.pubspec({
+        "name": "foo",
+        "version": "0.0.1"
+      }),
+      d.dir("bin", [
+        d.file("hello.dart", "void main() => print('Hello!');")
+      ])
+    ]).create();
+
+    d.appDir({"foo": {"git": "../foo.git"}}).create();
+
+    pubGet(output: contains("Precompiled foo:hello."));
+
+    d.dir(p.join(appPath, '.pub', 'bin', 'foo'), [
+      d.matcherFile('hello.dart.snapshot', contains('Hello!'))
+    ]).validate();
+
+    d.git('foo.git', [
+      d.dir("bin", [
+        d.file("hello.dart", "void main() => print('Goodbye!');")
+      ])
+    ]).commit();
+
+    pubUpgrade(output: contains("Precompiled foo:hello."));
+
+    d.dir(p.join(appPath, '.pub', 'bin', 'foo'), [
+      d.matcherFile('hello.dart.snapshot', contains('Goodbye!'))
+    ]).validate();
+
+    var process = pubRun(args: ['foo:hello']);
+    process.stdout.expect("Goodbye!");
+    process.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart
index fbf9f80..4b6afb3 100644
--- a/sdk/lib/_internal/pub/test/test_pub.dart
+++ b/sdk/lib/_internal/pub/test/test_pub.dart
@@ -952,7 +952,8 @@
 Future<Pair<List<String>, List<String>>> schedulePackageValidation(
     ValidatorCreator fn) {
   return schedule(() {
-    var cache = new SystemCache.withSources(p.join(sandboxDir, cachePath));
+    var cache = new SystemCache.withSources(
+        rootDir: p.join(sandboxDir, cachePath));
 
     return new Future.sync(() {
       var validator = fn(new Entrypoint(p.join(sandboxDir, appPath), cache));
diff --git a/sdk/lib/_internal/pub_generated/README.md b/sdk/lib/_internal/pub_generated/README.md
index f4908d9..903a085 100644
--- a/sdk/lib/_internal/pub_generated/README.md
+++ b/sdk/lib/_internal/pub_generated/README.md
@@ -12,7 +12,7 @@
 
 The code here was compiled using the async-await compiler at commit:
 
-    04e540562a04380a3e20a422c8bfe306e6f79f95
+    8b401a9f2e5e81dca5f70dbe7564112a0823dee6
 
 (Note: this file is also parsed by a tool to update the above commit, so be
 careful not to reformat it.)
diff --git a/sdk/lib/_internal/pub_generated/bin/pub.dart b/sdk/lib/_internal/pub_generated/bin/pub.dart
index b6d3712..e781f94 100644
--- a/sdk/lib/_internal/pub_generated/bin/pub.dart
+++ b/sdk/lib/_internal/pub_generated/bin/pub.dart
@@ -2,289 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
-import 'dart:io';
-
-import 'package:args/args.dart';
-import 'package:http/http.dart' as http;
-import 'package:path/path.dart' as path;
-import 'package:stack_trace/stack_trace.dart';
-
-import '../lib/src/command.dart';
-import '../lib/src/exceptions.dart';
-import '../lib/src/exit_codes.dart' as exit_codes;
-import '../lib/src/http.dart';
-import '../lib/src/io.dart';
-import '../lib/src/log.dart' as log;
-import '../lib/src/sdk.dart' as sdk;
-import '../lib/src/solver/version_solver.dart';
-import '../lib/src/utils.dart';
+import '../lib/src/command_runner.dart';
 
 void main(List<String> arguments) {
-  ArgResults options;
-
-  try {
-    options = PubCommand.pubArgParser.parse(arguments);
-  } on FormatException catch (e) {
-    log.error(e.message);
-    log.error('Run "pub help" to see available options.');
-    flushThenExit(exit_codes.USAGE);
-    return;
-  }
-
-  log.withPrejudice = options['with-prejudice'];
-
-  if (options['version']) {
-    log.message('Pub ${sdk.version}');
-    return;
-  }
-
-  if (options['help']) {
-    PubCommand.printGlobalUsage();
-    return;
-  }
-
-  if (options['trace']) {
-    log.recordTranscript();
-  }
-
-  switch (options['verbosity']) {
-    case 'normal':
-      log.verbosity = log.Verbosity.NORMAL;
-      break;
-    case 'io':
-      log.verbosity = log.Verbosity.IO;
-      break;
-    case 'solver':
-      log.verbosity = log.Verbosity.SOLVER;
-      break;
-    case 'all':
-      log.verbosity = log.Verbosity.ALL;
-      break;
-    default:
-      // No specific verbosity given, so check for the shortcut.
-      if (options['verbose']) {
-        log.verbosity = log.Verbosity.ALL;
-      }
-      break;
-  }
-
-  log.fine('Pub ${sdk.version}');
-
-  var cacheDir;
-  if (Platform.environment.containsKey('PUB_CACHE')) {
-    cacheDir = Platform.environment['PUB_CACHE'];
-  } else if (Platform.operatingSystem == 'windows') {
-    var appData = Platform.environment['APPDATA'];
-    cacheDir = path.join(appData, 'Pub', 'Cache');
-  } else {
-    cacheDir = '${Platform.environment['HOME']}/.pub-cache';
-  }
-
-  validatePlatform().then((_) => runPub(cacheDir, options, arguments));
-}
-
-/// Runs the appropriate pub command whose [arguments] have been parsed to
-/// [options] using the system cache in [cacheDir].
-///
-/// Handles and correctly reports any errors that occur while running.
-void runPub(String cacheDir, ArgResults options, List<String> arguments) {
-  var captureStackChains =
-      options['trace'] ||
-      options['verbose'] ||
-      options['verbosity'] == 'all';
-
-  captureErrors(
-      () => invokeCommand(cacheDir, options),
-      captureStackChains: captureStackChains).catchError((error, Chain chain) {
-    log.exception(error, chain);
-
-    if (options['trace']) {
-      log.dumpTranscript();
-    } else if (!isUserFacingException(error)) {
-      log.error("""
-This is an unexpected error. Please run
-
-    pub --trace ${arguments.map((arg) => "'$arg'").join(' ')}
-
-and include the results in a bug report on http://dartbug.com/new.
-""");
-    }
-
-    return flushThenExit(chooseExitCode(error));
-  }).then((_) {
-    // Explicitly exit on success to ensure that any dangling dart:io handles
-    // don't cause the process to never terminate.
-    return flushThenExit(exit_codes.SUCCESS);
-  });
-}
-
-/// Returns the appropriate exit code for [exception], falling back on 1 if no
-/// appropriate exit code could be found.
-int chooseExitCode(exception) {
-  while (exception is WrappedException) exception = exception.innerError;
-
-  if (exception is HttpException ||
-      exception is http.ClientException ||
-      exception is SocketException ||
-      exception is PubHttpException ||
-      exception is DependencyNotFoundException) {
-    return exit_codes.UNAVAILABLE;
-  } else if (exception is FormatException || exception is DataException) {
-    return exit_codes.DATA;
-  } else if (exception is UsageException) {
-    return exit_codes.USAGE;
-  } else {
-    return 1;
-  }
-}
-
-/// Walks the command tree and runs the selected pub command.
-Future invokeCommand(String cacheDir, ArgResults mainOptions) {
-  final completer0 = new Completer();
-  scheduleMicrotask(() {
-    try {
-      var commands = PubCommand.mainCommands;
-      var command;
-      var commandString = "pub";
-      var options = mainOptions;
-      break0() {
-        join0() {
-          join1() {
-            completer0.complete();
-          }
-          finally0(cont0) {
-            command.cache.deleteTempDir();
-            cont0();
-          }
-          catch0(e1, s1) {
-            finally0(() => completer0.completeError(e1, s1));
-          }
-          try {
-            final v0 = command.run(cacheDir, mainOptions, options);
-            finally0(() {
-              completer0.complete(v0);
-            });
-          } catch (e2, s2) {
-            catch0(e2, s2);
-          }
-        }
-        if (!command.takesArguments && options.rest.isNotEmpty) {
-          command.usageError(
-              'Command "${options.name}" does not take any arguments.');
-          join0();
-        } else {
-          join0();
-        }
-      }
-      var trampoline0;
-      continue0() {
-        trampoline0 = null;
-        if (commands.isNotEmpty) {
-          join2() {
-            options = options.command;
-            command = commands[options.name];
-            commands = command.subcommands;
-            commandString += " ${options.name}";
-            join3() {
-              trampoline0 = continue0;
-            }
-            if (options['help']) {
-              command.printUsage();
-              completer0.complete(new Future.value());
-            } else {
-              join3();
-            }
-          }
-          if (options.command == null) {
-            join4() {
-              join2();
-            }
-            if (options.rest.isEmpty) {
-              join5() {
-                command.usageError(
-                    'Missing subcommand for "${commandString}".');
-                join4();
-              }
-              if (command == null) {
-                PubCommand.printGlobalUsage();
-                completer0.complete(new Future.value());
-              } else {
-                join5();
-              }
-            } else {
-              join6() {
-                command.usageError(
-                    'Could not find a subcommand named '
-                        '"${options.rest[0]}" for "${commandString}".');
-                join4();
-              }
-              if (command == null) {
-                PubCommand.usageErrorWithCommands(
-                    commands,
-                    'Could not find a command named "${options.rest[0]}".');
-                join6();
-              } else {
-                join6();
-              }
-            }
-          } else {
-            join2();
-          }
-        } else {
-          break0();
-        }
-      }
-      trampoline0 = continue0;
-      do trampoline0(); while (trampoline0 != null);
-    } catch (e, s) {
-      completer0.completeError(e, s);
-    }
-  });
-  return completer0.future;
-}
-
-/// Checks that pub is running on a supported platform.
-///
-/// If it isn't, it prints an error message and exits. Completes when the
-/// validation is done.
-Future validatePlatform() {
-  final completer0 = new Completer();
-  scheduleMicrotask(() {
-    try {
-      join0() {
-        new Future.value(runProcess('ver', [])).then((x0) {
-          try {
-            var result = x0;
-            join1() {
-              completer0.complete();
-            }
-            if (result.stdout.join('\n').contains('XP')) {
-              log.error('Sorry, but pub is not supported on Windows XP.');
-              new Future.value(flushThenExit(exit_codes.USAGE)).then((x1) {
-                try {
-                  x1;
-                  join1();
-                } catch (e0, s0) {
-                  completer0.completeError(e0, s0);
-                }
-              }, onError: completer0.completeError);
-            } else {
-              join1();
-            }
-          } catch (e1, s1) {
-            completer0.completeError(e1, s1);
-          }
-        }, onError: completer0.completeError);
-      }
-      if (Platform.operatingSystem != 'windows') {
-        completer0.complete(null);
-      } else {
-        join0();
-      }
-    } catch (e, s) {
-      completer0.completeError(e, s);
-    }
-  });
-  return completer0.future;
+  new PubCommandRunner().run(arguments);
 }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/load_all_transformers.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/load_all_transformers.dart
index 43ae020..fc59377 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/barback/load_all_transformers.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/load_all_transformers.dart
@@ -163,6 +163,7 @@
                           try {
                             x4;
                             trampoline0 = continue0;
+                            do trampoline0(); while (trampoline0 != null);
                           } catch (e1, s1) {
                             completer0.completeError(e1, s1);
                           }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_loader.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_loader.dart
index d2b952c..2333e3c 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_loader.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_loader.dart
@@ -79,6 +79,7 @@
                   var id = it0.current;
                   _isolates[id] = isolate;
                   trampoline0 = continue0;
+                  do trampoline0(); while (trampoline0 != null);
                 } else {
                   break0();
                 }
@@ -113,28 +114,42 @@
       try {
         join0() {
           join1() {
-            var transformer = (() {
+            var transformer;
+            join2() {
+              _transformers[config] =
+                  new Set.from([ExcludingTransformer.wrap(transformer, config)]);
+              completer0.complete(_transformers[config]);
+            }
+            catch0(error, stackTrace) {
               try {
-                return new Dart2JSTransformer.withSettings(
-                    _environment,
-                    new BarbackSettings(config.configuration, _environment.mode));
-              } on FormatException catch (error, stackTrace) {
-                fail(error.message, error, stackTrace);
+                if (error is FormatException) {
+                  fail(error.message, error, stackTrace);
+                  join2();
+                } else {
+                  throw error;
+                }
+              } catch (error, stackTrace) {
+                completer0.completeError(error, stackTrace);
               }
-            })();
-            _transformers[config] =
-                new Set.from([ExcludingTransformer.wrap(transformer, config)]);
-            completer0.complete(_transformers[config]);
+            }
+            try {
+              transformer = new Dart2JSTransformer.withSettings(
+                  _environment,
+                  new BarbackSettings(config.configuration, _environment.mode));
+              join2();
+            } catch (e0, s0) {
+              catch0(e0, s0);
+            }
           }
           if (_isolates.containsKey(config.id)) {
             new Future.value(_isolates[config.id].create(config)).then((x0) {
               try {
                 var transformers = x0;
-                join2() {
+                join3() {
                   var message = "No transformers";
-                  join3() {
+                  join4() {
                     var location;
-                    join4() {
+                    join5() {
                       var users =
                           toSentence(ordered(_transformerUsers[config.id]));
                       fail(
@@ -145,37 +160,37 @@
                       location =
                           'package:${config.id.package}/transformer.dart or '
                               'package:${config.id.package}/${config.id.package}.dart';
-                      join4();
+                      join5();
                     } else {
                       location = 'package:${config}.dart';
-                      join4();
+                      join5();
                     }
                   }
                   if (config.configuration.isNotEmpty) {
                     message += " that accept configuration";
-                    join3();
+                    join4();
                   } else {
-                    join3();
+                    join4();
                   }
                 }
                 if (transformers.isNotEmpty) {
                   _transformers[config] = transformers;
                   completer0.complete(transformers);
                 } else {
-                  join2();
+                  join3();
                 }
-              } catch (e0, s0) {
-                completer0.completeError(e0, s0);
+              } catch (e1, s1) {
+                completer0.completeError(e1, s1);
               }
             }, onError: completer0.completeError);
           } else {
-            join5() {
+            join6() {
               join1();
             }
             if (config.id.package != '\$dart2js') {
               completer0.complete(new Future.value(new Set()));
             } else {
-              join5();
+              join6();
             }
           }
         }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command.dart b/sdk/lib/_internal/pub_generated/lib/src/command.dart
index 9ac3674..3724b40 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command.dart
@@ -4,116 +4,37 @@
 
 library pub.command;
 
-import 'dart:async';
-import 'dart:math' as math;
-
 import 'package:args/args.dart';
+import 'package:args/command_runner.dart';
 import 'package:path/path.dart' as path;
 
-import 'command/build.dart';
-import 'command/cache.dart';
-import 'command/deps.dart';
-import 'command/downgrade.dart';
-import 'command/get.dart';
-import 'command/global.dart';
-import 'command/help.dart';
-import 'command/lish.dart';
-import 'command/list_package_dirs.dart';
-import 'command/run.dart';
-import 'command/serve.dart';
-import 'command/upgrade.dart';
-import 'command/uploader.dart';
-import 'command/version.dart';
 import 'entrypoint.dart';
-import 'exceptions.dart';
 import 'log.dart' as log;
 import 'global_packages.dart';
 import 'system_cache.dart';
-import 'utils.dart';
 
 /// The base class for commands for the pub executable.
 ///
 /// A command may either be a "leaf" command or it may be a parent for a set
 /// of subcommands. Only leaf commands are ever actually invoked. If a command
 /// has subcommands, then one of those must always be chosen.
-abstract class PubCommand {
-  /// The commands that pub understands.
-  static final Map<String, PubCommand> mainCommands = _initCommands();
-
-  /// The top-level [ArgParser] used to parse the pub command line.
-  static final pubArgParser = _initArgParser();
-
-  /// Displays usage information for the app.
-  static void printGlobalUsage() {
-    // Build up a buffer so it shows up as a single log entry.
-    var buffer = new StringBuffer();
-    buffer.writeln('Pub is a package manager for Dart.');
-    buffer.writeln();
-    buffer.writeln('Usage: pub <command> [arguments]');
-    buffer.writeln();
-    buffer.writeln('Global options:');
-    buffer.writeln(pubArgParser.getUsage());
-    buffer.writeln();
-    buffer.write(_listCommands(mainCommands));
-    buffer.writeln();
-    buffer.writeln(
-        'Run "pub help [command]" for more information about a command.');
-    buffer.writeln(
-        'See http://dartlang.org/tools/pub for detailed documentation.');
-
-    log.message(buffer);
-  }
-
-  /// Fails with a usage error [message] when trying to select from one of
-  /// [commands].
-  static void usageErrorWithCommands(Map<String, PubCommand> commands,
-      String message) {
-    throw new UsageException(message, _listCommands(commands));
-  }
-
-  /// Writes [commands] in a nicely formatted list to [buffer].
-  static String _listCommands(Map<String, PubCommand> commands) {
-    // If there are no subcommands, do nothing.
-    if (commands.isEmpty) return "";
-
-    // Don't include aliases.
-    var names =
-        commands.keys.where((name) => !commands[name].aliases.contains(name));
-
-    // Filter out hidden ones, unless they are all hidden.
-    var visible = names.where((name) => !commands[name].hidden);
-    if (visible.isNotEmpty) names = visible;
-
-    // Show the commands alphabetically.
-    names = ordered(names);
-    var length = names.map((name) => name.length).reduce(math.max);
-    var isSubcommand = commands != mainCommands;
-
-    var buffer = new StringBuffer();
-    buffer.writeln('Available ${isSubcommand ? "sub" : ""}commands:');
-    for (var name in names) {
-      buffer.writeln(
-          '  ${padRight(name, length)}   '
-              '${commands[name].description.split("\n").first}');
+abstract class PubCommand extends Command {
+  SystemCache get cache {
+    if (_cache == null) {
+      _cache = new SystemCache.withSources(isOffline: isOffline);
     }
-
-    return buffer.toString();
+    return _cache;
   }
-
-  SystemCache get cache => _cache;
   SystemCache _cache;
 
-  GlobalPackages get globals => _globals;
+  GlobalPackages get globals {
+    if (_globals == null) {
+      _globals = new GlobalPackages(cache);
+    }
+    return _globals;
+  }
   GlobalPackages _globals;
 
-  /// The parsed options for the pub executable.
-  ArgResults get globalOptions => _globalOptions;
-  ArgResults _globalOptions;
-
-  /// The parsed options for this command.
-  ArgResults get commandOptions => _commandOptions;
-  ArgResults _commandOptions;
-
   /// Gets the [Entrypoint] package for the current working directory.
   ///
   /// This will load the pubspec and fail with an error if the current directory
@@ -123,59 +44,29 @@
     if (_entrypoint == null) {
       _entrypoint = new Entrypoint(
           path.current,
-          _cache,
-          packageSymlinks: globalOptions['package-symlinks']);
+          cache,
+          packageSymlinks: globalResults['package-symlinks']);
     }
     return _entrypoint;
   }
-
   Entrypoint _entrypoint;
 
-  /// 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 {
-    // Leaf commands are visible by default.
-    if (subcommands.isEmpty) return false;
-
-    // Otherwise, a command is hidden if all of its subcommands are.
-    return subcommands.values.every((subcommand) => subcommand.hidden);
-  }
-
-  /// How to invoke this command (e.g. `"pub get [package]"`).
-  String get usage;
-
   /// The URL for web documentation for this command.
   String get docUrl => null;
 
-  /// Whether or not this command takes arguments in addition to options.
-  ///
-  /// If false, pub will exit with an error if arguments are provided. This
-  /// only needs to be set in leaf commands.
-  bool get takesArguments => false;
-
   /// Override this and return `false` to disallow trailing options from being
   /// parsed after a non-option argument is parsed.
   bool get allowTrailingOptions => true;
 
-  /// Alternate names for this command.
-  ///
-  /// These names won't be used in the documentation, but they will work when
-  /// invoked on the command line.
-  final aliases = const <String>[];
-
-  /// The [ArgParser] for this command.
-  ArgParser get commandParser => _commandParser;
-  ArgParser _commandParser;
-
-  /// Subcommands exposed by this command.
-  ///
-  /// If empty, then this command has no subcommands. Otherwise, a subcommand
-  /// must be specified by the user. In that case, this command's [onRun] will
-  /// not be called and the subcommand's will.
-  final subcommands = <String, PubCommand>{};
+  ArgParser get argParser {
+    // Lazily initialize the parser because the superclass constructor requires
+    // it but we want to initialize it based on [allowTrailingOptions].
+    if (_argParser == null) {
+      _argParser = new ArgParser(allowTrailingOptions: allowTrailingOptions);
+    }
+    return _argParser;
+  }
+  ArgParser _argParser;
 
   /// Override this to use offline-only sources instead of hitting the network.
   ///
@@ -183,53 +74,13 @@
   /// it has no effect. This only needs to be set in leaf commands.
   bool get isOffline => false;
 
-  PubCommand() {
-    _commandParser = new ArgParser(allowTrailingOptions: allowTrailingOptions);
-
-    // Allow "--help" after a command to get command help.
-    commandParser.addFlag(
-        'help',
-        abbr: 'h',
-        negatable: false,
-        help: 'Print usage information for this command.');
+  String get usageFooter {
+    if (docUrl == null) return null;
+    return "See $docUrl for detailed documentation.";
   }
 
-  /// Runs this command using a system cache at [cacheDir] with [globalOptions]
-  /// and [options].
-  Future run(String cacheDir, ArgResults globalOptions, ArgResults options) {
-    _globalOptions = globalOptions;
-    _commandOptions = options;
-
-    _cache = new SystemCache.withSources(cacheDir, isOffline: isOffline);
-    _globals = new GlobalPackages(_cache);
-
-    return new Future.sync(onRun);
-  }
-
-  /// Override this to perform the specific command.
-  ///
-  /// Return a future that completes when the command is done or fails if the
-  /// command fails. If the command is synchronous, it may return `null`. Only
-  /// leaf command should override this.
-  Future onRun() {
-    // Leaf commands should override this and non-leaf commands should never
-    // call it.
-    assert(false);
-    return null;
-  }
-
-  /// Displays usage information for this command.
-  ///
-  /// If [description] is omitted, defaults to the command's description.
-  void printUsage([String description]) {
-    if (description == null) description = this.description;
-    log.message('$description\n\n${_getUsage()}');
-  }
-
-  /// Throw a [UsageException] for a usage error of this command with
-  /// [message].
-  void usageError(String message) {
-    throw new UsageException(message, _getUsage());
+  void printUsage() {
+    log.message(usage);
   }
 
   /// Parses a user-supplied integer [intString] named [name].
@@ -239,117 +90,7 @@
     try {
       return int.parse(intString);
     } on FormatException catch (_) {
-      usageError('Could not parse $name "$intString".');
+      usageException('Could not parse $name "$intString".');
     }
   }
-
-  /// Generates a string of usage information for this command.
-  String _getUsage() {
-    var buffer = new StringBuffer();
-    buffer.write('Usage: $usage');
-
-    var commandUsage = commandParser.getUsage();
-    if (!commandUsage.isEmpty) {
-      buffer.writeln();
-      buffer.writeln(commandUsage);
-    }
-
-    if (subcommands.isNotEmpty) {
-      buffer.writeln();
-      buffer.write(_listCommands(subcommands));
-    }
-
-    buffer.writeln();
-    buffer.writeln('Run "pub help" to see global options.');
-    if (docUrl != null) {
-      buffer.writeln("See $docUrl for detailed documentation.");
-    }
-
-    return buffer.toString();
-  }
-}
-
-_initCommands() {
-  var commands = {
-    'build': new BuildCommand(),
-    'cache': new CacheCommand(),
-    'deps': new DepsCommand(),
-    'downgrade': new DowngradeCommand(),
-    'global': new GlobalCommand(),
-    'get': new GetCommand(),
-    'help': new HelpCommand(),
-    'list-package-dirs': new ListPackageDirsCommand(),
-    'publish': new LishCommand(),
-    'run': new RunCommand(),
-    'serve': new ServeCommand(),
-    'upgrade': new UpgradeCommand(),
-    'uploader': new UploaderCommand(),
-    'version': new VersionCommand()
-  };
-
-  for (var command in commands.values.toList()) {
-    for (var alias in command.aliases) {
-      commands[alias] = command;
-    }
-  }
-
-  return commands;
-}
-
-/// Creates the top-level [ArgParser] used to parse the pub command line.
-ArgParser _initArgParser() {
-  var argParser = new ArgParser(allowTrailingOptions: true);
-
-  // Add the global options.
-  argParser.addFlag(
-      'help',
-      abbr: 'h',
-      negatable: false,
-      help: 'Print this usage information.');
-  argParser.addFlag('version', negatable: false, help: 'Print pub version.');
-  argParser.addFlag(
-      'trace',
-      help: 'Print debugging information when an error occurs.');
-  argParser.addOption(
-      'verbosity',
-      help: 'Control output verbosity.',
-      allowed: ['normal', 'io', 'solver', 'all'],
-      allowedHelp: {
-    'normal': 'Show errors, warnings, and user messages.',
-    'io': 'Also show IO operations.',
-    'solver': 'Show steps during version resolution.',
-    'all': 'Show all output including internal tracing messages.'
-  });
-  argParser.addFlag(
-      'verbose',
-      abbr: 'v',
-      negatable: false,
-      help: 'Shortcut for "--verbosity=all".');
-  argParser.addFlag(
-      'with-prejudice',
-      hide: !isAprilFools,
-      negatable: false,
-      help: 'Execute commands with prejudice.');
-  argParser.addFlag(
-      'package-symlinks',
-      hide: true,
-      negatable: true,
-      defaultsTo: true);
-
-  // Register the commands.
-  PubCommand.mainCommands.forEach((name, command) {
-    _registerCommand(name, command, argParser);
-  });
-
-  return argParser;
-}
-
-/// Registers a [command] with [name] on [parser].
-void _registerCommand(String name, PubCommand command, ArgParser parser) {
-  parser.addCommand(name, command.commandParser);
-
-  // Recursively wire up any subcommands.
-  command.subcommands.forEach((name, subcommand) {
-    _registerCommand(name, subcommand, command.commandParser);
-  });
 }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/barback.dart b/sdk/lib/_internal/pub_generated/lib/src/command/barback.dart
index 556eb14..5fdc519 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/barback.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/barback.dart
@@ -23,10 +23,8 @@
 
 /// Shared base class for [BuildCommand] and [ServeCommand].
 abstract class BarbackCommand extends PubCommand {
-  final takesArguments = true;
-
   /// The build mode.
-  BarbackMode get mode => new BarbackMode(commandOptions["mode"]);
+  BarbackMode get mode => new BarbackMode(argResults["mode"]);
 
   /// The directories in the entrypoint package that should be added to the
   /// build environment.
@@ -40,24 +38,24 @@
   List<String> get defaultSourceDirectories;
 
   BarbackCommand() {
-    commandParser.addOption(
+    argParser.addOption(
         "mode",
         defaultsTo: defaultMode.toString(),
         help: "Mode to run transformers in.");
 
-    commandParser.addFlag(
+    argParser.addFlag(
         "all",
         help: "Use all default source directories.",
         defaultsTo: false,
         negatable: false);
   }
 
-  Future onRun() {
+  Future run() {
     // Switch to JSON output if specified. We need to do this before parsing
     // the source directories so an error will be correctly reported in JSON
     // format.
-    log.json.enabled = commandOptions.options.contains("format") &&
-        commandOptions["format"] == "json";
+    log.json.enabled =
+        argResults.options.contains("format") && argResults["format"] == "json";
 
     _parseSourceDirectories();
     return onRunTransformerCommand();
@@ -78,18 +76,18 @@
   ///
   /// Throws an exception if the arguments are invalid.
   void _parseSourceDirectories() {
-    if (commandOptions["all"]) {
+    if (argResults["all"]) {
       _addAllDefaultSources();
       return;
     }
 
     // If no directories were specified, use the defaults.
-    if (commandOptions.rest.isEmpty) {
+    if (argResults.rest.isEmpty) {
       _addDefaultSources();
       return;
     }
 
-    sourceDirectories.addAll(commandOptions.rest);
+    sourceDirectories.addAll(argResults.rest);
 
     // Prohibit "lib".
     var disallowed = sourceDirectories.where((dir) {
@@ -98,13 +96,14 @@
     });
 
     if (disallowed.isNotEmpty) {
-      usageError(_directorySentence(disallowed, "is", "are", "not allowed"));
+      usageException(
+          _directorySentence(disallowed, "is", "are", "not allowed"));
     }
 
     // Make sure the source directories don't reach out of the package.
     var invalid = sourceDirectories.where((dir) => !path.isWithin('.', dir));
     if (invalid.isNotEmpty) {
-      usageError(
+      usageException(
           _directorySentence(invalid, "isn't", "aren't", "in this package"));
     }
 
@@ -130,7 +129,7 @@
     }
 
     if (overlapping.isNotEmpty) {
-      usageError(
+      usageException(
           _directorySentence(overlapping, "cannot", "cannot", "overlap"));
     }
   }
@@ -138,8 +137,8 @@
   /// Handles "--all" by adding all default source directories that are
   /// present.
   void _addAllDefaultSources() {
-    if (commandOptions.rest.isNotEmpty) {
-      usageError('Directory names are not allowed if "--all" is passed.');
+    if (argResults.rest.isNotEmpty) {
+      usageException('Directory names are not allowed if "--all" is passed.');
     }
 
     // Include every build directory that exists in the package.
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/build.dart b/sdk/lib/_internal/pub_generated/lib/src/command/build.dart
index 5aeb376..80060c8 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/build.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/build.dart
@@ -20,13 +20,14 @@
 
 /// Handles the `build` pub command.
 class BuildCommand extends BarbackCommand {
+  String get name => "build";
   String get description => "Apply transformers to build a package.";
-  String get usage => "pub build [options] [directories...]";
+  String get invocation => "pub build [options] [directories...]";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-build.html";
   List<String> get aliases => const ["deploy", "settle-up"];
 
   /// The path to the application's build output directory.
-  String get outputDirectory => commandOptions["output"];
+  String get outputDirectory => argResults["output"];
 
   List<String> get defaultSourceDirectories => ["web"];
 
@@ -34,13 +35,13 @@
   int builtFiles = 0;
 
   BuildCommand() {
-    commandParser.addOption(
+    argParser.addOption(
         "format",
         help: "How output should be displayed.",
         allowed: ["text", "json"],
         defaultsTo: "text");
 
-    commandParser.addOption(
+    argParser.addOption(
         "output",
         abbr: "o",
         help: "Directory to write build outputs to.",
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/cache.dart b/sdk/lib/_internal/pub_generated/lib/src/command/cache.dart
index f0559b76..432f096 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/cache.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/cache.dart
@@ -11,13 +11,14 @@
 
 /// Handles the `cache` pub command.
 class CacheCommand extends PubCommand {
+  String get name => "cache";
   String get description => "Work with the system cache.";
-  String get usage => "pub cache <subcommand>";
+  String get invocation => "pub cache <subcommand>";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-cache.html";
 
-  final subcommands = {
-    "add": new CacheAddCommand(),
-    "list": new CacheListCommand(),
-    "repair": new CacheRepairCommand()
-  };
+  CacheCommand() {
+    addSubcommand(new CacheAddCommand());
+    addSubcommand(new CacheListCommand());
+    addSubcommand(new CacheRepairCommand());
+  }
 }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/cache_add.dart b/sdk/lib/_internal/pub_generated/lib/src/command/cache_add.dart
index 8fbc89f..1ad2646 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/cache_add.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/cache_add.dart
@@ -15,43 +15,43 @@
 
 /// Handles the `cache add` pub command.
 class CacheAddCommand extends PubCommand {
+  String get name => "add";
   String get description => "Install a package.";
-  String get usage =>
+  String get invocation =>
       "pub cache add <package> [--version <constraint>] [--all]";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-cache.html";
-  bool get takesArguments => true;
 
   CacheAddCommand() {
-    commandParser.addFlag(
+    argParser.addFlag(
         "all",
         help: "Install all matching versions.",
         negatable: false);
 
-    commandParser.addOption("version", abbr: "v", help: "Version constraint.");
+    argParser.addOption("version", abbr: "v", help: "Version constraint.");
   }
 
-  Future onRun() {
+  Future run() {
     // Make sure there is a package.
-    if (commandOptions.rest.isEmpty) {
-      usageError("No package to add given.");
+    if (argResults.rest.isEmpty) {
+      usageException("No package to add given.");
     }
 
     // Don't allow extra arguments.
-    if (commandOptions.rest.length > 1) {
-      var unexpected = commandOptions.rest.skip(1).map((arg) => '"$arg"');
+    if (argResults.rest.length > 1) {
+      var unexpected = argResults.rest.skip(1).map((arg) => '"$arg"');
       var arguments = pluralize("argument", unexpected.length);
-      usageError("Unexpected $arguments ${toSentence(unexpected)}.");
+      usageException("Unexpected $arguments ${toSentence(unexpected)}.");
     }
 
-    var package = commandOptions.rest.single;
+    var package = argResults.rest.single;
 
     // Parse the version constraint, if there is one.
     var constraint = VersionConstraint.any;
-    if (commandOptions["version"] != null) {
+    if (argResults["version"] != null) {
       try {
-        constraint = new VersionConstraint.parse(commandOptions["version"]);
+        constraint = new VersionConstraint.parse(argResults["version"]);
       } on FormatException catch (error) {
-        usageError(error.message);
+        usageException(error.message);
       }
     }
 
@@ -82,7 +82,7 @@
         });
       }
 
-      if (commandOptions["all"]) {
+      if (argResults["all"]) {
         // Install them in ascending order.
         versions.sort();
         return Future.forEach(versions, downloadVersion);
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/cache_list.dart b/sdk/lib/_internal/pub_generated/lib/src/command/cache_list.dart
index f69b748..78f7e8a 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/cache_list.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/cache_list.dart
@@ -4,7 +4,6 @@
 
 library pub.command.cache_list;
 
-import 'dart:async';
 import 'dart:convert';
 
 import '../command.dart';
@@ -13,11 +12,13 @@
 
 /// Handles the `cache list` pub command.
 class CacheListCommand extends PubCommand {
+  String get name => "list";
   String get description => "List packages in the system cache.";
-  String get usage => "pub cache list";
+  String get invocation => "pub cache list";
   bool get hidden => true;
+  bool get takesArguments => false;
 
-  Future onRun() {
+  void run() {
     // TODO(keertip): Add flag to list packages from non default sources.
     var packagesObj = <String, Map>{};
 
@@ -34,6 +35,5 @@
     log.message(JSON.encode({
       'packages': packagesObj
     }));
-    return null;
   }
 }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/cache_repair.dart b/sdk/lib/_internal/pub_generated/lib/src/command/cache_repair.dart
index 5d1b83e..5b1e13c 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/cache_repair.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/cache_repair.dart
@@ -15,11 +15,13 @@
 
 /// Handles the `cache repair` pub command.
 class CacheRepairCommand extends PubCommand {
+  String get name => "repair";
   String get description => "Reinstall cached packages.";
-  String get usage => "pub cache repair";
+  String get invocation => "pub cache repair";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-cache.html";
+  bool get takesArguments => false;
 
-  Future onRun() {
+  Future run() {
     final completer0 = new Completer();
     scheduleMicrotask(() {
       try {
@@ -113,6 +115,7 @@
                     successes += results.first;
                     failures += results.last;
                     trampoline0 = continue0;
+                    do trampoline0(); while (trampoline0 != null);
                   } catch (e2, s2) {
                     completer0.completeError(e2, s2);
                   }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/deps.dart b/sdk/lib/_internal/pub_generated/lib/src/command/deps.dart
index 4763bef..ce5bcdd 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/deps.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/deps.dart
@@ -16,10 +16,12 @@
 
 /// Handles the `deps` pub command.
 class DepsCommand extends PubCommand {
+  String get name => "deps";
   String get description => "Print package dependencies.";
   List<String> get aliases => const ["dependencies", "tab"];
-  String get usage => "pub deps";
+  String get invocation => "pub deps";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-deps.html";
+  bool get takesArguments => false;
 
   /// The loaded package graph.
   PackageGraph _graph;
@@ -28,7 +30,7 @@
   StringBuffer _buffer;
 
   DepsCommand() {
-    commandParser.addOption(
+    argParser.addOption(
         "style",
         abbr: "s",
         help: "How output should be displayed.",
@@ -36,14 +38,14 @@
         defaultsTo: "tree");
   }
 
-  Future onRun() {
+  Future run() {
     return entrypoint.loadPackageGraph().then((graph) {
       _graph = graph;
       _buffer = new StringBuffer();
 
       _buffer.writeln(_labelPackage(entrypoint.root));
 
-      switch (commandOptions["style"]) {
+      switch (argResults["style"]) {
         case "compact":
           _outputCompact();
           break;
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/downgrade.dart b/sdk/lib/_internal/pub_generated/lib/src/command/downgrade.dart
index fd38854..8736402 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/downgrade.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/downgrade.dart
@@ -12,35 +12,35 @@
 
 /// Handles the `downgrade` pub command.
 class DowngradeCommand extends PubCommand {
+  String get name => "downgrade";
   String get description =>
       "Downgrade the current package's dependencies to oldest versions.\n\n"
           "This doesn't modify the lockfile, so it can be reset with \"pub get\".";
-  String get usage => "pub downgrade [dependencies...]";
-  bool get takesArguments => true;
+  String get invocation => "pub downgrade [dependencies...]";
 
-  bool get isOffline => commandOptions['offline'];
+  bool get isOffline => argResults['offline'];
 
   DowngradeCommand() {
-    commandParser.addFlag(
+    argParser.addFlag(
         'offline',
         help: 'Use cached packages instead of accessing the network.');
 
-    commandParser.addFlag(
+    argParser.addFlag(
         'dry-run',
         abbr: 'n',
         negatable: false,
         help: "Report what dependencies would change but don't change any.");
   }
 
-  Future onRun() {
+  Future run() {
     final completer0 = new Completer();
     scheduleMicrotask(() {
       try {
-        var dryRun = commandOptions['dry-run'];
+        var dryRun = argResults['dry-run'];
         new Future.value(
             entrypoint.acquireDependencies(
                 SolveType.DOWNGRADE,
-                useLatest: commandOptions.rest,
+                useLatest: argResults.rest,
                 dryRun: dryRun)).then((x0) {
           try {
             x0;
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/get.dart b/sdk/lib/_internal/pub_generated/lib/src/command/get.dart
index 3e79fe4..70f7518 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/get.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/get.dart
@@ -11,27 +11,28 @@
 
 /// Handles the `get` pub command.
 class GetCommand extends PubCommand {
+  String get name => "get";
   String get description => "Get the current package's dependencies.";
-  String get usage => "pub get";
+  String get invocation => "pub get";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-get.html";
   List<String> get aliases => const ["install"];
-  bool get isOffline => commandOptions["offline"];
+  bool get isOffline => argResults["offline"];
 
   GetCommand() {
-    commandParser.addFlag(
+    argParser.addFlag(
         'offline',
         help: 'Use cached packages instead of accessing the network.');
 
-    commandParser.addFlag(
+    argParser.addFlag(
         'dry-run',
         abbr: 'n',
         negatable: false,
         help: "Report what dependencies would change but don't change any.");
   }
 
-  Future onRun() {
+  Future run() {
     return entrypoint.acquireDependencies(
         SolveType.GET,
-        dryRun: commandOptions['dry-run']);
+        dryRun: argResults['dry-run']);
   }
 }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/global.dart b/sdk/lib/_internal/pub_generated/lib/src/command/global.dart
index c1b1730..c2ddfd8 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/global.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/global.dart
@@ -12,13 +12,14 @@
 
 /// Handles the `global` pub command.
 class GlobalCommand extends PubCommand {
+  String get name => "global";
   String get description => "Work with global packages.";
-  String get usage => "pub global <subcommand>";
+  String get invocation => "pub global <subcommand>";
 
-  final subcommands = {
-    "activate": new GlobalActivateCommand(),
-    "deactivate": new GlobalDeactivateCommand(),
-    "list": new GlobalListCommand(),
-    "run": new GlobalRunCommand()
-  };
+  GlobalCommand() {
+    addSubcommand(new GlobalActivateCommand());
+    addSubcommand(new GlobalDeactivateCommand());
+    addSubcommand(new GlobalListCommand());
+    addSubcommand(new GlobalRunCommand());
+  }
 }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/global_activate.dart b/sdk/lib/_internal/pub_generated/lib/src/command/global_activate.dart
index 2e51a90..f567f4b 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/global_activate.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/global_activate.dart
@@ -13,54 +13,54 @@
 
 /// Handles the `global activate` pub command.
 class GlobalActivateCommand extends PubCommand {
+  String get name => "activate";
   String get description => "Make a package's executables globally available.";
-  String get usage => "pub global activate <package...>";
-  bool get takesArguments => true;
+  String get invocation => "pub global activate <package...>";
 
   GlobalActivateCommand() {
-    commandParser.addOption(
+    argParser.addOption(
         "source",
         abbr: "s",
         help: "The source used to find the package.",
         allowed: ["git", "hosted", "path"],
         defaultsTo: "hosted");
 
-    commandParser.addFlag(
+    argParser.addFlag(
         "no-executables",
         negatable: false,
         help: "Do not put executables on PATH.");
 
-    commandParser.addOption(
+    argParser.addOption(
         "executable",
         abbr: "x",
         help: "Executable(s) to place on PATH.",
         allowMultiple: true);
 
-    commandParser.addFlag(
+    argParser.addFlag(
         "overwrite",
         negatable: false,
         help: "Overwrite executables from other packages with the same name.");
   }
 
-  Future onRun() {
+  Future run() {
     // Default to `null`, which means all executables.
     var executables;
-    if (commandOptions.wasParsed("executable")) {
-      if (commandOptions.wasParsed("no-executables")) {
-        usageError("Cannot pass both --no-executables and --executable.");
+    if (argResults.wasParsed("executable")) {
+      if (argResults.wasParsed("no-executables")) {
+        usageException("Cannot pass both --no-executables and --executable.");
       }
 
-      executables = commandOptions["executable"];
-    } else if (commandOptions["no-executables"]) {
+      executables = argResults["executable"];
+    } else if (argResults["no-executables"]) {
       // An empty list means no executables.
       executables = [];
     }
 
-    var overwrite = commandOptions["overwrite"];
-    var args = commandOptions.rest;
+    var overwrite = argResults["overwrite"];
+    var args = argResults.rest;
 
     readArg([String error]) {
-      if (args.isEmpty) usageError(error);
+      if (args.isEmpty) usageException(error);
       var arg = args.first;
       args = args.skip(1);
       return arg;
@@ -70,10 +70,10 @@
       if (args.isEmpty) return;
       var unexpected = args.map((arg) => '"$arg"');
       var arguments = pluralize("argument", unexpected.length);
-      usageError("Unexpected $arguments ${toSentence(unexpected)}.");
+      usageException("Unexpected $arguments ${toSentence(unexpected)}.");
     }
 
-    switch (commandOptions["source"]) {
+    switch (argResults["source"]) {
       case "git":
         var repo = readArg("No Git repository given.");
         // TODO(rnystrom): Allow passing in a Git ref too.
@@ -92,7 +92,7 @@
           try {
             constraint = new VersionConstraint.parse(readArg());
           } on FormatException catch (error) {
-            usageError(error.message);
+            usageException(error.message);
           }
         }
 
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/global_deactivate.dart b/sdk/lib/_internal/pub_generated/lib/src/command/global_deactivate.dart
index 4e96655..595f6ff 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/global_deactivate.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/global_deactivate.dart
@@ -12,27 +12,25 @@
 
 /// Handles the `global deactivate` pub command.
 class GlobalDeactivateCommand extends PubCommand {
+  String get name => "deactivate";
   String get description => "Remove a previously activated package.";
-  String get usage => "pub global deactivate <package>";
-  bool get takesArguments => true;
+  String get invocation => "pub global deactivate <package>";
 
-  Future onRun() {
+  void run() {
     // Make sure there is a package.
-    if (commandOptions.rest.isEmpty) {
-      usageError("No package to deactivate given.");
+    if (argResults.rest.isEmpty) {
+      usageException("No package to deactivate given.");
     }
 
     // Don't allow extra arguments.
-    if (commandOptions.rest.length > 1) {
-      var unexpected = commandOptions.rest.skip(1).map((arg) => '"$arg"');
+    if (argResults.rest.length > 1) {
+      var unexpected = argResults.rest.skip(1).map((arg) => '"$arg"');
       var arguments = pluralize("argument", unexpected.length);
-      usageError("Unexpected $arguments ${toSentence(unexpected)}.");
+      usageException("Unexpected $arguments ${toSentence(unexpected)}.");
     }
 
-    if (!globals.deactivate(commandOptions.rest.first)) {
-      dataError("No active package ${log.bold(commandOptions.rest.first)}.");
+    if (!globals.deactivate(argResults.rest.first)) {
+      dataError("No active package ${log.bold(argResults.rest.first)}.");
     }
-
-    return null;
   }
 }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/global_list.dart b/sdk/lib/_internal/pub_generated/lib/src/command/global_list.dart
index c498b42..1de1073 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/global_list.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/global_list.dart
@@ -10,12 +10,13 @@
 
 /// Handles the `global list` pub command.
 class GlobalListCommand extends PubCommand {
-  bool get allowTrailingOptions => false;
+  String get name => "list";
   String get description => 'List globally activated packages.';
-  String get usage => 'pub global list';
+  String get invocation => 'pub global list';
+  bool get allowTrailingOptions => false;
+  bool get takesArguments => false;
 
-  Future onRun() {
+  void run() {
     globals.listActivePackages();
-    return null;
   }
 }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/global_run.dart b/sdk/lib/_internal/pub_generated/lib/src/command/global_run.dart
index ed4d93e..54874c1 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/global_run.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/global_run.dart
@@ -15,32 +15,32 @@
 
 /// Handles the `global run` pub command.
 class GlobalRunCommand extends PubCommand {
-  bool get takesArguments => true;
-  bool get allowTrailingOptions => false;
+  String get name => "run";
   String get description =>
       "Run an executable from a globally activated package.\n"
           "NOTE: We are currently optimizing this command's startup time.";
-  String get usage => "pub global run <package>:<executable> [args...]";
+  String get invocation => "pub global run <package>:<executable> [args...]";
+  bool get allowTrailingOptions => false;
 
   /// The mode for barback transformers.
-  BarbackMode get mode => new BarbackMode(commandOptions["mode"]);
+  BarbackMode get mode => new BarbackMode(argResults["mode"]);
 
   GlobalRunCommand() {
-    commandParser.addOption(
+    argParser.addOption(
         "mode",
         defaultsTo: "release",
         help: 'Mode to run transformers in.');
   }
 
-  Future onRun() {
+  Future run() {
     final completer0 = new Completer();
     scheduleMicrotask(() {
       try {
         join0() {
           var package;
-          var executable = commandOptions.rest[0];
+          var executable = argResults.rest[0];
           join1() {
-            var args = commandOptions.rest.skip(1).toList();
+            var args = argResults.rest.skip(1).toList();
             join2() {
               new Future.value(
                   globals.runExecutable(package, executable, args, mode: mode)).then((x0) {
@@ -60,7 +60,7 @@
               }, onError: completer0.completeError);
             }
             if (p.split(executable).length > 1) {
-              usageError(
+              usageException(
                   'Cannot run an executable in a subdirectory of a global ' + 'package.');
               join2();
             } else {
@@ -77,8 +77,8 @@
             join1();
           }
         }
-        if (commandOptions.rest.isEmpty) {
-          usageError("Must specify an executable to run.");
+        if (argResults.rest.isEmpty) {
+          usageException("Must specify an executable to run.");
           join0();
         } else {
           join0();
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/help.dart b/sdk/lib/_internal/pub_generated/lib/src/command/help.dart
deleted file mode 100644
index aac7ff9..0000000
--- a/sdk/lib/_internal/pub_generated/lib/src/command/help.dart
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library pub.command.help;
-
-import 'dart:async';
-
-import '../command.dart';
-
-/// Handles the `help` pub command.
-class HelpCommand extends PubCommand {
-  String get description => "Display help information for Pub.";
-  String get usage => "pub help [command]";
-  bool get takesArguments => true;
-
-  Future onRun() {
-    // Show the default help if no command was specified.
-    if (commandOptions.rest.isEmpty) {
-      PubCommand.printGlobalUsage();
-      return null;
-    }
-
-    // Walk the command tree to show help for the selected command or
-    // subcommand.
-    var commands = PubCommand.mainCommands;
-    var command = null;
-    var commandString = "pub";
-
-    for (var name in commandOptions.rest) {
-      if (commands.isEmpty) {
-        command.usageError(
-            'Command "$commandString" does not expect a subcommand.');
-      }
-
-      if (commands[name] == null) {
-        if (command == null) {
-          PubCommand.usageErrorWithCommands(
-              commands,
-              'Could not find a command named "$name".');
-        }
-
-        command.usageError(
-            'Could not find a subcommand named "$name" for "$commandString".');
-      }
-
-      command = commands[name];
-      commands = command.subcommands;
-      commandString += " $name";
-    }
-
-    command.printUsage();
-    return null;
-  }
-}
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/lish.dart b/sdk/lib/_internal/pub_generated/lib/src/command/lish.dart
index 279ddda..ef5840e 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/lish.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/lish.dart
@@ -20,16 +20,18 @@
 
 /// Handles the `lish` and `publish` pub commands.
 class LishCommand extends PubCommand {
+  String get name => "publish";
   String get description => "Publish the current package to pub.dartlang.org.";
-  String get usage => "pub publish [options]";
+  String get invocation => "pub publish [options]";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-lish.html";
   List<String> get aliases => const ["lish", "lush"];
+  bool get takesArguments => false;
 
   /// The URL of the server to which to upload the package.
   Uri get server {
     // An explicit argument takes precedence.
-    if (commandOptions.wasParsed('server')) {
-      return Uri.parse(commandOptions['server']);
+    if (argResults.wasParsed('server')) {
+      return Uri.parse(argResults['server']);
     }
 
     // Otherwise, use the one specified in the pubspec.
@@ -42,23 +44,23 @@
   }
 
   /// Whether the publish is just a preview.
-  bool get dryRun => commandOptions['dry-run'];
+  bool get dryRun => argResults['dry-run'];
 
   /// Whether the publish requires confirmation.
-  bool get force => commandOptions['force'];
+  bool get force => argResults['force'];
 
   LishCommand() {
-    commandParser.addFlag(
+    argParser.addFlag(
         'dry-run',
         abbr: 'n',
         negatable: false,
         help: 'Validate but do not publish the package.');
-    commandParser.addFlag(
+    argParser.addFlag(
         'force',
         abbr: 'f',
         negatable: false,
         help: 'Publish without confirmation if there are no errors.');
-    commandParser.addOption(
+    argParser.addOption(
         'server',
         defaultsTo: HostedSource.defaultUrl,
         help: 'The package server to which to upload this package.');
@@ -118,9 +120,9 @@
     });
   }
 
-  Future onRun() {
+  Future run() {
     if (force && dryRun) {
-      usageError('Cannot use both --force and --dry-run.');
+      usageException('Cannot use both --force and --dry-run.');
     }
 
     if (entrypoint.root.pubspec.isPrivate) {
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/list_package_dirs.dart b/sdk/lib/_internal/pub_generated/lib/src/command/list_package_dirs.dart
index 6c08c76..c68d8e0 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/list_package_dirs.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/list_package_dirs.dart
@@ -14,18 +14,20 @@
 
 /// Handles the `list-package-dirs` pub command.
 class ListPackageDirsCommand extends PubCommand {
+  String get name => "list-package-dirs";
   String get description => "Print local paths to dependencies.";
-  String get usage => "pub list-package-dirs";
+  String get invocation => "pub list-package-dirs";
+  bool get takesArguments => false;
   bool get hidden => true;
 
   ListPackageDirsCommand() {
-    commandParser.addOption(
+    argParser.addOption(
         "format",
         help: "How output should be displayed.",
         allowed: ["json"]);
   }
 
-  Future onRun() {
+  Future run() {
     log.json.enabled = true;
 
     if (!entrypoint.lockFileExists) {
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/run.dart b/sdk/lib/_internal/pub_generated/lib/src/command/run.dart
index a9fee0f..0d63daf 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/run.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/run.dart
@@ -16,28 +16,28 @@
 
 /// Handles the `run` pub command.
 class RunCommand extends PubCommand {
-  bool get takesArguments => true;
-  bool get allowTrailingOptions => false;
+  String get name => "run";
   String get description =>
       "Run an executable from a package.\n"
           "NOTE: We are currently optimizing this command's startup time.";
-  String get usage => "pub run <executable> [args...]";
+  String get invocation => "pub run <executable> [args...]";
+  bool get allowTrailingOptions => false;
 
   RunCommand() {
-    commandParser.addOption(
+    argParser.addOption(
         "mode",
         help: 'Mode to run transformers in.\n'
             '(defaults to "release" for dependencies, "debug" for ' 'entrypoint)');
   }
 
-  Future onRun() {
+  Future run() {
     final completer0 = new Completer();
     scheduleMicrotask(() {
       try {
         join0() {
           var package = entrypoint.root.name;
-          var executable = commandOptions.rest[0];
-          var args = commandOptions.rest.skip(1).toList();
+          var executable = argResults.rest[0];
+          var args = argResults.rest.skip(1).toList();
           join1() {
             var mode;
             join2() {
@@ -58,8 +58,8 @@
                 }
               }, onError: completer0.completeError);
             }
-            if (commandOptions['mode'] != null) {
-              mode = new BarbackMode(commandOptions['mode']);
+            if (argResults['mode'] != null) {
+              mode = new BarbackMode(argResults['mode']);
               join2();
             } else {
               join3() {
@@ -82,7 +82,7 @@
               join1();
             }
             if (p.split(executable).length > 1) {
-              usageError(
+              usageException(
                   "Cannot run an executable in a subdirectory of a " + "dependency.");
               join4();
             } else {
@@ -92,8 +92,8 @@
             join1();
           }
         }
-        if (commandOptions.rest.isEmpty) {
-          usageError("Must specify an executable to run.");
+        if (argResults.rest.isEmpty) {
+          usageException("Must specify an executable to run.");
           join0();
         } else {
           join0();
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/serve.dart b/sdk/lib/_internal/pub_generated/lib/src/command/serve.dart
index 268f63a..5c5062b 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/serve.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/serve.dart
@@ -19,35 +19,36 @@
 
 /// Handles the `serve` pub command.
 class ServeCommand extends BarbackCommand {
+  String get name => "serve";
   String get description =>
       'Run a local web development server.\n\n'
           'By default, this serves "web/" and "test/", but an explicit list of \n'
           'directories to serve can be provided as well.';
-  String get usage => "pub serve [directories...]";
+  String get invocation => "pub serve [directories...]";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-serve.html";
 
   PubPackageProvider _provider;
 
-  String get hostname => commandOptions['hostname'];
+  String get hostname => argResults['hostname'];
 
   /// The base port for the servers.
   ///
   /// This will print a usage error and exit if the specified port is invalid.
-  int get port => parseInt(commandOptions['port'], 'port');
+  int get port => parseInt(argResults['port'], 'port');
 
   /// The port for the admin UI.
   ///
   /// This will print a usage error and exit if the specified port is invalid.
   int get adminPort {
-    var adminPort = commandOptions['admin-port'];
+    var adminPort = argResults['admin-port'];
     return adminPort == null ? null : parseInt(adminPort, 'admin port');
   }
 
   /// `true` if Dart entrypoints should be compiled to JavaScript.
-  bool get useDart2JS => commandOptions['dart2js'];
+  bool get useDart2JS => argResults['dart2js'];
 
   /// `true` if the admin server URL should be displayed on startup.
-  bool get logAdminUrl => commandOptions['log-admin-url'];
+  bool get logAdminUrl => argResults['log-admin-url'];
 
   BarbackMode get defaultMode => BarbackMode.DEBUG;
 
@@ -58,11 +59,11 @@
   final _completer = new Completer();
 
   ServeCommand() {
-    commandParser.addOption(
+    argParser.addOption(
         'hostname',
         defaultsTo: 'localhost',
         help: 'The hostname to listen on.');
-    commandParser.addOption(
+    argParser.addOption(
         'port',
         defaultsTo: '8080',
         help: 'The base port to listen on.');
@@ -72,16 +73,16 @@
     // Socket interface, we don't want to show it to users, but the tests and
     // Editor need this logged to know what port to bind to.
     // Remove this (and always log) when #16954 is fixed.
-    commandParser.addFlag('log-admin-url', defaultsTo: false, hide: true);
+    argParser.addFlag('log-admin-url', defaultsTo: false, hide: true);
 
     // TODO(nweiz): Make this public when issue 16954 is fixed.
-    commandParser.addOption('admin-port', hide: true);
+    argParser.addOption('admin-port', hide: true);
 
-    commandParser.addFlag(
+    argParser.addFlag(
         'dart2js',
         defaultsTo: true,
         help: 'Compile Dart to JavaScript.');
-    commandParser.addFlag(
+    argParser.addFlag(
         'force-poll',
         defaultsTo: false,
         help: 'Force the use of a polling filesystem watcher.');
@@ -91,7 +92,7 @@
     final completer0 = new Completer();
     scheduleMicrotask(() {
       try {
-        var port = parseInt(commandOptions['port'], 'port');
+        var port = parseInt(argResults['port'], 'port');
         join0(x0) {
           var adminPort = x0;
           join1(x1) {
@@ -154,6 +155,7 @@
                               try {
                                 x5;
                                 trampoline0 = continue0;
+                                do trampoline0(); while (trampoline0 != null);
                               } catch (e1, s1) {
                                 completer0.completeError(e1, s1);
                               }
@@ -183,16 +185,16 @@
               }
             }, onError: completer0.completeError);
           }
-          if (commandOptions['force-poll']) {
+          if (argResults['force-poll']) {
             join1(WatcherType.POLLING);
           } else {
             join1(WatcherType.AUTO);
           }
         }
-        if (commandOptions['admin-port'] == null) {
+        if (argResults['admin-port'] == null) {
           join0(null);
         } else {
-          join0(parseInt(commandOptions['admin-port'], 'admin port'));
+          join0(parseInt(argResults['admin-port'], 'admin port'));
         }
       } catch (e, s) {
         completer0.completeError(e, s);
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/upgrade.dart b/sdk/lib/_internal/pub_generated/lib/src/command/upgrade.dart
index 92bf32a..e7f2159 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/upgrade.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/upgrade.dart
@@ -12,36 +12,36 @@
 
 /// Handles the `upgrade` pub command.
 class UpgradeCommand extends PubCommand {
+  String get name => "upgrade";
   String get description =>
       "Upgrade the current package's dependencies to latest versions.";
-  String get usage => "pub upgrade [dependencies...]";
+  String get invocation => "pub upgrade [dependencies...]";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-upgrade.html";
   List<String> get aliases => const ["update"];
-  bool get takesArguments => true;
 
-  bool get isOffline => commandOptions['offline'];
+  bool get isOffline => argResults['offline'];
 
   UpgradeCommand() {
-    commandParser.addFlag(
+    argParser.addFlag(
         'offline',
         help: 'Use cached packages instead of accessing the network.');
 
-    commandParser.addFlag(
+    argParser.addFlag(
         'dry-run',
         abbr: 'n',
         negatable: false,
         help: "Report what dependencies would change but don't change any.");
   }
 
-  Future onRun() {
+  Future run() {
     final completer0 = new Completer();
     scheduleMicrotask(() {
       try {
-        var dryRun = commandOptions['dry-run'];
+        var dryRun = argResults['dry-run'];
         new Future.value(
             entrypoint.acquireDependencies(
                 SolveType.UPGRADE,
-                useLatest: commandOptions.rest,
+                useLatest: argResults.rest,
                 dryRun: dryRun)).then((x0) {
           try {
             x0;
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/uploader.dart b/sdk/lib/_internal/pub_generated/lib/src/command/uploader.dart
index 20c8c98..e43bbae 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/uploader.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/uploader.dart
@@ -19,34 +19,34 @@
 
 /// Handles the `uploader` pub command.
 class UploaderCommand extends PubCommand {
+  String get name => "uploader";
   String get description =>
       "Manage uploaders for a package on pub.dartlang.org.";
-  String get usage => "pub uploader [options] {add/remove} <email>";
+  String get invocation => "pub uploader [options] {add/remove} <email>";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-uploader.html";
-  bool get takesArguments => true;
 
   /// The URL of the package hosting server.
-  Uri get server => Uri.parse(commandOptions['server']);
+  Uri get server => Uri.parse(argResults['server']);
 
   UploaderCommand() {
-    commandParser.addOption(
+    argParser.addOption(
         'server',
         defaultsTo: HostedSource.defaultUrl,
         help: 'The package server on which the package is hosted.');
-    commandParser.addOption(
+    argParser.addOption(
         'package',
         help: 'The package whose uploaders will be modified.\n'
             '(defaults to the current package)');
   }
 
-  Future onRun() {
-    if (commandOptions.rest.isEmpty) {
+  Future run() {
+    if (argResults.rest.isEmpty) {
       log.error('No uploader command given.');
       this.printUsage();
       return flushThenExit(exit_codes.USAGE);
     }
 
-    var rest = commandOptions.rest.toList();
+    var rest = argResults.rest.toList();
 
     // TODO(rnystrom): Use subcommands for these.
     var command = rest.removeAt(0);
@@ -61,7 +61,7 @@
     }
 
     return new Future.sync(() {
-      var package = commandOptions['package'];
+      var package = argResults['package'];
       if (package != null) return package;
       return new Entrypoint(path.current, cache).root.name;
     }).then((package) {
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/version.dart b/sdk/lib/_internal/pub_generated/lib/src/command/version.dart
index bab6c6b..de40572 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/version.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/version.dart
@@ -4,19 +4,17 @@
 
 library pub.command.version;
 
-import 'dart:async';
-
 import '../command.dart';
 import '../log.dart' as log;
 import '../sdk.dart' as sdk;
 
 /// Handles the `version` pub command.
 class VersionCommand extends PubCommand {
+  String get name => "version";
   String get description => "Print pub version.";
-  String get usage => "pub version";
+  String get invocation => "pub version";
 
-  Future onRun() {
+  void run() {
     log.message("Pub ${sdk.version}");
-    return null;
   }
 }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command_runner.dart b/sdk/lib/_internal/pub_generated/lib/src/command_runner.dart
new file mode 100644
index 0000000..6bb6153
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/lib/src/command_runner.dart
@@ -0,0 +1,339 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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_runner;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:args/args.dart';
+import 'package:args/command_runner.dart';
+import 'package:http/http.dart' as http;
+import 'package:stack_trace/stack_trace.dart';
+
+import 'command/build.dart';
+import 'command/cache.dart';
+import 'command/deps.dart';
+import 'command/downgrade.dart';
+import 'command/get.dart';
+import 'command/global.dart';
+import 'command/lish.dart';
+import 'command/list_package_dirs.dart';
+import 'command/run.dart';
+import 'command/serve.dart';
+import 'command/upgrade.dart';
+import 'command/uploader.dart';
+import 'command/version.dart';
+import 'exceptions.dart';
+import 'exit_codes.dart' as exit_codes;
+import 'http.dart';
+import 'io.dart';
+import 'log.dart' as log;
+import 'sdk.dart' as sdk;
+import 'solver/version_solver.dart';
+import 'utils.dart';
+
+class PubCommandRunner extends CommandRunner {
+  String get usageFooter =>
+      "See http://dartlang.org/tools/pub for detailed " "documentation.";
+
+  PubCommandRunner()
+      : super("pub", "Pub is a package manager for Dart.") {
+    argParser.addFlag('version', negatable: false, help: 'Print pub version.');
+    argParser.addFlag(
+        'trace',
+        help: 'Print debugging information when an error occurs.');
+    argParser.addOption(
+        'verbosity',
+        help: 'Control output verbosity.',
+        allowed: ['normal', 'io', 'solver', 'all'],
+        allowedHelp: {
+      'normal': 'Show errors, warnings, and user messages.',
+      'io': 'Also show IO operations.',
+      'solver': 'Show steps during version resolution.',
+      'all': 'Show all output including internal tracing messages.'
+    });
+    argParser.addFlag(
+        'verbose',
+        abbr: 'v',
+        negatable: false,
+        help: 'Shortcut for "--verbosity=all".');
+    argParser.addFlag(
+        'with-prejudice',
+        hide: !isAprilFools,
+        negatable: false,
+        help: 'Execute commands with prejudice.');
+    argParser.addFlag(
+        'package-symlinks',
+        hide: true,
+        negatable: true,
+        defaultsTo: true);
+
+    addCommand(new BuildCommand());
+    addCommand(new CacheCommand());
+    addCommand(new DepsCommand());
+    addCommand(new DowngradeCommand());
+    addCommand(new GlobalCommand());
+    addCommand(new GetCommand());
+    addCommand(new ListPackageDirsCommand());
+    addCommand(new LishCommand());
+    addCommand(new RunCommand());
+    addCommand(new ServeCommand());
+    addCommand(new UpgradeCommand());
+    addCommand(new UploaderCommand());
+    addCommand(new VersionCommand());
+  }
+
+  Future run(List<String> arguments) {
+    final completer0 = new Completer();
+    scheduleMicrotask(() {
+      try {
+        var options;
+        join0() {
+          new Future.value(runCommand(options)).then((x0) {
+            try {
+              x0;
+              completer0.complete();
+            } catch (e0, s0) {
+              completer0.completeError(e0, s0);
+            }
+          }, onError: completer0.completeError);
+        }
+        catch0(error, s1) {
+          try {
+            if (error is UsageException) {
+              log.error(error.message);
+              new Future.value(flushThenExit(exit_codes.USAGE)).then((x1) {
+                try {
+                  x1;
+                  join0();
+                } catch (e1, s2) {
+                  completer0.completeError(e1, s2);
+                }
+              }, onError: completer0.completeError);
+            } else {
+              throw error;
+            }
+          } catch (error, s1) {
+            completer0.completeError(error, s1);
+          }
+        }
+        try {
+          options = super.parse(arguments);
+          join0();
+        } catch (e2, s3) {
+          catch0(e2, s3);
+        }
+      } catch (e, s) {
+        completer0.completeError(e, s);
+      }
+    });
+    return completer0.future;
+  }
+
+  Future runCommand(ArgResults options) {
+    final completer0 = new Completer();
+    scheduleMicrotask(() {
+      try {
+        log.withPrejudice = options['with-prejudice'];
+        join0() {
+          join1() {
+            break0() {
+              log.fine('Pub ${sdk.version}');
+              new Future.value(_validatePlatform()).then((x0) {
+                try {
+                  x0;
+                  var captureStackChains =
+                      options['trace'] ||
+                      options['verbose'] ||
+                      options['verbosity'] == 'all';
+                  join2() {
+                    completer0.complete();
+                  }
+                  catch0(error, chain) {
+                    try {
+                      log.exception(error, chain);
+                      join3() {
+                        new Future.value(
+                            flushThenExit(_chooseExitCode(error))).then((x1) {
+                          try {
+                            x1;
+                            join2();
+                          } catch (e0, s0) {
+                            completer0.completeError(e0, s0);
+                          }
+                        }, onError: completer0.completeError);
+                      }
+                      if (options['trace']) {
+                        log.dumpTranscript();
+                        join3();
+                      } else {
+                        join4() {
+                          join3();
+                        }
+                        if (!isUserFacingException(error)) {
+                          log.error("""
+This is an unexpected error. Please run
+
+    pub --trace ${options.arguments.map(((arg) {
+                          return "'$arg'";
+                        })).join(' ')}
+
+and include the results in a bug report on http://dartbug.com/new.
+""");
+                          join4();
+                        } else {
+                          join4();
+                        }
+                      }
+                    } catch (error, chain) {
+                      completer0.completeError(error, chain);
+                    }
+                  }
+                  try {
+                    new Future.value(captureErrors((() {
+                      return super.runCommand(options);
+                    }), captureStackChains: captureStackChains)).then((x2) {
+                      try {
+                        x2;
+                        new Future.value(
+                            flushThenExit(exit_codes.SUCCESS)).then((x3) {
+                          try {
+                            x3;
+                            join2();
+                          } catch (e1, s1) {
+                            catch0(e1, s1);
+                          }
+                        }, onError: catch0);
+                      } catch (e2, s2) {
+                        catch0(e2, s2);
+                      }
+                    }, onError: catch0);
+                  } catch (e3, s3) {
+                    catch0(e3, s3);
+                  }
+                } catch (e4, s4) {
+                  completer0.completeError(e4, s4);
+                }
+              }, onError: completer0.completeError);
+            }
+            switch (options['verbosity']) {
+              case 'normal':
+                log.verbosity = log.Verbosity.NORMAL;
+                break0();
+                break;
+              case 'io':
+                log.verbosity = log.Verbosity.IO;
+                break0();
+                break;
+              case 'solver':
+                log.verbosity = log.Verbosity.SOLVER;
+                break0();
+                break;
+              case 'all':
+                log.verbosity = log.Verbosity.ALL;
+                break0();
+                break;
+              default:
+                join5() {
+                  break0();
+                }
+                if (options['verbose']) {
+                  log.verbosity = log.Verbosity.ALL;
+                  join5();
+                } else {
+                  join5();
+                }
+                break;
+            }
+          }
+          if (options['trace']) {
+            log.recordTranscript();
+            join1();
+          } else {
+            join1();
+          }
+        }
+        if (options['version']) {
+          log.message('Pub ${sdk.version}');
+          completer0.complete(null);
+        } else {
+          join0();
+        }
+      } catch (e, s) {
+        completer0.completeError(e, s);
+      }
+    });
+    return completer0.future;
+  }
+
+  void printUsage() {
+    log.message(usage);
+  }
+
+  /// Returns the appropriate exit code for [exception], falling back on 1 if no
+  /// appropriate exit code could be found.
+  int _chooseExitCode(exception) {
+    while (exception is WrappedException) exception = exception.innerError;
+
+    if (exception is HttpException ||
+        exception is http.ClientException ||
+        exception is SocketException ||
+        exception is PubHttpException ||
+        exception is DependencyNotFoundException) {
+      return exit_codes.UNAVAILABLE;
+    } else if (exception is FormatException || exception is DataException) {
+      return exit_codes.DATA;
+    } else if (exception is UsageException) {
+      return exit_codes.USAGE;
+    } else {
+      return 1;
+    }
+  }
+
+  /// Checks that pub is running on a supported platform.
+  ///
+  /// If it isn't, it prints an error message and exits. Completes when the
+  /// validation is done.
+  Future _validatePlatform() {
+    final completer0 = new Completer();
+    scheduleMicrotask(() {
+      try {
+        join0() {
+          new Future.value(runProcess('ver', [])).then((x0) {
+            try {
+              var result = x0;
+              join1() {
+                completer0.complete();
+              }
+              if (result.stdout.join('\n').contains('XP')) {
+                log.error('Sorry, but pub is not supported on Windows XP.');
+                new Future.value(flushThenExit(exit_codes.USAGE)).then((x1) {
+                  try {
+                    x1;
+                    join1();
+                  } catch (e0, s0) {
+                    completer0.completeError(e0, s0);
+                  }
+                }, onError: completer0.completeError);
+              } else {
+                join1();
+              }
+            } catch (e1, s1) {
+              completer0.completeError(e1, s1);
+            }
+          }, onError: completer0.completeError);
+        }
+        if (Platform.operatingSystem != 'windows') {
+          completer0.complete(null);
+        } else {
+          join0();
+        }
+      } catch (e, s) {
+        completer0.completeError(e, s);
+      }
+    });
+    return completer0.future;
+  }
+}
diff --git a/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart b/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart
index 5234361..2ae51dc 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart
@@ -141,15 +141,40 @@
                             var packageGraph = x2;
                             packageGraph.loadTransformerCache().clearIfOutdated(
                                 result.changedPackages);
-                            completer0.complete(
-                                precompileDependencies(changed: result.changedPackages).then(((_) {
-                              return precompileExecutables(
-                                  changed: result.changedPackages);
-                            })).catchError(((error, stackTrace) {
-                              log.exception(error, stackTrace);
-                            })));
-                          } catch (e0, s0) {
-                            completer0.completeError(e0, s0);
+                            join4() {
+                              completer0.complete();
+                            }
+                            catch0(error, stackTrace) {
+                              try {
+                                log.exception(error, stackTrace);
+                                join4();
+                              } catch (error, stackTrace) {
+                                completer0.completeError(error, stackTrace);
+                              }
+                            }
+                            try {
+                              new Future.value(
+                                  precompileDependencies(changed: result.changedPackages)).then((x3) {
+                                try {
+                                  x3;
+                                  new Future.value(
+                                      precompileExecutables(changed: result.changedPackages)).then((x4) {
+                                    try {
+                                      x4;
+                                      join4();
+                                    } catch (e0, s0) {
+                                      catch0(e0, s0);
+                                    }
+                                  }, onError: catch0);
+                                } catch (e1, s1) {
+                                  catch0(e1, s1);
+                                }
+                              }, onError: catch0);
+                            } catch (e2, s2) {
+                              catch0(e2, s2);
+                            }
+                          } catch (e3, s3) {
+                            completer0.completeError(e3, s3);
                           }
                         }, onError: completer0.completeError);
                       }
@@ -159,8 +184,8 @@
                       } else {
                         join3();
                       }
-                    } catch (e1, s1) {
-                      completer0.completeError(e1, s1);
+                    } catch (e4, s4) {
+                      completer0.completeError(e4, s4);
                     }
                   }, onError: completer0.completeError);
                 }
@@ -185,8 +210,8 @@
             } else {
               join0();
             }
-          } catch (e2, s2) {
-            completer0.completeError(e2, s2);
+          } catch (e5, s5) {
+            completer0.completeError(e5, s5);
           }
         }, onError: completer0.completeError);
       } catch (e, s) {
@@ -224,96 +249,123 @@
               })).toSet();
               join1() {
                 join2() {
-                  new Future.value(
-                      log.progress("Precompiling dependencies", (() {
-                    final completer0 = new Completer();
-                    scheduleMicrotask(() {
-                      try {
-                        var packagesToLoad = unionAll(
-                            dependenciesToPrecompile.map(graph.transitiveDependencies)).map(((package) {
-                          return package.name;
-                        })).toSet();
-                        new Future.value(
-                            AssetEnvironment.create(
-                                this,
-                                BarbackMode.DEBUG,
-                                packages: packagesToLoad,
-                                useDart2JS: false)).then((x0) {
-                          try {
-                            var environment = x0;
-                            environment.barback.errors.listen(((_) {
-                            }));
-                            new Future.value(
-                                environment.barback.getAllAssets()).then((x1) {
-                              try {
-                                var assets = x1;
-                                new Future.value(
-                                    waitAndPrintErrors(assets.map(((asset) {
-                                  final completer0 = new Completer();
-                                  scheduleMicrotask(() {
-                                    try {
-                                      join0() {
-                                        var destPath =
-                                            path.join(depsDir, asset.id.package, path.fromUri(asset.id.path));
-                                        ensureDir(path.dirname(destPath));
-                                        new Future.value(
-                                            createFileFromStream(asset.read(), destPath)).then((x0) {
-                                          try {
-                                            x0;
-                                            completer0.complete();
-                                          } catch (e0, s0) {
-                                            completer0.completeError(e0, s0);
-                                          }
-                                        }, onError: completer0.completeError);
-                                      }
-                                      if (!dependenciesToPrecompile.contains(
-                                          asset.id.package)) {
-                                        completer0.complete(null);
-                                      } else {
-                                        join0();
-                                      }
-                                    } catch (e, s) {
-                                      completer0.completeError(e, s);
-                                    }
-                                  });
-                                  return completer0.future;
-                                })))).then((x2) {
-                                  try {
-                                    x2;
-                                    log.message(
-                                        "Precompiled " +
-                                            toSentence(ordered(dependenciesToPrecompile).map(log.bold)) +
-                                            ".");
-                                    completer0.complete();
-                                  } catch (e0, s0) {
-                                    completer0.completeError(e0, s0);
-                                  }
-                                }, onError: completer0.completeError);
-                              } catch (e1, s1) {
-                                completer0.completeError(e1, s1);
-                              }
-                            }, onError: completer0.completeError);
-                          } catch (e2, s2) {
-                            completer0.completeError(e2, s2);
-                          }
-                        }, onError: completer0.completeError);
-                      } catch (e, s) {
-                        completer0.completeError(e, s);
-                      }
-                    });
-                    return completer0.future;
-                  })).catchError(((error) {
-                    dependenciesToPrecompile.forEach(
-                        (package) => deleteEntry(path.join(depsDir, package)));
-                    throw error;
-                  }))).then((x1) {
+                  join3() {
+                    completer0.complete();
+                  }
+                  catch0(_, s0) {
                     try {
-                      x1;
-                      completer0.complete();
-                    } catch (e0, s0) {
-                      completer0.completeError(e0, s0);
+                      var it0 = dependenciesToPrecompile.iterator;
+                      break0() {
+                        completer0.completeError(_, s0);
+                      }
+                      var trampoline0;
+                      continue0() {
+                        trampoline0 = null;
+                        if (it0.moveNext()) {
+                          var package = it0.current;
+                          deleteEntry(path.join(depsDir, package));
+                          trampoline0 = continue0;
+                          do trampoline0(); while (trampoline0 != null);
+                        } else {
+                          break0();
+                        }
+                      }
+                      trampoline0 = continue0;
+                      do trampoline0(); while (trampoline0 != null);
+                    } catch (_, s0) {
+                      completer0.completeError(_, s0);
                     }
-                  }, onError: completer0.completeError);
+                  }
+                  try {
+                    new Future.value(
+                        log.progress("Precompiling dependencies", (() {
+                      final completer0 = new Completer();
+                      scheduleMicrotask(() {
+                        try {
+                          var packagesToLoad = unionAll(
+                              dependenciesToPrecompile.map(graph.transitiveDependencies)).map(((package) {
+                            return package.name;
+                          })).toSet();
+                          new Future.value(
+                              AssetEnvironment.create(
+                                  this,
+                                  BarbackMode.DEBUG,
+                                  packages: packagesToLoad,
+                                  useDart2JS: false)).then((x0) {
+                            try {
+                              var environment = x0;
+                              environment.barback.errors.listen(((_) {
+                              }));
+                              new Future.value(
+                                  environment.barback.getAllAssets()).then((x1) {
+                                try {
+                                  var assets = x1;
+                                  new Future.value(
+                                      waitAndPrintErrors(assets.map(((asset) {
+                                    final completer0 = new Completer();
+                                    scheduleMicrotask(() {
+                                      try {
+                                        join0() {
+                                          var destPath =
+                                              path.join(depsDir, asset.id.package, path.fromUri(asset.id.path));
+                                          ensureDir(path.dirname(destPath));
+                                          new Future.value(
+                                              createFileFromStream(asset.read(), destPath)).then((x0) {
+                                            try {
+                                              x0;
+                                              completer0.complete();
+                                            } catch (e0, s0) {
+                                              completer0.completeError(e0, s0);
+                                            }
+                                          }, onError: completer0.completeError);
+                                        }
+                                        if (!dependenciesToPrecompile.contains(
+                                            asset.id.package)) {
+                                          completer0.complete(null);
+                                        } else {
+                                          join0();
+                                        }
+                                      } catch (e, s) {
+                                        completer0.completeError(e, s);
+                                      }
+                                    });
+                                    return completer0.future;
+                                  })))).then((x2) {
+                                    try {
+                                      x2;
+                                      log.message(
+                                          "Precompiled " +
+                                              toSentence(ordered(dependenciesToPrecompile).map(log.bold)) +
+                                              ".");
+                                      completer0.complete();
+                                    } catch (e0, s0) {
+                                      completer0.completeError(e0, s0);
+                                    }
+                                  }, onError: completer0.completeError);
+                                } catch (e1, s1) {
+                                  completer0.completeError(e1, s1);
+                                }
+                              }, onError: completer0.completeError);
+                            } catch (e2, s2) {
+                              completer0.completeError(e2, s2);
+                            }
+                          }, onError: completer0.completeError);
+                        } catch (e, s) {
+                          completer0.completeError(e, s);
+                        }
+                      });
+                      return completer0.future;
+                    }))).then((x1) {
+                      try {
+                        x1;
+                        join3();
+                      } catch (e0, s1) {
+                        catch0(e0, s1);
+                      }
+                    }, onError: catch0);
+                  } catch (e1, s2) {
+                    catch0(e1, s2);
+                  }
                 }
                 if (dependenciesToPrecompile.isEmpty) {
                   completer0.complete(null);
@@ -322,54 +374,56 @@
                 }
               }
               if (dirExists(depsDir)) {
-                var it0 = dependenciesToPrecompile.iterator;
-                break0() {
-                  var it1 = listDir(depsDir).iterator;
-                  break1() {
+                var it1 = dependenciesToPrecompile.iterator;
+                break1() {
+                  var it2 = listDir(depsDir).iterator;
+                  break2() {
                     join1();
                   }
-                  var trampoline1;
-                  continue1() {
-                    trampoline1 = null;
-                    if (it1.moveNext()) {
-                      var subdir = it1.current;
+                  var trampoline2;
+                  continue2() {
+                    trampoline2 = null;
+                    if (it2.moveNext()) {
+                      var subdir = it2.current;
                       var package = graph.packages[path.basename(subdir)];
-                      join3() {
-                        trampoline1 = continue1;
+                      join4() {
+                        trampoline2 = continue2;
+                        do trampoline2(); while (trampoline2 != null);
                       }
                       if (package == null ||
                           package.pubspec.transformers.isEmpty ||
                           graph.isPackageMutable(package.name)) {
                         deleteEntry(subdir);
-                        join3();
+                        join4();
                       } else {
-                        join3();
+                        join4();
                       }
                     } else {
-                      break1();
+                      break2();
                     }
                   }
-                  trampoline1 = continue1;
-                  do trampoline1(); while (trampoline1 != null);
+                  trampoline2 = continue2;
+                  do trampoline2(); while (trampoline2 != null);
                 }
-                var trampoline0;
-                continue0() {
-                  trampoline0 = null;
-                  if (it0.moveNext()) {
-                    var package = it0.current;
+                var trampoline1;
+                continue1() {
+                  trampoline1 = null;
+                  if (it1.moveNext()) {
+                    var package = it1.current;
                     deleteEntry(path.join(depsDir, package));
-                    trampoline0 = continue0;
+                    trampoline1 = continue1;
+                    do trampoline1(); while (trampoline1 != null);
                   } else {
-                    break0();
+                    break1();
                   }
                 }
-                trampoline0 = continue0;
-                do trampoline0(); while (trampoline0 != null);
+                trampoline1 = continue1;
+                do trampoline1(); while (trampoline1 != null);
               } else {
                 join1();
               }
-            } catch (e1, s1) {
-              completer0.completeError(e1, s1);
+            } catch (e2, s3) {
+              completer0.completeError(e2, s3);
             }
           }, onError: completer0.completeError);
         }
@@ -509,6 +563,7 @@
                     var package = it0.current;
                     join4() {
                       trampoline0 = continue0;
+                      do trampoline0(); while (trampoline0 != null);
                     }
                     if (executables[package].isEmpty) {
                       executables.remove(package);
diff --git a/sdk/lib/_internal/pub_generated/lib/src/exceptions.dart b/sdk/lib/_internal/pub_generated/lib/src/exceptions.dart
index dd2fb6c..7d4f5a3 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/exceptions.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/exceptions.dart
@@ -8,6 +8,7 @@
 import 'dart:isolate';
 
 import "package:analyzer/analyzer.dart";
+import 'package:args/command_runner.dart';
 import "package:http/http.dart" as http;
 import "package:stack_trace/stack_trace.dart";
 import "package:yaml/yaml.dart";
@@ -61,17 +62,6 @@
       : super(innerError.toString(), innerError, innerTrace);
 }
 
-/// A class for command usage exceptions.
-class UsageException extends ApplicationException {
-  /// The command usage information.
-  String _usage;
-
-  UsageException(String message, this._usage)
-      : super(message);
-
-  String toString() => "$message\n\n$_usage";
-}
-
 /// A class for errors in a command's input data.
 ///
 /// This corresponds to the [exit_codes.DATA] exit code.
@@ -130,5 +120,6 @@
       error is IsolateSpawnException ||
       error is IOException ||
       error is http.ClientException ||
-      error is YamlException;
+      error is YamlException ||
+      error is UsageException;
 }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/executable.dart b/sdk/lib/_internal/pub_generated/lib/src/executable.dart
index d8016ea..6215572 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/executable.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/executable.dart
@@ -62,71 +62,88 @@
                       }));
                       var server;
                       join6() {
-                        completer0.complete(
-                            environment.barback.getAssetById(id).then(((_) {
-                          final completer0 = new Completer();
-                          scheduleMicrotask(() {
+                        join7() {
+                          var vmArgs = [];
+                          vmArgs.add("--checked");
+                          var relativePath =
+                              p.url.relative(assetPath, from: p.url.joinAll(p.split(server.rootDirectory)));
+                          vmArgs.add(
+                              server.url.resolve(relativePath).toString());
+                          vmArgs.addAll(args);
+                          new Future.value(
+                              Process.start(Platform.executable, vmArgs)).then((x1) {
                             try {
-                              var vmArgs = [];
-                              vmArgs.add("--checked");
-                              var relativePath =
-                                  p.url.relative(assetPath, from: p.url.joinAll(p.split(server.rootDirectory)));
-                              vmArgs.add(
-                                  server.url.resolve(relativePath).toString());
-                              vmArgs.addAll(args);
-                              new Future.value(
-                                  Process.start(Platform.executable, vmArgs)).then((x0) {
-                                try {
-                                  var process = x0;
-                                  process.stderr.listen(stderr.add);
-                                  process.stdout.listen(stdout.add);
-                                  stdin.listen(process.stdin.add);
-                                  completer0.complete(process.exitCode);
-                                } catch (e0, s0) {
-                                  completer0.completeError(e0, s0);
-                                }
-                              }, onError: completer0.completeError);
-                            } catch (e, s) {
-                              completer0.completeError(e, s);
+                              var process = x1;
+                              process.stderr.listen(stderr.add);
+                              process.stdout.listen(stdout.add);
+                              stdin.listen(process.stdin.add);
+                              completer0.complete(process.exitCode);
+                            } catch (e0, s0) {
+                              completer0.completeError(e0, s0);
                             }
-                          });
-                          return completer0.future;
-                        })).catchError(((error, stackTrace) {
-                          if (error is! AssetNotFoundException) throw error;
-                          var message =
-                              "Could not find ${log.bold(executable + ".dart")}";
-                          if (package != entrypoint.root.name) {
-                            message +=
-                                " in package ${log.bold(server.package)}";
+                          }, onError: completer0.completeError);
+                        }
+                        catch0(error, stackTrace) {
+                          try {
+                            if (error is AssetNotFoundException) {
+                              var message =
+                                  "Could not find ${log.bold(executable + ".dart")}";
+                              join8() {
+                                log.error("${message}.");
+                                log.fine(new Chain.forTrace(stackTrace));
+                                completer0.complete(exit_codes.NO_INPUT);
+                              }
+                              if (package != entrypoint.root.name) {
+                                message +=
+                                    " in package ${log.bold(server.package)}";
+                                join8();
+                              } else {
+                                join8();
+                              }
+                            } else {
+                              throw error;
+                            }
+                          } catch (error, stackTrace) {
+                            completer0.completeError(error, stackTrace);
                           }
-                          log.error("$message.");
-                          log.fine(new Chain.forTrace(stackTrace));
-                          return exit_codes.NO_INPUT;
-                        })));
+                        }
+                        try {
+                          new Future.value(
+                              environment.barback.getAssetById(id)).then((x2) {
+                            try {
+                              x2;
+                              join7();
+                            } catch (e1, s1) {
+                              catch0(e1, s1);
+                            }
+                          }, onError: catch0);
+                        } catch (e2, s2) {
+                          catch0(e2, s2);
+                        }
                       }
                       if (package == entrypoint.root.name) {
                         new Future.value(
-                            environment.serveDirectory(rootDir)).then((x1) {
+                            environment.serveDirectory(rootDir)).then((x3) {
                           try {
-                            server = x1;
+                            server = x3;
                             join6();
-                          } catch (e0, s0) {
-                            completer0.completeError(e0, s0);
+                          } catch (e3, s3) {
+                            completer0.completeError(e3, s3);
                           }
                         }, onError: completer0.completeError);
                       } else {
                         new Future.value(
-                            environment.servePackageBinDirectory(package)).then((x2) {
+                            environment.servePackageBinDirectory(package)).then((x4) {
                           try {
-                            server = x2;
+                            server = x4;
                             join6();
-                          } catch (e1, s1) {
-                            completer0.completeError(e1, s1);
+                          } catch (e4, s4) {
+                            completer0.completeError(e4, s4);
                           }
                         }, onError: completer0.completeError);
                       }
-                    } catch (e2, s2) {
-                      completer0.completeError(e2, s2);
+                    } catch (e5, s5) {
+                      completer0.completeError(e5, s5);
                     }
                   }, onError: completer0.completeError);
                 }
@@ -166,24 +183,24 @@
             !entrypoint.root.immediateDependencies.any(((dep) {
           return dep.name == package;
         }))) {
-          new Future.value(entrypoint.loadPackageGraph()).then((x3) {
+          new Future.value(entrypoint.loadPackageGraph()).then((x5) {
             try {
-              var graph = x3;
-              join7() {
+              var graph = x5;
+              join9() {
                 join1();
               }
               if (graph.packages.containsKey(package)) {
                 dataError(
                     'Package "${package}" is not an immediate dependency.\n'
                         'Cannot run executables in transitive dependencies.');
-                join7();
+                join9();
               } else {
                 dataError(
                     'Could not find package "${package}". Did you forget to add a ' 'dependency?');
-                join7();
+                join9();
               }
-            } catch (e3, s3) {
-              completer0.completeError(e3, s3);
+            } catch (e6, s6) {
+              completer0.completeError(e6, s6);
             }
           }, onError: completer0.completeError);
         } else {
diff --git a/sdk/lib/_internal/pub_generated/lib/src/global_packages.dart b/sdk/lib/_internal/pub_generated/lib/src/global_packages.dart
index aff228f..3dfed37 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/global_packages.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/global_packages.dart
@@ -427,51 +427,81 @@
   ///
   /// Returns an [Entrypoint] loaded with the active package if found.
   Future<Entrypoint> find(String name) {
-    // TODO(rnystrom): Use async/await here when on __ catch is supported.
-    // See: https://github.com/dart-lang/async_await/issues/27
-    return new Future.sync(() {
-      var lockFilePath = _getLockFilePath(name);
-      var lockFile;
+    final completer0 = new Completer();
+    scheduleMicrotask(() {
       try {
-        lockFile = new LockFile.load(lockFilePath, cache.sources);
-      } on IOException catch (error) {
-        var oldLockFilePath = p.join(_directory, '$name.lock');
-        try {
-          // TODO(nweiz): This looks for Dart 1.6's old lockfile location.
-          // Remove it when Dart 1.6 is old enough that we don't think anyone
-          // will have these lockfiles anymore (issue 20703).
-          lockFile = new LockFile.load(oldLockFilePath, cache.sources);
-        } on IOException catch (error) {
-          // If we couldn't read the lock file, it's not activated.
-          dataError("No active package ${log.bold(name)}.");
+        var lockFilePath = _getLockFilePath(name);
+        var lockFile;
+        join0() {
+          var id = lockFile.packages[name];
+          lockFile.packages.remove(name);
+          var source = cache.sources[id.source];
+          join1() {
+            assert(id.source == "path");
+            completer0.complete(
+                new Entrypoint(PathSource.pathFromDescription(id.description), cache));
+          }
+          if (source is CachedSource) {
+            new Future.value(
+                cache.sources[id.source].getDirectory(id)).then((x0) {
+              try {
+                var dir = x0;
+                var package = new Package.load(name, dir, cache.sources);
+                completer0.complete(
+                    new Entrypoint.inMemory(package, lockFile, cache));
+              } catch (e0, s0) {
+                completer0.completeError(e0, s0);
+              }
+            }, onError: completer0.completeError);
+          } else {
+            join1();
+          }
         }
-
-        // Move the old lockfile to its new location.
-        ensureDir(p.dirname(lockFilePath));
-        new File(oldLockFilePath).renameSync(lockFilePath);
+        catch0(error, s1) {
+          try {
+            if (error is IOException) {
+              var oldLockFilePath = p.join(_directory, '${name}.lock');
+              join2() {
+                ensureDir(p.dirname(lockFilePath));
+                new File(oldLockFilePath).renameSync(lockFilePath);
+                join0();
+              }
+              catch1(error, s2) {
+                try {
+                  if (error is IOException) {
+                    dataError("No active package ${log.bold(name)}.");
+                    join2();
+                  } else {
+                    throw error;
+                  }
+                } catch (error, s2) {
+                  completer0.completeError(error, s2);
+                }
+              }
+              try {
+                lockFile = new LockFile.load(oldLockFilePath, cache.sources);
+                join2();
+              } catch (e1, s3) {
+                catch1(e1, s3);
+              }
+            } else {
+              throw error;
+            }
+          } catch (error, s1) {
+            completer0.completeError(error, s1);
+          }
+        }
+        try {
+          lockFile = new LockFile.load(lockFilePath, cache.sources);
+          join0();
+        } catch (e2, s4) {
+          catch0(e2, s4);
+        }
+      } catch (e, s) {
+        completer0.completeError(e, s);
       }
-
-      // Load the package from the cache.
-      var id = lockFile.packages[name];
-      lockFile.packages.remove(name);
-
-      var source = cache.sources[id.source];
-      if (source is CachedSource) {
-        // For cached sources, the package itself is in the cache and the
-        // lockfile is the one we just loaded.
-        return cache.sources[id.source].getDirectory(
-            id).then((dir) => new Package.load(name, dir, cache.sources)).then((package) {
-          return new Entrypoint.inMemory(package, lockFile, cache);
-        });
-      }
-
-      // For uncached sources (i.e. path), the ID just points to the real
-      // directory for the package.
-      assert(id.source == "path");
-      return new Entrypoint(
-          PathSource.pathFromDescription(id.description),
-          cache);
     });
+    return completer0.future;
   }
 
   /// Runs [package]'s [executable] with [args].
@@ -612,6 +642,7 @@
                 var id;
                 join3() {
                   trampoline0 = continue0;
+                  do trampoline0(); while (trampoline0 != null);
                 }
                 catch0(error, stackTrace) {
                   try {
@@ -723,6 +754,7 @@
               var entry = it1.current;
               join7() {
                 trampoline1 = continue1;
+                do trampoline1(); while (trampoline1 != null);
               }
               catch1(error, stackTrace) {
                 try {
diff --git a/sdk/lib/_internal/pub_generated/lib/src/log.dart b/sdk/lib/_internal/pub_generated/lib/src/log.dart
index 94a40b6..ecf67ed 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/log.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/log.dart
@@ -9,6 +9,7 @@
 import 'dart:convert';
 import 'dart:io';
 
+import 'package:args/command_runner.dart';
 import 'package:path/path.dart' as p;
 import 'package:source_span/source_span.dart';
 import 'package:stack_trace/stack_trace.dart';
diff --git a/sdk/lib/_internal/pub_generated/lib/src/solver/backtracking_solver.dart b/sdk/lib/_internal/pub_generated/lib/src/solver/backtracking_solver.dart
index 4ac7e0c..26341e4 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/solver/backtracking_solver.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/solver/backtracking_solver.dart
@@ -127,55 +127,94 @@
   /// Completes with a list of specific package versions if successful or an
   /// error if it failed to find a solution.
   Future<SolveResult> solve() {
-    var stopwatch = new Stopwatch();
-
-    _logParameters();
-
-    // Sort the overrides by package name to make sure they're deterministic.
-    var overrides = _overrides.values.toList();
-    overrides.sort((a, b) => a.name.compareTo(b.name));
-
-    return newFuture(() {
-      stopwatch.start();
-
-      // Pre-cache the root package's known pubspec.
-      cache.cache(new PackageId.root(root), root.pubspec);
-
-      _validateSdkConstraint(root.pubspec);
-      return _traverseSolution();
-    }).then((packages) {
-      var pubspecs = new Map.fromIterable(
-          packages,
-          key: (id) => id.name,
-          value: (id) => cache.getCachedPubspec(id));
-
-      return new SolveResult.success(
-          sources,
-          root,
-          lockFile,
-          packages,
-          overrides,
-          pubspecs,
-          _getAvailableVersions(packages),
-          attemptedSolutions);
-    }).catchError((error) {
-      if (error is! SolveFailure) throw error;
-
-      // Wrap a failure in a result so we can attach some other data.
-      return new SolveResult.failure(
-          sources,
-          root,
-          lockFile,
-          overrides,
-          error,
-          attemptedSolutions);
-    }).whenComplete(() {
-      // Gather some solving metrics.
-      var buffer = new StringBuffer();
-      buffer.writeln('${runtimeType} took ${stopwatch.elapsed} seconds.');
-      buffer.writeln(cache.describeResults());
-      log.solver(buffer);
+    final completer0 = new Completer();
+    scheduleMicrotask(() {
+      try {
+        var stopwatch = new Stopwatch();
+        _logParameters();
+        var overrides = _overrides.values.toList();
+        overrides.sort(((a, b) {
+          return a.name.compareTo(b.name);
+        }));
+        join0() {
+          completer0.complete();
+        }
+        finally0(cont0) {
+          try {
+            var buffer = new StringBuffer();
+            buffer.writeln('${runtimeType} took ${stopwatch.elapsed} seconds.');
+            buffer.writeln(cache.describeResults());
+            log.solver(buffer);
+            cont0();
+          } catch (e0, s0) {
+            completer0.completeError(e0, s0);
+          }
+        }
+        catch0(error, s1) {
+          try {
+            if (error is SolveFailure) {
+              final v0 = new SolveResult.failure(
+                  sources,
+                  root,
+                  lockFile,
+                  overrides,
+                  error,
+                  attemptedSolutions);
+              finally0(() {
+                completer0.complete(v0);
+              });
+            } else {
+              throw error;
+            }
+          } catch (error, s1) {
+            finally0(() => completer0.completeError(error, s1));
+          }
+        }
+        try {
+          stopwatch.start();
+          cache.cache(new PackageId.root(root), root.pubspec);
+          _validateSdkConstraint(root.pubspec);
+          new Future.value(_traverseSolution()).then((x0) {
+            try {
+              var packages = x0;
+              var pubspecs = new Map.fromIterable(packages, key: ((id) {
+                return id.name;
+              }), value: ((id) {
+                return cache.getCachedPubspec(id);
+              }));
+              new Future.value(Future.wait(packages.map(((id) {
+                return sources[id.source].resolveId(id);
+              })))).then((x1) {
+                try {
+                  packages = x1;
+                  final v1 = new SolveResult.success(
+                      sources,
+                      root,
+                      lockFile,
+                      packages,
+                      overrides,
+                      pubspecs,
+                      _getAvailableVersions(packages),
+                      attemptedSolutions);
+                  finally0(() {
+                    completer0.complete(v1);
+                  });
+                } catch (e1, s2) {
+                  catch0(e1, s2);
+                }
+              }, onError: catch0);
+            } catch (e2, s3) {
+              catch0(e2, s3);
+            }
+          }, onError: catch0);
+        } catch (e3, s4) {
+          catch0(e3, s4);
+        }
+      } catch (e, s) {
+        completer0.completeError(e, s);
+      }
     });
+    return completer0.future;
   }
 
   /// Generates a map containing all of the known available versions for each
diff --git a/sdk/lib/_internal/pub_generated/lib/src/source/git.dart b/sdk/lib/_internal/pub_generated/lib/src/source/git.dart
index 18b4954..7edaac2 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/source/git.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/source/git.dart
@@ -117,14 +117,36 @@
     return description;
   }
 
+  /// If [description] has a resolved ref, print it out in short-form.
+  ///
+  /// This helps distinguish different git commits with the same pubspec
+  /// version.
+  String formatDescription(String containingPath, description) {
+    if (description is Map && description.containsKey('resolved-ref')) {
+      return "${description['url']} at "
+          "${description['resolved-ref'].substring(0, 6)}";
+    } else {
+      return super.formatDescription(containingPath, description);
+    }
+  }
+
   /// Two Git descriptions are equal if both their URLs and their refs are
   /// equal.
   bool descriptionsEqual(description1, description2) {
     // TODO(nweiz): Do we really want to throw an error if you have two
     // dependencies on some repo, one of which specifies a ref and one of which
     // doesn't? If not, how do we handle that case in the version solver?
-    return _getUrl(description1) == _getUrl(description2) &&
-        _getRef(description1) == _getRef(description2);
+    if (_getUrl(description1) != _getUrl(description2)) return false;
+    if (_getRef(description1) != _getRef(description2)) return false;
+
+    if (description1 is Map &&
+        description1.containsKey('resolved-ref') &&
+        description2 is Map &&
+        description2.containsKey('resolved-ref')) {
+      return description1['resolved-ref'] == description2['resolved-ref'];
+    }
+
+    return true;
   }
 
   /// Attaches a specific commit to [id] to disambiguate it.
@@ -174,6 +196,7 @@
                       "${log.bold(package.name)} ${package.version}...");
               join1() {
                 trampoline0 = continue0;
+                do trampoline0(); while (trampoline0 != null);
               }
               catch0(error, stackTrace) {
                 try {
@@ -251,25 +274,22 @@
     return new Future.sync(() {
       var path = _repoCachePath(id);
       if (!entryExists(path)) {
-        return _clone(
-            _getUrl(id),
-            path,
-            mirror: true).then((_) => _revParse(id));
+        return _clone(_getUrl(id), path, mirror: true).then((_) => _getRev(id));
       }
 
       // If [id] didn't come from a lockfile, it may be using a symbolic
       // reference. We want to get the latest version of that reference.
       var description = id.description;
       if (description is! Map || !description.containsKey('resolved-ref')) {
-        return _updateRepoCache(id).then((_) => _revParse(id));
+        return _updateRepoCache(id).then((_) => _getRev(id));
       }
 
       // If [id] did come from a lockfile, then we want to avoid running "git
       // fetch" if possible to avoid networking time and errors. See if the
       // revision exists in the repo cache before updating it.
-      return _revParse(id).catchError((error) {
+      return _getRev(id).catchError((error) {
         if (error is! git.GitException) throw error;
-        return _updateRepoCache(id).then((_) => _revParse(id));
+        return _updateRepoCache(id).then((_) => _getRev(id));
       });
     });
   }
@@ -286,13 +306,13 @@
     });
   }
 
-  /// Runs "git rev-parse" in the canonical clone of the repository referred to
+  /// Runs "git rev-list" in the canonical clone of the repository referred to
   /// by [id] on the effective ref of [id].
   ///
   /// This assumes that the canonical clone already exists.
-  Future<String> _revParse(PackageId id) {
+  Future<String> _getRev(PackageId id) {
     return git.run(
-        ["rev-parse", _getEffectiveRef(id)],
+        ["rev-list", "--max-count=1", _getEffectiveRef(id)],
         workingDir: _repoCachePath(id)).then((result) => result.first);
   }
 
diff --git a/sdk/lib/_internal/pub_generated/lib/src/source/hosted.dart b/sdk/lib/_internal/pub_generated/lib/src/source/hosted.dart
index 489671c..37f2799 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/source/hosted.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/source/hosted.dart
@@ -148,65 +148,65 @@
               var packages =
                   _getCachedPackagesInDirectory(path.basename(serverDir));
               packages.sort(Package.orderByNameAndVersion);
-              new Future.value(Future.forEach(packages, ((package) {
-                final completer0 = new Completer();
-                scheduleMicrotask(() {
-                  try {
-                    join0() {
-                      completer0.complete();
-                    }
-                    catch0(error, stackTrace) {
-                      try {
-                        failures++;
-                        var message =
-                            "Failed to repair ${log.bold(package.name)} " "${package.version}";
-                        join1() {
-                          log.error("${message}. Error:\n${error}");
-                          log.fine(stackTrace);
-                          tryDeleteEntry(package.dir);
-                          join0();
-                        }
-                        if (url != defaultUrl) {
-                          message += " from ${url}";
-                          join1();
-                        } else {
-                          join1();
-                        }
-                      } catch (error, stackTrace) {
-                        completer0.completeError(error, stackTrace);
-                      }
-                    }
+              var it1 = packages.iterator;
+              break1() {
+                trampoline0 = continue0;
+                do trampoline0(); while (trampoline0 != null);
+              }
+              var trampoline1;
+              continue1() {
+                trampoline1 = null;
+                if (it1.moveNext()) {
+                  var package = it1.current;
+                  join1() {
+                    trampoline1 = continue1;
+                    do trampoline1(); while (trampoline1 != null);
+                  }
+                  catch0(error, stackTrace) {
                     try {
-                      new Future.value(
-                          _download(url, package.name, package.version, package.dir)).then((x0) {
+                      failures++;
+                      var message =
+                          "Failed to repair ${log.bold(package.name)} " "${package.version}";
+                      join2() {
+                        log.error("${message}. Error:\n${error}");
+                        log.fine(stackTrace);
+                        tryDeleteEntry(package.dir);
+                        join1();
+                      }
+                      if (url != defaultUrl) {
+                        message += " from ${url}";
+                        join2();
+                      } else {
+                        join2();
+                      }
+                    } catch (error, stackTrace) {
+                      completer0.completeError(error, stackTrace);
+                    }
+                  }
+                  try {
+                    new Future.value(
+                        _download(url, package.name, package.version, package.dir)).then((x0) {
+                      trampoline1 = () {
+                        trampoline1 = null;
                         try {
                           x0;
                           successes++;
-                          join0();
+                          join1();
                         } catch (e0, s0) {
                           catch0(e0, s0);
                         }
-                      }, onError: catch0);
-                    } catch (e1, s1) {
-                      catch0(e1, s1);
-                    }
-                  } catch (e, s) {
-                    completer0.completeError(e, s);
+                      };
+                      do trampoline1(); while (trampoline1 != null);
+                    }, onError: catch0);
+                  } catch (e1, s1) {
+                    catch0(e1, s1);
                   }
-                });
-                return completer0.future;
-              }))).then((x0) {
-                trampoline0 = () {
-                  trampoline0 = null;
-                  try {
-                    x0;
-                    trampoline0 = continue0;
-                  } catch (e0, s0) {
-                    completer0.completeError(e0, s0);
-                  }
-                };
-                do trampoline0(); while (trampoline0 != null);
-              }, onError: completer0.completeError);
+                } else {
+                  break1();
+                }
+              }
+              trampoline1 = continue1;
+              do trampoline1(); while (trampoline1 != null);
             } else {
               break0();
             }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/system_cache.dart b/sdk/lib/_internal/pub_generated/lib/src/system_cache.dart
index 6508615..424585da 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/system_cache.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/system_cache.dart
@@ -5,6 +5,7 @@
 library pub.system_cache;
 
 import 'dart:async';
+import 'dart:io';
 
 import 'package:path/path.dart' as path;
 
@@ -33,15 +34,27 @@
   /// The sources from which to get packages.
   final sources = new SourceRegistry();
 
+  static String defaultDir = (() {
+    if (Platform.environment.containsKey('PUB_CACHE')) {
+      return Platform.environment['PUB_CACHE'];
+    } else if (Platform.operatingSystem == 'windows') {
+      var appData = Platform.environment['APPDATA'];
+      return path.join(appData, 'Pub', 'Cache');
+    } else {
+      return '${Platform.environment['HOME']}/.pub-cache';
+    }
+  })();
+
   /// Creates a new package cache which is backed by the given directory on the
   /// user's file system.
-  SystemCache(this.rootDir);
+  SystemCache([String rootDir])
+      : rootDir = rootDir == null ? SystemCache.defaultDir : rootDir;
 
   /// Creates a system cache and registers the standard set of sources.
   ///
   /// If [isOffline] is `true`, then the offline hosted source will be used.
   /// Defaults to `false`.
-  factory SystemCache.withSources(String rootDir, {bool isOffline: false}) {
+  factory SystemCache.withSources({String rootDir, bool isOffline: false}) {
     var cache = new SystemCache(rootDir);
     cache.register(new GitSource());
 
diff --git a/sdk/lib/_internal/pub_generated/lib/src/utils.dart b/sdk/lib/_internal/pub_generated/lib/src/utils.dart
index 3804e13..d03db2a 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/utils.dart
@@ -104,12 +104,14 @@
       } else {
         stackTrace = new Chain([]);
       }
-      completer.completeError(e, stackTrace);
+      if (!completer.isCompleted) completer.completeError(e, stackTrace);
     });
   };
 
   if (captureStackChains) {
-    Chain.capture(wrappedCallback, onError: completer.completeError);
+    Chain.capture(wrappedCallback, onError: (error, stackTrace) {
+      if (!completer.isCompleted) completer.completeError(error, stackTrace);
+    });
   } else {
     runZoned(wrappedCallback, onError: (e, stackTrace) {
       if (stackTrace == null) {
@@ -117,7 +119,7 @@
       } else {
         stackTrace = new Chain([new Trace.from(stackTrace)]);
       }
-      completer.completeError(e, stackTrace);
+      if (!completer.isCompleted) completer.completeError(e, stackTrace);
     });
   }
 
diff --git a/sdk/lib/_internal/pub_generated/lib/src/validator/dependency.dart b/sdk/lib/_internal/pub_generated/lib/src/validator/dependency.dart
index efbd53c..e57b096 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/validator/dependency.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/validator/dependency.dart
@@ -40,94 +40,96 @@
     scheduleMicrotask(() {
       try {
         var caretDeps = [];
-        new Future.value(
-            Future.forEach(entrypoint.root.pubspec.dependencies, ((dependency) {
-          final completer0 = new Completer();
-          scheduleMicrotask(() {
-            try {
-              join0() {
-                completer0.complete();
-              }
-              if (dependency.source != "hosted") {
-                new Future.value(_warnAboutSource(dependency)).then((x0) {
+        var it0 = entrypoint.root.pubspec.dependencies.iterator;
+        break0() {
+          join0() {
+            completer0.complete();
+          }
+          if (caretDeps.isNotEmpty && !_caretAllowed) {
+            _errorAboutCaretConstraints(caretDeps);
+            join0();
+          } else {
+            join0();
+          }
+        }
+        var trampoline0;
+        continue0() {
+          trampoline0 = null;
+          if (it0.moveNext()) {
+            var dependency = it0.current;
+            join1() {
+              trampoline0 = continue0;
+              do trampoline0(); while (trampoline0 != null);
+            }
+            if (dependency.source != "hosted") {
+              new Future.value(_warnAboutSource(dependency)).then((x0) {
+                trampoline0 = () {
+                  trampoline0 = null;
                   try {
                     x0;
-                    join0();
+                    join1();
                   } catch (e0, s0) {
                     completer0.completeError(e0, s0);
                   }
-                }, onError: completer0.completeError);
+                };
+                do trampoline0(); while (trampoline0 != null);
+              }, onError: completer0.completeError);
+            } else {
+              join2() {
+                join1();
+              }
+              if (dependency.constraint.isAny) {
+                _warnAboutNoConstraint(dependency);
+                join2();
               } else {
-                join1() {
-                  join0();
+                join3() {
+                  join2();
                 }
-                if (dependency.constraint.isAny) {
-                  _warnAboutNoConstraint(dependency);
-                  join1();
+                if (dependency.constraint is Version) {
+                  _warnAboutSingleVersionConstraint(dependency);
+                  join3();
                 } else {
-                  join2() {
-                    join1();
+                  join4() {
+                    join3();
                   }
-                  if (dependency.constraint is Version) {
-                    _warnAboutSingleVersionConstraint(dependency);
-                    join2();
-                  } else {
-                    join3() {
-                      join2();
-                    }
-                    if (dependency.constraint is VersionRange) {
-                      join4() {
-                        join5() {
-                          join3();
-                        }
-                        if (dependency.constraint.toString().startsWith("^")) {
-                          caretDeps.add(dependency);
-                          join5();
-                        } else {
-                          join5();
-                        }
-                      }
-                      if (dependency.constraint.min == null) {
-                        _warnAboutNoConstraintLowerBound(dependency);
+                  if (dependency.constraint is VersionRange) {
+                    join5() {
+                      join6() {
                         join4();
-                      } else {
-                        join6() {
-                          join4();
-                        }
-                        if (dependency.constraint.max == null) {
-                          _warnAboutNoConstraintUpperBound(dependency);
-                          join6();
-                        } else {
-                          join6();
-                        }
                       }
-                    } else {
-                      join3();
+                      if (dependency.constraint.toString().startsWith("^")) {
+                        caretDeps.add(dependency);
+                        join6();
+                      } else {
+                        join6();
+                      }
                     }
+                    if (dependency.constraint.min == null) {
+                      _warnAboutNoConstraintLowerBound(dependency);
+                      join5();
+                    } else {
+                      join7() {
+                        join5();
+                      }
+                      if (dependency.constraint.max == null) {
+                        _warnAboutNoConstraintUpperBound(dependency);
+                        join7();
+                      } else {
+                        join7();
+                      }
+                    }
+                  } else {
+                    join4();
                   }
                 }
               }
-            } catch (e, s) {
-              completer0.completeError(e, s);
             }
-          });
-          return completer0.future;
-        }))).then((x0) {
-          try {
-            x0;
-            join0() {
-              completer0.complete();
-            }
-            if (caretDeps.isNotEmpty && !_caretAllowed) {
-              _errorAboutCaretConstraints(caretDeps);
-              join0();
-            } else {
-              join0();
-            }
-          } catch (e0, s0) {
-            completer0.completeError(e0, s0);
+          } else {
+            break0();
           }
-        }, onError: completer0.completeError);
+        }
+        trampoline0 = continue0;
+        do trampoline0(); while (trampoline0 != null);
       } catch (e, s) {
         completer0.completeError(e, s);
       }
diff --git a/sdk/lib/_internal/pub_generated/test/cache/add/bad_version_test.dart b/sdk/lib/_internal/pub_generated/test/cache/add/bad_version_test.dart
index 3429031..322aefe 100644
--- a/sdk/lib/_internal/pub_generated/test/cache/add/bad_version_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/cache/add/bad_version_test.dart
@@ -14,7 +14,7 @@
             Could not parse version "1.0". Unknown text at "1.0".
             
             Usage: pub cache add <package> [--version <constraint>] [--all]
-            -h, --help       Print usage information for this command.
+            -h, --help       Print this usage information.
                 --all        Install all matching versions.
             -v, --version    Version constraint.
 
diff --git a/sdk/lib/_internal/pub_generated/test/cache/add/missing_package_arg_test.dart b/sdk/lib/_internal/pub_generated/test/cache/add/missing_package_arg_test.dart
index bc7d2ce..d2a593d 100644
--- a/sdk/lib/_internal/pub_generated/test/cache/add/missing_package_arg_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/cache/add/missing_package_arg_test.dart
@@ -14,7 +14,7 @@
             No package to add given.
             
             Usage: pub cache add <package> [--version <constraint>] [--all]
-            -h, --help       Print usage information for this command.
+            -h, --help       Print this usage information.
                 --all        Install all matching versions.
             -v, --version    Version constraint.
 
diff --git a/sdk/lib/_internal/pub_generated/test/cache/add/unexpected_arguments_test.dart b/sdk/lib/_internal/pub_generated/test/cache/add/unexpected_arguments_test.dart
index bf066dd..add07de 100644
--- a/sdk/lib/_internal/pub_generated/test/cache/add/unexpected_arguments_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/cache/add/unexpected_arguments_test.dart
@@ -14,7 +14,7 @@
             Unexpected arguments "bar" and "baz".
             
             Usage: pub cache add <package> [--version <constraint>] [--all]
-            -h, --help       Print usage information for this command.
+            -h, --help       Print this usage information.
                 --all        Install all matching versions.
             -v, --version    Version constraint.
 
diff --git a/sdk/lib/_internal/pub_generated/test/get/git/check_out_and_upgrade_test.dart b/sdk/lib/_internal/pub_generated/test/get/git/check_out_and_upgrade_test.dart
index 414744e..9936664 100644
--- a/sdk/lib/_internal/pub_generated/test/get/git/check_out_and_upgrade_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/get/git/check_out_and_upgrade_test.dart
@@ -4,6 +4,8 @@
 
 library pub_tests;
 
+import 'package:scheduled_test/scheduled_test.dart';
+
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
@@ -39,7 +41,7 @@
         'foo.git',
         [d.libDir('foo', 'foo 2'), d.libPubspec('foo', '1.0.0')]).commit();
 
-    pubUpgrade();
+    pubUpgrade(output: contains("Changed 1 dependency!"));
 
     // When we download a new version of the git package, we should re-use the
     // git/cache directory but create a new git/ directory.
diff --git a/sdk/lib/_internal/pub_generated/test/get/git/check_out_unfetched_revision_of_cached_repo_test.dart b/sdk/lib/_internal/pub_generated/test/get/git/check_out_unfetched_revision_of_cached_repo_test.dart
new file mode 100644
index 0000000..277f2d1
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/get/git/check_out_unfetched_revision_of_cached_repo_test.dart
@@ -0,0 +1,71 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../../lib/src/io.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  // Regression test for issue 20947.
+  integration(
+      'checks out an unfetched and locked revision of a cached ' 'repository',
+      () {
+    ensureGit();
+
+    // In order to get a lockfile that refers to a newer revision than is in the
+    // cache, we'll switch between two caches. First we ensure that the repo is
+    // in the first cache.
+    d.git('foo.git', [d.libDir('foo'), d.libPubspec('foo', '1.0.0')]).create();
+
+    d.appDir({
+      "foo": {
+        "git": "../foo.git"
+      }
+    }).create();
+
+    pubGet();
+
+    // Switch to a new cache.
+    schedule(
+        () =>
+            renameDir(p.join(sandboxDir, cachePath), p.join(sandboxDir, "$cachePath.old")));
+
+    // Make the lockfile point to a new revision of the git repository.
+    d.git(
+        'foo.git',
+        [d.libDir('foo', 'foo 2'), d.libPubspec('foo', '1.0.0')]).commit();
+
+    pubUpgrade(output: contains("Changed 1 dependency!"));
+
+    // Switch back to the old cache.
+    schedule(() {
+      var cacheDir = p.join(sandboxDir, cachePath);
+      deleteEntry(cacheDir);
+      renameDir(p.join(sandboxDir, "$cachePath.old"), cacheDir);
+    });
+
+    // Get the updated version of the git dependency based on the lockfile.
+    pubGet();
+
+    d.dir(
+        cachePath,
+        [
+            d.dir(
+                'git',
+                [
+                    d.dir('cache', [d.gitPackageRepoCacheDir('foo')]),
+                    d.gitPackageRevisionCacheDir('foo'),
+                    d.gitPackageRevisionCacheDir('foo', 2)])]).validate();
+
+    d.dir(
+        packagesPath,
+        [d.dir('foo', [d.file('foo.dart', 'main() => "foo 2";')])]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/activate/activate_git_after_hosted_test.dart b/sdk/lib/_internal/pub_generated/test/global/activate/activate_git_after_hosted_test.dart
index 84c42f4..6be9b07 100644
--- a/sdk/lib/_internal/pub_generated/test/global/activate/activate_git_after_hosted_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/global/activate/activate_git_after_hosted_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:scheduled_test/scheduled_test.dart';
+
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
@@ -26,14 +28,17 @@
 
     schedulePub(args: ["global", "activate", "foo"]);
 
-    schedulePub(args: ["global", "activate", "-sgit", "../foo.git"], output: """
-            Package foo is currently active at version 1.0.0.
-            Resolving dependencies...
-            + foo 1.0.0 from git ../foo.git
-            Precompiling executables...
-            Loading source assets...
-            Precompiled foo:foo.
-            Activated foo 1.0.0 from Git repository "../foo.git".""");
+    schedulePub(
+        args: ["global", "activate", "-sgit", "../foo.git"],
+        output: allOf(
+            startsWith(
+                'Package foo is currently active at version 1.0.0.\n'
+                    'Resolving dependencies...\n' '+ foo 1.0.0 from git ../foo.git at '),
+            // Specific revision number goes here.
+    endsWith(
+        'Precompiling executables...\n' 'Loading source assets...\n'
+            'Precompiled foo:foo.\n'
+            'Activated foo 1.0.0 from Git repository "../foo.git".')));
 
     // Should now run the git one.
     var pub = pubRun(global: true, args: ["foo"]);
diff --git a/sdk/lib/_internal/pub_generated/test/global/activate/git_package_test.dart b/sdk/lib/_internal/pub_generated/test/global/activate/git_package_test.dart
index db10494..2239576 100644
--- a/sdk/lib/_internal/pub_generated/test/global/activate/git_package_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/global/activate/git_package_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:scheduled_test/scheduled_test.dart';
+
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
@@ -16,12 +18,14 @@
             d.libPubspec("foo", "1.0.0"),
             d.dir("bin", [d.file("foo.dart", "main() => print('ok');")])]).create();
 
-    schedulePub(args: ["global", "activate", "-sgit", "../foo.git"], output: '''
-            Resolving dependencies...
-            + foo 1.0.0 from git ../foo.git
-            Precompiling executables...
-            Loading source assets...
-            Precompiled foo:foo.
-            Activated foo 1.0.0 from Git repository "../foo.git".''');
+    schedulePub(
+        args: ["global", "activate", "-sgit", "../foo.git"],
+        output: allOf(
+            startsWith('Resolving dependencies...\n' '+ foo 1.0.0 from git ../foo.git at '),
+            // Specific revision number goes here.
+    endsWith(
+        'Precompiling executables...\n' 'Loading source assets...\n'
+            'Precompiled foo:foo.\n'
+            'Activated foo 1.0.0 from Git repository "../foo.git".')));
   });
 }
diff --git a/sdk/lib/_internal/pub_generated/test/global/activate/reactivating_git_upgrades_test.dart b/sdk/lib/_internal/pub_generated/test/global/activate/reactivating_git_upgrades_test.dart
index 661dd56..18b6829 100644
--- a/sdk/lib/_internal/pub_generated/test/global/activate/reactivating_git_upgrades_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/global/activate/reactivating_git_upgrades_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:scheduled_test/scheduled_test.dart';
+
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
@@ -12,22 +14,27 @@
 
     d.git('foo.git', [d.libPubspec("foo", "1.0.0")]).create();
 
-    schedulePub(args: ["global", "activate", "-sgit", "../foo.git"], output: '''
-            Resolving dependencies...
-            + foo 1.0.0 from git ../foo.git
-            Precompiling executables...
-            Loading source assets...
-            Activated foo 1.0.0 from Git repository "../foo.git".''');
+    schedulePub(
+        args: ["global", "activate", "-sgit", "../foo.git"],
+        output: allOf(
+            startsWith('Resolving dependencies...\n' '+ foo 1.0.0 from git ../foo.git at '),
+            // Specific revision number goes here.
+    endsWith(
+        'Precompiling executables...\n' 'Loading source assets...\n'
+            'Activated foo 1.0.0 from Git repository "../foo.git".')));
 
     d.git('foo.git', [d.libPubspec("foo", "1.0.1")]).commit();
 
     // Activating it again pulls down the latest commit.
-    schedulePub(args: ["global", "activate", "-sgit", "../foo.git"], output: '''
-            Package foo is currently active from Git repository "../foo.git".
-            Resolving dependencies...
-            + foo 1.0.1 from git ../foo.git
-            Precompiling executables...
-            Loading source assets...
-            Activated foo 1.0.1 from Git repository "../foo.git".''');
+    schedulePub(
+        args: ["global", "activate", "-sgit", "../foo.git"],
+        output: allOf(
+            startsWith(
+                'Package foo is currently active from Git repository ' '"../foo.git".\n'
+                    'Resolving dependencies...\n' '+ foo 1.0.1 from git ../foo.git at '),
+            // Specific revision number goes here.
+    endsWith(
+        'Precompiling executables...\n' 'Loading source assets...\n'
+            'Activated foo 1.0.1 from Git repository "../foo.git".')));
   });
 }
diff --git a/sdk/lib/_internal/pub_generated/test/global/deactivate/missing_package_arg_test.dart b/sdk/lib/_internal/pub_generated/test/global/deactivate/missing_package_arg_test.dart
index 07759ef..e362ecb 100644
--- a/sdk/lib/_internal/pub_generated/test/global/deactivate/missing_package_arg_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/global/deactivate/missing_package_arg_test.dart
@@ -12,7 +12,7 @@
             No package to deactivate given.
 
             Usage: pub global deactivate <package>
-            -h, --help    Print usage information for this command.
+            -h, --help    Print this usage information.
 
             Run "pub help" to see global options.
             """, exitCode: exit_codes.USAGE);
diff --git a/sdk/lib/_internal/pub_generated/test/global/deactivate/unexpected_arguments_test.dart b/sdk/lib/_internal/pub_generated/test/global/deactivate/unexpected_arguments_test.dart
index c1165c1..7e1e877 100644
--- a/sdk/lib/_internal/pub_generated/test/global/deactivate/unexpected_arguments_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/global/deactivate/unexpected_arguments_test.dart
@@ -12,7 +12,7 @@
             Unexpected arguments "bar" and "baz".
 
             Usage: pub global deactivate <package>
-            -h, --help    Print usage information for this command.
+            -h, --help    Print this usage information.
 
             Run "pub help" to see global options.
             """, exitCode: exit_codes.USAGE);
diff --git a/sdk/lib/_internal/pub_generated/test/global/run/errors_if_outside_bin_test.dart b/sdk/lib/_internal/pub_generated/test/global/run/errors_if_outside_bin_test.dart
index afcbe2c..aedeb48 100644
--- a/sdk/lib/_internal/pub_generated/test/global/run/errors_if_outside_bin_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/global/run/errors_if_outside_bin_test.dart
@@ -24,7 +24,7 @@
 Cannot run an executable in a subdirectory of a global package.
 
 Usage: pub global run <package>:<executable> [args...]
--h, --help    Print usage information for this command.
+-h, --help    Print this usage information.
     --mode    Mode to run transformers in.
               (defaults to "release")
 
diff --git a/sdk/lib/_internal/pub_generated/test/global/run/missing_executable_arg_test.dart b/sdk/lib/_internal/pub_generated/test/global/run/missing_executable_arg_test.dart
index ac24f66..c655cda 100644
--- a/sdk/lib/_internal/pub_generated/test/global/run/missing_executable_arg_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/global/run/missing_executable_arg_test.dart
@@ -12,7 +12,7 @@
             Must specify an executable to run.
 
             Usage: pub global run <package>:<executable> [args...]
-            -h, --help    Print usage information for this command.
+            -h, --help    Print this usage information.
                 --mode    Mode to run transformers in.
                           (defaults to "release")
 
diff --git a/sdk/lib/_internal/pub_generated/test/lish/force_cannot_be_combined_with_dry_run_test.dart b/sdk/lib/_internal/pub_generated/test/lish/force_cannot_be_combined_with_dry_run_test.dart
index e34852b..0cc6cd6 100644
--- a/sdk/lib/_internal/pub_generated/test/lish/force_cannot_be_combined_with_dry_run_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/lish/force_cannot_be_combined_with_dry_run_test.dart
@@ -17,7 +17,7 @@
           Cannot use both --force and --dry-run.
           
           Usage: pub publish [options]
-          -h, --help       Print usage information for this command.
+          -h, --help       Print this usage information.
           -n, --dry-run    Validate but do not publish the package.
           -f, --force      Publish without confirmation if there are no errors.
               --server     The package server to which to upload this package.
diff --git a/sdk/lib/_internal/pub_generated/test/package_list_files_test.dart b/sdk/lib/_internal/pub_generated/test/package_list_files_test.dart
index d831789..7d48927 100644
--- a/sdk/lib/_internal/pub_generated/test/package_list_files_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/package_list_files_test.dart
@@ -130,7 +130,8 @@
 void scheduleEntrypoint() {
   schedule(() {
     root = path.join(sandboxDir, appPath);
-    entrypoint = new Entrypoint(root, new SystemCache.withSources(root));
+    entrypoint =
+        new Entrypoint(root, new SystemCache.withSources(rootDir: root));
   }, 'initializing entrypoint');
 
   currentSchedule.onComplete.schedule(() {
diff --git a/sdk/lib/_internal/pub_generated/test/pub_test.dart b/sdk/lib/_internal/pub_generated/test/pub_test.dart
index e3806e1..d664fa7 100644
--- a/sdk/lib/_internal/pub_generated/test/pub_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/pub_test.dart
@@ -9,121 +9,27 @@
 import '../lib/src/exit_codes.dart' as exit_codes;
 import 'test_pub.dart';
 
-final USAGE_STRING = """
-    Pub is a package manager for Dart.
-
-    Usage: pub <command> [arguments]
-
-    Global options:
-    -h, --help            Print this usage information.
-        --version         Print pub version.
-        --[no-]trace      Print debugging information when an error occurs.
-        --verbosity       Control output verbosity.
-
-              [all]       Show all output including internal tracing messages.
-              [io]        Also show IO operations.
-              [normal]    Show errors, warnings, and user messages.
-              [solver]    Show steps during version resolution.
-
-    -v, --verbose         Shortcut for "--verbosity=all".
-
-    Available commands:
-      build       Apply transformers to build a package.
-      cache       Work with the system cache.
-      deps        Print package dependencies.
-      downgrade   Downgrade the current package's dependencies to oldest versions.
-      get         Get the current package's dependencies.
-      global      Work with global packages.
-      help        Display help information for Pub.
-      publish     Publish the current package to pub.dartlang.org.
-      run         Run an executable from a package.
-      serve       Run a local web development server.
-      upgrade     Upgrade the current package's dependencies to latest versions.
-      uploader    Manage uploaders for a package on pub.dartlang.org.
-      version     Print pub version.
-
-    Run "pub help [command]" for more information about a command.
-    See http://dartlang.org/tools/pub for detailed documentation.
-    """;
-
-final VERSION_STRING = '''
-    Pub 0.1.2+3
-    ''';
-
 main() {
   initConfig();
 
   integration('running pub with no command displays usage', () {
-    schedulePub(args: [], output: USAGE_STRING);
-  });
+    schedulePub(args: [], output: """
+        Pub is a package manager for Dart.
 
-  integration('running pub with just --help displays usage', () {
-    schedulePub(args: ['--help'], output: USAGE_STRING);
-  });
+        Usage: pub <command> [arguments]
 
-  integration('running pub with just -h displays usage', () {
-    schedulePub(args: ['-h'], output: USAGE_STRING);
-  });
+        Global options:
+        -h, --help            Print this usage information.
+            --version         Print pub version.
+            --[no-]trace      Print debugging information when an error occurs.
+            --verbosity       Control output verbosity.
 
-  integration('running pub with --with-prejudice upcases everything', () {
-    schedulePub(args: ['--with-prejudice'], output: USAGE_STRING.toUpperCase());
-  });
+                  [all]       Show all output including internal tracing messages.
+                  [io]        Also show IO operations.
+                  [normal]    Show errors, warnings, and user messages.
+                  [solver]    Show steps during version resolution.
 
-  integration('running pub with --help after command shows command usage', () {
-    schedulePub(args: ['get', '--help'], output: '''
-          Get the current package's dependencies.
-
-          Usage: pub get
-          -h, --help            Print usage information for this command.
-              --[no-]offline    Use cached packages instead of accessing the network.
-          -n, --dry-run         Report what dependencies would change but don't change any.
-
-          Run "pub help" to see global options.
-          See http://dartlang.org/tools/pub/cmd/pub-get.html for detailed documentation.
-    ''');
-  });
-
-  integration('running pub with -h after command shows command usage', () {
-    schedulePub(args: ['get', '-h'], output: '''
-          Get the current package's dependencies.
-
-          Usage: pub get
-          -h, --help            Print usage information for this command.
-              --[no-]offline    Use cached packages instead of accessing the network.
-          -n, --dry-run         Report what dependencies would change but don't change any.
-
-          Run "pub help" to see global options.
-          See http://dartlang.org/tools/pub/cmd/pub-get.html for detailed documentation.
-    ''');
-  });
-
-  integration(
-      'running pub with --help after a command with subcommands shows '
-          'command usage',
-      () {
-    schedulePub(args: ['cache', '--help'], output: '''
-          Work with the system cache.
-
-          Usage: pub cache <subcommand>
-          -h, --help    Print usage information for this command.
-
-          Available subcommands:
-            add      Install a package.
-            repair   Reinstall cached packages.
-
-          Run "pub help" to see global options.
-          See http://dartlang.org/tools/pub/cmd/pub-cache.html for detailed documentation.
-     ''');
-  });
-
-
-  integration('running pub with just --version displays version', () {
-    schedulePub(args: ['--version'], output: VERSION_STRING);
-  });
-
-  integration('an unknown command displays an error message', () {
-    schedulePub(args: ['quylthulg'], error: '''
-        Could not find a command named "quylthulg".
+        -v, --verbose         Shortcut for "--verbosity=all".
 
         Available commands:
           build       Apply transformers to build a package.
@@ -132,202 +38,20 @@
           downgrade   Downgrade the current package's dependencies to oldest versions.
           get         Get the current package's dependencies.
           global      Work with global packages.
-          help        Display help information for Pub.
+          help        Display help information for pub.
           publish     Publish the current package to pub.dartlang.org.
           run         Run an executable from a package.
           serve       Run a local web development server.
           upgrade     Upgrade the current package's dependencies to latest versions.
           uploader    Manage uploaders for a package on pub.dartlang.org.
           version     Print pub version.
-        ''', exitCode: exit_codes.USAGE);
+
+        Run "pub help <command>" for more information about a command.
+        See http://dartlang.org/tools/pub for detailed documentation.
+        """);
   });
 
-  integration('an unknown subcommand displays an error message', () {
-    schedulePub(args: ['cache', 'quylthulg'], error: '''
-        Could not find a subcommand named "quylthulg" for "pub cache".
-
-        Usage: pub cache <subcommand>
-        -h, --help    Print usage information for this command.
-
-        Available subcommands:
-          add      Install a package.
-          repair   Reinstall cached packages.
-
-        Run "pub help" to see global options.
-        See http://dartlang.org/tools/pub/cmd/pub-cache.html for detailed documentation.
-        ''', exitCode: exit_codes.USAGE);
-  });
-
-  integration('an unknown option displays an error message', () {
-    schedulePub(args: ['--blorf'], error: '''
-        Could not find an option named "blorf".
-        Run "pub help" to see available options.
-        ''', exitCode: exit_codes.USAGE);
-  });
-
-  integration('an unknown command option displays an error message', () {
-    // TODO(rnystrom): When pub has command-specific options, a more precise
-    // error message would be good here.
-    schedulePub(args: ['version', '--blorf'], error: '''
-        Could not find an option named "blorf".
-        Run "pub help" to see available options.
-        ''', exitCode: exit_codes.USAGE);
-  });
-
-  integration('an unexpected argument displays an error message', () {
-    schedulePub(args: ['version', 'unexpected'], error: '''
-        Command "version" does not take any arguments.
-
-        Usage: pub version
-         -h, --help    Print usage information for this command.
-
-        Run "pub help" to see global options.
-        ''', exitCode: exit_codes.USAGE);
-  });
-
-  integration('a missing subcommand displays an error message', () {
-    schedulePub(args: ['cache'], error: '''
-        Missing subcommand for "pub cache".
-
-        Usage: pub cache <subcommand>
-        -h, --help    Print usage information for this command.
-
-        Available subcommands:
-          add      Install a package.
-          repair   Reinstall cached packages.
-
-        Run "pub help" to see global options.
-        See http://dartlang.org/tools/pub/cmd/pub-cache.html for detailed documentation.
-        ''', exitCode: exit_codes.USAGE);
-  });
-
-  group('help', () {
-    integration('shows global help if no command is given', () {
-      schedulePub(args: ['help'], output: USAGE_STRING);
-    });
-
-    integration('shows help for a command', () {
-      schedulePub(args: ['help', 'get'], output: '''
-            Get the current package's dependencies.
-
-            Usage: pub get
-            -h, --help            Print usage information for this command.
-                --[no-]offline    Use cached packages instead of accessing the network.
-            -n, --dry-run         Report what dependencies would change but don't change any.
-
-            Run "pub help" to see global options.
-            See http://dartlang.org/tools/pub/cmd/pub-get.html for detailed documentation.
-            ''');
-    });
-
-    integration('shows help for a command', () {
-      schedulePub(args: ['help', 'publish'], output: '''
-            Publish the current package to pub.dartlang.org.
-
-            Usage: pub publish [options]
-            -h, --help       Print usage information for this command.
-            -n, --dry-run    Validate but do not publish the package.
-            -f, --force      Publish without confirmation if there are no errors.
-                --server     The package server to which to upload this package.
-                             (defaults to "https://pub.dartlang.org")
-
-            Run "pub help" to see global options.
-            See http://dartlang.org/tools/pub/cmd/pub-lish.html for detailed documentation.
-            ''');
-    });
-
-    integration('shows non-truncated help', () {
-      schedulePub(args: ['help', 'serve'], output: '''
-            Run a local web development server.
-
-            By default, this serves "web/" and "test/", but an explicit list of
-            directories to serve can be provided as well.
-
-            Usage: pub serve [directories...]
-            -h, --help               Print usage information for this command.
-                --mode               Mode to run transformers in.
-                                     (defaults to "debug")
-
-                --all                Use all default source directories.
-                --hostname           The hostname to listen on.
-                                     (defaults to "localhost")
-
-                --port               The base port to listen on.
-                                     (defaults to "8080")
-
-                --[no-]dart2js       Compile Dart to JavaScript.
-                                     (defaults to on)
-
-                --[no-]force-poll    Force the use of a polling filesystem watcher.
-
-            Run "pub help" to see global options.
-            See http://dartlang.org/tools/pub/cmd/pub-serve.html for detailed documentation.
-            ''');
-    });
-
-    integration('shows help for a subcommand', () {
-      schedulePub(args: ['help', 'cache', 'list'], output: '''
-            List packages in the system cache.
-
-            Usage: pub cache list
-            -h, --help    Print usage information for this command.
-
-            Run "pub help" to see global options.
-            ''');
-    });
-
-    integration('an unknown help command displays an error message', () {
-      schedulePub(args: ['help', 'quylthulg'], error: '''
-            Could not find a command named "quylthulg".
-
-            Available commands:
-              build       Apply transformers to build a package.
-              cache       Work with the system cache.
-              deps        Print package dependencies.
-              downgrade   Downgrade the current package's dependencies to oldest versions.
-              get         Get the current package's dependencies.
-              global      Work with global packages.
-              help        Display help information for Pub.
-              publish     Publish the current package to pub.dartlang.org.
-              run         Run an executable from a package.
-              serve       Run a local web development server.
-              upgrade     Upgrade the current package's dependencies to latest versions.
-              uploader    Manage uploaders for a package on pub.dartlang.org.
-              version     Print pub version.
-            ''', exitCode: exit_codes.USAGE);
-    });
-
-    integration('an unknown help subcommand displays an error message', () {
-      schedulePub(args: ['help', 'cache', 'quylthulg'], error: '''
-            Could not find a subcommand named "quylthulg" for "pub cache".
-
-            Usage: pub cache <subcommand>
-            -h, --help    Print usage information for this command.
-
-            Available subcommands:
-              add      Install a package.
-              repair   Reinstall cached packages.
-
-            Run "pub help" to see global options.
-            See http://dartlang.org/tools/pub/cmd/pub-cache.html for detailed documentation.
-            ''', exitCode: exit_codes.USAGE);
-    });
-
-    integration('an unexpected help subcommand displays an error message', () {
-      schedulePub(args: ['help', 'version', 'badsubcommand'], error: '''
-            Command "pub version" does not expect a subcommand.
-
-            Usage: pub version
-            -h, --help    Print usage information for this command.
-
-            Run "pub help" to see global options.
-            ''', exitCode: exit_codes.USAGE);
-    });
-  });
-
-  group('version', () {
-    integration('displays the current version', () {
-      schedulePub(args: ['version'], output: VERSION_STRING);
-    });
+  integration('running pub with just --version displays version', () {
+    schedulePub(args: ['--version'], output: 'Pub 0.1.2+3');
   });
 }
diff --git a/sdk/lib/_internal/pub_generated/test/pub_uploader_test.dart b/sdk/lib/_internal/pub_generated/test/pub_uploader_test.dart
index 19ff839..1047ede 100644
--- a/sdk/lib/_internal/pub_generated/test/pub_uploader_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/pub_uploader_test.dart
@@ -20,7 +20,7 @@
 Manage uploaders for a package on pub.dartlang.org.
 
 Usage: pub uploader [options] {add/remove} <email>
--h, --help       Print usage information for this command.
+-h, --help       Print this usage information.
     --server     The package server on which the package is hosted.
                  (defaults to "https://pub.dartlang.org")
 
diff --git a/sdk/lib/_internal/pub_generated/test/run/errors_if_no_executable_is_given_test.dart b/sdk/lib/_internal/pub_generated/test/run/errors_if_no_executable_is_given_test.dart
index 737c30d..0ba4378 100644
--- a/sdk/lib/_internal/pub_generated/test/run/errors_if_no_executable_is_given_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/run/errors_if_no_executable_is_given_test.dart
@@ -15,7 +15,7 @@
 Must specify an executable to run.
 
 Usage: pub run <executable> [args...]
--h, --help    Print usage information for this command.
+-h, --help    Print this usage information.
     --mode    Mode to run transformers in.
               (defaults to "release" for dependencies, "debug" for entrypoint)
 
diff --git a/sdk/lib/_internal/pub_generated/test/run/errors_if_path_in_dependency_test.dart b/sdk/lib/_internal/pub_generated/test/run/errors_if_path_in_dependency_test.dart
index 01f8c68..15cf766 100644
--- a/sdk/lib/_internal/pub_generated/test/run/errors_if_path_in_dependency_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/run/errors_if_path_in_dependency_test.dart
@@ -23,7 +23,7 @@
 Cannot run an executable in a subdirectory of a dependency.
 
 Usage: pub run <executable> [args...]
--h, --help    Print usage information for this command.
+-h, --help    Print this usage information.
     --mode    Mode to run transformers in.
               (defaults to "release" for dependencies, "debug" for entrypoint)
 
diff --git a/sdk/lib/_internal/pub_generated/test/serve/native_watch_replaced_file_test.dart b/sdk/lib/_internal/pub_generated/test/serve/native_watch_replaced_file_test.dart
new file mode 100644
index 0000000..b257216
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/serve/native_watch_replaced_file_test.dart
@@ -0,0 +1,57 @@
+// 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 'dart:async';
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  // This is a regression test for http://dartbug.com/21402.
+  initConfig();
+  withBarbackVersions("any", () {
+    integration(
+        "picks up files replaced after serving started when using the "
+            "native watcher",
+        () {
+      d.dir(appPath, [d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/src/transformer"]
+        }),
+            d.dir("lib", [d.dir("src", [d.file("transformer.dart", REWRITE_TRANSFORMER)])]),
+            d.dir("web", [d.file("file.txt", "before"),]),
+            d.file("other", "after")]).create();
+
+      createLockFile("myapp", pkg: ["barback"]);
+
+      pubServe(args: ["--no-force-poll"]);
+      waitForBuildSuccess();
+      requestShouldSucceed("file.out", "before.out");
+
+      schedule(() {
+        // Replace file.txt by renaming other on top of it.
+        return new File(
+            p.join(
+                sandboxDir,
+                appPath,
+                "other")).rename(p.join(sandboxDir, appPath, "web", "file.txt"));
+      });
+
+      // Read the transformed file to ensure the change is actually noticed by
+      // pub and not that we just get the new file contents piped through
+      // without pub realizing they've changed.
+      waitForBuildSuccess();
+      requestShouldSucceed("file.out", "after.out");
+
+      endPubServe();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/snapshot/updates_snapshot_for_git_dependency_test.dart b/sdk/lib/_internal/pub_generated/test/snapshot/updates_snapshot_for_git_dependency_test.dart
new file mode 100644
index 0000000..b370c80
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/snapshot/updates_snapshot_for_git_dependency_test.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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 p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("upgrades a snapshot when a git dependency is upgraded", () {
+    ensureGit();
+
+    d.git('foo.git', [d.pubspec({
+        "name": "foo",
+        "version": "0.0.1"
+      }),
+          d.dir(
+              "bin",
+              [d.file("hello.dart", "void main() => print('Hello!');")])]).create();
+
+    d.appDir({
+      "foo": {
+        "git": "../foo.git"
+      }
+    }).create();
+
+    pubGet(output: contains("Precompiled foo:hello."));
+
+    d.dir(
+        p.join(appPath, '.pub', 'bin', 'foo'),
+        [d.matcherFile('hello.dart.snapshot', contains('Hello!'))]).validate();
+
+    d.git(
+        'foo.git',
+        [
+            d.dir(
+                "bin",
+                [d.file("hello.dart", "void main() => print('Goodbye!');")])]).commit();
+
+    pubUpgrade(output: contains("Precompiled foo:hello."));
+
+    d.dir(
+        p.join(appPath, '.pub', 'bin', 'foo'),
+        [d.matcherFile('hello.dart.snapshot', contains('Goodbye!'))]).validate();
+
+    var process = pubRun(args: ['foo:hello']);
+    process.stdout.expect("Goodbye!");
+    process.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/test_pub.dart b/sdk/lib/_internal/pub_generated/test/test_pub.dart
index 72ee6a0..1fcc8d6 100644
--- a/sdk/lib/_internal/pub_generated/test/test_pub.dart
+++ b/sdk/lib/_internal/pub_generated/test/test_pub.dart
@@ -978,7 +978,8 @@
 Future<Pair<List<String>, List<String>>>
     schedulePackageValidation(ValidatorCreator fn) {
   return schedule(() {
-    var cache = new SystemCache.withSources(p.join(sandboxDir, cachePath));
+    var cache =
+        new SystemCache.withSources(rootDir: p.join(sandboxDir, cachePath));
 
     return new Future.sync(() {
       var validator = fn(new Entrypoint(p.join(sandboxDir, appPath), cache));
diff --git a/sdk/lib/convert/string_conversion.dart b/sdk/lib/convert/string_conversion.dart
index 4732992..9c32673 100644
--- a/sdk/lib/convert/string_conversion.dart
+++ b/sdk/lib/convert/string_conversion.dart
@@ -129,7 +129,6 @@
 
   void write(Object o) {
     if (_buffer.isNotEmpty) _flush();
-    String str = o.toString();
     _chunkedSink.add(o.toString());
   }
 
diff --git a/sdk/lib/convert/utf.dart b/sdk/lib/convert/utf.dart
index d16d2c6..a58fb74 100644
--- a/sdk/lib/convert/utf.dart
+++ b/sdk/lib/convert/utf.dart
@@ -331,6 +331,13 @@
    * character is discarded.
    */
   String convert(List<int> codeUnits, [int start = 0, int end]) {
+    // Allow the implementation to intercept and specialize based on the type
+    // of codeUnits.
+    String result = _convertIntercepted(_allowMalformed, codeUnits, start, end);
+    if (result != null) {
+      return null;
+    }
+
     int length = codeUnits.length;
     RangeError.checkValidRange(start, end, length);
     if (end == null) end = length;
@@ -361,6 +368,9 @@
   Stream<String> bind(Stream<List<int>> stream) => super.bind(stream);
 
   external Converter<List<int>,dynamic> fuse(Converter<String, dynamic> next);
+
+  external static String _convertIntercepted(
+      bool allowMalformed, List<int> codeUnits, int start, int end);
 }
 
 // UTF-8 constants.
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 54ef35f..9ce36d6 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -10066,7 +10066,12 @@
 
 }
 
-// Wrapper over an immutable NodeList to make it implement ElementList<Element>.
+// Wrapper over an immutable NodeList to make it implement ElementList.
+//
+// Clients are {`Document`, `DocumentFragment`}.`querySelectorAll` which are
+// declared to return `ElementList`.  This provides all the static analysis
+// benefit so there is no need for this class have a constrained type parameter.
+//
 class _FrozenElementList extends ListBase
     implements ElementList, NodeListWrapper {
   final List<Node> _nodeList;
@@ -23008,7 +23013,7 @@
 
   Element querySelector(String selectors);
 
-  List<Node> querySelectorAll(String selectors);
+  List<Node> _querySelectorAll(String selectors);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 173e527..4c9a376 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -11089,7 +11089,12 @@
 
 }
 
-// Wrapper over an immutable NodeList to make it implement ElementList<Element>.
+// Wrapper over an immutable NodeList to make it implement ElementList.
+//
+// Clients are {`Document`, `DocumentFragment`}.`querySelectorAll` which are
+// declared to return `ElementList`.  This provides all the static analysis
+// benefit so there is no need for this class have a constrained type parameter.
+//
 class _FrozenElementList extends ListBase
     implements ElementList, NodeListWrapper {
   final List<Node> _nodeList;
@@ -25179,7 +25184,7 @@
   @DomName('ParentNode.querySelectorAll')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> querySelectorAll(String selectors);
+  List<Node> _querySelectorAll(String selectors);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31419,10 +31424,10 @@
     if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
       return _blink.BlinkURL.instance.createObjectURL_Callback_1_(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is MediaSource)) {
+    if ((blob_OR_source_OR_stream is MediaStream)) {
       return _blink.BlinkURL.instance.createObjectURL_Callback_1_(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is MediaStream)) {
+    if ((blob_OR_source_OR_stream is MediaSource)) {
       return _blink.BlinkURL.instance.createObjectURL_Callback_1_(blob_OR_source_OR_stream);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
diff --git a/sdk/lib/html/html_common/css_class_set.dart b/sdk/lib/html/html_common/css_class_set.dart
index 4d7de3b..5704bfa 100644
--- a/sdk/lib/html/html_common/css_class_set.dart
+++ b/sdk/lib/html/html_common/css_class_set.dart
@@ -130,7 +130,7 @@
    * This is the Dart equivalent of jQuery's
    * [removeClass](http://api.jquery.com/removeClass/).
    */
-  void removeAll(Iterable<String> iterable) {
+  void removeAll(Iterable<Object> iterable) {
     modify((s) => s.removeAll(iterable));
   }
 
@@ -148,7 +148,7 @@
     iterable.forEach((e) => toggle(e, shouldAdd));
   }
 
-  void retainAll(Iterable<String> iterable) {
+  void retainAll(Iterable<Object> iterable) {
     modify((s) => s.retainAll(iterable));
   }
 
@@ -160,10 +160,10 @@
     modify((s) => s.retainWhere(test));
   }
 
-  bool containsAll(Iterable<String> collection) =>
+  bool containsAll(Iterable<Object> collection) =>
     readClasses().containsAll(collection);
 
-  Set<String> intersection(Set<String> other) =>
+  Set<String> intersection(Set<Object> other) =>
     readClasses().intersection(other);
 
   Set<String> union(Set<String> other) =>
diff --git a/sdk/lib/io/console.dart b/sdk/lib/io/console.dart
deleted file mode 100644
index c4ab7f2..0000000
--- a/sdk/lib/io/console.dart
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.io;
-
-Console _console;
-
-Console get console {
-  if (_console == null) {
-    _console = new Console._();
-  }
-  return _console;
-}
-
-/**
- * [Console] provides synchronous write access to stdout and stderr.
- *
- * The direct access to stdout and stderr through [stdout] and [stderr]
- * provides non-blocking async operations.
- */
-class Console {
-  final ConsoleSink _stdout;
-  final ConsoleSink _stderr;
-
-  Console._()
-      : _stdout = new ConsoleSink._(1),
-        _stderr = new ConsoleSink._(2);
-
-  /**
-   * Write to stdout.
-   */
-  ConsoleSink get log => _stdout;
-
-  /**
-   * Write to stderr.
-   */
-  ConsoleSink get error => _stderr;
-}
-
-/**
- * Sink class used for console writing.
- *
- * This class has a call method so you can call it directly. Calling
- * it directly is the same as calling its `writeln` method.
- */
-class ConsoleSink implements Sink<List<int>>, StringSink {
-  IOSink _sink;
-
-  ConsoleSink._(int fd) {
-    _sink = new IOSink(new _ConsoleConsumer(fd));
-  }
-
-  void call([Object message = ""]) => _sink.writeln(message);
-
-  void add(List<int> data) => _sink.add(data);
-
-  void close() {}
-
-  void write(Object obj) => _sink.write(obj);
-
-  void writeAll(Iterable objects, [String separator=""]) =>
-      _sink.writeAll(objects, separator);
-
-  void writeCharCode(int charCode) => _sink.writeCharCode(charCode);
-
-  void writeln([Object obj=""]) => _sink.writeln(obj);
-}
-
-class _ConsoleConsumer implements StreamConsumer<List<int>> {
-  final _file;
-
-  _ConsoleConsumer(int fd) : _file = _File._openStdioSync(fd);
-
-  Future addStream(Stream<List<int>> stream) {
-    var completer = new Completer();
-    var sub;
-    sub = stream.listen(
-        (data) {
-          try {
-            _file.writeFromSync(data);
-          } catch (e, s) {
-            sub.cancel();
-            completer.completeError(e, s);
-          }
-        },
-        onError: completer.completeError,
-        onDone: completer.complete,
-        cancelOnError: true);
-    return completer.future;
-  }
-
-  Future close() {
-    _file.closeSync();
-    return new Future.value();
-  }
-}
diff --git a/sdk/lib/io/data_transformer.dart b/sdk/lib/io/data_transformer.dart
index eff2757..f9f974a 100644
--- a/sdk/lib/io/data_transformer.dart
+++ b/sdk/lib/io/data_transformer.dart
@@ -457,15 +457,15 @@
   _ZLibEncoderSink(ByteConversionSink sink, bool gzip, int level,
                    int windowBits, int memLevel, int strategy,
                    List<int> dictionary, bool raw)
-      : super(sink, _Filter.newZLibDeflateFilter(gzip, level, windowBits,
-                                                 memLevel, strategy,
-                                                 dictionary, raw));
+      : super(sink, _Filter._newZLibDeflateFilter(gzip, level, windowBits,
+                                                  memLevel, strategy,
+                                                  dictionary, raw));
 }
 
 class _ZLibDecoderSink extends _FilterSink {
   _ZLibDecoderSink(ByteConversionSink sink, int windowBits,
                    List<int> dictionary, bool raw)
-      : super(sink, _Filter.newZLibInflateFilter(windowBits, dictionary, raw));
+      : super(sink, _Filter._newZLibInflateFilter(windowBits, dictionary, raw));
 }
 
 
@@ -552,13 +552,13 @@
    */
   void end();
 
-  external static _Filter newZLibDeflateFilter(bool gzip, int level,
-                                               int windowBits, int memLevel,
-                                               int strategy,
-                                               List<int> dictionary, bool raw);
+  external static _Filter _newZLibDeflateFilter(bool gzip, int level,
+                                                int windowBits, int memLevel,
+                                                int strategy,
+                                                List<int> dictionary, bool raw);
 
-  external static _Filter newZLibInflateFilter(int windowBits,
-                                               List<int> dictionary, bool raw);
+  external static _Filter _newZLibInflateFilter(int windowBits,
+                                                List<int> dictionary, bool raw);
 }
 
 void _validateZLibWindowBits(int windowBits) {
diff --git a/sdk/lib/io/directory_impl.dart b/sdk/lib/io/directory_impl.dart
index a54b2ef..46b17dc 100644
--- a/sdk/lib/io/directory_impl.dart
+++ b/sdk/lib/io/directory_impl.dart
@@ -44,7 +44,7 @@
   }
 
   Future<bool> exists() {
-    return _IOService.dispatch(_DIRECTORY_EXISTS, [path]).then((response) {
+    return _IOService._dispatch(_DIRECTORY_EXISTS, [path]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionOrErrorFromResponse(response, "Exists failed");
       }
@@ -103,7 +103,7 @@
         }
       });
     } else {
-      return _IOService.dispatch(_DIRECTORY_CREATE, [path]).then((response) {
+      return _IOService._dispatch(_DIRECTORY_CREATE, [path]).then((response) {
         if (_isErrorResponse(response)) {
           throw _exceptionOrErrorFromResponse(response, "Creation failed");
         }
@@ -140,7 +140,7 @@
     } else {
       fullPrefix = "$path${Platform.pathSeparator}$prefix";
     }
-    return _IOService.dispatch(_DIRECTORY_CREATE_TEMP, [fullPrefix])
+    return _IOService._dispatch(_DIRECTORY_CREATE_TEMP, [fullPrefix])
         .then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionOrErrorFromResponse(
@@ -173,7 +173,7 @@
   }
 
   Future<Directory> _delete({bool recursive: false}) {
-    return _IOService.dispatch(_DIRECTORY_DELETE, [path, recursive])
+    return _IOService._dispatch(_DIRECTORY_DELETE, [path, recursive])
         .then((response) {
           if (_isErrorResponse(response)) {
             throw _exceptionOrErrorFromResponse(response, "Deletion failed");
@@ -190,7 +190,7 @@
   }
 
   Future<Directory> rename(String newPath) {
-    return _IOService.dispatch(_DIRECTORY_RENAME, [path, newPath])
+    return _IOService._dispatch(_DIRECTORY_RENAME, [path, newPath])
         .then((response) {
           if (_isErrorResponse(response)) {
             throw _exceptionOrErrorFromResponse(response, "Rename failed");
@@ -281,7 +281,7 @@
   Stream get stream => controller.stream;
 
   void onListen() {
-    _IOService.dispatch(_DIRECTORY_LIST_START, [path, recursive, followLinks])
+    _IOService._dispatch(_DIRECTORY_LIST_START, [path, recursive, followLinks])
         .then((response) {
           if (response is int) {
             id = response;
@@ -319,7 +319,7 @@
     if (controller.isPaused) return;
     if (nextRunning) return;
     nextRunning = true;
-    _IOService.dispatch(_DIRECTORY_LIST_NEXT, [id]).then((result) {
+    _IOService._dispatch(_DIRECTORY_LIST_NEXT, [id]).then((result) {
       nextRunning = false;
       if (result is List) {
         next();
@@ -359,7 +359,7 @@
     }
     closed = true;
     if (id != null) {
-      _IOService.dispatch(_DIRECTORY_LIST_STOP, [id]).whenComplete(cleanup);
+      _IOService._dispatch(_DIRECTORY_LIST_STOP, [id]).whenComplete(cleanup);
     } else {
       cleanup();
     }
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index b0babc2..34e03de 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -232,7 +232,7 @@
   }
 
   Future<bool> exists() {
-    return _IOService.dispatch(_FILE_EXISTS, [path]).then((response) {
+    return _IOService._dispatch(_FILE_EXISTS, [path]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "Cannot check existence", path);
       }
@@ -258,7 +258,7 @@
     var result = recursive ? parent.create(recursive: true)
                            : new Future.value(null);
     return result
-      .then((_) => _IOService.dispatch(_FILE_CREATE, [path]))
+      .then((_) => _IOService._dispatch(_FILE_CREATE, [path]))
       .then((response) {
         if (_isErrorResponse(response)) {
           throw _exceptionFromResponse(response, "Cannot create file", path);
@@ -285,7 +285,7 @@
     if (recursive) {
       return new Directory(path).delete(recursive: true).then((_) => this);
     }
-    return _IOService.dispatch(_FILE_DELETE, [path]).then((response) {
+    return _IOService._dispatch(_FILE_DELETE, [path]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "Cannot delete file", path);
       }
@@ -306,7 +306,7 @@
   }
 
   Future<File> rename(String newPath) {
-    return _IOService.dispatch(_FILE_RENAME, [path, newPath]).then((response) {
+    return _IOService._dispatch(_FILE_RENAME, [path, newPath]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(
             response, "Cannot rename file to '$newPath'", path);
@@ -326,7 +326,7 @@
   }
 
   Future<File> copy(String newPath) {
-    return _IOService.dispatch(_FILE_COPY, [path, newPath]).then((response) {
+    return _IOService._dispatch(_FILE_COPY, [path, newPath]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(
             response, "Cannot copy file to '$newPath'", path);
@@ -349,7 +349,7 @@
         mode != FileMode.APPEND) {
       return new Future.error(new ArgumentError());
     }
-    return _IOService.dispatch(_FILE_OPEN, [path, mode._mode]).then((response) {
+    return _IOService._dispatch(_FILE_OPEN, [path, mode._mode]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "Cannot open file", path);
       }
@@ -358,7 +358,7 @@
   }
 
   Future<int> length() {
-    return _IOService.dispatch(_FILE_LENGTH_FROM_PATH, [path]).then((response) {
+    return _IOService._dispatch(_FILE_LENGTH_FROM_PATH, [path]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response,
                                      "Cannot retrieve length of file",
@@ -378,7 +378,7 @@
   }
 
   Future<DateTime> lastModified() {
-    return _IOService.dispatch(_FILE_LAST_MODIFIED, [path]).then((response) {
+    return _IOService._dispatch(_FILE_LAST_MODIFIED, [path]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response,
                                      "Cannot retrieve modification time",
@@ -1035,7 +1035,7 @@
       _id = 0;
     }
     _asyncDispatched = true;
-    return _IOService.dispatch(request, data)
+    return _IOService._dispatch(request, data)
         .whenComplete(() {
           _asyncDispatched = false;
         });
diff --git a/sdk/lib/io/file_system_entity.dart b/sdk/lib/io/file_system_entity.dart
index ee4312f..5c15c1c 100644
--- a/sdk/lib/io/file_system_entity.dart
+++ b/sdk/lib/io/file_system_entity.dart
@@ -124,7 +124,7 @@
     if (Platform.isWindows) {
       path = FileSystemEntity._trimTrailingPathSeparators(path);
     }
-    return _IOService.dispatch(_FILE_STAT, [path]).then((response) {
+    return _IOService._dispatch(_FILE_STAT, [path]).then((response) {
       if (_isErrorResponse(response)) {
         return FileStat._notFound;
       }
@@ -295,7 +295,7 @@
    * behavior.
    */
   Future<String> resolveSymbolicLinks() {
-    return _IOService.dispatch(_FILE_RESOLVE_SYMBOLIC_LINKS, [path])
+    return _IOService._dispatch(_FILE_RESOLVE_SYMBOLIC_LINKS, [path])
         .then((response) {
           if (_isErrorResponse(response)) {
             throw _exceptionFromResponse(response,
@@ -459,7 +459,7 @@
    * to an object that does not exist.
    */
   static Future<bool> identical(String path1, String path2) {
-    return _IOService.dispatch(_FILE_IDENTICAL, [path1, path2]).then((response) {
+    return _IOService._dispatch(_FILE_IDENTICAL, [path1, path2]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response,
             "Error in FileSystemEntity.identical($path1, $path2)", "");
@@ -657,7 +657,7 @@
   }
 
   static Future<int> _getTypeAsync(String path, bool followLinks) {
-    return _IOService.dispatch(_FILE_TYPE, [path, followLinks])
+    return _IOService._dispatch(_FILE_TYPE, [path, followLinks])
       .then((response) {
         if (_isErrorResponse(response)) {
           throw _exceptionFromResponse(response, "Error getting type", path);
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index 5c49c2f..846cd6b 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -2301,15 +2301,11 @@
   }
 
   void _handleRequest(_HttpRequest request) {
-    // Delay the request until the isolate's message-queue is handled.
-    // This greatly improves scheduling when a lot of requests are active.
-    Timer.run(() {
-      if (!closed) {
-        _controller.add(request);
-      } else {
-        request._httpConnection.destroy();
-      }
-    });
+    if (!closed) {
+      _controller.add(request);
+    } else {
+      request._httpConnection.destroy();
+    }
   }
 
   void _handleError(error) {
diff --git a/sdk/lib/io/io.dart b/sdk/lib/io/io.dart
index 7bad1e0..4365035 100644
--- a/sdk/lib/io/io.dart
+++ b/sdk/lib/io/io.dart
@@ -212,7 +212,6 @@
 
 part 'bytes_builder.dart';
 part 'common.dart';
-part 'console.dart';
 part 'crypto.dart';
 part 'data_transformer.dart';
 part 'directory.dart';
diff --git a/sdk/lib/io/io_service.dart b/sdk/lib/io/io_service.dart
index 03db8ad..cabba54 100644
--- a/sdk/lib/io/io_service.dart
+++ b/sdk/lib/io/io_service.dart
@@ -47,5 +47,5 @@
 const int _SSL_PROCESS_FILTER = 39;
 
 class _IOService {
-  external static Future dispatch(int request, List data);
+  external static Future _dispatch(int request, List data);
 }
diff --git a/sdk/lib/io/iolib_sources.gypi b/sdk/lib/io/iolib_sources.gypi
index 2195247..5b82147 100644
--- a/sdk/lib/io/iolib_sources.gypi
+++ b/sdk/lib/io/iolib_sources.gypi
@@ -6,7 +6,6 @@
   'sources': [
     'bytes_builder.dart',
     'common.dart',
-    'console.dart',
     'crypto.dart',
     'data_transformer.dart',
     'directory.dart',
diff --git a/sdk/lib/io/link.dart b/sdk/lib/io/link.dart
index eb65ac8..042ef36 100644
--- a/sdk/lib/io/link.dart
+++ b/sdk/lib/io/link.dart
@@ -173,7 +173,7 @@
     var result = recursive ? parent.create(recursive: true)
                            : new Future.value(null);
     return result
-      .then((_) => _IOService.dispatch(_FILE_CREATE_LINK, [path, target]))
+      .then((_) => _IOService._dispatch(_FILE_CREATE_LINK, [path, target]))
       .then((response) {
         if (_isErrorResponse(response)) {
           throw _exceptionFromResponse(
@@ -230,7 +230,7 @@
     if (recursive) {
       return new Directory(path).delete(recursive: true).then((_) => this);
     }
-    return _IOService.dispatch(_FILE_DELETE_LINK, [path]).then((response) {
+    return _IOService._dispatch(_FILE_DELETE_LINK, [path]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "Cannot delete link", path);
       }
@@ -247,7 +247,7 @@
   }
 
   Future<Link> rename(String newPath) {
-    return _IOService.dispatch(_FILE_RENAME_LINK, [path, newPath])
+    return _IOService._dispatch(_FILE_RENAME_LINK, [path, newPath])
         .then((response) {
           if (_isErrorResponse(response)) {
             throw _exceptionFromResponse(
@@ -264,7 +264,7 @@
   }
 
   Future<String> target() {
-    return _IOService.dispatch(_FILE_LINK_TARGET, [path]).then((response) {
+    return _IOService._dispatch(_FILE_LINK_TARGET, [path]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(
             response, "Cannot get target of link", path);
diff --git a/sdk/lib/io/process.dart b/sdk/lib/io/process.dart
index de3b0e5..a977b31 100644
--- a/sdk/lib/io/process.dart
+++ b/sdk/lib/io/process.dart
@@ -241,7 +241,7 @@
    * include the parent process's environment, with [environment] taking
    * precedence. Default is `true`.
    *
-   * If [runInShell] is true, the process will be spawned through a system
+   * If [runInShell] is `true`, the process will be spawned through a system
    * shell. On Linux and Mac OS, [:/bin/sh:] is used, while
    * [:%WINDIR%\system32\cmd.exe:] is used on Windows.
    *
@@ -257,6 +257,13 @@
    *       stdout.addStream(process.stdout);
    *       stderr.addStream(process.stderr);
    *     });
+   *
+   * If [detach] is `true` a detached process will be created. A
+   * detached process has no connection to its parent, and can
+   * keep running on its own when the parent dies. The only
+   * information available from a detached process is its `pid`. There
+   * is no connection to its `stdin`, `stdout` or `stderr` nor will its
+   * exit code become available when it terminates.
    */
   external static Future<Process> start(
       String executable,
@@ -264,7 +271,8 @@
       {String workingDirectory,
        Map<String, String> environment,
        bool includeParentEnvironment: true,
-       bool runInShell: false});
+       bool runInShell: false,
+       bool detach: false});
 
   /**
    * Starts a process and runs it non-interactively to completion. The
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index ac02978..44d6084 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -1162,7 +1162,7 @@
       args[2 * i + 3] = bufs[i].end;
     }
 
-    return _IOService.dispatch(_SSL_PROCESS_FILTER, args).then((response) {
+    return _IOService._dispatch(_SSL_PROCESS_FILTER, args).then((response) {
       if (response.length == 2) {
         _reportError(new TlsException('${response[1]} error ${response[0]}'),
                      null);
diff --git a/sdk/lib/io/stdio.dart b/sdk/lib/io/stdio.dart
index e4bdf01..9888d95 100644
--- a/sdk/lib/io/stdio.dart
+++ b/sdk/lib/io/stdio.dart
@@ -149,17 +149,29 @@
 
 
 /**
- * [Stdout] exposes methods to query the terminal for properties.
+ * [Stdout] represents the [IOSink] for either `stdout` or `stderr`.
  *
- * Use [hasTerminal] to test if there is a terminal associated to stdout.
+ * It provides a *blocking* `IOSink`, so using this to write will block until
+ * the output is written.
+ *
+ * In some situations this blocking behavior is undesirable as it does not
+ * provide the same non-blocking behavior as dart:io in general exposes.
+ * Use the property [nonBlocking] to get an `IOSink` which has the non-blocking
+ * behavior.
+ *
+ * This class can also be used to check whether `stdout` or `stderr` is
+ * connected to a terminal and query some terminal properties.
  */
 class Stdout extends _StdSink implements IOSink {
-  Stdout._(IOSink sink) : super(sink);
+  final int _fd;
+  IOSink _nonBlocking;
+
+  Stdout._(IOSink sink, this._fd) : super(sink);
 
   /**
    * Returns true if there is a terminal attached to stdout.
    */
-  external bool get hasTerminal;
+  bool get hasTerminal => _hasTerminal(_fd);
 
   /**
    * Get the number of columns of the terminal.
@@ -167,7 +179,7 @@
    * If no terminal is attached to stdout, a [StdoutException] is thrown. See
    * [hasTerminal] for more info.
    */
-  external int get terminalColumns;
+  int get terminalColumns => _terminalColumns(_fd);
 
   /**
    * Get the number of lines of the terminal.
@@ -175,7 +187,21 @@
    * If no terminal is attached to stdout, a [StdoutException] is thrown. See
    * [hasTerminal] for more info.
    */
-  external int get terminalLines;
+  int get terminalLines => _terminalLines(_fd);
+
+  external bool _hasTerminal(int fd);
+  external int _terminalColumns(int fd);
+  external int _terminalLines(int fd);
+
+  /**
+   * Get a non-blocking `IOSink`.
+   */
+  IOSink get nonBlocking {
+    if (_nonBlocking == null) {
+      _nonBlocking = new IOSink(new _FileStreamConsumer.fromStdio(_fd));
+    }
+    return _nonBlocking;
+  }
 }
 
 
@@ -190,6 +216,34 @@
   }
 }
 
+class _StdConsumer implements StreamConsumer<List<int>> {
+  final _file;
+
+  _StdConsumer(int fd) : _file = _File._openStdioSync(fd);
+
+  Future addStream(Stream<List<int>> stream) {
+    var completer = new Completer();
+    var sub;
+    sub = stream.listen(
+        (data) {
+          try {
+            _file.writeFromSync(data);
+          } catch (e, s) {
+            sub.cancel();
+            completer.completeError(e, s);
+          }
+        },
+        onError: completer.completeError,
+        onDone: completer.complete,
+        cancelOnError: true);
+    return completer.future;
+  }
+
+  Future close() {
+    _file.closeSync();
+    return new Future.value();
+  }
+}
 
 class _StdSink implements IOSink {
   final IOSink _sink;
@@ -227,7 +281,7 @@
 
 Stdin _stdin;
 Stdout _stdout;
-IOSink _stderr;
+Stdout _stderr;
 
 
 /// The standard input stream of data read by this program.
@@ -249,7 +303,7 @@
 
 
 /// The standard output stream of errors written by this program.
-IOSink get stderr {
+Stdout get stderr {
   if (_stderr == null) {
     _stderr = _StdIOUtils._getStdioOutputStream(2);
   }
diff --git a/sdk/lib/io/timer_impl.dart b/sdk/lib/io/timer_impl.dart
index ac619dc..c785cfc 100644
--- a/sdk/lib/io/timer_impl.dart
+++ b/sdk/lib/io/timer_impl.dart
@@ -132,6 +132,10 @@
   static RawReceivePort _receivePort;
   static SendPort _sendPort;
   static int _scheduledWakeupTime;
+  // Keep track whether at least one message is pending in the event loop. This
+  // way we do not have to notify for every pending _firstZeroTimer.
+  static var _messagePending = false;
+
   static bool _handlingCallbacks = false;
 
   Function _callback;  // Closure to call when timer fires. null if canceled.
@@ -255,7 +259,7 @@
       return;
     }
 
-    if (_firstZeroTimer == null && _heap.isEmpty) {
+    if ((_firstZeroTimer == null) && _heap.isEmpty) {
       // No pending timers: Close the receive port and let the event handler
       // know.
       if (_receivePort != null) {
@@ -269,7 +273,10 @@
         _createTimerHandler();
       }
       if (_firstZeroTimer != null) {
-        _sendPort.send(null);
+        if (!_messagePending) {
+          _sendPort.send(null);
+          _messagePending = true;  // Reset when the port receives a message.
+        }
       } else {
         var wakeupTime = _heap.first._wakeupTime;
         if ((_scheduledWakeupTime == null) ||
@@ -282,56 +289,73 @@
   }
 
   static void _handleTimeout(pendingImmediateCallback) {
-    int currentTime = new DateTime.now().millisecondsSinceEpoch;
+    // Fast exit if no timers have been scheduled.
+    if (_heap.isEmpty && (_firstZeroTimer == null)) {
+      assert(_receivePort == null);
+      return;
+    }
+
     // Collect all pending timers.
     var head = null;
     var tail = null;
-    // Keep track of the lowest wakeup times for both the list and heap. If
-    // the respective queue is empty move its time beyond the current time.
-    var heapTime = _heap.isEmpty ?
-        (currentTime + 1) : _heap.first._wakeupTime;
-    var listTime = (_firstZeroTimer == null) ?
-        (currentTime + 1) : _firstZeroTimer._wakeupTime;
+    if (_heap.isEmpty) {
+      // Only immediate timers are scheduled. Take over the whole list as is.
+      assert(_firstZeroTimer != null);
+      assert(_lastZeroTimer != null);
+      head = _firstZeroTimer;
+      tail = _lastZeroTimer;
+      _firstZeroTimer = null;
+      _lastZeroTimer = null;
+    } else {
+      assert(!_heap.isEmpty);
+      // Keep track of the lowest wakeup times for both the list and heap. If
+      // the respective queue is empty move its time beyond the current time.
+      var currentTime = new DateTime.now().millisecondsSinceEpoch;
+      var heapTime = _heap.first._wakeupTime;
+      var listTime = (_firstZeroTimer == null) ?
+          (currentTime + 1) : _firstZeroTimer._wakeupTime;
 
-    while ((heapTime <= currentTime) || (listTime <= currentTime)) {
-      var timer;
-      // Consume the timers in order by removing from heap or list based on
-      // their wakeup time and update the queue's time.
-      assert((heapTime != listTime) ||
-             ((_heap.first != null) && (_firstZeroTimer != null)));
-      if ((heapTime < listTime) ||
-          ((heapTime == listTime) &&
-           (_heap.first._id < _firstZeroTimer._id))) {
-        timer = _heap.removeFirst();
-        heapTime = _heap.isEmpty ? (currentTime + 1) : _heap.first._wakeupTime;
-      } else {
-        timer = _firstZeroTimer;
-        assert(timer._milliSeconds == 0);
-        _firstZeroTimer = timer._indexOrNext;
-        if (_firstZeroTimer == null) {
-          _lastZeroTimer = null;
-          listTime = currentTime + 1;
+      while ((heapTime <= currentTime) || (listTime <= currentTime)) {
+        var timer;
+        // Consume the timers in order by removing from heap or list based on
+        // their wakeup time and update the queue's time.
+        assert((heapTime != listTime) ||
+               ((_heap.first != null) && (_firstZeroTimer != null)));
+        if ((heapTime < listTime) ||
+            ((heapTime == listTime) &&
+             (_heap.first._id < _firstZeroTimer._id))) {
+          timer = _heap.removeFirst();
+          heapTime = _heap.isEmpty ?
+              (currentTime + 1) : _heap.first._wakeupTime;
         } else {
-          // We want to drain all entries from the list as they should have
-          // been pending for 0 ms. To prevent issues with current time moving
-          // we ensure that the listTime does not go beyond current, unless the
-          // list is empty.
-          listTime = _firstZeroTimer._wakeupTime;
-          if (listTime > currentTime) {
-            listTime = currentTime;
+          timer = _firstZeroTimer;
+          assert(timer._milliSeconds == 0);
+          _firstZeroTimer = timer._indexOrNext;
+          if (_firstZeroTimer == null) {
+            _lastZeroTimer = null;
+            listTime = currentTime + 1;
+          } else {
+            // We want to drain all entries from the list as they should have
+            // been pending for 0 ms. To prevent issues with current time moving
+            // we ensure that the listTime does not go beyond current, unless
+            // the list is empty.
+            listTime = _firstZeroTimer._wakeupTime;
+            if (listTime > currentTime) {
+              listTime = currentTime;
+            }
           }
         }
-      }
 
-      // Append this timer to the pending timer list.
-      timer._indexOrNext = null;
-      if (head == null) {
-        assert(tail == null);
-        head = timer;
-        tail = timer;
-      } else {
-        tail._indexOrNext = timer;
-        tail = timer;
+        // Append this timer to the pending timer list.
+        timer._indexOrNext = null;
+        if (head == null) {
+          assert(tail == null);
+          head = timer;
+          tail = timer;
+        } else {
+          tail._indexOrNext = timer;
+          tail = timer;
+        }
       }
     }
 
@@ -385,13 +409,16 @@
 
   // Creates a receive port and registers an empty handler on that port. Just
   // the triggering of the event loop will ensure that timers are executed.
-  static _ignoreMessage(_) => null;
+  static _ignoreMessage(_) {
+    _messagePending = false;
+  }
 
   static void _createTimerHandler() {
     assert(_receivePort == null);
     _receivePort = new RawReceivePort(_ignoreMessage);
     _sendPort = _receivePort.sendPort;
     _scheduledWakeupTime = null;
+    _messagePending = false;
   }
 
   static void _shutdownTimerHandler() {
@@ -399,6 +426,7 @@
     _receivePort = null;
     _sendPort = null;
     _scheduledWakeupTime = null;
+    _messagePending = false;
   }
 
   // The Timer factory registered with the dart:async library by the embedder.
diff --git a/sdk/lib/io/websocket.dart b/sdk/lib/io/websocket.dart
index 327ef3a..60414da 100644
--- a/sdk/lib/io/websocket.dart
+++ b/sdk/lib/io/websocket.dart
@@ -5,7 +5,7 @@
 part of dart.io;
 
 /**
- * Web socket status codes used when closing a web socket connection.
+ * WebSocket status codes used when closing a WebSocket connection.
  */
 abstract class WebSocketStatus {
   static const int NORMAL_CLOSURE = 1000;
@@ -49,7 +49,7 @@
  *
  *     server.transform(new WebSocketTransformer()).listen((webSocket) => ...);
  *
- * This transformer strives to implement web sockets as specified by RFC6455.
+ * This transformer strives to implement WebSockets as specified by RFC6455.
  */
 abstract class WebSocketTransformer
     implements StreamTransformer<HttpRequest, WebSocket> {
@@ -68,7 +68,7 @@
 
   /**
    * Upgrades a [HttpRequest] to a [WebSocket] connection. If the
-   * request is not a valid web socket upgrade request a HTTP response
+   * request is not a valid WebSocket upgrade request an HTTP response
    * with status code 500 will be returned. Otherwise the returned
    * future will complete with the [WebSocket] when the upgrade pocess
    * is complete.
@@ -125,13 +125,33 @@
   Duration pingInterval;
 
   /**
-   * Create a new web socket connection. The URL supplied in [url]
-   * must use the scheme [:ws:] or [:wss:]. The [protocols] argument is
-   * specifying the subprotocols the client is willing to speak.
+   * Create a new WebSocket connection. The URL supplied in [url]
+   * must use the scheme `ws` or `wss`.
+   *
+   * The [protocols] argument is specifying the subprotocols the
+   * client is willing to speak.
+   *
+   * The [headers] argument is specifying additional HTTP headers for
+   * setting up the connection. This would typically be the `Origin`
+   * header and potentially cookies. The keys of the map are the header
+   * fields and the values are either String or List<String>.
+   *
+   * If [headers] is provided, there are a number of headers
+   * which are controlled by the WebSocket connection process. These
+   * headers are:
+   *
+   *   - `connection`
+   *   - `sec-websocket-key`
+   *   - `sec-websocket-protocol`
+   *   - `sec-websocket-version`
+   *   - `upgrade`
+   *
+   * If any of these are passed in the `headers` map they will be ignored.
    */
   static Future<WebSocket> connect(String url,
-                                   {List<String> protocols: const []}) =>
-      _WebSocketImpl.connect(url, protocols);
+                                   {Iterable<String> protocols,
+                                    Map<String, dynamic> headers}) =>
+      _WebSocketImpl.connect(url, protocols, headers);
 
   @Deprecated('This constructor will be removed in Dart 2.0. Use `implements`'
       ' instead of `extends` if implementing this abstract class.')
@@ -168,33 +188,33 @@
 
   /**
    * The extensions property is initially the empty string. After the
-   * web socket connection is established this string reflects the
+   * WebSocket connection is established this string reflects the
    * extensions used by the server.
    */
   String get extensions;
 
   /**
    * The protocol property is initially the empty string. After the
-   * web socket connection is established the value is the subprotocol
+   * WebSocket connection is established the value is the subprotocol
    * selected by the server. If no subprotocol is negotiated the
    * value will remain [:null:].
    */
   String get protocol;
 
   /**
-   * The close code set when the web socket connection is closed. If
+   * The close code set when the WebSocket connection is closed. If
    * there is no close code available this property will be [:null:]
    */
   int get closeCode;
 
   /**
-   * The close reason set when the web socket connection is closed. If
+   * The close reason set when the WebSocket connection is closed. If
    * there is no close reason available this property will be [:null:]
    */
   String get closeReason;
 
   /**
-   * Closes the web socket connection. Set the optional [code] and [reason]
+   * Closes the WebSocket connection. Set the optional [code] and [reason]
    * arguments to send close information to the remote peer. If they are
    * omitted, the peer will see [WebSocketStatus.NO_STATUS_RECEIVED] code
    * with no reason.
@@ -202,13 +222,13 @@
   Future close([int code, String reason]);
 
   /**
-   * Sends data on the web socket connection. The data in [data] must
+   * Sends data on the WebSocket connection. The data in [data] must
    * be either a [:String:], or a [:List<int>:] holding bytes.
    */
   void add(data);
 
   /**
-   * Sends data from a stream on web socket connection. Each data event from
+   * Sends data from a stream on WebSocket connection. Each data event from
    * [stream] will be send as a single WebSocket frame. The data from [stream]
    * must be either [:String:]s, or [:List<int>:]s holding bytes.
    */
diff --git a/sdk/lib/io/websocket_impl.dart b/sdk/lib/io/websocket_impl.dart
index 872cd32..ae4c91c 100644
--- a/sdk/lib/io/websocket_impl.dart
+++ b/sdk/lib/io/websocket_impl.dart
@@ -401,7 +401,7 @@
       sha1.add("$key$_webSocketGUID".codeUnits);
       String accept = _CryptoUtils.bytesToBase64(sha1.close());
       response.headers.add("Sec-WebSocket-Accept", accept);
-      if (protocol != null && protocol.isNotEmpty) {
+      if (protocol != null) {
         response.headers.add("Sec-WebSocket-Protocol", protocol);
       }
       response.headers.contentLength = 0;
@@ -769,7 +769,8 @@
 
   static final HttpClient _httpClient = new HttpClient();
 
-  static Future<WebSocket> connect(String url, List<String> protocols) {
+  static Future<WebSocket> connect(
+      String url, Iterable<String> protocols, Map<String, dynamic> headers) {
     Uri uri = Uri.parse(url);
     if (uri.scheme != "ws" && uri.scheme != "wss") {
       throw new WebSocketException("Unsupported URL scheme '${uri.scheme}'");
@@ -795,15 +796,18 @@
                   fragment: uri.fragment);
     return _httpClient.openUrl("GET", uri)
       .then((request) {
+        if (headers != null) {
+          headers.forEach((field, value) => request.headers.add(field, value));
+        }
         // Setup the initial handshake.
         request.headers
-            ..add(HttpHeaders.CONNECTION, "Upgrade")
+            ..set(HttpHeaders.CONNECTION, "Upgrade")
             ..set(HttpHeaders.UPGRADE, "websocket")
             ..set("Sec-WebSocket-Key", nonce)
             ..set("Cache-Control", "no-cache")
             ..set("Sec-WebSocket-Version", "13");
-        if (protocols.isNotEmpty) {
-          request.headers.add("Sec-WebSocket-Protocol", protocols);
+        if (protocols != null) {
+          request.headers.add("Sec-WebSocket-Protocol", protocols.toList());
         }
         return request.close();
       })
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index 40c3706..9a47ceb 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -885,7 +885,7 @@
 @DomName('PannerNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#PannerNode
 @Experimental()
-@Native("PannerNode,AudioPannerNode")
+@Native("PannerNode,AudioPannerNode,webkitAudioPannerNode")
 class PannerNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
   factory PannerNode._() { throw new UnsupportedError("Not supported"); }
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index d431158..ec87538 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -12,73 +12,33 @@
 Language/13_Statements/12_Labels_A01_t03: fail # co19-roll r546: Please triage this failure
 
 [ $compiler == dart2dart ]
+Language/03_Overview/1_Scoping_A02_t05: Fail # Inherited from dart2js
+Language/03_Overview/1_Scoping_A02_t06: Fail # inherited from dart2js
+Language/03_Overview/1_Scoping_A02_t28: Fail # co19-roll r559: Please triage this failure
+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/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_A11_t01: fail
 Language/07_Classes/07_Classes_A13_t02: Fail # Missing CT error on member with same name a type parameter
 Language/07_Classes/07_Classes_A13_t03: Fail # Missing CT error on member with same name a type parameter
 Language/07_Classes/07_Classes_A13_t05: Fail # Missing CT error on member with same name a type parameter
 Language/07_Classes/07_Classes_A13_t06: Fail # Missing CT error on member with same name a type parameter
 Language/07_Classes/07_Classes_A13_t08: Fail # Missing CT error on member with same name a type parameter
 Language/07_Classes/07_Classes_A13_t09: Fail # Missing CT error on member with same name a type parameter
-
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A20_t02: fail # 13363
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A12_t02: fail # 13363
-
-LibTest/core/Function/apply_A01_t01: RuntimeError # Issue 21673
-
-
-Language/13_Statements/04_Local_Function_Declaration_A04_t01: Fail, MissingCompileTimeError # co19-roll r607: Please triage this failure
-
-Language/12_Expressions/12_Instance_Creation/1_New_A04_t02: RuntimeError # co19-roll r607: Please triage this failure
-Language/12_Expressions/17_Getter_Invocation_A07_t02: Pass, RuntimeError # co19-roll r607: Please triage this failure
-LibTest/core/Invocation/memberName_A01_t01: Pass, RuntimeError # co18-roll r607: Please triage this failure
-LibTest/core/Symbol/Symbol_A01_t03: RuntimeError # co19-roll r607: Please triage this failure
-LibTest/core/Symbol/Symbol_A01_t05: RuntimeError # co19-roll r607: Please triage this failure
-
-Language/07_Classes/9_Superclasses/1_Inheritance_and_Overriding_A01_t03: Fail # TODO(dart2dart-team): Please triage this failure.
-
-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/03_Overview/1_Scoping_A02_t05: Fail # Inherited from dart2js
-Language/03_Overview/1_Scoping_A02_t06: Fail # inherited from dart2js
+Language/07_Classes/1_Instance_Methods_A07_t01: fail # Issue 21201
 Language/07_Classes/3_Setters_A04_t01: Fail # inherited from VM
 Language/07_Classes/3_Setters_A04_t02: Fail # inherited from VM
 Language/07_Classes/3_Setters_A04_t07: Fail # inherited from VM
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A12_t02: fail # 13363
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A20_t02: fail # 13363
+Language/07_Classes/6_Constructors/2_Factories_A08_t02: fail # Issue 21202
+Language/07_Classes/6_Constructors/2_Factories_A10_t02: fail # Issue 21202
+Language/07_Classes/6_Constructors/2_Factories_A10_t03: fail # Issue 21202
+Language/07_Classes/6_Constructors_A03_t03: Fail # Calling unresolved class constructor.
+Language/07_Classes/9_Superclasses/1_Inheritance_and_Overriding_A01_t03: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/10_Generics/09_Generics_A01_t17: fail # Issue 21203
 Language/12_Expressions/01_Constants_A03_t01: Fail # Issue 13652
-
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: Fail
-LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: Fail # inherited from VM
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: Fail # inherited from VM
-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, OK # co19 issue 294
-LibTest/core/int/operator_left_shift_A01_t02: Fail, OK # co19 issue 129
-LibTest/core/int/toRadixString_A01_t01: Fail # inherited from VM
-LibTest/isolate/ReceivePort/receive_A01_t02: Fail, OK # co19 issue 276
-LibTest/math/tan_A01_t01: Fail # Issue co19 - 44
-LibTest/typed_data/Float32x4/equal_A01_t01: Skip # co19 issue 656
-LibTest/typed_data/Float32x4/notEqual_A01_t01: Skip # co19 issue 656
-LibTest/typed_data/Float32x4/greaterThan_A01_t01: Skip # co19 issue 656
-LibTest/typed_data/Float32x4/greaterThanOrEqual_A01_t01: Skip # co19 issue 656
-LibTest/typed_data/Float32x4/lessThan_A01_t01: Skip # co19 issue 656
-LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
-
-[ $compiler == dart2dart && $system == windows ]
-LibTest/core/double/operator_remainder_A01_t04: Fail # Result is NaN
-LibTest/core/double/round_A01_t01: Fail # Result is NaN
-LibTest/core/double/remainder_A01_t04: Fail # Result is NaN
-
-
-[ $compiler == dart2dart && $system == macos ]
-LibTest/math/acos_A01_t01: Fail, OK # co19 issue 44
-LibTest/math/asin_A01_t01: Fail, OK # co19 issue 44
-LibTest/math/atan_A01_t01: Fail, OK # co19 issue 44
-
-[ $compiler == dart2dart ]
-Language/03_Overview/1_Scoping_A02_t28: Fail # co19-roll r559: Please triage this failure
-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_A11_t01: fail
 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
@@ -86,14 +46,22 @@
 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_A04_t02: RuntimeError # co19-roll r607: 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_t15: CompileTimeError # Issue 21092
 Language/12_Expressions/12_Instance_Creation/2_Const_A11_t01: MissingCompileTimeError # Issue 21134
 Language/12_Expressions/12_Instance_Creation/2_Const_A11_t03: MissingCompileTimeError # Issue 21134
+Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t17: MissingCompileTimeError # Issue 21210
+Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t18: MissingCompileTimeError # Issue 21210
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t09: RuntimeError # co19-roll r623: Please triage this failure
+Language/12_Expressions/17_Getter_Invocation_A07_t02: Pass, RuntimeError # co19-roll r607: Please triage this failure
 Language/12_Expressions/22_Equality_A01_t01: 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/30_Identifier_Reference_A02_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/04_Local_Function_Declaration_A04_t01: Fail, MissingCompileTimeError # co19-roll r607: Please triage this failure
+Language/13_Statements/04_Local_Function_Declaration_A04_t03: MissingCompileTimeError # co19-roll r667: Please triage this failure
 Language/13_Statements/09_Switch_A01_t02: 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
@@ -103,23 +71,56 @@
 Language/14_Libraries_and_Scripts/1_Imports_A03_t30: 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 # Issue 14654
 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_A02_t06: fail # co19-roll r546: Please triage this failure
+LibTest/async/DeferredLibrary/DeferredLibrary_A01_t01: RuntimeError # Issue 22032
 LibTest/core/DateTime/parse_A03_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/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
-Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t09: RuntimeError # co19-roll r623: Please triage this failure
 LibTest/core/Function/Function_class_A01_t01: RuntimeError # co19-roll r623: Please triage this failure
-Language/13_Statements/04_Local_Function_Declaration_A04_t03: MissingCompileTimeError # co19-roll r667: Please triage this failure
+LibTest/core/Function/apply_A01_t01: RuntimeError # Issue 21673
+LibTest/core/Invocation/memberName_A01_t01: Pass, RuntimeError # co18-roll r607: Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: Fail
+LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: Fail # inherited from VM
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: Fail # inherited from VM
+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, OK # co19 issue 294
+LibTest/core/Symbol/Symbol_A01_t03: RuntimeError # co19-roll r607: Please triage this failure
+LibTest/core/Symbol/Symbol_A01_t05: RuntimeError # co19-roll r607: Please triage this failure
+LibTest/core/int/operator_left_shift_A01_t02: Fail, OK # co19 issue 129
+LibTest/core/int/toRadixString_A01_t01: Fail # inherited from VM
+LibTest/isolate/Isolate/spawnUri_A01_t01: Fail # co19-roll r672: Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A01_t02: Fail # co19-roll r672: Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A01_t03: Fail # co19-roll r672: Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A01_t04: Fail # co19-roll r672: Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A01_t05: Fail # co19-roll r672: Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A02_t01: RuntimeError # Issue 15617
+LibTest/isolate/Isolate/spawn_A02_t02: RuntimeError # Issue 15617
+LibTest/isolate/IsolateStream/any_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/isolate/ReceivePort/receive_A01_t02: Fail, OK # co19 issue 276
 LibTest/isolate/SendPort/send_A01_t01: CompileTimeError # co19-roll r706: Please triage this failure
 LibTest/isolate/SendPort/send_A01_t02: CompileTimeError # co19-roll r706: Please triage this failure
 LibTest/isolate/SendPort/send_A01_t03: CompileTimeError # co19-roll r706: 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/math/tan_A01_t01: Fail # co19 issue 44
+LibTest/typed_data/Float32x4/equal_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/greaterThanOrEqual_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/greaterThan_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/lessThan_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/notEqual_A01_t01: Skip # co19 issue 656
 
-LibTest/isolate/Isolate/spawn_A02_t02: RuntimeError # Issue 15617
-LibTest/isolate/Isolate/spawnUri_A02_t01: RuntimeError # Issue 15617
-LibTest/async/DeferredLibrary/DeferredLibrary_A01_t01: RuntimeError # Issue 22032
+[ $compiler == dart2dart && $system == windows ]
+LibTest/core/double/operator_remainder_A01_t04: Fail # Result is NaN
+LibTest/core/double/round_A01_t01: Fail # Result is NaN
+LibTest/core/double/remainder_A01_t04: Fail # Result is NaN
+
+[ $compiler == dart2dart && $system == macos ]
+LibTest/math/acos_A01_t01: Fail, OK # co19 issue 44
+LibTest/math/asin_A01_t01: Fail, OK # co19 issue 44
+LibTest/math/atan_A01_t01: Fail, OK # co19 issue 44
 
 [ $compiler == dart2dart && $minified ]
 Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: fail # co19-roll r559: Please triage this failure
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index ed32291..c221ae8 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -2,105 +2,262 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-[ $compiler == dart2js && $runtime == jsshell ]
-LibTest/core/List/sort_A01_t04: Fail, Pass, Timeout # Must be a bug in jsshell, test sometimes times out.
-
-# Crashes first, please. Then untriaged bugs. There is a section below
-# for co19 bugs.
 [ $compiler == dart2js ]
-LibTest/core/List/removeAt_A02_t01: RuntimeError # Issue 1533
-LibTest/isolate/ReceivePort/receive_A01_t02: RuntimeError # Issue 6750
+Language/03_Overview/1_Scoping_A02_t05: CompileTimeError # Issue 21072
+Language/03_Overview/1_Scoping_A02_t06: CompileTimeError # Issue 21072
+Language/03_Overview/1_Scoping_A02_t28: fail # Issue 21092 and co19 issue 713
+Language/05_Variables/05_Variables_A05_t01: fail # Issue 21093
+Language/05_Variables/05_Variables_A05_t02: fail # Issue 21093
 Language/05_Variables/05_Variables_A11_t01: MissingCompileTimeError # Issue 21050
-Language/13_Statements/04_Local_Function_Declaration_A04_t01: MissingCompileTimeError # Issue 21050
-Language/13_Statements/04_Local_Function_Declaration_A04_t03: MissingCompileTimeError # Issue 21050
-
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A20_t02: fail # Issue 13363
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A12_t02: fail # Issue 13363
-
+Language/06_Functions/4_External_Functions_A01_t01: CompileTimeError, OK # Issue 5021
 Language/07_Classes/07_Classes_A13_t02: Fail # Missing CT error on member with same name a type parameter
 Language/07_Classes/07_Classes_A13_t03: Fail # Missing CT error on member with same name a type parameter
 Language/07_Classes/07_Classes_A13_t05: Fail # Missing CT error on member with same name a type parameter
 Language/07_Classes/07_Classes_A13_t06: Fail # Missing CT error on member with same name a type parameter
 Language/07_Classes/07_Classes_A13_t08: Fail # Missing CT error on member with same name a type parameter
 Language/07_Classes/07_Classes_A13_t09: Fail # Missing CT error on member with same name a type parameter
-Language/03_Overview/1_Scoping_A02_t05: CompileTimeError # Issue 21072
-Language/03_Overview/1_Scoping_A02_t06: CompileTimeError # Issue 21072
+Language/07_Classes/1_Instance_Methods_A07_t01: fail # Issue 21201
+Language/07_Classes/3_Setters_A04_t01: CompileTimeError # Issue 5023
+Language/07_Classes/3_Setters_A04_t02: CompileTimeError # Issue 5023
+Language/07_Classes/3_Setters_A04_t03: RuntimeError # Issue 5023
+Language/07_Classes/3_Setters_A04_t07: CompileTimeError # Issue 5023
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A12_t02: fail # Issue 13363
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A13_t01: RuntimeError # compiler cancelled: cannot resolve type T
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A13_t01: RuntimeError, OK # co19 issue 258
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A20_t02: fail # Issue 13363
+Language/07_Classes/6_Constructors/2_Factories_A08_t02: fail # Issue 21202
+Language/07_Classes/6_Constructors/2_Factories_A10_t02: fail # Issue 21202
+Language/07_Classes/6_Constructors/2_Factories_A10_t03: fail # Issue 21202
+Language/10_Generics/09_Generics_A01_t17: fail # Issue 21203
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A02_t02: fail # Issue 11551, also related to issue 563, 18738
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A06_t01: fail # Issue 11551, also related to issue 563, 18738
+Language/12_Expressions/01_Constants_A03_t01: CompileTimeError # Issue 13652
+Language/12_Expressions/03_Numbers_A01_t06: fail # Issue 21098
+Language/12_Expressions/03_Numbers_A01_t09: fail # Issue 21098
+Language/12_Expressions/07_Maps_A11_t01: CompileTimeError # Maybe ok. Issue 17207
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t03: fail # Issue 21092 and co19 issue 713
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t05: fail # Issue 21092 and co19 issue 713
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t06: fail # Issue 21092 and co19 issue 713
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t07: fail # Issue 21092 and co19 issue 713
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t15: CompileTimeError # Issue 21092
+Language/12_Expressions/12_Instance_Creation/2_Const_A11_t01: fail # Issue 21134 and co19 issue 714
+Language/12_Expressions/12_Instance_Creation/2_Const_A11_t03: fail # Issue 21134 and co19 issue 714
+Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t17: MissingCompileTimeError # Issue 21210
+Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t18: MissingCompileTimeError # Issue 21210
+Language/12_Expressions/22_Equality_A01_t01: fail # Issue 21137
+Language/12_Expressions/22_Equality_A05_t01: fail # Issue 21137
+Language/12_Expressions/30_Identifier_Reference_A02_t01: fail # Issue 21154
+Language/13_Statements/04_Local_Function_Declaration_A04_t01: MissingCompileTimeError # Issue 21050
+Language/13_Statements/04_Local_Function_Declaration_A04_t03: MissingCompileTimeError # Issue 21050
+Language/14_Libraries_and_Scripts/1_Imports_A03_t08: fail # Issue 21171
+Language/14_Libraries_and_Scripts/1_Imports_A03_t09: fail # Issue 21171
+Language/14_Libraries_and_Scripts/1_Imports_A03_t10: fail # Issue 21171
+Language/14_Libraries_and_Scripts/1_Imports_A03_t28: fail # Issue 21171
+Language/14_Libraries_and_Scripts/1_Imports_A03_t29: fail # co19 issue 723
+Language/14_Libraries_and_Scripts/1_Imports_A03_t30: fail # co19 issue 723
+Language/15_Types/4_Interface_Types_A11_t01: crash # Issue 21174
+Language/15_Types/4_Interface_Types_A11_t02: crash # Issue 21174
+Language/15_Types/4_Interface_Types_A11_t04: fail # Issue 14654
+Language/16_Reference/1_Lexical_Rules/1_Reserved_Words_A40_t04: MissingCompileTimeError # Checks that other Unicode whitespaces are not allowed:  check NO-BREAK SPACE (U+00A0)
+Language/16_Reference/1_Lexical_Rules_A02_t06: MissingCompileTimeError # Checks that Unicode whitespaces other than WHITESPACE are not permitted in the source code. Checks symbol U+00a0.
+LibTest/async/Stream/handleError_A04_t01: RuntimeError # co19-roll r641: Please triage this failure
 LibTest/async/Stream/listen_A05_t01: RuntimeError # co19 issue 736. Issue 15171
+LibTest/collection/LinkedList/add_A01_t01: Pass, Slow # Slow tests that needs extra time to finish.
+LibTest/collection/ListBase/ListBase_class_A01_t01: RuntimeError # Please triage this failure
+LibTest/collection/ListMixin/ListMixin_class_A01_t01: RuntimeError # Please triage this failure
+LibTest/convert/JsonCodec/encode_A01_t01: RuntimeError # code.google.com/p/co19/issues/detail?id=735
+LibTest/convert/JsonCodec/encode_A01_t02: RuntimeError # code.google.com/p/co19/issues/detail?id=735
+LibTest/convert/JsonDecoder/fuse_A01_t01: RuntimeError # co19-roll r667: Please triage this failure
+LibTest/convert/JsonEncoder/convert_A01_t01: RuntimeError # co19-roll r667: Please triage this failure
+LibTest/core/DateTime/DateTime_A01_t03: fail # co19-roll r546: Please triage this failure
+LibTest/core/DateTime/parse_A03_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_class_A01_t01: RuntimeError # co19-roll r623: Please triage this failure
+LibTest/core/List/getRange_A03_t01: RuntimeError, OK # Tests that fail because they use the legacy try-catch syntax. co19 issue 184.
+LibTest/core/List/removeAt_A02_t01: RuntimeError # Issue 1533
+LibTest/core/List/sort_A01_t06: Slow, Pass # Slow tests that needs extra time to finish.
+LibTest/core/RegExp/firstMatch_A01_t01: RuntimeError, OK # co19 issue 294
 LibTest/core/double/INFINITY_A01_t04: RuntimeError # Please triage this failure.
 LibTest/core/double/NEGATIVE_INFINITY_A01_t04: RuntimeError # Please triage this failure.
-LibTest/typed_data/ByteData/getFloat32_A02_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/getFloat64_A02_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/getInt16_A02_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/getInt32_A02_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/getInt64_A02_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/getUint16_A02_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/getUint32_A02_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/getUint64_A02_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/setFloat32_A02_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/setFloat64_A02_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/setInt16_A02_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/setInt32_A02_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/setInt64_A02_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/setUint16_A02_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/setUint32_A02_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/setUint64_A02_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/Float32List/Float32List_A02_t01: fail # co19-roll r576: Please triage this failure
-LibTest/typed_data/Float32x4List/Float32x4List_A02_t01: fail # co19-roll r576: Please triage this failure
-LibTest/typed_data/Float64List/Float64List_A02_t01: fail # co19-roll r576: Please triage this failure
-LibTest/typed_data/Int16List/Int16List_A02_t01: fail # co19-roll r576: Please triage this failure
-LibTest/typed_data/Int32List/Int32List_A02_t01: fail # co19-roll r576: Please triage this failure
-LibTest/typed_data/Int8List/Int8List_A02_t01: fail # co19-roll r576: Please triage this failure
-LibTest/typed_data/Uint16List/Uint16List_A02_t01: fail # co19-roll r576: Please triage this failure
-LibTest/typed_data/Uint32List/Uint32List_A02_t01: fail # co19-roll r576: Please triage this failure
-LibTest/typed_data/Uint8ClampedList/Uint8ClampedList_A02_t01: fail # co19-roll r576: Please triage this failure
-LibTest/typed_data/Uint8List/Uint8List_A02_t01: fail # co19-roll r576: Please triage this failure
-LibTest/typed_data/Float32x4/equal_A01_t01: Skip # co19 issue 656
-LibTest/typed_data/Float32x4/notEqual_A01_t01: Skip # co19 issue 656
-LibTest/typed_data/Float32x4/greaterThan_A01_t01: Skip # co19 issue 656
-LibTest/typed_data/Float32x4/greaterThanOrEqual_A01_t01: Skip # co19 issue 656
-LibTest/typed_data/Float32x4/lessThan_A01_t01: Skip # co19 issue 656
-LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
-
+LibTest/core/int/hashCode_A01_t01: RuntimeError, OK # co19 issue 308
+LibTest/core/int/isEven_A01_t01: RuntimeError, OK # co19 issue 277
+LibTest/core/int/isOdd_A01_t01: RuntimeError, OK # co19 issue 277
+LibTest/core/int/operator_AND_A01_t01: RuntimeError, OK # Requires bigints.
+LibTest/core/int/operator_GT_A01_t01: RuntimeError, OK # co19 issue 200
+LibTest/core/int/operator_LT_A01_t01: RuntimeError, OK # co19 issue 200
+LibTest/core/int/operator_NOT_A01_t01: RuntimeError, OK # Expects negative result from bit-operation.
+LibTest/core/int/operator_OR_A01_t01: RuntimeError, OK # Requires bigints.
+LibTest/core/int/operator_XOR_A01_t01: RuntimeError, OK # Requires bigints.
+LibTest/core/int/operator_addition_A01_t01: RuntimeError, OK # co19 issue 200
+LibTest/core/int/operator_remainder_A01_t01: RuntimeError, OK # Requires bigints.
+LibTest/core/int/operator_right_shift_A01_t01: RuntimeError, OK # Expects negative result from bit-operation.
+LibTest/core/int/toDouble_A01_t01: RuntimeError, OK # co19 issue 200
 LibTest/html/HttpRequest/responseType_A01_t03: CompileTimeError # co19-roll r706: Please triage this failure
 LibTest/html/IFrameElement/enteredView_A01_t01: CompileTimeError # co19-roll r706: Please triage this failure
-Language/12_Expressions/07_Maps_A11_t01: CompileTimeError # Maybe ok. Issue 17207
+LibTest/isolate/Isolate/spawnUri_A01_t01: Fail # co19-roll r672: Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A01_t02: Fail # co19-roll r672: Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A01_t03: Fail # co19-roll r672: Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A01_t04: Fail # co19-roll r672: Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A01_t05: Fail # co19-roll r672: Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A02_t01: RuntimeError, Pass # Dart issue 15617
+LibTest/isolate/Isolate/spawn_A02_t02: RuntimeError, Pass # Dart issue 15617
+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/ReceivePort/receive_A01_t02: RuntimeError # Issue 6750
 LibTest/isolate/SendPort/send_A01_t01: CompileTimeError # co19-roll r706: Please triage this failure
 LibTest/isolate/SendPort/send_A01_t02: CompileTimeError # co19-roll r706: Please triage this failure
 LibTest/isolate/SendPort/send_A01_t03: CompileTimeError # co19-roll r706: Please triage this failure
-LibTest/isolate/Isolate/spawnUri_A02_t01: RuntimeError, Pass # Dart issue 15617
-LibTest/math/Rectangle/boundingBox_A01_t01: RuntimeError, Pass # co19-roll r706: Please triage this failure.
+LibTest/isolate/SendPort/send_A02_t04: RuntimeError # Runtime error: TypeError: Cannot call method 'toSendPort$0' of undefined.
+LibTest/isolate/SendPort/send_A02_t04: RuntimeError, OK # co19 issue 293 Passes on IE
 LibTest/math/MutableRectangle/boundingBox_A01_t01: RuntimeError, Pass # co19-roll r706: Please triage this failure.
-
-WebPlatformTest/dom/nodes/Document-createElement_t01: CompileTimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/DOMImplementation-createHTMLDocument_t01: CompileTimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/Element-childElementCount-nochild_t01: CompileTimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/Utils/test/testFail_t01: RuntimeError # co19-roll r722: Please triage this failure.
-
-[ $compiler == dart2js ]
+LibTest/math/Rectangle/boundingBox_A01_t01: RuntimeError, Pass # co19-roll r706: Please triage this failure.
+LibTest/math/pow_A04_t01: fail # co19-roll r587: Please triage this failure
+LibTest/math/pow_A14_t01: fail # co19-roll r587: Please triage this failure
+LibTest/math/pow_A16_t01: fail # co19-roll r587: Please triage this failure
+LibTest/typed_data/ByteData/*Int64*: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/*Uint64*: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/ByteData.view_A01_t02: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/ByteData.view_A01_t02: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/ByteData.view_A03_t01: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/ByteData.view_A03_t01: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/ByteData.view_A04_t01: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/ByteData.view_A04_t01: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/ByteData.view_A05_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/ByteData.view_A05_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/ByteData.view_A05_t02: fail # Issue 12989
+LibTest/typed_data/ByteData/ByteData.view_A05_t02: fail # Issue 12989
+LibTest/typed_data/ByteData/ByteData.view_A05_t03: fail # Issue 12989
+LibTest/typed_data/ByteData/ByteData.view_A05_t03: fail # Issue 12989
+LibTest/typed_data/ByteData/ByteData_A01_t01: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/ByteData_A01_t01: fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/ByteData_A02_t01: fail # co19-roll r576: Please triage this failure
-LibTest/isolate/Isolate/spawn_A02_t02: RuntimeError, Pass # Dart issue 15617
-
-[ $compiler == dart2js && $runtime == jsshell ]
-LibTest/isolate/SendPort/send_A02_t05: RuntimeError # TODO(ahe): Please triage this failure.
-LibTest/isolate/SendPort/send_A02_t06: RuntimeError # TODO(ahe): Please triage this failure.
-LibTest/core/Uri/Uri_A06_t03: Pass, Slow
-
-[ $compiler == dart2js && $runtime == jsshell ]
-LibTest/core/Map/Map_class_A01_t04: Pass, Slow # Issue 8096
-LibTest/core/double/round_A01_t01: RuntimeError # co19-roll r706: Please triage this failure
-LibTest/core/double/roundToDouble_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/typed_data/ByteData/getFloat32_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/getFloat32_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/getFloat32_A02_t02: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/getFloat64_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/getFloat64_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/getFloat64_A02_t02: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/getInt16_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/getInt16_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/getInt16_A02_t02: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/getInt32_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/getInt32_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/getInt32_A02_t02: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/getInt64_A02_t02: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/getInt8_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/getInt8_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/getInt8_A02_t02: fail # Issue 12989
+LibTest/typed_data/ByteData/getInt8_A02_t02: fail # Issue 12989
+LibTest/typed_data/ByteData/getUint16_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/getUint16_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/getUint16_A02_t02: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/getUint32_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/getUint32_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/getUint32_A02_t02: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/getUint64_A02_t02: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/getUint8_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/getUint8_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/getUint8_A02_t02: fail # Issue 12989
+LibTest/typed_data/ByteData/getUint8_A02_t02: fail # Issue 12989
+LibTest/typed_data/ByteData/setFloat32_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/setFloat32_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/setFloat32_A02_t02: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/setFloat64_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/setFloat64_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/setFloat64_A02_t02: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/setInt16_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/setInt16_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/setInt16_A02_t02: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/setInt32_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/setInt32_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/setInt32_A02_t02: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/setInt64_A02_t02: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/setInt8_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/setInt8_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/setInt8_A02_t02: fail # Issue 12989
+LibTest/typed_data/ByteData/setInt8_A02_t02: fail # Issue 12989
+LibTest/typed_data/ByteData/setUint16_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/setUint16_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/setUint16_A02_t02: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/setUint32_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/setUint32_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/setUint32_A02_t02: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/setUint64_A02_t02: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/setUint8_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/setUint8_A02_t01: fail # Issue 12989
+LibTest/typed_data/ByteData/setUint8_A02_t02: fail # Issue 12989
+LibTest/typed_data/ByteData/setUint8_A02_t02: fail # Issue 12989
+LibTest/typed_data/Float32List/Float32List.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32List/Float32List.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32List/Float32List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32List/Float32List_A02_t01: fail # co19-roll r576: Please triage this failure
+LibTest/typed_data/Float32List/fold_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32List/join_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32List/join_A01_t02: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32x4/equal_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/greaterThanOrEqual_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/greaterThan_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/lessThan_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/notEqual_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4List/Float32x4List.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32x4List/Float32x4List.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32x4List/Float32x4List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32x4List/Float32x4List_A02_t01: fail # co19-roll r576: Please triage this failure
+LibTest/typed_data/Float32x4List/fold_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32x4List/join_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32x4List/join_A01_t02: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float64List/Float64List.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float64List/Float64List.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float64List/Float64List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float64List/Float64List_A02_t01: fail # co19-roll r576: Please triage this failure
+LibTest/typed_data/Float64List/fold_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float64List/join_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float64List/join_A01_t02: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int16List/Int16List.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int16List/Int16List.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int16List/Int16List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int16List/Int16List_A02_t01: fail # co19-roll r576: Please triage this failure
+LibTest/typed_data/Int32List/Int32List.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int32List/Int32List.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int32List/Int32List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int32List/Int32List_A02_t01: fail # co19-roll r576: Please triage this failure
+LibTest/typed_data/Int64List/*: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int64List/Int64List_A02_t01: pass # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int8List/Int8List.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int8List/Int8List.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int8List/Int8List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int8List/Int8List_A02_t01: fail # co19-roll r576: Please triage this failure
+LibTest/typed_data/Uint16List/Uint16List.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint16List/Uint16List.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint16List/Uint16List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint16List/Uint16List_A02_t01: fail # co19-roll r576: Please triage this failure
+LibTest/typed_data/Uint32List/Uint32List.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint32List/Uint32List.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint32List/Uint32List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint32List/Uint32List_A02_t01: fail # co19-roll r576: Please triage this failure
+LibTest/typed_data/Uint64List/*: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint64List/Uint64List_A02_t01: pass # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8ClampedList/Uint8ClampedList_A02_t01: Pass, fail # co19-roll r576: Passes on ie10. Please triage this failure
+LibTest/typed_data/Uint8List/Uint8List.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8List/Uint8List.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8List/Uint8List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8List/Uint8List_A02_t01: fail # co19-roll r576: Please triage this failure
+Utils/tests/Expect/identical_A01_t01: fail # co19-roll r546: Please triage this failure
+WebPlatformTest/Utils/test/testFail_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/DOMImplementation-createHTMLDocument_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Document-createElement_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Element-childElementCount-nochild_t01: CompileTimeError # co19-roll r722: Please triage this failure.
 
 [ $compiler == dart2js && $checked ]
 Language/13_Statements/09_Switch_A05_t01: Fail # Missing type check in switch expression
+Language/13_Statements/09_Switch_A09_t01: RuntimeError # Issue 16089
+Language/15_Types/1_Static_Types_A03_t01: RuntimeError # Issue 21089
 Language/15_Types/2_Dynamic_Type_System_A01_t02: RuntimeError # Issue 21088
 Language/15_Types/8_Parameterized_Types_A03_t07: RuntimeError # Issue 21088
-Language/15_Types/1_Static_Types_A03_t01: RuntimeError # Issue 21089
-LibTest/core/Map/Map_class_A01_t04: Slow, Pass
-LibTest/core/Uri/Uri_A06_t03: Slow, Pass
-Language/13_Statements/09_Switch_A09_t01: RuntimeError # Issue 16089
-LibTest/math/Point/operator_mult_A02_t01: RuntimeError # Issue 1533
-
 LayoutTests/fast/url/file-http-base_t01: Crash # Issue 21166
 LayoutTests/fast/url/file_t01: Crash # Issue 21166
 LayoutTests/fast/url/relative-unix_t01: Crash # Issue 21166
@@ -110,462 +267,9 @@
 LayoutTests/fast/url/segments_t01: Crash # Issue 21166
 LayoutTests/fast/url/trivial-segments_t01: Crash # Issue 21166
 LayoutTests/fast/url/trivial_t01: Crash # Issue 21166
-
-[ $compiler == dart2js && $checked && $runtime == jsshell]
-LibTest/core/Map/Map_class_A01_t04: Skip # Issue 18093, timeout.
-LibTest/core/Uri/Uri_A06_t03: Skip # Issue 18093, timeout.
-LibTest/core/Uri/encodeQueryComponent_A01_t02: Skip # Issue 18093, timeout.
-
-[ $compiler == dart2js ]
-LibTest/core/int/operator_GT_A01_t01: RuntimeError, OK # co19 issue 200
-LibTest/core/int/operator_LT_A01_t01: RuntimeError, OK # co19 issue 200
-LibTest/core/int/operator_addition_A01_t01: RuntimeError, OK # co19 issue 200
-LibTest/core/int/toDouble_A01_t01: RuntimeError, OK # co19 issue 200
-
-LibTest/core/List/sort_A01_t06: Slow, Pass # Slow tests that needs extra time to finish.
-LibTest/collection/LinkedList/add_A01_t01: Pass, Slow # Slow tests that needs extra time to finish.
-
-LibTest/core/List/getRange_A03_t01: RuntimeError, OK # Tests that fail because they use the legacy try-catch syntax. co19 issue 184.
-
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A13_t01: RuntimeError, OK # These tests need to be updated for new optional parameter syntax and semantics, co19 issue 258:
-
-LibTest/isolate/SendPort/send_A02_t04: RuntimeError, OK # co19 issue 293 Passes on IE
-
-LibTest/core/RegExp/firstMatch_A01_t01: RuntimeError, OK # co19 issue 294
-
-LibTest/core/int/isOdd_A01_t01: RuntimeError, OK # co19 issue 277
-LibTest/core/int/isEven_A01_t01: RuntimeError, OK # co19 issue 277
-
-[ $compiler == dart2js ]
-LibTest/isolate/SendPort/send_A02_t04: RuntimeError # Runtime error: TypeError: Cannot call method 'toSendPort$0' of undefined.
-
-LibTest/core/int/operator_NOT_A01_t01: RuntimeError, OK # Expects negative result from bit-operation.
-LibTest/core/int/operator_XOR_A01_t01: RuntimeError, OK # Requires bigints.
-LibTest/core/int/operator_AND_A01_t01: RuntimeError, OK # Requires bigints.
-LibTest/core/int/operator_right_shift_A01_t01: RuntimeError, OK # Expects negative result from bit-operation.
-LibTest/core/int/operator_OR_A01_t01: RuntimeError, OK # Requires bigints.
-LibTest/core/int/operator_remainder_A01_t01: RuntimeError, OK # Requires bigints.
-
-#
-# Issues with co19 test suite.
-#
-# If you add anything here, either file a bug against the Dart
-# language specification, co19 test suite, or add a comment that ahe@
-# can understand so he can file a bug later.
-#
-[ $compiler == dart2js ]
-Language/06_Functions/4_External_Functions_A01_t01: CompileTimeError, OK # http://dartbug.com/5021
-LibTest/core/int/hashCode_A01_t01: RuntimeError, OK # co19 issue 308
-LibTest/typed_data/Int64List/*: Fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int64List/Int64List_A02_t01: pass # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint64List/*: Fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint64List/Uint64List_A02_t01: pass # co19-roll r559: Please triage this failure
-LibTest/typed_data/ByteData/*Uint64*: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/*Int64*: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/ByteData.view_A03_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/ByteData.view_A01_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/ByteData.view_A01_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/ByteData_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/ByteData.view_A04_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/ByteData.view_A04_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/ByteData_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/ByteData.view_A03_t01: fail # co19-roll r569: Please triage this failure
-
-LibTest/typed_data/ByteData/ByteData.view_A05_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/ByteData.view_A05_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/ByteData.view_A05_t02: fail # Issue 12989
-LibTest/typed_data/ByteData/ByteData.view_A05_t02: fail # Issue 12989
-LibTest/typed_data/ByteData/ByteData.view_A05_t03: fail # Issue 12989
-LibTest/typed_data/ByteData/ByteData.view_A05_t03: fail # Issue 12989
-LibTest/typed_data/ByteData/getFloat32_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/getFloat32_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/getFloat64_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/getFloat64_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/getInt16_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/getInt16_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/getInt32_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/getInt32_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/getInt8_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/getInt8_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/getInt8_A02_t02: fail # Issue 12989
-LibTest/typed_data/ByteData/getInt8_A02_t02: fail # Issue 12989
-LibTest/typed_data/ByteData/getUint16_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/getUint16_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/getUint32_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/getUint32_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/getUint8_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/getUint8_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/getUint8_A02_t02: fail # Issue 12989
-LibTest/typed_data/ByteData/getUint8_A02_t02: fail # Issue 12989
-LibTest/typed_data/ByteData/setFloat32_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/setFloat32_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/setFloat64_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/setFloat64_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/setInt16_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/setInt16_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/setInt32_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/setInt32_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/setInt8_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/setInt8_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/setInt8_A02_t02: fail # Issue 12989
-LibTest/typed_data/ByteData/setInt8_A02_t02: fail # Issue 12989
-LibTest/typed_data/ByteData/setUint16_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/setUint16_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/setUint32_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/setUint32_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/setUint8_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/setUint8_A02_t01: fail # Issue 12989
-LibTest/typed_data/ByteData/setUint8_A02_t02: fail # Issue 12989
-LibTest/typed_data/ByteData/setUint8_A02_t02: fail # Issue 12989
-
-[ $compiler == dart2js && $jscl ]
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: Fail, Pass # issue 3333
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: RuntimeError, OK # This is not rejected by V8.
-LibTest/core/RegExp/firstMatch_A01_t01: RuntimeError, OK # Bad test, use Match.regexp, not Match.pattern.
-LibTest/core/int/compareTo_A01_t01: RuntimeError, OK # Requires big int.
-LibTest/core/int/hashCode_A01_t01: RuntimeError, OK # co19 testing missing assertion.
-LibTest/core/int/isEven_A01_t01: RuntimeError, OK # Not in API.
-LibTest/core/int/isOdd_A01_t01: RuntimeError, OK # Not in API.
-LibTest/core/int/operator_left_shift_A01_t01: RuntimeError, OK # Requires big int.
-LibTest/core/int/operator_remainder_A01_t03: RuntimeError, OK # Leg only has double.
-LibTest/core/int/operator_truncating_division_A01_t02: RuntimeError, OK # Leg only has double.
-LibTest/core/int/remainder_A01_t01: RuntimeError, OK # Requires big int.
-LibTest/core/int/remainder_A01_t03: RuntimeError, OK # Leg only has double.
-LibTest/core/int/toDouble_A01_t01: RuntimeError, OK # Requires big int.
-LibTest/core/int/toRadixString_A01_t01: RuntimeError, OK # Bad test: uses Expect.fail, Expect.throws, assumes case of result, and uses unsupported radixes.
-
-#
-# The following tests are failing. Please add the error message
-# (either a compiler error or exception message). The error messages
-# may sometime be out of date.
-#
-[ $compiler == dart2js ]
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A13_t01: RuntimeError # compiler cancelled: cannot resolve type T
-Language/07_Classes/3_Setters_A04_t03: RuntimeError # http://dartbug.com/5023
-
-[ $compiler == dart2js && $jscl ]
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: RuntimeError # IllegalJSRegExpException: '\c(' 'SyntaxError: Invalid regular expression: /\c(/: Unterminated group'
-LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: RuntimeError # Expect.fail('Some exception expected')
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: RuntimeError # Expect.fail('Some exception expected')
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: RuntimeError # Expect.fail('Some exception expected')
-
-
-[ $compiler == dart2js && $runtime == chromeOnAndroid ]
-Language/12_Expressions/00_Object_Identity/1_Object_Identity_A05_t02: RuntimeError # TODO(dart2js-team): Please triage this failure.
-Language/12_Expressions/05_Strings_A06_t01: Pass, Slow # TODO(dart2js-team): Please triage this failure.
-Language/12_Expressions/05_Strings_A06_t01: Pass, Slow # TODO(dart2js-team): Please triage this failure.
-Language/12_Expressions/17_Getter_Invocation_A07_t02: RuntimeError # TODO(dart2js-team): Please triage this failure.
-
-LibTest/typed_data/Float64List/join_A01_t01: Pass, Slow # TODO(dart2js-team): Please triage this failure.
-LibTest/typed_data/Int8List/sublist_A02_t01: Pass, Slow # TODO(dart2js-team): Please triage this failure.
-LibTest/typed_data/Int16List/single_A01_t02: Pass, Slow # TODO(dart2js-team): Please triage this failure.
-LibTest/typed_data/Uint8ClampedList/map_A02_t01: Pass, Slow # TODO(dart2js-team): Please triage this failure.
-LibTest/typed_data/Int32x4/operator_OR_A01_t01: RuntimeError # TODO(dart2js-team): Please triage this failure.
-LibTest/typed_data/Float32x4List/Float32x4List.view_A01_t02: RuntimeError # TODO(dart2js-team): Please triage this failure.
-LibTest/typed_data/Float32x4List/Float32x4List.view_A06_t01: RuntimeError # TODO(dart2js-team): Please triage this failure.
-
-LibTest/isolate/Isolate/spawnUri_A02_t01: RuntimeError # TODO(dart2js-team): Please triage this failure.
-
-# These tests are marked failing on all platforms, but they timeout here instead
-LibTest/isolate/Isolate/spawnUri_A01_t01: Skip # TODO(dart2js-team): Please triage this failure.
-LibTest/isolate/Isolate/spawnUri_A01_t02: Skip # TODO(dart2js-team): Please triage this failure.
-LibTest/isolate/Isolate/spawnUri_A01_t03: Skip # TODO(dart2js-team): Please triage this failure.
-LibTest/isolate/Isolate/spawnUri_A02_t02: Skip # TODO(dart2js-team): Please triage this failure.
-LibTest/isolate/Isolate/spawnUri_A02_t03: Skip # TODO(dart2js-team): Please triage this failure.
-LibTest/isolate/Isolate/spawnUri_A02_t04: Skip # TODO(dart2js-team): Please triage this failure.
-
-LibTest/core/Set/removeAll_A01_t02: Pass, Slow # TODO(dart2js-team): Please triage this failure.
-LibTest/core/int/compareTo_A01_t01: Fail # TODO(dart2js-team): Please triage this failure.
-LibTest/core/int/operator_left_shift_A01_t01: Fail # TODO(dart2js-team): Please triage this failure.
-LibTest/core/int/operator_remainder_A01_t03: Fail # TODO(dart2js-team): Please triage this failure.
-LibTest/core/int/operator_truncating_division_A01_t02: Fail # TODO(dart2js-team): Please triage this failure.
-LibTest/core/int/remainder_A01_t01: Fail # TODO(dart2js-team): Please triage this failure.
-LibTest/core/int/remainder_A01_t03: Fail # TODO(dart2js-team): Please triage this failure.
-LibTest/core/int/toRadixString_A01_t01: Fail # TODO(dart2js-team): Please triage this failure.
-
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: Fail # TODO(dart2js-team): Please triage this failure.
-LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: Fail # TODO(dart2js-team): Please triage this failure.
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: Fail # TODO(dart2js-team): Please triage this failure.
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: Fail # TODO(dart2js-team): Please triage this failure.
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: Fail # TODO(dart2js-team): Please triage this failure.
-LibTest/math/log_A01_t01: Fail # TODO(dart2js-team): Please triage this failure.
-
-
-[ $compiler == dart2js && ( $runtime == ie10 || $runtime == drt || $runtime == safari || $runtime == safarimobilesim || $runtime == opera ) ]
-*: Skip
-
-#
-# Missing compile-time errors.
-#
-[ $compiler == dart2js ]
-Language/16_Reference/1_Lexical_Rules/1_Reserved_Words_A40_t04: MissingCompileTimeError # Checks that other Unicode whitespaces are not allowed:  check NO-BREAK SPACE (U+00A0)
-Language/16_Reference/1_Lexical_Rules_A02_t06: MissingCompileTimeError # Checks that Unicode whitespaces other than WHITESPACE are not permitted in the source code. Checks symbol U+00a0.
-
-
-#
-# Unexpected compile-time errors.
-#
-[ $compiler == dart2js ]
-Language/07_Classes/3_Setters_A04_t01: CompileTimeError # http://dartbug.com/5023
-Language/07_Classes/3_Setters_A04_t02: CompileTimeError # http://dartbug.com/5023
-Language/07_Classes/3_Setters_A04_t07: CompileTimeError # http://dartbug.com/5023
-
-Language/12_Expressions/01_Constants_A03_t01: CompileTimeError # Issue 13652
-
-
-[ $compiler == dart2js && $runtime == ie9 ]
-# These are most likey due to the fact that IE9 doesn't support typed data
-LibTest/typed_data/Float32List/*: fail, crash # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float32x4/*: fail, crash # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float32x4List/*: fail, crash # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float64List/*: fail, crash # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int8List/*: fail, crash # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int16List/*: fail, crash # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int32List/*: fail, crash # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int64List/*: fail, crash # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint8ClampedList/*: fail, crash # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint8List/*: fail, crash # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint16List/*: fail, crash # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint32List/*: fail, crash # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint64List/*: fail, crash # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float32List/Float32List_A02_t01: pass # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float32x4List/Float32x4List_A02_t01: pass # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float64List/Float64List_A02_t01: pass # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int16List/Int16List_A02_t01: pass # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int32List/Int32List_A02_t01: pass # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int8List/Int8List_A02_t01: pass # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint16List/Uint16List_A02_t01: pass # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint32List/Uint32List_A02_t01: pass # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint8ClampedList/Uint8ClampedList_A02_t01: pass # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint8List/Uint8List_A02_t01: pass # co19-roll r559: Please triage this failure
-
-LibTest/typed_data/ByteBuffer/hashCode_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteBuffer/hashCode_A01_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteBuffer/lengthInBytes_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteBuffer/lengthInBytes_A01_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteBuffer/operator_equality_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteBuffer/runtimeType_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteBuffer/runtimeType_A01_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteBuffer/toString_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/buffer_A01_t01: fail # co19 issue 694
-LibTest/typed_data/ByteData/buffer_A01_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/ByteData_A01_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/ByteData.view_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/ByteData.view_A02_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/elementSizeInBytes_A01_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/getFloat32_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/getFloat64_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/getInt16_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/getInt32_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/getInt8_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/getUint16_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/getUint32_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/getUint8_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/hashCode_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/hashCode_A01_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/lengthInBytes_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/lengthInBytes_A01_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/offsetInBytes_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/offsetInBytes_A01_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/operator_equality_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/runtimeType_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/runtimeType_A01_t02: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/setFloat32_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/setFloat64_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/setInt16_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/setInt32_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/setInt8_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/setUint16_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/setUint32_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/setUint8_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/toString_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/elementSizeInBytes_A01_t01: fail # co19-roll r569: Please triage this failure
-
-LibTest/typed_data/Int32x4/flagW_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/flagW_A01_t02: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/flagW_A01_t03: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/flagX_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/flagX_A01_t02: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/flagX_A01_t03: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/flagY_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/flagY_A01_t02: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/flagY_A01_t03: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/flagZ_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/flagZ_A01_t02: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/flagZ_A01_t03: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/Int32x4_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/Int32x4.bool_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/Int32x4.fromFloat32x4Bits_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/Int32x4.fromFloat32x4Bits_A01_t02: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/operator_AND_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/operator_OR_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/operator_XOR_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/select_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/w_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/w_A01_t02: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/withFlagW_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/withFlagX_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/withFlagY_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/withFlagZ_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/withW_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/withX_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/withY_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/withZ_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/x_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/x_A01_t02: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/y_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/y_A01_t02: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/z_A01_t01: fail # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/z_A01_t02: fail # co19-roll r672: Please triage this failure
-
-[ $compiler == dart2js ]
-Language/03_Overview/1_Scoping_A02_t28: fail # Issue 21092 and co19 issue 713
-Language/05_Variables/05_Variables_A05_t01: fail # Issue 21093
-Language/05_Variables/05_Variables_A05_t02: fail # Issue 21093
-Language/12_Expressions/00_Object_Identity/1_Object_Identity_A02_t02: fail # Issue 11551, also related to issue 563, 18738
-Language/12_Expressions/00_Object_Identity/1_Object_Identity_A06_t01: fail # Issue 11551, also related to issue 563, 18738
-Language/12_Expressions/03_Numbers_A01_t06: fail # Issue 21098
-Language/12_Expressions/03_Numbers_A01_t09: fail # Issue 21098
-Language/12_Expressions/12_Instance_Creation/1_New_A02_t03: fail # Issue 21092 and co19 issue 713
-Language/12_Expressions/12_Instance_Creation/1_New_A02_t05: fail # Issue 21092 and co19 issue 713
-Language/12_Expressions/12_Instance_Creation/1_New_A02_t06: fail # Issue 21092 and co19 issue 713
-Language/12_Expressions/12_Instance_Creation/1_New_A02_t07: fail # Issue 21092 and co19 issue 713
-Language/12_Expressions/12_Instance_Creation/2_Const_A11_t01: fail # Issue 21134 and co19 issue 714
-Language/12_Expressions/12_Instance_Creation/2_Const_A11_t03: fail # Issue 21134 and co19 issue 714
-Language/12_Expressions/22_Equality_A01_t01: fail # Issue 21137
-Language/12_Expressions/22_Equality_A05_t01: fail # Issue 21137
-Language/12_Expressions/30_Identifier_Reference_A02_t01: fail # Issue 21154
-Language/14_Libraries_and_Scripts/1_Imports_A03_t08: fail # Issue 21171
-Language/14_Libraries_and_Scripts/1_Imports_A03_t09: fail # Issue 21171
-Language/14_Libraries_and_Scripts/1_Imports_A03_t10: fail # Issue 21171
-Language/14_Libraries_and_Scripts/1_Imports_A03_t28: fail # Issue 21171
-Language/14_Libraries_and_Scripts/1_Imports_A03_t29: fail # co19 issue 723
-Language/14_Libraries_and_Scripts/1_Imports_A03_t30: fail # co19 issue 723
-Language/15_Types/4_Interface_Types_A11_t01: crash # Issue 21174
-Language/15_Types/4_Interface_Types_A11_t02: crash # Issue 21174
-LibTest/convert/JsonCodec/encode_A01_t01: RuntimeError # code.google.com/p/co19/issues/detail?id=735
-LibTest/convert/JsonCodec/encode_A01_t02: RuntimeError # code.google.com/p/co19/issues/detail?id=735
-LibTest/core/DateTime/DateTime_A01_t03: fail # co19-roll r546: Please triage this failure
-LibTest/core/DateTime/parse_A03_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/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/typed_data/Float32List/Float32List.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float32List/Float32List.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float32List/Float32List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float32List/fold_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float32List/join_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float32List/join_A01_t02: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float32x4List/Float32x4List.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float32x4List/Float32x4List.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float32x4List/Float32x4List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float32x4List/fold_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float32x4List/join_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float32x4List/join_A01_t02: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float64List/Float64List.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float64List/Float64List.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float64List/Float64List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float64List/fold_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float64List/join_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float64List/join_A01_t02: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int16List/Int16List.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int16List/Int16List.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int16List/Int16List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int32List/Int32List.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int32List/Int32List.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int32List/Int32List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int8List/Int8List.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int8List/Int8List.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int8List/Int8List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint16List/Uint16List.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint16List/Uint16List.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint16List/Uint16List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint32List/Uint32List.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint32List/Uint32List.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint32List/Uint32List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint8List/Uint8List.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint8List/Uint8List.view_A05_t02: RuntimeError # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint8List/Uint8List.view_A05_t03: RuntimeError # co19-roll r559: Please triage this failure
-Utils/tests/Expect/identical_A01_t01: fail # co19-roll r546: Please triage this failure
-
-LibTest/collection/ListBase/ListBase_class_A01_t01: RuntimeError # Please triage this failure
-LibTest/collection/ListMixin/ListMixin_class_A01_t01: RuntimeError # Please triage this failure
-
-[ $compiler == dart2js && $runtime == jsshell ]
-LibTest/typed_data/Float32List/Float32List.view_A06_t01: fail # co19-roll r587: Please triage this failure
-LibTest/typed_data/Float32List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float32List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float64List/Float64List.view_A06_t01: fail # co19-roll r587: Please triage this failure
-LibTest/typed_data/Float64List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float64List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int16List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int16List/Int16List.view_A06_t01: fail # co19-roll r587: Please triage this failure
-LibTest/typed_data/Int16List/toList_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int16List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int32List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int32List/Int32List.view_A06_t01: fail # co19-roll r587: Please triage this failure
-LibTest/typed_data/Int32List/toList_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int32List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int8List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int8List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint16List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint16List/toList_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint16List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint16List/Uint16List.view_A06_t01: fail # co19-roll r587: Please triage this failure
-LibTest/typed_data/Uint32List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint32List/toList_A01_t01: Skip # issue 16934, co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint32List/Uint32List.view_A06_t01: fail # co19-roll r587: Please triage this failure
-LibTest/typed_data/Uint8ClampedList/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint8ClampedList/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint8List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint8List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
-
-[ $compiler == dart2js && ($runtime == d8 || $runtime == jsshell) ]
-LibTest/typed_data/Float32x4List/Float32x4List.view_A06_t01: fail # co19-roll r587: Please triage this failure
-Language/12_Expressions/00_Object_Identity/1_Object_Identity_A05_t02: RuntimeError # Issue 21198 (int/double related)
-Language/12_Expressions/17_Getter_Invocation_A07_t02: RuntimeError # Issue 21199
-LibTest/typed_data/Int32x4/operator_OR_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
-
-[ $compiler == dart2js && $runtime == jsshell ]
-LibTest/async/Future/Future.delayed_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
-LibTest/async/Future/Future.delayed_A03_t01: fail # Issue 7728, timer not supported in jsshell
-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.periodic_A02_t01: fail # Issue 7728, timer not supported in jsshell
-LibTest/async/Timer/cancel_A01_t01: fail # Issue 7728, timer not supported in jsshell
-LibTest/async/Timer/Timer_A01_t01: fail # Issue 7728, timer not supported in jsshell
-
-LibTest/isolate/ReceivePort/asBroadcastStream_A04_t03: RuntimeError # Issue 7728, timer not supported in jsshell
-LibTest/async/Stream/asBroadcastStream_A04_t03: RuntimeError # Issue 7728, timer not supported in jsshell
-LibTest/async/Stream/asBroadcastStream_A03_t01: RuntimeError # Issue 7728, timer not supported in jsshell
-LibTest/async/Timer/isActive_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
-LibTest/async/Future/wait_A01_t07: RuntimeError # Issue 7728, timer not supported in jsshell
-LibTest/async/Timer/isActive_A01_t02: RuntimeError # Issue 7728, timer not supported in jsshell
-LibTest/async/Zone/createPeriodicTimer_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
-LibTest/async/Zone/createTimer_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
-LibTest/core/Stopwatch/elapsedInMs_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
-LibTest/core/Stopwatch/elapsedInUs_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
-LibTest/core/Stopwatch/elapsedTicks_A01_t02: RuntimeError # Issue 7728, timer not supported in jsshell
-LibTest/core/Stopwatch/elapsedTicks_A01_t03: RuntimeError # Issue 7728, timer not supported in jsshell
-LibTest/core/Stopwatch/elapsed_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
-LibTest/core/Stopwatch/elapsed_A01_t02: RuntimeError # Issue 7728, timer not supported in jsshell
-LibTest/core/Stopwatch/elapsed_A01_t03: RuntimeError # Issue 7728, timer not supported in jsshell
-LibTest/core/Stopwatch/start_A01_t03: RuntimeError # Issue 7728, timer not supported in jsshell
-LibTest/core/Stopwatch/stop_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
-LibTest/core/Stopwatch/start_A01_t01: RuntimeError # Please triage this failure
-LibTest/core/Stopwatch/start_A01_t02: RuntimeError # Please triage this failure
-LibTest/core/Stopwatch/elapsedTicks_A01_t01: RuntimeError # Please triage this failure
-
-LibTest/async/Stream/Stream.periodic_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
-LibTest/async/Stream/Stream.periodic_A03_t01: RuntimeError # Issue 7728, timer not supported in jsshell
-LibTest/async/Timer/Timer.periodic_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
-LibTest/async/Timer/Timer.periodic_A02_t01: RuntimeError # Issue 7728, timer not supported in jsshell
-
-[ $compiler == dart2js && $runtime == d8 ]
-LibTest/math/sin_A01_t02: RuntimeError # V8 issue 3006, https://code.google.com/p/v8/issues/detail?id=3006
+LibTest/core/Map/Map_class_A01_t04: Slow, Pass
+LibTest/core/Uri/Uri_A06_t03: Slow, Pass
+LibTest/math/Point/operator_mult_A02_t01: RuntimeError # Issue 1533
 
 [ $compiler == dart2js && $minified ]
 LibTest/typed_data/Float32List/runtimeType_A01_t01: fail # co19-roll r559: Please triage this failure
@@ -579,54 +283,184 @@
 LibTest/typed_data/Uint8ClampedList/runtimeType_A01_t01: fail # co19-roll r559: Please triage this failure
 LibTest/typed_data/Uint8List/runtimeType_A01_t01: fail # co19-roll r559: Please triage this failure
 
-[ $compiler == dart2js || $compiler == dart2dart ]
-Language/07_Classes/1_Instance_Methods_A07_t01: fail # Issue 21201
-Language/07_Classes/6_Constructors/2_Factories_A08_t02: fail # Issue 21202
-Language/07_Classes/6_Constructors/2_Factories_A10_t02: fail # Issue 21202
-Language/07_Classes/6_Constructors/2_Factories_A10_t03: fail # Issue 21202
-Language/10_Generics/09_Generics_A01_t17: fail # Issue 21203
-Language/12_Expressions/12_Instance_Creation/1_New_A06_t15: CompileTimeError # Issue 21092
-Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t17: MissingCompileTimeError # Issue 21210
-Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t18: MissingCompileTimeError # Issue 21210
-Language/15_Types/4_Interface_Types_A11_t04: fail # Issue 14654
-LibTest/isolate/Isolate/spawnUri_A01_t01: Fail # co19-roll r672: Please triage this failure
-LibTest/isolate/Isolate/spawnUri_A01_t02: Fail # co19-roll r672: Please triage this failure
-LibTest/isolate/Isolate/spawnUri_A01_t03: Fail # co19-roll r672: Please triage this failure
-LibTest/isolate/Isolate/spawnUri_A01_t04: Fail # co19-roll r672: Please triage this failure
-LibTest/isolate/Isolate/spawnUri_A01_t05: Fail # co19-roll r672: Please triage this failure
-
-[ $compiler == dart2js ]
-LibTest/core/List/List_class_A01_t01: RuntimeError # co19-roll r623: Please triage this failure
-Language/12_Expressions/20_Logical_Boolean_Expressions_A06_t16: RuntimeError # Issue 21271
-Language/12_Expressions/20_Logical_Boolean_Expressions_A06_t17: RuntimeError # Issue 21271
-LibTest/convert/JsonDecoder/fuse_A01_t01: RuntimeError # co19-roll r667: Please triage this failure
-LibTest/convert/JsonEncoder/convert_A01_t01: RuntimeError # co19-roll r667: Please triage this failure
-
-LibTest/math/pow_A04_t01: fail # co19-roll r587: Please triage this failure
-LibTest/math/pow_A14_t01: fail # co19-roll r587: Please triage this failure
-LibTest/math/pow_A16_t01: fail # co19-roll r587: Please triage this failure
-
-LibTest/async/Stream/handleError_A04_t01: RuntimeError # co19-roll r641: Please triage this failure
-
-[ $compiler == dart2js && $runtime == d8 && $system == windows ]
-LibTest/async/DeferredLibrary/*: Skip # Issue 17458
-
 [ $compiler == dart2js && $mode == debug ]
 LibTest/collection/ListBase/ListBase_class_A01_t01: Pass, Timeout
 LibTest/collection/ListMixin/ListMixin_class_A01_t01: Pass, Timeout
 LibTest/core/List/List_class_A01_t01: Pass, Timeout
 
-[ $compiler == dart2js && ($runtime == chrome || $runtime == drt) ]
+[ $compiler == dart2js && $runtime == jsshell ]
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A05_t02: RuntimeError # Issue 21198 (int/double related)
+Language/12_Expressions/17_Getter_Invocation_A07_t02: RuntimeError # Issue 21199
+LibTest/async/Future/Future.delayed_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/async/Future/Future.delayed_A03_t01: fail # Issue 7728, timer not supported in jsshell
+LibTest/async/Future/wait_A01_t07: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/async/Stream/Stream.periodic_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/async/Stream/Stream.periodic_A02_t01: fail # Issue 7728, timer not supported in jsshell
+LibTest/async/Stream/Stream.periodic_A03_t01: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/async/Stream/asBroadcastStream_A03_t01: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/async/Stream/asBroadcastStream_A04_t03: RuntimeError # Issue 7728, timer not supported in jsshell
+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/Timer/Timer.periodic_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/async/Timer/Timer.periodic_A02_t01: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/async/Timer/Timer_A01_t01: fail # Issue 7728, timer not supported in jsshell
+LibTest/async/Timer/cancel_A01_t01: fail # Issue 7728, timer not supported in jsshell
+LibTest/async/Timer/isActive_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/async/Timer/isActive_A01_t02: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/async/Zone/createPeriodicTimer_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/async/Zone/createTimer_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/core/List/sort_A01_t04: Fail, Pass, Timeout # Must be a bug in jsshell, test sometimes times out.
+LibTest/core/Map/Map_class_A01_t04: Pass, Slow # Issue 8096
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/core/Stopwatch/elapsedInMs_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/core/Stopwatch/elapsedInUs_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/core/Stopwatch/elapsedTicks_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/Stopwatch/elapsedTicks_A01_t02: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/core/Stopwatch/elapsedTicks_A01_t03: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/core/Stopwatch/elapsed_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/core/Stopwatch/elapsed_A01_t02: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/core/Stopwatch/elapsed_A01_t03: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/core/Stopwatch/start_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/Stopwatch/start_A01_t02: RuntimeError # Please triage this failure
+LibTest/core/Stopwatch/start_A01_t03: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/core/Stopwatch/stop_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/core/Uri/Uri_A06_t03: Pass, Slow
+LibTest/core/double/roundToDouble_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/core/double/round_A01_t01: RuntimeError # co19-roll r706: Please triage this failure
+LibTest/isolate/ReceivePort/asBroadcastStream_A04_t03: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/isolate/SendPort/send_A02_t05: RuntimeError # TODO(ahe): Please triage this failure.
+LibTest/isolate/SendPort/send_A02_t06: RuntimeError # TODO(ahe): Please triage this failure.
+LibTest/typed_data/Float32List/Float32List.view_A06_t01: fail # co19-roll r587: Please triage this failure
+LibTest/typed_data/Float32List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32x4List/Float32x4List.view_A06_t01: fail # co19-roll r587: Please triage this failure
+LibTest/typed_data/Float64List/Float64List.view_A06_t01: fail # co19-roll r587: Please triage this failure
+LibTest/typed_data/Float64List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float64List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int16List/Int16List.view_A06_t01: fail # co19-roll r587: Please triage this failure
+LibTest/typed_data/Int16List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int16List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int16List/toList_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int32List/Int32List.view_A06_t01: fail # co19-roll r587: Please triage this failure
+LibTest/typed_data/Int32List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int32List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int32List/toList_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int32x4/operator_OR_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
+LibTest/typed_data/Int8List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int8List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint16List/Uint16List.view_A06_t01: fail # co19-roll r587: Please triage this failure
+LibTest/typed_data/Uint16List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint16List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint16List/toList_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint32List/Uint32List.view_A06_t01: fail # co19-roll r587: Please triage this failure
+LibTest/typed_data/Uint32List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint32List/toList_A01_t01: Skip # issue 16934, co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8ClampedList/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8ClampedList/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
+
+[ $compiler == dart2js && $checked && $runtime == jsshell]
+LibTest/core/Map/Map_class_A01_t04: Skip # Issue 18093, timeout.
+LibTest/core/Uri/Uri_A06_t03: Skip # Issue 18093, timeout.
+LibTest/core/Uri/encodeQueryComponent_A01_t02: Skip # Issue 18093, timeout.
+
+[ $compiler == dart2js && $jscl ]
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: Fail, Pass # issue 3333
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: RuntimeError # Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: RuntimeError # Expect.fail('Some exception expected')
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: RuntimeError, OK # This is not rejected by V8.
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: RuntimeError # Expect.fail('Some exception expected')
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: RuntimeError # Expect.fail('Some exception expected')
+LibTest/core/RegExp/firstMatch_A01_t01: RuntimeError, OK # Bad test, use Match.regexp, not Match.pattern.
+LibTest/core/int/compareTo_A01_t01: RuntimeError, OK # Requires big int.
+LibTest/core/int/hashCode_A01_t01: RuntimeError, OK # co19 testing missing assertion.
+LibTest/core/int/isEven_A01_t01: RuntimeError, OK # Not in API.
+LibTest/core/int/isOdd_A01_t01: RuntimeError, OK # Not in API.
+LibTest/core/int/operator_left_shift_A01_t01: RuntimeError, OK # Requires big int.
+LibTest/core/int/operator_remainder_A01_t03: RuntimeError, OK # Leg only has double.
+LibTest/core/int/operator_truncating_division_A01_t02: RuntimeError, OK # Leg only has double.
+LibTest/core/int/remainder_A01_t01: RuntimeError, OK # Requires big int.
+LibTest/core/int/remainder_A01_t03: RuntimeError, OK # Leg only has double.
+LibTest/core/int/toDouble_A01_t01: RuntimeError, OK # Requires big int.
+LibTest/core/int/toRadixString_A01_t01: RuntimeError, OK # Bad test: uses Expect.fail, Expect.throws, assumes case of result, and uses unsupported radixes.
+
+[ $compiler == dart2js && $runtime == d8 ]
+LibTest/math/sin_A01_t02: RuntimeError # V8 issue 3006, https://code.google.com/p/v8/issues/detail?id=3006
+LibTest/typed_data/Float32x4List/Float32x4List.view_A06_t01: fail # co19-roll r587: Please triage this failure
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A05_t02: RuntimeError # Issue 21198 (int/double related)
+Language/12_Expressions/17_Getter_Invocation_A07_t02: RuntimeError # Issue 21199
+LibTest/typed_data/Int32x4/operator_OR_A01_t01: RuntimeError # Issue 7728, timer not supported in jsshell
+
+[ $compiler == dart2js && $runtime == d8 && $system == windows ]
+LibTest/async/DeferredLibrary/*: Skip # Issue 17458
+
+[ $compiler == dart2js && ($runtime == drt || $runtime == opera) ]
+*: Skip
+
+[ $compiler == dart2js && $browser ]
+LayoutTests/fast/css-generated-content/bug91547_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/filesystem/file-after-reload-crash_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/dom/HTMLButtonElement/change-type_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/dom/StyleSheet/discarded-sheet-owner-null_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/dom/css-cached-import-rule_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/dom/cssTarget-crash_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/dom/empty-hash-and-search_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/dom/shadow/form-in-shadow_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/forms/datetimelocal/datetimelocal-interactive-validation-required_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/forms/form-submission-create-crash_t01.dart: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/forms/formmethod-attribute-button-html_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/forms/formmethod-attribute-input-2_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/forms/submit-form-with-dirname-attribute-with-ancestor-dir-attribute_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/forms/submit-form-with-dirname-attribute-with-nonhtml-ancestor_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/forms/submit-nil-value-field-assert_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/forms/textarea-submit-crash_t01: Skip # Test reloads itself. Issue 18558.
+
+[ $compiler == dart2js && $runtime == chromeOnAndroid ]
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A05_t02: RuntimeError # Please triage this failure.
+Language/12_Expressions/05_Strings_A06_t01: Pass, Slow # Please triage this failure.
+Language/12_Expressions/05_Strings_A06_t01: Pass, Slow # Please triage this failure.
+Language/12_Expressions/17_Getter_Invocation_A07_t02: RuntimeError # Please triage this failure.
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: Fail # Please triage this failure.
+LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: Fail # Please triage this failure.
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: Fail # Please triage this failure.
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: Fail # Please triage this failure.
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: Fail # Please triage this failure.
+LibTest/core/Set/removeAll_A01_t02: Pass, Slow # Please triage this failure.
+LibTest/core/int/compareTo_A01_t01: Fail # Please triage this failure.
+LibTest/core/int/operator_left_shift_A01_t01: Fail # Please triage this failure.
+LibTest/core/int/operator_remainder_A01_t03: Fail # Please triage this failure.
+LibTest/core/int/operator_truncating_division_A01_t02: Fail # Please triage this failure.
+LibTest/core/int/remainder_A01_t01: Fail # Please triage this failure.
+LibTest/core/int/remainder_A01_t03: Fail # Please triage this failure.
+LibTest/core/int/toRadixString_A01_t01: Fail # Please triage this failure.
+LibTest/isolate/Isolate/spawnUri_A01_t01: Skip # Please triage this failure.
+LibTest/isolate/Isolate/spawnUri_A01_t02: Skip # Please triage this failure.
+LibTest/isolate/Isolate/spawnUri_A01_t03: Skip # Please triage this failure.
+LibTest/isolate/Isolate/spawnUri_A02_t01: RuntimeError # Please triage this failure.
+LibTest/isolate/Isolate/spawnUri_A02_t02: Skip # Please triage this failure.
+LibTest/isolate/Isolate/spawnUri_A02_t03: Skip # Please triage this failure.
+LibTest/isolate/Isolate/spawnUri_A02_t04: Skip # Please triage this failure.
+LibTest/math/log_A01_t01: Fail # Please triage this failure.
+LibTest/typed_data/Float32x4List/Float32x4List.view_A01_t02: RuntimeError # Please triage this failure.
+LibTest/typed_data/Float32x4List/Float32x4List.view_A06_t01: RuntimeError # Please triage this failure.
+LibTest/typed_data/Float64List/join_A01_t01: Pass, Slow # Please triage this failure.
+LibTest/typed_data/Int16List/single_A01_t02: Pass, Slow # Please triage this failure.
+LibTest/typed_data/Int32x4/operator_OR_A01_t01: RuntimeError # Please triage this failure.
+LibTest/typed_data/Int8List/sublist_A02_t01: Pass, Slow # Please triage this failure.
+LibTest/typed_data/Uint8ClampedList/map_A02_t01: Pass, Slow # Please triage this failure.
+
+[ $compiler == dart2js && $runtime == chrome ]
 Language/12_Expressions/00_Object_Identity/1_Object_Identity_A05_t02: RuntimeError # Please triage this failure
 Language/12_Expressions/17_Getter_Invocation_A07_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/alignment/parse-align-items_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/alignment/parse-align-self_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/alignment/parse-justify-self_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/animation/request-animation-frame-cancel_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/animation/request-animation-frame-cancel2_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/animation/request-animation-frame-cancel_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/animation/request-animation-frame-prefix_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/animation/request-animation-frame-timestamps_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/animation/request-animation-frame-timestamps-advance_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/animation/request-animation-frame-timestamps_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/animation/request-animation-frame-within-callback_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/backgrounds/repeat/parsing-background-repeat_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/borders/border-radius-child_t01: RuntimeError # Please triage this failure
@@ -651,12 +485,13 @@
 LayoutTests/fast/canvas/canvas-lose-restore-max-int-size_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-putImageData_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-resize-after-paint_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/canvas/canvas-scale-drawImage-shadow_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/draw-custom-focus-ring_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/getPutImageDataPairTest_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/setWidthResetAfterForcedRender_t01: Skip # Times out. Please triage this failure
-
 LayoutTests/fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias-t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/context-lost_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/context-lost-restored_t01: Pass, Timeout # Please triage this failure
 LayoutTests/fast/canvas/webgl/copy-tex-image-and-sub-image-2d_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/framebuffer-bindings-unaffected-on-resize_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/framebuffer-object-attachment_t01: RuntimeError # Please triage this failure
@@ -689,12 +524,11 @@
 LayoutTests/fast/canvas/webgl/uniform-location_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/uninitialized-test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-depth-texture_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-generated-content/bug91547_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-generated-content/hit-test-generated-content_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css-generated-content/malformed-url_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-generated-content/pseudo-animation_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css-generated-content/pseudo-animation-before-onload_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css-generated-content/pseudo-animation-display_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css-generated-content/pseudo-animation_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css-generated-content/pseudo-element-events_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/css-generated-content/pseudo-transition-event_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/css-generated-content/pseudo-transition_t01: RuntimeError # Please triage this failure
@@ -739,23 +573,29 @@
 LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-grid-layout/percent-resolution-grid-item_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-grid-layout/place-cell-by-index_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/MarqueeLayoutTest_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/add-remove-stylesheets-at-once-minimal-recalc-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/aspect-ratio-inheritance_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/css/aspect-ratio-parsing-tests_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/checked-pseudo-selector_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/collapsed-whitespace-reattach-in-style-recalc_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/content/content-none_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/content/content-normal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/css-properties-case-insensitive_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/csstext-of-content-string_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/css3-nth-tokens-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/cursor-parsing-quirks_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/deprecated-flexbox-auto-min-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/ex-unit-with-no-x-height_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/first-child-display-change-inverse_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/focus-display-block-inline_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/font-face-cache-bug_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/font-face-multiple-ranges-for-unicode-range_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/font-face-unicode-range-load_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/css/font-face-unicode-range-overlap-load_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/font-face-unicode-range-monospace_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-face-unicode-range-overlap-load_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/fontface-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/fontfaceset-events_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/fontfaceset-loadingdone_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/html-attr-case-sensitivity_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/id-or-class-before-stylesheet_t01: RuntimeError # Please triage this failure
@@ -775,6 +615,7 @@
 LayoutTests/fast/css/pseudo-any_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/pseudo-target-indirect-sibling-001_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/css/pseudo-target-indirect-sibling-002_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css/pseudo-valid-unapplied_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/readonly-pseudoclass-opera-001_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/readonly-pseudoclass-opera-002_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/readonly-pseudoclass-opera-003_t01: RuntimeError # Please triage this failure
@@ -788,6 +629,7 @@
 LayoutTests/fast/css/style-scoped/style-scoped-with-important-rule_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/stylesheet-enable-first-alternate-on-load-sheet_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/stylesheet-enable-second-alternate-link_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/transform-origin-parsing_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/webkit-keyframes-errors_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/word-break-user-modify-allowed-values_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last-inherited_t01: RuntimeError # Please triage this failure
@@ -836,7 +678,7 @@
 LayoutTests/fast/dom/HTMLImageElement/parse-src_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLInputElement/input-image-alt-text_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLLinkElement/link-beforeload-recursive_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLLinkElement/resolve-url-on-insertion_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/resolve-url-on-insertion_t01: RuntimeError # Issue 18010
 LayoutTests/fast/dom/HTMLObjectElement/beforeload-set-text-crash_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLOutputElement/dom-settable-token-list_t01: RuntimeError # Please triage this failure
@@ -847,11 +689,11 @@
 LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLScriptElement/remove-in-beforeload_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes_t01: RuntimeError # Issue 18127
 LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLTemplateElement/innerHTML_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLTemplateElement/ownerDocumentXHTML_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/MutationObserver/observe-childList_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/observe-childList_t01: RuntimeError # Issue 18253
 LayoutTests/fast/dom/MutationObserver/weak-callback-gc-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Node/fragment-mutation_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Node/initial-values_t01: RuntimeError # Please triage this failure
@@ -869,7 +711,6 @@
 LayoutTests/fast/dom/SelectorAPI/dumpNodeList-almost-strict_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/dumpNodeList_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/StyleSheet/discarded-sheet-owner-null_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/TreeWalker/TreeWalker-basic_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Window/getMatchedCSSRules-nested-rules_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Window/window-resize-contents_t01: RuntimeError # Please triage this failure
@@ -881,14 +722,12 @@
 LayoutTests/fast/dom/characterdata-api-arguments_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/client-width-height-quirks_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/computed-style-set-property_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/css-cached-import-rule_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/cssTarget-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/custom/document-register-svg-extends_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/element-names_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/dataset-xhtml_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/dataset_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/document-importNode-arguments_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/empty-hash-and-search_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/focus-contenteditable_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/fragment-activation-focuses-target_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/getElementsByClassName/011_t01: Pass, RuntimeError # Please triage this failure
@@ -902,7 +741,6 @@
 LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/event-path_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/shadowhost-keyframes_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/no-renderers-for-light-children_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/pseudoclass-update-checked-option_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-optgroup_t01: RuntimeError # Please triage this failure
@@ -910,7 +748,9 @@
 LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-optgroup_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-option_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/shadow-content-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-disable_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/shadow-removechild-and-blur-event_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowhost-keyframes_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/shadowroot-keyframes_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dynamic/crash-generated-counter_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dynamic/crash-generated-image_t01: RuntimeError # Please triage this failure
@@ -927,8 +767,8 @@
 LayoutTests/fast/events/event-creation_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/events/event-listener-html-non-html-confusion_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/events/event-trace_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/fire-scroll-event_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/events/fire-scroll-event-element_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/fire-scroll-event_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/events/initkeyboardevent-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/events/input-focus-no-duplicate-events_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/events/invalid-003_t01: RuntimeError # Please triage this failure
@@ -957,20 +797,20 @@
 LayoutTests/fast/filesystem/directory-entry-to-uri_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/filesystem/file-entry-to-uri_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/filesystem/filesystem-reference_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/forms/autofocus-input-css-style-change_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/forms/autofocus-focus-only-once_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/forms/autofocus-input-css-style-change_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/forms/autofocus-opera-007_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/forms/autofocus-readonly-attribute_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/forms/button/button-disabled-blur_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/forms/button-baseline-and-collapsing_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/forms/button/button-disabled-blur_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/forms/clone-input-with-dirty-value_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/date/input-valueasdate-date_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-onblur-setvalue-onfocusremoved_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/input-valueasdate-date_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datetimelocal/input-valueasdate-datetimelocal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/file/file-input-capture_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/focus_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/forms/focus-style-pending_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/forms/focus_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/forms/input-appearance-elementFromPoint_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/input-hit-test-border_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/forms/input-inputmode_t01: RuntimeError # Please triage this failure
@@ -990,7 +830,6 @@
 LayoutTests/fast/forms/select-clientheight-with-multiple-attr_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/forms/select-list-box-mouse-focus_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/forms/setrangetext_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/submit-nil-value-field-assert_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/textarea-paste-newline_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/textfield-focus-out_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/html/hidden-attr_t01: RuntimeError # Please triage this failure
@@ -1030,8 +869,8 @@
 LayoutTests/fast/multicol/hit-test-end-of-column-with-line-height_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/hit-test-end-of-column_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/hit-test-float_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/hit-test-gap-between-pages_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/hit-test-gap-between-pages-flipped_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-gap-between-pages_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/newmulticol/balance-images_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/newmulticol/balance-maxheight_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/newmulticol/balance_t04: RuntimeError # Please triage this failure
@@ -1185,20 +1024,20 @@
 LibTest/html/Document/clone_A01_t02: RuntimeError # Please triage this failure
 LibTest/html/Document/securityPolicy_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/Element/blur_A01_t01: Skip # Times out. Please triage this failure
-LibTest/html/Element/borderEdge_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/contentEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/borderEdge_A01_t01: RuntimeError # Issue 16574
+LibTest/html/Element/contentEdge_A01_t01: RuntimeError # Issue 16574
 LibTest/html/Element/dataset_A02_t01: RuntimeError # Please triage this failure
 LibTest/html/Element/focus_A01_t01: Skip # Times out. Please triage this failure
-LibTest/html/Element/getAttributeNS_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/getClientRects_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/getAttributeNS_A01_t01: RuntimeError # Issue 16395
+LibTest/html/Element/getClientRects_A01_t02: RuntimeError # Issue 16575
+LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # Issue 16395
 LibTest/html/Element/isContentEditable_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/Element/isContentEditable_A02_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/marginEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/marginEdge_A01_t01: RuntimeError # Issue 16574
 LibTest/html/Element/mouseWheelEvent_A01_t01: Skip # Times out. Please triage this failure
 LibTest/html/Element/onMouseWheel_A01_t01: Skip # Times out. Please triage this failure
 LibTest/html/Element/onTransitionEnd_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/paddingEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/paddingEdge_A01_t01: RuntimeError # Issue 16574
 LibTest/html/Element/querySelectorAll_A01_t02: RuntimeError # Please triage this failure
 LibTest/html/Element/replaceWith_A01_t02: RuntimeError # Please triage this failure
 LibTest/html/Element/transitionEndEvent_A01_t01: RuntimeError # Please triage this failure
@@ -1222,7 +1061,7 @@
 LibTest/html/IFrameElement/attributeChanged_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/attributes_setter_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/blur_A01_t01: Skip # Times out. Please triage this failure
-LibTest/html/IFrameElement/borderEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/borderEdge_A01_t01: RuntimeError # Issue 16574
 LibTest/html/IFrameElement/clone_A01_t02: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/contentWindow_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/createFragment_A01_t01: RuntimeError # Please triage this failure
@@ -1235,12 +1074,12 @@
 LibTest/html/IFrameElement/innerHtml_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/isContentEditable_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/leftView_A01_t01: Skip # Times out. Please triage this failure
-LibTest/html/IFrameElement/marginEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/marginEdge_A01_t01: RuntimeError # Issue 16574
 LibTest/html/IFrameElement/offsetTo_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/onMouseWheel_A01_t01: Skip # Times out. Please triage this failure
 LibTest/html/IFrameElement/onTransitionEnd_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/outerHtml_setter_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/paddingEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/paddingEdge_A01_t01: RuntimeError # Issue 16574
 LibTest/html/IFrameElement/querySelector_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/setInnerHtml_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/Node/append_A01_t02: RuntimeError # Please triage this failure
@@ -1378,18 +1217,19 @@
 WebPlatformTest/html/semantics/selectors/pseudo-classes/indeterminate_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/semantics/selectors/pseudo-classes/inrange-outofrange_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/semantics/selectors/pseudo-classes/link_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/semantics/selectors/pseudo-classes/valid-invalid_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/valid-invalid_t01: Pass, RuntimeError # Please triage this failure
 WebPlatformTest/html/semantics/tabular-data/the-table-element/table-rows_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/semantics/tabular-data/the-tr-element/rowIndex_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/syntax/parsing/Document.getElementsByTagName-foreign_t01: Pass, RuntimeError # Please triage this failure
 WebPlatformTest/html/syntax/parsing/Document.getElementsByTagName-foreign_t02: RuntimeError # Please triage this failure
 WebPlatformTest/html/syntax/serializing-html-fragments/outerHTML_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol_t00: Pass, RuntimeError # Please triage this failure
 WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t02: RuntimeError # Please triage this failure
 WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t03: RuntimeError # Please triage this failure
 WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t04: RuntimeError # Please triage this failure
 WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t05: RuntimeError # Please triage this failure
 WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t06: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol_t00: Pass, RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t02: RuntimeError # Please triage this failure
@@ -1409,6 +1249,7 @@
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t01: Skip # Times out. Please triage this failure
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t02: Skip # Times out. Please triage this failure
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t05: Skip # Times out. Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t06: Skip # Times out. Please triage this failure
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-002_t01: Pass, RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-003_t01: Pass, RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-003_t01: RuntimeError # Please triage this failure
@@ -1428,7 +1269,7 @@
 WebPlatformTest/webstorage/storage_local_setitem_t01: RuntimeError # Please triage this failure
 WebPlatformTest/webstorage/storage_session_setitem_t01: RuntimeError # Please triage this failure
 
-[ $compiler == dart2js && ($runtime == chrome || $runtime == drt) && $checked ]
+[ $compiler == dart2js && $runtime == chrome && $checked ]
 LayoutTests/fast/css-intrinsic-dimensions/css-tables_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-absolutes_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-blocks_t01: RuntimeError # Please triage this failure
@@ -1489,7 +1330,7 @@
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-bad-mimetype_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-invalid-values_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/xpath-result-eventlistener-crash_t01: RuntimeError # Please triage this failure
-LibTest/html/Node/ownerDocument_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Node/ownerDocument_A01_t01: RuntimeError # Issue 18251
 WebPlatformTest/DOMEvents/approved/Propagation.path.target.removed_t01: RuntimeError # Please triage this failure
 WebPlatformTest/custom-elements/instantiating/createElementNS_A05_t01: RuntimeError # Please triage this failure
 WebPlatformTest/custom-elements/instantiating/createElement_A05_t01: RuntimeError # Please triage this failure
@@ -1499,7 +1340,7 @@
 WebPlatformTest/html/semantics/forms/textfieldselection/selection_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError # Please triage this failure
 
-[ $compiler == dart2js && ($runtime == chrome || $runtime == drt) && $system != macos ]
+[ $compiler == dart2js && $runtime == chrome && $system != macos ]
 LayoutTests/fast/canvas/webgl/WebGLContextEvent_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/array-bounds-clamping_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/attrib-location-length-limits_t01: RuntimeError # Please triage this failure
@@ -1580,6 +1421,7 @@
 [ $compiler == dart2js && $runtime == ff ]
 Language/12_Expressions/00_Object_Identity/1_Object_Identity_A05_t02: RuntimeError # Please triage this failure
 Language/12_Expressions/17_Getter_Invocation_A07_t02: RuntimeError # Please triage this failure
+Language/12_Expressions/28_Postfix_Expressions_A07_t02: Skip # Times out. Please triage this failure
 LayoutTests/fast/alignment/parse-align-items_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/alignment/parse-align-self_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/alignment/parse-justify-self_t01: RuntimeError # Please triage this failure
@@ -1768,7 +1610,6 @@
 LayoutTests/fast/canvas/webgl/webgl-texture-binding-preserved_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-unprefixed-context-id_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-viewport-parameters-preserved_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-generated-content/bug91547_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-generated-content/malformed-url_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/css-generated-content/pseudo-animation_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css-generated-content/pseudo-animation-before-onload_t01: Pass, RuntimeError # Please triage this failure
@@ -1958,16 +1799,16 @@
 LayoutTests/fast/css/parsing-selector-error-recovery_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-unexpected-eof_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-webkit-font-smoothing_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/position-absolute-float_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/position-absolute-float_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/pseudo-any_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/pseudo-invalid-001_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/pseudo-invalid-novalidate-001_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-invalid-001_t01: Pass, RuntimeError # Passes on ff 35. Please triage this failure
+LayoutTests/fast/css/pseudo-invalid-novalidate-001_t01: Pass, RuntimeError # Passes on ff 35. Please triage this failure
 LayoutTests/fast/css/pseudo-required-optional-004_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/pseudo-required-optional-006_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/pseudo-required-optional-unapplied_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/pseudo-target-indirect-sibling-001_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/css/pseudo-target-indirect-sibling-002_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/css/pseudo-valid-dynamic_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-valid-dynamic_t01: Pass, RuntimeError # Passes on ff 35. Please triage this failure
 LayoutTests/fast/css/pseudo-valid-unapplied_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/pseudostyle-anonymous-text_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/readonly-pseudoclass-opera-001_t01: RuntimeError # Please triage this failure
@@ -2114,14 +1955,14 @@
 LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLScriptElement/remove-in-beforeload_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLScriptElement/remove-source_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/remove-source_t01: RuntimeError # Issue 18128
 LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLSelectElement/change-multiple-preserve-selection_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLStyleElement/style-onerror-with-existent-and-non-existent-import_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLTableElement/cellpadding-attribute_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: RuntimeError # Issue 18250
 LayoutTests/fast/dom/HTMLTemplateElement/cycles-in-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLTemplateElement/innerHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/innerHTML_t01: RuntimeError # Issue 18249
 LayoutTests/fast/dom/HTMLTemplateElement/ownerDocumentXHTML_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLTemplateElement/xhtml-parsing-and-serialization_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/MutationObserver/added-out-of-order_t01: RuntimeError # Please triage this failure
@@ -2157,7 +1998,6 @@
 LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/detached-shadow-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/StyleSheet/discarded-sheet-owner-null_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/empty-shadow-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/removed-media-rule-deleted-parent-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/removed-stylesheet-rule-deleted-parent-crash_t01: RuntimeError # Please triage this failure
@@ -2183,7 +2023,6 @@
 LayoutTests/fast/dom/client-width-height-quirks_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/computed-style-set-property_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/containerNode_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/css-cached-import-rule_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/css-delete-doc_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/css-innerHTML_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/css-mediarule-functions_t01: RuntimeError # Please triage this failure
@@ -2191,7 +2030,6 @@
 LayoutTests/fast/dom/css-selectorText_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/css-shortHands_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/css-shorthand-common-value_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/cssTarget-crash_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/custom/attribute-changed-callback_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/custom/constructor-calls-created-synchronously_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/custom/created-callback_t01: RuntimeError # Please triage this failure
@@ -2216,7 +2054,6 @@
 LayoutTests/fast/dom/dom-parse-serialize-xmldecl_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/dom-parse-serialize_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/empty-hash-and-search_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/focus-contenteditable_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/fragment-activation-focuses-target_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/getElementsByClassName/010_t01: RuntimeError # Please triage this failure
@@ -2342,11 +2179,11 @@
 LayoutTests/fast/events/form-onchange_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/events/initkeyboardevent-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/events/input-focus-no-duplicate-events_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/events/invalid-001_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/invalid-002_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/invalid-001_t01: Pass, RuntimeError # Passes on ff 35. Please triage this failure
+LayoutTests/fast/events/invalid-002_t01: Pass, RuntimeError # Passes on ff 35. Please triage this failure
 LayoutTests/fast/events/invalid-003_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/events/invalid-004_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/events/invalid-005_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/invalid-005_t01: Pass, RuntimeError # Passes on ff 35. Please triage this failure
 LayoutTests/fast/events/label-focus_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/events/mutation-during-replace-child-2_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/events/mutation-during-replace-child_t01: RuntimeError # Please triage this failure
@@ -2373,7 +2210,6 @@
 LayoutTests/fast/files/xhr-response-blob_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/filesystem/async-operations_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/filesystem/directory-entry-to-uri_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/filesystem/file-after-reload-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/filesystem/file-entry-to-uri_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/filesystem/file-from-file-entry_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/filesystem/file-metadata-after-write_t01: RuntimeError # Please triage this failure
@@ -2429,11 +2265,11 @@
 LayoutTests/fast/forms/autofocus-opera-005_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/autofocus-opera-007_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/forms/autofocus-readonly-attribute_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/forms/button/button-disabled-blur_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/button/button-disabled-blur_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/forms/button-baseline-and-collapsing_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/forms/checkValidity-001_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/checkValidity-002_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/checkValidity-004_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/checkValidity-001_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/forms/checkValidity-002_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/forms/checkValidity-004_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/forms/checkValidity-handler-updates-dom_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/clone-input-with-dirty-value_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datalist/datalist-child-validation_t01: RuntimeError # Please triage this failure
@@ -2446,6 +2282,7 @@
 LayoutTests/fast/forms/date/ValidityState-stepMismatch-date_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/date/ValidityState-typeMismatch-date_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/date/date-input-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/date-interactive-validation-required_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/forms/date/date-pseudo-classes_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/date/input-date-validation-message_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/date/input-valueasdate-date_t01: RuntimeError # Please triage this failure
@@ -2456,7 +2293,6 @@
 LayoutTests/fast/forms/datetimelocal/ValidityState-stepMismatch-datetimelocal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datetimelocal/ValidityState-typeMismatch-datetimelocal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datetimelocal/datetimelocal-input-type_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/datetimelocal/datetimelocal-interactive-validation-required_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datetimelocal/datetimelocal-pseudo-classes_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datetimelocal/input-valueasdate-datetimelocal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError # Please triage this failure
@@ -2468,6 +2304,7 @@
 LayoutTests/fast/forms/focus_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/form-attribute_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/form-dirname-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/formmethod-attribute-button-html_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/forms/formmethod-attribute-input-2_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/forms/incremental-dom-property_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/input-appearance-elementFromPoint_t01: RuntimeError # Please triage this failure
@@ -2489,6 +2326,7 @@
 LayoutTests/fast/forms/menulist-selection-reset_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/menulist-submit-without-selection_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/min-content-form-controls_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/missing-action_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/forms/multiple-selected-options-innerHTML_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/onchange-change-type_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/option-change-single-selected_t01: RuntimeError # Please triage this failure
@@ -2510,14 +2348,14 @@
 LayoutTests/fast/forms/setCustomValidity-existence_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/setrangetext_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/shadow-tree-exposure_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/submit-nil-value-field-assert_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/submit-form-with-dirname-attribute_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/forms/submit-form-with-dirname-attribute-with-ancestor-dir-attribute_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/forms/text-control-select-blurred_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/textarea-maxlength_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/textarea-no-scroll-on-blur_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/textarea-paste-newline_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/textarea-rows-cols_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/textarea-set-defaultvalue-after-value_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/textarea-submit-crash_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/forms/textarea-trailing-newline_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/textfield-clone_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/textfield-focus-out_t01: Skip # Times out. Please triage this failure
@@ -2659,6 +2497,7 @@
 LayoutTests/fast/storage/storage-disallowed-in-data-url_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/sub-pixel/computedstylemargin_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/sub-pixel/cssom-subpixel-precision_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/getbbox_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/svg/tabindex-focus_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/svg/whitespace-angle_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/svg/whitespace-integer_t01: RuntimeError # Please triage this failure
@@ -2765,8 +2604,8 @@
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: RuntimeError # Please triage this failure
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: RuntimeError # Please triage this failure
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: RuntimeError # Please triage this failure
-LibTest/core/double/roundToDouble_A01_t01: RuntimeError # Please triage this failure
-LibTest/core/double/round_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/double/roundToDouble_A01_t01: Pass, RuntimeError # Passes on ff 35. Please triage this failure
+LibTest/core/double/round_A01_t01: Pass, RuntimeError # Passes on ff 35. Please triage this failure
 LibTest/core/int/compareTo_A01_t01: RuntimeError # Please triage this failure
 LibTest/core/int/operator_left_shift_A01_t01: RuntimeError # Please triage this failure
 LibTest/core/int/operator_remainder_A01_t03: RuntimeError # Please triage this failure
@@ -2783,8 +2622,8 @@
 LibTest/html/Element/Element.tag_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/Element/attributeChanged_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/Element/blur_A01_t01: Skip # Times out. Please triage this failure
-LibTest/html/Element/borderEdge_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/contentEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/borderEdge_A01_t01: RuntimeError # Issue 16574
+LibTest/html/Element/contentEdge_A01_t01: RuntimeError # Issue 16574
 LibTest/html/Element/dataset_A02_t01: RuntimeError # Please triage this failure
 LibTest/html/Element/enteredView_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/Element/focus_A01_t01: Skip # Times out. Please triage this failure
@@ -2792,10 +2631,10 @@
 LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/Element/isTagSupported_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/Element/leftView_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/marginEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/marginEdge_A01_t01: RuntimeError # Issue 16574
 LibTest/html/Element/mouseWheelEvent_A01_t01: Skip # Times out. Please triage this failure
 LibTest/html/Element/onMouseWheel_A01_t01: Skip # Times out. Please triage this failure
-LibTest/html/Element/paddingEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/paddingEdge_A01_t01: RuntimeError # Issue 16574
 LibTest/html/Element/querySelectorAll_A01_t02: RuntimeError # Please triage this failure
 LibTest/html/Element/replaceWith_A01_t02: RuntimeError # Please triage this failure
 LibTest/html/Element/tagName_A01_t01: RuntimeError # Please triage this failure
@@ -2824,7 +2663,7 @@
 LibTest/html/IFrameElement/attributeChanged_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/attributes_setter_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/blur_A01_t01: Skip # Times out. Please triage this failure
-LibTest/html/IFrameElement/borderEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/borderEdge_A01_t01: RuntimeError # Issue 16574
 LibTest/html/IFrameElement/clone_A01_t02: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/contentWindow_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/createFragment_A01_t01: RuntimeError # Please triage this failure
@@ -2835,11 +2674,11 @@
 LibTest/html/IFrameElement/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/innerHtml_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/leftView_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/marginEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/marginEdge_A01_t01: RuntimeError # Issue 16574
 LibTest/html/IFrameElement/offsetTo_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/onMouseWheel_A01_t01: Skip # Times out. Please triage this failure
 LibTest/html/IFrameElement/outerHtml_setter_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/paddingEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/paddingEdge_A01_t01: RuntimeError # Issue 16574
 LibTest/html/IFrameElement/querySelector_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/setInnerHtml_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/spellcheck_A01_t01: RuntimeError # Please triage this failure
@@ -3117,3 +2956,6403 @@
 WebPlatformTest/webstorage/storage_local_setitem_t01: RuntimeError # Please triage this failure
 WebPlatformTest/webstorage/storage_session_setitem_quotaexceedederr_t01: Skip # Times out. Please triage this failure
 WebPlatformTest/webstorage/storage_session_setitem_t01: RuntimeError # Please triage this failure
+
+[ $compiler == dart2js && $runtime == safari ]
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A05_t02: RuntimeError # Please triage this failure
+Language/12_Expressions/17_Getter_Invocation_A07_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/alignment/parse-align-items_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/alignment/parse-align-self_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/alignment/parse-justify-self_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/backgrounds/background-repeat-computed-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/backgrounds/repeat/parsing-background-repeat_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/borders/border-image-width-numbers-computed-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/borders/border-radius-child_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/2d.fillText.gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.negative_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.veryLarge_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.verySmall_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/alpha_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-arc-negative-radius_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blend-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blend-solid_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-clipping_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-color-over-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-color-over-gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-color-over-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-color-over-pattern_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-fill-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-global-alpha_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-gradient-over-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-gradient-over-gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-gradient-over-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-gradient-over-pattern_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-image-over-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-image-over-gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-image-over-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-image-over-pattern_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-pattern-over-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-pattern-over-gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-pattern-over-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-pattern-over-pattern_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-transforms_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-drawImage-scaled-copy-to-self_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-ellipse-360-winding_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-ellipse-negative-radius_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-ellipse-zero-lineto_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-ellipse_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-empty-image-pattern_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-fillStyle-no-quirks-parsing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-font-consistency_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-getImageData-invalid_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-getImageData-large-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-getImageData-largeNonintegralDimensions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-imageSmoothingEnabled-repaint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-imageSmoothingEnabled_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-large-dimensions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-large-fills_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-lineDash-input-sequence_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-lose-restore-googol-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-lose-restore-max-int-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-putImageData_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-quadratic-same-endpoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-resetTransform_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-scale-shadowBlur_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-scale-strokePath-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-setTransform_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/draw-custom-focus-ring_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/drawImage-with-broken-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/drawImage-with-valid-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/getPutImageDataPairTest_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/WebGLContextEvent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/array-bounds-clamping_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/attrib-location-length-limits_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/bad-arguments-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/buffer-bind-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/buffer-data-array-buffer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/canvas-2d-webgl-texture_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/canvas-resize-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/canvas-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/canvas-zero-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/compressed-tex-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias-t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/context-destroyed-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/context-lost-restored_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/context-lost_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/copy-tex-image-and-sub-image-2d_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/css-webkit-canvas-repaint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/css-webkit-canvas_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/draw-arrays-out-of-bounds_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/draw-webgl-to-canvas-2d_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/drawingbuffer-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/error-reporting_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/framebuffer-bindings-unaffected-on-resize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/framebuffer-object-attachment_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/framebuffer-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/functions-returning-strings_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/get-active-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-bind-attrib-location-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-enable-enum-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-enum-tests_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-get-calls_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-getshadersource_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-getstring_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-object-get-calls_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-pixelstorei_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-teximage_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-uniformmatrix4fv_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-vertex-attrib-zero-issues_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-vertex-attrib_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-vertexattribpointer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/glsl-conformance_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/incorrect-context-object-behaviour_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation-copies-indices_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation-crash-with-buffer-sub-data_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation-verifies-too-many-indices_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation-with-resized-buffer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/invalid-UTF-16_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/invalid-passed-params_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/is-object_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/null-object-behaviour_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/null-uniform-location_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/object-deletion-behaviour_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/oes-element-index-uint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/oes-vertex-array-object_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/point-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/premultiplyalpha-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/program-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/read-pixels-pack-alignment_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/read-pixels-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/renderbuffer-initialization_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/renderer-and-vendor-strings_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/shader-precision-format_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgb565_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba4444_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba5551_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgb565_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba4444_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba5551_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgb565_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba4444_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba5551_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgb565_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba4444_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba5551_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-uniform-binding-bugs_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-webgl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-input-validation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-sub-image-2d-bad-args_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-sub-image-2d_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-sub-image-cube-maps_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texImage2DImageDataTest_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texImageTest_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-active-bind_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-bindings-uneffected-on-resize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-color-profile_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-complete_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-npot_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-transparent-pixels-initialized_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/triangle_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/uniform-location-length-limits_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/uniform-location_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/uninitialized-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/viewport-unchanged-upon-resize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-composite-modes-repaint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-composite-modes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-depth-texture_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-exceptions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-large-texture_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-layer-update_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-specific_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-texture-binding-preserved_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-unprefixed-context-id_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-viewport-parameters-preserved_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-generated-content/malformed-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-generated-content/pseudo-animation_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/css-generated-content/pseudo-animation-before-onload_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/css-generated-content/pseudo-element-events_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css-generated-content/pseudo-transition-event_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css-generated-content/pseudo-transition_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/auto-content-resolution-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/breadth-size-resolution-grid_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/calc-resolution-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/display-grid-set-get_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/flex-and-minmax-content-resolution-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/flex-content-resolution-columns_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/flex-content-resolution-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-auto-columns-rows-get-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-auto-flow-get-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-auto-flow-update_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-container-change-explicit-grid-recompute-child_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-border-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-border-padding-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-empty-row-column_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-min-max-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-padding-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-padding-margin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-shrink-to-fit_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-area-get-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-bad-named-area-auto-placement_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-bad-resolution-double-span_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-change-order-auto-flow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-display_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-horiz-bt_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-vert-lr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-vert-rl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-margin-resolution_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-order-auto-flow-resolution_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-template-areas-get-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/implicit-rows-auto-resolution_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/justify-self-cell_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/minmax-fixed-logical-height-only_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/minmax-fixed-logical-width-only_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-in-percent-grid_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-update_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item-update_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-resolution-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/place-cell-by-index_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/height-property-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/add-remove-stylesheets-at-once-minimal-recalc-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/aspect-ratio-inheritance_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/aspect-ratio-parsing-tests_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/background-position-serialize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/background-serialize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/border-image-style-length_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/checked-pseudo-selector_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/collapsed-whitespace-reattach-in-style-recalc_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/computed-offset-with-zoom_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content/content-none_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content/content-normal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content/content-quotes-01_t01: Pass, RuntimeError # Fails on 7.1. Please triage this failure
+LayoutTests/fast/css/content/content-quotes-05_t01: Pass, RuntimeError # Fails on 7.1. Please triage this failure
+LayoutTests/fast/css/css-escaped-identifier_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/css-properties-case-insensitive_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/css3-nth-tokens-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/csstext-of-content-string_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/cursor-parsing-quirks_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/deprecated-flexbox-auto-min-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/draggable-region-parser_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/dynamic-class-backdrop-pseudo_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/first-child-display-change-inverse_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/focus-display-block-inline_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-face-cache-bug_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-face-unicode-range-load_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-face-unicode-range-monospace_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-face-unicode-range-overlap-load_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-shorthand-from-longhands_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/fontface-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/fontfaceset-download-error_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/fontfaceset-events_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/fontfaceset-loadingdone_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/computed-style-font_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/computed-style-with-zoom_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getPropertyValue-clip_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/html-attr-case-sensitivity_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/id-or-class-before-stylesheet_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/inherit-initial-shorthand-values_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalid-predefined-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/detach-reattach-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/dynamic-selector-list-pseudo_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/shadow-host-toggle_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/targeted-class-any-pseudo_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/targeted-class-host-pseudo_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/targeted-class-shadow-combinator_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/toggle-style-inside-shadow-root_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-alternate-stylesheet-1_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-alternate-stylesheet-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-alternate-stylesheet-3_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-alternate-stylesheet-4_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-alternate-stylesheet-5_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/media-query-recovery_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/media-rule-no-whitespace_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/modify-ua-rules-from-javascript_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parse-color-int-or-percent-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-at-rule-recovery_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-object-position_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-page-rule_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-selector-error-recovery_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-unexpected-eof_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-any_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-target-indirect-sibling-001_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css/pseudo-target-indirect-sibling-002_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css/readonly-pseudoclass-opera-001_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readonly-pseudoclass-opera-002_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readonly-pseudoclass-opera-003_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readonly-pseudoclass-opera-004_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readonly-pseudoclass-opera-005_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readwrite-contenteditable-recalc_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/shorthand-setProperty-important_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/sibling-selectors-dynamic_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/sticky/parsing-position-sticky_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-in-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-nested_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-scoping-nodes-different-order_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-shadow-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-with-dom-operation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-with-important-rule_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-sharing-type-and-readonly_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/stylesheet-enable-first-alternate-on-load-sheet_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/stylesheet-enable-second-alternate-link_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/webkit-keyframes-errors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/word-break-user-modify-allowed-values_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last-inherited_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-line_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-underline-position_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent-inherited_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-justify/getComputedStyle/getComputedStyle-text-justify_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/52776_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Attr/direction-attribute-set-and-cleared_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/DOMException/XPathException_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/DOMException/dispatch-event-exception_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/basic_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-strict-mode-wtih-checkbox_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-user-select-none_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-with-first-letter-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/hittest-relative-to-viewport_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/createElementNS-namespace-err_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/offsetTop-table-cell_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/setAttributeNS-namespace-err_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/remove-href-from-focused-anchor_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-host_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-hostname_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-pathname_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-autofocus_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-close-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-enabled_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-open_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-show-modal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/inert-does-not-match-disabled-selector_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unfocusable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unselectable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/multiple-centered-dialogs_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/non-anchored-dialog-positioning_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/show-modal-focusing-steps_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/submit-dialog-close-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/synthetic-click-inert_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDocument/active-element-gets-unforcusable_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/insertAdjacentHTML-errors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/set-inner-outer-optimization_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/spellcheck_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLFormElement/move-option-between-documents_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLImageElement/image-alt-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLImageElement/parse-src_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLInputElement/input-hidden-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLInputElement/input-image-alt-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLabelElement/form/test1_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test-nonexistent_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/prefetch-onerror_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/prefetch-onload_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/prefetch_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLObjectElement/form/test1_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLOutputElement/dom-settable-token-list_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/async-false-inside-async-false-load_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/async-inline-script_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/async-onbeforeload_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/cycles-in-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/innerHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/ownerDocumentXHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/observe-childList_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/observe-options-attributes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/observe-options-character-data_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/weak-callback-gc-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Node/initial-values_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/NodeIterator/NodeIterator-basic_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/bug-19527_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/insertNode-empty-fragment-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/mutation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-comparePoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-constructor_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-detached-exceptions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-exceptions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-expand_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-insertNode-separate-endContainer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-insertNode-splittext_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-isPointInRange_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-on-detached-node_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/surroundContents-for-detached-node_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/SelectorAPI/dumpNodeList-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/SelectorAPI/dumpNodeList-almost-strict_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/SelectorAPI/dumpNodeList_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/css-insert-import-rule-to-shadow-stylesheets_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/detached-shadow-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/empty-shadow-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Text/next-element-sibling_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Text/previous-element-sibling_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/TreeWalker/TreeWalker-basic_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/atob-btoa_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/getMatchedCSSRules-nested-rules_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/getMatchedCSSRules-parent-stylesheets_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/window-resize-contents_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/window-resize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/window-scroll-arguments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/XMLSerializer-attribute-entities_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/XMLSerializer-double-xmlns_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/anchor-without-content_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/attribute-namespaces-get-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/characterdata-api-arguments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/client-width-height-quirks_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/computed-style-set-property_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/attribute-changed-callback_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/constructor-calls-created-synchronously_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/created-callback_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/document-register-basic_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/document-register-namespace_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/document-register-on-create-callback_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/document-register-svg-extends_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/document-register-type-extensions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/element-names_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/element-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/element-upgrade_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/lifecycle-created-createElement-recursion_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/type-extensions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/unresolved-pseudoclass_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/upgrade-candidate-remove-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/dataset-xhtml_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/dataset_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/document-set-title-mutations_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/document-set-title-no-child-on-empty_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/document-set-title-no-reuse_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/getElementsByClassName/dumpNodeList_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/horizontal-scrollbar-in-rtl-doesnt-fire-onscroll_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/html-collections-named-getter-mandatory-arg_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/implementation-api-args_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/implementation-createHTMLDocument_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/importNode-unsupported-node-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/location-missing-arguments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigatorcontentutils/register-protocol-handler_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/object-plugin-hides-properties_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/dom/option-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/access-document-of-detached-stylesheetlist-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/base-in-shadow-tree_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-element-api_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-element-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-element-includer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-element-outside-shadow-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-pseudo-element-css-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-pseudo-element-dynamic-attribute-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-pseudo-element-overridden_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-pseudo-element-relative-selector-css-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-pseudo-element-with-host-pseudo-class_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-reprojection-fallback-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/custom-pseudo-in-selector-api_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/distribution-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/distribution-for-event-path_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/distribution-update-recalcs-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/elementfrompoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/elements-in-frameless-document_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/event-path-not-in-document_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/event-path_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/form-in-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/get-distributed-nodes-orphan_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/get-element-by-id-in-shadow-mutation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/getComputedStyle-composed-parent-dirty_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/getelementbyid-in-orphan_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/getelementbyid-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/host-context-pseudo-class-css-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/host-pseudo-class-css-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/host-wrapper-reclaimed_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/insertion-point-list-menu-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/insertion-point-shadow-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/insertion-point-video-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/link-in-shadow-tree_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/nested-reprojection-inconsistent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/no-renderers-for-light-children_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/offsetWidth-host-style-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/olderShadowRoot_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/pseudoclass-update-checked-option_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-optgroup_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-option_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-optgroup_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-option_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/reinsert-insertion-point_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/remove-and-insert-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/remove-styles-in-shadow-crash-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/remove-styles-in-shadow-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-aware-shadow-root_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-content-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-disable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-element-inactive_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-hierarchy-exception_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-removechild-and-blur-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-root-append_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-root-js-api_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-root-node-list_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-root-text-child_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-ul-li_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowdom-dynamic-styling_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowdom-for-input-spellcheck_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowdom-for-input-type-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowdom-for-unknown-with-form_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowhost-keyframes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowroot-clonenode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowroot-host_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowroot-keyframes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/sibling-rules-dynamic-changes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/stale-distribution-after-shadow-removal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/style-insertion-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/style-of-distributed-node_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/style-sharing-sibling-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/style-sharing-styles-in-older-shadow-roots_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/suppress-mutation-events-in-shadow-characterdata_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/title-element-in-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/crash-generated-counter_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/crash-generated-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/crash-generated-quote_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/crash-generated-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/insertAdjacentElement_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/insertAdjacentHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/recursive-layout_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/add-event-without-document_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/clipboard-clearData_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/clipboard-dataTransferItemList_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/dispatch-event-being-dispatched_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/document-elementFromPoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-creation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-listener-html-non-html-confusion_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-on-created-document_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-on-xhr-document_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-trace_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/initkeyboardevent-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/invalid-003_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/invalid-004_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/mutation-during-replace-child-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/mutation-during-replace-child_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/scroll-event-does-not-bubble_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/tabindex-removal-from-focused-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/wheelevent-constructor_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/exclusions/parsing/parsing-wrap-flow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/exclusions/parsing/parsing-wrap-through_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-close-read_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-close-revoke_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-close_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-constructor_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-parts-slice-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-slice-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/file-reader-abort-in-last-progress_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/file-reader-methods-illegal-arguments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/file-reader-readystate_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/url-null_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/xhr-response-blob_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/async-operations_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/directory-entry-to-uri_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-entry-to-uri_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-from-file-entry_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-metadata-after-write_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-abort-continue_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-abort-depth_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-abort_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-empty-blob_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-events_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-gc-blob_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-truncate-extend_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-write-overlapped_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/filesystem-reference_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/filesystem-unserializable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/filesystem-uri-origin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/input-access-entries_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-copy_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-get-entry_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-get-metadata_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-get-parent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-move_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-read-directory_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-remove_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-restricted-chars_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-restricted-names_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-restricted-unicode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/read-directory-many_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/read-directory_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/simple-readonly-file-object_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/simple-readonly_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/simple-required-arguments-getdirectory_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/simple-required-arguments-getfile_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/simple-temporary_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/snapshot-file-with-gc_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-typeMismatch-email_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/autocomplete_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/autofocus-input-css-style-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/button-baseline-and-collapsing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/button/button-disabled-blur_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/clone-input-with-dirty-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/color/color-setrangetext_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/color/input-value-sanitization-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datalist/datalist_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datalist/input-list_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-change-layout-by-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-onblur-setvalue-onfocusremoved_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/ValidityState-rangeOverflow-date_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/ValidityState-rangeUnderflow-date_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/ValidityState-stepMismatch-date_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/ValidityState-typeMismatch-date_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/date-input-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/date-interactive-validation-required_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/date-pseudo-classes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/date-setrangetext_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/input-date-validation-message_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/input-valueasdate-date_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/input-valueasnumber-date_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-change-layout-by-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/ValidityState-rangeOverflow-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/ValidityState-rangeUnderflow-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/ValidityState-stepMismatch-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/ValidityState-typeMismatch-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/datetimelocal-input-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/datetimelocal-pseudo-classes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/datetimelocal-setrangetext_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/input-valueasdate-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/file/file-input-capture_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/form-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-appearance-elementFromPoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-inputmode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-type-change3_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-value-sanitization_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-width-height-attributes-without-renderer-loaded-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/interactive-validation-assertion-by-validate-twice_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/forms/interactive-validation-attach-assertion_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/forms/interactive-validation-select-crash_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/forms/listbox-selection-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/menulist-disabled-selected-option_t01: Pass, RuntimeError # Fails on 7.1. Please triage this failure
+LayoutTests/fast/forms/menulist-selection-reset_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/menulist-submit-without-selection_t01: Pass, RuntimeError # Fails on 7.1. Please triage this failure
+LayoutTests/fast/forms/multiple-selected-options-innerHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/option-change-single-selected_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/option-strip-unicode-spaces_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/parser-associated-form-removal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/plaintext-mode-1_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/search-popup-crasher_t01: Pass, RuntimeError # Fails on 7.1. Please triage this failure
+LayoutTests/fast/forms/selection-wrongtype_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/setrangetext_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/textarea-maxlength_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/textarea-paste-newline_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/textarea-selection-preservation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/hidden-attr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/imports/import-element-removed-flag_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/html/imports/import-events_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/select-dropdown-consistent-background-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/boundingBox-with-continuation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/continuation-inlines-inserted-in-reverse-after-block_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/inline-position-top-align_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/inline-with-empty-inline-children_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/out-of-flow-objects-and-whitespace-after-empty-inline_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/parent-inline-element-padding-contributes-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/positioned-element-padding-contributes-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/innerHTML/innerHTML-custom-tag_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/layers/normal-flow-hit-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/about-blank-hash-change_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/loader/about-blank-hash-kept_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/loader/hashchange-event-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/onhashchange-attribute-listeners_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/loader/scroll-position-restored-on-back_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/loader/scroll-position-restored-on-reload-at-load-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/stateobjects/replacestate-in-onunload_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/masking/parsing-clip-path-shape_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/masking/parsing-mask_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/media/matchmedium-query-api_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/media/media-query-list-syntax_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/media/media-query-list_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/media/mq-append-delete_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/media/mq-js-media-except_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/media/mq-js-media-except_t03: RuntimeError # Please triage this failure
+LayoutTests/fast/media/mq-parsing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/mediastream/RTCIceCandidate_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/mediastream/RTCPeerConnection_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/mediastream/constructors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/balance-short-trailing-empty-block_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/balance-trailing-border_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/balance-trailing-border_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/balance-unbreakable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/break-after-always-bottom-margin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/break-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/columns-shorthand-parsing_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/cssom-view_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/flipped-blocks-hit-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/float-truncation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-above-or-below_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-end-of-column-with-line-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-end-of-column_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-float_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-gap-between-pages-flipped_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/image-inside-nested-blocks-with-border_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance-images_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance-maxheight_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/orphans-relayout_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-lr/float-truncation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-lr/image-inside-nested-blocks-with-border_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-rl/break-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-rl/float-truncation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-rl/image-inside-nested-blocks-with-border_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/overflow/replaced-child-100percent-height-inside-fixed-container-with-overflow-auto_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/parser/foster-parent-adopted_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/parser/fragment-parser-doctype_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/parser/innerhtml-with-prefixed-elements_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/parser/pre-first-line-break_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/available-height-for-content_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/container-width-zero_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-table-cell-ignore-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/table-percent-height-text-controls_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/table-percent-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/table-percent-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/ruby/ruby-line-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/scrolling/scroll-element-into-view_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-lengths_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-margin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-outside_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-big-box-border-radius_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-diamond-margin-polygon_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-left_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-right_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t02: Pass, RuntimeError # Fails on 6.2. Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-left_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-right_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-cancel_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-utterance-uses-voice_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-voices_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/storage/disallowed-storage_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/storage/storage-disallowed-in-data-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/cssom-subpixel-precision_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/float-containing-block-with-margin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/shadows-computed-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/table-rows-have-stable-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/tabindex-focus_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/whitespace-angle_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/whitespace-integer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/whitespace-length_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/whitespace-number_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/absolute-table-percent-lengths_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/anonymous-table-section-removed_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/caption-orthogonal-writing-mode-sizing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/col-width-span-expand_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/css-table-max-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/css-table-max-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/css-table-width-with-border-padding_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/fixed-table-layout-width-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/hittest-tablecell-bottom-edge_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/hittest-tablecell-right-edge_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/hittest-tablecell-with-borders-bottom-edge_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/hittest-tablecell-with-borders-right-edge_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/html-table-width-max-width-constrained_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/large-shrink-wrapped-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/margins-perpendicular-containing-block_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/min-width-css-block-table_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/table/min-width-css-inline-table_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/table/min-width-html-block-table_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/table/min-width-html-inline-table_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/table/nested-tables-with-div-offset_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/padding-height-and-override-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/switch-table-layout-dynamic-cells_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/switch-table-layout-multiple-section_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/switch-table-layout_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows-except-overlapped_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-cell-offset-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-colgroup-present-after-table-row_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-rowspan-cell-with-empty-cell_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-with-content-width-exceeding-max-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text-autosizing/vertical-writing-mode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-case-folding_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-russian_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-soft-hyphen_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-spaces_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/font-ligature-letter-spacing_t01: Pass, RuntimeError # Fails on 6.2. Please triage this failure
+LayoutTests/fast/text/font-ligatures-linebreak-word_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/font-ligatures-linebreak_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/glyph-reordering_t01: Pass, RuntimeError # Fails on 7.1. Please triage this failure
+LayoutTests/fast/text/international/cjk-segmentation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/international/iso-8859-8_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/international/listbox-width-rtl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/international/rtl-text-wrapping_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/international/thai-offsetForPosition-inside-character_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/line-break-after-question-mark_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/offsetForPosition-cluster-at-zero_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/remove-zero-length-run_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-ltr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-pixel_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-rtl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-vertical_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-webfont_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/text-combine-shrink-to-fit_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/tokenizer/entities_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/tokenizer/entities_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/tokenizer/entities_t03: RuntimeError # Please triage this failure
+LayoutTests/fast/transforms/bounding-rect-zoom_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/transforms/hit-test-large-scale_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/anchor_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/file-http-base_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/file_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/host-lowercase-per-scheme_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/host_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/idna2003_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/idna2008_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/invalid-urls-utf8_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/ipv4_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/ipv6_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/path_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/port_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/query_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/relative-unix_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/relative-win_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/relative_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/safari-extension_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/segments-from-data-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/segments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/standard-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/auto-sizing-orthogonal-flows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/positionForPoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/table-hit-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/vertical-font-vmtx-units-per-em_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-get_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-html-document-responsetype-quirks_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-text-responsetype_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-arraybuffer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-before-open-sync-request_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-sync-request_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Borrowed/cz_20030217_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Borrowed/namespace-nodes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_node_test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_node_test_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/ambiguous-operators_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/attr-namespace_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/ensure-null-namespace_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/implicit-node-args_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/invalid-resolver_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/node-name-case-sensitivity_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/node-name-case-sensitivity_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/position_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/axes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/data_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/expressions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/paths_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/reverse-axes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xsl/default-html_t01: RuntimeError # Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: RuntimeError # Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: RuntimeError # Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: RuntimeError # Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: RuntimeError # Please triage this failure
+LibTest/core/double/roundToDouble_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/double/round_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/int/compareTo_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/int/operator_left_shift_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/int/operator_remainder_A01_t03: RuntimeError # Please triage this failure
+LibTest/core/int/operator_truncating_division_A01_t02: RuntimeError # Please triage this failure
+LibTest/core/int/remainder_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/int/remainder_A01_t03: RuntimeError # Please triage this failure
+LibTest/core/int/toRadixString_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: RuntimeError # Please triage this failure
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t06: RuntimeError # Please triage this failure
+LibTest/html/Document/childNodes_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Document/clone_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Document/clone_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Document/getElementsByTagName_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Document/securityPolicy_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/Element.tag_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/attributeChanged_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/borderEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/contentEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/dataset_A02_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/enteredView_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/getAttributeNS_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/getAttributeNS_A02_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/getClientRects_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/isContentEditable_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/isContentEditable_A02_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/isTagSupported_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/isTagSupported_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Element/leftView_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/marginEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/mouseWheelEvent_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/Element/onMouseWheel_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/Element/onTransitionEnd_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/paddingEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/querySelectorAll_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Element/replaceWith_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Element/tagName_A01_t03: RuntimeError # Please triage this failure
+LibTest/html/Element/transitionEndEvent_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/getAllResponseHeaders_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/getResponseHeader_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/getString_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/onError_A01_t02: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequest/request_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/responseText_A01_t02: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequest/responseType_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/setRequestHeader_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/statusText_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/status_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequestUpload/onError_A01_t02: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequestUpload/onLoad_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/IFrameElement/IFrameElement.created_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/appendHtml_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/appendHtml_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/attributeChanged_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/attributes_setter_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/blur_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/IFrameElement/borderEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/clone_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/contentWindow_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/createFragment_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/createFragment_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/createFragment_A01_t03: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/createShadowRoot_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/getClientRects_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/innerHtml_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/isContentEditable_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/leftView_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/marginEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/offsetTo_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/onMouseWheel_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/IFrameElement/onTransitionEnd_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/outerHtml_setter_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/paddingEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/querySelector_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/setInnerHtml_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/tagName_A01_t03: RuntimeError # Please triage this failure
+LibTest/html/Node/append_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Node/nodes_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Node/nodes_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Node/parent_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Node/previousNode_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/close_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/document_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A03_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A06_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/moveBy_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/moveTo_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/moveTo_A02_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/postMessage_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/postMessage_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Window/requestFileSystem_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/requestFileSystem_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Window/requestFileSystem_A02_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/resizeBy_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/resizeTo_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Float32x4List/Float32x4List.view_A06_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Int32x4/operator_OR_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/DOMEvents/approved/EventObject.after.dispatchEvenr_t01: RuntimeError # Please triage this failure
+WebPlatformTest/DOMEvents/approved/EventObject.multiple.dispatchEvent_t01: RuntimeError # Please triage this failure
+WebPlatformTest/DOMEvents/approved/ProcessingInstruction.DOMCharacterDataModified_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/DOMEvents/approved/addEventListener.optional.useCapture_t01: RuntimeError # Please triage this failure
+WebPlatformTest/Utils/test/asyncTestFail_t01: RuntimeError # Please triage this failure
+WebPlatformTest/Utils/test/asyncTestFail_t02: RuntimeError # Please triage this failure
+WebPlatformTest/Utils/test/asyncTestTimeout_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A04_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A05_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A06_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A07_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A08_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElementNS_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElementNS_A02_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElementNS_A03_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElementNS_A04_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElementNS_A05_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElement_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElement_A02_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElement_A03_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElement_A04_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElement_A05_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t02: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/isAttribute_A02_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/isAttribute_A03_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/localName_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/namespace_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/EventTarget/dispatchEvent_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/EventTarget/dispatchEvent_A02_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/EventTarget/dispatchEvent_A03_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/dom/events/type_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/DOMImplementation-createDocument_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/DOMImplementation-hasFeature_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Document-adoptNode_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Document-getElementsByTagName_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Document-importNode_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Element-childElementCount_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-appendChild_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-appendChild_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-insertBefore_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-isEqualNode_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-replaceChild_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/attributes_A04_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/attributes_A05_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A05_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A06_t03: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t03: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A08_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttribute_A03_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/ranges/Range-attributes_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/ranges/Range-comparePoint_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/ranges/Range-comparePoint_t03: RuntimeError # Please triage this failure
+WebPlatformTest/dom/ranges/Range-detach_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-imports/link-import_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-imports/link-import_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html-imports/loading-import_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/definitions/template-contents-owner-test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/innerhtml-on-templates/innerhtml_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/template-end-tag-without-start-one_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-body-context_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-context_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/creating-an-element-for-the-token/template-owner-document_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/template-element/node-document-changes_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/template-element/template-as-a-descendant_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/Document.getElementsByClassName-null_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t05: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t07: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/elements/global-attributes/dataset-delete_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/elements/global-attributes/dataset-get_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/elements/global-attributes/dataset-set_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/document-metadata/styling/LinkStyle_t01: Pass, RuntimeError # Fails on 7.1. Please triage this failure 
+WebPlatformTest/html/semantics/embedded-content/media-elements/error-codes/error_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/src_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/cues_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formaction_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/textfieldselection/selection_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setRangeText_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-button-element/button-validation_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-datalist-element/datalistelement_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-datalist-element/datalistoptions_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-form-element/form-autocomplete_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-form-element/form-elements-matches_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-form-element/form-elements-nameditem_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/color_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/date_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/datetime-local_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/datetime_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/datetime_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/email_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/hidden_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/input-textselection_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/month_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/password_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/range_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/text_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/time_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/time_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/type-change-state_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/url_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/valueMode_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/week_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-meter-element/meter_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-option-element/option-text-recurse_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-option-element/option-text-spaces_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/grouping-content/the-blockquote-element/grouping-blockquote_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/grouping-content/the-ol-element/ol.start-reflection_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/interactive-elements/the-details-element/toggleEvent_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/html/semantics/interactive-elements/the-dialog-element/dialog-close_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/interactive-elements/the-dialog-element/dialog-showModal_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/scripting-1/the-script-element/async_t11: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/scripting-1/the-script-element/script-text_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/checked_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/default_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/dir_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/disabled_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/enabled_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/focus_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/indeterminate_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/inrange-outofrange_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/link_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/valid-invalid_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/tabular-data/the-table-element/table-insertRow_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/tabular-data/the-table-element/table-rows_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/tabular-data/the-tr-element/rowIndex_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/syntax/parsing/Document.getElementsByTagName-foreign_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/syntax/serializing-html-fragments/outerHTML_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t03: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t04: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t05: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t06: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol_t00: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t02: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/elements-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-007_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-008_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-009_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-010_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-011_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-012_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-013_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-007_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-010_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t02: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-006_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t02: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-dispatch/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-dispatch/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-dispatch/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-retargeting/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-retargeting/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-retargeting/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-retargeting/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-006_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-007_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-008_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-009_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t02: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t03: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t04: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t05: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t06: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/inert-html-elements/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/composition/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/custom-pseudo-elements/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/distribution-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/nested-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/rendering-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/reprojection/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-006_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-017_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/dom-tree-accessors-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/shadow-root-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-007_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-009_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-011_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_constructor_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_constructor_t02: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_local_key_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_session_key_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_session_storagearea_t01: Pass, RuntimeError # Fails on 7.1. Please triage this failure
+WebPlatformTest/webstorage/storage_local_setitem_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/storage_session_setitem_quotaexceedederr_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/webstorage/storage_session_setitem_t01: RuntimeError # Please triage this failure
+
+[ $compiler == dart2js && $runtime == safarimobilesim ]
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A05_t02: RuntimeError # Please triage this failure
+Language/12_Expressions/17_Getter_Invocation_A07_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/alignment/parse-align-items_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/alignment/parse-align-self_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/alignment/parse-justify-self_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/backgrounds/background-repeat-computed-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/backgrounds/repeat/parsing-background-repeat_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/borders/border-image-width-numbers-computed-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/2d.composite.globalAlpha.fillPath_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/2d.fillText.gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.negative_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.veryLarge_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.verySmall_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/alpha_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-alphaImageData-behavior_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-arc-negative-radius_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-arc-zero-lineto_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-before-css_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-bezier-same-endpoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blend-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blend-solid_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-clipping_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-color-over-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-color-over-gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-color-over-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-color-over-pattern_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-fill-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-global-alpha_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-gradient-over-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-gradient-over-gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-gradient-over-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-gradient-over-pattern_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-image-over-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-image-over-gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-image-over-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-image-over-pattern_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-pattern-over-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-pattern-over-gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-pattern-over-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-pattern-over-pattern_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-transforms_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-composite-canvas_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-composite-stroke-alpha_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-composite-text-alpha_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-drawImage-scaled-copy-to-self_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-ellipse-360-winding_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-ellipse-negative-radius_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-ellipse-zero-lineto_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-ellipse_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-empty-image-pattern_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-fillStyle-no-quirks-parsing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-font-consistency_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-getImageData-invalid_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-getImageData-large-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-getImageData-largeNonintegralDimensions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-imageSmoothingEnabled-repaint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-imageSmoothingEnabled_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-invalid-fillstyle_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-invalid-strokestyle_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-large-dimensions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-large-fills_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-lineDash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-lose-restore-googol-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-lose-restore-max-int-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-putImageData_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-quadratic-same-endpoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-resetTransform_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-scale-shadowBlur_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-scale-strokePath-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-setTransform_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/draw-custom-focus-ring_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/drawImage-with-broken-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/drawImage-with-negative-source-destination_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/drawImage-with-valid-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/drawImageFromRect_withToDataURLAsSource_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/fillText-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/getPutImageDataPairTest_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/pointInPath_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/WebGLContextEvent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/array-bounds-clamping_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/attrib-location-length-limits_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/bad-arguments-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/buffer-bind-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/buffer-data-array-buffer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/canvas-2d-webgl-texture_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/canvas-resize-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/canvas-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/canvas-zero-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/compressed-tex-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias-t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/context-destroyed-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/context-lost-restored_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/context-lost_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/copy-tex-image-and-sub-image-2d_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/css-webkit-canvas-repaint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/css-webkit-canvas_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/draw-arrays-out-of-bounds_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/draw-webgl-to-canvas-2d_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/drawingbuffer-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/error-reporting_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/framebuffer-bindings-unaffected-on-resize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/framebuffer-object-attachment_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/framebuffer-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/functions-returning-strings_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/get-active-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-bind-attrib-location-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-enable-enum-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-enum-tests_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-get-calls_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-getshadersource_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-getstring_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-object-get-calls_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-pixelstorei_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-teximage_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-uniformmatrix4fv_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-vertex-attrib-zero-issues_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-vertex-attrib_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-vertexattribpointer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/glsl-conformance_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/incorrect-context-object-behaviour_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation-copies-indices_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation-crash-with-buffer-sub-data_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation-verifies-too-many-indices_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation-with-resized-buffer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/invalid-UTF-16_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/invalid-passed-params_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/is-object_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/null-object-behaviour_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/null-uniform-location_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/object-deletion-behaviour_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/oes-element-index-uint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/oes-vertex-array-object_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/point-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/premultiplyalpha-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/program-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/read-pixels-pack-alignment_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/read-pixels-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/renderbuffer-initialization_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/renderer-and-vendor-strings_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/shader-precision-format_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgb565_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba4444_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba5551_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgb565_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba4444_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba5551_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgb565_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba4444_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba5551_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgb565_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba4444_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba5551_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-uniform-binding-bugs_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-webgl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-input-validation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-sub-image-2d-bad-args_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-sub-image-2d_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-sub-image-cube-maps_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texImage2DImageDataTest_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texImageTest_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-active-bind_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-bindings-uneffected-on-resize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-color-profile_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-complete_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-npot_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-transparent-pixels-initialized_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/triangle_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/uniform-location-length-limits_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/uniform-location_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/uninitialized-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/viewport-unchanged-upon-resize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-composite-modes-repaint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-composite-modes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-depth-texture_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-exceptions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-large-texture_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-layer-update_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-specific_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-texture-binding-preserved_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-unprefixed-context-id_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-viewport-parameters-preserved_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-generated-content/malformed-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-generated-content/pseudo-element-events_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css-generated-content/pseudo-transition-event_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css-generated-content/pseudo-transition_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/auto-content-resolution-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/breadth-size-resolution-grid_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/calc-resolution-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/display-grid-set-get_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/flex-and-minmax-content-resolution-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/flex-content-resolution-columns_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/flex-content-resolution-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-auto-columns-rows-get-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-auto-flow-get-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-auto-flow-update_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-container-change-explicit-grid-recompute-child_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-border-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-border-padding-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-empty-row-column_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-min-max-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-padding-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-padding-margin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-shrink-to-fit_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-area-get-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-bad-named-area-auto-placement_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-bad-resolution-double-span_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-change-order-auto-flow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-display_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-horiz-bt_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-vert-lr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-vert-rl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-margin-resolution_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-order-auto-flow-resolution_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-template-areas-get-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/implicit-rows-auto-resolution_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/justify-self-cell_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/minmax-fixed-logical-height-only_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/minmax-fixed-logical-width-only_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-in-percent-grid_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-update_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item-update_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-resolution-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/place-cell-by-index_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/height-property-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/multicol_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/add-remove-stylesheets-at-once-minimal-recalc-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/background-position-serialize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/background-serialize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/border-image-style-length_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/button-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/checked-pseudo-selector_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/collapsed-whitespace-reattach-in-style-recalc_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/computed-offset-with-zoom_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content/content-none_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content/content-normal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content/content-quotes-01_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content/content-quotes-05_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/css-escaped-identifier_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/css-properties-case-insensitive_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/css3-nth-tokens-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/csstext-of-content-string_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/cursor-parsing-quirks_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/deprecated-flexbox-auto-min-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/display-inline-block-scrollbar_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/draggable-region-parser_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/dynamic-class-backdrop-pseudo_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/first-child-display-change-inverse_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/focus-display-block-inline_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-face-cache-bug_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-face-unicode-range-load_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-face-unicode-range-overlap-load_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-shorthand-from-longhands_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/fontface-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/fontfaceset-download-error_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/fontfaceset-events_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/fontfaceset-loadingdone_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/computed-style-font_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/computed-style-with-zoom_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/getComputedStyle-border-radius-shorthand_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/getComputedStyle-borderRadius-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/html-attr-case-sensitivity_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/id-or-class-before-stylesheet_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/inherit-initial-shorthand-values_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalid-predefined-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/detach-reattach-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/shadow-host-toggle_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/targeted-class-any-pseudo_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/targeted-class-host-pseudo_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/targeted-class-shadow-combinator_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/toggle-style-inside-shadow-root_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-alternate-stylesheet-1_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-alternate-stylesheet-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-alternate-stylesheet-3_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-alternate-stylesheet-4_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-alternate-stylesheet-5_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/media-query-recovery_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/media-rule-no-whitespace_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/modify-ua-rules-from-javascript_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parse-color-int-or-percent-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-at-rule-recovery_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-expr-error-recovery_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-object-fit_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-object-position_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-page-rule_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-selector-error-recovery_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-unexpected-eof_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-any_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-target-indirect-sibling-001_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css/pseudo-target-indirect-sibling-002_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css/readonly-pseudoclass-opera-001_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readonly-pseudoclass-opera-002_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readonly-pseudoclass-opera-003_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readonly-pseudoclass-opera-004_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readonly-pseudoclass-opera-005_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readwrite-contenteditable-recalc_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/shorthand-setProperty-important_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/sibling-selectors-dynamic_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/sticky/parsing-position-sticky_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-in-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-nested_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-scoping-nodes-different-order_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-shadow-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-with-dom-operation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-with-important-rule_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-sharing-type-and-readonly_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/stylesheet-enable-first-alternate-on-load-sheet_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/stylesheet-enable-second-alternate-link_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/webkit-keyframes-errors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/word-break-user-modify-allowed-values_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last-inherited_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-line_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-underline-position_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent-inherited_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-justify/getComputedStyle/getComputedStyle-text-justify_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/52776_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Attr/direction-attribute-set-and-cleared_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/DOMException/XPathException_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/DOMException/dispatch-event-exception_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/basic_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-strict-mode-wtih-checkbox_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-user-select-none_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-with-first-letter-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/hittest-relative-to-viewport_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/clone-node_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/createElementNS-namespace-err_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/title-property-creates-title-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/title-property-set-multiple-times_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/title-with-multiple-children_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/getBoundingClientRect-getClientRects-relative-to-viewport_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/setAttributeNS-namespace-err_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/remove-href-from-focused-anchor_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-host_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-hostname_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-pathname_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-autofocus_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-close-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-enabled_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-open_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-show-modal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/inert-does-not-match-disabled-selector_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unfocusable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unselectable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/multiple-centered-dialogs_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/non-anchored-dialog-positioning_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/show-modal-focusing-steps_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/submit-dialog-close-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/synthetic-click-inert_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDocument/active-element-gets-unforcusable_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLDocument/clone-node_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLDocument/title-get_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDocument/title-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/insertAdjacentHTML-errors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/set-inner-outer-optimization_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/spellcheck_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLFormElement/move-option-between-documents_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLImageElement/image-alt-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLImageElement/parse-src_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLInputElement/input-image-alt-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test-nonexistent_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-beforeload-recursive_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/prefetch-onerror_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/prefetch-onload_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/prefetch_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/resolve-url-on-insertion_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLMeterElement/set-meter-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLOutputElement/dom-settable-token-list_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/async-false-inside-async-false-load_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/async-inline-script_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/async-onbeforeload_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/cloneNode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/content-outlives-template-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/contentWrappers_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/cycles-in-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/cycles_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/inertContents_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/innerHTML-inert_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/innerHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/no-form-association_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/ownerDocumentXHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/ownerDocument_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/xhtml-parsing-and-serialization_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/observe-childList_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/observe-options-attributes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/observe-options-character-data_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/weak-callback-gc-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Node/initial-values_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/NodeIterator/NodeIterator-basic_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/bug-19527_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/insertNode-empty-fragment-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/mutation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-comparePoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-constructor_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-detached-exceptions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-exceptions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-expand_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-insertNode-separate-endContainer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-insertNode-splittext_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-isPointInRange_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-on-detached-node_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/surroundContents-for-detached-node_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/SelectorAPI/caseID-almost-strict_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/SelectorAPI/caseID_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/SelectorAPI/dumpNodeList-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/SelectorAPI/dumpNodeList-almost-strict_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/SelectorAPI/dumpNodeList_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/SelectorAPI/id-fastpath-almost-strict_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/SelectorAPI/id-fastpath-strict_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/css-insert-import-rule-to-shadow-stylesheets_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/detached-shadow-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/empty-shadow-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Text/next-element-sibling_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Text/previous-element-sibling_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/TreeWalker/TreeWalker-basic_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/atob-btoa_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/getMatchedCSSRules-nested-rules_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/getMatchedCSSRules-parent-stylesheets_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/window-resize-contents_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/window-resize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/window-scroll-arguments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/XMLSerializer-attribute-entities_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/XMLSerializer-attribute-namespaces_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/XMLSerializer-doctype2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/XMLSerializer-double-xmlns_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/anchor-without-content_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/assertion-on-node-removal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/attribute-namespaces-get-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/characterdata-api-arguments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/client-width-height-quirks_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/comment-not-documentElement_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/computed-style-set-property_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/createDocumentType-ownerDocument_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/createElementNS-namespace-errors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/attribute-changed-callback_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/constructor-calls-created-synchronously_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/created-callback_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/document-register-basic_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/document-register-namespace_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/document-register-on-create-callback_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/document-register-svg-extends_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/document-register-type-extensions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/element-names_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/element-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/element-upgrade_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/lifecycle-created-createElement-recursion_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/type-extension-undo-assert_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/custom/type-extensions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/unresolved-pseudoclass_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/upgrade-candidate-remove-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/dataset-xhtml_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/dataset_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/document-set-title-mutations_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/document-set-title-no-child-on-empty_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/document-set-title-no-reuse_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/elementFromPoint-scaled-scrolled_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/getElementsByClassName/014_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/getElementsByClassName/dumpNodeList_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/horizontal-scrollbar-in-rtl-doesnt-fire-onscroll_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/html-collections-named-getter-mandatory-arg_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/implementation-api-args_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/implementation-createHTMLDocument_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/importNode-unsupported-node-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/jsDevicePixelRatio_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/location-hash_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/dom/location-missing-arguments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigatorcontentutils/register-protocol-handler_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/node-iterator-with-doctype-root_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/option-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/partial-layout-non-overlay-scrollbars_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/access-document-of-detached-stylesheetlist-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/base-in-shadow-tree_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-element-api_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-element-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-element-includer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-element-outside-shadow-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-pseudo-element-css-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-pseudo-element-dynamic-attribute-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-pseudo-element-overridden_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-pseudo-element-relative-selector-css-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-pseudo-element-with-host-pseudo-class_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-reprojection-fallback-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/custom-pseudo-in-selector-api_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/distribution-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/distribution-for-event-path_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/distribution-update-recalcs-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/elementfrompoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/elements-in-frameless-document_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/event-path-not-in-document_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/event-path_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/form-in-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/get-distributed-nodes-orphan_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/get-element-by-id-in-shadow-mutation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/getComputedStyle-composed-parent-dirty_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/getelementbyid-in-orphan_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/getelementbyid-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/host-context-pseudo-class-css-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/host-pseudo-class-css-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/host-wrapper-reclaimed_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/insertion-point-list-menu-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/insertion-point-shadow-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/insertion-point-video-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/link-in-shadow-tree_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/nested-reprojection-inconsistent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/no-renderers-for-light-children_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/offsetWidth-host-style-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/olderShadowRoot_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/pseudoclass-update-checked-option_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-optgroup_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-option_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-optgroup_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-option_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/reinsert-insertion-point_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/remove-and-insert-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/remove-styles-in-shadow-crash-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/remove-styles-in-shadow-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-aware-shadow-root_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-content-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-disable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-element-inactive_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-hierarchy-exception_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-removechild-and-blur-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-root-append_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-root-js-api_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-root-node-list_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-root-text-child_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-ul-li_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowdom-dynamic-styling_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowdom-for-input-spellcheck_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowdom-for-input-type-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowdom-for-unknown-with-form_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowhost-keyframes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowroot-clonenode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowroot-host_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowroot-keyframes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/sibling-rules-dynamic-changes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/stale-distribution-after-shadow-removal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/style-insertion-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/style-of-distributed-node_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/style-sharing-sibling-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/style-sharing-styles-in-older-shadow-roots_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/suppress-mutation-events-in-shadow-characterdata_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/title-element-in-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/vertical-scrollbar-when-dir-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/xmlserializer-serialize-to-string-exception_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/crash-generated-counter_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/crash-generated-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/crash-generated-quote_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/crash-generated-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/insertAdjacentElement_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/insertAdjacentHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/recursive-layout_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/add-event-without-document_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/clipboard-clearData_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/clipboard-dataTransferItemList_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/dispatch-event-being-dispatched_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/dispatch-event-no-document_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/document-elementFromPoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-creation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-listener-html-non-html-confusion_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-on-created-document_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-on-xhr-document_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-trace_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/fire-scroll-event_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/initkeyboardevent-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/invalid-003_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/invalid-004_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/mutation-during-replace-child-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/mutation-during-replace-child_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/scroll-event-does-not-bubble_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/scroll-event-phase_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/tabindex-removal-from-focused-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/wheelevent-constructor_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/exclusions/parsing/parsing-wrap-flow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/exclusions/parsing/parsing-wrap-through_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-close-read_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-close-revoke_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-close_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-constructor_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-parts-slice-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-slice-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/file-reader-abort-in-last-progress_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/file-reader-methods-illegal-arguments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/file-reader-readystate_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/url-null_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/xhr-response-blob_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/async-operations_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/directory-entry-to-uri_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-entry-to-uri_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-from-file-entry_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-metadata-after-write_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-abort-continue_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-abort-depth_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-abort_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-empty-blob_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-events_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-gc-blob_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-truncate-extend_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-write-overlapped_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/filesystem-reference_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/filesystem-unserializable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/filesystem-uri-origin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/input-access-entries_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-copy_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-get-entry_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-get-metadata_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-get-parent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-move_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-read-directory_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-remove_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-restricted-chars_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-restricted-names_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-restricted-unicode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/read-directory-many_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/read-directory_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/simple-readonly-file-object_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/simple-readonly_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/simple-required-arguments-getdirectory_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/simple-required-arguments-getfile_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/simple-temporary_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/snapshot-file-with-gc_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/flexbox/vertical-box-form-controls_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-typeMismatch-email_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/autocomplete_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/autofocus-input-css-style-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/button-baseline-and-collapsing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/button/button-disabled-blur_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/clone-input-with-dirty-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/color/color-setrangetext_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/color/input-value-sanitization-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/control-detach-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datalist/datalist_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datalist/input-list_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-change-layout-by-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-onblur-setvalue-onfocusremoved_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/date-interactive-validation-required_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/input-date-validation-message_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/input-valueasdate-date_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/input-valueasnumber-date_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-change-layout-by-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/input-valueasdate-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/file/file-input-capture_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/focus-style-pending_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/forms/form-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-appearance-elementFromPoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-inputmode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-select-webkit-user-select-none_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-type-change3_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-value-sanitization_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-width-height-attributes-without-renderer-loaded-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/interactive-validation-assertion-by-validate-twice_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/forms/interactive-validation-attach-assertion_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/forms/interactive-validation-select-crash_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/forms/listbox-selection-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/menulist-disabled-selected-option_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/menulist-selection-reset_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/menulist-submit-without-selection_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/multiple-selected-options-innerHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/option-change-single-selected_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/option-strip-unicode-spaces_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/plaintext-mode-1_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/search-popup-crasher_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/select-clientheight-large-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/select-clientheight-with-multiple-attr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/selection-direction_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/selection-wrongtype_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/setrangetext_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/shadow-tree-exposure_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/textarea-maxlength_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/textarea-paste-newline_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/textarea-selection-preservation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/textarea-set-defaultvalue-after-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/hidden-attr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/imports/import-element-removed-flag_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/html/imports/import-events_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/select-dropdown-consistent-background-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/boundingBox-with-continuation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/continuation-inlines-inserted-in-reverse-after-block_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/inline-position-top-align_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/inline-relative-offset-boundingbox_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/inline-with-empty-inline-children_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/out-of-flow-objects-and-whitespace-after-empty-inline_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/parent-inline-element-padding-contributes-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/positioned-element-padding-contributes-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/innerHTML/innerHTML-custom-tag_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/layers/normal-flow-hit-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/lists/list-style-position-inside_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/about-blank-hash-change_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/loader/about-blank-hash-kept_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/loader/hashchange-event-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/loadInProgress_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/loader/onhashchange-attribute-listeners_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/loader/scroll-position-restored-on-back_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/scroll-position-restored-on-reload-at-load-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/stateobjects/replacestate-in-onunload_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/masking/parsing-clip-path-shape_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/masking/parsing-mask-source-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/masking/parsing-mask_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/media/matchmedium-query-api_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/media/media-query-list-syntax_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/media/media-query-list_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/media/mq-append-delete_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/media/mq-js-media-except_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/media/mq-js-media-except_t03: RuntimeError # Please triage this failure
+LayoutTests/fast/media/mq-parsing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/mediastream/RTCIceCandidate_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/mediastream/RTCPeerConnection_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/mediastream/constructors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/balance-short-trailing-empty-block_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/balance-trailing-border_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/balance-trailing-border_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/break-after-always-bottom-margin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/break-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/columns-shorthand-parsing_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/cssom-view_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/float-truncation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-above-or-below_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-end-of-column-with-line-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-end-of-column_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-float_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-gap-between-pages-flipped_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance-maxheight_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance_t07: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance_t08: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance_t09: Skip # Times out. Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance_t10: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-lr/break-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-lr/float-truncation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-rl/break-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-rl/float-truncation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-rl/image-inside-nested-blocks-with-border_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/widows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/widows_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/overflow/child-100percent-height-inside-fixed-container-with-overflow-auto_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/overflow/replaced-child-100percent-height-inside-fixed-container-with-overflow-auto_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/overflow/scrollbar-restored_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/parser/foster-parent-adopted_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/parser/fragment-parser-doctype_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/parser/innerhtml-with-prefixed-elements_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/parser/pre-first-line-break_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/available-height-for-content_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/container-width-zero_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/preferred-widths_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/table-percent-height-text-controls_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/table-percent-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/table-percent-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/ruby/ruby-line-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/scrolling/scroll-element-into-view_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-image-threshold_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-lengths_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-margin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-outside-none_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-outside_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-property-aliases_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-big-box-border-radius_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-diamond-margin-polygon_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-left_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-right_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t02: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-left_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-right_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-boundary-events_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-cancel_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-pause-resume_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-speak_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-utterance-uses-voice_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-voices_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/storage/disallowed-storage_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/storage/storage-disallowed-in-data-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/boundingclientrect-subpixel-margin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/computedstylemargin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/cssom-subpixel-precision_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/float-list-inside_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/inline-block-with-padding_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/layout-boxes-with-zoom_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/shadows-computed-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/size-of-span-with-different-positions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/getbbox_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/tabindex-focus_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/whitespace-angle_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/whitespace-integer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/whitespace-length_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/whitespace-number_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/absolute-table-percent-lengths_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/caption-orthogonal-writing-mode-sizing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/css-table-max-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/css-table-max-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/css-table-width-with-border-padding_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/fixed-table-layout-width-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/hittest-tablecell-right-edge_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/hittest-tablecell-with-borders-right-edge_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/html-table-width-max-width-constrained_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/incorrect-colgroup-span-values_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/large-shrink-wrapped-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/margins-perpendicular-containing-block_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/min-width-css-block-table_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/min-width-css-inline-table_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/table/min-width-html-block-table_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/table/min-width-html-inline-table_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/table/nested-tables-with-div-offset_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/padding-height-and-override-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/switch-table-layout-dynamic-cells_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/switch-table-layout-multiple-section_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/switch-table-layout_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows-except-overlapped_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-cell-offset-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-colgroup-present-after-table-row_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-rowspan-cell-with-empty-cell_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-sections-border-spacing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-with-content-width-exceeding-max-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-case-folding_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-russian_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-soft-hyphen_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-spaces_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/font-ligature-letter-spacing_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/text/font-ligatures-linebreak-word_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/font-ligatures-linebreak_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/glyph-reordering_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/international/cjk-segmentation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/international/iso-8859-8_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/international/listbox-width-rtl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/international/thai-offsetForPosition-inside-character_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/ipa-tone-letters_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/line-break-after-question-mark_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/line-breaks-after-hyphen-before-number_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/offsetForPosition-cluster-at-zero_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/remove-zero-length-run_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-ltr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-pixel_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-rtl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-vertical_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-webfont_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/text-combine-shrink-to-fit_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/tokenizer/entities_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/tokenizer/entities_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/tokenizer/entities_t03: RuntimeError # Please triage this failure
+LayoutTests/fast/transforms/bounding-rect-zoom_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/transforms/hit-test-large-scale_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/anchor_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/file-http-base_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/file_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/host-lowercase-per-scheme_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/host_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/idna2003_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/idna2008_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/invalid-urls-utf8_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/ipv4_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/ipv6_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/path_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/port_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/query_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/relative-unix_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/relative-win_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/relative_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/safari-extension_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/segments-from-data-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/segments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/standard-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/auto-sizing-orthogonal-flows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/table-hit-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/vertical-font-vmtx-units-per-em_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-get_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-text-responsetype_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-arraybuffer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-before-open-sync-request_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-sync-request_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-set-responsetype_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Borrowed/cz_20030217_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Borrowed/namespace-nodes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_node_test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_node_test_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/ambiguous-operators_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/attr-namespace_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/ensure-null-namespace_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/implicit-node-args_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/invalid-resolver_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/node-name-case-sensitivity_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/node-name-case-sensitivity_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/position_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/axes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/data_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/expressions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/paths_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/reverse-axes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/xpath-template-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xsl/default-html_t01: RuntimeError # Please triage this failure
+LibTest/core/List/List_A02_t01: RuntimeError # Please triage this failure
+LibTest/core/List/List_A03_t01: RuntimeError # Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: RuntimeError # Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: RuntimeError # Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: RuntimeError # Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: RuntimeError # Please triage this failure
+LibTest/core/double/roundToDouble_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/double/round_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/int/compareTo_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/int/operator_left_shift_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/int/operator_remainder_A01_t03: RuntimeError # Please triage this failure
+LibTest/core/int/operator_truncating_division_A01_t02: RuntimeError # Please triage this failure
+LibTest/core/int/remainder_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/int/remainder_A01_t03: RuntimeError # Please triage this failure
+LibTest/core/int/toRadixString_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: RuntimeError # Please triage this failure
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t06: RuntimeError # Please triage this failure
+LibTest/html/Document/childNodes_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Document/clone_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Document/clone_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Document/getElementsByTagName_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Document/securityPolicy_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/Element.tag_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/attributeChanged_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/borderEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/contentEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/dataset_A02_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/enteredView_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/getAttributeNS_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/getAttributeNS_A02_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/getBoundingClientRect_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Element/getClientRects_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/isContentEditable_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/isContentEditable_A02_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/isTagSupported_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/isTagSupported_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Element/leftView_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/marginEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/onTransitionEnd_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/paddingEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/querySelectorAll_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Element/replaceWith_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Element/tagName_A01_t03: RuntimeError # Please triage this failure
+LibTest/html/Element/transitionEndEvent_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/getAllResponseHeaders_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/getResponseHeader_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/getString_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/onError_A01_t02: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequest/request_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/responseText_A01_t02: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequest/responseType_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/responseType_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/setRequestHeader_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/statusText_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/status_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequestUpload/onError_A01_t02: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequestUpload/onLoad_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/IFrameElement/IFrameElement.created_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/appendHtml_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/appendHtml_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/attributeChanged_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/attributes_setter_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/blur_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/IFrameElement/borderEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/clone_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/contentWindow_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/createFragment_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/createFragment_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/createFragment_A01_t03: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/createShadowRoot_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/innerHtml_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/isContentEditable_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/leftView_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/marginEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/offsetTo_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/onTransitionEnd_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/outerHtml_setter_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/paddingEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/querySelector_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/setInnerHtml_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/tagName_A01_t03: RuntimeError # Please triage this failure
+LibTest/html/Node/append_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Node/nodes_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Node/nodes_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Node/parent_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Node/previousNode_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/close_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/document_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A03_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A06_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/moveBy_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/moveTo_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/moveTo_A02_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/open_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/postMessage_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/postMessage_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Window/requestFileSystem_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/requestFileSystem_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Window/requestFileSystem_A02_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/resizeBy_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/resizeTo_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Float32x4List/Float32x4List.view_A06_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Int32x4/operator_OR_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/DOMEvents/approved/EventObject.after.dispatchEvenr_t01: RuntimeError # Please triage this failure
+WebPlatformTest/DOMEvents/approved/EventObject.multiple.dispatchEvent_t01: RuntimeError # Please triage this failure
+WebPlatformTest/DOMEvents/approved/ProcessingInstruction.DOMCharacterDataModified_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/DOMEvents/approved/addEventListener.optional.useCapture_t01: RuntimeError # Please triage this failure
+WebPlatformTest/Utils/test/asyncTestFail_t01: RuntimeError # Please triage this failure
+WebPlatformTest/Utils/test/asyncTestFail_t02: RuntimeError # Please triage this failure
+WebPlatformTest/Utils/test/asyncTestTimeout_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A04_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A05_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A06_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A07_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A08_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElementNS_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElementNS_A02_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElementNS_A03_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElementNS_A04_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElementNS_A05_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElement_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElement_A02_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElement_A03_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElement_A04_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElement_A05_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t02: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/isAttribute_A02_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/isAttribute_A03_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/localName_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/namespace_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/EventTarget/dispatchEvent_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/EventTarget/dispatchEvent_A02_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/EventTarget/dispatchEvent_A03_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/dom/events/type_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/DOMImplementation-createDocumentType_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/DOMImplementation-createDocument_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/DOMImplementation-hasFeature_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Document-adoptNode_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Document-createElementNS_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Document-getElementsByTagName_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Document-importNode_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Element-childElementCount_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-appendChild_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-appendChild_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-insertBefore_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-isEqualNode_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-replaceChild_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/attributes_A04_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/attributes_A05_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A05_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A06_t03: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t03: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A08_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttribute_A03_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/ranges/Range-attributes_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/ranges/Range-comparePoint_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/ranges/Range-comparePoint_t03: RuntimeError # Please triage this failure
+WebPlatformTest/dom/ranges/Range-detach_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-imports/link-import_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-imports/link-import_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html-imports/loading-import_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/additions-to-the-steps-to-clone-a-node/template-clone-children_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/additions-to-the-steps-to-clone-a-node/templates-copy-document-owner_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/definitions/template-contents-owner-document-type_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/definitions/template-contents-owner-test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/definitions/template-contents_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/innerhtml-on-templates/innerhtml_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-foster-parenting/template-is-a-foster-parent-element_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-foster-parenting/template-is-not-a-foster-parent-element_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-body-token_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-frameset-token_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-head-token_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-html-token_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/start-tag-body_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/template-end-tag-without-start-one_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-table-insertion-mode/end-tag-table_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/appending-to-a-template/template-child-nodes_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-body-context_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-context_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-row-context_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/creating-an-element-for-the-token/template-owner-document_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/serializing-html-templates/outerhtml_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/template-element/content-attribute_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/template-element/node-document-changes_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/template-element/template-as-a-descendant_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/template-element/template-content-node-document_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/template-element/template-content_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/Document.getElementsByClassName-null_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t05: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t07: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/elements/global-attributes/dataset-delete_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/elements/global-attributes/dataset-get_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/elements/global-attributes/dataset-set_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/document-metadata/styling/LinkStyle_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/error-codes/error_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/src_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/cues_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formaction_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/textfieldselection/selection_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setRangeText_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-button-element/button-validation_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-datalist-element/datalistelement_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-datalist-element/datalistoptions_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-fieldset-element/disabled_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-form-element/form-autocomplete_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-form-element/form-elements-matches_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-form-element/form-elements-nameditem_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/color_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/date_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/datetime-local_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/datetime_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/datetime_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/email_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/hidden_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/input-textselection_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/month_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/password_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/range_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/text_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/time_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/time_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/type-change-state_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/url_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/valueMode_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/week_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-meter-element/meter_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-option-element/option-text-recurse_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-option-element/option-text-spaces_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/grouping-content/the-blockquote-element/grouping-blockquote_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/interactive-elements/the-details-element/toggleEvent_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/html/semantics/interactive-elements/the-dialog-element/dialog-close_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/interactive-elements/the-dialog-element/dialog-showModal_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/scripting-1/the-script-element/async_t11: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/scripting-1/the-script-element/script-text_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/checked_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/default_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/dir_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/disabled_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/enabled_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/focus_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/indeterminate_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/inrange-outofrange_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/link_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/valid-invalid_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/tabular-data/the-table-element/table-insertRow_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/tabular-data/the-table-element/table-rows_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/tabular-data/the-tr-element/rowIndex_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/syntax/parsing/Document.getElementsByTagName-foreign_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/syntax/serializing-html-fragments/outerHTML_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t01: Skip # Times out. Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t03: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t04: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t05: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t06: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol_t00: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t02: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/elements-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-007_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-008_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-009_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-010_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-011_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-012_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-013_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-007_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-010_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t02: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-006_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t02: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-dispatch/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-dispatch/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-dispatch/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-retargeting/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-retargeting/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-retargeting/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-retargeting/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-006_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-007_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-008_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-009_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t02: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t03: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t04: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t05: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t06: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/inert-html-elements/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/composition/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/custom-pseudo-elements/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/distribution-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/nested-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/rendering-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/reprojection/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-006_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-017_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/dom-tree-accessors-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/shadow-root-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-007_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-009_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-011_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_constructor_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_constructor_t02: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_local_key_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_session_key_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/storage_local_setitem_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/storage_session_setitem_t01: RuntimeError # Please triage this failure
+
+[ $compiler == dart2js && $runtime == ie10 ]
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A05_t02: RuntimeError # Please triage this failure
+Language/12_Expressions/17_Getter_Invocation_A07_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/alignment/parse-align-items_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/alignment/parse-align-self_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/alignment/parse-justify-self_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/animation/request-animation-frame-cancel_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/animation/request-animation-frame-cancel2_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/animation/request-animation-frame-prefix_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/backgrounds/background-position-parsing-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/backgrounds/background-repeat-computed-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/backgrounds/background-shorthand-with-backgroundSize-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/backgrounds/mask-box-image-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/backgrounds/multiple-backgrounds-computed-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/backgrounds/repeat/parsing-background-repeat_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/borders/border-color-visited_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/borders/border-image-width-negative_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/borders/border-image-width-numbers-computed-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/borders/border-width-percent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/box-shadow/box-shadow-parsing-invalid_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/2d.fillText.gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.negative_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.veryLarge_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.verySmall_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/DrawImageSinglePixelStretch_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/canvas/alpha_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-arc-negative-radius_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-as-image-incremental-repaint_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/canvas/canvas-as-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blend-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blend-solid_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-clipping_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-color-over-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-color-over-gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-color-over-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-color-over-pattern_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-fill-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-global-alpha_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-gradient-over-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-gradient-over-gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-gradient-over-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-gradient-over-pattern_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-image-over-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-image-over-gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-image-over-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-image-over-pattern_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-pattern-over-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-pattern-over-gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-pattern-over-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-pattern-over-pattern_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-transforms_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-clip-rule_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-composite-canvas_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-css-crazy_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-currentColor_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-ellipse-360-winding_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-ellipse-negative-radius_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-ellipse-zero-lineto_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-ellipse_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-empty-image-pattern_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-fill-rule_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-font-ex-units-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-getImageData-invalid_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-getImageData-large-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-getImageData-rounding_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-imageSmoothingEnabled-repaint_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/canvas/canvas-imageSmoothingEnabled_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-large-dimensions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-large-fills_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-lineDash-input-sequence_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-lineDash-invalid_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-lineDash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-lose-restore-googol-size_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/canvas/canvas-lose-restore-max-int-size_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/canvas/canvas-putImageData_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-resetTransform_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-resize-after-paint_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/canvas/canvas-scale-drawImage-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-scale-strokePath-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-setTransform_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-transforms-fillRect-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/crash-set-font_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/draw-custom-focus-ring_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/drawImage-with-bad-canvas_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/canvas/drawImage-with-valid-image_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/canvas/fallback-content_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/getPutImageDataPairTest_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/pointInPath_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/rgba-parsing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/setWidthResetAfterForcedRender_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/canvas/webgl/WebGLContextEvent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/array-bounds-clamping_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/attrib-location-length-limits_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/bad-arguments-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/buffer-bind-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/buffer-data-array-buffer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/canvas-2d-webgl-texture_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/canvas-resize-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/canvas-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/canvas-zero-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/compressed-tex-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias-t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/context-destroyed-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/context-lost-restored_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/context-lost_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/copy-tex-image-and-sub-image-2d_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/css-webkit-canvas-repaint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/css-webkit-canvas_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/draw-arrays-out-of-bounds_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/draw-webgl-to-canvas-2d_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/drawingbuffer-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/error-reporting_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/framebuffer-bindings-unaffected-on-resize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/framebuffer-object-attachment_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/framebuffer-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/functions-returning-strings_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/get-active-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-bind-attrib-location-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-enable-enum-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-enum-tests_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-get-calls_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-getshadersource_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-getstring_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-object-get-calls_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-pixelstorei_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-teximage_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-uniformmatrix4fv_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-vertex-attrib-zero-issues_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-vertex-attrib_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-vertexattribpointer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/glsl-conformance_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/incorrect-context-object-behaviour_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation-copies-indices_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation-crash-with-buffer-sub-data_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation-verifies-too-many-indices_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation-with-resized-buffer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/invalid-UTF-16_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/invalid-passed-params_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/is-object_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/null-object-behaviour_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/null-uniform-location_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/object-deletion-behaviour_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/oes-element-index-uint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/oes-vertex-array-object_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/point-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/premultiplyalpha-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/program-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/read-pixels-pack-alignment_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/read-pixels-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/renderbuffer-initialization_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/renderer-and-vendor-strings_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/shader-precision-format_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgb565_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba4444_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba5551_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgb565_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba4444_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba5551_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgb565_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba4444_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba5551_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgb565_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba4444_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba5551_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-uniform-binding-bugs_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-webgl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-input-validation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-sub-image-2d-bad-args_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-sub-image-2d_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-sub-image-cube-maps_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texImage2DImageDataTest_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texImageTest_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-active-bind_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-bindings-uneffected-on-resize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-color-profile_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-complete_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-npot_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-transparent-pixels-initialized_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/triangle_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/uniform-location-length-limits_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/uniform-location_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/uninitialized-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/viewport-unchanged-upon-resize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-composite-modes-repaint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-composite-modes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-depth-texture_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-exceptions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-large-texture_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-layer-update_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-specific_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-texture-binding-preserved_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-unprefixed-context-id_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-viewport-parameters-preserved_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/winding-enumeration_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-generated-content/block-after_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-generated-content/malformed-url_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css-generated-content/pseudo-animation-display_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css-generated-content/pseudo-element-events_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css-generated-content/pseudo-transition-event_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css-generated-content/pseudo-transition_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/auto-content-resolution-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/breadth-size-resolution-grid_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/calc-resolution-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/display-grid-set-get_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/flex-and-minmax-content-resolution-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/flex-content-resolution-columns_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/flex-content-resolution-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-auto-columns-rows-get-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-auto-flow-get-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-auto-flow-update_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-container-change-explicit-grid-recompute-child_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-border-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-border-padding-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-empty-row-column_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-min-max-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-padding-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-padding-margin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-shrink-to-fit_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-area-get-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-bad-named-area-auto-placement_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-bad-resolution-double-span_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-change-order-auto-flow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-display_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-horiz-bt_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-vert-lr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-vert-rl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-margin-resolution_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-order-auto-flow-resolution_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-template-areas-get-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/implicit-rows-auto-resolution_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/justify-self-cell_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/minmax-fixed-logical-height-only_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/minmax-fixed-logical-width-only_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-in-percent-grid_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-update_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item-update_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-resolution-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/place-cell-by-index_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/css-tables_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/height-property-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-absolutes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-blocks_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-column-flex-items_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-flex-items_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-replaced-absolutes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/multicol_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/tables_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/width-property-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/width-shrinks-avoid-floats_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/add-remove-stylesheets-at-once-minimal-recalc-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/aspect-ratio-inheritance_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/aspect-ratio-parsing-tests_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/auto-min-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/background-clip-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/background-position-serialize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/background-serialize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/border-image-null-image-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/border-image-style-length_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/border-radius-property-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/border-shorthand-initialize-longhands_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/border-start-end_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/border-width-large_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/box-sizing-backwards-compat-prefix_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/checked-pseudo-selector_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/child-selector-implicit-tbody_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/comment-before-charset-external_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/computed-offset-with-zoom_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content-language-case-insensitivity_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content-language-dynamically-added_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content-language-dynamically-removed_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content-language-mapped-to-webkit-locale_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content-language-multiple_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content-language-no-content_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content/content-none_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content/content-normal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content/content-quotes-03_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content/content-quotes-06_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/counters/complex-before_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/counters/counter-cssText_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/css-escaped-identifier_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/css-keyframe-style-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/css-keyframe-unexpected-end_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/css-properties-case-insensitive_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/css-selector-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/css3-nth-tokens-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/cssText-shorthand_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/cssom-remove-shorthand-property_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/csstext-of-content-string_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/cursor-parsing-image-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/cursor-parsing-quirks_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/cursor-parsing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/deprecated-flex-box-zero-width-intrinsic-max-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/deprecated-flexbox-auto-min-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/draggable-region-parser_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/dynamic-class-backdrop-pseudo_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/dynamic-class-pseudo-elements_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/ex-unit-with-no-x-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/first-child-display-change-inverse_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-face-cache-bug_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-face-insert-link_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-face-multiple-ranges-for-unicode-range_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-face-unicode-range-load_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-face-unicode-range-overlap-load_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-family-initial-shorthand_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-family-trailing-bracket-gunk_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-shorthand-from-longhands_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-shorthand-mix-inherit_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/fontface-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/fontfaceset-download-error_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/fontfaceset-events_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/fontfaceset-loadingdone_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/computed-style-border-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/computed-style-cross-fade_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/computed-style-font_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/computed-style-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/computed-style-select-overflow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/counterIncrement-without-counter_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/font-family-fallback-reset_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/getComputedStyle-border-image-slice_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/getComputedStyle-border-radius-shorthand_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/getComputedStyle-border-style-shorthand_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/getComputedStyle-borderRadius-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/getComputedStyle-column-rule_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/getComputedStyle-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/getComputedStyle-length-unit_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/getComputedStyle-outline-offset_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/getComputedStyle-zIndex-auto_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/getComputedStyle-zoom-and-background-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getPropertyValue-border_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getPropertyValue-clip_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getPropertyValue-column-rule_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getPropertyValue-columns_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getPropertyValue-webkit-margin-collapse_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getPropertyValue-webkit-text-stroke_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/html-attr-case-sensitivity_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/id-or-class-before-stylesheet_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/image-set-setting_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/inherit-initial-shorthand-values_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/inherited-properties-rare-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/insertRule-font-face_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/insertRule-media_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalid-hex-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalid-import-rule-insertion_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalid-predefined-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalid-rule-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/clears-invalidation-whole-tree_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/detach-reattach-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/detach-reattach_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/dynamic-selector-list-pseudo_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/invalidation-set-with-adjacent-combinators_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/shadow-host-toggle_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/targeted-class-any-pseudo_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/targeted-class-host-pseudo_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/targeted-class-id_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/targeted-class-shadow-combinator_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/targeted-class-type-selectors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/toggle-style-inside-shadow-root_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/legacy-opacity-styles_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-alternate-stylesheet-1_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-alternate-stylesheet-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-alternate-stylesheet-3_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-alternate-stylesheet-4_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-alternate-stylesheet-5_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-disabled-attr-parser_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/list-item-text-align_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/margin-start-end_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/media-query-recovery_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/modify-ua-rules-from-javascript_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/nested-at-rules_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/nested-rule-parent-sheet_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/overflow-property_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/padding-no-renderer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/padding-start-end_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parse-color-int-or-percent-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-at-rule-recovery_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-css-allowed-string-characters_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-css-escapes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-css-nonascii_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-css-nth-child_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-font-variant-ligatures_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-object-fit_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-object-position_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-page-rule_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-selector-error-recovery_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-text-rendering_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-unexpected-eof_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-webkit-font-smoothing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/percent-min-width-img-src-change_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css/percent-width-img-src-change_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css/positioned-overflow-scroll_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-any_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-default-001_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-default-002_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-default-003_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-in-range-invalid-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-in-range_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-out-of-range_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-required-optional-004_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-required-optional-005_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-required-optional-unapplied_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-target-indirect-sibling-001_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css/pseudo-target-indirect-sibling-002_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css/pseudo-valid-004_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-valid-unapplied_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readonly-pseudoclass-opera-001_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readonly-pseudoclass-opera-002_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readonly-pseudoclass-opera-003_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readonly-pseudoclass-opera-004_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readonly-pseudoclass-opera-005_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readwrite-contenteditable-recalc_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/recalc-optgroup-inherit_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/remove-attribute-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/remove-class-name_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/resize-value-compared_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/selector-text-escape_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/shadow-current-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/sheet-collection-link_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/shorthand-priority_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/shorthand-setProperty-important_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/sibling-selectors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/space-before-charset-external_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/sticky/parsing-position-sticky_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/string-quote-binary_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-in-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-nested_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-scoping-nodes-different-order_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-shadow-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-with-dom-operation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-with-important-rule_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/stylesheet-enable-first-alternate-link_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/stylesheet-enable-first-alternate-on-load-link_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/css/stylesheet-enable-first-alternate-on-load-sheet_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/stylesheet-enable-second-alternate-link_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/css/text-align-initial_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/text-align-webkit-match-parent-parse_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/text-align-webkit-match-parent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/transform-origin-parsing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/unicode-bidi-computed-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/url-with-multi-byte-unicode-escape_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/webkit-color-adjust_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/webkit-keyframes-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/webkit-keyframes-errors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/word-break-user-modify-allowed-values_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/zoom-property-parsing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last-inherited_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-line_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-underline-position_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent-inherited_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-justify/getComputedStyle/getComputedStyle-text-justify_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/52776_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/DOMException/XPathException_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/DOMException/dispatch-event-exception_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/basic_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-strict-mode-wtih-checkbox_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-user-select-none_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-with-first-letter-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/hittest-relative-to-viewport_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/replace-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/createElement-valid-names_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/createElementNS-namespace-err_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/class-name_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/client-rect-list-argument_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/getBoundingClientRect-getClientRects-relative-to-viewport_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/id-in-insert-hr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/offsetTop-table-cell_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/scrollWidth_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/setAttributeNS-namespace-err_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/anchor-ismap-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/get-href-attribute-port_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/remove-href-from-focused-anchor_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-hash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-host_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-hostname_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-pathname_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-protocol_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-search_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLBaseElement/href-attribute-resolves-with-respect-to-document_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLBaseElement/multiple-base-elements_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-autofocus_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-close-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-enabled_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-open_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-show-modal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/inert-does-not-match-disabled-selector_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unfocusable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unselectable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/multiple-centered-dialogs_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/non-anchored-dialog-positioning_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/show-modal-focusing-steps_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/submit-dialog-close-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/synthetic-click-inert_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDocument/active-element-gets-unforcusable_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLDocument/activeElement_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-before-text-node_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-child-node_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-text-form-control_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-children_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-remove-add-children_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-text-form-control-child_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-text-form-control_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-dir-value-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-empty-string_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-false-string_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-invalid-string_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-missing-ancestor-false_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-missing-ancestor-true_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-missing-parent-ancestor-missing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-missing-parent-false_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-missing-parent-true_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-true-string_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/insertAdjacentHTML-errors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/set-false_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/set-inherit-parent-false_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/set-inherit-parent-true_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/set-inner-outer-optimization_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/set-invalid-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/set-true_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/set-value-caseinsensitive_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/spellcheck_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/translate_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLFontElement/size-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLFormElement/move-option-between-documents_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLImageElement/image-alt-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLImageElement/image-loading-gc_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLImageElement/image-natural-width-height_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLImageElement/image-src-absolute-url_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLImageElement/parse-src_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLInputElement/cloned-input-checked-state_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLInputElement/input-hidden-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLInputElement/input-image-alt-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLInputElement/input-size-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLInputElement/size-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLabelElement/focus-label_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLabelElement/label-control_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test-nonexistent_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-beforeload-recursive_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-existent-and-non-existent-import_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-non-existent-import_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-onerror_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-onload-before-page-load_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-onload-stylesheet-with-import_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-onload2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/onload-completion-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/prefetch-onerror_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/prefetch-onload_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/prefetch_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/resolve-url-on-insertion_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLMeterElement/set-meter-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLObjectElement/beforeload-set-text-crash_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLOutputElement/dom-settable-token-list_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement-reset-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement-validity_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLProgressElement/set-progress-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/async-false-inside-async-false-load_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/async-inline-script_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/async-onbeforeload_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/defer-script-invalid-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/dont-load-unknown-type_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/isURLAttribute_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/remove-in-beforeload_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/remove-source_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/script-async-attr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/script-for-attribute-unexpected-execution_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/script-load-events_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLSelectElement/change-multiple-preserve-selection_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLSelectElement/named-options_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLStyleElement/programmatically-add-style-with-onerror-handler_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLStyleElement/programmatically-add-style-with-onload-handler_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLStyleElement/style-onerror-with-existent-and-non-existent-import_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLStyleElement/style-onerror_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLStyleElement/style-onload-before-page-load_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLStyleElement/style-onload2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLStyleElement/style-onload_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLTableElement/cellpadding-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/cloneNode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/content-outlives-template-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/contentWrappers_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/cycles-in-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/cycles_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/inertContents_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/innerHTML-inert_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/innerHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/no-form-association_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/ownerDocumentXHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/ownerDocument_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/xhtml-parsing-and-serialization_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/added-out-of-order_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/callback-arguments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/clear-transient-without-delivery_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/create-during-delivery_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/cross-document_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/database-callback-delivery_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/delivery-order_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/disconnect-cancel-pending_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/disconnect-transient-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/document-fragment-insertion_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/mutate-during-delivery_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/mutation-record-constructor_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/mutation-record-nullity_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/observe-attributes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/observe-characterdata_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/observe-childList_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/observe-exceptions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/observe-options-attributes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/observe-options-character-data_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/observe-subtree_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/observer-wrapper-dropoff-transient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/observer-wrapper-dropoff_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/removed-out-of-order_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/takeRecords_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/transient-gc-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/weak-callback-gc-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Node/contains-method_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Node/fragment-mutation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Node/initial-values_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/NodeIterator/NodeIterator-basic_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/NodeList/nodelist-moved-to-fragment-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/NodeList/nodelist-reachable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/13000_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/31684_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/bug-19527_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/getClientRects-character_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/insertNode-empty-fragment-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/mutation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-comparePoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-constructor_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-created-during-remove-children_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-delete-contents-event-fire-crash_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/Range/range-detached-exceptions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-exceptions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-expand_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-extractContents_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/Range/range-insertNode-separate-endContainer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-insertNode-splittext_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-isPointInRange_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-on-detached-node_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-processing-instructions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Selection/getRangeAt_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/SelectorAPI/caseID_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/SelectorAPI/caseTagX_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/SelectorAPI/dumpNodeList-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/SelectorAPI/dumpNodeList-almost-strict_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/SelectorAPI/dumpNodeList_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/css-insert-import-rule-to-shadow-stylesheets_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/detached-shadow-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/detached-style-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/detached-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/empty-shadow-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/removed-media-rule-deleted-parent-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/removed-stylesheet-rule-deleted-parent-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Text/next-element-sibling_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Text/normalize-crash-in-spell-checker_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Text/previous-element-sibling_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/TreeWalker/TreeWalker-basic_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/atob-btoa_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/getMatchedCSSRules-nested-rules_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/getMatchedCSSRules-null-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/getMatchedCSSRules-parent-stylesheets_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/getMatchedCSSRules-with-invalid-pseudo-elements_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/getMatchedCSSRules-with-pseudo-elements-complex_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/getMatchedCSSRules-with-pseudo-elements_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/invalid-protocol_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/window-resize-contents_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/window-resize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/window-scroll-arguments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/XMLSerializer-attribute-entities_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/XMLSerializer-attribute-namespaces_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/XMLSerializer-element-ns-no-reemit_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/allowed-children_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/anchor-origin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/assertion-on-node-removal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/attribute-namespaces-get-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/background-shorthand-csstext_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/blur-contenteditable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/characterdata-api-arguments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/click-method-on-html-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/client-width-height-quirks_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/clone-node-form-elements_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/computed-style-set-property_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/containerNode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/createDocumentType-ownerDocument_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/createElementNS-namespace-errors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/createElement_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/css-delete-doc_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/css-innerHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/css-insert-import-rule-twice_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/css-insert-import-rule_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/css-mediarule-functions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/css-selectorText_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/css-set-property-exception_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/css-shorthand-common-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/attribute-changed-callback_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/constructor-calls-created-synchronously_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/created-callback_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/document-register-basic_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/document-register-namespace_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/document-register-on-create-callback_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/document-register-svg-extends_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/document-register-type-extensions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/element-names_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/element-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/element-upgrade_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/invalid-type-extension-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/lifecycle-created-createElement-recursion_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/type-extensions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/unresolved-pseudoclass_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/upgrade-candidate-remove-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/dataset-xhtml_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/dataset_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/delete-contents_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/document-importNode-arguments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/document-set-title-mutations_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/document-set-title-no-reuse_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/dom-parse-serialize-display_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/dom-parse-serialize-xmldecl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/dom-parse-serialize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/focus-contenteditable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/fragment-activation-focuses-target_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/gc-image-element-2_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/gc-image-element_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/getElementById-consistency2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/getElementById-consistency3_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/getElementById-consistency4_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/getElementById-consistency5_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/getElementById-consistency_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/getElementsByClassName/010_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/getElementsByClassName/011_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/getElementsByClassName/014_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/getElementsByClassName/dumpNodeList_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/getelementsbyname-invalidation-cache_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/horizontal-scrollbar-in-rtl-doesnt-fire-onscroll_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/icon-size-property_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/image-object_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/implementation-api-args_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/implementation-createHTMLDocument_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/importNode-unsupported-node-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/importNodeHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/importNodeXML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/insert-span-into-long-text-bug-28245_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/jsDevicePixelRatio_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/length-attribute-mapping_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/location-hash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigator-userAgent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigator-vendorSub_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigatorcontentutils/register-protocol-handler_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/node-iterator-with-doctype-root_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/noscript-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/offset-position-writing-modes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/option-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/partial-layout-non-overlay-scrollbars_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/remove-body-during-body-replacement_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/serialize-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/setAttribute-using-initial-input-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/setAttributeNS-namespace-errors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/access-document-of-detached-stylesheetlist-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/base-in-shadow-tree_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-element-api_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-element-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-element-includer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-element-outside-shadow-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-pseudo-element-css-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-pseudo-element-dynamic-attribute-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-pseudo-element-overridden_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-pseudo-element-relative-selector-css-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-pseudo-element-with-host-pseudo-class_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-reprojection-fallback-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/custom-pseudo-in-selector-api_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/distribution-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/distribution-for-event-path_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/distribution-update-recalcs-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/elementfrompoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/elements-in-frameless-document_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/event-path_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/get-distributed-nodes-orphan_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/get-element-by-id-in-shadow-mutation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/getComputedStyle-composed-parent-dirty_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/getelementbyid-in-orphan_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/getelementbyid-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/host-context-pseudo-class-css-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/host-pseudo-class-css-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/host-wrapper-reclaimed_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/insertion-point-list-menu-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/insertion-point-shadow-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/insertion-point-video-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/link-in-shadow-tree_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/nested-reprojection-inconsistent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/no-renderers-for-light-children_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/offsetWidth-host-style-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/olderShadowRoot_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/pseudoclass-update-checked-option_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-optgroup_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-option_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-optgroup_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-option_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/reinsert-insertion-point_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/remove-and-insert-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/remove-styles-in-shadow-crash-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/remove-styles-in-shadow-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-aware-shadow-root_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-content-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-disable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-element-inactive_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-hierarchy-exception_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-removechild-and-blur-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-root-append_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-root-js-api_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-root-node-list_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-root-text-child_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-ul-li_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowdom-dynamic-styling_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowdom-for-input-spellcheck_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowdom-for-input-type-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowdom-for-unknown-with-form_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowhost-keyframes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowroot-clonenode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowroot-host_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowroot-keyframes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/sibling-rules-dynamic-changes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/stale-distribution-after-shadow-removal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/style-insertion-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/style-of-distributed-node_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/style-sharing-sibling-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/style-sharing-styles-in-older-shadow-roots_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/suppress-mutation-events-in-shadow-characterdata_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/title-element-in-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/subtree-modified-attributes_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/text-control-crash-on-select_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/vertical-scrollbar-when-dir-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/checkbox-selection-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/crash-generated-counter_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/crash-generated-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/crash-generated-quote_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/crash-generated-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/insertAdjacentElement_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/recursive-layout_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/encoding/css-charset-dom_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/add-event-without-document_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/change-overflow-on-overflow-change_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/clipboard-clearData_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/clipboard-dataTransferItemList-remove_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/clipboard-dataTransferItemList_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/dispatch-event-being-dispatched_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/div-focus_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/document-elementFromPoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-attributes-after-exception_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-creation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-fire-order_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-listener-html-non-html-confusion_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-listener-list-mutation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-listener-sharing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-on-created-document_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-on-xhr-document_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-trace_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/fire-scroll-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/form-onchange_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/init-message-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/initkeyboardevent-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/input-focus-no-duplicate-events_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/invalid-001_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/invalid-002_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/invalid-003_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/invalid-004_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/invalid-005_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/label-focus_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/mutation-during-append-child_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/mutation-during-insert-before_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/mutation-during-replace-child-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/mutation-during-replace-child_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/nested-event-remove-node-crash_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/overflowchanged-event-raf-timing_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/scoped/editing-commands_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/scroll-event-does-not-bubble_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/selectstart-prevent-selectall_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/submit-reset-nested-bubble_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/tabindex-removal-from-focused-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/wheelevent-constructor_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/eventsource/eventsource-attribute-listeners_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/eventsource/eventsource-constructor_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/exclusions/parsing/parsing-wrap-flow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/exclusions/parsing/parsing-wrap-through_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-close-read_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-close-revoke_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-close_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-constructor_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-parts-slice-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-slice-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/file-reader-done-reading-abort_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/files/file-reader-methods-illegal-arguments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/read-blob-as-array-buffer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/url-null_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/workers/inline-worker-via-blob-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/xhr-response-blob_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/async-operations_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/directory-entry-to-uri_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-entry-to-uri_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-from-file-entry_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-metadata-after-write_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-abort-continue_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-abort-depth_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-abort_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-empty-blob_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-events_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-gc-blob_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-truncate-extend_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-write-overlapped_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/filesystem-reference_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/filesystem-unserializable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/filesystem-uri-origin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/input-access-entries_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-copy_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-get-entry_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-get-metadata_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-get-parent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-move_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-read-directory_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-remove_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-restricted-chars_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-restricted-names_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-restricted-unicode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/read-directory-many_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/read-directory_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/simple-readonly-file-object_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/simple-readonly_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/simple-required-arguments-getdirectory_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/simple-required-arguments-getfile_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/simple-temporary_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/snapshot-file-with-gc_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/flexbox/box-orient-button_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/flexbox/child-flexing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/flexbox/flexing-overflow-scroll-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/flexbox/intrinsic-min-width-applies-with-fixed-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/flexbox/repaint-scrollbar_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/flexbox/vertical-box-form-controls_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/11423_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/4628409_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/8250_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-customError_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-patternMismatch-unsupported_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-patternMismatch_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-stepMismatch_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-tooLong-input_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-tooLong-textarea_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-typeMismatch-email_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-typeMismatch-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-valueMissing-001_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-valueMissing-003_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-valueMissing-004_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/autocomplete_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/autofocus-focus-only-once_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/forms/autofocus-opera-007_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/button-baseline-and-collapsing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/button/button-disabled-blur_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/checkValidity-001_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/checkValidity-002_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/checkValidity-handler-updates-dom_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/checkbox-click-indeterminate_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/checkbox-default-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/clone-input-with-dirty-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/color/input-value-sanitization-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/control-detach-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/cursor-position_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datalist/datalist-child-validation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datalist/datalist_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datalist/input-list_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-change-layout-by-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-onblur-setvalue-onfocusremoved_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/ValidityState-rangeOverflow-date_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/ValidityState-rangeUnderflow-date_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/ValidityState-stepMismatch-date_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/ValidityState-typeMismatch-date_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/date-input-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/date-interactive-validation-required_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/date-pseudo-classes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/input-date-validation-message_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/input-valueasdate-date_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/input-valueasnumber-date_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-change-layout-by-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/ValidityState-rangeOverflow-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/ValidityState-rangeUnderflow-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/ValidityState-stepMismatch-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/ValidityState-typeMismatch-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/datetimelocal-input-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/datetimelocal-pseudo-classes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/input-valueasdate-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/delete-text-with-invisible-br_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/enctype-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/fieldset/fieldset-disabled_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/fieldset/fieldset-elements_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/fieldset/fieldset-name_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/fieldset/fieldset-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/fieldset/validation-in-fieldset_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/file/file-input-capture_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/file/file-setrangetext_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/focus_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/form-attribute-nonexistence-form-id_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/form-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/form-dirname-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/formmethod-attribute-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/image/image-error-event-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/incremental-dom-property_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-appearance-elementFromPoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-appearance-maxlength_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-changing-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-file-set-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-implicit-length-limit_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-inputmode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-maxlength-unsupported_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-maxlength_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-selection-hidden_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-setvalue-selection_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-text-paste-maxlength_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-type-change-focusout_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-type-change3_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-value-sanitization_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-valueasnumber-unsupported_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-width-height-attributes-without-renderer-loaded-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-width-height-attributes-without-renderer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-widths_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/listbox-select-all_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/listbox-selection-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/menulist-disabled-selected-option_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/menulist-selection-reset_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/menulist-submit-without-selection_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/method-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/multiple-selected-options-innerHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/onchange-change-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/option-change-single-selected_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/option-strip-unicode-spaces_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/option-value-trim-html-spaces_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/output-reset-assertion-failed_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/parser-associated-form-removal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/paste-into-textarea_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/paste-multiline-text-input_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/plaintext-mode-1_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/radio-checkbox-restore-indeterminate_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/search-popup-crasher_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/select-change-popup-to-listbox-in-event-handler_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/forms/select-clientheight-large-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/select-clientheight-with-multiple-attr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/select-list-box-mouse-focus_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/select-max-length_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/forms/select-namedItem_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/select-reset-multiple-selections-4-single-selection_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/select-set-length-with-mutation-reorder_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/selection-direction_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/selection-start-end-readonly_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/forms/selection-wrongtype_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/setCustomValidity-existence_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/setrangetext_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/shadow-tree-exposure_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/submit-form-attributes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/textarea-maxlength_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/textarea-no-scroll-on-blur_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/textarea-paste-newline_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/forms/textarea-selection-preservation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/textarea-set-defaultvalue-after-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/textarea-trailing-newline_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/textarea-wrap-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/textfield-clone_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/update-from-element-during-editing-crash-1_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/update-from-element-during-editing-crash-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/validationMessage_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/validity-property_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/willvalidate_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/article-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/aside-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/details-add-child-1_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/details-add-child-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/details-add-details-child-1_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/details-add-details-child-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/details-click-controls_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/details-mouse-click_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/disable-style-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/draggable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/figcaption-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/figure-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/footer-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/header-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/hgroup-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/hidden-attr-dom_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/hidden-attr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/imports/import-element-removed-flag_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/html/imports/import-events_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/main-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/mark-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/range-point-in-range-for-different-documents_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/section-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/select-dropdown-consistent-background-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/boundingBox-with-continuation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/inline-position-top-align_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/inline-relative-offset-boundingbox_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/inline-with-empty-inline-children_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/out-of-flow-objects-and-whitespace-after-empty-inline_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/parent-inline-element-padding-contributes-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/positioned-element-padding-contributes-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/innerHTML/innerHTML-case_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/innerHTML/innerHTML-custom-tag_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/innerHTML/innerHTML-svg-read_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/innerHTML/innerHTML-svg-write_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/innerHTML/innerHTML-uri-resolution_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/innerHTML/javascript-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/layers/zindex-hit-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/lists/list-style-position-inside_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/about-blank-hash-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/about-blank-hash-kept_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/hashchange-event-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/loadInProgress_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/local-css-allowed-in-strict-mode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/onhashchange-attribute-listeners_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/loader/scroll-position-restored-on-back_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/loader/scroll-position-restored-on-reload-at-load-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/stateobjects/replacestate-in-onunload_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/masking/parsing-clip-path-iri_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/masking/parsing-clip-path-shape_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/masking/parsing-mask-source-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/masking/parsing-mask_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/media/media-query-list-syntax_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/media/media-query-serialization_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/media/mq-append-delete_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/media/mq-js-update-media_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/media/mq-parsing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/mediastream/RTCIceCandidate_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/mediastream/RTCPeerConnection_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/mediastream/constructors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/balance-short-trailing-empty-block_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/balance-trailing-border_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/balance-trailing-border_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/break-after-always-bottom-margin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/break-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/columns-shorthand-parsing_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/cssom-view_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/flipped-blocks-hit-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/float-truncation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/gap-non-negative_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-above-or-below_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-end-of-column-with-line-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-end-of-column_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-float_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-gap-between-pages-flipped_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-gap-between-pages_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/image-inside-nested-blocks-with-border_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/inherit-column-values_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/initial-column-values_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/inline-getclientrects_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance-images_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance-maxheight_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance_t04: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance_t07: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance_t08: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-lr/break-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-lr/float-truncation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-lr/gap-non-negative_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-lr/image-inside-nested-blocks-with-border_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-rl/break-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-rl/float-truncation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-rl/gap-non-negative_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-rl/image-inside-nested-blocks-with-border_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/widows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/zeroColumnCount_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/overflow/height-during-simplified-layout_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/overflow/overflow-rtl-vertical-origin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/overflow/replaced-child-100percent-height-inside-fixed-container-with-overflow-auto_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/overflow/scrollbar-restored_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/parser/block-nesting-cap_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/parser/foster-parent-adopted_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/parser/fragment-parser-doctype_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/parser/innerhtml-with-prefixed-elements_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/parser/pre-first-line-break_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/parser/residual-style-close-across-n-blocks_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/container-width-zero_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-table-cell-ignore-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/preferred-widths_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/table-percent-height-text-controls_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/table-percent-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/table-percent-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/ruby/parse-rp_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/ruby/ruby-line-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/scrolling/scroll-element-into-view_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/selectors/querySelector-in-range-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/selectors/querySelector-scope_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/selectors/specificity-overflow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-image-threshold_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-lengths_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-margin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-outside-none_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-outside_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-property-aliases_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-big-box-border-radius_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-diamond-margin-polygon_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-left_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-right_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-left_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-right_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-boundary-events_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-cancel_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-pause-resume_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-speak_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-utterance-uses-voice_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-voices_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/storage/disallowed-storage_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/storage/storage-disallowed-in-data-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/cssom-subpixel-precision_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/shadows-computed-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/table-cells-have-stable-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/table-rows-have-stable-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/getbbox_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/tabindex-focus_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/whitespace-angle_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/whitespace-integer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/whitespace-length_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/whitespace-number_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/anonymous-table-section-removed_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/border-changes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/caption-orthogonal-writing-mode-sizing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/css-table-max-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/css-table-max-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/css-table-width-with-border-padding_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/hittest-tablecell-right-edge_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/hittest-tablecell-with-borders-right-edge_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/large-shrink-wrapped-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/margins-perpendicular-containing-block_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/min-width-css-block-table_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/min-width-css-inline-table_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/min-width-html-block-table_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/min-width-html-inline-table_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/nested-tables-with-div-offset_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/padding-height-and-override-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/resize-table-binding-cell_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/resize-table-cell_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows-except-overlapped_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-cell-offset-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-colgroup-present-after-table-row_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-rowspan-cell-with-empty-cell_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-sections-border-spacing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-with-content-width-exceeding-max-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/td-bordercolor-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text-autosizing/vertical-writing-mode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/container-align-with-inlines_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-backwards_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-case-folding_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-hidden-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-kana_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-quotes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-russian_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-soft-hyphen_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-spaces_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/font-ligatures-linebreak-word_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/font-ligatures-linebreak_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/international/cjk-segmentation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/international/iso-8859-8_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/international/listbox-width-rtl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/international/rtl-text-wrapping_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/international/thai-offsetForPosition-inside-character_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/line-break-after-question-mark_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/offsetForPosition-cluster-at-zero_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/pre-wrap-trailing-tab_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/remove-zero-length-run_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/selection-exceptions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-ltr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-pixel_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-rtl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-vertical_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-webfont_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/text-combine-shrink-to-fit_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/window-find_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/zero-width-characters-complex-script_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/transforms/bounding-rect-zoom_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/transforms/hit-test-large-scale_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/transforms/scrollIntoView-transformed_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/transforms/topmost-becomes-bottomost-for-scrolling_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/transforms/transform-inside-overflow-scroll_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/file-http-base_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/file_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/host-lowercase-per-scheme_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/host_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/idna2003_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/idna2008_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/invalid-urls-utf8_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/ipv4_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/ipv6_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/mailto_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/path_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/port_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/query_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/relative-unix_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/relative-win_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/relative_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/safari-extension_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/segments-from-data-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/segments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/standard-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/trivial-segments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/trivial_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/auto-sizing-orthogonal-flows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/block-formatting-context_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/display-mutation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/flipped-blocks-hit-test-overflow-scroll_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/flipped-blocks-hit-test-overflow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/percentage-margins-absolute-replaced_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/percentage-margins-absolute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/percentage-padding_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/positionForPoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/table-hit-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/vertical-font-vmtx-units-per-em_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/vertical-inline-block-hittest_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-get_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-invalid-values_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-document-responsetype_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-text-responsetype_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-arraybuffer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-before-open-sync-request_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-before-open_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-sync-request_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-set-responsetype_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-withcredentials-before-open_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Borrowed/cz_20030217_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Borrowed/kd_20010423_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Borrowed/namespace-nodes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Borrowed/od_20000608_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Borrowed/rs_20010831_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Borrowed/sr_20021217_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_boolean_expr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_literal_expr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_location_path_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_node_test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_node_test_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_nodeset_expr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_numeric_expr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_predicate_list_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_step_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/ambiguous-operators_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/ancestor-axis_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/attr-namespace_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/attr-namespace_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/attribute-node-predicate_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/complex-id_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/detached-subtree-invalidate-iterator_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/empty-string-substring_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/ensure-null-namespace_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/evaluator-exceptions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/id-path_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/id-simple_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/implicit-node-args_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/invalid-resolver_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/name-null-namespace_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/nan-to-boolean_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/node-name-case-sensitivity_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/node-name-case-sensitivity_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/nodeset-duplicates_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/position_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/abbreviations_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/axes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/data_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/expressions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/paths_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/reverse-axes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/substring-after_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/substring-nan-position_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/substring-non-positive-postion_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/xpath-detached-nodes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/xpath-empty-string_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/xpath-result-eventlistener-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/xpath-template-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xsl/default-html_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xsl/extra-lf-at-end_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xsl/nbsp-in-stylesheet_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xsl/transformToFragment-XML-declaration_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xsl/xslt-fragment-in-empty-doc_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xsl/xslt-string-parameters_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xsl/xslt-transform-to-fragment-crash_t01: RuntimeError # Please triage this failure
+LibTest/async/Stream/Stream.periodic_A01_t01: Pass, RuntimeError # Please triage this failure
+LibTest/async/StreamController/StreamController.broadcast_A04_t01: RuntimeError # Please triage this failure
+LibTest/async/Timer/Timer.periodic_A01_t01: Pass, RuntimeError # Please triage this failure
+LibTest/async/Timer/Timer_A01_t01: Pass, RuntimeError # Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: RuntimeError # Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: RuntimeError # Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: RuntimeError # Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: RuntimeError # Please triage this failure
+LibTest/core/double/roundToDouble_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/double/round_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/double/toStringAsExponential_A01_t04: RuntimeError # Please triage this failure
+LibTest/core/double/toStringAsPrecision_A01_t04: RuntimeError # Please triage this failure
+LibTest/core/int/compareTo_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/int/operator_left_shift_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/int/operator_remainder_A01_t03: RuntimeError # Please triage this failure
+LibTest/core/int/operator_truncating_division_A01_t02: RuntimeError # Please triage this failure
+LibTest/core/int/remainder_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/int/remainder_A01_t03: RuntimeError # Please triage this failure
+LibTest/core/int/toRadixString_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: RuntimeError # Please triage this failure
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t04: Pass, RuntimeError # Please triage this failure
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t05: Skip # Times out. Please triage this failure
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t06: RuntimeError # Please triage this failure
+LibTest/html/Document/childNodes_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Document/clone_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Document/clone_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Document/contains_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Document/importNode_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Document/securityPolicy_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/Element.tag_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/addEventListener_A01_t04: Pass, RuntimeError # Please triage this failure
+LibTest/html/Element/attributeChanged_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/dataset_A02_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/enteredView_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/focusEvent_A01_t01: Pass, RuntimeError # Please triage this failure
+LibTest/html/Element/getAttributeNS_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/getAttributeNS_A02_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/getBoundingClientRect_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/hidden_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/isTagSupported_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/isTagSupported_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Element/leftView_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/loadEvent_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/Element/onFocus_A01_t01: Pass, RuntimeError # Please triage this failure
+LibTest/html/Element/onLoad_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/Element/ownerDocument_A01_t05: RuntimeError # Please triage this failure
+LibTest/html/Element/querySelectorAll_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Element/replaceWith_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Element/tagName_A01_t03: RuntimeError # Please triage this failure
+LibTest/html/Element/translate_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/getAllResponseHeaders_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/getResponseHeader_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/getString_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/onError_A01_t02: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequest/overrideMimeType_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/request_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/responseText_A01_t02: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequest/responseType_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/responseType_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/setRequestHeader_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/statusText_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/status_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequestUpload/onAbort_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequestUpload/onError_A01_t02: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequestUpload/onLoad_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/IFrameElement/IFrameElement.created_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/addEventListener_A01_t04: Pass, RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/appendHtml_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/appendHtml_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/attributeChanged_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/attributes_setter_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/blur_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/IFrameElement/clone_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/contains_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/contentEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/contentWindow_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/createFragment_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/createFragment_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/createFragment_A01_t03: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/createShadowRoot_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/getBoundingClientRect_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/hidden_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/innerHtml_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/leftView_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/offsetTo_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/onClick_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/IFrameElement/outerHtml_setter_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/ownerDocument_A01_t05: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/querySelector_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/setInnerHtml_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/tagName_A01_t03: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/translate_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Node/addEventListener_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/Node/addEventListener_A01_t03: Skip # Times out. Please triage this failure
+LibTest/html/Node/addEventListener_A01_t04: Skip # Times out. Please triage this failure
+LibTest/html/Node/addEventListener_A01_t05: Skip # Times out. Please triage this failure
+LibTest/html/Node/append_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Node/contains_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Node/contains_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Node/nodes_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Node/nodes_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Node/ownerDocument_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Node/parent_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Node/previousNode_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Node/removeEventListener_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/Node/removeEventListener_A01_t02: Skip # Times out. Please triage this failure
+LibTest/html/Window/animationFrame_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/Window/close_A01_t01: Pass, RuntimeError # Please triage this failure
+LibTest/html/Window/document_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A02_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A03_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A03_t02: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A04_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A05_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A06_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A07_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/moveBy_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/moveTo_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/moveTo_A02_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/postMessage_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/postMessage_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Window/requestFileSystem_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/requestFileSystem_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Window/requestFileSystem_A02_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/resizeBy_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/resizeTo_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/ByteData/ByteData.view_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/ByteData/offsetInBytes_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Float32x4List/Float32x4List.view_A06_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Int32x4/operator_OR_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.fromList_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.fromList_A01_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.view_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.view_A01_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.view_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.view_A03_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.view_A04_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/Uint8ClampedList_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/Uint8ClampedList_A01_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/addAll_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/add_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/any_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/asMap_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/asMap_A01_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/asMap_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/buffer_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/buffer_A01_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/clear_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/contains_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/elementAt_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/elementAt_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/elementSizeInBytes_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/elementSizeInBytes_A01_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/every_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/expand_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/fillRange_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/fillRange_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/firstWhere_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/firstWhere_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/firstWhere_A03_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/first_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/first_A01_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/first_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/first_A03_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/fold_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/forEach_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/getRange_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/getRange_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/getRange_A03_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/getRange_A04_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/hashCode_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/hashCode_A01_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/indexOf_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/indexOf_A01_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/indexOf_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/indexOf_A03_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/insertAll_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/insert_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/isEmpty_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/isEmpty_A01_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/isNotEmpty_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/isNotEmpty_A01_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/iterator_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/iterator_A01_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/iterator_current_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/iterator_moveNext_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/join_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/join_A01_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/lastIndexOf_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/lastIndexOf_A01_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/lastIndexOf_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/lastIndexOf_A03_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/lastWhere_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/lastWhere_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/lastWhere_A03_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/last_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/last_A01_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/last_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/lengthInBytes_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/lengthInBytes_A01_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/length_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/length_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/map_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/map_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/map_A03_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/offsetInBytes_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/offsetInBytes_A01_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/operator_equality_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/operator_subscript_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/operator_subscript_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/operator_subscripted_assignment_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/operator_subscripted_assignment_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/reduce_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/reduce_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/removeAt_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/removeLast_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/removeRange_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/removeWhere_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/remove_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/replaceRange_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/retainWhere_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/reversed_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/reversed_A01_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/runtimeType_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/runtimeType_A01_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/setAll_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/setAll_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/setAll_A03_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/setRange_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/setRange_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/setRange_A03_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/setRange_A04_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/singleWhere_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/singleWhere_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/singleWhere_A02_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/single_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/single_A01_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/single_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/single_A02_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/skipWhile_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/skipWhile_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/skipWhile_A03_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/skipWhile_A04_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/skip_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/skip_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/skip_A03_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/sort_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/sublist_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/sublist_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/sublist_A03_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/sublist_A03_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/takeWhile_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/takeWhile_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/takeWhile_A03_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/takeWhile_A04_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/take_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/take_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/take_A03_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/toList_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/toList_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/toList_A02_t02: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/toSet_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/toString_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/where_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/where_A02_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint8ClampedList/where_A03_t01: RuntimeError # Please triage this failure
+WebPlatformTest/DOMEvents/approved/ProcessingInstruction.DOMCharacterDataModified_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/DOMEvents/approved/addEventListener.optional.useCapture_t01: RuntimeError # Please triage this failure
+WebPlatformTest/Utils/test/asyncTestFail_t01: RuntimeError # Please triage this failure
+WebPlatformTest/Utils/test/asyncTestFail_t02: RuntimeError # Please triage this failure
+WebPlatformTest/Utils/test/asyncTestTimeout_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A04_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A05_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A06_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A07_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A08_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElementNS_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElementNS_A02_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElementNS_A03_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElementNS_A04_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElementNS_A05_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElement_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElement_A02_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElement_A03_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElement_A04_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElement_A05_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t02: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/isAttribute_A02_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/isAttribute_A03_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/localName_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/namespace_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/EventTarget/dispatchEvent_A02_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/events/defaultPrevented_A01_t05: RuntimeError # Please triage this failure
+WebPlatformTest/dom/events/type_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/CharacterData/deleteData_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Comment-constructor_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/DOMImplementation-createDocumentType_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/DOMImplementation-createDocument_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/DOMImplementation-hasFeature_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Document-adoptNode_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Document-createElementNS_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Document-getElementsByTagName_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Document-importNode_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Element-childElementCount_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-appendChild_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-appendChild_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-insertBefore_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-isEqualNode_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-nodeName_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-parentElement_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-replaceChild_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-textContent_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/attributes_A04_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/attributes_A05_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/attributes_A06_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A05_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A06_t03: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t03: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A08_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttribute_A03_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttribute_A04_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/ranges/Range-attributes_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/ranges/Range-comparePoint_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/ranges/Range-comparePoint_t03: RuntimeError # Please triage this failure
+WebPlatformTest/dom/ranges/Range-detach_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-imports/link-import_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-imports/link-import_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html-imports/loading-import_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/additions-to-the-steps-to-clone-a-node/template-clone-children_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/additions-to-the-steps-to-clone-a-node/templates-copy-document-owner_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/definitions/template-contents-owner-document-type_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/definitions/template-contents-owner-test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/definitions/template-contents_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/innerhtml-on-templates/innerhtml_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-foster-parenting/template-is-a-foster-parent-element_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-foster-parenting/template-is-not-a-foster-parent-element_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-body-token_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-frameset-token_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-head-token_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-html-token_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/start-tag-body_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-table-insertion-mode/end-tag-table_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/appending-to-a-template/template-child-nodes_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-body-context_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-context_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-row-context_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/creating-an-element-for-the-token/template-owner-document_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/serializing-html-templates/outerhtml_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/template-element/content-attribute_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/template-element/node-document-changes_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/template-element/template-as-a-descendant_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/template-element/template-content-node-document_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/template-element/template-content_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/Document.getElementsByClassName-null_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t05: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t07: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t03: Skip # Times out. Please triage this failure
+WebPlatformTest/html/dom/elements/global-attributes/dataset-delete_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/elements/global-attributes/dataset-get_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/elements/global-attributes/dataset-set_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/disabled-elements/disabledElement_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/document-metadata/styling/LinkStyle_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/error-codes/error_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLMediaElement/addTextTrack_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/kind_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/label_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/readyState_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/src_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/srclang_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/cues_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/kind_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formaction_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/textfieldselection/selection-not-application-textarea_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/textfieldselection/selection_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setRangeText_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setSelectionRange_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-button-element/button-validation_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-datalist-element/datalistoptions_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-fieldset-element/HTMLFieldSetElement_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-fieldset-element/disabled_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-form-element/form-autocomplete_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-form-element/form-elements-matches_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-form-element/form-elements-nameditem_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/color_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/date_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/datetime-local_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/datetime_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/datetime_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/email_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/hidden_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/input-textselection_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/month_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/password_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/range_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/text_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/time_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/time_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/type-change-state_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/url_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/valueMode_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/week_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-meter-element/meter_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-option-element/option-text-recurse_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-option-element/option-text-spaces_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-output-element/output_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/grouping-content/the-blockquote-element/grouping-blockquote_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/grouping-content/the-li-element/grouping-li_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/grouping-content/the-ol-element/ol.start-reflection_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/interactive-elements/the-details-element/toggleEvent_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/interactive-elements/the-dialog-element/dialog-close_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/interactive-elements/the-dialog-element/dialog-showModal_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/scripting-1/the-script-element/async_t11: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/scripting-1/the-script-element/script-text_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/checked_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/default_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/dir_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/disabled_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/enabled_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/indeterminate_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/inrange-outofrange_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/link_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/valid-invalid_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/tabular-data/the-table-element/border_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/tabular-data/the-table-element/createTBody_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/tabular-data/the-table-element/table-insertRow_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/tabular-data/the-table-element/table-rows_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/tabular-data/the-tr-element/rowIndex_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/syntax/parsing/Document.getElementsByTagName-foreign_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/syntax/serializing-html-fragments/outerHTML_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t03: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t04: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t05: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t06: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol_t00: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t02: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/elements-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-007_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-008_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-009_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-010_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-011_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-012_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-013_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-007_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-010_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t02: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-006_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t02: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-dispatch/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-dispatch/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-dispatch/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-retargeting/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-retargeting/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-retargeting/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-retargeting/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-006_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-007_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-008_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-009_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t02: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t03: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t04: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t05: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t06: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/inert-html-elements/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/composition/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/custom-pseudo-elements/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/distribution-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/nested-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/rendering-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/reprojection/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-006_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-017_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/dom-tree-accessors-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/shadow-root-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-007_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-009_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-011_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_constructor_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_constructor_t02: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_local_key_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_local_newvalue_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_local_oldvalue_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_local_storageeventinit_t01: Pass, RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_local_url_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_session_key_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_session_newvalue_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_session_oldvalue_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_session_storagearea_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_session_url_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/storage_builtins_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/storage_local_setitem_quotaexceedederr_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/webstorage/storage_local_setitem_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/storage_session_setitem_t01: RuntimeError # Please triage this failure
+
+[ $compiler == dart2js && $runtime == ie11 ]
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A05_t02: RuntimeError # Please triage this failure
+Language/12_Expressions/17_Getter_Invocation_A07_t02: RuntimeError # Please triage this failure
+Language/15_Types/5_Function_Types_A01_t03: Skip # Times out. Please triage this failure
+LayoutTests/fast/alignment/parse-align-items_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/alignment/parse-align-self_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/alignment/parse-justify-self_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/backgrounds/background-position-parsing-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/backgrounds/background-repeat-computed-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/backgrounds/background-shorthand-with-backgroundSize-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/backgrounds/mask-box-image-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/backgrounds/multiple-backgrounds-computed-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/backgrounds/repeat/parsing-background-repeat_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/borders/border-color-visited_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/borders/border-width-percent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/2d.fillText.gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.negative_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.veryLarge_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.verySmall_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/DrawImageSinglePixelStretch_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/canvas/alpha_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-arc-negative-radius_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-as-image-incremental-repaint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-as-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blend-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blend-solid_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-clipping_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-color-over-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-color-over-gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-color-over-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-color-over-pattern_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-fill-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-global-alpha_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-gradient-over-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-gradient-over-gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-gradient-over-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-gradient-over-pattern_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-image-over-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-image-over-gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-image-over-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-image-over-pattern_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-pattern-over-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-pattern-over-gradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-pattern-over-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-pattern-over-pattern_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-transforms_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-css-crazy_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-currentColor_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-ellipse-360-winding_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-ellipse-negative-radius_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-ellipse-zero-lineto_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-ellipse_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-empty-image-pattern_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-font-ex-units-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-getImageData-invalid_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-getImageData-large-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-getImageData-rounding_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-imageSmoothingEnabled-repaint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-imageSmoothingEnabled_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-large-dimensions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-large-fills_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-lineDash-input-sequence_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-lineDash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-lose-restore-googol-size_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/canvas/canvas-lose-restore-max-int-size_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/canvas/canvas-putImageData_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-resetTransform_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-scale-drawImage-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-scale-strokePath-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-setTransform_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-toDataURL-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-transforms-fillRect-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/crash-set-font_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/draw-custom-focus-ring_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/drawImage-with-valid-image_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/canvas/getPutImageDataPairTest_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/pointInPath_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/rgba-parsing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/WebGLContextEvent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/array-bounds-clamping_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/attrib-location-length-limits_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/bad-arguments-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/buffer-data-array-buffer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/canvas-2d-webgl-texture_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/canvas-zero-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias-t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/context-destroyed-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/context-lost-restored_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/context-lost_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/copy-tex-image-and-sub-image-2d_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/css-webkit-canvas-repaint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/css-webkit-canvas_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/draw-arrays-out-of-bounds_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/draw-webgl-to-canvas-2d_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/drawingbuffer-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/error-reporting_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/framebuffer-bindings-unaffected-on-resize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/framebuffer-object-attachment_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/framebuffer-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/functions-returning-strings_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/get-active-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-bind-attrib-location-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-getstring_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-object-get-calls_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-pixelstorei_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-teximage_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-uniformmatrix4fv_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-vertex-attrib-zero-issues_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/glsl-conformance_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/incorrect-context-object-behaviour_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation-copies-indices_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation-verifies-too-many-indices_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation-with-resized-buffer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/index-validation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/invalid-passed-params_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/null-object-behaviour_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/null-uniform-location_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/object-deletion-behaviour_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/oes-element-index-uint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/point-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/premultiplyalpha-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/program-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/read-pixels-pack-alignment_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/read-pixels-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/renderer-and-vendor-strings_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgb565_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba4444_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba5551_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgb565_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba4444_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba5551_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgb565_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba4444_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba5551_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgb565_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba4444_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba5551_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-uniform-binding-bugs_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-webgl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-input-validation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-sub-image-2d-bad-args_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-sub-image-2d_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-sub-image-cube-maps_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texImage2DImageDataTest_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texImageTest_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-active-bind_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-bindings-uneffected-on-resize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-color-profile_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-complete_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-npot_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/texture-transparent-pixels-initialized_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/triangle_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/uniform-location-length-limits_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/uniform-location_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/uninitialized-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/viewport-unchanged-upon-resize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-composite-modes-repaint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-composite-modes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-depth-texture_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-large-texture_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-specific_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-texture-binding-preserved_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/webgl-unprefixed-context-id_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/winding-enumeration_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-generated-content/block-after_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-generated-content/malformed-url_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css-generated-content/pseudo-animation-display_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css-generated-content/pseudo-element-events_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css-generated-content/pseudo-transition-event_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css-generated-content/pseudo-transition_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/auto-content-resolution-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/breadth-size-resolution-grid_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/calc-resolution-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/display-grid-set-get_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/flex-and-minmax-content-resolution-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/flex-content-resolution-columns_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/flex-content-resolution-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-auto-columns-rows-get-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-auto-flow-get-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-auto-flow-update_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-container-change-explicit-grid-recompute-child_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-border-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-border-padding-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-empty-row-column_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-min-max-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-padding-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-padding-margin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-element-shrink-to-fit_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-area-get-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-bad-named-area-auto-placement_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-bad-resolution-double-span_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-change-order-auto-flow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-display_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-horiz-bt_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-vert-lr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-vert-rl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-margin-resolution_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-item-order-auto-flow-resolution_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/grid-template-areas-get-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/implicit-rows-auto-resolution_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/justify-self-cell_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/minmax-fixed-logical-height-only_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/minmax-fixed-logical-width-only_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-in-percent-grid_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-update_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item-update_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/percent-resolution-grid-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-grid-layout/place-cell-by-index_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/css-tables_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/height-property-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-absolutes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-blocks_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-column-flex-items_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-flex-items_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-replaced-absolutes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/multicol_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/tables_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/width-property-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css-intrinsic-dimensions/width-shrinks-avoid-floats_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/add-remove-stylesheets-at-once-minimal-recalc-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/aspect-ratio-inheritance_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/aspect-ratio-parsing-tests_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/auto-min-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/background-clip-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/background-position-serialize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/background-serialize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/border-image-null-image-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/border-image-style-length_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/border-radius-property-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/border-shorthand-initialize-longhands_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/border-start-end_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/border-width-large_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/box-sizing-backwards-compat-prefix_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/checked-pseudo-selector_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/child-selector-implicit-tbody_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/comment-before-charset-external_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/computed-offset-with-zoom_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content-language-case-insensitivity_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content-language-dynamically-added_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content-language-dynamically-removed_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content-language-mapped-to-webkit-locale_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content-language-multiple_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content-language-no-content_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content/content-none_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content/content-normal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content/content-quotes-03_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/content/content-quotes-06_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/counters/complex-before_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/counters/counter-cssText_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/css-escaped-identifier_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/css-keyframe-style-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/css-keyframe-unexpected-end_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/css-properties-case-insensitive_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/css-selector-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/css3-nth-tokens-script_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css/css3-nth-tokens-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/cssText-shorthand_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/cssom-remove-shorthand-property_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/csstext-of-content-string_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/cursor-parsing-image-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/cursor-parsing-quirks_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/cursor-parsing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/deprecated-flex-box-zero-width-intrinsic-max-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/deprecated-flexbox-auto-min-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/draggable-region-parser_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/dynamic-class-backdrop-pseudo_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/dynamic-class-pseudo-elements_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/ex-unit-with-no-x-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/first-child-display-change-inverse_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-face-cache-bug_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-face-multiple-ranges-for-unicode-range_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-face-unicode-range-load_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-face-unicode-range-overlap-load_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-family-initial-shorthand_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-family-trailing-bracket-gunk_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-shorthand-from-longhands_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-shorthand-mix-inherit_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/fontface-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/fontfaceset-download-error_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/fontfaceset-events_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/fontfaceset-loadingdone_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/computed-style-border-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/computed-style-cross-fade_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/computed-style-font_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/computed-style-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/computed-style-select-overflow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/counterIncrement-without-counter_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/font-family-fallback-reset_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/getComputedStyle-border-radius-shorthand_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/getComputedStyle-border-style-shorthand_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/getComputedStyle-borderRadius-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/getComputedStyle-column-rule_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/getComputedStyle-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/getComputedStyle-length-unit_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/getComputedStyle-outline-offset_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/getComputedStyle-zIndex-auto_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getComputedStyle/getComputedStyle-zoom-and-background-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getPropertyValue-border_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getPropertyValue-clip_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getPropertyValue-column-rule_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getPropertyValue-columns_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getPropertyValue-webkit-margin-collapse_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getPropertyValue-webkit-text-stroke_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/html-attr-case-sensitivity_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/id-or-class-before-stylesheet_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/image-set-setting_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/inherit-initial-shorthand-values_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/inherited-properties-rare-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/insertRule-font-face_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/insertRule-media_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalid-hex-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalid-import-rule-insertion_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalid-predefined-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalid-rule-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/clears-invalidation-whole-tree_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/detach-reattach-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/detach-reattach_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/dynamic-selector-list-pseudo_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/invalidation-set-with-adjacent-combinators_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/shadow-host-toggle_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/targeted-class-any-pseudo_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/targeted-class-host-pseudo_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/targeted-class-id_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/targeted-class-shadow-combinator_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/targeted-class-type-selectors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalidation/toggle-style-inside-shadow-root_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/legacy-opacity-styles_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-alternate-stylesheet-1_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-alternate-stylesheet-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-alternate-stylesheet-3_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-alternate-stylesheet-4_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-alternate-stylesheet-5_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/link-disabled-attr-parser_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/list-item-text-align_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/margin-start-end_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/max-device-aspect-ratio_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/css/media-query-recovery_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/modify-ua-rules-from-javascript_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/nested-at-rules_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/nested-rule-parent-sheet_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/overflow-property_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/padding-no-renderer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/padding-start-end_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parse-color-int-or-percent-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-at-rule-recovery_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-css-allowed-string-characters_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-css-escapes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-css-nonascii_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-css-nth-child_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-font-variant-ligatures_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-object-fit_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-object-position_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-page-rule_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-selector-error-recovery_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-text-rendering_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-unexpected-eof_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-webkit-font-smoothing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/percent-min-width-img-src-change_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css/percent-width-img-src-change_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css/positioned-overflow-scroll_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-any_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-default-001_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-default-002_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-default-003_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-in-range-invalid-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-in-range_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-out-of-range_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-required-optional-004_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-required-optional-005_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-required-optional-unapplied_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-target-indirect-sibling-001_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css/pseudo-target-indirect-sibling-002_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css/pseudo-valid-004_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/pseudo-valid-unapplied_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readonly-pseudoclass-opera-001_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readonly-pseudoclass-opera-002_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readonly-pseudoclass-opera-003_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readonly-pseudoclass-opera-004_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readonly-pseudoclass-opera-005_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/readwrite-contenteditable-recalc_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/recalc-optgroup-inherit_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/remove-attribute-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/remove-class-name_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/resize-value-compared_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/selector-text-escape_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/shadow-current-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/sheet-collection-link_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/shorthand-priority_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/shorthand-setProperty-important_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/sibling-selectors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/space-before-charset-external_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/sticky/parsing-position-sticky_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/string-quote-binary_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-in-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-nested_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-scoping-nodes-different-order_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-shadow-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-with-dom-operation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-scoped/style-scoped-with-important-rule_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/stylesheet-enable-first-alternate-link_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/stylesheet-enable-first-alternate-on-load-link_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/stylesheet-enable-first-alternate-on-load-sheet_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/css/stylesheet-enable-second-alternate-link_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/css/text-align-initial_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/text-align-webkit-match-parent-parse_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/text-align-webkit-match-parent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/transform-origin-parsing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/unicode-bidi-computed-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/url-with-multi-byte-unicode-escape_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/webkit-color-adjust_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/webkit-keyframes-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/webkit-keyframes-errors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/word-break-user-modify-allowed-values_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/zoom-property-parsing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last-inherited_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-line_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-underline-position_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent-inherited_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css3-text/css3-text-justify/getComputedStyle/getComputedStyle-text-justify_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/52776_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/DOMException/XPathException_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/DOMException/dispatch-event-exception_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/basic_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-strict-mode-wtih-checkbox_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-user-select-none_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-with-first-letter-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/hittest-relative-to-viewport_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/replace-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/createElement-valid-names_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Document/createElementNS-namespace-err_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/class-name_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/client-rect-list-argument_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/getBoundingClientRect-getClientRects-relative-to-viewport_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/id-in-insert-hr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/offsetTop-table-cell_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/scrollWidth_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/setAttributeNS-namespace-err_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/anchor-ismap-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/get-href-attribute-port_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/remove-href-from-focused-anchor_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-hash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-host_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-hostname_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-pathname_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-protocol_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-search_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLBaseElement/href-attribute-resolves-with-respect-to-document_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLBaseElement/multiple-base-elements_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-autofocus_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-close-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-enabled_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-open_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-show-modal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/inert-does-not-match-disabled-selector_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unfocusable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unselectable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/multiple-centered-dialogs_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/non-anchored-dialog-positioning_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/show-modal-focusing-steps_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/submit-dialog-close-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/synthetic-click-inert_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDocument/active-element-gets-unforcusable_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLDocument/activeElement_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-before-text-node_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-child-node_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-text-form-control_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-children_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-remove-add-children_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-text-form-control-child_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-text-form-control_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-dir-value-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-empty-string_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-false-string_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-invalid-string_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-missing-ancestor-false_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-missing-ancestor-true_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-missing-parent-ancestor-missing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-missing-parent-false_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-missing-parent-true_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/attr-true-string_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/insertAdjacentHTML-errors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/set-false_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/set-inherit-parent-false_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/set-inherit-parent-true_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/set-inner-outer-optimization_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/set-invalid-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/set-true_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/set-value-caseinsensitive_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/spellcheck_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLElement/translate_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLFontElement/size-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLFormElement/move-option-between-documents_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLImageElement/image-alt-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLImageElement/image-loading-gc_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLImageElement/image-natural-width-height_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLImageElement/image-src-absolute-url_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLImageElement/parse-src_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLInputElement/input-hidden-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLInputElement/input-image-alt-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLInputElement/input-size-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLInputElement/size-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLabelElement/focus-label_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLabelElement/label-control_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test-nonexistent_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-beforeload-recursive_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-existent-and-non-existent-import_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-non-existent-import_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-onerror_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-onload-before-page-load_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-onload-stylesheet-with-import_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/link-onload2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/onload-completion-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/prefetch-onerror_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/prefetch-onload_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/prefetch_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLLinkElement/resolve-url-on-insertion_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLMeterElement/set-meter-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLObjectElement/beforeload-set-text-crash_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLOutputElement/dom-settable-token-list_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement-reset-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement-validity_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLProgressElement/set-progress-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/async-false-inside-async-false-load_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/async-inline-script_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/async-onbeforeload_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/defer-script-invalid-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/dont-load-unknown-type_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/isURLAttribute_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/remove-in-beforeload_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/remove-source_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/script-async-attr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/script-for-attribute-unexpected-execution_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/script-load-events_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLSelectElement/change-multiple-preserve-selection_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLSelectElement/named-options_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLStyleElement/programmatically-add-style-with-onerror-handler_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLStyleElement/programmatically-add-style-with-onload-handler_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLStyleElement/style-onerror-with-existent-and-non-existent-import_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLStyleElement/style-onerror_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLStyleElement/style-onload-before-page-load_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLStyleElement/style-onload2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLStyleElement/style-onload_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/HTMLTableElement/cellpadding-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/cloneNode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/content-outlives-template-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/contentWrappers_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/cycles-in-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/cycles_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/inertContents_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/innerHTML-inert_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/innerHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/no-form-association_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/ownerDocumentXHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/ownerDocument_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTemplateElement/xhtml-parsing-and-serialization_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/database-callback-delivery_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/observe-attributes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/observe-characterdata_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/observe-childList_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/observe-options-attributes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/observe-options-character-data_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/removed-out-of-order_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/MutationObserver/weak-callback-gc-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Node/contains-method_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Node/fragment-mutation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Node/initial-values_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/NodeIterator/NodeIterator-basic_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/NodeList/nodelist-moved-to-fragment-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/NodeList/nodelist-reachable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/13000_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/31684_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/bug-19527_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/getClientRects-character_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/insertNode-empty-fragment-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/mutation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-comparePoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-constructor_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-created-during-remove-children_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-delete-contents-event-fire-crash_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/Range/range-detached-exceptions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-exceptions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-expand_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-extractContents_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/Range/range-insertNode-separate-endContainer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-insertNode-splittext_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-isPointInRange_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-on-detached-node_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-processing-instructions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Selection/getRangeAt_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/SelectorAPI/caseID_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/SelectorAPI/caseTagX_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/SelectorAPI/dumpNodeList-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/SelectorAPI/dumpNodeList-almost-strict_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/SelectorAPI/dumpNodeList_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/css-insert-import-rule-to-shadow-stylesheets_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/detached-shadow-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/detached-style-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/detached-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/empty-shadow-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/removed-media-rule-deleted-parent-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/removed-stylesheet-rule-deleted-parent-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Text/next-element-sibling_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Text/normalize-crash-in-spell-checker_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Text/previous-element-sibling_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/TreeWalker/TreeWalker-basic_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/atob-btoa_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/getMatchedCSSRules-nested-rules_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/getMatchedCSSRules-null-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/getMatchedCSSRules-parent-stylesheets_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/getMatchedCSSRules-with-invalid-pseudo-elements_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/getMatchedCSSRules-with-pseudo-elements-complex_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/getMatchedCSSRules-with-pseudo-elements_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/invalid-protocol_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/window-resize-contents_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/window-resize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/window-scroll-arguments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/XMLSerializer-attribute-entities_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/XMLSerializer-attribute-namespaces_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/XMLSerializer-element-ns-no-reemit_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/allowed-children_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/anchor-origin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/assertion-on-node-removal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/attribute-namespaces-get-set_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/background-shorthand-csstext_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/blur-contenteditable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/characterdata-api-arguments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/click-method-on-html-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/client-width-height-quirks_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/computed-style-set-property_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/containerNode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/createDocumentType-ownerDocument_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/createElementNS-namespace-errors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/createElement_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/css-delete-doc_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/css-innerHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/css-insert-import-rule-twice_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/css-insert-import-rule_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/css-mediarule-functions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/css-selectorText_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/css-set-property-exception_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/css-shorthand-common-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/attribute-changed-callback_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/constructor-calls-created-synchronously_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/created-callback_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/document-register-basic_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/document-register-namespace_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/document-register-on-create-callback_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/document-register-svg-extends_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/document-register-type-extensions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/element-names_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/element-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/element-upgrade_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/invalid-type-extension-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/lifecycle-created-createElement-recursion_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/type-extensions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/unresolved-pseudoclass_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/upgrade-candidate-remove-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/dataset-xhtml_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/dataset_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/delete-contents_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/document-importNode-arguments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/document-set-title-mutations_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/dom-parse-serialize-display_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/dom-parse-serialize-xmldecl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/dom-parse-serialize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/focus-contenteditable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/fragment-activation-focuses-target_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/gc-image-element-2_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/gc-image-element_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/getElementById-consistency2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/getElementById-consistency3_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/getElementById-consistency4_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/getElementById-consistency5_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/getElementById-consistency_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/getElementsByClassName/010_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/getElementsByClassName/011_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/getElementsByClassName/014_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/getElementsByClassName/dumpNodeList_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/getelementsbyname-invalidation-cache_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/horizontal-scrollbar-in-rtl-doesnt-fire-onscroll_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/icon-size-property_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/image-object_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/implementation-createHTMLDocument_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/importNode-unsupported-node-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/importNodeHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/importNodeXML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/insert-span-into-long-text-bug-28245_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/length-attribute-mapping_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/location-hash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigator-userAgent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigator-vendorSub_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigatorcontentutils/register-protocol-handler_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/node-iterator-with-doctype-root_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/noscript-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/offset-position-writing-modes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/option-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/partial-layout-non-overlay-scrollbars_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/remove-body-during-body-replacement_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/serialize-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/setAttribute-using-initial-input-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/setAttributeNS-namespace-errors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/access-document-of-detached-stylesheetlist-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/base-in-shadow-tree_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-element-api_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-element-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-element-includer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-element-outside-shadow-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-pseudo-element-css-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-pseudo-element-dynamic-attribute-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-pseudo-element-overridden_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-pseudo-element-relative-selector-css-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-pseudo-element-with-host-pseudo-class_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/content-reprojection-fallback-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/custom-pseudo-in-selector-api_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/distribution-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/distribution-for-event-path_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/distribution-update-recalcs-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/elementfrompoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/elements-in-frameless-document_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/event-path_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/get-distributed-nodes-orphan_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/get-element-by-id-in-shadow-mutation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/getComputedStyle-composed-parent-dirty_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/getelementbyid-in-orphan_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/getelementbyid-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/host-context-pseudo-class-css-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/host-pseudo-class-css-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/host-wrapper-reclaimed_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/insertion-point-list-menu-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/insertion-point-shadow-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/insertion-point-video-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/link-in-shadow-tree_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/nested-reprojection-inconsistent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/no-renderers-for-light-children_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/offsetWidth-host-style-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/olderShadowRoot_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/pseudoclass-update-checked-option_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-optgroup_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-option_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-optgroup_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-option_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/reinsert-insertion-point_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/remove-and-insert-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/remove-styles-in-shadow-crash-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/remove-styles-in-shadow-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-aware-shadow-root_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-content-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-disable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-element-inactive_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-hierarchy-exception_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-removechild-and-blur-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-root-append_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-root-js-api_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-root-node-list_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-root-text-child_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-ul-li_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowdom-dynamic-styling_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowdom-for-input-spellcheck_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowdom-for-input-type-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowdom-for-unknown-with-form_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowhost-keyframes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowroot-clonenode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowroot-host_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadowroot-keyframes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/sibling-rules-dynamic-changes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/stale-distribution-after-shadow-removal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/style-insertion-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/style-of-distributed-node_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/style-sharing-sibling-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/style-sharing-styles-in-older-shadow-roots_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/suppress-mutation-events-in-shadow-characterdata_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/title-element-in-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/subtree-modified-attributes_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/text-control-crash-on-select_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/vertical-scrollbar-when-dir-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/checkbox-selection-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/crash-generated-counter_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/crash-generated-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/crash-generated-quote_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/crash-generated-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/insertAdjacentElement_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dynamic/recursive-layout_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/encoding/css-charset-dom_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/add-event-without-document_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/change-overflow-on-overflow-change_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/clipboard-clearData_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/clipboard-dataTransferItemList-remove_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/clipboard-dataTransferItemList_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/dispatch-event-being-dispatched_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/div-focus_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/document-elementFromPoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-attributes-after-exception_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-creation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-fire-order_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-listener-html-non-html-confusion_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-listener-list-mutation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-listener-sharing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-on-created-document_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-on-xhr-document_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/event-trace_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/fire-scroll-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/form-onchange_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/init-message-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/initkeyboardevent-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/input-focus-no-duplicate-events_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/invalid-001_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/invalid-002_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/invalid-003_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/invalid-004_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/invalid-005_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/label-focus_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/mutation-during-append-child_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/mutation-during-insert-before_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/mutation-during-replace-child-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/mutation-during-replace-child_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/nested-event-remove-node-crash_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/overflowchanged-event-raf-timing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/scoped/editing-commands_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/scroll-during-zoom-change_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/scroll-event-does-not-bubble_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/selectstart-prevent-selectall_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/submit-reset-nested-bubble_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/tabindex-removal-from-focused-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/wheelevent-constructor_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/eventsource/eventsource-attribute-listeners_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/eventsource/eventsource-constructor_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/exclusions/parsing/parsing-wrap-flow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/exclusions/parsing/parsing-wrap-through_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-close-read_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-close-revoke_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-close_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-constructor_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-parts-slice-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-slice-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/file-reader-done-reading-abort_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/file-reader-methods-illegal-arguments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/read-blob-as-array-buffer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/url-null_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/xhr-response-blob_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/async-operations_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/directory-entry-to-uri_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-entry-to-uri_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-from-file-entry_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-metadata-after-write_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-abort-continue_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-abort-depth_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-abort_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-empty-blob_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-events_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-gc-blob_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-truncate-extend_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-write-overlapped_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/filesystem-reference_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/filesystem-unserializable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/filesystem-uri-origin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/input-access-entries_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-copy_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-get-entry_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-get-metadata_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-get-parent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-move_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-read-directory_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-remove_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-restricted-chars_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-restricted-names_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/op-restricted-unicode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/read-directory-many_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/read-directory_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/simple-readonly-file-object_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/simple-readonly_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/simple-required-arguments-getdirectory_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/simple-required-arguments-getfile_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/simple-temporary_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/snapshot-file-with-gc_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/flexbox/child-flexing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/flexbox/flexing-overflow-scroll-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/flexbox/intrinsic-min-width-applies-with-fixed-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/flexbox/repaint-scrollbar_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/flexbox/vertical-box-form-controls_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/11423_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/4628409_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/8250_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-customError_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-patternMismatch-unsupported_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-patternMismatch_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-stepMismatch_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-tooLong-input_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-tooLong-textarea_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-typeMismatch-email_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-typeMismatch-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-valueMissing-001_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-valueMissing-003_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/ValidityState-valueMissing-004_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/autocomplete_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/autofocus-focus-only-once_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/forms/autofocus-opera-007_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/button-baseline-and-collapsing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/button/button-disabled-blur_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/checkValidity-001_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/checkValidity-002_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/checkValidity-handler-updates-dom_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/checkbox-click-indeterminate_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/checkbox-default-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/clone-input-with-dirty-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/color/input-value-sanitization-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/control-detach-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/cursor-position_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datalist/datalist-child-validation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datalist/datalist_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datalist/input-list_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-change-layout-by-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-onblur-setvalue-onfocusremoved_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/ValidityState-rangeOverflow-date_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/ValidityState-rangeUnderflow-date_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/ValidityState-stepMismatch-date_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/ValidityState-typeMismatch-date_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/date-input-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/date-interactive-validation-required_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/date-pseudo-classes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/input-date-validation-message_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/input-valueasdate-date_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/date/input-valueasnumber-date_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-change-layout-by-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/ValidityState-rangeOverflow-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/ValidityState-rangeUnderflow-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/ValidityState-stepMismatch-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/ValidityState-typeMismatch-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/datetimelocal-input-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/datetimelocal-pseudo-classes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/input-valueasdate-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/delete-text-with-invisible-br_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/enctype-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/fieldset/fieldset-disabled_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/fieldset/fieldset-elements_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/fieldset/fieldset-name_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/fieldset/fieldset-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/fieldset/validation-in-fieldset_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/file/file-input-capture_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/file/file-setrangetext_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/focus_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/form-attribute-nonexistence-form-id_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/form-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/form-dirname-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/formmethod-attribute-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/image/image-error-event-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/incremental-dom-property_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-appearance-elementFromPoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-appearance-maxlength_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-changing-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-file-set-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-implicit-length-limit_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-inputmode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-maxlength-unsupported_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-maxlength_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-selection-hidden_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-setvalue-selection_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-text-paste-maxlength_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-type-change-focusout_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-type-change3_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-value-sanitization_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-valueasnumber-unsupported_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-width-height-attributes-without-renderer-loaded-image_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-widths_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/listbox-select-all_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/listbox-selection-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/menulist-disabled-selected-option_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/menulist-selection-reset_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/menulist-submit-without-selection_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/method-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/multiple-selected-options-innerHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/onchange-change-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/option-change-single-selected_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/option-strip-unicode-spaces_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/option-value-trim-html-spaces_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/output-reset-assertion-failed_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/parser-associated-form-removal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/paste-into-textarea_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/paste-multiline-text-input_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/plaintext-mode-1_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/radio-checkbox-restore-indeterminate_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/search-popup-crasher_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/select-change-popup-to-listbox-in-event-handler_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/forms/select-clientheight-large-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/select-clientheight-with-multiple-attr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/select-list-box-mouse-focus_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/select-max-length_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/forms/select-namedItem_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/select-reset-multiple-selections-4-single-selection_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/select-set-length-with-mutation-reorder_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/selection-direction_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/selection-wrongtype_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/setCustomValidity-existence_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/setrangetext_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/shadow-tree-exposure_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/submit-form-attributes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/textarea-maxlength_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/textarea-no-scroll-on-blur_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/textarea-paste-newline_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/forms/textarea-selection-preservation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/textarea-set-defaultvalue-after-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/textarea-trailing-newline_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/textarea-wrap-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/textfield-clone_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/validationMessage_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/validity-property_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/willvalidate_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/article-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/aside-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/details-add-child-1_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/details-add-child-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/details-add-details-child-1_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/details-add-details-child-2_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/details-click-controls_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/details-mouse-click_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/disable-style-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/draggable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/figcaption-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/figure-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/footer-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/header-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/hgroup-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/hidden-attr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/imports/import-element-removed-flag_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/html/imports/import-events_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/main-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/mark-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/range-point-in-range-for-different-documents_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/section-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/select-dropdown-consistent-background-color_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/boundingBox-with-continuation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/inline-position-top-align_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/inline-relative-offset-boundingbox_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/inline-with-empty-inline-children_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/out-of-flow-objects-and-whitespace-after-empty-inline_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/parent-inline-element-padding-contributes-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/positioned-element-padding-contributes-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/innerHTML/innerHTML-case_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/innerHTML/innerHTML-custom-tag_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/innerHTML/innerHTML-svg-read_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/innerHTML/innerHTML-svg-write_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/innerHTML/innerHTML-uri-resolution_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/innerHTML/javascript-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/layers/zindex-hit-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/lists/list-style-position-inside_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/about-blank-hash-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/about-blank-hash-kept_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/hashchange-event-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/loadInProgress_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/local-css-allowed-in-strict-mode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/onhashchange-attribute-listeners_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/loader/scroll-position-restored-on-back_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/scroll-position-restored-on-reload-at-load-event_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/loader/stateobjects/replacestate-in-onunload_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/masking/parsing-clip-path-iri_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/masking/parsing-clip-path-shape_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/masking/parsing-mask-source-type_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/masking/parsing-mask_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/media/media-query-list-syntax_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/media/media-query-serialization_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/media/mq-append-delete_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/media/mq-js-update-media_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/media/mq-parsing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/mediastream/RTCIceCandidate_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/mediastream/RTCPeerConnection_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/mediastream/constructors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/balance-short-trailing-empty-block_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/balance-trailing-border_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/balance-trailing-border_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/break-after-always-bottom-margin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/break-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/columns-shorthand-parsing_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/cssom-view_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/flipped-blocks-hit-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/float-truncation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/gap-non-negative_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-above-or-below_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-end-of-column-with-line-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-end-of-column_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-float_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-gap-between-pages-flipped_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/hit-test-gap-between-pages_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/image-inside-nested-blocks-with-border_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/inherit-column-values_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/initial-column-values_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/inline-getclientrects_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance-images_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance-maxheight_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance_t04: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance_t07: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance_t08: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-lr/break-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-lr/float-truncation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-lr/gap-non-negative_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-lr/image-inside-nested-blocks-with-border_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-rl/break-properties_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-rl/float-truncation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-rl/gap-non-negative_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/vertical-rl/image-inside-nested-blocks-with-border_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/widows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/zeroColumnCount_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/overflow/height-during-simplified-layout_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/overflow/overflow-rtl-vertical-origin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/overflow/replaced-child-100percent-height-inside-fixed-container-with-overflow-auto_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/overflow/scrollbar-restored_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/parser/block-nesting-cap_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/parser/foster-parent-adopted_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/parser/fragment-parser-doctype_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/parser/innerhtml-with-prefixed-elements_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/parser/pre-first-line-break_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/parser/residual-style-close-across-n-blocks_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/container-width-zero_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/preferred-widths_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/table-percent-height-text-controls_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/table-percent-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/table-percent-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/ruby/parse-rp_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/ruby/ruby-line-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/scrolling/scroll-element-into-view_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/selectors/querySelector-in-range-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/selectors/querySelector-scope_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/selectors/specificity-overflow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-image-threshold_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-lengths_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-margin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-outside-none_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-outside_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-property-aliases_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-big-box-border-radius_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-diamond-margin-polygon_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-left_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-right_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-left_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-right_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-boundary-events_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-cancel_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-pause-resume_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-speak_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-utterance-uses-voice_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-voices_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/storage/disallowed-storage_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/storage/storage-disallowed-in-data-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/cssom-subpixel-precision_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/shadows-computed-style_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/table-cells-have-stable-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/table-rows-have-stable-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/getbbox_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/tabindex-focus_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/whitespace-angle_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/whitespace-integer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/whitespace-length_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/svg/whitespace-number_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/anonymous-table-section-removed_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/border-changes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/caption-orthogonal-writing-mode-sizing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/css-table-max-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/css-table-max-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/css-table-width-with-border-padding_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/hittest-tablecell-right-edge_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/hittest-tablecell-with-borders-right-edge_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/large-shrink-wrapped-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/margins-perpendicular-containing-block_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/min-width-css-block-table_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/min-width-css-inline-table_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/min-width-html-block-table_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/min-width-html-inline-table_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/nested-tables-with-div-offset_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/padding-height-and-override-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/resize-table-binding-cell_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/resize-table-cell_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows-except-overlapped_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-cell-offset-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-colgroup-present-after-table-row_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-rowspan-cell-with-empty-cell_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-sections-border-spacing_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-with-content-width-exceeding-max-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/td-bordercolor-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text-autosizing/vertical-writing-mode_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/container-align-with-inlines_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-backwards_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-case-folding_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-hidden-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-kana_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-quotes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-russian_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-soft-hyphen_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-spaces_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/font-ligatures-linebreak-word_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/font-ligatures-linebreak_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/international/cjk-segmentation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/international/iso-8859-8_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/international/listbox-width-rtl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/international/rtl-text-wrapping_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/international/thai-offsetForPosition-inside-character_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/line-break-after-question-mark_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/offsetForPosition-cluster-at-zero_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/pre-wrap-trailing-tab_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/remove-zero-length-run_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/selection-exceptions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-ltr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-pixel_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-rtl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-vertical_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-webfont_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/text-combine-shrink-to-fit_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/window-find_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/zero-width-characters-complex-script_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/transforms/bounding-rect-zoom_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/transforms/hit-test-large-scale_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/transforms/scrollIntoView-transformed_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/transforms/topmost-becomes-bottomost-for-scrolling_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/transforms/transform-inside-overflow-scroll_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/file-http-base_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/file_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/host-lowercase-per-scheme_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/host_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/idna2003_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/idna2008_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/invalid-urls-utf8_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/ipv4_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/ipv6_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/mailto_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/path_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/port_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/query_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/relative-unix_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/relative-win_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/relative_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/safari-extension_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/segments-from-data-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/segments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/standard-url_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/trivial-segments_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/trivial_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/auto-sizing-orthogonal-flows_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/block-formatting-context_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/display-mutation_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/flipped-blocks-hit-test-overflow-scroll_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/flipped-blocks-hit-test-overflow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/percentage-margins-absolute-replaced_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/percentage-margins-absolute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/percentage-padding_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/positionForPoint_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/table-hit-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/vertical-font-vmtx-units-per-em_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/writing-mode/vertical-inline-block-hittest_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-get_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-invalid-values_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-document-responsetype_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-text-responsetype_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-arraybuffer_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-before-open-sync-request_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-before-open_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-sync-request_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-set-responsetype_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xmlhttprequest/xmlhttprequest-withcredentials-before-open_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Borrowed/cz_20030217_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Borrowed/kd_20010423_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Borrowed/namespace-nodes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Borrowed/od_20000608_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Borrowed/rs_20010831_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Borrowed/sr_20021217_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_boolean_expr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_literal_expr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_location_path_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_node_test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_node_test_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_nodeset_expr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_numeric_expr_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_predicate_list_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_step_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/ambiguous-operators_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/ancestor-axis_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/attr-namespace_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/attr-namespace_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/attribute-node-predicate_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/complex-id_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/detached-subtree-invalidate-iterator_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/empty-string-substring_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/ensure-null-namespace_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/evaluator-exceptions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/id-path_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/id-simple_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/implicit-node-args_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/invalid-resolver_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/name-null-namespace_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/nan-to-boolean_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/node-name-case-sensitivity_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/node-name-case-sensitivity_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/nodeset-duplicates_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/position_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/abbreviations_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/axes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/data_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/expressions_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/paths_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/reverse-axes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/substring-after_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/substring-nan-position_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/substring-non-positive-postion_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/xpath-detached-nodes_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/xpath-empty-string_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/xpath-result-eventlistener-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/xpath-template-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xsl/default-html_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xsl/extra-lf-at-end_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xsl/nbsp-in-stylesheet_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xsl/transformToFragment-XML-declaration_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xsl/xslt-fragment-in-empty-doc_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xsl/xslt-string-parameters_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xsl/xslt-transform-to-fragment-crash_t01: RuntimeError # Please triage this failure
+LibTest/async/Stream/Stream.periodic_A01_t01: Pass, RuntimeError # Please triage this failure
+LibTest/async/Timer/Timer.periodic_A01_t01: Pass, RuntimeError # Please triage this failure
+LibTest/async/Timer/Timer_A01_t01: Pass, RuntimeError # Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: RuntimeError # Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: RuntimeError # Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: RuntimeError # Please triage this failure
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: RuntimeError # Please triage this failure
+LibTest/core/Runes/takeWhile_A01_t01: Skip # Times out. Please triage this failure
+LibTest/core/String/toLowerCase_A01_t02: Skip # Times out. Please triage this failure
+LibTest/core/double/operator_remainder_A02_t01: Skip # Times out. Please triage this failure
+LibTest/core/double/roundToDouble_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/double/round_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/double/toStringAsExponential_A01_t04: RuntimeError # Please triage this failure
+LibTest/core/double/toStringAsPrecision_A01_t04: RuntimeError # Please triage this failure
+LibTest/core/int/compareTo_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/int/operator_left_shift_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/int/operator_remainder_A01_t03: RuntimeError # Please triage this failure
+LibTest/core/int/operator_truncating_division_A01_t02: RuntimeError # Please triage this failure
+LibTest/core/int/remainder_A01_t01: RuntimeError # Please triage this failure
+LibTest/core/int/remainder_A01_t03: RuntimeError # Please triage this failure
+LibTest/core/int/toRadixString_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: RuntimeError # Please triage this failure
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t04: Pass, RuntimeError # Please triage this failure
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t05: Skip # Times out. Please triage this failure
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t06: RuntimeError # Please triage this failure
+LibTest/html/Document/childNodes_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Document/clone_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Document/clone_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Document/contains_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Document/importNode_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Document/securityPolicy_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/Element.tag_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/addEventListener_A01_t04: Pass, RuntimeError # Please triage this failure
+LibTest/html/Element/attributeChanged_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/blur_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/Element/borderEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/contentEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/dataset_A02_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/enteredView_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/errorEvent_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/Element/focusEvent_A01_t01: Pass, RuntimeError # Please triage this failure
+LibTest/html/Element/getAttributeNS_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/getAttributeNS_A02_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/isTagSupported_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/isTagSupported_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Element/leftView_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/loadEvent_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/Element/marginEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/onError_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/Element/onFocus_A01_t01: Pass, RuntimeError # Please triage this failure
+LibTest/html/Element/onLoad_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/Element/ownerDocument_A01_t05: RuntimeError # Please triage this failure
+LibTest/html/Element/paddingEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/querySelectorAll_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Element/replaceWith_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Element/tagName_A01_t03: RuntimeError # Please triage this failure
+LibTest/html/Element/translate_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/getAllResponseHeaders_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/getResponseHeader_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/getString_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/onError_A01_t02: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequest/overrideMimeType_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/request_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/responseText_A01_t02: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequest/responseType_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/responseType_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/setRequestHeader_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/statusText_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequest/status_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/HttpRequestUpload/onAbort_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequestUpload/onError_A01_t02: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/HttpRequestUpload/onLoad_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/IFrameElement/IFrameElement.created_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/addEventListener_A01_t04: Pass, RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/appendHtml_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/appendHtml_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/attributeChanged_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/attributes_setter_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/blur_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/IFrameElement/borderEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/clone_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/contains_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/contentWindow_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/createFragment_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/createFragment_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/createFragment_A01_t03: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/createShadowRoot_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/innerHtml_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/leftView_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/marginEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/offsetTo_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/onClick_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/IFrameElement/outerHtml_setter_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/ownerDocument_A01_t05: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/paddingEdge_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/querySelector_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/setInnerHtml_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/tagName_A01_t03: RuntimeError # Please triage this failure
+LibTest/html/IFrameElement/translate_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Node/addEventListener_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/Node/addEventListener_A01_t03: Skip # Times out. Please triage this failure
+LibTest/html/Node/addEventListener_A01_t04: Skip # Times out. Please triage this failure
+LibTest/html/Node/addEventListener_A01_t05: Skip # Times out. Please triage this failure
+LibTest/html/Node/append_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Node/contains_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Node/contains_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Node/nodes_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Node/nodes_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Node/ownerDocument_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Node/parent_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Node/previousNode_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Node/removeEventListener_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/Node/removeEventListener_A01_t02: Skip # Times out. Please triage this failure
+LibTest/html/Window/animationFrame_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/Window/close_A01_t01: Pass, RuntimeError # Please triage this failure
+LibTest/html/Window/document_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A02_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A03_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A03_t02: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A04_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A05_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A06_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/find_A07_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/moveBy_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/moveTo_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/moveTo_A02_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/postMessage_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/postMessage_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Window/requestFileSystem_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/requestFileSystem_A01_t02: RuntimeError # Please triage this failure
+LibTest/html/Window/requestFileSystem_A02_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/resizeBy_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Window/resizeTo_A01_t01: RuntimeError # Please triage this failure
+LibTest/math/sqrt_A02_t02: Skip # Times out. Please triage this failure
+LibTest/typed_data/ByteData/ByteData.view_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/ByteData/offsetInBytes_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Float32List/removeWhere_A01_t01: Skip # Times out. Please triage this failure
+LibTest/typed_data/Float32x4List/Float32x4List.view_A06_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Int32x4/operator_OR_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Int64List/join_A01_t02: Skip # Times out. Please triage this failure
+LibTest/typed_data/Int8List/addAll_A01_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/DOMEvents/approved/ProcessingInstruction.DOMCharacterDataModified_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/DOMEvents/approved/addEventListener.optional.useCapture_t01: RuntimeError # Please triage this failure
+WebPlatformTest/Utils/test/asyncTestFail_t01: RuntimeError # Please triage this failure
+WebPlatformTest/Utils/test/asyncTestFail_t02: RuntimeError # Please triage this failure
+WebPlatformTest/Utils/test/asyncTestTimeout_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A04_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A05_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A06_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A07_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/concepts/type_A08_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElementNS_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElementNS_A02_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElementNS_A03_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElementNS_A04_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElementNS_A05_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElement_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElement_A02_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElement_A03_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElement_A04_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/createElement_A05_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t02: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/isAttribute_A02_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/isAttribute_A03_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/localName_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/namespace_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/EventTarget/dispatchEvent_A02_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/events/defaultPrevented_A01_t05: RuntimeError # Please triage this failure
+WebPlatformTest/dom/events/type_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/CharacterData/deleteData_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Comment-constructor_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/DOMImplementation-createDocumentType_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/DOMImplementation-createDocument_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/DOMImplementation-hasFeature_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Document-adoptNode_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Document-createElementNS_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Document-getElementsByTagName_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Document-importNode_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Element-childElementCount_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-appendChild_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-appendChild_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-insertBefore_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-isEqualNode_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-nodeName_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-parentElement_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-replaceChild_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-textContent_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/attributes_A04_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/attributes_A05_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/attributes_A06_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A05_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A06_t03: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t03: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A08_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttribute_A03_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttribute_A04_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/ranges/Range-attributes_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/ranges/Range-comparePoint_t02: RuntimeError # Please triage this failure
+WebPlatformTest/dom/ranges/Range-comparePoint_t03: RuntimeError # Please triage this failure
+WebPlatformTest/dom/ranges/Range-detach_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-imports/link-import_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-imports/link-import_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html-imports/loading-import_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/additions-to-the-steps-to-clone-a-node/template-clone-children_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/additions-to-the-steps-to-clone-a-node/templates-copy-document-owner_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/definitions/template-contents-owner-document-type_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/definitions/template-contents-owner-test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/definitions/template-contents_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/innerhtml-on-templates/innerhtml_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-foster-parenting/template-is-a-foster-parent-element_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-foster-parenting/template-is-not-a-foster-parent-element_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-body-token_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-frameset-token_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-head-token_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-html-token_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/start-tag-body_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-table-insertion-mode/end-tag-table_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/appending-to-a-template/template-child-nodes_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-body-context_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-context_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-row-context_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/parsing-html-templates/creating-an-element-for-the-token/template-owner-document_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/serializing-html-templates/outerhtml_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/template-element/content-attribute_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/template-element/node-document-changes_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/template-element/template-as-a-descendant_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/template-element/template-content-node-document_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html-templates/template-element/template-content_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/Document.getElementsByClassName-null_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t05: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t07: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/elements/global-attributes/dataset-delete_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/elements/global-attributes/dataset-get_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/dom/elements/global-attributes/dataset-set_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/disabled-elements/disabledElement_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/document-metadata/styling/LinkStyle_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/error-codes/error_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLMediaElement/addTextTrack_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/kind_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/label_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/src_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/srclang_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/cues_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/kind_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formaction_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/textfieldselection/selection-not-application-textarea_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/textfieldselection/selection_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setRangeText_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setSelectionRange_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-button-element/button-validation_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-datalist-element/datalistoptions_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-fieldset-element/HTMLFieldSetElement_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-fieldset-element/disabled_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-form-element/form-autocomplete_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-form-element/form-elements-matches_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-form-element/form-elements-nameditem_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/color_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/date_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/datetime-local_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/datetime_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/datetime_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/email_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/hidden_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/input-textselection_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/month_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/password_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/range_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/text_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/time_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/time_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/type-change-state_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/url_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/valueMode_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-input-element/week_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-meter-element/meter_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-option-element/option-text-recurse_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-option-element/option-text-spaces_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/the-output-element/output_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/grouping-content/the-blockquote-element/grouping-blockquote_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/grouping-content/the-li-element/grouping-li_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/grouping-content/the-ol-element/ol.start-reflection_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/interactive-elements/the-details-element/toggleEvent_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/interactive-elements/the-dialog-element/dialog-close_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/interactive-elements/the-dialog-element/dialog-showModal_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/scripting-1/the-script-element/async_t11: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/scripting-1/the-script-element/script-text_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/checked_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/default_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/dir_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/disabled_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/enabled_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/indeterminate_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/inrange-outofrange_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/link_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/selectors/pseudo-classes/valid-invalid_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/tabular-data/the-table-element/border_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/tabular-data/the-table-element/createTBody_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/tabular-data/the-table-element/table-insertRow_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/tabular-data/the-table-element/table-rows_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/tabular-data/the-tr-element/rowIndex_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/syntax/parsing/Document.getElementsByTagName-foreign_t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/syntax/serializing-html-fragments/outerHTML_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t02: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t03: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t04: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t05: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t06: RuntimeError # Please triage this failure
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol_t00: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t02: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/elements-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-007_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-008_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-009_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-010_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-011_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-012_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-013_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-007_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-010_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t02: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-006_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t02: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-dispatch/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-dispatch/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-dispatch/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-retargeting/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-retargeting/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-retargeting/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/event-retargeting/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-006_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-007_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-008_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-009_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t02: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t03: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t04: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t05: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t06: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/inert-html-elements/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/composition/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/custom-pseudo-elements/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/distribution-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/nested-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/rendering-shadow-trees/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/reprojection/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-003_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-006_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-017_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/dom-tree-accessors-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/shadow-root-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-005_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-007_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-009_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-011_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_constructor_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_constructor_t02: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_local_key_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_local_newvalue_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_local_oldvalue_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_local_storagearea_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_local_storageeventinit_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_local_url_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_session_key_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_session_newvalue_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_session_oldvalue_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_session_storagearea_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/event_session_url_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/storage_builtins_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/storage_local_setitem_quotaexceedederr_t01: Skip # Times out. Please triage this failure
+WebPlatformTest/webstorage/storage_local_setitem_t01: RuntimeError # Please triage this failure
+WebPlatformTest/webstorage/storage_session_setitem_t01: RuntimeError # Please triage this failure
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index d61e858..80dd6e8 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -21,6 +21,8 @@
 Language/12_Expressions/12_Instance_Creation/2_Const_A11_t03: Fail # Issue 22007
 Language/14_Libraries_and_Scripts/3_Parts_A01_t05: Skip # Times out flakily. Issue 20881
 LayoutTests/fast/speechsynthesis/*: Skip # Times out on Dartium. Fails elsewhere. Issue 22017
+LayoutTests/fast/mediastream/RTCPeerConnection-AddRemoveStream_t01: Skip # Issue 22111
+
 LayoutTests/fast/borders/border-radius-child_t01: Skip # co19 issue 732.
 LayoutTests/fast/css-generated-content/hit-test-generated-content_t01: Skip # co19 issue 732.
 LayoutTests/fast/css/collapsed-whitespace-reattach-in-style-recalc_t01: Skip # co19 issue 732.
@@ -41,11 +43,18 @@
 LibTest/html/Window/moveBy_A01_t01: RuntimeError # Issue 20146
 LayoutTests/fast/css-generated-content/bug91547_t01: Skip # Test reloads itself. Issue 18558.
 LayoutTests/fast/filesystem/file-after-reload-crash_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/dom/HTMLButtonElement/change-type_t01: Skip # Test reloads itself. Issue 18558.
 LayoutTests/fast/dom/StyleSheet/discarded-sheet-owner-null_t01: Skip # Test reloads itself. Issue 18558.
 LayoutTests/fast/dom/css-cached-import-rule_t01: Skip # Test reloads itself. Issue 18558.
 LayoutTests/fast/dom/cssTarget-crash_t01: Skip # Test reloads itself. Issue 18558.
 LayoutTests/fast/dom/empty-hash-and-search_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/dom/shadow/form-in-shadow_t01: Skip # Test reloads itself. Issue 18558.
 LayoutTests/fast/forms/datetimelocal/datetimelocal-interactive-validation-required_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/forms/form-submission-create-crash_t01.dart: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/forms/formmethod-attribute-button-html_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/forms/formmethod-attribute-input-2_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/forms/submit-form-with-dirname-attribute-with-ancestor-dir-attribute_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/forms/submit-form-with-dirname-attribute-with-nonhtml-ancestor_t01: Skip # Test reloads itself. Issue 18558.
 LayoutTests/fast/forms/submit-nil-value-field-assert_t01: Skip # Test reloads itself. Issue 18558.
 LayoutTests/fast/forms/textarea-submit-crash_t01: Skip # Test reloads itself. Issue 18558.
 
@@ -170,17 +179,17 @@
 LibTest/html/Document/clone_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
 LibTest/html/Document/clone_A01_t02: RuntimeError # co19-roll r706.  Please triage this failure.
 LibTest/html/Document/securityPolicy_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
-LibTest/html/Element/borderEdge_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
-LibTest/html/Element/contentEdge_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/html/Element/borderEdge_A01_t01: RuntimeError # co19-roll r706.  Issue 16574
+LibTest/html/Element/contentEdge_A01_t01: RuntimeError # co19-roll r706.  Issue 16574
 LibTest/html/Element/dataset_A02_t01: RuntimeError # co19-roll r706.  Please triage this failure.
-LibTest/html/Element/getAttributeNS_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/html/Element/getAttributeNS_A01_t01: RuntimeError # co19-roll r706.  Issue 16395
 LibTest/html/Element/getAttributeNS_A01_t02: RuntimeError # Please triage this failure.
-LibTest/html/Element/getClientRects_A01_t02: RuntimeError # co19-roll r706.  Please triage this failure.
-LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/html/Element/getClientRects_A01_t02: RuntimeError # co19-roll r706.  Issue 16575
+LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # co19-roll r706.  Issue 16395
 LibTest/html/Element/isContentEditable_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
 LibTest/html/Element/isContentEditable_A02_t01: RuntimeError # co19-roll r706.  Please triage this failure.
-LibTest/html/Element/marginEdge_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
-LibTest/html/Element/paddingEdge_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/html/Element/marginEdge_A01_t01: RuntimeError # co19-roll r706.  Issue 16574
+LibTest/html/Element/paddingEdge_A01_t01: RuntimeError # co19-roll r706.  Issue 16574
 LibTest/html/Element/replaceWith_A01_t02: RuntimeError # co19-roll r706.  Please triage this failure.
 LibTest/html/HttpRequest/responseType_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
 LibTest/html/HttpRequest/responseType_A01_t03: RuntimeError # co19-roll r706.  Please triage this failure.
@@ -190,7 +199,7 @@
 LibTest/html/IFrameElement/appendHtml_A01_t02: RuntimeError # co19-roll r706.  Please triage this failure.
 LibTest/html/IFrameElement/attributeChanged_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
 LibTest/html/IFrameElement/attributes_setter_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
-LibTest/html/IFrameElement/borderEdge_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/html/IFrameElement/borderEdge_A01_t01: RuntimeError # co19-roll r706.  Issue 16574
 LibTest/html/IFrameElement/clone_A01_t02: RuntimeError # co19-roll r706.  Please triage this failure.
 LibTest/html/IFrameElement/contentWindow_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
 LibTest/html/IFrameElement/createFragment_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
@@ -201,7 +210,7 @@
 LibTest/html/IFrameElement/getNamespacedAttributes_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
 LibTest/html/IFrameElement/innerHtml_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
 LibTest/html/IFrameElement/isContentEditable_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
-LibTest/html/IFrameElement/marginEdge_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/html/IFrameElement/marginEdge_A01_t01: RuntimeError # co19-roll r706.  Issue 16574
 LibTest/html/IFrameElement/offsetTo_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
 LibTest/html/IFrameElement/setInnerHtml_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
 LibTest/html/Window/close_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
@@ -253,11 +262,11 @@
 LayoutTests/fast/dom/HTMLLinkElement/link-beforeload-recursive_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLLinkElement/prefetch-onload_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLLinkElement/prefetch_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/resolve-url-on-insertion_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/resolve-url-on-insertion_t01: RuntimeError # co19-roll r722: Issue 18010
 LayoutTests/fast/dom/HTMLObjectElement/beforeload-set-text-crash_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
 LibTest/html/IFrameElement/outerHtml_setter_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/IFrameElement/paddingEdge_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/IFrameElement/paddingEdge_A01_t01: RuntimeError # co19-roll r722: Issue 16574
 LibTest/html/Node/addEventListener_A01_t06: RuntimeError # co19-roll r722: Please triage this failure.
 LibTest/html/Node/append_A01_t02: RuntimeError # co19-roll r722: Please triage this failure.
 LibTest/html/Node/nodes_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -309,12 +318,12 @@
 LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLScriptElement/remove-in-beforeload_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLTemplateElement/innerHTML_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes_t01: RuntimeError # co19-roll r722: Issue 18127
+LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: RuntimeError # co19-roll r722: Issue 18250
+LayoutTests/fast/dom/HTMLTemplateElement/innerHTML_t01: RuntimeError # co19-roll r722: Issue 18249
 LayoutTests/fast/dom/HTMLTemplateElement/ownerDocumentXHTML_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/MutationObserver/observe-attributes_t01: RuntimeError # Issue 18931
-LayoutTests/fast/dom/MutationObserver/observe-childList_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/observe-childList_t01: RuntimeError # co19-roll r722: Issue 18253
 LayoutTests/fast/dom/MutationObserver/weak-callback-gc-crash_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/Node/initial-values_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/Range/range-created-during-remove-children_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
@@ -471,6 +480,7 @@
 LayoutTests/fast/css/collapsed-whitespace-reattach-in-style-recalc_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/content/content-none_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/content/content-normal_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/counters/complex-before_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/css-properties-case-insensitive_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/css3-nth-tokens-style_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/cursor-parsing-quirks_t01: RuntimeError # co19-roll r761: Please triage this failure.
@@ -780,6 +790,7 @@
 
 # co19-roll r801
 LayoutTests/fast/canvas/webgl/canvas-test_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/canvas/webgl/oes-element-index-uint_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-strict-mode-wtih-checkbox_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/dom/MutationObserver/database-callback-delivery_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/events/change-overflow-on-overflow-change_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
@@ -851,7 +862,6 @@
 LayoutTests/fast/masking/parsing-mask-source-type_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/masking/parsing-mask_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/media/media-query-list-syntax_t01: RuntimeError # co19-roll r801: Please triage this failure.
-LayoutTests/fast/mediastream/RTCPeerConnection-AddRemoveStream_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/multicol/balance-short-trailing-empty-block_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/multicol/balance-trailing-border_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/multicol/balance-trailing-border_t02: RuntimeError # co19-roll r801: Please triage this failure.
@@ -913,7 +923,7 @@
 LayoutTests/fast/innerHTML/innerHTML-svg-read_t01: RuntimeError, Pass # co19-roll r706.  Please triage this failure.
 LayoutTests/fast/dom/HTMLLabelElement/form/test1_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLTableElement/insert-row_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/Node/ownerDocument_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/Node/ownerDocument_A01_t01: RuntimeError # co19-roll r722: Issue 18251
 WebPlatformTest/custom-elements/instantiating/createElementNS_A05_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/custom-elements/instantiating/createElement_A05_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/html/semantics/forms/textfieldselection/selection_t01: RuntimeError # co19-roll r738: Please triage this failure.
@@ -1013,7 +1023,6 @@
 LayoutTests/fast/canvas/canvas-transforms-fillRect-shadow_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/webgl/canvas-test_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/webgl/webgl-large-texture_t01: Skip # Times out flakily. co19-roll r761: Please triage this failure.
-LayoutTests/fast/css/counters/complex-before_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/getComputedStyle/computed-style-select-overflow_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/vertical-align-length-copy-bug_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css-generated-content/bug-106384_t01: Skip # Times out. co19-roll r786: Please triage this failure.
@@ -1033,23 +1042,14 @@
 LayoutTests/fast/forms/activate-and-disabled-elements_t01: Skip # Times out. co19-roll r801: Please triage this failure.
 LayoutTests/fast/inline/continuation-inlines-inserted-in-reverse-after-block_t01: Skip # Times out. co19-roll r801: Please triage this failure.
 LayoutTests/fast/inline/fixed-pos-moves-with-abspos-inline-parent_t01: Skip # Times out. co19-roll r801: Please triage this failure.
+LayoutTests/fast/inline/fixed-pos-moves-with-abspos-parent_t01: Skip # Times out. co19-roll r801: Please triage this failure.
+LayoutTests/fast/inline/fixed-pos-moves-with-abspos-parent-relative-ancestor_t01: Skip # Times out. co19-roll r801: Please triage this failure.
 LayoutTests/fast/inline/inline-relative-offset-boundingbox_t01: Skip # Times out. co19-roll r801: Please triage this failure.
 LayoutTests/fast/inline/out-of-flow-objects-and-whitespace-after-empty-inline_t01: Skip # Times out. co19-roll r801: Please triage this failure.
 LayoutTests/fast/inline/parent-inline-element-padding-contributes-width_t01: Skip # Times out. co19-roll r801: Please triage this failure.
 LayoutTests/fast/layers/negative-scroll-positions_t01: Skip # Times out. co19-roll r801: Please triage this failure.
 LayoutTests/fast/loader/loadInProgress_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t02: Skip # Times out. Please triage this failure.
-LayoutTests/fast/writing-mode/auto-margins-across-boundaries_t01: Skip # Times out. Please triage this failure.
-LayoutTests/fast/writing-mode/auto-sizing-orthogonal-flows_t01: Skip # Times out. Please triage this failure.
-LayoutTests/fast/writing-mode/block-formatting-context_t01: Skip # Times out. Please triage this failure.
-LayoutTests/fast/writing-mode/broken-ideographic-font_t01: Skip # Times out. co19-roll r801: Please triage this failure.
-LayoutTests/fast/writing-mode/display-mutation_t01: Skip # Times out. co19-roll r801: Please triage this failure.
-LayoutTests/fast/writing-mode/flipped-blocks-hit-test-overflow-scroll_t01: Skip # Times out. Please triage this failure.
-LayoutTests/fast/writing-mode/flipped-blocks-text-map-local-to-container_t01: Skip # Times out. co19-roll r801: Please triage this failure.
-LayoutTests/fast/writing-mode/percentage-margins-absolute-replaced_t01: Skip # Times out. Please triage this failure.
-LayoutTests/fast/writing-mode/percentage-padding_t01: Skip # Times out. co19-roll r801: Please triage this failure.
-LayoutTests/fast/writing-mode/vertical-font-vmtx-units-per-em_t01: Skip # Times out. Please triage this failure.
-LayoutTests/fast/writing-mode/vertical-inline-block-hittest_t01: Skip # Times out. Please triage this failure.
 LibTest/core/DateTime/parse_A01_t02: Skip # Times out. Please triage this failure.
 
 [ $compiler == none && $runtime == dartium ]
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 62a078c..93dd7e4 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -70,8 +70,8 @@
 LibTest/collection/ListBase/ListBase_class_A01_t02: Skip # co19 issue 673
 
 [ $compiler == none && $runtime == vm && $arch == mips && $mode == debug ]
-LibTest/isolate/Isolate/spawnUri_A01_t04: Crash, Pass # dartbug.com/17440
-LibTest/isolate/Isolate/spawn_A01_t04: Crash, Pass # dartbug.com/17440
+LibTest/isolate/Isolate/spawnUri_A01_t04: Crash, Pass # Issue 17440
+LibTest/isolate/Isolate/spawn_A01_t04: Crash, Pass # Issue 17440
 
 [ $compiler == none && $runtime == vm && ($arch == simarm || $arch == simmips || $arch == simarm64) ]
 LibTest/core/Uri/Uri_A06_t03: Skip  # Timeout
diff --git a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
index 570b528..47ae729 100644
--- a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
+++ b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
@@ -17,6 +17,10 @@
   // Helper methods for debugging should never be called from production code:
   "lib/src/helpers/": const [" is never "],
 
+  // Hack to give try private access:
+  "lib/src/js_emitter/program_builder.dart": const [
+      "The method 'buildClassWithFieldsForTry' is never called"],
+
   // Node.asLiteralBool is never used.
   "lib/src/tree/nodes.dart": const [
       "The method 'asLiteralBool' is never called"],
diff --git a/tests/compiler/dart2js/backend_dart/opt_constprop_test.dart b/tests/compiler/dart2js/backend_dart/opt_constprop_test.dart
index d80a589..4c8127c 100644
--- a/tests/compiler/dart2js/backend_dart/opt_constprop_test.dart
+++ b/tests/compiler/dart2js/backend_dart/opt_constprop_test.dart
@@ -31,28 +31,32 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 1)))
     (LetPrim (v1 (Constant (Int 1)))
-      (LetCont (k0 (v2)
-          (LetCont (k1 ()
-              (LetPrim (v3 (Constant (Int 2)))
-                (InvokeContinuation return (v3))))
-            (LetCont (k2 ()
+      (LetCont
+        ((k0 (v2)
+           (LetCont
+             ((k1 ()
+                (LetPrim (v3 (Constant (Int 2)))
+                  (InvokeContinuation return (v3))))
+              (k2 ()
                 (LetPrim (v4 (Constant (Int 3)))
-                  (InvokeContinuation return (v4))))
-              (Branch (IsTrue v2) k1 k2))))
+                  (InvokeContinuation return (v4)))))
+             (Branch (IsTrue v2) k1 k2))))
         (InvokeMethod v0 == (v1) k0)))))
 """;
 String CP1_OUT = """
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 1)))
     (LetPrim (v1 (Constant (Int 1)))
-      (LetCont (k0 (v2)
-          (LetCont (k1 ()
-              (LetPrim (v3 (Constant (Int 2)))
-                (InvokeContinuation return (v3))))
-            (LetCont (k2 ()
+      (LetCont
+        ((k0 (v2)
+           (LetCont
+             ((k1 ()
+                (LetPrim (v3 (Constant (Int 2)))
+                  (InvokeContinuation return (v3))))
+              (k2 ()
                 (LetPrim (v4 (Constant (Int 3)))
-                  (InvokeContinuation return (v4))))
-              (InvokeContinuation k1 ()))))
+                  (InvokeContinuation return (v4)))))
+             (InvokeContinuation k1 ()))))
         (LetPrim (v5 (Constant (Bool true)))
           (InvokeContinuation k0 (v5)))))))
 """;
@@ -75,108 +79,130 @@
 String CP2_IN = """
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 1)))
-    (LetCont* (k0 ()
-        (LetCont (k1 ()
-            (LetPrim (v1 (Constant (Int 42)))
-              (InvokeContinuation return (v1))))
-          (LetCont (k2 ()
-              (LetPrim (v2 (Constant (Bool false)))
-                (LetCont (k3 (v3)
-                    (LetCont (k4 ()
-                        (InvokeContinuation return (v0)))
-                      (LetCont (k5 ()
-                          (LetPrim (v4 (Constant (Bool true)))
-                            (LetCont (k6 (v5)
-                                (LetCont (k7 ()
-                                    (InvokeContinuation return (v0)))
-                                  (LetCont (k8 ()
-                                      (InvokeContinuation* k0 ()))
-                                    (Branch (IsTrue v5) k7 k8))))
-                              (LetCont (k9 ()
-                                  (LetPrim (v6 (Constant (Int 1)))
-                                    (LetCont (k10 (v7)
-                                        (LetCont (k11 ()
-                                            (LetPrim (v8 (Constant (Bool true)))
-                                              (InvokeContinuation k6 (v8))))
-                                          (LetCont (k12 ()
-                                              (LetPrim (v9 (Constant (Bool false)))
-                                                (InvokeContinuation k6 (v9))))
-                                            (Branch (IsTrue v7) k11 k12))))
-                                      (InvokeMethod v0 == (v6) k10))))
-                                (LetCont (k13 ()
-                                    (LetPrim (v10 (Constant (Bool false)))
-                                      (InvokeContinuation k6 (v10))))
-                                  (Branch (IsTrue v4) k9 k13))))))
-                        (Branch (IsTrue v3) k4 k5))))
-                  (LetCont (k14 ()
-                      (LetPrim (v11 (Constant (Bool true)))
-                        (InvokeContinuation k3 (v11))))
-                    (LetCont (k15 ()
-                        (LetPrim (v12 (Constant (Bool false)))
-                          (LetCont (k16 ()
-                              (LetPrim (v13 (Constant (Bool true)))
-                                (InvokeContinuation k3 (v13))))
-                            (LetCont (k17 ()
-                                (LetPrim (v14 (Constant (Bool false)))
-                                  (InvokeContinuation k3 (v14))))
-                              (Branch (IsTrue v12) k16 k17)))))
-                      (Branch (IsTrue v2) k14 k15))))))
-            (LetPrim (v15 (Constant (Bool true)))
-              (Branch (IsTrue v15) k2 k1)))))
+    (LetCont
+        ((rec k0 ()
+           (LetCont
+               ((k1 ()
+                  (LetPrim (v1 (Constant (Int 42)))
+                    (InvokeContinuation return (v1))))
+                (k2 ()
+                  (LetPrim (v2 (Constant (Bool false)))
+                    (LetCont
+                        ((k3 (v3)
+                           (LetCont
+                               ((k4 ()
+                                  (InvokeContinuation return (v0)))
+                                (k5 ()
+                                  (LetPrim (v4 (Constant (Bool true)))
+                                    (LetCont
+                                        ((k6 (v5)
+                                           (LetCont
+                                               ((k7 ()
+                                                  (InvokeContinuation return (v0)))
+                                                (k8 ()
+                                                  (InvokeContinuation rec k0 ())))
+                                             (Branch (IsTrue v5) k7 k8))))
+                                      (LetCont
+                                          ((k9 ()
+                                             (LetPrim (v6 (Constant (Int 1)))
+                                               (LetCont
+                                                   ((k10 (v7)
+                                                      (LetCont
+                                                          ((k11 ()
+                                                             (LetPrim (v8 (Constant (Bool true)))
+                                                               (InvokeContinuation k6 (v8))))
+                                                           (k12 ()
+                                                             (LetPrim (v9 (Constant (Bool false)))
+                                                               (InvokeContinuation k6 (v9)))))
+                                                        (Branch (IsTrue v7) k11 k12))))
+                                                 (InvokeMethod v0 == (v6) k10))))
+                                           (k13 ()
+                                             (LetPrim (v10 (Constant (Bool false)))
+                                               (InvokeContinuation k6 (v10)))))
+                                        (Branch (IsTrue v4) k9 k13))))))
+                             (Branch (IsTrue v3) k4 k5))))
+                      (LetCont
+                          ((k14 ()
+                             (LetPrim (v11 (Constant (Bool true)))
+                               (InvokeContinuation k3 (v11))))
+                           (k15 ()
+                             (LetPrim (v12 (Constant (Bool false)))
+                               (LetCont
+                                   ((k16 ()
+                                      (LetPrim (v13 (Constant (Bool true)))
+                                        (InvokeContinuation k3 (v13))))
+                                    (k17 ()
+                                      (LetPrim (v14 (Constant (Bool false)))
+                                        (InvokeContinuation k3 (v14)))))
+                                 (Branch (IsTrue v12) k16 k17)))))
+                        (Branch (IsTrue v2) k14 k15))))))
+             (LetPrim (v15 (Constant (Bool true)))
+               (Branch (IsTrue v15) k2 k1)))))
       (InvokeContinuation k0 ()))))
 """;
 String CP2_OUT = """
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 1)))
-    (LetCont* (k0 ()
-        (LetCont (k1 ()
-            (LetPrim (v1 (Constant (Int 42)))
-              (InvokeContinuation return (v1))))
-          (LetCont (k2 ()
-              (LetPrim (v2 (Constant (Bool false)))
-                (LetCont (k3 (v3)
-                    (LetCont (k4 ()
-                        (InvokeContinuation return (v0)))
-                      (LetCont (k5 ()
-                          (LetPrim (v4 (Constant (Bool true)))
-                            (LetCont (k6 (v5)
-                                (LetCont (k7 ()
-                                    (InvokeContinuation return (v0)))
-                                  (LetCont (k8 ()
-                                      (InvokeContinuation* k0 ()))
-                                    (InvokeContinuation k7 ()))))
-                              (LetCont (k9 ()
-                                  (LetPrim (v6 (Constant (Int 1)))
-                                    (LetCont (k10 (v7)
-                                        (LetCont (k11 ()
-                                            (LetPrim (v8 (Constant (Bool true)))
-                                              (InvokeContinuation k6 (v8))))
-                                          (LetCont (k12 ()
-                                              (LetPrim (v9 (Constant (Bool false)))
-                                                (InvokeContinuation k6 (v9))))
-                                            (InvokeContinuation k11 ()))))
-                                      (LetPrim (v10 (Constant (Bool true)))
-                                        (InvokeContinuation k10 (v10))))))
-                                (LetCont (k13 ()
-                                    (LetPrim (v11 (Constant (Bool false)))
-                                      (InvokeContinuation k6 (v11))))
-                                  (InvokeContinuation k9 ()))))))
-                        (InvokeContinuation k5 ()))))
-                  (LetCont (k14 ()
-                      (LetPrim (v12 (Constant (Bool true)))
-                        (InvokeContinuation k3 (v12))))
-                    (LetCont (k15 ()
-                        (LetPrim (v13 (Constant (Bool false)))
-                          (LetCont (k16 ()
-                              (LetPrim (v14 (Constant (Bool true)))
-                                (InvokeContinuation k3 (v14))))
-                            (LetCont (k17 ()
-                                (LetPrim (v15 (Constant (Bool false)))
-                                  (InvokeContinuation k3 (v15))))
-                              (InvokeContinuation k17 ())))))
-                      (InvokeContinuation k15 ()))))))
-            (LetPrim (v16 (Constant (Bool true)))
-              (InvokeContinuation k2 ())))))
+    (LetCont
+        ((rec k0 ()
+           (LetCont
+               ((k1 ()
+                  (LetPrim (v1 (Constant (Int 42)))
+                    (InvokeContinuation return (v1))))
+                (k2 ()
+                  (LetPrim (v2 (Constant (Bool false)))
+                    (LetCont
+                        ((k3 (v3)
+                           (LetCont
+                               ((k4 ()
+                                  (InvokeContinuation return (v0)))
+                                (k5 ()
+                                  (LetPrim (v4 (Constant (Bool true)))
+                                    (LetCont
+                                        ((k6 (v5)
+                                           (LetCont
+                                               ((k7 ()
+                                                  (InvokeContinuation return (v0)))
+                                                (k8 ()
+                                                  (InvokeContinuation rec k0 ())))
+                                             (InvokeContinuation k7 ()))))
+                                      (LetCont
+                                          ((k9 ()
+                                             (LetPrim (v6 (Constant (Int 1)))
+                                               (LetCont
+                                                   ((k10 (v7)
+                                                      (LetCont
+                                                          ((k11 ()
+                                                             (LetPrim (v8 (Constant (Bool true)))
+                                                               (InvokeContinuation k6 (v8))))
+                                                           (k12 ()
+                                                             (LetPrim (v9 (Constant (Bool false)))
+                                                               (InvokeContinuation k6 (v9)))))
+                                                        (InvokeContinuation k11 ()))))
+                                                 (LetPrim (v10 (Constant (Bool true)))
+                                                   (InvokeContinuation k10 (v10))))))
+                                           (k13 ()
+                                             (LetPrim (v11 (Constant (Bool false)))
+                                               (InvokeContinuation k6 (v11)))))
+                                        (InvokeContinuation k9 ()))))))
+                             (InvokeContinuation k5 ()))))
+                      (LetCont
+                          ((k14 ()
+                             (LetPrim (v12 (Constant (Bool true)))
+                               (InvokeContinuation k3 (v12))))
+                           (k15 ()
+                             (LetPrim (v13 (Constant (Bool false)))
+                               (LetCont
+                                   ((k16 ()
+                                      (LetPrim (v14 (Constant (Bool true)))
+                                        (InvokeContinuation k3 (v14))))
+                                    (k17 ()
+                                      (LetPrim (v15 (Constant (Bool false)))
+                                        (InvokeContinuation k3 (v15)))))
+                                 (InvokeContinuation k17 ())))))
+                        (InvokeContinuation k15 ()))))))
+             (LetPrim (v16 (Constant (Bool true)))
+               (InvokeContinuation k2 ())))))
       (InvokeContinuation k0 ()))))
 """;
 
@@ -194,16 +220,19 @@
 String CP3_IN = """
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 1)))
-    (LetCont (k0 (v1)
-        (LetPrim (v2 (Constant (Int 1)))
-          (LetCont (k1 (v3)
-              (LetCont (k2 ()
-                  (LetPrim (v4 (Constant (Int 42)))
-                    (InvokeContinuation return (v4))))
-                (LetCont (k3 ()
-                    (InvokeContinuation return (v1)))
-                  (Branch (IsTrue v3) k2 k3))))
-            (InvokeMethod v1 == (v2) k1))))
+    (LetCont
+        ((k0 (v1)
+           (LetPrim (v2 (Constant (Int 1)))
+             (LetCont
+                 ((k1 (v3)
+                    (LetCont
+                        ((k2 ()
+                           (LetPrim (v4 (Constant (Int 42)))
+                             (InvokeContinuation return (v4))))
+                         (k3 ()
+                           (InvokeContinuation return (v1))))
+                      (Branch (IsTrue v3) k2 k3))))
+               (InvokeMethod v1 == (v2) k1)))))
       (InvokeStatic f () k0))))
 """;
 String CP3_OUT = CP3_IN;
@@ -214,16 +243,18 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 1)))
     (LetPrim (v1 (Constant (Int 2)))
-      (LetCont (k0 (v2)
-          (InvokeContinuation return (v2)))
+      (LetCont
+          ((k0 (v2)
+             (InvokeContinuation return (v2))))
         (InvokeMethod v0 + (v1) k0)))))
 """;
 String CP4_OUT = """
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 1)))
     (LetPrim (v1 (Constant (Int 2)))
-      (LetCont (k0 (v2)
-          (InvokeContinuation return (v2)))
+      (LetCont
+          ((k0 (v2)
+             (InvokeContinuation return (v2))))
         (LetPrim (v3 (Constant (Int 3)))
           (InvokeContinuation k0 (v3)))))))
 """;
@@ -234,8 +265,9 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 1)))
     (LetPrim (v1 (Constant (Int 2)))
-      (LetCont (k0 (v2)
-           (InvokeContinuation return (v2)))
+      (LetCont
+          ((k0 (v2)
+             (InvokeContinuation return (v2))))
         (InvokeMethod v0 [] (v1) k0)))))
 """;
 String CP5_OUT = CP5_IN;
@@ -246,16 +278,18 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 1)))
     (LetPrim (v1 (Constant (Int 0)))
-        (LetCont (k0 (v2)
-           (InvokeContinuation return (v2)))
-      (InvokeMethod v0 / (v1) k0)))))
+      (LetCont
+          ((k0 (v2)
+             (InvokeContinuation return (v2))))
+        (InvokeMethod v0 / (v1) k0)))))
 """;
 String CP6_OUT = """
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 1)))
     (LetPrim (v1 (Constant (Int 0)))
-      (LetCont (k0 (v2)
-          (InvokeContinuation return (v2)))
+      (LetCont
+          ((k0 (v2)
+             (InvokeContinuation return (v2))))
         (LetPrim (v3 (Constant (Double Infinity)))
           (InvokeContinuation k0 (v3)))))))
 """;
@@ -269,10 +303,12 @@
       (LetPrim (v2 (Constant (String "a")))
         (LetPrim (v3 (Constant (String "c")))
           (LetPrim (v4 (Constant (String "")))
-            (LetCont (k0 (v5)
-                (LetCont (k1 (v6)
-                    (InvokeContinuation return (v6)))
-                  (InvokeMethod v5 length () k1)))
+            (LetCont
+                ((k0 (v5)
+                   (LetCont
+                       ((k1 (v6)
+                          (InvokeContinuation return (v6))))
+                     (InvokeMethod v5 length () k1))))
               (ConcatenateStrings (v2 v0 v3 v1 v4) k0))))))))
 """;
 String CP7_OUT = """
@@ -282,10 +318,12 @@
       (LetPrim (v2 (Constant (String "a")))
         (LetPrim (v3 (Constant (String "c")))
           (LetPrim (v4 (Constant (String "")))
-            (LetCont (k0 (v5)
-                (LetCont (k1 (v6)
-                    (InvokeContinuation return (v6)))
-                  (InvokeMethod v5 length () k1)))
+            (LetCont
+                ((k0 (v5)
+                   (LetCont
+                       ((k1 (v6)
+                          (InvokeContinuation return (v6))))
+                     (InvokeMethod v5 length () k1))))
               (LetPrim (v7 (Constant (String "abcd")))
                 (InvokeContinuation k0 (v7))))))))))
 """;
@@ -299,26 +337,30 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 1)))
     (LetPrim (v1 (Constant (Int 1)))
-      (LetCont (k0 (v2)
-          (LetCont (k1 ()
-              (LetPrim (v3 (Constant (Int 42)))
-                (InvokeContinuation return (v3))))
-            (LetCont (k2 ()
-                (InvokeContinuation return (v0)))
-              (Branch (IsTrue v2) k1 k2))))
+      (LetCont
+          ((k0 (v2)
+             (LetCont
+                 ((k1 ()
+                    (LetPrim (v3 (Constant (Int 42)))
+                      (InvokeContinuation return (v3))))
+                  (k2 ()
+                    (InvokeContinuation return (v0))))
+               (Branch (IsTrue v2) k1 k2))))
         (InvokeMethod v0 == (v1) k0)))))
 """;
 String CP8_OUT = """
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 1)))
     (LetPrim (v1 (Constant (Int 1)))
-      (LetCont (k0 (v2)
-          (LetCont (k1 ()
-              (LetPrim (v3 (Constant (Int 42)))
-                (InvokeContinuation return (v3))))
-            (LetCont (k2 ()
-                (InvokeContinuation return (v0)))
-              (InvokeContinuation k1 ()))))
+      (LetCont
+          ((k0 (v2)
+             (LetCont
+                 ((k1 ()
+                    (LetPrim (v3 (Constant (Int 42)))
+                      (InvokeContinuation return (v3))))
+                  (k2 ()
+                    (InvokeContinuation return (v0))))
+               (InvokeContinuation k1 ()))))
         (LetPrim (v4 (Constant (Bool true)))
           (InvokeContinuation k0 (v4)))))))
 """;
@@ -328,63 +370,77 @@
 String CP9_IN = """
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 1)))
-    (LetCont* (k0 (v1)
-        (LetCont (k1 ()
-            (InvokeContinuation return (v1)))
-          (LetCont (k2 ()
-              (LetPrim (v2 (Constant (Int 1)))
-                (LetCont (k3 (v3)
-                    (LetCont (k4 (v4)
-                        (LetCont (k5 ()
-                            (LetPrim (v5 (Constant (Int 42)))
-                              (InvokeContinuation return (v5))))
-                          (LetCont (k6 ()
-                              (LetPrim (v6 (Constant (Int 1)))
-                                (LetCont (k7 (v7)
-                                    (InvokeContinuation* k0 (v7)))
-                                  (InvokeMethod v1 + (v6) k7))))
-                            (Branch (IsTrue v4) k5 k6))))
-                      (LetCont (k8 ()
-                          (LetPrim (v8 (Constant (Bool false)))
-                            (InvokeContinuation k4 (v8))))
-                        (LetCont (k9 ()
-                            (LetPrim (v9 (Constant (Bool true)))
-                              (InvokeContinuation k4 (v9))))
-                          (Branch (IsTrue v3) k8 k9)))))
-                  (InvokeMethod v1 == (v2) k3))))
-            (LetPrim (v10 (Constant (Bool true)))
-              (Branch (IsTrue v10) k2 k1)))))
+    (LetCont
+        ((rec k0 (v1)
+           (LetCont
+               ((k1 ()
+                  (InvokeContinuation return (v1)))
+                (k2 ()
+                  (LetPrim (v2 (Constant (Int 1)))
+                    (LetCont
+                        ((k3 (v3)
+                           (LetCont
+                               ((k4 (v4)
+                                  (LetCont
+                                      ((k5 ()
+                                         (LetPrim (v5 (Constant (Int 42)))
+                                           (InvokeContinuation return (v5))))
+                                       (k6 ()
+                                         (LetPrim (v6 (Constant (Int 1)))
+                                           (LetCont
+                                               ((k7 (v7)
+                                                  (InvokeContinuation rec k0 (v7))))
+                                             (InvokeMethod v1 + (v6) k7)))))
+                                    (Branch (IsTrue v4) k5 k6))))
+                             (LetCont
+                                 ((k8 ()
+                                    (LetPrim (v8 (Constant (Bool false)))
+                                      (InvokeContinuation k4 (v8))))
+                                  (k9 ()
+                                    (LetPrim (v9 (Constant (Bool true)))
+                                      (InvokeContinuation k4 (v9)))))
+                               (Branch (IsTrue v3) k8 k9)))))
+                      (InvokeMethod v1 == (v2) k3)))))
+             (LetPrim (v10 (Constant (Bool true)))
+               (Branch (IsTrue v10) k2 k1)))))
       (InvokeContinuation k0 (v0)))))
 """;
 String CP9_OUT = """
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 1)))
-    (LetCont* (k0 (v1)
-        (LetCont (k1 ()
-            (InvokeContinuation return (v1)))
-          (LetCont (k2 ()
-              (LetPrim (v2 (Constant (Int 1)))
-                (LetCont (k3 (v3)
-                    (LetCont (k4 (v4)
-                        (LetCont (k5 ()
-                            (LetPrim (v5 (Constant (Int 42)))
-                              (InvokeContinuation return (v5))))
-                          (LetCont (k6 ()
-                              (LetPrim (v6 (Constant (Int 1)))
-                                (LetCont (k7 (v7)
-                                    (InvokeContinuation* k0 (v7)))
-                                  (InvokeMethod v1 + (v6) k7))))
-                            (Branch (IsTrue v4) k5 k6))))
-                      (LetCont (k8 ()
-                          (LetPrim (v8 (Constant (Bool false)))
-                            (InvokeContinuation k4 (v8))))
-                        (LetCont (k9 ()
-                            (LetPrim (v9 (Constant (Bool true)))
-                              (InvokeContinuation k4 (v9))))
-                          (Branch (IsTrue v3) k8 k9)))))
-                  (InvokeMethod v1 == (v2) k3))))
-            (LetPrim (v10 (Constant (Bool true)))
-              (InvokeContinuation k2 ())))))
+    (LetCont
+        ((rec k0 (v1)
+           (LetCont
+               ((k1 ()
+                  (InvokeContinuation return (v1)))
+                (k2 ()
+                  (LetPrim (v2 (Constant (Int 1)))
+                    (LetCont
+                        ((k3 (v3)
+                           (LetCont
+                              ((k4 (v4)
+                                 (LetCont
+                                     ((k5 ()
+                                        (LetPrim (v5 (Constant (Int 42)))
+                                          (InvokeContinuation return (v5))))
+                                      (k6 ()
+                                        (LetPrim (v6 (Constant (Int 1)))
+                                          (LetCont
+                                              ((k7 (v7)
+                                                 (InvokeContinuation rec k0 (v7))))
+                                            (InvokeMethod v1 + (v6) k7)))))
+                                   (Branch (IsTrue v4) k5 k6))))
+                             (LetCont
+                                 ((k8 ()
+                                    (LetPrim (v8 (Constant (Bool false)))
+                                      (InvokeContinuation k4 (v8))))
+                                  (k9 ()
+                                    (LetPrim (v9 (Constant (Bool true)))
+                                      (InvokeContinuation k4 (v9)))))
+                               (Branch (IsTrue v3) k8 k9)))))
+                      (InvokeMethod v1 == (v2) k3)))))
+             (LetPrim (v10 (Constant (Bool true)))
+               (InvokeContinuation k2 ())))))
       (InvokeContinuation k0 (v0)))))
 """;
 
@@ -399,24 +455,30 @@
 String CP10_IN = """
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
-    (LetCont* (k0 (v1)
-        (LetCont (k1 ()
-            (LetPrim (v2 (Constant (Null)))
-              (InvokeContinuation return (v2))))
-          (LetCont (k2 ()
-              (LetPrim (v3 (Constant (Int 42)))
-                (LetCont (k3 (v4)
-                    (LetCont (k4 (v5)
-                        (LetPrim (v6 (Constant (Int 1)))
-                          (LetCont (k5 (v7)
-                              (InvokeContinuation* k0 (v7)))
-                            (InvokeMethod v1 + (v6) k5))))
-                      (InvokeStatic print (v4) k4)))
-                  (InvokeMethod v3 + (v1) k3))))
-            (LetPrim (v8 (Constant (Int 2)))
-              (LetCont (k6 (v9)
-                  (Branch (IsTrue v9) k2 k1))
-                (InvokeMethod v1 < (v8) k6))))))
+    (LetCont
+        ((rec k0 (v1)
+           (LetCont
+               ((k1 ()
+                  (LetPrim (v2 (Constant (Null)))
+                    (InvokeContinuation return (v2))))
+                (k2 ()
+                  (LetPrim (v3 (Constant (Int 42)))
+                    (LetCont
+                        ((k3 (v4)
+                           (LetCont
+                               ((k4 (v5)
+                                  (LetPrim (v6 (Constant (Int 1)))
+                                    (LetCont
+                                        ((k5 (v7)
+                                           (InvokeContinuation rec k0 (v7))))
+                                      (InvokeMethod v1 + (v6) k5)))))
+                             (InvokeStatic print (v4) k4))))
+                      (InvokeMethod v3 + (v1) k3)))))
+             (LetPrim (v8 (Constant (Int 2)))
+               (LetCont
+                   ((k6 (v9)
+                      (Branch (IsTrue v9) k2 k1)))
+                 (InvokeMethod v1 < (v8) k6))))))
       (InvokeContinuation k0 (v0)))))
 """;
 String CP10_OUT = CP10_IN;
diff --git a/tests/compiler/dart2js/backend_dart/opt_redundant_phi_test.dart b/tests/compiler/dart2js/backend_dart/opt_redundant_phi_test.dart
index 0725213..deadd77 100644
--- a/tests/compiler/dart2js/backend_dart/opt_redundant_phi_test.dart
+++ b/tests/compiler/dart2js/backend_dart/opt_redundant_phi_test.dart
@@ -22,23 +22,29 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 42)))
     (LetPrim (v1 (Constant (Int 0)))
-      (LetCont* (k0 (v2 v3)
-          (LetCont (k1 ()
-              (LetPrim (v4 (Constant (Null)))
-                (InvokeContinuation return (v4))))
-            (LetCont (k2 ()
-                (LetCont (k3 (v5)
-                    (LetCont (k4 (v6)
-                        (LetPrim (v7 (Constant (Int 1)))
-                          (LetCont (k5 (v8)
-                              (InvokeContinuation* k0 (v2 v8)))
-                            (InvokeMethod v3 + (v7) k5))))
-                      (InvokeStatic print (v5) k4)))
-                  (InvokeMethod v2 toString () k3)))
-              (LetPrim (v9 (Constant (Int 2)))
-                (LetCont (k6 (v10)
-                    (Branch (IsTrue v10) k2 k1))
-                  (InvokeMethod v3 < (v9) k6))))))
+      (LetCont
+          ((rec k0 (v2 v3)
+             (LetCont
+                 ((k1 ()
+                    (LetPrim (v4 (Constant (Null)))
+                      (InvokeContinuation return (v4))))
+                  (k2 ()
+                    (LetCont
+                        ((k3 (v5)
+                           (LetCont
+                               ((k4 (v6)
+                                  (LetPrim (v7 (Constant (Int 1)))
+                                    (LetCont
+                                        ((k5 (v8)
+                                           (InvokeContinuation rec k0 (v2 v8))))
+                                      (InvokeMethod v3 + (v7) k5)))))
+                             (InvokeStatic print (v5) k4))))
+                      (InvokeMethod v2 toString () k3))))
+               (LetPrim (v9 (Constant (Int 2)))
+                 (LetCont
+                     ((k6 (v10)
+                        (Branch (IsTrue v10) k2 k1)))
+                   (InvokeMethod v3 < (v9) k6))))))
         (InvokeContinuation k0 (v0 v1))))))
 """;
 
@@ -46,23 +52,29 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 42)))
     (LetPrim (v1 (Constant (Int 0)))
-      (LetCont* (k0 (v2)
-          (LetCont (k1 ()
-              (LetPrim (v3 (Constant (Null)))
-                (InvokeContinuation return (v3))))
-            (LetCont (k2 ()
-                (LetCont (k3 (v4)
-                    (LetCont (k4 (v5)
-                        (LetPrim (v6 (Constant (Int 1)))
-                          (LetCont (k5 (v7)
-                              (InvokeContinuation* k0 (v7)))
-                            (InvokeMethod v2 + (v6) k5))))
-                      (InvokeStatic print (v4) k4)))
-                  (InvokeMethod v0 toString () k3)))
-              (LetPrim (v8 (Constant (Int 2)))
-                (LetCont (k6 (v9)
-                    (Branch (IsTrue v9) k2 k1))
-                  (InvokeMethod v2 < (v8) k6))))))
+      (LetCont
+          ((rec k0 (v2)
+             (LetCont
+                 ((k1 ()
+                    (LetPrim (v3 (Constant (Null)))
+                      (InvokeContinuation return (v3))))
+                  (k2 ()
+                    (LetCont
+                        ((k3 (v4)
+                           (LetCont
+                               ((k4 (v5)
+                                  (LetPrim (v6 (Constant (Int 1)))
+                                    (LetCont
+                                        ((k5 (v7)
+                                           (InvokeContinuation rec k0 (v7))))
+                                      (InvokeMethod v2 + (v6) k5)))))
+                             (InvokeStatic print (v4) k4))))
+                      (InvokeMethod v0 toString () k3))))
+               (LetPrim (v8 (Constant (Int 2)))
+                 (LetCont
+                     ((k6 (v9)
+                        (Branch (IsTrue v9) k2 k1)))
+                   (InvokeMethod v2 < (v8) k6))))))
         (InvokeContinuation k0 (v1))))))
 """;
 
@@ -85,40 +97,52 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 42)))
     (LetPrim (v1 (Constant (Int 0)))
-      (LetCont* (k0 (v2 v3)
-          (LetCont (k1 ()
-              (LetCont (k2 (v4)
-                  (LetCont (k3 (v5)
-                      (LetPrim (v6 (Constant (Null)))
-                        (InvokeContinuation return (v6))))
-                    (InvokeStatic print (v4) k3)))
-                (InvokeMethod v2 toString () k2)))
-            (LetCont (k4 ()
-                (LetPrim (v7 (Constant (Int 0)))
-                  (LetCont* (k5 (v8 v9 v10)
-                      (LetCont (k6 ()
-                          (LetPrim (v11 (Constant (Int 1)))
-                            (LetCont (k7 (v12)
-                                (InvokeContinuation* k0 (v8 v12)))
-                              (InvokeMethod v9 + (v11) k7))))
-                        (LetCont (k8 ()
-                            (LetCont (k9 (v13)
-                                (LetCont (k10 (v14)
-                                    (LetPrim (v15 (Constant (Int 1)))
-                                      (LetCont (k11 (v16)
-                                          (InvokeContinuation* k5 (v8 v9 v16)))
-                                        (InvokeMethod v10 + (v15) k11))))
-                                  (InvokeStatic print (v13) k10)))
-                              (InvokeMethod v9 toString () k9)))
-                          (LetPrim (v17 (Constant (Int 2)))
-                            (LetCont (k12 (v18)
-                                (Branch (IsTrue v18) k8 k6))
-                              (InvokeMethod v10 < (v17) k12))))))
-                    (InvokeContinuation k5 (v2 v3 v7)))))
-              (LetPrim (v19 (Constant (Int 2)))
-                (LetCont (k13 (v20)
-                    (Branch (IsTrue v20) k4 k1))
-                  (InvokeMethod v3 < (v19) k13))))))
+      (LetCont
+          ((rec k0 (v2 v3)
+             (LetCont
+                 ((k1 ()
+                    (LetCont
+                        ((k2 (v4)
+                           (LetCont
+                               ((k3 (v5)
+                                  (LetPrim (v6 (Constant (Null)))
+                                    (InvokeContinuation return (v6)))))
+                             (InvokeStatic print (v4) k3))))
+                      (InvokeMethod v2 toString () k2)))
+                  (k4 ()
+                    (LetPrim (v7 (Constant (Int 0)))
+                      (LetCont
+                          ((rec k5 (v8 v9 v10)
+                             (LetCont
+                                 ((k6 ()
+                                    (LetPrim (v11 (Constant (Int 1)))
+                                      (LetCont
+                                          ((k7 (v12)
+                                             (InvokeContinuation rec k0 (v8 v12))))
+                                        (InvokeMethod v9 + (v11) k7))))
+                                  (k8 ()
+                                    (LetCont
+                                        ((k9 (v13)
+                                           (LetCont
+                                               ((k10 (v14)
+                                                  (LetPrim (v15 (Constant (Int 1)))
+                                                    (LetCont
+                                                        ((k11 (v16)
+                                                           (InvokeContinuation rec k5 (v8 v9 v16))))
+                                                      (InvokeMethod v10 + (v15) k11)))))
+                                             (InvokeStatic print (v13) k10))))
+                                      (InvokeMethod v9 toString () k9))))
+                               (LetPrim (v17 (Constant (Int 2)))
+                                 (LetCont
+                                     ((k12 (v18)
+                                        (Branch (IsTrue v18) k8 k6)))
+                                   (InvokeMethod v10 < (v17) k12))))))
+                        (InvokeContinuation k5 (v2 v3 v7))))))
+               (LetPrim (v19 (Constant (Int 2)))
+                 (LetCont
+                     ((k13 (v20)
+                        (Branch (IsTrue v20) k4 k1)))
+                   (InvokeMethod v3 < (v19) k13))))))
         (InvokeContinuation k0 (v0 v1))))))
 """;
 
@@ -126,40 +150,52 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 42)))
     (LetPrim (v1 (Constant (Int 0)))
-      (LetCont* (k0 (v2)
-          (LetCont (k1 ()
-              (LetCont (k2 (v3)
-                  (LetCont (k3 (v4)
-                      (LetPrim (v5 (Constant (Null)))
-                        (InvokeContinuation return (v5))))
-                    (InvokeStatic print (v3) k3)))
-                (InvokeMethod v0 toString () k2)))
-            (LetCont (k4 ()
-                (LetPrim (v6 (Constant (Int 0)))
-                  (LetCont* (k5 (v7)
-                      (LetCont (k6 ()
-                          (LetPrim (v8 (Constant (Int 1)))
-                            (LetCont (k7 (v9)
-                                (InvokeContinuation* k0 (v9)))
-                              (InvokeMethod v2 + (v8) k7))))
-                        (LetCont (k8 ()
-                            (LetCont (k9 (v10)
-                                (LetCont (k10 (v11)
-                                    (LetPrim (v12 (Constant (Int 1)))
-                                      (LetCont (k11 (v13)
-                                          (InvokeContinuation* k5 (v13)))
-                                        (InvokeMethod v7 + (v12) k11))))
-                                  (InvokeStatic print (v10) k10)))
-                              (InvokeMethod v2 toString () k9)))
-                          (LetPrim (v14 (Constant (Int 2)))
-                            (LetCont (k12 (v15)
-                                (Branch (IsTrue v15) k8 k6))
-                              (InvokeMethod v7 < (v14) k12))))))
-                    (InvokeContinuation k5 (v6)))))
-              (LetPrim (v16 (Constant (Int 2)))
-                (LetCont (k13 (v17)
-                    (Branch (IsTrue v17) k4 k1))
-                  (InvokeMethod v2 < (v16) k13))))))
+      (LetCont
+          ((rec k0 (v2)
+             (LetCont
+                 ((k1 ()
+                    (LetCont
+                        ((k2 (v3)
+                           (LetCont
+                               ((k3 (v4)
+                                  (LetPrim (v5 (Constant (Null)))
+                                    (InvokeContinuation return (v5)))))
+                             (InvokeStatic print (v3) k3))))
+                      (InvokeMethod v0 toString () k2)))
+                  (k4 ()
+                    (LetPrim (v6 (Constant (Int 0)))
+                      (LetCont
+                          ((rec k5 (v7)
+                             (LetCont
+                                 ((k6 ()
+                                    (LetPrim (v8 (Constant (Int 1)))
+                                      (LetCont
+                                          ((k7 (v9)
+                                             (InvokeContinuation rec k0 (v9))))
+                                        (InvokeMethod v2 + (v8) k7))))
+                                  (k8 ()
+                                    (LetCont
+                                        ((k9 (v10)
+                                           (LetCont
+                                               ((k10 (v11)
+                                                  (LetPrim (v12 (Constant (Int 1)))
+                                                    (LetCont
+                                                        ((k11 (v13)
+                                                           (InvokeContinuation rec k5 (v13))))
+                                                      (InvokeMethod v7 + (v12) k11)))))
+                                             (InvokeStatic print (v10) k10))))
+                                      (InvokeMethod v2 toString () k9))))
+                               (LetPrim (v14 (Constant (Int 2)))
+                                 (LetCont
+                                     ((k12 (v15)
+                                        (Branch (IsTrue v15) k8 k6)))
+                                   (InvokeMethod v7 < (v14) k12))))))
+                        (InvokeContinuation k5 (v6))))))
+               (LetPrim (v16 (Constant (Int 2)))
+                 (LetCont
+                     ((k13 (v17)
+                        (Branch (IsTrue v17) k4 k1)))
+                   (InvokeMethod v2 < (v16) k13))))))
         (InvokeContinuation k0 (v1))))))
 """;
 
@@ -176,22 +212,28 @@
 String BASIC_LOOP_IN = """
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
-    (LetCont* (k0 (v1)
-        (LetCont (k1 ()
-            (LetPrim (v2 (Constant (Null)))
-              (InvokeContinuation return (v2))))
-          (LetCont (k2 ()
-              (LetCont (k3 (v3)
-                  (LetCont (k4 (v4)
-                      (LetPrim (v5 (Constant (Int 1)))
-                        (LetCont (k5 (v6)
-                            (InvokeContinuation* k0 (v6)))
-                          (InvokeMethod v1 + (v5) k5))))
-                    (InvokeStatic print (v3) k4)))
-                (InvokeMethod v1 toString () k3)))
+    (LetCont
+       ((rec k0 (v1)
+          (LetCont
+              ((k1 ()
+                 (LetPrim (v2 (Constant (Null)))
+                   (InvokeContinuation return (v2))))
+               (k2 ()
+                 (LetCont
+                     ((k3 (v3)
+                        (LetCont
+                            ((k4 (v4)
+                               (LetPrim (v5 (Constant (Int 1)))
+                                 (LetCont
+                                     ((k5 (v6)
+                                        (InvokeContinuation rec k0 (v6))))
+                                   (InvokeMethod v1 + (v5) k5)))))
+                          (InvokeStatic print (v3) k4))))
+                   (InvokeMethod v1 toString () k3))))
             (LetPrim (v7 (Constant (Int 2)))
-              (LetCont (k6 (v8)
-                  (Branch (IsTrue v8) k2 k1))
+              (LetCont
+                  ((k6 (v8)
+                     (Branch (IsTrue v8) k2 k1)))
                 (InvokeMethod v1 < (v7) k6))))))
       (InvokeContinuation k0 (v0)))))
 """;
@@ -204,8 +246,9 @@
 
 String SCOPING_IN = """
 (FunctionDefinition main () return ()
-  (LetCont (k0 (v1)
-      (InvokeStatic print (v1) return))
+  (LetCont
+      ((k0 (v1)
+         (InvokeStatic print (v1) return)))
     (LetPrim (v0 (Constant (Int 0)))
       (LetPrim (v2 (Constant (Null)))
         (InvokeContinuation k0 (v0))))))
@@ -214,8 +257,9 @@
 String SCOPING_OUT = """
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
-    (LetCont (k0 ()
-        (InvokeStatic print (v0) return))
+    (LetCont
+        ((k0 ()
+           (InvokeStatic print (v0) return)))
       (LetPrim (v1 (Constant (Null)))
         (InvokeContinuation k0 ())))))
 """;
@@ -226,8 +270,9 @@
 String NEVER_INVOKED_IN = """
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
-    (LetCont (k0 (v1)
-        (InvokeStatic print (v1) return))
+    (LetCont
+        ((k0 (v1)
+           (InvokeStatic print (v1) return)))
       (InvokeContinuation return (v0)))))
 """;
 
diff --git a/tests/compiler/dart2js/backend_dart/opt_shrinking_test.dart b/tests/compiler/dart2js/backend_dart/opt_shrinking_test.dart
index 3e8c17d..a0c4751 100644
--- a/tests/compiler/dart2js/backend_dart/opt_shrinking_test.dart
+++ b/tests/compiler/dart2js/backend_dart/opt_shrinking_test.dart
@@ -44,9 +44,9 @@
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 42)))
     (LetPrim (v1 (Constant (Int 1)))
-      (LetCont (k0 (v2)
-          (LetPrim (v3 (Constant (Int 0)))
-            (InvokeContinuation return (v3))))
+      (LetCont ((k0 (v2)
+                  (LetPrim (v3 (Constant (Int 0)))
+                    (InvokeContinuation return (v3)))))
         (InvokeMethod v0 + (v1) k0)))))
 """;
 String ITERATIVE_DEAD_VAL1_OUT = ITERATIVE_DEAD_VAL1_IN;
@@ -75,23 +75,23 @@
 String DEAD_CONT_IN = """
 (FunctionDefinition main () return ()
   (LetPrim (v4 (Constant (Int 0)))
-    (LetCont (k0 (v0)
-        (InvokeConstructor List () return))
-      (LetCont (k1 (v1)
-          (LetCont (k2 (v2)
-              (LetPrim (v3 (Constant (Int 0)))
-                (InvokeContinuation return (v3))))
-            (InvokeStatic print (v4) k2)))
+    (LetCont ((k0 (v0)
+                (InvokeConstructor List () return)))
+      (LetCont ((k1 (v1)
+                  (LetCont ((k2 (v2)
+                              (LetPrim (v3 (Constant (Int 0)))
+                                (InvokeContinuation return (v3)))))
+                    (InvokeStatic print (v4) k2))))
         (InvokeStatic print (v4) k1)))))
 """;
 String DEAD_CONT_OUT = """
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
-    (LetCont (k0 (v1)
-        (LetCont (k1 (v2)
-            (LetPrim (v3 (Constant (Int 0)))
-              (InvokeContinuation return (v3))))
-          (InvokeStatic print (v0) k1)))
+    (LetCont ((k0 (v1)
+                (LetCont ((k1 (v2)
+                            (LetPrim (v3 (Constant (Int 0)))
+                              (InvokeContinuation return (v3)))))
+                  (InvokeStatic print (v0) k1))))
       (InvokeStatic print (v0) k0))))
 """;
 
@@ -100,25 +100,25 @@
 String ITERATIVE_DEAD_CONT_IN = """
 (FunctionDefinition main () return ()
   (LetPrim (v4 (Constant (Int 0)))
-    (LetCont (k0 (v0)
-      (InvokeConstructor List () return))
-    (LetCont (k3 (v5)
-      (InvokeContinuation k0 (v5)))
-    (LetCont (k1 (v1)
-      (LetCont (k2 (v2)
-        (LetPrim (v3 (Constant (Int 0)))
-          (InvokeContinuation return (v3))))
-      (InvokeStatic print (v4) k2)))
-    (InvokeStatic print (v4) k1))))))
+    (LetCont ((k0 (v0)
+                (InvokeConstructor List () return)))
+      (LetCont ((k3 (v5)
+                  (InvokeContinuation k0 (v5))))
+        (LetCont ((k1 (v1)
+                    (LetCont ((k2 (v2)
+                                (LetPrim (v3 (Constant (Int 0)))
+                                  (InvokeContinuation return (v3)))))
+                      (InvokeStatic print (v4) k2))))
+          (InvokeStatic print (v4) k1))))))
 """;
 String ITERATIVE_DEAD_CONT_OUT = """
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
-    (LetCont (k0 (v1)
-        (LetCont (k1 (v2)
-            (LetPrim (v3 (Constant (Int 0)))
-              (InvokeContinuation return (v3))))
-          (InvokeStatic print (v0) k1)))
+    (LetCont ((k0 (v1)
+                (LetCont ((k1 (v2)
+                            (LetPrim (v3 (Constant (Int 0)))
+                              (InvokeContinuation return (v3)))))
+                  (InvokeStatic print (v0) k1))))
       (InvokeStatic print (v0) k0))))
 """;
 
@@ -127,24 +127,24 @@
 
 String BETA_CONT_LIN_IN = """
 (FunctionDefinition main () return ()
-  (LetCont (k0 (v0)
-      (LetCont (k1 (v1)
-          (LetCont (k2 (v2)
-              (LetPrim (v3 (Constant (Int 0)))
-                (InvokeContinuation return (v3))))
-            (InvokeStatic print (v0) k2)))
-        (InvokeStatic print (v0) k1)))
+  (LetCont ((k0 (v0)
+              (LetCont ((k1 (v1)
+                          (LetCont ((k2 (v2)
+                                      (LetPrim (v3 (Constant (Int 0)))
+                                        (InvokeContinuation return (v3)))))
+                            (InvokeStatic print (v0) k2))))
+                (InvokeStatic print (v0) k1))))
     (LetPrim (v4 (Constant (Int 0)))
       (InvokeContinuation k0 (v4)))))
 """;
 String BETA_CONT_LIN_OUT = """
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
-    (LetCont (k0 (v1)
-        (LetCont (k1 (v2)
-            (LetPrim (v3 (Constant (Int 0)))
-              (InvokeContinuation return (v3))))
-          (InvokeStatic print (v0) k1)))
+    (LetCont ((k0 (v1)
+                (LetCont ((k1 (v2)
+                            (LetPrim (v3 (Constant (Int 0)))
+                              (InvokeContinuation return (v3)))))
+                  (InvokeStatic print (v0) k1))))
       (InvokeStatic print (v0) k0))))
 """;
 
@@ -152,8 +152,8 @@
 
 String RECURSIVE_BETA_CONT_LIN_IN = """
 (FunctionDefinition main () return ()
-  (LetCont* (k0 (v0)
-      (InvokeContinuation* k0 (v0)))
+  (LetCont ((rec k0 (v0)
+              (InvokeContinuation rec k0 (v0))))
     (LetPrim (v1 (Constant (Int 0)))
       (InvokeContinuation k0 (v1)))))
 """;
@@ -164,54 +164,131 @@
 String USED_BETA_CONT_LIN_IN = """
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
-    (LetCont (k0 (v1)
-        (LetCont (k1 (v2)
-            (LetCont (k2 (v3)
-                (LetPrim (v4 (Constant (Int 0)))
-                  (InvokeContinuation return (v4))))
-              (InvokeStatic print (v1) k2)))
-          (InvokeStatic print (v1) k1)))
+    (LetCont ((k0 (v1)
+                (LetCont ((k1 (v2)
+                            (LetCont ((k2 (v3)
+                                        (LetPrim (v4 (Constant (Int 0)))
+                                          (InvokeContinuation return (v4)))))
+                              (InvokeStatic print (v1) k2))))
+                  (InvokeStatic print (v1) k1))))
       (LetPrim (v5
-          (CreateFunction
-            (FunctionDefinition f () return ()
-              (InvokeContinuation return (v1)))))
+                 (CreateFunction
+                   (FunctionDefinition f () return ()
+                     (InvokeContinuation return (v1)))))
         (InvokeContinuation k0 (v0))))))
 """;
 String USED_BETA_CONT_LIN_OUT = """
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
-    (LetCont (k0 (v1)
-        (LetCont (k1 (v2)
-            (LetPrim (v3 (Constant (Int 0)))
-              (InvokeContinuation return (v3))))
-          (InvokeStatic print (v0) k1)))
+    (LetCont ((k0 (v1)
+                (LetCont ((k1 (v2)
+                            (LetPrim (v3 (Constant (Int 0)))
+                              (InvokeContinuation return (v3)))))
+                  (InvokeStatic print (v0) k1))))
       (InvokeStatic print (v0) k0))))
 """;
 
 // Eta-cont: letcont k x = j x in K -> K[j/k].
 // IR written by hand.
-
+//
+// This test is incorrectly named: with the current implementation, there is no
+// eta reduction.  Instead, dead-parameter, beta-cont-lin, and dead-val
+// reductions are performed, which in turn creates a second beta-cont-lin
+// reduction.
+//
+// TODO(kmillikin): To test continuation eta reduction, use eta redexes that are
+// not overlapping beta redexes.
 String ETA_CONT_IN = """
 (FunctionDefinition main () return ()
-  (LetPrim (v3 (Constant (Int 0)))
-    (LetCont* (k1 (v1)
-        (InvokeContinuation return (v3)))
-      (LetCont (k0 (v0)
-          (InvokeContinuation k1 (v0)))
-        (LetPrim (v4
-            (CreateFunction
-              (FunctionDefinition f () return ()
-                (InvokeContinuation k1 (v3)))))
-          (InvokeContinuation k0 (v3)))))))
+  (LetPrim (v0 (Constant (Int 0)))
+    (LetCont ((rec k0 (v1)
+                (InvokeContinuation return (v0))))
+      (LetCont ((k1 (v2)
+                  (InvokeContinuation k0 (v2))))
+        (LetPrim (v3
+                   (CreateFunction
+                     (FunctionDefinition f () return ()
+                       (InvokeContinuation k0 (v0)))))
+          (InvokeContinuation k1 (v0)))))))
 """;
 String ETA_CONT_OUT = """
 (FunctionDefinition main () return ()
   (LetPrim (v0 (Constant (Int 0)))
-    (LetCont (k0 (v1)
-        (InvokeContinuation return (v0)))
-      (InvokeContinuation k0 (v0)))))
+    (InvokeContinuation return (v0))))
 """;
 
+// Dead-parameter:
+// letcont k x = E0 in E1 -> letcont k () = E0 in E1,
+//    if x does not occur free in E0.
+
+// Parameter v1 is unused in k0.
+String DEAD_PARAMETER_IN = """
+(FunctionDefinition main (x) return ()
+  (LetCont ((k0 (v0 v1 v2)
+              (InvokeStatic foo (v0 v2) return)))
+    (LetCont ((k1 ()
+                (LetPrim (v3 (Constant (Int 0)))
+                  (LetPrim (v4 (Constant (Int 1)))
+                    (LetPrim (v5 (Constant (Int 2)))
+                      (InvokeContinuation k0 (v3 v4 v5))))))
+              (k2 ()
+                (LetPrim (v6 (Constant (Int 3)))
+                  (LetPrim (v7 (Constant (Int 4)))
+                    (LetPrim (v8 (Constant (Int 5)))
+                      (InvokeContinuation k0 (v6 v7 v8)))))))
+      (Branch (IsTrue x) k1 k2))))
+""";
+String DEAD_PARAMETER_OUT = """
+(FunctionDefinition main (x) return ()
+  (LetCont ((k0 (v0 v1)
+              (InvokeStatic foo (v0 v1) return)))
+    (LetCont ((k1 ()
+                (LetPrim (v2 (Constant (Int 0)))
+                  (LetPrim (v3 (Constant (Int 2)))
+                    (InvokeContinuation k0 (v2 v3)))))
+              (k2 ()
+                (LetPrim (v4 (Constant (Int 3)))
+                  (LetPrim (v5 (Constant (Int 5)))
+                    (InvokeContinuation k0 (v4 v5))))))
+      (Branch (IsTrue x) k1 k2))))
+""";
+
+// Create an eta-cont redex:
+// Dead parameter reductions can create an eta-cont redex by removing unused
+// continuation parameters and thus creating the eta redex.
+String CREATE_ETA_CONT_IN = """
+(FunctionDefinition main (x) return ()
+  (LetCont ((rec loop (v0)
+              (InvokeContinuation rec loop (v0))))
+    (LetCont ((created (v1 v2 v3)
+                (InvokeContinuation loop (v2))))
+      (LetCont ((then ()
+                  (LetPrim (v4 (Constant (Int 0)))
+                    (LetPrim (v5 (Constant (Int 1)))
+                      (LetPrim (v6 (Constant (Int 2)))
+                        (InvokeContinuation created (v4 v5 v6))))))
+                (else ()
+                  (LetPrim (v6 (Constant (Int 3)))
+                    (LetPrim (v7 (Constant (Int 4)))
+                      (LetPrim (v8 (Constant (Int 5)))
+                        (InvokeContinuation created (v6 v7 v8)))))))
+        (Branch (IsTrue x) then else)))))
+""";
+String CREATE_ETA_CONT_OUT = """
+(FunctionDefinition main (x) return ()
+  (LetCont ((rec k0 (v0)
+              (InvokeContinuation rec k0 (v0))))
+    (LetCont ((k1 ()
+                (LetPrim (v1 (Constant (Int 1)))
+                  (InvokeContinuation k0 (v1))))
+              (k2 ()
+                (LetPrim (v2 (Constant (Int 4)))
+                  (InvokeContinuation k0 (v2)))))
+      (Branch (IsTrue x) k1 k2))))
+""";
+
+
+
 // Beta-fun-lin and eta-fun might not apply to us, since
 // a. in (InvokeMethod v0 call k0), v0 might carry state, and
 // b. there is no way to generate static nested functions that we could
@@ -234,7 +311,7 @@
   optimizer.rewrite(f);
 
   String expected = normalizeSExpr(expectedOutput);
-  String actual   = normalizeSExpr(stringifier.visit(f));
+  String actual = normalizeSExpr(stringifier.visit(f));
 
   Expect.equals(expected, actual);
 }
@@ -249,4 +326,6 @@
   testShrinkingReducer(RECURSIVE_BETA_CONT_LIN_IN, RECURSIVE_BETA_CONT_LIN_OUT);
   testShrinkingReducer(USED_BETA_CONT_LIN_IN, USED_BETA_CONT_LIN_OUT);
   testShrinkingReducer(ETA_CONT_IN, ETA_CONT_OUT);
+  testShrinkingReducer(DEAD_PARAMETER_IN, DEAD_PARAMETER_OUT);
+  testShrinkingReducer(CREATE_ETA_CONT_IN, CREATE_ETA_CONT_OUT);
 }
diff --git a/tests/compiler/dart2js/backend_dart/sexpr_test.dart b/tests/compiler/dart2js/backend_dart/sexpr_test.dart
index 9c4831e..4ab2235 100644
--- a/tests/compiler/dart2js/backend_dart/sexpr_test.dart
+++ b/tests/compiler/dart2js/backend_dart/sexpr_test.dart
@@ -146,7 +146,7 @@
           , "InvokeContinuation"
           , "InvokeMethod"
           , "InvokeStatic"
-          , "InvokeSuperMethod"
+          , "InvokeMethodDirectly"
           , "LetCont"
           , "LetPrim"
           , "SetClosureVariable"
diff --git a/tests/compiler/dart2js/backend_dart/sexpr_unstringifier.dart b/tests/compiler/dart2js/backend_dart/sexpr_unstringifier.dart
index be67d02..7e52585 100644
--- a/tests/compiler/dart2js/backend_dart/sexpr_unstringifier.dart
+++ b/tests/compiler/dart2js/backend_dart/sexpr_unstringifier.dart
@@ -119,13 +119,11 @@
   static const String DECLARE_FUNCTION = "DeclareFunction";
   static const String INVOKE_CONSTRUCTOR = "InvokeConstructor";
   static const String INVOKE_CONTINUATION = "InvokeContinuation";
-  static const String INVOKE_CONTINUATION_RECURSIVE = "InvokeContinuation*";
   static const String INVOKE_STATIC = "InvokeStatic";
-  static const String INVOKE_SUPER_METHOD = "InvokeSuperMethod";
+  static const String INVOKE_METHOD_DIRECTLY = "InvokeMethodDirectly";
   static const String INVOKE_METHOD = "InvokeMethod";
   static const String LET_PRIM = "LetPrim";
   static const String LET_CONT = "LetCont";
-  static const String LET_CONT_RECURSIVE = "LetCont*";
   static const String SET_CLOSURE_VARIABLE = "SetClosureVariable";
   static const String TYPE_OPERATOR = "TypeOperator";
 
@@ -221,21 +219,17 @@
       case INVOKE_CONSTRUCTOR:
         return parseInvokeConstructor();
       case INVOKE_CONTINUATION:
-        return parseInvokeContinuation(false);
-      case INVOKE_CONTINUATION_RECURSIVE:
-        return parseInvokeContinuation(true);
+        return parseInvokeContinuation();
       case INVOKE_METHOD:
         return parseInvokeMethod();
       case INVOKE_STATIC:
         return parseInvokeStatic();
-      case INVOKE_SUPER_METHOD:
-        return parseInvokeSuperMethod();
+      case INVOKE_METHOD_DIRECTLY:
+        return parseInvokeMethodDirectly();
       case LET_PRIM:
         return parseLetPrim();
       case LET_CONT:
-        return parseLetCont(false);
-      case LET_CONT_RECURSIVE:
-        return parseLetCont(true);
+        return parseLetCont();
       case SET_CLOSURE_VARIABLE:
         return parseSetClosureVariable();
       case TYPE_OPERATOR:
@@ -390,18 +384,20 @@
     return new InvokeConstructor(type, element, selector, cont, args);
   }
 
-  /// (InvokeContinuation name (args))
-  InvokeContinuation parseInvokeContinuation(bool recursive) {
-    tokens.consumeStart(recursive
-        ? INVOKE_CONTINUATION_RECURSIVE : INVOKE_CONTINUATION);
-
-    Continuation cont = name2variable[tokens.read()];
+  /// (InvokeContinuation rec? name (args))
+  InvokeContinuation parseInvokeContinuation() {
+    tokens.consumeStart(INVOKE_CONTINUATION);
+    String name = tokens.read();
+    bool isRecursive = name == "rec";
+    if (isRecursive) name = tokens.read();
+    
+    Continuation cont = name2variable[name];
     assert(cont != null);
 
     List<Primitive> args = parsePrimitiveList();
 
     tokens.consumeEnd();
-    return new InvokeContinuation(cont, args, recursive: recursive);
+    return new InvokeContinuation(cont, args, recursive: isRecursive);
   }
 
   /// (InvokeMethod receiver method (args) cont)
@@ -441,9 +437,12 @@
     return new InvokeStatic(entity, selector, cont, args);
   }
 
-  /// (InvokeSuperMethod method (args) cont)
-  InvokeSuperMethod parseInvokeSuperMethod() {
-    tokens.consumeStart(INVOKE_SUPER_METHOD);
+  /// (InvokeMethodDirectly receiver method (args) cont)
+  InvokeMethodDirectly parseInvokeMethodDirectly() {
+    tokens.consumeStart(INVOKE_METHOD_DIRECTLY);
+
+    Definition receiver = name2variable[tokens.read()];
+    assert(receiver != null);
 
     String methodName = tokens.read();
 
@@ -453,17 +452,18 @@
     assert(cont != null);
 
     tokens.consumeEnd();
+    Element element = new DummyElement(methodName);
     Selector selector = dummySelector(methodName, args.length);
-    return new InvokeSuperMethod(selector, cont, args);
+    return new InvokeMethodDirectly(receiver, element, selector, cont, args);
   }
 
-  /// (LetCont (name (args) cont_body) body)
-  LetCont parseLetCont(bool recursive) {
-    tokens.consumeStart(recursive ? LET_CONT_RECURSIVE : LET_CONT);
-
-    // (name
+  // (rec? name (args) body)
+  Continuation parseContinuation() {
+    // (rec? name
     tokens.consumeStart();
     String name = tokens.read();
+    bool isRecursive = name == "rec";
+    if (isRecursive) name = tokens.read();
 
     // (args)
     tokens.consumeStart();
@@ -479,16 +479,28 @@
     Continuation cont = new Continuation(params);
     name2variable[name] = cont;
 
-    cont.isRecursive = recursive;
+    cont.isRecursive = isRecursive;
     // cont_body
     cont.body = parseExpression();
     tokens.consumeEnd();
+    return cont;
+  }
+
+  /// (LetCont (continuations) body)
+  LetCont parseLetCont() {
+    tokens.consumeStart(LET_CONT);
+    tokens.consumeStart();
+    List<Continuation> continuations = <Continuation>[];
+    while (tokens.current != ")") {
+      continuations.add(parseContinuation());
+    }
+    tokens.consumeEnd();
 
     // body)
     Expression body = parseExpression();
     tokens.consumeEnd();
 
-    return new LetCont(cont, body);
+    return new LetCont.many(continuations, body);
   }
 
   /// (SetClosureVariable name value body)
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index 57f624d..76e1114 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -42,16 +42,23 @@
 check_elements_invariants_test: Skip # Slow and only needs to be run in one
                                      # configuration
 
-mirror_final_field_inferrer2_test: Crash, Pass, Slow # dartbug.com/15581
+mirror_final_field_inferrer2_test: Crash, Pass, Slow # Issue 15581
 
-deferred_mirrors_test: Pass, Slow
-in_user_code_test: Pass, Slow
 analyze_unused_dart2js_test: Pass, Slow
-exit_code_test: Pass, Slow
-deferred_load_graph_segmentation_test: Pass, Slow
 check_members_test: Pass, Slow
+dart2js_batch_test: Pass, Slow
+deferred_load_graph_segmentation_test: Pass, Slow
+deferred_load_mapping_test: Pass, Slow
+deferred_mirrors_test: Pass, Slow
 duplicate_library_test: Pass, Slow
+exit_code_test: Pass, Slow
+import_mirrors_test: Pass, Slow
+in_user_code_test: Pass, Slow
+js_backend_cps_ir_basic_test: Pass, Slow
+js_backend_cps_ir_closures_test: Pass, Slow
+message_kind_test: Pass, Slow
 show_package_warnings_test: Pass, Slow
+source_map_pub_build_validity_test: Pass, Slow
 
 # Don't mark these tests as failing. Instead, fix the errors/warnings that they
 # report or update the whitelist in the test-files to temporarily allow
diff --git a/tests/compiler/dart2js/exit_code_test.dart b/tests/compiler/dart2js/exit_code_test.dart
index 3bf7efe..b70fe4a 100644
--- a/tests/compiler/dart2js/exit_code_test.dart
+++ b/tests/compiler/dart2js/exit_code_test.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// Test the exit code of dart2js in case of exceptions, fatal errors, errors,
-// warnings, etc.
+// Test the exit code of dart2js in case of exceptions, errors, warnings, etc.
 
 
 import 'dart:async';
@@ -97,12 +96,6 @@
         reportError(NO_LOCATION_SPANNABLE,
                     MessageKind.GENERIC, {'text': marker});
         break;
-      case 'fatalError':
-        onTest(testMarker, testType);
-        reportError(NO_LOCATION_SPANNABLE,
-                    MessageKind.GENERIC, {'text': marker});
-        throw new CompilerCancelledException(null);
-        break;
       case 'internalError':
         onTest(testMarker, testType);
         internalError(NO_LOCATION_SPANNABLE, marker);
@@ -235,7 +228,6 @@
     'invariant': 253,
     'warning': 0,
     'error': 1,
-    'fatalError': 1,
     'internalError': 253,
   };
 
diff --git a/tests/compiler/dart2js/import_test.dart b/tests/compiler/dart2js/import_test.dart
index 2fce82d..aeaa469 100644
--- a/tests/compiler/dart2js/import_test.dart
+++ b/tests/compiler/dart2js/import_test.dart
@@ -33,9 +33,7 @@
   var compiler = compilerFor(MEMORY_SOURCE_FILES, diagnosticHandler: collector);
   asyncTest(() => compiler.run(Uri.parse('memory:main.dart')).then((_) {
     Expect.equals(4, collector.errors.length);
-    // TODO(johnniwinther): Expect 1 warning when analysis of programs with load
-    // failures is reenabled.
-    Expect.equals(0, collector.warnings.length);
+    Expect.equals(1, collector.warnings.length);
   }));
 }
 
diff --git a/tests/compiler/dart2js/incremental/compile_all.dart b/tests/compiler/dart2js/incremental/compile_all.dart
index 0579f51..0c35641 100644
--- a/tests/compiler/dart2js/incremental/compile_all.dart
+++ b/tests/compiler/dart2js/incremental/compile_all.dart
@@ -38,7 +38,6 @@
 }
 
 void compileTests(Map<String, String> sources) {
-  int cancellations = 0;
   int testCount = 0;
   int skipCount = 0;
   Set<String> crashes = new Set<String>();
@@ -69,7 +68,6 @@
       UserTag.defaultTag.makeCurrent();
       sw.stop();
       print('Compiled $path in ${sw.elapsedMilliseconds}');
-      if (compiler.compilerWasCancelled) cancellations++;
       sw..reset()..start();
     }).catchError((error, trace) {
       sw.stop();
@@ -83,7 +81,6 @@
     print('''
 
 Total: $testCount tests
- * $cancellations tests (${percent(cancellations)}) cancelled the compiler
  * ${crashes.length} tests (${percent(crashes.length)}) crashed the compiler
  * $skipCount tests (${percent(skipCount)}) were skipped
 ''');
diff --git a/tests/compiler/dart2js/js_backend_cps_ir.dart b/tests/compiler/dart2js/js_backend_cps_ir.dart
index 34ccdfe..a435110 100644
--- a/tests/compiler/dart2js/js_backend_cps_ir.dart
+++ b/tests/compiler/dart2js/js_backend_cps_ir.dart
@@ -11,14 +11,20 @@
        show Compiler;
 import 'memory_compiler.dart';
 import 'package:compiler/src/js/js.dart' as js;
-import 'package:compiler/src/common.dart' show Element;
+import 'package:compiler/src/common.dart' show Element, ClassElement;
 
 const String TEST_MAIN_FILE = 'test.dart';
 
 class TestEntry {
   final String source;
   final String expectation;
-  const TestEntry(this.source, [this.expectation]);
+  final String elementName;
+
+  const TestEntry(this.source, [this.expectation])
+    : elementName = null;
+
+  const TestEntry.forMethod(this.elementName,
+      this.source, this.expectation);
 }
 
 String formatTest(Map test) {
@@ -31,9 +37,29 @@
   return js.prettyPrint(ast, compiler).getText();
 }
 
+String getCodeForMethod(Compiler compiler,
+                        String name) {
+  Element foundElement;
+  for (Element element in compiler.enqueuer.codegen.generatedCode.keys) {
+    if (element.toString() == name) {
+      if (foundElement != null) {
+        Expect.fail('Multiple compiled elements are called $name');
+      }
+      foundElement = element;
+    }
+  }
+
+  if (foundElement == null) {
+    Expect.fail('There is no compiled element called $name');
+  }
+
+  js.Node ast = compiler.enqueuer.codegen.generatedCode[foundElement];
+  return js.prettyPrint(ast, compiler).getText();
+}
 
 runTests(List<TestEntry> tests) {
-  Expect.isTrue(const bool.fromEnvironment("USE_CPS_IR"));
+  Expect.isTrue(const bool.fromEnvironment("USE_CPS_IR"),
+      'Run with USE_CPS_IR=true');
 
   for (TestEntry test in tests) {
     Map files = {TEST_MAIN_FILE: test.source};
@@ -45,7 +71,9 @@
         String expectation = test.expectation;
         if (expectation != null) {
           String expected = test.expectation;
-          String found = getCodeForMain(compiler);
+          String found = test.elementName == null
+              ? getCodeForMain(compiler)
+              : getCodeForMethod(compiler, test.elementName);
           if (expected != found) {
             Expect.fail('Expected:\n$expected\nbut found\n$found');
           }
diff --git a/tests/compiler/dart2js/js_backend_cps_ir_basic_test.dart b/tests/compiler/dart2js/js_backend_cps_ir_basic_test.dart
index cde5ccc..1243ba2 100644
--- a/tests/compiler/dart2js/js_backend_cps_ir_basic_test.dart
+++ b/tests/compiler/dart2js/js_backend_cps_ir_basic_test.dart
@@ -15,21 +15,21 @@
 bar(a, {b: "b", c: "c"}) => c;
 main() {
   foo(0);
-  foo(0, 1);
-  bar(0);
-  bar(0, b: 1);
-  bar(0, c: 1);
-  bar(0, b: 1, c: 2);
+  foo(1, 2);
+  bar(3);
+  bar(4, b: 5);
+  bar(6, c: 7);
+  bar(8, b: 9, c: 10);
 }
 """,
 """
 function() {
   V.foo(0, "b");
-  V.foo(0, 1);
-  V.bar(0, "b", "c");
-  V.bar(0, 1, "c");
-  V.bar(0, "b", 1);
-  V.bar(0, 1, 2);
+  V.foo(1, 2);
+  V.bar(3, "b", "c");
+  V.bar(4, 5, "c");
+  V.bar(6, "b", 7);
+  V.bar(8, 9, 10);
   return null;
 }"""),
   const TestEntry(
diff --git a/tests/compiler/dart2js/js_backend_cps_ir_constructor_test.dart b/tests/compiler/dart2js/js_backend_cps_ir_constructor_test.dart
new file mode 100644
index 0000000..b807c29
--- /dev/null
+++ b/tests/compiler/dart2js/js_backend_cps_ir_constructor_test.dart
@@ -0,0 +1,145 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// VMOptions=-DUSE_CPS_IR=true
+
+// Tests of interceptors.
+
+library constructor_test;
+
+import 'js_backend_cps_ir.dart';
+
+const List<TestEntry> tests = const [
+  const TestEntry.forMethod('generative_constructor(Sub#)', """
+class Base {
+  var x;
+  Base(this.x);
+}
+class Sub extends Base {
+  var y;
+  Sub(x, this.y) : super(x);
+}
+main() {
+  print(new Sub(1, 2).x);
+}""",
+r"""
+function(x, y) {
+  return new V.Sub(y, x);
+}"""),
+
+  const TestEntry.forMethod('generative_constructor_body(Sub#)', """
+class Base {
+  var x;
+  Base(this.x);
+}
+class Sub extends Base {
+  var y;
+  Sub(x, this.y) : super(x) {
+    print(x);
+  }
+}
+main() {
+  print(new Sub(1, 2).x);
+}""",
+r"""
+function(x, y) {
+  P.print(x);
+  return null;
+}"""),
+
+  const TestEntry.forMethod('generative_constructor(Sub#)', """
+class Base0 {
+  Base0() {
+    print('Base0');
+  }
+}
+class Base extends Base0 {
+  var x;
+  Base(this.x);
+}
+class Sub extends Base {
+  var y;
+  Sub(x, this.y) : super(x) {
+    print(x);
+  }
+}
+main() {
+  print(new Sub(1, 2).x);
+}""",
+r"""
+function(x, y) {
+  var v0;
+  v0 = new V.Sub(y, x);
+  v0.Base0$0();
+  v0.Sub$2(x, y);
+  return v0;
+}"""),
+
+  const TestEntry.forMethod('generative_constructor(Sub#)', """
+class Base0 {
+  Base0() {
+    print('Base0');
+  }
+}
+class Base extends Base0 {
+  var x;
+  Base(x1) : x = (() => ++x1) {
+    print(x1); // use boxed x1
+  }
+}
+class Sub extends Base {
+  var y;
+  Sub(x, this.y) : super(x) {
+    print(x);
+  }
+}
+main() {
+  print(new Sub(1, 2).x);
+}""",
+r"""
+function(x, y) {
+  var box_0, v0;
+  box_0 = {};
+  box_0.x1_0 = x;
+  v0 = new V.Sub(y, new V.Base_closure(box_0));
+  v0.Base0$0();
+  v0.Base$1(box_0);
+  v0.Sub$2(x, y);
+  return v0;
+}"""),
+
+  const TestEntry.forMethod('generative_constructor(Sub#)', """
+foo(x) {
+  print(x);
+}
+class Base {
+  var x1 = foo('x1');
+  var x2;
+  var x3 = foo('x3');
+  Base() : x2 = foo('x2');
+}
+class Sub extends Base {
+  var y1 = foo('y1');
+  var y2;
+  var y3;
+  Sub() : y2 = foo('y2'), super(), y3 = foo('y3');
+}
+main() {
+  new Sub();
+}
+""",
+r"""
+function() {
+  var v0, v1, v2, v3, v4;
+  v0 = V.foo("y1");
+  v1 = V.foo("y2");
+  v2 = V.foo("x1");
+  v3 = V.foo("x3");
+  v4 = V.foo("x2");
+  return new V.Sub(v0, v1, V.foo("y3"), v2, v4, v3);
+}"""),
+];
+
+void main() {
+  runTests(tests);
+}
diff --git a/tests/compiler/dart2js/js_backend_cps_ir_supercall_test.dart b/tests/compiler/dart2js/js_backend_cps_ir_supercall_test.dart
new file mode 100644
index 0000000..048beec
--- /dev/null
+++ b/tests/compiler/dart2js/js_backend_cps_ir_supercall_test.dart
@@ -0,0 +1,78 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// VMOptions=-DUSE_CPS_IR=true
+
+// Tests of interceptors.
+
+library supercall_test;
+
+import 'js_backend_cps_ir.dart';
+
+const List<TestEntry> tests = const [
+  const TestEntry.forMethod('function(Sub#m)', """
+class Base {
+  m(x) {
+    print(x+1);
+  }
+}
+class Sub extends Base {
+  m(x) => super.m(x+10);
+}
+main() {
+  new Sub().m(100);
+}""",
+r"""
+function(x) {
+  var v0, v1;
+  v0 = 10;
+  v1 = J.getInterceptor(x).$add(x, v0);
+  return V.Base.prototype.m$1.call(this, v1);
+}"""),
+
+const TestEntry.forMethod('function(Sub#+)', """
+class Base {
+  m(x) {
+    print(x+1000);
+  }
+  operator+(x) => m(x+10);
+}
+class Sub extends Base {
+  m(x) => super.m(x+100);
+  operator+(x) => super + (x+1);
+}
+main() {
+  new Sub() + 10000;
+}""",
+r"""
+function(x) {
+  var v0, v1, v2;
+  v0 = 1;
+  v1 = J.getInterceptor(x).$add(x, v0);
+  v2 = this;
+  return V.Base.prototype.$add.call(null, v2, v1);
+}"""),
+
+const TestEntry.forMethod('function(Sub#m)', """
+class Base {
+  var field;
+}
+class Sub extends Base {
+  m(x) => x + super.field;
+}
+main() {
+  print(new Sub().m(10));
+}""",
+r"""
+function(x) {
+  var v0;
+  v0 = this.field;
+  return J.getInterceptor(x).$add(x, v0);
+}"""),
+
+
+];
+
+void main() {
+  runTests(tests);
+}
diff --git a/tests/compiler/dart2js/js_parser_statements_test.dart b/tests/compiler/dart2js/js_parser_statements_test.dart
index 55c058a..38ccd1c 100644
--- a/tests/compiler/dart2js/js_parser_statements_test.dart
+++ b/tests/compiler/dart2js/js_parser_statements_test.dart
@@ -76,9 +76,11 @@
 void main() {
 
   var eOne = js('1');
+  var eTwo = js('2');
   var eTrue = js('true');
   var eVar = js('x');
   var block12 = js.statement('{ 1; 2; }');
+  var stm = js.statement('foo();');
   var seq1 = js('1, 2, 3');
 
   Expect.isTrue(eOne is jsAst.LiteralNumber);
@@ -131,6 +133,62 @@
                   {'a': false, 'b': block12},
                   '{\n  1;\n  2;\n}'),
 
+    testStatement('while (#) #', [eOne, block12], 'while (1) {\n  1;\n  2;\n}'),
+    testStatement('while (#) #;', [eTrue, block12],
+        'while (true) {\n  1;\n  2;\n}'),
+    testStatement('while (#) #;', [eVar, block12],
+        'while (x) {\n  1;\n  2;\n}'),
+    testStatement('while (#) #;', ['a', block12],
+        'while (a) {\n  1;\n  2;\n}'),
+    testStatement('while (#) #;', ['a', stm],
+        'while (a)\n  foo();'),
+
+    testStatement(
+        'do { {print(1);} do while(true); while (false) } while ( true )', [],
+        '''
+do {
+  print(1);
+  do
+    while (true)
+      ;
+  while (false);
+} while (true);
+'''),
+    testStatement('do #; while ( # )', [block12, eOne],
+        'do {\n  1;\n  2;\n} while (1); '),
+    testStatement('do #; while ( # )', [block12, eTrue],
+        'do {\n  1;\n  2;\n} while (true); '),
+    testStatement('do #; while ( # );', [block12, eVar],
+        'do {\n  1;\n  2;\n} while (x);'),
+    testStatement('do { # } while ( # )', [block12, 'a'],
+        'do {\n  1;\n  2;\n} while (a);'),
+    testStatement('do #; while ( # )', [stm, 'a'],
+        'do\n  foo();\nwhile (a);'),
+
+    testStatement('switch (#) {}', [eOne], 'switch (1) {\n}'),
+    testStatement('''
+        switch (#) {
+          case #: { # }
+        }''', [eTrue, eOne, block12],
+        'switch (true) {\n  case 1:\n    1;\n    2;\n}'),
+    testStatement('''
+        switch (#) {
+          case #: { # }
+            break;
+          case #: { # }
+          default: { # }
+        }''', [eTrue, eOne, block12, eTwo, block12, stm], '''
+switch (true) {
+  case 1:
+    1;
+    2;
+    break;
+  case 2:
+    1;
+    2;
+  default:
+    foo();
+}'''),
 
     testStatement(NAMED_FUNCTION_1, [eOne], NAMED_FUNCTION_1_ONE),
     testStatement(NAMED_FUNCTION_1_NAMED_HOLE,
@@ -200,6 +258,10 @@
                   {'a': ['x', 'y']},
                   'function foo(x, y) {\n}'),
 
+    testStatement('function foo() async {}', [], 'function foo() async {\n}'),
+    testStatement('function foo() sync* {}', [], 'function foo() sync* {\n}'),
+    testStatement('function foo() async* {}', [], 'function foo() async* {\n}'),
+
     testStatement('a = #.#', [eVar,eOne], 'a = x[1];'),
     testStatement('a = #.#', [eVar,'foo'], 'a = x.foo;'),
     testStatement('a = #a.#b', {'a': eVar, 'b': eOne}, 'a = x[1];'),
@@ -260,5 +322,8 @@
                   '  return name4_5.name4_5;\n'
                   '};'),
 
+    testStatement('label: while (a) { label2: break label;}', [],
+        'label:\n  while (a) {\n    label2:\n      break label;\n  }'),
+
   ]));
 }
diff --git a/tests/compiler/dart2js/js_parser_test.dart b/tests/compiler/dart2js/js_parser_test.dart
index e3768a3..4022724 100644
--- a/tests/compiler/dart2js/js_parser_test.dart
+++ b/tests/compiler/dart2js/js_parser_test.dart
@@ -137,6 +137,12 @@
     testExpression('a * b instanceof c * d'),
     testError('x typeof y', 'Unparsed junk'),
     testExpression('x &= ~mask'),
+    // Await is parsed as an unary prefix operator.
+    testExpression('var foo = await 0'),
+    testExpression('await x++'),
+    testExpression('void (await (x++))', 'void await x++'),
+    testExpression('void (await x)++'),
+    testExpression('++(await x)++'),
     // Adjacent tokens.
     testExpression('foo[x[bar]]'),
     testExpression('foo[[bar]]'),
diff --git a/tests/compiler/dart2js/message_kind_helper.dart b/tests/compiler/dart2js/message_kind_helper.dart
index 2258935..9fd6638 100644
--- a/tests/compiler/dart2js/message_kind_helper.dart
+++ b/tests/compiler/dart2js/message_kind_helper.dart
@@ -38,7 +38,6 @@
     MessageKind.UNIMPLEMENTED_METHOD,
     MessageKind.UNIMPLEMENTED_METHOD_ONE,
     MessageKind.VAR_FUNCTION_TYPE_PARAMETER,
-    MessageKind.VOID_NOT_ALLOWED,
 ]);
 
 /// Most messages can be tested without causing a fatal error. Add an exception
@@ -49,16 +48,6 @@
     // If you add something here, please file a *new* bug report.
 ]);
 
-/// Most messages can be tested without causing a fatal error. Add an exception
-/// here if a fatal error is unavoidable.
-/// Try to avoid adding exceptions here; a fatal error causes the compiler to
-/// stop before analyzing all input, and it isn't safe to reuse it.
-final Set<MessageKind> kindsWithFatalErrors = new Set<MessageKind>.from([
-    // If you add something here, please file a *new* bug report.
-    MessageKind.UNMATCHED_TOKEN,
-    MessageKind.UNTERMINATED_STRING,
-]);
-
 Future<Compiler> check(MessageKind kind, Compiler cachedCompiler) {
   Expect.isNotNull(kind.howToFix);
   Expect.isFalse(kind.examples.isEmpty);
@@ -120,8 +109,6 @@
           throw 'Unexpected messages found.';
         }
       }
-      Expect.isTrue(!compiler.compilerWasCancelled ||
-                    kindsWithFatalErrors.contains(kind));
 
       bool pendingStuff = false;
       for (var e in compiler.resolver.pendingClassesToBePostProcessed) {
@@ -138,7 +125,7 @@
       }
       Expect.isTrue(!pendingStuff || kindsWithPendingClasses.contains(kind));
 
-      if (!pendingStuff && !compiler.compilerWasCancelled) {
+      if (!pendingStuff) {
         // If there is pending stuff, or the compiler was cancelled, we
         // shouldn't reuse the compiler.
         cachedCompiler = compiler;
diff --git a/tests/compiler/dart2js/missing_file_test.dart b/tests/compiler/dart2js/missing_file_test.dart
index 92c94d5..630063b 100644
--- a/tests/compiler/dart2js/missing_file_test.dart
+++ b/tests/compiler/dart2js/missing_file_test.dart
@@ -27,7 +27,8 @@
 ''',
 };
 
-void runCompiler(Uri main, String expectedMessage) {
+Future runCompiler(Uri main, String expectedMessage) {
+  print("\n\n\n");
   Uri script = currentDirectory.resolveUri(Platform.script);
   Uri libraryRoot = script.resolve('../../../sdk/');
   Uri packageRoot = script.resolve('./packages/');
@@ -58,20 +59,24 @@
                                    [],
                                    {});
 
-  asyncTest(() => compiler.run(main).then((_) {
+  return compiler.run(main).then((_) {
     Expect.equals(1, errors.length);
     Expect.equals(expectedMessage,
                   errors[0]);
-  }));
+  });
 }
 
 void main() {
-  runCompiler(Uri.parse('memory:main.dart'),
-              "Can't read 'memory:foo.dart' "
-              "(Exception: No such file memory:foo.dart).");
-  runCompiler(Uri.parse('memory:foo.dart'),
-              "Can't read 'memory:foo.dart' "
-              "(Exception: No such file memory:foo.dart).");
-  runCompiler(Uri.parse('dart:foo'),
-              "Library not found 'dart:foo'.");
+  asyncTest(() => Future.forEach([
+  () => runCompiler(
+      Uri.parse('memory:main.dart'),
+      "Can't read 'memory:foo.dart' "
+      "(Exception: No such file memory:foo.dart)."),
+  () => runCompiler(
+      Uri.parse('memory:foo.dart'),
+      "Exception: No such file memory:foo.dart"),
+  () => runCompiler(
+      Uri.parse('dart:foo'),
+      "Library not found 'dart:foo'."),
+  ], (f) => f()));
 }
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index 136ac76..0c6fa8e 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -212,14 +212,7 @@
     if (visitor.scope is LibraryScope) {
       visitor.scope = new MethodScope(visitor.scope, element);
     }
-    try {
-      visitor.visit(tree);
-    } on CompilerCancelledException catch (_) {
-      // Ignored.
-
-      // TODO(ahe): Don't ignore CompilerCancelledException, instead, fix
-      // pkg/compiler/lib/src/resolution/members.dart.
-    }
+    visitor.visit(tree);
     visitor.scope = new LibraryScope(element.library);
     return visitor.registry.mapping;
   }
diff --git a/tests/compiler/dart2js/package_root_test.dart b/tests/compiler/dart2js/package_root_test.dart
index 93327b3..5a173f5 100644
--- a/tests/compiler/dart2js/package_root_test.dart
+++ b/tests/compiler/dart2js/package_root_test.dart
@@ -60,9 +60,7 @@
 
   asyncTest(() => compiler.run(main).then((_) {
     Expect.equals(1, errors.length);
-    Expect.isTrue(
-        errors[0].startsWith(
-            "Can't read 'package:foo/foo.dart' (Error reading "));
+    Expect.isTrue(errors[0].contains("Error reading "));
   }));
 }
 
diff --git a/tests/compiler/dart2js/parser_helper.dart b/tests/compiler/dart2js/parser_helper.dart
index 3b07370..344111f 100644
--- a/tests/compiler/dart2js/parser_helper.dart
+++ b/tests/compiler/dart2js/parser_helper.dart
@@ -23,10 +23,6 @@
 export "package:compiler/src/scanner/scannerlib.dart";
 
 class LoggerCanceler implements DiagnosticListener {
-  void cancel(String reason, {node, token, instruction, element}) {
-    throw new CompilerCancelledException(reason);
-  }
-
   void log(message) {
     print(message);
   }
diff --git a/tests/compiler/dart2js_extra/LayoutTests_fast_mediastream_getusermedia_t01_test.dart b/tests/compiler/dart2js_extra/LayoutTests_fast_mediastream_getusermedia_t01_test.dart
new file mode 100644
index 0000000..9502246
--- /dev/null
+++ b/tests/compiler/dart2js_extra/LayoutTests_fast_mediastream_getusermedia_t01_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 derived from a broken co19 test
+/// (LayoutTests/fast/mediastream/getusermedia_t01.dart). Caused dart2js to
+/// crash.
+
+foo() {}
+
+gotStream1(stream) {
+  foo()
+      . /// 01: compile-time error
+      .then();
+}
+
+void main() {
+  print(gotStream1);
+}
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index 789a12c..188549f 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -37,6 +37,9 @@
 code_motion_exception_test: Skip  # Requires unminified operator names.
 mirrors_used_warning_test/minif: Fail, OK # Tests warning that minified code will be broken.
 
+[ $compiler == dart2js && $runtime == safari ]
+deferred_fail_and_retry_worker_test: Timeout  # Issue 22106
+
 [ $compiler == dart2js && ($runtime == drt || $runtime == ff || $runtime == safari || $runtime == jsshell) ]
 code_motion_exception_test: Skip  # Required V8 specific format of JavaScript errors.
 
@@ -52,3 +55,7 @@
 
 [ $compiler == dart2js && $runtime == d8 && $system == windows ]
 deferred/*: Skip # Issue 17458
+
+[ $compiler == dart2js && $csp ]
+deferred_fail_and_retry_test: SkipByDesign # Uses eval to simulate failed loading.
+deferred_fail_and_retry_worker_test: SkipByDesign # Uses eval to simulate failed loading.
diff --git a/tests/compiler/dart2js_extra/deferred_fail_and_retry_lib.dart b/tests/compiler/dart2js_extra/deferred_fail_and_retry_lib.dart
new file mode 100644
index 0000000..bf021a4
--- /dev/null
+++ b/tests/compiler/dart2js_extra/deferred_fail_and_retry_lib.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+foo() {
+  return "loaded";
+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js_extra/deferred_fail_and_retry_test.dart b/tests/compiler/dart2js_extra/deferred_fail_and_retry_test.dart
new file mode 100644
index 0000000..95b2771
--- /dev/null
+++ b/tests/compiler/dart2js_extra/deferred_fail_and_retry_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 when a deferred import fails to load, it is possible to retry.
+
+import "deferred_fail_and_retry_lib.dart" deferred as lib;
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+import "dart:js" as js;
+
+main() {
+  // We patch document.body.appendChild to change the script src on first
+  // invocation.
+  js.context.callMethod("eval", ["""
+    if (self.document) {
+      oldAppendChild = document.body.appendChild;
+      document.body.appendChild = function(element) {
+        element.src = "non_existing.js";
+        document.body.appendChild = oldAppendChild;
+        document.body.appendChild(element);
+      }
+    }
+    if (self.load) {
+      oldLoad = load;
+      load = function(uri) {
+        load = oldLoad;
+        load("non_existing.js");
+      }
+    }
+  """]);
+
+  asyncStart();
+  lib.loadLibrary().then((_) {
+    Expect.fail("Library should not have loaded");
+  }, onError: (error) {
+    lib.loadLibrary().then((_) {
+      Expect.equals("loaded", lib.foo());
+    }, onError: (error) {
+      Expect.fail("Library should have loaded this time");
+    }).whenComplete(() {
+      asyncEnd();
+    });
+  });
+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js_extra/deferred_fail_and_retry_worker_test.dart b/tests/compiler/dart2js_extra/deferred_fail_and_retry_worker_test.dart
new file mode 100644
index 0000000..0e582dd
--- /dev/null
+++ b/tests/compiler/dart2js_extra/deferred_fail_and_retry_worker_test.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for 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 when a deferred import from a worker fails to load, it is possible
+// to retry.
+
+import "deferred_fail_and_retry_lib.dart" deferred as lib;
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+import "dart:isolate";
+import "dart:js" as js;
+
+void test(SendPort sendPort) {
+  // Patch XMLHttpRequest to fail on first load.
+  js.context.callMethod("eval", ["""
+    oldXMLHttpRequest = XMLHttpRequest;
+    XMLHttpRequest = function() {
+      XMLHttpRequest = oldXMLHttpRequest;
+      var instance = new XMLHttpRequest();
+      this.addEventListener = function(x, y, z) {
+        instance.addEventListener(x, y, z);
+      }
+      this.send = function() {
+        instance.send();
+      }
+      this.open = function(x, uri) {
+        instance.open(x, "non_existing.js");
+      }
+    }
+  """]);
+  lib.loadLibrary().then((_) {
+    sendPort.send("Library should not have loaded");
+  }, onError: (error) {
+    sendPort.send("failed");
+    lib.loadLibrary().then((_) {
+      sendPort.send(lib.foo());
+    }, onError: (error) {
+      sendPort.send("Library should have loaded this time $error");
+    });
+  });
+}
+
+
+main() {
+  ReceivePort receivePort = new ReceivePort();
+  asyncStart();
+  bool receivedFailed = false;
+  receivePort.listen((message) {
+    if (!receivedFailed) {
+      Expect.equals("failed", message);
+      receivedFailed = true;
+    } else {
+      Expect.equals("loaded", message);
+      asyncEnd();
+    }
+  });
+  Isolate.spawn(test, receivePort.sendPort);
+}
diff --git a/tests/compiler/dart2js_extra/is_check_instanceof_test.dart b/tests/compiler/dart2js_extra/is_check_instanceof_test.dart
new file mode 100644
index 0000000..024d538
--- /dev/null
+++ b/tests/compiler/dart2js_extra/is_check_instanceof_test.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+// It is sometimes possible to compile is-checks to 'instanceof', when the class
+// is not in an 'implements' clause or used as a mixin.
+
+// This test verifies is-checks work with simple classes that have various
+// degrees of instantiation.
+
+class INSTANTIATED {}             // instantiated and used in many ways
+class DEFERRED {}                 // instantiated after first check
+class UNUSED {}                   // used only in is-check
+class REMOVED {}                  // allocated but optimized out of program
+class DEFERRED_AND_REMOVED {}     // allocated after first check and removed
+class USED_AS_TYPE_PARAMETER {}   // only used as a type parameter
+class USED_AS_TESTED_TYPE_PARAMETER {}   // only used as a type parameter
+
+class Check<T> {
+  bool check(x) => x is T;
+}
+
+class Check2<T> {
+  bool check(x) => x is USED_AS_TYPE_PARAMETER;
+}
+
+void main() {
+  var things = new List(3);
+  things.setRange(0, 3, [new INSTANTIATED(), 1, new Object()]);
+
+  var checkX = new Check<INSTANTIATED>();
+  var checkU1 = new Check<USED_AS_TESTED_TYPE_PARAMETER>();
+  var checkU2 = new Check<USED_AS_TYPE_PARAMETER>();
+
+  var removed = new REMOVED();  // This is optimized out.
+
+  // Tests that can be compiled to instanceof:
+  Expect.isTrue(things[0] is INSTANTIATED);
+  Expect.isFalse(things[1] is INSTANTIATED);
+  Expect.isFalse(things[1] is REMOVED);
+  Expect.isFalse(things[1] is DEFERRED_AND_REMOVED);
+  Expect.isFalse(things[1] is DEFERRED);
+  // Tests that might be optimized to false since there are no allocations:
+  Expect.isFalse(things[1] is UNUSED);
+  Expect.isFalse(things[1] is USED_AS_TYPE_PARAMETER);
+
+  Expect.isTrue(checkX.check(things[0]));
+  Expect.isFalse(checkX.check(things[1]));
+  Expect.isFalse(checkU1.check(things[1]));
+  Expect.isFalse(checkU2.check(things[1]));
+
+  var removed2 = new DEFERRED_AND_REMOVED();  // This is optimized out.
+
+  // First allocation of DEFERRED is after the above tests.
+  things.setRange(0, 3, [new INSTANTIATED(), 1, new DEFERRED()]);
+
+  // Tests that can be compiled to instanceof:
+  Expect.isTrue(things[0] is INSTANTIATED);
+  Expect.isFalse(things[1] is INSTANTIATED);
+  Expect.isFalse(things[1] is REMOVED);
+  Expect.isFalse(things[1] is DEFERRED_AND_REMOVED);
+  Expect.isFalse(things[1] is DEFERRED);
+  Expect.isTrue(things[2] is DEFERRED);
+  // Tests that might be optimized to false since there are no allocations:
+  Expect.isFalse(things[1] is UNUSED);
+  Expect.isFalse(things[1] is USED_AS_TYPE_PARAMETER);
+}
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 947bfe2..22cb07d 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -103,10 +103,14 @@
 # IEEE-754 rounding algorithm.
 double_parse_test: Fail, OK
 
-[ $runtime == ff || $runtime == jsshell || $runtime == safari || $runtime == safarimobilesim ]
+[ $runtime == jsshell || $runtime == safari || $runtime == safarimobilesim ]
 double_round3_test: Fail, OK # Runtime rounds 0.49999999999999994 to 1.
 double_round_to_double2_test: Fail, OK # Runtime rounds 0.49999999999999994 to 1.
 
+[ $runtime == ff ]
+double_round3_test: Pass, Fail, OK # Fails on ff 34, passes on ff 35. Runtime rounds 0.49999999999999994 to 1.
+double_round_to_double2_test: Pass, Fail, OK # Fails on ff 34, passes on ff 35. Runtime rounds 0.49999999999999994 to 1.
+
 [ $runtime == opera ]
 core_runtime_types_test: Fail
 null_nosuchmethod_test: Fail # Issue: 7413
@@ -226,7 +230,3 @@
 
 [ $mode == debug ]
 regexp/pcre_test: Pass, Slow # Timeout. Issue 22008
-
-[ $mode == debug && $arch == mips ]
-regexp/pcre_test: Skip # Timeout. Issue 21995
-regexp/regress-regexp-construct-result_test: Skip # Timeout. Issue 21995
\ No newline at end of file
diff --git a/tests/corelib/string_fromcharcodes_test.dart b/tests/corelib/string_fromcharcodes_test.dart
index 99c4643..b344aca 100644
--- a/tests/corelib/string_fromcharcodes_test.dart
+++ b/tests/corelib/string_fromcharcodes_test.dart
@@ -193,4 +193,10 @@
   testSubstring("\x00" * 357);
   // length > 128 and non-ASCII.
   testSubstring("\uFFFD\uFFFE\u{10000}\u{10ffff}c\x00" * 37);
+
+  // Large List.
+  var megaList = ("abcde" * 200000).codeUnits.toList();
+  test("abcde" * 199998, megaList, 5, 999995);
+  // Large Uint8List.
+  test("abcde" * 199998, new Uint8List.fromList(megaList), 5, 999995);
 }
diff --git a/tests/html/audiocontext_test.dart b/tests/html/audiocontext_test.dart
index 318332b..68c2af9 100644
--- a/tests/html/audiocontext_test.dart
+++ b/tests/html/audiocontext_test.dart
@@ -20,17 +20,20 @@
   });
 
   group('functional', () {
+    var context;
+    if (AudioContext.supported) {
+      context = new AudioContext();
+    }
+    
     test('constructorTest', () {
       if(AudioContext.supported) {
-        var ctx = new AudioContext();
-        expect(ctx, isNotNull);
-        expect(ctx, isAudioContext);
+        expect(context, isNotNull);
+        expect(context, isAudioContext);
       }
     });
 
     test('audioRenames', () {
       if(AudioContext.supported) {
-        AudioContext context = new AudioContext();
         GainNode gainNode = context.createGain();
         gainNode.connectNode(context.destination);
         expect(gainNode is GainNode, isTrue);
@@ -67,7 +70,6 @@
 
     test('oscillatorTypes', () {
       if(AudioContext.supported) {
-        AudioContext context = new AudioContext();
         OscillatorNode oscillator = context.createOscillator();
         oscillator.connectNode(context.destination);
 
diff --git a/tests/html/html.status b/tests/html/html.status
index dc001be..a42bb07 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -5,6 +5,7 @@
 event_test: Skip  # Issue 1996
 interactive_test: Skip # Must be run manually.
 dromaeo_smoke_test: Skip # Issue 14521, 8257
+cross_frame_test: Skip # Test reloads itself. Issue 18558
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 custom/attribute_changed_callback_test/unsupported_on_polyfill: Fail # Issue 18931 (Disabled for Chrome 35 roll)
@@ -29,7 +30,7 @@
 custom/element_upgrade_test: Fail # Issue 17298
 
 [ $compiler == dart2js && $browser ]
-custom/created_callback_test: Fail # Support for created constructor.
+custom/created_callback_test: Fail # Support for created constructor. Issue 14835
 fontface_loaded_test: Fail # Support for promises.
 storage_quota_test: Fail # Support for promises.
 
@@ -49,6 +50,7 @@
 keyboard_event_test: Fail # Issue 13902
 isolates_test: Fail # Issue 13921
 indexeddb_3_test: Skip # Issue 19578.  Timeouts and RuntimeError
+fileapi_test/getFile: Pass, Fail # Issue 20488
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) && $mode == debug ]
 websocket_test/websocket: Skip # Issue 17666
@@ -63,7 +65,6 @@
 element_offset_test/offset: RuntimeError # Issue 17550
 request_animation_frame_test: Skip # Times out, and also passes while taking 4.00 minutes. Issue 19127.
 fileapi_test/fileEntry: Pass, RuntimeError # Issue 20488
-fileapi_test/getFile: Pass, RuntimeError # Issue 20488
 indexeddb_5_test: Pass, RuntimeError # Issue 21262
 native_gc_test: Pass, Slow
 
@@ -101,6 +102,7 @@
 touchevent_test/supported: Pass, Fail # Issue 17061
 xhr_cross_origin_test: Pass, Fail # Issue 11884
 xhr_test: Pass, Fail # Issue 11884
+element_types_test/constructors: Skip # Times out. Issue 22050
 
 [$runtime == drt || $runtime == dartium || $runtime == chrome || $runtime == chromeOnAndroid || $runtime == ContentShellOnAndroid ]
 webgl_1_test: Pass, Fail # Issue 8219
@@ -130,6 +132,7 @@
 scripts_htmltest: Skip # Times out on IE.  Issue 21537
 two_scripts_htmltest: Skip # Times out on IE.  Issue 21537
 deferred_multi_app_htmltest: Skip # Times out on IE.  Issue 21537
+localstorage_test: Pass, RuntimeError # Issue 22166
 
 [$runtime == ie10 ]
 # IE10 Feature support statuses-
@@ -227,6 +230,8 @@
 [ $runtime == ie10 ]
 custom/document_register_type_extensions_test/construction: Fail # Issue 13193
 custom/element_upgrade_test: Fail # Issue 18247
+request_animation_frame_test: Skip # Times out. Issue 22167
+transition_event_test/functional: Skip # Times out. Issue 22167
 worker_api_test: Fail # IE does not support URL.createObjectURL in web workers.
 
 [ $compiler == dart2js && $runtime == drt && $unchecked ]
@@ -237,7 +242,6 @@
 webgl_1_test: Pass, Fail # Issue 8219
 canvasrenderingcontext2d_test/drawImage_video_element: Fail # Safari does not support drawImage w/ video element
 canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Fail # Safari does not support drawImage w/ video element
-audiocontext_test/functional: Fail # Issue 14354
 element_test: Pass, Fail # Issue 21434
 
 # Safari Feature support statuses-
@@ -361,12 +365,15 @@
 postmessage_structured_test: Skip  # Test cannot run under CSP restrictions (times out).
 
 [ $compiler == dart2js && ($runtime == drt || $runtime ==chrome) ]
-wheelevent_test: Fail # http://dartbug.com/12958
+wheelevent_test: Fail # Issue 12958
 
-[ $compiler == dart2js &&  $runtime == chrome && $system == windows ]
+[ $compiler == dart2js &&  $runtime == chrome && ($system == windows || $system == linux)]
 css_test/functional: Fail # Issue 21710
 css_test/supportsPointConversions: Fail # Issue 21710
 
+[ $compiler == dart2js &&  $runtime == chrome && $system == windows]
+svgelement_test/supported_altGlyph: RuntimeError # Issue 22154
+
 [ $runtime == dartium && ($system == macos || $system == windows || $system == linux)]
 # Desktop operation systems do not support touch events on chrome 34 dartium.
 touchevent_test/supported: Fail
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index ab7ade2..aee29a9 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -49,6 +49,7 @@
 [ $compiler == dart2js ]
 spawn_uri_vm_test: SkipByDesign # Test uses a ".dart" URI.
 spawn_uri_nested_vm_test: SkipByDesign # Test uses a ".dart" URI.
+spawn_uri_exported_main_test: SkipByDesign # Test uses a ".dart" URI.
 issue_21398_parent_isolate_test: SkipByDesign # Test uses a ".dart" URI.
 issue_21398_parent_isolate1_test: SkipByDesign # Test uses a ".dart" URI.
 message3_test/constList: RuntimeError # Issue 21817
@@ -70,6 +71,7 @@
 spawn_uri_nested_vm_test: RuntimeError   # Issue 16549
 spawn_uri_test: RuntimeError             # Issue 16549
 spawn_uri_vm_test: RuntimeError          # Issue 16549
+spawn_uri_exported_main_test: RuntimeError # Issue 16549
 issue_21398_parent_isolate_test: RuntimeError  # Issue 16549
 issue_21398_parent_isolate1_test: RuntimeError # Issue 16549
 
@@ -83,7 +85,7 @@
 spawn_uri_nested_vm_test: Skip # Issue 14463
 
 [ $jscl ]
-spawn_uri_multi_test/none: RuntimeError # http://dartbug.com/13544
+spawn_uri_multi_test/none: RuntimeError # Issue 13544
 
 [ ($compiler == none || $compiler == dart2dart) && ($runtime == dartium || $runtime == drt || $runtime == ContentShellOnAndroid) ]
 pause_test: Fail         # Not implemented yet
@@ -104,7 +106,7 @@
 start_paused_test: Fail, OK   # Issue 13921 Dom isolates don't support spawnFunction
 object_leak_test: Fail, OK # Issue 13921 Dom isolates don't support spawnFunction
 simple_message_test/none: Fail, OK # Issue 13921 Dom isolates don't support spawnFunction
-spawn_uri_missing_from_isolate_test: RuntimeError # http://dartbug.com/17649
+spawn_uri_missing_from_isolate_test: RuntimeError # Issue 17649
 spawn_uri_missing_test: Skip # Times out.
 isolate_current_test: Fail, OK # Issue 13921 Dom isolates don't support spawnFunction
 
diff --git a/tests/isolate/spawn_uri_exported_main.dart b/tests/isolate/spawn_uri_exported_main.dart
new file mode 100644
index 0000000..afd0122
--- /dev/null
+++ b/tests/isolate/spawn_uri_exported_main.dart
@@ -0,0 +1,5 @@
+export "spawn_uri_exported_main_lib.dart";
+
+maine() {
+  print("This is not the maine you are looking for.");
+}
diff --git a/tests/isolate/spawn_uri_exported_main_lib.dart b/tests/isolate/spawn_uri_exported_main_lib.dart
new file mode 100644
index 0000000..7500465
--- /dev/null
+++ b/tests/isolate/spawn_uri_exported_main_lib.dart
@@ -0,0 +1,6 @@
+library spawn_uri_exported_main_lib;
+
+main(args, msg) {
+  print("From main!");
+  msg.send(50);
+}
diff --git a/tests/isolate/spawn_uri_exported_main_test.dart b/tests/isolate/spawn_uri_exported_main_test.dart
new file mode 100644
index 0000000..252980d
--- /dev/null
+++ b/tests/isolate/spawn_uri_exported_main_test.dart
@@ -0,0 +1,20 @@
+import "dart:async";
+import "dart:isolate";
+import "package:expect/expect.dart";
+
+main() {
+  print("Spawning isolate.");
+  var t = new Timer(new Duration(seconds:5), () {
+	Expect.fail("Isolate was not spawned successfully.");
+  });
+  var rp = new RawReceivePort();
+  rp.handler = (msg) {
+    print("Spawned main called.");
+    Expect.equals(msg, 50);
+	rp.close();
+  };
+  Isolate.spawnUri(Uri.parse("spawn_uri_exported_main.dart"), null, rp.sendPort).then((_) {
+    print("Loaded");
+	t.cancel();
+  });
+}
diff --git a/tests/language/async_test.dart b/tests/language/async_test.dart
index c43db67..d1bf80d 100644
--- a/tests/language/async_test.dart
+++ b/tests/language/async_test.dart
@@ -48,7 +48,7 @@
   const B._internal(this._y);
   const factory B.createConst(int y) async = A._internal;  /// constructor4: compile-time error
 
-  B();
+  B() : _y = null;
 
   set dontDoThat(value) async {}  /// setter1: compile-time error
 }
diff --git a/tests/language/enum_const_test.dart b/tests/language/enum_const_test.dart
index 0eb7204..54ba24f 100644
--- a/tests/language/enum_const_test.dart
+++ b/tests/language/enum_const_test.dart
@@ -16,7 +16,13 @@
 }
 
 main() {
-  verify(Foo.BAR);
+  test1(); /// 01: ok
+  test2(); /// 02: ok
+}
+
+test1() => verify(Foo.BAR);
+
+test2() {
   var rp;
   rp = new RawReceivePort((val) {
     verify(val);
diff --git a/tests/language/enum_syntax_test.dart b/tests/language/enum_syntax_test.dart
index 6690580..2ceef46 100644
--- a/tests/language/enum_syntax_test.dart
+++ b/tests/language/enum_syntax_test.dart
@@ -52,6 +52,7 @@
 class Rainbow extends List with Color {}  /// 22: compile-time error
 
 main() {
+  Nada x; /// 01: continued
   var x = ComeAgain.zipfel;  /// 02: continued
   var x = ComeAgain.zipfel;  /// 03: continued
   var x = ComeAgain.zipfel;  /// 04: continued
diff --git a/tests/language/language.status b/tests/language/language.status
index ae6e776..4df4177 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -17,30 +17,21 @@
 # Regular bugs which should be fixed.
 duplicate_export_negative_test: Fail # Issue 6134
 
-[ $runtime != vm ]
-# Async/await is currently only supported by the vm.
-async_test/*: Skip
-async_control_structures_test: Skip
-await_test: Skip
-await_regression_test: Skip
-await_for_test: Skip
-await_future_test: Skip
-await_nonfuture_test: Skip
-await_exceptions_test: Skip
-await_backwards_compatibility_test/*: Skip
-vm/optimized_await_regress_test: Skip
+[ $compiler == dart2dart ]
+async_control_structures_test: CompileTimeError # Issue 22051
+async_test/none: CompileTimeError # Issue 22051
+async_test/type-mismatch1: CompileTimeError # Issue 22051
+async_test/type-mismatch2: CompileTimeError # Issue 22051
+async_test/type-mismatch3: CompileTimeError # Issue 22051
+async_test/type-mismatch4: CompileTimeError # Issue 22051
+await_backwards_compatibility_test/none: CompileTimeError # Issue 22051
+await_exceptions_test: CompileTimeError # Issue 22051
+await_for_test: CompileTimeError # Issue 22051
+await_future_test: CompileTimeError # Issue 22051
+await_nonfuture_test: CompileTimeError # Issue 22051
+await_regression_test: CompileTimeError # Issue 22051
+await_test: CompileTimeError # Issue 22051
 
-[ $compiler == dart2dart]
-# Async/await not yet supported in dart2dart.
-async_test/*: Skip
-async_control_structures_test: Skip
-await_test: Skip
-await_regression_test: Skip
-await_for_test: Skip
-await_future_test: Skip
-await_nonfuture_test: Skip
-await_exceptions_test: Skip
-await_backwards_compatibility_test/*: Skip
 deferred_load_library_wrong_args_test/none: Fail # Issue 17523
 deferred_load_inval_code_test: Fail # Issue 17523
 deferred_not_loaded_check_test: Fail # Issue 17523
@@ -100,13 +91,13 @@
 issue13474_test: Pass, Fail # Issue 14651.
 typed_message_test: Crash, Fail # Issue 13921, 14400
 vm/optimized_guarded_field_isolates_test: Fail # Issue 13921.
-main_test/01: Fail # http://dartbug.com/20028
-main_test/02: Fail # http://dartbug.com/20028
-main_test/04: Fail # http://dartbug.com/20028
-main_test/05: Fail # http://dartbug.com/20028
-main_test/21: Fail # http://dartbug.com/20028
-main_test/42: Fail # http://dartbug.com/20028
-
+main_test/01: Fail # Issue 20028
+main_test/02: Fail # Issue 20028
+main_test/04: Fail # Issue 20028
+main_test/05: Fail # Issue 20028
+main_test/21: Fail # Issue 20028
+main_test/42: Fail # Issue 20028
+mirror_in_static_init_test: Fail # Issue 22071
 
 [ $compiler == none && $runtime == drt ]
 disassemble_test: Pass, Fail # Issue 18122
@@ -125,3 +116,6 @@
 [ $compiler == none && $runtime == ContentShellOnAndroid ]
 gc_test: Skip # Times out flakily. Issue 20956
 
+[ $compiler == none && $runtime == vm && ( $arch == simarm || $arch == arm || $arch == simarm64 || $arch == arm64 || $arch == simmips || $arch == mips) ]
+vm/load_to_load_unaligned_forwarding_vm_test: Pass, Crash # Unaligned offset. Issue 22151
+
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index 6f96ea6..e53b6c8 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -3,6 +3,13 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dartanalyzer ]
+await_backwards_compatibility_test/none: CompileTimeError # Issue 22052
+await_test: CompileTimeError # Issue 22052
+
+async_test/type-mismatch2: MissingStaticWarning # Issue 22053
+async_test/type-mismatch3: MissingStaticWarning # Issue 22053
+async_test/type-mismatch4: MissingStaticWarning # Issue 22053
+
 # Runtime negative test. No static errors or warnings.
 closure_call_wrong_argument_count_negative_test: skip
 
@@ -471,9 +478,9 @@
 # This test is expected to have warnings because of noSuchMethod overriding.
 regress_12561_test: StaticWarning
 
-main_not_a_function_test/01: Fail # http://dartbug.com/20030
-main_test/03: Fail # http://dartbug.com/20030
-no_main_test/01: Fail # http://dartbug.com/20030
+main_not_a_function_test/01: Fail # Issue 20030
+main_test/03: Fail # Issue 20030
+no_main_test/01: Fail # Issue 20030
 
 compile_time_constant10_test/none: CompileTimeError # Issue 21177
 
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 0c2ad1d..05bf994 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -3,6 +3,13 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dart2analyzer ]
+await_backwards_compatibility_test/none: CompileTimeError # Issue 22052
+await_test: CompileTimeError # Issue 22052
+
+async_test/type-mismatch2: MissingStaticWarning # Issue 22053
+async_test/type-mismatch3: MissingStaticWarning # Issue 22053
+async_test/type-mismatch4: MissingStaticWarning # Issue 22053
+
 # Runtime negative test. No static errors or warnings.
 closure_call_wrong_argument_count_negative_test: skip
 
@@ -456,6 +463,6 @@
 # This test is expected to have warnings because of noSuchMethod overriding.
 regress_12561_test: StaticWarning
 
-main_not_a_function_test/01: Fail # http://dartbug.com/20030
-main_test/03: Fail # http://dartbug.com/20030
-no_main_test/01: Fail # http://dartbug.com/20030
+main_not_a_function_test/01: Fail # Issue 20030
+main_test/03: Fail # Issue 20030
+no_main_test/01: Fail # Issue 20030
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index dd32757..d41f150 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -5,6 +5,23 @@
 [ $compiler == dart2js && $csp && $browser ]
 deferred_mixin_test: RuntimeError # Issue 21863
 
+[ $compiler == dart2js ]
+async_control_structures_test: CompileTimeError # Issue 21411
+async_test/none: CompileTimeError # Issue 21411
+await_backwards_compatibility_test/none: CompileTimeError # Issue 21411
+await_exceptions_test: CompileTimeError # Issue 21411
+await_for_test: CompileTimeError # Issue 21411
+await_future_test: CompileTimeError # Issue 21411
+await_nonfuture_test: CompileTimeError # Issue 21411
+await_regression_test: CompileTimeError # Issue 21411
+await_test: CompileTimeError # Issue 21411
+
+[ $compiler == dart2js && $unchecked ]
+async_test/type-mismatch1: CompileTimeError # Issue 21411
+async_test/type-mismatch2: CompileTimeError # Issue 21411
+async_test/type-mismatch3: CompileTimeError # Issue 21411
+async_test/type-mismatch4: CompileTimeError # Issue 21411
+
 [ $compiler == dart2js || $compiler == dart2dart ]
 symbol_literal_test/*: Fail # Issue 21825
 constructor_duplicate_final_test/01: Fail # Issue 13363
@@ -43,8 +60,6 @@
 ref_before_declaration_test/05: MissingCompileTimeError
 ref_before_declaration_test/06: MissingCompileTimeError
 
-enum_syntax_test/01: Fail # Issue 21648
-
 
 # VM specific tests that should not be run by dart2js.
 vm/*: Skip # Issue 12699
@@ -80,7 +95,6 @@
 positional_parameters_type_test/02: MissingRuntimeError, OK
 issue13474_test: RuntimeError, OK
 generic_field_mixin3_test: Crash # Issue 18651
-generic_instanceof4_test: RuntimeError # Issue 21969
 
 [ $compiler == dart2js && $minified ]
 cyclic_type_test/0*: Fail # Issue 12605
@@ -133,7 +147,7 @@
 const_switch_test/02: RuntimeError # Issue 17960
 const_switch_test/04: RuntimeError # Issue 17960
 
-enum_const_test: RuntimeError # Issue 21817
+enum_const_test/02: RuntimeError # Issue 21817
 
 # Compilation errors.
 method_override5_test: RuntimeError # Issue 12809
@@ -154,9 +168,12 @@
 *: Fail, Pass # TODO(ahe): Triage these tests.
 
 
-[ $compiler == dart2js && ($runtime == ff || $runtime == jsshell || $runtime == safari || $runtime == safarimobilesim)]
+[ $compiler == dart2js && ($runtime == jsshell || $runtime == safari || $runtime == safarimobilesim)]
 round_test: Fail, OK # Common JavaScript engine Math.round bug.
 
+[ $compiler == dart2js && $runtime == ff ]
+round_test: Pass, Fail, OK # Fixed in ff 35. Common JavaScript engine Math.round bug.
+
 [ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim)]
 # Safari codegen bug, fixed on some versions of Safari 7.1 (Version 7.1 (9537.85.10.17.1))
 call_through_getter_test: Fail, OK
@@ -191,7 +208,9 @@
 
 [ $compiler == dart2dart ]
 regress_13494_test: Fail # Issue 13494
-enum_const_test: Crash # Issue 21681
+enum_const_test/01: Crash # Issue 21681
+enum_const_test/02: Crash # Issue 21681
+
 
 built_in_identifier_prefix_test: Fail # Issue 6972
 constructor_initializer_test/none: Fail # Issue 12633
diff --git a/tests/language/type_variable_closure2_test.dart b/tests/language/type_variable_closure2_test.dart
new file mode 100644
index 0000000..1b55ff9
--- /dev/null
+++ b/tests/language/type_variable_closure2_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class A<T> {}
+
+class C<T> {
+  a() {
+    return () => new A<T>();
+  }
+
+  list() {
+    return () => <T>[];
+  }
+
+  map() {
+    return () => <T, T>{};
+  }
+}
+
+main() {
+  Expect.isTrue(new C<int>().a()() is A<int>);
+  Expect.isFalse(new C<int>().a()() is A<String>);
+  Expect.isTrue(new C<int>().list()() is List<int>);
+  Expect.isFalse(new C<int>().list()() is List<String>);
+  Expect.isTrue(new C<int>().map()() is Map<int, int>);
+  Expect.isFalse(new C<int>().map()() is Map<String, int>);
+  Expect.isFalse(new C<int>().map()() is Map<int, String>);
+}
diff --git a/tests/language/vm/load_to_load_forwarding_vm_test.dart b/tests/language/vm/load_to_load_forwarding_vm_test.dart
index 7da5fd2..f97e662 100644
--- a/tests/language/vm/load_to_load_forwarding_vm_test.dart
+++ b/tests/language/vm/load_to_load_forwarding_vm_test.dart
@@ -486,6 +486,40 @@
   return b.f;
 }
 
+testViewAliasing1() {
+  final f64 = new Float64List(1);
+  final f32 = new Float32List.view(f64.buffer);
+  f64[0] = 1.0;  // Should not be forwarded.
+  f32[1] = 2.0;  // upper 32bits for 2.0f and 2.0 are the same
+  return f64[0];
+}
+
+testViewAliasing2() {
+  final f64 = new Float64List(2);
+  final f64v = new Float64List.view(f64.buffer, Float64List.BYTES_PER_ELEMENT);
+  f64[1] = 1.0;  // Should not be forwarded.
+  f64v[0] = 2.0;
+  return f64[1];
+}
+
+testViewAliasing3() {
+  final u8 = new Uint8List(Float64List.BYTES_PER_ELEMENT * 2);
+  final f64 = new Float64List.view(u8.buffer, Float64List.BYTES_PER_ELEMENT);
+  f64[0] = 1.0;  // Should not be forwarded.
+  u8[15] = 0x40;
+  u8[14] = 0x00;
+  return f64[0];
+}
+
+testViewAliasing4() {
+  final u8 = new Uint8List(Float64List.BYTES_PER_ELEMENT * 2);
+  final f64 = new Float64List.view(u8.buffer, Float64List.BYTES_PER_ELEMENT);
+  f64[0] = 2.0;  // Not aliased: should be forwarded.
+  u8[0] = 0x40;
+  u8[1] = 0x00;
+  return f64[0];
+}
+
 main() {
   final fixed = new List(10);
   final growable = [];
@@ -552,4 +586,11 @@
   for (var i = 0; i < 20; i++) {
     Expect.equals(43, testAliasingStoreIndexed(global_array));
   }
+
+  for (var i = 0; i < 20; i++) {
+    Expect.equals(2.0, testViewAliasing1());
+    Expect.equals(2.0, testViewAliasing2());
+    Expect.equals(2.0, testViewAliasing3());
+    Expect.equals(2.0, testViewAliasing4());
+  }
 }
diff --git a/tests/language/vm/load_to_load_unaligned_forwarding_vm_test.dart b/tests/language/vm/load_to_load_unaligned_forwarding_vm_test.dart
new file mode 100644
index 0000000..0d9790f
--- /dev/null
+++ b/tests/language/vm/load_to_load_unaligned_forwarding_vm_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Test correctness of side effects tracking used by load to load forwarding.
+// Should be merged into load_to_load_forwarding once Issue 22151 is fixed.
+
+// VMOptions=--optimization-counter-threshold=10
+
+import "package:expect/expect.dart";
+import "dart:typed_data";
+
+testViewAliasing5() {
+  final f32 = new Float32List(2);
+  final raw = f32.buffer.asByteData();
+  f32[0] = 1.5;  // Aliased by unaligned write of the same size.
+  raw.setInt32(1, 0x00400000, Endianness.LITTLE_ENDIAN);
+  return f32[0];
+}
+
+main() {
+  for (var i = 0; i < 20; i++) {
+    Expect.equals(2.0, testViewAliasing5());
+  }
+}
diff --git a/tests/language/vm/optimized_check_class_test.dart b/tests/language/vm/optimized_check_class_test.dart
new file mode 100644
index 0000000..c1e32bf
--- /dev/null
+++ b/tests/language/vm/optimized_check_class_test.dart
@@ -0,0 +1,70 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+
+import "package:expect/expect.dart";
+
+// Test dense class-id checks. Regression test for issue 22104.
+
+class A {
+  toString() => "an A";
+}
+
+class A1 extends A { }
+class A2 extends A { }
+class A3 extends A { }
+class A4 extends A { toString() => "ha"; }
+class A5 extends A { }
+class A6 extends A { }
+class A7 extends A { }
+class A8 extends A { }
+class A9 extends A { }
+class A10 extends A { }
+class A11 extends A { }
+class A12 extends A { }
+class A13 extends A { }
+class A14 extends A { }
+class A15 extends A { }
+class A16 extends A { }
+class A17 extends A { }
+class A18 extends A { }
+class A19 extends A { }
+class A20 extends A { }
+class A21 extends A { }
+class A22 extends A { }
+class A23 extends A { }
+class A24 extends A { }
+class A25 extends A { }
+class A26 extends A { }
+class A27 extends A { }
+class A28 extends A { }
+class A29 extends A { }
+class A30 extends A { }
+class A31 extends A { }
+class A32 extends A { }
+class A33 extends A { }
+class A34 extends A { }
+class A35 extends A { }
+class A36 extends A { }
+
+test_class_check(e) => e.toString();
+
+main() {
+  var list = [
+    new A1(),
+    new A2(),
+    new A11(),
+    new A36()
+  ];
+  for (var i = 0; i < list.length; i++) {
+    test_class_check(list[i]);
+  }
+  for (var i = 0; i < 100; i++) {
+    Expect.equals("an A", test_class_check(new A1()));
+  }
+  Expect.equals("ha", test_class_check(new A4()));
+}
+
+
+
diff --git a/tests/language/vm/type_cast_vm_test.dart b/tests/language/vm/type_cast_vm_test.dart
index 9285eb0..1282d52 100644
--- a/tests/language/vm/type_cast_vm_test.dart
+++ b/tests/language/vm/type_cast_vm_test.dart
@@ -5,8 +5,8 @@
 // Dart test program testing type casts.
 import "package:expect/expect.dart";
 
-checkTopFunction(String expected, StackTrace stacktrace) {
-  var topLine = stacktrace.toString().split("\n")[0];
+checkSecondFunction(String expected, StackTrace stacktrace) {
+  var topLine = stacktrace.toString().split("\n")[1];
   int startPos = topLine.lastIndexOf("/");
   int endPos = topLine.lastIndexOf(")");
   String subs = topLine.substring(startPos + 1, endPos);
@@ -28,7 +28,7 @@
       var msg = error.toString();
       Expect.isTrue(msg.contains("int"));  // dstType
       Expect.isTrue(msg.contains("String"));  // srcType
-      checkTopFunction("type_cast_vm_test.dart:24:23", error.stackTrace);
+      checkSecondFunction("type_cast_vm_test.dart:24:23", error.stackTrace);
     }
     return result;
   }
@@ -63,7 +63,7 @@
       var msg = error.toString();
       Expect.isTrue(msg.contains("int"));  // dstType
       Expect.isTrue(msg.contains("String"));  // srcType
-      checkTopFunction("type_cast_vm_test.dart:59:25", error.stackTrace);
+      checkSecondFunction("type_cast_vm_test.dart:59:25", error.stackTrace);
     }
     return result;
   }
@@ -81,7 +81,7 @@
       var msg = error.toString();
       Expect.isTrue(msg.contains("int"));  // dstType
       Expect.isTrue(msg.contains("String"));  // srcType
-      checkTopFunction("type_cast_vm_test.dart:74:16", error.stackTrace);
+      checkSecondFunction("type_cast_vm_test.dart:74:16", error.stackTrace);
     }
     return result;
   }
@@ -98,7 +98,7 @@
       var msg = error.toString();
       Expect.isTrue(msg.contains("int"));  // dstType
       Expect.isTrue(msg.contains("String"));  // srcType
-      checkTopFunction("type_cast_vm_test.dart:95:13", error.stackTrace);
+      checkSecondFunction("type_cast_vm_test.dart:95:13", error.stackTrace);
     }
     return result;
   }
@@ -116,7 +116,7 @@
       var msg = error.toString();
       Expect.isTrue(msg.contains("int"));  // dstType
       Expect.isTrue(msg.contains("() => dynamic"));  // srcType
-      checkTopFunction("type_cast_vm_test.dart:113:17", error.stackTrace);
+      checkSecondFunction("type_cast_vm_test.dart:113:17", error.stackTrace);
     }
     return result;
   }
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 2322396..aa1527b 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -10,7 +10,7 @@
 async/deferred/deferred_in_isolate_test: Skip # Issue 16898
 
 [ $compiler == dart2js ]
-async/schedule_microtask6_test: RuntimeError # global error handling is not supported. http://dartbug.com/5958
+async/schedule_microtask6_test: RuntimeError # global error handling is not supported. Issue 5958
 
 math/double_pow_test: RuntimeError
 math/low_test: RuntimeError
@@ -89,20 +89,20 @@
 mirrors/repeated_private_anon_mixin_app_test: RuntimeError # Issue 14670
 mirrors/symbol_validation_test/01: RuntimeError # Issue 13597
 mirrors/static_members_test: RuntimeError # Issue 14633, Issue 12164
-mirrors/typedef_test: RuntimeError # http://dartbug.com/6490
+mirrors/typedef_test: RuntimeError # Issue 6490
 mirrors/typedef_metadata_test: RuntimeError # Issue 12785
 mirrors/typedef_reflected_type_test/01: RuntimeError # Issue 12607
 mirrors/typevariable_mirror_metadata_test: CompileTimeError # Issue 10905
 mirrors/type_variable_is_static_test: RuntimeError # Issue 6335
 mirrors/type_variable_owner_test/01: RuntimeError # Issue 12785
 mirrors/variable_is_const_test/none: RuntimeError # Issue 14671
-mirrors/raw_type_test/01: RuntimeError # http://dartbug.com/6490
+mirrors/raw_type_test/01: RuntimeError # Issue 6490
 mirrors/mirrors_reader_test: Slow, RuntimeError # Issue 16589
 
 [ $runtime == safari || $runtime == safarimobilesim ]
 typed_data/int32x4_test: Fail, Pass # Safari has an optimization bug (nightlies are already fine).
 typed_data/float32x4_test: Fail, Pass # Safari has an optimization bug (nightlies are already fine).
-mirrors/null_test: Fail # http://dartbug.com/16831
+mirrors/null_test: Fail # Issue 16831
 convert/json_test: Fail # https://bugs.webkit.org/show_bug.cgi?id=134920
 
 [ ($runtime == safari && $builder_tag == mac10_7)|| $runtime == safarimobilesim ]
@@ -128,12 +128,12 @@
 mirrors/invocation_fuzz_test: RuntimeError # Issue 15566
 
 [ $compiler == dart2js && $runtime == jsshell ]
-async/future_test: RuntimeError # Timer interface not supported; dartbug.com/7728.
-async/slow_consumer2_test: RuntimeError # Timer interface not supported; dartbug.com/7728.
-async/slow_consumer3_test: RuntimeError # Timer interface not supported; dartbug.com/7728.
-async/slow_consumer_test: RuntimeError # Timer interface not supported; dartbug.com/7728.
-async/stream_from_iterable_test: RuntimeError # Timer interface not supported; dartbug.com/7728.
-async/stream_state_nonzero_timer_test: RuntimeError # Timer interface not supported; dartbug.com/7728.
+async/future_test: RuntimeError # Timer interface not supported; Issue 7728.
+async/slow_consumer2_test: RuntimeError # Timer interface not supported; Issue 7728.
+async/slow_consumer3_test: RuntimeError # Timer interface not supported; Issue 7728.
+async/slow_consumer_test: RuntimeError # Timer interface not supported; Issue 7728.
+async/stream_from_iterable_test: RuntimeError # Timer interface not supported; Issue 7728.
+async/stream_state_nonzero_timer_test: RuntimeError # Timer interface not supported; Issue 7728.
 async/multiple_timer_test: RuntimeError,OK # Needs Timer to run.
 async/timer_cancel_test: RuntimeError,OK # Needs Timer to run.
 async/timer_cancel1_test: RuntimeError,OK # Needs Timer to run.
@@ -141,36 +141,37 @@
 async/timer_isolate_test: Fail, OK # Needs Timer to run.
 async/timer_repeat_test: RuntimeError,OK # Needs Timer to run.
 async/timer_test: RuntimeError,OK # Needs Timer to run.
-async/stream_controller_async_test: RuntimeError # Timer interface not supported; dartbug.com/7728.
-async/stream_periodic_test: RuntimeError # Timer interface not supported; dartbug.com/7728.
-async/stream_periodic2_test: RuntimeError # Timer interface not supported; dartbug.com/7728.
-async/stream_periodic3_test: RuntimeError # Timer interface not supported; dartbug.com/7728.
-async/stream_periodic4_test: RuntimeError # Timer interface not supported; dartbug.com/7728.
-async/stream_periodic5_test: RuntimeError # Timer interface not supported; dartbug.com/7728.
-async/run_zoned7_test: RuntimeError # Timer interface not supported: dartbug.com/7728.
-async/catch_errors22_test: RuntimeError # Timer interface not supported: dartbug.com/7728.
-async/timer_isActive_test: RuntimeError # Timer interface not supported: dartbug.com/7728.
-async/zone_empty_description2_test: RuntimeError # Timer interface not supported: dartbug.com/7728.
-async/zone_create_timer2_test: RuntimeError # Timer interface not supported: dartbug.com/7728.
-async/zone_create_periodic_timer_test: RuntimeError # Timer interface not supported: dartbug.com/7728.
-async/stream_iterator_test: RuntimeError, OK # Timer interface not supported: dartbug.com/7728.
-async/catch_errors12_test: Fail # Timer interface not supported: dartbug.com/7728.
-async/catch_errors13_test: Fail # Timer interface not supported: dartbug.com/7728.
-async/catch_errors14_test: Fail # Timer interface not supported: dartbug.com/7728.
-async/catch_errors15_test: Fail # Timer interface not supported: dartbug.com/7728.
-async/catch_errors18_test: Fail # Timer interface not supported: dartbug.com/7728.
-async/catch_errors19_test: Fail # Timer interface not supported: dartbug.com/7728.
-async/catch_errors20_test: Fail # Timer interface not supported: dartbug.com/7728.
-async/catch_errors28_test: Fail # Timer interface not supported: dartbug.com/7728.
-async/catch_errors8_test: Fail # Timer interface not supported: dartbug.com/7728.
-async/run_zoned8_test: Fail # Timer interface not supported: dartbug.com/7728.
-async/zone_bind_test: Fail # Timer interface not supported: dartbug.com/7728.
-async/future_timeout_test: Fail # Timer interface not supported: dartbug.com/7728.
-async/stream_timeout_test: Fail # Timer interface not supported: dartbug.com/7728.
-async/stream_asyncexpand_test: RuntimeError # Timer interface not supported: dartbug.com/7728.
-async/stream_asyncmap_test: RuntimeError # Timer interface not supported: dartbug.com/7728.
-async/stream_transformation_broadcast_test: RuntimeError # Timer interface not supported: dartbug.com/7728.
-async/stream_controller_test: Fail # Timer interface not supported: dartbug.com/7728.
+async/stream_controller_async_test: RuntimeError # Timer interface not supported; Issue 7728.
+async/stream_periodic_test: RuntimeError # Timer interface not supported; Issue 7728.
+async/stream_periodic2_test: RuntimeError # Timer interface not supported; Issue 7728.
+async/stream_periodic3_test: RuntimeError # Timer interface not supported; Issue 7728.
+async/stream_periodic4_test: RuntimeError # Timer interface not supported; Issue 7728.
+async/stream_periodic5_test: RuntimeError # Timer interface not supported; Issue 7728.
+async/run_zoned7_test: RuntimeError # Timer interface not supported: Issue 7728.
+async/catch_errors22_test: RuntimeError # Timer interface not supported: Issue 7728.
+async/timer_isActive_test: RuntimeError # Timer interface not supported: Issue 7728.
+async/zone_empty_description2_test: RuntimeError # Timer interface not supported: Issue 7728.
+async/zone_create_timer2_test: RuntimeError # Timer interface not supported: Issue 7728.
+async/zone_create_periodic_timer_test: RuntimeError # Timer interface not supported: Issue 7728.
+async/stream_iterator_test: RuntimeError, OK # Timer interface not supported: Issue 7728.
+async/catch_errors12_test: Fail # Timer interface not supported: Issue 7728.
+async/catch_errors13_test: Fail # Timer interface not supported: Issue 7728.
+async/catch_errors14_test: Fail # Timer interface not supported: Issue 7728.
+async/catch_errors15_test: Fail # Timer interface not supported: Issue 7728.
+async/catch_errors18_test: Fail # Timer interface not supported: Issue 7728.
+async/catch_errors19_test: Fail # Timer interface not supported: Issue 7728.
+async/catch_errors20_test: Fail # Timer interface not supported: Issue 7728.
+async/catch_errors28_test: Fail # Timer interface not supported: Issue 7728.
+async/catch_errors8_test: Fail # Timer interface not supported: Issue 7728.
+async/run_zoned8_test: Fail # Timer interface not supported: Issue 7728.
+async/zone_bind_test: Fail # Timer interface not supported: Issue 7728.
+async/future_timeout_test: Fail # Timer interface not supported: Issue 7728.
+async/stream_timeout_test: Fail # Timer interface not supported: Issue 7728.
+async/stream_asyncexpand_test: RuntimeError # Timer interface not supported: Issue 7728.
+async/stream_asyncmap_test: RuntimeError # Timer interface not supported: Issue 7728.
+async/stream_transformation_broadcast_test: RuntimeError # Timer interface not supported: Issue 7728.
+async/stream_controller_test: Fail # Timer interface not supported: Issue 7728.
+mirrors/mirrors_reader_test: Slow, RuntimeError, Crash # Issue 16589 - RuntimeError.  Issue 22130 - Crash (out of memory).
 
 [ $compiler == dart2js && $checked ]
 convert/utf85_test: Pass, Slow # Issue 12029.
@@ -193,7 +194,7 @@
 js/*: Skip
 
 [ $compiler == dart2dart ]
-mirrors/*: Skip # http://dartbug.com/11511
+mirrors/*: Skip # Issue 11511
 async/schedule_microtask6_test: Fail             # Issue 10957 - may be related to issue 10910
 
 [ $compiler == dart2dart && $minified ]
@@ -248,7 +249,7 @@
 mirrors/immutable_collections_test: Skip # Dartium debug uses -O0, so this will just timeout and waste bot cycles.
 mirrors/mirrors_reader_test: Skip # Dartium debug uses -O0, so this will just timeout and waste bot cycles.
 mirrors/library_uri_io_test: Skip # Not intended for drt as it uses dart:io.
-mirrors/local_isolate_test: Skip # http://dartbug.com/12188
+mirrors/local_isolate_test: Skip # Issue 12188
 
 [ $compiler == none && $runtime == drt && $system == windows ]
 async/multiple_timer_test: Fail, Pass # See Issue 10982
@@ -323,4 +324,4 @@
 convert/streamed_conversion_json_utf8_decode_test: Skip  # Verification OOM.
 
 [ $mode == debug && $arch != ia32 && $arch != x64 && $arch != simarm ]
-convert/streamed_conversion_json_utf8_decode_test: Skip  # Verification not yet implemented.
\ No newline at end of file
+convert/streamed_conversion_json_utf8_decode_test: Skip  # Verification not yet implemented.
diff --git a/tests/lib/mirrors/invocation_fuzz_test.dart b/tests/lib/mirrors/invocation_fuzz_test.dart
index 404353a..6ff9242 100644
--- a/tests/lib/mirrors/invocation_fuzz_test.dart
+++ b/tests/lib/mirrors/invocation_fuzz_test.dart
@@ -29,26 +29,9 @@
   // These prevent the test from exiting.
   'dart.io.sleep',
   'dart.io.HttpServer.HttpServer.listenOn',
-  new RegExp('dart\.io\..*'),  /// smi: ok
-  new RegExp('dart\.io\._Timer\..*'),
-  new RegExp('dart\.isolate\..*'),
-
-  // Runtime exceptions we can't catch because they occur too early in event
-  // dispatch to be caught in a zone.
-  'dart.io._Timer._createTimer',  /// smi: ok
-  'dart.async.runZoned',  /// string: ok
-  'dart.async._ScheduleImmediate._closure',
 
   // These either cause the VM to segfault or throw uncatchable API errors.
   // TODO(15274): Fix them and remove from blacklist.
-  'dart.io._IOService.dispatch',
-  'dart.io._IOService._initialize',
-  'dart.io._IOService._finalize',
-  'dart.io._StdIOUtils._socketType',
-  'dart.io._StdIOUtils._getStdioOutputStream',
-  'dart.io._Filter.newZLibInflateFilter',
-  'dart.io._Filter.newZLibDeflateFilter',
-  'dart.io._FileSystemWatcher._listenOnSocket',
   'dart.io.SystemEncoding.decode',  // Windows only
   'dart.io.SystemEncoding.encode',  // Windows only
 ];
diff --git a/tests/lib/mirrors/mirror_in_static_init_test.dart b/tests/lib/mirrors/mirror_in_static_init_test.dart
new file mode 100644
index 0000000..ae52922
--- /dev/null
+++ b/tests/lib/mirrors/mirror_in_static_init_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Error in class finalization triggered via mirror in a static initializer.
+// Simply check that we do not crash.
+// This is a regression test for the VM.
+
+library mirror_in_static_init_test;
+
+import 'dart:mirrors';
+
+// This class is only loaded during initialization of `staticField`.
+abstract class C {
+  int _a;
+// This is a syntax error on purpose.
+  C([this._a: 0]); /// 01: compile-time error
+}
+
+final int staticField = () {
+  var lib = currentMirrorSystem().findLibrary(#mirror_in_static_init_test);
+  var lst = new List.from(lib.declarations.values);
+  return 42;
+}();
+
+main() {
+  return staticField;
+}
diff --git a/tests/standalone/io/console_script.dart b/tests/standalone/io/console_script.dart
deleted file mode 100644
index 130031e..0000000
--- a/tests/standalone/io/console_script.dart
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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";
-
-class Message {
-  final message;
-  Message(this.message);
-  toString() => message;
-}
-
-void test(ConsoleSink sink) {
-  sink.add([65, 66, 67]);
-  sink.write('DEF');
-  sink.writeAll(['GH', 'I']);
-  sink.writeCharCode(74);
-  sink.writeln('KLM');
-}
-
-void main(List<String> arguments) {
-  console.log('stdout');
-  console.error('stderr');
-  console.log();
-  console.error();
-  console.log(new Message('tuodts'));
-  console.error(new Message('rredts'));
-  test(console.log);
-  test(console.error);
-  exit(1);
-}
diff --git a/tests/standalone/io/process_detached_script.dart b/tests/standalone/io/process_detached_script.dart
new file mode 100644
index 0000000..122831b
--- /dev/null
+++ b/tests/standalone/io/process_detached_script.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Simple script hanging for testing a detached process.
+
+import 'dart:isolate';
+
+main() {
+  new ReceivePort().listen(print);
+}
diff --git a/tests/standalone/io/process_detached_test.dart b/tests/standalone/io/process_detached_test.dart
new file mode 100644
index 0000000..483b9ca
--- /dev/null
+++ b/tests/standalone/io/process_detached_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Process test program to test detached processes.
+
+import 'dart:async';
+import 'dart:io';
+
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+import "process_test_util.dart";
+
+void test() {
+  asyncStart();
+  var script =
+      Platform.script.resolve('process_detached_script.dart').toFilePath();
+  var future = Process.start(Platform.executable, [script], detach: true);
+  future.then((process) {
+    print(process.pid);
+    Expect.isNotNull(process.pid);
+    Expect.isTrue(process.pid is int);
+    Expect.isNull(process.exitCode);
+    Expect.isNull(process.stderr);
+    Expect.isNull(process.stdin);
+    Expect.isNull(process.stdout);
+    Expect.isTrue(process.kill());
+  }).whenComplete(() {
+    asyncEnd();
+  });
+}
+
+void testFailure() {
+  asyncStart();
+  Directory.systemTemp.createTemp('dart_detached_process').then((temp) {
+    var future = Process.start(temp.path, ['a', 'b'], detach: true);
+    future.then((process) {
+      Expect.fail('Starting process from invalid executable succeeded');
+    }, onError: (e) {
+      Expect.isTrue(e is ProcessException);
+    }).whenComplete(() {
+      temp.deleteSync();
+      asyncEnd();
+    });
+  });
+}
+
+main() {
+  test();
+  testFailure();
+}
diff --git a/tests/standalone/io/regress_21987_test.dart b/tests/standalone/io/regress_21987_test.dart
new file mode 100644
index 0000000..7cc6308f
--- /dev/null
+++ b/tests/standalone/io/regress_21987_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. 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 "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+void main() {
+  if (Platform.isLinux) {
+    asyncStart();
+    var selfExe = new Link('/proc/self/exe');
+    Expect.isTrue(selfExe.targetSync().length > 0);
+    selfExe.target().then((target) {
+      Expect.isTrue(target.length > 0);
+      asyncEnd();
+    });
+  }
+}
diff --git a/tests/standalone/io/stdio_nonblocking_script.dart b/tests/standalone/io/stdio_nonblocking_script.dart
new file mode 100644
index 0000000..773f837
--- /dev/null
+++ b/tests/standalone/io/stdio_nonblocking_script.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+import "dart:io";
+
+class Message {
+  final message;
+  Message(this.message);
+  toString() => message;
+}
+
+void test(IOSink sink) {
+  sink.add([65, 66, 67]);
+  sink.write('DEF');
+  sink.writeAll(['GH', 'I']);
+  sink.writeCharCode(74);
+  sink.writeln('KLM');
+}
+
+void main(List<String> arguments) {
+  stdout.nonBlocking.writeln('stdout');
+  stderr.nonBlocking.writeln('stderr');
+  stdout.nonBlocking.writeln();
+  stderr.nonBlocking.writeln();
+  stdout.nonBlocking.writeln(new Message('tuodts'));
+  stderr.nonBlocking.writeln(new Message('rredts'));
+  test(stdout.nonBlocking);
+  test(stderr.nonBlocking);
+  Future.wait([stdout.nonBlocking.close(),
+               stderr.nonBlocking.close()])
+      .then((_) => exit(1));
+}
diff --git a/tests/standalone/io/console_test.dart b/tests/standalone/io/stdio_nonblocking_test.dart
similarity index 84%
rename from tests/standalone/io/console_test.dart
rename to tests/standalone/io/stdio_nonblocking_test.dart
index 30d1c9f..0740dbe 100644
--- a/tests/standalone/io/console_test.dart
+++ b/tests/standalone/io/stdio_nonblocking_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -8,7 +8,8 @@
 import "package:expect/expect.dart";
 
 void main() {
-  var script = Platform.script.resolve("console_script.dart").toFilePath();
+  var script =
+      Platform.script.resolve("stdio_nonblocking_script.dart").toFilePath();
   Process.run(Platform.executable,
               ['--checked', script],
               stdoutEncoding: ASCII,
diff --git a/tests/standalone/io/stdout_stderr_non_blocking_test.dart b/tests/standalone/io/stdout_stderr_non_blocking_test.dart
new file mode 100644
index 0000000..061e855
--- /dev/null
+++ b/tests/standalone/io/stdout_stderr_non_blocking_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+import "dart:async";
+import "dart:convert";
+import "dart:io";
+
+callIOSink(IOSink sink) {
+  // Call all methods on IOSink.
+  sink.encoding = ASCII;
+  Expect.equals(ASCII, sink.encoding);
+  sink.write("Hello\n");
+  sink.writeln("Hello");
+  sink.writeAll(["H", "e", "l", "lo\n"]);
+  sink.writeCharCode(72);
+  sink.add([101, 108, 108, 111, 10]);
+
+  var controller = new StreamController(sync: true);
+  var future = sink.addStream(controller.stream);
+  controller.add([72, 101, 108]);
+  controller.add([108, 111, 10]);
+  controller.close();
+
+  future.then((_) {
+    controller = new StreamController(sync: true);
+    controller.stream.pipe(sink);
+    controller.add([72, 101, 108]);
+    controller.add([108, 111, 10]);
+    controller.close();
+  });
+}
+
+main() {
+  callIOSink(stdout.nonBlocking);
+  stdout.nonBlocking.done.then((_) {
+    callIOSink(stderr.nonBlocking);
+    stderr.nonBlocking.done.then((_) {
+      stdout.close();
+      stderr.close();
+    });
+  });
+}
diff --git a/tests/standalone/io/stdout_stderr_terminal_test.dart b/tests/standalone/io/stdout_stderr_terminal_test.dart
new file mode 100644
index 0000000..0d88078
--- /dev/null
+++ b/tests/standalone/io/stdout_stderr_terminal_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:io";
+
+import "package:expect/expect.dart";
+
+void testTerminalSize(std) {
+  if (std.hasTerminal) {
+    Expect.notEquals(0, std.terminalColumns);
+    Expect.notEquals(0, std.terminalLines);
+  } else {
+    Expect.throws(() => std.terminalColumns, (e) => e is StdoutException);
+    Expect.throws(() => std.terminalLines, (e) => e is StdoutException);
+  }
+}
+
+
+void main() {
+  testTerminalSize(stdout);
+  testTerminalSize(stderr);
+}
diff --git a/tests/standalone/io/stdout_test.dart b/tests/standalone/io/stdout_test.dart
deleted file mode 100644
index 57a7e1c..0000000
--- a/tests/standalone/io/stdout_test.dart
+++ /dev/null
@@ -1,22 +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 "package:expect/expect.dart";
-
-void testTerminalSize() {
-  if (stdout.hasTerminal) {
-    Expect.notEquals(0, stdout.terminalColumns);
-    Expect.notEquals(0, stdout.terminalLines);
-  } else {
-    Expect.throws(() => stdout.terminalColumns, (e) => e is StdoutException);
-    Expect.throws(() => stdout.terminalLines, (e) => e is StdoutException);
-  }
-}
-
-
-void main() {
-  testTerminalSize();
-}
diff --git a/tests/standalone/io/web_socket_test.dart b/tests/standalone/io/web_socket_test.dart
index b04e02f..d9229b6 100644
--- a/tests/standalone/io/web_socket_test.dart
+++ b/tests/standalone/io/web_socket_test.dart
@@ -350,6 +350,7 @@
   }
 
   testIndividualUpgrade(int connections) {
+    asyncStart();
     createServer().then((server) {
       server.listen((request) {
           if (WebSocketTransformer.isUpgradeRequest(request)) {
@@ -392,6 +393,7 @@
       Future.wait(futures).then((_) {
         server.close();
         client.close();
+        asyncEnd();
       });
     });
   }
@@ -432,6 +434,40 @@
     });
   }
 
+  void testAdditionalHeaders() {
+    asyncStart();
+    createServer().then((server) {
+      server.listen((request) {
+        Expect.isTrue(WebSocketTransformer.isUpgradeRequest(request));
+        Expect.equals('my-value', request.headers['My-Header'][0]);
+        var header = request.headers['My-Header-Multiple'];
+        Expect.equals(1, header.length);
+        Expect.equals('my-value-1, my-value-2', header[0]);
+        WebSocketTransformer.upgrade(request).then((webSocket) {
+          webSocket.listen((_) { webSocket.close(); });
+          webSocket.add("Hello");
+        });
+      });
+
+      var url = '${secure ? "wss" : "ws"}://$HOST_NAME:${server.port}/';
+      var headers = {'My-Header': 'my-value',
+                     'My-Header-Multiple': ['my-value-1', 'my-value-2']};
+      print(headers);
+      print(headers['My-Header-Multiple'] is Iterable);
+      print(headers['My-Header-Multiple'].length);
+      WebSocket.connect(url, headers: headers).then((websocket) {
+        return websocket.listen((message) {
+          Expect.equals("Hello", message);
+          websocket.close();
+        }).asFuture();
+      }).then((_) {
+        server.close();
+        asyncEnd();
+      });
+    });
+  }
+
+
   void runTests() {
     testRequestResponseClientCloses(2, null, null, 1);
     testRequestResponseClientCloses(2, 3001, null, 2);
@@ -453,6 +489,7 @@
     testConnections(10, 3002, "Got tired");
     testIndividualUpgrade(5);
     testFromUpgradedSocket();
+    testAdditionalHeaders();
   }
 }
 
diff --git a/tests/standalone/oom_error_stacktrace_test.dart b/tests/standalone/oom_error_stacktrace_test.dart
index dc20fc9..11b0f90 100644
--- a/tests/standalone/oom_error_stacktrace_test.dart
+++ b/tests/standalone/oom_error_stacktrace_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing throw statement
+// VMOptions=--old_gen_heap_size=512
 
 import "package:expect/expect.dart";
 
diff --git a/tests/standalone/out_of_memory_test.dart b/tests/standalone/out_of_memory_test.dart
index 91e7c27..ce5224b 100644
--- a/tests/standalone/out_of_memory_test.dart
+++ b/tests/standalone/out_of_memory_test.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+// VMOptions=--old_gen_heap_size=512
 
 import "package:expect/expect.dart";
 
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 0385ad0..eed5e47 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -15,6 +15,7 @@
 
 [ $runtime == vm ]
 package/package_isolate_test: Fail # Issue 12474
+io/observatory_test: Fail
 
 [ $runtime == vm && $checked ]
 # These tests have type errors on purpose.
@@ -49,6 +50,8 @@
 issue14236_test: Skip # Issue 14236 Script snapshots do not work in the browser.
 javascript_compatibility_errors_test: Skip
 javascript_compatibility_warnings_test: Skip
+oom_error_stacktrace_test: Skip
+out_of_memory_test: Skip
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 javascript_int_overflow_literal_test/01: Fail, OK
@@ -116,11 +119,11 @@
 javascript_int_overflow_test: Skip # --throw_on_javascript_int_overflow not supported on MIPS.
 
 [ $arch == mips ]
-io/signals_test: Fail # dartbug.com/17440
-io/file_stat_test: Fail # dartbug.com/17440
+io/signals_test: Fail # Issue 17440
+io/file_stat_test: Fail # Issue 17440
 io/process_sync_test: Skip # Starts 10 dart subprocesses, uses too much memory.
 io/signals_test: Skip # Starts 10 dart subprocesses, uses too much memory
-io/file_read_special_device_test: Fail # dartbug.com/17440
+io/file_read_special_device_test: Fail # Issue 17440
 
 [ $arch == mips && $mode == debug ]
 io/web_socket_test: Skip # Times out. Issue 20352
diff --git a/tests/standalone/typed_data_test.dart b/tests/standalone/typed_data_test.dart
index f3eae2f..fa467de 100644
--- a/tests/standalone/typed_data_test.dart
+++ b/tests/standalone/typed_data_test.dart
@@ -486,4 +486,3 @@
   testWhere();
   testCreationFromList();
 }
-
diff --git a/tests/try/try.status b/tests/try/try.status
index ebb8795..40ac392 100644
--- a/tests/try/try.status
+++ b/tests/try/try.status
@@ -11,11 +11,11 @@
 web/end_to_end_test: Fail, Pass # https://code.google.com/p/v8/issues/detail?id=3347
 
 [ $csp ]
-web/end_to_end_test: Fail, OK # http://dartbug.com/17935
+web/end_to_end_test: Fail, OK # Issue 17935
 web/incremental_compilation_update_test: Skip # Test uses eval, not supported in CSP mode.
 
 [ $runtime == safari || $runtime == safarimobilesim ]
-web/cursor_position_test: Fail # http://dartbug.com/19836
+web/cursor_position_test: Fail # Issue 19836
 web/incremental_compilation_update_test: Skip # Safari may crash on this test.
 
 [ $runtime == safari && $checked ]
@@ -34,7 +34,7 @@
 poi/serialize_test: SkipByDesign # Uses dart:io.
 
 [ $compiler == dart2js ]
-poi/*: Skip # http://dartbug.com/20031
+poi/*: Skip # Issue 20031
 
 [ $compiler == dart2js ]
 # Compilation is slow, test fails at runtime due to time out, but
diff --git a/tests/try/web/incremental_compilation_update.html b/tests/try/web/incremental_compilation_update.html
index 54e929f..61734d4 100644
--- a/tests/try/web/incremental_compilation_update.html
+++ b/tests/try/web/incremental_compilation_update.html
@@ -40,7 +40,7 @@
       script.type = 'application/javascript';
       document.body.appendChild(script);
     } else if (e.data[0] === 'apply-update') {
-      self.$dart_unsafe_eval.patch(e.data[1]);
+      self.$dart_unsafe_incremental_support.patch(e.data[1]);
 
       dartMainClosure();
 
diff --git a/tests/utils/utils.status b/tests/utils/utils.status
index a720427..fadb64d 100644
--- a/tests/utils/utils.status
+++ b/tests/utils/utils.status
@@ -7,7 +7,7 @@
 recursive_import_test: Slow, Pass
 
 [ $compiler == none && $runtime == drt ]
-dummy_compiler_test: Skip # http://dartbug.com/7233
+dummy_compiler_test: Skip # Issue 7233
 
 [ $compiler == dart2js && $browser ]
 *: Skip
@@ -21,6 +21,6 @@
 dummy_compiler_test: Slow, Pass
 
 [ $compiler == none && $runtime == ContentShellOnAndroid ]
-dummy_compiler_test: Pass, RuntimeError # http://dartbug.com/17662
-recursive_import_test: Pass, RuntimeError # http://dartbug.com/17662
-source_mirrors_test: Pass, RuntimeError # http://dartbug.com/17662
+dummy_compiler_test: Pass, RuntimeError # Issue 17662
+recursive_import_test: Pass, RuntimeError # Issue 17662
+source_mirrors_test: Pass, RuntimeError # Issue 17662
diff --git a/tools/VERSION b/tools/VERSION
index ca9a130..406bd15 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 9
 PATCH 0
-PRERELEASE 4
+PRERELEASE 5
 PRERELEASE_PATCH 0
diff --git a/tools/android_link.py b/tools/android_link.py
index 47ca095..28edce5 100755
--- a/tools/android_link.py
+++ b/tools/android_link.py
@@ -108,16 +108,15 @@
   # Set up the path to the system root directory, which is where we'll find the
   # Android specific system includes and libraries.
   android_ndk_sysroot = os.path.join(android_ndk_root,
-      'platforms', 'android-L', 'arch-arm')
+      'platforms', 'android-14', 'arch-arm')
   if target_arch == 'arm64':
     android_ndk_sysroot = os.path.join(android_ndk_root,
-      'platforms', 'android-L', 'arch-arm64')
+      'platforms', 'android-21', 'arch-arm64')
   if target_arch == 'ia32':
     android_ndk_sysroot = os.path.join(android_ndk_root,
-        'platforms', 'android-L', 'arch-x86')
+        'platforms', 'android-14', 'arch-x86')
   CheckDirExists(android_ndk_sysroot, 'Android sysroot')
   android_ndk_lib = os.path.join(android_ndk_sysroot,'usr','lib')
-  android_ndk_include = os.path.join(android_ndk_sysroot, 'usr', 'include')
   crtend_android = os.path.join(android_ndk_lib, 'crtend_android.o')
 
   if link_target == 'target':
diff --git a/tools/archive_crash.py b/tools/archive_crash.py
index e7e290b..bac1db1 100755
--- a/tools/archive_crash.py
+++ b/tools/archive_crash.py
@@ -18,6 +18,7 @@
 import uuid
 
 GCS_FOLDER = 'dart-crashes'
+GSUTIL='/b/build/scripts/slave/gsutil'
 
 def CreateTarball(input_dir, tarname):
   print 'Creating tar file: %s' % tarname
@@ -27,13 +28,19 @@
 
 def CopyToGCS(filename):
   gs_location = 'gs://%s/%s/' % (GCS_FOLDER, uuid.uuid4())
-  cmd = ['gsutil', 'cp', filename, gs_location]
+  cmd = [GSUTIL, 'cp', filename, gs_location]
   print 'Running command: %s' % cmd
   subprocess.check_call(cmd)
   archived_filename = '%s%s' % (gs_location, filename.split('/').pop())
   print 'Dump now available in %s' % archived_filename
 
+def TEMPArchiveBuild():
+  d = '/b/build/slave/vm-linux-debug-x64-asan-be/build/dart/out/DebugX64/dart'
+  CopyToGCS(d)
+
 def Main():
+  if 'PWD' in os.environ and 'x64-asan' in os.environ['PWD']:
+    TEMPArchiveBuild()
   if utils.GuessOS() != 'linux':
     print 'Currently only archiving crash dumps on linux'
     return 0
diff --git a/tools/bots/compiler.py b/tools/bots/compiler.py
index 1a9b119..f166bc1 100644
--- a/tools/bots/compiler.py
+++ b/tools/bots/compiler.py
@@ -23,7 +23,7 @@
 
 DARTIUM_BUILDER = r'none-dartium-(linux|mac|windows)'
 DART2JS_BUILDER = (
-    r'dart2js-(linux|mac|windows)(-(jsshell))?-(debug|release)(-(checked|host-checked))?(-(host-checked))?(-(minified))?(-(x64))?(-(batch))?-?(\d*)-?(\d*)')
+    r'dart2js-(linux|mac|windows)(-(jsshell))?-(debug|release)(-(checked|host-checked))?(-(host-checked))?(-(minified))?(-(x64))?-?(\d*)-?(\d*)')
 DART2JS_FULL_BUILDER = r'full-(linux|mac|win7|win8)(-(ie10|ie11))?(-checked)?(-minified)?-(\d+)-(\d+)'
 WEB_BUILDER = (
     r'dart2js-(ie9|ie10|ie11|ff|safari|chrome|chromeOnAndroid|safarimobilesim|opera|drt)-(win7|win8|mac10\.7|mac10\.8|mac10\.9|linux)(-(all|html))?(-(csp))?(-(\d+)-(\d+))?')
@@ -31,16 +31,17 @@
 IE_VERSIONS = ['ie10', 'ie11']
 
 DART2JS_FULL_CONFIGURATIONS = {
-  'linux' : [ ],
+  'linux' : [
+    {'runtime' : 'ff'},
+    {'runtime' : 'chrome'},
+  ],
   'mac' : [ ],
   'windows-ie10' : [
     {'runtime' : 'ie10'},
-    {'runtime' : 'ie10', 'additional_flags' : ['--checked']},
     {'runtime' : 'chrome'},
   ],
   'windows-ie11' : [
     {'runtime' : 'ie11'},
-    {'runtime' : 'ie11', 'additional_flags' : ['--checked']},
     {'runtime' : 'ff'},
   ],
 }
@@ -123,8 +124,8 @@
       minified = True
     if dart2js_pattern.group(12) == 'x64':
       arch = 'x64'
-    shard_index = dart2js_pattern.group(15)
-    total_shards = dart2js_pattern.group(16)
+    shard_index = dart2js_pattern.group(13)
+    total_shards = dart2js_pattern.group(14)
   elif dartium_pattern:
     compiler = 'none'
     runtime = 'dartium'
@@ -287,7 +288,7 @@
 
   if compiler == 'dart2js' and runtime in ['ie10', 'ie11']:
     TestStep(compiler, mode, system, compiler, runtime,
-             ['html', 'pkg', 'samples'], flags, arch)
+             ['html', 'pkg', 'samples', 'co19'], flags, arch)
   else:
     # Run the default set of test suites.
     TestStep(compiler, mode, system, compiler,
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index 48bb24a..74fc03e 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -161,7 +161,7 @@
 
     'OscillatorNode': 'OscillatorNode,Oscillator',
 
-    'PannerNode': 'PannerNode,AudioPannerNode',
+    'PannerNode': 'PannerNode,AudioPannerNode,webkitAudioPannerNode',
 
     'RTCPeerConnection': 'RTCPeerConnection,mozRTCPeerConnection',
 
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index 60845a4..f54b816 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -328,6 +328,7 @@
   'ParentNode.children',
   'ParentNode.firstElementChild',
   'ParentNode.lastElementChild',
+  'ParentNode.querySelectorAll',
   'RTCPeerConnection.createAnswer',
   'RTCPeerConnection.createOffer',
   'RTCPeerConnection.getStats',
diff --git a/tools/gyp/configurations_android.gypi b/tools/gyp/configurations_android.gypi
index 31a27a5..c60d776 100644
--- a/tools/gyp/configurations_android.gypi
+++ b/tools/gyp/configurations_android.gypi
@@ -209,7 +209,7 @@
       'Dart_Android_arm64_Base': {
         'abstract': 1,
         'variables': {
-          'android_sysroot': '<(android_ndk_root)/platforms/android-L/arch-arm64',
+          'android_sysroot': '<(android_ndk_root)/platforms/android-21/arch-arm64',
           'android_ndk_include': '<(android_sysroot)/usr/include',
           'android_ndk_lib': '<(android_sysroot)/usr/lib',
         },
diff --git a/tools/make_version.py b/tools/make_version.py
index 80ac418..925e3a6 100644
--- a/tools/make_version.py
+++ b/tools/make_version.py
@@ -35,9 +35,10 @@
   'symbols.cc',
 ]
 
-def makeVersionString():
+def makeVersionString(quiet):
   version_string = utils.GetVersion()
-  debugLog("Returning version string: %s " % version_string)
+  if not quiet:
+    debugLog("Returning version string: %s " % version_string)
   return version_string
 
 
@@ -50,9 +51,9 @@
   return vmhash.hexdigest()
 
 
-def makeFile(output_file, input_file):
+def makeFile(quiet, output_file, input_file):
   version_cc_text = open(input_file).read()
-  version_string = makeVersionString()
+  version_string = makeVersionString(quiet)
   version_cc_text = version_cc_text.replace("{{VERSION_STR}}",
                                             version_string)
   version_time = time.ctime(time.time())
@@ -69,6 +70,9 @@
   try:
     # Parse input.
     parser = OptionParser()
+    parser.add_option("-q", "--quiet",
+                      action="store_true", default=False,
+                      help="disable console output")
     parser.add_option("--output",
                       action="store", type="string",
                       help="output file name")
@@ -88,7 +92,7 @@
     for arg in args:
       files.append(arg)
 
-    if not makeFile(options.output, options.input):
+    if not makeFile(options.quiet, options.output, options.input):
       return -1
 
     return 0
diff --git a/tools/observatory_tool.py b/tools/observatory_tool.py
index 18d50c9..710cfa5 100755
--- a/tools/observatory_tool.py
+++ b/tools/observatory_tool.py
@@ -68,9 +68,9 @@
 def ExecuteCommand(options, args):
   cmd = options.command
   if (cmd == 'get'):
-    PubGet(options.dart_executable, options.package_root)
+    return PubGet(options.dart_executable, options.package_root)
   elif (cmd == 'build'):
-    PubBuild(options.dart_executable, options.package_root, args[0])
+    return PubBuild(options.dart_executable, options.package_root, args[0])
   elif (cmd == 'deploy'):
     Deploy('build', 'deployed')
   else:
diff --git a/tools/run_pub.py b/tools/run_pub.py
index 7a731cc..e11701d 100755
--- a/tools/run_pub.py
+++ b/tools/run_pub.py
@@ -28,23 +28,34 @@
   return ((options.package_root != None) and
           (options.dart_executable != None))
 
-def GetPrebuiltDartExecutablePath():
-  osdict = {'Darwin':'macos', 'Linux':'linux', 'Windows':'win32'}
+def GetPrebuiltDartExecutablePath(suffix):
+  osdict = {'Darwin':'macos', 'Linux':'linux', 'Windows':'windows'}
   system = platform.system()
+  executable_name = 'dart'
+  if system == 'Windows':
+    executable_name = 'dart.exe'
   try:
     osname = osdict[system]
   except KeyError:
     print >>sys.stderr, ('WARNING: platform "%s" not supported') % (system)
     return None;
-  return os.path.join(DART_ROOT, 'tools', 'testing', 'bin', osname, 'dart')
+  return os.path.join(DART_ROOT,
+                      'tools',
+                      'testing',
+                      'bin',
+                      osname,
+                      executable_name + suffix)
 
 def RunPub(dart, pkg_root, args):
   return subprocess.call([dart, '--package-root=' + pkg_root, PUB_PATH] + args)
 
 def TryRunningExecutable(dart_executable, pkg_root):
-  return subprocess.call([dart_executable,
-                          '--package-root=' + pkg_root,
-                          CANARY_PATH]) == 42
+  try:
+    return subprocess.call([dart_executable,
+                            '--package-root=' + pkg_root,
+                            CANARY_PATH]) == 42
+  except:
+    return False;
 
 def DisplayBootstrapWarning():
   print """\
@@ -58,6 +69,26 @@
 
 """
 
+def FindDartExecutable(fallback_executable, package_root):
+  # If requested, use the bootstrap binary instead of the prebuilt
+  # executable.
+  if os.getenv('DART_USE_BOOTSTRAP_BIN') != None:
+    return fallback_executable
+  # Try to find a working prebuilt dart executable.
+  dart_executable = GetPrebuiltDartExecutablePath('')
+  if TryRunningExecutable(dart_executable, package_root):
+    return dart_executable
+  dart_executable = GetPrebuiltDartExecutablePath('-arm')
+  if TryRunningExecutable(dart_executable, package_root):
+    return dart_executable
+  dart_executable = GetPrebuiltDartExecutablePath('-mips')
+  if TryRunningExecutable(dart_executable, package_root):
+    return dart_executable
+  # If the system cannot execute a prebuilt dart executable, use the bootstrap
+  # executable instead.
+  DisplayBootstrapWarning()
+  return fallback_executable
+
 def main():
   # Parse the options.
   parser = BuildArguments()
@@ -65,16 +96,8 @@
   if not ProcessOptions(options, args):
     parser.print_help()
     return 1
-  dart_executable = GetPrebuiltDartExecutablePath()
-  # If the system cannot execute the prebuilt dart executable, use the bootstrap
-  # executable instead.
-  if not TryRunningExecutable(dart_executable, options.package_root):
-    DisplayBootstrapWarning()
-    dart_executable = options.dart_executable
-  # If requested, use the bootstrap binary instead of the prebuilt
-  # executable.
-  if os.getenv('DART_USE_BOOTSTRAP_BIN') != None:
-    dart_executable = options.dart_executable
+  dart_executable = FindDartExecutable(options.dart_executable,
+                                       options.package_root)
   return RunPub(dart_executable, options.package_root, args)
 
 
diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
index 006e56d..9673071 100644
--- a/tools/testing/dart/browser_controller.dart
+++ b/tools/testing/dart/browser_controller.dart
@@ -1087,6 +1087,9 @@
   }
 
   void restartBrowser(String id) {
+    if (browserName.contains('OnAndroid')) {
+      DebugLogger.info("Restarting browser $id");
+    }
     var browser;
     var new_id = id;
     if (browserName == 'chromeOnAndroid') {
@@ -1189,6 +1192,9 @@
     // browser, since a new test is being started.
     status.browser.resetTestBrowserOutput();
     status.browser.logBrowserInfoToTestBrowserOutput();
+    if (browserName.contains('OnAndroid')) {
+      DebugLogger.info("Browser $browserId getting test ${test.url}");
+    }
 
     return test;
   }
diff --git a/tools/testing/dart/status_file_parser.dart b/tools/testing/dart/status_file_parser.dart
index 20b57c7..918e664 100644
--- a/tools/testing/dart/status_file_parser.dart
+++ b/tools/testing/dart/status_file_parser.dart
@@ -109,8 +109,7 @@
 final RegExp SplitComment = new RegExp("^([^#]*)(#.*)?\$");
 final RegExp HeaderPattern = new RegExp(r"^\[([^\]]+)\]");
 final RegExp RulePattern = new RegExp(r"\s*([^: ]*)\s*:(.*)");
-final RegExp IssueNumberPattern =
-    new RegExp("Issue ([0-9]+)|dartbug.com/([0-9]+)", caseSensitive: false);
+final RegExp IssueNumberPattern = new RegExp("[Ii]ssue ([0-9]+)");
 
 class StatusFile {
   final Path location;
diff --git a/tools/testing/dart/status_reporter.dart b/tools/testing/dart/status_reporter.dart
index 80d0ef7..c031cd1 100644
--- a/tools/testing/dart/status_reporter.dart
+++ b/tools/testing/dart/status_reporter.dart
@@ -90,16 +90,18 @@
   return COMBINATIONS[Platform.operatingSystem];
 }
 
-void ensureBuild() {
+void ensureBuild(Iterable<String> archs) {
   print('Building many platforms. Please be patient.');
-  var archs = Platform.operatingSystem == 'linux'
-    ? '-aia32,x64,simarm,simmips'
-    : '-aia32,x64';
 
-  var result = Process.runSync('python',
-      ['tools/build.py', '-mrelease,debug', archs, 'create_sdk',
-      // We build runtime to be able to list cc tests
-      'runtime']);
+  var archString = '-a${archs.join(',')}';
+
+  var args = ['tools/build.py', '-mrelease,debug', archString, 'create_sdk',
+    // We build runtime to be able to list cc tests
+    'runtime'];
+
+  print('Running: python ${args.join(" ")}');
+
+  var result = Process.runSync('python', args);
 
   if (result.exitCode != 0) {
     print('ERROR');
@@ -130,10 +132,17 @@
 }
 
 void main(List<String> args) {
-  ensureBuild();
+  var combinations = getCombinations();
+
+  var arches = combinations.fold(new Set<String>(), (set, value) {
+    set.addAll(value['archs']);
+    return set;
+  });
+
+  ensureBuild(arches);
 
   List<String> keys;
-  for (var combination in getCombinations()) {
+  for (var combination in combinations) {
     for (var mode in combination['modes']) {
       for (var arch in combination['archs']) {
         for (var runtime in combination['runtimes']) {
@@ -148,8 +157,9 @@
             throw new Exception("Error running: ${args.join(" ")}");
           }
 
-          // Find Total: 15063 tests
-          // Everything after this will be the report.
+          // Find "JSON:"
+          // Everything after will the JSON-formatted output
+          // per --report-in-json flag above
           var totalIndex = result.stdout.indexOf('JSON:');
           var report = result.stdout.substring(totalIndex + 5);
 
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index c004ee6..8c929f9 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -654,8 +654,7 @@
           "runtime '${config['runtime']}' is invalid. "
           "Skipping this combination.");
     }
-    if ((config['runtime'] == 'ie9' || config['runtime'] == 'ie10') &&
-        Platform.operatingSystem != 'windows') {
+    if (config['ie'] && Platform.operatingSystem != 'windows') {
       isValid = false;
       print("Warning cannot run Internet Explorer on non-Windows operating"
           " system.");