Version 1.9.0-dev.4.0

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

git-svn-id: http://dart.googlecode.com/svn/trunk@42856 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index f5b67d6..5cfadd9 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -758,7 +758,7 @@
 \LMLabel{typeOfAFunction}
 
 \LMHash{}
-If a function does not declare a return type explicitly, its return type is \DYNAMIC{} (\ref{typeDynamic}).
+If a function does not declare a return type explicitly, its return type is \DYNAMIC{} (\ref{typeDynamic}), unless it is a constructor function, in which case its return type is the immediately enclosing class.
 
 \LMHash{}
 Let $F$ be a function with required formal parameters $T_1$ $p_1 \ldots, T_n$ $p_n$, return type $T_0$ and no optional parameters. Then the type of $F$ is $(T_1 ,\ldots, T_n) \rightarrow T_0$.
@@ -859,12 +859,17 @@
 \LMHash{}
 A class has constructors,  instance members and static members. The instance members of a class are its instance methods, getters, setters and instance variables. The static members of a class are its static methods, getters, setters and static variables. The members of a class are its static and instance members.
 
-% A class has a static scope and an instance scope. The enclosing scope of the static scope of a non-generic class is the enclosing scope of the class declaration. The enclosing scope of the static scope of a generic class is the type parameter scope (\ref{}) of the generic class declaration.
-%The enclosing scope of a class' instance scope is the class' static scope.
+A class has several scopes:
+\begin{itemize}
+\item A {\em type-parameter scope}, which is empty if the class is not generic (\ref{generics}).  The enclosing scope of the type-parameter scope of a class is the enclosing scope of the class declaration. 
+\item A {\em static scope}. The enclosing scope of the static scope of a  class is the type parameter scope (\ref{generics}) of the class.
+\item  An {\em instance scope}.
+The enclosing scope of a class' instance scope is the class' static scope.
+\end{itemize}
 
-%The enclosing scope of an instance member declaration is the instance scope of the class in which it is declared.
+The enclosing scope of an instance member declaration is the instance scope of the class in which it is declared.
 
-%The enclosing scope of a static member declaration is the static scope of the class in which it is declared.
+The enclosing scope of a static member declaration is the static scope of the class in which it is declared.
 
 
 \LMHash{}
@@ -1707,6 +1712,9 @@
 %} 
 
 \LMHash{}
+The scope of the \EXTENDS{} and \WITH{} clauses of a class $C$ is the type-parameter scope of $C$.
+
+\LMHash{}
 %It is a compile-time error if  the \EXTENDS{} clause of a class $C$ includes a type expression that does not denote a class available in the lexical scope of $C$. 
 It is a compile-time error if  the \EXTENDS{} clause of a class $C$ specifies an enumerated type (\ref{enums}), a malformed  type or a deferred type (\ref{staticTypes}) as a superclass.
 % too strict? Do we e want extends List<Undeclared> to work as List<dynamic>? 
@@ -1840,6 +1848,9 @@
 \end{grammar}
 
 \LMHash{}
+The scope of the \IMPLEMENTS{} clause of a class $C$ is the type-parameter scope of $C$.
+
+\LMHash{}
 It is a compile-time error if  the \IMPLEMENTS{}  clause of a class $C$ specifies a type variable as a superinterface. It is a compile-time error if  the  \IMPLEMENTS{} clause of a class $C$ specifies an enumerated type (\ref{enums}),  a malformed type or deferred type (\ref{staticTypes}) as a superinterface  It is a compile-time error if the \IMPLEMENTS{} clause of a class $C$ specifies type \DYNAMIC{} as a superinterface. It is a compile-time error if  the  \IMPLEMENTS{} clause of a class $C$ specifies  a type $T$ as a superinterface more than once.
 It is a compile-time error if the superclass of a class $C$ is specified as a superinterface of $C$.
 
@@ -2160,6 +2171,7 @@
 A type parameter $T$ may be suffixed with an \EXTENDS{} clause that specifies the {\em upper bound} for $T$. If no  \EXTENDS{} clause is present, the upper bound is \code{Object}.  It is a static type warning if a type parameter is a supertype of its upper bound. The bounds of type variables are a form of type annotation and have no effect on execution in production mode.
 
 \LMHash{}
+Type parameters are declared in the type-parameter scope of a class.
 The type parameters of a generic $G$ are in scope in the bounds of all of the type parameters of $G$. The type parameters of a generic class declaration $G$ are also in scope in the \EXTENDS{} and \IMPLEMENTS{} clauses of $G$ (if these exist) and in the body of $G$.   However, a type parameter is considered to be a malformed type when referenced by a static member.
 
 \rationale{
@@ -2687,7 +2699,7 @@
 \end{dartCode}
 
 
-\rationale{String interpolation work well for most cases. The main situation where it is not fully satisfactory is for string literals that are too large to fit on a line. Multiline strings can be useful, but in some cases, we want to visually align the code. This can be expressed by writing smaller strings separated by whitespace, as shown here:}
+\rationale{String interpolation works well for most cases. The main situation where it is not fully satisfactory is for string literals that are too large to fit on a line. Multiline strings can be useful, but in some cases, we want to visually align the code. This can be expressed by writing smaller strings separated by whitespace, as shown here:}
 
 
 
@@ -3285,7 +3297,7 @@
 \commentary{Note that it this point we are assured that the number of actual type arguments match the number of formal type parameters.}
 
 \LMHash{}
-A fresh instance (\ref{generativeConstructors}), $i$,  of class $R$ is allocated. For each instance variable $f$ of $i$,  if the variable declaration of $f$ has an initializer expression $e_f$, then $e_f$ is evaluated to an object $o_f$ and $f$ is bound to $o_f$. Otherwise $f$ is bound to \NULL{}.
+A fresh instance (\ref{generativeConstructors}), $i$,  of class $R$ is allocated. For each instance variable $f$ of $i$,  if the variable declaration of $f$ has an initializer expression $e_f$, then $e_f$ is evaluated, with the type parameters (if any) of $R$ bound to the actual type arguments $V_1, \ldots, V_l$, to an object $o_f$ and $f$ is bound to $o_f$. Otherwise $f$ is bound to \NULL{}.
 
 \commentary{
 Observe that \THIS{} is not in scope in $e_f$. Hence, the initialization cannot depend on other properties of the object being instantiated.
@@ -4013,7 +4025,7 @@
 \commentary{Observations:
 \begin{enumerate}
 \item One cannot closurize a getter or a setter.
-\item One can tell whether one implemented a property via a method or via field/getter, which means that one has to plan ahead as to what construct to use, and that choice is reflected in the interface of the class.
+\item One can tell whether one implemented a property via a method or via a field/getter, which means that one has to plan ahead as to what construct to use, and that choice is reflected in the interface of the class.
 \end{enumerate}
 } 
 
@@ -5132,7 +5144,7 @@
       identifier \IN{} expression
     .
 
-{\bf forInitializerStatement:}localVariableDeclaration `{\escapegrammar ;}';
+{\bf forInitializerStatement:}localVariableDeclaration;
       expression? `{\escapegrammar ;}'
     .
  \end{grammar}
@@ -7162,7 +7174,7 @@
 \hline
 Logical Or &  $||$ & Left & 4\\
 \hline
-Conditional &  e1? e2: e3 & None & 3\\
+Conditional &  e1? e2: e3 & Right & 3\\
 \hline
 Cascade & ..  & Left & 2\\
 \hline
diff --git a/out2.dart b/out2.dart
new file mode 100644
index 0000000..37b7d33
--- /dev/null
+++ b/out2.dart
@@ -0,0 +1,7 @@
+const MANGLED_GLOBAL_NAMES = 'mangledGlobalNames';
+main() {
+  var v0 = 1;
+  while (true) {
+    print(v0);
+  }
+}
diff --git a/pkg/analysis_server/bin/dartdeps.dart b/pkg/analysis_server/bin/dartdeps.dart
deleted file mode 100644
index 8b6ad68..0000000
--- a/pkg/analysis_server/bin/dartdeps.dart
+++ /dev/null
@@ -1,183 +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:async';
-import 'dart:io';
-
-import 'package:analysis_server/src/analysis_manager.dart';
-import 'package:args/args.dart';
-
-/**
- * Start analysis server as a separate process and use the websocket protocol
- * to analyze the application specified on the command line.
- */
-void main(List<String> args) {
-  new _DartDependencyAnalyzer(args).run().catchError((error, stack) {
-    print('Analysis failed: $error');
-    if (stack != null) {
-      print(stack);
-    }
-  });
-}
-
-/**
- * Instances of [_DartDependencyAnalyzer] launch an analysis server and use
- * that server to analyze the dependencies of an application.
- */
-class _DartDependencyAnalyzer {
-  /**
-   * The name of the application that is used to start the dependency analyzer.
-   */
-  static const BINARY_NAME = 'dartdeps';
-
-  /**
-   * The name of the option used to specify the Dart SDK.
-   */
-  static const String DART_SDK_OPTION = 'dart-sdk';
-
-  /**
-   * The name of the option used to print usage information.
-   */
-  static const String HELP_OPTION = 'help';
-
-  /**
-   * The name of the option used to specify an already running server.
-   */
-  static const String SERVER_OPTION = 'server';
-
-  /**
-   * The command line arguments.
-   */
-  final List<String> args;
-
-  /**
-   * The path to the Dart SDK used during analysis.
-   */
-  String sdkPath;
-
-  /**
-   * The manager for the analysis server.
-   */
-  AnalysisManager manager;
-
-  _DartDependencyAnalyzer(this.args);
-
-  /**
-   * Use the given manager to perform the analysis.
-   */
-  void analyze(AnalysisManager manager) {
-    if (manager == null) {
-      return;
-    }
-    this.manager = manager;
-    print('Analyzing...');
-  }
-
-  /**
-   * Print information about how to use the server.
-   */
-  void printUsage(ArgParser parser) {
-    print('Usage: $BINARY_NAME [flags] <application_directory>');
-    print('');
-    print('Supported flags are:');
-    print(parser.usage);
-  }
-
-  /**
-   * Parse the command line arguments to determine the application to be
-   * analyzed, then launch and manage an analysis server to do the work.
-   */
-  Future run() {
-    return new Future(start).then(analyze).whenComplete(stop);
-  }
-
-  /**
-   * Parse the command line arguments to determine the application to be
-   * analyzed, then launch an analysis server.
-   * Return `null` if the command line arguments are invalid.
-   */
-  Future<AnalysisManager> start() {
-    ArgParser parser = new ArgParser();
-    parser.addOption(DART_SDK_OPTION, help: '[sdkPath] path to Dart SDK');
-    parser.addFlag(
-        HELP_OPTION,
-        help: 'print this help message without starting analysis',
-        defaultsTo: false,
-        negatable: false);
-    parser.addOption(
-        SERVER_OPTION,
-        help: '[serverUrl] use an analysis server thats already running');
-
-    // Parse arguments
-    ArgResults results;
-    try {
-      results = parser.parse(args);
-    } on FormatException catch (e) {
-      print(e.message);
-      print('');
-      printUsage(parser);
-      exitCode = 1;
-      return null;
-    }
-    if (results[HELP_OPTION]) {
-      printUsage(parser);
-      return null;
-    }
-    sdkPath = results[DART_SDK_OPTION];
-    if (sdkPath is! String) {
-      print('Missing path to Dart SDK');
-      printUsage(parser);
-      return null;
-    }
-    Directory sdkDir = new Directory(sdkPath);
-    if (!sdkDir.existsSync()) {
-      print('Specified Dart SDK does not exist: $sdkPath');
-      printUsage(parser);
-      return null;
-    }
-    if (results.rest.length == 0) {
-      printUsage(parser);
-      exitCode = 1;
-      return null;
-    }
-    Directory appDir = new Directory(results.rest[0]);
-    if (!appDir.existsSync()) {
-      print('Specified application directory does not exist: $appDir');
-      print('');
-      printUsage(parser);
-      exitCode = 1;
-      return null;
-    }
-    if (results.rest.length > 1) {
-      print('Unexpected arguments after $appDir');
-      print('');
-      printUsage(parser);
-      exitCode = 1;
-      return null;
-    }
-
-    // Connect to an already running analysis server
-    String serverUrl = results[SERVER_OPTION];
-    if (serverUrl != null) {
-      return AnalysisManager.connect(serverUrl);
-    }
-
-    // Launch and connect to a new analysis server
-    // Assume that the analysis server entry point is in the same directory
-    StringBuffer path = new StringBuffer();
-    path.write(FileSystemEntity.parentOf(Platform.script.toFilePath()));
-    path.write(Platform.pathSeparator);
-    path.write('server.dart');
-    return AnalysisManager.start(path.toString());
-  }
-
-  /**
-   * Stop the analysis server.
-   */
-  void stop() {
-    if (manager != null) {
-      manager.stop();
-    }
-  }
-}
diff --git a/pkg/analysis_server/bin/fuzz.dart b/pkg/analysis_server/bin/fuzz.dart
deleted file mode 100644
index 49bdd1d..0000000
--- a/pkg/analysis_server/bin/fuzz.dart
+++ /dev/null
@@ -1,171 +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:async';
-import 'dart:io';
-
-import 'package:args/args.dart';
-import 'package:matcher/matcher.dart';
-import 'package:path/path.dart' as path;
-
-import 'fuzz/server_manager.dart';
-
-/**
- * Start analysis server as a separate process and use the stdio to communicate
- * with the server.
- */
-void main(List<String> args) {
-  new _FuzzTest().run(args);
-}
-
-/**
- * Instances of [_FuzzTest] launch and test an analysis server.
- * You must specify the location of the Dart SDK and the directory
- * containing sources to be analyzed.
- */
-class _FuzzTest {
-  /**
-   * The name of the application that is used to start the fuzz tester.
-   */
-  static const BINARY_NAME = 'fuzz';
-
-  //TODO (danrubel) extract common behavior for use in multiple test scenarios
-  //TODO (danrubel) cleanup test to use async/await for better readability
-  // VM flag --enable_async
-
-  static const String DART_SDK_OPTION = 'dart-sdk';
-  static const String HELP_OPTION = 'help';
-
-  File serverSnapshot;
-  Directory appDir;
-
-  /// Parse the arguments and initialize the receiver
-  /// Return `true` if proper arguments were provided
-  bool parseArgs(List<String> args) {
-    ArgParser parser = new ArgParser();
-
-    void error(String errMsg) {
-      stderr.writeln(errMsg);
-      print('');
-      _printUsage(parser);
-      exitCode = 11;
-    }
-
-    parser.addOption(DART_SDK_OPTION, help: '[sdkPath] path to Dart SDK');
-    parser.addFlag(
-        HELP_OPTION,
-        help: 'print this help message without starting analysis',
-        defaultsTo: false,
-        negatable: false);
-
-    ArgResults results;
-    try {
-      results = parser.parse(args);
-    } on FormatException catch (e) {
-      error(e.message);
-      return false;
-    }
-    if (results[HELP_OPTION]) {
-      _printUsage(parser);
-      return false;
-    }
-    String sdkPath = results[DART_SDK_OPTION];
-    if (sdkPath is! String) {
-      error('Missing path to Dart SDK');
-      return false;
-    }
-    Directory sdkDir = new Directory(sdkPath);
-    if (!sdkDir.existsSync()) {
-      error('Specified Dart SDK does not exist: $sdkPath');
-      return false;
-    }
-    if (results.rest.length == 0) {
-      error('Expected directory to analyze');
-      return false;
-    }
-    appDir = new Directory(results.rest[0]);
-    if (!appDir.existsSync()) {
-      error('Specified application directory does not exist: $appDir');
-      return false;
-    }
-    if (results.rest.length > 1) {
-      error('Unexpected arguments after $appDir');
-      return false;
-    }
-    serverSnapshot = new File(
-        path.join(sdkDir.path, 'bin', 'snapshots', 'analysis_server.dart.snapshot'));
-    if (!serverSnapshot.existsSync()) {
-      error('Analysis Server snapshot not found: $serverSnapshot');
-      return false;
-    }
-    return true;
-  }
-
-  /// Main entry point for launching, testing, and shutting down the server
-  void run(List<String> args) {
-    if (!parseArgs(args)) return;
-    ServerManager.start(serverSnapshot.path).then((ServerManager manager) {
-      runZoned(() {
-        test(manager).then(manager.stop).then((_) {
-          expect(manager.errorOccurred, isFalse);
-          print('Test completed successfully');
-        });
-      }, onError: (error, stack) {
-        stderr.writeln(error);
-        print(stack);
-        exitCode = 12;
-        manager.stop();
-      });
-    });
-  }
-
-  /// Use manager to exercise the analysis server
-  Future test(ServerManager manager) {
-
-    // perform initial analysis
-    return manager.analyze(appDir).then((AnalysisResults analysisResults) {
-      print(
-          'Found ${analysisResults.errorCount} errors,'
-              ' ${analysisResults.warningCount} warnings,'
-              ' and ${analysisResults.hintCount} hints in ${analysisResults.elapsed}');
-
-      // edit a method body
-      return manager.openFileNamed(
-          'domain_completion.dart').then((Editor editor) {
-        return editor.moveAfter('Response processRequest(Request request) {');
-      }).then((Editor editor) {
-        return editor.replace(0, '\nOb');
-      }).then((Editor editor) {
-
-        // request code completion and assert results
-        return editor.getSuggestions().then((List<CompletionResults> list) {
-          expect(list, isNotNull);
-          expect(list.length, equals(0));
-          list.forEach((CompletionResults results) {
-            print(
-                '${results.elapsed} received ${results.suggestionCount} suggestions');
-          });
-          return editor;
-        });
-
-      }).then((Editor editor) {
-        print('tests complete');
-      });
-    });
-  }
-
-//  void _printAnalysisSummary(AnalysisResults results) {
-//    print(
-//        'Found ${results.errorCount} errors, ${results.warningCount} warnings,'
-//            ' and ${results.hintCount} hints in $results.elapsed');
-//  }
-
-  /// Print information about how to use the server.
-  void _printUsage(ArgParser parser) {
-    print('Usage: $BINARY_NAME [flags] <application_directory>');
-    print('');
-    print('Supported flags are:');
-    print(parser.usage);
-  }
-}
diff --git a/pkg/analysis_server/bin/fuzz/README.txt b/pkg/analysis_server/bin/fuzz/README.txt
deleted file mode 100644
index f8d8a44..0000000
--- a/pkg/analysis_server/bin/fuzz/README.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-This directory contains code for fuzz testing the analysis server
-and for generating timing information for tracking server performance.
-
-Run:
-Launch fuzz.dart located in the parent directory.
-
-Overview:
-fuzz.dart - main entry point and simple example of exercizing server
-server_manager.dart - provides high level API for launching and driving server
diff --git a/pkg/analysis_server/bin/fuzz/logging_client_channel.dart b/pkg/analysis_server/bin/fuzz/logging_client_channel.dart
deleted file mode 100644
index 941646d..0000000
--- a/pkg/analysis_server/bin/fuzz/logging_client_channel.dart
+++ /dev/null
@@ -1,85 +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.
-
-part of server.manager;
-
-/**
- * A client channel that logs communication to stdout
- * and handles errors received from the server.
- */
-class LoggingClientChannel implements ClientCommunicationChannel {
-  final ClientCommunicationChannel channel;
-  int serverErrorCount = 0;
-
-  LoggingClientChannel(this.channel) {
-    channel.notificationStream.listen((Notification notification) {
-      _logNotification(notification);
-      if (notification.event == 'server.error') {
-        ServerErrorParams error =
-            new ServerErrorParams.fromNotification(notification);
-        _handleError(
-            'Server reported error: ${error.message}',
-            error.stackTrace);
-      }
-    });
-  }
-
-  @override
-  Stream<Notification> get notificationStream => channel.notificationStream;
-
-  @override
-  void set notificationStream(Stream<Notification> _notificationStream) {
-    throw 'invalid operation';
-  }
-
-  @override
-  Stream<Response> get responseStream => channel.responseStream;
-
-  @override
-  void set responseStream(Stream<Response> _responseStream) {
-    throw 'invalid operation';
-  }
-
-  @override
-  Future close() {
-    print('Requesting client channel be closed');
-    return channel.close().then((_) {
-      print('Client channel closed');
-    });
-  }
-
-  @override
-  Future<Response> sendRequest(Request request) {
-    _logOperation('=>', request);
-    return channel.sendRequest(request).then((Response response) {
-      RequestError error = response.error;
-      if (error != null) {
-        error.code;
-        stderr.write('Server Error ${error.code}: ${error.message}');
-        print(error.stackTrace);
-        exitCode = 31;
-      }
-      _logOperation('<=', request);
-      return response;
-    });
-  }
-
-  void _handleError(String errMsg, String stackTrace) {
-    //error.isFatal;
-    stderr.writeln('>>> Server reported exception');
-    stderr.writeln(errMsg);
-    print(stackTrace);
-    serverErrorCount++;
-  }
-
-  void _logNotification(Notification notification) {
-    print('<=       ${notification.event}');
-  }
-
-  void _logOperation(String direction, Request request) {
-    String id = request.id.padLeft(5);
-    String method = request.method.padRight(20);
-    print('$direction $id $method');
-  }
-}
diff --git a/pkg/analysis_server/bin/fuzz/server_manager.dart b/pkg/analysis_server/bin/fuzz/server_manager.dart
deleted file mode 100644
index e9dcf24..0000000
--- a/pkg/analysis_server/bin/fuzz/server_manager.dart
+++ /dev/null
@@ -1,365 +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.
-
-library server.manager;
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:matcher/matcher.dart';
-import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_server/src/channel/channel.dart';
-import 'package:analysis_server/src/channel/byte_stream_channel.dart';
-
-part 'logging_client_channel.dart';
-
-/**
- * The results returned by [ServerManager].analyze(...) once analysis
- * has finished.
- */
-class AnalysisResults {
-  Duration elapsed;
-  int errorCount = 0;
-  int hintCount = 0;
-  int warningCount = 0;
-}
-
-
-/**
- * [CompletionResults] contains the completion results returned by the server
- * along with the elapse time to receive those completions.
- */
-class CompletionResults {
-  final Duration elapsed;
-  final CompletionResultsParams params;
-
-  CompletionResults(this.elapsed, this.params);
-
-  int get suggestionCount => params.results.length;
-}
-
-/**
- * [Editor] is a virtual editor for inspecting and modifying a file's content
- * and updating the server with those modifications.
- */
-class Editor {
-  final ServerManager manager;
-  final File file;
-  int offset = 0;
-  String _content = null;
-
-  Editor(this.manager, this.file);
-
-  /// Return a future that returns the file content
-  Future<String> get content {
-    if (_content != null) {
-      return new Future.value(_content);
-    }
-    return file.readAsString().then((String content) {
-      _content = content;
-      return _content;
-    });
-  }
-
-  /**
-   * Request completion suggestions from the server.
-   * Return a future that completes with the completions sent.
-   */
-  Future<List<CompletionResults>> getSuggestions() {
-    Request request = new CompletionGetSuggestionsParams(
-        file.path,
-        offset).toRequest(manager._nextRequestId);
-    Stopwatch stopwatch = new Stopwatch()..start();
-    return manager.channel.sendRequest(request).then((Response response) {
-      String completionId =
-          new CompletionGetSuggestionsResult.fromResponse(response).id;
-      var completer = new Completer<List<CompletionResults>>();
-      List<CompletionResults> results = [];
-
-      // Listen for completion suggestions
-      StreamSubscription<Notification> subscription;
-      subscription =
-          manager.channel.notificationStream.listen((Notification notification) {
-        if (notification.event == 'completion.results') {
-          CompletionResultsParams params =
-              new CompletionResultsParams.fromNotification(notification);
-          if (params.id == completionId) {
-            results.add(new CompletionResults(stopwatch.elapsed, params));
-            if (params.isLast) {
-              stopwatch.stop();
-              subscription.cancel();
-              completer.complete(results);
-            }
-          }
-        }
-      });
-
-      return completer.future;
-    });
-  }
-
-  /**
-   * Move the virtual cursor after the given pattern in the source.
-   * Return a future that completes once the cursor has been moved.
-   */
-  Future<Editor> moveAfter(String pattern) {
-    return content.then((String content) {
-      offset = content.indexOf(pattern);
-      return this;
-    });
-  }
-
-  /**
-   * Replace the specified number of characters at the current cursor location
-   * with the given text, but do not save that content to disk.
-   * Return a future that completes once the server has been notified.
-   */
-  Future<Editor> replace(int replacementLength, String text) {
-    return content.then((String oldContent) {
-      StringBuffer sb = new StringBuffer();
-      sb.write(oldContent.substring(0, offset));
-      sb.write(text);
-      sb.write(oldContent.substring(offset));
-      _content = sb.toString();
-      SourceEdit sourceEdit = new SourceEdit(offset, replacementLength, text);
-      Request request = new AnalysisUpdateContentParams({
-        file.path: new ChangeContentOverlay([sourceEdit])
-      }).toRequest(manager._nextRequestId);
-      offset += text.length;
-      return manager.channel.sendRequest(request).then((Response response) {
-        return this;
-      });
-    });
-  }
-}
-
-/**
- * [ServerManager] is used to launch and manage an analysis server
- * running in a separate process.
- */
-class ServerManager {
-
-  /**
-   * The analysis server process being managed or `null` if not started.
-   */
-  Process process;
-
-  /**
-   * The root directory containing the Dart source files to be analyzed.
-   */
-  Directory appDir;
-
-  /**
-   * The channel used to communicate with the analysis server.
-   */
-  LoggingClientChannel _channel;
-
-  /**
-   * The identifier used in the most recent request to the server.
-   * See [_nextRequestId].
-   */
-  int _lastRequestId = 0;
-
-  /**
-   * `true` if a server exception was detected on stderr as opposed to an
-   * exception that the server reported via the server.error notification.
-   */
-  bool _unreportedServerException = false;
-
-  /**
-   * `true` if the [stop] method has been called.
-   */
-  bool _stopRequested = false;
-
-  /**
-   * Return the channel used to communicate with the analysis server.
-   */
-  ClientCommunicationChannel get channel => _channel;
-
-  /**
-   * Return `true` if a server error occurred.
-   */
-  bool get errorOccurred =>
-      _unreportedServerException || (_channel.serverErrorCount > 0);
-
-  String get _nextRequestId => (++_lastRequestId).toString();
-
-  /**
-   * Direct the server to analyze all sources in the given directory,
-   * all sub directories recursively, and any source referenced sources
-   * outside this directory hierarch such as referenced packages.
-   * Return a future that completes when the analysis is finished.
-   */
-  Future<AnalysisResults> analyze(Directory appDir) {
-    this.appDir = appDir;
-    Stopwatch stopwatch = new Stopwatch()..start();
-    Request request = new AnalysisSetAnalysisRootsParams(
-        [appDir.path],
-        []).toRequest(_nextRequestId);
-
-    // Request analysis
-    return channel.sendRequest(request).then((Response response) {
-      AnalysisResults results = new AnalysisResults();
-      StreamSubscription<Notification> subscription;
-      Completer<AnalysisResults> completer = new Completer<AnalysisResults>();
-      subscription =
-          channel.notificationStream.listen((Notification notification) {
-
-        // Gather analysis results
-        if (notification.event == 'analysis.errors') {
-          AnalysisErrorsParams params =
-              new AnalysisErrorsParams.fromNotification(notification);
-          params.errors.forEach((AnalysisError error) {
-            AnalysisErrorSeverity severity = error.severity;
-            if (severity == AnalysisErrorSeverity.ERROR) {
-              results.errorCount += 1;
-            } else if (severity == AnalysisErrorSeverity.WARNING) {
-              results.warningCount += 1;
-            } else if (severity == AnalysisErrorSeverity.INFO) {
-              results.hintCount += 1;
-            } else {
-              print('Unknown error severity: ${severity.name}');
-            }
-          });
-        }
-
-        // Stop gathering once analysis is complete
-        if (notification.event == 'server.status') {
-          ServerStatusParams status =
-              new ServerStatusParams.fromNotification(notification);
-          AnalysisStatus analysis = status.analysis;
-          if (analysis != null && !analysis.isAnalyzing) {
-            stopwatch.stop();
-            results.elapsed = stopwatch.elapsed;
-            subscription.cancel();
-            completer.complete(results);
-          }
-        }
-      });
-      return completer.future;
-    });
-  }
-
-  /**
-   * Send a request to the server for its version information
-   * and return a future that completes with the result.
-   */
-  Future<ServerGetVersionResult> getVersion() {
-    Request request = new ServerGetVersionParams().toRequest(_nextRequestId);
-    return channel.sendRequest(request).then((Response response) {
-      return new ServerGetVersionResult.fromResponse(response);
-    });
-  }
-
-  /**
-   * Notify the server that the given file will be edited.
-   * Return a virtual editor for inspecting and modifying the file's content.
-   */
-  Future<Editor> openFileNamed(String fileName) {
-    return _findFile(fileName, appDir).then((File file) {
-      if (file == null) {
-        throw 'Failed to find file named $fileName in ${appDir.path}';
-      }
-      file = file.absolute;
-      Request request =
-          new AnalysisSetPriorityFilesParams([file.path]).toRequest(_nextRequestId);
-      return channel.sendRequest(request).then((Response response) {
-        return new Editor(this, file);
-      });
-    });
-  }
-
-  /**
-   * Send a request for notifications.
-   * Return when the server has acknowledged that request.
-   */
-  Future setSubscriptions() {
-    Request request = new ServerSetSubscriptionsParams(
-        [ServerService.STATUS]).toRequest(_nextRequestId);
-    return channel.sendRequest(request);
-  }
-
-  /**
-   * Stop the analysis server.
-   * Return a future that completes when the server is terminated.
-   */
-  Future stop([_]) {
-    _stopRequested = true;
-    print("Requesting server shutdown");
-    Request request = new ServerShutdownParams().toRequest(_nextRequestId);
-    Duration waitTime = new Duration(seconds: 5);
-    return channel.sendRequest(request).timeout(waitTime, onTimeout: () {
-      print('Expected shutdown response');
-    }).then((Response response) {
-      return channel.close().then((_) => process.exitCode);
-    }).timeout(new Duration(seconds: 2), onTimeout: () {
-      print('Expected server to shutdown');
-      process.kill();
-    });
-  }
-
-  /**
-   * Locate the given file in the directory tree.
-   */
-  Future<File> _findFile(String fileName, Directory appDir) {
-    return appDir.list(recursive: true).firstWhere((FileSystemEntity entity) {
-      return entity is File && entity.path.endsWith(fileName);
-    });
-  }
-
-  /**
-   * Launch an analysis server and open a connection to that server.
-   */
-  Future<ServerManager> _launchServer(String pathToServer) {
-    List<String> serverArgs = [pathToServer];
-    return Process.start(Platform.executable, serverArgs).catchError((error) {
-      exitCode = 21;
-      throw 'Failed to launch analysis server: $error';
-    }).then((Process process) {
-      this.process = process;
-      _channel = new LoggingClientChannel(
-          new ByteStreamClientChannel(process.stdout, process.stdin));
-
-      // simple out of band exception handling
-      process.stderr.transform(
-          new Utf8Codec().decoder).transform(new LineSplitter()).listen((String line) {
-        if (!_unreportedServerException) {
-          _unreportedServerException = true;
-          stderr.writeln('>>> Unreported server exception');
-        }
-        stderr.writeln('server.stderr: $line');
-      });
-
-      // watch for unexpected process termination and catch the exit code
-      process.exitCode.then((int code) {
-        if (!_stopRequested) {
-          fail('Unexpected server termination: $code');
-        }
-        if (code != null && code != 0) {
-          exitCode = code;
-        }
-        print('Server stopped: $code');
-      });
-
-      return channel.notificationStream.first.then((Notification notification) {
-        print('Server connection established');
-        return setSubscriptions().then((_) {
-          return getVersion().then((ServerGetVersionResult result) {
-            print('Server version ${result.version}');
-            return this;
-          });
-        });
-      });
-    });
-  }
-
-  /**
-   * Launch analysis server in a separate process
-   * and return a future with a manager for that analysis server.
-   */
-  static Future<ServerManager> start(String serverPath) {
-    return new ServerManager()._launchServer(serverPath);
-  }
-}
diff --git a/pkg/analysis_server/bin/server.dart b/pkg/analysis_server/bin/server.dart
index 84b7702..f0d075f 100644
--- a/pkg/analysis_server/bin/server.dart
+++ b/pkg/analysis_server/bin/server.dart
@@ -2,12 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/driver.dart';
+import 'package:analysis_server/starter.dart';
 
 /**
- * Create and run an HTTP-based analysis server.
+ * Create and run an analysis server.
  */
 void main(List<String> args) {
-  Driver driver = new Driver();
-  driver.start(args);
+  ServerStarter starter = new ServerStarter();
+  starter.start(args);
 }
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index 3b36dd0..c3214a9 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -1441,6 +1441,13 @@
           matching the original as possible, but whitespace at the beginning or
           end of the selected region will be ignored.
         </p>
+        <p>
+          If a request is made for a file which does not exist, or
+          which is not currently subject to analysis (e.g. because it
+          is not associated with any analysis root specified to
+          analysis.setAnalysisRoots), an error of type
+          <tt>FORMAT_INVALID_FILE</tt> will be generated.
+        </p>
         
         
       <h4>Parameters</h4><dl><dt class="field"><b><i>file ( <a href="#type_FilePath">FilePath</a> )</i></b></dt><dd>
@@ -2000,7 +2007,6 @@
       
       
       
-      
     <dl><dt class="typeDefinition"><a name="type_AddContentOverlay">AddContentOverlay: object</a></dt><dd>
         <p>
           A directive to begin overlaying the contents of a file.  The
@@ -2080,7 +2086,7 @@
           An enumeration of the possible types of analysis errors.
         </p>
         
-      <dl><dt class="value">ANGULAR</dt><dt class="value">CHECKED_MODE_COMPILE_TIME_ERROR</dt><dt class="value">COMPILE_TIME_ERROR</dt><dt class="value">HINT</dt><dt class="value">POLYMER</dt><dt class="value">STATIC_TYPE_WARNING</dt><dt class="value">STATIC_WARNING</dt><dt class="value">SYNTACTIC_ERROR</dt><dt class="value">TODO</dt></dl></dd><dt class="typeDefinition"><a name="type_AnalysisOptions">AnalysisOptions: object</a></dt><dd>
+      <dl><dt class="value">CHECKED_MODE_COMPILE_TIME_ERROR</dt><dt class="value">COMPILE_TIME_ERROR</dt><dt class="value">HINT</dt><dt class="value">LINT</dt><dt class="value">STATIC_TYPE_WARNING</dt><dt class="value">STATIC_WARNING</dt><dt class="value">SYNTACTIC_ERROR</dt><dt class="value">TODO</dt></dl></dd><dt class="typeDefinition"><a name="type_AnalysisOptions">AnalysisOptions: object</a></dt><dd>
         <p>
           A set of options controlling what kind of analysis is to be
           performed. If the value of a field is omitted the value of the
@@ -2089,19 +2095,22 @@
         
       <dl><dt class="field"><b><i>enableAsync ( <span style="color:#999999">optional</span> bool )</i></b></dt><dd>
             
-            <p>
+            <p><b><i>Deprecated</i></b>/</p><p>
+            </p><p>
               True if the client wants to enable support for the
               proposed async feature.
             </p>
           </dd><dt class="field"><b><i>enableDeferredLoading ( <span style="color:#999999">optional</span> bool )</i></b></dt><dd>
             
-            <p>
+            <p><b><i>Deprecated</i></b>/</p><p>
+            </p><p>
               True if the client wants to enable support for the
               proposed deferred loading feature.
             </p>
           </dd><dt class="field"><b><i>enableEnums ( <span style="color:#999999">optional</span> bool )</i></b></dt><dd>
             
-            <p>
+            <p><b><i>Deprecated</i></b>/</p><p>
+            </p><p>
               True if the client wants to enable support for the
               proposed enum feature.
             </p>
@@ -2114,7 +2123,13 @@
           </dd><dt class="field"><b><i>generateHints ( <span style="color:#999999">optional</span> bool )</i></b></dt><dd>
             
             <p>
-              True is hints should be generated as part of generating
+              True if hints should be generated as part of generating
+              errors and warnings.
+            </p>
+          </dd><dt class="field"><b><i>generateLints ( <span style="color:#999999">optional</span> bool )</i></b></dt><dd>
+            
+            <p>
+              True if lints should be generated as part of generating
               errors and warnings.
             </p>
           </dd></dl></dd><dt class="typeDefinition"><a name="type_AnalysisService">AnalysisService: String</a></dt><dd>
@@ -2170,13 +2185,7 @@
           An identifier used to associate completion results with a
           completion request.
         </p>
-      </dd><dt class="typeDefinition"><a name="type_CompletionRelevance">CompletionRelevance: String</a></dt><dd>
-        <p>
-          An enumeration of the relevance of a completion
-          suggestion.
-        </p>
-        
-      <dl><dt class="value">LOW</dt><dt class="value">DEFAULT</dt><dt class="value">HIGH</dt></dl></dd><dt class="typeDefinition"><a name="type_CompletionSuggestion">CompletionSuggestion: object</a></dt><dd>
+      </dd><dt class="typeDefinition"><a name="type_CompletionSuggestion">CompletionSuggestion: object</a></dt><dd>
         <p>
           A suggestion for how to complete partially entered text. Many
           of the fields are optional, depending on the kind of element
@@ -2188,10 +2197,11 @@
             <p>
               The kind of element being suggested.
             </p>
-          </dd><dt class="field"><b><i>relevance ( <a href="#type_CompletionRelevance">CompletionRelevance</a> )</i></b></dt><dd>
+          </dd><dt class="field"><b><i>relevance ( int )</i></b></dt><dd>
             
             <p>
-              The relevance of this completion suggestion.
+              The relevance of this completion suggestion
+              where a higher number indicates a higher relevance.
             </p>
           </dd><dt class="field"><b><i>completion ( String )</i></b></dt><dd>
             
@@ -2254,8 +2264,9 @@
           </dd><dt class="field"><b><i>returnType ( <span style="color:#999999">optional</span> String )</i></b></dt><dd>
             
             <p>
-              The return type of the getter, function or method being
-              suggested. This field is omitted if the suggested element
+              The return type of the getter, function or method
+              or the type of the field being suggested.
+              This field is omitted if the suggested element
               is not a getter, function or method.
             </p>
           </dd><dt class="field"><b><i>parameterNames ( <span style="color:#999999">optional</span> List&lt;String&gt; )</i></b></dt><dd>
@@ -2963,6 +2974,12 @@
               not be satisfied because the content of the file changed before
               the requested results could be computed.
             </p>
+          </dd><dt class="value">FORMAT_INVALID_FILE</dt><dd>
+            
+            <p>
+              An "edit.format" request specified a FilePath
+              which does not match a Dart file in an analysis root.
+            </p>
           </dd><dt class="value">GET_ERRORS_INVALID_FILE</dt><dd>
             
             <p>
diff --git a/pkg/analysis_server/lib/plugin/plugin.dart b/pkg/analysis_server/lib/plugin/plugin.dart
new file mode 100644
index 0000000..9df0474
--- /dev/null
+++ b/pkg/analysis_server/lib/plugin/plugin.dart
@@ -0,0 +1,130 @@
+// 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.plugin.plugin;
+
+/**
+ * A function used to register the given [extension] to the extension point with
+ * the given unique [identifier].
+ *
+ * An [ExtensionError] will be thrown if the [extension] is not appropriate
+ * for the extension point, such as an [extension] that does not implement the
+ * required interface.
+ */
+typedef void RegisterExtension(String identifier, Object extension);
+
+/**
+ * A function used to register an extension point with the given simple
+ * [identifier]. If given, the [validator] will be used to validate extensions
+ * to the extension point.
+ *
+ * An [ExtensionError] will be thrown if the extension point cannot be
+ * registered, such as when a plugin attempts to define two extension points
+ * with the same simple identifier.
+ */
+typedef ExtensionPoint RegisterExtensionPoint(String identifier,
+    [ValidateExtension validateExtension]);
+
+/**
+ * A function used by a plugin to validate an [extension] to a extension point.
+ *
+ * An [ExtensionError] should be thrown if the [extension] is not valid for the
+ * extension point, such as an [extension] that does not implement the required
+ * interface.
+ */
+typedef void ValidateExtension(Object extension);
+
+/**
+ * An exception indicating that an error occurred while attempting to register
+ * either an extension or an extension point.
+ *
+ * Clients are not expected to subtype this class.
+ */
+class ExtensionError implements Exception {
+  /**
+   * The message describing the error that occurred.
+   */
+  final String message;
+
+  /**
+   * Initialize a newly created error to have the given message.
+   */
+  ExtensionError(this.message);
+}
+
+/**
+ * A representation of an extension point.
+ *
+ * Clients are not expected to subtype this class.
+ */
+abstract class ExtensionPoint {
+  /**
+   * Return an immutable list containing all of the extensions that were
+   * registered for this extension point.
+   */
+  List<Object> get extensions;
+
+  /**
+   * Return the plugin that defined this extension point.
+   */
+  Plugin get plugin;
+
+  /**
+   * Return the identifier used to uniquely identify this extension point within
+   * the defining plugin.
+   */
+  String get simpleIdentifier;
+
+  /**
+   * Return the identifier used to uniquely identify this extension point. The
+   * unique identifier is the identifier for the plugin, followed by a period
+   * (`.`), followed by the [simpleIdentifier] for the extension point.
+   */
+  String get uniqueIdentifier;
+}
+
+/**
+ * A contribution to the analysis server that can extend the behavior of the
+ * server while also allowing other plugins to extend it's behavior.
+ *
+ * Clients are expected to subtype this class when implementing plugins.
+ */
+abstract class Plugin {
+  /**
+   * Return the identifier used to uniquely identify this plugin.
+   */
+  String get uniqueIdentifier;
+
+  /**
+   * Use the [register] function to register all of the extension points
+   * contributed by this plugin.
+   *
+   * Clients should not invoke the [register] function after this method has
+   * returned.
+   */
+  void registerExtensionPoints(RegisterExtensionPoint register);
+
+  /**
+   * Use the [register] function to register all of the extensions contributed
+   * by this plugin.
+   *
+   * Clients should not invoke the [register] function after this method has
+   * returned.
+   */
+  void registerExtensions(RegisterExtension register);
+
+  /**
+   * Return a unique identifier created from the unique identifier from the
+   * [plugin] and the [simpleIdentifier].
+   */
+  static String buildUniqueIdentifier(Plugin plugin, String simpleIdentifier) =>
+      join(plugin.uniqueIdentifier, simpleIdentifier);
+
+  /**
+   * Return an identifier created by joining the [pluginIdentifier] and the
+   * [simpleIdentifier].
+   */
+  static String join(String pluginIdentifier, String simpleIdentifier) =>
+      '$pluginIdentifier.$simpleIdentifier';
+}
diff --git a/pkg/analysis_server/lib/src/analysis_logger.dart b/pkg/analysis_server/lib/src/analysis_logger.dart
index 32a9417..e87bc2a 100644
--- a/pkg/analysis_server/lib/src/analysis_logger.dart
+++ b/pkg/analysis_server/lib/src/analysis_logger.dart
@@ -18,6 +18,15 @@
    */
   final logging.Logger baseLogger = new logging.Logger('analysis.server');
 
+  AnalysisLogger() {
+    logging.Logger.root.onRecord.listen((logging.LogRecord record) {
+      AnalysisEngine.instance.instrumentationService.logLogEntry(
+          record.level.name,
+          record.time,
+          record.message);
+    });
+  }
+
   @override
   void logError(String message, [CaughtException exception]) {
     if (exception == null) {
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index b1941df..14d2480 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -154,6 +154,11 @@
       new HashMap<AnalysisContext, Completer<AnalysisDoneReason>>();
 
   /**
+   * The option possibly set from the server initialization which disables error notifications.
+   */
+  bool _noErrorNotification;
+
+  /**
    * The controller that is notified when analysis is started.
    */
   StreamController<AnalysisContext> _onAnalysisStartedController;
@@ -201,6 +206,7 @@
         analysisServerOptions.enableIncrementalResolutionApi;
     contextDirectoryManager.defaultOptions.incrementalValidation =
         analysisServerOptions.enableIncrementalResolutionValidation;
+    _noErrorNotification = analysisServerOptions.noErrorNotification;
     AnalysisEngine.instance.logger = new AnalysisLogger();
     _onAnalysisStartedController = new StreamController.broadcast();
     _onAnalysisCompleteController = new StreamController.broadcast();
@@ -512,7 +518,9 @@
         }
       }
       channel.sendResponse(new Response.unknownRequest(request));
-    }, onError: _sendServerErrorNotification);
+    }, onError: (exception, stackTrace) {
+      sendServerErrorNotification(exception, stackTrace, fatal: true);
+    });
   }
 
   /**
@@ -603,7 +611,7 @@
             'Unexpected exception during analysis',
             new CaughtException(exception, stackTrace));
       }
-      _sendServerErrorNotification(exception, stackTrace);
+      sendServerErrorNotification(exception, stackTrace, fatal: true);
       shutdown();
     } finally {
       if (!operationQueue.isEmpty) {
@@ -627,14 +635,6 @@
   }
 
   /**
-   * Report to the client that the given [exception] was caught with the
-   * associated [stackTrace].
-   */
-  void reportException(dynamic exception, StackTrace stackTrace) {
-    _sendServerErrorNotification(exception, stackTrace);
-  }
-
-  /**
    * Schedules execution of the given [ServerOperation].
    */
   void scheduleOperation(ServerOperation operation) {
@@ -680,6 +680,32 @@
   }
 
   /**
+   * Sends a `server.error` notification.
+   */
+  void sendServerErrorNotification(exception, stackTrace, {bool fatal: false}) {
+    // prepare exception.toString()
+    String exceptionString;
+    if (exception != null) {
+      exceptionString = exception.toString();
+    } else {
+      exceptionString = 'null exception';
+    }
+    // prepare stackTrace.toString()
+    String stackTraceString;
+    if (stackTrace != null) {
+      stackTraceString = stackTrace.toString();
+    } else {
+      stackTraceString = 'null stackTrace';
+    }
+    // send the notification
+    channel.sendNotification(
+        new ServerErrorParams(
+            fatal,
+            exceptionString,
+            stackTraceString).toNotification());
+  }
+
+  /**
    * Send status notification to the client. The `operation` is the operation
    * being performed or `null` if analysis is complete.
    */
@@ -819,8 +845,8 @@
    * absolute path.
    */
   bool shouldSendErrorsNotificationFor(String file) {
-    // TODO(scheglov) add support for the "--no-error-notification" flag.
-    return contextDirectoryManager.isInAnalysisRoot(file);
+    return !_noErrorNotification &&
+        contextDirectoryManager.isInAnalysisRoot(file);
   }
 
   void shutdown() {
@@ -915,38 +941,13 @@
     new Future(performOperation);
     performOperationPending = true;
   }
-
-  /**
-   * Sends a fatal `server.error` notification.
-   */
-  void _sendServerErrorNotification(exception, stackTrace) {
-    // prepare exception.toString()
-    String exceptionString;
-    if (exception != null) {
-      exceptionString = exception.toString();
-    } else {
-      exceptionString = 'null exception';
-    }
-    // prepare stackTrace.toString()
-    String stackTraceString;
-    if (stackTrace != null) {
-      stackTraceString = stackTrace.toString();
-    } else {
-      stackTraceString = 'null stackTrace';
-    }
-    // send the notification
-    channel.sendNotification(
-        new ServerErrorParams(
-            true,
-            exceptionString,
-            stackTraceString).toNotification());
-  }
 }
 
 
 class AnalysisServerOptions {
   bool enableIncrementalResolutionApi = false;
   bool enableIncrementalResolutionValidation = false;
+  bool noErrorNotification = false;
 }
 
 /**
diff --git a/pkg/analysis_server/lib/src/constants.dart b/pkg/analysis_server/lib/src/constants.dart
index d79f8f8..7aa71a7 100644
--- a/pkg/analysis_server/lib/src/constants.dart
+++ b/pkg/analysis_server/lib/src/constants.dart
@@ -90,8 +90,6 @@
 //
 // Analysis option names
 //
-const String ANALYZE_ANGULAR = 'analyzeAngular'; // boolean
-const String ANALYZE_POLYMER = 'analyzePolymer'; // boolean
 const String ENABLE_ASYNC = 'enableAsync'; // boolean
 const String ENABLE_DEFERRED_LOADING = 'enableDeferredLoading'; // boolean
 const String ENABLE_ENUMS = 'enableEnums'; // boolean
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index cee2708..829745a 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -175,16 +175,6 @@
     var params = new AnalysisUpdateOptionsParams.fromRequest(request);
     AnalysisOptions newOptions = params.options;
     List<OptionUpdater> updaters = new List<OptionUpdater>();
-    if (newOptions.enableDeferredLoading != null) {
-      updaters.add((engine.AnalysisOptionsImpl options) {
-        options.enableDeferredLoading = newOptions.enableDeferredLoading;
-      });
-    }
-    if (newOptions.enableEnums != null) {
-      updaters.add((engine.AnalysisOptionsImpl options) {
-        options.enableEnum = newOptions.enableEnums;
-      });
-    }
     if (newOptions.generateDart2jsHints != null) {
       updaters.add((engine.AnalysisOptionsImpl options) {
         options.dart2jsHint = newOptions.generateDart2jsHints;
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index a1ad8ef..70ce1d3 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -23,6 +23,7 @@
 import 'package:analyzer/src/generated/parser.dart' as engine;
 import 'package:analyzer/src/generated/scanner.dart' as engine;
 import 'package:analyzer/src/generated/source.dart';
+import 'package:dart_style/dart_style.dart';
 
 
 bool test_simulateRefactoringException_change = false;
@@ -56,20 +57,47 @@
   }
 
   Response format(Request request) {
-    throw new RequestFailure(
-        new Response.unsupportedFeature(
-            request.id,
-            'The edit.format request is not yet supported'));
 
-//    EditFormatParams params = new EditFormatParams.fromRequest(request);
-//    String file = params.file;
-//    int initialOffset = params.selectionOffset;
-//    int initialLength = params.selectionLength;
-//
-//    List<SourceEdit> edits = <SourceEdit>[];
-//    int finalOffset = initialOffset;
-//    int finalLength = initialLength;
-//    return new EditFormatResult(edits, finalOffset, finalLength).toResponse(request.id);
+    EditFormatParams params = new EditFormatParams.fromRequest(request);
+    String file = params.file;
+
+    engine.AnalysisContext context = server.getAnalysisContext(file);
+    if (context == null) {
+      return new Response.formatInvalidFile(request);
+    }
+
+    Source source = server.getSource(file);
+    engine.TimestampedData<String> contents;
+    try {
+      contents = context.getContents(source);
+    } catch (e) {
+      return new Response.formatInvalidFile(request);
+    }
+    String unformattedSource = contents.data;
+
+    SourceCode code = new SourceCode(
+        unformattedSource,
+        uri: null,
+        isCompilationUnit: true,
+        selectionStart: params.selectionOffset,
+        selectionLength: params.selectionLength);
+    DartFormatter formatter = new DartFormatter();
+    SourceCode formattedResult = formatter.formatSource(code);
+    String formattedSource = formattedResult.text;
+
+    List<SourceEdit> edits = <SourceEdit>[];
+
+    if (formattedSource != unformattedSource) {
+      //TODO: replace full replacements with smaller, more targeted edits
+      SourceEdit edit =
+          new SourceEdit(0, unformattedSource.length, formattedSource);
+      edits.add(edit);
+    }
+
+    return new EditFormatResult(
+        edits,
+        formattedResult.selectionStart,
+        formattedResult.selectionLength).toResponse(request.id);
   }
 
   Response getAssists(Request request) {
diff --git a/pkg/analysis_server/lib/src/generated_protocol.dart b/pkg/analysis_server/lib/src/generated_protocol.dart
index 2f60507..d83dd32 100644
--- a/pkg/analysis_server/lib/src/generated_protocol.dart
+++ b/pkg/analysis_server/lib/src/generated_protocol.dart
@@ -5331,11 +5331,10 @@
  * AnalysisErrorType
  *
  * enum {
- *   ANGULAR
  *   CHECKED_MODE_COMPILE_TIME_ERROR
  *   COMPILE_TIME_ERROR
  *   HINT
- *   POLYMER
+ *   LINT
  *   STATIC_TYPE_WARNING
  *   STATIC_WARNING
  *   SYNTACTIC_ERROR
@@ -5343,15 +5342,13 @@
  * }
  */
 class AnalysisErrorType implements Enum {
-  static const ANGULAR = const AnalysisErrorType._("ANGULAR");
-
   static const CHECKED_MODE_COMPILE_TIME_ERROR = const AnalysisErrorType._("CHECKED_MODE_COMPILE_TIME_ERROR");
 
   static const COMPILE_TIME_ERROR = const AnalysisErrorType._("COMPILE_TIME_ERROR");
 
   static const HINT = const AnalysisErrorType._("HINT");
 
-  static const POLYMER = const AnalysisErrorType._("POLYMER");
+  static const LINT = const AnalysisErrorType._("LINT");
 
   static const STATIC_TYPE_WARNING = const AnalysisErrorType._("STATIC_TYPE_WARNING");
 
@@ -5367,16 +5364,14 @@
 
   factory AnalysisErrorType(String name) {
     switch (name) {
-      case "ANGULAR":
-        return ANGULAR;
       case "CHECKED_MODE_COMPILE_TIME_ERROR":
         return CHECKED_MODE_COMPILE_TIME_ERROR;
       case "COMPILE_TIME_ERROR":
         return COMPILE_TIME_ERROR;
       case "HINT":
         return HINT;
-      case "POLYMER":
-        return POLYMER;
+      case "LINT":
+        return LINT;
       case "STATIC_TYPE_WARNING":
         return STATIC_TYPE_WARNING;
       case "STATIC_WARNING":
@@ -5415,21 +5410,28 @@
  *   "enableEnums": optional bool
  *   "generateDart2jsHints": optional bool
  *   "generateHints": optional bool
+ *   "generateLints": optional bool
  * }
  */
 class AnalysisOptions implements HasToJson {
   /**
+   * Deprecated/
+   *
    * True if the client wants to enable support for the proposed async feature.
    */
   bool enableAsync;
 
   /**
+   * Deprecated/
+   *
    * True if the client wants to enable support for the proposed deferred
    * loading feature.
    */
   bool enableDeferredLoading;
 
   /**
+   * Deprecated/
+   *
    * True if the client wants to enable support for the proposed enum feature.
    */
   bool enableEnums;
@@ -5441,12 +5443,18 @@
   bool generateDart2jsHints;
 
   /**
-   * True is hints should be generated as part of generating errors and
+   * True if hints should be generated as part of generating errors and
    * warnings.
    */
   bool generateHints;
 
-  AnalysisOptions({this.enableAsync, this.enableDeferredLoading, this.enableEnums, this.generateDart2jsHints, this.generateHints});
+  /**
+   * True if lints should be generated as part of generating errors and
+   * warnings.
+   */
+  bool generateLints;
+
+  AnalysisOptions({this.enableAsync, this.enableDeferredLoading, this.enableEnums, this.generateDart2jsHints, this.generateHints, this.generateLints});
 
   factory AnalysisOptions.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -5473,7 +5481,11 @@
       if (json.containsKey("generateHints")) {
         generateHints = jsonDecoder._decodeBool(jsonPath + ".generateHints", json["generateHints"]);
       }
-      return new AnalysisOptions(enableAsync: enableAsync, enableDeferredLoading: enableDeferredLoading, enableEnums: enableEnums, generateDart2jsHints: generateDart2jsHints, generateHints: generateHints);
+      bool generateLints;
+      if (json.containsKey("generateLints")) {
+        generateLints = jsonDecoder._decodeBool(jsonPath + ".generateLints", json["generateLints"]);
+      }
+      return new AnalysisOptions(enableAsync: enableAsync, enableDeferredLoading: enableDeferredLoading, enableEnums: enableEnums, generateDart2jsHints: generateDart2jsHints, generateHints: generateHints, generateLints: generateLints);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "AnalysisOptions");
     }
@@ -5496,6 +5508,9 @@
     if (generateHints != null) {
       result["generateHints"] = generateHints;
     }
+    if (generateLints != null) {
+      result["generateLints"] = generateLints;
+    }
     return result;
   }
 
@@ -5509,7 +5524,8 @@
           enableDeferredLoading == other.enableDeferredLoading &&
           enableEnums == other.enableEnums &&
           generateDart2jsHints == other.generateDart2jsHints &&
-          generateHints == other.generateHints;
+          generateHints == other.generateHints &&
+          generateLints == other.generateLints;
     }
     return false;
   }
@@ -5522,6 +5538,7 @@
     hash = _JenkinsSmiHash.combine(hash, enableEnums.hashCode);
     hash = _JenkinsSmiHash.combine(hash, generateDart2jsHints.hashCode);
     hash = _JenkinsSmiHash.combine(hash, generateHints.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, generateLints.hashCode);
     return _JenkinsSmiHash.finish(hash);
   }
 }
@@ -5732,60 +5749,11 @@
 }
 
 /**
- * CompletionRelevance
- *
- * enum {
- *   LOW
- *   DEFAULT
- *   HIGH
- * }
- */
-class CompletionRelevance implements Enum {
-  static const LOW = const CompletionRelevance._("LOW");
-
-  static const DEFAULT = const CompletionRelevance._("DEFAULT");
-
-  static const HIGH = const CompletionRelevance._("HIGH");
-
-  final String name;
-
-  const CompletionRelevance._(this.name);
-
-  factory CompletionRelevance(String name) {
-    switch (name) {
-      case "LOW":
-        return LOW;
-      case "DEFAULT":
-        return DEFAULT;
-      case "HIGH":
-        return HIGH;
-    }
-    throw new Exception('Illegal enum value: $name');
-  }
-
-  factory CompletionRelevance.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
-    if (json is String) {
-      try {
-        return new CompletionRelevance(json);
-      } catch(_) {
-        // Fall through
-      }
-    }
-    throw jsonDecoder.mismatch(jsonPath, "CompletionRelevance");
-  }
-
-  @override
-  String toString() => "CompletionRelevance.$name";
-
-  String toJson() => name;
-}
-
-/**
  * CompletionSuggestion
  *
  * {
  *   "kind": CompletionSuggestionKind
- *   "relevance": CompletionRelevance
+ *   "relevance": int
  *   "completion": String
  *   "selectionOffset": int
  *   "selectionLength": int
@@ -5811,9 +5779,10 @@
   CompletionSuggestionKind kind;
 
   /**
-   * The relevance of this completion suggestion.
+   * The relevance of this completion suggestion where a higher number
+   * indicates a higher relevance.
    */
-  CompletionRelevance relevance;
+  int relevance;
 
   /**
    * The identifier to be inserted if the suggestion is selected. If the
@@ -5870,9 +5839,9 @@
   Element element;
 
   /**
-   * The return type of the getter, function or method being suggested. This
-   * field is omitted if the suggested element is not a getter, function or
-   * method.
+   * The return type of the getter, function or method or the type of the field
+   * being suggested. This field is omitted if the suggested element is not a
+   * getter, function or method.
    */
   String returnType;
 
@@ -5927,9 +5896,9 @@
       } else {
         throw jsonDecoder.missingKey(jsonPath, "kind");
       }
-      CompletionRelevance relevance;
+      int relevance;
       if (json.containsKey("relevance")) {
-        relevance = new CompletionRelevance.fromJson(jsonDecoder, jsonPath + ".relevance", json["relevance"]);
+        relevance = jsonDecoder._decodeInt(jsonPath + ".relevance", json["relevance"]);
       } else {
         throw jsonDecoder.missingKey(jsonPath, "relevance");
       }
@@ -6016,7 +5985,7 @@
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
     result["kind"] = kind.toJson();
-    result["relevance"] = relevance.toJson();
+    result["relevance"] = relevance;
     result["completion"] = completion;
     result["selectionOffset"] = selectionOffset;
     result["selectionLength"] = selectionLength;
@@ -9033,6 +9002,7 @@
  *
  * enum {
  *   CONTENT_MODIFIED
+ *   FORMAT_INVALID_FILE
  *   GET_ERRORS_INVALID_FILE
  *   INVALID_OVERLAY_CHANGE
  *   INVALID_PARAMETER
@@ -9055,6 +9025,12 @@
   static const CONTENT_MODIFIED = const RequestErrorCode._("CONTENT_MODIFIED");
 
   /**
+   * An "edit.format" request specified a FilePath which does not match a Dart
+   * file in an analysis root.
+   */
+  static const FORMAT_INVALID_FILE = const RequestErrorCode._("FORMAT_INVALID_FILE");
+
+  /**
    * An "analysis.getErrors" request specified a FilePath which does not match
    * a file currently subject to analysis.
    */
@@ -9137,6 +9113,8 @@
     switch (name) {
       case "CONTENT_MODIFIED":
         return CONTENT_MODIFIED;
+      case "FORMAT_INVALID_FILE":
+        return FORMAT_INVALID_FILE;
       case "GET_ERRORS_INVALID_FILE":
         return GET_ERRORS_INVALID_FILE;
       case "INVALID_OVERLAY_CHANGE":
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index a642da2..facf368 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -22,55 +22,83 @@
 
 void sendAnalysisNotificationErrors(AnalysisServer server, String file,
     LineInfo lineInfo, List<AnalysisError> errors) {
-  var serverErrors = protocol.doAnalysisError_listFromEngine(lineInfo, errors);
-  var params = new protocol.AnalysisErrorsParams(file, serverErrors);
-  server.sendNotification(params.toNotification());
+  try {
+    if (errors == null) {
+      errors = <AnalysisError>[];
+    }
+    var serverErrors =
+        protocol.doAnalysisError_listFromEngine(lineInfo, errors);
+    var params = new protocol.AnalysisErrorsParams(file, serverErrors);
+    server.sendNotification(params.toNotification());
+  } catch (exception, stackTrace) {
+    server.sendServerErrorNotification(exception, stackTrace);
+  }
 }
 
 
 void sendAnalysisNotificationHighlights(AnalysisServer server, String file,
     CompilationUnit dartUnit) {
-  var regions = new DartUnitHighlightsComputer(dartUnit).compute();
-  var params = new protocol.AnalysisHighlightsParams(file, regions);
-  server.sendNotification(params.toNotification());
+  try {
+    var regions = new DartUnitHighlightsComputer(dartUnit).compute();
+    var params = new protocol.AnalysisHighlightsParams(file, regions);
+    server.sendNotification(params.toNotification());
+  } catch (exception, stackTrace) {
+    server.sendServerErrorNotification(exception, stackTrace);
+  }
 }
 
 
 void sendAnalysisNotificationNavigation(AnalysisServer server, String file,
     CompilationUnit dartUnit) {
-  var computer = new DartUnitNavigationComputer(dartUnit);
-  computer.compute();
-  var params = new protocol.AnalysisNavigationParams(
-      file,
-      computer.regions,
-      computer.targets,
-      computer.files);
-  server.sendNotification(params.toNotification());
+  try {
+    var computer = new DartUnitNavigationComputer(dartUnit);
+    computer.compute();
+    var params = new protocol.AnalysisNavigationParams(
+        file,
+        computer.regions,
+        computer.targets,
+        computer.files);
+    server.sendNotification(params.toNotification());
+  } catch (exception, stackTrace) {
+    server.sendServerErrorNotification(exception, stackTrace);
+  }
 }
 
 
 void sendAnalysisNotificationOccurrences(AnalysisServer server, String file,
     CompilationUnit dartUnit) {
-  var occurrences = new DartUnitOccurrencesComputer(dartUnit).compute();
-  var params = new protocol.AnalysisOccurrencesParams(file, occurrences);
-  server.sendNotification(params.toNotification());
+  try {
+    var occurrences = new DartUnitOccurrencesComputer(dartUnit).compute();
+    var params = new protocol.AnalysisOccurrencesParams(file, occurrences);
+    server.sendNotification(params.toNotification());
+  } catch (exception, stackTrace) {
+    server.sendServerErrorNotification(exception, stackTrace);
+  }
 }
 
 
 void sendAnalysisNotificationOutline(AnalysisServer server, Source source,
     LineInfo lineInfo, CompilationUnit dartUnit) {
-  var outline =
-      new DartUnitOutlineComputer(source, lineInfo, dartUnit).compute();
-  var params = new protocol.AnalysisOutlineParams(source.fullName, outline);
-  server.sendNotification(params.toNotification());
+  try {
+    var computer = new DartUnitOutlineComputer(source, lineInfo, dartUnit);
+    var outline = computer.compute();
+    var params = new protocol.AnalysisOutlineParams(source.fullName, outline);
+    server.sendNotification(params.toNotification());
+  } catch (exception, stackTrace) {
+    server.sendServerErrorNotification(exception, stackTrace);
+  }
 }
 
 
 void sendAnalysisNotificationOverrides(AnalysisServer server, String file,
     CompilationUnit dartUnit) {
-  var overrides = new DartUnitOverridesComputer(dartUnit).compute();
-  var params = new protocol.AnalysisOverridesParams(file, overrides);
-  server.sendNotification(params.toNotification());
+  try {
+    var overrides = new DartUnitOverridesComputer(dartUnit).compute();
+    var params = new protocol.AnalysisOverridesParams(file, overrides);
+    server.sendNotification(params.toNotification());
+  } catch (exception, stackTrace) {
+    server.sendServerErrorNotification(exception, stackTrace);
+  }
 }
 
 
@@ -113,7 +141,7 @@
     }
     // process results
     sendNotices(server, notices);
-    updateIndex(server.index, notices);
+    updateIndex(server, notices);
     // continue analysis
     server.addOperation(new PerformAnalysisOperation(context, true));
   }
@@ -167,24 +195,29 @@
     }
   }
 
-  void updateIndex(Index index, List<ChangeNotice> notices) {
+  void updateIndex(AnalysisServer server, List<ChangeNotice> notices) {
+    Index index = server.index;
     if (index == null) {
       return;
     }
     for (ChangeNotice notice in notices) {
       // Dart
-      {
+      try {
         CompilationUnit dartUnit = notice.compilationUnit;
         if (dartUnit != null) {
           index.indexUnit(context, dartUnit);
         }
+      } catch (exception, stackTrace) {
+        server.sendServerErrorNotification(exception, stackTrace);
       }
       // HTML
-      {
+      try {
         HtmlUnit htmlUnit = notice.htmlUnit;
         if (htmlUnit != null) {
           index.indexHtmlUnit(context, htmlUnit);
         }
+      } catch (exception, stackTrace) {
+        server.sendServerErrorNotification(exception, stackTrace);
       }
     }
   }
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_impl.dart b/pkg/analysis_server/lib/src/plugin/plugin_impl.dart
new file mode 100644
index 0000000..2245b6f
--- /dev/null
+++ b/pkg/analysis_server/lib/src/plugin/plugin_impl.dart
@@ -0,0 +1,125 @@
+// 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.plugin.plugin_impl;
+
+import 'dart:collection';
+
+import 'package:analysis_server/plugin/plugin.dart';
+
+/**
+ * An object that manages the extension points for a single instance of the
+ * analysis server.
+ */
+class ExtensionManager {
+  /**
+   * A table mapping the id's of extension points to the corresponding
+   * extension points.
+   */
+  Map<String, ExtensionPointImpl> extensionPoints =
+      new HashMap<String, ExtensionPointImpl>();
+
+  /**
+   * Process each of the given [plugins] by allowing them to register extension
+   * points and extensions.
+   *
+   * An [ExtensionError] will be thrown if any of the plugins throws such an
+   * exception while registering with this manager.
+   */
+  void processPlugins(List<Plugin> plugins) {
+    for (Plugin plugin in plugins) {
+      plugin.registerExtensionPoints(
+          (String identifier, [ValidateExtension validateExtension]) =>
+              registerExtensionPoint(plugin, identifier, validateExtension));
+    }
+    for (Plugin plugin in plugins) {
+      plugin.registerExtensions(registerExtension);
+    }
+  }
+
+  /**
+   * Register an [extension] to the extension point with the given unique
+   * [identifier].
+   */
+  void registerExtension(String identifier, Object extension) {
+    ExtensionPointImpl extensionPoint = extensionPoints[identifier];
+    if (extensionPoint == null) {
+      throw new ExtensionError(
+          'There is no extension point with the id "$identifier"');
+    }
+    extensionPoint.add(extension);
+  }
+
+  /**
+   * Register an extension point being defined by the given [plugin] with the
+   * given simple [identifier] and [validateExtension].
+   */
+  ExtensionPoint registerExtensionPoint(Plugin plugin, String identifier,
+      ValidateExtension validateExtension) {
+    String uniqueIdentifier = Plugin.buildUniqueIdentifier(plugin, identifier);
+    if (extensionPoints.containsKey(uniqueIdentifier)) {
+      throw new ExtensionError(
+          'There is already an extension point with the id "$identifier"');
+    }
+    ExtensionPointImpl extensionPoint =
+        new ExtensionPointImpl(plugin, identifier, validateExtension);
+    extensionPoints[uniqueIdentifier] = extensionPoint;
+    return extensionPoint;
+  }
+}
+
+/**
+ * A concrete representation of an extension point.
+ */
+class ExtensionPointImpl implements ExtensionPoint {
+  @override
+  final Plugin plugin;
+
+  @override
+  final String simpleIdentifier;
+
+  /**
+   * The function used to validate extensions to this extension point.
+   */
+  final ValidateExtension validateExtension;
+
+  /**
+   * The list of extensions to this extension point.
+   */
+  final List<Object> _extensions = <Object>[];
+
+  /**
+   * Initialize a newly create extension point to belong to the given [plugin]
+   * and have the given [simpleIdentifier]. If [validateExtension] is non-`null`
+   * it will be used to validate extensions associated with this extension
+   * point.
+   */
+  ExtensionPointImpl(this.plugin, this.simpleIdentifier,
+      this.validateExtension);
+
+  /**
+   * Return a list containing all of the extensions that have been registered
+   * for this extension point.
+   */
+  List<Object> get extensions => new UnmodifiableListView(_extensions);
+
+  /**
+   * Return the identifier used to uniquely identify this extension point. The
+   * unique identifier is the identifier for the plugin, followed by a period
+   * (`.`), followed by the [simpleIdentifier] for the extension point.
+   */
+  String get uniqueIdentifier =>
+      Plugin.buildUniqueIdentifier(plugin, simpleIdentifier);
+
+  /**
+   * Validate that the given [extension] is appropriate for this extension
+   * point, and if it is then add it to the list of registered exceptions.
+   */
+  void add(Object extension) {
+    if (validateExtension != null) {
+      validateExtension(extension);
+    }
+    _extensions.add(extension);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/plugin/server_plugin.dart b/pkg/analysis_server/lib/src/plugin/server_plugin.dart
new file mode 100644
index 0000000..9182321
--- /dev/null
+++ b/pkg/analysis_server/lib/src/plugin/server_plugin.dart
@@ -0,0 +1,107 @@
+// 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.plugin.server_plugin;
+
+import 'package:analysis_server/plugin/plugin.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/domain_analysis.dart';
+import 'package:analysis_server/src/domain_completion.dart';
+import 'package:analysis_server/src/domain_execution.dart';
+import 'package:analysis_server/src/domain_server.dart';
+import 'package:analysis_server/src/edit/edit_domain.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/search/search_domain.dart';
+
+/**
+ * A function that will create a request handler that can be used by the given
+ * [server].
+ *
+ * TODO(brianwilkerson) Move this into 'protocol.dart'.
+ */
+typedef RequestHandler RequestHandlerFactory(AnalysisServer server);
+
+/**
+ * A plugin that defines the extension points and extensions that are inherently
+ * defined by the analysis server.
+ */
+class ServerPlugin implements Plugin {
+  /**
+   * The simple identifier of the extension point that allows plugins to
+   * register new domains with the server.
+   */
+  static const String DOMAIN_EXTENSION_POINT = 'domain';
+
+  /**
+   * The unique identifier of this plugin.
+   */
+  static const String UNIQUE_IDENTIFIER = 'analysis_server.core';
+
+  /**
+   * The extension point that allows plugins to register new domains with the
+   * server.
+   */
+  ExtensionPoint domainExtensionPoint;
+
+  /**
+   * Initialize a newly created plugin.
+   */
+  ServerPlugin();
+
+  @override
+  String get uniqueIdentifier => UNIQUE_IDENTIFIER;
+
+  /**
+   * Use the given [server] to create all of the domains ([RequestHandler]'s)
+   * that have been registered and return the newly created domains.
+   */
+  List<RequestHandler> createDomains(AnalysisServer server) {
+    if (domainExtensionPoint == null) {
+      return <RequestHandler>[];
+    }
+    return domainExtensionPoint.extensions.map(
+        (RequestHandlerFactory factory) => factory(server)).toList();
+  }
+
+  @override
+  void registerExtensionPoints(RegisterExtensionPoint registerExtensionPoint) {
+    domainExtensionPoint =
+        registerExtensionPoint(DOMAIN_EXTENSION_POINT, _validateDomainExtension);
+  }
+
+  @override
+  void registerExtensions(RegisterExtension registerExtension) {
+    String domainId = Plugin.join(UNIQUE_IDENTIFIER, DOMAIN_EXTENSION_POINT);
+    registerExtension(
+        domainId,
+        (AnalysisServer server) => new ServerDomainHandler(server));
+    registerExtension(
+        domainId,
+        (AnalysisServer server) => new AnalysisDomainHandler(server));
+    registerExtension(
+        domainId,
+        (AnalysisServer server) => new EditDomainHandler(server));
+    registerExtension(
+        domainId,
+        (AnalysisServer server) => new SearchDomainHandler(server));
+    registerExtension(
+        domainId,
+        (AnalysisServer server) => new CompletionDomainHandler(server));
+    registerExtension(
+        domainId,
+        (AnalysisServer server) => new ExecutionDomainHandler(server));
+  }
+
+  /**
+   * Validate the given extension by throwing an [ExtensionError] if it is not a
+   * valid domain.
+   */
+  void _validateDomainExtension(Object extension) {
+    if (extension is! RequestHandlerFactory) {
+      String id = domainExtensionPoint.uniqueIdentifier;
+      throw new ExtensionError(
+          'Extensions to $id must be a RequestHandlerFactory');
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/protocol.dart b/pkg/analysis_server/lib/src/protocol.dart
index 8dc44de..95eb38c 100644
--- a/pkg/analysis_server/lib/src/protocol.dart
+++ b/pkg/analysis_server/lib/src/protocol.dart
@@ -718,6 +718,17 @@
 
   /**
    * 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/protocol_server.dart b/pkg/analysis_server/lib/src/protocol_server.dart
index 9f12f18..90e1512 100644
--- a/pkg/analysis_server/lib/src/protocol_server.dart
+++ b/pkg/analysis_server/lib/src/protocol_server.dart
@@ -330,39 +330,41 @@
 
 String _getParametersString(engine.Element element) {
   // TODO(scheglov) expose the corresponding feature from ExecutableElement
+  List<engine.ParameterElement> parameters;
   if (element is engine.ExecutableElement) {
     // valid getters don't have parameters
     if (element.kind == engine.ElementKind.GETTER &&
         element.parameters.isEmpty) {
       return null;
     }
-    // append parameters
-    StringBuffer sb = new StringBuffer();
-    String closeOptionalString = '';
-    for (engine.ParameterElement parameter in element.parameters) {
-      if (sb.isNotEmpty) {
-        sb.write(', ');
-      }
-      if (closeOptionalString.isEmpty) {
-        if (parameter.kind == engine.ParameterKind.NAMED) {
-          sb.write('{');
-          closeOptionalString = '}';
-        }
-        if (parameter.kind == engine.ParameterKind.POSITIONAL) {
-          sb.write('[');
-          closeOptionalString = ']';
-        }
-      }
-      sb.write(parameter.toString());
-    }
-    sb.write(closeOptionalString);
-    return '(' + sb.toString() + ')';
+    parameters = element.parameters;
+  } else if (element is engine.FunctionTypeAliasElement) {
+    parameters = element.parameters;
   } else {
     return null;
   }
+  StringBuffer sb = new StringBuffer();
+  String closeOptionalString = '';
+  for (engine.ParameterElement parameter in parameters) {
+    if (sb.isNotEmpty) {
+      sb.write(', ');
+    }
+    if (closeOptionalString.isEmpty) {
+      if (parameter.kind == engine.ParameterKind.NAMED) {
+        sb.write('{');
+        closeOptionalString = '}';
+      }
+      if (parameter.kind == engine.ParameterKind.POSITIONAL) {
+        sb.write('[');
+        closeOptionalString = ']';
+      }
+    }
+    sb.write(parameter.toString());
+  }
+  sb.write(closeOptionalString);
+  return '(' + sb.toString() + ')';
 }
 
-
 String _getReturnTypeString(engine.Element element) {
   if (element is engine.ExecutableElement) {
     if (element.kind == engine.ElementKind.SETTER) {
@@ -370,6 +372,11 @@
     } else {
       return element.returnType.toString();
     }
+  } else if (element is engine.VariableElement) {
+    engine.DartType type = element.type;
+    return type != null ? type.displayName : 'dynamic';
+  } else if (element is engine.FunctionTypeAliasElement) {
+    return element.returnType.toString();
   } else {
     return null;
   }
diff --git a/pkg/analysis_server/lib/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
similarity index 83%
rename from pkg/analysis_server/lib/driver.dart
rename to pkg/analysis_server/lib/src/server/driver.dart
index dbd550a..92c4ecc 100644
--- a/pkg/analysis_server/lib/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -7,10 +7,14 @@
 import 'dart:async';
 import 'dart:io';
 
-import 'package:analysis_server/http_server.dart';
+import 'package:analysis_server/plugin/plugin.dart';
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/plugin/plugin_impl.dart';
+import 'package:analysis_server/src/plugin/server_plugin.dart';
+import 'package:analysis_server/src/server/http_server.dart';
+import 'package:analysis_server/src/server/stdio_server.dart';
 import 'package:analysis_server/src/socket_server.dart';
-import 'package:analysis_server/stdio_server.dart';
+import 'package:analysis_server/starter.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/incremental_logger.dart';
@@ -51,7 +55,7 @@
  * server application.  It is responsible for parsing command line options
  * and starting the HTTP and/or stdio servers.
  */
-class Driver {
+class Driver implements ServerStarter {
   /**
    * The name of the application that is used to start a server.
    */
@@ -120,6 +124,11 @@
    */
   InstrumentationServer instrumentationServer;
 
+  /**
+   * The plugins that are defined outside the analysis_server package.
+   */
+  List<Plugin> _userDefinedPlugins = <Plugin>[];
+
   SocketServer socketServer;
 
   HttpAnalysisServer httpServer;
@@ -127,54 +136,20 @@
   StdioAnalysisServer stdioServer;
 
   Driver();
-  /**
-   * Use the given command-line arguments to start this server.
-   */
-  void start(List<String> args) {
-    ArgParser parser = new ArgParser();
-    parser.addOption(
-        CLIENT_ID,
-        help: "an identifier used to identify the client");
-    parser.addFlag(
-        ENABLE_INCREMENTAL_RESOLUTION_API,
-        help: "enable using incremental resolution for API changes",
-        defaultsTo: false,
-        negatable: false);
-    parser.addFlag(
-        ENABLE_INSTRUMENTATION_OPTION,
-        help: "enable sending instrumentation information to a server",
-        defaultsTo: false,
-        negatable: false);
-    parser.addFlag(
-        HELP_OPTION,
-        help: "print this help message without starting a server",
-        defaultsTo: false,
-        negatable: false);
-    parser.addOption(
-        INCREMENTAL_RESOLUTION_LOG,
-        help: "the description of the incremental resolution log");
-    parser.addFlag(
-        INCREMENTAL_RESOLUTION_VALIDATION,
-        help: "enable validation of incremental resolution results (slow)",
-        defaultsTo: false,
-        negatable: false);
-    parser.addFlag(
-        INTERNAL_PRINT_TO_CONSOLE,
-        help: "enable sending `print` output to the console",
-        defaultsTo: false,
-        negatable: false);
-    parser.addOption(
-        PORT_OPTION,
-        help: "[port] the port on which the server will listen");
-    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 (not yet implemented)",
-        defaultsTo: false,
-        negatable: false);
 
-    ArgResults results = parser.parse(args);
+  /**
+   * Set the [plugins] that are defined outside the analysis_server package.
+   */
+  void set userDefinedPlugins(List<Plugin> plugins) {
+    _userDefinedPlugins = plugins == null ? <Plugin>[] : plugins;
+  }
+
+  /**
+   * Use the given command-line [arguments] to start this server.
+   */
+  void start(List<String> arguments) {
+    ArgParser parser = _createArgParser();
+    ArgResults results = parser.parse(arguments);
     if (results[HELP_OPTION]) {
       _printUsage(parser);
       return;
@@ -218,6 +193,7 @@
         results[ENABLE_INCREMENTAL_RESOLUTION_API];
     analysisServerOptions.enableIncrementalResolutionValidation =
         results[INCREMENTAL_RESOLUTION_VALIDATION];
+    analysisServerOptions.noErrorNotification = results[NO_ERROR_NOTIFICATION];
 
     _initIncrementalLogger(results[INCREMENTAL_RESOLUTION_LOG]);
 
@@ -234,8 +210,18 @@
         new InstrumentationService(instrumentationServer);
 //    service.logVersion(results[CLIENT_ID], defaultSdk.sdkVersion);
     AnalysisEngine.instance.instrumentationService = service;
+    //
+    // Process all of the plugins so that extensions are registered.
+    //
+    ServerPlugin serverPlugin = new ServerPlugin();
+    List<Plugin> plugins = <Plugin>[];
+    plugins.add(serverPlugin);
+    plugins.addAll(_userDefinedPlugins);
+    ExtensionManager manager = new ExtensionManager();
+    manager.processPlugins(plugins);
 
-    socketServer = new SocketServer(analysisServerOptions, defaultSdk, service);
+    socketServer =
+        new SocketServer(analysisServerOptions, defaultSdk, service, serverPlugin);
     httpServer = new HttpAnalysisServer(socketServer);
     stdioServer = new StdioAnalysisServer(socketServer);
 
@@ -267,7 +253,8 @@
         (Zone self, ZoneDelegate parent, Zone zone, dynamic exception,
             StackTrace stackTrace) {
       service.logPriorityException(exception, stackTrace);
-      socketServer.analysisServer.reportException(exception, stackTrace);
+      AnalysisServer analysisServer = socketServer.analysisServer;
+      analysisServer.sendServerErrorNotification(exception, stackTrace);
       throw exception;
     };
     Function printFunction = print == null ?
@@ -284,6 +271,56 @@
   }
 
   /**
+   * Create and return the parser used to parse the command-line arguments.
+   */
+  ArgParser _createArgParser() {
+    ArgParser parser = new ArgParser();
+    parser.addOption(
+        CLIENT_ID,
+        help: "an identifier used to identify the client");
+    parser.addFlag(
+        ENABLE_INCREMENTAL_RESOLUTION_API,
+        help: "enable using incremental resolution for API changes",
+        defaultsTo: false,
+        negatable: false);
+    parser.addFlag(
+        ENABLE_INSTRUMENTATION_OPTION,
+        help: "enable sending instrumentation information to a server",
+        defaultsTo: false,
+        negatable: false);
+    parser.addFlag(
+        HELP_OPTION,
+        help: "print this help message without starting a server",
+        defaultsTo: false,
+        negatable: false);
+    parser.addOption(
+        INCREMENTAL_RESOLUTION_LOG,
+        help: "the description of the incremental resolution log");
+    parser.addFlag(
+        INCREMENTAL_RESOLUTION_VALIDATION,
+        help: "enable validation of incremental resolution results (slow)",
+        defaultsTo: false,
+        negatable: false);
+    parser.addFlag(
+        INTERNAL_PRINT_TO_CONSOLE,
+        help: "enable sending `print` output to the console",
+        defaultsTo: false,
+        negatable: false);
+    parser.addOption(
+        PORT_OPTION,
+        help: "[port] the port on which the server will listen");
+    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",
+        defaultsTo: false,
+        negatable: false);
+
+    return parser;
+  }
+
+  /**
    * Print information about how to use the server.
    */
   void _printUsage(ArgParser parser) {
diff --git a/pkg/analysis_server/lib/http_server.dart b/pkg/analysis_server/lib/src/server/http_server.dart
similarity index 100%
rename from pkg/analysis_server/lib/http_server.dart
rename to pkg/analysis_server/lib/src/server/http_server.dart
diff --git a/pkg/analysis_server/lib/stdio_server.dart b/pkg/analysis_server/lib/src/server/stdio_server.dart
similarity index 100%
rename from pkg/analysis_server/lib/stdio_server.dart
rename to pkg/analysis_server/lib/src/server/stdio_server.dart
diff --git a/pkg/analysis_server/lib/src/services/completion/arglist_computer.dart b/pkg/analysis_server/lib/src/services/completion/arglist_computer.dart
index 6bb14e1..53ef0ec 100644
--- a/pkg/analysis_server/lib/src/services/completion/arglist_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/arglist_computer.dart
@@ -136,7 +136,7 @@
   }
 
   @override
-  void declaredLabel(Label label) {
+  void declaredLabel(Label label, bool isCaseLabel) {
   }
 
   @override
@@ -185,7 +185,7 @@
     completion.write(')');
     CompletionSuggestion suggestion = new CompletionSuggestion(
         CompletionSuggestionKind.ARGUMENT_LIST,
-        CompletionRelevance.HIGH,
+        COMPLETION_RELEVANCE_HIGH,
         completion.toString(),
         completion.length,
         0,
diff --git a/pkg/analysis_server/lib/src/services/completion/dart_completion_cache.dart b/pkg/analysis_server/lib/src/services/completion/dart_completion_cache.dart
index a9872ec..5435730 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart_completion_cache.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart_completion_cache.dart
@@ -10,6 +10,7 @@
 import 'package:analysis_server/src/protocol_server.dart' hide Element,
     ElementKind;
 import 'package:analysis_server/src/services/completion/completion_manager.dart';
+import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analysis_server/src/services/completion/suggestion_builder.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/src/generated/ast.dart';
@@ -177,7 +178,7 @@
       if (elem is ClassElement) {
         importedClassMap[name] = elem;
       }
-      _addSuggestion(elem, CompletionRelevance.DEFAULT);
+      _addSuggestion(elem, COMPLETION_RELEVANCE_DEFAULT);
     });
   }
 
@@ -201,7 +202,7 @@
                 if (elem is ClassElement) {
                   importedClassMap[name] = elem;
                 }
-                _addSuggestion(elem, CompletionRelevance.DEFAULT);
+                _addSuggestion(elem, COMPLETION_RELEVANCE_DEFAULT);
               });
             } else {
               // Exclude elements from prefixed imports
@@ -229,7 +230,7 @@
     if (completion != null && completion.length > 0) {
       suggestion = new CompletionSuggestion(
           CompletionSuggestionKind.INVOCATION,
-          CompletionRelevance.DEFAULT,
+          COMPLETION_RELEVANCE_DEFAULT,
           completion,
           completion.length,
           0,
@@ -257,7 +258,7 @@
             element.isPublic &&
             !excludedLibs.contains(element.library) &&
             !_importedCompletions.contains(element.displayName)) {
-          _addSuggestion(element, CompletionRelevance.LOW);
+          _addSuggestion(element, COMPLETION_RELEVANCE_LOW);
         }
       }
     });
@@ -266,7 +267,7 @@
   /**
    * Add a suggestion for the given element.
    */
-  void _addSuggestion(Element element, CompletionRelevance relevance) {
+  void _addSuggestion(Element element, int relevance) {
 
     if (element is ExecutableElement) {
       if (element.isOperator) {
@@ -275,7 +276,7 @@
     }
 
     CompletionSuggestion suggestion =
-        createElementSuggestion(element, relevance: relevance);
+        createSuggestion(element, relevance: relevance);
 
     if (element is ExecutableElement) {
       DartType returnType = element.returnType;
@@ -333,7 +334,7 @@
 
   @override
   void visitClassElement(ClassElement element) {
-    cache._addSuggestion(element, CompletionRelevance.DEFAULT);
+    cache._addSuggestion(element, COMPLETION_RELEVANCE_DEFAULT);
   }
 
   @override
@@ -348,16 +349,16 @@
 
   @override
   void visitFunctionElement(FunctionElement element) {
-    cache._addSuggestion(element, CompletionRelevance.DEFAULT);
+    cache._addSuggestion(element, COMPLETION_RELEVANCE_DEFAULT);
   }
 
   @override
   void visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
-    cache._addSuggestion(element, CompletionRelevance.DEFAULT);
+    cache._addSuggestion(element, COMPLETION_RELEVANCE_DEFAULT);
   }
 
   @override
   void visitTopLevelVariableElement(TopLevelVariableElement element) {
-    cache._addSuggestion(element, CompletionRelevance.DEFAULT);
+    cache._addSuggestion(element, COMPLETION_RELEVANCE_DEFAULT);
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart
index 5b1acbe..65e3a46 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart
@@ -22,6 +22,13 @@
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 
+// TODO (danrubel) these are temporary constants as we transition completion
+// relevance from CompletionRelevance.LOW/DEFAULT/HIGH to int.
+// These should be removed in a subsequent CL
+const int COMPLETION_RELEVANCE_LOW = 500;
+const int COMPLETION_RELEVANCE_DEFAULT = 1000;
+const int COMPLETION_RELEVANCE_HIGH = 2000;
+
 /**
  * The base class for computing code completion suggestions.
  */
diff --git a/pkg/analysis_server/lib/src/services/completion/imported_computer.dart b/pkg/analysis_server/lib/src/services/completion/imported_computer.dart
index c32cf32..edbdd8e 100644
--- a/pkg/analysis_server/lib/src/services/completion/imported_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/imported_computer.dart
@@ -54,7 +54,8 @@
  * [_ImportedSuggestionBuilder] traverses the imports and builds suggestions
  * based upon imported elements.
  */
-class _ImportedSuggestionBuilder implements SuggestionBuilder {
+class _ImportedSuggestionBuilder extends ElementSuggestionBuilder implements
+    SuggestionBuilder {
   bool shouldWaitForLowPrioritySuggestions;
   final DartCompletionRequest request;
   final bool typesOnly;
@@ -66,6 +67,9 @@
     cache = request.cache;
   }
 
+  @override
+  CompletionSuggestionKind get kind => CompletionSuggestionKind.INVOCATION;
+
   /**
    * If the needed information is cached, then add suggestions and return `true`
    * else return `false` indicating that additional work is necessary.
@@ -114,9 +118,6 @@
           return;
         }
         if (elem is ExecutableElement) {
-          if (elem.isOperator) {
-            return;
-          }
           DartType returnType = elem.returnType;
           if (returnType != null && returnType.isVoid) {
             if (excludeVoidReturn) {
@@ -125,8 +126,7 @@
           }
         }
       }
-      request.suggestions.add(
-          createElementSuggestion(elem, relevance: CompletionRelevance.DEFAULT));
+      addSuggestion(elem);
     });
   }
 
@@ -149,12 +149,14 @@
         String name = inheritedTypes.removeLast();
         ClassElement elem = cache.importedClassMap[name];
         if (visited.add(name) && elem != null) {
+          _addElementSuggestions(elem.fields);
           _addElementSuggestions(elem.accessors);
           _addElementSuggestions(elem.methods);
           elem.allSupertypes.forEach((InterfaceType type) {
-            if (visited.add(type.name)) {
-              _addElementSuggestions(type.accessors);
-              _addElementSuggestions(type.methods);
+            if (visited.add(type.name) && type.element != null) {
+              _addElementSuggestions(type.element.fields);
+              _addElementSuggestions(type.element.accessors);
+              _addElementSuggestions(type.element.methods);
             }
           });
         }
@@ -183,7 +185,7 @@
             request.suggestions.add(suggestion);
           }
         } else {
-          if (suggestion.relevance != CompletionRelevance.LOW) {
+          if (suggestion.relevance != COMPLETION_RELEVANCE_LOW) {
             request.suggestions.add(suggestion);
           }
         }
diff --git a/pkg/analysis_server/lib/src/services/completion/keyword_computer.dart b/pkg/analysis_server/lib/src/services/completion/keyword_computer.dart
index 714c483..0d85a50 100644
--- a/pkg/analysis_server/lib/src/services/completion/keyword_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/keyword_computer.dart
@@ -87,12 +87,12 @@
     // Very simplistic suggestion because analyzer will warn if
     // the extends / with / implements keywords are out of order
     if (node.extendsClause == null) {
-      _addSuggestion(Keyword.EXTENDS, CompletionRelevance.HIGH);
+      _addSuggestion(Keyword.EXTENDS, COMPLETION_RELEVANCE_HIGH);
     } else if (node.withClause == null) {
-      _addSuggestion(Keyword.WITH, CompletionRelevance.HIGH);
+      _addSuggestion(Keyword.WITH, COMPLETION_RELEVANCE_HIGH);
     }
     if (node.implementsClause == null) {
-      _addSuggestion(Keyword.IMPLEMENTS, CompletionRelevance.HIGH);
+      _addSuggestion(Keyword.IMPLEMENTS, COMPLETION_RELEVANCE_HIGH);
     }
   }
 
@@ -120,18 +120,18 @@
     if (firstDirective is! LibraryDirective) {
       if (firstDirective != null) {
         if (request.offset <= firstDirective.offset) {
-          _addSuggestions([Keyword.LIBRARY], CompletionRelevance.HIGH);
+          _addSuggestions([Keyword.LIBRARY], COMPLETION_RELEVANCE_HIGH);
         }
       } else {
         if (request.offset <= startOfDeclarations) {
-          _addSuggestions([Keyword.LIBRARY], CompletionRelevance.HIGH);
+          _addSuggestions([Keyword.LIBRARY], COMPLETION_RELEVANCE_HIGH);
         }
       }
     }
     if (request.offset <= startOfDeclarations) {
       _addSuggestions(
           [Keyword.EXPORT, Keyword.IMPORT, Keyword.PART],
-          CompletionRelevance.HIGH);
+          COMPLETION_RELEVANCE_HIGH);
     }
     if (request.offset >= endOfDirectives) {
       _addSuggestions(
@@ -142,7 +142,7 @@
               Keyword.FINAL,
               Keyword.TYPEDEF,
               Keyword.VAR],
-          CompletionRelevance.HIGH);
+          COMPLETION_RELEVANCE_HIGH);
     }
   }
 
@@ -167,8 +167,8 @@
     }
   }
 
-  void _addSuggestion(Keyword keyword, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
+  void _addSuggestion(Keyword keyword, [int relevance =
+      COMPLETION_RELEVANCE_DEFAULT]) {
     String completion = keyword.syntax;
     request.suggestions.add(
         new CompletionSuggestion(
@@ -181,8 +181,8 @@
             false));
   }
 
-  void _addSuggestions(List<Keyword> keywords, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
+  void _addSuggestions(List<Keyword> keywords, [int relevance =
+      COMPLETION_RELEVANCE_DEFAULT]) {
     keywords.forEach((Keyword keyword) {
       _addSuggestion(keyword, relevance);
     });
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 2e1aa9e..fb4c505 100644
--- a/pkg/analysis_server/lib/src/services/completion/local_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/local_computer.dart
@@ -25,14 +25,24 @@
   bool computeFast(DartCompletionRequest request) {
     OpType optype = request.optype;
     if (optype.includeTopLevelSuggestions) {
-      _LocalVisitor localVisitor = new _LocalVisitor(request, request.offset);
-      localVisitor.typesOnly = optype.includeOnlyTypeNameSuggestions;
-      localVisitor.excludeVoidReturn = !optype.includeVoidReturnSuggestions;
+      _LocalVisitor localVisitor = new _LocalVisitor(
+          request,
+          request.offset,
+          optype.includeOnlyTypeNameSuggestions,
+          !optype.includeVoidReturnSuggestions);
 
       // Collect suggestions from the specific child [AstNode] that contains
       // the completion offset and all of its parents recursively.
       request.node.accept(localVisitor);
     }
+    if (optype.includeStatementLabelSuggestions ||
+        optype.includeCaseLabelSuggestions) {
+      _LabelVisitor labelVisitor = new _LabelVisitor(
+          request,
+          optype.includeStatementLabelSuggestions,
+          optype.includeCaseLabelSuggestions);
+      request.node.accept(labelVisitor);
+    }
 
     // If the unit is not a part and does not reference any parts
     // then work is complete
@@ -50,6 +60,131 @@
 }
 
 /**
+ * A visitor for collecting suggestions for break and continue labels.
+ */
+class _LabelVisitor extends LocalDeclarationVisitor {
+  final DartCompletionRequest request;
+
+  /**
+   * True if statement labels should be included as suggestions.
+   */
+  final bool includeStatementLabels;
+
+  /**
+   * True if case labels should be included as suggestions.
+   */
+  final bool includeCaseLabels;
+
+  _LabelVisitor(DartCompletionRequest request, this.includeStatementLabels,
+      this.includeCaseLabels)
+      : super(request.offset),
+        request = request;
+
+  @override
+  void declaredClass(ClassDeclaration declaration) {
+    // ignored
+  }
+
+  @override
+  void declaredClassTypeAlias(ClassTypeAlias declaration) {
+    // ignored
+  }
+
+  @override
+  void declaredField(FieldDeclaration fieldDecl, VariableDeclaration varDecl) {
+    // ignored
+  }
+
+  @override
+  void declaredFunction(FunctionDeclaration declaration) {
+    // ignored
+  }
+
+  @override
+  void declaredFunctionTypeAlias(FunctionTypeAlias declaration) {
+    // ignored
+  }
+
+  @override
+  void declaredLabel(Label label, bool isCaseLabel) {
+    if (isCaseLabel ? includeCaseLabels : includeStatementLabels) {
+      CompletionSuggestion suggestion = _addSuggestion(label.label);
+      if (suggestion != null) {
+        suggestion.element =
+            _createElement(protocol.ElementKind.LABEL, label.label);
+      }
+    }
+  }
+
+  @override
+  void declaredLocalVar(SimpleIdentifier name, TypeName type) {
+    // ignored
+  }
+
+  @override
+  void declaredMethod(MethodDeclaration declaration) {
+    // ignored
+  }
+
+  @override
+  void declaredParam(SimpleIdentifier name, TypeName type) {
+    // ignored
+  }
+
+  @override
+  void declaredTopLevelVar(VariableDeclarationList varList,
+      VariableDeclaration varDecl) {
+    // ignored
+  }
+
+  @override
+  bool visitFunctionExpression(FunctionExpression node) {
+    // Labels are only accessible within the local function, so stop visiting
+    // once we reach a function boundary.
+    finished = true;
+    return true;
+  }
+
+  @override
+  bool visitMethodDeclaration(MethodDeclaration node) {
+    // Labels are only accessible within the local function, so stop visiting
+    // once we reach a function boundary.
+    finished = true;
+    return true;
+  }
+
+  CompletionSuggestion _addSuggestion(SimpleIdentifier id) {
+    if (id != null) {
+      String completion = id.name;
+      if (completion != null && completion.length > 0 && completion != '_') {
+        CompletionSuggestion suggestion = new CompletionSuggestion(
+            CompletionSuggestionKind.IDENTIFIER,
+            COMPLETION_RELEVANCE_DEFAULT,
+            completion,
+            completion.length,
+            0,
+            false,
+            false);
+        request.suggestions.add(suggestion);
+        return suggestion;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Create a new protocol Element for inclusion in a completion suggestion.
+   */
+  protocol.Element _createElement(protocol.ElementKind kind,
+      SimpleIdentifier id) {
+    String name = id.name;
+    int flags =
+        protocol.Element.makeFlags(isPrivate: Identifier.isPrivateName(name));
+    return new protocol.Element(kind, name, flags);
+  }
+}
+
+/**
  * A visitor for collecting suggestions from the most specific child [AstNode]
  * that contains the completion offset to the [CompilationUnit].
  */
@@ -61,24 +196,24 @@
       null);
 
   final DartCompletionRequest request;
-  bool typesOnly = false;
-  bool excludeVoidReturn;
+  final bool typesOnly;
+  final bool excludeVoidReturn;
 
-  _LocalVisitor(this.request, int offset) : super(offset) {
-    excludeVoidReturn = _computeExcludeVoidReturn(request.node);
-  }
+  _LocalVisitor(this.request, int offset, this.typesOnly,
+      this.excludeVoidReturn)
+      : super(offset);
 
   @override
   void declaredClass(ClassDeclaration declaration) {
     bool isDeprecated = _isDeprecated(declaration);
     CompletionSuggestion suggestion =
-        _addSuggestion(declaration.name, null, null, isDeprecated);
+        _addSuggestion(declaration.name, NO_RETURN_TYPE, null, isDeprecated);
     if (suggestion != null) {
       suggestion.element = _createElement(
           protocol.ElementKind.CLASS,
           declaration.name,
           null,
-          _LocalVisitor.NO_RETURN_TYPE,
+          NO_RETURN_TYPE,
           declaration.isAbstract,
           isDeprecated);
     }
@@ -88,7 +223,7 @@
   void declaredClassTypeAlias(ClassTypeAlias declaration) {
     bool isDeprecated = _isDeprecated(declaration);
     CompletionSuggestion suggestion =
-        _addSuggestion(declaration.name, null, null, isDeprecated);
+        _addSuggestion(declaration.name, NO_RETURN_TYPE, null, isDeprecated);
     if (suggestion != null) {
       suggestion.element = _createElement(
           protocol.ElementKind.CLASS_TYPE_ALIAS,
@@ -106,17 +241,15 @@
       return;
     }
     bool isDeprecated = _isDeprecated(fieldDecl) || _isDeprecated(varDecl);
-    CompletionSuggestion suggestion = _addSuggestion(
-        varDecl.name,
-        fieldDecl.fields.type,
-        fieldDecl.parent,
-        isDeprecated);
+    TypeName type = fieldDecl.fields.type;
+    CompletionSuggestion suggestion =
+        _addSuggestion(varDecl.name, type, fieldDecl.parent, isDeprecated);
     if (suggestion != null) {
       suggestion.element = _createElement(
-          protocol.ElementKind.GETTER,
+          protocol.ElementKind.FIELD,
           varDecl.name,
           null,
-          fieldDecl.fields.type,
+          type,
           false,
           isDeprecated);
     }
@@ -127,27 +260,32 @@
     if (typesOnly) {
       return;
     }
-    if (excludeVoidReturn && _isVoid(declaration.returnType)) {
-      return;
-    }
+    TypeName returnType = declaration.returnType;
     bool isDeprecated = _isDeprecated(declaration);
+    protocol.ElementKind kind;
+    if (declaration.isGetter) {
+      kind = protocol.ElementKind.GETTER;
+    } else if (declaration.isSetter) {
+      if (excludeVoidReturn) {
+        return;
+      }
+      kind = protocol.ElementKind.SETTER;
+      returnType = NO_RETURN_TYPE;
+    } else {
+      if (excludeVoidReturn && _isVoid(returnType)) {
+        return;
+      }
+      kind = protocol.ElementKind.FUNCTION;
+    }
     CompletionSuggestion suggestion =
-        _addSuggestion(declaration.name, declaration.returnType, null, isDeprecated);
+        _addSuggestion(declaration.name, returnType, null, isDeprecated);
     if (suggestion != null) {
       FormalParameterList param = declaration.functionExpression.parameters;
-      protocol.ElementKind kind;
-      if (declaration.isGetter) {
-        kind = protocol.ElementKind.GETTER;
-      } else if (declaration.isSetter) {
-        kind = protocol.ElementKind.SETTER;
-      } else {
-        kind = protocol.ElementKind.FUNCTION;
-      }
       suggestion.element = _createElement(
           kind,
           declaration.name,
           param != null ? param.toSource() : null,
-          declaration.returnType,
+          returnType,
           false,
           isDeprecated);
     }
@@ -156,22 +294,23 @@
   @override
   void declaredFunctionTypeAlias(FunctionTypeAlias declaration) {
     bool isDeprecated = _isDeprecated(declaration);
+    TypeName returnType = declaration.returnType;
     CompletionSuggestion suggestion =
-        _addSuggestion(declaration.name, declaration.returnType, null, isDeprecated);
+        _addSuggestion(declaration.name, returnType, null, isDeprecated);
     if (suggestion != null) {
       // TODO (danrubel) determine parameters and return type
       suggestion.element = _createElement(
           protocol.ElementKind.FUNCTION_TYPE_ALIAS,
           declaration.name,
           null,
-          NO_RETURN_TYPE,
+          returnType,
           true,
           isDeprecated);
     }
   }
 
   @override
-  void declaredLabel(Label label) {
+  void declaredLabel(Label label, bool isCaseLabel) {
     // ignored
   }
 
@@ -208,7 +347,7 @@
         return;
       }
       kind = protocol.ElementKind.SETTER;
-      returnType = null;
+      returnType = NO_RETURN_TYPE;
     } else {
       if (excludeVoidReturn && _isVoid(returnType)) {
         return;
@@ -217,11 +356,8 @@
       parameters = declaration.parameters.toSource();
     }
     bool isDeprecated = _isDeprecated(declaration);
-    CompletionSuggestion suggestion = _addSuggestion(
-        declaration.name,
-        returnType,
-        declaration.parent,
-        isDeprecated);
+    CompletionSuggestion suggestion =
+        _addSuggestion(declaration.name, returnType, declaration.parent, isDeprecated);
     if (suggestion != null) {
       suggestion.element = _createElement(
           kind,
@@ -265,19 +401,20 @@
     }
   }
 
-  CompletionSuggestion _addSuggestion(SimpleIdentifier id, TypeName typeName,
+  CompletionSuggestion _addSuggestion(SimpleIdentifier id, TypeName returnType,
       ClassDeclaration classDecl, bool isDeprecated) {
     if (id != null) {
       String completion = id.name;
       if (completion != null && completion.length > 0 && completion != '_') {
         CompletionSuggestion suggestion = new CompletionSuggestion(
             CompletionSuggestionKind.INVOCATION,
-            isDeprecated ? CompletionRelevance.LOW : CompletionRelevance.DEFAULT,
+            isDeprecated ? COMPLETION_RELEVANCE_LOW : COMPLETION_RELEVANCE_DEFAULT,
             completion,
             completion.length,
             0,
             false,
-            false);
+            false,
+            returnType: _nameForType(returnType));
         if (classDecl != null) {
           SimpleIdentifier identifier = classDecl.name;
           if (identifier != null) {
@@ -287,15 +424,6 @@
             }
           }
         }
-        if (typeName != null) {
-          Identifier identifier = typeName.name;
-          if (identifier != null) {
-            String name = identifier.name;
-            if (name != null && name.length > 0) {
-              suggestion.returnType = name;
-            }
-          }
-        }
         request.suggestions.add(suggestion);
         return suggestion;
       }
@@ -303,16 +431,6 @@
     return null;
   }
 
-  bool _computeExcludeVoidReturn(AstNode node) {
-    if (node is Block) {
-      return false;
-    } else if (node is SimpleIdentifier) {
-      return node.parent is ExpressionStatement ? false : true;
-    } else {
-      return true;
-    }
-  }
-
 
   /**
    * Create a new protocol Element for inclusion in a completion suggestion.
diff --git a/pkg/analysis_server/lib/src/services/completion/local_declaration_visitor.dart b/pkg/analysis_server/lib/src/services/completion/local_declaration_visitor.dart
index ccdd8ba..e7860ab 100644
--- a/pkg/analysis_server/lib/src/services/completion/local_declaration_visitor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/local_declaration_visitor.dart
@@ -34,7 +34,7 @@
 
   void declaredFunctionTypeAlias(FunctionTypeAlias declaration);
 
-  void declaredLabel(Label label);
+  void declaredLabel(Label label, bool isCaseLabel);
 
   void declaredLocalVar(SimpleIdentifier name, TypeName type);
 
@@ -49,11 +49,7 @@
   bool visitBlock(Block node) {
     node.statements.forEach((Statement stmt) {
       if (stmt.offset < offset) {
-        if (stmt is LabeledStatement) {
-          stmt.labels.forEach((Label label) {
-            declaredLabel(label);
-          });
-        } else if (stmt is VariableDeclarationStatement) {
+        if (stmt is VariableDeclarationStatement) {
           VariableDeclarationList varList = stmt.variables;
           if (varList != null) {
             varList.variables.forEach((VariableDeclaration varDecl) {
@@ -185,6 +181,24 @@
   }
 
   @override
+  bool visitSwitchStatement(SwitchStatement node) {
+    for (SwitchMember member in node.members) {
+      for (Label label in member.labels) {
+        declaredLabel(label, true);
+      }
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitLabeledStatement(LabeledStatement node) {
+    for (Label label in node.labels) {
+      declaredLabel(label, false);
+    }
+    return visitNode(node);
+  }
+
+  @override
   bool visitMethodDeclaration(MethodDeclaration node) {
     _visitParamList(node.parameters);
     return visitNode(node);
diff --git a/pkg/analysis_server/lib/src/services/completion/optype.dart b/pkg/analysis_server/lib/src/services/completion/optype.dart
index 21678a3..ef2902b 100644
--- a/pkg/analysis_server/lib/src/services/completion/optype.dart
+++ b/pkg/analysis_server/lib/src/services/completion/optype.dart
@@ -37,6 +37,16 @@
   bool includeReturnValueSuggestions = false;
 
   /**
+   * Indicates whether statement labels should be suggested.
+   */
+  bool includeStatementLabelSuggestions = false;
+
+  /**
+   * Indicates whether case labels should be suggested.
+   */
+  bool includeCaseLabelSuggestions = false;
+
+  /**
    * Determine the suggestions that should be made based upon the given
    * [CompletionTarget] and [offset].
    */
@@ -146,6 +156,13 @@
   }
 
   @override
+  void visitBreakStatement(BreakStatement node) {
+    if (node.label == null || identical(entity, node.label)) {
+      optype.includeStatementLabelSuggestions = true;
+    }
+  }
+
+  @override
   void visitCascadeExpression(CascadeExpression node) {
     if (node.cascadeSections.contains(entity)) {
       optype.includeInvocationSuggestions = true;
@@ -191,6 +208,14 @@
   }
 
   @override
+  void visitContinueStatement(ContinueStatement node) {
+    if (node.label == null || identical(entity, node.label)) {
+      optype.includeStatementLabelSuggestions = true;
+      optype.includeCaseLabelSuggestions = true;
+    }
+  }
+
+  @override
   void visitDoStatement(DoStatement node) {
     if (identical(entity, node.condition)) {
       optype.includeReturnValueSuggestions = true;
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 584855a..8be79634 100644
--- a/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
@@ -14,37 +14,74 @@
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 
+const String DYNAMIC = 'dynamic';
+
 /**
- * Create a suggestion based upon the given imported element.
+ * Return a suggestion based upon the given element
+ * or `null` if a suggestion is not appropriate for the given element.
  */
-CompletionSuggestion createElementSuggestion(Element element,
-    {CompletionRelevance relevance: CompletionRelevance.DEFAULT}) {
+CompletionSuggestion createSuggestion(Element element,
+    {CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
+    int relevance: COMPLETION_RELEVANCE_DEFAULT}) {
+
+  String nameForType(DartType type) {
+    if (type == null) {
+      return DYNAMIC;
+    }
+    String name = type.displayName;
+    if (name == null || name.length <= 0) {
+      return DYNAMIC;
+    }
+    //TODO (danrubel) include type arguments ??
+    return name;
+  }
+
+  String returnType = null;
+  if (element is ExecutableElement) {
+    if (element.isOperator) {
+      // Do not include operators in suggestions
+      return null;
+    }
+    if (element is PropertyAccessorElement && element.isSetter) {
+      // no return type
+    } else {
+      returnType = nameForType(element.returnType);
+    }
+  } else if (element is VariableElement) {
+    returnType = nameForType(element.type);
+  } else if (element is FunctionTypeAliasElement) {
+    returnType = nameForType(element.returnType);
+  }
+
   String completion = element.displayName;
+  bool isDeprecated = element.isDeprecated;
   CompletionSuggestion suggestion = new CompletionSuggestion(
-      CompletionSuggestionKind.INVOCATION,
-      element.isDeprecated ? CompletionRelevance.LOW : relevance,
+      kind,
+      isDeprecated ? COMPLETION_RELEVANCE_LOW : relevance,
       completion,
       completion.length,
       0,
-      element.isDeprecated,
+      isDeprecated,
       false);
-
-  suggestion.element = newElement_fromEngine(element);
-
-  DartType type;
-  if (element is FunctionElement) {
-    type = element.returnType;
-  } else if (element is PropertyAccessorElement && element.isGetter) {
-    type = element.returnType;
-  } else if (element is TopLevelVariableElement) {
-    type = element.type;
-  }
-  if (type != null) {
-    String name = type.displayName;
-    if (name != null && name.length > 0 && name != 'dynamic') {
-      suggestion.returnType = name;
+  suggestion.element = protocol.newElement_fromEngine(element);
+  if (element is ClassMemberElement) {
+    ClassElement enclosingElement = element.enclosingElement;
+    if (enclosingElement != null) {
+      suggestion.declaringType = enclosingElement.displayName;
     }
   }
+  suggestion.returnType = returnType;
+  if (element is ExecutableElement && element is! PropertyAccessorElement) {
+    suggestion.parameterNames = element.parameters.map(
+        (ParameterElement parameter) => parameter.name).toList();
+    suggestion.parameterTypes = element.parameters.map(
+        (ParameterElement parameter) => parameter.type.displayName).toList();
+    suggestion.requiredParameterCount = element.parameters.where(
+        (ParameterElement parameter) =>
+            parameter.parameterKind == ParameterKind.REQUIRED).length;
+    suggestion.hasNamedParameters = element.parameters.any(
+        (ParameterElement parameter) => parameter.parameterKind == ParameterKind.NAMED);
+  }
   return suggestion;
 }
 
@@ -132,12 +169,16 @@
  * the visible members in that class. Clients should call
  * [ClassElementSuggestionBuilder.suggestionsFor].
  */
-class ClassElementSuggestionBuilder extends _AbstractSuggestionBuilder {
+class ClassElementSuggestionBuilder extends GeneralizingElementVisitor with
+    ElementSuggestionBuilder {
   final bool staticOnly;
+  final DartCompletionRequest request;
 
-  ClassElementSuggestionBuilder(DartCompletionRequest request, bool staticOnly)
-      : super(request, CompletionSuggestionKind.INVOCATION),
-        this.staticOnly = staticOnly;
+  ClassElementSuggestionBuilder(this.request, bool staticOnly)
+      : this.staticOnly = staticOnly;
+
+  @override
+  CompletionSuggestionKind get kind => CompletionSuggestionKind.INVOCATION;
 
   @override
   visitClassElement(ClassElement element) {
@@ -157,7 +198,7 @@
     if (staticOnly && !element.isStatic) {
       return;
     }
-    _addElementSuggestion(element, element.type, element.enclosingElement);
+    addSuggestion(element);
   }
 
   @override
@@ -168,10 +209,7 @@
     if (element.isOperator) {
       return;
     }
-    _addElementSuggestion(
-        element,
-        element.returnType,
-        element.enclosingElement);
+    addSuggestion(element);
   }
 
   @override
@@ -179,17 +217,7 @@
     if (staticOnly && !element.isStatic) {
       return;
     }
-    if (element.isGetter) {
-      _addElementSuggestion(
-          element,
-          element.returnType,
-          element.enclosingElement);
-    } else if (element.isSetter) {
-      _addElementSuggestion(
-          element,
-          element.returnType,
-          element.enclosingElement);
-    }
+    addSuggestion(element);
   }
 
   /**
@@ -208,19 +236,69 @@
 }
 
 /**
+ * Common mixin for sharing behavior
+ */
+abstract class ElementSuggestionBuilder {
+
+  /**
+   * Internal collection of completions to prevent duplicate completions.
+   */
+  final Set<String> _completions = new Set<String>();
+
+  /**
+   * Return the kind of suggestions that should be built.
+   */
+  CompletionSuggestionKind get kind;
+
+  /**
+   * Return the request on which the builder is operating.
+   */
+  DartCompletionRequest get request;
+
+  /**
+   * Add a suggestion based upon the given element.
+   */
+  void addSuggestion(Element element) {
+    if (element.isPrivate) {
+      LibraryElement elementLibrary = element.library;
+      LibraryElement unitLibrary = request.unit.element.library;
+      if (elementLibrary != unitLibrary) {
+        return;
+      }
+    }
+    if (element.isSynthetic) {
+      if (element is PropertyAccessorElement || element is FieldElement) {
+        return;
+      }
+    }
+    String completion = element.displayName;
+    if (completion == null ||
+        completion.length <= 0 ||
+        !_completions.add(completion)) {
+      return;
+    }
+    CompletionSuggestion suggestion = createSuggestion(element, kind: kind);
+    if (suggestion != null) {
+      request.suggestions.add(suggestion);
+    }
+  }
+}
+
+/**
  * This class visits elements in a library and provides suggestions based upon
  * the visible members in that library. Clients should call
  * [LibraryElementSuggestionBuilder.suggestionsFor].
  */
-class LibraryElementSuggestionBuilder extends _AbstractSuggestionBuilder {
+class LibraryElementSuggestionBuilder extends GeneralizingElementVisitor with
+    ElementSuggestionBuilder {
+  final DartCompletionRequest request;
+  final CompletionSuggestionKind kind;
 
-  LibraryElementSuggestionBuilder(DartCompletionRequest request,
-      CompletionSuggestionKind kind)
-      : super(request, kind);
+  LibraryElementSuggestionBuilder(this.request, this.kind);
 
   @override
   visitClassElement(ClassElement element) {
-    _addElementSuggestion(element, null, null);
+    addSuggestion(element);
   }
 
   @override
@@ -235,17 +313,17 @@
 
   @override
   visitFunctionElement(FunctionElement element) {
-    _addElementSuggestion(element, element.returnType, null);
+    addSuggestion(element);
   }
 
   @override
   visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
-    _addElementSuggestion(element, element.returnType, null);
+    addSuggestion(element);
   }
 
   @override
   visitTopLevelVariableElement(TopLevelVariableElement element) {
-    _addElementSuggestion(element, element.type, null);
+    addSuggestion(element);
   }
 
   /**
@@ -263,11 +341,14 @@
  * This class visits elements in a class and provides suggestions based upon
  * the visible named constructors in that class.
  */
-class NamedConstructorSuggestionBuilder extends _AbstractSuggestionBuilder
-    implements SuggestionBuilder {
+class NamedConstructorSuggestionBuilder extends GeneralizingElementVisitor with
+    ElementSuggestionBuilder implements SuggestionBuilder {
+  final DartCompletionRequest request;
 
-  NamedConstructorSuggestionBuilder(DartCompletionRequest request)
-      : super(request, CompletionSuggestionKind.INVOCATION);
+  NamedConstructorSuggestionBuilder(this.request);
+
+  @override
+  CompletionSuggestionKind get kind => CompletionSuggestionKind.INVOCATION;
 
   @override
   bool computeFast(AstNode node) {
@@ -301,10 +382,7 @@
 
   @override
   visitConstructorElement(ConstructorElement element) {
-    _addElementSuggestion(
-        element,
-        element.returnType,
-        element.enclosingElement);
+    addSuggestion(element);
   }
 
   @override
@@ -329,72 +407,3 @@
    */
   Future<bool> computeFull(AstNode node);
 }
-
-/**
- * Common superclass for sharing behavior
- */
-class _AbstractSuggestionBuilder extends GeneralizingElementVisitor {
-  final DartCompletionRequest request;
-  final CompletionSuggestionKind kind;
-  final Set<String> _completions = new Set<String>();
-
-  _AbstractSuggestionBuilder(this.request, this.kind);
-
-  void _addElementSuggestion(Element element, DartType type,
-      ClassElement enclosingElement) {
-    if (element.isSynthetic) {
-      return;
-    }
-    if (element.isPrivate) {
-      LibraryElement elementLibrary = element.library;
-      LibraryElement unitLibrary = request.unit.element.library;
-      if (elementLibrary != unitLibrary) {
-        return;
-      }
-    }
-    String completion = element.displayName;
-    if (completion == null ||
-        completion.length <= 0 ||
-        !_completions.add(completion)) {
-      return;
-    }
-    bool isDeprecated = element.isDeprecated;
-    CompletionSuggestion suggestion = new CompletionSuggestion(
-        kind,
-        isDeprecated ? CompletionRelevance.LOW : CompletionRelevance.DEFAULT,
-        completion,
-        completion.length,
-        0,
-        isDeprecated,
-        false);
-    suggestion.element = protocol.newElement_fromEngine(element);
-    if (suggestion.element != null) {
-      if (element is FieldElement) {
-        suggestion.element.kind = protocol.ElementKind.GETTER;
-        suggestion.element.returnType =
-            element.type != null ? element.type.displayName : 'dynamic';
-      }
-    }
-    if (enclosingElement != null) {
-      suggestion.declaringType = enclosingElement.displayName;
-    }
-    if (type != null) {
-      String typeName = type.displayName;
-      if (typeName != null && typeName.length > 0 && typeName != 'dynamic') {
-        suggestion.returnType = typeName;
-      }
-    }
-    if (element is ExecutableElement && element is! PropertyAccessorElement) {
-      suggestion.parameterNames = element.parameters.map(
-          (ParameterElement parameter) => parameter.name).toList();
-      suggestion.parameterTypes = element.parameters.map(
-          (ParameterElement parameter) => parameter.type.displayName).toList();
-      suggestion.requiredParameterCount = element.parameters.where(
-          (ParameterElement parameter) =>
-              parameter.parameterKind == ParameterKind.REQUIRED).length;
-      suggestion.hasNamedParameters = element.parameters.any(
-          (ParameterElement parameter) => parameter.parameterKind == ParameterKind.NAMED);
-    }
-    request.suggestions.add(suggestion);
-  }
-}
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index e2b7466..71f55ba 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -343,7 +343,7 @@
     }
     // prepare source
     SourceBuilder builder = new SourceBuilder(file, offset);
-    builder.append("var ");
+    builder.append('var ');
     // prepare excluded names
     Set<String> excluded = new Set<String>();
     {
@@ -355,7 +355,7 @@
     {
       List<String> suggestions =
           getVariableNameSuggestionsForExpression(type, expression, excluded);
-      builder.startPosition("NAME");
+      builder.startPosition('NAME');
       for (int i = 0; i < suggestions.length; i++) {
         String name = suggestions[i];
         if (i == 0) {
@@ -365,7 +365,7 @@
       }
       builder.endPosition();
     }
-    builder.append(" = ");
+    builder.append(' = ');
     // add proposal
     _insertBuilder(builder);
     _addAssist(AssistKind.ASSIGN_TO_LOCAL_VARIABLE, []);
@@ -384,7 +384,7 @@
     // add change
     String indent = utils.getIndent(1);
     String returnSource = 'return ' + _getNodeText(returnValue);
-    String newBodySource = "{$eol$prefix${indent}$returnSource;$eol$prefix}";
+    String newBodySource = '{$eol$prefix$indent$returnSource;$eol$prefix}';
     _addReplaceEdit(rangeNode(body), newBodySource);
     // add proposal
     _addAssist(AssistKind.CONVERT_INTO_BLOCK_BODY, []);
@@ -415,10 +415,10 @@
       return;
     }
     // add change
-    String newBodySource = "=> ${_getNodeText(returnExpression)}";
+    String newBodySource = '=> ${_getNodeText(returnExpression)}';
     if (body.parent is! FunctionExpression ||
         body.parent.parent is FunctionDeclaration) {
-      newBodySource += ";";
+      newBodySource += ';';
     }
     _addReplaceEdit(rangeNode(body), newBodySource);
     // add proposal
@@ -469,7 +469,7 @@
       _addRemoveEdit(
           rangeStartEnd(parExpression.rightParenthesis, prefExpression));
     }
-    _addInsertEdit(isExpression.isOperator.end, "!");
+    _addInsertEdit(isExpression.isOperator.end, '!');
     // add proposal
     _addAssist(AssistKind.CONVERT_INTO_IS_NOT, []);
   }
@@ -518,7 +518,7 @@
       _addRemoveEdit(
           rangeStartEnd(parExpression.rightParenthesis, prefExpression));
     }
-    _addInsertEdit(isExpression.isOperator.end, "!");
+    _addInsertEdit(isExpression.isOperator.end, '!');
     // add proposal
     _addAssist(AssistKind.CONVERT_INTO_IS_NOT, []);
   }
@@ -550,14 +550,14 @@
     }
     // should be "isEmpty"
     Element propertyElement = isEmptyIdentifier.bestElement;
-    if (propertyElement == null || "isEmpty" != propertyElement.name) {
+    if (propertyElement == null || 'isEmpty' != propertyElement.name) {
       _coverageMarker();
       return;
     }
     // should have "isNotEmpty"
     Element propertyTarget = propertyElement.enclosingElement;
     if (propertyTarget == null ||
-        getChildren(propertyTarget, "isNotEmpty").isEmpty) {
+        getChildren(propertyTarget, 'isNotEmpty').isEmpty) {
       _coverageMarker();
       return;
     }
@@ -574,7 +574,7 @@
     }
     // do replace
     _addRemoveEdit(rangeStartStart(prefixExpression, prefixExpression.operand));
-    _addReplaceEdit(rangeNode(isEmptyIdentifier), "isNotEmpty");
+    _addReplaceEdit(rangeNode(isEmptyIdentifier), 'isNotEmpty');
     // add proposal
     _addAssist(AssistKind.CONVERT_INTO_IS_NOT_EMPTY, []);
   }
@@ -675,7 +675,7 @@
       return;
     }
     // prepare change
-    String showCombinator = " show ${StringUtils.join(referencedNames, ", ")}";
+    String showCombinator = ' show ${StringUtils.join(referencedNames, ', ')}';
     _addInsertEdit(importDirective.end - 1, showCombinator);
     // add proposal
     _addAssist(AssistKind.IMPORT_ADD_SHOW, []);
@@ -812,12 +812,12 @@
       String targetConditionSource = _getNodeText(targetCondition);
       String innerConditionSource = _getNodeText(innerCondition);
       if (_shouldWrapParenthesisBeforeAnd(targetCondition)) {
-        targetConditionSource = "(${targetConditionSource})";
+        targetConditionSource = '($targetConditionSource)';
       }
       if (_shouldWrapParenthesisBeforeAnd(innerCondition)) {
-        innerConditionSource = "(${innerConditionSource})";
+        innerConditionSource = '($innerConditionSource)';
       }
-      condition = "${targetConditionSource} && ${innerConditionSource}";
+      condition = '$targetConditionSource && $innerConditionSource';
     }
     // replace target "if" statement
     {
@@ -829,7 +829,7 @@
       String newSource = utils.indentSourceLeftRight(oldSource, false);
       _addReplaceEdit(
           rangeNode(targetIfStatement),
-          "if ($condition) {${eol}${newSource}${prefix}}");
+          'if ($condition) {$eol$newSource$prefix}');
     }
     // done
     _addAssist(AssistKind.JOIN_IF_WITH_INNER, []);
@@ -875,12 +875,12 @@
       String targetConditionSource = _getNodeText(targetCondition);
       String outerConditionSource = _getNodeText(outerCondition);
       if (_shouldWrapParenthesisBeforeAnd(targetCondition)) {
-        targetConditionSource = "(${targetConditionSource})";
+        targetConditionSource = '($targetConditionSource)';
       }
       if (_shouldWrapParenthesisBeforeAnd(outerCondition)) {
-        outerConditionSource = "(${outerConditionSource})";
+        outerConditionSource = '($outerConditionSource)';
       }
-      condition = "${outerConditionSource} && ${targetConditionSource}";
+      condition = '$outerConditionSource && $targetConditionSource';
     }
     // replace outer "if" statement
     {
@@ -892,7 +892,7 @@
       String newSource = utils.indentSourceLeftRight(oldSource, false);
       _addReplaceEdit(
           rangeNode(outerIfStatement),
-          "if ($condition) {${eol}${newSource}${prefix}}");
+          'if ($condition) {$eol$newSource$prefix}');
     }
     // done
     _addAssist(AssistKind.JOIN_IF_WITH_OUTER, []);
@@ -966,7 +966,7 @@
     // add edits
     {
       int assignOffset = assignExpression.operator.offset;
-      _addReplaceEdit(rangeEndStart(declNode, assignOffset), " ");
+      _addReplaceEdit(rangeEndStart(declNode, assignOffset), ' ');
     }
     // add proposal
     _addAssist(AssistKind.JOIN_VARIABLE_DECLARATION, []);
@@ -1033,7 +1033,7 @@
     // add edits
     {
       int assignOffset = assignExpression.operator.offset;
-      _addReplaceEdit(rangeEndStart(decl.name, assignOffset), " ");
+      _addReplaceEdit(rangeEndStart(decl.name, assignOffset), ' ');
     }
     // add proposal
     _addAssist(AssistKind.JOIN_VARIABLE_DECLARATION, []);
@@ -1084,7 +1084,7 @@
     // add edit
     if (typeStart != null && typeEnd != null) {
       SourceRange typeRange = rangeStartStart(typeStart, typeEnd);
-      _addReplaceEdit(typeRange, "var ");
+      _addReplaceEdit(typeRange, 'var ');
     }
     // add proposal
     _addAssist(AssistKind.REMOVE_TYPE_ANNOTATION, []);
@@ -1299,30 +1299,29 @@
       SourceRange thenBlockRange = rangeNode(thenBlock);
       // insert inner "if" with right part of "condition"
       {
-        String source =
-            "${eol}${prefix}${indent}if (${rightConditionSource}) {";
+        String source = '$eol$prefix${indent}if ($rightConditionSource) {';
         int thenBlockInsideOffset = thenBlockRange.offset + 1;
         _addInsertEdit(thenBlockInsideOffset, source);
       }
       // insert closing "}" for inner "if"
       {
         int thenBlockEnd = thenBlockRange.end;
-        String source = "${indent}}";
+        String source = "$indent}";
         // insert before outer "then" block "}"
-        source += "${eol}${prefix}";
+        source += '$eol$prefix';
         _addInsertEdit(thenBlockEnd - 1, source);
       }
     } else {
       // insert inner "if" with right part of "condition"
-      String source = "${eol}${prefix}${indent}if (${rightConditionSource})";
+      String source = '$eol$prefix${indent}if ($rightConditionSource)';
       _addInsertEdit(ifStatement.rightParenthesis.offset + 1, source);
     }
     // indent "then" statements to correspond inner "if"
     {
       List<Statement> thenStatements = getStatements(thenStatement);
       SourceRange linesRange = utils.getLinesRangeStatements(thenStatements);
-      String thenIndentOld = "${prefix}${indent}";
-      String thenIndentNew = "${thenIndentOld}${indent}";
+      String thenIndentOld = '$prefix$indent';
+      String thenIndentNew = '$thenIndentOld$indent';
       _addIndentEdit(linesRange, thenIndentOld, thenIndentNew);
     }
     // add proposal
@@ -1393,220 +1392,222 @@
         utils.getLinesRangeStatements(selectedStatements);
     // prepare environment
     String indentOld = utils.getNodePrefix(firstStatement);
-    String indentNew = "${indentOld}${utils.getIndent(1)}";
+    String indentNew = '$indentOld${utils.getIndent(1)}';
+    String indentedCode =
+        utils.replaceSourceRangeIndent(statementsRange, indentOld, indentNew);
     // "block"
     {
-      _addInsertEdit(statementsRange.offset, "${indentOld}{${eol}");
+      _addInsertEdit(statementsRange.offset, '$indentOld{$eol');
       _addIndentEdit(statementsRange, indentOld, indentNew);
-      _addInsertEdit(statementsRange.end, "${indentOld}}${eol}");
+      _addInsertEdit(statementsRange.end, '$indentOld}$eol');
       exitPosition = _newPosition(lastStatement.end);
       // add proposal
       _addAssist(AssistKind.SURROUND_WITH_BLOCK, []);
     }
     // "if"
     {
+      int offset = statementsRange.offset;
+      SourceBuilder sb = new SourceBuilder(file, offset);
+      sb.append(indentOld);
+      sb.append('if (');
       {
-        int offset = statementsRange.offset;
-        SourceBuilder sb = new SourceBuilder(file, offset);
-        sb.append(indentOld);
-        sb.append("if (");
-        {
-          sb.startPosition("CONDITION");
-          sb.append("condition");
-          sb.endPosition();
-        }
-        sb.append(") {");
-        sb.append(eol);
-        _insertBuilder(sb);
+        sb.startPosition('CONDITION');
+        sb.append('condition');
+        sb.endPosition();
       }
-      _addIndentEdit(statementsRange, indentOld, indentNew);
-      _addInsertEdit(statementsRange.end, "${indentOld}}${eol}");
-      exitPosition = _newPosition(lastStatement.end);
+      sb.append(') {');
+      sb.append(eol);
+      sb.append(indentedCode);
+      sb.append(indentOld);
+      sb.append('}');
+      exitPosition = _newPosition(sb.offset + sb.length);
+      sb.append(eol);
+      _insertBuilder(sb, statementsRange.length);
       // add proposal
       _addAssist(AssistKind.SURROUND_WITH_IF, []);
     }
     // "while"
     {
+      int offset = statementsRange.offset;
+      SourceBuilder sb = new SourceBuilder(file, offset);
+      sb.append(indentOld);
+      sb.append('while (');
       {
-        int offset = statementsRange.offset;
-        SourceBuilder sb = new SourceBuilder(file, offset);
-        sb.append(indentOld);
-        sb.append("while (");
-        {
-          sb.startPosition("CONDITION");
-          sb.append("condition");
-          sb.endPosition();
-        }
-        sb.append(") {");
-        sb.append(eol);
-        _insertBuilder(sb);
+        sb.startPosition('CONDITION');
+        sb.append('condition');
+        sb.endPosition();
       }
-      _addIndentEdit(statementsRange, indentOld, indentNew);
-      _addInsertEdit(statementsRange.end, "${indentOld}}${eol}");
-      exitPosition = _newPosition(lastStatement.end);
+      sb.append(') {');
+      sb.append(eol);
+      sb.append(indentedCode);
+      sb.append(indentOld);
+      sb.append('}');
+      exitPosition = _newPosition(sb.offset + sb.length);
+      sb.append(eol);
+      _insertBuilder(sb, statementsRange.length);
       // add proposal
       _addAssist(AssistKind.SURROUND_WITH_WHILE, []);
     }
     // "for-in"
     {
+      int offset = statementsRange.offset;
+      SourceBuilder sb = new SourceBuilder(file, offset);
+      sb.append(indentOld);
+      sb.append('for (var ');
       {
-        int offset = statementsRange.offset;
-        SourceBuilder sb = new SourceBuilder(file, offset);
-        sb.append(indentOld);
-        sb.append("for (var ");
-        {
-          sb.startPosition("NAME");
-          sb.append("item");
-          sb.endPosition();
-        }
-        sb.append(" in ");
-        {
-          sb.startPosition("ITERABLE");
-          sb.append("iterable");
-          sb.endPosition();
-        }
-        sb.append(") {");
-        sb.append(eol);
-        _insertBuilder(sb);
+        sb.startPosition('NAME');
+        sb.append('item');
+        sb.endPosition();
       }
-      _addIndentEdit(statementsRange, indentOld, indentNew);
-      _addInsertEdit(statementsRange.end, "${indentOld}}${eol}");
-      exitPosition = _newPosition(lastStatement.end);
+      sb.append(' in ');
+      {
+        sb.startPosition('ITERABLE');
+        sb.append('iterable');
+        sb.endPosition();
+      }
+      sb.append(') {');
+      sb.append(eol);
+      sb.append(indentedCode);
+      sb.append(indentOld);
+      sb.append('}');
+      exitPosition = _newPosition(sb.offset + sb.length);
+      sb.append(eol);
+      _insertBuilder(sb, statementsRange.length);
       // add proposal
       _addAssist(AssistKind.SURROUND_WITH_FOR_IN, []);
     }
     // "for"
     {
+      int offset = statementsRange.offset;
+      SourceBuilder sb = new SourceBuilder(file, offset);
+      sb.append(indentOld);
+      sb.append('for (var ');
       {
-        int offset = statementsRange.offset;
-        SourceBuilder sb = new SourceBuilder(file, offset);
-        sb.append(indentOld);
-        sb.append("for (var ");
-        {
-          sb.startPosition("VAR");
-          sb.append("v");
-          sb.endPosition();
-        }
-        sb.append(" = ");
-        {
-          sb.startPosition("INIT");
-          sb.append("init");
-          sb.endPosition();
-        }
-        sb.append("; ");
-        {
-          sb.startPosition("CONDITION");
-          sb.append("condition");
-          sb.endPosition();
-        }
-        sb.append("; ");
-        {
-          sb.startPosition("INCREMENT");
-          sb.append("increment");
-          sb.endPosition();
-        }
-        sb.append(") {");
-        sb.append(eol);
-        _insertBuilder(sb);
+        sb.startPosition('VAR');
+        sb.append('v');
+        sb.endPosition();
       }
-      _addIndentEdit(statementsRange, indentOld, indentNew);
-      _addInsertEdit(statementsRange.end, "${indentOld}}${eol}");
-      exitPosition = _newPosition(lastStatement.end);
+      sb.append(' = ');
+      {
+        sb.startPosition('INIT');
+        sb.append('init');
+        sb.endPosition();
+      }
+      sb.append('; ');
+      {
+        sb.startPosition('CONDITION');
+        sb.append('condition');
+        sb.endPosition();
+      }
+      sb.append('; ');
+      {
+        sb.startPosition('INCREMENT');
+        sb.append('increment');
+        sb.endPosition();
+      }
+      sb.append(') {');
+      sb.append(eol);
+      sb.append(indentedCode);
+      sb.append(indentOld);
+      sb.append('}');
+      exitPosition = _newPosition(sb.offset + sb.length);
+      sb.append(eol);
+      _insertBuilder(sb, statementsRange.length);
       // add proposal
       _addAssist(AssistKind.SURROUND_WITH_FOR, []);
     }
     // "do-while"
     {
-      _addInsertEdit(statementsRange.offset, "${indentOld}do {${eol}");
-      _addIndentEdit(statementsRange, indentOld, indentNew);
+      int offset = statementsRange.offset;
+      SourceBuilder sb = new SourceBuilder(file, offset);
+      sb.append(indentOld);
+      sb.append('do {');
+      sb.append(eol);
+      sb.append(indentedCode);
+      sb.append(indentOld);
+      sb.append('} while (');
       {
-        int offset = statementsRange.end;
-        SourceBuilder sb = new SourceBuilder(file, offset);
-        sb.append(indentOld);
-        sb.append("} while (");
-        {
-          sb.startPosition("CONDITION");
-          sb.append("condition");
-          sb.endPosition();
-        }
-        sb.append(");");
-        sb.append(eol);
-        _insertBuilder(sb);
+        sb.startPosition('CONDITION');
+        sb.append('condition');
+        sb.endPosition();
       }
-      exitPosition = _newPosition(lastStatement.end);
+      sb.append(');');
+      exitPosition = _newPosition(sb.offset + sb.length);
+      sb.append(eol);
+      _insertBuilder(sb, statementsRange.length);
       // add proposal
       _addAssist(AssistKind.SURROUND_WITH_DO_WHILE, []);
     }
     // "try-catch"
     {
-      _addInsertEdit(statementsRange.offset, "${indentOld}try {${eol}");
-      _addIndentEdit(statementsRange, indentOld, indentNew);
+      int offset = statementsRange.offset;
+      SourceBuilder sb = new SourceBuilder(file, offset);
+      sb.append(indentOld);
+      sb.append('try {');
+      sb.append(eol);
+      sb.append(indentedCode);
+      sb.append(indentOld);
+      sb.append('} on ');
       {
-        int offset = statementsRange.end;
-        SourceBuilder sb = new SourceBuilder(file, offset);
-        sb.append(indentOld);
-        sb.append("} on ");
-        {
-          sb.startPosition("EXCEPTION_TYPE");
-          sb.append("Exception");
-          sb.endPosition();
-        }
-        sb.append(" catch (");
-        {
-          sb.startPosition("EXCEPTION_VAR");
-          sb.append("e");
-          sb.endPosition();
-        }
-        sb.append(") {");
-        sb.append(eol);
-        //
-        sb.append(indentNew);
-        {
-          sb.startPosition("CATCH");
-          sb.append("// TODO");
-          sb.endPosition();
-          sb.setExitOffset();
-        }
-        sb.append(eol);
-        //
-        sb.append(indentOld);
-        sb.append("}");
-        sb.append(eol);
-        //
-        _insertBuilder(sb);
-        exitPosition = _newPosition(sb.exitOffset);
+        sb.startPosition('EXCEPTION_TYPE');
+        sb.append('Exception');
+        sb.endPosition();
       }
+      sb.append(' catch (');
+      {
+        sb.startPosition('EXCEPTION_VAR');
+        sb.append('e');
+        sb.endPosition();
+      }
+      sb.append(') {');
+      sb.append(eol);
+      //
+      sb.append(indentNew);
+      {
+        sb.startPosition('CATCH');
+        sb.append('// TODO');
+        sb.endPosition();
+        sb.setExitOffset();
+      }
+      sb.append(eol);
+      //
+      sb.append(indentOld);
+      sb.append('}');
+      sb.append(eol);
+      _insertBuilder(sb, statementsRange.length);
       // add proposal
       _addAssist(AssistKind.SURROUND_WITH_TRY_CATCH, []);
     }
     // "try-finally"
     {
-      _addInsertEdit(statementsRange.offset, "${indentOld}try {${eol}");
-      _addIndentEdit(statementsRange, indentOld, indentNew);
+      int offset = statementsRange.offset;
+      SourceBuilder sb = new SourceBuilder(file, offset);
+      //
+      sb.append(indentOld);
+      sb.append('try {');
+      sb.append(eol);
+      //
+      sb.append(indentedCode);
+      //
+      sb.append(indentOld);
+      sb.append('} finally {');
+      sb.append(eol);
+      //
+      sb.append(indentNew);
       {
-        int offset = statementsRange.end;
-        SourceBuilder sb = new SourceBuilder(file, offset);
-        //
-        sb.append(indentOld);
-        sb.append("} finally {");
-        sb.append(eol);
-        //
-        sb.append(indentNew);
-        {
-          sb.startPosition("FINALLY");
-          sb.append("// TODO");
-          sb.endPosition();
-        }
+        sb.startPosition('FINALLY');
+        sb.append('// TODO');
+        sb.endPosition();
         sb.setExitOffset();
-        sb.append(eol);
-        //
-        sb.append(indentOld);
-        sb.append("}");
-        sb.append(eol);
-        //
-        _insertBuilder(sb);
-        exitPosition = _newPosition(sb.exitOffset);
       }
+      sb.setExitOffset();
+      sb.append(eol);
+      //
+      sb.append(indentOld);
+      sb.append('}');
+      sb.append(eol);
+      //
+      _insertBuilder(sb, statementsRange.length);
       // add proposal
       _addAssist(AssistKind.SURROUND_WITH_TRY_FINALLY, []);
     }
@@ -1670,9 +1671,12 @@
   /**
    * Inserts the given [SourceBuilder] at its offset.
    */
-  void _insertBuilder(SourceBuilder builder) {
-    String text = builder.toString();
-    _addInsertEdit(builder.offset, text);
+  void _insertBuilder(SourceBuilder builder, [int length = 0]) {
+    {
+      SourceRange range = rangeStartLength(builder.offset, length);
+      String text = builder.toString();
+      _addReplaceEdit(range, text);
+    }
     // add linked positions
     builder.linkedPositionGroups.forEach((String id, LinkedEditGroup group) {
       LinkedEditGroup fixGroup = _getLinkedPosition(id);
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 143cceb..ceec5fe 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -80,7 +80,7 @@
     unitLibraryFolder = dirname(unitLibraryFile);
   }
 
-  DartType get coreTypeBool => _getCoreType("bool");
+  DartType get coreTypeBool => _getCoreType('bool');
 
   /**
    * Returns the EOL to use for this [CompilationUnit].
@@ -264,7 +264,7 @@
 
   void _addFix_boolInsteadOfBoolean() {
     SourceRange range = rf.rangeError(error);
-    _addReplaceEdit(range, "bool");
+    _addReplaceEdit(range, 'bool');
     _addFix(FixKind.REPLACE_BOOLEAN_WITH_BOOL, []);
   }
 
@@ -275,28 +275,28 @@
       CompilationUnitMember enclosingMember =
           node.getAncestor((node) => node is CompilationUnitMember);
       int offset = enclosingMember.end;
-      String prefix = "";
+      String prefix = '';
       // prepare source
       SourceBuilder sb = new SourceBuilder(file, offset);
       {
-        sb.append("${eol}${eol}");
+        sb.append('$eol$eol');
         sb.append(prefix);
         // "class"
-        sb.append("class ");
+        sb.append('class ');
         // append name
         {
-          sb.startPosition("NAME");
+          sb.startPosition('NAME');
           sb.append(name);
           sb.endPosition();
         }
         // no members
-        sb.append(" {");
+        sb.append(' {');
         sb.append(eol);
-        sb.append("}");
+        sb.append('}');
       }
       // insert source
       _insertBuilder(sb);
-      _addLinkedPosition("NAME", sb, rf.rangeNode(node));
+      _addLinkedPosition('NAME', sb, rf.rangeNode(node));
       // add proposal
       _addFix(FixKind.CREATE_CLASS, [name]);
     }
@@ -349,14 +349,14 @@
     // build method source
     SourceBuilder sb = new SourceBuilder(targetFile, targetLocation.offset);
     {
-      String indent = "  ";
+      String indent = '  ';
       sb.append(targetLocation.prefix);
       sb.append(indent);
       sb.append(targetElement.name);
       _addFix_undefinedMethod_create_parameters(
           sb,
           instanceCreation.argumentList);
-      sb.append(") {${eol}${indent}}");
+      sb.append(') {$eol$indent}');
       sb.append(targetLocation.suffix);
     }
     // insert source
@@ -407,27 +407,27 @@
     // build method source
     SourceBuilder sb = new SourceBuilder(targetFile, targetLocation.offset);
     {
-      String indent = "  ";
+      String indent = '  ';
       sb.append(targetLocation.prefix);
       sb.append(indent);
       sb.append(targetElement.name);
-      sb.append(".");
+      sb.append('.');
       // append name
       {
-        sb.startPosition("NAME");
+        sb.startPosition('NAME');
         sb.append(name.name);
         sb.endPosition();
       }
       _addFix_undefinedMethod_create_parameters(
           sb,
           instanceCreation.argumentList);
-      sb.append(") {${eol}${indent}}");
+      sb.append(') {$eol$indent}');
       sb.append(targetLocation.suffix);
     }
     // insert source
     _insertBuilder(sb);
     if (targetFile == file) {
-      _addLinkedPosition("NAME", sb, rf.rangeNode(name));
+      _addLinkedPosition('NAME', sb, rf.rangeNode(name));
     }
     // add proposal
     _addFixToElement(
@@ -459,23 +459,23 @@
         if (initializers.isEmpty) {
           int insertOffset = targetConstructor.parameters.end;
           sb = new SourceBuilder(file, insertOffset);
-          sb.append(" : ");
+          sb.append(' : ');
         } else {
           ConstructorInitializer lastInitializer =
               initializers[initializers.length - 1];
           int insertOffset = lastInitializer.end;
           sb = new SourceBuilder(file, insertOffset);
-          sb.append(", ");
+          sb.append(', ');
         }
       }
       // add super constructor name
-      sb.append("super");
+      sb.append('super');
       if (!StringUtils.isEmpty(constructorName)) {
-        sb.append(".");
+        sb.append('.');
         sb.append(constructorName);
       }
       // add arguments
-      sb.append("(");
+      sb.append('(');
       bool firstParameter = true;
       for (ParameterElement parameter in superConstructor.parameters) {
         // skip non-required parameters
@@ -486,7 +486,7 @@
         if (firstParameter) {
           firstParameter = false;
         } else {
-          sb.append(", ");
+          sb.append(', ');
         }
         // default value
         DartType parameterType = parameter.type;
@@ -494,7 +494,7 @@
         sb.append(getDefaultValueCode(parameterType));
         sb.endPosition();
       }
-      sb.append(")");
+      sb.append(')');
       // insert proposal
       _insertBuilder(sb);
       // add proposal
@@ -556,7 +556,7 @@
           sb.append(constructorName);
           sb.endPosition();
         }
-        sb.append("(");
+        sb.append('(');
         sb.append(parametersBuffer.toString());
         sb.append(') : super');
         if (!constructorName.isEmpty) {
@@ -882,7 +882,7 @@
       // append method
       sb.append(prefix);
       sb.append(
-          "noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);");
+          'noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);');
       sb.append(eol);
     }
     // done
@@ -902,7 +902,7 @@
     String suffix;
     {
       // if no directives
-      prefix = "";
+      prefix = '';
       suffix = eol;
       CorrectionUtils libraryUtils = new CorrectionUtils(libraryUnit);
       // after last directive in library
@@ -910,7 +910,7 @@
         if (directive is LibraryDirective || directive is ImportDirective) {
           offset = directive.end;
           prefix = eol;
-          suffix = "";
+          suffix = '';
         }
       }
       // if still beginning of file, skip shebang and line comments
@@ -918,11 +918,11 @@
         CorrectionUtils_InsertDesc desc = libraryUtils.getInsertDescTop();
         offset = desc.offset;
         prefix = desc.prefix;
-        suffix = "${desc.suffix}${eol}";
+        suffix = '${desc.suffix}$eol';
       }
     }
     // insert new import
-    String importSource = "${prefix}import '${importPath}';${suffix}";
+    String importSource = "${prefix}import '$importPath';$suffix";
     _addInsertEdit(offset, importSource);
     // add proposal
     _addFixToElement(kind, [importPath], libraryUnitElement);
@@ -930,7 +930,7 @@
 
   void _addFix_importLibrary_withElement(String name, ElementKind kind) {
     // ignore if private
-    if (name.startsWith("_")) {
+    if (name.startsWith('_')) {
       return;
     }
 
@@ -953,7 +953,7 @@
       PrefixElement prefix = imp.prefix;
       if (prefix != null) {
         SourceRange range = rf.rangeStartLength(node, 0);
-        _addReplaceEdit(range, "${prefix.displayName}.");
+        _addReplaceEdit(range, '${prefix.displayName}.');
         _addFix(
             FixKind.IMPORT_LIBRARY_PREFIX,
             [libraryElement.displayName, prefix.displayName]);
@@ -974,7 +974,7 @@
           libraryName = imp.uri;
         }
         // update library
-        String newShowCode = "show ${StringUtils.join(showNames, ", ")}";
+        String newShowCode = 'show ${StringUtils.join(showNames, ", ")}';
         _addReplaceEdit(rf.rangeOffsetEnd(showCombinator), newShowCode);
         _addFixToElement(
             FixKind.IMPORT_LIBRARY_SHOW,
@@ -1086,7 +1086,7 @@
   void _addFix_insertSemicolon() {
     if (error.message.contains("';'")) {
       int insertOffset = error.offset + error.length;
-      _addInsertEdit(insertOffset, ";");
+      _addInsertEdit(insertOffset, ';');
       _addFix(FixKind.INSERT_SEMICOLON, []);
     }
   }
@@ -1096,7 +1096,7 @@
       IsExpression isExpression = coveredNode as IsExpression;
       _addReplaceEdit(
           rf.rangeEndEnd(isExpression.expression, isExpression),
-          " != null");
+          ' != null');
       _addFix(FixKind.USE_NOT_EQ_NULL, []);
     }
   }
@@ -1106,7 +1106,7 @@
       IsExpression isExpression = coveredNode as IsExpression;
       _addReplaceEdit(
           rf.rangeEndEnd(isExpression.expression, isExpression),
-          " == null");
+          ' == null');
       _addFix(FixKind.USE_EQ_EQ_NULL, []);
     }
   }
@@ -1115,7 +1115,7 @@
     ClassDeclaration enclosingClass =
         node.getAncestor((node) => node is ClassDeclaration);
     String className = enclosingClass.name.name;
-    _addInsertEdit(enclosingClass.classKeyword.offset, "abstract ");
+    _addInsertEdit(enclosingClass.classKeyword.offset, 'abstract ');
     _addFix(FixKind.MAKE_CLASS_ABSTRACT, [className]);
   }
 
@@ -1124,7 +1124,7 @@
       MethodDeclaration method = node.parent as MethodDeclaration;
       FunctionBody body = method.body;
       if (method.name == node && body != null) {
-        _addReplaceEdit(rf.rangeEndStart(node, body), " ");
+        _addReplaceEdit(rf.rangeEndStart(node, body), ' ');
         _addFix(FixKind.REMOVE_PARAMETERS_IN_GETTER_DECLARATION, []);
       }
     }
@@ -1195,14 +1195,14 @@
 
   void _addFix_replaceVarWithDynamic() {
     SourceRange range = rf.rangeError(error);
-    _addReplaceEdit(range, "dynamic");
+    _addReplaceEdit(range, 'dynamic');
     _addFix(FixKind.REPLACE_VAR_WITH_DYNAMIC, []);
   }
 
   void _addFix_replaceWithConstInstanceCreation() {
     if (coveredNode is InstanceCreationExpression) {
       var instanceCreation = coveredNode as InstanceCreationExpression;
-      _addReplaceEdit(rf.rangeToken(instanceCreation.keyword), "const");
+      _addReplaceEdit(rf.rangeToken(instanceCreation.keyword), 'const');
       _addFix(FixKind.USE_CONST, []);
     }
   }
@@ -1259,7 +1259,7 @@
     AstNode enclosingMember =
         node.getAncestor((node) => node is CompilationUnitMember);
     insertOffset = enclosingMember.end;
-    sourcePrefix = "${eol}${eol}";
+    sourcePrefix = '$eol$eol';
     utils.targetClassElement = null;
     // build method source
     SourceBuilder sb = new SourceBuilder(file, insertOffset);
@@ -1272,12 +1272,12 @@
       }
       // append name
       {
-        sb.startPosition("NAME");
+        sb.startPosition('NAME');
         sb.append(name);
         sb.endPosition();
       }
       _addFix_undefinedMethod_create_parameters(sb, invocation.argumentList);
-      sb.append(") {${eol}}");
+      sb.append(') {$eol}');
     }
     // insert source
     _insertBuilder(sb);
@@ -1334,8 +1334,8 @@
         staticModifier = _inStaticContext();
         prefix = utils.getNodePrefix(enclosingMember);
         insertOffset = enclosingMember.end;
-        sourcePrefix = "${eol}${eol}";
-        sourceSuffix = "";
+        sourcePrefix = '$eol$eol';
+        sourceSuffix = '';
       } else {
         // prepare target interface type
         DartType targetType = target.bestType;
@@ -1350,10 +1350,10 @@
         }
         // prepare insert offset
         ClassDeclaration targetClassNode = targetClassElement.node;
-        prefix = "  ";
+        prefix = '  ';
         insertOffset = targetClassNode.end - 1;
         if (targetClassNode.members.isEmpty) {
-          sourcePrefix = "";
+          sourcePrefix = '';
         } else {
           sourcePrefix = eol;
         }
@@ -1367,7 +1367,7 @@
         sb.append(prefix);
         // maybe "static"
         if (staticModifier) {
-          sb.append("static ");
+          sb.append('static ');
         }
         // append return type
         {
@@ -1376,12 +1376,12 @@
         }
         // append name
         {
-          sb.startPosition("NAME");
+          sb.startPosition('NAME');
           sb.append(name);
           sb.endPosition();
         }
         _addFix_undefinedMethod_create_parameters(sb, invocation.argumentList);
-        sb.append(") {${eol}${prefix}}");
+        sb.append(') {$eol$prefix}');
         sb.append(sourceSuffix);
       }
       // insert source
@@ -1398,14 +1398,14 @@
   void _addFix_undefinedMethod_create_parameters(SourceBuilder sb,
       ArgumentList argumentList) {
     // append parameters
-    sb.append("(");
+    sb.append('(');
     Set<String> excluded = new Set();
     List<Expression> arguments = argumentList.arguments;
     for (int i = 0; i < arguments.length; i++) {
       Expression argument = arguments[i];
       // append separator
       if (i != 0) {
-        sb.append(", ");
+        sb.append(', ');
       }
       // append type name
       DartType type = argument.bestType;
@@ -1413,19 +1413,19 @@
       // TODO(scheglov) use librariesToImport
       String typeSource = utils.getTypeSource(type, librariesToImport);
       {
-        sb.startPosition("TYPE${i}");
+        sb.startPosition('TYPE$i');
         sb.append(typeSource);
         _addSuperTypeProposals(sb, new Set(), type);
         sb.endPosition();
       }
-      sb.append(" ");
+      sb.append(' ');
       // append parameter name
       {
         List<String> suggestions =
             _getArgumentNameSuggestions(excluded, type, argument, i);
         String favorite = suggestions[0];
         excluded.add(favorite);
-        sb.startPosition("ARG${i}");
+        sb.startPosition('ARG$i');
         sb.append(favorite);
         sb.addSuggestions(LinkedEditSuggestionKind.PARAMETER, suggestions);
         sb.endPosition();
@@ -1478,7 +1478,7 @@
         }
         // replace "/" with "~/"
         BinaryExpression binary = target as BinaryExpression;
-        _addReplaceEdit(rf.rangeToken(binary.operator), "~/");
+        _addReplaceEdit(rf.rangeToken(binary.operator), '~/');
         // remove everything before and after
         _addRemoveEdit(rf.rangeStartStart(invocation, binary.leftOperand));
         _addRemoveEdit(rf.rangeEndEnd(binary.rightOperand, invocation));
@@ -1574,24 +1574,24 @@
       sb.append(prefix);
       // may be static
       if (isStatic) {
-        sb.append("static ");
+        sb.append('static ');
       }
       // append return type
       _appendType(sb, functionType.returnType, groupId: 'RETURN_TYPE');
       // append name
       {
-        sb.startPosition("NAME");
+        sb.startPosition('NAME');
         sb.append(name);
         sb.endPosition();
       }
       // append parameters
-      sb.append("(");
+      sb.append('(');
       List<ParameterElement> parameters = functionType.parameters;
       for (int i = 0; i < parameters.length; i++) {
         ParameterElement parameter = parameters[i];
         // append separator
         if (i != 0) {
-          sb.append(", ");
+          sb.append(', ');
         }
         // append type name
         DartType type = parameter.type;
@@ -1600,30 +1600,30 @@
           // TODO(scheglov) use librariesToImport
           String typeSource = utils.getTypeSource(type, librariesToImport);
           {
-            sb.startPosition("TYPE${i}");
+            sb.startPosition('TYPE$i');
             sb.append(typeSource);
             _addSuperTypeProposals(sb, new Set(), type);
             sb.endPosition();
           }
-          sb.append(" ");
+          sb.append(' ');
         }
         // append parameter name
         {
-          sb.startPosition("ARG${i}");
+          sb.startPosition('ARG$i');
           sb.append(parameter.displayName);
           sb.endPosition();
         }
       }
-      sb.append(")");
+      sb.append(')');
       // close method
-      sb.append(" {${eol}${prefix}}");
+      sb.append(' {$eol$prefix}');
       sb.append(sourceSuffix);
     }
     // insert source
     _insertBuilder(sb);
     // add linked positions
     if (targetSource == unitSource) {
-      _addLinkedPosition("NAME", sb, rf.rangeNode(node));
+      _addLinkedPosition('NAME', sb, rf.rangeNode(node));
     }
   }
 
@@ -1636,8 +1636,8 @@
     // prepare environment
     int insertOffset = unit.end;
     // prepare prefix
-    String prefix = "";
-    String sourcePrefix = "${eol}";
+    String prefix = '';
+    String sourcePrefix = '$eol';
     String sourceSuffix = eol;
     _addProposal_createFunction(
         functionType,
@@ -1665,10 +1665,10 @@
     ClassDeclaration targetClassNode = targetClassElement.node;
     int insertOffset = targetClassNode.end - 1;
     // prepare prefix
-    String prefix = "  ";
+    String prefix = '  ';
     String sourcePrefix;
     if (targetClassNode.members.isEmpty) {
-      sourcePrefix = "";
+      sourcePrefix = '';
     } else {
       sourcePrefix = eol;
     }
@@ -1702,13 +1702,13 @@
   }
 
   void _appendParameters(SourceBuilder sb, List<ParameterElement> parameters) {
-    sb.append("(");
+    sb.append('(');
     bool firstParameter = true;
     bool sawNamed = false;
     bool sawPositional = false;
     for (ParameterElement parameter in parameters) {
       if (!firstParameter) {
-        sb.append(", ");
+        sb.append(', ');
       } else {
         firstParameter = false;
       }
@@ -1716,13 +1716,13 @@
       ParameterKind parameterKind = parameter.parameterKind;
       if (parameterKind == ParameterKind.NAMED) {
         if (!sawNamed) {
-          sb.append("{");
+          sb.append('{');
           sawNamed = true;
         }
       }
       if (parameterKind == ParameterKind.POSITIONAL) {
         if (!sawPositional) {
-          sb.append("[");
+          sb.append('[');
           sawPositional = true;
         }
       }
@@ -1732,21 +1732,21 @@
       String defaultCode = parameter.defaultValueCode;
       if (defaultCode != null) {
         if (sawPositional) {
-          sb.append(" = ");
+          sb.append(' = ');
         } else {
-          sb.append(": ");
+          sb.append(': ');
         }
         sb.append(defaultCode);
       }
     }
     // close parameters
     if (sawNamed) {
-      sb.append("}");
+      sb.append('}');
     }
     if (sawPositional) {
-      sb.append("]");
+      sb.append(']');
     }
-    sb.append(")");
+    sb.append(')');
   }
 
   void _appendParameterSource(SourceBuilder sb, DartType type, String name) {
@@ -1781,11 +1781,11 @@
    */
   String _getConstructorProposalName(ConstructorElement constructor) {
     SourceBuilder proposalNameBuffer = new SourceBuilder.buffer();
-    proposalNameBuffer.append("super");
+    proposalNameBuffer.append('super');
     // may be named
     String constructorName = constructor.displayName;
     if (!constructorName.isEmpty) {
-      proposalNameBuffer.append(".");
+      proposalNameBuffer.append('.');
       proposalNameBuffer.append(constructorName);
     }
     // parameters
@@ -2091,7 +2091,7 @@
     if (suggestions.length != 0) {
       return suggestions;
     }
-    return <String>["arg${index}"];
+    return <String>['arg$index'];
   }
 
   /**
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index 63c85f8..837afd8 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -877,7 +877,7 @@
       return name;
     }
     // function type
-    if (type is FunctionType) {
+    if (type is FunctionType && type.element.isSynthetic) {
       FunctionType functionType = type;
       StringBuffer sb = new StringBuffer();
       // return type
diff --git a/pkg/analysis_server/lib/src/services/index/index.dart b/pkg/analysis_server/lib/src/services/index/index.dart
index acfc835..e80a190 100644
--- a/pkg/analysis_server/lib/src/services/index/index.dart
+++ b/pkg/analysis_server/lib/src/services/index/index.dart
@@ -119,22 +119,6 @@
  */
 class IndexConstants {
   /**
-   * Left: an Angular element.
-   *   Is referenced at.
-   * Right: location.
-   */
-  static final Relationship ANGULAR_REFERENCE =
-      Relationship.getRelationship("angular-reference");
-
-  /**
-   * Left: an Angular component.
-   *   Is closed "/>" at.
-   * Right: location.
-   */
-  static final Relationship ANGULAR_CLOSING_TAG_REFERENCE =
-      Relationship.getRelationship("angular-closing-tag-reference");
-
-  /**
    * Left: the Universe or a Library.
    *   Defines an Element.
    * Right: an Element declaration.
diff --git a/pkg/analysis_server/lib/src/services/index/index_contributor.dart b/pkg/analysis_server/lib/src/services/index/index_contributor.dart
index 98d28f2..3159baf 100644
--- a/pkg/analysis_server/lib/src/services/index/index_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/index/index_contributor.dart
@@ -39,7 +39,6 @@
   }
   // do index
   unit.accept(new _IndexContributor(store));
-  unit.accept(new _AngularDartIndexContributor(store));
   store.doneIndex();
 }
 
@@ -64,259 +63,11 @@
     return;
   }
   // do index
-  unit.accept(new _AngularHtmlIndexContributor(store));
   store.doneIndex();
 }
 
 
 /**
- * Visits resolved [CompilationUnit] and adds Angular specific relationships
- * into [IndexStore].
- */
-class _AngularDartIndexContributor extends GeneralizingAstVisitor<Object> {
-  final IndexStore _store;
-
-  _AngularDartIndexContributor(this._store);
-
-  @override
-  Object visitClassDeclaration(ClassDeclaration node) {
-    ClassElement classElement = node.element;
-    if (classElement != null) {
-      List<ToolkitObjectElement> toolkitObjects = classElement.toolkitObjects;
-      for (ToolkitObjectElement object in toolkitObjects) {
-        if (object is AngularComponentElement) {
-          _indexComponent(object);
-        }
-        if (object is AngularDecoratorElement) {
-          AngularDecoratorElement directive = object;
-          _indexDirective(directive);
-        }
-      }
-    }
-    // stop visiting
-    return null;
-  }
-
-  @override
-  Object visitCompilationUnitMember(CompilationUnitMember node) => null;
-
-  void _indexComponent(AngularComponentElement component) {
-    _indexProperties(component.properties);
-  }
-
-  void _indexDirective(AngularDecoratorElement directive) {
-    _indexProperties(directive.properties);
-  }
-
-  /**
-   * Index [FieldElement] references from [AngularPropertyElement]s.
-   */
-  void _indexProperties(List<AngularPropertyElement> properties) {
-    for (AngularPropertyElement property in properties) {
-      FieldElement field = property.field;
-      if (field != null) {
-        int offset = property.fieldNameOffset;
-        if (offset == -1) {
-          continue;
-        }
-        int length = field.name.length;
-        Location location = new Location(property, offset, length);
-        // getter reference
-        if (property.propertyKind.callsGetter()) {
-          PropertyAccessorElement getter = field.getter;
-          if (getter != null) {
-            _store.recordRelationship(
-                getter,
-                IndexConstants.IS_REFERENCED_BY,
-                location);
-          }
-        }
-        // setter reference
-        if (property.propertyKind.callsSetter()) {
-          PropertyAccessorElement setter = field.setter;
-          if (setter != null) {
-            _store.recordRelationship(
-                setter,
-                IndexConstants.IS_REFERENCED_BY,
-                location);
-          }
-        }
-      }
-    }
-  }
-}
-
-
-/**
- * Visits resolved [HtmlUnit] and adds relationships into [IndexStore].
- */
-class _AngularHtmlIndexContributor extends _ExpressionVisitor {
-  /**
-   * The [IndexStore] to record relations into.
-   */
-  final IndexStore _store;
-
-  /**
-   * The index contributor used to index Dart [Expression]s.
-   */
-  _IndexContributor _indexContributor;
-
-  HtmlElement _htmlUnitElement;
-
-  /**
-   * Initialize a newly created Angular HTML index contributor.
-   *
-   * [store] - the [IndexStore] to record relations into.
-   */
-  _AngularHtmlIndexContributor(this._store) {
-    _indexContributor =
-        new _AngularHtmlIndexContributor_forEmbeddedDart(_store, this);
-  }
-
-  @override
-  void visitExpression(Expression expression) {
-    // Formatter
-    if (expression is SimpleIdentifier) {
-      Element element = expression.bestElement;
-      if (element is AngularElement) {
-        _store.recordRelationship(
-            element,
-            IndexConstants.ANGULAR_REFERENCE,
-            _createLocationForIdentifier(expression));
-        return;
-      }
-    }
-    // index as a normal Dart expression
-    expression.accept(_indexContributor);
-  }
-
-  @override
-  Object visitHtmlUnit(ht.HtmlUnit node) {
-    _htmlUnitElement = node.element;
-    CompilationUnitElement dartUnitElement =
-        _htmlUnitElement.angularCompilationUnit;
-    _indexContributor.enterScope(dartUnitElement);
-    return super.visitHtmlUnit(node);
-  }
-
-  @override
-  Object visitXmlAttributeNode(ht.XmlAttributeNode node) {
-    Element element = node.element;
-    if (element != null) {
-      ht.Token nameToken = node.nameToken;
-      Location location = _createLocationForToken(nameToken);
-      _store.recordRelationship(
-          element,
-          IndexConstants.ANGULAR_REFERENCE,
-          location);
-    }
-    return super.visitXmlAttributeNode(node);
-  }
-
-  @override
-  Object visitXmlTagNode(ht.XmlTagNode node) {
-    Element element = node.element;
-    if (element != null) {
-      // tag
-      {
-        ht.Token tagToken = node.tagToken;
-        Location location = _createLocationForToken(tagToken);
-        _store.recordRelationship(
-            element,
-            IndexConstants.ANGULAR_REFERENCE,
-            location);
-      }
-      // maybe add closing tag range
-      ht.Token closingTag = node.closingTag;
-      if (closingTag != null) {
-        Location location = _createLocationForToken(closingTag);
-        _store.recordRelationship(
-            element,
-            IndexConstants.ANGULAR_CLOSING_TAG_REFERENCE,
-            location);
-      }
-    }
-    return super.visitXmlTagNode(node);
-  }
-
-  Location _createLocationForIdentifier(SimpleIdentifier identifier) =>
-      new Location(_htmlUnitElement, identifier.offset, identifier.length);
-
-  Location _createLocationForToken(ht.Token token) =>
-      new Location(_htmlUnitElement, token.offset, token.length);
-}
-
-
-class _AngularHtmlIndexContributor_forEmbeddedDart extends _IndexContributor {
-  final _AngularHtmlIndexContributor angularContributor;
-
-  _AngularHtmlIndexContributor_forEmbeddedDart(IndexStore store,
-      this.angularContributor)
-      : super(store);
-
-  @override
-  Element peekElement() => angularContributor._htmlUnitElement;
-
-  @override
-  void recordRelationship(Element element, Relationship relationship,
-      Location location) {
-    AngularElement angularElement =
-        AngularHtmlUnitResolver.getAngularElement(element);
-    if (angularElement != null) {
-      element = angularElement;
-      relationship = IndexConstants.ANGULAR_REFERENCE;
-    }
-    super.recordRelationship(element, relationship, location);
-  }
-}
-
-
-/**
- * Recursively visits an [HtmlUnit] and every embedded [Expression].
- */
-abstract class _ExpressionVisitor extends ht.RecursiveXmlVisitor<Object> {
-  /**
-   * Visits the given [Expression]s embedded into tag or attribute.
-   *
-   * [expression] - the [Expression] to visit, not `null`
-   */
-  void visitExpression(Expression expression);
-
-  @override
-  Object visitXmlAttributeNode(ht.XmlAttributeNode node) {
-    _visitExpressions(node.expressions);
-    return super.visitXmlAttributeNode(node);
-  }
-
-  @override
-  Object visitXmlTagNode(ht.XmlTagNode node) {
-    _visitExpressions(node.expressions);
-    return super.visitXmlTagNode(node);
-  }
-
-  /**
-   * Visits [Expression]s of the given [XmlExpression]s.
-   */
-  void _visitExpressions(List<ht.XmlExpression> expressions) {
-    for (ht.XmlExpression xmlExpression in expressions) {
-      if (xmlExpression is AngularXmlExpression) {
-        AngularXmlExpression angularXmlExpression = xmlExpression;
-        List<Expression> dartExpressions =
-            angularXmlExpression.expression.expressions;
-        for (Expression dartExpression in dartExpressions) {
-          visitExpression(dartExpression);
-        }
-      }
-      if (xmlExpression is ht.RawXmlExpression) {
-        ht.RawXmlExpression rawXmlExpression = xmlExpression;
-        visitExpression(rawXmlExpression.expression);
-      }
-    }
-  }
-}
-
-
-/**
  * Visits a resolved AST and adds relationships into [IndexStore].
  */
 class _IndexContributor extends GeneralizingAstVisitor<Object> {
diff --git a/pkg/analysis_server/lib/src/services/index/store/split_store.dart b/pkg/analysis_server/lib/src/services/index/store/split_store.dart
index e816fbb..d16d29a 100644
--- a/pkg/analysis_server/lib/src/services/index/store/split_store.dart
+++ b/pkg/analysis_server/lib/src/services/index/store/split_store.dart
@@ -684,7 +684,10 @@
   @override
   void recordRelationship(Element element, Relationship relationship,
       Location location) {
-    if (element == null || location == null) {
+    if (element == null || element.location == null) {
+      return;
+    }
+    if (location == null) {
       return;
     }
     // special support for UniverseElement
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine.dart b/pkg/analysis_server/lib/src/services/search/search_engine.dart
index 9073be8..87a9127 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine.dart
@@ -27,18 +27,6 @@
  */
 class MatchKind {
   /**
-   * A reference to an Angular element.
-   */
-  static const MatchKind ANGULAR_REFERENCE =
-      const MatchKind('ANGULAR_REFERENCE');
-
-  /**
-   * A reference to an Angular element.
-   */
-  static const MatchKind ANGULAR_CLOSING_TAG_REFERENCE =
-      const MatchKind('ANGULAR_CLOSING_TAG_REFERENCE');
-
-  /**
    * A declaration of an element.
    */
   static const MatchKind DECLARATION = const MatchKind('DECLARATION');
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
index adbab3d..a94aa70 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
@@ -56,14 +56,7 @@
 
   @override
   Future<List<SearchMatch>> searchReferences(Element element) {
-    if (element.kind == ElementKind.ANGULAR_COMPONENT ||
-        element.kind == ElementKind.ANGULAR_CONTROLLER ||
-        element.kind == ElementKind.ANGULAR_FORMATTER ||
-        element.kind == ElementKind.ANGULAR_PROPERTY ||
-        element.kind == ElementKind.ANGULAR_SCOPE_PROPERTY ||
-        element.kind == ElementKind.ANGULAR_SELECTOR) {
-      return _searchReferences_Angular(element as AngularElement);
-    } else if (element.kind == ElementKind.CLASS) {
+    if (element.kind == ElementKind.CLASS) {
       return _searchReferences(element);
     } else if (element.kind == ElementKind.COMPILATION_UNIT) {
       return _searchReferences(element);
@@ -131,19 +124,6 @@
     return requestor.merge();
   }
 
-  Future<List<SearchMatch>> _searchReferences_Angular(AngularElement element) {
-    _Requestor requestor = new _Requestor(_index);
-    requestor.add(
-        element,
-        IndexConstants.ANGULAR_REFERENCE,
-        MatchKind.ANGULAR_REFERENCE);
-    requestor.add(
-        element,
-        IndexConstants.ANGULAR_CLOSING_TAG_REFERENCE,
-        MatchKind.ANGULAR_CLOSING_TAG_REFERENCE);
-    return requestor.merge();
-  }
-
   Future<List<SearchMatch>>
       _searchReferences_Constructor(ConstructorElement constructor) {
     _Requestor requestor = new _Requestor(_index);
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index d6851ec..f2038ec 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -6,13 +6,8 @@
 
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/channel/channel.dart';
-import 'package:analysis_server/src/domain_analysis.dart';
-import 'package:analysis_server/src/domain_completion.dart';
-import 'package:analysis_server/src/domain_execution.dart';
-import 'package:analysis_server/src/domain_server.dart';
-import 'package:analysis_server/src/edit/edit_domain.dart';
+import 'package:analysis_server/src/plugin/server_plugin.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_server/src/search/search_domain.dart';
 import 'package:analysis_server/src/services/index/index.dart';
 import 'package:analysis_server/src/services/index/local_file_index.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
@@ -41,6 +36,7 @@
   final AnalysisServerOptions analysisServerOptions;
   final DirectoryBasedDartSdk defaultSdk;
   final InstrumentationService instrumentationService;
+  final ServerPlugin serverPlugin;
 
   /**
    * The analysis server that was created when a client established a
@@ -49,7 +45,7 @@
   AnalysisServer analysisServer;
 
   SocketServer(this.analysisServerOptions, this.defaultSdk,
-      this.instrumentationService);
+      this.instrumentationService, this.serverPlugin);
 
   /**
    * Create an analysis server which will communicate with the client using the
@@ -84,12 +80,6 @@
    * Initialize the handlers to be used by the given [server].
    */
   void _initializeHandlers(AnalysisServer server) {
-    server.handlers = [
-        new ServerDomainHandler(server),
-        new AnalysisDomainHandler(server),
-        new EditDomainHandler(server),
-        new SearchDomainHandler(server),
-        new CompletionDomainHandler(server),
-        new ExecutionDomainHandler(server),];
+    server.handlers = serverPlugin.createDomains(server);
   }
 }
diff --git a/pkg/analysis_server/lib/starter.dart b/pkg/analysis_server/lib/starter.dart
new file mode 100644
index 0000000..9483fff
--- /dev/null
+++ b/pkg/analysis_server/lib/starter.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.
+
+library driver;
+
+import 'package:analysis_server/plugin/plugin.dart';
+import 'package:analysis_server/src/server/driver.dart';
+import 'package:analyzer/instrumentation/instrumentation.dart';
+
+/**
+ * An object that can be used to start an analysis server.
+ */
+abstract class ServerStarter {
+  /**
+   * Initialize a newly created starter to start up an analysis server.
+   */
+  factory ServerStarter() = Driver;
+
+  /**
+   * Set the instrumentation [server] that is to be used by the analysis server.
+   */
+  void set instrumentationServer(InstrumentationServer server);
+
+  /**
+   * Set the [plugins] that are defined outside the analysis_server package.
+   */
+  void set userDefinedPlugins(List<Plugin> plugins);
+
+  /**
+   * Use the given command-line [arguments] to start this server.
+   */
+  void start(List<String> arguments);
+}
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index 3cf179f..50adbea 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -81,13 +81,6 @@
     resourceResolver = new ResourceUriResolver(provider);
     context = AnalysisEngine.instance.createAnalysisContext();
     context.sourceFactory = new SourceFactory([SDK_RESOLVER, resourceResolver]);
-    {
-      AnalysisOptionsImpl options =
-          new AnalysisOptionsImpl.con1(context.analysisOptions);
-      options.enableAsync = true;
-      options.enableEnum = true;
-      context.analysisOptions = options;
-    }
   }
 
   void tearDown() {
diff --git a/pkg/analysis_server/test/analysis/get_errors_test.dart b/pkg/analysis_server/test/analysis/get_errors_test.dart
index 444f222..eb66da4 100644
--- a/pkg/analysis_server/test/analysis/get_errors_test.dart
+++ b/pkg/analysis_server/test/analysis/get_errors_test.dart
@@ -21,7 +21,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class GetErrorsTest extends AbstractAnalysisTest {
   static const String requestId = 'test-getError';
 
diff --git a/pkg/analysis_server/test/analysis/get_hover_test.dart b/pkg/analysis_server/test/analysis/get_hover_test.dart
index 43a9313..6ee8a48 100644
--- a/pkg/analysis_server/test/analysis/get_hover_test.dart
+++ b/pkg/analysis_server/test/analysis/get_hover_test.dart
@@ -19,7 +19,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class AnalysisHoverTest extends AbstractAnalysisTest {
   Future<HoverInformation> prepareHover(String search) {
     int offset = findOffset(search);
diff --git a/pkg/analysis_server/test/analysis/notification_errors_test.dart b/pkg/analysis_server/test/analysis/notification_errors_test.dart
index 3ff1987..73bca89 100644
--- a/pkg/analysis_server/test/analysis/notification_errors_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_errors_test.dart
@@ -19,7 +19,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class NotificationErrorsTest extends AbstractAnalysisTest {
   Map<String, List<AnalysisError>> filesErrors = {};
 
diff --git a/pkg/analysis_server/test/analysis/notification_highlights_test.dart b/pkg/analysis_server/test/analysis/notification_highlights_test.dart
index 89c8af1..d61c46a 100644
--- a/pkg/analysis_server/test/analysis/notification_highlights_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_highlights_test.dart
@@ -20,7 +20,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class AnalysisNotificationHighlightsTest extends AbstractAnalysisTest {
   List<HighlightRegion> regions;
 
@@ -1017,7 +1017,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class HighlightTypeTest {
   void test_constructor() {
     expect(
diff --git a/pkg/analysis_server/test/analysis/notification_navigation_test.dart b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
index e8aa4c8..0e810d1 100644
--- a/pkg/analysis_server/test/analysis/notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
@@ -20,7 +20,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class AnalysisNotificationNavigationTest extends AbstractAnalysisTest {
   List<NavigationRegion> regions;
   List<NavigationTarget> targets;
diff --git a/pkg/analysis_server/test/analysis/notification_occurrences_test.dart b/pkg/analysis_server/test/analysis/notification_occurrences_test.dart
index 7daf84d..baa29d1 100644
--- a/pkg/analysis_server/test/analysis/notification_occurrences_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_occurrences_test.dart
@@ -20,7 +20,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class AnalysisNotificationOccurrencesTest extends AbstractAnalysisTest {
   List<Occurrences> occurrencesList;
   Occurrences testOccurences;
diff --git a/pkg/analysis_server/test/analysis/notification_outline_test.dart b/pkg/analysis_server/test/analysis/notification_outline_test.dart
index 8cafbf9..b92ec52 100644
--- a/pkg/analysis_server/test/analysis/notification_outline_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_outline_test.dart
@@ -19,7 +19,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class _AnalysisNotificationOutlineTest extends AbstractAnalysisTest {
   Outline outline;
 
diff --git a/pkg/analysis_server/test/analysis/notification_overrides_test.dart b/pkg/analysis_server/test/analysis/notification_overrides_test.dart
index 2c14e32..b9a3157 100644
--- a/pkg/analysis_server/test/analysis/notification_overrides_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_overrides_test.dart
@@ -20,7 +20,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class AnalysisNotificationOverridesTest extends AbstractAnalysisTest {
   List<Override> overridesList;
   Override override;
diff --git a/pkg/analysis_server/test/analysis/reanalyze_test.dart b/pkg/analysis_server/test/analysis/reanalyze_test.dart
index 70b3258..cd3cd0b 100644
--- a/pkg/analysis_server/test/analysis/reanalyze_test.dart
+++ b/pkg/analysis_server/test/analysis/reanalyze_test.dart
@@ -19,7 +19,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ReanalyzeTest extends AbstractAnalysisTest {
   test_reanalyze() {
     createProject();
diff --git a/pkg/analysis_server/test/analysis_abstract.dart b/pkg/analysis_server/test/analysis_abstract.dart
index fffef7c..3cf7602 100644
--- a/pkg/analysis_server/test/analysis_abstract.dart
+++ b/pkg/analysis_server/test/analysis_abstract.dart
@@ -240,8 +240,6 @@
     packageMapProvider = new MockPackageMapProvider();
     Index index = createIndex();
     server = createAnalysisServer(index);
-    server.contextDirectoryManager.defaultOptions.enableAsync = true;
-    server.contextDirectoryManager.defaultOptions.enableEnum = true;
     handler = new AnalysisDomainHandler(server);
     // listen for notifications
     Stream<Notification> notificationStream =
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index 78e92ff..7eb7e6a 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -29,7 +29,7 @@
   runReflectiveTests(AnalysisServerTest);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class AnalysisServerTest {
   MockServerChannel channel;
   AnalysisServer server;
diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart
index 6815aa1..80cf74d 100644
--- a/pkg/analysis_server/test/context_manager_test.dart
+++ b/pkg/analysis_server/test/context_manager_test.dart
@@ -25,7 +25,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ContextManagerTest {
   TestContextManager manager;
   MemoryResourceProvider resourceProvider;
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index 3489e67..651fd72 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -150,20 +150,6 @@
         var response = handler.handleRequest(request);
         expect(response, isResponseSuccess('0'));
       });
-      // TODO(paulberry): disabled because analyzeAngular is currently not in
-      // the API.
-//      test('valid', () {
-//        engine.AnalysisOptions oldOptions = server.contextDirectoryManager.defaultOptions;
-//        bool analyzeAngular = !oldOptions.analyzeAngular;
-//        bool enableDeferredLoading = oldOptions.enableDeferredLoading;
-//        var newOptions = new AnalysisOptions(analyzeAngular: analyzeAngular,
-//            enableDeferredLoading: enableDeferredLoading, enableEnums: false);
-//        var request = new AnalysisUpdateOptionsParams(newOptions).toRequest('0');
-//        var response = handler.handleRequest(request);
-//        expect(response, isResponseSuccess('0'));
-//        expect(oldOptions.analyzeAngular, equals(analyzeAngular));
-//        expect(oldOptions.enableDeferredLoading, equals(enableDeferredLoading));
-//      });
     });
   });
 }
@@ -366,7 +352,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class AnalysisDomainTest extends AbstractAnalysisTest {
   Map<String, List<AnalysisError>> filesErrors = {};
 
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index 365ae51..f6650cf 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -13,6 +13,7 @@
 import 'package:analysis_server/src/domain_completion.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/services/completion/completion_manager.dart';
+import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analysis_server/src/services/index/index.dart' show Index;
 import 'package:analysis_server/src/services/index/local_memory_index.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
@@ -35,7 +36,7 @@
   runReflectiveTests(CompletionTest);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class CompletionManagerTest extends AbstractAnalysisTest {
   AnalysisDomainHandler analysisDomain;
   Test_CompletionDomainHandler completionDomain;
@@ -241,7 +242,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class CompletionTest extends AbstractAnalysisTest {
   String completionId;
   int completionOffset;
@@ -261,7 +262,7 @@
   }
 
   void assertHasResult(CompletionSuggestionKind kind, String completion,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT, bool isDeprecated
+      [int relevance = COMPLETION_RELEVANCE_DEFAULT, bool isDeprecated
       = false, bool isPotential = false]) {
     var cs;
     suggestions.forEach((s) {
@@ -444,11 +445,11 @@
       assertHasResult(
           CompletionSuggestionKind.KEYWORD,
           'import',
-          CompletionRelevance.HIGH);
+          COMPLETION_RELEVANCE_HIGH);
       assertHasResult(
           CompletionSuggestionKind.KEYWORD,
           'class',
-          CompletionRelevance.HIGH);
+          COMPLETION_RELEVANCE_HIGH);
     });
   }
 
diff --git a/pkg/analysis_server/test/edit/assists_test.dart b/pkg/analysis_server/test/edit/assists_test.dart
index 152ebbb..190d165 100644
--- a/pkg/analysis_server/test/edit/assists_test.dart
+++ b/pkg/analysis_server/test/edit/assists_test.dart
@@ -20,7 +20,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class AssistsTest extends AbstractAnalysisTest {
   List<SourceChange> changes;
 
diff --git a/pkg/analysis_server/test/edit/fixes_test.dart b/pkg/analysis_server/test/edit/fixes_test.dart
index be666fe..2fd66e9 100644
--- a/pkg/analysis_server/test/edit/fixes_test.dart
+++ b/pkg/analysis_server/test/edit/fixes_test.dart
@@ -20,7 +20,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class FixesTest extends AbstractAnalysisTest {
   @override
   void setUp() {
diff --git a/pkg/analysis_server/test/edit/format_test.dart b/pkg/analysis_server/test/edit/format_test.dart
new file mode 100644
index 0000000..b61d378
--- /dev/null
+++ b/pkg/analysis_server/test/edit/format_test.dart
@@ -0,0 +1,77 @@
+// 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.edit.format;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/edit/edit_domain.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:unittest/unittest.dart' hide ERROR;
+
+import '../analysis_abstract.dart';
+import '../reflective_tests.dart';
+
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(FormatTest);
+}
+
+
+@reflectiveTest
+class FormatTest extends AbstractAnalysisTest {
+  @override
+  void setUp() {
+    super.setUp();
+    createProject();
+    handler = new EditDomainHandler(server);
+  }
+
+  Future test_formatSimple() {
+    addTestFile('''
+main() { int x = 3; }
+''');
+    return waitForTasksFinished().then((_) {
+
+      EditFormatResult formatResult = _formatAt(0, 3);
+
+      expect(formatResult.edits, isNotNull);
+      expect(formatResult.edits, hasLength(1));
+
+      SourceEdit edit = formatResult.edits[0];
+      expect(edit.replacement, equals('''
+main() {
+  int x = 3;
+}
+'''));
+      expect(formatResult.selectionOffset, equals(0));
+      expect(formatResult.selectionLength, equals(3));
+    });
+  }
+
+  Future test_formatNoOp() {
+    // Already formatted source
+    addTestFile('''
+main() {
+  int x = 3;
+}
+''');
+    return waitForTasksFinished().then((_) {
+      EditFormatResult formatResult = _formatAt(0, 3);
+      expect(formatResult.edits, isNotNull);
+      expect(formatResult.edits, hasLength(0));
+    });
+  }
+
+  EditFormatResult _formatAt(int selectionOffset, int selectionLength) {
+    Request request = new EditFormatParams(
+        testFile,
+        selectionOffset,
+        selectionLength).toRequest('0');
+    Response response = handleSuccessfulRequest(request);
+    return new EditFormatResult.fromResponse(response);
+  }
+
+}
diff --git a/pkg/analysis_server/test/edit/refactoring_test.dart b/pkg/analysis_server/test/edit/refactoring_test.dart
index 9f4fa11..1de0f55 100644
--- a/pkg/analysis_server/test/edit/refactoring_test.dart
+++ b/pkg/analysis_server/test/edit/refactoring_test.dart
@@ -30,7 +30,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ConvertGetterMethodToMethodTest extends _AbstractGetRefactoring_Test {
   test_function() {
     addTestFile('''
@@ -126,7 +126,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ConvertMethodToGetterTest extends _AbstractGetRefactoring_Test {
   test_function() {
     addTestFile('''
@@ -240,7 +240,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ExtractLocalVariableTest extends _AbstractGetRefactoring_Test {
   Future<Response> sendExtractRequest(int offset, int length, String name,
       bool extractAll) {
@@ -411,7 +411,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ExtractMethodTest extends _AbstractGetRefactoring_Test {
   int offset;
   int length;
@@ -624,7 +624,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class GetAvailableRefactoringsTest extends AbstractAnalysisTest {
   /**
    * Tests that there is a RENAME refactoring available at the [search] offset.
@@ -805,7 +805,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class InlineLocalTest extends _AbstractGetRefactoring_Test {
   test_feedback() {
     addTestFile('''
@@ -867,7 +867,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class InlineMethodTest extends _AbstractGetRefactoring_Test {
   InlineMethodOptions options = new InlineMethodOptions(true, true);
 
@@ -994,7 +994,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class MoveFileTest extends _AbstractGetRefactoring_Test {
   MoveFileOptions options = new MoveFileOptions(null);
 
@@ -1026,7 +1026,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class RenameTest extends _AbstractGetRefactoring_Test {
   Future<Response> sendRenameRequest(String search, String newName,
       [bool validateOnly = false]) {
@@ -1580,7 +1580,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class _AbstractGetRefactoring_Test extends AbstractAnalysisTest {
   /**
    * Asserts that [problems] has a single ERROR problem.
diff --git a/pkg/analysis_server/test/edit/sort_members_test.dart b/pkg/analysis_server/test/edit/sort_members_test.dart
index 48aea78..5e0756e 100644
--- a/pkg/analysis_server/test/edit/sort_members_test.dart
+++ b/pkg/analysis_server/test/edit/sort_members_test.dart
@@ -21,7 +21,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class SortMembersTest extends AbstractAnalysisTest {
   SourceFileEdit fileEdit;
 
diff --git a/pkg/analysis_server/test/edit/test_all.dart b/pkg/analysis_server/test/edit/test_all.dart
index a109570..40e83f1 100644
--- a/pkg/analysis_server/test/edit/test_all.dart
+++ b/pkg/analysis_server/test/edit/test_all.dart
@@ -8,6 +8,7 @@
 
 import 'assists_test.dart' as assists_test;
 import 'fixes_test.dart' as fixes_test;
+import 'format_test.dart' as format_test;
 import 'refactoring_test.dart' as refactoring_test;
 import 'sort_members_test.dart' as sort_members_test;
 
@@ -19,6 +20,7 @@
   group('edit', () {
     assists_test.main();
     fixes_test.main();
+    format_test.main();
     refactoring_test.main();
     sort_members_test.main();
   });
diff --git a/pkg/analysis_server/test/integration/analysis/error_test.dart b/pkg/analysis_server/test/integration/analysis/error_test.dart
index cee4dfc..1a067f4 100644
--- a/pkg/analysis_server/test/integration/analysis/error_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/error_test.dart
@@ -14,7 +14,7 @@
   runReflectiveTests(AnalysisErrorIntegrationTest);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class AnalysisErrorIntegrationTest extends AbstractAnalysisServerIntegrationTest
     {
   test_detect_simple_error() {
diff --git a/pkg/analysis_server/test/integration/analysis/get_errors_after_analysis_test.dart b/pkg/analysis_server/test/integration/analysis/get_errors_after_analysis_test.dart
index 6fc12f4..6a1a582 100644
--- a/pkg/analysis_server/test/integration/analysis/get_errors_after_analysis_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_errors_after_analysis_test.dart
@@ -11,7 +11,7 @@
   runReflectiveTests(Test);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class Test extends AnalysisDomainGetErrorsTest {
   Test() : super(true);
 }
diff --git a/pkg/analysis_server/test/integration/analysis/get_errors_before_analysis_test.dart b/pkg/analysis_server/test/integration/analysis/get_errors_before_analysis_test.dart
index 52e6a91..a0920ca 100644
--- a/pkg/analysis_server/test/integration/analysis/get_errors_before_analysis_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_errors_before_analysis_test.dart
@@ -11,7 +11,7 @@
   runReflectiveTests(Test);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class Test extends AnalysisDomainGetErrorsTest {
   Test() : super(false);
 }
diff --git a/pkg/analysis_server/test/integration/analysis/get_hover_test.dart b/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
index 0356b81..965a37f 100644
--- a/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
@@ -17,7 +17,7 @@
   runReflectiveTests(AnalysisGetHoverIntegrationTest);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class AnalysisGetHoverIntegrationTest extends
     AbstractAnalysisServerIntegrationTest {
   /**
diff --git a/pkg/analysis_server/test/integration/analysis/highlights_test.dart b/pkg/analysis_server/test/integration/analysis/highlights_test.dart
index ba7bc77..f588501 100644
--- a/pkg/analysis_server/test/integration/analysis/highlights_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/highlights_test.dart
@@ -14,7 +14,7 @@
   runReflectiveTests(AnalysisHighlightsTest);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class AnalysisHighlightsTest extends AbstractAnalysisServerIntegrationTest {
   test_highlights() {
     String pathname = sourcePath('test.dart');
diff --git a/pkg/analysis_server/test/integration/analysis/navigation_test.dart b/pkg/analysis_server/test/integration/analysis/navigation_test.dart
index 17d3633..e22e83e 100644
--- a/pkg/analysis_server/test/integration/analysis/navigation_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/navigation_test.dart
@@ -14,7 +14,7 @@
   runReflectiveTests(AnalysisNavigationTest);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class AnalysisNavigationTest extends AbstractAnalysisServerIntegrationTest {
   test_navigation() {
     String pathname1 = sourcePath('test1.dart');
diff --git a/pkg/analysis_server/test/integration/analysis/occurrences_test.dart b/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
index 826b061..1be1784 100644
--- a/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
@@ -14,7 +14,7 @@
   runReflectiveTests(Test);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class Test extends AbstractAnalysisServerIntegrationTest {
   test_occurrences() {
     String pathname = sourcePath('test.dart');
diff --git a/pkg/analysis_server/test/integration/analysis/outline_test.dart b/pkg/analysis_server/test/integration/analysis/outline_test.dart
index 3597835..4a0adea 100644
--- a/pkg/analysis_server/test/integration/analysis/outline_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/outline_test.dart
@@ -14,7 +14,7 @@
   runReflectiveTests(Test);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class Test extends AbstractAnalysisServerIntegrationTest {
   /**
    * Verify that the range of source text covered by the given outline objects
diff --git a/pkg/analysis_server/test/integration/analysis/overrides_test.dart b/pkg/analysis_server/test/integration/analysis/overrides_test.dart
index 05ede74..4c28d7f 100644
--- a/pkg/analysis_server/test/integration/analysis/overrides_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/overrides_test.dart
@@ -14,7 +14,7 @@
   runReflectiveTests(Test);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class Test extends AbstractAnalysisServerIntegrationTest {
   test_overrides() {
     String pathname = sourcePath('test.dart');
diff --git a/pkg/analysis_server/test/integration/analysis/package_root_test.dart b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
index c101417..964e533 100644
--- a/pkg/analysis_server/test/integration/analysis/package_root_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
@@ -15,7 +15,7 @@
   runReflectiveTests(Test);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class Test extends AbstractAnalysisServerIntegrationTest {
   test_package_root() {
     String projPath = sourcePath('project');
diff --git a/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart b/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
index 25e8a4c..242ed66 100644
--- a/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
@@ -19,7 +19,7 @@
   runReflectiveTests(Test);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class Test extends AbstractAnalysisServerIntegrationTest {
   test_reanalyze_concurrent() {
     String pathname = sourcePath('test.dart');
diff --git a/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart b/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
index 88c7b80..59df3ed 100644
--- a/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
@@ -14,7 +14,7 @@
   runReflectiveTests(Test);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class Test extends AbstractAnalysisServerIntegrationTest {
   test_reanalyze() {
     String pathname = sourcePath('test.dart');
diff --git a/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart b/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
index d91a5b0..7a8f10b 100644
--- a/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
@@ -14,7 +14,7 @@
   runReflectiveTests(Test);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class Test extends AbstractAnalysisServerIntegrationTest {
   test_updateContent_list() {
     String pathname = sourcePath('test.dart');
diff --git a/pkg/analysis_server/test/integration/analysis/update_content_test.dart b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
index ec6d696..169c42b 100644
--- a/pkg/analysis_server/test/integration/analysis/update_content_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
@@ -14,7 +14,7 @@
   runReflectiveTests(Test);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class Test extends AbstractAnalysisServerIntegrationTest {
   test_updateContent() {
     String pathname = sourcePath('test.dart');
diff --git a/pkg/analysis_server/test/integration/asynchrony_test.dart b/pkg/analysis_server/test/integration/asynchrony_test.dart
index 0194fac..ad4cd07 100644
--- a/pkg/analysis_server/test/integration/asynchrony_test.dart
+++ b/pkg/analysis_server/test/integration/asynchrony_test.dart
@@ -24,7 +24,7 @@
  * Once enough commands have been sent, we begin reading from the server's
  * output buffer, and verify that it responds to the last command.
  */
-@ReflectiveTestCase()
+@reflectiveTest
 class AsynchronyIntegrationTest {
   /**
    * Number of messages to queue up before listening for responses.
diff --git a/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart b/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
index 0c28360..d0ee85e 100644
--- a/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
+++ b/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
@@ -15,7 +15,7 @@
   runReflectiveTests(Test);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class Test extends AbstractAnalysisServerIntegrationTest {
   fail_test_getSuggestions_string_var() {
     // See dartbug.com/20188
diff --git a/pkg/analysis_server/test/integration/integration_test_methods.dart b/pkg/analysis_server/test/integration/integration_test_methods.dart
index 1d91b21..db72218 100644
--- a/pkg/analysis_server/test/integration/integration_test_methods.dart
+++ b/pkg/analysis_server/test/integration/integration_test_methods.dart
@@ -1018,6 +1018,11 @@
    * the original as possible, but whitespace at the beginning or end of the
    * selected region will be ignored.
    *
+   * If a request is made for a file which does not exist, or which is not
+   * currently subject to analysis (e.g. because it is not associated with any
+   * analysis root specified to analysis.setAnalysisRoots), an error of type
+   * FORMAT_INVALID_FILE will be generated.
+   *
    * Parameters
    *
    * file ( FilePath )
diff --git a/pkg/analysis_server/test/integration/protocol_matchers.dart b/pkg/analysis_server/test/integration/protocol_matchers.dart
index e348826..32970af3 100644
--- a/pkg/analysis_server/test/integration/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/protocol_matchers.dart
@@ -957,11 +957,10 @@
  * AnalysisErrorType
  *
  * enum {
- *   ANGULAR
  *   CHECKED_MODE_COMPILE_TIME_ERROR
  *   COMPILE_TIME_ERROR
  *   HINT
- *   POLYMER
+ *   LINT
  *   STATIC_TYPE_WARNING
  *   STATIC_WARNING
  *   SYNTACTIC_ERROR
@@ -969,11 +968,10 @@
  * }
  */
 final Matcher isAnalysisErrorType = new MatchesEnum("AnalysisErrorType", [
-  "ANGULAR",
   "CHECKED_MODE_COMPILE_TIME_ERROR",
   "COMPILE_TIME_ERROR",
   "HINT",
-  "POLYMER",
+  "LINT",
   "STATIC_TYPE_WARNING",
   "STATIC_WARNING",
   "SYNTACTIC_ERROR",
@@ -989,6 +987,7 @@
  *   "enableEnums": optional bool
  *   "generateDart2jsHints": optional bool
  *   "generateHints": optional bool
+ *   "generateLints": optional bool
  * }
  */
 final Matcher isAnalysisOptions = new LazyMatcher(() => new MatchesJsonObject(
@@ -997,7 +996,8 @@
     "enableDeferredLoading": isBool,
     "enableEnums": isBool,
     "generateDart2jsHints": isBool,
-    "generateHints": isBool
+    "generateHints": isBool,
+    "generateLints": isBool
   }));
 
 /**
@@ -1060,26 +1060,11 @@
 final Matcher isCompletionId = isString;
 
 /**
- * CompletionRelevance
- *
- * enum {
- *   LOW
- *   DEFAULT
- *   HIGH
- * }
- */
-final Matcher isCompletionRelevance = new MatchesEnum("CompletionRelevance", [
-  "LOW",
-  "DEFAULT",
-  "HIGH"
-]);
-
-/**
  * CompletionSuggestion
  *
  * {
  *   "kind": CompletionSuggestionKind
- *   "relevance": CompletionRelevance
+ *   "relevance": int
  *   "completion": String
  *   "selectionOffset": int
  *   "selectionLength": int
@@ -1101,7 +1086,7 @@
 final Matcher isCompletionSuggestion = new LazyMatcher(() => new MatchesJsonObject(
   "CompletionSuggestion", {
     "kind": isCompletionSuggestionKind,
-    "relevance": isCompletionRelevance,
+    "relevance": isInt,
     "completion": isString,
     "selectionOffset": isInt,
     "selectionLength": isInt,
@@ -1789,6 +1774,7 @@
  *
  * enum {
  *   CONTENT_MODIFIED
+ *   FORMAT_INVALID_FILE
  *   GET_ERRORS_INVALID_FILE
  *   INVALID_OVERLAY_CHANGE
  *   INVALID_PARAMETER
@@ -1804,6 +1790,7 @@
  */
 final Matcher isRequestErrorCode = new MatchesEnum("RequestErrorCode", [
   "CONTENT_MODIFIED",
+  "FORMAT_INVALID_FILE",
   "GET_ERRORS_INVALID_FILE",
   "INVALID_OVERLAY_CHANGE",
   "INVALID_PARAMETER",
diff --git a/pkg/analysis_server/test/integration/search/get_type_hierarchy_test.dart b/pkg/analysis_server/test/integration/search/get_type_hierarchy_test.dart
index 3b2c087..7838290 100644
--- a/pkg/analysis_server/test/integration/search/get_type_hierarchy_test.dart
+++ b/pkg/analysis_server/test/integration/search/get_type_hierarchy_test.dart
@@ -61,7 +61,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class Test extends AbstractAnalysisServerIntegrationTest {
   /**
    * Pathname of the main file to run tests in.
diff --git a/pkg/analysis_server/test/integration/server/get_version_test.dart b/pkg/analysis_server/test/integration/server/get_version_test.dart
index 61dcfe5..779aff1 100644
--- a/pkg/analysis_server/test/integration/server/get_version_test.dart
+++ b/pkg/analysis_server/test/integration/server/get_version_test.dart
@@ -11,7 +11,7 @@
   runReflectiveTests(Test);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class Test extends AbstractAnalysisServerIntegrationTest {
   test_getVersion() {
     return sendServerGetVersion();
diff --git a/pkg/analysis_server/test/integration/server/set_subscriptions_invalid_service_test.dart b/pkg/analysis_server/test/integration/server/set_subscriptions_invalid_service_test.dart
index d3d9890..4804ea1 100644
--- a/pkg/analysis_server/test/integration/server/set_subscriptions_invalid_service_test.dart
+++ b/pkg/analysis_server/test/integration/server/set_subscriptions_invalid_service_test.dart
@@ -13,7 +13,7 @@
   runReflectiveTests(Test);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class Test extends AbstractAnalysisServerIntegrationTest {
   test_setSubscriptions_invalidService() {
     // TODO(paulberry): verify that if an invalid service is specified, the
diff --git a/pkg/analysis_server/test/integration/server/set_subscriptions_test.dart b/pkg/analysis_server/test/integration/server/set_subscriptions_test.dart
index 56be8b5..55c740a 100644
--- a/pkg/analysis_server/test/integration/server/set_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/server/set_subscriptions_test.dart
@@ -16,7 +16,7 @@
   runReflectiveTests(Test);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class Test extends AbstractAnalysisServerIntegrationTest {
   test_setSubscriptions() {
     bool statusReceived = false;
diff --git a/pkg/analysis_server/test/integration/server/shutdown_test.dart b/pkg/analysis_server/test/integration/server/shutdown_test.dart
index ab556b7..09c4fe4 100644
--- a/pkg/analysis_server/test/integration/server/shutdown_test.dart
+++ b/pkg/analysis_server/test/integration/server/shutdown_test.dart
@@ -15,7 +15,7 @@
   runReflectiveTests(Test);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class Test extends AbstractAnalysisServerIntegrationTest {
   test_shutdown() {
     return sendServerShutdown().then((_) {
diff --git a/pkg/analysis_server/test/integration/server/status_test.dart b/pkg/analysis_server/test/integration/server/status_test.dart
index 85c9fb3..4b1b86e 100644
--- a/pkg/analysis_server/test/integration/server/status_test.dart
+++ b/pkg/analysis_server/test/integration/server/status_test.dart
@@ -16,7 +16,7 @@
   runReflectiveTests(Test);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class Test extends AbstractAnalysisServerIntegrationTest {
   test_status() {
     // After we kick off analysis, we should get one server.status message with
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index 003ea4c..49c2d03 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -14,7 +14,6 @@
 import 'package:analysis_server/src/operation/operation.dart';
 import 'package:analysis_server/src/operation/operation_analysis.dart';
 import 'package:analysis_server/src/protocol.dart' hide Element, ElementKind;
-import 'package:analysis_server/src/services/index/index.dart';
 import 'package:analyzer/file_system/file_system.dart' as resource;
 import 'package:analyzer/file_system/memory_file_system.dart' as resource;
 import 'package:analyzer/source/package_map_provider.dart';
@@ -331,7 +330,7 @@
   }
 
   @override
-  void updateIndex(Index index, List<ChangeNotice> notices) {
+  void updateIndex(AnalysisServer server, List<ChangeNotice> notices) {
   }
 }
 
diff --git a/pkg/analysis_server/test/operation/test_all.dart b/pkg/analysis_server/test/operation/test_all.dart
index 7df43c4..ca3c425 100644
--- a/pkg/analysis_server/test/operation/test_all.dart
+++ b/pkg/analysis_server/test/operation/test_all.dart
@@ -2,6 +2,8 @@
 // for 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.operation.all;
+
 import 'package:unittest/unittest.dart';
 
 import 'operation_queue_test.dart' as operation_queue_test;
diff --git a/pkg/analysis_server/test/plugin/plugin_impl_test.dart b/pkg/analysis_server/test/plugin/plugin_impl_test.dart
new file mode 100644
index 0000000..779c2ca
--- /dev/null
+++ b/pkg/analysis_server/test/plugin/plugin_impl_test.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 test.operation;
+
+import 'package:analysis_server/plugin/plugin.dart';
+import 'package:analysis_server/src/plugin/plugin_impl.dart';
+import 'package:unittest/unittest.dart';
+
+main() {
+  groupSep = ' | ';
+
+  group('ExtensionManager', () {
+    test('processPlugins', () {
+      TestPlugin plugin1 = new TestPlugin('plugin1');
+      TestPlugin plugin2 = new TestPlugin('plugin1');
+      ExtensionManager manager = new ExtensionManager();
+      manager.processPlugins([plugin1, plugin2]);
+      expect(plugin1.extensionPointsRegistered, true);
+      expect(plugin1.extensionsRegistered, true);
+      expect(plugin2.extensionPointsRegistered, true);
+      expect(plugin2.extensionsRegistered, true);
+    });
+
+    test('registerExtension - valid', () {
+      Plugin plugin = new TestPlugin('plugin');
+      ExtensionManager manager = new ExtensionManager();
+      ExtensionPoint point =
+          manager.registerExtensionPoint(plugin, 'point', null);
+      expect(point, isNotNull);
+      Object extension = 'extension';
+      manager.registerExtension('plugin.point', extension);
+      List<Object> extensions = point.extensions;
+      expect(extensions, isNotNull);
+      expect(extensions, hasLength(1));
+      expect(extensions[0], extension);
+    });
+
+    test('registerExtension - non existent', () {
+      ExtensionManager manager = new ExtensionManager();
+      expect(
+          () => manager.registerExtension('does not exist', 'extension'),
+          throwsA(new isInstanceOf<ExtensionError>()));
+      ;
+    });
+
+    test('registerExtensionPoint - non-conflicting', () {
+      Plugin plugin1 = new TestPlugin('plugin1');
+      Plugin plugin2 = new TestPlugin('plugin2');
+      ExtensionManager manager = new ExtensionManager();
+      expect(
+          manager.registerExtensionPoint(plugin1, 'point1', null),
+          isNotNull);
+      expect(
+          manager.registerExtensionPoint(plugin1, 'point2', null),
+          isNotNull);
+      expect(
+          manager.registerExtensionPoint(plugin2, 'point1', null),
+          isNotNull);
+      expect(
+          manager.registerExtensionPoint(plugin2, 'point2', null),
+          isNotNull);
+    });
+
+    test('registerExtensionPoint - conflicting - same plugin', () {
+      Plugin plugin1 = new TestPlugin('plugin1');
+      ExtensionManager manager = new ExtensionManager();
+      expect(
+          manager.registerExtensionPoint(plugin1, 'point1', null),
+          isNotNull);
+      expect(
+          () => manager.registerExtensionPoint(plugin1, 'point1', null),
+          throwsA(new isInstanceOf<ExtensionError>()));
+    });
+
+    test('registerExtensionPoint - conflicting - different plugins', () {
+      Plugin plugin1 = new TestPlugin('plugin1');
+      Plugin plugin2 = new TestPlugin('plugin1');
+      ExtensionManager manager = new ExtensionManager();
+      expect(
+          manager.registerExtensionPoint(plugin1, 'point1', null),
+          isNotNull);
+      expect(
+          () => manager.registerExtensionPoint(plugin2, 'point1', null),
+          throwsA(new isInstanceOf<ExtensionError>()));
+    });
+  });
+
+  group('ExtensionPointImpl', () {
+    test('extensions - empty', () {
+      Plugin plugin = new TestPlugin('plugin');
+      ExtensionPointImpl point = new ExtensionPointImpl(plugin, 'point', null);
+      List<Object> extensions = point.extensions;
+      expect(extensions, isNotNull);
+      expect(extensions, isEmpty);
+    });
+
+    test('uniqueIdentifier', () {
+      Plugin plugin = new TestPlugin('plugin');
+      ExtensionPointImpl point = new ExtensionPointImpl(plugin, 'point', null);
+      expect(point.uniqueIdentifier, 'plugin.point');
+    });
+
+    test('add - single', () {
+      Plugin plugin = new TestPlugin('plugin');
+      ExtensionPointImpl point = new ExtensionPointImpl(plugin, 'point', null);
+      Object extension = 'extension';
+      point.add(extension);
+      List<Object> extensions = point.extensions;
+      expect(extensions, isNotNull);
+      expect(extensions, hasLength(1));
+      expect(extensions[0], extension);
+    });
+
+    test('add - multiple', () {
+      Plugin plugin = new TestPlugin('plugin');
+      ExtensionPointImpl point = new ExtensionPointImpl(plugin, 'point', null);
+      point.add('extension 1');
+      point.add('extension 2');
+      point.add('extension 3');
+      List<Object> extensions = point.extensions;
+      expect(extensions, isNotNull);
+      expect(extensions, hasLength(3));
+    });
+
+    test('add - with validator - valid', () {
+      Plugin plugin = new TestPlugin('plugin');
+      ExtensionPointImpl point =
+          new ExtensionPointImpl(plugin, 'point', (Object extension) {
+        if (extension is! String) {
+          throw new ExtensionError('');
+        }
+      });
+      point.add('extension');
+    });
+
+    test('add - with validator - invalid', () {
+      Plugin plugin = new TestPlugin('plugin');
+      ExtensionPointImpl point =
+          new ExtensionPointImpl(plugin, 'point', (Object extension) {
+        if (extension is! String) {
+          throw new ExtensionError('');
+        }
+      });
+      expect(() => point.add(1), throwsA(new isInstanceOf<ExtensionError>()));
+    });
+  });
+}
+
+/**
+ * A simple plugin that can be used by tests.
+ */
+class TestPlugin extends Plugin {
+  /**
+   * A flag indicating whether the method [registerExtensionPoints] has been
+   * invoked.
+   */
+  bool extensionPointsRegistered = false;
+
+  /**
+   * A flag indicating whether the method [registerExtensions] has been invoked.
+   */
+  bool extensionsRegistered = false;
+
+  @override
+  String uniqueIdentifier;
+
+  /**
+   * Initialize a newly created plugin to have the given identifier.
+   */
+  TestPlugin(this.uniqueIdentifier);
+
+  @override
+  void registerExtensionPoints(RegisterExtensionPoint register) {
+    extensionPointsRegistered = true;
+  }
+
+  @override
+  void registerExtensions(RegisterExtension register) {
+    extensionsRegistered = true;
+  }
+}
diff --git a/pkg/analysis_server/test/plugin/test_all.dart b/pkg/analysis_server/test/plugin/test_all.dart
new file mode 100644
index 0000000..e8b0ce3
--- /dev/null
+++ b/pkg/analysis_server/test/plugin/test_all.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.
+
+library test.plugin.all;
+
+import 'package:unittest/unittest.dart';
+
+import 'plugin_impl_test.dart' as plugin_impl;
+
+/**
+ * Utility for manually running all tests.
+ */
+main() {
+  groupSep = ' | ';
+  group('plugins', () {
+    plugin_impl.main();
+  });
+}
diff --git a/pkg/analysis_server/test/protocol_server_test.dart b/pkg/analysis_server/test/protocol_server_test.dart
index 1de407e..f806f50 100644
--- a/pkg/analysis_server/test/protocol_server_test.dart
+++ b/pkg/analysis_server/test/protocol_server_test.dart
@@ -36,7 +36,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class AnalysisErrorTest {
   engine.Source source = new MockSource();
   engine.LineInfo lineInfo;
@@ -115,7 +115,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ElementKindTest {
   void test_fromEngine() {
     expect(
@@ -163,9 +163,6 @@
     expect(
         newElementKind_fromEngine(engine.ElementKind.TYPE_PARAMETER),
         ElementKind.TYPE_PARAMETER);
-    expect(
-        newElementKind_fromEngine(engine.ElementKind.ANGULAR_COMPONENT),
-        ElementKind.UNKNOWN);
   }
 
   void test_string_constructor() {
@@ -219,7 +216,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ElementTest extends AbstractContextTest {
   engine.Element findElementInUnit(engine.CompilationUnit unit, String name,
       [engine.ElementKind kind]) {
@@ -307,10 +304,33 @@
       expect(location.startColumn, 16);
     }
     expect(element.parameters, isNull);
-    expect(element.returnType, isNull);
+    expect(element.returnType, 'dynamic');
     expect(element.flags, Element.FLAG_CONST | Element.FLAG_STATIC);
   }
 
+  void test_fromElement_FUNCTION_TYPE_ALIAS() {
+    engine.Source source = addSource('/test.dart', '''
+typedef int f(String x);
+''');
+    engine.CompilationUnit unit = resolveLibraryUnit(source);
+    engine.FunctionTypeAliasElement engineElement = findElementInUnit(unit, 'f');
+    // create notification Element
+    Element element = newElement_fromEngine(engineElement);
+    expect(element.kind, ElementKind.FUNCTION_TYPE_ALIAS);
+    expect(element.name, 'f');
+    {
+      Location location = element.location;
+      expect(location.file, '/test.dart');
+      expect(location.offset, 12);
+      expect(location.length, 'f'.length);
+      expect(location.startLine, 1);
+      expect(location.startColumn, 13);
+    }
+    expect(element.parameters, '(String x)');
+    expect(element.returnType, 'int');
+    expect(element.flags, 0);
+  }
+
   void test_fromElement_GETTER() {
     engine.Source source = addSource('/test.dart', '''
 class A {
@@ -416,7 +436,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class EnumTest {
   void test_AnalysisErrorSeverity() {
     new EnumTester<engine.ErrorSeverity, AnalysisErrorSeverity>().run(
@@ -438,14 +458,6 @@
         newElementKind_fromEngine,
         exceptions: {
       // TODO(paulberry): do any of the exceptions below constitute bugs?
-      engine.ElementKind.ANGULAR_FORMATTER: ElementKind.UNKNOWN,
-      engine.ElementKind.ANGULAR_COMPONENT: ElementKind.UNKNOWN,
-      engine.ElementKind.ANGULAR_CONTROLLER: ElementKind.UNKNOWN,
-      engine.ElementKind.ANGULAR_DIRECTIVE: ElementKind.UNKNOWN,
-      engine.ElementKind.ANGULAR_PROPERTY: ElementKind.UNKNOWN,
-      engine.ElementKind.ANGULAR_SCOPE_PROPERTY: ElementKind.UNKNOWN,
-      engine.ElementKind.ANGULAR_SELECTOR: ElementKind.UNKNOWN,
-      engine.ElementKind.ANGULAR_VIEW: ElementKind.UNKNOWN,
       engine.ElementKind.DYNAMIC: ElementKind.UNKNOWN,
       engine.ElementKind.EMBEDDED_HTML_SCRIPT: ElementKind.UNKNOWN,
       engine.ElementKind.ERROR: ElementKind.UNKNOWN,
@@ -454,9 +466,6 @@
       engine.ElementKind.HTML: ElementKind.UNKNOWN,
       engine.ElementKind.IMPORT: ElementKind.UNKNOWN,
       engine.ElementKind.NAME: ElementKind.UNKNOWN,
-      engine.ElementKind.POLYMER_ATTRIBUTE: ElementKind.UNKNOWN,
-      engine.ElementKind.POLYMER_TAG_DART: ElementKind.UNKNOWN,
-      engine.ElementKind.POLYMER_TAG_HTML: ElementKind.UNKNOWN,
       engine.ElementKind.UNIVERSE: ElementKind.UNKNOWN
     });
   }
@@ -465,12 +474,7 @@
     // TODO(paulberry): why does the MatchKind class exist at all?  Can't we
     // use SearchResultKind inside the analysis server?
     new EnumTester<MatchKind, SearchResultKind>().run(
-        newSearchResultKind_fromEngine,
-        exceptions: {
-      // TODO(paulberry): do any of the exceptions below constitute bugs?
-      MatchKind.ANGULAR_REFERENCE: SearchResultKind.UNKNOWN,
-      MatchKind.ANGULAR_CLOSING_TAG_REFERENCE: SearchResultKind.UNKNOWN
-    });
+        newSearchResultKind_fromEngine);
   }
 }
 
diff --git a/pkg/analysis_server/test/protocol_test.dart b/pkg/analysis_server/test/protocol_test.dart
index 189d871..e4bcb21 100644
--- a/pkg/analysis_server/test/protocol_test.dart
+++ b/pkg/analysis_server/test/protocol_test.dart
@@ -25,7 +25,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class InvalidParameterResponseMatcher extends Matcher {
   static const String ERROR_CODE = 'INVALID_PARAMETER';
 
@@ -54,7 +54,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class NotificationTest {
   void test_fromJson() {
     Notification original = new Notification('foo');
@@ -101,7 +101,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class RequestErrorTest {
   void test_create() {
     RequestError error =
@@ -141,7 +141,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class RequestTest {
   void test_fromJson() {
     Request original = new Request('one', 'aMethod');
@@ -207,7 +207,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ResponseTest {
   void test_create_invalidRequestFormat() {
     Response response = new Response.invalidRequestFormat();
diff --git a/pkg/analysis_server/test/reflective_tests.dart b/pkg/analysis_server/test/reflective_tests.dart
index 2730680..80c9073 100644
--- a/pkg/analysis_server/test/reflective_tests.dart
+++ b/pkg/analysis_server/test/reflective_tests.dart
@@ -4,7 +4,7 @@
 
 library reflective_tests;
 
-@MirrorsUsed(metaTargets: 'ReflectiveTestCase')
+@MirrorsUsed(metaTargets: 'ReflectiveTest')
 import 'dart:mirrors';
 import 'dart:async';
 
@@ -31,10 +31,10 @@
   ClassMirror classMirror = reflectClass(type);
   if (!classMirror.metadata.any(
       (InstanceMirror annotation) =>
-          annotation.type.reflectedType == ReflectiveTestCase)) {
+          annotation.type.reflectedType == ReflectiveTest)) {
     String name = MirrorSystem.getName(classMirror.qualifiedName);
     throw new Exception(
-        'Class $name must have annotation "@ReflectiveTestCase()" '
+        'Class $name must have annotation "@reflectiveTest" '
             'in order to be run by runReflectiveTests.');
   }
   String className = MirrorSystem.getName(classMirror.simpleName);
@@ -124,6 +124,12 @@
  * A marker annotation used to instruct dart2js to keep reflection information
  * for the annotated classes.
  */
-class ReflectiveTestCase {
-  const ReflectiveTestCase();
+class ReflectiveTest {
+  const ReflectiveTest();
 }
+
+/**
+ * A marker annotation used to instruct dart2js to keep reflection information
+ * for the annotated classes.
+ */
+const ReflectiveTest reflectiveTest = const ReflectiveTest();
diff --git a/pkg/analysis_server/test/search/element_references_test.dart b/pkg/analysis_server/test/search/element_references_test.dart
index 8c67fc9..8081178 100644
--- a/pkg/analysis_server/test/search/element_references_test.dart
+++ b/pkg/analysis_server/test/search/element_references_test.dart
@@ -19,7 +19,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ElementReferencesTest extends AbstractSearchDomainTest {
   Element searchElement;
 
@@ -40,6 +40,7 @@
       searchId = result.id;
       searchElement = result.element;
       results.clear();
+      searchDone = false;
       if (searchId == null) {
         return null;
       } else {
@@ -189,22 +190,21 @@
   a.fff = 10;
 }
 ''');
-    var forGetter = findElementReferences('fff =>', false).then((_) {
+    return findElementReferences('fff =>', false).then((_) {
       expect(searchElement.kind, ElementKind.FIELD);
       expect(results, hasLength(4));
       assertHasResult(SearchResultKind.READ, 'fff); // in m()');
       assertHasResult(SearchResultKind.WRITE, 'fff = 1;');
       assertHasResult(SearchResultKind.READ, 'fff); // in main()');
       assertHasResult(SearchResultKind.WRITE, 'fff = 10;');
-    });
-    var forSetter = findElementReferences('fff(x) {}', false).then((_) {
+      return findElementReferences('fff(x) {}', false);
+    }).then((_) {
       expect(results, hasLength(4));
       assertHasResult(SearchResultKind.READ, 'fff); // in m()');
       assertHasResult(SearchResultKind.WRITE, 'fff = 1;');
       assertHasResult(SearchResultKind.READ, 'fff); // in main()');
       assertHasResult(SearchResultKind.WRITE, 'fff = 10;');
     });
-    return Future.wait([forGetter, forSetter]);
   }
 
   test_field_inFormalParameter() {
@@ -678,18 +678,17 @@
   vvv = 1;
 }
 ''');
-    var forGetter = findElementReferences('vvv =>', false).then((_) {
+    return findElementReferences('vvv =>', false).then((_) {
       expect(searchElement.kind, ElementKind.TOP_LEVEL_VARIABLE);
       expect(results, hasLength(2));
       assertHasResult(SearchResultKind.READ, 'vvv);');
       assertHasResult(SearchResultKind.WRITE, 'vvv = 1;');
-    });
-    var forSetter = findElementReferences('vvv(x) {}', false).then((_) {
+      return findElementReferences('vvv(x) {}', false);
+    }).then((_) {
       expect(results, hasLength(2));
       assertHasResult(SearchResultKind.READ, 'vvv);');
       assertHasResult(SearchResultKind.WRITE, 'vvv = 1;');
     });
-    return Future.wait([forGetter, forSetter]);
   }
 
   test_typeReference_class() {
diff --git a/pkg/analysis_server/test/search/member_declarations_test.dart b/pkg/analysis_server/test/search/member_declarations_test.dart
index d38a7ac..2fb7946 100644
--- a/pkg/analysis_server/test/search/member_declarations_test.dart
+++ b/pkg/analysis_server/test/search/member_declarations_test.dart
@@ -19,7 +19,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class MemberDeclarationsTest extends AbstractSearchDomainTest {
   void assertHasDeclaration(ElementKind kind, String className) {
     result = findTopLevelResult(kind, className);
diff --git a/pkg/analysis_server/test/search/member_references_test.dart b/pkg/analysis_server/test/search/member_references_test.dart
index b9b1ef14..e2d1caa 100644
--- a/pkg/analysis_server/test/search/member_references_test.dart
+++ b/pkg/analysis_server/test/search/member_references_test.dart
@@ -19,7 +19,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class MemberReferencesTest extends AbstractSearchDomainTest {
   void assertHasRef(SearchResultKind kind, String search, bool isPotential) {
     assertHasResult(kind, search);
diff --git a/pkg/analysis_server/test/search/search_result_test.dart b/pkg/analysis_server/test/search/search_result_test.dart
index f64b68e..74dc0d5 100644
--- a/pkg/analysis_server/test/search/search_result_test.dart
+++ b/pkg/analysis_server/test/search/search_result_test.dart
@@ -17,7 +17,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class SearchResultKindTest {
   void test_fromEngine() {
     expect(
diff --git a/pkg/analysis_server/test/search/top_level_declarations_test.dart b/pkg/analysis_server/test/search/top_level_declarations_test.dart
index df4929b..26ec55a 100644
--- a/pkg/analysis_server/test/search/top_level_declarations_test.dart
+++ b/pkg/analysis_server/test/search/top_level_declarations_test.dart
@@ -19,7 +19,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class TopLevelDeclarationsTest extends AbstractSearchDomainTest {
   void assertHasDeclaration(ElementKind kind, String name) {
     result = findTopLevelResult(kind, name);
diff --git a/pkg/analysis_server/test/search/type_hierarchy_test.dart b/pkg/analysis_server/test/search/type_hierarchy_test.dart
index d598a01..c2d2bad 100644
--- a/pkg/analysis_server/test/search/type_hierarchy_test.dart
+++ b/pkg/analysis_server/test/search/type_hierarchy_test.dart
@@ -22,7 +22,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class GetTypeHierarchyTest extends AbstractAnalysisTest {
   static const String requestId = 'test-getTypeHierarchy';
 
diff --git a/pkg/analysis_server/test/services/completion/arglist_computer_test.dart b/pkg/analysis_server/test/services/completion/arglist_computer_test.dart
index 9eb0635..d200d08 100644
--- a/pkg/analysis_server/test/services/completion/arglist_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/arglist_computer_test.dart
@@ -16,7 +16,7 @@
   runReflectiveTests(ArgListComputerTest);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ArgListComputerTest extends AbstractCompletionTest {
 
   @override
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 ffe483e..281a5fa 100644
--- a/pkg/analysis_server/test/services/completion/combinator_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/combinator_computer_test.dart
@@ -6,6 +6,7 @@
 
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/services/completion/combinator_computer.dart';
+import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:unittest/unittest.dart';
 
 import '../../reflective_tests.dart';
@@ -16,7 +17,7 @@
   runReflectiveTests(CombinatorComputerTest);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class CombinatorComputerTest extends AbstractCompletionTest {
 
   @override
@@ -61,26 +62,26 @@
     return computeFull((bool result) {
       assertSuggestClass(
           'A',
-          CompletionRelevance.DEFAULT,
+          COMPLETION_RELEVANCE_DEFAULT,
           CompletionSuggestionKind.IDENTIFIER);
       assertSuggestClass(
           'B',
-          CompletionRelevance.DEFAULT,
+          COMPLETION_RELEVANCE_DEFAULT,
           CompletionSuggestionKind.IDENTIFIER);
       assertSuggestClass(
           'PB',
-          CompletionRelevance.DEFAULT,
+          COMPLETION_RELEVANCE_DEFAULT,
           CompletionSuggestionKind.IDENTIFIER);
       assertSuggestTopLevelVar(
           'T1',
           null,
-          CompletionRelevance.DEFAULT,
+          COMPLETION_RELEVANCE_DEFAULT,
           CompletionSuggestionKind.IDENTIFIER);
       assertSuggestFunction(
           'F1',
           'PB',
           false,
-          CompletionRelevance.DEFAULT,
+          COMPLETION_RELEVANCE_DEFAULT,
           CompletionSuggestionKind.IDENTIFIER);
       assertNotSuggested('C');
       assertNotSuggested('D');
@@ -114,36 +115,36 @@
     return computeFull((bool result) {
       assertSuggestClass(
           'A',
-          CompletionRelevance.DEFAULT,
+          COMPLETION_RELEVANCE_DEFAULT,
           CompletionSuggestionKind.IDENTIFIER);
       assertSuggestClass(
           'B',
-          CompletionRelevance.DEFAULT,
+          COMPLETION_RELEVANCE_DEFAULT,
           CompletionSuggestionKind.IDENTIFIER);
       assertSuggestClass(
           'PB',
-          CompletionRelevance.DEFAULT,
+          COMPLETION_RELEVANCE_DEFAULT,
           CompletionSuggestionKind.IDENTIFIER);
       assertSuggestTopLevelVar(
           'T1',
           null,
-          CompletionRelevance.DEFAULT,
+          COMPLETION_RELEVANCE_DEFAULT,
           CompletionSuggestionKind.IDENTIFIER);
       assertSuggestFunction(
           'F1',
           'PB',
           false,
-          CompletionRelevance.DEFAULT,
+          COMPLETION_RELEVANCE_DEFAULT,
           CompletionSuggestionKind.IDENTIFIER);
       assertSuggestClass(
           'Clz',
-          CompletionRelevance.DEFAULT,
+          COMPLETION_RELEVANCE_DEFAULT,
           CompletionSuggestionKind.IDENTIFIER);
       assertSuggestFunctionTypeAlias(
           'F2',
           null,
           false,
-          CompletionRelevance.DEFAULT,
+          COMPLETION_RELEVANCE_DEFAULT,
           CompletionSuggestionKind.IDENTIFIER);
       assertNotSuggested('C');
       assertNotSuggested('D');
diff --git a/pkg/analysis_server/test/services/completion/completion_computer_test.dart b/pkg/analysis_server/test/services/completion/completion_computer_test.dart
index 217a11d..f4f03ef 100644
--- a/pkg/analysis_server/test/services/completion/completion_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/completion_computer_test.dart
@@ -39,7 +39,7 @@
   return new Future.delayed(Duration.ZERO, () => pumpEventQueue(times - 1));
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class DartCompletionManagerTest extends AbstractSingleUnitTest {
   Index index;
   SearchEngineImpl searchEngine;
@@ -68,7 +68,7 @@
     manager = new DartCompletionManager.create(context, searchEngine, source);
     suggestion1 = new CompletionSuggestion(
         CompletionSuggestionKind.INVOCATION,
-        CompletionRelevance.DEFAULT,
+        COMPLETION_RELEVANCE_DEFAULT,
         "suggestion1",
         1,
         1,
@@ -76,7 +76,7 @@
         false);
     suggestion2 = new CompletionSuggestion(
         CompletionSuggestionKind.IDENTIFIER,
-        CompletionRelevance.DEFAULT,
+        COMPLETION_RELEVANCE_DEFAULT,
         "suggestion2",
         2,
         2,
diff --git a/pkg/analysis_server/test/services/completion/completion_manager_test.dart b/pkg/analysis_server/test/services/completion/completion_manager_test.dart
index fef6789..7981038 100644
--- a/pkg/analysis_server/test/services/completion/completion_manager_test.dart
+++ b/pkg/analysis_server/test/services/completion/completion_manager_test.dart
@@ -17,7 +17,7 @@
   runReflectiveTests(CompletionManagerTest);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class CompletionManagerTest extends AbstractContextTest {
   var perf = new CompletionPerformance();
 
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 2adf4a7..a6ce671 100644
--- a/pkg/analysis_server/test/services/completion/completion_test_util.dart
+++ b/pkg/analysis_server/test/services/completion/completion_test_util.dart
@@ -71,6 +71,13 @@
         new CompletionPerformance());
   }
 
+  void assertHasNoParameterInfo(CompletionSuggestion suggestion) {
+    expect(suggestion.parameterNames, isNull);
+    expect(suggestion.parameterTypes, isNull);
+    expect(suggestion.requiredParameterCount, isNull);
+    expect(suggestion.hasNamedParameters, isNull);
+  }
+
   void assertNoSuggestions({CompletionSuggestionKind kind: null}) {
     if (kind == null) {
       if (request.suggestions.length > 0) {
@@ -98,17 +105,18 @@
 
   CompletionSuggestion assertSuggest(String completion,
       {CompletionSuggestionKind csKind: CompletionSuggestionKind.INVOCATION,
-      CompletionRelevance relevance: CompletionRelevance.DEFAULT,
-      protocol.ElementKind elemKind: null, bool isDeprecated: false, bool isPotential:
-      false}) {
+      int relevance: COMPLETION_RELEVANCE_DEFAULT, protocol.ElementKind elemKind:
+      null, bool isDeprecated: false, bool isPotential: false}) {
     CompletionSuggestion cs =
         getSuggest(completion: completion, csKind: csKind, elemKind: elemKind);
     if (cs == null) {
-      failedCompletion('expected $completion $csKind', request.suggestions);
+      failedCompletion(
+          'expected $completion $csKind $elemKind',
+          request.suggestions);
     }
     expect(cs.kind, equals(csKind));
     if (isDeprecated) {
-      expect(cs.relevance, equals(CompletionRelevance.LOW));
+      expect(cs.relevance, equals(COMPLETION_RELEVANCE_LOW));
     } else {
       expect(cs.relevance, equals(relevance));
     }
@@ -131,7 +139,7 @@
         paramTypes,
         cs.parameterNames,
         cs.parameterTypes);
-    expect(cs.relevance, CompletionRelevance.HIGH);
+    expect(cs.relevance, COMPLETION_RELEVANCE_HIGH);
   }
 
   void assertSuggestArgumentList_params(List<String> expectedNames,
@@ -162,9 +170,9 @@
     fail(msg.toString());
   }
 
-  CompletionSuggestion assertSuggestClass(String name,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
-      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
+  CompletionSuggestion assertSuggestClass(String name, [int relevance =
+      COMPLETION_RELEVANCE_DEFAULT, CompletionSuggestionKind kind =
+      CompletionSuggestionKind.INVOCATION]) {
     CompletionSuggestion cs =
         assertSuggest(name, csKind: kind, relevance: relevance);
     protocol.Element element = cs.element;
@@ -176,9 +184,9 @@
     return cs;
   }
 
-  CompletionSuggestion assertSuggestClassTypeAlias(String name,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
-      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
+  CompletionSuggestion assertSuggestClassTypeAlias(String name, [int relevance =
+      COMPLETION_RELEVANCE_DEFAULT, CompletionSuggestionKind kind =
+      CompletionSuggestionKind.INVOCATION]) {
     CompletionSuggestion cs =
         assertSuggest(name, csKind: kind, relevance: relevance);
     protocol.Element element = cs.element;
@@ -190,15 +198,36 @@
     return cs;
   }
 
+  CompletionSuggestion assertSuggestField(String name, String type,
+      {int relevance: COMPLETION_RELEVANCE_DEFAULT, CompletionSuggestionKind kind:
+      CompletionSuggestionKind.INVOCATION, bool isDeprecated: false}) {
+    CompletionSuggestion cs = assertSuggest(
+        name,
+        csKind: kind,
+        relevance: relevance,
+        elemKind: protocol.ElementKind.FIELD,
+        isDeprecated: isDeprecated);
+    // The returnType represents the type of a field
+    expect(cs.returnType, type != null ? type : 'dynamic');
+    protocol.Element element = cs.element;
+    expect(element, isNotNull);
+    expect(element.kind, equals(protocol.ElementKind.FIELD));
+    expect(element.name, equals(name));
+    expect(element.parameters, isNull);
+    // The returnType represents the type of a field
+    expect(element.returnType, type != null ? type : 'dynamic');
+    return cs;
+  }
+
   CompletionSuggestion assertSuggestFunction(String name, String returnType,
-      bool isDeprecated, [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
+      [bool isDeprecated = false, int relevance = COMPLETION_RELEVANCE_DEFAULT,
       CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
     CompletionSuggestion cs = assertSuggest(
         name,
         csKind: kind,
         relevance: relevance,
         isDeprecated: isDeprecated);
-    expect(cs.returnType, equals(returnType));
+    expect(cs.returnType, returnType != null ? returnType : 'dynamic');
     protocol.Element element = cs.element;
     expect(element, isNotNull);
     expect(element.kind, equals(protocol.ElementKind.FUNCTION));
@@ -215,15 +244,15 @@
   }
 
   CompletionSuggestion assertSuggestFunctionTypeAlias(String name,
-      String returnType, bool isDeprecated, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT, CompletionSuggestionKind kind =
+      String returnType, bool isDeprecated, [int relevance =
+      COMPLETION_RELEVANCE_DEFAULT, CompletionSuggestionKind kind =
       CompletionSuggestionKind.INVOCATION]) {
     CompletionSuggestion cs = assertSuggest(
         name,
         csKind: kind,
         relevance: relevance,
         isDeprecated: isDeprecated);
-    expect(cs.returnType, equals(returnType));
+    expect(cs.returnType, returnType != null ? returnType : 'dynamic');
     protocol.Element element = cs.element;
     expect(element, isNotNull);
     expect(element.kind, equals(protocol.ElementKind.FUNCTION_TYPE_ALIAS));
@@ -242,16 +271,15 @@
   }
 
   CompletionSuggestion assertSuggestGetter(String name, String returnType,
-      {CompletionRelevance relevance: CompletionRelevance.DEFAULT,
-      CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
-      bool isDeprecated: false}) {
+      {int relevance: COMPLETION_RELEVANCE_DEFAULT, CompletionSuggestionKind kind:
+      CompletionSuggestionKind.INVOCATION, bool isDeprecated: false}) {
     CompletionSuggestion cs = assertSuggest(
         name,
         csKind: kind,
         relevance: relevance,
         elemKind: protocol.ElementKind.GETTER,
         isDeprecated: isDeprecated);
-    expect(cs.returnType, equals(returnType));
+    expect(cs.returnType, returnType != null ? returnType : 'dynamic');
     protocol.Element element = cs.element;
     expect(element, isNotNull);
     expect(element.kind, equals(protocol.ElementKind.GETTER));
@@ -265,9 +293,25 @@
     return cs;
   }
 
-  CompletionSuggestion assertSuggestLibraryPrefix(String prefix,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
-      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
+  CompletionSuggestion assertSuggestLabel(String name, [int relevance =
+      COMPLETION_RELEVANCE_DEFAULT, CompletionSuggestionKind kind =
+      CompletionSuggestionKind.IDENTIFIER]) {
+    CompletionSuggestion cs =
+        assertSuggest(name, csKind: kind, relevance: relevance);
+    expect(cs.returnType, isNull);
+    protocol.Element element = cs.element;
+    expect(element, isNotNull);
+    expect(element.flags, 0);
+    expect(element.kind, equals(protocol.ElementKind.LABEL));
+    expect(element.name, equals(name));
+    expect(element.parameters, isNull);
+    expect(element.returnType, isNull);
+    return cs;
+  }
+
+  CompletionSuggestion assertSuggestLibraryPrefix(String prefix, [int relevance
+      = COMPLETION_RELEVANCE_DEFAULT, CompletionSuggestionKind kind =
+      CompletionSuggestionKind.INVOCATION]) {
     // Library prefix should only be suggested by ImportedComputer
     if (computer is ImportedComputer) {
       CompletionSuggestion cs =
@@ -284,21 +328,19 @@
   }
 
   CompletionSuggestion assertSuggestLocalVariable(String name,
-      String returnType, [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
+      String returnType, [int relevance = COMPLETION_RELEVANCE_DEFAULT,
       CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
     // Local variables should only be suggested by LocalComputer
     if (computer is LocalComputer) {
       CompletionSuggestion cs =
           assertSuggest(name, csKind: kind, relevance: relevance);
-      expect(cs.returnType, equals(returnType));
+      expect(cs.returnType, returnType != null ? returnType : 'dynamic');
       protocol.Element element = cs.element;
       expect(element, isNotNull);
       expect(element.kind, equals(protocol.ElementKind.LOCAL_VARIABLE));
       expect(element.name, equals(name));
       expect(element.parameters, isNull);
-      expect(
-          element.returnType,
-          equals(returnType != null ? returnType : 'dynamic'));
+      expect(element.returnType, returnType != null ? returnType : 'dynamic');
       return cs;
     } else {
       return assertNotSuggested(name);
@@ -306,12 +348,12 @@
   }
 
   CompletionSuggestion assertSuggestMethod(String name, String declaringType,
-      String returnType, [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
+      String returnType, [int relevance = COMPLETION_RELEVANCE_DEFAULT,
       CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
     CompletionSuggestion cs =
         assertSuggest(name, csKind: kind, relevance: relevance);
     expect(cs.declaringType, equals(declaringType));
-    expect(cs.returnType, equals(returnType));
+    expect(cs.returnType, returnType != null ? returnType : 'dynamic');
     protocol.Element element = cs.element;
     expect(element, isNotNull);
     expect(element.kind, equals(protocol.ElementKind.METHOD));
@@ -320,14 +362,12 @@
     expect(param, isNotNull);
     expect(param[0], equals('('));
     expect(param[param.length - 1], equals(')'));
-    expect(
-        element.returnType,
-        equals(returnType != null ? returnType : 'dynamic'));
+    expect(element.returnType, returnType != null ? returnType : 'dynamic');
     return cs;
   }
 
   CompletionSuggestion assertSuggestNamedConstructor(String name,
-      String returnType, [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
+      String returnType, [int relevance = COMPLETION_RELEVANCE_DEFAULT,
       CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
     if (computer is InvocationComputer) {
       CompletionSuggestion cs =
@@ -348,13 +388,13 @@
   }
 
   CompletionSuggestion assertSuggestParameter(String name, String returnType,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
-      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
+      [int relevance = COMPLETION_RELEVANCE_DEFAULT, CompletionSuggestionKind kind =
+      CompletionSuggestionKind.INVOCATION]) {
     // Parameters should only be suggested by LocalComputer
     if (computer is LocalComputer) {
       CompletionSuggestion cs =
           assertSuggest(name, csKind: kind, relevance: relevance);
-      expect(cs.returnType, equals(returnType));
+      expect(cs.returnType, returnType != null ? returnType : 'dynamic');
       protocol.Element element = cs.element;
       expect(element, isNotNull);
       expect(element.kind, equals(protocol.ElementKind.PARAMETER));
@@ -369,9 +409,9 @@
     }
   }
 
-  CompletionSuggestion assertSuggestSetter(String name,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
-      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
+  CompletionSuggestion assertSuggestSetter(String name, [int relevance =
+      COMPLETION_RELEVANCE_DEFAULT, CompletionSuggestionKind kind =
+      CompletionSuggestionKind.INVOCATION]) {
     CompletionSuggestion cs = assertSuggest(
         name,
         csKind: kind,
@@ -391,25 +431,22 @@
   }
 
   CompletionSuggestion assertSuggestTopLevelVar(String name, String returnType,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
-      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
+      [int relevance = COMPLETION_RELEVANCE_DEFAULT, CompletionSuggestionKind kind =
+      CompletionSuggestionKind.INVOCATION]) {
     CompletionSuggestion cs =
         assertSuggest(name, csKind: kind, relevance: relevance);
-    expect(cs.returnType, equals(returnType));
+    expect(cs.returnType, returnType != null ? returnType : 'dynamic');
     protocol.Element element = cs.element;
     expect(element, isNotNull);
     expect(element.kind, equals(protocol.ElementKind.TOP_LEVEL_VARIABLE));
     expect(element.name, equals(name));
     expect(element.parameters, isNull);
-    //TODO (danrubel) return type level variable 'type' but not as 'returnType'
-//    expect(
-//        element.returnType,
-//        equals(returnType != null ? returnType : 'dynamic'));
+    expect(element.returnType, returnType != null ? returnType : 'dynamic');
     return cs;
   }
 
   void assertSuggestTopLevelVarGetterSetter(String name, String returnType,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+      [int relevance = COMPLETION_RELEVANCE_DEFAULT]) {
     if (computer is ImportedComputer) {
       assertSuggestGetter(name, returnType);
       assertSuggestSetter(name);
@@ -567,8 +604,8 @@
   }
 
   CompletionSuggestion assertLocalSuggestMethod(String name,
-      String declaringType, String returnType, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
+      String declaringType, String returnType, [int relevance =
+      COMPLETION_RELEVANCE_DEFAULT]) {
     if (computer is LocalComputer) {
       return assertSuggestMethod(name, declaringType, returnType, relevance);
     } else {
@@ -576,9 +613,9 @@
     }
   }
 
-  CompletionSuggestion assertSuggestImportedClass(String name,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
-      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
+  CompletionSuggestion assertSuggestImportedClass(String name, [int relevance =
+      COMPLETION_RELEVANCE_DEFAULT, CompletionSuggestionKind kind =
+      CompletionSuggestionKind.INVOCATION]) {
     if (computer is ImportedComputer) {
       return assertSuggestClass(name, relevance, kind);
     } else {
@@ -586,9 +623,14 @@
     }
   }
 
+  CompletionSuggestion assertSuggestImportedField(String name, String type,
+      [int relevance = COMPLETION_RELEVANCE_DEFAULT]) {
+    return assertNotSuggested(name);
+  }
+
   CompletionSuggestion assertSuggestImportedFunction(String name,
-      String returnType, [bool isDeprecated = false, CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT, CompletionSuggestionKind kind =
+      String returnType, [bool isDeprecated = false, int relevance =
+      COMPLETION_RELEVANCE_DEFAULT, CompletionSuggestionKind kind =
       CompletionSuggestionKind.INVOCATION]) {
     if (computer is ImportedComputer) {
       return assertSuggestFunction(
@@ -603,8 +645,8 @@
   }
 
   CompletionSuggestion assertSuggestImportedFunctionTypeAlias(String name,
-      String returnType, [bool isDeprecated = false, CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT, CompletionSuggestionKind kind =
+      String returnType, [bool isDeprecated = false, int relevance =
+      COMPLETION_RELEVANCE_DEFAULT, CompletionSuggestionKind kind =
       CompletionSuggestionKind.INVOCATION]) {
     if (computer is ImportedComputer) {
       return assertSuggestFunctionTypeAlias(
@@ -619,8 +661,7 @@
   }
 
   CompletionSuggestion assertSuggestImportedGetter(String name,
-      String returnType, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
+      String returnType, [int relevance = COMPLETION_RELEVANCE_DEFAULT]) {
     if (computer is ImportedComputer) {
       return assertSuggestGetter(name, returnType, relevance: relevance);
     } else {
@@ -629,8 +670,8 @@
   }
 
   CompletionSuggestion assertSuggestImportedMethod(String name,
-      String declaringType, String returnType, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
+      String declaringType, String returnType, [int relevance =
+      COMPLETION_RELEVANCE_DEFAULT]) {
     if (computer is ImportedComputer) {
       return assertSuggestMethod(name, declaringType, returnType, relevance);
     } else {
@@ -638,8 +679,17 @@
     }
   }
 
+  CompletionSuggestion assertSuggestImportedSetter(String name, [int relevance =
+      COMPLETION_RELEVANCE_DEFAULT]) {
+    if (computer is ImportedComputer) {
+      return assertSuggestSetter(name, relevance);
+    } else {
+      return assertNotSuggested(name);
+    }
+  }
+
   CompletionSuggestion assertSuggestImportedTopLevelVar(String name,
-      String returnType, [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
+      String returnType, [int relevance = COMPLETION_RELEVANCE_DEFAULT,
       CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
     if (computer is ImportedComputer) {
       return assertSuggestTopLevelVar(name, returnType, relevance, kind);
@@ -648,8 +698,8 @@
     }
   }
 
-  CompletionSuggestion assertSuggestInvocationClass(String name,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+  CompletionSuggestion assertSuggestInvocationClass(String name, [int relevance
+      = COMPLETION_RELEVANCE_DEFAULT]) {
     if (computer is InvocationComputer) {
       return assertSuggestClass(name, relevance);
     } else {
@@ -657,8 +707,13 @@
     }
   }
 
+  CompletionSuggestion assertSuggestInvocationField(String name, String type,
+      {int relevance: COMPLETION_RELEVANCE_DEFAULT, bool isDeprecated: false}) {
+    return assertNotSuggested(name);
+  }
+
   CompletionSuggestion assertSuggestInvocationGetter(String name,
-      String returnType, {CompletionRelevance relevance: CompletionRelevance.DEFAULT,
+      String returnType, {int relevance: COMPLETION_RELEVANCE_DEFAULT,
       bool isDeprecated: false}) {
     if (computer is InvocationComputer) {
       return assertSuggestGetter(
@@ -672,8 +727,8 @@
   }
 
   CompletionSuggestion assertSuggestInvocationMethod(String name,
-      String declaringType, String returnType, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
+      String declaringType, String returnType, [int relevance =
+      COMPLETION_RELEVANCE_DEFAULT]) {
     if (computer is InvocationComputer) {
       return assertSuggestMethod(name, declaringType, returnType, relevance);
     } else {
@@ -681,8 +736,8 @@
     }
   }
 
-  CompletionSuggestion assertSuggestInvocationSetter(String name,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+  CompletionSuggestion assertSuggestInvocationSetter(String name, [int relevance
+      = COMPLETION_RELEVANCE_DEFAULT]) {
     if (computer is InvocationComputer) {
       return assertSuggestSetter(name);
     } else {
@@ -691,8 +746,7 @@
   }
 
   CompletionSuggestion assertSuggestInvocationTopLevelVar(String name,
-      String returnType, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
+      String returnType, [int relevance = COMPLETION_RELEVANCE_DEFAULT]) {
     if (computer is InvocationComputer) {
       return assertSuggestTopLevelVar(name, returnType, relevance);
     } else {
@@ -700,8 +754,8 @@
     }
   }
 
-  CompletionSuggestion assertSuggestLocalClass(String name,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+  CompletionSuggestion assertSuggestLocalClass(String name, [int relevance =
+      COMPLETION_RELEVANCE_DEFAULT]) {
     if (computer is LocalComputer) {
       return assertSuggestClass(name, relevance);
     } else {
@@ -710,7 +764,7 @@
   }
 
   CompletionSuggestion assertSuggestLocalClassTypeAlias(String name,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+      [int relevance = COMPLETION_RELEVANCE_DEFAULT]) {
     if (computer is LocalComputer) {
       return assertSuggestClassTypeAlias(name, relevance);
     } else {
@@ -718,9 +772,14 @@
     }
   }
 
+  CompletionSuggestion assertSuggestLocalField(String name, String type,
+      [int relevance = COMPLETION_RELEVANCE_DEFAULT]) {
+    return assertNotSuggested(name);
+  }
+
   CompletionSuggestion assertSuggestLocalFunction(String name,
-      String returnType, [bool isDeprecated = false, CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
+      String returnType, [bool isDeprecated = false, int relevance =
+      COMPLETION_RELEVANCE_DEFAULT]) {
     if (computer is LocalComputer) {
       return assertSuggestFunction(name, returnType, isDeprecated, relevance);
     } else {
@@ -729,8 +788,8 @@
   }
 
   CompletionSuggestion assertSuggestLocalFunctionTypeAlias(String name,
-      String returnType, [bool isDeprecated = false, CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
+      String returnType, [bool isDeprecated = false, int relevance =
+      COMPLETION_RELEVANCE_DEFAULT]) {
     if (computer is LocalComputer) {
       return assertSuggestFunctionTypeAlias(
           name,
@@ -743,7 +802,7 @@
   }
 
   CompletionSuggestion assertSuggestLocalGetter(String name, String returnType,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+      [int relevance = COMPLETION_RELEVANCE_DEFAULT]) {
     if (computer is LocalComputer) {
       return assertSuggestGetter(name, returnType, relevance: relevance);
     } else {
@@ -752,8 +811,8 @@
   }
 
   CompletionSuggestion assertSuggestLocalMethod(String name,
-      String declaringType, String returnType, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
+      String declaringType, String returnType, [int relevance =
+      COMPLETION_RELEVANCE_DEFAULT]) {
     if (computer is LocalComputer) {
       return assertSuggestMethod(name, declaringType, returnType, relevance);
     } else {
@@ -761,8 +820,8 @@
     }
   }
 
-  CompletionSuggestion assertSuggestLocalSetter(String name,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+  CompletionSuggestion assertSuggestLocalSetter(String name, [int relevance =
+      COMPLETION_RELEVANCE_DEFAULT]) {
     if (computer is LocalComputer) {
       return assertSuggestSetter(name, relevance);
     } else {
@@ -771,8 +830,7 @@
   }
 
   CompletionSuggestion assertSuggestLocalTopLevelVar(String name,
-      String returnType, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
+      String returnType, [int relevance = COMPLETION_RELEVANCE_DEFAULT]) {
     if (computer is LocalComputer) {
       return assertSuggestTopLevelVar(name, returnType, relevance);
     } else {
@@ -780,9 +838,9 @@
     }
   }
 
-  CompletionSuggestion assertSuggestNonLocalClass(String name,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
-      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
+  CompletionSuggestion assertSuggestNonLocalClass(String name, [int relevance =
+      COMPLETION_RELEVANCE_DEFAULT, CompletionSuggestionKind kind =
+      CompletionSuggestionKind.INVOCATION]) {
     return assertSuggestImportedClass(name, relevance, kind);
   }
 
@@ -1134,26 +1192,26 @@
       assertSuggestImportedClass('C');
       // hidden element suggested as low relevance
       // but imported results are partially filtered
-      //assertSuggestImportedClass('D', CompletionRelevance.LOW);
+      //assertSuggestImportedClass('D', COMPLETION_RELEVANCE_LOW);
       //assertSuggestImportedFunction(
-      //    'D1', null, true, CompletionRelevance.LOW);
+      //    'D1', null, true, COMPLETION_RELEVANCE_LOW);
       assertSuggestLocalFunction('D2', 'Z');
       assertSuggestImportedClass('EE');
       // hidden element suggested as low relevance
-      //assertSuggestImportedClass('F', CompletionRelevance.LOW);
+      //assertSuggestImportedClass('F', COMPLETION_RELEVANCE_LOW);
       assertSuggestLibraryPrefix('g');
       assertNotSuggested('G');
-      //assertSuggestImportedClass('H', CompletionRelevance.LOW);
+      //assertSuggestImportedClass('H', COMPLETION_RELEVANCE_LOW);
       assertSuggestImportedClass('Object');
       assertSuggestImportedFunction('min', 'num', false);
       //assertSuggestImportedFunction(
       //    'max',
       //    'num',
       //    false,
-      //    CompletionRelevance.LOW);
+      //    COMPLETION_RELEVANCE_LOW);
       assertSuggestTopLevelVarGetterSetter('T1', 'String');
       assertNotSuggested('_T2');
-      //assertSuggestImportedTopLevelVar('T3', 'int', CompletionRelevance.LOW);
+      //assertSuggestImportedTopLevelVar('T3', 'int', COMPLETION_RELEVANCE_LOW);
       assertNotSuggested('_T4');
       assertSuggestLocalTopLevelVar('T5', 'int');
       assertSuggestLocalTopLevelVar('_T6', null);
@@ -1213,25 +1271,25 @@
       assertNotSuggested('_B');
       //assertSuggestImportedClass('C');
       // hidden element suggested as low relevance
-      assertSuggestImportedClass('D', CompletionRelevance.LOW);
-      assertSuggestImportedFunction('D1', null, true, CompletionRelevance.LOW);
+      assertSuggestImportedClass('D', COMPLETION_RELEVANCE_LOW);
+      assertSuggestImportedFunction('D1', null, true, COMPLETION_RELEVANCE_LOW);
       assertSuggestLocalFunction('D2', 'Z');
       //assertSuggestImportedClass('EE');
       // hidden element suggested as low relevance
-      //assertSuggestImportedClass('F', CompletionRelevance.LOW);
+      //assertSuggestImportedClass('F', COMPLETION_RELEVANCE_LOW);
       //assertSuggestLibraryPrefix('g');
       assertNotSuggested('G');
-      //assertSuggestImportedClass('H', CompletionRelevance.LOW);
+      //assertSuggestImportedClass('H', COMPLETION_RELEVANCE_LOW);
       //assertSuggestImportedClass('Object');
       //assertSuggestImportedFunction('min', 'num', false);
       //assertSuggestImportedFunction(
       //    'max',
       //    'num',
       //    false,
-      //    CompletionRelevance.LOW);
+      //    COMPLETION_RELEVANCE_LOW);
       //assertSuggestTopLevelVarGetterSetter('T1', 'String');
       assertNotSuggested('_T2');
-      //assertSuggestImportedTopLevelVar('T3', 'int', CompletionRelevance.LOW);
+      //assertSuggestImportedTopLevelVar('T3', 'int', COMPLETION_RELEVANCE_LOW);
       assertNotSuggested('_T4');
       //assertSuggestLocalTopLevelVar('T5', 'int');
       //assertSuggestLocalTopLevelVar('_T6', null);
@@ -1245,7 +1303,7 @@
     // Block  BlockFunctionBody  MethodDeclaration  ClassDeclaration
     addSource('/testB.dart', '''
       lib B;
-      class F { var f1; f2() { } }
+      class F { var f1; f2() { } get f3 => 0; set f4(fx) { } }
       class E extends F { var e1; e2() { } }
       class I { int i1; i2() { } }
       class M { var m1; int m2() { } }''');
@@ -1254,14 +1312,18 @@
       class A extends E implements I with M {a() {^}}''');
     computeFast();
     return computeFull((bool result) {
-      assertSuggestImportedGetter('e1', null);
-      assertSuggestImportedGetter('f1', null);
-      assertSuggestImportedGetter('i1', 'int');
-      assertSuggestImportedGetter('m1', null);
-      //TODO (danrubel) include declared type in suggestion
-      assertSuggestImportedMethod('e2', null, null);
-      assertSuggestImportedMethod('f2', null, null);
-      assertSuggestImportedMethod('i2', null, null);
+      // TODO (danrubel) prefer fields over getters
+      // If add `get e1;` to interface I
+      // then suggestions include getter e1 rather than field e1
+      assertSuggestImportedField('e1', null);
+      assertSuggestImportedField('f1', null);
+      assertSuggestImportedField('i1', 'int');
+      assertSuggestImportedField('m1', null);
+      assertSuggestImportedGetter('f3', null);
+      assertSuggestImportedSetter('f4');
+      assertSuggestImportedMethod('e2', 'E', null);
+      assertSuggestImportedMethod('f2', 'F', null);
+      assertSuggestImportedMethod('i2', 'I', null);
       //assertSuggestImportedMethod('m2', null, null);
       assertNotSuggested('==');
     });
@@ -1270,17 +1332,19 @@
   test_Block_inherited_local() {
     // Block  BlockFunctionBody  MethodDeclaration  ClassDeclaration
     addTestSource('''
-      class F { var f1; f2() { } }
+      class F { var f1; f2() { } get f3 => 0; set f4(fx) { } }
       class E extends F { var e1; e2() { } }
       class I { int i1; i2() { } }
       class M { var m1; int m2() { } }
       class A extends E implements I with M {a() {^}}''');
     computeFast();
     return computeFull((bool result) {
-      assertSuggestLocalGetter('e1', null);
-      assertSuggestLocalGetter('f1', null);
-      assertSuggestLocalGetter('i1', 'int');
-      assertSuggestLocalGetter('m1', null);
+      assertSuggestLocalField('e1', null);
+      assertSuggestLocalField('f1', null);
+      assertSuggestLocalField('i1', 'int');
+      assertSuggestLocalField('m1', null);
+      assertSuggestLocalGetter('f3', null);
+      assertSuggestLocalSetter('f4');
       assertSuggestLocalMethod('e2', 'E', null);
       assertSuggestLocalMethod('f2', 'F', null);
       assertSuggestLocalMethod('i2', 'I', null);
@@ -1301,8 +1365,8 @@
       main() {A a; a.^.z}''');
     computeFast();
     return computeFull((bool result) {
-      assertSuggestInvocationGetter('b', null);
-      assertSuggestInvocationGetter('_c', 'X');
+      assertSuggestInvocationField('b', null);
+      assertSuggestInvocationField('_c', 'X');
       assertNotSuggested('Object');
       assertNotSuggested('A');
       assertNotSuggested('B');
@@ -1323,8 +1387,8 @@
       main() {A a; a..^z}''');
     computeFast();
     return computeFull((bool result) {
-      assertSuggestInvocationGetter('b', null);
-      assertSuggestInvocationGetter('_c', 'X');
+      assertSuggestInvocationField('b', null);
+      assertSuggestInvocationField('_c', 'X');
       assertNotSuggested('Object');
       assertNotSuggested('A');
       assertNotSuggested('B');
@@ -1345,8 +1409,8 @@
       main() {A a; a..^ return}''');
     computeFast();
     return computeFull((bool result) {
-      assertSuggestInvocationGetter('b', null);
-      assertSuggestInvocationGetter('_c', 'X');
+      assertSuggestInvocationField('b', null);
+      assertSuggestInvocationField('_c', 'X');
       assertNotSuggested('Object');
       assertNotSuggested('A');
       assertNotSuggested('B');
@@ -1412,7 +1476,7 @@
     computeFast();
     return computeFull((bool result) {
       CompletionSuggestion suggestionA =
-          assertSuggestLocalClass('A', CompletionRelevance.LOW);
+          assertSuggestLocalClass('A', COMPLETION_RELEVANCE_LOW);
       if (suggestionA != null) {
         expect(suggestionA.element.isDeprecated, isTrue);
         expect(suggestionA.element.isPrivate, isFalse);
@@ -1490,8 +1554,8 @@
       class A {var b; X _c; foo() {A a; if (^) something}}''');
     computeFast();
     return computeFull((bool result) {
-      assertSuggestLocalGetter('b', null);
-      assertSuggestLocalGetter('_c', 'X');
+      assertSuggestLocalField('b', null);
+      assertSuggestLocalField('_c', 'X');
       assertSuggestImportedClass('Object');
       assertSuggestLocalClass('A');
       assertNotSuggested('==');
@@ -1969,7 +2033,7 @@
         expect(methodA.element.isPrivate, isFalse);
       }
       CompletionSuggestion getterF =
-          assertSuggestLocalGetter('f', 'X', CompletionRelevance.LOW);
+          assertSuggestLocalGetter('f', 'X', COMPLETION_RELEVANCE_LOW);
       if (getterF != null) {
         expect(getterF.element.isDeprecated, isTrue);
         expect(getterF.element.isPrivate, isFalse);
@@ -1993,13 +2057,13 @@
         expect(methodA.element.isPrivate, isTrue);
       }
       CompletionSuggestion getterF =
-          assertSuggestLocalGetter('f', 'X', CompletionRelevance.LOW);
+          assertSuggestLocalField('f', 'X', COMPLETION_RELEVANCE_LOW);
       if (getterF != null) {
         expect(getterF.element.isDeprecated, isTrue);
         expect(getterF.element.isPrivate, isFalse);
         expect(getterF.element.parameters, isNull);
       }
-      CompletionSuggestion getterG = assertSuggestLocalGetter('_g', null);
+      CompletionSuggestion getterG = assertSuggestLocalField('_g', null);
       if (getterG != null) {
         expect(getterG.element.isDeprecated, isFalse);
         expect(getterG.element.isPrivate, isTrue);
@@ -2015,7 +2079,7 @@
     computeFast();
     return computeFull((bool result) {
       CompletionSuggestion methodA =
-          assertSuggestLocalMethod('a', 'A', 'Z', CompletionRelevance.LOW);
+          assertSuggestLocalMethod('a', 'A', 'Z', COMPLETION_RELEVANCE_LOW);
       if (methodA != null) {
         expect(methodA.element.isDeprecated, isTrue);
         expect(methodA.element.isPrivate, isFalse);
@@ -2162,9 +2226,9 @@
       main() {A.^}''');
     computeFast();
     return computeFull((bool result) {
-      assertSuggestInvocationGetter('scA', 'String');
-      assertSuggestInvocationGetter('scB', 'int');
-      assertSuggestInvocationGetter('scI', null);
+      assertSuggestInvocationField('scA', 'String');
+      assertSuggestInvocationField('scB', 'int');
+      assertSuggestInvocationField('scI', null);
       assertNotSuggested('b');
       assertNotSuggested('_c');
       assertNotSuggested('d');
@@ -2201,8 +2265,8 @@
       main() {A a; a.^}''');
     computeFast();
     return computeFull((bool result) {
-      assertSuggestInvocationGetter('sc', 'int');
-      assertSuggestInvocationGetter('b', null, isDeprecated: true);
+      assertSuggestInvocationField('sc', 'int');
+      assertSuggestInvocationField('b', null, isDeprecated: true);
       assertNotSuggested('_c');
       assertSuggestInvocationGetter('d', 'X');
       assertNotSuggested('_e');
@@ -2234,9 +2298,9 @@
       class X{}''');
     computeFast();
     return computeFull((bool result) {
-      assertSuggestInvocationGetter('sc', 'int');
-      assertSuggestInvocationGetter('b', null);
-      assertSuggestInvocationGetter('_c', 'X');
+      assertSuggestInvocationField('sc', 'int');
+      assertSuggestInvocationField('b', null);
+      assertSuggestInvocationField('_c', 'X');
       assertSuggestInvocationGetter('d', 'X');
       assertSuggestInvocationGetter('_e', null);
       assertSuggestInvocationGetter('f', 'X');
@@ -2290,7 +2354,7 @@
       foo(X x) {x.^}''');
     computeFast();
     return computeFull((bool result) {
-      assertSuggestInvocationGetter('y', 'M');
+      assertSuggestInvocationField('y', 'M');
       assertNotSuggested('_z');
       assertNotSuggested('==');
     });
@@ -2376,8 +2440,8 @@
       class X{}''');
     computeFast();
     return computeFull((bool result) {
-      assertSuggestInvocationGetter('b', null);
-      assertSuggestInvocationGetter('_c', 'X');
+      assertSuggestInvocationField('b', null);
+      assertSuggestInvocationField('_c', 'X');
       assertSuggestInvocationGetter('d', 'X');
       assertSuggestInvocationGetter('_e', null);
       assertSuggestInvocationGetter('f', 'X');
@@ -2411,8 +2475,8 @@
       class X{}''');
     computeFast();
     return computeFull((bool result) {
-      assertSuggestInvocationGetter('b', null);
-      assertSuggestInvocationGetter('_c', 'X');
+      assertSuggestInvocationField('b', null);
+      assertSuggestInvocationField('_c', 'X');
       assertSuggestInvocationGetter('d', 'X');
       assertSuggestInvocationGetter('_e', null);
       assertSuggestInvocationGetter('f', 'X');
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 c453231..ded6b43 100644
--- a/pkg/analysis_server/test/services/completion/imported_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/imported_computer_test.dart
@@ -9,7 +9,6 @@
 import 'package:analysis_server/src/services/completion/dart_completion_cache.dart';
 import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analysis_server/src/services/completion/imported_computer.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';
@@ -25,7 +24,7 @@
   runReflectiveTests(ImportedComputerTest);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ImportedComputerTest extends AbstractSelectorSuggestionTest {
 
   void assertCached(String completion) {
@@ -106,6 +105,12 @@
     }
   }
 
+  @override
+  CompletionSuggestion assertSuggestImportedField(String name, String type,
+      [int relevance = COMPLETION_RELEVANCE_DEFAULT]) {
+    return assertSuggestField(name, type, relevance: relevance);
+  }
+
   bool isCached(List<CompletionSuggestion> suggestions, String completion) =>
       suggestions.any((CompletionSuggestion s) => s.completion == completion);
 
@@ -201,6 +206,278 @@
     });
   }
 
+  test_function_parameters_mixed_required_and_named() {
+    addSource('/libA.dart', '''
+void m(x, {int y}) {}
+''');
+    addTestSource('''
+import '/libA.dart';
+class B extends A {
+  main() {^}
+}
+''');
+    return computeFull((bool result) {
+      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() {
+    addSource('/libA.dart', '''
+void m(x, [int y]) {}
+''');
+    addTestSource('''
+import '/libA.dart';
+class B extends A {
+  main() {^}
+}
+''');
+    return computeFull((bool result) {
+      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() {
+    addSource('/libA.dart', '''
+void m({x, int y}) {}
+''');
+    addTestSource('''
+import '/libA.dart';
+class B extends A {
+  main() {^}
+}
+''');
+    return computeFull((bool result) {
+      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() {
+    addSource('/libA.dart', '''
+void m() {}
+''');
+    addTestSource('''
+import '/libA.dart';
+class B extends A {
+  main() {^}
+}
+''');
+    computeFast();
+    return computeFull((bool result) {
+      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() {
+    addSource('/libA.dart', '''
+void m([x, int y]) {}
+''');
+    addTestSource('''
+import '/libA.dart';
+class B extends A {
+  main() {^}
+}
+''');
+    return computeFull((bool result) {
+      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() {
+    addSource('/libA.dart', '''
+void m(x, int y) {}
+''');
+    addTestSource('''
+import '/libA.dart';
+class B extends A {
+  main() {^}
+}
+''');
+    return computeFull((bool result) {
+      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() {
+    addSource('/libA.dart', '''
+class A {
+  void m(x, {int y}) {}
+}
+''');
+    addTestSource('''
+import '/libA.dart';
+class B extends A {
+  main() {^}
+}
+''');
+    return computeFull((bool result) {
+      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() {
+    addSource('/libA.dart', '''
+class A {
+  void m(x, [int y]) {}
+}
+''');
+    addTestSource('''
+import '/libA.dart';
+class B extends A {
+  main() {^}
+}
+''');
+    return computeFull((bool result) {
+      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() {
+    addSource('/libA.dart', '''
+class A {
+  void m({x, int y}) {}
+}
+''');
+    addTestSource('''
+import '/libA.dart';
+class B extends A {
+  main() {^}
+}
+''');
+    return computeFull((bool result) {
+      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() {
+    addSource('/libA.dart', '''
+class A {
+  void m() {}
+}
+''');
+    addTestSource('''
+import '/libA.dart';
+class B extends A {
+  main() {^}
+}
+''');
+    computeFast();
+    return computeFull((bool result) {
+      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() {
+    addSource('/libA.dart', '''
+class A {
+  void m([x, int y]) {}
+}
+''');
+    addTestSource('''
+import '/libA.dart';
+class B extends A {
+  main() {^}
+}
+''');
+    return computeFull((bool result) {
+      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() {
+    addSource('/libA.dart', '''
+class A {
+  void m(x, int y) {}
+}
+''');
+    addTestSource('''
+import '/libA.dart';
+class B extends A {
+  main() {^}
+}
+''');
+    return computeFull((bool result) {
+      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);
+    });
+  }
+
   /**
    * Ensure that completions in one context don't appear in another
    */
@@ -210,13 +487,6 @@
     var context2 = AnalysisEngine.instance.createAnalysisContext();
     context2.sourceFactory =
         new SourceFactory([AbstractContextTest.SDK_RESOLVER, resourceResolver]);
-    {
-      AnalysisOptionsImpl options =
-          new AnalysisOptionsImpl.con1(context2.analysisOptions);
-      options.enableAsync = true;
-      options.enableEnum = true;
-      context2.analysisOptions = options;
-    }
     String content2 = 'class ClassFromAnotherContext { }';
     Source source2 =
         provider.newFile('/context2/foo.dart', content2).createSource();
@@ -255,6 +525,60 @@
     });
   }
 
+  test_no_parameters_field() {
+    addSource('/libA.dart', '''
+class A {
+  int x;
+}
+''');
+    addTestSource('''
+import '/libA.dart';
+class B extends A {
+  main() {^}
+}
+''');
+    return computeFull((bool result) {
+      CompletionSuggestion suggestion = assertSuggestField('x', 'int');
+      assertHasNoParameterInfo(suggestion);
+    });
+  }
+
+  test_no_parameters_getter() {
+    addSource('/libA.dart', '''
+class A {
+  int get x => null;
+}
+''');
+    addTestSource('''
+import '/libA.dart';
+class B extends A {
+  main() {^}
+}
+''');
+    return computeFull((bool result) {
+      CompletionSuggestion suggestion = assertSuggestGetter('x', 'int');
+      assertHasNoParameterInfo(suggestion);
+    });
+  }
+
+  test_no_parameters_setter() {
+    addSource('/libA.dart', '''
+class A {
+  set x(int value) {};
+}
+''');
+    addTestSource('''
+import '/libA.dart';
+class B extends A {
+  main() {^}
+}
+''');
+    return computeFull((bool result) {
+      CompletionSuggestion suggestion = assertSuggestSetter('x');
+      assertHasNoParameterInfo(suggestion);
+    });
+  }
+
   @override
   test_partFile_TypeName() {
     return super.test_partFile_TypeName().then((_) {
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 8b8b30c..2dd068b 100644
--- a/pkg/analysis_server/test/services/completion/invocation_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/invocation_computer_test.dart
@@ -6,6 +6,7 @@
 
 
 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';
 import 'package:unittest/unittest.dart';
 
@@ -17,14 +18,17 @@
   runReflectiveTests(InvocationComputerTest);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class InvocationComputerTest extends AbstractSelectorSuggestionTest {
 
-  void assertHasNoParameterInfo(CompletionSuggestion suggestion) {
-    expect(suggestion.parameterNames, isNull);
-    expect(suggestion.parameterTypes, isNull);
-    expect(suggestion.requiredParameterCount, isNull);
-    expect(suggestion.hasNamedParameters, isNull);
+  @override
+  CompletionSuggestion assertSuggestInvocationField(String name, String type,
+      {int relevance: COMPLETION_RELEVANCE_DEFAULT, bool isDeprecated: false}) {
+    return assertSuggestField(
+        name,
+        type,
+        relevance: relevance,
+        isDeprecated: isDeprecated);
   }
 
   @override
@@ -145,7 +149,7 @@
 }
 void main() {new C().^}''');
     return computeFull((bool result) {
-      CompletionSuggestion suggestion = assertSuggestGetter('x', 'int');
+      CompletionSuggestion suggestion = assertSuggestField('x', 'int');
       assertHasNoParameterInfo(suggestion);
     });
   }
diff --git a/pkg/analysis_server/test/services/completion/keyword_computer_test.dart b/pkg/analysis_server/test/services/completion/keyword_computer_test.dart
index f6d7fed..c2156c6 100644
--- a/pkg/analysis_server/test/services/completion/keyword_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/keyword_computer_test.dart
@@ -5,6 +5,7 @@
 library test.services.completion.dart.keyword;
 
 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/keyword_computer.dart';
 import 'package:analyzer/src/generated/scanner.dart';
 import 'package:unittest/unittest.dart';
@@ -17,11 +18,11 @@
   runReflectiveTests(KeywordComputerTest);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class KeywordComputerTest extends AbstractCompletionTest {
 
   void assertSuggestKeywords(Iterable<Keyword> expectedKeywords,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+      [int relevance = COMPLETION_RELEVANCE_DEFAULT]) {
     Set<Keyword> actualKeywords = new Set<Keyword>();
     request.suggestions.forEach((CompletionSuggestion s) {
       if (s.kind == CompletionSuggestionKind.KEYWORD) {
@@ -75,7 +76,7 @@
             Keyword.FINAL,
             Keyword.TYPEDEF,
             Keyword.VAR],
-        CompletionRelevance.HIGH);
+        COMPLETION_RELEVANCE_HIGH);
   }
 
   test_before_import() {
@@ -83,7 +84,7 @@
     expect(computeFast(), isTrue);
     assertSuggestKeywords(
         [Keyword.EXPORT, Keyword.IMPORT, Keyword.LIBRARY, Keyword.PART],
-        CompletionRelevance.HIGH);
+        COMPLETION_RELEVANCE_HIGH);
   }
 
   test_class() {
@@ -91,7 +92,7 @@
     expect(computeFast(), isTrue);
     assertSuggestKeywords(
         [Keyword.EXTENDS, Keyword.IMPLEMENTS],
-        CompletionRelevance.HIGH);
+        COMPLETION_RELEVANCE_HIGH);
   }
 
   test_class_extends() {
@@ -99,7 +100,7 @@
     expect(computeFast(), isTrue);
     assertSuggestKeywords(
         [Keyword.IMPLEMENTS, Keyword.WITH],
-        CompletionRelevance.HIGH);
+        COMPLETION_RELEVANCE_HIGH);
   }
 
   test_class_extends_name() {
@@ -111,7 +112,7 @@
   test_class_implements() {
     addTestSource('class A ^ implements foo');
     expect(computeFast(), isTrue);
-    assertSuggestKeywords([Keyword.EXTENDS], CompletionRelevance.HIGH);
+    assertSuggestKeywords([Keyword.EXTENDS], COMPLETION_RELEVANCE_HIGH);
   }
 
   test_class_implements_name() {
@@ -147,7 +148,7 @@
             Keyword.PART,
             Keyword.TYPEDEF,
             Keyword.VAR],
-        CompletionRelevance.HIGH);
+        COMPLETION_RELEVANCE_HIGH);
   }
 
   test_function_body() {
@@ -207,7 +208,7 @@
             Keyword.PART,
             Keyword.TYPEDEF,
             Keyword.VAR],
-        CompletionRelevance.HIGH);
+        COMPLETION_RELEVANCE_HIGH);
   }
 
   test_library_name() {
@@ -262,7 +263,7 @@
             Keyword.PART,
             Keyword.TYPEDEF,
             Keyword.VAR],
-        CompletionRelevance.HIGH);
+        COMPLETION_RELEVANCE_HIGH);
   }
 
   test_partial_class() {
@@ -280,7 +281,7 @@
             Keyword.PART,
             Keyword.TYPEDEF,
             Keyword.VAR],
-        CompletionRelevance.HIGH);
+        COMPLETION_RELEVANCE_HIGH);
   }
 
   test_partial_class2() {
@@ -297,7 +298,7 @@
             Keyword.PART,
             Keyword.TYPEDEF,
             Keyword.VAR],
-        CompletionRelevance.HIGH);
+        COMPLETION_RELEVANCE_HIGH);
   }
 
   void _appendKeywords(StringBuffer msg, Iterable<Keyword> keywords) {
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 17c1f37..2399393 100644
--- a/pkg/analysis_server/test/services/completion/local_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/local_computer_test.dart
@@ -4,6 +4,8 @@
 
 library test.services.completion.dart.local;
 
+import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analysis_server/src/services/completion/local_computer.dart';
 import 'package:unittest/unittest.dart';
 
@@ -15,11 +17,295 @@
   runReflectiveTests(LocalComputerTest);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class LocalComputerTest extends AbstractSelectorSuggestionTest {
 
   @override
+  CompletionSuggestion assertSuggestLocalField(String name, String type,
+      [int relevance = COMPLETION_RELEVANCE_DEFAULT]) {
+    return assertSuggestField(name, type, relevance: relevance);
+  }
+
+  @override
   void setUpComputer() {
     computer = new LocalComputer();
   }
+
+  test_break_ignores_outer_functions_using_closure() {
+    addTestSource('''
+void main() {
+  foo: while (true) {
+    var f = () {
+      bar: while (true) { break ^ }
+    };
+  }
+}
+''');
+    expect(computeFast(), isTrue);
+    // Labels in outer functions are never accessible.
+    assertSuggestLabel('bar');
+    assertNotSuggested('foo');
+  }
+
+  test_break_ignores_outer_functions_using_local_function() {
+    addTestSource('''
+void main() {
+  foo: while (true) {
+    void f() {
+      bar: while (true) { break ^ }
+    };
+  }
+}
+''');
+    expect(computeFast(), isTrue);
+    // Labels in outer functions are never accessible.
+    assertSuggestLabel('bar');
+    assertNotSuggested('foo');
+  }
+
+  test_break_ignores_toplevel_variables() {
+    addTestSource('''
+int x;
+void main() {
+  while (true) {
+    break ^
+  }
+}
+''');
+    expect(computeFast(), isTrue);
+    assertNotSuggested('x');
+  }
+
+  test_break_ignores_unrelated_statements() {
+    addTestSource('''
+void main() {
+  foo: while (true) {}
+  while (true) { break ^ }
+  bar: while (true) {}
+}
+''');
+    expect(computeFast(), isTrue);
+    // The scope of the label defined by a labeled statement is just the
+    // statement itself, so neither "foo" nor "bar" are in scope at the caret
+    // position.
+    assertNotSuggested('foo');
+    assertNotSuggested('bar');
+  }
+
+  test_break_to_enclosing_loop() {
+    addTestSource('''
+void main() {
+  foo: while (true) {
+    bar: while (true) {
+      break ^
+    }
+  }
+}
+''');
+    expect(computeFast(), isTrue);
+    assertSuggestLabel('foo');
+    assertSuggestLabel('bar');
+  }
+
+  test_continue_from_loop_to_switch() {
+    addTestSource('''
+void main() {
+  switch (x) {
+    foo: case 1:
+      break;
+    bar: case 2:
+      while (true) {
+        continue ^;
+      }
+      break;
+    baz: case 3:
+      break;
+  }
+}
+''');
+    expect(computeFast(), isTrue);
+    assertSuggestLabel('foo');
+    assertSuggestLabel('bar');
+    assertSuggestLabel('baz');
+  }
+
+  test_continue_from_switch_to_loop() {
+    addTestSource('''
+void main() {
+  foo: while (true) {
+    switch (x) {
+      case 1:
+        continue ^;
+    }
+  }
+}
+''');
+    expect(computeFast(), isTrue);
+    assertSuggestLabel('foo');
+  }
+
+  test_continue_ignores_outer_functions_using_closure_with_loop() {
+    addTestSource('''
+void main() {
+  foo: while (true) {
+    var f = () {
+      bar: while (true) { continue ^ }
+    };
+  }
+}
+''');
+    expect(computeFast(), isTrue);
+    // Labels in outer functions are never accessible.
+    assertSuggestLabel('bar');
+    assertNotSuggested('foo');
+  }
+
+  test_continue_ignores_outer_functions_using_closure_with_switch() {
+    addTestSource('''
+void main() {
+  switch (x) {
+    foo: case 1:
+      var f = () {
+        bar: while (true) { continue ^ }
+      };
+  }
+}
+''');
+    expect(computeFast(), isTrue);
+    // Labels in outer functions are never accessible.
+    assertSuggestLabel('bar');
+    assertNotSuggested('foo');
+  }
+
+  test_continue_ignores_outer_functions_using_local_function_with_loop() {
+    addTestSource('''
+void main() {
+  foo: while (true) {
+    void f() {
+      bar: while (true) { continue ^ }
+    };
+  }
+}
+''');
+    expect(computeFast(), isTrue);
+    // Labels in outer functions are never accessible.
+    assertSuggestLabel('bar');
+    assertNotSuggested('foo');
+  }
+
+  test_continue_ignores_outer_functions_using_local_function_with_switch() {
+    addTestSource('''
+void main() {
+  switch (x) {
+    foo: case 1:
+      void f() {
+        bar: while (true) { continue ^ }
+      };
+  }
+}
+''');
+    expect(computeFast(), isTrue);
+    // Labels in outer functions are never accessible.
+    assertSuggestLabel('bar');
+    assertNotSuggested('foo');
+  }
+
+  test_continue_ignores_unrelated_statements() {
+    addTestSource('''
+void main() {
+  foo: while (true) {}
+  while (true) { continue ^ }
+  bar: while (true) {}
+}
+''');
+    expect(computeFast(), isTrue);
+    // The scope of the label defined by a labeled statement is just the
+    // statement itself, so neither "foo" nor "bar" are in scope at the caret
+    // position.
+    assertNotSuggested('foo');
+    assertNotSuggested('bar');
+  }
+
+  test_continue_to_earlier_case() {
+    addTestSource('''
+void main() {
+  switch (x) {
+    foo: case 1:
+      break;
+    case 2:
+      continue ^;
+    case 3:
+      break;
+''');
+    expect(computeFast(), isTrue);
+    assertSuggestLabel('foo');
+  }
+
+  test_continue_to_enclosing_loop() {
+    addTestSource('''
+void main() {
+  foo: while (true) {
+    bar: while (true) {
+      continue ^
+    }
+  }
+}
+''');
+    expect(computeFast(), isTrue);
+    assertSuggestLabel('foo');
+    assertSuggestLabel('bar');
+  }
+
+  test_continue_to_enclosing_switch() {
+    addTestSource('''
+void main() {
+  switch (x) {
+    foo: case 1:
+      break;
+    bar: case 2:
+      switch (y) {
+        case 1:
+          continue ^;
+      }
+      break;
+    baz: case 3:
+      break;
+  }
+}
+''');
+    expect(computeFast(), isTrue);
+    assertSuggestLabel('foo');
+    assertSuggestLabel('bar');
+    assertSuggestLabel('baz');
+  }
+
+  test_continue_to_later_case() {
+    addTestSource('''
+void main() {
+  switch (x) {
+    case 1:
+      break;
+    case 2:
+      continue ^;
+    foo: case 3:
+      break;
+''');
+    expect(computeFast(), isTrue);
+    assertSuggestLabel('foo');
+  }
+
+  test_continue_to_same_case() {
+    addTestSource('''
+void main() {
+  switch (x) {
+    case 1:
+      break;
+    foo: case 2:
+      continue ^;
+    case 3:
+      break;
+''');
+    expect(computeFast(), isTrue);
+    assertSuggestLabel('foo');
+  }
 }
diff --git a/pkg/analysis_server/test/services/completion/optype_test.dart b/pkg/analysis_server/test/services/completion/optype_test.dart
index 254695d..eb37281 100644
--- a/pkg/analysis_server/test/services/completion/optype_test.dart
+++ b/pkg/analysis_server/test/services/completion/optype_test.dart
@@ -19,7 +19,7 @@
   runReflectiveTests(OpTypeTest);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class OpTypeTest {
 
   OpType visitor;
@@ -44,11 +44,14 @@
   }
 
   void assertOpType({bool invocation: false, bool returnValue: false,
-      bool typeNames: false, bool voidReturn: false}) {
+      bool typeNames: false, bool voidReturn: false, bool statementLabel: false,
+      bool caseLabel: false}) {
     expect(visitor.includeInvocationSuggestions, equals(invocation));
     expect(visitor.includeReturnValueSuggestions, equals(returnValue));
     expect(visitor.includeTypeNameSuggestions, equals(typeNames));
     expect(visitor.includeVoidReturnSuggestions, equals(voidReturn));
+    expect(visitor.includeStatementLabelSuggestions, equals(statementLabel));
+    expect(visitor.includeCaseLabelSuggestions, equals(caseLabel));
   }
 
   test_Annotation() {
@@ -193,6 +196,21 @@
     assertOpType(returnValue: true, typeNames: true, voidReturn: true);
   }
 
+  test_Break_after_label() {
+    addTestSource('main() { foo: while (true) { break foo ^ ; } }');
+    assertOpType(/* No valid completions */);
+  }
+
+  test_Break_before_label() {
+    addTestSource('main() { foo: while (true) { break ^ foo; } }');
+    assertOpType(statementLabel: true);
+  }
+
+  test_Break_no_label() {
+    addTestSource('main() { foo: while (true) { break ^; } }');
+    assertOpType(statementLabel: true);
+  }
+
   test_CascadeExpression_selector1() {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
     addTestSource('''
@@ -307,6 +325,21 @@
     assertOpType(invocation: true);
   }
 
+  test_Continue_after_label() {
+    addTestSource('main() { foo: while (true) { continue foo ^ ; } }');
+    assertOpType(/* No valid completions */);
+  }
+
+  test_Continue_before_label() {
+    addTestSource('main() { foo: while (true) { continue ^ foo; } }');
+    assertOpType(statementLabel: true, caseLabel: true);
+  }
+
+  test_Continue_no_label() {
+    addTestSource('main() { foo: while (true) { continue ^; } }');
+    assertOpType(statementLabel: true, caseLabel: true);
+  }
+
   test_DoStatement() {
     // SimpleIdentifier  DoStatement  Block
     addTestSource('main() {do{} while(^x);}');
diff --git a/pkg/analysis_server/test/services/correction/assist_test.dart b/pkg/analysis_server/test/services/correction/assist_test.dart
index b89c6fe..1b252f3 100644
--- a/pkg/analysis_server/test/services/correction/assist_test.dart
+++ b/pkg/analysis_server/test/services/correction/assist_test.dart
@@ -22,7 +22,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class AssistProcessorTest extends AbstractSingleUnitTest {
   Index index;
   SearchEngineImpl searchEngine;
diff --git a/pkg/analysis_server/test/services/correction/change_test.dart b/pkg/analysis_server/test/services/correction/change_test.dart
index c880a09..7113f91 100644
--- a/pkg/analysis_server/test/services/correction/change_test.dart
+++ b/pkg/analysis_server/test/services/correction/change_test.dart
@@ -23,7 +23,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ChangeTest {
   void test_addEdit() {
     SourceChange change = new SourceChange('msg');
@@ -141,7 +141,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class EditTest {
   void test_applySequence() {
     SourceEdit edit1 = new SourceEdit(5, 2, 'abc');
@@ -193,7 +193,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class FileEditTest {
   void test_add_sorts() {
     SourceEdit edit1a = new SourceEdit(1, 0, 'a1');
@@ -251,7 +251,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class LinkedEditGroupTest {
   void test_new() {
     LinkedEditGroup group = new LinkedEditGroup.empty();
@@ -292,7 +292,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class LinkedEditSuggestionTest {
   void test_eqEq() {
     var a = new LinkedEditSuggestion('a', LinkedEditSuggestionKind.METHOD);
@@ -308,7 +308,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class PositionTest {
   void test_eqEq() {
     Position a = new Position('/a.dart', 1);
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index 794b284..c359221 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -26,7 +26,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class FixProcessorTest extends AbstractSingleUnitTest {
   Index index;
   SearchEngineImpl searchEngine;
@@ -769,7 +769,34 @@
 ''');
   }
 
-  void test_createMissingOverrides_functionType() {
+  void test_createMissingOverrides_functionTypeAlias() {
+    _indexTestUnit('''
+typedef int Binary(int left, int right);
+
+abstract class Emulator {
+  void performBinary(Binary binary);
+}
+
+class MyEmulator extends Emulator {
+}
+''');
+    assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, '''
+typedef int Binary(int left, int right);
+
+abstract class Emulator {
+  void performBinary(Binary binary);
+}
+
+class MyEmulator extends Emulator {
+  @override
+  void performBinary(Binary binary) {
+    // TODO: implement performBinary
+  }
+}
+''');
+  }
+
+  void test_createMissingOverrides_functionTypedParameter() {
     _indexTestUnit('''
 abstract class A {
   forEach(int f(double p1, String p2));
diff --git a/pkg/analysis_server/test/services/correction/levenshtein_test.dart b/pkg/analysis_server/test/services/correction/levenshtein_test.dart
index b810ee6..5820acb 100644
--- a/pkg/analysis_server/test/services/correction/levenshtein_test.dart
+++ b/pkg/analysis_server/test/services/correction/levenshtein_test.dart
@@ -15,7 +15,7 @@
   runReflectiveTests(LevenshteinTest);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class LevenshteinTest {
   void test_different_caseInsensitive() {
     expect(levenshtein('Saturday', 'sunday', 5, caseSensitive: false), 3);
diff --git a/pkg/analysis_server/test/services/correction/name_suggestion_test.dart b/pkg/analysis_server/test/services/correction/name_suggestion_test.dart
index c1b2273..ee82145 100644
--- a/pkg/analysis_server/test/services/correction/name_suggestion_test.dart
+++ b/pkg/analysis_server/test/services/correction/name_suggestion_test.dart
@@ -19,7 +19,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class VariableNameSuggestionTest extends AbstractSingleUnitTest {
   void test_forExpression_cast() {
     resolveTestUnit('''
diff --git a/pkg/analysis_server/test/services/correction/sort_members_test.dart b/pkg/analysis_server/test/services/correction/sort_members_test.dart
index 1d0a975..70eb570 100644
--- a/pkg/analysis_server/test/services/correction/sort_members_test.dart
+++ b/pkg/analysis_server/test/services/correction/sort_members_test.dart
@@ -18,7 +18,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class SortMembersTest extends AbstractSingleUnitTest {
   void test_classMembers_accessor() {
     _parseTestUnit(r'''
diff --git a/pkg/analysis_server/test/services/correction/source_range_test.dart b/pkg/analysis_server/test/services/correction/source_range_test.dart
index cd4a12c..5881a77 100644
--- a/pkg/analysis_server/test/services/correction/source_range_test.dart
+++ b/pkg/analysis_server/test/services/correction/source_range_test.dart
@@ -22,7 +22,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class SourceRangesTest extends AbstractSingleUnitTest {
   void test_rangeElementName() {
     resolveTestUnit('class ABC {}');
diff --git a/pkg/analysis_server/test/services/correction/status_test.dart b/pkg/analysis_server/test/services/correction/status_test.dart
index 560d346..93f9a08 100644
--- a/pkg/analysis_server/test/services/correction/status_test.dart
+++ b/pkg/analysis_server/test/services/correction/status_test.dart
@@ -24,7 +24,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class RefactoringLocationTest extends AbstractSingleUnitTest {
   void test_createLocation_forElement() {
     resolveTestUnit('class MyClass {}');
@@ -75,7 +75,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class RefactoringStatusTest {
   void test_addError() {
     RefactoringStatus refactoringStatus = new RefactoringStatus();
diff --git a/pkg/analysis_server/test/services/correction/strings_test.dart b/pkg/analysis_server/test/services/correction/strings_test.dart
index cba4315..b84c022 100644
--- a/pkg/analysis_server/test/services/correction/strings_test.dart
+++ b/pkg/analysis_server/test/services/correction/strings_test.dart
@@ -17,7 +17,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class StringsTest {
   void test_capitalize() {
     expect(capitalize(''), '');
diff --git a/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart b/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart
index 89eda4b..9d2dacc 100644
--- a/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart
+++ b/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart
@@ -61,7 +61,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class DartUnitContributorTest extends AbstractSingleUnitTest {
   IndexStore store = new MockIndexStore();
   List<RecordedRelation> recordedRelations = <RecordedRelation>[];
diff --git a/pkg/analysis_server/test/services/index/local_index_test.dart b/pkg/analysis_server/test/services/index/local_index_test.dart
index 6bf1f2a..558b226 100644
--- a/pkg/analysis_server/test/services/index/local_index_test.dart
+++ b/pkg/analysis_server/test/services/index/local_index_test.dart
@@ -35,7 +35,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class LocalIndexTest extends AbstractContextTest {
   LocalIndex index;
 
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 9903b1f..1a79bcc 100644
--- a/pkg/analysis_server/test/services/index/store/codec_test.dart
+++ b/pkg/analysis_server/test/services/index/store/codec_test.dart
@@ -24,7 +24,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class _ContextCodecTest {
   ContextCodec codec = new ContextCodec();
 
@@ -63,7 +63,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class _ElementCodecTest extends AbstractSingleUnitTest {
   ElementCodec codec;
   AnalysisContext context = new MockAnalysisContext('context');
@@ -201,7 +201,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class _RelationshipCodecTest {
   StringCodec stringCodec = new StringCodec();
   RelationshipCodec codec;
@@ -218,7 +218,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class _StringCodecTest {
   StringCodec codec = new StringCodec();
 
diff --git a/pkg/analysis_server/test/services/index/store/collection_test.dart b/pkg/analysis_server/test/services/index/store/collection_test.dart
index e8ce718..f27214d 100644
--- a/pkg/analysis_server/test/services/index/store/collection_test.dart
+++ b/pkg/analysis_server/test/services/index/store/collection_test.dart
@@ -17,7 +17,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class _IntArrayToIntMapTest {
   IntArrayToIntMap map = new IntArrayToIntMap();
 
@@ -31,7 +31,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class _IntToIntSetMapTest {
   IntToIntSetMap map = new IntToIntSetMap();
 
diff --git a/pkg/analysis_server/test/services/index/store/split_store_test.dart b/pkg/analysis_server/test/services/index/store/split_store_test.dart
index d824cf5..6a8bacb 100644
--- a/pkg/analysis_server/test/services/index/store/split_store_test.dart
+++ b/pkg/analysis_server/test/services/index/store/split_store_test.dart
@@ -55,7 +55,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class _FileNodeManagerTest {
   MockLogger logger = new MockLogger();
   StringCodec stringCodec = new StringCodec();
@@ -255,7 +255,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class _IndexNodeTest {
   AnalysisContext context = new MockAnalysisContext('context');
   ElementCodec elementCodec = new MockElementCodec();
@@ -341,7 +341,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class _LocationDataTest {
   AnalysisContext context = new MockAnalysisContext('context');
   ElementCodec elementCodec = new MockElementCodec();
@@ -426,7 +426,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class _RelationKeyDataTest {
   AnalysisContext context = new MockAnalysisContext('context');
   ElementCodec elementCodec = new MockElementCodec();
@@ -478,7 +478,7 @@
 
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class _SplitIndexStoreTest {
   AnalysisContext contextA = new MockAnalysisContext('contextA');
 
@@ -705,6 +705,15 @@
     }
   }
 
+  void test_recordRelationship_multiplyDefinedElement() {
+    Element multiplyElement =
+        new MultiplyDefinedElementImpl(contextA, <Element>[elementA, elementB]);
+    Location location = mockLocation(elementA);
+    store.recordRelationship(multiplyElement, relationship, location);
+    store.doneIndex();
+    expect(nodeManager.isEmpty(), isTrue);
+  }
+
   void test_recordRelationship_nullElement() {
     Location locationA = mockLocation(elementA);
     store.recordRelationship(null, relationship, locationA);
diff --git a/pkg/analysis_server/test/services/index/store/temporary_folder_file_manager_test.dart b/pkg/analysis_server/test/services/index/store/temporary_folder_file_manager_test.dart
index f9e2044..eef4933 100644
--- a/pkg/analysis_server/test/services/index/store/temporary_folder_file_manager_test.dart
+++ b/pkg/analysis_server/test/services/index/store/temporary_folder_file_manager_test.dart
@@ -19,7 +19,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class _SeparateFileManagerTest {
   TemporaryFolderFileManager fileManager;
 
diff --git a/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart b/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
index 89ad088..9a07846 100644
--- a/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
@@ -21,7 +21,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ConvertGetterToMethodTest extends RefactoringTest {
   ConvertGetterToMethodRefactoring refactoring;
 
diff --git a/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart b/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
index 543dcae1..21fdbe0 100644
--- a/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
@@ -21,7 +21,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ConvertMethodToGetterTest extends RefactoringTest {
   ConvertMethodToGetterRefactoring refactoring;
 
diff --git a/pkg/analysis_server/test/services/refactoring/extract_local_test.dart b/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
index 1010ec4..e8ced6a 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
@@ -21,7 +21,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ExtractLocalTest extends RefactoringTest {
   ExtractLocalRefactoringImpl refactoring;
 
diff --git a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
index ba6a7d6..c77bd77 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
@@ -21,7 +21,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ExtractMethodTest extends RefactoringTest {
   ExtractMethodRefactoringImpl refactoring;
 
diff --git a/pkg/analysis_server/test/services/refactoring/inline_local_test.dart b/pkg/analysis_server/test/services/refactoring/inline_local_test.dart
index edb99b8..b4646f0 100644
--- a/pkg/analysis_server/test/services/refactoring/inline_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/inline_local_test.dart
@@ -20,7 +20,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class InlineLocalTest extends RefactoringTest {
   InlineLocalRefactoringImpl refactoring;
 
diff --git a/pkg/analysis_server/test/services/refactoring/inline_method_test.dart b/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
index f76f731..01dfc52 100644
--- a/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
@@ -22,7 +22,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class InlineMethodTest extends RefactoringTest {
   InlineMethodRefactoringImpl refactoring;
   bool deleteSource;
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 6c6d53b..3f20034 100644
--- a/pkg/analysis_server/test/services/refactoring/move_file_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
@@ -25,7 +25,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class MoveFileTest extends RefactoringTest {
   MoveFileRefactoring refactoring;
 
diff --git a/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart b/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
index dff5cf8..534149b 100644
--- a/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
@@ -20,7 +20,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class NamingConventionsTest extends RefactoringTest {
   @override
   Refactoring get refactoring => null;
diff --git a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
index 5bcee17..63b8f83 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
@@ -17,7 +17,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class RenameClassMemberTest extends RenameRefactoringTest {
   test_checkFinalConditions_hasMember_MethodElement() {
     indexTestUnit('''
diff --git a/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart b/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
index 94682bc..90b6153 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
@@ -19,7 +19,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class RenameConstructorTest extends RenameRefactoringTest {
   test_checkFinalConditions_hasMember_constructor() {
     indexTestUnit('''
diff --git a/pkg/analysis_server/test/services/refactoring/rename_import_test.dart b/pkg/analysis_server/test/services/refactoring/rename_import_test.dart
index 2d15c49..f0846cf 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_import_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_import_test.dart
@@ -18,7 +18,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class RenameImportTest extends RenameRefactoringTest {
   test_checkNewName() {
     indexTestUnit("import 'dart:async' as test;");
diff --git a/pkg/analysis_server/test/services/refactoring/rename_label_test.dart b/pkg/analysis_server/test/services/refactoring/rename_label_test.dart
index cc8268d..bd41cbc 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_label_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_label_test.dart
@@ -17,7 +17,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class RenameLabelTest extends RenameRefactoringTest {
   test_checkNewName_LocalVariableElement() {
     indexTestUnit('''
diff --git a/pkg/analysis_server/test/services/refactoring/rename_library_test.dart b/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
index 6d10598..552ff56 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
@@ -19,7 +19,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class RenameLibraryTest extends RenameRefactoringTest {
   void test_checkNewName() {
     indexTestUnit('''
diff --git a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
index 226733e..8cb9478 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
@@ -17,7 +17,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class RenameLocalTest extends RenameRefactoringTest {
   test_checkFinalConditions_hasLocalFunction_after() {
     indexTestUnit('''
diff --git a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
index 4356a89..803e9ba 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
@@ -17,7 +17,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class RenameUnitMemberTest extends RenameRefactoringTest {
   test_checkFinalConditions_hasTopLevel_ClassElement() {
     indexTestUnit('''
diff --git a/pkg/analysis_server/test/services/search/hierarchy_test.dart b/pkg/analysis_server/test/services/search/hierarchy_test.dart
index 87f5eb5..c2acc44 100644
--- a/pkg/analysis_server/test/services/search/hierarchy_test.dart
+++ b/pkg/analysis_server/test/services/search/hierarchy_test.dart
@@ -23,7 +23,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class HierarchyTest extends AbstractSingleUnitTest {
   Index index;
   SearchEngineImpl searchEngine;
diff --git a/pkg/analysis_server/test/services/search/search_engine_test.dart b/pkg/analysis_server/test/services/search/search_engine_test.dart
index b52f81b..a46e524 100644
--- a/pkg/analysis_server/test/services/search/search_engine_test.dart
+++ b/pkg/analysis_server/test/services/search/search_engine_test.dart
@@ -16,7 +16,6 @@
 import 'package:unittest/unittest.dart';
 
 import '../../abstract_single_unit.dart';
-import '../../mocks.dart';
 import '../../reflective_tests.dart';
 
 
@@ -64,33 +63,12 @@
 }
 
 
-class MockAngularComponentElement extends TypedMock implements
-    AngularComponentElement {
-  final kind = ElementKind.ANGULAR_COMPONENT;
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-
-class MockAngularControllerElement extends TypedMock implements
-    AngularControllerElement {
-  final kind = ElementKind.ANGULAR_CONTROLLER;
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-
-class MockAngularFormatterElement extends TypedMock implements
-    AngularFormatterElement {
-  final kind = ElementKind.ANGULAR_FORMATTER;
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-
 class MockIndex extends TypedMock implements Index {
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class SearchEngineImplTest extends AbstractSingleUnitTest {
   Index index;
   SearchEngineImpl searchEngine;
@@ -189,33 +167,6 @@
     });
   }
 
-  Future test_searchReferences_AngularComponentElement() {
-    // use mocks
-    index = new MockIndex();
-    searchEngine = new SearchEngineImpl(index);
-    Element elementA = new MockElement('A');
-    Element elementB = new MockElement('B');
-    // fill mocks
-    AngularComponentElement element = new MockAngularComponentElement();
-    void mockLocation(Element element, Relationship relationship,
-        Location location) {
-      index.getRelationships(element, relationship);
-      when(null).thenReturn(new Future.value([location]));
-    }
-    mockLocation(
-        element,
-        IndexConstants.ANGULAR_REFERENCE,
-        new Location(elementA, 1, 10));
-    mockLocation(
-        element,
-        IndexConstants.ANGULAR_CLOSING_TAG_REFERENCE,
-        new Location(elementB, 2, 20));
-    var expected = [
-        new ExpectedMatch(elementA, MatchKind.ANGULAR_REFERENCE, 1, 10),
-        new ExpectedMatch(elementB, MatchKind.ANGULAR_CLOSING_TAG_REFERENCE, 2, 20)];
-    return _verifyReferences(element, expected);
-  }
-
   Future test_searchReferences_ClassElement() {
     _indexTestUnit('''
 class A {}
diff --git a/pkg/analysis_server/test/socket_server_test.dart b/pkg/analysis_server/test/socket_server_test.dart
index 047a1c8..c126bd0 100644
--- a/pkg/analysis_server/test/socket_server_test.dart
+++ b/pkg/analysis_server/test/socket_server_test.dart
@@ -8,6 +8,7 @@
 
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/plugin/server_plugin.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/socket_server.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
@@ -15,6 +16,7 @@
 import 'package:unittest/unittest.dart';
 
 import 'mocks.dart';
+import 'package:analysis_server/src/plugin/plugin_impl.dart';
 
 main() {
   group('SocketServer', () {
@@ -33,10 +35,7 @@
 
 class SocketServerTest {
   static void createAnalysisServer_alreadyStarted() {
-    SocketServer server = new SocketServer(
-        new AnalysisServerOptions(),
-        DirectoryBasedDartSdk.defaultSdk,
-        InstrumentationService.NULL_SERVICE);
+    SocketServer server = _createSocketServer();
     MockServerChannel channel1 = new MockServerChannel();
     MockServerChannel channel2 = new MockServerChannel();
     server.createAnalysisServer(channel1);
@@ -61,10 +60,7 @@
   }
 
   static Future createAnalysisServer_successful() {
-    SocketServer server = new SocketServer(
-        new AnalysisServerOptions(),
-        DirectoryBasedDartSdk.defaultSdk,
-        InstrumentationService.NULL_SERVICE);
+    SocketServer server = _createSocketServer();
     MockServerChannel channel = new MockServerChannel();
     server.createAnalysisServer(channel);
     channel.expectMsgCount(notificationCount: 1);
@@ -78,10 +74,7 @@
   }
 
   static Future requestHandler_exception() {
-    SocketServer server = new SocketServer(
-        new AnalysisServerOptions(),
-        DirectoryBasedDartSdk.defaultSdk,
-        InstrumentationService.NULL_SERVICE);
+    SocketServer server = _createSocketServer();
     MockServerChannel channel = new MockServerChannel();
     server.createAnalysisServer(channel);
     channel.expectMsgCount(notificationCount: 1);
@@ -101,10 +94,7 @@
   }
 
   static Future requestHandler_futureException() {
-    SocketServer server = new SocketServer(
-        new AnalysisServerOptions(),
-        DirectoryBasedDartSdk.defaultSdk,
-        InstrumentationService.NULL_SERVICE);
+    SocketServer server = _createSocketServer();
     MockServerChannel channel = new MockServerChannel();
     server.createAnalysisServer(channel);
     _MockRequestHandler handler = new _MockRequestHandler(true);
@@ -117,6 +107,17 @@
       expect(channel.notificationsReceived[1].event, SERVER_ERROR);
     });
   }
+
+  static SocketServer _createSocketServer() {
+    ServerPlugin serverPlugin = new ServerPlugin();
+    ExtensionManager manager = new ExtensionManager();
+    manager.processPlugins([serverPlugin]);
+    return new SocketServer(
+          new AnalysisServerOptions(),
+          DirectoryBasedDartSdk.defaultSdk,
+          InstrumentationService.NULL_SERVICE,
+          serverPlugin);
+  }
 }
 
 class _MockRequestHandler implements RequestHandler {
diff --git a/pkg/analysis_server/test/test_all.dart b/pkg/analysis_server/test/test_all.dart
index 0a2ff15..eaafee4 100644
--- a/pkg/analysis_server/test/test_all.dart
+++ b/pkg/analysis_server/test/test_all.dart
@@ -14,6 +14,7 @@
 import 'domain_server_test.dart' as domain_server_test;
 import 'edit/test_all.dart' as edit_all;
 import 'operation/test_all.dart' as operation_test_all;
+import 'plugin/test_all.dart' as plugin_test_all;
 import 'protocol_server_test.dart' as protocol_server_test;
 import 'protocol_test.dart' as protocol_test;
 import 'search/test_all.dart' as search_all;
@@ -36,6 +37,7 @@
     domain_server_test.main();
     edit_all.main();
     operation_test_all.main();
+    plugin_test_all.main();
     protocol_server_test.main();
     protocol_test.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 e491f69..2559d1a 100644
--- a/pkg/analysis_server/tool/spec/codegen_analysis_server.dart
+++ b/pkg/analysis_server/tool/spec/codegen_analysis_server.dart
@@ -78,6 +78,17 @@
       });
 
       //
+      // isSocketOpen()
+      //
+      publicMethod('isSocketOpen', () {
+              writeln('''/**
+ * Return {@code true} if the socket is open.
+ */''');
+        writeln(
+          'public boolean isSocketOpen();');
+        });
+
+      //
       // start(..)
       //
       publicMethod('start', () {
diff --git a/pkg/analysis_server/tool/spec/codegen_tools.dart b/pkg/analysis_server/tool/spec/codegen_tools.dart
index 922b482..898f4b7 100644
--- a/pkg/analysis_server/tool/spec/codegen_tools.dart
+++ b/pkg/analysis_server/tool/spec/codegen_tools.dart
@@ -211,14 +211,15 @@
   bool check() {
     Map<String, FileContentsComputer> map = directoryContentsComputer();
     try {
-      map.forEach((String file, FileContentsComputer fileContentsComputer) {
+      for (String file in map.keys) {
+        FileContentsComputer fileContentsComputer = map[file];
         String expectedContents = fileContentsComputer();
         File outputFile =
             new File(joinAll(posix.split(posix.join(outputDirPath, file))));
         if (expectedContents != outputFile.readAsStringSync()) {
           return false;
         }
-      });
+      }
       int nonHiddenFileCount = 0;
       outputFile.listSync(
           recursive: false,
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index ad32f19..aa86cb6 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -1224,6 +1224,13 @@
           matching the original as possible, but whitespace at the beginning or
           end of the selected region will be ignored.
         </p>
+        <p>
+          If a request is made for a file which does not exist, or
+          which is not currently subject to analysis (e.g. because it
+          is not associated with any analysis root specified to
+          analysis.setAnalysisRoots), an error of type
+          <tt>FORMAT_INVALID_FILE</tt> will be generated.
+        </p>
         <params>
           <field name="file">
             <ref>FilePath</ref>
@@ -1781,11 +1788,10 @@
           An enumeration of the possible types of analysis errors.
         </p>
         <enum>
-          <value><code>ANGULAR</code></value>
           <value><code>CHECKED_MODE_COMPILE_TIME_ERROR</code></value>
           <value><code>COMPILE_TIME_ERROR</code></value>
           <value><code>HINT</code></value>
-          <value><code>POLYMER</code></value>
+          <value><code>LINT</code></value>
           <value><code>STATIC_TYPE_WARNING</code></value>
           <value><code>STATIC_WARNING</code></value>
           <value><code>SYNTACTIC_ERROR</code></value>
@@ -1801,6 +1807,7 @@
         <object>
           <field name="enableAsync" optional="true">
             <ref>bool</ref>
+            <p><b><i>Deprecated</i></b>/<p>
             <p>
               True if the client wants to enable support for the
               proposed async feature.
@@ -1808,6 +1815,7 @@
           </field>
           <field name="enableDeferredLoading" optional="true">
             <ref>bool</ref>
+            <p><b><i>Deprecated</i></b>/<p>
             <p>
               True if the client wants to enable support for the
               proposed deferred loading feature.
@@ -1815,6 +1823,7 @@
           </field>
           <field name="enableEnums" optional="true">
             <ref>bool</ref>
+            <p><b><i>Deprecated</i></b>/<p>
             <p>
               True if the client wants to enable support for the
               proposed enum feature.
@@ -1830,7 +1839,14 @@
           <field name="generateHints" optional="true">
             <ref>bool</ref>
             <p>
-              True is hints should be generated as part of generating
+              True if hints should be generated as part of generating
+              errors and warnings.
+            </p>
+          </field>
+          <field name="generateLints" optional="true">
+            <ref>bool</ref>
+            <p>
+              True if lints should be generated as part of generating
               errors and warnings.
             </p>
           </field>
@@ -1907,17 +1923,6 @@
           completion request.
         </p>
       </type>
-      <type name="CompletionRelevance">
-        <p>
-          An enumeration of the relevance of a completion
-          suggestion.
-        </p>
-        <enum>
-          <value><code>LOW</code></value>
-          <value><code>DEFAULT</code></value>
-          <value><code>HIGH</code></value>
-        </enum>
-      </type>
       <type name="CompletionSuggestion">
         <p>
           A suggestion for how to complete partially entered text. Many
@@ -1932,9 +1937,10 @@
             </p>
           </field>
           <field name="relevance">
-            <ref>CompletionRelevance</ref>
+            <ref>int</ref>
             <p>
-              The relevance of this completion suggestion.
+              The relevance of this completion suggestion
+              where a higher number indicates a higher relevance.
             </p>
           </field>
           <field name="completion">
@@ -2007,8 +2013,9 @@
           <field name="returnType" optional="true">
             <ref>String</ref>
             <p>
-              The return type of the getter, function or method being
-              suggested. This field is omitted if the suggested element
+              The return type of the getter, function or method
+              or the type of the field being suggested.
+              This field is omitted if the suggested element
               is not a getter, function or method.
             </p>
           </field>
@@ -2960,6 +2967,13 @@
             </p>
           </value>
           <value>
+            <code>FORMAT_INVALID_FILE</code>
+            <p>
+              An "edit.format" request specified a FilePath
+              which does not match a Dart file in an analysis root.
+            </p>
+          </value>
+          <value>
             <code>GET_ERRORS_INVALID_FILE</code>
             <p>
               An "analysis.getErrors" request specified a FilePath
diff --git a/pkg/analyzer/bin/coverage.dart b/pkg/analyzer/bin/coverage.dart
deleted file mode 100644
index 6fbc0d1..0000000
--- a/pkg/analyzer/bin/coverage.dart
+++ /dev/null
@@ -1,88 +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.
-
-library runtime.coverage;
-
-import 'dart:io';
-
-import 'package:analyzer/src/services/runtime/coverage/coverage_impl.dart';
-import 'package:analyzer/src/services/runtime/log.dart' as log;
-import 'package:args/args.dart';
-
-
-/// General error code.
-const ERROR = 1;
-
-
-final ArgParser _argParser = new ArgParser()
-    ..addFlag('help', negatable: false, help: 'Print this usage information.')
-    ..addOption(
-        'level',
-        help: 'The level of the coverage.',
-        allowed: ['method', 'block', 'statement'],
-        defaultsTo: 'statement')
-    ..addOption('out', help: 'The output file with statistics.')
-    ..addOption(
-        'port',
-        help: 'The port to run server on, if 0 select any.',
-        defaultsTo: '0');
-
-
-main(args) {
-  ArgResults options;
-  try {
-    options = _argParser.parse(args);
-  } on FormatException catch (e) {
-    print(e.message);
-    print('Run "coverage --help" to see available options.');
-    exit(ERROR);
-  }
-
-  if (options['help']) {
-    printUsage();
-    return;
-  }
-
-  // No script to run.
-  if (options.rest.isEmpty) {
-    printUsage('<No script to run specified>');
-    exit(ERROR);
-  }
-
-  // More than one script specified.
-  if (options.rest.length != 1) {
-    print('<Only one script should be specified>');
-    exit(ERROR);
-  }
-
-  var scriptPath = options.rest[0];
-
-  // Validate that script file exists.
-  if (!new File(scriptPath).existsSync()) {
-    print('<File "$scriptPath" does not exist>');
-    exit(ERROR);
-  }
-
-  // Prepare output file path.
-  var outPath = options['out'];
-  if (outPath == null) {
-    printUsage('No --out specified.');
-    exit(ERROR);
-  }
-
-  // Configure logigng.
-  log.everything();
-  log.toConsole();
-
-  // Run script.
-  runServerApplication(scriptPath, outPath);
-}
-
-
-printUsage([var description = 'Code coverage tool for Dart.']) {
-  var usage = _argParser.usage;
-  print('$description\n');
-  print('Usage: coverage [options] <script>\n');
-  print('$usage\n');
-}
diff --git a/pkg/analyzer/lib/instrumentation/file_instrumentation.dart b/pkg/analyzer/lib/instrumentation/file_instrumentation.dart
new file mode 100644
index 0000000..011d211
--- /dev/null
+++ b/pkg/analyzer/lib/instrumentation/file_instrumentation.dart
@@ -0,0 +1,38 @@
+// 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 file_instrumentation;
+
+import 'dart:io';
+
+import 'package:analyzer/instrumentation/instrumentation.dart';
+
+
+/**
+ * An [InstrumentationServer] that writes to a file.
+ */
+class FileInstrumentationServer implements InstrumentationServer {
+  IOSink _sink;
+
+  FileInstrumentationServer(String path) {
+    File file = new File(path);
+    _sink = file.openWrite(mode: FileMode.APPEND);
+  }
+
+  @override
+  void log(String message) {
+    _sink.writeln(message);
+  }
+
+  @override
+  void logWithPriority(String message) {
+    log(message);
+  }
+
+  @override
+  void shutdown() {
+    _sink.close();
+    _sink = null;
+  }
+}
diff --git a/pkg/analyzer/lib/instrumentation/instrumentation.dart b/pkg/analyzer/lib/instrumentation/instrumentation.dart
index 77547fb..c3a9920 100644
--- a/pkg/analyzer/lib/instrumentation/instrumentation.dart
+++ b/pkg/analyzer/lib/instrumentation/instrumentation.dart
@@ -5,6 +5,14 @@
 library instrumentation;
 
 /**
+ * A container with analysis performance constants.
+ */
+class AnalysisPerformanceKind {
+  static const String FULL = 'analysis_full';
+  static const String INCREMENTAL = 'analysis_incremental';
+}
+
+/**
  * The interface used by client code to communicate with an instrumentation
  * server.
  */
@@ -47,7 +55,10 @@
 
   static const String TAG_ERROR = 'Err';
   static const String TAG_EXCEPTION = 'Ex';
+  static const String TAG_FILE_READ = 'Read';
+  static const String TAG_LOG_ENTRY = 'Log';
   static const String TAG_NOTIFICATION = 'Noti';
+  static const String TAG_PERFORMANCE = 'Perf';
   static const String TAG_REQUEST = 'Req';
   static const String TAG_RESPONSE = 'Res';
   static const String TAG_VERSION = 'Ver';
@@ -89,6 +100,30 @@
   }
 
   /**
+   * Log that the contents of the file with the given [path] were read. The file
+   * had the given [content] and [modificationTime].
+   */
+  void logFileRead(String path, int modificationTime, String content) {
+    if (_instrumentationServer != null) {
+      String timeStamp = _toString(modificationTime);
+      _instrumentationServer.log(_join([TAG_FILE_READ, path, timeStamp, content]));
+    }
+  }
+
+  /**
+   * Log that a log entry that was written to the analysis engine's log. The log
+   * entry has the given [level] and [message], and was created at the given
+   * [time].
+   */
+  void logLogEntry(String level, DateTime time, String message) {
+    if (_instrumentationServer != null) {
+      String timeStamp = time == null ? 'null' : time.millisecondsSinceEpoch.toString();
+      _instrumentationServer.log(
+          _join([TAG_LOG_ENTRY, level, timeStamp, message]));
+    }
+  }
+
+  /**
    * Log that a notification has been sent to the client.
    */
   void logNotification(String notification) {
@@ -96,6 +131,18 @@
   }
 
   /**
+   * Log the given performance fact.
+   */
+  void logPerformance(String kind, Stopwatch sw, String message) {
+    sw.stop();
+    String elapsed = sw.elapsedMilliseconds.toString();
+    if (_instrumentationServer != null) {
+      _instrumentationServer.log(
+          _join([TAG_PERFORMANCE, kind, elapsed, message]));
+    }
+  }
+
+  /**
    * Log that the given priority [exception] was thrown, with the given
    * [stackTrace].
    */
@@ -186,3 +233,33 @@
     return object.toString();
   }
 }
+
+/**
+ * An [InstrumentationServer] that sends messages to multiple instances.
+ */
+class MulticastInstrumentationServer implements InstrumentationServer {
+  final List<InstrumentationServer> _servers;
+
+  MulticastInstrumentationServer(this._servers);
+
+  @override
+  void log(String message) {
+    for (InstrumentationServer server in _servers) {
+      server.log(message);
+    }
+  }
+
+  @override
+  void logWithPriority(String message) {
+    for (InstrumentationServer server in _servers) {
+      server.logWithPriority(message);
+    }
+  }
+
+  @override
+  void shutdown() {
+    for (InstrumentationServer server in _servers) {
+      server.shutdown();
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/options.dart b/pkg/analyzer/lib/options.dart
index af3c712..33a9a1e 100644
--- a/pkg/analyzer/lib/options.dart
+++ b/pkg/analyzer/lib/options.dart
@@ -26,9 +26,6 @@
   /** Whether to display version information */
   final bool displayVersion;
 
-  /** Whether to enable support for the proposed enum feature. */
-  final bool enableEnum;
-
   /**
    * Whether to treat type mismatches found during constant evaluation as
    * errors.
@@ -77,7 +74,6 @@
         this.definedVariables = definedVariables,
         disableHints = args['no-hints'],
         displayVersion = args['version'],
-        enableEnum = args['enable-enum'],
         enableTypeChecks = args['enable_type_checks'],
         ignoreUnrecognizedFlags = args['ignore-unrecognized-flags'],
         log = args['log'],
diff --git a/pkg/analyzer/lib/src/analyzer_impl.dart b/pkg/analyzer/lib/src/analyzer_impl.dart
index 34558f8..df17a70 100644
--- a/pkg/analyzer/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer/lib/src/analyzer_impl.dart
@@ -178,7 +178,6 @@
     AnalysisOptionsImpl contextOptions = new AnalysisOptionsImpl();
     contextOptions.cacheSize = _MAX_CACHE_SIZE;
     contextOptions.hint = !options.disableHints;
-    contextOptions.enableEnum = options.enableEnum;
     context.analysisOptions = contextOptions;
 
     // Create and add a ChangeSet
@@ -306,17 +305,14 @@
     int resolveTime = PerformanceStatistics.resolve.result;
     int errorsTime = PerformanceStatistics.errors.result;
     int hintsTime = PerformanceStatistics.hints.result;
-    int angularTime = PerformanceStatistics.angular.result;
     stdout.writeln("io-cold:$ioTime");
     stdout.writeln("scan-cold:$scanTime");
     stdout.writeln("parse-cold:$parseTime");
     stdout.writeln("resolve-cold:$resolveTime");
     stdout.writeln("errors-cold:$errorsTime");
     stdout.writeln("hints-cold:$hintsTime");
-    stdout.writeln("angular-cold:$angularTime");
     stdout.writeln("other-cold:${totalTime
-        - (ioTime + scanTime + parseTime + resolveTime + errorsTime + hintsTime
-        + angularTime)}");
+        - (ioTime + scanTime + parseTime + resolveTime + errorsTime + hintsTime)}");
     stdout.writeln("total-cold:$totalTime");
   }
 
@@ -343,17 +339,14 @@
       int resolveTime = PerformanceStatistics.resolve.result;
       int errorsTime = PerformanceStatistics.errors.result;
       int hintsTime = PerformanceStatistics.hints.result;
-      int angularTime = PerformanceStatistics.angular.result;
       stdout.writeln("io:$ioTime");
       stdout.writeln("scan:$scanTime");
       stdout.writeln("parse:$parseTime");
       stdout.writeln("resolve:$resolveTime");
       stdout.writeln("errors:$errorsTime");
       stdout.writeln("hints:$hintsTime");
-      stdout.writeln("angular:$angularTime");
       stdout.writeln("other:${totalTime
-          - (ioTime + scanTime + parseTime + resolveTime + errorsTime + hintsTime
-          + angularTime)}");
+          - (ioTime + scanTime + parseTime + resolveTime + errorsTime + hintsTime)}");
       stdout.writeln("total:$totalTime");
     }
   }
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 482f041..eb65e96 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -6942,21 +6942,6 @@
     if (nodeElement != null) {
       return nodeElement;
     }
-    // TODO(brianwilkerson) Implement or delete the code below.
-//    // try to get Angular specific Element
-//    {
-//      Element element = null;
-//      if (element != null) {
-//        return element;
-//      }
-//    }
-//    // try to get Polymer specific Element
-//    {
-//      Element element = null;
-//      if (element != null) {
-//        return element;
-//      }
-//    }
     // no Element
     return null;
   }
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index 671547f..9d4bf16 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -22,764 +22,6 @@
 import 'utilities_collection.dart';
 import 'utilities_dart.dart';
 
-/**
- * Information about Angular application.
- */
-class AngularApplication {
-  final Source entryPoint;
-
-  final Set<Source> _librarySources;
-
-  final List<AngularElement> elements;
-
-  final List<Source> elementSources;
-
-  AngularApplication(this.entryPoint, this._librarySources, this.elements,
-      this.elementSources);
-
-  /**
-   * Checks if this application depends on the library with the given [Source].
-   */
-  bool dependsOn(Source librarySource) =>
-      _librarySources.contains(librarySource);
-}
-
-/**
- * The interface `AngularControllerElement` defines the Angular component described by
- * <code>Component</code> annotation.
- */
-abstract class AngularComponentElement implements AngularHasSelectorElement,
-    AngularHasTemplateElement {
-  /**
-   * Return an array containing all of the properties declared by this component.
-   */
-  List<AngularPropertyElement> get properties;
-
-  /**
-   * Return an array containing all of the scope properties set in the implementation of this
-   * component.
-   */
-  List<AngularScopePropertyElement> get scopeProperties;
-
-  /**
-   * Returns the CSS file URI.
-   */
-  String get styleUri;
-
-  /**
-   * Return the offset of the [getStyleUri] in the [getSource].
-   *
-   * @return the offset of the style URI
-   */
-  int get styleUriOffset;
-}
-
-/**
- * Implementation of `AngularComponentElement`.
- */
-class AngularComponentElementImpl extends AngularHasSelectorElementImpl
-    implements AngularComponentElement {
-  /**
-   * The offset of the defining <code>Component</code> annotation.
-   */
-  final int _annotationOffset;
-
-  /**
-   * The array containing all of the properties declared by this component.
-   */
-  List<AngularPropertyElement> _properties = AngularPropertyElement.EMPTY_ARRAY;
-
-  /**
-   * The array containing all of the scope properties set by this component.
-   */
-  List<AngularScopePropertyElement> _scopeProperties =
-      AngularScopePropertyElement.EMPTY_ARRAY;
-
-  /**
-   * The the CSS file URI.
-   */
-  String styleUri;
-
-  /**
-   * The offset of the [styleUri] in the [getSource].
-   */
-  int styleUriOffset = 0;
-
-  /**
-   * The HTML template URI.
-   */
-  String templateUri;
-
-  /**
-   * The HTML template source.
-   */
-  Source templateSource;
-
-  /**
-   * The offset of the [templateUri] in the [getSource].
-   */
-  int templateUriOffset = 0;
-
-  /**
-   * Initialize a newly created Angular component to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  AngularComponentElementImpl(String name, int nameOffset,
-      this._annotationOffset)
-      : super(name, nameOffset);
-
-  @override
-  String get identifier => "AngularComponent@$_annotationOffset";
-
-  @override
-  ElementKind get kind => ElementKind.ANGULAR_COMPONENT;
-
-  @override
-  List<AngularPropertyElement> get properties => _properties;
-
-  /**
-   * Set an array containing all of the properties declared by this component.
-   *
-   * @param properties the properties to set
-   */
-  void set properties(List<AngularPropertyElement> properties) {
-    for (AngularPropertyElement property in properties) {
-      encloseElement(property as AngularPropertyElementImpl);
-    }
-    this._properties = properties;
-  }
-
-  @override
-  List<AngularScopePropertyElement> get scopeProperties => _scopeProperties;
-
-  /**
-   * Set an array containing all of the scope properties declared by this component.
-   *
-   * @param properties the properties to set
-   */
-  void set scopeProperties(List<AngularScopePropertyElement> properties) {
-    for (AngularScopePropertyElement property in properties) {
-      encloseElement(property as AngularScopePropertyElementImpl);
-    }
-    this._scopeProperties = properties;
-  }
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitAngularComponentElement(this);
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    safelyVisitChildren(_properties, visitor);
-    safelyVisitChildren(_scopeProperties, visitor);
-    super.visitChildren(visitor);
-  }
-}
-
-/**
- * The interface `AngularControllerElement` defines the Angular controller described by
- * <code>Controller</code> annotation.
- */
-abstract class AngularControllerElement implements AngularHasSelectorElement {
-}
-
-/**
- * Implementation of `AngularControllerElement`.
- */
-class AngularControllerElementImpl extends AngularHasSelectorElementImpl
-    implements AngularControllerElement {
-  /**
-   * Initialize a newly created Angular controller to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  AngularControllerElementImpl(String name, int nameOffset)
-      : super(name, nameOffset);
-
-  @override
-  ElementKind get kind => ElementKind.ANGULAR_CONTROLLER;
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitAngularControllerElement(this);
-}
-
-/**
- * The interface `AngularDirectiveElement` defines the Angular controller described by
- * <code>Decorator</code> annotation.
- */
-abstract class AngularDecoratorElement implements AngularHasSelectorElement {
-  /**
-   * Return an array containing all of the properties declared by this directive.
-   */
-  List<AngularPropertyElement> get properties;
-
-  /**
-   * Checks if this directive is implemented by the class with given name.
-   */
-  bool isClass(String name);
-}
-
-/**
- * Implementation of `AngularDirectiveElement`.
- */
-class AngularDecoratorElementImpl extends AngularHasSelectorElementImpl
-    implements AngularDecoratorElement {
-  /**
-   * The offset of the annotation that defines this directive.
-   */
-  final int _offset;
-
-  /**
-   * The array containing all of the properties declared by this directive.
-   */
-  List<AngularPropertyElement> _properties = AngularPropertyElement.EMPTY_ARRAY;
-
-  /**
-   * Initialize a newly created Angular directive to have the given name.
-   *
-   * @param offset the offset of the annotation that defines this directive
-   */
-  AngularDecoratorElementImpl(this._offset) : super(null, -1);
-
-  @override
-  String get displayName => selector.displayName;
-
-  @override
-  String get identifier => "Decorator@$_offset";
-
-  @override
-  ElementKind get kind => ElementKind.ANGULAR_DIRECTIVE;
-
-  @override
-  List<AngularPropertyElement> get properties => _properties;
-
-  /**
-   * Set an array containing all of the properties declared by this directive.
-   *
-   * @param properties the properties to set
-   */
-  void set properties(List<AngularPropertyElement> properties) {
-    for (AngularPropertyElement property in properties) {
-      encloseElement(property as AngularPropertyElementImpl);
-    }
-    this._properties = properties;
-  }
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitAngularDirectiveElement(this);
-
-  @override
-  bool isClass(String name) {
-    Element enclosing = enclosingElement;
-    return enclosing is ClassElement && enclosing.name == name;
-  }
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    safelyVisitChildren(_properties, visitor);
-    super.visitChildren(visitor);
-  }
-}
-
-/**
- * The interface `AngularElement` defines the behavior of objects representing information
- * about an Angular specific element.
- */
-abstract class AngularElement implements ToolkitObjectElement {
-  /**
-   * An empty list of Angular elements.
-   */
-  static const List<AngularElement> EMPTY_ARRAY = const <AngularElement>[];
-
-  /**
-   * Returns the [AngularApplication] this element is used in.
-   *
-   * @return the [AngularApplication] this element is used in
-   */
-  AngularApplication get application;
-}
-
-/**
- * Implementation of `AngularElement`.
- */
-abstract class AngularElementImpl extends ToolkitObjectElementImpl implements
-    AngularElement {
-  /**
-   * The [AngularApplication] this element is used in.
-   */
-  AngularApplication _application;
-
-  /**
-   * Initialize a newly created Angular element to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  AngularElementImpl(String name, int nameOffset) : super(name, nameOffset);
-
-  @override
-  AngularApplication get application => _application;
-
-  /**
-   * Set the [AngularApplication] this element is used in.
-   */
-  void set application(AngularApplication application) {
-    this._application = application;
-  }
-}
-
-/**
- * The interface `AngularFormatterElement` defines the Angular formatter described by
- * <code>Formatter</code> annotation.
- */
-abstract class AngularFormatterElement implements AngularElement {
-}
-
-/**
- * Implementation of `AngularFormatterElement`.
- */
-class AngularFormatterElementImpl extends AngularElementImpl implements
-    AngularFormatterElement {
-  /**
-   * Initialize a newly created Angular formatter to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  AngularFormatterElementImpl(String name, int nameOffset)
-      : super(name, nameOffset);
-
-  @override
-  ElementKind get kind => ElementKind.ANGULAR_FORMATTER;
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitAngularFormatterElement(this);
-}
-
-/**
- * [AngularSelectorElement] based on presence of attribute.
- */
-abstract class AngularHasAttributeSelectorElement implements
-    AngularSelectorElement {
-}
-
-/**
- * [AngularSelectorElement] based on presence of a class.
- */
-abstract class AngularHasClassSelectorElement implements AngularSelectorElement
-    {
-}
-
-/**
- * Implementation of [AngularSelectorElement] based on presence of a class.
- */
-class AngularHasClassSelectorElementImpl extends AngularSelectorElementImpl
-    implements AngularHasClassSelectorElement {
-  AngularHasClassSelectorElementImpl(String name, int offset)
-      : super(name, offset);
-
-  @override
-  void appendTo(StringBuffer buffer) {
-    buffer.write(".");
-    buffer.write(name);
-  }
-
-  @override
-  bool apply(XmlTagNode node) {
-    XmlAttributeNode attribute = node.getAttribute("class");
-    if (attribute != null) {
-      String text = attribute.text;
-      if (text != null) {
-        String name = this.name;
-        for (String className in StringUtils.split(text)) {
-          if (className == name) {
-            return true;
-          }
-        }
-      }
-    }
-    return false;
-  }
-}
-
-/**
- * The interface `AngularElement` defines the behavior of objects representing information
- * about an Angular element which is applied conditionally using some [AngularSelectorElement].
- */
-abstract class AngularHasSelectorElement implements AngularElement {
-  /**
-   * Returns the selector specified for this element.
-   *
-   * @return the [AngularSelectorElement] specified for this element
-   */
-  AngularSelectorElement get selector;
-}
-
-/**
- * Implementation of `AngularSelectorElement`.
- */
-abstract class AngularHasSelectorElementImpl extends AngularElementImpl
-    implements AngularHasSelectorElement {
-  /**
-   * The selector of this element.
-   */
-  AngularSelectorElement _selector;
-
-  /**
-   * Initialize a newly created Angular element to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  AngularHasSelectorElementImpl(String name, int nameOffset)
-      : super(name, nameOffset);
-
-  @override
-  AngularSelectorElement get selector => _selector;
-
-  /**
-   * Set the selector of this selector-based element.
-   *
-   * @param selector the selector to set
-   */
-  void set selector(AngularSelectorElement selector) {
-    encloseElement(selector as AngularSelectorElementImpl);
-    this._selector = selector;
-  }
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    safelyVisitChild(_selector, visitor);
-    super.visitChildren(visitor);
-  }
-}
-
-/**
- * The interface `AngularHasTemplateElement` defines common behavior for
- * [AngularElement] that have template URI / [Source].
- */
-abstract class AngularHasTemplateElement implements AngularElement {
-  /**
-   * Returns the HTML template [Source], `null` if not resolved.
-   */
-  Source get templateSource;
-
-  /**
-   * Returns the HTML template URI.
-   */
-  String get templateUri;
-
-  /**
-   * Return the offset of the [getTemplateUri] in the [getSource].
-   *
-   * @return the offset of the template URI
-   */
-  int get templateUriOffset;
-}
-
-/**
- * The interface `AngularPropertyElement` defines a single property in
- * [AngularComponentElement].
- */
-abstract class AngularPropertyElement implements AngularElement {
-  /**
-   * An empty list of property elements.
-   */
-  static const List<AngularPropertyElement> EMPTY_ARRAY = const
-      <AngularPropertyElement>[
-      ];
-
-  /**
-   * Returns the field this property is mapped to.
-   *
-   * @return the field this property is mapped to.
-   */
-  FieldElement get field;
-
-  /**
-   * Return the offset of the field name of this property in the property map, or `-1` if
-   * property was created using annotation on [FieldElement].
-   *
-   * @return the offset of the field name of this property
-   */
-  int get fieldNameOffset;
-
-  /**
-   * Returns the kind of this property.
-   *
-   * @return the kind of this property
-   */
-  AngularPropertyKind get propertyKind;
-}
-
-/**
- * Implementation of `AngularPropertyElement`.
- */
-class AngularPropertyElementImpl extends AngularElementImpl implements
-    AngularPropertyElement {
-  /**
-   * The [FieldElement] to which this property is bound.
-   */
-  FieldElement field;
-
-  /**
-   * The offset of the field name in the property map.
-   */
-  int fieldNameOffset = -1;
-
-  AngularPropertyKind propertyKind;
-
-  /**
-   * Initialize a newly created Angular property to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  AngularPropertyElementImpl(String name, int nameOffset)
-      : super(name, nameOffset);
-
-  @override
-  ElementKind get kind => ElementKind.ANGULAR_PROPERTY;
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitAngularPropertyElement(this);
-}
-
-/**
- * The enumeration `AngularPropertyKind` defines the different kinds of property bindings.
- */
-class AngularPropertyKind extends Enum<AngularPropertyKind> {
-  /**
-   * `@` - Map the DOM attribute string. The attribute string will be taken literally or
-   * interpolated if it contains binding {{}} syntax and assigned to the expression. (cost: 0
-   * watches)
-   */
-  static const AngularPropertyKind ATTR = const AngularPropertyKind('ATTR', 0);
-
-  /**
-   * `&` - Treat the DOM attribute value as an expression. Assign a closure function into the field.
-   * This allows the component to control the invocation of the closure. This is useful for passing
-   * expressions into controllers which act like callbacks. (cost: 0 watches)
-   */
-  static const AngularPropertyKind CALLBACK =
-      const AngularPropertyKind('CALLBACK', 1);
-
-  /**
-   * `=>` - Treat the DOM attribute value as an expression. Set up a watch, which will read the
-   * expression in the attribute and assign the value to destination expression. (cost: 1 watch)
-   */
-  static const AngularPropertyKind ONE_WAY =
-      const AngularPropertyKind('ONE_WAY', 2);
-
-  /**
-   * `=>!` - Treat the DOM attribute value as an expression. Set up a one time watch on expression.
-   * Once the expression turns not null it will no longer update. (cost: 1 watches until not null,
-   * then 0 watches)
-   */
-  static const AngularPropertyKind ONE_WAY_ONE_TIME =
-      const AngularPropertyKind('ONE_WAY_ONE_TIME', 3);
-
-  /**
-   * `<=>` - Treat the DOM attribute value as an expression. Set up a watch on both outside as well
-   * as component scope to keep the source and destination in sync. (cost: 2 watches)
-   */
-  static const AngularPropertyKind TWO_WAY =
-      const AngularPropertyKind_TWO_WAY('TWO_WAY', 4);
-
-  static const List<AngularPropertyKind> values = const [
-      ATTR,
-      CALLBACK,
-      ONE_WAY,
-      ONE_WAY_ONE_TIME,
-      TWO_WAY];
-
-  const AngularPropertyKind(String name, int ordinal) : super(name, ordinal);
-
-  /**
-   * Returns `true` if property of this kind calls field getter.
-   */
-  bool callsGetter() => false;
-
-  /**
-   * Returns `true` if property of this kind calls field setter.
-   */
-  bool callsSetter() => true;
-}
-
-class AngularPropertyKind_TWO_WAY extends AngularPropertyKind {
-  const AngularPropertyKind_TWO_WAY(String name, int ordinal)
-      : super(name, ordinal);
-
-  @override
-  bool callsGetter() => true;
-}
-
-/**
- * The interface `AngularScopeVariableElement` defines the Angular <code>Scope</code>
- * property. They are created for every <code>scope['property'] = value;</code> code snippet.
- */
-abstract class AngularScopePropertyElement implements AngularElement {
-  /**
-   * An empty list of scope property elements.
-   */
-  static const List<AngularScopePropertyElement> EMPTY_ARRAY = const
-      <AngularScopePropertyElement>[
-      ];
-
-  /**
-   * Returns the type of this property, not `null`, maybe <code>dynamic</code>.
-   *
-   * @return the type of this property.
-   */
-  DartType get type;
-}
-
-/**
- * Implementation of `AngularScopePropertyElement`.
- */
-class AngularScopePropertyElementImpl extends AngularElementImpl implements
-    AngularScopePropertyElement {
-  /**
-   * The type of the property
-   */
-  final DartType type;
-
-  /**
-   * Initialize a newly created Angular scope property to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  AngularScopePropertyElementImpl(String name, int nameOffset, this.type)
-      : super(name, nameOffset);
-
-  @override
-  ElementKind get kind => ElementKind.ANGULAR_SCOPE_PROPERTY;
-
-  @override
-  accept(ElementVisitor visitor) =>
-      visitor.visitAngularScopePropertyElement(this);
-}
-
-/**
- * [AngularSelectorElement] is used to decide when Angular object should be applied.
- *
- * This class is an [Element] to support renaming component tag names, which are identifiers
- * in selectors.
- */
-abstract class AngularSelectorElement implements AngularElement {
-  /**
-   * Checks if the given [XmlTagNode] matches this selector.
-   *
-   * @param node the [XmlTagNode] to check
-   * @return `true` if the given [XmlTagNode] matches, or `false` otherwise
-   */
-  bool apply(XmlTagNode node);
-}
-
-/**
- * Implementation of `AngularFormatterElement`.
- */
-abstract class AngularSelectorElementImpl extends AngularElementImpl implements
-    AngularSelectorElement {
-  /**
-   * Initialize a newly created Angular selector to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  AngularSelectorElementImpl(String name, int nameOffset)
-      : super(name, nameOffset);
-
-  @override
-  ElementKind get kind => ElementKind.ANGULAR_SELECTOR;
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitAngularSelectorElement(this);
-}
-
-/**
- * [AngularSelectorElement] based on tag name.
- */
-abstract class AngularTagSelectorElement implements AngularSelectorElement {
-}
-
-/**
- * Implementation of [AngularSelectorElement] based on tag name.
- */
-class AngularTagSelectorElementImpl extends AngularSelectorElementImpl
-    implements AngularTagSelectorElement {
-  AngularTagSelectorElementImpl(String name, int offset) : super(name, offset);
-
-  @override
-  AngularApplication get application =>
-      (enclosingElement as AngularElementImpl).application;
-
-  @override
-  bool apply(XmlTagNode node) {
-    String tagName = name;
-    return node.tag == tagName;
-  }
-}
-
-/**
- * The interface `AngularViewElement` defines the Angular view defined using invocation like
- * <code>view('views/create.html')</code>.
- */
-abstract class AngularViewElement implements AngularHasTemplateElement {
-  /**
-   * An empty list of view elements.
-   */
-  static const List<AngularViewElement> EMPTY_ARRAY = const
-      <AngularViewElement>[
-      ];
-}
-
-/**
- * Implementation of `AngularViewElement`.
- */
-class AngularViewElementImpl extends AngularElementImpl implements
-    AngularViewElement {
-  /**
-   * The HTML template URI.
-   */
-  final String templateUri;
-
-  /**
-   * The offset of the [templateUri] in the [getSource].
-   */
-  final int templateUriOffset;
-
-  /**
-   * The HTML template source.
-   */
-  Source templateSource;
-
-  /**
-   * Initialize a newly created Angular view.
-   */
-  AngularViewElementImpl(this.templateUri, this.templateUriOffset)
-      : super(null, -1);
-
-  @override
-  String get identifier => "AngularView@$templateUriOffset";
-
-  @override
-  ElementKind get kind => ElementKind.ANGULAR_VIEW;
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitAngularViewElement(this);
-}
 
 /**
  * For AST nodes that could be in both the getter and setter contexts ([IndexExpression]s and
@@ -1026,15 +268,6 @@
   InterfaceType get supertype;
 
   /**
-   * Return an array containing all of the toolkit specific objects associated with this class. The
-   * array will be empty if the class does not have any toolkit specific objects or if the
-   * compilation unit containing the class has not yet had toolkit references resolved.
-   *
-   * @return the toolkit objects associated with this class
-   */
-  List<ToolkitObjectElement> get toolkitObjects;
-
-  /**
    * Return the type defined by the class.
    *
    * @return the type defined by the class
@@ -1319,11 +552,6 @@
   InterfaceType supertype;
 
   /**
-   * An array containing all of the toolkit objects attached to this class.
-   */
-  List<ToolkitObjectElement> _toolkitObjects = ToolkitObjectElement.EMPTY_ARRAY;
-
-  /**
    * The type defined by the class.
    */
   InterfaceType type;
@@ -1541,9 +769,6 @@
   ClassDeclaration get node =>
       getNodeMatching((node) => node is ClassDeclaration);
 
-  @override
-  List<ToolkitObjectElement> get toolkitObjects => _toolkitObjects;
-
   /**
    * Set whether this class is defined by a typedef construct to correspond to the given value.
    *
@@ -1591,19 +816,6 @@
   @override
   accept(ElementVisitor visitor) => visitor.visitClassElement(this);
 
-  /**
-   * Add the given [toolkitObject] to the list of toolkit specific information
-   * objects attached to this class.
-   */
-  void addToolkitObjects(ToolkitObjectElement toolkitObject) {
-    (toolkitObject as ToolkitObjectElementImpl).enclosingElement = this;
-    if (_toolkitObjects.isEmpty) {
-      // Convert from a non-growable list to a growable list.
-      _toolkitObjects = <ToolkitObjectElement>[];
-    }
-    _toolkitObjects.add(toolkitObject);
-  }
-
   @override
   void appendTo(StringBuffer buffer) {
     String name = displayName;
@@ -1781,7 +993,6 @@
     safelyVisitChildren(_constructors, visitor);
     safelyVisitChildren(_fields, visitor);
     safelyVisitChildren(_methods, visitor);
-    safelyVisitChildren(_toolkitObjects, visitor);
     safelyVisitChildren(_typeParameters, visitor);
   }
 
@@ -2025,15 +1236,6 @@
   List<PropertyAccessorElement> get accessors;
 
   /**
-   * Return an array containing all of the Angular views defined in this compilation unit. The array
-   * will be empty if the element does not have any Angular views or if the compilation unit has not
-   * yet had toolkit references resolved.
-   *
-   * @return the Angular views defined in this compilation unit.
-   */
-  List<AngularViewElement> get angularViews;
-
-  /**
    * Return the library in which this compilation unit is defined.
    *
    * @return the library in which this compilation unit is defined
@@ -2151,11 +1353,6 @@
   List<FunctionElement> _functions = FunctionElementImpl.EMPTY_ARRAY;
 
   /**
-   * A table mapping elements to associated toolkit objects.
-   */
-  Map<Element, List<ToolkitObjectElement>> _toolkitObjects = {};
-
-  /**
    * An array containing all of the function type aliases contained in this compilation unit.
    */
   List<FunctionTypeAliasElement> _typeAliases =
@@ -2173,11 +1370,6 @@
       TopLevelVariableElementImpl.EMPTY_ARRAY;
 
   /**
-   * An array containing all of the Angular views contained in this compilation unit.
-   */
-  List<AngularViewElement> _angularViews = AngularViewElement.EMPTY_ARRAY;
-
-  /**
    * Initialize a newly created compilation unit element to have the given name.
    *
    * @param name the name of this element
@@ -2201,21 +1393,6 @@
   }
 
   @override
-  List<AngularViewElement> get angularViews => _angularViews;
-
-  /**
-   * Set the Angular views defined in this compilation unit.
-   *
-   * @param angularViews the Angular views defined in this compilation unit
-   */
-  void set angularViews(List<AngularViewElement> angularViews) {
-    for (AngularViewElement view in angularViews) {
-      (view as AngularViewElementImpl).enclosingElement = this;
-    }
-    this._angularViews = angularViews;
-  }
-
-  @override
   LibraryElement get enclosingElement =>
       super.enclosingElement as LibraryElement;
 
@@ -2404,31 +1581,6 @@
     safelyVisitChildren(_typeAliases, visitor);
     safelyVisitChildren(_types, visitor);
     safelyVisitChildren(_variables, visitor);
-    safelyVisitChildren(_angularViews, visitor);
-  }
-
-  /**
-   * Returns the associated toolkit objects.
-   *
-   * @param element the [Element] to get toolkit objects for
-   * @return the associated toolkit objects, may be empty, but not `null`
-   */
-  List<ToolkitObjectElement> _getToolkitObjects(Element element) {
-    List<ToolkitObjectElement> objects = _toolkitObjects[element];
-    if (objects != null) {
-      return objects;
-    }
-    return ToolkitObjectElement.EMPTY_ARRAY;
-  }
-
-  /**
-   * Sets the toolkit objects that are associated with the given [Element].
-   *
-   * @param element the [Element] to associate toolkit objects with
-   * @param objects the toolkit objects to associate
-   */
-  void _setToolkitObjects(Element element, List<ToolkitObjectElement> objects) {
-    _toolkitObjects[element] = objects;
   }
 }
 
@@ -2649,7 +1801,7 @@
       } else {
         message = 'Found unnamed constructor element with no enclosing element';
       }
-      AnalysisEngine.instance.instrumentationService.logError(message);
+      AnalysisEngine.instance.logger.logError(message);
       buffer.write('<unknown class>');
     } else {
       buffer.write(enclosingElement.displayName);
@@ -3472,10 +2624,10 @@
   String _name;
 
   /**
-   * The offset of the name of this element in the file that contains the declaration of this
-   * element.
+   * The offset of the name of this element in the file that contains the
+   * declaration of this element.
    */
-  int nameOffset = 0;
+  int _nameOffset = 0;
 
   /**
    * A bit-encoded form of the modifiers associated with this element.
@@ -3511,7 +2663,7 @@
    * @param nameOffset the offset of the name of this element in the file that contains the
    *          declaration of this element
    */
-  ElementImpl(String name, this.nameOffset) {
+  ElementImpl(String name, this._nameOffset) {
     this._name = StringUtilities.intern(name);
   }
 
@@ -3628,6 +2780,22 @@
     _cachedHashCode = null;
   }
 
+  /**
+   * The offset of the name of this element in the file that contains the
+   * declaration of this element.
+   */
+  int get nameOffset => _nameOffset;
+
+  /**
+   * Sets the offset of the name of this element in the file that contains the
+   * declaration of this element.
+   */
+  void set nameOffset(int offset) {
+    _nameOffset = offset;
+    _cachedHashCode = null;
+    _cachedLocation = null;
+  }
+
   @override
   AstNode get node => getNodeMatching((node) => node is AstNode);
 
@@ -3821,114 +2989,73 @@
  * The enumeration `ElementKind` defines the various kinds of elements in the element model.
  */
 class ElementKind extends Enum<ElementKind> {
-  static const ElementKind ANGULAR_FORMATTER =
-      const ElementKind('ANGULAR_FORMATTER', 0, "Angular formatter");
-
-  static const ElementKind ANGULAR_COMPONENT =
-      const ElementKind('ANGULAR_COMPONENT', 1, "Angular component");
-
-  static const ElementKind ANGULAR_CONTROLLER =
-      const ElementKind('ANGULAR_CONTROLLER', 2, "Angular controller");
-
-  static const ElementKind ANGULAR_DIRECTIVE =
-      const ElementKind('ANGULAR_DIRECTIVE', 3, "Angular directive");
-
-  static const ElementKind ANGULAR_PROPERTY =
-      const ElementKind('ANGULAR_PROPERTY', 4, "Angular property");
-
-  static const ElementKind ANGULAR_SCOPE_PROPERTY =
-      const ElementKind('ANGULAR_SCOPE_PROPERTY', 5, "Angular scope property");
-
-  static const ElementKind ANGULAR_SELECTOR =
-      const ElementKind('ANGULAR_SELECTOR', 6, "Angular selector");
-
-  static const ElementKind ANGULAR_VIEW =
-      const ElementKind('ANGULAR_VIEW', 7, "Angular view");
-
-  static const ElementKind CLASS = const ElementKind('CLASS', 8, "class");
+  static const ElementKind CLASS = const ElementKind('CLASS', 0, "class");
 
   static const ElementKind COMPILATION_UNIT =
-      const ElementKind('COMPILATION_UNIT', 9, "compilation unit");
+      const ElementKind('COMPILATION_UNIT', 1, "compilation unit");
 
   static const ElementKind CONSTRUCTOR =
-      const ElementKind('CONSTRUCTOR', 10, "constructor");
+      const ElementKind('CONSTRUCTOR', 2, "constructor");
 
   static const ElementKind DYNAMIC =
-      const ElementKind('DYNAMIC', 11, "<dynamic>");
+      const ElementKind('DYNAMIC', 3, "<dynamic>");
 
   static const ElementKind EMBEDDED_HTML_SCRIPT =
-      const ElementKind('EMBEDDED_HTML_SCRIPT', 12, "embedded html script");
+      const ElementKind('EMBEDDED_HTML_SCRIPT', 4, "embedded html script");
 
-  static const ElementKind ERROR = const ElementKind('ERROR', 13, "<error>");
+  static const ElementKind ERROR = const ElementKind('ERROR', 5, "<error>");
 
   static const ElementKind EXPORT =
-      const ElementKind('EXPORT', 14, "export directive");
+      const ElementKind('EXPORT', 6, "export directive");
 
   static const ElementKind EXTERNAL_HTML_SCRIPT =
-      const ElementKind('EXTERNAL_HTML_SCRIPT', 15, "external html script");
+      const ElementKind('EXTERNAL_HTML_SCRIPT', 7, "external html script");
 
-  static const ElementKind FIELD = const ElementKind('FIELD', 16, "field");
+  static const ElementKind FIELD = const ElementKind('FIELD', 8, "field");
 
   static const ElementKind FUNCTION =
-      const ElementKind('FUNCTION', 17, "function");
+      const ElementKind('FUNCTION', 9, "function");
 
-  static const ElementKind GETTER = const ElementKind('GETTER', 18, "getter");
+  static const ElementKind GETTER = const ElementKind('GETTER', 10, "getter");
 
-  static const ElementKind HTML = const ElementKind('HTML', 19, "html");
+  static const ElementKind HTML = const ElementKind('HTML', 11, "html");
 
   static const ElementKind IMPORT =
-      const ElementKind('IMPORT', 20, "import directive");
+      const ElementKind('IMPORT', 12, "import directive");
 
-  static const ElementKind LABEL = const ElementKind('LABEL', 21, "label");
+  static const ElementKind LABEL = const ElementKind('LABEL', 13, "label");
 
   static const ElementKind LIBRARY =
-      const ElementKind('LIBRARY', 22, "library");
+      const ElementKind('LIBRARY', 14, "library");
 
   static const ElementKind LOCAL_VARIABLE =
-      const ElementKind('LOCAL_VARIABLE', 23, "local variable");
+      const ElementKind('LOCAL_VARIABLE', 15, "local variable");
 
-  static const ElementKind METHOD = const ElementKind('METHOD', 24, "method");
+  static const ElementKind METHOD = const ElementKind('METHOD', 16, "method");
 
-  static const ElementKind NAME = const ElementKind('NAME', 25, "<name>");
+  static const ElementKind NAME = const ElementKind('NAME', 17, "<name>");
 
   static const ElementKind PARAMETER =
-      const ElementKind('PARAMETER', 26, "parameter");
-
-  static const ElementKind POLYMER_ATTRIBUTE =
-      const ElementKind('POLYMER_ATTRIBUTE', 27, "Polymer attribute");
-
-  static const ElementKind POLYMER_TAG_DART =
-      const ElementKind('POLYMER_TAG_DART', 28, "Polymer Dart tag");
-
-  static const ElementKind POLYMER_TAG_HTML =
-      const ElementKind('POLYMER_TAG_HTML', 29, "Polymer HTML tag");
+      const ElementKind('PARAMETER', 18, "parameter");
 
   static const ElementKind PREFIX =
-      const ElementKind('PREFIX', 30, "import prefix");
+      const ElementKind('PREFIX', 19, "import prefix");
 
-  static const ElementKind SETTER = const ElementKind('SETTER', 31, "setter");
+  static const ElementKind SETTER = const ElementKind('SETTER', 20, "setter");
 
   static const ElementKind TOP_LEVEL_VARIABLE =
-      const ElementKind('TOP_LEVEL_VARIABLE', 32, "top level variable");
+      const ElementKind('TOP_LEVEL_VARIABLE', 21, "top level variable");
 
   static const ElementKind FUNCTION_TYPE_ALIAS =
-      const ElementKind('FUNCTION_TYPE_ALIAS', 33, "function type alias");
+      const ElementKind('FUNCTION_TYPE_ALIAS', 22, "function type alias");
 
   static const ElementKind TYPE_PARAMETER =
-      const ElementKind('TYPE_PARAMETER', 34, "type parameter");
+      const ElementKind('TYPE_PARAMETER', 23, "type parameter");
 
   static const ElementKind UNIVERSE =
-      const ElementKind('UNIVERSE', 35, "<universe>");
+      const ElementKind('UNIVERSE', 24, "<universe>");
 
   static const List<ElementKind> values = const [
-      ANGULAR_FORMATTER,
-      ANGULAR_COMPONENT,
-      ANGULAR_CONTROLLER,
-      ANGULAR_DIRECTIVE,
-      ANGULAR_PROPERTY,
-      ANGULAR_SCOPE_PROPERTY,
-      ANGULAR_SELECTOR,
-      ANGULAR_VIEW,
       CLASS,
       COMPILATION_UNIT,
       CONSTRUCTOR,
@@ -3948,9 +3075,6 @@
       METHOD,
       NAME,
       PARAMETER,
-      POLYMER_ATTRIBUTE,
-      POLYMER_TAG_DART,
-      POLYMER_TAG_HTML,
       PREFIX,
       SETTER,
       TOP_LEVEL_VARIABLE,
@@ -4230,22 +3354,6 @@
  * element structure.
  */
 abstract class ElementVisitor<R> {
-  R visitAngularComponentElement(AngularComponentElement element);
-
-  R visitAngularControllerElement(AngularControllerElement element);
-
-  R visitAngularDirectiveElement(AngularDecoratorElement element);
-
-  R visitAngularFormatterElement(AngularFormatterElement element);
-
-  R visitAngularPropertyElement(AngularPropertyElement element);
-
-  R visitAngularScopePropertyElement(AngularScopePropertyElement element);
-
-  R visitAngularSelectorElement(AngularSelectorElement element);
-
-  R visitAngularViewElement(AngularViewElement element);
-
   R visitClassElement(ClassElement element);
 
   R visitCompilationUnitElement(CompilationUnitElement element);
@@ -4282,12 +3390,6 @@
 
   R visitParameterElement(ParameterElement element);
 
-  R visitPolymerAttributeElement(PolymerAttributeElement element);
-
-  R visitPolymerTagDartElement(PolymerTagDartElement element);
-
-  R visitPolymerTagHtmlElement(PolymerTagHtmlElement element);
-
   R visitPrefixElement(PrefixElement element);
 
   R visitPropertyAccessorElement(PropertyAccessorElement element);
@@ -4904,6 +4006,10 @@
   ClassElement get enclosingElement => super.enclosingElement as ClassElement;
 
   @override
+  bool get isEnumConstant =>
+      enclosingElement != null ? enclosingElement.isEnum : false;
+
+  @override
   bool get isStatic => hasModifier(Modifier.STATIC);
 
   @override
@@ -4920,10 +4026,6 @@
 
   @override
   accept(ElementVisitor visitor) => visitor.visitFieldElement(this);
-
-  @override
-  bool get isEnumConstant =>
-      enclosingElement != null ? enclosingElement.isEnum : false;
 }
 
 /**
@@ -5025,6 +4127,9 @@
       PropertyAccessorMember.from(baseElement.getter, definingType);
 
   @override
+  bool get isEnumConstant => baseElement.isEnumConstant;
+
+  @override
   bool get isStatic => baseElement.isStatic;
 
   @override
@@ -5096,9 +4201,6 @@
     }
     return false;
   }
-
-  @override
-  bool get isEnumConstant => baseElement.isEnumConstant;
 }
 
 /**
@@ -6338,44 +5440,6 @@
  */
 class GeneralizingElementVisitor<R> implements ElementVisitor<R> {
   @override
-  R visitAngularComponentElement(AngularComponentElement element) =>
-      visitAngularHasSelectorElement(element);
-
-  @override
-  R visitAngularControllerElement(AngularControllerElement element) =>
-      visitAngularHasSelectorElement(element);
-
-  @override
-  R visitAngularDirectiveElement(AngularDecoratorElement element) =>
-      visitAngularHasSelectorElement(element);
-
-  R visitAngularElement(AngularElement element) =>
-      visitToolkitObjectElement(element);
-
-  @override
-  R visitAngularFormatterElement(AngularFormatterElement element) =>
-      visitAngularElement(element);
-
-  R visitAngularHasSelectorElement(AngularHasSelectorElement element) =>
-      visitAngularElement(element);
-
-  @override
-  R visitAngularPropertyElement(AngularPropertyElement element) =>
-      visitAngularElement(element);
-
-  @override
-  R visitAngularScopePropertyElement(AngularScopePropertyElement element) =>
-      visitAngularElement(element);
-
-  @override
-  R visitAngularSelectorElement(AngularSelectorElement element) =>
-      visitAngularElement(element);
-
-  @override
-  R visitAngularViewElement(AngularViewElement element) =>
-      visitAngularElement(element);
-
-  @override
   R visitClassElement(ClassElement element) => visitElement(element);
 
   @override
@@ -6461,21 +5525,6 @@
       visitLocalElement(element);
 
   @override
-  R visitPolymerAttributeElement(PolymerAttributeElement element) =>
-      visitPolymerElement(element);
-
-  R visitPolymerElement(PolymerElement element) =>
-      visitToolkitObjectElement(element);
-
-  @override
-  R visitPolymerTagDartElement(PolymerTagDartElement element) =>
-      visitPolymerElement(element);
-
-  @override
-  R visitPolymerTagHtmlElement(PolymerTagHtmlElement element) =>
-      visitPolymerElement(element);
-
-  @override
   R visitPrefixElement(PrefixElement element) => visitElement(element);
 
   @override
@@ -6485,9 +5534,6 @@
   R visitPropertyInducingElement(PropertyInducingElement element) =>
       visitVariableElement(element);
 
-  R visitToolkitObjectElement(ToolkitObjectElement element) =>
-      visitElement(element);
-
   @override
   R visitTopLevelVariableElement(TopLevelVariableElement element) =>
       visitPropertyInducingElement(element);
@@ -6500,28 +5546,6 @@
 }
 
 /**
- * Implementation of [AngularSelectorElement] based on presence of attribute.
- */
-class HasAttributeSelectorElementImpl extends AngularSelectorElementImpl
-    implements AngularHasAttributeSelectorElement {
-  HasAttributeSelectorElementImpl(String attributeName, int offset)
-      : super(attributeName, offset);
-
-  @override
-  void appendTo(StringBuffer buffer) {
-    buffer.write("[");
-    buffer.write(name);
-    buffer.write("]");
-  }
-
-  @override
-  bool apply(XmlTagNode node) {
-    String attributeName = name;
-    return node.getAttribute(attributeName) != null;
-  }
-}
-
-/**
  * The interface `HideElementCombinator` defines the behavior of combinators that cause some
  * of the names in a namespace to be hidden when being imported.
  */
@@ -6566,20 +5590,6 @@
  */
 abstract class HtmlElement implements Element {
   /**
-   * Return the [CompilationUnitElement] associated with this Angular HTML file, maybe
-   * `null` if not an Angular file.
-   */
-  CompilationUnitElement get angularCompilationUnit;
-
-  /**
-   * Return an array containing all of the [PolymerTagHtmlElement]s defined in the HTML file.
-   *
-   * @return the [PolymerTagHtmlElement]s elements in the HTML file (not `null`,
-   *         contains no `null`s)
-   */
-  List<PolymerTagHtmlElement> get polymerTags;
-
-  /**
    * Return an array containing all of the script elements contained in the HTML file. This includes
    * scripts with libraries that are defined by the content of a script tag as well as libraries
    * that are referenced in the {@core source} attribute of a script tag.
@@ -6609,22 +5619,11 @@
   List<HtmlScriptElement> _scripts = HtmlScriptElementImpl.EMPTY_ARRAY;
 
   /**
-   * The [PolymerTagHtmlElement]s defined in the HTML file.
-   */
-  List<PolymerTagHtmlElement> _polymerTags = PolymerTagHtmlElement.EMPTY_ARRAY;
-
-  /**
    * The source that corresponds to this HTML file.
    */
   Source source;
 
   /**
-   * The element associated with Dart pieces in this HTML unit or `null` if the receiver is
-   * not resolved.
-   */
-  CompilationUnitElement angularCompilationUnit;
-
-  /**
    * Initialize a newly created HTML element to have the given name.
    *
    * @param context the analysis context in which the HTML file is defined
@@ -6642,23 +5641,6 @@
   ElementKind get kind => ElementKind.HTML;
 
   @override
-  List<PolymerTagHtmlElement> get polymerTags => _polymerTags;
-
-  /**
-   * Set the [PolymerTagHtmlElement]s defined in the HTML file.
-   */
-  void set polymerTags(List<PolymerTagHtmlElement> polymerTags) {
-    if (polymerTags.length == 0) {
-      this._polymerTags = PolymerTagHtmlElement.EMPTY_ARRAY;
-      return;
-    }
-    for (PolymerTagHtmlElement tag in polymerTags) {
-      (tag as PolymerTagHtmlElementImpl).enclosingElement = this;
-    }
-    this._polymerTags = polymerTags;
-  }
-
-  @override
   List<HtmlScriptElement> get scripts => _scripts;
 
   /**
@@ -6705,7 +5687,6 @@
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(_scripts, visitor);
-    safelyVisitChildren(_polymerTags, visitor);
   }
 }
 
@@ -8075,29 +7056,6 @@
 }
 
 /**
- * Combination of [AngularTagSelectorElementImpl] and [HasAttributeSelectorElementImpl].
- */
-class IsTagHasAttributeSelectorElementImpl extends AngularSelectorElementImpl {
-  String _tagName;
-
-  String _attributeName;
-
-  IsTagHasAttributeSelectorElementImpl(String tagName, String attributeName)
-      : super("$tagName[$attributeName]", -1) {
-    this._tagName = tagName;
-    this._attributeName = attributeName;
-  }
-
-  String get attributeName => _attributeName;
-
-  String get tagName => _tagName;
-
-  @override
-  bool apply(XmlTagNode node) =>
-      node.tag == _tagName && node.getAttribute(_attributeName) != null;
-}
-
-/**
  * The interface `LabelElement` defines the behavior of elements representing a label
  * associated with a statement.
  */
@@ -8233,14 +7191,6 @@
   List<ImportElement> get imports;
 
   /**
-   * Return `true` if this library is created for Angular analysis. If this library has not
-   * yet had toolkit references resolved, then `false` will be returned.
-   *
-   * @return `true` if this library is created for Angular analysis
-   */
-  bool get isAngularHtml;
-
-  /**
    * Return `true` if this library is an application that can be run in the browser.
    *
    * @return `true` if this library is an application that can be run in the browser
@@ -8367,11 +7317,6 @@
   List<CompilationUnitElement> _parts = CompilationUnitElementImpl.EMPTY_ARRAY;
 
   /**
-   * Is `true` if this library is created for Angular analysis.
-   */
-  bool _isAngularHtml = false;
-
-  /**
    * The element representing the synthetic function `loadLibrary` that is defined for this
    * library, or `null` if the element has not yet been created.
    */
@@ -8397,13 +7342,6 @@
   LibraryElementImpl.forNode(this.context, LibraryIdentifier name)
       : super.forNode(name);
 
-  /**
-   * Specifies if this library is created for Angular analysis.
-   */
-  void set angularHtml(bool isAngularHtml) {
-    this._isAngularHtml = isAngularHtml;
-  }
-
   @override
   CompilationUnitElement get definingCompilationUnit =>
       _definingCompilationUnit;
@@ -8510,9 +7448,6 @@
   }
 
   @override
-  bool get isAngularHtml => _isAngularHtml;
-
-  @override
   bool get isBrowserApplication =>
       entryPoint != null && isOrImportsBrowserLibrary;
 
@@ -8835,12 +7770,6 @@
  * a local variable.
  */
 abstract class LocalVariableElement implements LocalElement, VariableElement {
-  /**
-   * Return an array containing all of the toolkit specific objects attached to this variable.
-   *
-   * @return the toolkit objects attached to this variable
-   */
-  List<ToolkitObjectElement> get toolkitObjects;
 }
 
 /**
@@ -8903,30 +7832,6 @@
   ElementKind get kind => ElementKind.LOCAL_VARIABLE;
 
   @override
-  List<ToolkitObjectElement> get toolkitObjects {
-    CompilationUnitElementImpl unit =
-        getAncestor((element) => element is CompilationUnitElementImpl);
-    if (unit == null) {
-      return ToolkitObjectElement.EMPTY_ARRAY;
-    }
-    return unit._getToolkitObjects(this);
-  }
-
-  /**
-   * Set the toolkit specific information objects attached to this variable.
-   *
-   * @param toolkitObjects the toolkit objects attached to this variable
-   */
-  void set toolkitObjects(List<ToolkitObjectElement> toolkitObjects) {
-    CompilationUnitElementImpl unit =
-        getAncestor((element) => element is CompilationUnitElementImpl);
-    if (unit == null) {
-      return;
-    }
-    unit._setToolkitObjects(this, toolkitObjects);
-  }
-
-  @override
   SourceRange get visibleRange {
     if (_visibleRangeLength < 0) {
       return null;
@@ -10191,221 +9096,6 @@
 }
 
 /**
- * The interface `PolymerAttributeElement` defines an attribute in
- * [PolymerTagHtmlElement].
- *
- * <pre>
- * <polymer-element name="my-example" attributes='attrA attrB'>
- * </polymer-element>
- * </pre>
- */
-abstract class PolymerAttributeElement implements PolymerElement {
-  /**
-   * An empty list of Polymer custom tag attributes.
-   */
-  static const List<PolymerAttributeElement> EMPTY_ARRAY = const
-      <PolymerAttributeElement>[
-      ];
-
-  /**
-   * Return the [FieldElement] associated with this attribute. Maybe `null` if
-   * [PolymerTagDartElement] does not have a field associated with it.
-   */
-  FieldElement get field;
-}
-
-/**
- * Implementation of `PolymerAttributeElement`.
- */
-class PolymerAttributeElementImpl extends PolymerElementImpl implements
-    PolymerAttributeElement {
-  /**
-   * The [FieldElement] associated with this attribute.
-   */
-  FieldElement field;
-
-  /**
-   * Initialize a newly created Polymer attribute to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  PolymerAttributeElementImpl(String name, int nameOffset)
-      : super(name, nameOffset);
-
-  @override
-  ElementKind get kind => ElementKind.POLYMER_ATTRIBUTE;
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitPolymerAttributeElement(this);
-}
-
-/**
- * The interface `PolymerElement` defines the behavior of objects representing information
- * about a Polymer specific element.
- */
-abstract class PolymerElement implements ToolkitObjectElement {
-  /**
-   * An empty list of Polymer elements.
-   */
-  static const List<PolymerElement> EMPTY_ARRAY = const <PolymerElement>[];
-}
-
-/**
- * Implementation of `PolymerElement`.
- */
-abstract class PolymerElementImpl extends ToolkitObjectElementImpl implements
-    PolymerElement {
-  /**
-   * Initialize a newly created Polymer element to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  PolymerElementImpl(String name, int nameOffset) : super(name, nameOffset);
-}
-
-/**
- * The interface `PolymerTagDartElement` defines a Polymer custom tag in Dart.
- *
- * <pre>
- * @CustomTag('my-example')
- * </pre>
- */
-abstract class PolymerTagDartElement implements PolymerElement {
-  /**
-   * Return the [ClassElement] that is associated with this Polymer custom tag. Not
-   * `null`, because [PolymerTagDartElement]s are created for [ClassElement]s
-   * marked with the `@CustomTag` annotation.
-   */
-  ClassElement get classElement;
-
-  /**
-   * Return the [PolymerTagHtmlElement] part of this Polymer custom tag. Maybe `null` if
-   * it has not been resolved yet or there are no corresponding Dart part defined.
-   */
-  PolymerTagHtmlElement get htmlElement;
-}
-
-/**
- * Implementation of `PolymerTagDartElement`.
- */
-class PolymerTagDartElementImpl extends PolymerElementImpl implements
-    PolymerTagDartElement {
-  /**
-   * The [ClassElement] that is associated with this Polymer custom tag.
-   */
-  final ClassElement classElement;
-
-  /**
-   * The [PolymerTagHtmlElement] part of this Polymer custom tag. Maybe `null` if it has
-   * not been resolved yet or there are no corresponding Dart part defined.
-   */
-  PolymerTagHtmlElement htmlElement;
-
-  /**
-   * Initialize a newly created Dart part of a Polymer tag to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  PolymerTagDartElementImpl(String name, int nameOffset, this.classElement)
-      : super(name, nameOffset);
-
-  @override
-  ElementKind get kind => ElementKind.POLYMER_TAG_DART;
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitPolymerTagDartElement(this);
-}
-
-/**
- * The interface `PolymerTagHtmlElement` defines a Polymer custom tag in HTML.
- *
- * <pre>
- * <polymer-element name="my-example" attributes='attrA attrB'>
- * </polymer-element>
- * </pre>
- */
-abstract class PolymerTagHtmlElement implements PolymerElement {
-  /**
-   * An empty list of [PolymerTagHtmlElement]s.
-   */
-  static const List<PolymerTagHtmlElement> EMPTY_ARRAY = const
-      <PolymerTagHtmlElement>[
-      ];
-
-  /**
-   * Return an array containing all of the attributes declared by this tag.
-   */
-  List<PolymerAttributeElement> get attributes;
-
-  /**
-   * Return the [PolymerTagDartElement] part on this Polymer custom tag. Maybe `null` if
-   * it has not been resolved yet or there are no corresponding Dart part defined.
-   */
-  PolymerTagDartElement get dartElement;
-}
-
-/**
- * Implementation of `PolymerTagHtmlElement`.
- */
-class PolymerTagHtmlElementImpl extends PolymerElementImpl implements
-    PolymerTagHtmlElement {
-  /**
-   * The [PolymerTagDartElement] part of this Polymer custom tag. Maybe `null` if it has
-   * not been resolved yet or there are no corresponding Dart part defined.
-   */
-  PolymerTagDartElement dartElement;
-
-  /**
-   * The array containing all of the attributes declared by this tag.
-   */
-  List<PolymerAttributeElement> _attributes =
-      PolymerAttributeElement.EMPTY_ARRAY;
-
-  /**
-   * Initialize a newly created HTML part of a Polymer tag to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  PolymerTagHtmlElementImpl(String name, int nameOffset)
-      : super(name, nameOffset);
-
-  @override
-  List<PolymerAttributeElement> get attributes => _attributes;
-
-  /**
-   * Set an array containing all of the attributes declared by this tag.
-   *
-   * @param attributes the properties to set
-   */
-  void set attributes(List<PolymerAttributeElement> attributes) {
-    for (PolymerAttributeElement property in attributes) {
-      encloseElement(property as PolymerAttributeElementImpl);
-    }
-    this._attributes = attributes;
-  }
-
-  @override
-  ElementKind get kind => ElementKind.POLYMER_TAG_HTML;
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitPolymerTagHtmlElement(this);
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    safelyVisitChildren(_attributes, visitor);
-    super.visitChildren(visitor);
-  }
-}
-
-/**
  * The interface `PrefixElement` defines the behavior common to elements that represent a
  * prefix used to import one or more libraries into another library.
  */
@@ -10975,54 +9665,6 @@
  */
 class RecursiveElementVisitor<R> implements ElementVisitor<R> {
   @override
-  R visitAngularComponentElement(AngularComponentElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitAngularControllerElement(AngularControllerElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitAngularDirectiveElement(AngularDecoratorElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitAngularFormatterElement(AngularFormatterElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitAngularPropertyElement(AngularPropertyElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitAngularScopePropertyElement(AngularScopePropertyElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitAngularSelectorElement(AngularSelectorElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitAngularViewElement(AngularViewElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
   R visitClassElement(ClassElement element) {
     element.visitChildren(this);
     return null;
@@ -11131,24 +9773,6 @@
   }
 
   @override
-  R visitPolymerAttributeElement(PolymerAttributeElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitPolymerTagDartElement(PolymerTagDartElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitPolymerTagHtmlElement(PolymerTagHtmlElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
   R visitPrefixElement(PrefixElement element) {
     element.visitChildren(this);
     return null;
@@ -11245,31 +9869,6 @@
  */
 class SimpleElementVisitor<R> implements ElementVisitor<R> {
   @override
-  R visitAngularComponentElement(AngularComponentElement element) => null;
-
-  @override
-  R visitAngularControllerElement(AngularControllerElement element) => null;
-
-  @override
-  R visitAngularDirectiveElement(AngularDecoratorElement element) => null;
-
-  @override
-  R visitAngularFormatterElement(AngularFormatterElement element) => null;
-
-  @override
-  R visitAngularPropertyElement(AngularPropertyElement element) => null;
-
-  @override
-  R visitAngularScopePropertyElement(AngularScopePropertyElement element) =>
-      null;
-
-  @override
-  R visitAngularSelectorElement(AngularSelectorElement element) => null;
-
-  @override
-  R visitAngularViewElement(AngularViewElement element) => null;
-
-  @override
   R visitClassElement(ClassElement element) => null;
 
   @override
@@ -11325,15 +9924,6 @@
   R visitParameterElement(ParameterElement element) => null;
 
   @override
-  R visitPolymerAttributeElement(PolymerAttributeElement element) => null;
-
-  @override
-  R visitPolymerTagDartElement(PolymerTagDartElement element) => null;
-
-  @override
-  R visitPolymerTagHtmlElement(PolymerTagHtmlElement element) => null;
-
-  @override
   R visitPrefixElement(PrefixElement element) => null;
 
   @override
@@ -11347,36 +9937,6 @@
 }
 
 /**
- * The interface `ToolkitObjectElement` defines the behavior of elements that represent a
- * toolkit specific object, such as Angular controller or component. These elements are not based on
- * the Dart syntax, but on some semantic agreement, such as a special annotation.
- */
-abstract class ToolkitObjectElement implements Element {
-  /**
-   * An empty list of toolkit object elements.
-   */
-  static const List<ToolkitObjectElement> EMPTY_ARRAY = const
-      <ToolkitObjectElement>[
-      ];
-}
-
-/**
- * Instances of the class `ToolkitObjectElementImpl` implement a `ToolkitObjectElement`.
- */
-abstract class ToolkitObjectElementImpl extends ElementImpl implements
-    ToolkitObjectElement {
-  /**
-   * Initialize a newly created toolkit object element to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  ToolkitObjectElementImpl(String name, int nameOffset)
-      : super(name, nameOffset);
-}
-
-/**
  * The interface `TopLevelVariableElement` defines the behavior of elements representing a
  * top-level variable.
  */
diff --git a/pkg/analyzer/lib/src/generated/element_handle.dart b/pkg/analyzer/lib/src/generated/element_handle.dart
index 9e36518..b84e36e 100644
--- a/pkg/analyzer/lib/src/generated/element_handle.dart
+++ b/pkg/analyzer/lib/src/generated/element_handle.dart
@@ -89,9 +89,6 @@
   InterfaceType get supertype => actualElement.supertype;
 
   @override
-  List<ToolkitObjectElement> get toolkitObjects => actualElement.toolkitObjects;
-
-  @override
   InterfaceType get type => actualElement.type;
 
   @override
@@ -184,9 +181,6 @@
       super.actualElement as CompilationUnitElement;
 
   @override
-  List<AngularViewElement> get angularViews => actualElement.angularViews;
-
-  @override
   LibraryElement get enclosingElement =>
       super.enclosingElement as LibraryElement;
 
@@ -781,9 +775,6 @@
   List<ImportElement> get imports => actualElement.imports;
 
   @override
-  bool get isAngularHtml => actualElement.isAngularHtml;
-
-  @override
   bool get isBrowserApplication => actualElement.isBrowserApplication;
 
   @override
@@ -842,9 +833,6 @@
   ElementKind get kind => ElementKind.LOCAL_VARIABLE;
 
   @override
-  List<ToolkitObjectElement> get toolkitObjects => actualElement.toolkitObjects;
-
-  @override
   SourceRange get visibleRange => actualElement.visibleRange;
 }
 
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 4f8f2ef..5ea16a5 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -33,6 +33,7 @@
 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
@@ -580,16 +581,6 @@
   bool exists(Source source);
 
   /**
-   * Return the Angular application that contains the HTML file defined by the given source, or
-   * `null` if the source does not represent an HTML file, the Angular application containing
-   * the file has not yet been resolved, or the analysis of the HTML file failed for some reason.
-   *
-   * @param htmlSource the source defining the HTML file
-   * @return the Angular application that contains the HTML file defined by the given source
-   */
-  AngularApplication getAngularApplicationWithHtml(Source htmlSource);
-
-  /**
    * Return the element model corresponding to the compilation unit defined by the given source in
    * the library defined by the given source, or `null` if the element model does not
    * currently exist or if the library cannot be analyzed for some reason.
@@ -930,6 +921,16 @@
   static bool _TRACE_PERFORM_TASK = false;
 
   /**
+   * The next context identifier.
+   */
+  static int _NEXT_ID = 0;
+
+  /**
+   * The unique identifier of this context.
+   */
+  final int _id = _NEXT_ID++;
+
+  /**
    * The set of analysis options controlling the behavior of this context.
    */
   AnalysisOptionsImpl _options = new AnalysisOptionsImpl();
@@ -1025,9 +1026,9 @@
   WorkManager _workManager = new WorkManager();
 
   /**
-   * The set of [AngularApplication] in this context.
+   * The [Stopwatch] of the current "perform tasks cycle".
    */
-  Set<AngularApplication> _angularApplications = new Set();
+  Stopwatch _performAnalysisTaskStopwatch;
 
   /**
    * The controller for sending [SourcesChangedEvent]s.
@@ -1041,6 +1042,26 @@
   List<AnalysisListener> _listeners = new List<AnalysisListener>();
 
   /**
+   * The most recently incrementally resolved [Source].
+   * Is null when it was already validated, or the most recent change was
+   * not incrementally resolved.
+   */
+  Source incrementalResolutionValidation_lastUnitSource;
+
+  /**
+   * The most recently incrementally resolved library [Source].
+   * Is null when it was already validated, or the most recent change was
+   * not incrementally resolved.
+   */
+  Source incrementalResolutionValidation_lastLibrarySource;
+
+  /**
+   * The result of incremental resolution result of
+   * [incrementalResolutionValidation_lastSource].
+   */
+  CompilationUnit incrementalResolutionValidation_lastUnit;
+
+  /**
    * Initialize a newly created analysis context.
    */
   AnalysisContextImpl() {
@@ -1060,11 +1081,8 @@
   @override
   void set analysisOptions(AnalysisOptions options) {
     bool needsRecompute =
-        this._options.analyzeAngular != options.analyzeAngular ||
         this._options.analyzeFunctionBodies != options.analyzeFunctionBodies ||
         this._options.generateSdkErrors != options.generateSdkErrors ||
-        this._options.enableDeferredLoading != options.enableDeferredLoading ||
-        this._options.enableEnum != options.enableEnum ||
         this._options.dart2jsHint != options.dart2jsHint ||
         (this._options.hint && !options.hint) ||
         this._options.preserveComments != options.preserveComments;
@@ -1091,11 +1109,8 @@
         _priorityOrder = newPriorityOrder;
       }
     }
-    this._options.analyzeAngular = options.analyzeAngular;
     this._options.analyzeFunctionBodies = options.analyzeFunctionBodies;
     this._options.generateSdkErrors = options.generateSdkErrors;
-    this._options.enableDeferredLoading = options.enableDeferredLoading;
-    this._options.enableEnum = options.enableEnum;
     this._options.dart2jsHint = options.dart2jsHint;
     this._options.hint = options.hint;
     this._options.incremental = options.incremental;
@@ -1192,6 +1207,7 @@
    */
   AnalysisTask get nextAnalysisTask {
     bool hintsEnabled = _options.hint;
+    bool lintsEnabled = _options.lint;
     bool hasBlockedTask = false;
     //
     // Look for incremental analysis
@@ -1224,8 +1240,12 @@
           sourcesToRemove.add(source);
           continue;
         }
-        AnalysisContextImpl_TaskData taskData =
-            _getNextAnalysisTaskForSource(source, sourceEntry, true, hintsEnabled);
+        AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(
+            source,
+            sourceEntry,
+            true,
+            hintsEnabled,
+            lintsEnabled);
         task = taskData.task;
         if (task != null) {
           break;
@@ -1253,8 +1273,12 @@
     int priorityCount = _priorityOrder.length;
     for (int i = 0; i < priorityCount; i++) {
       Source source = _priorityOrder[i];
-      AnalysisContextImpl_TaskData taskData =
-          _getNextAnalysisTaskForSource(source, _cache.get(source), true, hintsEnabled);
+      AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(
+          source,
+          _cache.get(source),
+          true,
+          hintsEnabled,
+          lintsEnabled);
       AnalysisTask task = taskData.task;
       if (task != null) {
         return task;
@@ -1297,8 +1321,12 @@
     try {
       while (sources.hasNext) {
         Source source = sources.next();
-        AnalysisContextImpl_TaskData taskData =
-            _getNextAnalysisTaskForSource(source, _cache.get(source), false, hintsEnabled);
+        AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(
+            source,
+            _cache.get(source),
+            false,
+            hintsEnabled,
+            lintsEnabled);
         AnalysisTask task = taskData.task;
         if (task != null) {
           return task;
@@ -1382,6 +1410,8 @@
   List<Source> get sourcesNeedingProcessing {
     HashSet<Source> sources = new HashSet<Source>();
     bool hintsEnabled = _options.hint;
+    bool lintsEnabled = _options.lint;
+
     //
     // Look for priority sources that need to be analyzed.
     //
@@ -1391,6 +1421,7 @@
           _cache.get(source),
           true,
           hintsEnabled,
+          lintsEnabled,
           sources);
     }
     //
@@ -1404,6 +1435,7 @@
           _cache.get(source),
           false,
           hintsEnabled,
+          lintsEnabled,
           sources);
     }
     return new List<Source>.from(sources);
@@ -1590,6 +1622,8 @@
   @override
   List<AnalysisError> computeErrors(Source source) {
     bool enableHints = _options.hint;
+    bool enableLints = _options.lint;
+
     SourceEntry sourceEntry = _getReadableSourceEntry(source);
     if (sourceEntry is DartEntry) {
       List<AnalysisError> errors = new List<AnalysisError>();
@@ -1621,6 +1655,12 @@
                 errors,
                 _getDartHintData(source, source, dartEntry, DartEntry.HINTS));
           }
+          if (enableLints) {
+            dartEntry = _getReadableDartEntry(source);
+            ListUtilities.addAll(
+                errors,
+                _getDartLintData(source, source, dartEntry, DartEntry.LINTS));
+          }
         } else {
           List<Source> libraries = getLibrariesContaining(source);
           for (Source librarySource in libraries) {
@@ -1645,6 +1685,12 @@
                   errors,
                   _getDartHintData(source, librarySource, dartEntry, DartEntry.HINTS));
             }
+            if (enableLints) {
+              dartEntry = _getReadableDartEntry(source);
+              ListUtilities.addAll(
+                  errors,
+                  _getDartLintData(source, librarySource, dartEntry, DartEntry.LINTS));
+            }
           }
         }
       } on ObsoleteSourceAnalysisException catch (exception, stackTrace) {
@@ -1820,21 +1866,6 @@
   }
 
   @override
-  AngularApplication getAngularApplicationWithHtml(Source htmlSource) {
-    SourceEntry sourceEntry = getReadableSourceEntryOrNull(htmlSource);
-    if (sourceEntry is HtmlEntry) {
-      HtmlEntry htmlEntry = sourceEntry;
-      AngularApplication application =
-          htmlEntry.getValue(HtmlEntry.ANGULAR_APPLICATION);
-      if (application != null) {
-        return application;
-      }
-      return htmlEntry.getValue(HtmlEntry.ANGULAR_ENTRY);
-    }
-    return null;
-  }
-
-  @override
   CompilationUnitElement getCompilationUnitElement(Source unitSource,
       Source librarySource) {
     LibraryElement libraryElement = getLibraryElement(librarySource);
@@ -2158,12 +2189,23 @@
       task = nextAnalysisTask;
     }
     if (task == null) {
+      _validateLastIncrementalResolutionResult();
+      if (_performAnalysisTaskStopwatch != null) {
+        AnalysisEngine.instance.instrumentationService.logPerformance(
+            AnalysisPerformanceKind.FULL,
+            _performAnalysisTaskStopwatch,
+            'context_id=$_id');
+        _performAnalysisTaskStopwatch = null;
+      }
       return new AnalysisResult(
           _getChangeNotices(true),
           getEnd - getStart,
           null,
           -1);
     }
+    if (_performAnalysisTaskStopwatch == null) {
+      _performAnalysisTaskStopwatch = new Stopwatch()..start();
+    }
     String taskDescription = task.toString();
     _notifyAboutToPerformTask(taskDescription);
     if (_TRACE_PERFORM_TASK) {
@@ -2207,6 +2249,32 @@
         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);
@@ -2219,7 +2287,6 @@
         _recordElementData(dartEntry, library, library.source, htmlSource);
         dartEntry.setState(SourceEntry.CONTENT, CacheState.FLUSHED);
         dartEntry.setValue(SourceEntry.LINE_INFO, new LineInfo(<int>[0]));
-        dartEntry.setValue(DartEntry.ANGULAR_ERRORS, AnalysisError.NO_ERRORS);
         // DartEntry.ELEMENT - set in recordElementData
         dartEntry.setValue(DartEntry.EXPORTED_LIBRARIES, Source.EMPTY_ARRAY);
         dartEntry.setValue(DartEntry.IMPORTED_LIBRARIES, Source.EMPTY_ARRAY);
@@ -2248,6 +2315,10 @@
             DartEntry.HINTS,
             librarySource,
             AnalysisError.NO_ERRORS);
+        dartEntry.setValueInLibrary(
+            DartEntry.LINTS,
+            librarySource,
+            AnalysisError.NO_ERRORS);
       }
     });
   }
@@ -2474,6 +2545,7 @@
   void visitCacheItems(void callback(Source source, SourceEntry dartEntry,
       DataDescriptor rowDesc, CacheState state)) {
     bool hintsEnabled = _options.hint;
+    bool lintsEnabled = _options.lint;
     MapIterator<Source, SourceEntry> iterator = _cache.iterator();
     while (iterator.moveNext()) {
       Source source = iterator.key;
@@ -2490,15 +2562,6 @@
           // The public namespace isn't computed by performAnalysisTask()
           // and therefore isn't interesting.
           continue;
-        } else if (descriptor == HtmlEntry.ANGULAR_APPLICATION ||
-            descriptor == HtmlEntry.ANGULAR_COMPONENT ||
-            descriptor == HtmlEntry.ANGULAR_ENTRY ||
-            descriptor == HtmlEntry.ANGULAR_ERRORS ||
-            descriptor == HtmlEntry.POLYMER_BUILD_ERRORS ||
-            descriptor == HtmlEntry.POLYMER_RESOLUTION_ERRORS) {
-          // These values are not currently being computed, so their state is
-          // not interesting.
-          continue;
         } else if (descriptor == HtmlEntry.HINTS) {
           // We are not currently recording any hints related to HTML.
           continue;
@@ -2514,8 +2577,7 @@
         List<Source> librarySources = getLibrariesContaining(source);
         for (Source librarySource in librarySources) {
           for (DataDescriptor descriptor in sourceEntry.libraryDescriptors) {
-            if (descriptor == DartEntry.ANGULAR_ERRORS ||
-                descriptor == DartEntry.BUILT_ELEMENT ||
+            if (descriptor == DartEntry.BUILT_ELEMENT ||
                 descriptor == DartEntry.BUILT_UNIT) {
               // These values are not currently being computed, so their state
               // is not interesting.
@@ -2523,10 +2585,13 @@
             } else if (source.isInSystemLibrary &&
                 !_generateSdkErrors &&
                 (descriptor == DartEntry.VERIFICATION_ERRORS ||
-                    descriptor == DartEntry.HINTS)) {
+                    descriptor == DartEntry.HINTS ||
+                    descriptor == DartEntry.LINTS)) {
               continue;
             } else if (!hintsEnabled && descriptor == DartEntry.HINTS) {
               continue;
+            } else if (!lintsEnabled && descriptor == DartEntry.LINTS) {
+              continue;
             }
             callback(
                 librarySource,
@@ -2633,6 +2698,73 @@
   }
 
   /**
+   * Given a source for a Dart file and the library that contains it, return a cache entry in which
+   * the state of the data represented by the given descriptor is either [CacheState.VALID] or
+   * [CacheStateERROR]. This method assumes that the data can be produced by generating lints
+   * for the library if the data is not already cached.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   *
+   * @param unitSource the source representing the Dart file
+   * @param librarySource the source representing the library containing the Dart file
+   * @param dartEntry the cache entry associated with the Dart file
+   * @param descriptor the descriptor representing the data to be returned
+   * @return a cache entry containing the required data
+   * @throws AnalysisException if data could not be returned because the source could not be parsed
+   */
+  DartEntry _cacheDartLintData(Source unitSource, Source librarySource,
+      DartEntry dartEntry, DataDescriptor descriptor) {
+    //
+    // Check to see whether we already have the information being requested.
+    //
+    CacheState state = dartEntry.getStateInLibrary(descriptor, librarySource);
+    while (state != CacheState.ERROR && state != CacheState.VALID) {
+      //
+      // If not, compute the information.
+      // Unless the modification date of the source continues to change,
+      // this loop will eventually terminate.
+      //
+      DartEntry libraryEntry = _getReadableDartEntry(librarySource);
+      libraryEntry = _cacheDartResolutionData(
+          librarySource,
+          librarySource,
+          libraryEntry,
+          DartEntry.ELEMENT);
+      LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
+      CompilationUnitElement definingUnit =
+          libraryElement.definingCompilationUnit;
+      List<CompilationUnitElement> parts = libraryElement.parts;
+      List<TimestampedData<CompilationUnit>> units =
+          new List<TimestampedData>(parts.length + 1);
+      units[0] = _getResolvedUnit(definingUnit, librarySource);
+      if (units[0] == null) {
+        Source source = definingUnit.source;
+        units[0] = new TimestampedData<CompilationUnit>(
+            getModificationStamp(source),
+            resolveCompilationUnit(source, libraryElement));
+      }
+      for (int i = 0; i < parts.length; i++) {
+        units[i + 1] = _getResolvedUnit(parts[i], librarySource);
+        if (units[i + 1] == null) {
+          Source source = parts[i].source;
+          units[i +
+              1] = new TimestampedData<CompilationUnit>(
+                  getModificationStamp(source),
+                  resolveCompilationUnit(source, libraryElement));
+        }
+      }
+      //TODO(pquitslund): revisit if we need all units or whether one will do
+      dartEntry = new GenerateDartLintsTask(
+          this,
+          units,
+          getLibraryElement(librarySource)).perform(_resultRecorder) as DartEntry;
+      state = dartEntry.getStateInLibrary(descriptor, librarySource);
+    }
+    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
    * method assumes that the data can be produced by parsing the source if it is not already cached.
@@ -3083,8 +3215,27 @@
     } else if (originalContents != null) {
       _incrementalAnalysisCache =
           IncrementalAnalysisCache.clear(_incrementalAnalysisCache, source);
-      _sourceChanged(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;
   }
@@ -3175,6 +3326,53 @@
   }
 
   /**
+   * Create a [GenerateDartLintsTask] for the given source, marking the lints as
+   * being in-process.
+   *
+   * @param source the source whose content is to be verified
+   * @param dartEntry the entry for the source
+   * @param librarySource the source for the library containing the source
+   * @param libraryEntry the entry for the library
+   * @return task data representing the created task
+   */
+  AnalysisContextImpl_TaskData _createGenerateDartLintsTask(Source source,
+      DartEntry dartEntry, Source librarySource, DartEntry libraryEntry) {
+    if (libraryEntry.getState(DartEntry.ELEMENT) != CacheState.VALID) {
+      return _createResolveDartLibraryTask(librarySource, libraryEntry);
+    }
+    LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
+    CompilationUnitElement definingUnit =
+        libraryElement.definingCompilationUnit;
+    List<CompilationUnitElement> parts = libraryElement.parts;
+    List<TimestampedData<CompilationUnit>> units =
+        new List<TimestampedData>(parts.length + 1);
+    units[0] = _getResolvedUnit(definingUnit, librarySource);
+    if (units[0] == null) {
+      // TODO(brianwilkerson) We should return a ResolveDartUnitTask
+      // (unless there are multiple ASTs that need to be resolved).
+      return _createResolveDartLibraryTask(librarySource, libraryEntry);
+    }
+    for (int i = 0; i < parts.length; i++) {
+      units[i + 1] = _getResolvedUnit(parts[i], librarySource);
+      if (units[i + 1] == null) {
+        // TODO(brianwilkerson) We should return a ResolveDartUnitTask
+        // (unless there are multiple ASTs that need to be resolved).
+        return _createResolveDartLibraryTask(librarySource, libraryEntry);
+      }
+    }
+    dartEntry.setStateInLibrary(
+        DartEntry.LINTS,
+        librarySource,
+        CacheState.IN_PROCESS);
+    //TODO(pquitslund): revisit if we need all units or whether one will do
+    return new AnalysisContextImpl_TaskData(
+        new GenerateDartLintsTask(this, units, libraryElement),
+        false);
+  }
+
+
+
+  /**
    * Create a [GetContentTask] for the given source, marking the content as being in-process.
    *
    * @param source the source whose content is to be accessed
@@ -3227,104 +3425,6 @@
   }
 
   /**
-   * Create a [PolymerBuildHtmlTask] for the given source, marking the Polymer elements as
-   * being in-process.
-   *
-   * @param source the source whose content is to be processed
-   * @param htmlEntry the entry for the source
-   * @return task data representing the created task
-   */
-  AnalysisContextImpl_TaskData _createPolymerBuildHtmlTask(Source source,
-      HtmlEntry htmlEntry) {
-    if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) {
-      return _createResolveHtmlTask(source, htmlEntry);
-    }
-    htmlEntry.setState(HtmlEntry.POLYMER_BUILD_ERRORS, CacheState.IN_PROCESS);
-    return new AnalysisContextImpl_TaskData(
-        new PolymerBuildHtmlTask(
-            this,
-            source,
-            htmlEntry.getValue(SourceEntry.LINE_INFO),
-            htmlEntry.getValue(HtmlEntry.RESOLVED_UNIT)),
-        false);
-  }
-
-  /**
-   * Create a [PolymerResolveHtmlTask] for the given source, marking the Polymer errors as
-   * being in-process.
-   *
-   * @param source the source whose content is to be resolved
-   * @param htmlEntry the entry for the source
-   * @return task data representing the created task
-   */
-  AnalysisContextImpl_TaskData _createPolymerResolveHtmlTask(Source source,
-      HtmlEntry htmlEntry) {
-    if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) {
-      return _createResolveHtmlTask(source, htmlEntry);
-    }
-    htmlEntry.setState(
-        HtmlEntry.POLYMER_RESOLUTION_ERRORS,
-        CacheState.IN_PROCESS);
-    return new AnalysisContextImpl_TaskData(
-        new PolymerResolveHtmlTask(
-            this,
-            source,
-            htmlEntry.getValue(SourceEntry.LINE_INFO),
-            htmlEntry.getValue(HtmlEntry.RESOLVED_UNIT)),
-        false);
-  }
-
-  /**
-   * Create a [ResolveAngularComponentTemplateTask] for the given source, marking the angular
-   * errors as being in-process.
-   *
-   * @param source the source whose content is to be resolved
-   * @param htmlEntry the entry for the source
-   * @return task data representing the created task
-   */
-  AnalysisContextImpl_TaskData
-      _createResolveAngularComponentTemplateTask(Source source, HtmlEntry htmlEntry) {
-    if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) {
-      return _createResolveHtmlTask(source, htmlEntry);
-    }
-    AngularApplication application =
-        htmlEntry.getValue(HtmlEntry.ANGULAR_APPLICATION);
-    AngularComponentElement component =
-        htmlEntry.getValue(HtmlEntry.ANGULAR_COMPONENT);
-    htmlEntry.setState(HtmlEntry.ANGULAR_ERRORS, CacheState.IN_PROCESS);
-    return new AnalysisContextImpl_TaskData(
-        new ResolveAngularComponentTemplateTask(
-            this,
-            source,
-            htmlEntry.getValue(HtmlEntry.RESOLVED_UNIT),
-            component,
-            application),
-        false);
-  }
-
-  /**
-   * Create a [ResolveAngularEntryHtmlTask] for the given source, marking the angular entry as
-   * being in-process.
-   *
-   * @param source the source whose content is to be resolved
-   * @param htmlEntry the entry for the source
-   * @return task data representing the created task
-   */
-  AnalysisContextImpl_TaskData _createResolveAngularEntryHtmlTask(Source source,
-      HtmlEntry htmlEntry) {
-    if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) {
-      return _createResolveHtmlTask(source, htmlEntry);
-    }
-    htmlEntry.setState(HtmlEntry.ANGULAR_ENTRY, CacheState.IN_PROCESS);
-    return new AnalysisContextImpl_TaskData(
-        new ResolveAngularEntryHtmlTask(
-            this,
-            source,
-            htmlEntry.getValue(HtmlEntry.RESOLVED_UNIT)),
-        false);
-  }
-
-  /**
    * Create a [ResolveDartLibraryTask] for the given source, marking ? as being in-process.
    *
    * @param source the source whose content is to be resolved
@@ -3469,6 +3569,31 @@
   }
 
   /**
+   * Given a source for a Dart file and the library that contains it, return the data represented by
+   * the given descriptor that is associated with that source. This method assumes that the data can
+   * be produced by generating lints for the library if it is not already cached.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   *
+   * @param unitSource the source representing the Dart file
+   * @param librarySource the source representing the library containing the Dart file
+   * @param dartEntry the entry representing the Dart file
+   * @param descriptor the descriptor representing the data to be returned
+   * @return the requested data about the given source
+   * @throws AnalysisException if data could not be returned because the source could not be
+   *           resolved
+   */
+  Object _getDartLintData(Source unitSource, Source librarySource,
+      DartEntry dartEntry, DataDescriptor descriptor) {
+    dartEntry =
+        _cacheDartLintData(unitSource, librarySource, dartEntry, descriptor);
+    if (identical(descriptor, DartEntry.ELEMENT)) {
+      return dartEntry.getValue(descriptor);
+    }
+    return dartEntry.getValueInLibrary(descriptor, librarySource);
+  }
+
+  /**
    * Given a source for a Dart file, return the data represented by the given descriptor that is
    * associated with that source. This method assumes that the data can be produced by parsing the
    * source if it is not already cached.
@@ -3746,10 +3871,12 @@
    * @param sourceEntry the cache entry associated with the source
    * @param isPriority `true` if the source is a priority source
    * @param hintsEnabled `true` if hints are currently enabled
+   * @param lintsEnabled `true` if lints are currently enabled
    * @return the next task that needs to be performed for the given source
    */
   AnalysisContextImpl_TaskData _getNextAnalysisTaskForSource(Source source,
-      SourceEntry sourceEntry, bool isPriority, bool hintsEnabled) {
+      SourceEntry sourceEntry, bool isPriority, bool hintsEnabled,
+      bool lintsEnabled) {
     // Refuse to generate tasks for html based files that are above 1500 KB
     if (_isTooBigHtmlSourceEntry(source, sourceEntry)) {
       // TODO (jwren) we still need to report an error of some kind back to the
@@ -3859,6 +3986,18 @@
                     libraryEntry);
               }
             }
+            if (lintsEnabled) {
+              CacheState lintsState =
+                  dartEntry.getStateInLibrary(DartEntry.LINTS, librarySource);
+              if (lintsState == CacheState.INVALID ||
+                  (isPriority && lintsState == CacheState.FLUSHED)) {
+                return _createGenerateDartLintsTask(
+                    source,
+                    dartEntry,
+                    librarySource,
+                    libraryEntry);
+              }
+            }
           }
         }
       }
@@ -3881,44 +4020,6 @@
           (isPriority && resolvedUnitState == CacheState.FLUSHED)) {
         return _createResolveHtmlTask(source, htmlEntry);
       }
-      //
-      // Angular support
-      //
-      if (_options.analyzeAngular) {
-        // Try to resolve the HTML as an Angular entry point.
-        CacheState angularEntryState =
-            htmlEntry.getState(HtmlEntry.ANGULAR_ENTRY);
-        if (angularEntryState == CacheState.INVALID ||
-            (isPriority && angularEntryState == CacheState.FLUSHED)) {
-          return _createResolveAngularEntryHtmlTask(source, htmlEntry);
-        }
-        // Try to resolve the HTML as an Angular application part.
-        CacheState angularErrorsState =
-            htmlEntry.getState(HtmlEntry.ANGULAR_ERRORS);
-        if (angularErrorsState == CacheState.INVALID ||
-            (isPriority && angularErrorsState == CacheState.FLUSHED)) {
-          return _createResolveAngularComponentTemplateTask(source, htmlEntry);
-        }
-      }
-      //
-      // Polymer support
-      //
-      if (_options.analyzePolymer) {
-        // Build elements.
-        CacheState polymerBuildErrorsState =
-            htmlEntry.getState(HtmlEntry.POLYMER_BUILD_ERRORS);
-        if (polymerBuildErrorsState == CacheState.INVALID ||
-            (isPriority && polymerBuildErrorsState == CacheState.FLUSHED)) {
-          return _createPolymerBuildHtmlTask(source, htmlEntry);
-        }
-        // Resolve references.
-        CacheState polymerResolutionErrorsState =
-            htmlEntry.getState(HtmlEntry.POLYMER_RESOLUTION_ERRORS);
-        if (polymerResolutionErrorsState == CacheState.INVALID ||
-            (isPriority && polymerResolutionErrorsState == CacheState.FLUSHED)) {
-          return _createPolymerResolveHtmlTask(source, htmlEntry);
-        }
-      }
     }
     return new AnalysisContextImpl_TaskData(null, false);
   }
@@ -4041,10 +4142,12 @@
    * @param sourceEntry the cache entry associated with the source
    * @param isPriority `true` if the source is a priority source
    * @param hintsEnabled `true` if hints are currently enabled
+   * @param lintsEnabled `true` if lints are currently enabled
    * @param sources the set to which sources should be added
    */
   void _getSourcesNeedingProcessing(Source source, SourceEntry sourceEntry,
-      bool isPriority, bool hintsEnabled, HashSet<Source> sources) {
+      bool isPriority, bool hintsEnabled, bool lintsEnabled,
+      HashSet<Source> sources) {
     if (sourceEntry is DartEntry) {
       DartEntry dartEntry = sourceEntry;
       CacheState scanErrorsState = dartEntry.getState(DartEntry.SCAN_ERRORS);
@@ -4110,6 +4213,19 @@
                 }
               }
             }
+            if (lintsEnabled) {
+              CacheState lintsState =
+                  dartEntry.getStateInLibrary(DartEntry.LINTS, librarySource);
+              if (lintsState == CacheState.INVALID ||
+                  (isPriority && lintsState == CacheState.FLUSHED)) {
+                LibraryElement libraryElement =
+                    libraryEntry.getValue(DartEntry.ELEMENT);
+                if (libraryElement != null) {
+                  sources.add(source);
+                  return;
+                }
+              }
+            }
           }
         }
       }
@@ -4128,47 +4244,6 @@
         sources.add(source);
         return;
       }
-      // Angular
-      if (_options.analyzeAngular) {
-        CacheState angularErrorsState =
-            htmlEntry.getState(HtmlEntry.ANGULAR_ERRORS);
-        if (angularErrorsState == CacheState.INVALID ||
-            (isPriority && angularErrorsState == CacheState.FLUSHED)) {
-          AngularApplication entryInfo =
-              htmlEntry.getValue(HtmlEntry.ANGULAR_ENTRY);
-          if (entryInfo != null) {
-            sources.add(source);
-            return;
-          }
-          AngularApplication applicationInfo =
-              htmlEntry.getValue(HtmlEntry.ANGULAR_APPLICATION);
-          if (applicationInfo != null) {
-            AngularComponentElement component =
-                htmlEntry.getValue(HtmlEntry.ANGULAR_COMPONENT);
-            if (component != null) {
-              sources.add(source);
-              return;
-            }
-          }
-        }
-      }
-      // Polymer
-      if (_options.analyzePolymer) {
-        // Elements building.
-        CacheState polymerBuildErrorsState =
-            htmlEntry.getState(HtmlEntry.POLYMER_BUILD_ERRORS);
-        if (polymerBuildErrorsState == CacheState.INVALID ||
-            (isPriority && polymerBuildErrorsState == CacheState.FLUSHED)) {
-          sources.add(source);
-        }
-        // Resolution.
-        CacheState polymerResolutionErrorsState =
-            htmlEntry.getState(HtmlEntry.POLYMER_RESOLUTION_ERRORS);
-        if (polymerResolutionErrorsState == CacheState.INVALID ||
-            (isPriority && polymerResolutionErrorsState == CacheState.FLUSHED)) {
-          sources.add(source);
-        }
-      }
     }
   }
 
@@ -4204,54 +4279,6 @@
   }
 
   /**
-   * In response to a change to Angular entry point [HtmlElement], invalidate any results that
-   * depend on it.
-   *
-   * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
-   *
-   * <b>Note:</b> Any cache entries that were accessed before this method was invoked must be
-   * re-accessed after this method returns.
-   *
-   * @param entryCopy the [HtmlEntry] of the (maybe) Angular entry point being invalidated
-   */
-  void _invalidateAngularResolution(HtmlEntry entryCopy) {
-    AngularApplication application =
-        entryCopy.getValue(HtmlEntry.ANGULAR_ENTRY);
-    if (application == null) {
-      return;
-    }
-    _angularApplications.remove(application);
-    // invalidate Entry
-    entryCopy.setState(HtmlEntry.ANGULAR_ENTRY, CacheState.INVALID);
-    // reset HTML sources
-    List<AngularElement> oldAngularElements = application.elements;
-    for (AngularElement angularElement in oldAngularElements) {
-      if (angularElement is AngularHasTemplateElement) {
-        AngularHasTemplateElement hasTemplate = angularElement;
-        Source templateSource = hasTemplate.templateSource;
-        if (templateSource != null) {
-          HtmlEntry htmlEntry = _getReadableHtmlEntry(templateSource);
-          htmlEntry.setValue(HtmlEntry.ANGULAR_APPLICATION, null);
-          htmlEntry.setValue(HtmlEntry.ANGULAR_COMPONENT, null);
-          htmlEntry.setState(HtmlEntry.ANGULAR_ERRORS, CacheState.INVALID);
-          _workManager.add(templateSource, SourcePriority.HTML);
-        }
-      }
-    }
-    // reset Dart sources
-    List<Source> oldElementSources = application.elementSources;
-    for (Source elementSource in oldElementSources) {
-      DartEntry dartEntry = _getReadableDartEntry(elementSource);
-      dartEntry.setValue(DartEntry.ANGULAR_ERRORS, AnalysisError.NO_ERRORS);
-      // notify about (disappeared) Angular errors
-      ChangeNoticeImpl notice = _getNotice(elementSource);
-      notice.setErrors(
-          dartEntry.allErrors,
-          dartEntry.getValue(SourceEntry.LINE_INFO));
-    }
-  }
-
-  /**
    * In response to a change to at least one of the compilation units in the given library,
    * invalidate any results that are dependent on the result of resolving that library.
    *
@@ -4280,16 +4307,6 @@
         }
       }
     }
-    // invalidate Angular applications
-    List<AngularApplication> angularApplicationsCopy = <AngularApplication>[];
-    for (AngularApplication application in angularApplicationsCopy) {
-      if (application.dependsOn(librarySource)) {
-        Source entryPointSource = application.entryPoint;
-        HtmlEntry htmlEntry = _getReadableHtmlEntry(entryPointSource);
-        _invalidateAngularResolution(htmlEntry);
-        _workManager.add(entryPointSource, SourcePriority.HTML);
-      }
-    }
   }
 
   /**
@@ -4441,51 +4458,6 @@
 //  }
 
   /**
-   * Updates [HtmlEntry]s that correspond to the previously known and new Angular application
-   * information.
-   */
-  void _recordAngularEntryPoint(HtmlEntry entry,
-      ResolveAngularEntryHtmlTask task) {
-    AngularApplication application = task.application;
-    if (application != null) {
-      _angularApplications.add(application);
-      // if this is an entry point, then we already resolved it
-      entry.setValue(HtmlEntry.ANGULAR_ERRORS, task.entryErrors);
-      // schedule HTML templates analysis
-      List<AngularElement> newAngularElements = application.elements;
-      for (AngularElement angularElement in newAngularElements) {
-        if (angularElement is AngularHasTemplateElement) {
-          AngularHasTemplateElement hasTemplate = angularElement;
-          Source templateSource = hasTemplate.templateSource;
-          if (templateSource != null) {
-            HtmlEntry htmlEntry = _getReadableHtmlEntry(templateSource);
-            htmlEntry.setValue(HtmlEntry.ANGULAR_APPLICATION, application);
-            if (hasTemplate is AngularComponentElement) {
-              AngularComponentElement component = hasTemplate;
-              htmlEntry.setValue(HtmlEntry.ANGULAR_COMPONENT, component);
-            }
-            htmlEntry.setState(HtmlEntry.ANGULAR_ERRORS, CacheState.INVALID);
-            _workManager.add(templateSource, SourcePriority.HTML);
-          }
-        }
-      }
-      // update Dart sources errors
-      List<Source> newElementSources = application.elementSources;
-      for (Source elementSource in newElementSources) {
-        DartEntry dartEntry = _getReadableDartEntry(elementSource);
-        dartEntry.setValue(
-            DartEntry.ANGULAR_ERRORS,
-            task.getErrors(elementSource));
-        // notify about Dart errors
-        ChangeNoticeImpl notice = _getNotice(elementSource);
-        notice.setErrors(dartEntry.allErrors, computeLineInfo(elementSource));
-      }
-    }
-    // remember Angular entry point
-    entry.setValue(HtmlEntry.ANGULAR_ENTRY, application);
-  }
-
-  /**
    * Record the results produced by performing a [task] and return the cache
    * entry associated with the results.
    */
@@ -4599,6 +4571,50 @@
    * Record the results produced by performing a [task] and return the cache
    * entry associated with the results.
    */
+  DartEntry _recordGenerateDartLintsTask(GenerateDartLintsTask task) {
+    Source librarySource = task.libraryElement.source;
+    CaughtException thrownException = task.exception;
+    DartEntry libraryEntry = null;
+    HashMap<Source, List<AnalysisError>> lintMap = task.lintMap;
+    if (lintMap == null) {
+      // We don't have any information about which sources to mark as invalid
+      // other than the library source.
+      DartEntry libraryEntry = _cache.get(librarySource);
+      if (thrownException == null) {
+        String message =
+            "GenerateDartLintsTask returned a null lint map "
+                "without throwing an exception: ${librarySource.fullName}";
+        thrownException =
+            new CaughtException(new AnalysisException(message), null);
+      }
+      libraryEntry.recordLintErrorInLibrary(librarySource, thrownException);
+      throw new AnalysisException('<rethrow>', thrownException);
+    }
+    lintMap.forEach((Source unitSource, List<AnalysisError> lints) {
+      DartEntry dartEntry = _cache.get(unitSource);
+      if (unitSource == librarySource) {
+        libraryEntry = dartEntry;
+      }
+      if (thrownException == null) {
+        dartEntry.setValueInLibrary(DartEntry.LINTS, librarySource, lints);
+        ChangeNoticeImpl notice = _getNotice(unitSource);
+        LineInfo lineInfo = dartEntry.getValue(SourceEntry.LINE_INFO);
+        notice.setErrors(dartEntry.allErrors, lineInfo);
+      } else {
+        dartEntry.recordLintErrorInLibrary(librarySource, thrownException);
+      }
+    });
+    if (thrownException != null) {
+      throw new AnalysisException('<rethrow>', thrownException);
+    }
+    return libraryEntry;
+  }
+
+
+  /**
+   * Record the results produced by performing a [task] and return the cache
+   * entry associated with the results.
+   */
   SourceEntry _recordGetContentsTask(GetContentTask task) {
     if (!task.isComplete) {
       return null;
@@ -4729,91 +4745,6 @@
    * Record the results produced by performing a [task] and return the cache
    * entry associated with the results.
    */
-  HtmlEntry _recordPolymerBuildHtmlTaskResults(PolymerBuildHtmlTask task) {
-    Source source = task.source;
-    HtmlEntry htmlEntry = _cache.get(source);
-    CaughtException thrownException = task.exception;
-    if (thrownException != null) {
-      htmlEntry.recordResolutionError(thrownException);
-      throw new AnalysisException('<rethrow>', thrownException);
-    }
-    htmlEntry.setValue(HtmlEntry.POLYMER_BUILD_ERRORS, task.errors);
-    // notify about errors
-    ChangeNoticeImpl notice = _getNotice(source);
-    LineInfo lineInfo = htmlEntry.getValue(SourceEntry.LINE_INFO);
-    notice.setErrors(htmlEntry.allErrors, lineInfo);
-    return htmlEntry;
-  }
-
-  /**
-   * Record the results produced by performing a [task] and return the cache
-   * entry associated with the results.
-   */
-  HtmlEntry _recordPolymerResolveHtmlTaskResults(PolymerResolveHtmlTask task) {
-    Source source = task.source;
-    HtmlEntry htmlEntry = _cache.get(source);
-    CaughtException thrownException = task.exception;
-    if (thrownException != null) {
-      htmlEntry.recordResolutionError(thrownException);
-      throw new AnalysisException('<rethrow>', thrownException);
-    }
-    htmlEntry.setValue(HtmlEntry.POLYMER_RESOLUTION_ERRORS, task.errors);
-    // notify about errors
-    ChangeNoticeImpl notice = _getNotice(source);
-    LineInfo lineInfo = htmlEntry.getValue(SourceEntry.LINE_INFO);
-    notice.setErrors(htmlEntry.allErrors, lineInfo);
-    return htmlEntry;
-  }
-
-  /**
-   * Record the results produced by performing a [task] and return the cache
-   * entry associated with the results.
-   */
-  HtmlEntry
-      _recordResolveAngularComponentTemplateTaskResults(ResolveAngularComponentTemplateTask task) {
-    Source source = task.source;
-    HtmlEntry htmlEntry = _cache.get(source);
-    CaughtException thrownException = task.exception;
-    if (thrownException != null) {
-      htmlEntry.recordResolutionError(thrownException);
-      throw new AnalysisException('<rethrow>', thrownException);
-    }
-    htmlEntry.setValue(HtmlEntry.ANGULAR_ERRORS, task.resolutionErrors);
-    // notify about errors
-    ChangeNoticeImpl notice = _getNotice(source);
-    notice.htmlUnit = task.resolvedUnit;
-    LineInfo lineInfo = htmlEntry.getValue(SourceEntry.LINE_INFO);
-    notice.setErrors(htmlEntry.allErrors, lineInfo);
-    return htmlEntry;
-  }
-
-  /**
-   * Record the results produced by performing a [task] and return the cache
-   * entry associated with the results.
-   */
-  HtmlEntry
-      _recordResolveAngularEntryHtmlTaskResults(ResolveAngularEntryHtmlTask task) {
-    Source source = task.source;
-    HtmlEntry htmlEntry = _cache.get(source);
-    CaughtException thrownException = task.exception;
-    if (thrownException != null) {
-      htmlEntry.recordResolutionError(thrownException);
-      throw new AnalysisException('<rethrow>', thrownException);
-    }
-    htmlEntry.setValue(HtmlEntry.RESOLVED_UNIT, task.resolvedUnit);
-    _recordAngularEntryPoint(htmlEntry, task);
-    _cache.storedAst(source);
-    ChangeNoticeImpl notice = _getNotice(source);
-    notice.htmlUnit = task.resolvedUnit;
-    LineInfo lineInfo = htmlEntry.getValue(SourceEntry.LINE_INFO);
-    notice.setErrors(htmlEntry.allErrors, lineInfo);
-    return htmlEntry;
-  }
-
-  /**
-   * Record the results produced by performing a [task] and return the cache
-   * entry associated with the results.
-   */
   DartEntry _recordResolveDartUnitTaskResults(ResolveDartUnitTask task) {
     Source unitSource = task.source;
     DartEntry dartEntry = _cache.get(unitSource);
@@ -4990,7 +4921,6 @@
     if (sourceEntry is HtmlEntry) {
       HtmlEntry htmlEntry = sourceEntry;
       htmlEntry.modificationTime = getModificationStamp(source);
-      _invalidateAngularResolution(htmlEntry);
       htmlEntry.invalidateAllInformation();
       _cache.removedAst(source);
       _workManager.add(source, SourcePriority.HTML);
@@ -5012,6 +4942,12 @@
       _cache.removedAst(source);
       _workManager.add(source, SourcePriority.UNKNOWN);
     }
+    // reset unit in the notification, it is out of date now
+    ChangeNoticeImpl notice = _pendingNotices[source];
+    if (notice != null) {
+      notice.compilationUnit = null;
+      notice.htmlUnit = null;
+    }
   }
 
   /**
@@ -5023,7 +4959,6 @@
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry is HtmlEntry) {
       HtmlEntry htmlEntry = sourceEntry;
-      _invalidateAngularResolution(htmlEntry);
       htmlEntry.recordContentError(
           new CaughtException(
               new AnalysisException("This source was marked as being deleted"),
@@ -5058,7 +4993,6 @@
   void _sourceRemoved(Source source) {
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry is HtmlEntry) {
-      _invalidateAngularResolution(sourceEntry);
     } else if (sourceEntry is DartEntry) {
       HashSet<Source> libraries = new HashSet<Source>();
       for (Source librarySource in getLibrariesContaining(source)) {
@@ -5081,40 +5015,74 @@
    * TODO(scheglov) A hackish, limited incremental resolution implementation.
    */
   bool _tryPoorMansIncrementalResolution(Source unitSource, String newCode) {
+    incrementalResolutionValidation_lastUnitSource = null;
+    incrementalResolutionValidation_lastLibrarySource = null;
+    incrementalResolutionValidation_lastUnit = null;
+    // prepare the entry
     DartEntry dartEntry = _cache.get(unitSource);
     if (dartEntry == null) {
       return false;
     }
-    // prepare the (only) library
+    // prepare the (only) library source
     List<Source> librarySources = getLibrariesContaining(unitSource);
     if (librarySources.length != 1) {
       return false;
     }
-    // prepare the existing unit
     Source librarySource = librarySources[0];
-    CompilationUnit oldUnit =
-        getResolvedCompilationUnit2(unitSource, librarySource);
+    // prepare the library element
+    LibraryElement libraryElement = getLibraryElement(librarySource);
+    if (libraryElement == null) {
+      return false;
+    }
+    // prepare the existing library units
+    Map<Source, CompilationUnit> units = <Source, CompilationUnit>{};
+    for (CompilationUnitElement unitElement in libraryElement.units) {
+      Source unitSource = unitElement.source;
+      CompilationUnit unit =
+          getResolvedCompilationUnit2(unitSource, librarySource);
+      if (unit == null) {
+        return false;
+      }
+      units[unitSource] = unit;
+    }
+    // prepare the existing unit
+    CompilationUnit oldUnit = units[unitSource];
     if (oldUnit == null) {
       return false;
     }
     // do resolution
+    Stopwatch perfCounter = new Stopwatch()..start();
     PoorMansIncrementalResolver resolver = new PoorMansIncrementalResolver(
         typeProvider,
+        units,
         unitSource,
         dartEntry,
         analysisOptions.incrementalApi);
-    bool success = resolver.resolve(oldUnit, newCode);
+    bool success = resolver.resolve(newCode);
+    AnalysisEngine.instance.instrumentationService.logPerformance(
+        AnalysisPerformanceKind.INCREMENTAL,
+        perfCounter,
+        'success=$success,context_id=$_id,code_length=${newCode.length}');
     if (!success) {
       return false;
     }
-    // prepare notice
-    ChangeNoticeImpl notice = _getNotice(unitSource);
-    notice.compilationUnit = oldUnit;
-    // apply updated errors
-    {
-      LineInfo lineInfo = getLineInfo(unitSource);
-      notice.setErrors(dartEntry.allErrors, lineInfo);
+    // if validation, remember the result, but throw it away
+    if (analysisOptions.incrementalValidation) {
+      incrementalResolutionValidation_lastUnitSource = oldUnit.element.source;
+      incrementalResolutionValidation_lastLibrarySource =
+          oldUnit.element.library.source;
+      incrementalResolutionValidation_lastUnit = oldUnit;
+      return false;
     }
+    // prepare notices
+    units.forEach((Source source, CompilationUnit unit) {
+      DartEntry dartEntry = _cache.get(source);
+      LineInfo lineInfo = getLineInfo(source);
+      ChangeNoticeImpl notice = _getNotice(source);
+      notice.compilationUnit = unit;
+      notice.setErrors(dartEntry.allErrors, lineInfo);
+    });
+    // OK
     return true;
   }
 
@@ -5194,6 +5162,10 @@
       AnalysisContextImpl_this._recordGenerateDartHintsTask(task);
 
   @override
+  DartEntry visitGenerateDartLintsTask(GenerateDartLintsTask task) =>
+      AnalysisContextImpl_this._recordGenerateDartLintsTask(task);
+
+  @override
   SourceEntry visitGetContentTask(GetContentTask task) =>
       AnalysisContextImpl_this._recordGetContentsTask(task);
 
@@ -5210,25 +5182,6 @@
       AnalysisContextImpl_this._recordParseHtmlTaskResults(task);
 
   @override
-  HtmlEntry visitPolymerBuildHtmlTask(PolymerBuildHtmlTask task) =>
-      AnalysisContextImpl_this._recordPolymerBuildHtmlTaskResults(task);
-
-  @override
-  HtmlEntry visitPolymerResolveHtmlTask(PolymerResolveHtmlTask task) =>
-      AnalysisContextImpl_this._recordPolymerResolveHtmlTaskResults(task);
-
-  @override
-  HtmlEntry
-      visitResolveAngularComponentTemplateTask(ResolveAngularComponentTemplateTask task) =>
-      AnalysisContextImpl_this._recordResolveAngularComponentTemplateTaskResults(
-          task);
-
-  @override
-  HtmlEntry
-      visitResolveAngularEntryHtmlTask(ResolveAngularEntryHtmlTask task) =>
-      AnalysisContextImpl_this._recordResolveAngularEntryHtmlTaskResults(task);
-
-  @override
   DartEntry
       visitResolveDartLibraryCycleTask(ResolveDartLibraryCycleTask task) =>
       AnalysisContextImpl_this.recordResolveDartLibraryCycleTaskResults(task);
@@ -5279,6 +5232,7 @@
 
   bool _astIsNeeded(DartEntry dartEntry) =>
       dartEntry.hasInvalidData(DartEntry.HINTS) ||
+          dartEntry.hasInvalidData(DartEntry.LINTS) ||
           dartEntry.hasInvalidData(DartEntry.VERIFICATION_ERRORS) ||
           dartEntry.hasInvalidData(DartEntry.RESOLUTION_ERRORS);
 }
@@ -5879,72 +5833,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;
-}
-
-/**
  * Implementation of the [AnalysisContextStatistics].
  */
 class AnalysisContextStatisticsImpl implements AnalysisContextStatistics {
@@ -6061,6 +5949,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;
+}
+
+/**
  * Instances of the class `AnalysisDelta` indicate changes to the types of analysis that
  * should be performed.
  */
@@ -6456,13 +6410,6 @@
  */
 abstract class AnalysisOptions {
   /**
-   * Return `true` if analysis is to analyze Angular.
-   *
-   * @return `true` if analysis is to analyze Angular
-   */
-  bool get analyzeAngular;
-
-  /**
    * Return `true` if analysis is to parse and analyze function bodies.
    *
    * @return `true` if analysis is to parse and analyzer function bodies
@@ -6470,13 +6417,6 @@
   bool get analyzeFunctionBodies;
 
   /**
-   * Return `true` if analysis is to analyze Polymer.
-   *
-   * @return `true` if analysis is to analyze Polymer
-   */
-  bool get analyzePolymer;
-
-  /**
    * Return the maximum number of sources for which AST structures should be kept in the cache.
    *
    * @return the maximum number of sources for which AST structures should be kept in the cache
@@ -6501,6 +6441,7 @@
    *
    * @return `true` if analysis is to include the new deferred loading support
    */
+  @deprecated
   bool get enableDeferredLoading;
 
   /**
@@ -6508,6 +6449,7 @@
    *
    * @return `true` if analysis is to include the new enum support
    */
+  @deprecated
   bool get enableEnum;
 
   /**
@@ -6546,6 +6488,13 @@
   bool get incrementalValidation;
 
   /**
+   * Return `true` if analysis is to generate lint warnings.
+   *
+   * @return `true` if analysis is to generate lint warnings
+   */
+  bool get lint;
+
+  /**
    * Return `true` if analysis is to parse comments.
    *
    * @return `true` if analysis is to parse comments
@@ -6566,29 +6515,21 @@
   /**
    * The default value for enabling deferred loading.
    */
+  @deprecated
   static bool DEFAULT_ENABLE_DEFERRED_LOADING = true;
 
   /**
    * The default value for enabling enum support.
    */
+  @deprecated
   static bool DEFAULT_ENABLE_ENUM = false;
 
   /**
-   * A flag indicating whether analysis is to analyze Angular.
-   */
-  bool analyzeAngular = true;
-
-  /**
    * A flag indicating whether analysis is to parse and analyze function bodies.
    */
   bool analyzeFunctionBodies = true;
 
   /**
-   * A flag indicating whether analysis is to analyze Polymer.
-   */
-  bool analyzePolymer = true;
-
-  /**
    * The maximum number of sources for which AST structures should be kept in the cache.
    */
   int cacheSize = DEFAULT_CACHE_SIZE;
@@ -6598,25 +6539,6 @@
    */
   bool dart2jsHint = true;
 
-  @deprecated
-  @override
-  bool get enableAsync => true;
-
-  @deprecated
-  void set enableAsync(bool enable) {
-    // Async support cannot be disabled
-  }
-
-  /**
-   * A flag indicating whether analysis is to enable deferred loading.
-   */
-  bool enableDeferredLoading = DEFAULT_ENABLE_DEFERRED_LOADING;
-
-  /**
-   * A flag indicating whether analysis is to enable enum support.
-   */
-  bool enableEnum = DEFAULT_ENABLE_ENUM;
-
   /**
    * A flag indicating whether errors, warnings and hints should be generated for sources in the
    * SDK.
@@ -6647,6 +6569,11 @@
   bool incrementalValidation = false;
 
   /**
+   * A flag indicating whether analysis is to generate lint warnings.
+   */
+  bool lint = false;
+
+  /**
    * A flag indicating whether analysis is to parse comments.
    */
   bool preserveComments = true;
@@ -6663,21 +6590,45 @@
    * @param options the analysis options whose values are being copied
    */
   AnalysisOptionsImpl.con1(AnalysisOptions options) {
-    analyzeAngular = options.analyzeAngular;
     analyzeFunctionBodies = options.analyzeFunctionBodies;
-    analyzePolymer = options.analyzePolymer;
     cacheSize = options.cacheSize;
     dart2jsHint = options.dart2jsHint;
-    enableDeferredLoading = options.enableDeferredLoading;
-    enableEnum = options.enableEnum;
     _generateSdkErrors = options.generateSdkErrors;
     hint = options.hint;
     incremental = options.incremental;
     incrementalApi = options.incrementalApi;
     incrementalValidation = options.incrementalValidation;
+    lint = options.lint;
     preserveComments = options.preserveComments;
   }
 
+  @deprecated
+  @override
+  bool get enableAsync => true;
+
+  @deprecated
+  void set enableAsync(bool enable) {
+    // Async support cannot be disabled
+  }
+
+  @deprecated
+  @override
+  bool get enableDeferredLoading => true;
+
+  @deprecated
+  void set enableDeferredLoading(bool enable) {
+    // Deferred loading support cannot be disabled
+  }
+
+  @deprecated
+  @override
+  bool get enableEnum => true;
+
+  @deprecated
+  void set enableEnum(bool enable) {
+    // Enum support cannot be disabled
+  }
+
   @override
   bool get generateSdkErrors => _generateSdkErrors;
 
@@ -6868,6 +6819,12 @@
    * Visit the given [task], returning the result of the visit. This method will
    * throw an AnalysisException if the visitor throws an exception.
    */
+  E visitGenerateDartLintsTask(GenerateDartLintsTask task);
+
+  /**
+   * Visit the given [task], returning the result of the visit. This method will
+   * throw an AnalysisException if the visitor throws an exception.
+   */
   E visitGetContentTask(GetContentTask task);
 
   /**
@@ -6893,31 +6850,6 @@
    * Visit the given [task], returning the result of the visit. This method will
    * throw an AnalysisException if the visitor throws an exception.
    */
-  E visitPolymerBuildHtmlTask(PolymerBuildHtmlTask task);
-
-  /**
-   * Visit the given [task], returning the result of the visit. This method will
-   * throw an AnalysisException if the visitor throws an exception.
-   */
-  E visitPolymerResolveHtmlTask(PolymerResolveHtmlTask task);
-
-  /**
-   * Visit the given [task], returning the result of the visit. This method will
-   * throw an AnalysisException if the visitor throws an exception.
-   */
-  E
-      visitResolveAngularComponentTemplateTask(ResolveAngularComponentTemplateTask task);
-
-  /**
-   * Visit the given [task], returning the result of the visit. This method will
-   * throw an AnalysisException if the visitor throws an exception.
-   */
-  E visitResolveAngularEntryHtmlTask(ResolveAngularEntryHtmlTask task);
-
-  /**
-   * Visit the given [task], returning the result of the visit. This method will
-   * throw an AnalysisException if the visitor throws an exception.
-   */
   E visitResolveDartLibraryCycleTask(ResolveDartLibraryCycleTask task);
 
   /**
@@ -6946,1037 +6878,6 @@
 }
 
 /**
- * An [Expression] with optional [AngularFormatterNode]s.
- */
-class AngularExpression {
-  /**
-   * The [Expression] to apply formatters to.
-   */
-  final Expression expression;
-
-  /**
-   * The formatters to apply.
-   */
-  final List<AngularFormatterNode> formatters;
-
-  AngularExpression(this.expression, this.formatters);
-
-  /**
-   * Return the offset of the character immediately following the last character of this node's
-   * source range. This is equivalent to `node.getOffset() + node.getLength()`.
-   *
-   * @return the offset of the character just past the node's source range
-   */
-  int get end {
-    if (formatters.isEmpty) {
-      return expression.end;
-    }
-    AngularFormatterNode lastFormatter = formatters[formatters.length - 1];
-    List<AngularFormatterArgument> formatterArguments = lastFormatter.arguments;
-    if (formatterArguments.isEmpty) {
-      return lastFormatter.name.end;
-    }
-    return formatterArguments[formatterArguments.length - 1].expression.end;
-  }
-
-  /**
-   * Return Dart [Expression]s this Angular expression consists of.
-   */
-  List<Expression> get expressions {
-    List<Expression> expressions = <Expression>[];
-    expressions.add(expression);
-    for (AngularFormatterNode formatter in formatters) {
-      expressions.add(formatter.name);
-      for (AngularFormatterArgument formatterArgument in formatter.arguments) {
-        expressions.addAll(formatterArgument.subExpressions);
-        expressions.add(formatterArgument.expression);
-      }
-    }
-    return expressions;
-  }
-
-  /**
-   * Return the number of characters in the expression's source range.
-   */
-  int get length => end - offset;
-
-  /**
-   * Return the offset of the first character in the expression's source range.
-   */
-  int get offset => expression.offset;
-}
-
-/**
- * Angular formatter argument.
- */
-class AngularFormatterArgument {
-  /**
-   * The [TokenType.COLON] token.
-   */
-  final Token token;
-
-  /**
-   * The argument expression.
-   */
-  final Expression expression;
-
-  /**
-   * The optional sub-[Expression]s.
-   */
-  List<Expression> subExpressions = Expression.EMPTY_ARRAY;
-
-  AngularFormatterArgument(this.token, this.expression);
-}
-
-/**
- * Angular formatter node.
- */
-class AngularFormatterNode {
-  /**
-   * The [TokenType.BAR] token.
-   */
-  final Token token;
-
-  /**
-   * The name of the formatter.
-   */
-  final SimpleIdentifier name;
-
-  /**
-   * The arguments for this formatter.
-   */
-  final List<AngularFormatterArgument> arguments;
-
-  AngularFormatterNode(this.token, this.name, this.arguments);
-}
-
-/**
- * Instances of the class [AngularHtmlUnitResolver] resolve Angular specific expressions.
- */
-class AngularHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> {
-  static String _NG_APP = "ng-app";
-
-  final InternalAnalysisContext _context;
-
-  TypeProvider _typeProvider;
-
-  AngularHtmlUnitResolver_FilteringAnalysisErrorListener _errorListener;
-
-  final Source _source;
-
-  final LineInfo _lineInfo;
-
-  final ht.HtmlUnit _unit;
-
-//  List<AngularElement> _angularElements;
-
-  List<NgProcessor> _processors = <NgProcessor>[];
-
-  LibraryElementImpl _libraryElement;
-
-  CompilationUnitElementImpl _unitElement;
-
-  FunctionElementImpl _functionElement;
-
-  ResolverVisitor _resolver;
-
-  bool _isAngular = false;
-
-  List<LocalVariableElementImpl> _definedVariables = <LocalVariableElementImpl>[
-      ];
-
-  Set<LibraryElement> _injectedLibraries = new Set();
-
-  Scope _topNameScope;
-
-  Scope _nameScope;
-
-  AngularHtmlUnitResolver(this._context, AnalysisErrorListener errorListener,
-      this._source, this._lineInfo, this._unit) {
-    this._typeProvider = _context.typeProvider;
-    this._errorListener =
-        new AngularHtmlUnitResolver_FilteringAnalysisErrorListener(errorListener);
-  }
-
-  /**
-   * @return the [TypeProvider] of the [AnalysisContext].
-   */
-  TypeProvider get typeProvider => _typeProvider;
-
-  /**
-   * The [AngularApplication] for the Web application with this entry point, may be
-   * `null` if not an entry point.
-   */
-  AngularApplication calculateAngularApplication() {
-    // check if Angular at all
-    if (!hasAngularAnnotation(_unit)) {
-      return null;
-    }
-    // prepare resolved Dart unit
-    CompilationUnit dartUnit = _getDartUnit(_context, _unit);
-    if (dartUnit == null) {
-      return null;
-    }
-    // prepare accessible Angular elements
-    LibraryElement libraryElement = dartUnit.element.library;
-    Set<LibraryElement> libraries = new Set();
-    List<AngularElement> angularElements =
-        _getAngularElements(libraries, libraryElement);
-    // resolve AngularComponentElement template URIs
-    // TODO(scheglov) resolve to HtmlElement to allow F3 ?
-    Set<Source> angularElementsSources = new Set();
-    for (AngularElement angularElement in angularElements) {
-      if (angularElement is AngularHasTemplateElement) {
-        AngularHasTemplateElement hasTemplate = angularElement;
-        angularElementsSources.add(angularElement.source);
-        String templateUri = hasTemplate.templateUri;
-        if (templateUri == null) {
-          continue;
-        }
-        try {
-          Source templateSource = _context.sourceFactory.forUri2(
-              _source.resolveRelativeUri(parseUriWithException(templateUri)));
-          if (!_context.exists(templateSource)) {
-            templateSource =
-                _context.sourceFactory.resolveUri(_source, "package:$templateUri");
-            if (!_context.exists(templateSource)) {
-              _errorListener.onError(
-                  new AnalysisError.con2(
-                      angularElement.source,
-                      hasTemplate.templateUriOffset,
-                      templateUri.length,
-                      AngularCode.URI_DOES_NOT_EXIST,
-                      [templateUri]));
-              continue;
-            }
-          }
-          if (!AnalysisEngine.isHtmlFileName(templateUri)) {
-            continue;
-          }
-          if (hasTemplate is AngularComponentElementImpl) {
-            hasTemplate.templateSource = templateSource;
-          }
-          if (hasTemplate is AngularViewElementImpl) {
-            hasTemplate.templateSource = templateSource;
-          }
-        } on URISyntaxException catch (exception) {
-          _errorListener.onError(
-              new AnalysisError.con2(
-                  angularElement.source,
-                  hasTemplate.templateUriOffset,
-                  templateUri.length,
-                  AngularCode.INVALID_URI,
-                  [templateUri]));
-        }
-      }
-    }
-    // create AngularApplication
-    AngularApplication application = new AngularApplication(
-        _source,
-        _getLibrarySources(libraries),
-        angularElements,
-        new List.from(angularElementsSources));
-    // set AngularApplication for each AngularElement
-    for (AngularElement angularElement in angularElements) {
-      (angularElement as AngularElementImpl).application = application;
-    }
-    // done
-    return application;
-  }
-
-  /**
-   * Resolves [source] as an [AngularComponentElement] template file.
-   *
-   * @param application the Angular application we are resolving for
-   * @param component the [AngularComponentElement] to resolve template for, not `null`
-   */
-  void resolveComponentTemplate(AngularApplication application,
-      AngularComponentElement component) {
-    _isAngular = true;
-    _resolveInternal(application.elements, component);
-  }
-
-  /**
-   * Resolves [source] as an Angular application entry point.
-   */
-  void resolveEntryPoint(AngularApplication application) {
-    _resolveInternal(application.elements, null);
-  }
-
-  @override
-  Object visitXmlAttributeNode(ht.XmlAttributeNode node) {
-    _parseEmbeddedExpressionsInAttribute(node);
-    _resolveExpressions(node.expressions);
-    return super.visitXmlAttributeNode(node);
-  }
-
-  @override
-  Object visitXmlTagNode(ht.XmlTagNode node) {
-    bool wasAngular = _isAngular;
-    try {
-      // new Angular context
-      if (node.getAttribute(_NG_APP) != null) {
-        _isAngular = true;
-        _visitModelDirectives(node);
-      }
-      // not Angular
-      if (!_isAngular) {
-        return super.visitXmlTagNode(node);
-      }
-      // process node in separate name scope
-      _pushNameScope();
-      try {
-        _parseEmbeddedExpressionsInTag(node);
-        // apply processors
-        for (NgProcessor processor in _processors) {
-          if (processor.canApply(node)) {
-            processor.apply(this, node);
-          }
-        }
-        // resolve expressions
-        _resolveExpressions(node.expressions);
-        // process children
-        return super.visitXmlTagNode(node);
-      } finally {
-        _popNameScope();
-      }
-    } finally {
-      _isAngular = wasAngular;
-    }
-  }
-
-  /**
-   * Puts into [libraryElement] an artificial [LibraryElementImpl] for this HTML
-   * [Source].
-   */
-  void _createLibraryElement() {
-    // create CompilationUnitElementImpl
-    String unitName = _source.shortName;
-    _unitElement = new CompilationUnitElementImpl(unitName);
-    _unitElement.source = _source;
-    // create LibraryElementImpl
-    _libraryElement =
-        new LibraryElementImpl.forNode(_context.getContextFor(_source), null);
-    _libraryElement.definingCompilationUnit = _unitElement;
-    _libraryElement.angularHtml = true;
-    _injectedLibraries.add(_libraryElement);
-    // create FunctionElementImpl
-    _functionElement = new FunctionElementImpl.forOffset(0);
-    _unitElement.functions = <FunctionElement>[_functionElement];
-  }
-
-  /**
-   * Creates new [LocalVariableElementImpl] with given type and identifier.
-   *
-   * @param type the [Type] of the variable
-   * @param identifier the identifier to create variable for
-   * @return the new [LocalVariableElementImpl]
-   */
-  LocalVariableElementImpl _createLocalVariableFromIdentifier(DartType type,
-      SimpleIdentifier identifier) {
-    LocalVariableElementImpl variable =
-        new LocalVariableElementImpl.forNode(identifier);
-    _definedVariables.add(variable);
-    variable.type = type;
-    return variable;
-  }
-
-  /**
-   * Creates new [LocalVariableElementImpl] with given name and type.
-   *
-   * @param type the [Type] of the variable
-   * @param name the name of the variable
-   * @return the new [LocalVariableElementImpl]
-   */
-  LocalVariableElementImpl _createLocalVariableWithName(DartType type,
-      String name) {
-    SimpleIdentifier identifier = _createIdentifier(name, 0);
-    return _createLocalVariableFromIdentifier(type, identifier);
-  }
-
-  /**
-   * Creates new [NgProcessor] for the given [AngularElement], maybe `null` if not
-   * supported.
-   */
-  NgProcessor _createProcessor(AngularElement element) {
-    if (element is AngularComponentElement) {
-      AngularComponentElement component = element;
-      return new NgComponentElementProcessor(component);
-    }
-    if (element is AngularControllerElement) {
-      AngularControllerElement controller = element;
-      return new NgControllerElementProcessor(controller);
-    }
-    if (element is AngularDecoratorElement) {
-      AngularDecoratorElement directive = element;
-      return new NgDecoratorElementProcessor(directive);
-    }
-    return null;
-  }
-
-  /**
-   * Puts into [resolver] an [ResolverVisitor] to resolve [Expression]s in
-   * [source].
-   */
-  void _createResolver() {
-    InheritanceManager inheritanceManager =
-        new InheritanceManager(_libraryElement);
-    _resolver = new ResolverVisitor.con2(
-        _libraryElement,
-        _source,
-        _typeProvider,
-        inheritanceManager,
-        _errorListener);
-    _topNameScope = _resolver.pushNameScope();
-    // add Scope variables - no type, no location, just to avoid warnings
-    {
-      DartType type = _typeProvider.dynamicType;
-      _topNameScope.define(_createLocalVariableWithName(type, "\$id"));
-      _topNameScope.define(_createLocalVariableWithName(type, "\$parent"));
-      _topNameScope.define(_createLocalVariableWithName(type, "\$root"));
-    }
-  }
-
-  /**
-   * Declares the given [LocalVariableElementImpl] in the [topNameScope].
-   */
-  void _defineTopVariable(LocalVariableElementImpl variable) {
-    _recordDefinedVariable(variable);
-    _topNameScope.define(variable);
-    _recordTypeLibraryInjected(variable);
-  }
-
-  /**
-   * Defines variable for the given [AngularElement] with type of the enclosing
-   * [ClassElement].
-   */
-  void _defineTopVariable_forClassElement(AngularElement element) {
-    ClassElement classElement = element.enclosingElement as ClassElement;
-    InterfaceType type = classElement.type;
-    LocalVariableElementImpl variable =
-        _createLocalVariableWithName(type, element.name);
-    _defineTopVariable(variable);
-    variable.toolkitObjects = <AngularElement>[element];
-  }
-
-  /**
-   * Defines variable for the given [AngularScopePropertyElement].
-   */
-  void
-      _defineTopVariable_forScopeProperty(AngularScopePropertyElement element) {
-    DartType type = element.type;
-    LocalVariableElementImpl variable =
-        _createLocalVariableWithName(type, element.name);
-    _defineTopVariable(variable);
-    variable.toolkitObjects = <AngularElement>[element];
-  }
-
-  /**
-   * Declares the given [LocalVariableElementImpl] in the current [nameScope].
-   */
-  void _defineVariable(LocalVariableElementImpl variable) {
-    _recordDefinedVariable(variable);
-    _nameScope.define(variable);
-    _recordTypeLibraryInjected(variable);
-  }
-
-//  /**
-//   * @return the [AngularElement] with the given name, maybe `null`.
-//   */
-//  AngularElement _findAngularElement(String name) {
-//    for (AngularElement element in _angularElements) {
-//      if (name == element.name) {
-//        return element;
-//      }
-//    }
-//    return null;
-//  }
-
-  /**
-   * Parses given [String] as an [AngularExpression] at the given offset.
-   */
-  AngularExpression _parseAngularExpression(String contents, int startIndex,
-      int endIndex, int offset) {
-    Token token = _scanDart(contents, startIndex, endIndex, offset);
-    return _parseAngularExpressionInToken(token);
-  }
-
-  AngularExpression _parseAngularExpressionInToken(Token token) {
-    List<Token> tokens = _splitAtBar(token);
-    Expression mainExpression = _parseDartExpressionInToken(tokens[0]);
-    // parse formatters
-    List<AngularFormatterNode> formatters = <AngularFormatterNode>[];
-    for (int i = 1; i < tokens.length; i++) {
-      Token formatterToken = tokens[i];
-      Token barToken = formatterToken;
-      formatterToken = formatterToken.next;
-      // parse name
-      Expression nameExpression = _parseDartExpressionInToken(formatterToken);
-      if (nameExpression is! SimpleIdentifier) {
-        _reportErrorForNode(AngularCode.INVALID_FORMATTER_NAME, nameExpression);
-        continue;
-      }
-      SimpleIdentifier name = nameExpression as SimpleIdentifier;
-      formatterToken = name.endToken.next;
-      // parse arguments
-      List<AngularFormatterArgument> arguments = <AngularFormatterArgument>[];
-      while (formatterToken.type != TokenType.EOF) {
-        // skip ":"
-        Token colonToken = formatterToken;
-        if (colonToken.type == TokenType.COLON) {
-          formatterToken = formatterToken.next;
-        } else {
-          _reportErrorForToken(AngularCode.MISSING_FORMATTER_COLON, colonToken);
-          break;
-        }
-        // parse argument
-        Expression argument = _parseDartExpressionInToken(formatterToken);
-        arguments.add(new AngularFormatterArgument(colonToken, argument));
-        // next token
-        formatterToken = argument.endToken.next;
-      }
-      formatters.add(new AngularFormatterNode(barToken, name, arguments));
-    }
-    // done
-    return new AngularExpression(mainExpression, formatters);
-  }
-
-//  /**
-//   * Parses given [String] as an [Expression] at the given offset.
-//   */
-//  Expression _parseDartExpression(String contents, int startIndex, int endIndex,
-//      int offset) {
-//    Token token = _scanDart(contents, startIndex, endIndex, offset);
-//    return _parseDartExpressionInToken(token);
-//  }
-
-  Expression _parseDartExpressionInToken(Token token) {
-    Parser parser = new Parser(_source, _errorListener);
-    return parser.parseExpression(token);
-  }
-
-  /**
-   * Parse the value of the given token for embedded expressions, and add any embedded expressions
-   * that are found to the given list of expressions.
-   *
-   * @param expressions the list to which embedded expressions are to be added
-   * @param token the token whose value is to be parsed
-   */
-  void
-      _parseEmbeddedExpressions(List<AngularMoustacheXmlExpression> expressions,
-      ht.Token token) {
-    // prepare Token information
-    String lexeme = token.lexeme;
-    int offset = token.offset;
-    // find expressions between {{ and }}
-    int startIndex = StringUtilities.indexOf2(
-        lexeme,
-        0,
-        AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR,
-        AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR);
-    while (startIndex >= 0) {
-      int endIndex = StringUtilities.indexOf2(
-          lexeme,
-          startIndex + AngularMoustacheXmlExpression.OPENING_DELIMITER_LENGTH,
-          AngularMoustacheXmlExpression.CLOSING_DELIMITER_CHAR,
-          AngularMoustacheXmlExpression.CLOSING_DELIMITER_CHAR);
-      if (endIndex < 0) {
-        // TODO(brianwilkerson) Should we report this error or will it be
-        // reported by something else?
-        return;
-      } else if (startIndex +
-          AngularMoustacheXmlExpression.OPENING_DELIMITER_LENGTH <
-          endIndex) {
-        startIndex += AngularMoustacheXmlExpression.OPENING_DELIMITER_LENGTH;
-        AngularExpression expression =
-            _parseAngularExpression(lexeme, startIndex, endIndex, offset);
-        expressions.add(
-            new AngularMoustacheXmlExpression(startIndex, endIndex, expression));
-      }
-      startIndex = StringUtilities.indexOf2(
-          lexeme,
-          endIndex + AngularMoustacheXmlExpression.CLOSING_DELIMITER_LENGTH,
-          AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR,
-          AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR);
-    }
-  }
-
-  void _parseEmbeddedExpressionsInAttribute(ht.XmlAttributeNode node) {
-    List<AngularMoustacheXmlExpression> expressions =
-        <AngularMoustacheXmlExpression>[
-        ];
-    _parseEmbeddedExpressions(expressions, node.valueToken);
-    if (!expressions.isEmpty) {
-      node.expressions = expressions;
-    }
-  }
-
-  void _parseEmbeddedExpressionsInTag(ht.XmlTagNode node) {
-    List<AngularMoustacheXmlExpression> expressions =
-        <AngularMoustacheXmlExpression>[
-        ];
-    ht.Token token = node.attributeEnd;
-    ht.Token endToken = node.endToken;
-    bool inChild = false;
-    while (!identical(token, endToken)) {
-      for (ht.XmlTagNode child in node.tagNodes) {
-        if (identical(token, child.beginToken)) {
-          inChild = true;
-          break;
-        }
-        if (identical(token, child.endToken)) {
-          inChild = false;
-          break;
-        }
-      }
-      if (!inChild && token.type == ht.TokenType.TEXT) {
-        _parseEmbeddedExpressions(expressions, token);
-      }
-      token = token.next;
-    }
-    node.expressions = expressions;
-  }
-
-  void _popNameScope() {
-    _nameScope = _resolver.popNameScope();
-  }
-
-  void _pushNameScope() {
-    _nameScope = _resolver.pushNameScope();
-  }
-
-  void _recordDefinedVariable(LocalVariableElementImpl variable) {
-    _definedVariables.add(variable);
-    _functionElement.localVariables = new List.from(_definedVariables);
-  }
-
-  /**
-   * When we inject variable, we give access to the library of its type.
-   */
-  void _recordTypeLibraryInjected(LocalVariableElementImpl variable) {
-    LibraryElement typeLibrary = variable.type.element.library;
-    _injectedLibraries.add(typeLibrary);
-  }
-
-  /**
-   * Reports given [ErrorCode] at the given [AstNode].
-   */
-  void _reportErrorForNode(ErrorCode errorCode, AstNode node,
-      [List<Object> arguments]) {
-    _reportErrorForOffset(errorCode, node.offset, node.length, arguments);
-  }
-
-  /**
-   * Reports given [ErrorCode] at the given position.
-   */
-  void _reportErrorForOffset(ErrorCode errorCode, int offset, int length,
-      [List<Object> arguments]) {
-    _errorListener.onError(
-        new AnalysisError.con2(_source, offset, length, errorCode, arguments));
-  }
-
-  /**
-   * Reports given [ErrorCode] at the given [Token].
-   */
-  void _reportErrorForToken(ErrorCode errorCode, Token token,
-      [List<Object> arguments]) {
-    _reportErrorForOffset(errorCode, token.offset, token.length, arguments);
-  }
-
-  void _resolveExpression(AngularExpression angularExpression) {
-    List<Expression> dartExpressions = angularExpression.expressions;
-    for (Expression dartExpression in dartExpressions) {
-      _resolveNode(dartExpression);
-    }
-  }
-
-  void _resolveExpressions(List<ht.XmlExpression> expressions) {
-    for (ht.XmlExpression xmlExpression in expressions) {
-      if (xmlExpression is AngularXmlExpression) {
-        AngularXmlExpression angularXmlExpression = xmlExpression;
-        _resolveXmlExpression(angularXmlExpression);
-      }
-    }
-  }
-
-  /**
-   * Resolves Angular specific expressions and elements in the [source].
-   *
-   * @param angularElements the [AngularElement]s accessible in the component's library, not
-   *          `null`
-   * @param component the [AngularComponentElement] to resolve template for, maybe
-   *          `null` if not a component template
-   */
-  void _resolveInternal(List<AngularElement> angularElements,
-      AngularComponentElement component) {
-//    this._angularElements = angularElements;
-    // add built-in processors
-    _processors.add(NgModelProcessor.INSTANCE);
-    // _processors.add(NgRepeatProcessor.INSTANCE);
-    // add element's libraries
-    for (AngularElement angularElement in angularElements) {
-      _injectedLibraries.add(angularElement.library);
-    }
-    // prepare Dart library
-    _createLibraryElement();
-    (_unit.element as HtmlElementImpl).angularCompilationUnit = _unitElement;
-    // prepare Dart resolver
-    _createResolver();
-    // maybe resolving component template
-    if (component != null) {
-      _defineTopVariable_forClassElement(component);
-      for (AngularScopePropertyElement scopeProperty in
-          component.scopeProperties) {
-        _defineTopVariable_forScopeProperty(scopeProperty);
-      }
-    }
-    // add processors
-    for (AngularElement angularElement in angularElements) {
-      NgProcessor processor = _createProcessor(angularElement);
-      if (processor != null) {
-        _processors.add(processor);
-      }
-    }
-    // define formatters
-    for (AngularElement angularElement in angularElements) {
-      if (angularElement is AngularFormatterElement) {
-        _defineTopVariable_forClassElement(angularElement);
-      }
-    }
-    // run this HTML visitor
-    _unit.accept(this);
-    // simulate imports for injects
-    {
-      List<ImportElement> imports = <ImportElement>[];
-      for (LibraryElement injectedLibrary in _injectedLibraries) {
-        ImportElementImpl importElement = new ImportElementImpl(-1);
-        importElement.importedLibrary = injectedLibrary;
-        imports.add(importElement);
-      }
-      _libraryElement.imports = imports;
-    }
-  }
-
-  /**
-   * Resolves given [AstNode] using [resolver].
-   */
-  void _resolveNode(AstNode node) {
-    node.accept(_resolver);
-  }
-
-  void _resolveXmlExpression(AngularXmlExpression angularXmlExpression) {
-    AngularExpression angularExpression = angularXmlExpression.expression;
-    _resolveExpression(angularExpression);
-  }
-
-  Token _scanDart(String contents, int startIndex, int endIndex, int offset) =>
-      ht.HtmlParser.scanDartSource(
-          _source,
-          _lineInfo,
-          contents.substring(startIndex, endIndex),
-          offset + startIndex,
-          _errorListener);
-
-  List<Token> _splitAtBar(Token token) {
-    List<Token> tokens = <Token>[];
-    tokens.add(token);
-    while (token.type != TokenType.EOF) {
-      if (token.type == TokenType.BAR) {
-        tokens.add(token);
-        Token eofToken = new Token(TokenType.EOF, 0);
-        token.previous.setNext(eofToken);
-      }
-      token = token.next;
-    }
-    return tokens;
-  }
-
-  /**
-   * The "ng-model" directive is special, it contributes to the top-level name scope. These models
-   * can be used before actual "ng-model" attribute in HTML. So, we need to define them once we
-   * found [NG_APP] context.
-   */
-  void _visitModelDirectives(ht.XmlTagNode appNode) {
-    appNode.accept(new _AngularHtmlUnitResolver_visitModelDirectives(this));
-  }
-
-  /**
-   * Checks if given [Element] is an artificial local variable and returns corresponding
-   * [AngularElement], or `null` otherwise.
-   */
-  static AngularElement getAngularElement(Element element) {
-    // may be artificial local variable, replace with AngularElement
-    if (element is LocalVariableElement) {
-      LocalVariableElement local = element;
-      List<ToolkitObjectElement> toolkitObjects = local.toolkitObjects;
-      if (toolkitObjects.length == 1 && toolkitObjects[0] is AngularElement) {
-        return toolkitObjects[0] as AngularElement;
-      }
-    }
-    // not a special Element
-    return null;
-  }
-
-  /**
-   * @return `true` if the given [HtmlUnit] has <code>ng-app</code> annotation.
-   */
-  static bool hasAngularAnnotation(ht.HtmlUnit htmlUnit) {
-    try {
-      htmlUnit.accept(
-          new RecursiveXmlVisitor_AngularHtmlUnitResolver_hasAngularAnnotation());
-    } on AngularHtmlUnitResolver_FoundAppError catch (e) {
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Adds [AngularElement] declared by the given top-level [Element].
-   *
-   * @param angularElements the list to fill with top-level [AngularElement]s
-   * @param classElement the [ClassElement] to get [AngularElement]s from
-   */
-  static void _addAngularElementsFromClass(Set<AngularElement> angularElements,
-      ClassElement classElement) {
-    for (ToolkitObjectElement toolkitObject in classElement.toolkitObjects) {
-      if (toolkitObject is AngularElement) {
-        angularElements.add(toolkitObject);
-      }
-    }
-  }
-
-  /**
-   * Returns the array of all top-level Angular elements that could be used in this library.
-   *
-   * @param libraryElement the [LibraryElement] to analyze
-   * @return the array of all top-level Angular elements that could be used in this library
-   */
-  static void
-      _addAngularElementsFromLibrary(Set<AngularElement> angularElements,
-      LibraryElement library, Set<LibraryElement> visited) {
-    if (library == null) {
-      return;
-    }
-    if (!visited.add(library)) {
-      return;
-    }
-    // add Angular elements from current library
-    for (CompilationUnitElement unit in library.units) {
-      angularElements.addAll(unit.angularViews);
-      for (ClassElement type in unit.types) {
-        _addAngularElementsFromClass(angularElements, type);
-      }
-    }
-    // handle imports
-    for (ImportElement importElement in library.imports) {
-      LibraryElement importedLibrary = importElement.importedLibrary;
-      _addAngularElementsFromLibrary(angularElements, importedLibrary, visited);
-    }
-  }
-
-  static SimpleIdentifier _createIdentifier(String name, int offset) {
-    StringToken token = _createStringToken(name, offset);
-    return new SimpleIdentifier(token);
-  }
-
-  static StringToken _createStringToken(String name, int offset) =>
-      new StringToken(TokenType.IDENTIFIER, name, offset);
-
-  /**
-   * Returns the array of all top-level Angular elements that could be used in this library.
-   *
-   * @param libraryElement the [LibraryElement] to analyze
-   * @return the array of all top-level Angular elements that could be used in this library
-   */
-  static List<AngularElement> _getAngularElements(Set<LibraryElement> libraries,
-      LibraryElement libraryElement) {
-    Set<AngularElement> angularElements = new Set();
-    _addAngularElementsFromLibrary(angularElements, libraryElement, libraries);
-    return new List.from(angularElements);
-  }
-
-  /**
-   * Returns the external Dart [CompilationUnit] referenced by the given [HtmlUnit].
-   */
-  static CompilationUnit _getDartUnit(AnalysisContext context,
-      ht.HtmlUnit unit) {
-    for (HtmlScriptElement script in unit.element.scripts) {
-      if (script is ExternalHtmlScriptElement) {
-        Source scriptSource = script.scriptSource;
-        if (scriptSource != null) {
-          return context.resolveCompilationUnit2(scriptSource, scriptSource);
-        }
-      }
-    }
-    return null;
-  }
-
-  static Set<Source> _getLibrarySources(Set<LibraryElement> libraries) {
-    Set<Source> sources = new Set();
-    for (LibraryElement library in libraries) {
-      sources.add(library.source);
-    }
-    return sources;
-  }
-}
-
-class AngularHtmlUnitResolver_FilteringAnalysisErrorListener implements
-    AnalysisErrorListener {
-  final AnalysisErrorListener _listener;
-
-  AngularHtmlUnitResolver_FilteringAnalysisErrorListener(this._listener);
-
-  @override
-  void onError(AnalysisError error) {
-    ErrorCode errorCode = error.errorCode;
-    if (identical(errorCode, StaticWarningCode.UNDEFINED_GETTER) ||
-        identical(errorCode, StaticWarningCode.UNDEFINED_IDENTIFIER) ||
-        identical(errorCode, StaticTypeWarningCode.UNDEFINED_GETTER)) {
-      return;
-    }
-    _listener.onError(error);
-  }
-}
-
-class AngularHtmlUnitResolver_FoundAppError extends Error {
-}
-
-/**
- * Implementation of [AngularXmlExpression] for an [AngularExpression] enclosed between
- * <code>{{</code> and <code>}}</code>.
- */
-class AngularMoustacheXmlExpression extends AngularXmlExpression {
-  static int OPENING_DELIMITER_CHAR = 0x7B;
-
-  static int CLOSING_DELIMITER_CHAR = 0x7D;
-
-  static String OPENING_DELIMITER = "{{";
-
-  static String CLOSING_DELIMITER = "}}";
-
-  static int OPENING_DELIMITER_LENGTH = OPENING_DELIMITER.length;
-
-  static int CLOSING_DELIMITER_LENGTH = CLOSING_DELIMITER.length;
-
-  /**
-   * The offset of the first character of the opening delimiter.
-   */
-  final int _openingOffset;
-
-  /**
-   * The offset of the first character of the closing delimiter.
-   */
-  final int _closingOffset;
-
-  AngularMoustacheXmlExpression(this._openingOffset, this._closingOffset,
-      AngularExpression expression)
-      : super(expression);
-
-  @override
-  int get end => _closingOffset + CLOSING_DELIMITER_LENGTH;
-
-  @override
-  int get length => _closingOffset + CLOSING_DELIMITER_LENGTH - _openingOffset;
-
-  @override
-  int get offset => _openingOffset;
-}
-
-/**
- * Implementation of [AngularXmlExpression] for an [AngularExpression] embedded without
- * any wrapping characters.
- */
-class AngularRawXmlExpression extends AngularXmlExpression {
-  AngularRawXmlExpression(AngularExpression expression) : super(expression);
-
-  @override
-  int get end => expression.end;
-
-  @override
-  int get length => expression.length;
-
-  @override
-  int get offset => expression.offset;
-}
-
-/**
- * Abstract Angular specific [XmlExpression].
- */
-abstract class AngularXmlExpression extends ht.XmlExpression {
-  /**
-   * The expression that is enclosed between the delimiters.
-   */
-  final AngularExpression expression;
-
-  AngularXmlExpression(this.expression);
-
-  @override
-  ht.XmlExpression_Reference getReference(int offset) {
-    // main expression
-    ht.XmlExpression_Reference reference =
-        _getReferenceAtNode(expression.expression, offset);
-    if (reference != null) {
-      return reference;
-    }
-    // formatters
-    for (AngularFormatterNode formatter in expression.formatters) {
-      // formatter name
-      reference = _getReferenceAtNode(formatter.name, offset);
-      if (reference != null) {
-        return reference;
-      }
-      // formatter arguments
-      for (AngularFormatterArgument formatterArgument in formatter.arguments) {
-        reference = _getReferenceAtNode(formatterArgument.expression, offset);
-        if (reference != null) {
-          return reference;
-        }
-      }
-    }
-    return null;
-  }
-
-  /**
-   * If the given [AstNode] has an [Element] at the given offset, then returns
-   * [Reference] with this [Element].
-   */
-  ht.XmlExpression_Reference _getReferenceAtNode(AstNode root, int offset) {
-    AstNode node = new NodeLocator.con1(offset).searchWithin(root);
-    if (node != null) {
-      Element element = ElementLocator.locate(node);
-      return new ht.XmlExpression_Reference(element, node.offset, node.length);
-    }
-    return null;
-  }
-}
-
-/**
- * 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.
  */
@@ -8297,6 +7198,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;
+  }
+}
+
+/**
  * The interface `ChangeNotice` defines the behavior of objects that represent a change to the
  * analysis results associated with a given source.
  */
@@ -8736,15 +7663,6 @@
  */
 class DartEntry extends SourceEntry {
   /**
-   * The data descriptor representing the errors reported during Angular
-   * resolution.
-   */
-  static final DataDescriptor<List<AnalysisError>> ANGULAR_ERRORS =
-      new DataDescriptor<List<AnalysisError>>(
-          "DartEntry.ANGULAR_ERRORS",
-          AnalysisError.NO_ERRORS);
-
-  /**
    * The data descriptor representing the element model representing a single
    * compilation unit. This model is incomplete and should not be used except as
    * input to another task.
@@ -8833,6 +7751,15 @@
       new DataDescriptor<bool>("DartEntry.IS_LAUNCHABLE", false);
 
   /**
+   * The data descriptor representing lint warnings resulting from auditing the
+   * source.
+   */
+  static final DataDescriptor<List<AnalysisError>> LINTS =
+      new DataDescriptor<List<AnalysisError>>(
+          "DartEntry.LINTS",
+          AnalysisError.NO_ERRORS);
+
+  /**
    * The data descriptor representing the errors resulting from parsing the
    * source.
    */
@@ -8925,9 +7852,9 @@
       errors.addAll(state.getValue(RESOLUTION_ERRORS));
       errors.addAll(state.getValue(VERIFICATION_ERRORS));
       errors.addAll(state.getValue(HINTS));
+      errors.addAll(state.getValue(LINTS));
       state = state._nextState;
     }
-    errors.addAll(getValue(ANGULAR_ERRORS));
     if (errors.length == 0) {
       return AnalysisError.NO_ERRORS;
     }
@@ -9074,13 +8001,13 @@
    */
   List<DataDescriptor> get libraryDescriptors {
     return <DataDescriptor>[
-        DartEntry.ANGULAR_ERRORS,
         DartEntry.BUILT_ELEMENT,
         DartEntry.BUILT_UNIT,
         DartEntry.RESOLUTION_ERRORS,
         DartEntry.RESOLVED_UNIT,
         DartEntry.VERIFICATION_ERRORS,
-        DartEntry.HINTS];
+        DartEntry.HINTS,
+        DartEntry.LINTS];
   }
 
   /**
@@ -9255,6 +8182,21 @@
   }
 
   /**
+   * Record that an error occurred while attempting to generate lints for the
+   * source represented by this entry. This will set the state of all
+   * verification information as being in error.
+   *
+   * @param librarySource the source of the library in which lints were being generated
+   * @param exception the exception that shows where the error occurred
+   */
+  void recordLintErrorInLibrary(Source librarySource,
+      CaughtException exception) {
+    this.exception = exception;
+    ResolutionState state = _getOrCreateResolutionState(librarySource);
+    state.recordLintError();
+  }
+
+  /**
    * Record that an [exception] occurred while attempting to scan or parse the
    * entry represented by this entry. This will set the state of all information,
    * including any resolution-based information, as being in error.
@@ -9452,8 +8394,7 @@
 
   @override
   bool _isValidDescriptor(DataDescriptor descriptor) {
-    return descriptor == ANGULAR_ERRORS ||
-        descriptor == CONTAINING_LIBRARIES ||
+    return descriptor == CONTAINING_LIBRARIES ||
         descriptor == ELEMENT ||
         descriptor == EXPORTED_LIBRARIES ||
         descriptor == IMPORTED_LIBRARIES ||
@@ -9474,10 +8415,10 @@
    * relative to a library.
    */
   bool _isValidLibraryDescriptor(DataDescriptor descriptor) {
-    return descriptor == ANGULAR_ERRORS ||
-        descriptor == BUILT_ELEMENT ||
+    return descriptor == BUILT_ELEMENT ||
         descriptor == BUILT_UNIT ||
         descriptor == HINTS ||
+        descriptor == LINTS ||
         descriptor == RESOLUTION_ERRORS ||
         descriptor == RESOLVED_UNIT ||
         descriptor == VERIFICATION_ERRORS;
@@ -9639,7 +8580,6 @@
     _writeStateOn(buffer, "publicNamespace", PUBLIC_NAMESPACE);
     _writeStateOn(buffer, "clientServer", IS_CLIENT);
     _writeStateOn(buffer, "launchable", IS_LAUNCHABLE);
-    _writeStateOn(buffer, "angularErrors", ANGULAR_ERRORS);
     _resolutionState._writeOn(buffer);
   }
 }
@@ -9689,6 +8629,7 @@
    */
   bool astIsNeeded(DartEntry dartEntry) =>
       dartEntry.hasInvalidData(DartEntry.HINTS) ||
+          dartEntry.hasInvalidData(DartEntry.LINTS) ||
           dartEntry.hasInvalidData(DartEntry.VERIFICATION_ERRORS) ||
           dartEntry.hasInvalidData(DartEntry.RESOLUTION_ERRORS);
 
@@ -9704,51 +8645,6 @@
   }
 }
 
-
-/**
- * Recursively visits [HtmlUnit] and every embedded [Expression].
- */
-abstract class ExpressionVisitor extends ht.RecursiveXmlVisitor<Object> {
-  /**
-   * Visits the given [Expression]s embedded into tag or attribute.
-   *
-   * @param expression the [Expression] to visit, not `null`
-   */
-  void visitExpression(Expression expression);
-
-  @override
-  Object visitXmlAttributeNode(ht.XmlAttributeNode node) {
-    _visitExpressions(node.expressions);
-    return super.visitXmlAttributeNode(node);
-  }
-
-  @override
-  Object visitXmlTagNode(ht.XmlTagNode node) {
-    _visitExpressions(node.expressions);
-    return super.visitXmlTagNode(node);
-  }
-
-  /**
-   * Visits [Expression]s of the given [XmlExpression]s.
-   */
-  void _visitExpressions(List<ht.XmlExpression> expressions) {
-    for (ht.XmlExpression xmlExpression in expressions) {
-      if (xmlExpression is AngularXmlExpression) {
-        AngularXmlExpression angularXmlExpression = xmlExpression;
-        List<Expression> dartExpressions =
-            angularXmlExpression.expression.expressions;
-        for (Expression dartExpression in dartExpressions) {
-          visitExpression(dartExpression);
-        }
-      }
-      if (xmlExpression is ht.RawXmlExpression) {
-        ht.RawXmlExpression rawXmlExpression = xmlExpression;
-        visitExpression(rawXmlExpression.expression);
-      }
-    }
-  }
-}
-
 /**
  * Instances of the class `GenerateDartErrorsTask` generate errors and warnings for a single
  * Dart source.
@@ -9980,6 +8876,57 @@
   }
 }
 
+/// Generates lint feedback for a single Dart library.
+class GenerateDartLintsTask extends AnalysisTask {
+
+  ///The compilation units that comprise the library, with the defining
+  ///compilation unit appearing first in the array.
+  final List<TimestampedData<CompilationUnit>> _units;
+
+  /// 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;
+
+  @override
+  String get taskDescription {
+    Source librarySource = libraryElement.source;
+    return (librarySource == null) ?
+        "generate Dart lints for library without source" :
+        "generate Dart lints for ${librarySource.fullName}";
+  }
+
+  @override
+  accept(AnalysisTaskVisitor visitor) =>
+      visitor.visitGenerateDartLintsTask(this);
+
+  @override
+  void internalPerform() {
+
+    Iterable<CompilationUnit> compilationUnits =
+        _units.map((TimestampedData<CompilationUnit> unit) => unit.data);
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+    LintGenerator lintGenerator =
+        new LintGenerator(compilationUnits, errorListener);
+    lintGenerator.generate();
+
+    lintMap = new HashMap<Source, List<AnalysisError>>();
+    compilationUnits.forEach((CompilationUnit unit) {
+      Source source = unit.element.source;
+      lintMap[source] = errorListener.getErrorsForSource(source);
+    });
+  }
+}
+
+
 /**
  * Instances of the class `GetContentTask` get the contents of a source.
  */
@@ -10058,6 +9005,7 @@
       TimestampedData<String> data = context.getContents(source);
       _content = data.data;
       _modificationTime = data.modificationTime;
+      AnalysisEngine.instance.instrumentationService.logFileRead(source.fullName, _modificationTime, _content);
     } catch (exception, stackTrace) {
       throw new AnalysisException(
           "Could not get contents of $source",
@@ -10072,36 +9020,6 @@
  */
 class HtmlEntry extends SourceEntry {
   /**
-   * The data descriptor representing the information about an Angular
-   * application this source is used in.
-   */
-  static final DataDescriptor<AngularApplication> ANGULAR_APPLICATION =
-      new DataDescriptor<AngularApplication>("HtmlEntry.ANGULAR_APPLICATION");
-
-  /**
-   * The data descriptor representing the information about an Angular component
-   * this source is used as template for.
-   */
-  static final DataDescriptor<AngularComponentElement> ANGULAR_COMPONENT =
-      new DataDescriptor<AngularComponentElement>("HtmlEntry.ANGULAR_COMPONENT");
-
-  /**
-   * The data descriptor representing the information about an Angular
-   * application for which this source is an entry point.
-   */
-  static final DataDescriptor<AngularApplication> ANGULAR_ENTRY =
-      new DataDescriptor<AngularApplication>("HtmlEntry.ANGULAR_ENTRY");
-
-  /**
-   * The data descriptor representing the errors reported during Angular
-   * resolution.
-   */
-  static final DataDescriptor<List<AnalysisError>> ANGULAR_ERRORS =
-      new DataDescriptor<List<AnalysisError>>(
-          "HtmlEntry.ANGULAR_ERRORS",
-          AnalysisError.NO_ERRORS);
-
-  /**
    * The data descriptor representing the HTML element.
    */
   static final DataDescriptor<HtmlElement> ELEMENT =
@@ -10155,24 +9073,6 @@
           AnalysisError.NO_ERRORS);
 
   /**
-   * The data descriptor representing the status of Polymer elements in the
-   * source.
-   */
-  static final DataDescriptor<List<AnalysisError>> POLYMER_BUILD_ERRORS =
-      new DataDescriptor<List<AnalysisError>>(
-          "HtmlEntry.POLYMER_BUILD_ERRORS",
-          AnalysisError.NO_ERRORS);
-
-  /**
-   * The data descriptor representing the errors reported during Polymer
-   * resolution.
-   */
-  static final DataDescriptor<List<AnalysisError>> POLYMER_RESOLUTION_ERRORS =
-      new DataDescriptor<List<AnalysisError>>(
-          "HtmlEntry.POLYMER_RESOLUTION_ERRORS",
-          AnalysisError.NO_ERRORS);
-
-  /**
    * Return all of the errors associated with the HTML file that are currently
    * cached.
    */
@@ -10180,10 +9080,7 @@
     List<AnalysisError> errors = new List<AnalysisError>();
     errors.addAll(getValue(PARSE_ERRORS));
     errors.addAll(getValue(RESOLUTION_ERRORS));
-    errors.addAll(getValue(ANGULAR_ERRORS));
     errors.addAll(getValue(HINTS));
-    errors.addAll(getValue(POLYMER_BUILD_ERRORS));
-    errors.addAll(getValue(POLYMER_RESOLUTION_ERRORS));
     if (errors.length == 0) {
       return AnalysisError.NO_ERRORS;
     }
@@ -10210,15 +9107,9 @@
     List<DataDescriptor> result = super.descriptors;
     result.addAll(
         [
-            HtmlEntry.ANGULAR_APPLICATION,
-            HtmlEntry.ANGULAR_COMPONENT,
-            HtmlEntry.ANGULAR_ENTRY,
-            HtmlEntry.ANGULAR_ERRORS,
             HtmlEntry.ELEMENT,
             HtmlEntry.PARSE_ERRORS,
             HtmlEntry.PARSED_UNIT,
-            HtmlEntry.POLYMER_BUILD_ERRORS,
-            HtmlEntry.POLYMER_RESOLUTION_ERRORS,
             HtmlEntry.RESOLUTION_ERRORS,
             HtmlEntry.RESOLVED_UNIT,
             HtmlEntry.HINTS]);
@@ -10234,8 +9125,6 @@
   void flushAstStructures() {
     _flush(PARSED_UNIT);
     _flush(RESOLVED_UNIT);
-    _flush(ANGULAR_ENTRY);
-    _flush(ANGULAR_ERRORS);
   }
 
   @override
@@ -10253,10 +9142,6 @@
    * source files should also be invalidated.
    */
   void invalidateAllResolutionInformation(bool invalidateUris) {
-    setState(ANGULAR_ENTRY, CacheState.INVALID);
-    setState(ANGULAR_ERRORS, CacheState.INVALID);
-    setState(POLYMER_BUILD_ERRORS, CacheState.INVALID);
-    setState(POLYMER_RESOLUTION_ERRORS, CacheState.INVALID);
     setState(ELEMENT, CacheState.INVALID);
     setState(RESOLUTION_ERRORS, CacheState.INVALID);
     setState(HINTS, CacheState.INVALID);
@@ -10291,27 +9176,18 @@
    */
   void recordResolutionError(CaughtException exception) {
     this.exception = exception;
-    setState(ANGULAR_ERRORS, CacheState.ERROR);
     setState(RESOLVED_UNIT, CacheState.ERROR);
     setState(ELEMENT, CacheState.ERROR);
     setState(RESOLUTION_ERRORS, CacheState.ERROR);
     setState(HINTS, CacheState.ERROR);
-    setState(POLYMER_BUILD_ERRORS, CacheState.ERROR);
-    setState(POLYMER_RESOLUTION_ERRORS, CacheState.ERROR);
   }
 
   @override
   bool _isValidDescriptor(DataDescriptor descriptor) {
-    return descriptor == ANGULAR_APPLICATION ||
-        descriptor == ANGULAR_COMPONENT ||
-        descriptor == ANGULAR_ENTRY ||
-        descriptor == ANGULAR_ERRORS ||
-        descriptor == ELEMENT ||
+    return descriptor == ELEMENT ||
         descriptor == HINTS ||
         descriptor == PARSED_UNIT ||
         descriptor == PARSE_ERRORS ||
-        descriptor == POLYMER_BUILD_ERRORS ||
-        descriptor == POLYMER_RESOLUTION_ERRORS ||
         descriptor == REFERENCED_LIBRARIES ||
         descriptor == RESOLUTION_ERRORS ||
         descriptor == RESOLVED_UNIT ||
@@ -10365,42 +9241,6 @@
         "element",
         HtmlEntry.ELEMENT,
         oldEntry);
-    needsSeparator = _writeStateDiffOn(
-        buffer,
-        needsSeparator,
-        "angularApplicationState",
-        HtmlEntry.ANGULAR_APPLICATION,
-        oldEntry);
-    needsSeparator = _writeStateDiffOn(
-        buffer,
-        needsSeparator,
-        "angularComponent",
-        HtmlEntry.ANGULAR_COMPONENT,
-        oldEntry);
-    needsSeparator = _writeStateDiffOn(
-        buffer,
-        needsSeparator,
-        "angularEntry",
-        HtmlEntry.ANGULAR_ENTRY,
-        oldEntry);
-    needsSeparator = _writeStateDiffOn(
-        buffer,
-        needsSeparator,
-        "angularErrors",
-        HtmlEntry.ANGULAR_ERRORS,
-        oldEntry);
-    needsSeparator = _writeStateDiffOn(
-        buffer,
-        needsSeparator,
-        "polymerBuildErrors",
-        HtmlEntry.POLYMER_BUILD_ERRORS,
-        oldEntry);
-    needsSeparator = _writeStateDiffOn(
-        buffer,
-        needsSeparator,
-        "polymerResolutionErrors",
-        HtmlEntry.POLYMER_RESOLUTION_ERRORS,
-        oldEntry);
     return needsSeparator;
   }
 
@@ -10414,12 +9254,6 @@
     _writeStateOn(buffer, "resolutionErrors", RESOLUTION_ERRORS);
     _writeStateOn(buffer, "referencedLibraries", REFERENCED_LIBRARIES);
     _writeStateOn(buffer, "element", ELEMENT);
-    _writeStateOn(buffer, "angularApplication", ANGULAR_APPLICATION);
-    _writeStateOn(buffer, "angularComponent", ANGULAR_COMPONENT);
-    _writeStateOn(buffer, "angularEntry", ANGULAR_ENTRY);
-    _writeStateOn(buffer, "angularErrors", ANGULAR_ERRORS);
-    _writeStateOn(buffer, "polymerBuildErrors", POLYMER_BUILD_ERRORS);
-    _writeStateOn(buffer, "polymerResolutionErrors", POLYMER_RESOLUTION_ERRORS);
   }
 }
 
@@ -10722,6 +9556,7 @@
         LibraryElement library = element.library;
         if (library != null) {
           IncrementalResolver resolver = new IncrementalResolver(
+              <Source, CompilationUnit>{},
               element,
               cache.offset,
               cache.oldLength,
@@ -10883,267 +9718,6 @@
 }
 
 /**
- * [NgComponentElementProcessor] applies [AngularComponentElement] by parsing mapped
- * attributes as expressions.
- */
-class NgComponentElementProcessor extends NgDirectiveProcessor {
-  final AngularComponentElement _element;
-
-  NgComponentElementProcessor(this._element);
-
-  @override
-  void apply(AngularHtmlUnitResolver resolver, ht.XmlTagNode node) {
-    node.element = _element.selector;
-    for (AngularPropertyElement property in _element.properties) {
-      String name = property.name;
-      ht.XmlAttributeNode attribute = node.getAttribute(name);
-      if (attribute != null) {
-        attribute.element = property;
-        // resolve if binding
-        if (property.propertyKind != AngularPropertyKind.ATTR) {
-          AngularExpression expression =
-              parseAngularExpression(resolver, attribute);
-          resolver._resolveExpression(expression);
-          setAngularExpression(attribute, expression);
-        }
-      }
-    }
-  }
-
-  @override
-  bool canApply(ht.XmlTagNode node) => _element.selector.apply(node);
-}
-
-/**
- * [NgControllerElementProcessor] applies [AngularControllerElement].
- */
-class NgControllerElementProcessor extends NgProcessor {
-  final AngularControllerElement _element;
-
-  NgControllerElementProcessor(this._element);
-
-  @override
-  void apply(AngularHtmlUnitResolver resolver, ht.XmlTagNode node) {
-    InterfaceType type = (_element.enclosingElement as ClassElement).type;
-    String name = _element.name;
-    LocalVariableElementImpl variable =
-        resolver._createLocalVariableWithName(type, name);
-    resolver._defineVariable(variable);
-    variable.toolkitObjects = <AngularElement>[_element];
-  }
-
-  @override
-  bool canApply(ht.XmlTagNode node) => _element.selector.apply(node);
-}
-
-/**
- * [NgDecoratorElementProcessor] applies [AngularDecoratorElement] by parsing mapped
- * attributes as expressions.
- */
-class NgDecoratorElementProcessor extends NgDirectiveProcessor {
-  final AngularDecoratorElement _element;
-
-  NgDecoratorElementProcessor(this._element);
-
-  @override
-  void apply(AngularHtmlUnitResolver resolver, ht.XmlTagNode node) {
-    String selectorAttributeName = null;
-    {
-      AngularSelectorElement selector = _element.selector;
-      if (selector is HasAttributeSelectorElementImpl) {
-        selectorAttributeName = selector.name;
-        // resolve attribute expression
-        ht.XmlAttributeNode attribute =
-            node.getAttribute(selectorAttributeName);
-        if (attribute != null) {
-          attribute.element = selector;
-        }
-      }
-    }
-    //
-    for (AngularPropertyElement property in _element.properties) {
-      // prepare attribute name
-      String name = property.name;
-      if (name == ".") {
-        name = selectorAttributeName;
-      }
-      // prepare attribute
-      ht.XmlAttributeNode attribute = node.getAttribute(name);
-      if (attribute == null) {
-        continue;
-      }
-      // if not resolved as the selector, resolve as a property
-      if (name != selectorAttributeName) {
-        attribute.element = property;
-      }
-      // skip if attribute has no value
-      if (!NgDirectiveProcessor.hasValue(attribute)) {
-        continue;
-      }
-      // resolve if binding
-      if (property.propertyKind != AngularPropertyKind.ATTR) {
-        resolver._pushNameScope();
-        try {
-          _onNgEventDirective(resolver);
-          AngularExpression expression =
-              parseAngularExpression(resolver, attribute);
-          resolver._resolveExpression(expression);
-          setAngularExpression(attribute, expression);
-        } finally {
-          resolver._popNameScope();
-        }
-      }
-    }
-  }
-
-  @override
-  bool canApply(ht.XmlTagNode node) => _element.selector.apply(node);
-
-  /**
-   * Support for <code>$event</code> variable in <code>NgEventDirective</code>.
-   */
-  void _onNgEventDirective(AngularHtmlUnitResolver resolver) {
-    if (_element.isClass("NgEventDirective")) {
-      DartType dynamicType = resolver.typeProvider.dynamicType;
-      resolver._defineVariable(
-          resolver._createLocalVariableWithName(dynamicType, "\$event"));
-    }
-  }
-}
-
-/**
- * [NgDirectiveProcessor] describes any <code>Directive</code> annotation instance.
- */
-abstract class NgDirectiveProcessor extends NgProcessor {
-  AngularExpression parseAngularExpression(AngularHtmlUnitResolver resolver,
-      ht.XmlAttributeNode attribute) {
-    Token token = _scanAttribute(resolver, attribute);
-    return resolver._parseAngularExpressionInToken(token);
-  }
-
-  Expression parseDartExpression(AngularHtmlUnitResolver resolver,
-      ht.XmlAttributeNode attribute) {
-    Token token = _scanAttribute(resolver, attribute);
-    return resolver._parseDartExpressionInToken(token);
-  }
-
-  /**
-   * Sets single [AngularExpression] for [XmlAttributeNode].
-   */
-  void setAngularExpression(ht.XmlAttributeNode attribute,
-      AngularExpression expression) {
-    _setExpression(attribute, newAngularRawXmlExpression(expression));
-  }
-
-  /**
-   * Sets single [Expression] for [XmlAttributeNode].
-   */
-  void setExpression(ht.XmlAttributeNode attribute, Expression expression) {
-    _setExpression(attribute, newRawXmlExpression(expression));
-  }
-
-  void setExpressions(ht.XmlAttributeNode attribute,
-      List<ht.XmlExpression> xmlExpressions) {
-    attribute.expressions = new List.from(xmlExpressions);
-  }
-
-  Token _scanAttribute(AngularHtmlUnitResolver resolver,
-      ht.XmlAttributeNode attribute) {
-    int offset = attribute.valueToken.offset + 1;
-    String value = attribute.text;
-    return resolver._scanDart(value, 0, value.length, offset);
-  }
-
-  void _setExpression(ht.XmlAttributeNode attribute,
-      ht.XmlExpression xmlExpression) {
-    attribute.expressions = <ht.XmlExpression>[xmlExpression];
-  }
-
-  static bool hasValue(ht.XmlAttributeNode attribute) {
-    ht.Token valueToken = attribute.valueToken;
-    return valueToken != null && !valueToken.isSynthetic;
-  }
-
-  static AngularRawXmlExpression
-      newAngularRawXmlExpression(AngularExpression e) =>
-      new AngularRawXmlExpression(e);
-
-  static ht.RawXmlExpression newRawXmlExpression(Expression e) =>
-      new ht.RawXmlExpression(e);
-}
-
-/**
- * [NgModelProcessor] describes built-in <code>NgModel</code> directive.
- */
-class NgModelProcessor extends NgDirectiveProcessor {
-  static String _NG_MODEL = "ng-model";
-
-  static NgModelProcessor INSTANCE = new NgModelProcessor();
-
-  @override
-  void apply(AngularHtmlUnitResolver resolver, ht.XmlTagNode node) {
-    ht.XmlAttributeNode attribute = node.getAttribute(_NG_MODEL);
-    Expression expression = parseDartExpression(resolver, attribute);
-    // identifiers have been already handled by "apply top"
-    if (expression is SimpleIdentifier) {
-      return;
-    }
-    // resolve
-    resolver._resolveNode(expression);
-    // remember expression
-    setExpression(attribute, expression);
-  }
-
-  @override
-  bool canApply(ht.XmlTagNode node) => node.getAttribute(_NG_MODEL) != null;
-
-  /**
-   * This method is used to define top-level [VariableElement]s for each "ng-model" with
-   * simple identifier model.
-   */
-  void _applyTopDeclarations(AngularHtmlUnitResolver resolver,
-      ht.XmlTagNode node) {
-    ht.XmlAttributeNode attribute = node.getAttribute(_NG_MODEL);
-    Expression expression = parseDartExpression(resolver, attribute);
-    // if not identifier, then not a top-level model, delay until "apply"
-    if (expression is! SimpleIdentifier) {
-      return;
-    }
-    SimpleIdentifier identifier = expression as SimpleIdentifier;
-    // define variable Element
-    InterfaceType type = resolver.typeProvider.stringType;
-    LocalVariableElementImpl element =
-        resolver._createLocalVariableFromIdentifier(type, identifier);
-    resolver._defineTopVariable(element);
-    // remember expression
-    identifier.staticElement = element;
-    identifier.staticType = type;
-    setExpression(attribute, identifier);
-  }
-}
-
-/**
- * [NgProcessor] is used to apply an Angular feature.
- */
-abstract class NgProcessor {
-  /**
-   * Applies this [NgProcessor] to the resolver.
-   *
-   * @param resolver the [AngularHtmlUnitResolver] to apply to, not `null`
-   * @param node the [XmlTagNode] to apply within, not `null`
-   */
-  void apply(AngularHtmlUnitResolver resolver, ht.XmlTagNode node);
-
-  /**
-   * Checks if this processor can be applied to the given [XmlTagNode].
-   *
-   * @param node the [XmlTagNode] to check
-   * @return `true` if this processor can be applied, or `false` otherwise
-   */
-  bool canApply(ht.XmlTagNode node);
-}
-
-/**
  * An implementation of [Logger] that does nothing.
  */
 class NullLogger implements Logger {
@@ -11339,8 +9913,6 @@
       Parser parser = new Parser(source, errorListener);
       AnalysisOptions options = context.analysisOptions;
       parser.parseFunctionBodies = options.analyzeFunctionBodies;
-      parser.parseDeferredLibraries = options.enableDeferredLoading;
-      parser.parseEnum = options.enableEnum;
       _unit = parser.parseCompilationUnit(_tokenStream);
       _unit.lineInfo = lineInfo;
       AnalysisContext analysisContext = context;
@@ -11778,16 +10350,6 @@
   static TimeCounter resolve = new TimeCounter();
 
   /**
-   * The [TimeCounter] for time spent in Angular analysis.
-   */
-  static TimeCounter angular = new TimeCounter();
-
-  /**
-   * The [TimeCounter] for time spent in Polymer analysis.
-   */
-  static TimeCounter polymer = new TimeCounter();
-
-  /**
    * The [TimeCounter] for time spent in error verifier.
    */
   static TimeCounter errors = new TimeCounter();
@@ -11798,6 +10360,11 @@
   static TimeCounter hints = new TimeCounter();
 
   /**
+   * The [TimeCounter] for time spent in linting.
+   */
+  static TimeCounter lint = new TimeCounter();
+
+  /**
    * Reset all of the time counters to zero.
    */
   static void reset() {
@@ -11805,535 +10372,9 @@
     scan = new TimeCounter();
     parse = new TimeCounter();
     resolve = new TimeCounter();
-    angular = new TimeCounter();
-    polymer = new TimeCounter();
     errors = new TimeCounter();
     hints = new TimeCounter();
-  }
-}
-
-/**
- * Instances of the class `PolymerBuildHtmlTask` build Polymer specific elements.
- */
-class PolymerBuildHtmlTask extends AnalysisTask {
-  /**
-   * The source to build which Polymer HTML elements for.
-   */
-  final Source source;
-
-  /**
-   * The line information associated with the source.
-   */
-  final LineInfo _lineInfo;
-
-  /**
-   * The HTML unit to be resolved.
-   */
-  final ht.HtmlUnit _unit;
-
-  /**
-   * The resolution errors that were discovered while building elements.
-   */
-  List<AnalysisError> _errors = AnalysisError.NO_ERRORS;
-
-  /**
-   * Initialize a newly created task to perform analysis within the given context.
-   *
-   * @param context the context in which the task is to be performed
-   * @param source the source to be resolved
-   * @param lineInfo the line information associated with the source
-   * @param unit the HTML unit to build Polymer elements for
-   */
-  PolymerBuildHtmlTask(InternalAnalysisContext context, this.source,
-      this._lineInfo, this._unit)
-      : super(context);
-
-  List<AnalysisError> get errors => _errors;
-
-  @override
-  String get taskDescription => "build Polymer elements ${source.fullName}";
-
-  @override
-  accept(AnalysisTaskVisitor visitor) =>
-      visitor.visitPolymerBuildHtmlTask(this);
-
-  @override
-  void internalPerform() {
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    PolymerHtmlUnitBuilder resolver =
-        new PolymerHtmlUnitBuilder(context, errorListener, source, _lineInfo, _unit);
-    resolver.build();
-    _errors = errorListener.getErrorsForSource(source);
-  }
-}
-
-/**
- * Instances of the class [PolymerHtmlUnitBuilder] build Polymer specific elements.
- */
-class PolymerHtmlUnitBuilder extends ht.RecursiveXmlVisitor<Object> {
-  /**
-   * These names are forbidden to use as a custom tag name.
-   *
-   * http://w3c.github.io/webcomponents/spec/custom/#concepts
-   */
-  static Set<String> _FORBIDDEN_TAG_NAMES = new Set();
-
-  final InternalAnalysisContext _context;
-
-  TypeProvider _typeProvider;
-
-  final AnalysisErrorListener _errorListener;
-
-  final Source _source;
-
-  final LineInfo _lineInfo;
-
-  final ht.HtmlUnit _unit;
-
-  List<PolymerTagHtmlElement> _tagHtmlElements = <PolymerTagHtmlElement>[];
-
-  ht.XmlTagNode _elementNode;
-
-  String _elementName;
-
-  PolymerTagHtmlElementImpl _htmlElement;
-
-  PolymerTagDartElementImpl _dartElement;
-
-  PolymerHtmlUnitBuilder(this._context, this._errorListener, this._source,
-      this._lineInfo, this._unit) {
-    this._typeProvider = _context.typeProvider;
-  }
-
-  /**
-   * Returns the only [LibraryElement] referenced by a direct `script` child. Maybe
-   * `null` if none.
-   */
-  LibraryElement get dartUnitElement {
-    // TODO(scheglov) Maybe check if more than one "script".
-    for (ht.XmlTagNode child in _elementNode.tagNodes) {
-      if (child is ht.HtmlScriptTagNode) {
-        HtmlScriptElement scriptElement = child.scriptElement;
-        if (scriptElement is ExternalHtmlScriptElement) {
-          Source scriptSource = scriptElement.scriptSource;
-          if (scriptSource != null) {
-            return _context.getLibraryElement(scriptSource);
-          }
-        }
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Builds Polymer specific HTML elements.
-   */
-  void build() {
-    _unit.accept(this);
-    // set Polymer tags
-    HtmlElementImpl unitElement = _unit.element as HtmlElementImpl;
-    unitElement.polymerTags = new List.from(_tagHtmlElements);
-  }
-
-  @override
-  Object visitXmlTagNode(ht.XmlTagNode node) {
-    if (node.tag == "polymer-element") {
-      _createTagHtmlElement(node);
-    }
-    // visit children
-    return super.visitXmlTagNode(node);
-  }
-
-  void _createAttributeElements() {
-    // prepare "attributes" attribute
-    ht.XmlAttributeNode attributesAttribute =
-        _elementNode.getAttribute("attributes");
-    if (attributesAttribute == null) {
-      return;
-    }
-    // check if there is a Dart part to resolve against it
-    if (_dartElement == null) {
-      // TODO(scheglov) maybe report error (if it is allowed at all to have
-      // element without Dart part)
-      return;
-    }
-    // prepare value of the "attributes" attribute
-    String attributesText = attributesAttribute.text;
-    if (attributesText.trim().isEmpty) {
-      _reportErrorForAttribute(
-          attributesAttribute,
-          PolymerCode.EMPTY_ATTRIBUTES);
-      return;
-    }
-    // prepare attribute name tokens
-    List<PolymerHtmlUnitBuilder_NameToken> nameTokens =
-        <PolymerHtmlUnitBuilder_NameToken>[
-        ];
-    {
-      int index = 0;
-      int textOffset = attributesAttribute.textOffset;
-      int nameOffset = -1;
-      StringBuffer nameBuffer = new StringBuffer();
-      while (index < attributesText.length) {
-        int c = attributesText.codeUnitAt(index++);
-        if (Character.isWhitespace(c)) {
-          if (nameOffset != -1) {
-            nameTokens.add(
-                new PolymerHtmlUnitBuilder_NameToken(nameOffset, nameBuffer.toString()));
-            nameBuffer = new StringBuffer();
-            nameOffset = -1;
-          }
-          continue;
-        }
-        if (nameOffset == -1) {
-          nameOffset = textOffset + index - 1;
-        }
-        nameBuffer.writeCharCode(c);
-      }
-      if (nameOffset != -1) {
-        nameTokens.add(
-            new PolymerHtmlUnitBuilder_NameToken(nameOffset, nameBuffer.toString()));
-        nameBuffer = new StringBuffer();
-      }
-    }
-    // create attributes for name tokens
-    List<PolymerAttributeElement> attributes = <PolymerAttributeElement>[];
-    Set<String> definedNames = new Set();
-    ClassElement classElement = _dartElement.classElement;
-    for (PolymerHtmlUnitBuilder_NameToken nameToken in nameTokens) {
-      int offset = nameToken._offset;
-      // prepare name
-      String name = nameToken._value;
-      if (!isValidAttributeName(name)) {
-        _reportErrorForNameToken(
-            nameToken,
-            PolymerCode.INVALID_ATTRIBUTE_NAME,
-            [name]);
-        continue;
-      }
-      if (!definedNames.add(name)) {
-        _reportErrorForNameToken(
-            nameToken,
-            PolymerCode.DUPLICATE_ATTRIBUTE_DEFINITION,
-            [name]);
-        continue;
-      }
-      // create attribute
-      PolymerAttributeElementImpl attribute =
-          new PolymerAttributeElementImpl(name, offset);
-      attributes.add(attribute);
-      // resolve field
-      FieldElement field = classElement.getField(name);
-      if (field == null) {
-        _reportErrorForNameToken(
-            nameToken,
-            PolymerCode.UNDEFINED_ATTRIBUTE_FIELD,
-            [name, classElement.displayName]);
-        continue;
-      }
-      if (!_isPublishedField(field)) {
-        _reportErrorForNameToken(
-            nameToken,
-            PolymerCode.ATTRIBUTE_FIELD_NOT_PUBLISHED,
-            [name, classElement.displayName]);
-      }
-      attribute.field = field;
-    }
-    _htmlElement.attributes = attributes;
-  }
-
-  void _createTagHtmlElement(ht.XmlTagNode node) {
-    this._elementNode = node;
-    this._elementName = null;
-    this._htmlElement = null;
-    this._dartElement = null;
-    // prepare 'name' attribute
-    ht.XmlAttributeNode nameAttribute = node.getAttribute("name");
-    if (nameAttribute == null) {
-      _reportErrorForToken(node.tagToken, PolymerCode.MISSING_TAG_NAME);
-      return;
-    }
-    // prepare name
-    _elementName = nameAttribute.text;
-    if (!isValidTagName(_elementName)) {
-      _reportErrorForAttributeValue(
-          nameAttribute,
-          PolymerCode.INVALID_TAG_NAME,
-          [_elementName]);
-      return;
-    }
-    // TODO(scheglov) Maybe check that at least one of "template" or "script"
-    // children.
-    // TODO(scheglov) Maybe check if more than one top-level "template".
-    // create HTML element
-    int nameOffset = nameAttribute.textOffset;
-    _htmlElement = new PolymerTagHtmlElementImpl(_elementName, nameOffset);
-    // bind to the corresponding Dart element
-    _dartElement = _findTagDartElement();
-    if (_dartElement != null) {
-      _htmlElement.dartElement = _dartElement;
-      _dartElement.htmlElement = _htmlElement;
-    }
-    // TODO(scheglov) create attributes
-    _createAttributeElements();
-    // done
-    _tagHtmlElements.add(_htmlElement);
-  }
-
-  /**
-   * Returns the [PolymerTagDartElement] that corresponds to the Polymer custom tag declared
-   * by the given [XmlTagNode].
-   */
-  PolymerTagDartElementImpl _findTagDartElement() {
-    LibraryElement dartLibraryElement = dartUnitElement;
-    if (dartLibraryElement == null) {
-      return null;
-    }
-    return _findTagDartElement_inLibrary(dartLibraryElement);
-  }
-
-  /**
-   * Returns the [PolymerTagDartElementImpl] declared in the given [LibraryElement] with
-   * the [elementName]. Maybe `null`.
-   */
-  PolymerTagDartElementImpl
-      _findTagDartElement_inLibrary(LibraryElement library) {
-    try {
-      library.accept(new _PolymerHtmlUnitBuilder_findTagDartElement(this));
-    } on PolymerHtmlUnitBuilder_FoundTagDartElementError catch (e) {
-      return e._result;
-    }
-    return null;
-  }
-
-  bool _isPublishedAnnotation(ElementAnnotation annotation) {
-    Element element = annotation.element;
-    if (element != null && element.name == "published") {
-      return true;
-    }
-    return false;
-  }
-
-  bool _isPublishedField(FieldElement field) {
-    List<ElementAnnotation> annotations = field.metadata;
-    for (ElementAnnotation annotation in annotations) {
-      if (_isPublishedAnnotation(annotation)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Reports an error on the attribute's value, or (if absent) on the attribute's name.
-   */
-  void _reportErrorForAttribute(ht.XmlAttributeNode node, ErrorCode errorCode,
-      [List<Object> arguments]) {
-    _reportErrorForOffset(node.offset, node.length, errorCode, arguments);
-  }
-
-  /**
-   * Reports an error on the attribute's value, or (if absent) on the attribute's name.
-   */
-  void _reportErrorForAttributeValue(ht.XmlAttributeNode node,
-      ErrorCode errorCode, [List<Object> arguments]) {
-    ht.Token valueToken = node.valueToken;
-    if (valueToken == null || valueToken.isSynthetic) {
-      _reportErrorForAttribute(node, errorCode, arguments);
-    } else {
-      _reportErrorForToken(valueToken, errorCode, arguments);
-    }
-  }
-
-  void _reportErrorForNameToken(PolymerHtmlUnitBuilder_NameToken token,
-      ErrorCode errorCode, [List<Object> arguments]) {
-    int offset = token._offset;
-    int length = token._value.length;
-    _reportErrorForOffset(offset, length, errorCode, arguments);
-  }
-
-  void _reportErrorForOffset(int offset, int length, ErrorCode errorCode,
-      [List<Object> arguments]) {
-    _errorListener.onError(
-        new AnalysisError.con2(_source, offset, length, errorCode, arguments));
-  }
-
-  void _reportErrorForToken(ht.Token token, ErrorCode errorCode,
-      [List<Object> arguments]) {
-    int offset = token.offset;
-    int length = token.length;
-    _reportErrorForOffset(offset, length, errorCode, arguments);
-  }
-
-  static bool isValidAttributeName(String name) {
-    // cannot be empty
-    if (name.isEmpty) {
-      return false;
-    }
-    // check characters
-    int length = name.length;
-    for (int i = 0; i < length; i++) {
-      int c = name.codeUnitAt(i);
-      if (i == 0) {
-        if (!Character.isLetter(c)) {
-          return false;
-        }
-      } else {
-        if (!(Character.isLetterOrDigit(c) || c == 0x5F)) {
-          return false;
-        }
-      }
-    }
-    return true;
-  }
-
-  static bool isValidTagName(String name) {
-    // cannot be empty
-    if (name.isEmpty) {
-      return false;
-    }
-    // check for forbidden name
-    if (_FORBIDDEN_TAG_NAMES.contains(name)) {
-      return false;
-    }
-    // check characters
-    int length = name.length;
-    bool hasDash = false;
-    for (int i = 0; i < length; i++) {
-      int c = name.codeUnitAt(i);
-      // check for '-'
-      if (c == 0x2D) {
-        hasDash = true;
-      }
-      // check character
-      if (i == 0) {
-        if (hasDash) {
-          return false;
-        }
-        if (!Character.isLetter(c)) {
-          return false;
-        }
-      } else {
-        if (!(Character.isLetterOrDigit(c) || c == 0x2D || c == 0x5F)) {
-          return false;
-        }
-      }
-    }
-    if (!hasDash) {
-      return false;
-    }
-    return true;
-  }
-}
-
-class PolymerHtmlUnitBuilder_FoundTagDartElementError extends Error {
-  final PolymerTagDartElementImpl _result;
-
-  PolymerHtmlUnitBuilder_FoundTagDartElementError(this._result);
-}
-
-class PolymerHtmlUnitBuilder_NameToken {
-  final int _offset;
-
-  final String _value;
-
-  PolymerHtmlUnitBuilder_NameToken(this._offset, this._value);
-}
-
-/**
- * Instances of the class [PolymerHtmlUnitResolver] resolve Polymer specific
- * [XmlTagNode]s and expressions.
- *
- * TODO(scheglov) implement it
- */
-class PolymerHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> {
-  final InternalAnalysisContext _context;
-
-  TypeProvider _typeProvider;
-
-  final AnalysisErrorListener _errorListener;
-
-  final Source _source;
-
-  final LineInfo _lineInfo;
-
-  final ht.HtmlUnit _unit;
-
-  PolymerHtmlUnitResolver(this._context, this._errorListener, this._source,
-      this._lineInfo, this._unit) {
-    this._typeProvider = _context.typeProvider;
-  }
-
-  /**
-   * Resolves Polymer specific features.
-   */
-  void resolveUnit() {
-    // TODO(scheglov) implement it
-    //    unit.accept(this);
-  }
-
-  @override
-  Object visitXmlAttributeNode(ht.XmlAttributeNode node) =>
-      super.visitXmlAttributeNode(node);
-
-  @override
-  Object visitXmlTagNode(ht.XmlTagNode node) => super.visitXmlTagNode(node);
-}
-
-/**
- * Instances of the class `PolymerResolveHtmlTask` performs Polymer specific HTML file
- * resolution.
- *
- * TODO(scheglov) implement it
- */
-class PolymerResolveHtmlTask extends AnalysisTask {
-  /**
-   * The source to be resolved.
-   */
-  final Source source;
-
-  /**
-   * The line information associated with the source.
-   */
-  final LineInfo _lineInfo;
-
-  /**
-   * The HTML unit to be resolved.
-   */
-  final ht.HtmlUnit _unit;
-
-  /**
-   * The resolution errors that were discovered while resolving the source.
-   */
-  List<AnalysisError> _errors = AnalysisError.NO_ERRORS;
-
-  /**
-   * Initialize a newly created task to perform analysis within the given context.
-   *
-   * @param context the context in which the task is to be performed
-   * @param source the source to be resolved
-   * @param unit the HTML unit to be resolved
-   */
-  PolymerResolveHtmlTask(InternalAnalysisContext context, this.source,
-      this._lineInfo, this._unit)
-      : super(context);
-
-  List<AnalysisError> get errors => _errors;
-
-  @override
-  String get taskDescription => "resolve as Polymer ${source.fullName}";
-
-  @override
-  accept(AnalysisTaskVisitor visitor) =>
-      visitor.visitPolymerResolveHtmlTask(this);
-
-  @override
-  void internalPerform() {
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    PolymerHtmlUnitResolver resolver =
-        new PolymerHtmlUnitResolver(context, errorListener, source, _lineInfo, _unit);
-    resolver.resolveUnit();
-    _errors = errorListener.getErrorsForSource(source);
+    lint = new TimeCounter();
   }
 }
 
@@ -12405,17 +10446,6 @@
   }
 }
 
-class RecursiveXmlVisitor_AngularHtmlUnitResolver_hasAngularAnnotation extends
-    ht.RecursiveXmlVisitor<Object> {
-  @override
-  Object visitXmlTagNode(ht.XmlTagNode node) {
-    if (node.getAttribute(AngularHtmlUnitResolver._NG_APP) != null) {
-      throw new AngularHtmlUnitResolver_FoundAppError();
-    }
-    return super.visitXmlTagNode(node);
-  }
-}
-
 class RecursiveXmlVisitor_ParseHtmlTask_internalPerform extends
     ht.RecursiveXmlVisitor<Object> {
   final ParseHtmlTask ParseHtmlTask_this;
@@ -12667,6 +10697,7 @@
     setState(DartEntry.BUILT_UNIT, CacheState.INVALID);
     setState(DartEntry.BUILT_ELEMENT, CacheState.INVALID);
     setState(DartEntry.HINTS, CacheState.INVALID);
+    setState(DartEntry.LINTS, CacheState.INVALID);
     setState(DartEntry.RESOLVED_UNIT, CacheState.INVALID);
     setState(DartEntry.RESOLUTION_ERRORS, CacheState.INVALID);
     setState(DartEntry.VERIFICATION_ERRORS, CacheState.INVALID);
@@ -12692,6 +10723,15 @@
   }
 
   /**
+   * Record that an exception occurred while attempting to generate lints for
+   * the source associated with this entry. This will set the state of all
+   * verification information as being in error.
+   */
+  void recordLintError() {
+    setState(DartEntry.LINTS, CacheState.ERROR);
+  }
+
+  /**
    * Record that an exception occurred while attempting to resolve the source
    * associated with this state.
    */
@@ -12699,7 +10739,6 @@
     setState(DartEntry.RESOLVED_UNIT, CacheState.ERROR);
     setState(DartEntry.RESOLUTION_ERRORS, CacheState.ERROR);
     recordVerificationError();
-    setState(DartEntry.ANGULAR_ERRORS, CacheState.ERROR);
   }
 
   /**
@@ -12800,6 +10839,8 @@
         oldEntry);
     needsSeparator =
         _writeStateDiffOn(buffer, needsSeparator, "hints", DartEntry.HINTS, oldEntry);
+    needsSeparator =
+        _writeStateDiffOn(buffer, needsSeparator, "lints", DartEntry.LINTS, oldEntry);
     return needsSeparator;
   }
 
@@ -12820,6 +10861,7 @@
           "verificationErrors",
           DartEntry.VERIFICATION_ERRORS);
       _writeStateOn(buffer, "hints", DartEntry.HINTS);
+      _writeStateOn(buffer, "lints", DartEntry.LINTS);
       if (_nextState != null) {
         _nextState._writeOn(buffer);
       }
@@ -12889,211 +10931,6 @@
 }
 
 /**
- * Instances of the class `ResolveAngularComponentTemplateTask` resolve HTML template
- * referenced by [AngularComponentElement].
- */
-class ResolveAngularComponentTemplateTask extends AnalysisTask {
-  /**
-   * The source to be resolved.
-   */
-  final Source source;
-
-  /**
-   * The HTML unit to be resolved.
-   */
-  final ht.HtmlUnit _unit;
-
-  /**
-   * The [AngularComponentElement] to resolve template for.
-   */
-  final AngularComponentElement _component;
-
-  /**
-   * The Angular application to resolve in context of.
-   */
-  final AngularApplication _application;
-
-  /**
-   * The [HtmlUnit] that was resolved by this task.
-   */
-  ht.HtmlUnit _resolvedUnit;
-
-  /**
-   * The resolution errors that were discovered while resolving the source.
-   */
-  List<AnalysisError> _resolutionErrors = AnalysisError.NO_ERRORS;
-
-  /**
-   * Initialize a newly created task to perform analysis within the given context.
-   *
-   * @param context the context in which the task is to be performed
-   * @param source the source to be resolved
-   * @param unit the HTML unit to be resolved
-   * @param component the component that uses this HTML template, not `null`
-   * @param application the Angular application to resolve in context of
-   */
-  ResolveAngularComponentTemplateTask(InternalAnalysisContext context,
-      this.source, this._unit, this._component, this._application)
-      : super(context);
-
-  List<AnalysisError> get resolutionErrors => _resolutionErrors;
-
-  /**
-   * Return the [HtmlUnit] that was resolved by this task.
-   *
-   * @return the [HtmlUnit] that was resolved by this task
-   */
-  ht.HtmlUnit get resolvedUnit => _resolvedUnit;
-
-  @override
-  String get taskDescription => "resolve as Angular template $source";
-
-  @override
-  accept(AnalysisTaskVisitor visitor) =>
-      visitor.visitResolveAngularComponentTemplateTask(this);
-
-  @override
-  void internalPerform() {
-    //
-    // Prepare for resolution.
-    //
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    LineInfo lineInfo = context.getLineInfo(source);
-    //
-    // Perform resolution.
-    //
-    if (_application != null) {
-      AngularHtmlUnitResolver resolver =
-          new AngularHtmlUnitResolver(context, errorListener, source, lineInfo, _unit);
-      resolver.resolveComponentTemplate(_application, _component);
-      _resolvedUnit = _unit;
-    }
-    //
-    // Remember the errors.
-    //
-    _resolutionErrors = errorListener.getErrorsForSource(source);
-  }
-}
-
-/**
- * Instances of the class `ResolveAngularEntryHtmlTask` resolve a specific HTML file as an
- * Angular entry point.
- */
-class ResolveAngularEntryHtmlTask extends AnalysisTask {
-  /**
-   * The source to be resolved.
-   */
-  final Source source;
-
-  /**
-   * The HTML unit to be resolved.
-   */
-  final ht.HtmlUnit _unit;
-
-  /**
-   * The listener to record errors.
-   */
-  RecordingErrorListener _errorListener = new RecordingErrorListener();
-
-  /**
-   * The [HtmlUnit] that was resolved by this task.
-   */
-  ht.HtmlUnit _resolvedUnit;
-
-  /**
-   * The element produced by resolving the source.
-   */
-  HtmlElement _element = null;
-
-  /**
-   * The Angular application to resolve in context of.
-   */
-  AngularApplication _application;
-
-  /**
-   * Initialize a newly created task to perform analysis within the given context.
-   *
-   * @param context the context in which the task is to be performed
-   * @param source the source to be resolved
-   * @param unit the HTML unit to be resolved
-   */
-  ResolveAngularEntryHtmlTask(InternalAnalysisContext context, this.source,
-      this._unit)
-      : super(context);
-
-  /**
-   * Returns the [AngularApplication] for the Web application with this Angular entry point,
-   * maybe `null` if not an Angular entry point.
-   */
-  AngularApplication get application => _application;
-
-  HtmlElement get element => _element;
-
-  /**
-   * The resolution errors that were discovered while resolving the source.
-   */
-  List<AnalysisError> get entryErrors =>
-      _errorListener.getErrorsForSource(source);
-
-  /**
-   * Return the [HtmlUnit] that was resolved by this task.
-   *
-   * @return the [HtmlUnit] that was resolved by this task
-   */
-  ht.HtmlUnit get resolvedUnit => _resolvedUnit;
-
-  @override
-  String get taskDescription {
-    if (source == null) {
-      return "resolve as Angular entry point null source";
-    }
-    return "resolve as Angular entry point ${source.fullName}";
-  }
-
-  @override
-  accept(AnalysisTaskVisitor visitor) =>
-      visitor.visitResolveAngularEntryHtmlTask(this);
-
-  /**
-   * Returns [AnalysisError]s recorded for the given [Source].
-   */
-  List<AnalysisError> getErrors(Source source) =>
-      _errorListener.getErrorsForSource(source);
-
-  @override
-  void internalPerform() {
-    //
-    // Prepare for resolution.
-    //
-    LineInfo lineInfo = context.getLineInfo(source);
-    //
-    // Try to resolve as an Angular entry point.
-    //
-    _application = new AngularHtmlUnitResolver(
-        context,
-        _errorListener,
-        source,
-        lineInfo,
-        _unit).calculateAngularApplication();
-    //
-    // Perform resolution.
-    //
-    if (_application != null) {
-      new AngularHtmlUnitResolver(
-          context,
-          _errorListener,
-          source,
-          lineInfo,
-          _unit).resolveEntryPoint(_application);
-    }
-    //
-    // Remember the resolved unit.
-    //
-    _resolvedUnit = _unit;
-  }
-}
-
-/**
  * Instances of the class `ResolveDartLibraryTask` resolve a specific Dart library.
  */
 class ResolveDartLibraryCycleTask extends AnalysisTask {
@@ -14390,23 +12227,6 @@
   }
 }
 
-class _AngularHtmlUnitResolver_visitModelDirectives extends
-    ht.RecursiveXmlVisitor<Object> {
-  final AngularHtmlUnitResolver resolver;
-
-  _AngularHtmlUnitResolver_visitModelDirectives(this.resolver)
-      : super();
-
-  @override
-  Object visitXmlTagNode(ht.XmlTagNode node) {
-    NgModelProcessor directive = NgModelProcessor.INSTANCE;
-    if (directive.canApply(node)) {
-      directive._applyTopDeclarations(resolver, node);
-    }
-    return super.visitXmlTagNode(node);
-  }
-}
-
 class _ElementByIdFinder extends GeneralizingElementVisitor {
   final int _id;
   Element result;
@@ -14425,20 +12245,3 @@
 
 class _ElementByIdFinderException {
 }
-
-class _PolymerHtmlUnitBuilder_findTagDartElement extends
-    RecursiveElementVisitor<Object> {
-  final PolymerHtmlUnitBuilder PolymerHtmlUnitBuilder_this;
-
-  _PolymerHtmlUnitBuilder_findTagDartElement(this.PolymerHtmlUnitBuilder_this)
-      : super();
-
-  @override
-  Object visitPolymerTagDartElement(PolymerTagDartElement element) {
-    if (element.name == PolymerHtmlUnitBuilder_this._elementName) {
-      throw new PolymerHtmlUnitBuilder_FoundTagDartElementError(
-          element as PolymerTagDartElementImpl);
-    }
-    return null;
-  }
-}
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index e34d07f..f9411ef 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -285,81 +285,6 @@
 }
 
 /**
- * The enumeration `AngularCode` defines Angular specific problems.
- */
-class AngularCode extends ErrorCode {
-  static const AngularCode CANNOT_PARSE_SELECTOR = const AngularCode(
-      'CANNOT_PARSE_SELECTOR',
-      "The selector '{0}' cannot be parsed");
-
-  static const AngularCode INVALID_FORMATTER_NAME = const AngularCode(
-      'INVALID_FORMATTER_NAME',
-      "Formatter name must be a simple identifier");
-
-  static const AngularCode INVALID_PROPERTY_KIND = const AngularCode(
-      'INVALID_PROPERTY_KIND',
-      "Unknown property binding kind '{0}', use one of the '@', '=>', '=>!' or '<=>'");
-
-  static const AngularCode INVALID_PROPERTY_FIELD =
-      const AngularCode('INVALID_PROPERTY_FIELD', "Unknown property field '{0}'");
-
-  static const AngularCode INVALID_PROPERTY_MAP = const AngularCode(
-      'INVALID_PROPERTY_MAP',
-      "Argument 'map' must be a constant map literal");
-
-  static const AngularCode INVALID_PROPERTY_NAME = const AngularCode(
-      'INVALID_PROPERTY_NAME',
-      "Property name must be a string literal");
-
-  static const AngularCode INVALID_PROPERTY_SPEC = const AngularCode(
-      'INVALID_PROPERTY_SPEC',
-      "Property binding specification must be a string literal");
-
-  static const AngularCode INVALID_REPEAT_SYNTAX = const AngularCode(
-      'INVALID_REPEAT_SYNTAX',
-      "Expected statement in form '_item_ in _collection_ [tracked by _id_]'");
-
-  static const AngularCode INVALID_REPEAT_ITEM_SYNTAX = const AngularCode(
-      'INVALID_REPEAT_ITEM_SYNTAX',
-      "Item must by identifier or in '(_key_, _value_)' pair.");
-
-  static const AngularCode INVALID_URI =
-      const AngularCode('INVALID_URI', "Invalid URI syntax: '{0}'");
-
-  static const AngularCode MISSING_FORMATTER_COLON = const AngularCode(
-      'MISSING_FORMATTER_COLON',
-      "Missing ':' before formatter argument");
-
-  static const AngularCode MISSING_NAME =
-      const AngularCode('MISSING_NAME', "Argument 'name' must be provided");
-
-  static const AngularCode MISSING_PUBLISH_AS = const AngularCode(
-      'MISSING_PUBLISH_AS',
-      "Argument 'publishAs' must be provided");
-
-  static const AngularCode MISSING_SELECTOR =
-      const AngularCode('MISSING_SELECTOR', "Argument 'selector' must be provided");
-
-  static const AngularCode URI_DOES_NOT_EXIST =
-      const AngularCode('URI_DOES_NOT_EXIST', "Target of URI does not exist: '{0}'");
-
-  /**
-   * Initialize a newly created error code to have the given [name]. The message
-   * associated with the error will be created from the given [message]
-   * template. The correction associated with the error will be created from the
-   * given [correction] template.
-   */
-  const AngularCode(String name, String message, [String correction])
-      : super(name, message, correction);
-
-  @override
-  ErrorSeverity get errorSeverity => ErrorSeverity.INFO;
-
-  @override
-  ErrorType get type => ErrorType.ANGULAR;
-}
-
-/**
  * Instances of the class `BooleanErrorListener` implement a listener that keeps track of
  * whether an error has been reported to it.
  */
@@ -2908,16 +2833,10 @@
       const ErrorType('SYNTACTIC_ERROR', 6, ErrorSeverity.ERROR);
 
   /**
-   * Angular specific semantic problems.
+   * Lint warnings describe style and best practice recommendations that can be used to formalize a project's style
+   * guidelines.
    */
-  static const ErrorType ANGULAR =
-      const ErrorType('ANGULAR', 7, ErrorSeverity.INFO);
-
-  /**
-   * Polymer specific semantic problems.
-   */
-  static const ErrorType POLYMER =
-      const ErrorType('POLYMER', 8, ErrorSeverity.INFO);
+  static const ErrorType LINT = const ErrorType('LINT', 7, ErrorSeverity.INFO);
 
   static const List<ErrorType> values = const [
       TODO,
@@ -2927,8 +2846,7 @@
       STATIC_WARNING,
       STATIC_TYPE_WARNING,
       SYNTACTIC_ERROR,
-      ANGULAR,
-      POLYMER];
+      LINT];
 
   /**
    * The severity of this type of error.
@@ -3318,51 +3236,21 @@
 }
 
 /**
- * The enumeration `PolymerCode` defines Polymer specific problems.
+ * Defines style and best practice recommendations.
+ *
+ * Unlike [HintCode]s, which are akin to traditional static warnings from a compiler, lint recommendations focus on
+ * matters of style and practices that might aggregated to define a project's style guide.
  */
-class PolymerCode extends ErrorCode {
-  static const PolymerCode ATTRIBUTE_FIELD_NOT_PUBLISHED = const PolymerCode(
-      'ATTRIBUTE_FIELD_NOT_PUBLISHED',
-      "Field '{0}' in '{1}' must be @published");
+class LintCode extends ErrorCode {
 
-  static const PolymerCode DUPLICATE_ATTRIBUTE_DEFINITION = const PolymerCode(
-      'DUPLICATE_ATTRIBUTE_DEFINITION',
-      "The attribute '{0}' is already defined");
-
-  static const PolymerCode EMPTY_ATTRIBUTES = const PolymerCode(
-      'EMPTY_ATTRIBUTES',
-      "Empty 'attributes' attribute is useless");
-
-  static const PolymerCode INVALID_ATTRIBUTE_NAME = const PolymerCode(
-      'INVALID_ATTRIBUTE_NAME',
-      "'{0}' is not a valid name for a custom element attribute");
-
-  static const PolymerCode INVALID_TAG_NAME = const PolymerCode(
-      'INVALID_TAG_NAME',
-      "'{0}' is not a valid name for a custom element");
-
-  static const PolymerCode MISSING_TAG_NAME = const PolymerCode(
-      'MISSING_TAG_NAME',
-      "Missing tag name of the custom element. Please include an attribute like name='your-tag-name'");
-
-  static const PolymerCode UNDEFINED_ATTRIBUTE_FIELD = const PolymerCode(
-      'UNDEFINED_ATTRIBUTE_FIELD',
-      "There is no such field '{0}' in '{1}'");
-
-  /**
-   * Initialize a newly created error code to have the given [name]. The message
-   * associated with the error will be created from the given [message]
-   * template. The correction associated with the error will be created from the
-   * given [correction] template.
-   */
-  const PolymerCode(String name, String message, [String correction])
+  const LintCode(String name, String message, [String correction])
       : super(name, message, correction);
 
   @override
   ErrorSeverity get errorSeverity => ErrorSeverity.INFO;
 
   @override
-  ErrorType get type => ErrorType.POLYMER;
+  ErrorType get type => ErrorType.LINT;
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/html.dart b/pkg/analyzer/lib/src/generated/html.dart
index 1e1b7b3..af8048c 100644
--- a/pkg/analyzer/lib/src/generated/html.dart
+++ b/pkg/analyzer/lib/src/generated/html.dart
@@ -11,8 +11,7 @@
 
 import 'ast.dart';
 import 'element.dart';
-import 'engine.dart' show AnalysisEngine, AngularHtmlUnitResolver,
-    ExpressionVisitor;
+import 'engine.dart' show AnalysisEngine;
 import 'error.dart' show AnalysisErrorListener;
 import 'java_core.dart';
 import 'java_engine.dart';
@@ -346,23 +345,6 @@
   }
 }
 
-class ExpressionVisitor_HtmlUnitUtils_getExpression extends ExpressionVisitor {
-  final int offset;
-
-  Expression result;
-
-  ExpressionVisitor_HtmlUnitUtils_getExpression(this.offset);
-
-  @override
-  void visitExpression(Expression expression) {
-    Expression at = HtmlUnitUtils._getExpressionAt(expression, offset);
-    if (at != null) {
-      result = at;
-      throw new HtmlUnitUtils_FoundExpressionError();
-    }
-  }
-}
-
 /**
  * Instances of the class `HtmlParser` are used to parse tokens into a AST structure comprised
  * of [XmlNode]s.
@@ -665,178 +647,6 @@
 }
 
 /**
- * Utilities locating [Expression]s and [Element]s in [HtmlUnit].
- */
-class HtmlUnitUtils {
-  /**
-   * Returns the [XmlAttributeNode] that is part of the given [HtmlUnit] and encloses
-   * the given offset.
-   */
-  static XmlAttributeNode getAttributeNode(HtmlUnit htmlUnit, int offset) {
-    if (htmlUnit == null) {
-      return null;
-    }
-    RecursiveXmlVisitor_HtmlUnitUtils_getAttributeNode visitor =
-        new RecursiveXmlVisitor_HtmlUnitUtils_getAttributeNode(offset);
-    try {
-      htmlUnit.accept(visitor);
-    } on HtmlUnitUtils_FoundAttributeNodeError catch (e) {
-      return visitor.result;
-    }
-    return null;
-  }
-
-  /**
-   * Returns the best [Element] of the given [Expression].
-   */
-  static Element getElement(Expression expression) {
-    if (expression == null) {
-      return null;
-    }
-    return ElementLocator.locate(expression);
-  }
-
-  /**
-   * Returns the [Element] of the [Expression] in the given [HtmlUnit], enclosing
-   * the given offset.
-   */
-  static Element getElementAtOffset(HtmlUnit htmlUnit, int offset) {
-    Expression expression = getExpression(htmlUnit, offset);
-    return getElement(expression);
-  }
-
-  /**
-   * Returns the [Element] to open when requested at the given [Expression].
-   */
-  static Element getElementToOpen(HtmlUnit htmlUnit, Expression expression) {
-    Element element = getElement(expression);
-    {
-      AngularElement angularElement =
-          AngularHtmlUnitResolver.getAngularElement(element);
-      if (angularElement != null) {
-        return angularElement;
-      }
-    }
-    return element;
-  }
-
-  /**
-   * Returns the [XmlTagNode] that is part of the given [HtmlUnit] and encloses the
-   * given offset.
-   */
-  static XmlTagNode getEnclosingTagNode(HtmlUnit htmlUnit, int offset) {
-    if (htmlUnit == null) {
-      return null;
-    }
-    RecursiveXmlVisitor_HtmlUnitUtils_getEnclosingTagNode visitor =
-        new RecursiveXmlVisitor_HtmlUnitUtils_getEnclosingTagNode(offset);
-    try {
-      htmlUnit.accept(visitor);
-    } on HtmlUnitUtils_FoundTagNodeError catch (e) {
-      return visitor.result;
-    }
-    return null;
-  }
-
-  /**
-   * Returns the [Expression] that is part of the given [HtmlUnit] and encloses the
-   * given offset.
-   */
-  static Expression getExpression(HtmlUnit htmlUnit, int offset) {
-    if (htmlUnit == null) {
-      return null;
-    }
-    ExpressionVisitor_HtmlUnitUtils_getExpression visitor =
-        new ExpressionVisitor_HtmlUnitUtils_getExpression(offset);
-    try {
-      // TODO(scheglov) this code is very Angular specific
-      htmlUnit.accept(visitor);
-    } on HtmlUnitUtils_FoundExpressionError catch (e) {
-      return visitor.result;
-    }
-    return null;
-  }
-
-  /**
-   * Returns the [XmlTagNode] that is part of the given [HtmlUnit] and its open or
-   * closing tag name encloses the given offset.
-   */
-  static XmlTagNode getTagNode(HtmlUnit htmlUnit, int offset) {
-    XmlTagNode node = getEnclosingTagNode(htmlUnit, offset);
-    // do we have an enclosing tag at all?
-    if (node == null) {
-      return null;
-    }
-    // is "offset" in the open tag?
-    Token openTag = node.tagToken;
-    if (openTag.offset <= offset && offset <= openTag.end) {
-      return node;
-    }
-    // is "offset" in the open tag?
-    Token closeTag = node.closingTag;
-    if (closeTag != null &&
-        closeTag.offset <= offset &&
-        offset <= closeTag.end) {
-      return node;
-    }
-    // not on a tag name
-    return null;
-  }
-
-  /**
-   * Returns the [Expression] that is part of the given root [AstNode] and encloses the
-   * given offset.
-   */
-  static Expression _getExpressionAt(AstNode root, int offset) {
-    if (root.offset <= offset && offset <= root.end) {
-      AstNode dartNode = new NodeLocator.con1(offset).searchWithin(root);
-      if (dartNode is Expression) {
-        return dartNode;
-      }
-    }
-    return null;
-  }
-}
-
-class HtmlUnitUtils_FoundAttributeNodeError extends Error {
-}
-
-class HtmlUnitUtils_FoundExpressionError extends Error {
-}
-
-class HtmlUnitUtils_FoundTagNodeError extends Error {
-}
-
-/**
- * Implementation of [XmlExpression] for an [Expression] embedded without any wrapping
- * characters.
- */
-class RawXmlExpression extends XmlExpression {
-  final Expression expression;
-
-  RawXmlExpression(this.expression);
-
-  @override
-  int get end => expression.end;
-
-  @override
-  int get length => expression.length;
-
-  @override
-  int get offset => expression.offset;
-
-  @override
-  XmlExpression_Reference getReference(int offset) {
-    AstNode node = new NodeLocator.con1(offset).searchWithin(expression);
-    if (node != null) {
-      Element element = ElementLocator.locate(node);
-      return new XmlExpression_Reference(element, node.offset, node.length);
-    }
-    return null;
-  }
-}
-
-/**
  * Instances of the class `RecursiveXmlVisitor` implement an XML visitor that will recursively
  * visit all of the nodes in an XML structure. For example, using an instance of this class to visit
  * a [XmlTagNode] will also cause all of the contained [XmlAttributeNode]s and
@@ -872,44 +682,6 @@
   }
 }
 
-class RecursiveXmlVisitor_HtmlUnitUtils_getAttributeNode extends
-    RecursiveXmlVisitor<Object> {
-  final int offset;
-
-  XmlAttributeNode result;
-
-  RecursiveXmlVisitor_HtmlUnitUtils_getAttributeNode(this.offset);
-
-  @override
-  Object visitXmlAttributeNode(XmlAttributeNode node) {
-    Token nameToken = node.nameToken;
-    if (nameToken.offset <= offset && offset <= nameToken.end) {
-      result = node;
-      throw new HtmlUnitUtils_FoundAttributeNodeError();
-    }
-    return super.visitXmlAttributeNode(node);
-  }
-}
-
-class RecursiveXmlVisitor_HtmlUnitUtils_getEnclosingTagNode extends
-    RecursiveXmlVisitor<Object> {
-  final int offset;
-
-  XmlTagNode result;
-
-  RecursiveXmlVisitor_HtmlUnitUtils_getEnclosingTagNode(this.offset);
-
-  @override
-  Object visitXmlTagNode(XmlTagNode node) {
-    if (node.offset <= offset && offset < node.end) {
-      result = node;
-      super.visitXmlTagNode(node);
-      throw new HtmlUnitUtils_FoundTagNodeError();
-    }
-    return null;
-  }
-}
-
 /**
  * Instances of the class `SimpleXmlVisitor` implement an AST visitor that will do nothing
  * when visiting an AST node. It is intended to be a superclass for classes that use the visitor
diff --git a/pkg/analyzer/lib/src/generated/incremental_resolution_validator.dart b/pkg/analyzer/lib/src/generated/incremental_resolution_validator.dart
index 55bc3a1..2f9e3a0 100644
--- a/pkg/analyzer/lib/src/generated/incremental_resolution_validator.dart
+++ b/pkg/analyzer/lib/src/generated/incremental_resolution_validator.dart
@@ -8,22 +8,33 @@
 import 'package:analyzer/src/generated/element.dart';
 
 
+/**
+ * Validates that the [actual] and the [expected] units have the same structure
+ * and resolution. Throws [IncrementalResolutionMismatch] otherwise.
+ */
 void assertSameResolution(CompilationUnit actual, CompilationUnit expected,
-    FailHandler failHandler) {
+    {bool validateTypes: false}) {
   _SameResolutionValidator validator =
-      new _SameResolutionValidator(failHandler, expected);
+      new _SameResolutionValidator(validateTypes, expected);
   actual.accept(validator);
 }
 
 
-typedef FailHandler(String reason);
+/**
+ * This exception is thrown when a mismatch between actual and expected AST
+ * or resolution is found.
+ */
+class IncrementalResolutionMismatch {
+  final String message;
+  IncrementalResolutionMismatch(this.message);
+}
 
 
 class _SameResolutionValidator implements AstVisitor {
-  final FailHandler failHandler;
+  final bool validateTypes;
   AstNode other;
 
-  _SameResolutionValidator(this.failHandler, this.other);
+  _SameResolutionValidator(this.validateTypes, this.other);
 
   @override
   visitAdjacentStrings(AdjacentStrings node) {
@@ -775,7 +786,7 @@
       String message = '';
       message += 'Expected: $expected\n';
       message += '  Actual: $actual\n';
-      failHandler(message);
+      _fail(message);
     }
   }
 
@@ -784,7 +795,7 @@
       String message = '';
       message += 'Expected: null\n';
       message += '  Actual: $obj\n';
-      failHandler(message);
+      _fail(message);
     }
   }
 
@@ -793,33 +804,46 @@
     message += 'Expected length: $expected\n';
     if (actualList == null) {
       message += 'but null found.';
-      failHandler(message);
+      _fail(message);
     }
     int actual = actualList.length;
     if (actual != expected) {
       message += 'but $actual found\n';
       message += 'in $actualList';
-      failHandler(message);
+      _fail(message);
     }
   }
 
+  void _fail(String message) {
+    throw new IncrementalResolutionMismatch(message);
+  }
+
   void _verifyElement(Element a, Element b) {
-    if (a != b) {
-      print(a.location);
-      print(b.location);
-      failHandler('Expected: $b\n  Actual: $a');
+    if (a is Member && b is Member) {
+      a = (a as Member).baseElement;
+      b = (b as Member).baseElement;
+    }
+    String locationA = _getElementLocationWithoutUri(a);
+    String locationB = _getElementLocationWithoutUri(b);
+    if (locationA != locationB) {
+      int offset = other.offset;
+      _fail('[$offset]\nExpected: $b ($locationB)\n  Actual: $a ($locationA)');
     }
     if (a == null && b == null) {
       return;
     }
     if (a.nameOffset != b.nameOffset) {
-      failHandler('Expected: ${b.nameOffset}\n  Actual: ${a.nameOffset}');
+      _fail('Expected: ${b.nameOffset}\n  Actual: ${a.nameOffset}');
     }
   }
 
   void _verifyType(DartType a, DartType b) {
+    if (!validateTypes) {
+      return;
+    }
     if (a != b) {
-      failHandler('Expected: $b\n  Actual: $a');
+      int offset = other.offset;
+      _fail('[$offset]\nExpected: $b\n  Actual: $a');
     }
   }
 
@@ -871,4 +895,50 @@
     _visitList(node.metadata, other.metadata);
     _visitNode(node.identifier, other.identifier);
   }
+
+  /**
+   * Returns an URI scheme independent version of the [element] location.
+   */
+  static String _getElementLocationWithoutUri(Element element) {
+    if (element == null) {
+      return '<null>';
+    }
+    if (element is UriReferencedElementImpl) {
+      return '<ignored>';
+    }
+    ElementLocation location = element.location;
+    List<String> components = location.components;
+    String uriPrefix = '';
+    Element unit = element is CompilationUnitElement ?
+        element :
+        element.getAncestor((e) => e is CompilationUnitElement);
+    if (unit != null) {
+      String libComponent = components[0];
+      String unitComponent = components[1];
+      components = components.sublist(2);
+      uriPrefix = _getShortElementLocationUri(libComponent) +
+          ':' +
+          _getShortElementLocationUri(unitComponent);
+    } else {
+      String libComponent = components[0];
+      components = components.sublist(1);
+      uriPrefix = _getShortElementLocationUri(libComponent);
+    }
+    return uriPrefix + ':' + components.join(':');
+  }
+
+  /**
+   * Returns a "short" version of the given [uri].
+   *
+   * For example:
+   *     /User/me/project/lib/my_lib.dart -> my_lib.dart
+   *     package:project/my_lib.dart      -> my_lib.dart
+   */
+  static String _getShortElementLocationUri(String uri) {
+    int index = uri.lastIndexOf('/');
+    if (index == -1) {
+      return uri;
+    }
+    return uri.substring(index + 1);
+  }
 }
diff --git a/pkg/analyzer/lib/src/generated/incremental_resolver.dart b/pkg/analyzer/lib/src/generated/incremental_resolver.dart
index 3b6709a..2088c51 100644
--- a/pkg/analyzer/lib/src/generated/incremental_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/incremental_resolver.dart
@@ -136,6 +136,7 @@
     ClassElement element = _findElement(_enclosingUnit.types, name);
     _enclosingClass = element;
     _processElement(element);
+    _assertSameAnnotations(node, element);
     _assertSameTypeParameters(node.typeParameters, element.typeParameters);
     // check for missing clauses
     if (node.extendsClause == null) {
@@ -264,6 +265,7 @@
     }
     // process element
     _processElement(element);
+    _assertSameAnnotations(node, element);
     _assertFalse(element.isSynthetic);
     _assertSameType(node.returnType, element.returnType);
     _assertCompatibleParameters(
@@ -338,6 +340,7 @@
     ExecutableElement newElement = node.element;
     try {
       _assertNotNull(element);
+      _assertSameAnnotations(node, element);
       _assertEquals(node.isStatic, element.isStatic);
       _assertSameType(node.returnType, element.returnType);
       _assertCompatibleParameters(node.parameters, element.parameters);
@@ -394,8 +397,8 @@
     }
     // verify
     PropertyInducingElement newElement = node.name.staticElement;
-    _assertNotNull(element);
     _processElement(element);
+    _assertSameAnnotations(node, element);
     _assertEquals(node.isConst, element.isConst);
     _assertEquals(node.isFinal, element.isFinal);
     if (_enclosingFieldNode != null) {
@@ -511,6 +514,33 @@
     }
   }
 
+  void _assertSameAnnotation(Annotation node, ElementAnnotation annotation) {
+    Element element = annotation.element;
+    if (element is ConstructorElement) {
+      _assertTrue(node.name is SimpleIdentifier);
+      _assertNull(node.constructorName);
+      TypeName nodeType = new TypeName(node.name, null);
+      _assertSameType(nodeType, element.returnType);
+      // TODO(scheglov) validate arguments
+    }
+    if (element is PropertyAccessorElement) {
+      _assertTrue(node.name is SimpleIdentifier);
+      String nodeName = node.name.name;
+      String elementName = element.displayName;
+      _assertEquals(nodeName, elementName);
+    }
+  }
+
+  void _assertSameAnnotations(AnnotatedNode node, Element element) {
+    List<Annotation> nodeAnnotaitons = node.metadata;
+    List<ElementAnnotation> elementAnnotations = element.metadata;
+    int length = nodeAnnotaitons.length;
+    _assertEquals(elementAnnotations.length, length);
+    for (int i = 0; i < length; i++) {
+      _assertSameAnnotation(nodeAnnotaitons[i], elementAnnotations[i]);
+    }
+  }
+
   void _assertSameType(TypeName node, DartType type) {
     // no return type == dynamic
     if (node == null) {
@@ -745,6 +775,11 @@
  */
 class IncrementalResolver {
   /**
+   * All resolved units of the [_definingLibrary].
+   */
+  final Map<Source, CompilationUnit> _units;
+
+  /**
    * The element of the compilation unit being resolved.
    */
   final CompilationUnitElement _definingUnit;
@@ -775,6 +810,11 @@
   Source _source;
 
   /**
+   * The source representing the library of the compilation unit being visited.
+   */
+  Source _librarySource;
+
+  /**
    * The offset of the changed contents.
    */
   final int _updateOffset;
@@ -796,7 +836,7 @@
 
   List<AnalysisError> _resolveErrors = AnalysisError.NO_ERRORS;
   List<AnalysisError> _verifyErrors = AnalysisError.NO_ERRORS;
-  List<AnalysisError> _hints = AnalysisError.NO_ERRORS;
+  List<AnalysisError> _lints = AnalysisError.NO_ERRORS;
 
   /**
    * The elements that should be resolved because of API changes.
@@ -807,10 +847,11 @@
    * Initialize a newly created incremental resolver to resolve a node in the
    * given source in the given library.
    */
-  IncrementalResolver(this._definingUnit, this._updateOffset,
+  IncrementalResolver(this._units, this._definingUnit, this._updateOffset,
       this._updateEndOld, this._updateEndNew) {
     _updateDelta = _updateEndNew - _updateEndOld;
     _definingLibrary = _definingUnit.library;
+    _librarySource = _definingLibrary.source;
     _source = _definingUnit.source;
     _context = _definingUnit.context;
     _typeProvider = _context.typeProvider;
@@ -840,6 +881,7 @@
       // verify
       _verify(rootNode);
       _generateHints(rootNode);
+      _generateLints(rootNode);
       // update entry errors
       _updateEntry();
       // resolve queue in response of API changes
@@ -956,17 +998,43 @@
     LoggingTimer timer = logger.startTimer();
     try {
       RecordingErrorListener errorListener = new RecordingErrorListener();
-      CompilationUnit unit = node.getAncestor((n) => n is CompilationUnit);
+      // prepare a list of the library units
+      List<CompilationUnit> units;
+      {
+        CompilationUnit unit = node.getAncestor((n) => n is CompilationUnit);
+        _units[_source] = unit;
+        units = _units.values.toList();
+      }
+      // run the generator
       AnalysisContext analysisContext = _definingLibrary.context;
       HintGenerator hintGenerator =
-          new HintGenerator(<CompilationUnit>[unit], analysisContext, errorListener);
+          new HintGenerator(units, analysisContext, errorListener);
       hintGenerator.generateForLibrary();
-      _hints = errorListener.getErrorsForSource(_source);
+      // remember hints
+      for (Source source in _units.keys) {
+        List<AnalysisError> hints = errorListener.getErrorsForSource(source);
+        DartEntry entry = _context.getReadableSourceEntryOrNull(source);
+        entry.setValueInLibrary(DartEntry.HINTS, _librarySource, hints);
+      }
     } finally {
       timer.stop('generate hints');
     }
   }
 
+  void _generateLints(AstNode node) {
+    LoggingTimer timer = logger.startTimer();
+    try {
+      RecordingErrorListener errorListener = new RecordingErrorListener();
+      CompilationUnit unit = node.getAncestor((n) => n is CompilationUnit);
+      LintGenerator lintGenerator =
+          new LintGenerator(<CompilationUnit>[unit], errorListener);
+      lintGenerator.generate();
+      _lints = errorListener.getErrorsForSource(_source);
+    } finally {
+      timer.stop('generate lints');
+    }
+  }
+
   /**
    * Return the element defined by [node], or `null` if the node does not
    * define an element.
@@ -1005,10 +1073,11 @@
         CompilationUnitElement unit =
             element.getAncestor((e) => e is CompilationUnitElement);
         IncrementalResolver resolver =
-            new IncrementalResolver(unit, node.offset, node.end, node.end);
+            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();
@@ -1071,12 +1140,12 @@
     _shiftErrors(DartEntry.RESOLUTION_ERRORS);
     _shiftErrors(DartEntry.VERIFICATION_ERRORS);
     _shiftErrors(DartEntry.HINTS);
+    _shiftErrors(DartEntry.LINTS);
   }
 
   void _shiftErrors(DataDescriptor<List<AnalysisError>> descriptor) {
-    Source librarySource = _definingLibrary.source;
     List<AnalysisError> errors =
-        entry.getValueInLibrary(descriptor, librarySource);
+        entry.getValueInLibrary(descriptor, _librarySource);
     for (AnalysisError error in errors) {
       int errorOffset = error.offset;
       if (errorOffset > _updateOffset) {
@@ -1096,26 +1165,25 @@
   }
 
   void _updateEntry() {
-    Source librarySource = _definingLibrary.source;
     {
       List<AnalysisError> oldErrors =
-          entry.getValueInLibrary(DartEntry.RESOLUTION_ERRORS, librarySource);
+          entry.getValueInLibrary(DartEntry.RESOLUTION_ERRORS, _librarySource);
       List<AnalysisError> errors = _updateErrors(oldErrors, _resolveErrors);
       entry.setValueInLibrary(
           DartEntry.RESOLUTION_ERRORS,
-          librarySource,
+          _librarySource,
           errors);
     }
     {
       List<AnalysisError> oldErrors =
-          entry.getValueInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource);
+          entry.getValueInLibrary(DartEntry.VERIFICATION_ERRORS, _librarySource);
       List<AnalysisError> errors = _updateErrors(oldErrors, _verifyErrors);
       entry.setValueInLibrary(
           DartEntry.VERIFICATION_ERRORS,
-          librarySource,
+          _librarySource,
           errors);
     }
-    entry.setValueInLibrary(DartEntry.HINTS, librarySource, _hints);
+    entry.setValueInLibrary(DartEntry.LINTS, _librarySource, _lints);
   }
 
   List<AnalysisError> _updateErrors(List<AnalysisError> oldErrors,
@@ -1167,6 +1235,7 @@
 
 class PoorMansIncrementalResolver {
   final TypeProvider _typeProvider;
+  final Map<Source, CompilationUnit> _units;
   final Source _unitSource;
   final DartEntry _entry;
   CompilationUnitElement _unitElement;
@@ -1179,8 +1248,8 @@
   List<AnalysisError> _newScanErrors = <AnalysisError>[];
   List<AnalysisError> _newParseErrors = <AnalysisError>[];
 
-  PoorMansIncrementalResolver(this._typeProvider, this._unitSource, this._entry,
-      bool resolveApiChanges) {
+  PoorMansIncrementalResolver(this._typeProvider, this._units, this._unitSource,
+      this._entry, bool resolveApiChanges) {
     _resolveApiChanges = resolveApiChanges;
   }
 
@@ -1189,9 +1258,10 @@
    * Returns `true` if success, or `false` otherwise.
    * The [oldUnit] might be damaged.
    */
-  bool resolve(CompilationUnit oldUnit, String newCode) {
+  bool resolve(String newCode) {
     logger.enter('diff/resolve $_unitSource');
     try {
+      CompilationUnit oldUnit = _units[_unitSource];
       _unitElement = oldUnit.element;
       CompilationUnit newUnit = _parseUnit(newCode);
       _TokenPair firstPair =
@@ -1226,6 +1296,7 @@
             _shiftTokens(firstPair.oldToken);
             {
               IncrementalResolver incrementalResolver = new IncrementalResolver(
+                  _units,
                   _unitElement,
                   _updateOffset,
                   _updateEndOld,
@@ -1298,6 +1369,7 @@
         }
         // perform incremental resolution
         IncrementalResolver incrementalResolver = new IncrementalResolver(
+            _units,
             _unitElement,
             _updateOffset,
             _updateEndOld,
@@ -1365,11 +1437,13 @@
     NodeReplacer.replace(oldComment, newComment);
     // update elements
     IncrementalResolver incrementalResolver = new IncrementalResolver(
+        _units,
         _unitElement,
         _updateOffset,
         _updateEndOld,
         _updateEndNew);
     incrementalResolver._updateElementNameOffsets();
+    incrementalResolver._shiftEntryErrors();
     _updateEntry();
     // resolve references in the comment
     incrementalResolver._resolveReferences(newComment);
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index a6ebecf..ed538c4 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -1112,12 +1112,6 @@
   }
 
   @override
-  AstNode visitFormalParameterList(FormalParameterList node) {
-    // We don't know which kind of parameter to parse.
-    throw new InsufficientContextException();
-  }
-
-  @override
   AstNode visitForStatement(ForStatement node) {
     if (identical(_oldNode, node.variables)) {
       throw new InsufficientContextException();
@@ -1134,6 +1128,12 @@
   }
 
   @override
+  AstNode visitFormalParameterList(FormalParameterList node) {
+    // We don't know which kind of parameter to parse.
+    throw new InsufficientContextException();
+  }
+
+  @override
   AstNode visitFunctionDeclaration(FunctionDeclaration node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -1482,19 +1482,19 @@
   }
 
   @override
-  AstNode visitPrefixedIdentifier(PrefixedIdentifier node) {
-    if (identical(_oldNode, node.prefix)) {
-      return _parser.parseSimpleIdentifier();
-    } else if (identical(_oldNode, node.identifier)) {
-      return _parser.parseSimpleIdentifier();
+  AstNode visitPrefixExpression(PrefixExpression node) {
+    if (identical(_oldNode, node.operand)) {
+      throw new InsufficientContextException();
     }
     return _notAChild(node);
   }
 
   @override
-  AstNode visitPrefixExpression(PrefixExpression node) {
-    if (identical(_oldNode, node.operand)) {
-      throw new InsufficientContextException();
+  AstNode visitPrefixedIdentifier(PrefixedIdentifier node) {
+    if (identical(_oldNode, node.prefix)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.identifier)) {
+      return _parser.parseSimpleIdentifier();
     }
     return _notAChild(node);
   }
@@ -1825,6 +1825,100 @@
 }
 
 /**
+ * Visitor capable of inferring the correct parser state for incremental
+ * parsing.  This visitor visits each parent/child relationship in the chain of
+ * ancestors of the node to be replaced (starting with the root of the parse
+ * tree), updating the parser to the correct state for parsing the child of the
+ * given parent.  Once it has visited all of these relationships, the parser
+ * will be in the correct state for reparsing the node to be replaced.
+ *
+ * TODO(paulberry): add support for other pieces of parser state (_inAsync,
+ * _inGenerator, _inLoop, and _inSwitch).  Note that _inLoop and _inSwitch only
+ * affect error message generation.
+ */
+class IncrementalParseStateBuilder extends SimpleAstVisitor {
+  /**
+   * The parser whose state should be built.
+   */
+  final Parser _parser;
+
+  /**
+   * The child node in the parent/child relationship currently being visited.
+   * (The corresponding parent is the node passed to the visit...() function.)
+   */
+  AstNode _childNode;
+
+  /**
+   * Create an IncrementalParseStateBuilder which will build the correct state
+   * for [_parser].
+   */
+  IncrementalParseStateBuilder(this._parser);
+
+  /**
+   * Build the correct parser state for parsing a replacement for [node].
+   */
+  void buildState(AstNode node) {
+    List<AstNode> ancestors = <AstNode>[];
+    while (node != null) {
+      ancestors.add(node);
+      node = node.parent;
+    }
+    _parser._inInitializer = false;
+    for (int i = ancestors.length - 2; i >= 0; i--) {
+      _childNode = ancestors[i];
+      ancestors[i + 1].accept(this);
+    }
+  }
+
+  @override
+  void visitArgumentList(ArgumentList node) {
+    _parser._inInitializer = false;
+  }
+
+  @override
+  void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    if (identical(_childNode, node.expression)) {
+      _parser._inInitializer = true;
+    }
+  }
+
+  @override
+  void visitIndexExpression(IndexExpression node) {
+    if (identical(_childNode, node.index)) {
+      _parser._inInitializer = false;
+    }
+  }
+
+  @override
+  void visitInterpolationExpression(InterpolationExpression node) {
+    if (identical(_childNode, node.expression)) {
+      _parser._inInitializer = false;
+    }
+  }
+
+  @override
+  void visitListLiteral(ListLiteral node) {
+    if (node.elements.contains(_childNode)) {
+      _parser._inInitializer = false;
+    }
+  }
+
+  @override
+  void visitMapLiteral(MapLiteral node) {
+    if (node.entries.contains(_childNode)) {
+      _parser._inInitializer = false;
+    }
+  }
+
+  @override
+  void visitParenthesizedExpression(ParenthesizedExpression node) {
+    if (identical(_childNode, node.expression)) {
+      _parser._inInitializer = false;
+    }
+  }
+}
+
+/**
  * Instances of the class `IncrementalParser` re-parse a single AST structure within a larger
  * AST structure.
  */
@@ -2002,100 +2096,6 @@
 }
 
 /**
- * Visitor capable of inferring the correct parser state for incremental
- * parsing.  This visitor visits each parent/child relationship in the chain of
- * ancestors of the node to be replaced (starting with the root of the parse
- * tree), updating the parser to the correct state for parsing the child of the
- * given parent.  Once it has visited all of these relationships, the parser
- * will be in the correct state for reparsing the node to be replaced.
- *
- * TODO(paulberry): add support for other pieces of parser state (_inAsync,
- * _inGenerator, _inLoop, and _inSwitch).  Note that _inLoop and _inSwitch only
- * affect error message generation.
- */
-class IncrementalParseStateBuilder extends SimpleAstVisitor {
-  /**
-   * The parser whose state should be built.
-   */
-  final Parser _parser;
-
-  /**
-   * The child node in the parent/child relationship currently being visited.
-   * (The corresponding parent is the node passed to the visit...() function.)
-   */
-  AstNode _childNode;
-
-  /**
-   * Create an IncrementalParseStateBuilder which will build the correct state
-   * for [_parser].
-   */
-  IncrementalParseStateBuilder(this._parser);
-
-  /**
-   * Build the correct parser state for parsing a replacement for [node].
-   */
-  void buildState(AstNode node) {
-    List<AstNode> ancestors = <AstNode>[];
-    while (node != null) {
-      ancestors.add(node);
-      node = node.parent;
-    }
-    _parser._inInitializer = false;
-    for (int i = ancestors.length - 2; i >= 0; i--) {
-      _childNode = ancestors[i];
-      ancestors[i + 1].accept(this);
-    }
-  }
-
-  @override
-  void visitArgumentList(ArgumentList node) {
-    _parser._inInitializer = false;
-  }
-
-  @override
-  void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
-    if (identical(_childNode, node.expression)) {
-      _parser._inInitializer = true;
-    }
-  }
-
-  @override
-  void visitIndexExpression(IndexExpression node) {
-    if (identical(_childNode, node.index)) {
-      _parser._inInitializer = false;
-    }
-  }
-
-  @override
-  void visitInterpolationExpression(InterpolationExpression node) {
-    if (identical(_childNode, node.expression)) {
-      _parser._inInitializer = false;
-    }
-  }
-
-  @override
-  void visitListLiteral(ListLiteral node) {
-    if (node.elements.contains(_childNode)) {
-      _parser._inInitializer = false;
-    }
-  }
-
-  @override
-  void visitMapLiteral(MapLiteral node) {
-    if (node.entries.contains(_childNode)) {
-      _parser._inInitializer = false;
-    }
-  }
-
-  @override
-  void visitParenthesizedExpression(ParenthesizedExpression node) {
-    if (identical(_childNode, node.expression)) {
-      _parser._inInitializer = false;
-    }
-  }
-}
-
-/**
  * Instances of the class `InsufficientContextException` represent a situation in which an AST
  * node cannot be re-parsed because there is not enough context to know how to re-parse the node.
  * Clients can attempt to re-parse the parent of the node.
@@ -2272,17 +2272,6 @@
   bool _parseFunctionBodies = true;
 
   /**
-   * A flag indicating whether the parser is to parse deferred libraries.
-   */
-  bool _parseDeferredLibraries =
-      AnalysisOptionsImpl.DEFAULT_ENABLE_DEFERRED_LOADING;
-
-  /**
-   * A flag indicating whether the parser is to parse enum declarations.
-   */
-  bool _parseEnum = AnalysisOptionsImpl.DEFAULT_ENABLE_ENUM;
-
-  /**
    * The next token to be parsed.
    */
   Token _currentToken;
@@ -2327,16 +2316,6 @@
   }
 
   /**
-   * Advance to the next token in the token stream, making it the new current
-   * token and return the token that was current before this method was invoked.
-   */
-  Token getAndAdvance() {
-    Token token = _currentToken;
-    _advance();
-    return token;
-  }
-
-  /**
    * Return `true` if the current token is the first token of a return type that is followed
    * by an identifier, possibly followed by a list of type parameters, followed by a
    * left-parenthesis. This is used by parseTypeAlias to determine whether or not to parse a return
@@ -2354,12 +2333,21 @@
   }
 
   /**
+   * Set whether the parser is to parse the async support.
+   *
+   * @param parseAsync `true` if the parser is to parse the async support
+   */
+  void set parseAsync(bool parseAsync) {
+    // Async support cannot be disabled
+  }
+
+  /**
    * Set whether the parser is to parse deferred libraries.
    *
    * @param parseDeferredLibraries `true` if the parser is to parse deferred libraries
    */
   void set parseDeferredLibraries(bool parseDeferredLibraries) {
-    this._parseDeferredLibraries = parseDeferredLibraries;
+    // Deferred libraries support cannot be disabled
   }
 
   /**
@@ -2368,7 +2356,7 @@
    * @param parseEnum `true` if the parser is to parse enum declarations
    */
   void set parseEnum(bool parseEnum) {
-    this._parseEnum = parseEnum;
+    // Enum support cannot be disabled
   }
 
   /**
@@ -2381,6 +2369,16 @@
   }
 
   /**
+   * Advance to the next token in the token stream, making it the new current
+   * token and return the token that was current before this method was invoked.
+   */
+  Token getAndAdvance() {
+    Token token = _currentToken;
+    _advance();
+    return token;
+  }
+
+  /**
    * Parse an annotation.
    *
    * <pre>
@@ -5528,7 +5526,7 @@
         !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
       _validateModifiersForTypedef(modifiers);
       return _parseTypeAlias(commentAndMetadata);
-    } else if (_parseEnum && _matchesKeyword(Keyword.ENUM)) {
+    } else if (_matchesKeyword(Keyword.ENUM)) {
       _validateModifiersForEnum(modifiers);
       return _parseEnumDeclaration(commentAndMetadata);
     }
@@ -5986,6 +5984,40 @@
   }
 
   /**
+   * Parse a do statement.
+   *
+   * <pre>
+   * doStatement ::=
+   *     'do' statement 'while' '(' expression ')' ';'
+   * </pre>
+   *
+   * @return the do statement that was parsed
+   */
+  Statement _parseDoStatement() {
+    bool wasInLoop = _inLoop;
+    _inLoop = true;
+    try {
+      Token doKeyword = _expectKeyword(Keyword.DO);
+      Statement body = parseStatement2();
+      Token whileKeyword = _expectKeyword(Keyword.WHILE);
+      Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
+      Expression condition = parseExpression2();
+      Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
+      Token semicolon = _expect(TokenType.SEMICOLON);
+      return new DoStatement(
+          doKeyword,
+          body,
+          whileKeyword,
+          leftParenthesis,
+          condition,
+          rightParenthesis,
+          semicolon);
+    } finally {
+      _inLoop = wasInLoop;
+    }
+  }
+
+  /**
    * Parse a documentation comment.
    *
    * <pre>
@@ -6027,40 +6059,6 @@
   }
 
   /**
-   * Parse a do statement.
-   *
-   * <pre>
-   * doStatement ::=
-   *     'do' statement 'while' '(' expression ')' ';'
-   * </pre>
-   *
-   * @return the do statement that was parsed
-   */
-  Statement _parseDoStatement() {
-    bool wasInLoop = _inLoop;
-    _inLoop = true;
-    try {
-      Token doKeyword = _expectKeyword(Keyword.DO);
-      Statement body = parseStatement2();
-      Token whileKeyword = _expectKeyword(Keyword.WHILE);
-      Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
-      Expression condition = parseExpression2();
-      Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
-      Token semicolon = _expect(TokenType.SEMICOLON);
-      return new DoStatement(
-          doKeyword,
-          body,
-          whileKeyword,
-          leftParenthesis,
-          condition,
-          rightParenthesis,
-          semicolon);
-    } finally {
-      _inLoop = wasInLoop;
-    }
-  }
-
-  /**
    * Parse an empty statement.
    *
    * <pre>
@@ -6252,64 +6250,6 @@
   }
 
   /**
-   * Parse a formal parameter. At most one of `isOptional` and `isNamed` can be
-   * `true`.
-   *
-   * <pre>
-   * defaultFormalParameter ::=
-   *     normalFormalParameter ('=' expression)?
-   *
-   * defaultNamedParameter ::=
-   *     normalFormalParameter (':' expression)?
-   * </pre>
-   *
-   * @param kind the kind of parameter being expected based on the presence or absence of group
-   *          delimiters
-   * @return the formal parameter that was parsed
-   */
-  FormalParameter _parseFormalParameter(ParameterKind kind) {
-    NormalFormalParameter parameter = parseNormalFormalParameter();
-    if (_matches(TokenType.EQ)) {
-      Token seperator = getAndAdvance();
-      Expression defaultValue = parseExpression2();
-      if (kind == ParameterKind.NAMED) {
-        _reportErrorForToken(
-            ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER,
-            seperator);
-      } else if (kind == ParameterKind.REQUIRED) {
-        _reportErrorForNode(
-            ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP,
-            parameter);
-      }
-      return new DefaultFormalParameter(
-          parameter,
-          kind,
-          seperator,
-          defaultValue);
-    } else if (_matches(TokenType.COLON)) {
-      Token seperator = getAndAdvance();
-      Expression defaultValue = parseExpression2();
-      if (kind == ParameterKind.POSITIONAL) {
-        _reportErrorForToken(
-            ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER,
-            seperator);
-      } else if (kind == ParameterKind.REQUIRED) {
-        _reportErrorForNode(
-            ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP,
-            parameter);
-      }
-      return new DefaultFormalParameter(
-          parameter,
-          kind,
-          seperator,
-          defaultValue);
-    } else if (kind != ParameterKind.REQUIRED) {
-      return new DefaultFormalParameter(parameter, kind, null, null);
-    }
-    return parameter;
-  }
-
-  /**
    * Parse a for statement.
    *
    * <pre>
@@ -6461,6 +6401,64 @@
   }
 
   /**
+   * Parse a formal parameter. At most one of `isOptional` and `isNamed` can be
+   * `true`.
+   *
+   * <pre>
+   * defaultFormalParameter ::=
+   *     normalFormalParameter ('=' expression)?
+   *
+   * defaultNamedParameter ::=
+   *     normalFormalParameter (':' expression)?
+   * </pre>
+   *
+   * @param kind the kind of parameter being expected based on the presence or absence of group
+   *          delimiters
+   * @return the formal parameter that was parsed
+   */
+  FormalParameter _parseFormalParameter(ParameterKind kind) {
+    NormalFormalParameter parameter = parseNormalFormalParameter();
+    if (_matches(TokenType.EQ)) {
+      Token seperator = getAndAdvance();
+      Expression defaultValue = parseExpression2();
+      if (kind == ParameterKind.NAMED) {
+        _reportErrorForToken(
+            ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER,
+            seperator);
+      } else if (kind == ParameterKind.REQUIRED) {
+        _reportErrorForNode(
+            ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP,
+            parameter);
+      }
+      return new DefaultFormalParameter(
+          parameter,
+          kind,
+          seperator,
+          defaultValue);
+    } else if (_matches(TokenType.COLON)) {
+      Token seperator = getAndAdvance();
+      Expression defaultValue = parseExpression2();
+      if (kind == ParameterKind.POSITIONAL) {
+        _reportErrorForToken(
+            ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER,
+            seperator);
+      } else if (kind == ParameterKind.REQUIRED) {
+        _reportErrorForNode(
+            ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP,
+            parameter);
+      }
+      return new DefaultFormalParameter(
+          parameter,
+          kind,
+          seperator,
+          defaultValue);
+    } else if (kind != ParameterKind.REQUIRED) {
+      return new DefaultFormalParameter(parameter, kind, null, null);
+    }
+    return parameter;
+  }
+
+  /**
    * Parse a function body.
    *
    * <pre>
@@ -6895,13 +6893,7 @@
     Token asToken = null;
     SimpleIdentifier prefix = null;
     if (_matchesKeyword(Keyword.DEFERRED)) {
-      if (_parseDeferredLibraries) {
-        deferredToken = getAndAdvance();
-      } else {
-        _reportErrorForCurrentToken(
-            ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED);
-        _advance();
-      }
+      deferredToken = getAndAdvance();
     }
     if (_matchesKeyword(Keyword.AS)) {
       asToken = getAndAdvance();
@@ -9984,27 +9976,6 @@
   }
 }
 /**
- * Instances of the class `SyntheticKeywordToken` implement a synthetic keyword token.
- */
-class Parser_SyntheticKeywordToken extends KeywordToken {
-  /**
-   * Initialize a newly created token to represent the given keyword.
-   *
-   * @param keyword the keyword being represented by this token
-   * @param offset the offset from the beginning of the file to the first character in the token
-   */
-  Parser_SyntheticKeywordToken(Keyword keyword, int offset)
-      : super(keyword, offset);
-
-  @override
-  int get length => 0;
-
-  @override
-  Token copy() => new Parser_SyntheticKeywordToken(keyword, offset);
-}
-
-
-/**
  * The enumeration `ParserErrorCode` defines the error codes used for errors
  * detected by the parser. The convention for this class is for the name of the
  * error code to indicate the problem that caused the error to be generated and
@@ -10116,11 +10087,6 @@
           'CONTINUE_WITHOUT_LABEL_IN_CASE',
           "A continue statement in a switch statement must have a label as a target");
 
-  static const ParserErrorCode DEFERRED_IMPORTS_NOT_SUPPORTED =
-      const ParserErrorCode(
-          'DEFERRED_IMPORTS_NOT_SUPPORTED',
-          "Deferred imports are not supported by default");
-
   static const ParserErrorCode DEPRECATED_CLASS_TYPE_ALIAS =
       const ParserErrorCode(
           'DEPRECATED_CLASS_TYPE_ALIAS',
@@ -10712,6 +10678,27 @@
 
 
 /**
+ * Instances of the class `SyntheticKeywordToken` implement a synthetic keyword token.
+ */
+class Parser_SyntheticKeywordToken extends KeywordToken {
+  /**
+   * Initialize a newly created token to represent the given keyword.
+   *
+   * @param keyword the keyword being represented by this token
+   * @param offset the offset from the beginning of the file to the first character in the token
+   */
+  Parser_SyntheticKeywordToken(Keyword keyword, int offset)
+      : super(keyword, offset);
+
+  @override
+  int get length => 0;
+
+  @override
+  Token copy() => new Parser_SyntheticKeywordToken(keyword, offset);
+}
+
+
+/**
  * Instances of the class `ResolutionCopier` copies resolution information from one AST
  * structure to another as long as the structures of the corresponding children of a pair of nodes
  * are the same.
@@ -11188,17 +11175,6 @@
   }
 
   @override
-  bool visitFormalParameterList(FormalParameterList node) {
-    FormalParameterList toNode = this._toNode as FormalParameterList;
-    return _and(
-        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
-        _isEqualNodeLists(node.parameters, toNode.parameters),
-        _isEqualTokens(node.leftDelimiter, toNode.leftDelimiter),
-        _isEqualTokens(node.rightDelimiter, toNode.rightDelimiter),
-        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis));
-  }
-
-  @override
   bool visitForStatement(ForStatement node) {
     ForStatement toNode = this._toNode as ForStatement;
     return _and(
@@ -11215,6 +11191,17 @@
   }
 
   @override
+  bool visitFormalParameterList(FormalParameterList node) {
+    FormalParameterList toNode = this._toNode as FormalParameterList;
+    return _and(
+        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodeLists(node.parameters, toNode.parameters),
+        _isEqualTokens(node.leftDelimiter, toNode.leftDelimiter),
+        _isEqualTokens(node.rightDelimiter, toNode.rightDelimiter),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis));
+  }
+
+  @override
   bool visitFunctionDeclaration(FunctionDeclaration node) {
     FunctionDeclaration toNode = this._toNode as FunctionDeclaration;
     return _and(
@@ -11628,20 +11615,6 @@
   }
 
   @override
-  bool visitPrefixedIdentifier(PrefixedIdentifier node) {
-    PrefixedIdentifier toNode = this._toNode as PrefixedIdentifier;
-    if (_and(
-        _isEqualNodes(node.prefix, toNode.prefix),
-        _isEqualTokens(node.period, toNode.period),
-        _isEqualNodes(node.identifier, toNode.identifier))) {
-      toNode.propagatedType = node.propagatedType;
-      toNode.staticType = node.staticType;
-      return true;
-    }
-    return false;
-  }
-
-  @override
   bool visitPrefixExpression(PrefixExpression node) {
     PrefixExpression toNode = this._toNode as PrefixExpression;
     if (_and(
@@ -11657,6 +11630,20 @@
   }
 
   @override
+  bool visitPrefixedIdentifier(PrefixedIdentifier node) {
+    PrefixedIdentifier toNode = this._toNode as PrefixedIdentifier;
+    if (_and(
+        _isEqualNodes(node.prefix, toNode.prefix),
+        _isEqualTokens(node.period, toNode.period),
+        _isEqualNodes(node.identifier, toNode.identifier))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
   bool visitPropertyAccess(PropertyAccess node) {
     PropertyAccess toNode = this._toNode as PropertyAccess;
     if (_and(
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 952323d..77daa8d 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -39,676 +39,6 @@
 typedef void VoidFunction();
 
 /**
- * Instances of the class `AngularCompilationUnitBuilder` build an Angular specific element
- * model for a single compilation unit.
- */
-class AngularCompilationUnitBuilder {
-  static String _NG_COMPONENT = "Component";
-
-  static String _NG_CONTROLLER = "Controller";
-
-  static String _NG_DECORATOR = "Decorator";
-
-  static String _NG_FORMATTER = "Formatter";
-
-  static String _NAME = "name";
-
-  static String _SELECTOR = "selector";
-
-  static String _PUBLISH_AS = "publishAs";
-
-  static String _TEMPLATE_URL = "templateUrl";
-
-  static String _CSS_URL = "cssUrl";
-
-  static String _NG_ATTR = "NgAttr";
-
-  static String _NG_CALLBACK = "NgCallback";
-
-  static String _NG_ONE_WAY = "NgOneWay";
-
-  static String _NG_ONE_WAY_ONE_TIME = "NgOneWayOneTime";
-
-  static String _NG_TWO_WAY = "NgTwoWay";
-
-  /**
-   * The listener to which errors will be reported.
-   */
-  final AnalysisErrorListener _errorListener;
-
-  /**
-   * The source containing the unit that will be analyzed.
-   */
-  final Source _source;
-
-  /**
-   * The compilation unit with built Dart element models.
-   */
-  final CompilationUnit _unit;
-
-  /**
-   * The [ClassDeclaration] that is currently being analyzed.
-   */
-  ClassDeclaration _classDeclaration;
-
-  /**
-   * The [ClassElementImpl] that is currently being analyzed.
-   */
-  ClassElementImpl _classElement;
-
-  /**
-   * The [Annotation] that is currently being analyzed.
-   */
-  Annotation _annotation;
-
-  /**
-   * Initialize a newly created compilation unit element builder.
-   *
-   * @param errorListener the listener to which errors will be reported.
-   * @param source the source containing the unit that will be analyzed
-   * @param unit the compilation unit with built Dart element models
-   */
-  AngularCompilationUnitBuilder(this._errorListener, this._source, this._unit);
-
-  /**
-   * Builds Angular specific element models and adds them to the existing Dart elements.
-   */
-  void build() {
-    _parseViews();
-    // process classes
-    for (CompilationUnitMember unitMember in _unit.declarations) {
-      if (unitMember is ClassDeclaration) {
-        this._classDeclaration = unitMember;
-        this._classElement = _classDeclaration.element as ClassElementImpl;
-        // process annotations
-        NodeList<Annotation> annotations = _classDeclaration.metadata;
-        for (Annotation annotation in annotations) {
-          // verify annotation
-          if (annotation.arguments == null) {
-            continue;
-          }
-          this._annotation = annotation;
-          // @Formatter
-          if (_isAngularAnnotation(annotation, _NG_FORMATTER)) {
-            _parseFormatter();
-            continue;
-          }
-          // @Component
-          if (_isAngularAnnotation(annotation, _NG_COMPONENT)) {
-            _parseComponent();
-            continue;
-          }
-          // @Controller
-          if (_isAngularAnnotation(annotation, _NG_CONTROLLER)) {
-            _parseController();
-            continue;
-          }
-          // @Decorator
-          if (_isAngularAnnotation(annotation, _NG_DECORATOR)) {
-            _parseDecorator();
-            continue;
-          }
-        }
-      }
-    }
-  }
-
-  /**
-   * @return the argument [Expression] with given name form [annotation], may be
-   *         `null` if not found.
-   */
-  Expression _getArgument(String name) {
-    List<Expression> arguments = _annotation.arguments.arguments;
-    for (Expression argument in arguments) {
-      if (argument is NamedExpression) {
-        NamedExpression namedExpression = argument;
-        String argumentName = namedExpression.name.label.name;
-        if (name == argumentName) {
-          return namedExpression.expression;
-        }
-      }
-    }
-    return null;
-  }
-
-  /**
-   * @return the [String] value of the named argument.
-   */
-  String _getStringArgument(String name) => _getStringLiteral(name).value;
-
-  /**
-   * @return the offset of the value of the named argument.
-   */
-  int _getStringArgumentOffset(String name) {
-    Expression argument = _getArgument(name);
-    return (argument as SimpleStringLiteral).contentsOffset;
-  }
-
-  /**
-   * @return the [SimpleStringLiteral] of the named argument.
-   */
-  SimpleStringLiteral _getStringLiteral(String name) {
-    Expression argument = _getArgument(name);
-    return argument as SimpleStringLiteral;
-  }
-
-  /**
-   * Checks if [namedArguments] has string value for the argument with the given name.
-   */
-  bool _hasStringArgument(String name) {
-    Expression argument = _getArgument(name);
-    return argument is SimpleStringLiteral;
-  }
-
-  /**
-   * Checks if given [Annotation] is an annotation with required name.
-   */
-  bool _isAngularAnnotation(Annotation annotation, String name) {
-    Element element = annotation.element;
-    if (element is ConstructorElement) {
-      ConstructorElement constructorElement = element;
-      if (constructorElement.returnType.displayName != name) {
-        return false;
-      }
-      return _isAngularLibraryElement(constructorElement);
-    }
-    return false;
-  }
-
-  /**
-   * Checks if the given [Element] is a part of the Angular library.
-   */
-  bool _isAngularLibraryElement(Element element) {
-    LibraryElement library = element.library;
-    return library != null &&
-        library.name != null &&
-        library.name.startsWith("angular");
-  }
-
-  void _parseComponent() {
-    bool isValid = true;
-    // publishAs
-    String name = null;
-    int nameOffset = -1;
-    if (_hasStringArgument(_PUBLISH_AS)) {
-      name = _getStringArgument(_PUBLISH_AS);
-      nameOffset = _getStringArgumentOffset(_PUBLISH_AS);
-    }
-    // selector
-    AngularSelectorElement selector = null;
-    if (!_hasStringArgument(_SELECTOR)) {
-      _reportErrorForAnnotation(AngularCode.MISSING_SELECTOR);
-      isValid = false;
-    } else {
-      SimpleStringLiteral selectorLiteral = _getStringLiteral(_SELECTOR);
-      selector = _parseSelectorFromString(selectorLiteral);
-      if (selector == null) {
-        _reportErrorForArgument(
-            _SELECTOR,
-            AngularCode.CANNOT_PARSE_SELECTOR,
-            [selectorLiteral]);
-        isValid = false;
-      }
-    }
-    // templateUrl
-    String templateUri = null;
-    int templateUriOffset = -1;
-    if (_hasStringArgument(_TEMPLATE_URL)) {
-      templateUri = _getStringArgument(_TEMPLATE_URL);
-      templateUriOffset = _getStringArgumentOffset(_TEMPLATE_URL);
-    }
-    // cssUrl
-    String styleUri = null;
-    int styleUriOffset = -1;
-    if (_hasStringArgument(_CSS_URL)) {
-      styleUri = _getStringArgument(_CSS_URL);
-      styleUriOffset = _getStringArgumentOffset(_CSS_URL);
-    }
-    // create
-    if (isValid) {
-      AngularComponentElementImpl element =
-          new AngularComponentElementImpl(name, nameOffset, _annotation.offset);
-      element.selector = selector;
-      element.templateUri = templateUri;
-      element.templateUriOffset = templateUriOffset;
-      element.styleUri = styleUri;
-      element.styleUriOffset = styleUriOffset;
-      element.properties = _parseComponentProperties();
-      element.scopeProperties = _parseScopeProperties();
-      _classElement.addToolkitObjects(element);
-    }
-  }
-
-  /**
-   * Parses [AngularPropertyElement]s from [annotation] and [classDeclaration].
-   */
-  List<AngularPropertyElement> _parseComponentProperties() {
-    List<AngularPropertyElement> properties = <AngularPropertyElement>[];
-    _parseComponentProperties_fromMap(properties);
-    _parseComponentProperties_fromFields(properties);
-    return properties;
-  }
-
-  /**
-   * Parses [AngularPropertyElement]s from [annotation].
-   */
-  void
-      _parseComponentProperties_fromFields(List<AngularPropertyElement> properties) {
-    NodeList<ClassMember> members = _classDeclaration.members;
-    for (ClassMember member in members) {
-      if (member is FieldDeclaration) {
-        FieldDeclaration fieldDeclaration = member;
-        for (Annotation annotation in fieldDeclaration.metadata) {
-          // prepare property kind (if property annotation at all)
-          AngularPropertyKind kind = null;
-          if (_isAngularAnnotation(annotation, _NG_ATTR)) {
-            kind = AngularPropertyKind.ATTR;
-          } else if (_isAngularAnnotation(annotation, _NG_CALLBACK)) {
-            kind = AngularPropertyKind.CALLBACK;
-          } else if (_isAngularAnnotation(annotation, _NG_ONE_WAY)) {
-            kind = AngularPropertyKind.ONE_WAY;
-          } else if (_isAngularAnnotation(annotation, _NG_ONE_WAY_ONE_TIME)) {
-            kind = AngularPropertyKind.ONE_WAY_ONE_TIME;
-          } else if (_isAngularAnnotation(annotation, _NG_TWO_WAY)) {
-            kind = AngularPropertyKind.TWO_WAY;
-          }
-          // add property
-          if (kind != null) {
-            SimpleStringLiteral nameLiteral =
-                _getOnlySimpleStringLiteralArgument(annotation);
-            FieldElement field = _getOnlyFieldElement(fieldDeclaration);
-            if (nameLiteral != null && field != null) {
-              AngularPropertyElementImpl property =
-                  new AngularPropertyElementImpl(nameLiteral.value, nameLiteral.contentsOffset);
-              property.field = field;
-              property.propertyKind = kind;
-              properties.add(property);
-            }
-          }
-        }
-      }
-    }
-  }
-
-  /**
-   * Parses [AngularPropertyElement]s from [annotation].
-   */
-  void
-      _parseComponentProperties_fromMap(List<AngularPropertyElement> properties) {
-    Expression mapExpression = _getArgument("map");
-    // may be not properties
-    if (mapExpression == null) {
-      return;
-    }
-    // prepare map literal
-    if (mapExpression is! MapLiteral) {
-      _reportErrorForNode(AngularCode.INVALID_PROPERTY_MAP, mapExpression);
-      return;
-    }
-    MapLiteral mapLiteral = mapExpression as MapLiteral;
-    // analyze map entries
-    for (MapLiteralEntry entry in mapLiteral.entries) {
-      // prepare property name
-      Expression nameExpression = entry.key;
-      if (nameExpression is! SimpleStringLiteral) {
-        _reportErrorForNode(AngularCode.INVALID_PROPERTY_NAME, nameExpression);
-        continue;
-      }
-      SimpleStringLiteral nameLiteral = nameExpression as SimpleStringLiteral;
-      String name = nameLiteral.value;
-      int nameOffset = nameLiteral.contentsOffset;
-      // prepare field specification
-      Expression specExpression = entry.value;
-      if (specExpression is! SimpleStringLiteral) {
-        _reportErrorForNode(AngularCode.INVALID_PROPERTY_SPEC, specExpression);
-        continue;
-      }
-      SimpleStringLiteral specLiteral = specExpression as SimpleStringLiteral;
-      String spec = specLiteral.value;
-      // parse binding kind and field name
-      AngularPropertyKind kind;
-      int fieldNameOffset;
-      if (StringUtilities.startsWithChar(spec, 0x40)) {
-        kind = AngularPropertyKind.ATTR;
-        fieldNameOffset = 1;
-      } else if (StringUtilities.startsWithChar(spec, 0x26)) {
-        kind = AngularPropertyKind.CALLBACK;
-        fieldNameOffset = 1;
-      } else if (StringUtilities.startsWith3(spec, 0, 0x3D, 0x3E, 0x21)) {
-        kind = AngularPropertyKind.ONE_WAY_ONE_TIME;
-        fieldNameOffset = 3;
-      } else if (StringUtilities.startsWith2(spec, 0, 0x3D, 0x3E)) {
-        kind = AngularPropertyKind.ONE_WAY;
-        fieldNameOffset = 2;
-      } else if (StringUtilities.startsWith3(spec, 0, 0x3C, 0x3D, 0x3E)) {
-        kind = AngularPropertyKind.TWO_WAY;
-        fieldNameOffset = 3;
-      } else {
-        _reportErrorForNode(
-            AngularCode.INVALID_PROPERTY_KIND,
-            specLiteral,
-            [spec]);
-        continue;
-      }
-      String fieldName = spec.substring(fieldNameOffset);
-      fieldNameOffset += specLiteral.contentsOffset;
-      // prepare field
-      PropertyAccessorElement setter =
-          _classElement.type.lookUpSetter(fieldName, _classElement.library);
-      if (setter == null) {
-        _reportErrorForOffset(
-            AngularCode.INVALID_PROPERTY_FIELD,
-            fieldNameOffset,
-            fieldName.length,
-            [fieldName]);
-        continue;
-      }
-      FieldElement field = setter.variable as FieldElement;
-      // add property
-      AngularPropertyElementImpl property =
-          new AngularPropertyElementImpl(name, nameOffset);
-      property.field = field;
-      property.propertyKind = kind;
-      property.fieldNameOffset = fieldNameOffset;
-      properties.add(property);
-    }
-  }
-
-  void _parseController() {
-    bool isValid = true;
-    // publishAs
-    if (!_hasStringArgument(_PUBLISH_AS)) {
-      _reportErrorForAnnotation(AngularCode.MISSING_PUBLISH_AS);
-      isValid = false;
-    }
-    // selector
-    AngularSelectorElement selector = null;
-    if (!_hasStringArgument(_SELECTOR)) {
-      _reportErrorForAnnotation(AngularCode.MISSING_SELECTOR);
-      isValid = false;
-    } else {
-      SimpleStringLiteral selectorLiteral = _getStringLiteral(_SELECTOR);
-      selector = _parseSelectorFromString(selectorLiteral);
-      if (selector == null) {
-        _reportErrorForArgument(
-            _SELECTOR,
-            AngularCode.CANNOT_PARSE_SELECTOR,
-            [selectorLiteral]);
-        isValid = false;
-      }
-    }
-    // create
-    if (isValid) {
-      String name = _getStringArgument(_PUBLISH_AS);
-      int nameOffset = _getStringArgumentOffset(_PUBLISH_AS);
-      AngularControllerElementImpl element =
-          new AngularControllerElementImpl(name, nameOffset);
-      element.selector = selector;
-      _classElement.addToolkitObjects(element);
-    }
-  }
-
-  void _parseDecorator() {
-    bool isValid = true;
-    // selector
-    AngularSelectorElement selector = null;
-    if (!_hasStringArgument(_SELECTOR)) {
-      _reportErrorForAnnotation(AngularCode.MISSING_SELECTOR);
-      isValid = false;
-    } else {
-      SimpleStringLiteral selectorLiteral = _getStringLiteral(_SELECTOR);
-      selector = _parseSelectorFromString(selectorLiteral);
-      if (selector == null) {
-        _reportErrorForArgument(
-            _SELECTOR,
-            AngularCode.CANNOT_PARSE_SELECTOR,
-            [selectorLiteral]);
-        isValid = false;
-      }
-    }
-    // create
-    if (isValid) {
-      int offset = _annotation.offset;
-      AngularDecoratorElementImpl element =
-          new AngularDecoratorElementImpl(offset);
-      element.selector = selector;
-      element.properties = _parseComponentProperties();
-      _classElement.addToolkitObjects(element);
-    }
-  }
-
-  void _parseFormatter() {
-    bool isValid = true;
-    // name
-    if (!_hasStringArgument(_NAME)) {
-      _reportErrorForAnnotation(AngularCode.MISSING_NAME);
-      isValid = false;
-    }
-    // create
-    if (isValid) {
-      String name = _getStringArgument(_NAME);
-      int nameOffset = _getStringArgumentOffset(_NAME);
-      _classElement.addToolkitObjects(
-          new AngularFormatterElementImpl(name, nameOffset));
-    }
-  }
-
-  List<AngularScopePropertyElement> _parseScopeProperties() {
-    List<AngularScopePropertyElement> properties =
-        <AngularScopePropertyElement>[
-        ];
-    _classDeclaration.accept(
-        new _AngularCompilationUnitBuilder_parseScopeProperties(properties));
-    return properties;
-  }
-
-  /**
-   * Create [AngularViewElement] for each valid <code>view('template.html')</code> invocation,
-   * where <code>view</code> is <code>ViewFactory</code>.
-   */
-  void _parseViews() {
-    List<AngularViewElement> views = <AngularViewElement>[];
-    _unit.accept(
-        new RecursiveAstVisitor_AngularCompilationUnitBuilder_parseViews(views));
-    if (!views.isEmpty) {
-      List<AngularViewElement> viewArray = views;
-      (_unit.element as CompilationUnitElementImpl).angularViews = viewArray;
-    }
-  }
-
-  void _reportErrorForAnnotation(ErrorCode errorCode,
-      [List<Object> arguments]) {
-    _reportErrorForNode(errorCode, _annotation, arguments);
-  }
-
-  void _reportErrorForArgument(String argumentName, ErrorCode errorCode,
-      [List<Object> arguments]) {
-    Expression argument = _getArgument(argumentName);
-    _reportErrorForNode(errorCode, argument, arguments);
-  }
-
-  void _reportErrorForNode(ErrorCode errorCode, AstNode node,
-      [List<Object> arguments]) {
-    int offset = node.offset;
-    int length = node.length;
-    _reportErrorForOffset(errorCode, offset, length, arguments);
-  }
-
-  void _reportErrorForOffset(ErrorCode errorCode, int offset, int length,
-      [List<Object> arguments]) {
-    _errorListener.onError(
-        new AnalysisError.con2(_source, offset, length, errorCode, arguments));
-  }
-
-  static Element getElement(AstNode node, int offset) {
-    // maybe node is not SimpleStringLiteral
-    if (node is! SimpleStringLiteral) {
-      return null;
-    }
-    SimpleStringLiteral literal = node as SimpleStringLiteral;
-    // maybe has AngularElement
-    {
-      Element element = literal.toolkitElement;
-      if (element is AngularElement) {
-        return element;
-      }
-    }
-    // prepare enclosing ClassDeclaration
-    ClassDeclaration classDeclaration =
-        node.getAncestor((node) => node is ClassDeclaration);
-    if (classDeclaration == null) {
-      return null;
-    }
-    // prepare ClassElement
-    ClassElement classElement = classDeclaration.element;
-    if (classElement == null) {
-      return null;
-    }
-    // check toolkit objects
-    for (ToolkitObjectElement toolkitObject in classElement.toolkitObjects) {
-      List<AngularPropertyElement> properties =
-          AngularPropertyElement.EMPTY_ARRAY;
-      // maybe name
-      if (toolkitObject is AngularElement) {
-        if (_isNameCoveredByLiteral(toolkitObject, node)) {
-          return toolkitObject;
-        }
-      }
-      // try selector
-      if (toolkitObject is AngularHasSelectorElement) {
-        AngularHasSelectorElement hasSelector = toolkitObject;
-        AngularSelectorElement selector = hasSelector.selector;
-        if (_isNameCoveredByLiteral(selector, node)) {
-          return selector;
-        }
-      }
-      // try properties of AngularComponentElement
-      if (toolkitObject is AngularComponentElement) {
-        AngularComponentElement component = toolkitObject;
-        properties = component.properties;
-      }
-      // try properties of AngularDirectiveElement
-      if (toolkitObject is AngularDecoratorElement) {
-        AngularDecoratorElement directive = toolkitObject;
-        properties = directive.properties;
-      }
-      // check properties
-      for (AngularPropertyElement property in properties) {
-        // property name (use complete node range)
-        if (_isNameCoveredByLiteral(property, node)) {
-          return property;
-        }
-        // field name (use complete node range, including @, => and <=>)
-        FieldElement field = property.field;
-        if (field != null) {
-          int fieldOffset = property.fieldNameOffset;
-          int fieldEnd = fieldOffset + field.name.length;
-          if (node.offset <= fieldOffset && fieldEnd < node.end) {
-            return field;
-          }
-        }
-      }
-    }
-    // no Element
-    return null;
-  }
-
-  /**
-   * Parses given selector text and returns [AngularSelectorElement]. May be `null` if
-   * cannot parse.
-   */
-  static AngularSelectorElement parseSelector(int offset, String text) {
-    // [attribute]
-    if (StringUtilities.startsWithChar(text, 0x5B) &&
-        StringUtilities.endsWithChar(text, 0x5D)) {
-      int nameOffset = offset + 1;
-      String attributeName = text.substring(1, text.length - 1);
-      // TODO(scheglov) report warning if there are spaces between
-      // [ and identifier
-      return new HasAttributeSelectorElementImpl(attributeName, nameOffset);
-    }
-    // .class
-    if (StringUtilities.startsWithChar(text, 0x2E)) {
-      int nameOffset = offset + 1;
-      String className = text.substring(1, text.length);
-      return new AngularHasClassSelectorElementImpl(className, nameOffset);
-    }
-    // tag[attribute]
-    if (StringUtilities.endsWithChar(text, 0x5D)) {
-      int index = StringUtilities.indexOf1(text, 0, 0x5B);
-      if (index != -1) {
-        String tagName = text.substring(0, index);
-        String attributeName = text.substring(index + 1, text.length - 1);
-        if (StringUtilities.isTagName(tagName)) {
-          return new IsTagHasAttributeSelectorElementImpl(
-              tagName,
-              attributeName);
-        }
-      }
-    }
-    // tag
-    if (StringUtilities.isTagName(text)) {
-      return new AngularTagSelectorElementImpl(text, offset);
-    }
-    return null;
-  }
-
-  /**
-   * Returns the [FieldElement] of the first field in the given [FieldDeclaration].
-   */
-  static FieldElement _getOnlyFieldElement(FieldDeclaration fieldDeclaration) {
-    NodeList<VariableDeclaration> fields = fieldDeclaration.fields.variables;
-    return fields[0].element as FieldElement;
-  }
-
-  /**
-   * If given [Annotation] has one argument and it is [SimpleStringLiteral], returns it,
-   * otherwise returns `null`.
-   */
-  static SimpleStringLiteral
-      _getOnlySimpleStringLiteralArgument(Annotation annotation) {
-    SimpleStringLiteral nameLiteral = null;
-    ArgumentList argsNode = annotation.arguments;
-    if (argsNode != null) {
-      NodeList<Expression> args = argsNode.arguments;
-      if (args.length == 1) {
-        Expression arg = args[0];
-        if (arg is SimpleStringLiteral) {
-          nameLiteral = arg;
-        }
-      }
-    }
-    return nameLiteral;
-  }
-
-  /**
-   * Checks if the name range of the given [Element] is completely covered by the given
-   * [SimpleStringLiteral].
-   */
-  static bool _isNameCoveredByLiteral(Element element, AstNode node) {
-    if (element != null) {
-      String name = element.name;
-      if (name != null) {
-        int nameOffset = element.nameOffset;
-        int nameEnd = nameOffset + name.length;
-        return node.offset <= nameOffset && nameEnd < node.end;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Parses given [SimpleStringLiteral] using [parseSelector].
-   */
-  static AngularSelectorElement
-      _parseSelectorFromString(SimpleStringLiteral literal) {
-    int offset = literal.contentsOffset;
-    String text = literal.stringValue;
-    return parseSelector(offset, text);
-  }
-}
-
-/**
  * Instances of the class `BestPracticesVerifier` traverse an AST structure looking for
  * violations of Dart best practices.
  */
@@ -1299,7 +629,8 @@
     // TODO(jwren) After dartbug.com/13732, revisit this, we should be able to
     // remove the (x is! TypeParameterType) checks.
     AstNode parent = node.parent;
-    if (parent is ConditionalExpression && (node == parent.thenExpression || node == parent.elseExpression)) {
+    if (parent is ConditionalExpression &&
+        (node == parent.thenExpression || node == parent.elseExpression)) {
       Expression thenExpression = parent.thenExpression;
       DartType thenType;
       if (thenExpression is AsExpression) {
@@ -5138,6 +4469,55 @@
   }
 }
 
+
+/// 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.
@@ -7913,13 +7293,13 @@
   }
 
   /**
-   * Build the library element for the given library.
+   * Build the library element for the given library.  The resulting element is
+   * stored in the [ResolvableLibrary] structure.
    *
    * @param library the library for which an element model is to be built
-   * @return the library element that was built
    * @throws AnalysisException if the analysis could not be performed
    */
-  LibraryElementImpl buildLibrary2(ResolvableLibrary library) {
+  void buildLibrary2(ResolvableLibrary library) {
     CompilationUnitBuilder builder = new CompilationUnitBuilder();
     Source librarySource = library.librarySource;
     CompilationUnit definingCompilationUnit = library.definingCompilationUnit;
@@ -8021,7 +7401,6 @@
     if (sourcedUnitCount > 0) {
       _patchTopLevelAccessors(libraryElement);
     }
-    return libraryElement;
   }
 
   /**
@@ -9180,26 +8559,6 @@
     } finally {
       timeCounter.stop();
     }
-    // Angular
-    timeCounter = PerformanceStatistics.angular.start();
-    try {
-      for (Source source in library.compilationUnitSources) {
-        CompilationUnit ast = library.getAST(source);
-        new AngularCompilationUnitBuilder(_errorListener, source, ast).build();
-      }
-    } finally {
-      timeCounter.stop();
-    }
-    // Polymer
-    timeCounter = PerformanceStatistics.polymer.start();
-    try {
-      for (Source source in library.compilationUnitSources) {
-        CompilationUnit ast = library.getAST(source);
-        new PolymerCompilationUnitBuilder(ast).build();
-      }
-    } finally {
-      timeCounter.stop();
-    }
   }
 
   /**
@@ -9528,8 +8887,7 @@
     for (ResolvableLibrary library in _librariesInCycle) {
       LibraryElementBuilder builder =
           new LibraryElementBuilder(analysisContext, errorListener);
-      LibraryElementImpl libraryElement = builder.buildLibrary2(library);
-      library.libraryElement = libraryElement;
+      builder.buildLibrary2(library);
     }
   }
 
@@ -9753,28 +9111,6 @@
     } finally {
       timeCounter.stop();
     }
-    // Angular
-    timeCounter = PerformanceStatistics.angular.start();
-    try {
-      for (ResolvableCompilationUnit unit in library.resolvableCompilationUnits)
-          {
-        Source source = unit.source;
-        CompilationUnit ast = unit.compilationUnit;
-        new AngularCompilationUnitBuilder(_errorListener, source, ast).build();
-      }
-    } finally {
-      timeCounter.stop();
-    }
-    // Polymer
-    timeCounter = PerformanceStatistics.polymer.start();
-    try {
-      for (Source source in library.compilationUnitSources) {
-        CompilationUnit ast = library.getAST(source);
-        new PolymerCompilationUnitBuilder(ast).build();
-      }
-    } finally {
-      timeCounter.stop();
-    }
   }
 
   /**
@@ -10453,113 +9789,6 @@
 }
 
 /**
- * Instances of the class `PolymerCompilationUnitBuilder` build a Polymer specific element
- * model for a single compilation unit.
- */
-class PolymerCompilationUnitBuilder {
-  static String _CUSTOM_TAG = "CustomTag";
-
-  /**
-   * The compilation unit with built Dart element models.
-   */
-  final CompilationUnit _unit;
-
-  /**
-   * The [ClassDeclaration] that is currently being analyzed.
-   */
-  ClassDeclaration _classDeclaration;
-
-  /**
-   * The [ClassElementImpl] that is currently being analyzed.
-   */
-  ClassElementImpl _classElement;
-
-  /**
-   * The [Annotation] that is currently being analyzed.
-   */
-  Annotation _annotation;
-
-  /**
-   * Initialize a newly created compilation unit element builder.
-   *
-   * @param unit the compilation unit with built Dart element models
-   */
-  PolymerCompilationUnitBuilder(this._unit);
-
-  /**
-   * Builds Polymer specific element models and adds them to the existing Dart elements.
-   */
-  void build() {
-    // process classes
-    for (CompilationUnitMember unitMember in _unit.declarations) {
-      if (unitMember is ClassDeclaration) {
-        this._classDeclaration = unitMember;
-        this._classElement = _classDeclaration.element as ClassElementImpl;
-        // process annotations
-        NodeList<Annotation> annotations = _classDeclaration.metadata;
-        for (Annotation annotation in annotations) {
-          // verify annotation
-          if (annotation.arguments == null) {
-            continue;
-          }
-          this._annotation = annotation;
-          // @CustomTag
-          if (_isAnnotation(annotation, _CUSTOM_TAG)) {
-            _parseCustomTag();
-            continue;
-          }
-        }
-      }
-    }
-  }
-
-  /**
-   * Checks if given [Annotation] is an annotation with required name.
-   */
-  bool _isAnnotation(Annotation annotation, String name) {
-    Element element = annotation.element;
-    if (element is ConstructorElement) {
-      ConstructorElement constructorElement = element;
-      return constructorElement.returnType.displayName == name;
-    }
-    return false;
-  }
-
-  void _parseCustomTag() {
-    List<Expression> arguments = _annotation.arguments.arguments;
-    if (arguments.length == 1) {
-      Expression nameExpression = arguments[0];
-      if (nameExpression is SimpleStringLiteral) {
-        SimpleStringLiteral nameLiteral = nameExpression;
-        String name = nameLiteral.value;
-        int nameOffset = nameLiteral.contentsOffset;
-        PolymerTagDartElementImpl element =
-            new PolymerTagDartElementImpl(name, nameOffset, _classElement);
-        _classElement.addToolkitObjects(element);
-        nameLiteral.toolkitElement = element;
-      }
-    }
-  }
-
-  static Element getElement(AstNode node, int offset) {
-    // maybe node is not SimpleStringLiteral
-    if (node is! SimpleStringLiteral) {
-      return null;
-    }
-    SimpleStringLiteral literal = node as SimpleStringLiteral;
-    // maybe has PolymerElement
-    {
-      Element element = literal.toolkitElement;
-      if (element is PolymerElement) {
-        return element;
-      }
-    }
-    // no Element
-    return null;
-  }
-}
-
-/**
  * Instances of the class `PubVerifier` traverse an AST structure looking for deviations from
  * pub best practices.
  */
@@ -10753,62 +9982,6 @@
 //  }
 }
 
-class RecursiveAstVisitor_AngularCompilationUnitBuilder_parseViews extends
-    RecursiveAstVisitor<Object> {
-  List<AngularViewElement> views;
-
-  RecursiveAstVisitor_AngularCompilationUnitBuilder_parseViews(this.views)
-      : super();
-
-  @override
-  Object visitMethodInvocation(MethodInvocation node) {
-    _addView(node);
-    return super.visitMethodInvocation(node);
-  }
-
-  void _addView(MethodInvocation node) {
-    // only one argument
-    List<Expression> arguments = node.argumentList.arguments;
-    if (arguments.length != 1) {
-      return;
-    }
-    // String literal
-    Expression argument = arguments[0];
-    if (argument is! SimpleStringLiteral) {
-      return;
-    }
-    SimpleStringLiteral literal = argument as SimpleStringLiteral;
-    // just view('template')
-    if (node.realTarget != null) {
-      return;
-    }
-    // should be ViewFactory
-    if (!_isViewFactory(node.methodName)) {
-      return;
-    }
-    // add AngularViewElement
-    String templateUri = literal.stringValue;
-    int templateUriOffset = literal.contentsOffset;
-    views.add(new AngularViewElementImpl(templateUri, templateUriOffset));
-  }
-
-  bool _isViewFactory(Expression target) {
-    if (target is SimpleIdentifier) {
-      SimpleIdentifier identifier = target;
-      Element element = identifier.staticElement;
-      if (element is VariableElement) {
-        VariableElement variable = element;
-        DartType type = variable.type;
-        if (type is InterfaceType) {
-          InterfaceType interfaceType = type;
-          return interfaceType.name == "ViewFactory";
-        }
-      }
-    }
-    return false;
-  }
-}
-
 /**
  * Kind of the redirecting constructor.
  */
@@ -15838,83 +15011,6 @@
   }
 }
 
-class _AngularCompilationUnitBuilder_parseScopeProperties extends
-    RecursiveAstVisitor<Object> {
-  List<AngularScopePropertyElement> properties;
-
-  _AngularCompilationUnitBuilder_parseScopeProperties(this.properties)
-      : super();
-
-  @override
-  Object visitAssignmentExpression(AssignmentExpression node) {
-    _addProperty(node);
-    return super.visitAssignmentExpression(node);
-  }
-
-  void _addProperty(AssignmentExpression node) {
-    // try to find "name" in scope[name]
-    SimpleStringLiteral nameNode = _getNameNode(node.leftHandSide);
-    if (nameNode == null) {
-      return;
-    }
-    // prepare unique
-    String name = nameNode.stringValue;
-    if (_hasPropertyWithName(name)) {
-      return;
-    }
-    // do add property
-    int nameOffset = nameNode.contentsOffset;
-    AngularScopePropertyElement property = new AngularScopePropertyElementImpl(
-        name,
-        nameOffset,
-        node.rightHandSide.bestType);
-    nameNode.toolkitElement = property;
-    properties.add(property);
-  }
-
-  SimpleStringLiteral _getNameNode(Expression node) {
-    if (node is IndexExpression) {
-      IndexExpression indexExpression = node;
-      Expression target = indexExpression.target;
-      Expression index = indexExpression.index;
-      if (index is SimpleStringLiteral && _isContext(target)) {
-        return index;
-      }
-    }
-    return null;
-  }
-
-  bool _hasPropertyWithName(String name) {
-    for (AngularScopePropertyElement property in properties) {
-      if (property.name == name) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  bool _isContext(Expression target) {
-    if (target is PrefixedIdentifier) {
-      PrefixedIdentifier prefixed = target;
-      SimpleIdentifier prefix = prefixed.prefix;
-      SimpleIdentifier identifier = prefixed.identifier;
-      return (identifier.name == "context") && _isScope(prefix);
-    }
-    return false;
-  }
-
-  bool _isScope(Expression target) {
-    if (target != null) {
-      DartType type = target.bestType;
-      if (type is InterfaceType) {
-        InterfaceType interfaceType = type;
-        return interfaceType.name == "Scope";
-      }
-    }
-    return false;
-  }
-}
-
 class _ConstantVerifier_validateInitializerExpression extends ConstantVisitor {
   final ConstantVerifier verifier;
 
diff --git a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
new file mode 100644
index 0000000..a176816
--- /dev/null
+++ b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
@@ -0,0 +1,482 @@
+// 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 code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library engine.testing.test_type_provider;
+
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/testing/element_factory.dart';
+
+/**
+ * Instances of the class `TestTypeProvider` implement a type provider that can be used by
+ * tests without creating the element model for the core library.
+ */
+class TestTypeProvider implements TypeProvider {
+  /**
+   * The type representing the built-in type 'bool'.
+   */
+  InterfaceType _boolType;
+
+  /**
+   * The type representing the type 'bottom'.
+   */
+  DartType _bottomType;
+
+  /**
+   * The type representing the built-in type 'double'.
+   */
+  InterfaceType _doubleType;
+
+  /**
+   * The type representing the built-in type 'deprecated'.
+   */
+  InterfaceType _deprecatedType;
+
+  /**
+   * The type representing the built-in type 'dynamic'.
+   */
+  DartType _dynamicType;
+
+  /**
+   * The type representing the built-in type 'Function'.
+   */
+  InterfaceType _functionType;
+
+  /**
+   * The type representing the built-in type 'int'.
+   */
+  InterfaceType _intType;
+
+  /**
+   * The type representing the built-in type 'Iterable'.
+   */
+  InterfaceType _iterableType;
+
+  /**
+   * The type representing the built-in type 'Iterator'.
+   */
+  InterfaceType _iteratorType;
+
+  /**
+   * The type representing the built-in type 'List'.
+   */
+  InterfaceType _listType;
+
+  /**
+   * The type representing the built-in type 'Map'.
+   */
+  InterfaceType _mapType;
+
+  /**
+   * The type representing the built-in type 'Null'.
+   */
+  InterfaceType _nullType;
+
+  /**
+   * The type representing the built-in type 'num'.
+   */
+  InterfaceType _numType;
+
+  /**
+   * The type representing the built-in type 'Object'.
+   */
+  InterfaceType _objectType;
+
+  /**
+   * The type representing the built-in type 'StackTrace'.
+   */
+  InterfaceType _stackTraceType;
+
+  /**
+   * The type representing the built-in type 'String'.
+   */
+  InterfaceType _stringType;
+
+  /**
+   * The type representing the built-in type 'Symbol'.
+   */
+  InterfaceType _symbolType;
+
+  /**
+   * The type representing the built-in type 'Type'.
+   */
+  InterfaceType _typeType;
+
+  /**
+   * The type representing typenames that can't be resolved.
+   */
+  DartType _undefinedType;
+
+  @override
+  InterfaceType get boolType {
+    if (_boolType == null) {
+      ClassElementImpl boolElement = ElementFactory.classElement2("bool");
+      _boolType = boolElement.type;
+      ConstructorElementImpl fromEnvironment =
+          ElementFactory.constructorElement(boolElement, "fromEnvironment", true);
+      fromEnvironment.parameters = <ParameterElement>[
+          ElementFactory.requiredParameter2("name", stringType),
+          ElementFactory.namedParameter2("defaultValue", _boolType)];
+      fromEnvironment.factory = true;
+      boolElement.constructors = <ConstructorElement>[fromEnvironment];
+    }
+    return _boolType;
+  }
+
+  @override
+  DartType get bottomType {
+    if (_bottomType == null) {
+      _bottomType = BottomTypeImpl.instance;
+    }
+    return _bottomType;
+  }
+
+  @override
+  InterfaceType get deprecatedType {
+    if (_deprecatedType == null) {
+      ClassElementImpl deprecatedElement =
+          ElementFactory.classElement2("Deprecated");
+      deprecatedElement.constructors = <ConstructorElement>[
+          ElementFactory.constructorElement(deprecatedElement, null, true, [stringType])];
+      _deprecatedType = deprecatedElement.type;
+    }
+    return _deprecatedType;
+  }
+
+  @override
+  InterfaceType get doubleType {
+    if (_doubleType == null) {
+      _initializeNumericTypes();
+    }
+    return _doubleType;
+  }
+
+  @override
+  DartType get dynamicType {
+    if (_dynamicType == null) {
+      _dynamicType = DynamicTypeImpl.instance;
+    }
+    return _dynamicType;
+  }
+
+  @override
+  InterfaceType get functionType {
+    if (_functionType == null) {
+      _functionType = ElementFactory.classElement2("Function").type;
+    }
+    return _functionType;
+  }
+
+  @override
+  InterfaceType get intType {
+    if (_intType == null) {
+      _initializeNumericTypes();
+    }
+    return _intType;
+  }
+
+  InterfaceType get iterableType {
+    if (_iterableType == null) {
+      ClassElementImpl iterableElement =
+          ElementFactory.classElement2("Iterable", ["E"]);
+      _iterableType = iterableElement.type;
+      DartType eType = iterableElement.typeParameters[0].type;
+      iterableElement.accessors = <PropertyAccessorElement>[
+          ElementFactory.getterElement(
+              "iterator",
+              false,
+              iteratorType.substitute4(<DartType>[eType])),
+          ElementFactory.getterElement("last", false, eType)];
+      _propagateTypeArguments(iterableElement);
+    }
+    return _iterableType;
+  }
+
+  InterfaceType get iteratorType {
+    if (_iteratorType == null) {
+      ClassElementImpl iteratorElement =
+          ElementFactory.classElement2("Iterator", ["E"]);
+      _iteratorType = iteratorElement.type;
+      DartType eType = iteratorElement.typeParameters[0].type;
+      iteratorElement.accessors = <PropertyAccessorElement>[
+          ElementFactory.getterElement("current", false, eType)];
+      _propagateTypeArguments(iteratorElement);
+    }
+    return _iteratorType;
+  }
+
+  @override
+  InterfaceType get listType {
+    if (_listType == null) {
+      ClassElementImpl listElement =
+          ElementFactory.classElement2("List", ["E"]);
+      listElement.constructors =
+          <ConstructorElement>[ElementFactory.constructorElement2(listElement, null)];
+      _listType = listElement.type;
+      DartType eType = listElement.typeParameters[0].type;
+      InterfaceType iterableType =
+          this.iterableType.substitute4(<DartType>[eType]);
+      listElement.interfaces = <InterfaceType>[iterableType];
+      listElement.accessors = <PropertyAccessorElement>[
+          ElementFactory.getterElement("length", false, intType)];
+      listElement.methods = <MethodElement>[
+          ElementFactory.methodElement("[]", eType, [intType]),
+          ElementFactory.methodElement("[]=", VoidTypeImpl.instance, [intType, eType]),
+          ElementFactory.methodElement("add", VoidTypeImpl.instance, [eType])];
+      _propagateTypeArguments(listElement);
+    }
+    return _listType;
+  }
+
+  @override
+  InterfaceType get mapType {
+    if (_mapType == null) {
+      ClassElementImpl mapElement =
+          ElementFactory.classElement2("Map", ["K", "V"]);
+      _mapType = mapElement.type;
+      DartType kType = mapElement.typeParameters[0].type;
+      DartType vType = mapElement.typeParameters[1].type;
+      mapElement.accessors = <PropertyAccessorElement>[
+          ElementFactory.getterElement("length", false, intType)];
+      mapElement.methods = <MethodElement>[
+          ElementFactory.methodElement("[]", vType, [objectType]),
+          ElementFactory.methodElement("[]=", VoidTypeImpl.instance, [kType, vType])];
+      _propagateTypeArguments(mapElement);
+    }
+    return _mapType;
+  }
+
+  @override
+  InterfaceType get nullType {
+    if (_nullType == null) {
+      _nullType = ElementFactory.classElement2("Null").type;
+    }
+    return _nullType;
+  }
+
+  @override
+  InterfaceType get numType {
+    if (_numType == null) {
+      _initializeNumericTypes();
+    }
+    return _numType;
+  }
+
+  @override
+  InterfaceType get objectType {
+    if (_objectType == null) {
+      ClassElementImpl objectElement = ElementFactory.object;
+      _objectType = objectElement.type;
+      objectElement.constructors =
+          <ConstructorElement>[ElementFactory.constructorElement2(objectElement, null)];
+      objectElement.methods = <MethodElement>[
+          ElementFactory.methodElement("toString", stringType),
+          ElementFactory.methodElement("==", boolType, [_objectType]),
+          ElementFactory.methodElement("noSuchMethod", dynamicType, [dynamicType])];
+      objectElement.accessors = <PropertyAccessorElement>[
+          ElementFactory.getterElement("hashCode", false, intType),
+          ElementFactory.getterElement("runtimeType", false, typeType)];
+    }
+    return _objectType;
+  }
+
+  @override
+  InterfaceType get stackTraceType {
+    if (_stackTraceType == null) {
+      _stackTraceType = ElementFactory.classElement2("StackTrace").type;
+    }
+    return _stackTraceType;
+  }
+
+  @override
+  InterfaceType get stringType {
+    if (_stringType == null) {
+      _stringType = ElementFactory.classElement2("String").type;
+      ClassElementImpl stringElement = _stringType.element as ClassElementImpl;
+      stringElement.accessors = <PropertyAccessorElement>[
+          ElementFactory.getterElement("isEmpty", false, boolType),
+          ElementFactory.getterElement("length", false, intType),
+          ElementFactory.getterElement(
+              "codeUnits",
+              false,
+              listType.substitute4(<DartType>[intType]))];
+      stringElement.methods = <MethodElement>[
+          ElementFactory.methodElement("+", _stringType, [_stringType]),
+          ElementFactory.methodElement("toLowerCase", _stringType),
+          ElementFactory.methodElement("toUpperCase", _stringType)];
+      ConstructorElementImpl fromEnvironment =
+          ElementFactory.constructorElement(stringElement, "fromEnvironment", true);
+      fromEnvironment.parameters = <ParameterElement>[
+          ElementFactory.requiredParameter2("name", stringType),
+          ElementFactory.namedParameter2("defaultValue", _stringType)];
+      fromEnvironment.factory = true;
+      stringElement.constructors = <ConstructorElement>[fromEnvironment];
+    }
+    return _stringType;
+  }
+
+  @override
+  InterfaceType get symbolType {
+    if (_symbolType == null) {
+      ClassElementImpl symbolClass = ElementFactory.classElement2("Symbol");
+      ConstructorElementImpl constructor =
+          ElementFactory.constructorElement(symbolClass, null, true, [stringType]);
+      constructor.factory = true;
+      symbolClass.constructors = <ConstructorElement>[constructor];
+      _symbolType = symbolClass.type;
+    }
+    return _symbolType;
+  }
+
+  @override
+  InterfaceType get typeType {
+    if (_typeType == null) {
+      _typeType = ElementFactory.classElement2("Type").type;
+    }
+    return _typeType;
+  }
+
+  @override
+  DartType get undefinedType {
+    if (_undefinedType == null) {
+      _undefinedType = UndefinedTypeImpl.instance;
+    }
+    return _undefinedType;
+  }
+
+  /**
+   * Initialize the numeric types. They are created as a group so that we can (a) create the right
+   * hierarchy and (b) add members to them.
+   */
+  void _initializeNumericTypes() {
+    //
+    // Create the type hierarchy.
+    //
+    ClassElementImpl numElement = ElementFactory.classElement2("num");
+    _numType = numElement.type;
+    ClassElementImpl intElement = ElementFactory.classElement("int", _numType);
+    _intType = intElement.type;
+    ClassElementImpl doubleElement =
+        ElementFactory.classElement("double", _numType);
+    _doubleType = doubleElement.type;
+    //
+    // Force the referenced types to be cached.
+    //
+    objectType;
+    boolType;
+    stringType;
+    //
+    // Add the methods.
+    //
+    numElement.methods = <MethodElement>[
+        ElementFactory.methodElement("+", _numType, [_numType]),
+        ElementFactory.methodElement("-", _numType, [_numType]),
+        ElementFactory.methodElement("*", _numType, [_numType]),
+        ElementFactory.methodElement("%", _numType, [_numType]),
+        ElementFactory.methodElement("/", _doubleType, [_numType]),
+        ElementFactory.methodElement("~/", _numType, [_numType]),
+        ElementFactory.methodElement("-", _numType),
+        ElementFactory.methodElement("remainder", _numType, [_numType]),
+        ElementFactory.methodElement("<", _boolType, [_numType]),
+        ElementFactory.methodElement("<=", _boolType, [_numType]),
+        ElementFactory.methodElement(">", _boolType, [_numType]),
+        ElementFactory.methodElement(">=", _boolType, [_numType]),
+        ElementFactory.methodElement("==", _boolType, [_objectType]),
+        ElementFactory.methodElement("isNaN", _boolType),
+        ElementFactory.methodElement("isNegative", _boolType),
+        ElementFactory.methodElement("isInfinite", _boolType),
+        ElementFactory.methodElement("abs", _numType),
+        ElementFactory.methodElement("floor", _numType),
+        ElementFactory.methodElement("ceil", _numType),
+        ElementFactory.methodElement("round", _numType),
+        ElementFactory.methodElement("truncate", _numType),
+        ElementFactory.methodElement("toInt", _intType),
+        ElementFactory.methodElement("toDouble", _doubleType),
+        ElementFactory.methodElement("toStringAsFixed", _stringType, [_intType]),
+        ElementFactory.methodElement("toStringAsExponential", _stringType, [_intType]),
+        ElementFactory.methodElement("toStringAsPrecision", _stringType, [_intType]),
+        ElementFactory.methodElement("toRadixString", _stringType, [_intType])];
+    intElement.methods = <MethodElement>[
+        ElementFactory.methodElement("&", _intType, [_intType]),
+        ElementFactory.methodElement("|", _intType, [_intType]),
+        ElementFactory.methodElement("^", _intType, [_intType]),
+        ElementFactory.methodElement("~", _intType),
+        ElementFactory.methodElement("<<", _intType, [_intType]),
+        ElementFactory.methodElement(">>", _intType, [_intType]),
+        ElementFactory.methodElement("-", _intType),
+        ElementFactory.methodElement("abs", _intType),
+        ElementFactory.methodElement("round", _intType),
+        ElementFactory.methodElement("floor", _intType),
+        ElementFactory.methodElement("ceil", _intType),
+        ElementFactory.methodElement("truncate", _intType),
+        ElementFactory.methodElement("toString", _stringType)];
+    ConstructorElementImpl fromEnvironment =
+        ElementFactory.constructorElement(intElement, "fromEnvironment", true);
+    fromEnvironment.parameters = <ParameterElement>[
+        ElementFactory.requiredParameter2("name", stringType),
+        ElementFactory.namedParameter2("defaultValue", _intType)];
+    fromEnvironment.factory = true;
+    intElement.constructors = <ConstructorElement>[fromEnvironment];
+    List<FieldElement> fields = <FieldElement>[
+        ElementFactory.fieldElement("NAN", true, false, true, _doubleType),
+        ElementFactory.fieldElement("INFINITY", true, false, true, _doubleType),
+        ElementFactory.fieldElement(
+            "NEGATIVE_INFINITY",
+            true,
+            false,
+            true,
+            _doubleType),
+        ElementFactory.fieldElement("MIN_POSITIVE", true, false, true, _doubleType),
+        ElementFactory.fieldElement("MAX_FINITE", true, false, true, _doubleType)];
+    doubleElement.fields = fields;
+    int fieldCount = fields.length;
+    List<PropertyAccessorElement> accessors =
+        new List<PropertyAccessorElement>(fieldCount);
+    for (int i = 0; i < fieldCount; i++) {
+      accessors[i] = fields[i].getter;
+    }
+    doubleElement.accessors = accessors;
+    doubleElement.methods = <MethodElement>[
+        ElementFactory.methodElement("remainder", _doubleType, [_numType]),
+        ElementFactory.methodElement("+", _doubleType, [_numType]),
+        ElementFactory.methodElement("-", _doubleType, [_numType]),
+        ElementFactory.methodElement("*", _doubleType, [_numType]),
+        ElementFactory.methodElement("%", _doubleType, [_numType]),
+        ElementFactory.methodElement("/", _doubleType, [_numType]),
+        ElementFactory.methodElement("~/", _doubleType, [_numType]),
+        ElementFactory.methodElement("-", _doubleType),
+        ElementFactory.methodElement("abs", _doubleType),
+        ElementFactory.methodElement("round", _doubleType),
+        ElementFactory.methodElement("floor", _doubleType),
+        ElementFactory.methodElement("ceil", _doubleType),
+        ElementFactory.methodElement("truncate", _doubleType),
+        ElementFactory.methodElement("toString", _stringType)];
+  }
+
+  /**
+   * Given a class element representing a class with type parameters, propagate those type
+   * parameters to all of the accessors, methods and constructors defined for the class.
+   *
+   * @param classElement the element representing the class with type parameters
+   */
+  void _propagateTypeArguments(ClassElementImpl classElement) {
+    List<DartType> typeArguments =
+        TypeParameterTypeImpl.getTypes(classElement.typeParameters);
+    for (PropertyAccessorElement accessor in classElement.accessors) {
+      FunctionTypeImpl functionType = accessor.type as FunctionTypeImpl;
+      functionType.typeArguments = typeArguments;
+    }
+    for (MethodElement method in classElement.methods) {
+      FunctionTypeImpl functionType = method.type as FunctionTypeImpl;
+      functionType.typeArguments = typeArguments;
+    }
+    for (ConstructorElement constructor in classElement.constructors) {
+      FunctionTypeImpl functionType = constructor.type as FunctionTypeImpl;
+      functionType.typeArguments = typeArguments;
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/services/runtime/coverage/coverage_impl.dart b/pkg/analyzer/lib/src/services/runtime/coverage/coverage_impl.dart
deleted file mode 100644
index b50ccca..0000000
--- a/pkg/analyzer/lib/src/services/runtime/coverage/coverage_impl.dart
+++ /dev/null
@@ -1,339 +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.
-
-/// A library for code coverage support for Dart.
-library runtime.coverage.impl;
-
-import 'dart:async';
-import 'dart:collection' show SplayTreeMap;
-import 'dart:io';
-
-import 'package:path/path.dart' as pathos;
-
-import 'package:analyzer/src/generated/scanner.dart' show CharSequenceReader, Scanner;
-import 'package:analyzer/src/generated/parser.dart' show Parser;
-import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/engine.dart' show RecordingErrorListener;
-
-import '../log.dart' as log;
-import 'models.dart';
-
-/// Run the [targetPath] with code coverage rewriting.
-/// Redirects stdandard process streams.
-/// On process exit dumps coverage statistics into the [outPath].
-void runServerApplication(String targetPath, String outPath) {
-  var targetFolder = pathos.dirname(targetPath);
-  var targetName = pathos.basename(targetPath);
-  var server = new CoverageServer(targetFolder, targetPath, outPath);
-  server.start().then((port) {
-    var targetArgs = ['http://127.0.0.1:$port/$targetName'];
-    var dartExecutable = Platform.executable;
-    return Process.start(dartExecutable, targetArgs);
-  }).then((process) {
-    stdin.pipe(process.stdin);
-    process.stdout.pipe(stdout);
-    process.stderr.pipe(stderr);
-    return process.exitCode;
-  }).then(exit).catchError((e) {
-    log.severe('Error starting $targetPath. $e');
-  });
-}
-
-
-/// Abstract server to listen requests and serve files, may be rewriting them.
-abstract class RewriteServer {
-  final String basePath;
-  int port;
-
-  RewriteServer(this.basePath);
-
-  /// Runs the HTTP server on the ephemeral port and returns [Future] with it.
-  Future<int> start() {
-    return HttpServer.bind('127.0.0.1', 0).then((server) {
-      port = server.port;
-      log.info('RewriteServer is listening at: $port.');
-      server.listen((request) {
-        if (request.method == 'GET') {
-          handleGetRequest(request);
-        }
-        if (request.method == 'POST') {
-          handlePostRequest(request);
-        }
-      });
-      return port;
-    });
-  }
-
-  void handlePostRequest(HttpRequest request);
-
-  void handleGetRequest(HttpRequest request) {
-    var response = request.response;
-    // Prepare path.
-    var path = getFilePath(request.uri);
-    log.info('[$path] Requested.');
-    // May be serve using just path.
-    {
-      var content = rewritePathContent(path);
-      if (content != null) {
-        log.info('[$path] Request served by path.');
-        response.write(content);
-        response.close();
-        return;
-      }
-    }
-    // Serve from file.
-    log.info('[$path] Serving file.');
-    var file = new File(path);
-    file.exists().then((found) {
-      if (found) {
-        // May be this files should be sent as is.
-        if (!shouldRewriteFile(path)) {
-          return sendFile(request, file);
-        }
-        // Rewrite content of the file.
-        return file.readAsString().then((content) {
-          log.finest('[$path] Done reading ${content.length} characters.');
-          content = rewriteFileContent(path, content);
-          log.fine('[$path] Rewritten.');
-          response.write(content);
-          return response.close();
-        });
-      } else {
-        log.severe('[$path] File not found.');
-        response.statusCode = HttpStatus.NOT_FOUND;
-        return response.close();
-      }
-    }).catchError((e) {
-      log.severe('[$path] $e.');
-      response.statusCode = HttpStatus.INTERNAL_SERVER_ERROR;
-      return response.close();
-    });
-  }
-
-  String getFilePath(Uri uri) {
-    var path = uri.path;
-    path = pathos.joinAll(uri.pathSegments);
-    path = pathos.join(basePath, path);
-    return pathos.normalize(path);
-  }
-
-  Future sendFile(HttpRequest request, File file) {
-    return file.resolveSymbolicLinks().then((fullPath) {
-      return file.openRead().pipe(request.response);
-    });
-  }
-
-  bool shouldRewriteFile(String path);
-
-  /// Subclasses implement this method to rewrite the provided [code] of the
-  /// file with [path]. Returns some content or `null` if file content
-  /// should be requested.
-  String rewritePathContent(String path);
-
-  /// Subclasses implement this method to rewrite the provided [code] of the
-  /// file with [path].
-  String rewriteFileContent(String path, String code);
-}
-
-
-/// Here `CCC` means 'code coverage configuration'.
-const TEST_UNIT_CCC = '''
-class __CCC extends __cc_ut.Configuration {
-  void onDone(bool success) {
-    __cc.postStatistics();
-    super.onDone(success);
-  }
-}''';
-
-const TEST_UNIT_CCC_SET = '__cc_ut.unittestConfiguration = new __CCC();';
-
-
-/// Server that rewrites Dart code so that it reports execution of statements
-/// and other nodes.
-class CoverageServer extends RewriteServer {
-  final appInfo = new AppInfo();
-  final String targetPath;
-  final String outPath;
-
-  CoverageServer(String basePath, this.targetPath, this.outPath)
-      : super(basePath);
-
-  void handlePostRequest(HttpRequest request) {
-    var id = 0;
-    var executedIds = new Set<int>();
-    request.listen((data) {
-      log.fine('Received statistics, ${data.length} bytes.');
-      while (true) {
-        var listIndex = id ~/ 8;
-        if (listIndex >= data.length) break;
-        var bitIndex = id % 8;
-        if ((data[listIndex] & (1 << bitIndex)) != 0) {
-          executedIds.add(id);
-        }
-        id++;
-      }
-    }).onDone(() {
-      log.fine('Received all statistics.');
-      var buffer = new StringBuffer();
-      appInfo.write(buffer, executedIds);
-      new File(outPath).writeAsString(buffer.toString()).then((_) {
-        return request.response.close();
-      }).catchError((e) {
-        log.severe('Error in receiving statistics $e.');
-        return request.response.close();
-      });
-    });
-  }
-
-  String rewritePathContent(String path) {
-    if (path.endsWith('__coverage_lib.dart')) {
-      String implPath = pathos.joinAll([
-          pathos.dirname(Platform.script.toFilePath()),
-          '..', 'lib', 'src', 'services', 'runtime', 'coverage',
-          'coverage_lib.dart']);
-      var content = new File(implPath).readAsStringSync();
-      return content.replaceAll('0; // replaced during rewrite', '$port;');
-    }
-    return null;
-  }
-
-  bool shouldRewriteFile(String path) {
-    if (pathos.extension(path).toLowerCase() != '.dart') return false;
-    // Rewrite target itself, only to send statistics.
-    if (path == targetPath) {
-      return true;
-    }
-    // TODO(scheglov) use configuration
-    return path.contains('/packages/analyzer/');
-  }
-
-  String rewriteFileContent(String path, String code) {
-    var unit = _parseCode(code);
-    log.finest('[$path] Parsed.');
-    var injector = new CodeInjector(code);
-    // Inject imports.
-    var directives = unit.directives;
-    if (directives.isNotEmpty && directives[0] is LibraryDirective) {
-      injector.inject(directives[0].end,
-          'import "package:unittest/unittest.dart" as __cc_ut;'
-          'import "http://127.0.0.1:$port/__coverage_lib.dart" as __cc;');
-    }
-    // Inject statistics sender.
-    var isTargetScript = path == targetPath;
-    if (isTargetScript) {
-      for (var node in unit.declarations) {
-        if (node is FunctionDeclaration) {
-          var body = node.functionExpression.body;
-          if (node.name.name == 'main' && body is BlockFunctionBody) {
-            injector.inject(node.offset, TEST_UNIT_CCC);
-            injector.inject(body.offset + 1, TEST_UNIT_CCC_SET);
-          }
-        }
-      }
-    }
-    // Inject touch() invocations.
-    if (!isTargetScript) {
-      appInfo.enterUnit(path, code);
-      unit.accept(new InsertTouchInvocationsVisitor(appInfo, injector));
-    }
-    // Done.
-    return injector.getResult();
-  }
-
-  CompilationUnit _parseCode(String code) {
-    var source = null;
-    var errorListener = new RecordingErrorListener();
-    var parser = new Parser(source, errorListener);
-    var reader = new CharSequenceReader(code);
-    var scanner = new Scanner(null, reader, errorListener);
-    var token = scanner.tokenize();
-    return parser.parseCompilationUnit(token);
-  }
-}
-
-
-/// The visitor that inserts `touch` method invocations.
-class InsertTouchInvocationsVisitor extends GeneralizingAstVisitor {
-  final AppInfo appInfo;
-  final CodeInjector injector;
-
-  InsertTouchInvocationsVisitor(this.appInfo, this.injector);
-
-  visitClassDeclaration(ClassDeclaration node) {
-    appInfo.enter('class', node.name.name);
-    super.visitClassDeclaration(node);
-    appInfo.leave();
-  }
-
-  visitConstructorDeclaration(ConstructorDeclaration node) {
-    var className = (node.parent as ClassDeclaration).name.name;
-    var constructorName;
-    if (node.name == null) {
-      constructorName = className;
-    } else {
-      constructorName = className + '.' + node.name.name;
-    }
-    appInfo.enter('constructor', constructorName);
-    super.visitConstructorDeclaration(node);
-    appInfo.leave();
-  }
-
-  visitMethodDeclaration(MethodDeclaration node) {
-    if (node.isAbstract) {
-      super.visitMethodDeclaration(node);
-    } else {
-      var kind;
-      if (node.isGetter) {
-        kind = 'getter';
-      } else if (node.isSetter) {
-        kind = 'setter';
-      } else {
-        kind = 'method';
-      }
-      appInfo.enter(kind, node.name.name);
-      super.visitMethodDeclaration(node);
-      appInfo.leave();
-    }
-  }
-
-  visitStatement(Statement node) {
-    insertTouch(node);
-    super.visitStatement(node);
-  }
-
-  void insertTouch(Statement node) {
-    if (node is Block) return;
-    if (node.parent is LabeledStatement) return;
-    if (node.parent is! Block) return;
-    // Inject 'touch' invocation.
-    var offset = node.offset;
-    var id = appInfo.addNode(node);
-    injector.inject(offset, '__cc.touch($id);');
-  }
-}
-
-
-/// Helper for injecting fragments into some existing code.
-class CodeInjector {
-  final String _code;
-  final offsetFragmentMap = new SplayTreeMap<int, String>();
-
-  CodeInjector(this._code);
-
-  void inject(int offset, String fragment) {
-    offsetFragmentMap[offset] = fragment;
-  }
-
-  String getResult() {
-    var sb = new StringBuffer();
-    var lastOffset = 0;
-    offsetFragmentMap.forEach((offset, fragment) {
-      sb.write(_code.substring(lastOffset, offset));
-      sb.write(fragment);
-      lastOffset = offset;
-    });
-    sb.write(_code.substring(lastOffset, _code.length));
-    return sb.toString();
-  }
-}
diff --git a/pkg/analyzer/lib/src/services/runtime/coverage/coverage_lib.dart b/pkg/analyzer/lib/src/services/runtime/coverage/coverage_lib.dart
deleted file mode 100644
index 8f1bac8..0000000
--- a/pkg/analyzer/lib/src/services/runtime/coverage/coverage_lib.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// This library is injected into the applications under coverage.
-library coverage_lib;
-
-import 'dart:io';
-import 'dart:typed_data';
-
-const PORT = 0; // replaced during rewrite
-final _executedIds = new Uint8List(1024 * 64);
-
-touch(int id) {
-  int listIndex = id ~/ 8;
-  int bitIndex = id % 8;
-  _executedIds[listIndex] |= 1 << bitIndex;
-}
-
-postStatistics() {
-  var httpClient = new HttpClient();
-  return httpClient.post('127.0.0.1', PORT, '/statistics')
-      .then((request) {
-        request.add(_executedIds);
-        return request.close();
-      });
-}
diff --git a/pkg/analyzer/lib/src/services/runtime/coverage/models.dart b/pkg/analyzer/lib/src/services/runtime/coverage/models.dart
deleted file mode 100644
index bf247f3..0000000
--- a/pkg/analyzer/lib/src/services/runtime/coverage/models.dart
+++ /dev/null
@@ -1,168 +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.
-
-/// A library with code coverage models.
-library runtime.coverage.model;
-
-import 'dart:collection' show SplayTreeMap;
-
-import 'package:analyzer/src/generated/source.dart' show Source, SourceRange;
-import 'package:analyzer/src/generated/ast.dart' show AstNode;
-
-import 'utils.dart';
-
-
-/// Contains information about the application.
-class AppInfo {
-  final nodeStack = new List<NodeInfo>();
-  final units = new List<UnitInfo>();
-  final pathToFile = new Map<String, UnitInfo>();
-  NodeInfo currentNode;
-  int nextId = 0;
-
-  void enterUnit(String path, String content) {
-    var unit = new UnitInfo(this, path, content);
-    units.add(unit);
-    currentNode = unit;
-  }
-
-  void enter(String kind, String name) {
-    nodeStack.add(currentNode);
-    currentNode = new NodeInfo(this, currentNode, kind, name);
-  }
-
-  void leave() {
-    currentNode = nodeStack.removeLast();
-  }
-
-  int addNode(AstNode node) {
-    return currentNode.addNode(node);
-  }
-
-  void write(StringSink sink, Set<int> executedIds) {
-    sink.writeln('{');
-    units.fold(null, (prev, unit) {
-      if (prev != null) sink.writeln(',');
-      return unit..write(sink, executedIds, '  ');
-    });
-    sink.writeln();
-    sink.writeln('}');
-  }
-}
-
-/// Information about some node - unit, class, method, function.
-class NodeInfo {
-  final AppInfo appInfo;
-  final NodeInfo parent;
-  final String kind;
-  final String name;
-  final idToRange = new SplayTreeMap<int, SourceRange>();
-  final children = <NodeInfo>[];
-
-  NodeInfo(this.appInfo, this.parent, this.kind, this.name) {
-    if (parent != null) {
-      parent.children.add(this);
-    }
-  }
-
-  int addNode(AstNode node) {
-    var id = appInfo.nextId++;
-    var range = new SourceRange(node.offset, node.length);
-    idToRange[id] = range;
-    return id;
-  }
-
-  void write(StringSink sink, Set<int> executedIds, String prefix) {
-    sink.writeln('$prefix"$name": {');
-    // Kind.
-    sink.writeln('$prefix  "kind": "$kind",');
-    // Print children.
-    if (children.isNotEmpty) {
-      sink.writeln('$prefix  "children": {');
-      children.fold(null, (prev, child) {
-        if (prev != null) sink.writeln(',');
-        return child..write(sink, executedIds, '$prefix    ');
-      });
-      sink.writeln();
-      sink.writeln('$prefix  }');
-    }
-    // Print source and line ranges.
-    if (children.isEmpty) {
-      sink.write('$prefix  "ranges": [');
-      var rangePrinter = new RangePrinter(unit, sink, executedIds);
-      idToRange.forEach(rangePrinter.handle);
-      rangePrinter.printRange();
-      sink.writeln(']');
-    }
-    // Close this node.
-    sink.write('$prefix}');
-  }
-
-  UnitInfo get unit => parent.unit;
-}
-
-/// Helper for printing merged source/line intervals.
-class RangePrinter {
-  final UnitInfo unit;
-  final StringSink sink;
-  final Set<int> executedIds;
-
-  bool first = true;
-  int startId = -1;
-  int startOffset = -1;
-  int endId = -1;
-  int endOffset = -1;
-
-  RangePrinter(this.unit, this.sink, this.executedIds);
-
-  handle(int id, SourceRange range) {
-    if (executedIds.contains(id)) {
-      printRange();
-    } else {
-      if (endId == id - 1) {
-        endId = id;
-        endOffset = range.end;
-      } else {
-        startId = id;
-        endId = id;
-        startOffset = range.offset;
-        endOffset = range.end;
-      }
-    }
-  }
-
-  void printRange() {
-    if (endId == -1) return;
-    printSeparator();
-    var startLine = unit.getLine(startOffset);
-    var endLine = unit.getLine(endOffset);
-    sink.write('$startOffset,$endOffset,$startLine,$endLine');
-    startId = startOffset = startLine = -1;
-    endId = endOffset = endLine = -1;
-  }
-
-  void printSeparator() {
-    if (first) {
-      first = false;
-    } else {
-      sink.write(', ');
-    }
-  }
-}
-
-/// Contains information about the single unit of the application.
-class UnitInfo extends NodeInfo {
-  List<int> lineOffsets;
-
-  UnitInfo(AppInfo appInfo, String path, String content)
-      : super(appInfo, null, 'unit', path) {
-    lineOffsets = getLineOffsets(content);
-  }
-
-  UnitInfo get unit => this;
-
-  int getLine(int offset) {
-    return binarySearch(lineOffsets, (x) => x >= offset);
-  }
-}
diff --git a/pkg/analyzer/lib/src/services/runtime/coverage/utils.dart b/pkg/analyzer/lib/src/services/runtime/coverage/utils.dart
deleted file mode 100644
index 3af2276..0000000
--- a/pkg/analyzer/lib/src/services/runtime/coverage/utils.dart
+++ /dev/null
@@ -1,47 +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.
-library utils;
-
-
-List<int> getLineOffsets(String text) {
-  var offsets =  <int> [0];
-  var wasSR = false;
-  text.codeUnits.asMap().forEach((int i, int codeUnit) {
-    if (codeUnit == 13) {
-      wasSR = true;
-      return;
-    }
-    if (codeUnit == 10) {
-      if (wasSR) {
-        offsets.add(i - 1);
-      } else {
-        offsets.add(i);
-      }
-    }
-    wasSR = false;
-  });
-  return offsets;
-}
-
-/// Find the first entry in a sorted [list] that matches a monotonic predicate.
-/// Given a result `n`, that all items before `n` will not match, `n` matches,
-/// and all items after `n` match too. The result is -1 when there are no
-/// items, 0 when all items match, and list.length when none does.
-// TODO(scheglov) remove this function after dartbug.com/5624 is fixed.
-int binarySearch(List list, bool matches(item)) {
-  if (list.length == 0) return -1;
-  if (matches(list.first)) return 0;
-  if (!matches(list.last)) return list.length;
-  var min = 0;
-  var max = list.length - 1;
-  while (min < max) {
-    var half = min + ((max - min) ~/ 2);
-    if (matches(list[half])) {
-      max = half;
-    } else {
-      min = half + 1;
-    }
-  }
-  return max;
-}
diff --git a/pkg/analyzer/lib/src/services/runtime/log.dart b/pkg/analyzer/lib/src/services/runtime/log.dart
deleted file mode 100644
index 6d3c9a6..0000000
--- a/pkg/analyzer/lib/src/services/runtime/log.dart
+++ /dev/null
@@ -1,49 +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.
-
-/// Simple wrapper for [Logger] library.
-library runtime.log;
-
-import "package:logging/logging.dart";
-
-/** Log message at level [Level.FINEST]. */
-void finest(String message) => _logger.log(Level.FINEST, message);
-
-/** Log message at level [Level.FINER]. */
-void finer(String message) => _logger.log(Level.FINER, message);
-
-/** Log message at level [Level.FINE]. */
-void fine(String message) => _logger.log(Level.FINE, message);
-
-/** Log message at level [Level.CONFIG]. */
-void config(String message) => _logger.log(Level.CONFIG, message);
-
-/** Log message at level [Level.INFO]. */
-void info(String message) => _logger.log(Level.INFO, message);
-
-/** Log message at level [Level.WARNING]. */
-void warning(String message) => _logger.log(Level.WARNING, message);
-
-/** Log message at level [Level.SEVERE]. */
-void severe(String message) => _logger.log(Level.SEVERE, message);
-
-/** Log message at level [Level.SHOUT]. */
-void shout(String message) => _logger.log(Level.SHOUT, message);
-
-/// Specifies that all log records should be logged.
-void everything() {
-  _logger.level = Level.ALL;
-}
-
-/// Sends all log record to the console.
-void toConsole() {
-  _logger.onRecord.listen((LogRecord record) {
-    String levelString = record.level.toString();
-    while (levelString.length < 6) levelString += ' ';
-    print('${record.time}: $levelString ${record.message}');
-  });
-}
-
-/// The root [Logger].
-final Logger _logger = Logger.root;
diff --git a/pkg/analyzer/test/cancelable_future_test.dart b/pkg/analyzer/test/cancelable_future_test.dart
index ed0e9af..825945d 100644
--- a/pkg/analyzer/test/cancelable_future_test.dart
+++ b/pkg/analyzer/test/cancelable_future_test.dart
@@ -16,7 +16,7 @@
   runReflectiveTests(CancelableFutureTests);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class CancelableFutureTests {
   Future test_defaultConstructor_returnValue() {
     Object obj = new Object();
@@ -140,7 +140,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class CancelableCompleterTests {
   CancelableCompleter<Object> completer;
   int cancelCount = 0;
diff --git a/pkg/analyzer/test/enum_test.dart b/pkg/analyzer/test/enum_test.dart
index 89d258e..3fcf557 100644
--- a/pkg/analyzer/test/enum_test.dart
+++ b/pkg/analyzer/test/enum_test.dart
@@ -25,7 +25,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class EnumTest {
   void test_AnalysisLevel() {
     new EnumTester<AnalysisLevel>()
@@ -33,12 +33,6 @@
         ..check_explicit_values();
   }
 
-  void test_AngularPropertyKind() {
-    new EnumTester<AngularPropertyKind>()
-        ..check_getters()
-        ..check_explicit_values();
-  }
-
   void test_AssignmentKind() {
     new EnumTester<AssignmentKind>()
         ..check_getters()
diff --git a/pkg/analyzer/test/file_system/physical_resource_provider_test.dart b/pkg/analyzer/test/file_system/physical_resource_provider_test.dart
index 0590cec..c1c09ca 100644
--- a/pkg/analyzer/test/file_system/physical_resource_provider_test.dart
+++ b/pkg/analyzer/test/file_system/physical_resource_provider_test.dart
@@ -68,9 +68,16 @@
         var path = join(tempPath, 'foo');
         new io.File(path).writeAsStringSync('contents');
         return delayed(() {
-          expect(changesReceived, hasLength(1));
+          // There should be an "add" event indicating that the file was added.
+          // Depending on how long it took to write the contents, it may be
+          // followed by "modify" events.
+          expect(changesReceived, isNotEmpty);
           expect(changesReceived[0].type, equals(ChangeType.ADD));
           expect(changesReceived[0].path, equals(path));
+          for (int i = 1; i < changesReceived.length; i++) {
+            expect(changesReceived[i].type, equals(ChangeType.MODIFY));
+            expect(changesReceived[i].path, equals(path));
+          }
         });
       }));
 
diff --git a/pkg/analyzer/test/generated/all_the_rest_test.dart b/pkg/analyzer/test/generated/all_the_rest_test.dart
index ecd06ad..5852a91 100644
--- a/pkg/analyzer/test/generated/all_the_rest_test.dart
+++ b/pkg/analyzer/test/generated/all_the_rest_test.dart
@@ -28,6 +28,7 @@
 import 'package:analyzer/src/generated/testing/ast_factory.dart';
 import 'package:analyzer/src/generated/testing/element_factory.dart';
 import 'package:analyzer/src/generated/testing/html_factory.dart';
+import 'package:analyzer/src/generated/testing/test_type_provider.dart';
 import 'package:analyzer/src/generated/utilities_collection.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:unittest/unittest.dart';
@@ -40,9 +41,6 @@
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(AngularCompilationUnitBuilderTest);
-  runReflectiveTests(AngularHtmlUnitResolverTest);
-  runReflectiveTests(AngularHtmlUnitUtilsTest);
   runReflectiveTests(ConstantEvaluatorTest);
   runReflectiveTests(ConstantFinderTest);
   runReflectiveTests(ConstantValueComputerTest);
@@ -452,2550 +450,7 @@
 }
 
 
-@ReflectiveTestCase()
-class AngularCompilationUnitBuilderTest extends AngularTest {
-  void test_bad_notConstructorAnnotation() {
-    String mainContent = r'''
-const MY_ANNOTATION = null;
-@MY_ANNOTATION()
-class MyFilter {
-}''';
-    resolveMainSource(mainContent);
-    // prepare AngularFilterElement
-    ClassElement classElement = mainUnitElement.getType("MyFilter");
-    AngularFormatterElement filter =
-        getAngularElement(classElement, (e) => e is AngularFormatterElement);
-    expect(filter, isNull);
-  }
-
-  void test_Decorator() {
-    String mainContent = _createAngularSource(r'''
-@Decorator(selector: '[my-dir]',
-             map: const {
-               'my-dir' : '=>myPropA',
-               '.' : '&myPropB',
-             })
-class MyDirective {
-  set myPropA(value) {}
-  set myPropB(value) {}
-  @NgTwoWay('my-prop-c')
-  String myPropC;
-}''');
-    resolveMainSourceNoErrors(mainContent);
-    // prepare AngularDirectiveElement
-    ClassElement classElement = mainUnitElement.getType("MyDirective");
-    AngularDecoratorElement directive =
-        getAngularElement(classElement, (e) => e is AngularDecoratorElement);
-    expect(directive, isNotNull);
-    // verify
-    expect(directive.name, null);
-    expect(directive.nameOffset, -1);
-    _assertHasAttributeSelector(directive.selector, "my-dir");
-    // verify properties
-    List<AngularPropertyElement> properties = directive.properties;
-    expect(properties, hasLength(3));
-    _assertProperty(
-        properties[0],
-        "my-dir",
-        findMainOffset("my-dir' :"),
-        AngularPropertyKind.ONE_WAY,
-        "myPropA",
-        findMainOffset("myPropA'"));
-    _assertProperty(
-        properties[1],
-        ".",
-        findMainOffset(".' :"),
-        AngularPropertyKind.CALLBACK,
-        "myPropB",
-        findMainOffset("myPropB'"));
-    _assertProperty(
-        properties[2],
-        "my-prop-c",
-        findMainOffset("my-prop-c'"),
-        AngularPropertyKind.TWO_WAY,
-        "myPropC",
-        -1);
-  }
-
-  void test_Decorator_bad_cannotParseSelector() {
-    String mainContent = _createAngularSource(r'''
-@Decorator(selector: '~bad-selector',
-             map: const {
-               'my-dir' : '=>myPropA',
-               '.' : '&myPropB',
-             })
-class MyDirective {
-  set myPropA(value) {}
-  set myPropB(value) {}
-}''');
-    resolveMainSource(mainContent);
-    // has error
-    assertMainErrors([AngularCode.CANNOT_PARSE_SELECTOR]);
-  }
-
-  void test_Decorator_bad_missingSelector() {
-    String mainContent = _createAngularSource(r'''
-@Decorator(/*selector: '[my-dir]',*/
-             map: const {
-               'my-dir' : '=>myPropA',
-               '.' : '&myPropB',
-             })
-class MyDirective {
-  set myPropA(value) {}
-  set myPropB(value) {}
-}''');
-    resolveMainSource(mainContent);
-    // has error
-    assertMainErrors([AngularCode.MISSING_SELECTOR]);
-  }
-
-  void test_Formatter() {
-    String mainContent = _createAngularSource(r'''
-@Formatter(name: 'myFilter')
-class MyFilter {
-  call(p1, p2) {}
-}''');
-    resolveMainSourceNoErrors(mainContent);
-    // prepare AngularFilterElement
-    ClassElement classElement = mainUnitElement.getType("MyFilter");
-    AngularFormatterElement filter =
-        getAngularElement(classElement, (e) => e is AngularFormatterElement);
-    expect(filter, isNotNull);
-    // verify
-    expect(filter.name, "myFilter");
-    expect(filter.nameOffset, AngularTest.findOffset(mainContent, "myFilter'"));
-  }
-
-  void test_Formatter_missingName() {
-    String mainContent = _createAngularSource(r'''
-@Formatter()
-class MyFilter {
-  call(p1, p2) {}
-}''');
-    resolveMainSource(mainContent);
-    // has error
-    assertMainErrors([AngularCode.MISSING_NAME]);
-    // no filter
-    ClassElement classElement = mainUnitElement.getType("MyFilter");
-    AngularFormatterElement filter =
-        getAngularElement(classElement, (e) => e is AngularFormatterElement);
-    expect(filter, isNull);
-  }
-
-  void test_getElement_component_name() {
-    resolveMainSource(_createAngularSource(r'''
-@Component(publishAs: 'ctrl', selector: 'myComp',
-             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')
-class MyComponent {}'''));
-    SimpleStringLiteral node =
-        _findMainNode("ctrl'", (n) => n is SimpleStringLiteral);
-    int offset = node.offset;
-    // find AngularComponentElement
-    Element element = AngularCompilationUnitBuilder.getElement(node, offset);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is AngularComponentElement,
-        AngularComponentElement,
-        element);
-  }
-
-  void test_getElement_component_property_fromFieldAnnotation() {
-    resolveMainSource(_createAngularSource(r'''
-@Component(publishAs: 'ctrl', selector: 'myComp',
-             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')
-class MyComponent {
-  @NgOneWay('prop')
-  var field;
-}'''));
-    // prepare node
-    SimpleStringLiteral node =
-        _findMainNode("prop'", (n) => n is SimpleStringLiteral);
-    int offset = node.offset;
-    // prepare Element
-    Element element = AngularCompilationUnitBuilder.getElement(node, offset);
-    expect(element, isNotNull);
-    // check AngularPropertyElement
-    AngularPropertyElement property = element as AngularPropertyElement;
-    expect(property.name, "prop");
-  }
-
-  void test_getElement_component_property_fromMap() {
-    resolveMainSource(_createAngularSource(r'''
-@Component(publishAs: 'ctrl', selector: 'myComp',
-             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
-             map: const {
-               'prop' : '@field',
-             })
-class MyComponent {
-  var field;
-}'''));
-    // AngularPropertyElement
-    {
-      SimpleStringLiteral node =
-          _findMainNode("prop'", (n) => n is SimpleStringLiteral);
-      int offset = node.offset;
-      // prepare Element
-      Element element = AngularCompilationUnitBuilder.getElement(node, offset);
-      expect(element, isNotNull);
-      // check AngularPropertyElement
-      AngularPropertyElement property = element as AngularPropertyElement;
-      expect(property.name, "prop");
-    }
-    // FieldElement
-    {
-      SimpleStringLiteral node =
-          _findMainNode("@field'", (n) => n is SimpleStringLiteral);
-      int offset = node.offset;
-      // prepare Element
-      Element element = AngularCompilationUnitBuilder.getElement(node, offset);
-      expect(element, isNotNull);
-      // check FieldElement
-      FieldElement field = element as FieldElement;
-      expect(field.name, "field");
-    }
-  }
-
-  void test_getElement_component_selector() {
-    resolveMainSource(_createAngularSource(r'''
-@Component(publishAs: 'ctrl', selector: 'myComp',
-             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')
-class MyComponent {}'''));
-    SimpleStringLiteral node =
-        _findMainNode("myComp'", (n) => n is SimpleStringLiteral);
-    int offset = node.offset;
-    // find AngularSelectorElement
-    Element element = AngularCompilationUnitBuilder.getElement(node, offset);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is AngularSelectorElement,
-        AngularSelectorElement,
-        element);
-  }
-
-  void test_getElement_controller_name() {
-    resolveMainSource(_createAngularSource(r'''
-@Controller(publishAs: 'ctrl', selector: '[myApp]')
-class MyController {
-}'''));
-    SimpleStringLiteral node =
-        _findMainNode("ctrl'", (n) => n is SimpleStringLiteral);
-    int offset = node.offset;
-    // find AngularControllerElement
-    Element element = AngularCompilationUnitBuilder.getElement(node, offset);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is AngularControllerElement,
-        AngularControllerElement,
-        element);
-  }
-
-  void test_getElement_directive_property() {
-    resolveMainSource(_createAngularSource(r'''
-@Decorator(selector: '[my-dir]',
-             map: const {
-               'my-dir' : '=>field'
-             })
-class MyDirective {
-  set field(value) {}
-}'''));
-    // prepare node
-    SimpleStringLiteral node =
-        _findMainNode("my-dir'", (n) => n is SimpleStringLiteral);
-    int offset = node.offset;
-    // prepare Element
-    Element element = AngularCompilationUnitBuilder.getElement(node, offset);
-    expect(element, isNotNull);
-    // check AngularPropertyElement
-    AngularPropertyElement property = element as AngularPropertyElement;
-    expect(property.name, "my-dir");
-  }
-
-  void test_getElement_directive_selector() {
-    resolveMainSource(_createAngularSource(r'''
-@Decorator(selector: '[my-dir]')
-class MyDirective {}'''));
-    SimpleStringLiteral node =
-        _findMainNode("my-dir]'", (n) => n is SimpleStringLiteral);
-    int offset = node.offset;
-    // find AngularSelectorElement
-    Element element = AngularCompilationUnitBuilder.getElement(node, offset);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is AngularSelectorElement,
-        AngularSelectorElement,
-        element);
-  }
-
-  void test_getElement_filter_name() {
-    resolveMainSource(_createAngularSource(r'''
-@Formatter(name: 'myFilter')
-class MyFilter {
-  call(p1, p2) {}
-}'''));
-    SimpleStringLiteral node =
-        _findMainNode("myFilter'", (n) => n is SimpleStringLiteral);
-    int offset = node.offset;
-    // find FilterElement
-    Element element = AngularCompilationUnitBuilder.getElement(node, offset);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is AngularFormatterElement,
-        AngularFormatterElement,
-        element);
-  }
-
-  void test_getElement_noClassDeclaration() {
-    resolveMainSource("var foo = 'bar';");
-    SimpleStringLiteral node =
-        _findMainNode("bar'", (n) => n is SimpleStringLiteral);
-    Element element = AngularCompilationUnitBuilder.getElement(node, 0);
-    expect(element, isNull);
-  }
-
-  void test_getElement_noClassElement() {
-    resolveMainSource(r'''
-class A {
-  const A(p);
-}
-
-@A('bar')
-class B {}''');
-    SimpleStringLiteral node =
-        _findMainNode("bar'", (n) => n is SimpleStringLiteral);
-    // reset B element
-    ClassDeclaration classDeclaration =
-        node.getAncestor((node) => node is ClassDeclaration);
-    classDeclaration.name.staticElement = null;
-    // class is not resolved - no element
-    Element element = AngularCompilationUnitBuilder.getElement(node, 0);
-    expect(element, isNull);
-  }
-
-  void test_getElement_noNode() {
-    Element element = AngularCompilationUnitBuilder.getElement(null, 0);
-    expect(element, isNull);
-  }
-
-  void test_getElement_notFound() {
-    resolveMainSource(r'''
-class MyComponent {
-  var str = 'some string';
-}''');
-    // prepare node
-    SimpleStringLiteral node =
-        _findMainNode("some string'", (n) => n is SimpleStringLiteral);
-    int offset = node.offset;
-    // no Element
-    Element element = AngularCompilationUnitBuilder.getElement(node, offset);
-    expect(element, isNull);
-  }
-
-  void test_getElement_SimpleStringLiteral_withToolkitElement() {
-    SimpleStringLiteral literal = AstFactory.string2("foo");
-    Element element = new AngularScopePropertyElementImpl("foo", 0, null);
-    literal.toolkitElement = element;
-    expect(
-        AngularCompilationUnitBuilder.getElement(literal, -1),
-        same(element));
-  }
-
-  void test_NgComponent_bad_cannotParseSelector() {
-    contextHelper.addSource("/my_template.html", "");
-    contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(r'''
-@Component(publishAs: 'ctrl', selector: '~myComp',
-             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')
-class MyComponent {
-}''');
-    resolveMainSource(mainContent);
-    // has error
-    assertMainErrors([AngularCode.CANNOT_PARSE_SELECTOR]);
-  }
-
-  void test_NgComponent_bad_missingSelector() {
-    contextHelper.addSource("/my_template.html", "");
-    contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(r'''
-@Component(publishAs: 'ctrl', /*selector: 'myComp',*/
-             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')
-class MyComponent {
-}''');
-    resolveMainSource(mainContent);
-    // has error
-    assertMainErrors([AngularCode.MISSING_SELECTOR]);
-  }
-
-  /**
-   *
-   * https://code.google.com/p/dart/issues/detail?id=16346
-   */
-  void test_NgComponent_bad_notHtmlTemplate() {
-    contextHelper.addSource("/my_template", "");
-    contextHelper.addSource("/my_styles.css", "");
-    addMainSource(_createAngularSource(r'''
-@NgComponent(publishAs: 'ctrl', selector: 'myComp',
-             templateUrl: 'my_template', cssUrl: 'my_styles.css')
-class MyComponent {
-}'''));
-    contextHelper.runTasks();
-  }
-
-  void test_NgComponent_bad_properties_invalidBinding() {
-    contextHelper.addSource("/my_template.html", "");
-    contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(r'''
-@Component(publishAs: 'ctrl', selector: 'myComp',
-             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
-             map: const {'name' : '?field'})
-class MyComponent {
-}''');
-    resolveMainSource(mainContent);
-    // has error
-    assertMainErrors([AngularCode.INVALID_PROPERTY_KIND]);
-  }
-
-  void test_NgComponent_bad_properties_nameNotStringLiteral() {
-    contextHelper.addSource("/my_template.html", "");
-    contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(r'''
-@Component(publishAs: 'ctrl', selector: 'myComp',
-             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
-             map: const {null : 'field'})
-class MyComponent {
-}''');
-    resolveMainSource(mainContent);
-    // has error
-    assertMainErrors([AngularCode.INVALID_PROPERTY_NAME]);
-  }
-
-  void test_NgComponent_bad_properties_noSuchField() {
-    contextHelper.addSource("/my_template.html", "");
-    contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(r'''
-@Component(publishAs: 'ctrl', selector: 'myComp',
-             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
-             map: const {'name' : '=>field'})
-class MyComponent {
-}''');
-    resolveMainSource(mainContent);
-    // has error
-    assertMainErrors([AngularCode.INVALID_PROPERTY_FIELD]);
-  }
-
-  void test_NgComponent_bad_properties_notMapLiteral() {
-    contextHelper.addSource("/my_template.html", "");
-    contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(r'''
-@Component(publishAs: 'ctrl', selector: 'myComp',
-             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
-             map: null)
-class MyComponent {
-}''');
-    resolveMainSource(mainContent);
-    // has error
-    assertMainErrors([AngularCode.INVALID_PROPERTY_MAP]);
-  }
-
-  void test_NgComponent_bad_properties_specNotStringLiteral() {
-    contextHelper.addSource("/my_template.html", "");
-    contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(r'''
-@Component(publishAs: 'ctrl', selector: 'myComp',
-             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
-             map: const {'name' : null})
-class MyComponent {
-}''');
-    resolveMainSource(mainContent);
-    // has error
-    assertMainErrors([AngularCode.INVALID_PROPERTY_SPEC]);
-  }
-
-  void test_NgComponent_no_cssUrl() {
-    contextHelper.addSource("/my_template.html", "");
-    contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(r'''
-@Component(publishAs: 'ctrl', selector: 'myComp',
-             templateUrl: 'my_template.html'/*, cssUrl: 'my_styles.css'*/)
-class MyComponent {
-}''');
-    resolveMainSource(mainContent);
-    // prepare AngularComponentElement
-    ClassElement classElement = mainUnitElement.getType("MyComponent");
-    AngularComponentElement component =
-        getAngularElement(classElement, (e) => e is AngularComponentElement);
-    expect(component, isNotNull);
-    // no CSS
-    expect(component.styleUri, null);
-    expect(component.styleUriOffset, -1);
-  }
-
-  void test_NgComponent_no_publishAs() {
-    contextHelper.addSource("/my_template.html", "");
-    contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(r'''
-@Component(/*publishAs: 'ctrl',*/ selector: 'myComp',
-             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')
-class MyComponent {
-}''');
-    resolveMainSource(mainContent);
-    // prepare AngularComponentElement
-    ClassElement classElement = mainUnitElement.getType("MyComponent");
-    AngularComponentElement component =
-        getAngularElement(classElement, (e) => e is AngularComponentElement);
-    expect(component, isNotNull);
-    // no name
-    expect(component.name, null);
-    expect(component.nameOffset, -1);
-  }
-
-  void test_NgComponent_no_templateUrl() {
-    contextHelper.addSource("/my_template.html", "");
-    contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(r'''
-@Component(publishAs: 'ctrl', selector: 'myComp',
-             /*templateUrl: 'my_template.html',*/ cssUrl: 'my_styles.css')
-class MyComponent {
-}''');
-    resolveMainSource(mainContent);
-    // prepare AngularComponentElement
-    ClassElement classElement = mainUnitElement.getType("MyComponent");
-    AngularComponentElement component =
-        getAngularElement(classElement, (e) => e is AngularComponentElement);
-    expect(component, isNotNull);
-    // no template
-    expect(component.templateUri, null);
-    expect(component.templateSource, null);
-    expect(component.templateUriOffset, -1);
-  }
-
-  /**
-   * https://code.google.com/p/dart/issues/detail?id=19023
-   */
-  void test_NgComponent_notAngular() {
-    contextHelper.addSource("/my_template.html", "");
-    contextHelper.addSource("/my_styles.css", "");
-    String mainContent = r'''
-class Component {
-  const Component(a, b);
-}
-
-@Component('foo', 42)
-class MyComponent {
-}''';
-    resolveMainSource(mainContent);
-    assertNoMainErrors();
-  }
-
-  void test_NgComponent_properties_fieldFromSuper() {
-    contextHelper.addSource("/my_template.html", "");
-    contextHelper.addSource("/my_styles.css", "");
-    resolveMainSourceNoErrors(_createAngularSource(r'''
-class MySuper {
-  var myPropA;
-}
-
-
-
-@Component(publishAs: 'ctrl', selector: 'myComp',
-             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
-             map: const {
-               'prop-a' : '@myPropA'
-             })
-class MyComponent extends MySuper {
-}'''));
-    // prepare AngularComponentElement
-    ClassElement classElement = mainUnitElement.getType("MyComponent");
-    AngularComponentElement component =
-        getAngularElement(classElement, (e) => e is AngularComponentElement);
-    expect(component, isNotNull);
-    // verify
-    List<AngularPropertyElement> properties = component.properties;
-    expect(properties, hasLength(1));
-    _assertProperty(
-        properties[0],
-        "prop-a",
-        findMainOffset("prop-a' :"),
-        AngularPropertyKind.ATTR,
-        "myPropA",
-        findMainOffset("myPropA'"));
-  }
-
-  void test_NgComponent_properties_fromFields() {
-    contextHelper.addSource("/my_template.html", "");
-    contextHelper.addSource("/my_styles.css", "");
-    resolveMainSourceNoErrors(_createAngularSource(r'''
-@Component(publishAs: 'ctrl', selector: 'myComp',
-             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')
-class MyComponent {
-  @NgAttr('prop-a')
-  var myPropA;
-  @NgCallback('prop-b')
-  var myPropB;
-  @NgOneWay('prop-c')
-  var myPropC;
-  @NgOneWayOneTime('prop-d')
-  var myPropD;
-  @NgTwoWay('prop-e')
-  var myPropE;
-}'''));
-    // prepare AngularComponentElement
-    ClassElement classElement = mainUnitElement.getType("MyComponent");
-    AngularComponentElement component =
-        getAngularElement(classElement, (e) => e is AngularComponentElement);
-    expect(component, isNotNull);
-    // verify
-    List<AngularPropertyElement> properties = component.properties;
-    expect(properties, hasLength(5));
-    _assertProperty(
-        properties[0],
-        "prop-a",
-        findMainOffset("prop-a')"),
-        AngularPropertyKind.ATTR,
-        "myPropA",
-        -1);
-    _assertProperty(
-        properties[1],
-        "prop-b",
-        findMainOffset("prop-b')"),
-        AngularPropertyKind.CALLBACK,
-        "myPropB",
-        -1);
-    _assertProperty(
-        properties[2],
-        "prop-c",
-        findMainOffset("prop-c')"),
-        AngularPropertyKind.ONE_WAY,
-        "myPropC",
-        -1);
-    _assertProperty(
-        properties[3],
-        "prop-d",
-        findMainOffset("prop-d')"),
-        AngularPropertyKind.ONE_WAY_ONE_TIME,
-        "myPropD",
-        -1);
-    _assertProperty(
-        properties[4],
-        "prop-e",
-        findMainOffset("prop-e')"),
-        AngularPropertyKind.TWO_WAY,
-        "myPropE",
-        -1);
-  }
-
-  void test_NgComponent_properties_fromMap() {
-    contextHelper.addSource("/my_template.html", "");
-    contextHelper.addSource("/my_styles.css", "");
-    resolveMainSourceNoErrors(_createAngularSource(r'''
-@Component(publishAs: 'ctrl', selector: 'myComp',
-             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
-             map: const {
-               'prop-a' : '@myPropA',
-               'prop-b' : '&myPropB',
-               'prop-c' : '=>myPropC',
-               'prop-d' : '=>!myPropD',
-               'prop-e' : '<=>myPropE'
-             })
-class MyComponent {
-  var myPropA;
-  var myPropB;
-  var myPropC;
-  var myPropD;
-  var myPropE;
-}'''));
-    // prepare AngularComponentElement
-    ClassElement classElement = mainUnitElement.getType("MyComponent");
-    AngularComponentElement component =
-        getAngularElement(classElement, (e) => e is AngularComponentElement);
-    expect(component, isNotNull);
-    // verify
-    List<AngularPropertyElement> properties = component.properties;
-    expect(properties, hasLength(5));
-    _assertProperty(
-        properties[0],
-        "prop-a",
-        findMainOffset("prop-a' :"),
-        AngularPropertyKind.ATTR,
-        "myPropA",
-        findMainOffset("myPropA'"));
-    _assertProperty(
-        properties[1],
-        "prop-b",
-        findMainOffset("prop-b' :"),
-        AngularPropertyKind.CALLBACK,
-        "myPropB",
-        findMainOffset("myPropB'"));
-    _assertProperty(
-        properties[2],
-        "prop-c",
-        findMainOffset("prop-c' :"),
-        AngularPropertyKind.ONE_WAY,
-        "myPropC",
-        findMainOffset("myPropC'"));
-    _assertProperty(
-        properties[3],
-        "prop-d",
-        findMainOffset("prop-d' :"),
-        AngularPropertyKind.ONE_WAY_ONE_TIME,
-        "myPropD",
-        findMainOffset("myPropD'"));
-    _assertProperty(
-        properties[4],
-        "prop-e",
-        findMainOffset("prop-e' :"),
-        AngularPropertyKind.TWO_WAY,
-        "myPropE",
-        findMainOffset("myPropE'"));
-  }
-
-  void test_NgComponent_properties_no() {
-    contextHelper.addSource("/my_template.html", "");
-    contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(r'''
-@Component(publishAs: 'ctrl', selector: 'myComp',
-             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')
-class MyComponent {
-}''');
-    resolveMainSourceNoErrors(mainContent);
-    // prepare AngularComponentElement
-    ClassElement classElement = mainUnitElement.getType("MyComponent");
-    AngularComponentElement component =
-        getAngularElement(classElement, (e) => e is AngularComponentElement);
-    expect(component, isNotNull);
-    // verify
-    expect(component.name, "ctrl");
-    expect(component.nameOffset, AngularTest.findOffset(mainContent, "ctrl'"));
-    _assertIsTagSelector(component.selector, "myComp");
-    expect(component.templateUri, "my_template.html");
-    expect(
-        component.templateUriOffset,
-        AngularTest.findOffset(mainContent, "my_template.html'"));
-    expect(component.styleUri, "my_styles.css");
-    expect(
-        component.styleUriOffset,
-        AngularTest.findOffset(mainContent, "my_styles.css'"));
-    expect(component.properties, hasLength(0));
-  }
-
-  void test_NgComponent_scopeProperties() {
-    contextHelper.addSource("/my_template.html", "");
-    contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(r'''
-@Component(publishAs: 'ctrl', selector: 'myComp',
-             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')
-class MyComponent {
-  MyComponent(Scope scope) {
-    scope.context['boolProp'] = true;
-    scope.context['intProp'] = 42;
-    scope.context['stringProp'] = 'foo';
-    // duplicate is ignored
-    scope.context['boolProp'] = true;
-    // LHS is not an IndexExpression
-    var v1;
-    v1 = 1;
-    // LHS is not a Scope access
-    var v2;
-    v2['name'] = 2;
-  }
-}''');
-    resolveMainSourceNoErrors(mainContent);
-    // prepare AngularComponentElement
-    ClassElement classElement = mainUnitElement.getType("MyComponent");
-    AngularComponentElement component =
-        getAngularElement(classElement, (e) => e is AngularComponentElement);
-    expect(component, isNotNull);
-    // verify
-    List<AngularScopePropertyElement> scopeProperties =
-        component.scopeProperties;
-    expect(scopeProperties, hasLength(3));
-    {
-      AngularScopePropertyElement property = scopeProperties[0];
-      expect(findMainElement2("boolProp"), same(property));
-      expect(property.name, "boolProp");
-      expect(
-          property.nameOffset,
-          AngularTest.findOffset(mainContent, "boolProp'"));
-      expect(property.type.name, "bool");
-    }
-    {
-      AngularScopePropertyElement property = scopeProperties[1];
-      expect(findMainElement2("intProp"), same(property));
-      expect(property.name, "intProp");
-      expect(
-          property.nameOffset,
-          AngularTest.findOffset(mainContent, "intProp'"));
-      expect(property.type.name, "int");
-    }
-    {
-      AngularScopePropertyElement property = scopeProperties[2];
-      expect(findMainElement2("stringProp"), same(property));
-      expect(property.name, "stringProp");
-      expect(
-          property.nameOffset,
-          AngularTest.findOffset(mainContent, "stringProp'"));
-      expect(property.type.name, "String");
-    }
-  }
-
-  void test_NgController() {
-    String mainContent = _createAngularSource(r'''
-@Controller(publishAs: 'ctrl', selector: '[myApp]')
-class MyController {
-}''');
-    resolveMainSourceNoErrors(mainContent);
-    // prepare AngularControllerElement
-    ClassElement classElement = mainUnitElement.getType("MyController");
-    AngularControllerElement controller =
-        getAngularElement(classElement, (e) => e is AngularControllerElement);
-    expect(controller, isNotNull);
-    // verify
-    expect(controller.name, "ctrl");
-    expect(controller.nameOffset, AngularTest.findOffset(mainContent, "ctrl'"));
-    _assertHasAttributeSelector(controller.selector, "myApp");
-  }
-
-  void test_NgController_cannotParseSelector() {
-    String mainContent = _createAngularSource(r'''
-@Controller(publishAs: 'ctrl', selector: '~unknown')
-class MyController {
-}''');
-    resolveMainSource(mainContent);
-    // has error
-    assertMainErrors([AngularCode.CANNOT_PARSE_SELECTOR]);
-  }
-
-  void test_NgController_missingPublishAs() {
-    String mainContent = _createAngularSource(r'''
-@Controller(selector: '[myApp]')
-class MyController {
-}''');
-    resolveMainSource(mainContent);
-    // has error
-    assertMainErrors([AngularCode.MISSING_PUBLISH_AS]);
-  }
-
-  void test_NgController_missingSelector() {
-    String mainContent = _createAngularSource(r'''
-@Controller(publishAs: 'ctrl')
-class MyController {
-}''');
-    resolveMainSource(mainContent);
-    // has error
-    assertMainErrors([AngularCode.MISSING_SELECTOR]);
-  }
-
-  void test_NgController_noAnnotationArguments() {
-    String mainContent = _createAngularSource(r'''
-@NgController
-class MyController {
-}''');
-    resolveMainSource(mainContent);
-  }
-
-  void test_parseSelector_hasAttribute() {
-    AngularSelectorElement selector =
-        AngularCompilationUnitBuilder.parseSelector(42, "[name]");
-    _assertHasAttributeSelector(selector, "name");
-    expect(selector.nameOffset, 42 + 1);
-  }
-
-  void test_parseSelector_hasClass() {
-    AngularSelectorElement selector =
-        AngularCompilationUnitBuilder.parseSelector(42, ".my-class");
-    AngularHasClassSelectorElementImpl classSelector =
-        selector as AngularHasClassSelectorElementImpl;
-    expect(classSelector.name, "my-class");
-    expect(classSelector.toString(), ".my-class");
-    expect(selector.nameOffset, 42 + 1);
-    // test apply()
-    {
-      ht.XmlTagNode node =
-          HtmlFactory.tagNode("div", [HtmlFactory.attribute("class", "one two")]);
-      expect(classSelector.apply(node), isFalse);
-    }
-    {
-      ht.XmlTagNode node = HtmlFactory.tagNode(
-          "div",
-          [HtmlFactory.attribute("class", "one my-class two")]);
-      expect(classSelector.apply(node), isTrue);
-    }
-  }
-
-  void test_parseSelector_isTag() {
-    AngularSelectorElement selector =
-        AngularCompilationUnitBuilder.parseSelector(42, "name");
-    _assertIsTagSelector(selector, "name");
-    expect(selector.nameOffset, 42);
-  }
-
-  void test_parseSelector_isTag_hasAttribute() {
-    AngularSelectorElement selector =
-        AngularCompilationUnitBuilder.parseSelector(42, "tag[attr]");
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is IsTagHasAttributeSelectorElementImpl,
-        IsTagHasAttributeSelectorElementImpl,
-        selector);
-    expect(selector.name, "tag[attr]");
-    expect(selector.nameOffset, -1);
-    expect((selector as IsTagHasAttributeSelectorElementImpl).tagName, "tag");
-    expect(
-        (selector as IsTagHasAttributeSelectorElementImpl).attributeName,
-        "attr");
-  }
-
-  void test_parseSelector_unknown() {
-    AngularSelectorElement selector =
-        AngularCompilationUnitBuilder.parseSelector(0, "~unknown");
-    expect(selector, isNull);
-  }
-
-  void test_view() {
-    contextHelper.addSource("/wrong.html", "");
-    contextHelper.addSource("/my_templateA.html", "");
-    contextHelper.addSource("/my_templateB.html", "");
-    String mainContent = _createAngularSource(r'''
-class MyRouteInitializer {
-  init(ViewFactory view, foo) {
-    foo.view('wrong.html');   // has target
-    foo();                    // less than one argument
-    foo('wrong.html', 'bar'); // more than one argument
-    foo('wrong' + '.html');   // not literal
-    foo('wrong.html');        // not ViewFactory
-    view('my_templateA.html');
-    view('my_templateB.html');
-  }
-}''');
-    resolveMainSourceNoErrors(mainContent);
-    // prepare AngularViewElement(s)
-    List<AngularViewElement> views = mainUnitElement.angularViews;
-    expect(views, hasLength(2));
-    {
-      AngularViewElement view = views[0];
-      expect(view.templateUri, "my_templateA.html");
-      expect(view.name, null);
-      expect(view.nameOffset, -1);
-      expect(
-          view.templateUriOffset,
-          AngularTest.findOffset(mainContent, "my_templateA.html'"));
-    }
-    {
-      AngularViewElement view = views[1];
-      expect(view.templateUri, "my_templateB.html");
-      expect(view.name, null);
-      expect(view.nameOffset, -1);
-      expect(
-          view.templateUriOffset,
-          AngularTest.findOffset(mainContent, "my_templateB.html'"));
-    }
-  }
-
-  void _assertProperty(AngularPropertyElement property, String expectedName,
-      int expectedNameOffset, AngularPropertyKind expectedKind,
-      String expectedFieldName, int expectedFieldOffset) {
-    expect(property.name, expectedName);
-    expect(property.nameOffset, expectedNameOffset);
-    expect(property.propertyKind, same(expectedKind));
-    expect(property.field.name, expectedFieldName);
-    expect(property.fieldNameOffset, expectedFieldOffset);
-  }
-
-  /**
-   * Find [AstNode] of the given type in [mainUnit].
-   */
-  AstNode _findMainNode(String search, Predicate<AstNode> predicate) {
-    return EngineTestCase.findNode(mainUnit, mainContent, search, predicate);
-  }
-
-  static AngularElement getAngularElement(Element element,
-      Predicate<Element> predicate) {
-    List<ToolkitObjectElement> toolkitObjects = null;
-    if (element is ClassElement) {
-      ClassElement classElement = element;
-      toolkitObjects = classElement.toolkitObjects;
-    }
-    if (element is LocalVariableElement) {
-      LocalVariableElement variableElement = element;
-      toolkitObjects = variableElement.toolkitObjects;
-    }
-    if (toolkitObjects != null) {
-      for (ToolkitObjectElement toolkitObject in toolkitObjects) {
-        if (predicate(toolkitObject)) {
-          return toolkitObject as AngularElement;
-        }
-      }
-    }
-    return null;
-  }
-
-  static void _assertHasAttributeSelector(AngularSelectorElement selector,
-      String name) {
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is HasAttributeSelectorElementImpl,
-        HasAttributeSelectorElementImpl,
-        selector);
-    expect((selector as HasAttributeSelectorElementImpl).name, name);
-  }
-
-  static void _assertIsTagSelector(AngularSelectorElement selector,
-      String name) {
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is AngularTagSelectorElementImpl,
-        AngularTagSelectorElementImpl,
-        selector);
-    expect((selector as AngularTagSelectorElementImpl).name, name);
-  }
-
-  static String _createAngularSource(String code) {
-    return "import 'angular.dart';\n" + code;
-  }
-}
-
-
-@ReflectiveTestCase()
-class AngularHtmlUnitResolverTest extends AngularTest {
-  void fail_analysisContext_changeDart_invalidateApplication() {
-    addMainSource(r'''
-
-import 'angular.dart';
-
-@Component(
-    templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
-    publishAs: 'ctrl',
-    selector: 'myComponent')
-class MyComponent {
-}''');
-    contextHelper.addSource(
-        "/entry-point.html",
-        AngularTest.createHtmlWithAngular(''));
-    addIndexSource2("/my_template.html", r'''
-<div>
-  {{ctrl.noMethod()}}
-</div>''');
-    contextHelper.addSource("/my_styles.css", "");
-    contextHelper.runTasks();
-    // there are some errors in my_template.html
-    {
-      List<AnalysisError> errors = context.getErrors(indexSource).errors;
-      expect(errors.length != 0, isTrue);
-    }
-    // change main.dart, there are no MyComponent anymore
-    context.setContents(mainSource, "");
-    // ...errors in my_template.html should be removed
-    {
-      List<AnalysisError> errors = context.getErrors(indexSource).errors;
-      expect(errors, isEmpty);
-      expect(errors.length == 0, isTrue);
-    }
-  }
-
-  void fail_ngRepeat_additionalVariables() {
-    addMyController();
-    _resolveIndexNoErrors(AngularTest.createHtmlWithMyController(r'''
-<li ng-repeat='name in ctrl.names'>
-  {{$index}} {{$first}} {{$middle}} {{$last}} {{$even}} {{$odd}}
-</li>'''));
-    assertResolvedIdentifier2("\$index", "int");
-    assertResolvedIdentifier2("\$first", "bool");
-    assertResolvedIdentifier2("\$middle", "bool");
-    assertResolvedIdentifier2("\$last", "bool");
-    assertResolvedIdentifier2("\$even", "bool");
-    assertResolvedIdentifier2("\$odd", "bool");
-  }
-
-  void fail_ngRepeat_bad_expectedIdentifier() {
-    addMyController();
-    resolveIndex2(AngularTest.createHtmlWithMyController(r'''
-<li ng-repeat='name + 42 in ctrl.names'>
-</li>'''));
-    assertErrors(indexSource, [AngularCode.INVALID_REPEAT_ITEM_SYNTAX]);
-  }
-
-  void fail_ngRepeat_bad_expectedIn() {
-    addMyController();
-    resolveIndex2(AngularTest.createHtmlWithMyController(r'''
-<li ng-repeat='name : ctrl.names'>
-</li>'''));
-    assertErrors(indexSource, [AngularCode.INVALID_REPEAT_SYNTAX]);
-  }
-
-  void fail_ngRepeat_filters_filter_literal() {
-    addMyController();
-    _resolveIndexNoErrors(AngularTest.createHtmlWithMyController(r'''
-<li ng-repeat='item in ctrl.items | filter:42:null'/>
-</li>'''));
-    // filter "filter" is resolved
-    Element filterElement = assertResolvedIdentifier("filter");
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is AngularFormatterElement,
-        AngularFormatterElement,
-        filterElement);
-  }
-
-  void fail_ngRepeat_filters_filter_propertyMap() {
-    addMyController();
-    _resolveIndexNoErrors(AngularTest.createHtmlWithMyController(r'''
-<li ng-repeat='item in ctrl.items | filter:{name:null, done:false}'/>
-</li>'''));
-    assertResolvedIdentifier2("name:", "String");
-    assertResolvedIdentifier2("done:", "bool");
-  }
-
-  void fail_ngRepeat_filters_missingColon() {
-    addMyController();
-    resolveIndex2(AngularTest.createHtmlWithMyController(r'''
-<li ng-repeat="item in ctrl.items | orderBy:'' true"/>
-</li>'''));
-    assertErrors(indexSource, [AngularCode.MISSING_FORMATTER_COLON]);
-  }
-
-  void fail_ngRepeat_filters_noArgs() {
-    addMyController();
-    _resolveIndexNoErrors(AngularTest.createHtmlWithMyController(r'''
-<li ng-repeat="item in ctrl.items | orderBy"/>
-</li>'''));
-    // filter "orderBy" is resolved
-    Element filterElement = assertResolvedIdentifier("orderBy");
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is AngularFormatterElement,
-        AngularFormatterElement,
-        filterElement);
-  }
-
-  void fail_ngRepeat_filters_orderBy_emptyString() {
-    addMyController();
-    _resolveIndexNoErrors(AngularTest.createHtmlWithMyController(r'''
-<li ng-repeat="item in ctrl.items | orderBy:'':true"/>
-</li>'''));
-    // filter "orderBy" is resolved
-    Element filterElement = assertResolvedIdentifier("orderBy");
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is AngularFormatterElement,
-        AngularFormatterElement,
-        filterElement);
-  }
-
-  void fail_ngRepeat_filters_orderBy_propertyList() {
-    addMyController();
-    _resolveIndexNoErrors(AngularTest.createHtmlWithMyController(r'''
-<li ng-repeat="item in ctrl.items | orderBy:['name', 'done']"/>
-</li>'''));
-    assertResolvedIdentifier2("name'", "String");
-    assertResolvedIdentifier2("done'", "bool");
-  }
-
-  void fail_ngRepeat_filters_orderBy_propertyName() {
-    addMyController();
-    _resolveIndexNoErrors(AngularTest.createHtmlWithMyController(r'''
-<li ng-repeat="item in ctrl.items | orderBy:'name'"/>
-</li>'''));
-    assertResolvedIdentifier2("name'", "String");
-  }
-
-  void fail_ngRepeat_filters_orderBy_propertyName_minus() {
-    addMyController();
-    _resolveIndexNoErrors(AngularTest.createHtmlWithMyController(r'''
-<li ng-repeat="item in ctrl.items | orderBy:'-name'"/>
-</li>'''));
-    assertResolvedIdentifier2("name'", "String");
-  }
-
-  void fail_ngRepeat_filters_orderBy_propertyName_plus() {
-    addMyController();
-    _resolveIndexNoErrors(AngularTest.createHtmlWithMyController(r'''
-<li ng-repeat="item in ctrl.items | orderBy:'+name'"/>
-</li>'''));
-    assertResolvedIdentifier2("name'", "String");
-  }
-
-  void fail_ngRepeat_filters_orderBy_propertyName_untypedItems() {
-    addMyController();
-    _resolveIndexNoErrors(AngularTest.createHtmlWithMyController(r'''
-<li ng-repeat="item in ctrl.untypedItems | orderBy:'name'"/>
-</li>'''));
-    assertResolvedIdentifier2("name'", "dynamic");
-  }
-
-  void fail_ngRepeat_filters_two() {
-    addMyController();
-    _resolveIndexNoErrors(AngularTest.createHtmlWithMyController(r'''
-<li ng-repeat="item in ctrl.items | orderBy:'+' | orderBy:'-'"/>
-</li>'''));
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is AngularFormatterElement,
-        AngularFormatterElement,
-        assertResolvedIdentifier("orderBy:'+'"));
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is AngularFormatterElement,
-        AngularFormatterElement,
-        assertResolvedIdentifier("orderBy:'-'"));
-  }
-
-  void fail_ngRepeat_resolvedExpressions() {
-    addMyController();
-    _resolveIndexNoErrors(AngularTest.createHtmlWithMyController(r'''
-<li ng-repeat='name in ctrl.names'>
-  {{name}}
-</li>'''));
-    assertResolvedIdentifier2("name in", "String");
-    assertResolvedIdentifier2("ctrl.", "MyController");
-    assertResolvedIdentifier2("names'", "List<String>");
-    assertResolvedIdentifier2("name}}", "String");
-  }
-
-  void fail_ngRepeat_trackBy() {
-    addMyController();
-    _resolveIndexNoErrors(AngularTest.createHtmlWithMyController(r'''
-<li ng-repeat='name in ctrl.names track by name.length'/>
-</li>'''));
-    assertResolvedIdentifier2("length'", "int");
-  }
-
-  void test_analysisContext_changeEntryPoint_clearAngularErrors_inDart() {
-    addMainSource(r'''
-
-import 'angular.dart';
-
-@Component(
-    templateUrl: 'no-such-template.html', cssUrl: 'my_styles.css',
-    publishAs: 'ctrl',
-    selector: 'myComponent')
-class MyComponent {
-}''');
-    Source entrySource = contextHelper.addSource(
-        "/entry-point.html",
-        AngularTest.createHtmlWithAngular(''));
-    contextHelper.addSource("/my_styles.css", "");
-    contextHelper.runTasks();
-    // there are some errors in MyComponent
-    {
-      List<AnalysisError> errors = context.getErrors(mainSource).errors;
-      expect(errors.length != 0, isTrue);
-    }
-    // make entry-point.html non-Angular
-    context.setContents(entrySource, "<html/>");
-    // ...errors in MyComponent should be removed
-    {
-      List<AnalysisError> errors = context.getErrors(mainSource).errors;
-      expect(errors.length == 0, isTrue);
-    }
-  }
-
-  void test_analysisContext_changeEntryPoint_clearAngularErrors_inTemplate() {
-    addMainSource(r'''
-
-import 'angular.dart';
-
-@Component(
-    templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
-    publishAs: 'ctrl',
-    selector: 'myComponent')
-class MyComponent {
-}''');
-    Source entrySource = contextHelper.addSource(
-        "/entry-point.html",
-        AngularTest.createHtmlWithAngular(''));
-    addIndexSource2("/my_template.html", r'''
-<div>
-  {{ctrl.noMethod()}}
-</div>''');
-    contextHelper.addSource("/my_styles.css", "");
-    contextHelper.runTasks();
-    // there are some errors in my_template.html
-    {
-      List<AnalysisError> errors = context.getErrors(indexSource).errors;
-      expect(errors.length != 0, isTrue);
-    }
-    // make entry-point.html non-Angular
-    context.setContents(entrySource, "<html/>");
-    // ...errors in my_template.html should be removed
-    {
-      List<AnalysisError> errors = context.getErrors(indexSource).errors;
-      expect(errors.length == 0, isTrue);
-    }
-  }
-
-  void test_analysisContext_removeEntryPoint_clearAngularErrors_inDart() {
-    addMainSource(r'''
-
-import 'angular.dart';
-
-@Component(
-    templateUrl: 'no-such-template.html', cssUrl: 'my_styles.css',
-    publishAs: 'ctrl',
-    selector: 'myComponent')
-class MyComponent {
-}''');
-    Source entrySource = contextHelper.addSource(
-        "/entry-point.html",
-        AngularTest.createHtmlWithAngular(''));
-    contextHelper.addSource("/my_styles.css", "");
-    contextHelper.runTasks();
-    // there are some errors in MyComponent
-    {
-      List<AnalysisError> errors = context.getErrors(mainSource).errors;
-      expect(errors.length != 0, isTrue);
-    }
-    // remove entry-point.html
-    {
-      ChangeSet changeSet = new ChangeSet();
-      changeSet.removedSource(entrySource);
-      context.applyChanges(changeSet);
-    }
-    // ...errors in MyComponent should be removed
-    {
-      List<AnalysisError> errors = context.getErrors(mainSource).errors;
-      expect(errors.length == 0, isTrue);
-    }
-  }
-
-  void test_contextProperties() {
-    addMyController();
-    _resolveIndexNoErrors(AngularTest.createHtmlWithAngular(r'''
-<div>
-  {{$id}}
-  {{$parent}}
-  {{$root}}
-</div>'''));
-    assertResolvedIdentifier("\$id");
-    assertResolvedIdentifier("\$parent");
-    assertResolvedIdentifier("\$root");
-  }
-
-  void test_getAngularElement_isAngular() {
-    // prepare local variable "name" in compilation unit
-    CompilationUnitElementImpl unit =
-        ElementFactory.compilationUnit("test.dart");
-    FunctionElementImpl function = ElementFactory.functionElement("main");
-    unit.functions = <FunctionElement>[function];
-    LocalVariableElementImpl local =
-        ElementFactory.localVariableElement2("name");
-    function.localVariables = <LocalVariableElement>[local];
-    // set AngularElement
-    AngularElement angularElement = new AngularControllerElementImpl("ctrl", 0);
-    local.toolkitObjects = <AngularElement>[angularElement];
-    expect(
-        AngularHtmlUnitResolver.getAngularElement(local),
-        same(angularElement));
-  }
-
-  void test_getAngularElement_notAngular() {
-    Element element = ElementFactory.localVariableElement2("name");
-    expect(AngularHtmlUnitResolver.getAngularElement(element), isNull);
-  }
-
-  void test_getAngularElement_notLocal() {
-    Element element = ElementFactory.classElement2("Test");
-    expect(AngularHtmlUnitResolver.getAngularElement(element), isNull);
-  }
-
-  /**
-   * Test that we resolve "ng-click" expression.
-   */
-  void test_ngClick() {
-    addMyController();
-    _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            r"<button ng-click='ctrl.doSomething($event)'/>"));
-    assertResolvedIdentifier("doSomething");
-  }
-
-  void test_NgComponent_resolveTemplateFile() {
-    addMainSource(r'''
-import 'angular.dart';
-
-@Component(
-    templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
-    publishAs: 'ctrl',
-    selector: 'myComponent')
-class MyComponent {
-  String field;
-}''');
-    contextHelper.addSource(
-        "/entry-point.html",
-        AngularTest.createHtmlWithAngular(''));
-    addIndexSource2("/my_template.html", r'''
-<div>
-  {{ctrl.field}}
-</div>''');
-    contextHelper.addSource("/my_styles.css", "");
-    contextHelper.runTasks();
-    resolveIndex();
-    assertNoErrors();
-    assertResolvedIdentifier2("ctrl.", "MyComponent");
-    assertResolvedIdentifier2("field}}", "String");
-  }
-
-  void test_NgComponent_updateDartFile() {
-    Source componentSource = contextHelper.addSource("/my_component.dart", r'''
-library my.component;
-import 'angular.dart';
-@Component(selector: 'myComponent')
-class MyComponent {
-}''');
-    contextHelper.addSource("/my_module.dart", r'''
-library my.module;
-import 'my_component.dart';''');
-    addMainSource(r'''
-library main;
-import 'my_module.dart';''');
-    _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController("<myComponent/>"));
-    // "myComponent" tag was resolved
-    {
-      ht.XmlTagNode tagNode =
-          ht.HtmlUnitUtils.getTagNode(indexUnit, findOffset2("myComponent"));
-      AngularSelectorElement tagElement =
-          tagNode.element as AngularSelectorElement;
-      expect(tagElement, isNotNull);
-      expect(tagElement.name, "myComponent");
-    }
-    // replace "myComponent" with "myComponent2"
-    // in my_component.dart and index.html
-    {
-      context.setContents(
-          componentSource,
-          _getSourceContent(componentSource).replaceAll("myComponent", "myComponent2"));
-      indexContent =
-          _getSourceContent(indexSource).replaceAll("myComponent", "myComponent2");
-      context.setContents(indexSource, indexContent);
-    }
-    contextHelper.runTasks();
-    resolveIndex();
-    // "myComponent2" tag should be resolved
-    {
-      ht.XmlTagNode tagNode =
-          ht.HtmlUnitUtils.getTagNode(indexUnit, findOffset2("myComponent2"));
-      AngularSelectorElement tagElement =
-          tagNode.element as AngularSelectorElement;
-      expect(tagElement, isNotNull);
-      expect(tagElement.name, "myComponent2");
-    }
-  }
-
-  void test_NgComponent_use_resolveAttributes() {
-    contextHelper.addSource("/my_template.html", r'''
-    <div>
-      {{ctrl.field}}
-    </div>''');
-    addMainSource(r'''
-
-import 'angular.dart';
-
-@Component(
-    templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
-    publishAs: 'ctrl',
-    selector: 'myComponent', // selector
-    map: const {'attrA' : '=>setA', 'attrB' : '@setB'})
-class MyComponent {
-  set setA(value) {}
-  set setB(value) {}
-}''');
-    _resolveIndexNoErrors(AngularTest.createHtmlWithMyController(r'''
-<input type='text' ng-model='someModel'/>
-<myComponent attrA='someModel' attrB='bbb'/>'''));
-    // "attrA" attribute expression was resolved
-    expect(findIdentifier("someModel"), isNotNull);
-    // "myComponent" tag was resolved
-    ht.XmlTagNode tagNode =
-        ht.HtmlUnitUtils.getTagNode(indexUnit, findOffset2("myComponent"));
-    AngularSelectorElement tagElement =
-        tagNode.element as AngularSelectorElement;
-    expect(tagElement, isNotNull);
-    expect(tagElement.name, "myComponent");
-    expect(tagElement.nameOffset, findMainOffset("myComponent', // selector"));
-    // "attrA" attribute was resolved
-    {
-      ht.XmlAttributeNode node =
-          ht.HtmlUnitUtils.getAttributeNode(indexUnit, findOffset2("attrA='"));
-      AngularPropertyElement element = node.element as AngularPropertyElement;
-      expect(element, isNotNull);
-      expect(element.name, "attrA");
-      expect(element.field.name, "setA");
-    }
-    // "attrB" attribute was resolved, even if it @binding
-    {
-      ht.XmlAttributeNode node =
-          ht.HtmlUnitUtils.getAttributeNode(indexUnit, findOffset2("attrB='"));
-      AngularPropertyElement element = node.element as AngularPropertyElement;
-      expect(element, isNotNull);
-      expect(element.name, "attrB");
-      expect(element.field.name, "setB");
-    }
-  }
-
-  void test_NgDirective_noAttribute() {
-    addMainSource(r'''
-
-import 'angular.dart';
-
-@NgDirective(selector: '[my-directive]', map: const {'foo': '=>input'})
-class MyDirective {
-  set input(value) {}
-}''');
-    _resolveIndexNoErrors(AngularTest.createHtmlWithMyController(r'''
-<div my-directive>
-</div>'''));
-  }
-
-  void test_NgDirective_noExpression() {
-    addMainSource(r'''
-
-import 'angular.dart';
-
-@NgDirective(selector: '[my-directive]', map: const {'.': '=>input'})
-class MyDirective {
-  set input(value) {}
-}''');
-    _resolveIndexNoErrors(AngularTest.createHtmlWithMyController(r'''
-<div my-directive>
-</div>'''));
-  }
-
-  void test_NgDirective_resolvedExpression() {
-    addMainSource(r'''
-
-import 'angular.dart';
-
-@Decorator(selector: '[my-directive]')
-class MyDirective {
-  @NgOneWay('my-property')
-  String condition;
-}''');
-    _resolveIndexNoErrors(AngularTest.createHtmlWithMyController(r'''
-<input type='text' ng-model='name'>
-<div my-directive my-property='name != null'>
-</div>'''));
-    resolveMainNoErrors();
-    // "my-directive" attribute was resolved
-    {
-      AngularSelectorElement selector =
-          findMainElement(ElementKind.ANGULAR_SELECTOR, "my-directive");
-      ht.XmlAttributeNode attrNodeSelector =
-          ht.HtmlUnitUtils.getAttributeNode(indexUnit, findOffset2("my-directive"));
-      expect(attrNodeSelector, isNotNull);
-      expect(attrNodeSelector.element, same(selector));
-    }
-    // "my-property" attribute was resolved
-    {
-      ht.XmlAttributeNode attrNodeProperty =
-          ht.HtmlUnitUtils.getAttributeNode(indexUnit, findOffset2("my-property='"));
-      AngularPropertyElement propertyElement =
-          attrNodeProperty.element as AngularPropertyElement;
-      expect(propertyElement, isNotNull);
-      expect(propertyElement.propertyKind, same(AngularPropertyKind.ONE_WAY));
-      expect(propertyElement.field.name, "condition");
-    }
-    // "name" expression was resolved
-    expect(findIdentifier("name != null"), isNotNull);
-  }
-
-  void test_NgDirective_resolvedExpression_attrString() {
-    addMainSource(r'''
-
-import 'angular.dart';
-
-@NgDirective(selector: '[my-directive])
-class MyDirective {
-  @NgAttr('my-property')
-  String property;
-}''');
-    _resolveIndexNoErrors(AngularTest.createHtmlWithMyController(r'''
-<input type='text' ng-model='name'>
-<div my-directive my-property='name != null'>
-</div>'''));
-    resolveMain();
-    // @NgAttr means "string attribute", which we don't parse
-    expect(findIdentifierMaybe("name != null"), isNull);
-  }
-
-  void test_NgDirective_resolvedExpression_dotAsName() {
-    addMainSource(r'''
-
-import 'angular.dart';
-
-@Decorator(
-    selector: '[my-directive]',
-    map: const {'.' : '=>condition'})
-class MyDirective {
-  set condition(value) {}
-}''');
-    _resolveIndexNoErrors(AngularTest.createHtmlWithMyController(r'''
-<input type='text' ng-model='name'>
-<div my-directive='name != null'>
-</div>'''));
-    // "name" attribute was resolved
-    expect(findIdentifier("name != null"), isNotNull);
-  }
-
-  /**
-   * Test that we resolve "ng-if" expression.
-   */
-  void test_ngIf() {
-    addMyController();
-    _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController("<div ng-if='ctrl.field != null'/>"));
-    assertResolvedIdentifier("field");
-  }
-
-  void test_ngModel_modelAfterUsage() {
-    addMyController();
-    _resolveIndexNoErrors(AngularTest.createHtmlWithMyController(r'''
-<h3>Hello {{name}}!</h3>
-<input type='text' ng-model='name'>'''));
-    assertResolvedIdentifier2("name}}!", "String");
-    assertResolvedIdentifier2("name'>", "String");
-  }
-
-  void test_ngModel_modelBeforeUsage() {
-    addMyController();
-    _resolveIndexNoErrors(AngularTest.createHtmlWithMyController(r'''
-<input type='text' ng-model='name'>
-<h3>Hello {{name}}!</h3>'''));
-    assertResolvedIdentifier2("name}}!", "String");
-    Element element = assertResolvedIdentifier2("name'>", "String");
-    expect(element.name, "name");
-    expect(element.nameOffset, findOffset2("name'>"));
-  }
-
-  void test_ngModel_notIdentifier() {
-    addMyController();
-    _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            "<input type='text' ng-model='ctrl.field'>"));
-    assertResolvedIdentifier2("field'>", "String");
-  }
-
-  /**
-   * Test that we resolve "ng-mouseout" expression.
-   */
-  void test_ngMouseOut() {
-    addMyController();
-    _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            r"<button ng-mouseout='ctrl.doSomething($event)'/>"));
-    assertResolvedIdentifier("doSomething");
-  }
-
-  /**
-   * Test that we resolve "ng-show" expression.
-   */
-  void test_ngShow() {
-    addMyController();
-    _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController("<div ng-show='ctrl.field != null'/>"));
-    assertResolvedIdentifier("field");
-  }
-
-  void test_notResolved_noDartScript() {
-    resolveIndex2(r'''
-<html ng-app>
-  <body>
-    <div my-marker>
-      {{ctrl.field}}
-    </div>
-  </body>
-</html>''');
-    assertNoErrors();
-    // Angular is not initialized, so "ctrl" is not parsed
-    Expression expression =
-        ht.HtmlUnitUtils.getExpression(indexUnit, findOffset2("ctrl"));
-    expect(expression, isNull);
-  }
-
-  void test_notResolved_notAngular() {
-    resolveIndex2(r'''
-<html no-ng-app>
-  <body>
-    <div my-marker>
-      {{ctrl.field}}
-    </div>
-  </body>
-</html>''');
-    assertNoErrors();
-    // Angular is not initialized, so "ctrl" is not parsed
-    Expression expression =
-        ht.HtmlUnitUtils.getExpression(indexUnit, findOffset2("ctrl"));
-    expect(expression, isNull);
-  }
-
-  void test_notResolved_wrongControllerMarker() {
-    addMyController();
-    addIndexSource(r'''
-<html ng-app>
-  <body>
-    <div not-my-marker>
-      {{ctrl.field}}
-    </div>
-    <script type='application/dart' src='main.dart'></script>
-  </body>
-</html>''');
-    contextHelper.runTasks();
-    resolveIndex();
-    // no errors, because we decided to ignore them at the moment
-    assertNoErrors();
-    // "ctrl" is not resolved
-    SimpleIdentifier identifier = findIdentifier("ctrl");
-    expect(identifier.bestElement, isNull);
-  }
-
-  void test_resolveExpression_evenWithout_ngBootstrap() {
-    resolveMainSource(r'''
-
-import 'angular.dart';
-
-@Controller(
-    selector: '[my-controller]',
-    publishAs: 'ctrl')
-class MyController {
-  String field;
-}''');
-    _resolveIndexNoErrors(r'''
-<html ng-app>
-  <body>
-    <div my-controller>
-      {{ctrl.field}}
-    </div>
-    <script type='application/dart' src='main.dart'></script>
-  </body>
-</html>''');
-    assertResolvedIdentifier2("ctrl.", "MyController");
-  }
-
-  void test_resolveExpression_ignoreUnresolved() {
-    resolveMainSource(r'''
-
-import 'angular.dart';
-
-@Controller(
-    selector: '[my-controller]',
-    publishAs: 'ctrl')
-class MyController {
-  Map map;
-  Object obj;
-}''');
-    resolveIndex2(r'''
-<html ng-app>
-  <body>
-    <div my-controller>
-      {{ctrl.map.property}}
-      {{ctrl.obj.property}}
-      {{invisibleScopeProperty}}
-    </div>
-    <script type='application/dart' src='main.dart'></script>
-  </body>
-</html>''');
-    assertNoErrors();
-    // "ctrl.map" and "ctrl.obj" are resolved
-    assertResolvedIdentifier2("map", "Map<dynamic, dynamic>");
-    assertResolvedIdentifier2("obj", "Object");
-    // ...but not "invisibleScopeProperty"
-    {
-      SimpleIdentifier identifier = findIdentifier("invisibleScopeProperty");
-      expect(identifier.bestElement, isNull);
-    }
-  }
-
-  void test_resolveExpression_inAttribute() {
-    addMyController();
-    _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            "<button title='{{ctrl.field}}'></button>"));
-    assertResolvedIdentifier2("ctrl", "MyController");
-  }
-
-  void test_resolveExpression_ngApp_onBody() {
-    addMyController();
-    _resolveIndexNoErrors(r'''
-<html>
-  <body ng-app>
-    <div my-controller>
-      {{ctrl.field}}
-    </div>
-    <script type='application/dart' src='main.dart'></script>
-  </body>
-</html>''');
-    assertResolvedIdentifier2("ctrl", "MyController");
-  }
-
-  void test_resolveExpression_withFormatter() {
-    addMyController();
-    _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController("{{ctrl.field | uppercase}}"));
-    assertResolvedIdentifier2("ctrl", "MyController");
-    assertResolvedIdentifier("uppercase");
-  }
-
-  void test_resolveExpression_withFormatter_missingColon() {
-    addMyController();
-    resolveIndex2(
-        AngularTest.createHtmlWithMyController(
-            "{{ctrl.field | uppercase, lowercase}}"));
-    assertErrors(indexSource, [AngularCode.MISSING_FORMATTER_COLON]);
-  }
-
-  void test_resolveExpression_withFormatter_notSimpleIdentifier() {
-    addMyController();
-    resolveIndex2(
-        AngularTest.createHtmlWithMyController("{{ctrl.field | not.supported}}"));
-    assertErrors(indexSource, [AngularCode.INVALID_FORMATTER_NAME]);
-  }
-
-  void test_scopeProperties() {
-    addMainSource(r'''
-
-import 'angular.dart';
-
-@Component(
-    templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
-    publishAs: 'ctrl',
-    selector: 'myComponent')
-class MyComponent {
-  String field;
-  MyComponent(Scope scope) {
-    scope.context['scopeProperty'] = 'abc';
-  }
-}
-''');
-    contextHelper.addSource(
-        "/entry-point.html",
-        AngularTest.createHtmlWithAngular(''));
-    addIndexSource2("/my_template.html", r'''
-<div>
-  {{scopeProperty}}
-</div>''');
-    contextHelper.addSource("/my_styles.css", "");
-    contextHelper.runTasks();
-    resolveIndex();
-    assertNoErrors();
-    // "scopeProperty" is resolved
-    Element element = assertResolvedIdentifier2("scopeProperty}}", "String");
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is AngularScopePropertyElement,
-        AngularScopePropertyElement,
-        AngularHtmlUnitResolver.getAngularElement(element));
-  }
-
-  void test_scopeProperties_hideWithComponent() {
-    addMainSource(r'''
-
-import 'angular.dart';
-
-@Component(
-    templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
-    publishAs: 'ctrl',
-    selector: 'myComponent')
-class MyComponent {
-}
-
-void setScopeProperties(Scope scope) {
-  scope.context['ctrl'] = 1;
-}
-''');
-    contextHelper.addSource(
-        "/entry-point.html",
-        AngularTest.createHtmlWithAngular(''));
-    addIndexSource2("/my_template.html", r'''
-<div>
-  {{ctrl}}
-</div>''');
-    contextHelper.addSource("/my_styles.css", "");
-    contextHelper.runTasks();
-    resolveIndex();
-    assertNoErrors();
-    // "ctrl" is resolved
-    LocalVariableElement element =
-        assertResolvedIdentifier("ctrl}}") as LocalVariableElement;
-    List<ToolkitObjectElement> toolkitObjects = element.toolkitObjects;
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is AngularComponentElement,
-        AngularComponentElement,
-        toolkitObjects[0]);
-  }
-
-  void test_view_resolveTemplateFile() {
-    addMainSource(r'''
-
-import 'angular.dart';
-
-@Controller(
-    selector: '[my-controller]',
-    publishAs: 'ctrl')
-class MyController {
-  String field;
-}
-
-class MyRouteInitializer {
-  init(ViewFactory view) {
-    view('my_template.html');
-  }
-}''');
-    contextHelper.addSource(
-        "/entry-point.html",
-        AngularTest.createHtmlWithAngular(''));
-    addIndexSource2("/my_template.html", r'''
-<div my-controller>
-  {{ctrl.field}}
-</div>''');
-    contextHelper.addSource("/my_styles.css", "");
-    contextHelper.runTasks();
-    resolveIndex();
-    assertNoErrors();
-    assertResolvedIdentifier2("ctrl.", "MyController");
-    assertResolvedIdentifier2("field}}", "String");
-  }
-
-  String _getSourceContent(Source source) {
-    return context.getContents(source).data.toString();
-  }
-
-  void _resolveIndexNoErrors(String content) {
-    resolveIndex2(content);
-    assertNoErrors();
-    verify([indexSource]);
-  }
-}
-
-
-/**
- * Tests for [HtmlUnitUtils] for Angular HTMLs.
- */
-@ReflectiveTestCase()
-class AngularHtmlUnitUtilsTest extends AngularTest {
-  void test_getElement_forExpression() {
-    addMyController();
-    _resolveSimpleCtrlFieldHtml();
-    // prepare expression
-    int offset = indexContent.indexOf("ctrl");
-    Expression expression = ht.HtmlUnitUtils.getExpression(indexUnit, offset);
-    // get element
-    Element element = ht.HtmlUnitUtils.getElement(expression);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is VariableElement,
-        VariableElement,
-        element);
-    expect(element.name, "ctrl");
-  }
-
-  void test_getElement_forExpression_null() {
-    Element element = ht.HtmlUnitUtils.getElement(null);
-    expect(element, isNull);
-  }
-
-  void test_getElement_forOffset() {
-    addMyController();
-    _resolveSimpleCtrlFieldHtml();
-    // no expression
-    {
-      Element element = ht.HtmlUnitUtils.getElementAtOffset(indexUnit, 0);
-      expect(element, isNull);
-    }
-    // has expression at offset
-    {
-      int offset = indexContent.indexOf("field");
-      Element element = ht.HtmlUnitUtils.getElementAtOffset(indexUnit, offset);
-      EngineTestCase.assertInstanceOf(
-          (obj) => obj is PropertyAccessorElement,
-          PropertyAccessorElement,
-          element);
-      expect(element.name, "field");
-    }
-  }
-
-  void test_getElementToOpen_controller() {
-    addMyController();
-    _resolveSimpleCtrlFieldHtml();
-    // prepare expression
-    int offset = indexContent.indexOf("ctrl");
-    Expression expression = ht.HtmlUnitUtils.getExpression(indexUnit, offset);
-    // get element
-    Element element = ht.HtmlUnitUtils.getElementToOpen(indexUnit, expression);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is AngularControllerElement,
-        AngularControllerElement,
-        element);
-    expect(element.name, "ctrl");
-  }
-
-  void test_getElementToOpen_field() {
-    addMyController();
-    _resolveSimpleCtrlFieldHtml();
-    // prepare expression
-    int offset = indexContent.indexOf("field");
-    Expression expression = ht.HtmlUnitUtils.getExpression(indexUnit, offset);
-    // get element
-    Element element = ht.HtmlUnitUtils.getElementToOpen(indexUnit, expression);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is PropertyAccessorElement,
-        PropertyAccessorElement,
-        element);
-    expect(element.name, "field");
-  }
-
-  void test_getEnclosingTagNode() {
-    resolveIndex2(r'''
-<html>
-  <body ng-app>
-    <badge name='abc'> 123 </badge>
-  </body>
-</html>''');
-    // no unit
-    expect(ht.HtmlUnitUtils.getEnclosingTagNode(null, 0), isNull);
-    // wrong offset
-    expect(ht.HtmlUnitUtils.getEnclosingTagNode(indexUnit, -1), isNull);
-    // valid offset
-    ht.XmlTagNode expected = _getEnclosingTagNode("<badge");
-    expect(expected, isNotNull);
-    expect(expected.tag, "badge");
-    expect(_getEnclosingTagNode("badge"), same(expected));
-    expect(_getEnclosingTagNode("name="), same(expected));
-    expect(_getEnclosingTagNode("123"), same(expected));
-    expect(_getEnclosingTagNode("/badge"), same(expected));
-  }
-
-  void test_getExpression() {
-    addMyController();
-    _resolveSimpleCtrlFieldHtml();
-    // try offset without expression
-    expect(ht.HtmlUnitUtils.getExpression(indexUnit, 0), isNull);
-    // try offset with expression
-    int offset = indexContent.indexOf("ctrl");
-    expect(ht.HtmlUnitUtils.getExpression(indexUnit, offset), isNotNull);
-    expect(ht.HtmlUnitUtils.getExpression(indexUnit, offset + 1), isNotNull);
-    expect(ht.HtmlUnitUtils.getExpression(indexUnit, offset + 2), isNotNull);
-    expect(
-        ht.HtmlUnitUtils.getExpression(indexUnit, offset + "ctrl.field".length),
-        isNotNull);
-    // try without unit
-    expect(ht.HtmlUnitUtils.getExpression(null, offset), isNull);
-  }
-
-  void test_getTagNode() {
-    resolveIndex2(r'''
-<html>
-  <body ng-app>
-    <badge name='abc'> 123 </badge> done
-  </body>
-</html>''');
-    // no unit
-    expect(ht.HtmlUnitUtils.getTagNode(null, 0), isNull);
-    // wrong offset
-    expect(ht.HtmlUnitUtils.getTagNode(indexUnit, -1), isNull);
-    // on tag name
-    ht.XmlTagNode expected = _getTagNode("badge name=");
-    expect(expected, isNotNull);
-    expect(expected.tag, "badge");
-    expect(_getTagNode("badge"), same(expected));
-    expect(_getTagNode(" name="), same(expected));
-    expect(_getTagNode("adge name="), same(expected));
-    expect(_getTagNode("badge>"), same(expected));
-    expect(_getTagNode("adge>"), same(expected));
-    expect(_getTagNode("> done"), same(expected));
-    // in tag node, but not on the name token
-    expect(_getTagNode("name="), isNull);
-    expect(_getTagNode("123"), isNull);
-  }
-
-  ht.XmlTagNode _getEnclosingTagNode(String search) {
-    return ht.HtmlUnitUtils.getEnclosingTagNode(
-        indexUnit,
-        indexContent.indexOf(search));
-  }
-
-  ht.XmlTagNode _getTagNode(String search) {
-    return ht.HtmlUnitUtils.getTagNode(indexUnit, indexContent.indexOf(search));
-  }
-
-  void _resolveSimpleCtrlFieldHtml() {
-    resolveIndex2(r'''
-<html>
-  <body ng-app>
-    <div my-controller>
-      {{ctrl.field}}
-    </div>
-    <script type='application/dart' src='main.dart'></script>
-  </body>
-</html>''');
-  }
-}
-
-
-abstract class AngularTest extends EngineTestCase {
-  AnalysisContextHelper contextHelper = new AnalysisContextHelper();
-
-  AnalysisContext context;
-
-  String mainContent;
-
-  Source mainSource;
-
-  CompilationUnit mainUnit;
-
-  CompilationUnitElement mainUnitElement;
-  String indexContent;
-  Source indexSource;
-  ht.HtmlUnit indexUnit;
-  HtmlElement indexHtmlUnit;
-  CompilationUnitElement indexDartUnitElement;
-  /**
-   * Fills [indexContent] and [indexSource].
-   */
-  void addIndexSource(String content) {
-    addIndexSource2("/index.html", content);
-  }
-  /**
-   * Fills [indexContent] and [indexSource].
-   */
-  void addIndexSource2(String name, String content) {
-    indexContent = content;
-    indexSource = contextHelper.addSource(name, indexContent);
-  }
-  /**
-   * Fills [mainContent] and [mainSource].
-   */
-  void addMainSource(String content) {
-    mainContent = content;
-    mainSource = contextHelper.addSource("/main.dart", content);
-  }
-  void addMyController() {
-    resolveMainSource(r'''
-
-import 'angular.dart';
-
-class Item {
-  String name;
-  bool done;
-}
-
-@Controller(
-    selector: '[my-controller]',
-    publishAs: 'ctrl')
-class MyController {
-  String field;
-  List<String> names;
-  List<Item> items;
-  var untypedItems;
-  doSomething(event) {}
-}''');
-  }
-  /**
-   * Assert that the number of errors reported against the given source matches the number of errors
-   * that are given and that they have the expected error codes. The order in which the errors were
-   * gathered is ignored.
-   *
-   * @param source the source against which the errors should have been reported
-   * @param expectedErrorCodes the error codes of the errors that should have been reported
-   * @throws AnalysisException if the reported errors could not be computed
-   * @throws AssertionFailedError if a different number of errors have been reported than were
-   *           expected
-   */
-  void assertErrors(Source source, [List<ErrorCode> expectedErrorCodes =
-      ErrorCode.EMPTY_LIST]) {
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    AnalysisErrorInfo errorsInfo = context.getErrors(source);
-    for (AnalysisError error in errorsInfo.errors) {
-      errorListener.onError(error);
-    }
-    errorListener.assertErrorsWithCodes(expectedErrorCodes);
-  }
-
-  void assertMainErrors(List<ErrorCode> expectedErrorCodes) {
-    assertErrors(mainSource, expectedErrorCodes);
-  }
-
-  /**
-   * Assert that no errors have been reported against the [indexSource].
-   */
-  void assertNoErrors() {
-    assertErrors(indexSource);
-  }
-
-  void assertNoErrors2(Source source) {
-    assertErrors(source);
-  }
-
-  /**
-   * Assert that no errors have been reported against the [mainSource].
-   */
-  void assertNoMainErrors() {
-    assertErrors(mainSource);
-  }
-
-  /**
-   * Checks that [indexHtmlUnit] has [SimpleIdentifier] with given name, resolved to
-   * not `null` [Element].
-   */
-  Element assertResolvedIdentifier(String name) {
-    SimpleIdentifier identifier = findIdentifier(name);
-    // check Element
-    Element element = identifier.bestElement;
-    expect(element, isNotNull);
-    // return Element for further analysis
-    return element;
-  }
-
-  Element assertResolvedIdentifier2(String name, String expectedTypeName) {
-    SimpleIdentifier identifier = findIdentifier(name);
-    // check Element
-    Element element = identifier.bestElement;
-    expect(element, isNotNull);
-    // check Type
-    DartType type = identifier.bestType;
-    expect(type, isNotNull);
-    expect(type.toString(), expectedTypeName);
-    // return Element for further analysis
-    return element;
-  }
-
-  /**
-   * @return [AstNode] which has required offset and type.
-   */
-  AstNode findExpression(int offset, Predicate<AstNode> predicate) {
-    Expression expression = ht.HtmlUnitUtils.getExpression(indexUnit, offset);
-    return expression != null ? expression.getAncestor(predicate) : null;
-  }
-
-  /**
-   * Returns the [SimpleIdentifier] at the given search pattern. Fails if not found.
-   */
-  SimpleIdentifier findIdentifier(String search) {
-    SimpleIdentifier identifier = findIdentifierMaybe(search);
-    expect(identifier, isNotNull, reason: "$search in $indexContent");
-    // check that offset/length of the identifier is valid
-    {
-      int offset = identifier.offset;
-      int end = identifier.end;
-      String contentStr = indexContent.substring(offset, end);
-      expect(contentStr, identifier.name);
-    }
-    // done
-    return identifier;
-  }
-
-  /**
-   * Returns the [SimpleIdentifier] at the given search pattern, or `null` if not found.
-   */
-  SimpleIdentifier findIdentifierMaybe(String search) {
-    return findExpression(
-        findOffset2(search),
-        (node) => node is SimpleIdentifier);
-  }
-
-  /**
-   * Returns [Element] from [indexDartUnitElement].
-   */
-  Element findIndexElement(String name) {
-    return findElement2(indexDartUnitElement, name);
-  }
-
-  /**
-   * Returns [Element] from [mainUnitElement].
-   */
-  Element findMainElement(ElementKind kind, String name) {
-    return findElement(mainUnitElement, kind, name);
-  }
-
-  /**
-   * Returns [Element] from [mainUnitElement].
-   */
-  Element findMainElement2(String name) => findElement2(mainUnitElement, name);
-
-  /**
-   * @return the offset of given <code>search</code> string in [mainContent]. Fails test if
-   *         not found.
-   */
-  int findMainOffset(String search) => findOffset(mainContent, search);
-
-  /**
-   * @return the offset of given <code>search</code> string in [indexContent]. Fails test if
-   *         not found.
-   */
-  int findOffset2(String search) => findOffset(indexContent, search);
-
-  /**
-   * Resolves [indexSource].
-   */
-  void resolveIndex() {
-    indexUnit = context.resolveHtmlUnit(indexSource);
-    indexHtmlUnit = indexUnit.element;
-    indexDartUnitElement = indexHtmlUnit.angularCompilationUnit;
-  }
-
-  void resolveIndex2(String content) {
-    addIndexSource(content);
-    contextHelper.runTasks();
-    resolveIndex();
-  }
-
-  /**
-   * Resolves [mainSource].
-   */
-  void resolveMain() {
-    mainUnit = contextHelper.resolveDefiningUnit(mainSource);
-    mainUnitElement = mainUnit.element;
-  }
-
-  /**
-   * Resolves [mainSource].
-   */
-  void resolveMainNoErrors() {
-    resolveMain();
-    assertNoErrors2(mainSource);
-  }
-
-  void resolveMainSource(String content) {
-    addMainSource(content);
-    resolveMain();
-  }
-
-  void resolveMainSourceNoErrors(String content) {
-    resolveMainSource(content);
-    assertNoErrors2(mainSource);
-  }
-
-  @override
-  void setUp() {
-    super.setUp();
-    _configureForAngular(contextHelper);
-    context = contextHelper.context;
-  }
-
-  @override
-  void tearDown() {
-    contextHelper = null;
-    context = null;
-    // main
-    mainContent = null;
-    mainSource = null;
-    mainUnit = null;
-    mainUnitElement = null;
-    // index
-    indexContent = null;
-    indexSource = null;
-    indexUnit = null;
-    indexHtmlUnit = null;
-    indexDartUnitElement = null;
-    // super
-    super.tearDown();
-  }
-
-  /**
-   * Verify that all of the identifiers in the HTML units associated with the given sources have
-   * been resolved.
-   *
-   * @param sources the sources identifying the compilation units to be verified
-   * @throws Exception if the contents of the compilation unit cannot be accessed
-   */
-  void verify(List<Source> sources) {
-    ResolutionVerifier verifier = new ResolutionVerifier();
-    for (Source source in sources) {
-      ht.HtmlUnit htmlUnit = context.getResolvedHtmlUnit(source);
-      htmlUnit.accept(new ExpressionVisitor_AngularTest_verify(verifier));
-    }
-    verifier.assertResolved();
-  }
-
-  void _configureForAngular(AnalysisContextHelper contextHelper) {
-    contextHelper.addSource("/angular.dart", r'''
-library angular;
-
-class Scope {
-  Map context;
-}
-
-class Formatter {
-  final String name;
-  const Formatter({this.name});
-}
-
-class Directive {
-  const Directive({
-    selector,
-    children,
-    visibility,
-    module,
-    map,
-    exportedExpressions,
-    exportedExpressionAttrs
-  });
-}
-
-class Decorator {
-  const Decorator({
-    children/*: Directive.COMPILE_CHILDREN*/,
-    map,
-    selector,
-    module,
-    visibility,
-    exportedExpressions,
-    exportedExpressionAttrs
-  });
-}
-
-class Controller {
-  const Controller({
-    children,
-    publishAs,
-    map,
-    selector,
-    visibility,
-    publishTypes,
-    exportedExpressions,
-    exportedExpressionAttrs
-  });
-}
-
-class NgAttr {
-  const NgAttr(String name);
-}
-class NgCallback {
-  const NgCallback(String name);
-}
-class NgOneWay {
-  const NgOneWay(String name);
-}
-class NgOneWayOneTime {
-  const NgOneWayOneTime(String name);
-}
-class NgTwoWay {
-  const NgTwoWay(String name);
-}
-
-class Component extends Directive {
-  const Component({
-    this.template,
-    this.templateUrl,
-    this.cssUrl,
-    this.applyAuthorStyles,
-    this.resetStyleInheritance,
-    publishAs,
-    module,
-    map,
-    selector,
-    visibility,
-    exportExpressions,
-    exportExpressionAttrs
-  }) : super(selector: selector,
-             children: null/*NgAnnotation.COMPILE_CHILDREN*/,
-             visibility: visibility,
-             map: map,
-             module: module,
-             exportExpressions: exportExpressions,
-             exportExpressionAttrs: exportExpressionAttrs);
-}
-
-@Decorator(selector: '[ng-click]', map: const {'ng-click': '&onEvent'})
-@Decorator(selector: '[ng-mouseout]', map: const {'ng-mouseout': '&onEvent'})
-class NgEventDirective {
-  set onEvent(value) {}
-}
-
-@Decorator(selector: '[ng-if]', map: const {'ng-if': '=>condition'})
-class NgIfDirective {
-  set condition(value) {}
-}
-
-@Decorator(selector: '[ng-show]', map: const {'ng-show': '=>show'})
-class NgShowDirective {
-  set show(value) {}
-}
-
-@Formatter(name: 'filter')
-class FilterFormatter {}
-
-@Formatter(name: 'orderBy')
-class OrderByFilter {}
-
-@Formatter(name: 'uppercase')
-class UppercaseFilter {}
-
-class ViewFactory {
-  call(String templateUrl) => null;
-}
-
-class Module {
-  install(Module m) {}
-  type(Type t) {}
-  value(Type t, value) {}
-}
-
-class Injector {}
-
-Injector ngBootstrap({
-        Module module: null,
-        List<Module> modules: null,
-        /*dom.Element*/ element: null,
-        String selector: '[ng-app]',
-        /*Injector*/ injectorFactory/*(List<Module> modules): _defaultInjectorFactory*/}) {}
-''');
-  }
-
-  /**
-   * Creates an HTML content that has Angular marker and script with
-   * the "main.dart" reference.
-   */
-  static String createHtmlWithAngular(String innerCode) {
-    String source = '''
-<html ng-app>
-  <body>
-$innerCode
-    <script type='application/dart' src='main.dart'></script>
-  </body>
-</html>''';
-    return source;
-  }
-
-  /**
-   * Creates an HTML content that has Angular marker, script with "main.dart" reference and
-   * "MyController" injected.
-   */
-  static String createHtmlWithMyController(String innerHtml) {
-    String source = '''
-<html ng-app>
-  <body>
-    <div my-controller>
-$innerHtml
-    </div>
-    <script type='application/dart' src='main.dart'></script>
-  </body>
-</html>''';
-    return source;
-  }
-
-  /**
-   * Finds an [Element] with the given names inside of the given root [Element].
-   *
-   * TODO(scheglov) maybe move this method to Element
-   *
-   * @param root the root [Element] to start searching from
-   * @param kind the kind of the [Element] to find, if `null` then any kind
-   * @param name the name of an [Element] to find
-   * @return the found [Element] or `null` if not found
-   */
-  static Element findElement(Element root, ElementKind kind, String name) {
-    _AngularTest_findElement visitor = new _AngularTest_findElement(kind, name);
-    root.accept(visitor);
-    return visitor.result;
-  }
-
-  /**
-   * Finds an [Element] with the given names inside of the given root [Element].
-   *
-   * @param root the root [Element] to start searching from
-   * @param name the name of an [Element] to find
-   * @return the found [Element] or `null` if not found
-   */
-  static Element findElement2(Element root, String name) {
-    return findElement(root, null, name);
-  }
-
-  /**
-   * @return the offset of given <code>search</code> string in <code>content</code>. Fails test if
-   *         not found.
-   */
-  static int findOffset(String content, String search) {
-    int offset = content.indexOf(search);
-    expect(offset, isNot(-1));
-    return offset;
-  }
-}
-
-
-@ReflectiveTestCase()
+@reflectiveTest
 class ConstantEvaluatorTest extends ResolverTestCase {
   void fail_constructor() {
     EvaluationResult result = _getExpressionValue("?");
@@ -3380,7 +835,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ConstantFinderTest extends EngineTestCase {
   AstNode _node;
 
@@ -3516,7 +971,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ConstantValueComputerTest extends ResolverTestCase {
   void test_annotation_constConstructor() {
     CompilationUnit compilationUnit = resolveSource(r'''
@@ -4750,7 +2205,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ConstantVisitorTest extends ResolverTestCase {
   void test_visitConditionalExpression_false() {
     Expression thenExpression = AstFactory.integer(1);
@@ -4922,7 +2377,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ContentCacheTest {
   void test_setContents() {
     Source source = new TestSource();
@@ -4942,7 +2397,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class DartObjectImplTest extends EngineTestCase {
   TypeProvider _typeProvider = new TestTypeProvider();
 
@@ -7191,7 +4646,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class DartUriResolverTest {
   void test_creation() {
     JavaFile sdkDirectory = DirectoryBasedDartSdk.defaultSdkDirectory;
@@ -7237,7 +4692,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class DeclaredVariablesTest extends EngineTestCase {
   void test_getBool_false() {
     TestTypeProvider typeProvider = new TestTypeProvider();
@@ -7339,7 +4794,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class DirectoryBasedDartSdkTest {
   void fail_getDocFileFor() {
     DirectoryBasedDartSdk sdk = _createDartSdk();
@@ -7452,7 +4907,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class DirectoryBasedSourceContainerTest {
   void test_contains() {
     JavaFile dir = FileUtilities2.createFile("/does/not/exist");
@@ -7472,7 +4927,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ElementBuilderTest extends EngineTestCase {
   void test_visitCatchClause() {
     ElementHolder holder = new ElementHolder();
@@ -8729,7 +6184,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ElementLocatorTest extends ResolverTestCase {
   void fail_locate_ExportDirective() {
     AstNode id = _findNodeIn("export", "export 'dart:core';");
@@ -9200,7 +6655,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class EnumMemberBuilderTest extends EngineTestCase {
   void test_visitEnumDeclaration_multiple() {
     String firstName = "ONE";
@@ -9283,7 +6738,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ErrorReporterTest extends EngineTestCase {
   /**
    * Create a type with the given name in a compilation unit with the given name.
@@ -9336,7 +6791,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ErrorSeverityTest extends EngineTestCase {
   void test_max_error_error() {
     expect(
@@ -9394,7 +6849,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ExitDetectorTest extends ParserTestCase {
   void fail_doStatement_continue_with_label() {
     _assertFalse("{ x: do { continue x; } while(true); }");
@@ -9884,19 +7339,7 @@
 }
 
 
-class ExpressionVisitor_AngularTest_verify extends ExpressionVisitor {
-  ResolutionVerifier verifier;
-
-  ExpressionVisitor_AngularTest_verify(this.verifier);
-
-  @override
-  void visitExpression(Expression expression) {
-    expression.accept(verifier);
-  }
-}
-
-
-@ReflectiveTestCase()
+@reflectiveTest
 class FileBasedSourceTest {
   void test_equals_false_differentFiles() {
     JavaFile file1 = FileUtilities2.createFile("/does/not/exist1.dart");
@@ -10113,7 +7556,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class FileUriResolverTest {
   void test_creation() {
     expect(new FileUriResolver(), isNotNull);
@@ -10138,7 +7581,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class HtmlParserTest extends EngineTestCase {
   /**
    * The name of the 'script' tag in an HTML file.
@@ -10322,7 +7765,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class HtmlTagInfoBuilderTest extends HtmlParserTest {
   void test_builder() {
     HtmlTagInfoBuilder builder = new HtmlTagInfoBuilder();
@@ -10346,7 +7789,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class HtmlUnitBuilderTest extends EngineTestCase {
   AnalysisContextImpl _context;
   @override
@@ -10484,7 +7927,7 @@
 /**
  * Instances of the class `HtmlWarningCodeTest` test the generation of HTML warning codes.
  */
-@ReflectiveTestCase()
+@reflectiveTest
 class HtmlWarningCodeTest extends EngineTestCase {
   /**
    * The source factory used to create the sources to be resolved.
@@ -10595,7 +8038,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ReferenceFinderTest extends EngineTestCase {
   DirectedGraph<AstNode> _referenceGraph;
   Map<VariableElement, VariableDeclaration> _variableDeclarationMap;
@@ -10758,7 +8201,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class SDKLibrariesReaderTest extends EngineTestCase {
   void test_readFrom_dart2js() {
     LibraryMap libraryMap = new SdkLibrariesReader(
@@ -10830,7 +8273,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class SourceFactoryTest {
   void test_creation() {
     expect(new SourceFactory([]), isNotNull);
@@ -10898,7 +8341,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class StringScannerTest extends AbstractScannerTest {
   @override
   ht.AbstractScanner newScanner(String input) {
@@ -10910,7 +8353,7 @@
 /**
  * Instances of the class `ToSourceVisitorTest`
  */
-@ReflectiveTestCase()
+@reflectiveTest
 class ToSourceVisitorTest extends EngineTestCase {
   void fail_visitHtmlScriptTagNode_attributes_content() {
     _assertSource(
@@ -10965,7 +8408,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class UriKindTest {
   void test_fromEncoding() {
     expect(UriKind.fromEncoding(0x64), same(UriKind.DART_URI));
@@ -11343,25 +8786,6 @@
 }
 
 
-class _AngularTest_findElement extends GeneralizingElementVisitor<Object> {
-  final ElementKind kind;
-
-  final String name;
-
-  Element result;
-
-  _AngularTest_findElement(this.kind, this.name);
-
-  @override
-  Object visitElement(Element element) {
-    if ((kind == null || element.kind == kind) && name == element.name) {
-      result = element;
-    }
-    return super.visitElement(element);
-  }
-}
-
-
 class _ExpectedScript {
   String _expectedExternalScriptName;
   HtmlUnitBuilderTest_ExpectedLibrary _expectedLibrary;
diff --git a/pkg/analyzer/test/generated/ast_test.dart b/pkg/analyzer/test/generated/ast_test.dart
index 6e5127e..3bfa906 100644
--- a/pkg/analyzer/test/generated/ast_test.dart
+++ b/pkg/analyzer/test/generated/ast_test.dart
@@ -95,7 +95,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class BreadthFirstVisitorTest extends ParserTestCase {
   void test_it() {
     String source = r'''
@@ -147,7 +147,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ClassDeclarationTest extends ParserTestCase {
   void test_getConstructor() {
     List<ConstructorInitializer> initializers =
@@ -246,7 +246,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ClassTypeAliasTest extends ParserTestCase {
   void test_isAbstract() {
     expect(
@@ -264,7 +264,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ConstantEvaluatorTest extends ParserTestCase {
   void fail_constructor() {
     Object value = _getConstantValue("?");
@@ -582,7 +582,7 @@
       ParserTestCase.parseExpression(source).accept(new ConstantEvaluator());
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ConstructorDeclarationTest extends EngineTestCase {
   void test_firstTokenAfterCommentAndMetadata_all_inverted() {
     Token externalKeyword = TokenFactory.tokenFromKeyword(Keyword.EXTERNAL);
@@ -662,7 +662,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class IndexExpressionTest extends EngineTestCase {
   void test_inGetterContext_assignment_compound_left() {
     IndexExpression expression = AstFactory.indexExpression(
@@ -797,7 +797,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class NodeListTest extends EngineTestCase {
   void test_add() {
     AstNode parent = AstFactory.argumentList();
@@ -1025,7 +1025,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class NodeLocatorTest extends ParserTestCase {
   void test_range() {
     CompilationUnit unit =
@@ -1087,7 +1087,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class SimpleIdentifierTest extends ParserTestCase {
   void test_inDeclarationContext_catch_exception() {
     SimpleIdentifier identifier =
@@ -1406,7 +1406,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class SimpleStringLiteralTest extends ParserTestCase {
   void test_contentsEnd() {
     expect(
@@ -1620,7 +1620,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class StringInterpolationTest extends ParserTestCase {
   void test_contentsOffsetEnd() {
     AstFactory.interpolationExpression(AstFactory.identifier3('bb'));
@@ -1750,7 +1750,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ToSourceVisitorTest extends EngineTestCase {
   void test_visitAdjacentStrings() {
     _assertSource(
@@ -4044,7 +4044,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class VariableDeclarationTest extends ParserTestCase {
   void test_getDocumentationComment_onGrandParent() {
     VariableDeclaration varDecl = AstFactory.variableDeclaration("a");
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
index 1928df7..968adec 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -18,7 +18,7 @@
   runReflectiveTests(CompileTimeErrorCodeTest);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class CompileTimeErrorCodeTest extends ResolverTestCase {
   void fail_compileTimeConstantRaisesException() {
     Source source = addSource(r'''
@@ -194,7 +194,6 @@
   }
 
   void test_accessPrivateEnumField() {
-    resetWithEnum();
     Source source = addSource(r'''
 enum E { ONE }
 String name(E e) {
@@ -639,7 +638,7 @@
   }
 
   void test_constDeferredClass() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class A {
   const A();
@@ -649,12 +648,11 @@
 main() {
   const a.A();
 }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[CompileTimeErrorCode.CONST_DEFERRED_CLASS]);
   }
 
   void test_constDeferredClass_namedConstructor() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class A {
   const A.b();
@@ -664,7 +662,6 @@
 main() {
   const a.A.b();
 }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[CompileTimeErrorCode.CONST_DEFERRED_CLASS]);
   }
 
@@ -866,25 +863,23 @@
   }
 
   void test_constInitializedWithNonConstValueFromDeferredClass() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 const V = 1;''', r'''
 library root;
 import 'lib1.dart' deferred as a;
 const B = a.V;'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[
               CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_constInitializedWithNonConstValueFromDeferredClass_nested() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 const V = 1;''', r'''
 library root;
 import 'lib1.dart' deferred as a;
 const B = a.V + 1;'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[
               CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY]);
   }
@@ -1416,25 +1411,23 @@
   }
 
   void test_extendsDeferredClass() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class A {}''', r'''
 library root;
 import 'lib1.dart' deferred as a;
 class B extends a.A {}'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS]);
   }
 
   void test_extendsDeferredClass_classTypeAlias() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class A {}''', r'''
 library root;
 import 'lib1.dart' deferred as a;
 class M {}
 class C = a.A with M;'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS]);
   }
 
@@ -1571,7 +1564,6 @@
   }
 
   void test_extendsEnum() {
-    resetWithEnum();
     Source source = addSource(r'''
 enum E { ONE }
 class A extends E {}''');
@@ -1881,18 +1873,17 @@
   }
 
   void test_implementsDeferredClass() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class A {}''', r'''
 library root;
 import 'lib1.dart' deferred as a;
 class B implements a.A {}'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS]);
   }
 
   void test_implementsDeferredClass_classTypeAlias() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class A {}''', r'''
 library root;
@@ -1900,7 +1891,6 @@
 class B {}
 class M {}
 class C = B with M implements a.A;'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS]);
   }
 
@@ -2039,7 +2029,6 @@
   }
 
   void test_implementsEnum() {
-    resetWithEnum();
     Source source = addSource(r'''
 enum E { ONE }
 class A implements E {}''');
@@ -2481,7 +2470,6 @@
   }
 
   void test_instantiateEnum_const() {
-    resetWithEnum();
     Source source = addSource(r'''
 enum E { ONE }
 E e(String name) {
@@ -2493,7 +2481,6 @@
   }
 
   void test_instantiateEnum_new() {
-    resetWithEnum();
     Source source = addSource(r'''
 enum E { ONE }
 E e(String name) {
@@ -2633,38 +2620,35 @@
 
   void test_invalidAnnotationFromDeferredLibrary() {
     // See test_invalidAnnotation_notConstantVariable
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class V { const V(); }
 const v = const V();''', r'''
 library root;
 import 'lib1.dart' deferred as a;
 @a.v main () {}'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_invalidAnnotationFromDeferredLibrary_constructor() {
     // See test_invalidAnnotation_notConstantVariable
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class C { const C(); }''', r'''
 library root;
 import 'lib1.dart' deferred as a;
 @a.C() main () {}'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_invalidAnnotationFromDeferredLibrary_namedConstructor() {
     // See test_invalidAnnotation_notConstantVariable
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class C { const C.name(); }''', r'''
 library root;
 import 'lib1.dart' deferred as a;
 @a.C.name() main () {}'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
   }
 
@@ -3054,7 +3038,6 @@
   }
 
   void test_missingEnumConstantInSwitch() {
-    resetWithEnum();
     Source source = addSource(r'''
 enum E { ONE, TWO, THREE, FOUR }
 bool odd(E e) {
@@ -3096,25 +3079,23 @@
   }
 
   void test_mixinDeferredClass() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class A {}''', r'''
 library root;
 import 'lib1.dart' deferred as a;
 class B extends Object with a.A {}'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[CompileTimeErrorCode.MIXIN_DEFERRED_CLASS]);
   }
 
   void test_mixinDeferredClass_classTypeAlias() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class A {}''', r'''
 library root;
 import 'lib1.dart' deferred as a;
 class B {}
 class C = B with a.A;'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[CompileTimeErrorCode.MIXIN_DEFERRED_CLASS]);
   }
 
@@ -3355,7 +3336,6 @@
   }
 
   void test_mixinOfEnum() {
-    resetWithEnum();
     Source source = addSource(r'''
 enum E { ONE }
 class A extends Object with E {}''');
@@ -3842,25 +3822,23 @@
   }
 
   void test_nonConstantDefaultValueFromDeferredLibrary() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 const V = 1;''', r'''
 library root;
 import 'lib1.dart' deferred as a;
 f({x : a.V}) {}'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[
               CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstantDefaultValueFromDeferredLibrary_nested() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 const V = 1;''', r'''
 library root;
 import 'lib1.dart' deferred as a;
 f({x : a.V + 1}) {}'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[
               CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY]);
   }
@@ -3879,7 +3857,7 @@
   }
 
   void test_nonConstCaseExpressionFromDeferredLibrary() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 const int c = 1;''', r'''
 library root;
@@ -3890,13 +3868,12 @@
       break;
   }
 }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[
               CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstCaseExpressionFromDeferredLibrary_nested() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 const int c = 1;''', r'''
 library root;
@@ -3907,7 +3884,6 @@
       break;
   }
 }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[
               CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY]);
   }
@@ -3923,7 +3899,7 @@
   }
 
   void test_nonConstListElementFromDeferredLibrary() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 const int c = 1;''', r'''
 library root;
@@ -3931,13 +3907,12 @@
 f() {
   return const [a.c];
 }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[
               CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstListElementFromDeferredLibrary_nested() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 const int c = 1;''', r'''
 library root;
@@ -3945,7 +3920,6 @@
 f() {
   return const [a.c + 1];
 }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[
               CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY]);
   }
@@ -3985,7 +3959,7 @@
   }
 
   void test_nonConstMapKeyFromDeferredLibrary() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 const int c = 1;''', r'''
 library root;
@@ -3993,12 +3967,11 @@
 f() {
   return const {a.c : 0};
 }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstMapKeyFromDeferredLibrary_nested() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 const int c = 1;''', r'''
 library root;
@@ -4006,7 +3979,6 @@
 f() {
   return const {a.c + 1 : 0};
 }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY]);
   }
 
@@ -4021,7 +3993,7 @@
   }
 
   void test_nonConstMapValueFromDeferredLibrary() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 const int c = 1;''', r'''
 library root;
@@ -4029,12 +4001,11 @@
 f() {
   return const {'a' : a.c};
 }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstMapValueFromDeferredLibrary_nested() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 const int c = 1;''', r'''
 library root;
@@ -4042,7 +4013,6 @@
 f() {
   return const {'a' : a.c + 1};
 }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY]);
   }
 
@@ -4168,7 +4138,7 @@
   }
 
   void test_nonConstValueInInitializerFromDeferredLibrary_field() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 const int c = 1;''', r'''
 library root;
@@ -4177,13 +4147,12 @@
   final int x;
   const A() : x = a.c;
 }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[
               CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstValueInInitializerFromDeferredLibrary_field_nested() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 const int c = 1;''', r'''
 library root;
@@ -4192,13 +4161,12 @@
   final int x;
   const A() : x = a.c + 1;
 }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[
               CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstValueInInitializerFromDeferredLibrary_redirecting() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 const int c = 1;''', r'''
 library root;
@@ -4207,13 +4175,12 @@
   const A.named(p);
   const A() : this.named(a.c);
 }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[
               CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstValueInInitializerFromDeferredLibrary_super() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 const int c = 1;''', r'''
 library root;
@@ -4224,7 +4191,6 @@
 class B extends A {
   const B() : super(a.c);
 }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[
               CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
   }
@@ -4870,7 +4836,7 @@
   }
 
   void test_sharedDeferredPrefix() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 f1() {}''', r'''
 library lib2;
@@ -4879,7 +4845,6 @@
 import 'lib1.dart' deferred as lib;
 import 'lib2.dart' as lib;
 main() { lib.f1(); lib.f2(); }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[CompileTimeErrorCode.SHARED_DEFERRED_PREFIX]);
   }
 
diff --git a/pkg/analyzer/test/generated/element_test.dart b/pkg/analyzer/test/generated/element_test.dart
index 145f8ea..399d8c4 100644
--- a/pkg/analyzer/test/generated/element_test.dart
+++ b/pkg/analyzer/test/generated/element_test.dart
@@ -15,6 +15,7 @@
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/testing/ast_factory.dart';
 import 'package:analyzer/src/generated/testing/element_factory.dart';
+import 'package:analyzer/src/generated/testing/test_type_provider.dart';
 import 'package:unittest/unittest.dart';
 
 import '../reflective_tests.dart';
@@ -24,7 +25,6 @@
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(AngularPropertyKindTest);
   runReflectiveTests(ElementKindTest);
   runReflectiveTests(FunctionTypeImplTest);
   runReflectiveTests(InterfaceTypeImplTest);
@@ -40,40 +40,7 @@
   runReflectiveTests(MultiplyDefinedElementImplTest);
 }
 
-@ReflectiveTestCase()
-class AngularPropertyKindTest extends EngineTestCase {
-  void test_ATTR() {
-    AngularPropertyKind kind = AngularPropertyKind.ATTR;
-    expect(kind.callsGetter(), isFalse);
-    expect(kind.callsSetter(), isTrue);
-  }
-
-  void test_CALLBACK() {
-    AngularPropertyKind kind = AngularPropertyKind.CALLBACK;
-    expect(kind.callsGetter(), isFalse);
-    expect(kind.callsSetter(), isTrue);
-  }
-
-  void test_ONE_WAY() {
-    AngularPropertyKind kind = AngularPropertyKind.ONE_WAY;
-    expect(kind.callsGetter(), isFalse);
-    expect(kind.callsSetter(), isTrue);
-  }
-
-  void test_ONE_WAY_ONE_TIME() {
-    AngularPropertyKind kind = AngularPropertyKind.ONE_WAY_ONE_TIME;
-    expect(kind.callsGetter(), isFalse);
-    expect(kind.callsSetter(), isTrue);
-  }
-
-  void test_TWO_WAY() {
-    AngularPropertyKind kind = AngularPropertyKind.TWO_WAY;
-    expect(kind.callsGetter(), isTrue);
-    expect(kind.callsSetter(), isTrue);
-  }
-}
-
-@ReflectiveTestCase()
+@reflectiveTest
 class ClassElementImplTest extends EngineTestCase {
   void test_getAllSupertypes_interface() {
     ClassElement classA = ElementFactory.classElement2("A");
@@ -928,7 +895,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class CompilationUnitElementImplTest extends EngineTestCase {
   void test_getEnum_declared() {
     TestTypeProvider typeProvider = new TestTypeProvider();
@@ -971,7 +938,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ElementImplTest extends EngineTestCase {
   void test_equals() {
     LibraryElementImpl library =
@@ -1067,7 +1034,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ElementKindTest extends EngineTestCase {
   void test_of_nonNull() {
     expect(
@@ -1080,7 +1047,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ElementLocationImplTest extends EngineTestCase {
   void test_create_encoding() {
     String encoding = "a;b;c";
@@ -1145,7 +1112,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class FunctionTypeImplTest extends EngineTestCase {
   void test_creation() {
     expect(
@@ -1744,7 +1711,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class HtmlElementImplTest extends EngineTestCase {
   void test_equals_differentSource() {
     AnalysisContextImpl context = createAnalysisContext();
@@ -1773,7 +1740,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class InterfaceTypeImplTest extends EngineTestCase {
   /**
    * The type provider used to access the types.
@@ -3395,7 +3362,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class LibraryElementImplTest extends EngineTestCase {
   void test_creation() {
     expect(
@@ -3565,7 +3532,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class MultiplyDefinedElementImplTest extends EngineTestCase {
   void test_fromElements_conflicting() {
     Element firstElement = ElementFactory.localVariableElement2("xx");
@@ -3618,7 +3585,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class TypeParameterTypeImplTest extends EngineTestCase {
   void test_creation() {
     expect(
@@ -3747,7 +3714,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class UnionTypeImplTest extends EngineTestCase {
   ClassElement _classA;
 
@@ -3946,7 +3913,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class VoidTypeImplTest extends EngineTestCase {
   /**
    * Reference {code VoidTypeImpl.getInstance()}.
diff --git a/pkg/analyzer/test/generated/engine_test.dart b/pkg/analyzer/test/generated/engine_test.dart
index c85d291..fb15c2c 100644
--- a/pkg/analyzer/test/generated/engine_test.dart
+++ b/pkg/analyzer/test/generated/engine_test.dart
@@ -50,10 +50,12 @@
   runReflectiveTests(DartEntryTest);
   runReflectiveTests(GenerateDartErrorsTaskTest);
   runReflectiveTests(GenerateDartHintsTaskTest);
+  runReflectiveTests(GenerateDartLintsTaskTest);
   runReflectiveTests(GetContentTaskTest);
   runReflectiveTests(HtmlEntryTest);
   runReflectiveTests(IncrementalAnalysisCacheTest);
   runReflectiveTests(IncrementalAnalysisTaskTest);
+  runReflectiveTests(LintGeneratorTest);
   runReflectiveTests(ParseDartTaskTest);
   runReflectiveTests(ParseHtmlTaskTest);
   runReflectiveTests(PartitionManagerTest);
@@ -68,7 +70,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class AnalysisCacheTest extends EngineTestCase {
   void test_creation() {
     expect(new AnalysisCache(new List<CachePartition>(0)), isNotNull);
@@ -151,7 +153,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class AnalysisContextImplTest extends EngineTestCase {
   /**
    * An analysis context whose source factory is [sourceFactory].
@@ -218,7 +220,6 @@
     AnalysisOptionsImpl options =
         new AnalysisOptionsImpl.con1(_context.analysisOptions);
     options.cacheSize = 256;
-    options.enableEnum = true;
     _context.analysisOptions = options;
   }
 
@@ -2241,30 +2242,23 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class AnalysisOptionsImplTest extends EngineTestCase {
   void test_AnalysisOptionsImpl_copy() {
     bool booleanValue = true;
     for (int i = 0; i < 2; i++, booleanValue = !booleanValue) {
       AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-      options.analyzeAngular = booleanValue;
       options.analyzeFunctionBodies = booleanValue;
-      options.analyzePolymer = booleanValue;
       options.cacheSize = i;
       options.dart2jsHint = booleanValue;
-      options.enableDeferredLoading = booleanValue;
       options.generateSdkErrors = booleanValue;
       options.hint = booleanValue;
       options.incremental = booleanValue;
       options.preserveComments = booleanValue;
       AnalysisOptionsImpl copy = new AnalysisOptionsImpl.con1(options);
-      expect(copy.analyzeAngular, options.analyzeAngular);
       expect(copy.analyzeFunctionBodies, options.analyzeFunctionBodies);
-      expect(copy.analyzePolymer, options.analyzePolymer);
       expect(copy.cacheSize, options.cacheSize);
       expect(copy.dart2jsHint, options.dart2jsHint);
-      expect(copy.enableDeferredLoading, options.enableDeferredLoading);
-      expect(copy.enableEnum, options.enableEnum);
       expect(copy.generateSdkErrors, options.generateSdkErrors);
       expect(copy.hint, options.hint);
       expect(copy.incremental, options.incremental);
@@ -2272,13 +2266,6 @@
     }
   }
 
-  void test_getAnalyzeAngular() {
-    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    bool value = !options.analyzeAngular;
-    options.analyzeAngular = value;
-    expect(options.analyzeAngular, value);
-  }
-
   void test_getAnalyzeFunctionBodies() {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     bool value = !options.analyzeFunctionBodies;
@@ -2286,13 +2273,6 @@
     expect(options.analyzeFunctionBodies, value);
   }
 
-  void test_getAnalyzePolymer() {
-    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    bool value = !options.analyzePolymer;
-    options.analyzePolymer = value;
-    expect(options.analyzePolymer, value);
-  }
-
   void test_getCacheSize() {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     expect(options.cacheSize, AnalysisOptionsImpl.DEFAULT_CACHE_SIZE);
@@ -2308,24 +2288,6 @@
     expect(options.dart2jsHint, value);
   }
 
-  void test_getEnableDeferredLoading() {
-    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    expect(
-        options.enableDeferredLoading,
-        AnalysisOptionsImpl.DEFAULT_ENABLE_DEFERRED_LOADING);
-    bool value = !options.enableDeferredLoading;
-    options.enableDeferredLoading = value;
-    expect(options.enableDeferredLoading, value);
-  }
-
-  void test_getEnableEnum() {
-    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    expect(options.enableEnum, AnalysisOptionsImpl.DEFAULT_ENABLE_ENUM);
-    bool value = !options.enableEnum;
-    options.enableEnum = value;
-    expect(options.enableEnum, value);
-  }
-
   void test_getGenerateSdkErrors() {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     bool value = !options.generateSdkErrors;
@@ -2373,7 +2335,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class AnalysisTaskTest extends EngineTestCase {
   void test_perform_exception() {
     InternalAnalysisContext context = new AnalysisContextImpl();
@@ -2389,7 +2351,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class DartEntryTest extends EngineTestCase {
   void test_allErrors() {
     Source source = new TestSource();
@@ -2416,10 +2378,6 @@
         <AnalysisError>[
             new AnalysisError.con1(source, StaticWarningCode.CASE_BLOCK_NOT_TERMINATED)]);
     entry.setValueInLibrary(
-        DartEntry.ANGULAR_ERRORS,
-        source,
-        <AnalysisError>[new AnalysisError.con1(source, AngularCode.MISSING_NAME)]);
-    entry.setValueInLibrary(
         DartEntry.HINTS,
         source,
         <AnalysisError>[new AnalysisError.con1(source, HintCode.DEAD_CODE)]);
@@ -2454,9 +2412,6 @@
     expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.INVALID));
 
     expect(
-        entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, librarySource),
-        same(CacheState.INVALID));
-    expect(
         entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, librarySource),
         same(CacheState.INVALID));
     expect(
@@ -2732,9 +2687,6 @@
     expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.INVALID));
 
     expect(
-        entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, librarySource),
-        same(CacheState.INVALID));
-    expect(
         entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, librarySource),
         same(CacheState.INVALID));
     expect(
@@ -2783,9 +2735,6 @@
     expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
 
     expect(
-        entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, librarySource),
-        same(CacheState.INVALID));
-    expect(
         entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, librarySource),
         same(CacheState.INVALID));
     expect(
@@ -2834,9 +2783,6 @@
     expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
 
     expect(
-        entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, librarySource),
-        same(CacheState.INVALID));
-    expect(
         entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, librarySource),
         same(CacheState.INVALID));
     expect(
@@ -2916,9 +2862,6 @@
     expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
 
     expect(
-        entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, firstLibrary),
-        same(CacheState.ERROR));
-    expect(
         entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary),
         same(CacheState.ERROR));
     expect(
@@ -2938,9 +2881,6 @@
         same(CacheState.ERROR));
 
     expect(
-        entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, secondLibrary),
-        same(CacheState.VALID));
-    expect(
         entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary),
         same(CacheState.VALID));
     expect(
@@ -2989,9 +2929,6 @@
     expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.ERROR));
 
     expect(
-        entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, firstLibrary),
-        same(CacheState.ERROR));
-    expect(
         entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary),
         same(CacheState.ERROR));
     expect(
@@ -3052,9 +2989,6 @@
     expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
 
     expect(
-        entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, firstLibrary),
-        same(CacheState.VALID));
-    expect(
         entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary),
         same(CacheState.VALID));
     expect(
@@ -3074,9 +3008,6 @@
         same(CacheState.VALID));
 
     expect(
-        entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, secondLibrary),
-        same(CacheState.VALID));
-    expect(
         entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary),
         same(CacheState.VALID));
     expect(
@@ -3124,9 +3055,6 @@
     expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
 
     expect(
-        entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, firstLibrary),
-        same(CacheState.ERROR));
-    expect(
         entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary),
         same(CacheState.ERROR));
     expect(
@@ -3186,9 +3114,6 @@
     expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
 
     expect(
-        entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, firstLibrary),
-        same(CacheState.ERROR));
-    expect(
         entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary),
         same(CacheState.ERROR));
     expect(
@@ -3249,9 +3174,6 @@
     expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
 
     expect(
-        entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, firstLibrary),
-        same(CacheState.ERROR));
-    expect(
         entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary),
         same(CacheState.VALID));
     expect(
@@ -3271,9 +3193,6 @@
         same(CacheState.ERROR));
 
     expect(
-        entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, secondLibrary),
-        same(CacheState.VALID));
-    expect(
         entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary),
         same(CacheState.VALID));
     expect(
@@ -3321,9 +3240,6 @@
     expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.ERROR));
 
     expect(
-        entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, firstLibrary),
-        same(CacheState.ERROR));
-    expect(
         entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary),
         same(CacheState.ERROR));
     expect(
@@ -3384,9 +3300,6 @@
     expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
 
     expect(
-        entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, firstLibrary),
-        same(CacheState.VALID));
-    expect(
         entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary),
         same(CacheState.VALID));
     expect(
@@ -3406,9 +3319,6 @@
         same(CacheState.ERROR));
 
     expect(
-        entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, secondLibrary),
-        same(CacheState.VALID));
-    expect(
         entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary),
         same(CacheState.VALID));
     expect(
@@ -3758,7 +3668,6 @@
     entry.setValue(DartEntry.SOURCE_KIND, null);
     entry.setValue(DartEntry.TOKEN_STREAM, null);
     if (firstLibrary != null) {
-      entry.setValueInLibrary(DartEntry.ANGULAR_ERRORS, firstLibrary, null);
       entry.setValueInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary, null);
       entry.setValueInLibrary(DartEntry.BUILT_UNIT, firstLibrary, null);
       entry.setValueInLibrary(DartEntry.HINTS, firstLibrary, null);
@@ -3770,7 +3679,6 @@
           null);
     }
     if (secondLibrary != null) {
-      entry.setValueInLibrary(DartEntry.ANGULAR_ERRORS, secondLibrary, null);
       entry.setValueInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary, null);
       entry.setValueInLibrary(DartEntry.BUILT_UNIT, secondLibrary, null);
       entry.setValueInLibrary(DartEntry.HINTS, secondLibrary, null);
@@ -3807,9 +3715,6 @@
     expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
     if (firstLibrary != null) {
       expect(
-          entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, firstLibrary),
-          same(CacheState.VALID));
-      expect(
           entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary),
           same(CacheState.VALID));
       expect(
@@ -3830,9 +3735,6 @@
     }
     if (secondLibrary != null) {
       expect(
-          entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, secondLibrary),
-          same(CacheState.VALID));
-      expect(
           entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary),
           same(CacheState.VALID));
       expect(
@@ -3894,7 +3796,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class GenerateDartErrorsTaskTest extends EngineTestCase {
   void test_accept() {
     GenerateDartErrorsTask task =
@@ -4023,7 +3925,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class GenerateDartHintsTaskTest extends EngineTestCase {
   void test_accept() {
     GenerateDartHintsTask task = new GenerateDartHintsTask(null, null, null);
@@ -4104,8 +4006,119 @@
   }
 }
 
+@reflectiveTest
+class GenerateDartLintsTaskTest extends EngineTestCase {
+  void test_accept() {
+    GenerateDartLintsTask task = new GenerateDartLintsTask(null, null, null);
+    expect(task.accept(new GenerateDartLintsTaskTestTV_accept()), isTrue);
+  }
+  void test_exception() {
+    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");
+    GenerateDartLintsTask task =
+        new GenerateDartLintsTask(context, null, element);
+    expect(task.libraryElement, same(element));
+  }
 
-@ReflectiveTestCase()
+  void test_perform() {
+    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;
+''');
+    List<TimestampedData<CompilationUnit>> units = new List<TimestampedData>(1);
+    units[0] = new TimestampedData<CompilationUnit>(
+        context.getModificationStamp(librarySource),
+        context.resolveCompilationUnit2(librarySource, librarySource));
+    GenerateDartLintsTask task = new GenerateDartLintsTask(
+        context,
+        units,
+        context.computeLibraryElement(librarySource));
+    task.perform(new GenerateDartLintsTaskTestTV_perform(librarySource));
+  }
+}
+
+class GenerateDartLintsTaskTestTV_accept extends TestTaskVisitor<bool> {
+  @override
+  bool visitGenerateDartLintsTask(GenerateDartLintsTask task) => true;
+}
+
+class GenerateDartLintsTaskTestTV_perform extends TestTaskVisitor<bool> {
+  Source librarySource;
+  GenerateDartLintsTaskTestTV_perform(this.librarySource);
+  @override
+  bool visitGenerateDartLintsTask(GenerateDartLintsTask task) {
+    CaughtException exception = task.exception;
+    if (exception != null) {
+      throw exception;
+    }
+    expect(task.libraryElement, isNotNull);
+    return true;
+  }
+}
+
+@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', '');
@@ -4182,7 +4195,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class HtmlEntryTest extends EngineTestCase {
   void set state(DataDescriptor descriptor) {
     HtmlEntry entry = new HtmlEntry();
@@ -4209,38 +4222,14 @@
         <AnalysisError>[
             new AnalysisError.con1(source, HtmlWarningCode.INVALID_URI, ["-"])]);
     entry.setValue(
-        HtmlEntry.ANGULAR_ERRORS,
-        <AnalysisError>[
-            new AnalysisError.con1(source, AngularCode.INVALID_REPEAT_SYNTAX, ["-"])]);
-    entry.setValue(
-        HtmlEntry.POLYMER_BUILD_ERRORS,
-        <AnalysisError>[
-            new AnalysisError.con1(source, PolymerCode.INVALID_ATTRIBUTE_NAME, ["-"])]);
-    entry.setValue(
-        HtmlEntry.POLYMER_RESOLUTION_ERRORS,
-        <AnalysisError>[
-            new AnalysisError.con1(source, PolymerCode.INVALID_ATTRIBUTE_NAME, ["-"])]);
-    entry.setValue(
         HtmlEntry.HINTS,
         <AnalysisError>[new AnalysisError.con1(source, HintCode.DEAD_CODE)]);
-    expect(entry.allErrors, hasLength(6));
+    expect(entry.allErrors, hasLength(3));
   }
 
   void test_invalidateAllResolutionInformation() {
     HtmlEntry entry = _entryWithValidState();
     entry.invalidateAllResolutionInformation(false);
-    expect(
-        entry.getState(HtmlEntry.ANGULAR_APPLICATION),
-        same(CacheState.VALID));
-    expect(entry.getState(HtmlEntry.ANGULAR_COMPONENT), same(CacheState.VALID));
-    expect(entry.getState(HtmlEntry.ANGULAR_ENTRY), same(CacheState.INVALID));
-    expect(entry.getState(HtmlEntry.ANGULAR_ERRORS), same(CacheState.INVALID));
-    expect(
-        entry.getState(HtmlEntry.POLYMER_BUILD_ERRORS),
-        same(CacheState.INVALID));
-    expect(
-        entry.getState(HtmlEntry.POLYMER_RESOLUTION_ERRORS),
-        same(CacheState.INVALID));
     expect(entry.getState(HtmlEntry.ELEMENT), same(CacheState.INVALID));
     expect(entry.getState(HtmlEntry.HINTS), same(CacheState.INVALID));
     expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
@@ -4257,18 +4246,6 @@
   void test_invalidateAllResolutionInformation_includingUris() {
     HtmlEntry entry = _entryWithValidState();
     entry.invalidateAllResolutionInformation(true);
-    expect(
-        entry.getState(HtmlEntry.ANGULAR_APPLICATION),
-        same(CacheState.VALID));
-    expect(entry.getState(HtmlEntry.ANGULAR_COMPONENT), same(CacheState.VALID));
-    expect(entry.getState(HtmlEntry.ANGULAR_ENTRY), same(CacheState.INVALID));
-    expect(entry.getState(HtmlEntry.ANGULAR_ERRORS), same(CacheState.INVALID));
-    expect(
-        entry.getState(HtmlEntry.POLYMER_BUILD_ERRORS),
-        same(CacheState.INVALID));
-    expect(
-        entry.getState(HtmlEntry.POLYMER_RESOLUTION_ERRORS),
-        same(CacheState.INVALID));
     expect(entry.getState(HtmlEntry.ELEMENT), same(CacheState.INVALID));
     expect(entry.getState(HtmlEntry.HINTS), same(CacheState.INVALID));
     expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
@@ -4282,10 +4259,6 @@
         same(CacheState.INVALID));
   }
 
-  void test_setState_angularErrors() {
-    state = HtmlEntry.ANGULAR_ERRORS;
-  }
-
   void test_setState_element() {
     state = HtmlEntry.ELEMENT;
   }
@@ -4306,14 +4279,6 @@
     state = HtmlEntry.PARSE_ERRORS;
   }
 
-  void test_setState_polymerBuildErrors() {
-    state = HtmlEntry.POLYMER_BUILD_ERRORS;
-  }
-
-  void test_setState_polymerResolutionErrors() {
-    state = HtmlEntry.POLYMER_RESOLUTION_ERRORS;
-  }
-
   void test_setState_referencedLibraries() {
     state = HtmlEntry.REFERENCED_LIBRARIES;
   }
@@ -4322,13 +4287,6 @@
     state = HtmlEntry.RESOLUTION_ERRORS;
   }
 
-  void test_setValue_angularErrors() {
-    _setValue(
-        HtmlEntry.ANGULAR_ERRORS,
-        <AnalysisError>[
-            new AnalysisError.con1(null, AngularCode.INVALID_REPEAT_SYNTAX, ["-"])]);
-  }
-
   void test_setValue_element() {
     _setValue(HtmlEntry.ELEMENT, new HtmlElementImpl(null, "test.html"));
   }
@@ -4363,20 +4321,6 @@
             new AnalysisError.con1(null, HtmlWarningCode.INVALID_URI, ["-"])]);
   }
 
-  void test_setValue_polymerBuildErrors() {
-    _setValue(
-        HtmlEntry.POLYMER_BUILD_ERRORS,
-        <AnalysisError>[
-            new AnalysisError.con1(null, PolymerCode.INVALID_ATTRIBUTE_NAME, ["-"])]);
-  }
-
-  void test_setValue_polymerResolutionErrors() {
-    _setValue(
-        HtmlEntry.POLYMER_RESOLUTION_ERRORS,
-        <AnalysisError>[
-            new AnalysisError.con1(null, PolymerCode.INVALID_ATTRIBUTE_NAME, ["-"])]);
-  }
-
   void test_setValue_referencedLibraries() {
     _setValue(HtmlEntry.REFERENCED_LIBRARIES, <Source>[new TestSource()]);
   }
@@ -4390,31 +4334,19 @@
 
   HtmlEntry _entryWithValidState() {
     HtmlEntry entry = new HtmlEntry();
-    entry.setValue(HtmlEntry.ANGULAR_APPLICATION, null);
-    entry.setValue(HtmlEntry.ANGULAR_COMPONENT, null);
-    entry.setValue(HtmlEntry.ANGULAR_ERRORS, null);
     entry.setValue(HtmlEntry.ELEMENT, null);
     entry.setValue(HtmlEntry.HINTS, null);
     entry.setValue(SourceEntry.LINE_INFO, null);
     entry.setValue(HtmlEntry.PARSE_ERRORS, null);
     entry.setValue(HtmlEntry.PARSED_UNIT, null);
-    entry.setValue(HtmlEntry.POLYMER_BUILD_ERRORS, null);
-    entry.setValue(HtmlEntry.POLYMER_RESOLUTION_ERRORS, null);
     entry.setValue(HtmlEntry.REFERENCED_LIBRARIES, null);
     entry.setValue(HtmlEntry.RESOLUTION_ERRORS, null);
-    expect(entry.getState(HtmlEntry.ANGULAR_ERRORS), same(CacheState.VALID));
     expect(entry.getState(HtmlEntry.ELEMENT), same(CacheState.VALID));
     expect(entry.getState(HtmlEntry.HINTS), same(CacheState.VALID));
     expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
     expect(entry.getState(HtmlEntry.PARSE_ERRORS), same(CacheState.VALID));
     expect(entry.getState(HtmlEntry.PARSED_UNIT), same(CacheState.VALID));
     expect(
-        entry.getState(HtmlEntry.POLYMER_BUILD_ERRORS),
-        same(CacheState.VALID));
-    expect(
-        entry.getState(HtmlEntry.POLYMER_RESOLUTION_ERRORS),
-        same(CacheState.VALID));
-    expect(
         entry.getState(HtmlEntry.REFERENCED_LIBRARIES),
         same(CacheState.VALID));
     expect(entry.getState(HtmlEntry.RESOLUTION_ERRORS), same(CacheState.VALID));
@@ -4432,7 +4364,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class IncrementalAnalysisCacheTest {
   Source _source = new TestSource();
   DartEntry _entry = new DartEntry();
@@ -4957,7 +4889,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class IncrementalAnalysisTaskTest extends EngineTestCase {
   void test_accept() {
     IncrementalAnalysisTask task = new IncrementalAnalysisTask(null, null);
@@ -5034,7 +4966,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ParseDartTaskTest extends EngineTestCase {
   void test_accept() {
     ParseDartTask task = new ParseDartTask(null, null, null, null);
@@ -5232,7 +5164,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ParseHtmlTaskTest extends EngineTestCase {
   ParseHtmlTask parseContents(String contents, TestLogger testLogger) {
     return parseSource(
@@ -5416,7 +5348,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class PartitionManagerTest extends EngineTestCase {
   void test_clearCache() {
     PartitionManager manager = new PartitionManager();
@@ -5446,7 +5378,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ResolveDartLibraryTaskTest extends EngineTestCase {
   void test_accept() {
     ResolveDartLibraryTask task = new ResolveDartLibraryTask(null, null, null);
@@ -5527,7 +5459,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ResolveDartUnitTaskTest extends EngineTestCase {
   void test_accept() {
     ResolveDartUnitTask task = new ResolveDartUnitTask(null, null, null);
@@ -5628,7 +5560,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ResolveHtmlTaskTest extends EngineTestCase {
   void test_accept() {
     ResolveHtmlTask task = new ResolveHtmlTask(null, null, 0, null);
@@ -5727,7 +5659,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ScanDartTaskTest extends EngineTestCase {
   void test_accept() {
     ScanDartTask task = new ScanDartTask(null, null, null);
@@ -5791,7 +5723,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class SdkCachePartitionTest extends EngineTestCase {
   void test_contains_false() {
     SdkCachePartition partition = new SdkCachePartition(null, 8);
@@ -5813,7 +5745,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class SourcesChangedEventTest {
 
   void test_added() {
@@ -6078,11 +6010,6 @@
     return false;
   }
   @override
-  AngularApplication getAngularApplicationWithHtml(Source htmlSource) {
-    fail("Unexpected invocation of getAngularApplicationWithHtml");
-    return null;
-  }
-  @override
   CompilationUnitElement getCompilationUnitElement(Source unitSource,
       Source librarySource) {
     fail("Unexpected invocation of getCompilationUnitElement");
@@ -6399,18 +6326,6 @@
 }
 
 
-class TestAnalysisContext_test_getAngularApplicationWithHtml extends
-    TestAnalysisContext {
-  bool invoked = false;
-  TestAnalysisContext_test_getAngularApplicationWithHtml();
-  @override
-  AngularApplication getAngularApplicationWithHtml(Source htmlSource) {
-    invoked = true;
-    return null;
-  }
-}
-
-
 class TestAnalysisContext_test_getCompilationUnitElement extends
     TestAnalysisContext {
   bool invoked = false;
@@ -6911,27 +6826,6 @@
     return null;
   }
   @override
-  E visitPolymerBuildHtmlTask(PolymerBuildHtmlTask task) {
-    fail("Unexpectedly invoked visitPolymerBuildHtmlTask");
-    return null;
-  }
-  @override
-  E visitPolymerResolveHtmlTask(PolymerResolveHtmlTask task) {
-    fail("Unexpectedly invoked visitPolymerResolveHtmlTask");
-    return null;
-  }
-  @override
-  E
-      visitResolveAngularComponentTemplateTask(ResolveAngularComponentTemplateTask task) {
-    fail("Unexpectedly invoked visitResolveAngularComponentTemplateTask");
-    return null;
-  }
-  @override
-  E visitResolveAngularEntryHtmlTask(ResolveAngularEntryHtmlTask task) {
-    fail("Unexpectedly invoked visitResolveAngularEntryHtmlTask");
-    return null;
-  }
-  @override
   E visitResolveDartLibraryCycleTask(ResolveDartLibraryCycleTask task) {
     fail("Unexpectedly invoked visitResolveDartLibraryCycleTask");
     return null;
@@ -6956,10 +6850,16 @@
     fail("Unexpectedly invoked visitScanDartTask");
     return null;
   }
+
+  @override
+  E visitGenerateDartLintsTask(GenerateDartLintsTask task) {
+    fail("Unexpectedly invoked visitGenerateDartLintsTask");
+    return null;
+  }
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class UniversalCachePartitionTest extends EngineTestCase {
   void test_contains() {
     UniversalCachePartition partition =
@@ -7049,7 +6949,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class WorkManagerTest extends EngineTestCase {
   void test_addFirst() {
     TestSource source1 = new TestSource("/f1.dart");
diff --git a/pkg/analyzer/test/generated/incremental_resolver_test.dart b/pkg/analyzer/test/generated/incremental_resolver_test.dart
index 16ecdd9..b45db86 100644
--- a/pkg/analyzer/test/generated/incremental_resolver_test.dart
+++ b/pkg/analyzer/test/generated/incremental_resolver_test.dart
@@ -63,13 +63,79 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class DeclarationMatcherTest extends ResolverTestCase {
   void setUp() {
     super.setUp();
     test_resolveApiChanges = true;
   }
 
+  void test_false_class_annotation_accessor_edit() {
+    _assertDoesNotMatch(r'''
+const my_annotationA = const Object();
+const my_annotationB = const Object();
+@my_annotationA
+class A {
+}
+''', r'''
+const my_annotationA = const Object();
+const my_annotationB = const Object();
+@my_annotationB
+class A {
+}
+''');
+  }
+
+  void test_false_class_annotation_constructor_edit() {
+    _assertDoesNotMatch(r'''
+class MyAnnotationA {
+  const MyAnnotationA();
+}
+class MyAnnotationB {
+  const MyAnnotationB();
+}
+@MyAnnotationA()
+class A {
+}
+''', r'''
+class MyAnnotationA {
+  const MyAnnotationA();
+}
+class MyAnnotationB {
+  const MyAnnotationB();
+}
+@MyAnnotationB()
+class A {
+}
+''');
+  }
+
+  void test_false_class_annotations_add() {
+    _assertDoesNotMatch(r'''
+const my_annotation = const Object();
+class A {
+}
+''', r'''
+const my_annotation = const Object();
+@my_annotation
+class A {
+}
+''');
+  }
+
+  void test_false_class_annotations_remove() {
+    _assertDoesNotMatch(r'''
+const my_annotation = const Object();
+@my_annotation
+class A {
+}
+''', r'''
+const my_annotation = const Object();
+class A {
+}
+''');
+  }
+
   void test_false_class_list_add() {
     _assertDoesNotMatch(r'''
 class A {}
@@ -317,7 +383,6 @@
   }
 
   void test_false_enum_constants_add() {
-    resetWithEnum();
     _assertDoesNotMatch(r'''
 enum E {A, B}
 ''', r'''
@@ -326,7 +391,6 @@
   }
 
   void test_false_enum_constants_remove() {
-    resetWithEnum();
     _assertDoesNotMatch(r'''
 enum E {A, B, C}
 ''', r'''
@@ -813,6 +877,54 @@
 ''');
   }
 
+  void test_false_method_annotation_edit() {
+    _assertDoesNotMatchOK(r'''
+const my_annotationA = const Object();
+const my_annotationB = const Object();
+class A {
+  @my_annotationA
+  void m() {}
+}
+''', r'''
+const my_annotationA = const Object();
+const my_annotationB = const Object();
+class A {
+  @my_annotationB
+  void m() {}
+}
+''');
+  }
+
+  void test_false_method_annotations_add() {
+    _assertDoesNotMatchOK(r'''
+const my_annotation = const Object();
+class A {
+  void m() {}
+}
+''', r'''
+const my_annotation = const Object();
+class A {
+  @my_annotation
+  void m() {}
+}
+''');
+  }
+
+  void test_false_method_annotations_remove() {
+    _assertDoesNotMatchOK(r'''
+const my_annotation = const Object();
+class A {
+  @my_annotation
+  void m() {}
+}
+''', r'''
+const my_annotation = const Object();
+class A {
+  void m() {}
+}
+''');
+  }
+
   void test_false_method_list_add() {
     _assertDoesNotMatchOK(r'''
 class A {
@@ -1185,6 +1297,20 @@
 ''');
   }
 
+  void test_true_class_annotations_same() {
+    _assertMatches(r'''
+const my_annotation = const Object();
+@my_annotation
+class A {
+}
+''', r'''
+const my_annotation = const Object();
+@my_annotation
+class A {
+}
+''');
+  }
+
   void test_true_class_list_reorder() {
     _assertMatches(r'''
 class A {}
@@ -1370,7 +1496,6 @@
   }
 
   void test_true_enum_constants_reorder() {
-    resetWithEnum();
     _assertMatches(r'''
 enum E {A, B, C}
 ''', r'''
@@ -1379,7 +1504,6 @@
   }
 
   void test_true_enum_list_reorder() {
-    resetWithEnum();
     _assertMatches(r'''
 enum A {A1, A2, A3}
 enum B {B1, B2, B3}
@@ -1392,7 +1516,6 @@
   }
 
   void test_true_enum_list_same() {
-    resetWithEnum();
     _assertMatches(r'''
 enum A {A1, A2, A3}
 enum B {B1, B2, B3}
@@ -1616,6 +1739,42 @@
 ''');
   }
 
+  void test_true_method_annotation_accessor_same() {
+    _assertMatches(r'''
+const my_annotation = const Object();
+class A {
+  @my_annotation
+  void m() {}
+}
+''', r'''
+const my_annotation = const Object();
+class A {
+  @my_annotation
+  void m() {}
+}
+''');
+  }
+
+  void test_true_method_annotation_constructor_same() {
+    _assertMatches(r'''
+class MyAnnotation {
+  const MyAnnotation();
+}
+class A {
+  @MyAnnotation()
+  void m() {}
+}
+''', r'''
+class MyAnnotation {
+  const MyAnnotation();
+}
+class A {
+  @MyAnnotation()
+  void m() {}
+}
+''');
+  }
+
   void test_true_method_list_reorder() {
     _assertMatches(r'''
 class A {
@@ -1917,7 +2076,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class IncrementalResolverTest extends ResolverTestCase {
   Source source;
   String code;
@@ -2273,11 +2432,10 @@
     int updateOffset = edit.offset;
     int updateEndOld = updateOffset + edit.length;
     int updateOldNew = updateOffset + edit.replacement.length;
-    IncrementalResolver resolver = new IncrementalResolver(
-        unit.element,
-        updateOffset,
-        updateEndOld,
-        updateOldNew);
+    IncrementalResolver resolver =
+        new IncrementalResolver(<Source, CompilationUnit>{
+      source: newUnit
+    }, unit.element, updateOffset, updateEndOld, updateOldNew);
     bool success = resolver.resolve(newNode);
     expect(success, isTrue);
     List<AnalysisError> newErrors = analysisContext.getErrors(source).errors;
@@ -2289,7 +2447,11 @@
       LibraryElement library = resolve(source);
       fullNewUnit = resolveCompilationUnit(source, library);
     }
-    assertSameResolution(unit, fullNewUnit, fail);
+    try {
+      assertSameResolution(unit, fullNewUnit);
+    } on IncrementalResolutionMismatch catch (mismatch) {
+      fail(mismatch.message);
+    }
     // errors
     List<AnalysisError> newFullErrors =
         analysisContext.getErrors(source).errors;
@@ -2356,7 +2518,7 @@
  * The test for [poorMansIncrementalResolution] function and its integration
  * into [AnalysisContext].
  */
-@ReflectiveTestCase()
+@reflectiveTest
 class PoorMansIncrementalResolutionTest extends ResolverTestCase {
   Source source;
   String code;
@@ -2462,6 +2624,7 @@
  * A function [main] with a parameter [p] of type [int].
  */
 main(int p) {
+  unresolvedFunctionProblem();
 }
 /**
  * Other comment with [int] reference.
@@ -2474,6 +2637,7 @@
  * Inserted text with [String] reference.
  */
 main(int p) {
+  unresolvedFunctionProblem();
 }
 /**
  * Other comment with [int] reference.
@@ -2894,6 +3058,82 @@
 ''');
   }
 
+  void test_unusedHint_add_wasUsedOnlyInPart() {
+    Source partSource = addNamedSource('/my_unit.dart', r'''
+part of lib;
+
+f(A a) {
+  a._foo();
+}
+''');
+    _resolveUnit(r'''
+library lib;
+part 'my_unit.dart';
+class A {
+  _foo() {
+    print(1);
+  }
+}
+''');
+    _runTasks();
+    // perform incremental resolution
+    _resetWithIncremental(true);
+    analysisContext2.setContents(partSource, r'''
+part of lib;
+
+f(A a) {
+//  a._foo();
+}
+''');
+    // a new hint should be added
+    List<AnalysisError> errors = analysisContext.getErrors(source).errors;
+    expect(errors, hasLength(1));
+    expect(errors[0].errorCode.type, ErrorType.HINT);
+    // the same hint should be reported using a ChangeNotice
+    bool noticeFound = false;
+    AnalysisResult result = analysisContext2.performAnalysisTask();
+    for (ChangeNotice notice in result.changeNotices) {
+      if (notice.source == source) {
+        expect(notice.errors, contains(errors[0]));
+        noticeFound = true;
+      }
+    }
+    expect(noticeFound, isTrue);
+  }
+
+  void test_unusedHint_false_stillUsedInPart() {
+    addNamedSource('/my_unit.dart', r'''
+part of lib;
+
+f(A a) {
+  a._foo();
+}
+''');
+    _resolveUnit(r'''
+library lib;
+part 'my_unit.dart';
+class A {
+  _foo() {
+    print(1);
+  }
+}
+''');
+    // perform incremental resolution
+    _resetWithIncremental(true);
+    analysisContext2.setContents(source, r'''
+library lib;
+part 'my_unit.dart';
+class A {
+  _foo() {
+    print(12);
+  }
+}
+''');
+    // no hints
+    List<AnalysisError> errors = analysisContext.getErrors(source).errors;
+    expect(errors, isEmpty);
+  }
+
   void test_updateErrors_addNew_hint() {
     _resolveUnit(r'''
 int main() {
@@ -3113,7 +3353,11 @@
       LibraryElement library = resolve(source);
       CompilationUnit fullNewUnit = resolveCompilationUnit(source, library);
       // Validate that "incremental" and "full" units have the same resolution.
-      assertSameResolution(newUnit, fullNewUnit, fail);
+      try {
+        assertSameResolution(newUnit, fullNewUnit, validateTypes: true);
+      } on IncrementalResolutionMismatch catch (mismatch) {
+        fail(mismatch.message);
+      }
       _assertEqualTokens(newUnit, fullNewUnit);
       List<AnalysisError> newFullErrors =
           analysisContext.getErrors(source).errors;
@@ -3158,7 +3402,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ResolutionContextBuilderTest extends EngineTestCase {
   GatheringErrorListener listener = new GatheringErrorListener();
 
diff --git a/pkg/analyzer/test/generated/incremental_scanner_test.dart b/pkg/analyzer/test/generated/incremental_scanner_test.dart
index 36a84f8..9592bc0 100644
--- a/pkg/analyzer/test/generated/incremental_scanner_test.dart
+++ b/pkg/analyzer/test/generated/incremental_scanner_test.dart
@@ -17,7 +17,7 @@
   runReflectiveTests(IncrementalScannerTest);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class IncrementalScannerTest extends EngineTestCase {
   /**
    * The first token from the token stream resulting from parsing the original
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 31d055d..2264443 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -6,7 +6,6 @@
 
 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/error.dart';
 import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
 import 'package:analyzer/src/generated/source_io.dart';
@@ -22,7 +21,7 @@
   runReflectiveTests(NonErrorResolverTest);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class NonErrorResolverTest extends ResolverTestCase {
   void fail_undefinedEnumConstant() {
     Source source = addSource(r'''
@@ -774,7 +773,7 @@
   }
 
   void test_constDeferredClass_new() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class A {
   const A.b();
@@ -784,7 +783,6 @@
 main() {
   new a.A.b();
 }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[]);
   }
 
@@ -2515,16 +2513,13 @@
   }
 
   void test_loadLibraryDefined() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 foo() => 22;''', r'''
 import 'lib1.dart' deferred as other;
 main() {
   other.loadLibrary().then((_) => other.foo());
 }'''],
-          <ErrorCode>[
-              ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED,
-              StaticTypeWarningCode.UNDEFINED_FUNCTION],
           <ErrorCode>[]);
   }
 
@@ -2617,7 +2612,6 @@
   }
 
   void test_missingEnumConstantInSwitch_all() {
-    resetWithEnum();
     Source source = addSource(r'''
 enum E { A, B, C }
 
@@ -2634,7 +2628,6 @@
   }
 
   void test_missingEnumConstantInSwitch_default() {
-    resetWithEnum();
     Source source = addSource(r'''
 enum E { A, B, C }
 
@@ -3973,7 +3966,7 @@
   }
 
   void test_sharedDeferredPrefix() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 f1() {}''', r'''
 library lib2;
@@ -3985,7 +3978,6 @@
 import 'lib2.dart' as lib;
 import 'lib3.dart' as lib;
 main() { lib1.f1(); lib.f2(); lib.f3(); }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[]);
   }
 
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 2612254..ac43b31 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -123,7 +123,7 @@
  *
  * Simpler tests should be defined in the class [SimpleParserTest].
  */
-@ReflectiveTestCase()
+@reflectiveTest
 class ComplexParserTest extends ParserTestCase {
   void test_additiveExpression_normal() {
     BinaryExpression expression = ParserTestCase.parseExpression("x + y - z");
@@ -584,7 +584,7 @@
  * The class `ErrorParserTest` defines parser tests that test the parsing of code to ensure
  * that errors are correctly reported, and in some cases, not reported.
  */
-@ReflectiveTestCase()
+@reflectiveTest
 class ErrorParserTest extends ParserTestCase {
   void fail_expectedListOrMapLiteral() {
     // It isn't clear that this test can ever pass. The parser is currently
@@ -2578,7 +2578,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class IncrementalParserTest extends EngineTestCase {
   void fail_replace_identifier_with_functionLiteral_in_initializer_interp() {
     // TODO(paulberry, brianwilkerson): broken due to incremental scanning bugs
@@ -2969,7 +2969,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class NonErrorParserTest extends ParserTestCase {
   void test_constFactory_external() {
     ParserTestCase.parse(
@@ -3023,10 +3023,7 @@
    * @return the parser that was created
    */
   static Parser createParser(GatheringErrorListener listener) {
-    Parser parser = new Parser(null, listener);
-    parser.parseDeferredLibraries = true;
-    parser.parseEnum = true;
-    return parser;
+    return new Parser(null, listener);
   }
 
   /**
@@ -3059,7 +3056,6 @@
     //
     Parser parser = createParser(listener);
     parser.parseFunctionBodies = parseFunctionBodies;
-    parser.parseDeferredLibraries = true;
     Object result =
         invokeParserMethodImpl(parser, methodName, objects, tokenStream);
     //
@@ -3271,7 +3267,7 @@
  * The class `RecoveryParserTest` defines parser tests that test the parsing of invalid code
  * sequences to ensure that the correct recovery steps are taken in the parser.
  */
-@ReflectiveTestCase()
+@reflectiveTest
 class RecoveryParserTest extends ParserTestCase {
   void fail_incomplete_returnType() {
     ParserTestCase.parseCompilationUnit(r'''
@@ -4517,7 +4513,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ResolutionCopierTest extends EngineTestCase {
   void test_visitAnnotation() {
     String annotationName = "proxy";
@@ -5167,7 +5163,7 @@
  *
  * More complex tests should be defined in the class [ComplexParserTest].
  */
-@ReflectiveTestCase()
+@reflectiveTest
 class SimpleParserTest extends ParserTestCase {
   void fail_parseCommentReference_this() {
     // This fails because we are returning null from the method and asserting
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 6cc66f8..380829c 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -23,6 +23,7 @@
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/static_type_analyzer.dart';
 import 'package:analyzer/src/generated/testing/ast_factory.dart';
+import 'package:analyzer/src/generated/testing/test_type_provider.dart';
 import 'package:analyzer/src/generated/testing/element_factory.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:unittest/unittest.dart';
@@ -378,8 +379,6 @@
     bool needsRecompute =
         currentOptions.analyzeFunctionBodies != options.analyzeFunctionBodies ||
         currentOptions.generateSdkErrors != options.generateSdkErrors ||
-        currentOptions.enableDeferredLoading != options.enableDeferredLoading ||
-        currentOptions.enableEnum != options.enableEnum ||
         currentOptions.dart2jsHint != options.dart2jsHint ||
         (currentOptions.hint && !options.hint) ||
         currentOptions.preserveComments != options.preserveComments;
@@ -465,7 +464,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class AnalysisDeltaTest extends EngineTestCase {
   TestSource source1 = new TestSource('/1.dart');
   TestSource source2 = new TestSource('/2.dart');
@@ -505,7 +504,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ChangeSetTest extends EngineTestCase {
   void test_changedContent() {
     TestSource source = new TestSource();
@@ -558,7 +557,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class CheckedModeCompileTimeErrorCodeTest extends ResolverTestCase {
   void test_fieldFormalParameterAssignableToField_extends() {
     // According to checked-mode type checking rules, a value of type B is
@@ -1144,7 +1143,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ElementResolverTest extends EngineTestCase {
   /**
    * The error listener to which errors will be reported.
@@ -2078,7 +2077,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class EnclosedScopeTest extends ResolverTestCase {
   void test_define_duplicate() {
     GatheringErrorListener listener = new GatheringErrorListener();
@@ -2109,7 +2108,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ErrorResolverTest extends ResolverTestCase {
   void test_breakLabelOnSwitchMember() {
     Source source = addSource(r'''
@@ -2172,7 +2171,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class HintCodeTest extends ResolverTestCase {
   void fail_deadCode_statementAfterRehrow() {
     Source source = addSource(r'''
@@ -2978,14 +2977,13 @@
   }
 
   void test_importDeferredLibraryWithLoadFunction() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 loadLibrary() {}
 f() {}''', r'''
 library root;
 import 'lib1.dart' deferred as lib1;
 main() { lib1.f(); }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION]);
   }
 
@@ -4443,7 +4441,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class InheritanceManagerTest extends EngineTestCase {
   /**
    * The type provider used to access the types.
@@ -5661,7 +5659,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class LibraryElementBuilderTest extends EngineTestCase {
   /**
    * The analysis context used to analyze sources.
@@ -5845,7 +5843,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class LibraryImportScopeTest extends ResolverTestCase {
   void test_conflictingImports() {
     AnalysisContext context = new AnalysisContextImpl();
@@ -6041,7 +6039,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class LibraryResolver2Test extends ResolverTestCase {
   LibraryResolver2 _resolver;
 
@@ -6088,7 +6086,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class LibraryResolverTest extends ResolverTestCase {
   LibraryResolver _resolver;
 
@@ -6129,7 +6127,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class LibraryScopeTest extends ResolverTestCase {
   void test_creation_empty() {
     LibraryElement definingLibrary = createDefaultTestLibrary();
@@ -6166,7 +6164,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class LibraryTest extends EngineTestCase {
   /**
    * The error listener to which all errors will be reported.
@@ -6283,7 +6281,7 @@
               FileUtilities2.createFile(definingCompilationUnitPath)));
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class MemberMapTest {
   /**
    * The null type.
@@ -6329,7 +6327,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class NonHintCodeTest extends ResolverTestCase {
   void test_deadCode_deadBlock_conditionalElse_debugConst() {
     Source source = addSource(r'''
@@ -6548,13 +6546,12 @@
   }
 
   void test_importDeferredLibraryWithLoadFunction() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 f() {}''', r'''
 library root;
 import 'lib1.dart' deferred as lib1;
 main() { lib1.f(); }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           ErrorCode.EMPTY_LIST);
   }
 
@@ -7829,15 +7826,6 @@
   }
 
   /**
-   * Reset the analysis context to have the 'enableEnum' option set to true.
-   */
-  void resetWithEnum() {
-    AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
-    analysisOptions.enableEnum = true;
-    resetWithOptions(analysisOptions);
-  }
-
-  /**
    * Reset the analysis context to have the given options applied.
    *
    * @param options the analysis options to be applied to the context
@@ -7892,12 +7880,19 @@
     return null;
   }
 
+  void resolveWithErrors(List<String> strSources, List<ErrorCode> codes) {
+    // Analysis and assertions
+    Source source = resolveSources(strSources);
+    assertErrors(source, codes);
+    verify([source]);
+  }
+
   void resolveWithAndWithoutExperimental(List<String> strSources,
       List<ErrorCode> codesWithoutExperimental,
       List<ErrorCode> codesWithExperimental) {
     // Setup analysis context as non-experimental
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    options.enableDeferredLoading = false;
+//    options.enableDeferredLoading = false;
     resetWithOptions(options);
     // Analysis and assertions
     Source source = resolveSources(strSources);
@@ -7981,7 +7976,7 @@
       null;
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ScopeTest extends ResolverTestCase {
   void test_define_duplicate() {
     GatheringErrorListener errorListener = new GatheringErrorListener();
@@ -8039,7 +8034,7 @@
       localLookup(name, referencingLibrary);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class SimpleResolverTest extends ResolverTestCase {
   void fail_staticInvocation() {
     Source source = addSource(r'''
@@ -8662,7 +8657,6 @@
   }
 
   void test_enum_externalLibrary() {
-    resetWithEnum();
     addNamedSource("/my_lib.dart", r'''
 library my_lib;
 enum EEE {A, B, C}''');
@@ -9382,7 +9376,7 @@
 /**
  * Like [StaticTypeAnalyzerTest], but as end-to-end tests.
  */
-@ReflectiveTestCase()
+@reflectiveTest
 class StaticTypeAnalyzer2Test extends ResolverTestCase {
   String testCode;
   Source testSource;
@@ -9455,7 +9449,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class StaticTypeAnalyzerTest extends EngineTestCase {
   /**
    * The error listener to which errors will be reported.
@@ -10874,7 +10868,7 @@
  * The class `StrictModeTest` contains tests to ensure that the correct errors and warnings
  * are reported when the analysis engine is run in strict mode.
  */
-@ReflectiveTestCase()
+@reflectiveTest
 class StrictModeTest extends ResolverTestCase {
   void fail_for() {
     Source source = addSource(r'''
@@ -11026,7 +11020,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class SubtypeManagerTest extends EngineTestCase {
   /**
    * The inheritance manager being tested.
@@ -11122,477 +11116,9 @@
   }
 }
 
-/**
- * Instances of the class `TestTypeProvider` implement a type provider that can be used by
- * tests without creating the element model for the core library.
- */
-class TestTypeProvider implements TypeProvider {
-  /**
-   * The type representing the built-in type 'bool'.
-   */
-  InterfaceType _boolType;
 
-  /**
-   * The type representing the type 'bottom'.
-   */
-  DartType _bottomType;
 
-  /**
-   * The type representing the built-in type 'double'.
-   */
-  InterfaceType _doubleType;
-
-  /**
-   * The type representing the built-in type 'deprecated'.
-   */
-  InterfaceType _deprecatedType;
-
-  /**
-   * The type representing the built-in type 'dynamic'.
-   */
-  DartType _dynamicType;
-
-  /**
-   * The type representing the built-in type 'Function'.
-   */
-  InterfaceType _functionType;
-
-  /**
-   * The type representing the built-in type 'int'.
-   */
-  InterfaceType _intType;
-
-  /**
-   * The type representing the built-in type 'Iterable'.
-   */
-  InterfaceType _iterableType;
-
-  /**
-   * The type representing the built-in type 'Iterator'.
-   */
-  InterfaceType _iteratorType;
-
-  /**
-   * The type representing the built-in type 'List'.
-   */
-  InterfaceType _listType;
-
-  /**
-   * The type representing the built-in type 'Map'.
-   */
-  InterfaceType _mapType;
-
-  /**
-   * The type representing the built-in type 'Null'.
-   */
-  InterfaceType _nullType;
-
-  /**
-   * The type representing the built-in type 'num'.
-   */
-  InterfaceType _numType;
-
-  /**
-   * The type representing the built-in type 'Object'.
-   */
-  InterfaceType _objectType;
-
-  /**
-   * The type representing the built-in type 'StackTrace'.
-   */
-  InterfaceType _stackTraceType;
-
-  /**
-   * The type representing the built-in type 'String'.
-   */
-  InterfaceType _stringType;
-
-  /**
-   * The type representing the built-in type 'Symbol'.
-   */
-  InterfaceType _symbolType;
-
-  /**
-   * The type representing the built-in type 'Type'.
-   */
-  InterfaceType _typeType;
-
-  /**
-   * The type representing typenames that can't be resolved.
-   */
-  DartType _undefinedType;
-
-  @override
-  InterfaceType get boolType {
-    if (_boolType == null) {
-      ClassElementImpl boolElement = ElementFactory.classElement2("bool");
-      _boolType = boolElement.type;
-      ConstructorElementImpl fromEnvironment =
-          ElementFactory.constructorElement(boolElement, "fromEnvironment", true);
-      fromEnvironment.parameters = <ParameterElement>[
-          ElementFactory.requiredParameter2("name", stringType),
-          ElementFactory.namedParameter2("defaultValue", _boolType)];
-      fromEnvironment.factory = true;
-      boolElement.constructors = <ConstructorElement>[fromEnvironment];
-    }
-    return _boolType;
-  }
-
-  @override
-  DartType get bottomType {
-    if (_bottomType == null) {
-      _bottomType = BottomTypeImpl.instance;
-    }
-    return _bottomType;
-  }
-
-  @override
-  InterfaceType get deprecatedType {
-    if (_deprecatedType == null) {
-      ClassElementImpl deprecatedElement =
-          ElementFactory.classElement2("Deprecated");
-      deprecatedElement.constructors = <ConstructorElement>[
-          ElementFactory.constructorElement(deprecatedElement, null, true, [stringType])];
-      _deprecatedType = deprecatedElement.type;
-    }
-    return _deprecatedType;
-  }
-
-  @override
-  InterfaceType get doubleType {
-    if (_doubleType == null) {
-      _initializeNumericTypes();
-    }
-    return _doubleType;
-  }
-
-  @override
-  DartType get dynamicType {
-    if (_dynamicType == null) {
-      _dynamicType = DynamicTypeImpl.instance;
-    }
-    return _dynamicType;
-  }
-
-  @override
-  InterfaceType get functionType {
-    if (_functionType == null) {
-      _functionType = ElementFactory.classElement2("Function").type;
-    }
-    return _functionType;
-  }
-
-  @override
-  InterfaceType get intType {
-    if (_intType == null) {
-      _initializeNumericTypes();
-    }
-    return _intType;
-  }
-
-  InterfaceType get iterableType {
-    if (_iterableType == null) {
-      ClassElementImpl iterableElement =
-          ElementFactory.classElement2("Iterable", ["E"]);
-      _iterableType = iterableElement.type;
-      DartType eType = iterableElement.typeParameters[0].type;
-      iterableElement.accessors = <PropertyAccessorElement>[
-          ElementFactory.getterElement(
-              "iterator",
-              false,
-              iteratorType.substitute4(<DartType>[eType])),
-          ElementFactory.getterElement("last", false, eType)];
-      _propagateTypeArguments(iterableElement);
-    }
-    return _iterableType;
-  }
-
-  InterfaceType get iteratorType {
-    if (_iteratorType == null) {
-      ClassElementImpl iteratorElement =
-          ElementFactory.classElement2("Iterator", ["E"]);
-      _iteratorType = iteratorElement.type;
-      DartType eType = iteratorElement.typeParameters[0].type;
-      iteratorElement.accessors = <PropertyAccessorElement>[
-          ElementFactory.getterElement("current", false, eType)];
-      _propagateTypeArguments(iteratorElement);
-    }
-    return _iteratorType;
-  }
-
-  @override
-  InterfaceType get listType {
-    if (_listType == null) {
-      ClassElementImpl listElement =
-          ElementFactory.classElement2("List", ["E"]);
-      listElement.constructors =
-          <ConstructorElement>[ElementFactory.constructorElement2(listElement, null)];
-      _listType = listElement.type;
-      DartType eType = listElement.typeParameters[0].type;
-      InterfaceType iterableType =
-          this.iterableType.substitute4(<DartType>[eType]);
-      listElement.interfaces = <InterfaceType>[iterableType];
-      listElement.accessors = <PropertyAccessorElement>[
-          ElementFactory.getterElement("length", false, intType)];
-      listElement.methods = <MethodElement>[
-          ElementFactory.methodElement("[]", eType, [intType]),
-          ElementFactory.methodElement("[]=", VoidTypeImpl.instance, [intType, eType]),
-          ElementFactory.methodElement("add", VoidTypeImpl.instance, [eType])];
-      _propagateTypeArguments(listElement);
-    }
-    return _listType;
-  }
-
-  @override
-  InterfaceType get mapType {
-    if (_mapType == null) {
-      ClassElementImpl mapElement =
-          ElementFactory.classElement2("Map", ["K", "V"]);
-      _mapType = mapElement.type;
-      DartType kType = mapElement.typeParameters[0].type;
-      DartType vType = mapElement.typeParameters[1].type;
-      mapElement.accessors = <PropertyAccessorElement>[
-          ElementFactory.getterElement("length", false, intType)];
-      mapElement.methods = <MethodElement>[
-          ElementFactory.methodElement("[]", vType, [objectType]),
-          ElementFactory.methodElement("[]=", VoidTypeImpl.instance, [kType, vType])];
-      _propagateTypeArguments(mapElement);
-    }
-    return _mapType;
-  }
-
-  @override
-  InterfaceType get nullType {
-    if (_nullType == null) {
-      _nullType = ElementFactory.classElement2("Null").type;
-    }
-    return _nullType;
-  }
-
-  @override
-  InterfaceType get numType {
-    if (_numType == null) {
-      _initializeNumericTypes();
-    }
-    return _numType;
-  }
-
-  @override
-  InterfaceType get objectType {
-    if (_objectType == null) {
-      ClassElementImpl objectElement = ElementFactory.object;
-      _objectType = objectElement.type;
-      objectElement.constructors =
-          <ConstructorElement>[ElementFactory.constructorElement2(objectElement, null)];
-      objectElement.methods = <MethodElement>[
-          ElementFactory.methodElement("toString", stringType),
-          ElementFactory.methodElement("==", boolType, [_objectType]),
-          ElementFactory.methodElement("noSuchMethod", dynamicType, [dynamicType])];
-      objectElement.accessors = <PropertyAccessorElement>[
-          ElementFactory.getterElement("hashCode", false, intType),
-          ElementFactory.getterElement("runtimeType", false, typeType)];
-    }
-    return _objectType;
-  }
-
-  @override
-  InterfaceType get stackTraceType {
-    if (_stackTraceType == null) {
-      _stackTraceType = ElementFactory.classElement2("StackTrace").type;
-    }
-    return _stackTraceType;
-  }
-
-  @override
-  InterfaceType get stringType {
-    if (_stringType == null) {
-      _stringType = ElementFactory.classElement2("String").type;
-      ClassElementImpl stringElement = _stringType.element as ClassElementImpl;
-      stringElement.accessors = <PropertyAccessorElement>[
-          ElementFactory.getterElement("isEmpty", false, boolType),
-          ElementFactory.getterElement("length", false, intType),
-          ElementFactory.getterElement(
-              "codeUnits",
-              false,
-              listType.substitute4(<DartType>[intType]))];
-      stringElement.methods = <MethodElement>[
-          ElementFactory.methodElement("+", _stringType, [_stringType]),
-          ElementFactory.methodElement("toLowerCase", _stringType),
-          ElementFactory.methodElement("toUpperCase", _stringType)];
-      ConstructorElementImpl fromEnvironment =
-          ElementFactory.constructorElement(stringElement, "fromEnvironment", true);
-      fromEnvironment.parameters = <ParameterElement>[
-          ElementFactory.requiredParameter2("name", stringType),
-          ElementFactory.namedParameter2("defaultValue", _stringType)];
-      fromEnvironment.factory = true;
-      stringElement.constructors = <ConstructorElement>[fromEnvironment];
-    }
-    return _stringType;
-  }
-
-  @override
-  InterfaceType get symbolType {
-    if (_symbolType == null) {
-      ClassElementImpl symbolClass = ElementFactory.classElement2("Symbol");
-      ConstructorElementImpl constructor =
-          ElementFactory.constructorElement(symbolClass, null, true, [stringType]);
-      constructor.factory = true;
-      symbolClass.constructors = <ConstructorElement>[constructor];
-      _symbolType = symbolClass.type;
-    }
-    return _symbolType;
-  }
-
-  @override
-  InterfaceType get typeType {
-    if (_typeType == null) {
-      _typeType = ElementFactory.classElement2("Type").type;
-    }
-    return _typeType;
-  }
-
-  @override
-  DartType get undefinedType {
-    if (_undefinedType == null) {
-      _undefinedType = UndefinedTypeImpl.instance;
-    }
-    return _undefinedType;
-  }
-
-  /**
-   * Initialize the numeric types. They are created as a group so that we can (a) create the right
-   * hierarchy and (b) add members to them.
-   */
-  void _initializeNumericTypes() {
-    //
-    // Create the type hierarchy.
-    //
-    ClassElementImpl numElement = ElementFactory.classElement2("num");
-    _numType = numElement.type;
-    ClassElementImpl intElement = ElementFactory.classElement("int", _numType);
-    _intType = intElement.type;
-    ClassElementImpl doubleElement =
-        ElementFactory.classElement("double", _numType);
-    _doubleType = doubleElement.type;
-    //
-    // Force the referenced types to be cached.
-    //
-    objectType;
-    boolType;
-    stringType;
-    //
-    // Add the methods.
-    //
-    numElement.methods = <MethodElement>[
-        ElementFactory.methodElement("+", _numType, [_numType]),
-        ElementFactory.methodElement("-", _numType, [_numType]),
-        ElementFactory.methodElement("*", _numType, [_numType]),
-        ElementFactory.methodElement("%", _numType, [_numType]),
-        ElementFactory.methodElement("/", _doubleType, [_numType]),
-        ElementFactory.methodElement("~/", _numType, [_numType]),
-        ElementFactory.methodElement("-", _numType),
-        ElementFactory.methodElement("remainder", _numType, [_numType]),
-        ElementFactory.methodElement("<", _boolType, [_numType]),
-        ElementFactory.methodElement("<=", _boolType, [_numType]),
-        ElementFactory.methodElement(">", _boolType, [_numType]),
-        ElementFactory.methodElement(">=", _boolType, [_numType]),
-        ElementFactory.methodElement("==", _boolType, [_objectType]),
-        ElementFactory.methodElement("isNaN", _boolType),
-        ElementFactory.methodElement("isNegative", _boolType),
-        ElementFactory.methodElement("isInfinite", _boolType),
-        ElementFactory.methodElement("abs", _numType),
-        ElementFactory.methodElement("floor", _numType),
-        ElementFactory.methodElement("ceil", _numType),
-        ElementFactory.methodElement("round", _numType),
-        ElementFactory.methodElement("truncate", _numType),
-        ElementFactory.methodElement("toInt", _intType),
-        ElementFactory.methodElement("toDouble", _doubleType),
-        ElementFactory.methodElement("toStringAsFixed", _stringType, [_intType]),
-        ElementFactory.methodElement("toStringAsExponential", _stringType, [_intType]),
-        ElementFactory.methodElement("toStringAsPrecision", _stringType, [_intType]),
-        ElementFactory.methodElement("toRadixString", _stringType, [_intType])];
-    intElement.methods = <MethodElement>[
-        ElementFactory.methodElement("&", _intType, [_intType]),
-        ElementFactory.methodElement("|", _intType, [_intType]),
-        ElementFactory.methodElement("^", _intType, [_intType]),
-        ElementFactory.methodElement("~", _intType),
-        ElementFactory.methodElement("<<", _intType, [_intType]),
-        ElementFactory.methodElement(">>", _intType, [_intType]),
-        ElementFactory.methodElement("-", _intType),
-        ElementFactory.methodElement("abs", _intType),
-        ElementFactory.methodElement("round", _intType),
-        ElementFactory.methodElement("floor", _intType),
-        ElementFactory.methodElement("ceil", _intType),
-        ElementFactory.methodElement("truncate", _intType),
-        ElementFactory.methodElement("toString", _stringType)];
-    ConstructorElementImpl fromEnvironment =
-        ElementFactory.constructorElement(intElement, "fromEnvironment", true);
-    fromEnvironment.parameters = <ParameterElement>[
-        ElementFactory.requiredParameter2("name", stringType),
-        ElementFactory.namedParameter2("defaultValue", _intType)];
-    fromEnvironment.factory = true;
-    intElement.constructors = <ConstructorElement>[fromEnvironment];
-    List<FieldElement> fields = <FieldElement>[
-        ElementFactory.fieldElement("NAN", true, false, true, _doubleType),
-        ElementFactory.fieldElement("INFINITY", true, false, true, _doubleType),
-        ElementFactory.fieldElement(
-            "NEGATIVE_INFINITY",
-            true,
-            false,
-            true,
-            _doubleType),
-        ElementFactory.fieldElement("MIN_POSITIVE", true, false, true, _doubleType),
-        ElementFactory.fieldElement("MAX_FINITE", true, false, true, _doubleType)];
-    doubleElement.fields = fields;
-    int fieldCount = fields.length;
-    List<PropertyAccessorElement> accessors =
-        new List<PropertyAccessorElement>(fieldCount);
-    for (int i = 0; i < fieldCount; i++) {
-      accessors[i] = fields[i].getter;
-    }
-    doubleElement.accessors = accessors;
-    doubleElement.methods = <MethodElement>[
-        ElementFactory.methodElement("remainder", _doubleType, [_numType]),
-        ElementFactory.methodElement("+", _doubleType, [_numType]),
-        ElementFactory.methodElement("-", _doubleType, [_numType]),
-        ElementFactory.methodElement("*", _doubleType, [_numType]),
-        ElementFactory.methodElement("%", _doubleType, [_numType]),
-        ElementFactory.methodElement("/", _doubleType, [_numType]),
-        ElementFactory.methodElement("~/", _doubleType, [_numType]),
-        ElementFactory.methodElement("-", _doubleType),
-        ElementFactory.methodElement("abs", _doubleType),
-        ElementFactory.methodElement("round", _doubleType),
-        ElementFactory.methodElement("floor", _doubleType),
-        ElementFactory.methodElement("ceil", _doubleType),
-        ElementFactory.methodElement("truncate", _doubleType),
-        ElementFactory.methodElement("toString", _stringType)];
-  }
-
-  /**
-   * Given a class element representing a class with type parameters, propagate those type
-   * parameters to all of the accessors, methods and constructors defined for the class.
-   *
-   * @param classElement the element representing the class with type parameters
-   */
-  void _propagateTypeArguments(ClassElementImpl classElement) {
-    List<DartType> typeArguments =
-        TypeParameterTypeImpl.getTypes(classElement.typeParameters);
-    for (PropertyAccessorElement accessor in classElement.accessors) {
-      FunctionTypeImpl functionType = accessor.type as FunctionTypeImpl;
-      functionType.typeArguments = typeArguments;
-    }
-    for (MethodElement method in classElement.methods) {
-      FunctionTypeImpl functionType = method.type as FunctionTypeImpl;
-      functionType.typeArguments = typeArguments;
-    }
-    for (ConstructorElement constructor in classElement.constructors) {
-      FunctionTypeImpl functionType = constructor.type as FunctionTypeImpl;
-      functionType.typeArguments = typeArguments;
-    }
-  }
-}
-
-@ReflectiveTestCase()
+@reflectiveTest
 class TypeOverrideManagerTest extends EngineTestCase {
   void test_exitScope_noScopes() {
     TypeOverrideManager manager = new TypeOverrideManager();
@@ -11663,7 +11189,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class TypePropagationTest extends ResolverTestCase {
   void fail_mergePropagatedTypesAtJoinPoint_1() {
     // https://code.google.com/p/dart/issues/detail?id=19929
@@ -13139,7 +12665,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class TypeProviderImplTest extends EngineTestCase {
   void test_creation() {
     //
@@ -13226,7 +12752,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class TypeResolverVisitorTest extends EngineTestCase {
   /**
    * The error listener to which errors will be reported.
diff --git a/pkg/analyzer/test/generated/scanner_test.dart b/pkg/analyzer/test/generated/scanner_test.dart
index 05cf061..59321ec 100644
--- a/pkg/analyzer/test/generated/scanner_test.dart
+++ b/pkg/analyzer/test/generated/scanner_test.dart
@@ -20,7 +20,7 @@
   runReflectiveTests(TokenTypeTest);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class CharSequenceReaderTest {
   void test_advance() {
     CharSequenceReader reader = new CharSequenceReader("x");
@@ -124,7 +124,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class KeywordStateTest {
   void test_KeywordState() {
     //
@@ -168,7 +168,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ScannerTest {
   void fail_incomplete_string_interpolation() {
     // https://code.google.com/p/dart/issues/detail?id=18073
@@ -1341,7 +1341,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class TokenTypeTest extends EngineTestCase {
   void test_isOperator() {
     expect(TokenType.AMPERSAND.isOperator, isTrue);
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
index e694c14..0ceb9d4 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
@@ -17,7 +17,7 @@
   runReflectiveTests(StaticTypeWarningCodeTest);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class StaticTypeWarningCodeTest extends ResolverTestCase {
   void fail_inaccessibleSetter() {
     Source source = addSource(r'''
diff --git a/pkg/analyzer/test/generated/static_warning_code_test.dart b/pkg/analyzer/test/generated/static_warning_code_test.dart
index 44cc510..716899a 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -18,7 +18,7 @@
   runReflectiveTests(StaticWarningCodeTest);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class StaticWarningCodeTest extends ResolverTestCase {
   void fail_undefinedGetter() {
     Source source = addSource(r'''
@@ -1403,15 +1403,12 @@
   }
 
   void test_importOfNonLibrary() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 part of lib;
 class A {}''', r'''
 library lib;
 import 'lib1.dart' deferred as p;
 var a = new p.A();'''],
-          <ErrorCode>[
-              CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY,
-              ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[StaticWarningCode.IMPORT_OF_NON_LIBRARY]);
   }
 
@@ -3063,7 +3060,7 @@
   }
 
   void test_typeAnnotationDeferredClass_asExpression() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class A {}''', r'''
 library root;
@@ -3071,12 +3068,11 @@
 f(var v) {
   v as a.A;
 }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_catchClause() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class A {}''', r'''
 library root;
@@ -3086,12 +3082,11 @@
   } on a.A {
   }
 }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_fieldFormalParameter() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class A {}''', r'''
 library root;
@@ -3100,35 +3095,32 @@
   var v;
   C(a.A this.v);
 }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_functionDeclaration_returnType() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class A {}''', r'''
 library root;
 import 'lib1.dart' deferred as a;
 a.A f() { return null; }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void
       test_typeAnnotationDeferredClass_functionTypedFormalParameter_returnType() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class A {}''', r'''
 library root;
 import 'lib1.dart' deferred as a;
 f(a.A g()) {}'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_isExpression() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class A {}''', r'''
 library root;
@@ -3136,12 +3128,11 @@
 f(var v) {
   bool b = v is a.A;
 }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_methodDeclaration_returnType() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class A {}''', r'''
 library root;
@@ -3149,66 +3140,60 @@
 class C {
   a.A m() { return null; }
 }'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_simpleFormalParameter() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class A {}''', r'''
 library root;
 import 'lib1.dart' deferred as a;
 f(a.A v) {}'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_typeArgumentList() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class A {}''', r'''
 library root;
 import 'lib1.dart' deferred as a;
 class C<E> {}
 C<a.A> c;'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_typeArgumentList2() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class A {}''', r'''
 library root;
 import 'lib1.dart' deferred as a;
 class C<E, F> {}
 C<a.A, a.A> c;'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[
               StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS,
               StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_typeParameter_bound() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class A {}''', r'''
 library root;
 import 'lib1.dart' deferred as a;
 class C<E extends a.A> {}'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_variableDeclarationList() {
-    resolveWithAndWithoutExperimental(<String>[r'''
+    resolveWithErrors(<String>[r'''
 library lib1;
 class A {}''', r'''
 library root;
 import 'lib1.dart' deferred as a;
 a.A v;'''],
-          <ErrorCode>[ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED],
           <ErrorCode>[StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart
index 15d39b9..02a3667 100644
--- a/pkg/analyzer/test/generated/utilities_test.dart
+++ b/pkg/analyzer/test/generated/utilities_test.dart
@@ -61,7 +61,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class AstClonerTest extends EngineTestCase {
   void test_visitAdjacentStrings() {
     _assertClone(
@@ -2053,7 +2053,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class BooleanArrayTest {
   void test_get_negative() {
     try {
@@ -2113,7 +2113,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class DirectedGraphTest extends EngineTestCase {
   void test_addEdge() {
     DirectedGraph<DirectedGraphTest_Node> graph =
@@ -3251,7 +3251,7 @@
   StringLiteral get(UriBasedDirective node) => node.uri;
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class LineInfoTest {
   void test_creation() {
     expect(new LineInfo(<int>[0]), isNotNull);
@@ -3563,7 +3563,7 @@
   NodeList<Statement> getList(SwitchMember node) => node.statements;
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class ListUtilitiesTest {
   void test_addAll_emptyToEmpty() {
     List<String> list = new List<String>();
@@ -3596,7 +3596,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class MultipleMapIteratorTest extends EngineTestCase {
   void test_multipleMaps_firstEmpty() {
     Map<String, String> map1 = new HashMap<String, String>();
@@ -3714,7 +3714,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class NodeReplacerTest extends EngineTestCase {
   /**
    * An empty list of tokens.
@@ -4764,7 +4764,7 @@
   NodeList<C> getList(P parent);
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class SingleMapIteratorTest extends EngineTestCase {
   void test_empty() {
     Map<String, String> map = new HashMap<String, String>();
@@ -4822,7 +4822,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class SourceRangeTest {
   void test_access() {
     SourceRange r = new SourceRange(10, 1);
@@ -4972,7 +4972,7 @@
   }
 }
 
-@ReflectiveTestCase()
+@reflectiveTest
 class StringUtilitiesTest {
   void test_EMPTY() {
     expect(StringUtilities.EMPTY, "");
@@ -5229,7 +5229,7 @@
 }
 
 
-@ReflectiveTestCase()
+@reflectiveTest
 class TokenMapTest {
   void test_creation() {
     expect(new TokenMap(), isNotNull);
diff --git a/pkg/analyzer/test/instrumentation/instrumentation_test.dart b/pkg/analyzer/test/instrumentation/instrumentation_test.dart
index a0345a7..ec2aa7c 100644
--- a/pkg/analyzer/test/instrumentation/instrumentation_test.dart
+++ b/pkg/analyzer/test/instrumentation/instrumentation_test.dart
@@ -12,11 +12,12 @@
 main() {
   group('instrumentation', () {
     runReflectiveTests(InstrumentationServiceTest);
+    runReflectiveTests(MulticastInstrumentationServerTest);
   });
 }
 
-@ReflectiveTestCase()
-class InstrumentationServiceTest extends ReflectiveTestCase {
+@reflectiveTest
+class InstrumentationServiceTest {
   void assertNormal(TestInstrumentationServer server, String tag,
       String message) {
     String sent = server.normalChannel.toString();
@@ -55,6 +56,32 @@
     assertNormal(server, InstrumentationService.TAG_EXCEPTION, '$message:null');
   }
 
+  void test_logFileRead() {
+    TestInstrumentationServer server = new TestInstrumentationServer();
+    InstrumentationService service = new InstrumentationService(server);
+    String path = '/file/path';
+    int time = 978336000000;
+    String content = 'class C {\n}\n';
+    service.logFileRead(path, time, content);
+    assertNormal(
+        server,
+        InstrumentationService.TAG_FILE_READ,
+        '$path:$time:$content');
+  }
+
+  void test_logLogEntry() {
+    TestInstrumentationServer server = new TestInstrumentationServer();
+    InstrumentationService service = new InstrumentationService(server);
+    String level = 'level';
+    DateTime time = new DateTime(2001);
+    String message = 'message';
+    service.logLogEntry(level, time, message);
+    assertNormal(
+        server,
+        InstrumentationService.TAG_LOG_ENTRY,
+        '$level:${time.millisecondsSinceEpoch}:$message');
+  }
+
   void test_logNotification() {
     TestInstrumentationServer server = new TestInstrumentationServer();
     InstrumentationService service = new InstrumentationService(server);
@@ -80,6 +107,47 @@
   }
 }
 
+@reflectiveTest
+class MulticastInstrumentationServerTest {
+  TestInstrumentationServer serverA = new TestInstrumentationServer();
+  TestInstrumentationServer serverB = new TestInstrumentationServer();
+  MulticastInstrumentationServer server;
+
+  void setUp() {
+    server = new MulticastInstrumentationServer([serverA, serverB]);
+  }
+
+  void test_log() {
+    server.log('foo bar');
+    _assertNormal(serverA, 'foo bar');
+    _assertNormal(serverB, 'foo bar');
+  }
+
+  void test_logWithPriority() {
+    server.logWithPriority('foo bar');
+    _assertPriority(serverA, 'foo bar');
+    _assertPriority(serverB, 'foo bar');
+  }
+
+  void test_shutdown() {
+    server.shutdown();
+  }
+
+  void _assertNormal(TestInstrumentationServer server, String message) {
+    String sent = server.normalChannel.toString();
+    if (!sent.endsWith('$message\n')) {
+      fail('Expected "...$message", found "$sent"');
+    }
+  }
+
+  void _assertPriority(TestInstrumentationServer server, String message) {
+    String sent = server.priorityChannel.toString();
+    if (!sent.endsWith('$message\n')) {
+      fail('Expected "...$message", found "$sent"');
+    }
+  }
+}
+
 class TestInstrumentationServer implements InstrumentationServer {
   StringBuffer normalChannel = new StringBuffer();
   StringBuffer priorityChannel = new StringBuffer();
diff --git a/pkg/analyzer/test/options_test.dart b/pkg/analyzer/test/options_test.dart
index 5f1bfd6..3d16370 100644
--- a/pkg/analyzer/test/options_test.dart
+++ b/pkg/analyzer/test/options_test.dart
@@ -18,7 +18,6 @@
       expect(options.dartSdkPath, isNotNull);
       expect(options.disableHints, isFalse);
       expect(options.displayVersion, isFalse);
-      expect(options.enableEnum, isFalse);
       expect(options.enableTypeChecks, isFalse);
       expect(options.ignoreUnrecognizedFlags, isFalse);
       expect(options.log, isFalse);
@@ -46,12 +45,6 @@
       expect(options.definedVariables['bar'], isNull);
     });
 
-    test('enable enum', () {
-      CommandLineOptions options =
-          CommandLineOptions.parse(['--dart-sdk', '.', '--enable-enum', 'foo.dart']);
-      expect(options.enableEnum, isTrue);
-    });
-
     test('enable type checks', () {
       CommandLineOptions options = CommandLineOptions.parse(
           ['--dart-sdk', '.', '--enable_type_checks', 'foo.dart']);
diff --git a/pkg/analyzer/test/reflective_tests.dart b/pkg/analyzer/test/reflective_tests.dart
index 2730680..80c9073 100644
--- a/pkg/analyzer/test/reflective_tests.dart
+++ b/pkg/analyzer/test/reflective_tests.dart
@@ -4,7 +4,7 @@
 
 library reflective_tests;
 
-@MirrorsUsed(metaTargets: 'ReflectiveTestCase')
+@MirrorsUsed(metaTargets: 'ReflectiveTest')
 import 'dart:mirrors';
 import 'dart:async';
 
@@ -31,10 +31,10 @@
   ClassMirror classMirror = reflectClass(type);
   if (!classMirror.metadata.any(
       (InstanceMirror annotation) =>
-          annotation.type.reflectedType == ReflectiveTestCase)) {
+          annotation.type.reflectedType == ReflectiveTest)) {
     String name = MirrorSystem.getName(classMirror.qualifiedName);
     throw new Exception(
-        'Class $name must have annotation "@ReflectiveTestCase()" '
+        'Class $name must have annotation "@reflectiveTest" '
             'in order to be run by runReflectiveTests.');
   }
   String className = MirrorSystem.getName(classMirror.simpleName);
@@ -124,6 +124,12 @@
  * A marker annotation used to instruct dart2js to keep reflection information
  * for the annotated classes.
  */
-class ReflectiveTestCase {
-  const ReflectiveTestCase();
+class ReflectiveTest {
+  const ReflectiveTest();
 }
+
+/**
+ * A marker annotation used to instruct dart2js to keep reflection information
+ * for the annotated classes.
+ */
+const ReflectiveTest reflectiveTest = const ReflectiveTest();
diff --git a/pkg/analyzer2dart/lib/src/cps_generator.dart b/pkg/analyzer2dart/lib/src/cps_generator.dart
index 7efa423..369b5da 100644
--- a/pkg/analyzer2dart/lib/src/cps_generator.dart
+++ b/pkg/analyzer2dart/lib/src/cps_generator.dart
@@ -65,11 +65,12 @@
       analyzer.PropertyInducingElement field, VariableDeclaration node) {

     dart2js.FieldElement element = converter.convertElement(field);

     return withBuilder(

-        new IrBuilder(DART_CONSTANT_SYSTEM,

-                      element,

-                      // TODO(johnniwinther): Supported closure variables.

-                      const <dart2js.Local>[]),

+        new DartIrBuilder(DART_CONSTANT_SYSTEM,

+                          element,

+                          // TODO(johnniwinther): Supported closure variables.

+                          new NullClosureVariableInfo()),

         () {

+      irBuilder.buildFieldInitializerHeader();

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

       return irBuilder.makeFieldDefinition(initializer);

     });

@@ -79,16 +80,13 @@
       analyzer.FunctionElement function, FunctionExpression node) {

     dart2js.FunctionElement element = converter.convertElement(function);

     return withBuilder(

-        new IrBuilder(DART_CONSTANT_SYSTEM,

-                      element,

-                      // TODO(johnniwinther): Supported closure variables.

-                      const <dart2js.Local>[]),

+        new DartIrBuilder(DART_CONSTANT_SYSTEM,

+                          element,

+                          // TODO(johnniwinther): Supported closure variables.

+                          new NullClosureVariableInfo()),

         () {

-      function.parameters.forEach((analyzer.ParameterElement parameter) {

-        // TODO(johnniwinther): Support "closure variables", that is variables

-        // accessed from an inner function.

-        irBuilder.createFunctionParameter(converter.convertElement(parameter));

-      });

+      irBuilder.buildFunctionHeader(

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

       // Visit the body directly to avoid processing the signature as

       // expressions.

       visit(node.body);

@@ -521,3 +519,7 @@
         isTypeTest: false);

   }

 }

+

+class NullClosureVariableInfo extends ClosureVariableInfo {

+  Iterable get capturedVariables => const [];

+}

diff --git a/pkg/analyzer2dart/lib/src/util.dart b/pkg/analyzer2dart/lib/src/util.dart
index 18d0a86..34bc33d 100644
--- a/pkg/analyzer2dart/lib/src/util.dart
+++ b/pkg/analyzer2dart/lib/src/util.dart
@@ -9,7 +9,7 @@
 import 'package:analyzer/analyzer.dart';

 import 'package:analyzer/src/generated/source.dart';

 import 'package:compiler/src/universe/universe.dart';

-import 'package:compiler/src/source_file.dart';

+import 'package:compiler/src/io/source_file.dart';

 

 Selector createSelectorFromMethodInvocation(ArgumentList node,

                                             String name) {

diff --git a/pkg/async_helper/lib/async_helper.dart b/pkg/async_helper/lib/async_helper.dart
index 808e198..37496bc 100644
--- a/pkg/async_helper/lib/async_helper.dart
+++ b/pkg/async_helper/lib/async_helper.dart
@@ -91,4 +91,4 @@
 void asyncTest(f()) {
   asyncStart();
   f().then(asyncSuccess);
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/apiimpl.dart b/pkg/compiler/lib/src/apiimpl.dart
index 8567fb3..6f9250d 100644
--- a/pkg/compiler/lib/src/apiimpl.dart
+++ b/pkg/compiler/lib/src/apiimpl.dart
@@ -12,7 +12,7 @@
 import 'elements/elements.dart' as elements;
 import 'package:_internal/libraries.dart' hide LIBRARIES;
 import 'package:_internal/libraries.dart' as library_info show LIBRARIES;
-import 'source_file.dart';
+import 'io/source_file.dart';
 
 const bool forceIncrementalSupport =
     const bool.fromEnvironment('DART2JS_EXPERIMENTAL_INCREMENTAL_SUPPORT');
@@ -70,6 +70,7 @@
             sourceMapUri: extractUriOption(options, '--source-map='),
             outputUri: extractUriOption(options, '--out='),
             terseDiagnostics: hasOption(options, '--terse'),
+            deferredMapUri: extractUriOption(options, '--deferred-map='),
             dumpInfo: hasOption(options, '--dump-info'),
             buildId: extractStringOption(
                 options, '--build-id=',
@@ -91,11 +92,17 @@
         userHandlerTask = new leg.GenericTask('Diagnostic handler', this),
         userProviderTask = new leg.GenericTask('Input provider', this),
     ]);
-    if (!libraryRoot.path.endsWith("/")) {
-      throw new ArgumentError("libraryRoot must end with a /");
+    if (libraryRoot == null) {
+      throw new ArgumentError("[libraryRoot] is null.");
     }
-    if (packageRoot != null && !packageRoot.path.endsWith("/")) {
-      throw new ArgumentError("packageRoot must end with a /");
+    if (!libraryRoot.path.endsWith("/")) {
+      throw new ArgumentError("[libraryRoot] must end with a /.");
+    }
+    if (packageRoot == null) {
+      throw new ArgumentError("[packageRoot] is null.");
+    }
+    if (!packageRoot.path.endsWith("/")) {
+      throw new ArgumentError("[packageRoot] must end with a /.");
     }
     if (!analyzeOnly) {
       if (enableAsyncAwait) {
@@ -309,10 +316,6 @@
   }
 
   Uri translatePackageUri(leg.Spannable node, Uri uri) {
-    if (packageRoot == null) {
-      reportFatalError(
-          node, leg.MessageKind.PACKAGE_ROOT_NOT_SET, {'uri': uri});
-    }
     return packageRoot.resolve(uri.path);
   }
 
diff --git a/pkg/compiler/lib/src/closure.dart b/pkg/compiler/lib/src/closure.dart
index fc78950..46219a33 100644
--- a/pkg/compiler/lib/src/closure.dart
+++ b/pkg/compiler/lib/src/closure.dart
@@ -104,7 +104,7 @@
 // find a more general solution.
 class ClosureFieldElement extends ElementX
     implements VariableElement, CapturedVariable {
-  /// The source variable this element refers to.
+  /// The [BoxLocal] or [LocalElement] being accessed through the field.
   final Local local;
 
   ClosureFieldElement(String name,
@@ -301,25 +301,25 @@
 // The box-element for a scope, and the captured variables that need to be
 // stored in the box.
 class ClosureScope {
-  BoxLocal boxElement;
-  Map<VariableElement, BoxFieldElement> _capturedVariableMapping;
+  final BoxLocal boxElement;
+  final Map<Local, BoxFieldElement> capturedVariables;
 
   // If the scope is attached to a [For] contains the variables that are
   // declared in the initializer of the [For] and that need to be boxed.
   // Otherwise contains the empty List.
   List<VariableElement> boxedLoopVariables = const <VariableElement>[];
 
-  ClosureScope(this.boxElement, this._capturedVariableMapping);
+  ClosureScope(this.boxElement, this.capturedVariables);
 
   bool hasBoxedLoopVariables() => !boxedLoopVariables.isEmpty;
 
   bool isCapturedVariable(VariableElement variable) {
-    return _capturedVariableMapping.containsKey(variable);
+    return capturedVariables.containsKey(variable);
   }
 
   void forEachCapturedVariable(f(LocalVariableElement variable,
                                  BoxFieldElement boxField)) {
-    _capturedVariableMapping.forEach(f);
+    capturedVariables.forEach(f);
   }
 }
 
@@ -335,19 +335,12 @@
   // other argument. It is only set for instance-members.
   final ThisLocal thisLocal;
 
-  // Maps free locals, arguments and function elements to their captured
-  // copies.
-  final Map<Local, CapturedVariable> _freeVariableMapping =
+  // Maps free locals, arguments, function elements, and box locals to
+  // their locations.
+  final Map<Local, CapturedVariable> freeVariableMap =
       new Map<Local, CapturedVariable>();
 
-  // Maps closure-fields to their captured elements. This is somehow the inverse
-  // mapping of [freeVariableMapping], but whereas [freeVariableMapping] does
-  // not deal with boxes, here we map instance-fields (which might represent
-  // boxes) to their boxElement.
-  final Map<ClosureFieldElement, Local> _closureFieldMapping =
-      new Map<ClosureFieldElement, Local>();
-
-  // Maps scopes ([Loop] and [FunctionExpression] nodes) to their
+  // Maps [Loop] and [FunctionExpression] nodes to their
   // [ClosureScope] which contains their box and the
   // captured variables that are stored in the box.
   // This map will be empty if the method/closure of this [ClosureData] does not
@@ -362,45 +355,23 @@
                   this.thisLocal);
 
   void addFreeVariable(Local element) {
-    assert(_freeVariableMapping[element] == null);
-    _freeVariableMapping[element] = null;
+    assert(freeVariableMap[element] == null);
+    freeVariableMap[element] = null;
   }
 
-  Iterable<Local> get freeVariables => _freeVariableMapping.keys;
+  Iterable<Local> get freeVariables => freeVariableMap.keys;
 
   bool isFreeVariable(Local element) {
-    return _freeVariableMapping.containsKey(element);
+    return freeVariableMap.containsKey(element);
   }
 
-  CapturedVariable getFreeVariableElement(Local element) {
-    return _freeVariableMapping[element];
-  }
-
-  /// Sets the free [variable] to be captured by the [boxField].
-  void setFreeVariableBoxField(Local variable,
-                               BoxFieldElement boxField) {
-    _freeVariableMapping[variable] = boxField;
-  }
-
-  /// Sets the free [variable] to be captured by the [closureField].
-  void setFreeVariableClosureField(Local variable,
-                                   ClosureFieldElement closureField) {
-    _freeVariableMapping[variable] = closureField;
-  }
-
-
   void forEachFreeVariable(f(Local variable,
                              CapturedVariable field)) {
-    _freeVariableMapping.forEach(f);
+    freeVariableMap.forEach(f);
   }
 
   Local getLocalVariableForClosureField(ClosureFieldElement field) {
-    return _closureFieldMapping[field];
-  }
-
-  void setLocalVariableForClosureField(ClosureFieldElement field,
-      Local variable) {
-    _closureFieldMapping[field] = variable;
+    return field.local;
   }
 
   bool get isClosure => closureElement != null;
@@ -412,7 +383,7 @@
   }
 
   bool isVariableBoxed(Local variable) {
-    CapturedVariable copy = _freeVariableMapping[variable];
+    CapturedVariable copy = freeVariableMap[variable];
     if (copy is BoxFieldElement) {
       return true;
     }
@@ -421,7 +392,7 @@
 
   void forEachCapturedVariable(void f(Local variable,
                                       CapturedVariable field)) {
-    _freeVariableMapping.forEach((variable, copy) {
+    freeVariableMap.forEach((variable, copy) {
       if (variable is BoxLocal) return;
       f(variable, copy);
     });
@@ -432,7 +403,7 @@
 
   void forEachBoxedVariable(void f(LocalVariableElement local,
                                    BoxFieldElement field)) {
-    _freeVariableMapping.forEach((variable, copy) {
+    freeVariableMap.forEach((variable, copy) {
       if (!isVariableBoxed(variable)) return;
       f(variable, copy);
     });
@@ -442,7 +413,7 @@
   }
 
   void removeMyselfFrom(Universe universe) {
-    _freeVariableMapping.values.forEach((e) {
+    freeVariableMap.values.forEach((e) {
       universe.closurizedMembers.remove(e);
       universe.fieldSetters.remove(e);
       universe.fieldGetters.remove(e);
@@ -544,7 +515,7 @@
       Iterable<Local> freeVariables = data.freeVariables.toList();
       freeVariables.forEach((Local fromElement) {
         assert(data.isFreeVariable(fromElement));
-        assert(data.getFreeVariableElement(fromElement) == null);
+        assert(data.freeVariableMap[fromElement] == null);
         assert(isCapturedVariable(fromElement));
         BoxFieldElement boxFieldElement =
             getCapturedVariableBoxField(fromElement);
@@ -554,7 +525,7 @@
           fieldCaptures.add(fromElement);
         } else {
           // A boxed element.
-          data.setFreeVariableBoxField(fromElement, boxFieldElement);
+          data.freeVariableMap[fromElement] = boxFieldElement;
           boxes.add(boxFieldElement.box);
         }
       });
@@ -566,8 +537,7 @@
         ClosureFieldElement closureField =
             new ClosureFieldElement(name, local, closureClass);
         closureClass.addField(closureField, compiler);
-        data.setLocalVariableForClosureField(closureField, local);
-        data.setFreeVariableClosureField(local, closureField);
+        data.freeVariableMap[local] = closureField;
       }
 
       // Add the box elements first so we get the same ordering.
@@ -848,7 +818,30 @@
   }
 
   visitFor(For node) {
-    visitLoop(node);
+    inNewScope(node, () {
+      // First visit initializer and update so we can easily check if a loop
+      // variable was captured in one of these subexpressions.
+      if (node.initializer != null) visit(node.initializer);
+      if (node.update != null) visit(node.update);
+
+      // Loop variables that have not been captured yet can safely be flagged as
+      // non-mutated, because no nested function can observe the mutation.
+      if (node.initializer is VariableDefinitions) {
+        VariableDefinitions definitions = node.initializer;
+        definitions.definitions.nodes.forEach((Node node) {
+          LocalVariableElement local = elements[node];
+          if (!isCapturedVariable(local)) {
+            mutatedVariables.remove(local);
+          }
+        });
+      }
+
+      // Visit condition and body.
+      // This must happen after the above, so any loop variables mutated in the
+      // condition or body are indeed flagged as mutated.
+      if (node.conditionStatement != null) visit(node.conditionStatement);
+      if (node.body != null) visit(node.body);
+    });
     // See if we have declared loop variables that need to be boxed.
     if (node.initializer == null) return;
     VariableDefinitions definitions = node.initializer.asVariableDefinitions();
diff --git a/pkg/compiler/lib/src/compile_time_constants.dart b/pkg/compiler/lib/src/compile_time_constants.dart
index 31eb5b3..24bacbe 100644
--- a/pkg/compiler/lib/src/compile_time_constants.dart
+++ b/pkg/compiler/lib/src/compile_time_constants.dart
@@ -133,8 +133,9 @@
     Node node = element.node;
     if (pendingVariables.contains(element)) {
       if (isConst) {
-        compiler.reportFatalError(
+        compiler.reportError(
             node, MessageKind.CYCLIC_COMPILE_TIME_CONSTANTS);
+        return new ErroneousConstantExpression();
       }
       return null;
     }
@@ -155,7 +156,7 @@
         if (elementType.isMalformed && !value.value.isNull) {
           if (isConst) {
             ErroneousElement element = elementType.element;
-            compiler.reportFatalError(
+            compiler.reportError(
                 node, element.messageKind, element.messageArguments);
           } else {
             // We need to throw an exception at runtime.
@@ -166,7 +167,7 @@
           if (!constantSystem.isSubtype(compiler.types,
                                         constantType, elementType)) {
             if (isConst) {
-              compiler.reportFatalError(
+              compiler.reportError(
                   node, MessageKind.NOT_ASSIGNABLE,
                   {'fromType': constantType, 'toType': elementType});
             } else {
@@ -507,6 +508,16 @@
         assert(elements.isTypeLiteral(send));
         return makeTypeConstant(send, elements.getTypeLiteralType(send));
       } else if (send.receiver != null) {
+        if (send.selector.asIdentifier().source == "length") {
+          AstConstant left = evaluate(send.receiver);
+          if (left != null && left.value.isString) {
+            StringConstantValue stringConstantValue = left.value;
+            DartString string = stringConstantValue.primitiveValue;
+            IntConstantValue length = constantSystem.createInt(string.length);
+            return new AstConstant(
+                context, send, new VariableConstantExpression(length, element));
+          }
+        }
         // Fall through to error handling.
       } else if (!Elements.isUnresolved(element)
                  && element.isVariable
@@ -520,7 +531,7 @@
       }
       return signalNotCompileTimeConstant(send);
     } else if (send.isCall) {
-      if (identical(element, compiler.identicalFunction)
+      if (element == compiler.identicalFunction
           && send.argumentCount() == 2) {
         AstConstant left = evaluate(send.argumentsNode.nodes.head);
         AstConstant right = evaluate(send.argumentsNode.nodes.tail.head);
@@ -605,9 +616,10 @@
     } else if (!condition.value.isBool) {
       DartType conditionType = condition.value.getType(compiler.coreTypes);
       if (isEvaluatingConstant) {
-        compiler.reportFatalError(
+        compiler.reportError(
             node.condition, MessageKind.NOT_ASSIGNABLE,
             {'fromType': conditionType, 'toType': compiler.boolClass.rawType});
+        return new ErroneousAstConstant(context, node);
       }
       return null;
     }
@@ -655,10 +667,14 @@
     if (!selector.applies(target, compiler.world)) {
       String name = Elements.constructorNameForDiagnostics(
           target.enclosingClass.name, target.name);
-      compiler.reportFatalError(
+      compiler.reportError(
           node,
           MessageKind.INVALID_CONSTRUCTOR_ARGUMENTS,
           {'constructorName': name});
+
+      return new List<AstConstant>.filled(
+          target.functionSignature.parameterCount,
+          new ErroneousAstConstant(context, node));
     }
     return selector.makeArgumentsList2(arguments,
                                        target,
@@ -728,14 +744,14 @@
       ConstantValue defaultValue = normalizedArguments[1].value;
 
       if (firstArgument.isNull) {
-        compiler.reportFatalError(
+        compiler.reportError(
             send.arguments.head, MessageKind.NULL_NOT_ALLOWED);
         return null;
       }
 
       if (!firstArgument.isString) {
         DartType type = defaultValue.getType(compiler.coreTypes);
-        compiler.reportFatalError(
+        compiler.reportError(
             send.arguments.head, MessageKind.NOT_ASSIGNABLE,
             {'fromType': type, 'toType': compiler.stringClass.rawType});
         return null;
@@ -744,7 +760,7 @@
       if (constructor == compiler.intEnvironment &&
           !(defaultValue.isNull || defaultValue.isInt)) {
         DartType type = defaultValue.getType(compiler.coreTypes);
-        compiler.reportFatalError(
+        compiler.reportError(
             send.arguments.tail.head, MessageKind.NOT_ASSIGNABLE,
             {'fromType': type, 'toType': compiler.intClass.rawType});
         return null;
@@ -753,7 +769,7 @@
       if (constructor == compiler.boolEnvironment &&
           !(defaultValue.isNull || defaultValue.isBool)) {
         DartType type = defaultValue.getType(compiler.coreTypes);
-        compiler.reportFatalError(
+        compiler.reportError(
             send.arguments.tail.head, MessageKind.NOT_ASSIGNABLE,
             {'fromType': type, 'toType': compiler.boolClass.rawType});
         return null;
@@ -762,7 +778,7 @@
       if (constructor == compiler.stringEnvironment &&
           !(defaultValue.isNull || defaultValue.isString)) {
         DartType type = defaultValue.getType(compiler.coreTypes);
-        compiler.reportFatalError(
+        compiler.reportError(
             send.arguments.tail.head, MessageKind.NOT_ASSIGNABLE,
             {'fromType': type, 'toType': compiler.stringClass.rawType});
         return null;
@@ -810,7 +826,8 @@
       Selector selector,
       List<AstConstant> concreteArguments,
       List<AstConstant> normalizedArguments) {
-    assert(invariant(node, selector.applies(constructor, compiler.world),
+    assert(invariant(node, selector.applies(constructor, compiler.world) ||
+                     compiler.compilationFailed,
         message: "Selector $selector does not apply to constructor "
                  "$constructor."));
 
@@ -850,13 +867,16 @@
   error(Node node, MessageKind message) {
     // TODO(floitsch): get the list of constants that are currently compiled
     // and present some kind of stack-trace.
-    compiler.reportFatalError(node, message);
+    compiler.reportError(node, message);
   }
 
   AstConstant signalNotCompileTimeConstant(Node node,
       {MessageKind message: MessageKind.NOT_A_COMPILE_TIME_CONSTANT}) {
     if (isEvaluatingConstant) {
       error(node, message);
+
+      return new AstConstant(
+          null, node, new PrimitiveConstantExpression(new NullConstantValue()));
     }
     // Else we don't need to do anything. The final handler is only
     // optimistically trying to compile constants. So it is normal that we
@@ -913,7 +933,7 @@
       if (!constantSystem.isSubtype(compiler.types,
                                     constantType, elementType)) {
         compiler.withCurrentElement(constant.element, () {
-          compiler.reportFatalError(
+          compiler.reportError(
               constant.node, MessageKind.NOT_ASSIGNABLE,
               {'fromType': constantType, 'toType': elementType});
         });
@@ -1098,4 +1118,10 @@
   ConstantValue get value => expression.value;
 
   String toString() => expression.toString();
-}
\ No newline at end of file
+}
+
+/// A synthetic constant used to recover from errors.
+class ErroneousAstConstant extends AstConstant {
+  ErroneousAstConstant(Element element, Node node)
+      : super(element, node, new ErroneousConstantExpression());
+}
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 4646013..1d31f07 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -669,6 +669,7 @@
   final bool trustPrimitives;
   final bool enableConcreteTypeInference;
   final bool disableTypeInferenceFlag;
+  final Uri deferredMapUri;
   final bool dumpInfo;
   final bool useContentSecurityPolicy;
   final bool enableExperimentalMirrors;
@@ -985,6 +986,7 @@
             this.outputUri: null,
             this.buildId: UNDETERMINED_BUILD_ID,
             this.terseDiagnostics: false,
+            this.deferredMapUri: null,
             this.dumpInfo: false,
             this.showPackageWarnings: false,
             this.useContentSecurityPolicy: false,
@@ -1531,7 +1533,7 @@
     // compile-time constants that are metadata.  This means adding
     // something to the resolution queue.  So we cannot wait with
     // this until after the resolution queue is processed.
-    deferredLoadTask.ensureMetadataResolved(this);
+    deferredLoadTask.beforeResolution(this);
 
     phase = PHASE_RESOLVING;
     if (analyzeAll) {
@@ -1788,34 +1790,6 @@
         node, messageKind, arguments, api.Diagnostic.ERROR);
   }
 
-  /**
-   * Reports an error and then aborts the compiler. Avoid using this method.
-   *
-   * In order to support incremental compilation, it is preferable to use
-   * [reportError]. However, care must be taken to leave the compiler in a
-   * consistent state, for example, by creating synthetic erroneous objects.
-   *
-   * If there's absolutely no way to leave the compiler in a consistent state,
-   * calling this method is preferred as it will set [compilerWasCancelled] to
-   * true which alerts the incremental compiler to discard all state and start
-   * a new compiler. Throwing an exception is also better, as this will set
-   * [hasCrashed] which the incremental compiler also listens too (but don't
-   * throw exceptions, it creates a really bad user experience).
-   *
-   * In any case, calling this method is a last resort, as it essentially
-   * breaks the user experience of the incremental compiler. The purpose of the
-   * incremental compiler is to improve developer productivity. Developers
-   * frequently make mistakes, so syntax errors and spelling errors are
-   * considered normal to the incremental compiler.
-   */
-  void reportFatalError(Spannable node, MessageKind messageKind,
-                        [Map arguments = const {}]) {
-    reportError(node, messageKind, arguments);
-    // TODO(ahe): Make this only abort the current method.
-    throw new CompilerCancelledException(
-        'Error: Cannot continue due to previous error.');
-  }
-
   void reportWarning(Spannable node, MessageKind messageKind,
                      [Map arguments = const {}]) {
     reportDiagnosticInternal(
@@ -2155,7 +2129,12 @@
   }
 }
 
-class CompilerCancelledException implements Exception {
+/// 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);
 
diff --git a/pkg/compiler/lib/src/constant_system_dart.dart b/pkg/compiler/lib/src/constant_system_dart.dart
index 30fb62e..0c507a7 100644
--- a/pkg/compiler/lib/src/constant_system_dart.dart
+++ b/pkg/compiler/lib/src/constant_system_dart.dart
@@ -233,6 +233,12 @@
       NumConstantValue rightNum = right;
       double result = leftNum.primitiveValue + rightNum.primitiveValue;
       return DART_CONSTANT_SYSTEM.createDouble(result);
+    } else if (left.isString && right.isString) {
+      StringConstantValue leftString = left;
+      StringConstantValue rightString = right;
+      DartString result = new DartString.concat(leftString.primitiveValue,
+                                                rightString.primitiveValue);
+      return DART_CONSTANT_SYSTEM.createString(result);
     } else {
       return null;
     }
diff --git a/pkg/compiler/lib/src/constants/expressions.dart b/pkg/compiler/lib/src/constants/expressions.dart
index fe1357d..ef416fa 100644
--- a/pkg/compiler/lib/src/constants/expressions.dart
+++ b/pkg/compiler/lib/src/constants/expressions.dart
@@ -45,6 +45,17 @@
   }
 }
 
+/// A synthetic constant used to recover from errors.
+class ErroneousConstantExpression extends ConstantExpression {
+  final PrimitiveConstantValue value = new NullConstantValue();
+
+  ErroneousConstantExpression();
+
+  accept(ConstantExpressionVisitor visitor, [context]) {
+    // Do nothing. This is an error.
+  }
+}
+
 /// Boolean, int, double, string, or null constant.
 class PrimitiveConstantExpression extends ConstantExpression {
   final PrimitiveConstantValue value;
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 3a1ea5d..4f42e9d 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
@@ -9,12 +9,15 @@
 import '../dart_types.dart';
 import '../dart2jslib.dart';
 import '../elements/elements.dart';
-import '../source_file.dart';
+import '../io/source_file.dart';
 import '../tree/tree.dart' as ast;
 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 '../closure.dart' as closurelib;
+import '../js_backend/js_backend.dart' show JavaScriptBackend;
 
 part 'cps_ir_builder_visitor.dart';
 
@@ -24,18 +27,18 @@
 /// [ir.Primitive] that is their value.  Parameters and locals are
 /// assigned indexes which can be used to refer to them.
 class Environment {
-  /// A map from elements to their environment index.
-  final Map<Element, int> variable2index;
+  /// A map from locals to their environment index.
+  final Map<Local, int> variable2index;
 
   /// A reverse map from environment indexes to the variable.
-  final List<Element> index2variable;
+  final List<Local> index2variable;
 
   /// A map from environment indexes to their value.
   final List<ir.Primitive> index2value;
 
   Environment.empty()
-      : variable2index = <Element, int>{},
-        index2variable = <Element>[],
+      : variable2index = <Local, int>{},
+        index2variable = <Local>[],
         index2value = <ir.Primitive>[];
 
   /// Construct an environment that is a copy of another one.
@@ -43,14 +46,14 @@
   /// The mapping from elements to indexes is shared, not copied.
   Environment.from(Environment other)
       : variable2index = other.variable2index,
-        index2variable = new List<Element>.from(other.index2variable),
+        index2variable = new List<Local>.from(other.index2variable),
         index2value = new List<ir.Primitive>.from(other.index2value);
 
   get length => index2variable.length;
 
   ir.Primitive operator [](int index) => index2value[index];
 
-  void extend(Element element, ir.Primitive value) {
+  void extend(Local element, ir.Primitive value) {
     // Assert that the name is not already in the environment.  `null` is used
     // as the name of anonymous variables.  Because the variable2index map is
     // shared, `null` can already occur.  This is safe because such variables
@@ -64,14 +67,13 @@
     index2value.add(value);
   }
 
-  ir.Primitive lookup(Element element) {
-    assert(!element.isConst);
+  ir.Primitive lookup(Local element) {
     assert(invariant(element, variable2index.containsKey(element),
                      message: "Unknown variable: $element."));
     return index2value[variable2index[element]];
   }
 
-  void update(Element element, ir.Primitive value) {
+  void update(Local element, ir.Primitive value) {
     index2value[variable2index[element]] = value;
   }
 
@@ -82,7 +84,7 @@
     assert(other.length >= length);
     for (int i = 0; i < length; ++i) {
       // An index maps to the same variable in both environments.
-      Element variable = index2variable[i];
+      Local variable = index2variable[i];
       if (variable != other.index2variable[i]) return false;
 
       // The variable maps to the same index in both environments.
@@ -179,8 +181,6 @@
 
 /// Shared state between IrBuilders of nested functions.
 class IrBuilderClosureState {
-  final Iterable<Entity> closureLocals;
-
   /// Maps local variables to their corresponding [ClosureVariable] object.
   final Map<Local, ir.ClosureVariable> local2closure =
       <Local, ir.ClosureVariable>{};
@@ -194,13 +194,12 @@
     return function2closures.putIfAbsent(element, () => <ir.ClosureVariable>[]);
   }
 
-  IrBuilderClosureState(this.closureLocals) {
-    for (Local local in closureLocals) {
-      ExecutableElement context = local.executableContext;
-      ir.ClosureVariable variable = new ir.ClosureVariable(context, local);
-      local2closure[local] = variable;
-      getClosureList(context).add(variable);
-    }
+  /// 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);
   }
 }
 
@@ -222,21 +221,60 @@
 
   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);
 }
 
 /// A factory for building the cps IR.
-class IrBuilder {
+///
+/// [DartIrBuilder] and [JsIrBuilder] implement nested functions and captured
+/// variables in different ways.
+abstract class IrBuilder {
+  IrBuilder _makeInstance();
+
+  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]
+  /// and [buildLocalSet].
+  void _buildClosureEnvironmentSetup(ClosureEnvironment env);
+
+  /// Enter a scope that declares boxed variables. The boxed variables must
+  /// subsequently be accessible using [buildLocalGet], [buildLocalSet], etc.
+  void _buildClosureScopeSetup(ClosureScope scope);
+
+  /// 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);
+
   // 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>[];
 
-  final IrBuilderSharedState state;
+  IrBuilderSharedState state;
 
-  final IrBuilderClosureState closure;
+  IrBuilderClosureState closure;
 
   /// A map from variable indexes to their values.
+  ///
+  /// [BoxLocal]s map to their box. [LocalElement]s that are boxed are not
+  /// in the map; look up their [BoxLocal] instead.
   Environment environment;
 
   // The IR builder maintains a context, which is an expression with a hole in
@@ -266,12 +304,12 @@
   ir.Expression _root = null;
   ir.Expression _current = null;
 
-  IrBuilder(ConstantSystem constantSystem,
-            ExecutableElement currentElement,
-            Iterable<Entity> closureLocals)
-      : this.state = new IrBuilderSharedState(constantSystem, currentElement),
-        this.closure = new IrBuilderClosureState(closureLocals),
-        this.environment = new Environment.empty();
+  /// Initialize a new top-level IR builder.
+  void _init(ConstantSystem constantSystem, ExecutableElement currentElement) {
+    state = new IrBuilderSharedState(constantSystem, currentElement);
+    closure = new IrBuilderClosureState();
+    environment = new Environment.empty();
+  }
 
   /// Construct a delimited visitor for visiting a subtree.
   ///
@@ -279,10 +317,12 @@
   /// local variables to their values, which is initially a copy of the parent
   /// environment.  It has its own context for building an IR expression, so
   /// the built expression is not plugged into the parent's context.
-  IrBuilder.delimited(IrBuilder parent)
-      : this.state = parent.state,
-        this.closure = parent.closure,
-        this.environment = new Environment.from(parent.environment);
+  IrBuilder makeDelimitedBuilder() {
+    return _makeInstance()
+        ..state = state
+        ..closure = closure
+        ..environment = new Environment.from(environment);
+  }
 
   /// Construct a visitor for a recursive continuation.
   ///
@@ -292,101 +332,53 @@
   /// recursive invocations will be passed values for all the local variables,
   /// which may be eliminated later if they are redundant---if they take on
   /// the same value at all invocation sites.
-  IrBuilder.recursive(IrBuilder parent)
-      : this.state = parent.state,
-        this.closure = parent.closure,
-        this.environment = new Environment.empty() {
-    parent.environment.index2variable.forEach(createLocalParameter);
+  IrBuilder makeRecursiveBuilder() {
+    IrBuilder inner = _makeInstance()
+        ..state = state
+        ..closure = closure
+        ..environment = new Environment.empty();
+    environment.index2variable.forEach(inner.createLocalParameter);
+    return inner;
   }
 
   /// Construct a builder for an inner function.
-  IrBuilder.innerFunction(IrBuilder parent,
-                          ExecutableElement currentElement)
-      : this.state = new IrBuilderSharedState(parent.state.constantSystem,
-                                              currentElement),
-        this.closure = parent.closure,
-        this.environment = new Environment.empty();
-
+  IrBuilder makeInnerFunctionBuilder(ExecutableElement currentElement) {
+    return _makeInstance()
+        ..state = new IrBuilderSharedState(state.constantSystem, currentElement)
+        ..closure = closure
+        ..environment = new Environment.empty();
+  }
 
   bool get isOpen => _root == null || _current != null;
 
-  /// True if [element] is a local variable, local function, or parameter that
-  /// is accessed from an inner function. Recursive self-references in a local
-  /// function count as closure accesses.
-  ///
-  /// If `true`, [element] is a [LocalElement].
-  bool isClosureVariable(Element element) {
-    return closure.closureLocals.contains(element);
+
+  void buildFieldInitializerHeader({ClosureScope closureScope}) {
+    _buildClosureScopeSetup(closureScope);
   }
 
-  /// Returns the [ClosureVariable] corresponding to the given variable.
-  /// Returns `null` for non-closure variables.
-  ir.ClosureVariable getClosureVariable(LocalElement element) {
-    return closure.local2closure[element];
+  void buildFunctionHeader(Iterable<ParameterElement> parameters,
+                          {ClosureScope closureScope,
+                           ClosureEnvironment closureEnvironment}) {
+    _buildClosureEnvironmentSetup(closureEnvironment);
+    _buildClosureScopeSetup(closureScope);
+    parameters.forEach(_createFunctionParameter);
   }
 
-  /// Adds the given parameter to the function currently being built.
-  void createFunctionParameter(ParameterElement parameterElement) {
-    if (isClosureVariable(parameterElement)) {
-      state.functionParameters.add(getClosureVariable(parameterElement));
-    } else {
-      state.functionParameters.add(createLocalParameter(parameterElement));
-    }
-  }
-
-  /// Create a parameter for [parameterElement] and add it to the current
-  /// environment.
-  ir.Parameter createLocalParameter(LocalElement parameterElement) {
-    ir.Parameter parameter = new ir.Parameter(parameterElement);
+  /// Creates a parameter for [local] and adds it to the current environment.
+  ir.Parameter createLocalParameter(Local local) {
+    ir.Parameter parameter = new ir.Parameter(local);
     _parameters.add(parameter);
-    environment.extend(parameterElement, parameter);
+    environment.extend(local, parameter);
     return parameter;
   }
 
-  /// Add the constant [variableElement] to the environment with [value] as its
+  /// Adds the constant [variableElement] to the environment with [value] as its
   /// constant value.
   void declareLocalConstant(LocalVariableElement variableElement,
                             ConstantExpression value) {
     state.localConstants.add(new ConstDeclaration(variableElement, value));
   }
 
-  /// Add [variableElement] to the environment with [initialValue] as its
-  /// initial value.
-  void declareLocalVariable(LocalVariableElement variableElement,
-                            {ir.Primitive initialValue}) {
-    assert(isOpen);
-    if (initialValue == null) {
-      // TODO(kmillikin): Consider pooling constants.
-      // The initial value is null.
-      initialValue = buildNullLiteral();
-    }
-    if (isClosureVariable(variableElement)) {
-      add(new ir.SetClosureVariable(getClosureVariable(variableElement),
-                                    initialValue,
-                                    isDeclaration: true));
-    } else {
-      // In case a primitive was introduced for the initializer expression,
-      // use this variable element to help derive a good name for it.
-      initialValue.useElementAsHint(variableElement);
-      environment.extend(variableElement, initialValue);
-    }
-  }
-
-  /// Add [functionElement] to the environment with provided [definition].
-  void declareLocalFunction(LocalFunctionElement functionElement,
-                            ir.FunctionDefinition definition) {
-    assert(isOpen);
-    if (isClosureVariable(functionElement)) {
-      ir.ClosureVariable variable = getClosureVariable(functionElement);
-      add(new ir.DeclareFunction(variable, definition));
-    } else {
-      ir.CreateFunction prim = new ir.CreateFunction(definition);
-      add(new ir.LetPrim(prim));
-      environment.extend(functionElement, prim);
-      prim.useElementAsHint(functionElement);
-    }
-  }
-
   // Plug an expression into the 'hole' in the context being accumulated.  The
   // empty context (just a hole) is represented by root (and current) being
   // null.  Since the hole in the current context is filled by this function,
@@ -522,8 +514,8 @@
     assert(isOpen);
 
     // The then and else expressions are delimited.
-    IrBuilder thenBuilder = new IrBuilder.delimited(this);
-    IrBuilder elseBuilder = new IrBuilder.delimited(this);
+    IrBuilder thenBuilder = makeDelimitedBuilder();
+    IrBuilder elseBuilder = makeDelimitedBuilder();
     ir.Primitive thenValue = buildThenExpression(thenBuilder);
     ir.Primitive elseValue = buildElseExpression(elseBuilder);
 
@@ -561,13 +553,6 @@
 
   }
 
-  /// Create a function expression from [definition].
-  ir.Primitive buildFunctionExpression(ir.FunctionDefinition definition) {
-    ir.CreateFunction prim = new ir.CreateFunction(definition);
-    add(new ir.LetPrim(prim));
-    return prim;
-  }
-
   /**
    * Add an explicit `return null` for functions that don't have a return
    * statement on each branch. This includes functions with an empty body,
@@ -766,44 +751,12 @@
         (k) => new ir.ConcatenateStrings(k, arguments));
   }
 
-  /// Create a read access of [local].
-  ir.Primitive buildLocalGet(LocalElement local) {
-    assert(isOpen);
-    if (isClosureVariable(local)) {
-      ir.Primitive result =
-          new ir.GetClosureVariable(getClosureVariable(local));
-      add(new ir.LetPrim(result));
-      return result;
-    } else {
-      return environment.lookup(local);
-    }
-  }
-
-  /// Create a write access to [local] with the provided [value].
-  ir.Primitive buildLocalSet(LocalElement local, ir.Primitive value) {
-    assert(isOpen);
-    if (isClosureVariable(local)) {
-      add(new ir.SetClosureVariable(getClosureVariable(local), value));
-    } else {
-      value.useElementAsHint(local);
-      environment.update(local, value);
-    }
-    return value;
-  }
-
   /// Create an invocation of [local] where the argument structure is defined
   /// by [selector] and the argument values are defined by [arguments].
   ir.Primitive buildLocalInvocation(LocalElement local,
                                     Selector selector,
                                     List<ir.Definition> arguments) {
-    ir.Primitive receiver;
-    if (isClosureVariable(local)) {
-      receiver = new ir.GetClosureVariable(getClosureVariable(local));
-      add(new ir.LetPrim(receiver));
-    } else {
-      receiver = environment.lookup(local);
-    }
-    return _buildInvokeCall(receiver, selector, arguments);
+    return _buildInvokeCall(buildLocalGet(local), selector, arguments);
   }
 
   /// Create an invocation of the [functionExpression] where the argument
@@ -829,8 +782,8 @@
     assert(isOpen);
 
     // The then and else parts are delimited.
-    IrBuilder thenBuilder = new IrBuilder.delimited(this);
-    IrBuilder elseBuilder = new IrBuilder.delimited(this);
+    IrBuilder thenBuilder = makeDelimitedBuilder();
+    IrBuilder elseBuilder = makeDelimitedBuilder();
     buildThenPart(thenBuilder);
     buildElsePart(elseBuilder);
 
@@ -913,11 +866,16 @@
   ///
   /// The jump [target] is used to identify which `break` and `continue`
   /// statements that have this `for` statement as their target.
+  ///
+  /// 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.
   void buildFor({SubbuildFunction buildInitializer,
                  SubbuildFunction buildCondition,
                  SubbuildFunction buildBody,
                  SubbuildFunction buildUpdate,
-                 JumpTarget target}) {
+                 JumpTarget target,
+                 ClosureScope closureScope}) {
     assert(isOpen);
 
     // For loops use four named continuations: the entry to the condition,
@@ -942,9 +900,23 @@
     // 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);
+    }
+
     buildInitializer(this);
 
-    IrBuilder condBuilder = new IrBuilder.recursive(this);
+    IrBuilder condBuilder = makeRecursiveBuilder();
     ir.Primitive condition = buildCondition(condBuilder);
     if (condition == null) {
       // If the condition is empty then the body is entered unconditionally.
@@ -956,7 +928,14 @@
     state.breakCollectors.add(breakCollector);
     state.continueCollectors.add(continueCollector);
 
-    IrBuilder bodyBuilder = new IrBuilder.delimited(condBuilder);
+    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);
+    }
+
     buildBody(bodyBuilder);
     assert(state.breakCollectors.last == breakCollector);
     assert(state.continueCollectors.last == continueCollector);
@@ -969,8 +948,11 @@
     // is instead placed just outside the body of the body continuation.
     bool hasContinues = !continueCollector.isEmpty;
     IrBuilder updateBuilder = hasContinues
-        ? new IrBuilder.recursive(condBuilder)
+        ? condBuilder.makeRecursiveBuilder()
         : bodyBuilder;
+    if (hasBoxedLoopVariables) {
+      updateBuilder._migrateLoopVariables(closureScope);
+    }
     buildUpdate(updateBuilder);
 
     // Create body entry and loop exit continuations and a branch to them.
@@ -1056,21 +1038,22 @@
                    Element variableElement,
                    Selector variableSelector,
                    SubbuildFunction buildBody,
-                   JumpTarget target}) {
+                   JumpTarget target,
+                   ClosureScope closureScope}) {
     // The for-in loop
     //
     // for (a in e) s;
     //
     // Is compiled analogously to:
     //
-    // a = e.iterator;
-    // while (a.moveNext()) {
-    //   var n0 = a.current;
+    // it = e.iterator;
+    // while (it.moveNext()) {
+    //   var a = it.current;
     //   s;
     // }
 
     // The condition and body are delimited.
-    IrBuilder condBuilder = new IrBuilder.recursive(this);
+    IrBuilder condBuilder = makeRecursiveBuilder();
 
     ir.Primitive expressionReceiver = buildExpression(this);
     List<ir.Primitive> emptyArguments = new List<ir.Primitive>();
@@ -1094,7 +1077,8 @@
     state.breakCollectors.add(breakCollector);
     state.continueCollectors.add(continueCollector);
 
-    IrBuilder bodyBuilder = new IrBuilder.delimited(condBuilder);
+    IrBuilder bodyBuilder = condBuilder.makeDelimitedBuilder();
+    bodyBuilder._buildClosureScopeSetup(closureScope);
     if (buildVariableDeclaration != null) {
       buildVariableDeclaration(bodyBuilder);
     }
@@ -1170,7 +1154,8 @@
   /// statements that have this `while` statement as their target.
   void buildWhile({SubbuildFunction buildCondition,
                    SubbuildFunction buildBody,
-                   JumpTarget target}) {
+                   JumpTarget target,
+                   ClosureScope closureScope}) {
     assert(isOpen);
     // While loops use four named continuations: the entry to the body, the
     // loop exit, the loop back edge (continue), and the loop exit (break).
@@ -1189,7 +1174,7 @@
     // statement occurs in the exit continuation).
 
     // The condition and body are delimited.
-    IrBuilder condBuilder = new IrBuilder.recursive(this);
+    IrBuilder condBuilder = makeRecursiveBuilder();
     ir.Primitive condition = buildCondition(condBuilder);
 
     JumpCollector breakCollector = new JumpCollector(target);
@@ -1197,7 +1182,8 @@
     state.breakCollectors.add(breakCollector);
     state.continueCollectors.add(continueCollector);
 
-    IrBuilder bodyBuilder = new IrBuilder.delimited(condBuilder);
+    IrBuilder bodyBuilder = condBuilder.makeDelimitedBuilder();
+    bodyBuilder._buildClosureScopeSetup(closureScope);
     buildBody(bodyBuilder);
     assert(state.breakCollectors.last == breakCollector);
     assert(state.continueCollectors.last == continueCollector);
@@ -1375,18 +1361,18 @@
     // The translation must convert both e0 and e1 to booleans and handle
     // local variable assignments in e1.
 
-    IrBuilder rightBuilder = new IrBuilder.delimited(this);
+    IrBuilder rightBuilder = makeDelimitedBuilder();
     ir.Primitive rightValue = buildRightValue(rightBuilder);
     // A dummy empty target for the branch on the left subexpression branch.
     // This enables using the same infrastructure for join-point continuations
     // as in visitIf and visitConditional.  It will hold a definition of the
     // appropriate constant and an invocation of the join-point continuation.
-    IrBuilder emptyBuilder = new IrBuilder.delimited(this);
+    IrBuilder emptyBuilder = makeDelimitedBuilder();
     // Dummy empty targets for right true and right false.  They hold
     // definitions of the appropriate constant and an invocation of the
     // join-point continuation.
-    IrBuilder rightTrueBuilder = new IrBuilder.delimited(rightBuilder);
-    IrBuilder rightFalseBuilder = new IrBuilder.delimited(rightBuilder);
+    IrBuilder rightTrueBuilder = rightBuilder.makeDelimitedBuilder();
+    IrBuilder rightFalseBuilder = rightBuilder.makeDelimitedBuilder();
 
     // If we don't evaluate the right subexpression, the value of the whole
     // expression is this constant.
@@ -1448,12 +1434,15 @@
     return joinContinuation.parameters.last;
   }
 
-  /// Creates an access to `this`.
+  /// 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() {
-    assert(isOpen);
-    ir.Primitive result = new ir.This();
-    add(new ir.LetPrim(result));
-    return result;
+    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.
@@ -1561,3 +1550,336 @@
     return join;
   }
 }
+
+/// Dart-specific subclass of [IrBuilder].
+///
+/// Inner functions are represented by a [FunctionDefinition] with the
+/// IR for the inner function nested inside.
+///
+/// Captured variables are translated to ref cells (see [ClosureVariable])
+/// using [GetClosureVariable] and [SetClosureVariable].
+class DartIrBuilder extends IrBuilder {
+  ClosureVariableInfo closureVariables;
+
+  IrBuilder _makeInstance() => new DartIrBuilder._blank(closureVariables);
+  DartIrBuilder._blank(this.closureVariables);
+
+  DartIrBuilder(ConstantSystem constantSystem,
+                ExecutableElement currentElement,
+                this.closureVariables) {
+    _init(constantSystem, currentElement);
+    closureVariables.capturedVariables.forEach(closure.makeClosureVariable);
+  }
+
+  /// True if [local] is stored in a [ClosureVariable].
+  bool isInClosureVariable(Local local) {
+    return closure.local2closure.containsKey(local);
+  }
+
+  /// Gets the [ClosureVariable] containing the value of [local].
+  ir.ClosureVariable getClosureVariable(Local local) {
+    return closure.local2closure[local];
+  }
+
+  void _buildClosureScopeSetup(ClosureScope scope) {
+    assert(scope == null);
+  }
+
+  void _buildClosureEnvironmentSetup(ClosureEnvironment env) {
+    assert(env == null);
+  }
+
+  void _migrateLoopVariables(ClosureScope scope) {
+    assert(scope == null);
+  }
+
+  void _createFunctionParameter(ParameterElement parameterElement) {
+    ir.Parameter parameter = new ir.Parameter(parameterElement);
+    _parameters.add(parameter);
+    if (isInClosureVariable(parameterElement)) {
+      state.functionParameters.add(getClosureVariable(parameterElement));
+    } else {
+      state.functionParameters.add(parameter);
+      environment.extend(parameterElement, parameter);
+    }
+  }
+
+  void declareLocalVariable(LocalVariableElement variableElement,
+                            {ir.Primitive initialValue}) {
+    assert(isOpen);
+    if (initialValue == null) {
+      initialValue = buildNullLiteral();
+    }
+    if (isInClosureVariable(variableElement)) {
+      add(new ir.SetClosureVariable(getClosureVariable(variableElement),
+                                    initialValue,
+                                    isDeclaration: true));
+    } else {
+      initialValue.useElementAsHint(variableElement);
+      environment.extend(variableElement, initialValue);
+    }
+  }
+
+  /// Add [functionElement] to the environment with provided [definition].
+  void declareLocalFunction(LocalFunctionElement functionElement,
+                            ir.FunctionDefinition definition) {
+    assert(isOpen);
+    if (isInClosureVariable(functionElement)) {
+      ir.ClosureVariable variable = getClosureVariable(functionElement);
+      add(new ir.DeclareFunction(variable, definition));
+    } else {
+      ir.CreateFunction prim = new ir.CreateFunction(definition);
+      add(new ir.LetPrim(prim));
+      environment.extend(functionElement, prim);
+      prim.useElementAsHint(functionElement);
+    }
+  }
+
+  /// Create a function expression from [definition].
+  ir.Primitive buildFunctionExpression(ir.FunctionDefinition definition) {
+    ir.CreateFunction prim = new ir.CreateFunction(definition);
+    add(new ir.LetPrim(prim));
+    return prim;
+  }
+
+  /// Create a read access of [local].
+  ir.Primitive buildLocalGet(LocalElement local) {
+    assert(isOpen);
+    if (isInClosureVariable(local)) {
+      ir.Primitive result = new ir.GetClosureVariable(getClosureVariable(local));
+      result.useElementAsHint(local);
+      add(new ir.LetPrim(result));
+      return result;
+    } else {
+      return environment.lookup(local);
+    }
+  }
+
+  /// Create a write access to [local] with the provided [value].
+  ir.Primitive buildLocalSet(LocalElement local, ir.Primitive value) {
+    assert(isOpen);
+    if (isInClosureVariable(local)) {
+      add(new ir.SetClosureVariable(getClosureVariable(local), value));
+    } else {
+      value.useElementAsHint(local);
+      environment.update(local, value);
+    }
+    return value;
+  }
+
+
+}
+
+/// JS-specific subclass of [IrBuilder].
+///
+/// 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();
+
+  JsIrBuilder(ConstantSystem constantSystem, ExecutableElement currentElement) {
+    _init(constantSystem, currentElement);
+  }
+
+  void _buildClosureEnvironmentSetup(ClosureEnvironment env) {
+    if (env == null) return;
+
+    // Obtain a reference to the function object (this).
+    ir.Primitive thisPrim = new ir.This();
+    add(new ir.LetPrim(thisPrim));
+
+    // Obtain access to the free variables.
+    env.freeVariables.forEach((Local local, ClosureLocation location) {
+      if (location.isBox) {
+        // Boxed variables are loaded from their box on-demand.
+        state.boxedVariables[local] = location;
+      } else {
+        // Unboxed variables are loaded from the function object immediately.
+        // This includes BoxLocals which are themselves unboxed variables.
+        ir.Primitive load = new ir.GetField(thisPrim, location.field);
+        add(new ir.LetPrim(load));
+        environment.extend(local, load);
+      }
+    });
+
+    // 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);
+    }
+
+    // If the function has a self-reference, use the value of `this`.
+    if (env.selfReference != null) {
+      environment.extend(env.selfReference, thisPrim);
+    }
+  }
+
+  void _buildClosureScopeSetup(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));
+      if (location.isBox) {
+        state.boxedVariables[local] = location;
+      }
+    });
+  }
+
+  void _createFunctionParameter(ParameterElement parameterElement) {
+    ir.Parameter parameter = new ir.Parameter(parameterElement);
+    _parameters.add(parameter);
+    state.functionParameters.add(parameter);
+    ClosureLocation location = state.boxedVariables[parameterElement];
+    if (location != null) {
+      add(new ir.SetField(environment.lookup(location.box),
+                          location.field,
+                          parameter));
+    } else {
+      environment.extend(parameterElement, parameter);
+    }
+  }
+
+  void declareLocalVariable(LocalElement variableElement,
+                            {ir.Primitive initialValue}) {
+    assert(isOpen);
+    if (initialValue == null) {
+      initialValue = buildNullLiteral();
+    }
+    ClosureLocation location = state.boxedVariables[variableElement];
+    if (location != null) {
+      add(new ir.SetField(environment.lookup(location.box),
+                          location.field,
+                          initialValue));
+    } else {
+      initialValue.useElementAsHint(variableElement);
+      environment.extend(variableElement, initialValue);
+    }
+  }
+
+  /// Add [functionElement] to the environment with provided [definition].
+  void declareLocalFunction(LocalFunctionElement functionElement,
+                            ClosureClassElement classElement) {
+    ir.Primitive closure = buildFunctionExpression(classElement);
+    declareLocalVariable(functionElement, initialValue: closure);
+  }
+
+  ir.Primitive buildFunctionExpression(ClosureClassElement classElement) {
+    List<ir.Primitive> arguments = <ir.Primitive>[];
+    for (ClosureFieldElement field in classElement.closureFields) {
+      arguments.add(environment.lookup(field.local));
+    }
+    ir.Primitive closure = new ir.CreateClosureClass(classElement, arguments);
+    add(new ir.LetPrim(closure));
+    return closure;
+  }
+
+  /// Create a read access of [local].
+  ir.Primitive buildLocalGet(LocalElement local) {
+    assert(isOpen);
+    ClosureLocation location = state.boxedVariables[local];
+    if (location != null) {
+      ir.Primitive result = new ir.GetField(environment.lookup(location.box),
+                                            location.field);
+      result.useElementAsHint(local);
+      add(new ir.LetPrim(result));
+      return result;
+    } else {
+      return environment.lookup(local);
+    }
+  }
+
+  /// 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];
+    if (location != null) {
+      add(new ir.SetField(environment.lookup(location.box),
+                          location.field,
+                          value));
+    } else {
+      value.useElementAsHint(local);
+      environment.update(local, value);
+    }
+    return value;
+  }
+
+  void _migrateLoopVariables(ClosureScope scope) {
+    if (scope == null) return;
+    ir.Primitive box = environment.lookup(scope.box);
+    ir.Primitive newBox = new ir.CreateBox();
+    newBox.useElementAsHint(scope.box);
+    add(new ir.LetPrim(newBox));
+    for (VariableElement loopVar in scope.boxedLoopVariables) {
+      ClosureLocation location = scope.capturedVariables[loopVar];
+      ir.Primitive get = new ir.GetField(box, location.field);
+      add(new ir.LetPrim(get));
+      add(new ir.SetField(newBox, location.field, get));
+    }
+    environment.update(scope.box, newBox);
+  }
+
+}
+
+
+/// Location of a variable relative to a given closure.
+class ClosureLocation {
+  /// If not `null`, this location is [box].[field].
+  /// The location of [box] can be obtained separately from an
+  /// enclosing [ClosureEnvironment] or [ClosureScope].
+  /// If `null`, then the location is [field] on the enclosing function object.
+  final BoxLocal box;
+
+  /// The field in which the variable is stored.
+  final Entity field;
+
+  bool get isBox => box != null;
+
+  ClosureLocation(this.box, this.field);
+}
+
+/// Introduces a new box and binds local variables to this box.
+///
+/// A [ClosureScope] may exist for each function and for each loop.
+/// Generally, one may pass `null` to the [IrBuilder] instead of a
+/// [ClosureScope] when a given scope has no boxed variables.
+class ClosureScope {
+  /// This box is now in scope and [capturedVariables] may use it.
+  final BoxLocal box;
+
+  /// Maps [LocalElement]s to their location.
+  final Map<Local, ClosureLocation> capturedVariables;
+
+  /// If this is the scope of a for-loop, [boxedLoopVariables] is the list
+  /// of boxed variables that are declared in the initializer.
+  final List<VariableElement> boxedLoopVariables;
+
+  ClosureScope(this.box, this.capturedVariables, this.boxedLoopVariables);
+}
+
+/// Environment passed when building a nested function, describing how
+/// to access variables from the enclosing scope.
+class ClosureEnvironment {
+  /// References to this local should be treated as recursive self-reference.
+  /// (This is *not* in [freeVariables]).
+  final LocalFunctionElement selfReference;
+
+  /// If non-null, [thisLocal] has an entry in [freeVariables] describing where
+  /// to find the captured value of `this`.
+  final ThisLocal thisLocal;
+
+  /// Maps [LocalElement]s, [BoxLocal]s and [ThisLocal] to their location.
+  final Map<Local, ClosureLocation> freeVariables;
+
+  ClosureEnvironment(this.selfReference, this.thisLocal, this.freeVariables);
+}
+
+/// Information about which variables are captured in a closure.
+/// This is used by the [DartIrBuilder] instead of [ClosureScope] and
+/// [ClosureEnvironment].
+abstract class ClosureVariableInfo {
+  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 8d47781..25a9ff9 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
@@ -108,6 +108,7 @@
     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
@@ -131,6 +132,10 @@
   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
@@ -148,8 +153,74 @@
     });
   }
 
+  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`), 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].
-  /// Returns `null` if [element] has no initializer.
   ir.FieldDefinition buildField(FieldElement element) {
     assert(invariant(element, element.isImplementation));
     ast.VariableDefinitions definitions = element.node;
@@ -160,14 +231,12 @@
     }
     assert(fieldDefinition != null);
     assert(elements[fieldDefinition] != null);
-    DetectClosureVariables closureLocals =
-    new DetectClosureVariables(elements);
-        closureLocals.visit(fieldDefinition);
 
-    IrBuilder builder = new IrBuilder(compiler.backend.constantSystem,
-        element,
-        closureLocals.usedFromClosure);
+    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;
@@ -180,9 +249,12 @@
   ir.FunctionDefinition _makeFunctionBody(FunctionElement element,
                                           ast.FunctionExpression node) {
     FunctionSignature signature = element.functionSignature;
-    signature.orderedForEachParameter((ParameterElement parameterElement) {
-      irBuilder.createFunctionParameter(parameterElement);
-    });
+    List<ParameterElement> parameters = [];
+    signature.orderedForEachParameter(parameters.add);
+
+    irBuilder.buildFunctionHeader(parameters,
+                                  closureScope: getClosureScope(node),
+                                  closureEnvironment: getClosureEnvironment());
 
     List<ConstantExpression> defaults = new List<ConstantExpression>();
     signature.orderedOptionalParameters.forEach((ParameterElement element) {
@@ -212,7 +284,7 @@
     void tryAddInitializingFormal(ParameterElement parameterElement) {
       if (parameterElement.isInitializingFormal) {
         InitializingFormalElement initializingFormal = parameterElement;
-        withBuilder(new IrBuilder.delimited(irBuilder), () {
+        withBuilder(irBuilder.makeDelimitedBuilder(), () {
           ir.Primitive value = irBuilder.buildLocalGet(parameterElement);
           result.add(irBuilder.makeFieldInitializer(
               initializingFormal.fieldElement,
@@ -230,7 +302,7 @@
       if (initializer is ast.SendSet) {
         // Field initializer.
         FieldElement field = elements[initializer];
-        withBuilder(new IrBuilder.delimited(irBuilder), () {
+        withBuilder(irBuilder.makeDelimitedBuilder(), () {
           ir.Primitive value = visit(initializer.arguments.head);
           ir.RunnableBody body = irBuilder.makeRunnableBody(value);
           result.add(irBuilder.makeFieldInitializer(field, body));
@@ -244,7 +316,7 @@
         Selector selector = elements.getSelector(initializer);
         List<ir.RunnableBody> arguments =
             initializer.arguments.mapToList((ast.Node argument) {
-          return withBuilder(new IrBuilder.delimited(irBuilder), () {
+          return withBuilder(irBuilder.makeDelimitedBuilder(), () {
             ir.Primitive value = visit(argument);
             return irBuilder.makeRunnableBody(value);
           });
@@ -288,12 +360,6 @@
     if (!element.isSynthesized) {
       assert(node != null);
       assert(elements[node] != null);
-
-      // TODO(karlklose): this information should be provided by resolution.
-      DetectClosureVariables closureLocals =
-          new DetectClosureVariables(elements);
-      closureLocals.visit(node);
-      usedFromClosure = closureLocals.usedFromClosure;
     } else {
       SynthesizedConstructorElementX constructor = element;
       if (!constructor.isDefaultConstructor) {
@@ -303,9 +369,7 @@
       usedFromClosure = <Entity>[];
     }
 
-    IrBuilder builder = new IrBuilder(compiler.backend.constantSystem,
-                                      element,
-                                      usedFromClosure);
+    IrBuilder builder = makeIRBuilder(node, element);
 
     return withBuilder(builder, () => _makeFunctionBody(element, node));
   }
@@ -346,12 +410,13 @@
   }
 
   visitFor(ast.For node) {
-    // TODO(kmillikin,sigurdm): Handle closure variables declared in a for-loop.
-    if (node.initializer is ast.VariableDefinitions) {
+    // TODO(asgerf): Handle closure variables declared in a for-loop.
+    if (!isJavaScriptBackend && node.initializer is ast.VariableDefinitions) {
       ast.VariableDefinitions definitions = node.initializer;
       for (ast.Node definition in definitions.definitions.nodes) {
-        Element element = elements[definition];
-        if (irBuilder.isClosureVariable(element)) {
+        LocalElement element = elements[definition];
+        DartIrBuilder dartIrBuilder = irBuilder;
+        if (dartIrBuilder.isInClosureVariable(element)) {
           return giveup(definition, 'Closure variable in for loop initializer');
         }
       }
@@ -363,6 +428,7 @@
         buildCondition: subbuild(node.condition),
         buildBody: subbuild(node.body),
         buildUpdate: subbuildSequence(node.update),
+        closureScope: getClosureScope(node),
         target: target);
   }
 
@@ -379,7 +445,7 @@
     JumpTarget target = elements.getTargetDefinition(body);
     JumpCollector jumps = new JumpCollector(target);
     irBuilder.state.breakCollectors.add(jumps);
-    IrBuilder innerBuilder = new IrBuilder.delimited(irBuilder);
+    IrBuilder innerBuilder = irBuilder.makeDelimitedBuilder();
     withBuilder(innerBuilder, () {
       visit(body);
     });
@@ -420,7 +486,8 @@
     irBuilder.buildWhile(
         buildCondition: subbuild(node.condition),
         buildBody: subbuild(node.body),
-        target: elements.getTargetDefinition(node));
+        target: elements.getTargetDefinition(node),
+        closureScope: getClosureScope(node));
   }
 
   visitForIn(ast.ForIn node) {
@@ -439,7 +506,8 @@
         variableElement: variableElement,
         variableSelector: selector,
         buildBody: subbuild(node.body),
-        target: elements.getTargetDefinition(node));
+        target: elements.getTargetDefinition(node),
+        closureScope: getClosureScope(node));
   }
 
   ir.Primitive visitVariableDefinitions(ast.VariableDefinitions node) {
@@ -950,13 +1018,21 @@
     return irBuilder.buildConstantLiteral(constant);
   }
 
-  ir.FunctionDefinition makeSubFunction(ast.FunctionExpression node) {
-    FunctionElement element = elements[node];
-    assert(invariant(element, element.isImplementation));
+  /// 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 = new IrBuilder.innerFunction(irBuilder, element);
+      IrBuilder builder = irBuilder.makeInnerFunctionBuilder(element);
 
-    return withBuilder(builder, () => _makeFunctionBody(element, node));
+      return withBuilder(builder, () => _makeFunctionBody(element, node));
+    }
   }
 
   ir.Primitive visitFunctionExpression(ast.FunctionExpression node) {
@@ -965,7 +1041,7 @@
 
   visitFunctionDeclaration(ast.FunctionDeclaration node) {
     LocalFunctionElement element = elements[node.function];
-    ir.FunctionDefinition inner = makeSubFunction(node.function);
+    Object inner = makeSubFunction(node.function);
     irBuilder.declareLocalFunction(element, inner);
   }
 
@@ -994,19 +1070,17 @@
 /// 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 {
+class DetectClosureVariables extends ast.Visitor
+                             implements ClosureVariableInfo {
   final TreeElements elements;
   DetectClosureVariables(this.elements);
 
   FunctionElement currentFunction;
   bool insideInitializer = false;
-  Set<Local> usedFromClosure = new Set<Local>();
-  Set<FunctionElement> recursiveFunctions = new Set<FunctionElement>();
-
-  bool isClosureVariable(Entity entity) => usedFromClosure.contains(entity);
+  Set<Local> capturedVariables = new Set<Local>();
 
   void markAsClosureVariable(Local local) {
-    usedFromClosure.add(local);
+    capturedVariables.add(local);
   }
 
   visit(ast.Node node) => node.accept(this);
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 07bc61a..430eb6d 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
@@ -13,6 +13,7 @@
 import '../universe/universe.dart' show Selector, SelectorKind;
 import '../dart_types.dart' show DartType, GenericType;
 import '../cps_ir/optimizers.dart';
+import '../closure.dart' show ClosureClassElement;
 
 abstract class Node {
   /// A pointer to the parent node. Is null until set by optimization passes.
@@ -59,7 +60,7 @@
 abstract class Primitive extends Definition<Primitive> {
   /// The [VariableElement] or [ParameterElement] from which the primitive
   /// binding originated.
-  Element hint;
+  Entity hint;
 
   /// Register in which the variable binding this primitive can be allocated.
   /// Separate register spaces are used for primitives with different [element].
@@ -69,7 +70,7 @@
   /// Use the given element as a hint for naming this primitive.
   ///
   /// Has no effect if this primitive already has a non-null [element].
-  void useElementAsHint(Element hint) {
+  void useElementAsHint(Entity hint) {
     if (this.hint == null) {
       this.hint = hint;
     }
@@ -460,6 +461,55 @@
 /// to the Tree IR, which is implemented in JsTreeBuilder.
 abstract class JsSpecificNode {}
 
+/// Directly assigns to a field on a given object.
+class SetField extends Expression implements InteriorNode, JsSpecificNode {
+  final Reference<Primitive> object;
+  Element field;
+  final Reference<Primitive> value;
+  Expression body;
+
+  SetField(Primitive object, this.field, Primitive value)
+      : this.object = new Reference<Primitive>(object),
+        this.value = new Reference<Primitive>(value);
+
+  Expression plug(Expression expr) {
+    assert(body == null);
+    return body = expr;
+  }
+
+  accept(Visitor visitor) => visitor.visitSetField(this);
+}
+
+/// Directly reads from a field on a given object.
+class GetField extends Primitive implements JsSpecificNode {
+  final Reference<Primitive> object;
+  Element field;
+
+  GetField(Primitive object, this.field)
+      : this.object = new Reference<Primitive>(object);
+
+  accept(Visitor visitor) => visitor.visitGetField(this);
+}
+
+/// Creates an object for holding boxed variables captured by a closure.
+class CreateBox extends Primitive implements JsSpecificNode {
+  accept(Visitor visitor) => visitor.visitCreateBox(this);
+}
+
+/// Instantiates a synthetic class created by closure conversion.
+class CreateClosureClass extends Primitive implements JsSpecificNode {
+  final ClosureClassElement classElement;
+
+  /// Values and boxes for locals captured by the closure.
+  /// The order corresponds to [ClosureClassElement.closureFields].
+  final List<Reference<Primitive>> arguments;
+
+  CreateClosureClass(this.classElement, List<Primitive> arguments)
+      : this.arguments = _referenceList(arguments);
+
+  accept(Visitor visitor) => visitor.visitCreateClosureClass(this);
+}
+
 class Identical extends Primitive implements JsSpecificNode {
   final Reference<Primitive> left;
   final Reference<Primitive> right;
@@ -544,8 +594,8 @@
 }
 
 class Parameter extends Primitive {
-  Parameter(Element element) {
-    super.hint = element;
+  Parameter(Entity hint) {
+    super.hint = hint;
   }
 
   accept(Visitor visitor) => visitor.visitParameter(this);
@@ -757,6 +807,7 @@
   T visitTypeOperator(TypeOperator node) => visitExpression(node);
   T visitSetClosureVariable(SetClosureVariable node) => visitExpression(node);
   T visitDeclareFunction(DeclareFunction node) => visitExpression(node);
+  T visitSetField(SetField node) => visitExpression(node);
 
   // Definitions.
   T visitLiteralList(LiteralList node) => visitPrimitive(node);
@@ -769,6 +820,9 @@
   T visitParameter(Parameter node) => visitPrimitive(node);
   T visitContinuation(Continuation node) => visitDefinition(node);
   T visitClosureVariable(ClosureVariable node) => visitDefinition(node);
+  T visitGetField(GetField node) => visitDefinition(node);
+  T visitCreateBox(CreateBox node) => visitDefinition(node);
+  T visitCreateClosureClass(CreateClosureClass node) => visitDefinition(node);
 
   // Conditions.
   T visitIsTrue(IsTrue node) => visitCondition(node);
@@ -998,6 +1052,31 @@
     processInterceptor(node);
     processReference(node.input);
   }
+
+  processCreateClosureClass(CreateClosureClass node) {}
+  visitCreateClosureClass(CreateClosureClass node) {
+    processCreateClosureClass(node);
+    node.arguments.forEach(processReference);
+  }
+
+  processSetField(SetField node) {}
+  visitSetField(SetField node) {
+    processSetField(node);
+    processReference(node.object);
+    processReference(node.value);
+    visit(node.body);
+  }
+
+  processGetField(GetField node) {}
+  visitGetField(GetField node) {
+    processGetField(node);
+    processReference(node.object);
+  }
+
+  processCreateBox(CreateBox node) {}
+  visitCreateBox(CreateBox node) {
+    processCreateBox(node);
+  }
 }
 
 /// Keeps track of currently unused register indices.
@@ -1027,15 +1106,14 @@
 /// for removing all of the redundant variables.
 class RegisterAllocator extends Visitor {
   /// Separate register spaces for each source-level variable/parameter.
-  /// Note that null is used as key for primitives without elements.
-  final Map<Element, RegisterArray> elementRegisters =
-      <Element, RegisterArray>{};
+  /// Note that null is used as key for primitives without hints.
+  final Map<Local, RegisterArray> elementRegisters = <Local, RegisterArray>{};
 
-  RegisterArray getRegisterArray(Element element) {
-    RegisterArray registers = elementRegisters[element];
+  RegisterArray getRegisterArray(Local local) {
+    RegisterArray registers = elementRegisters[local];
     if (registers == null) {
       registers = new RegisterArray();
-      elementRegisters[element] = registers;
+      elementRegisters[local] = registers;
     }
     return registers;
   }
@@ -1203,6 +1281,23 @@
 
   // JavaScript specific nodes.
 
+  void visitSetField(SetField node) {
+    visit(node.body);
+    visitReference(node.value);
+    visitReference(node.object);
+  }
+
+  void visitGetField(GetField node) {
+    visitReference(node.object);
+  }
+
+  void visitCreateBox(CreateBox node) {
+  }
+
+  void visitCreateClosureClass(CreateClosureClass node) {
+    node.arguments.forEach(visitReference);
+  }
+
   void visitIdentical(Identical node) {
     visitReference(node.left);
     visitReference(node.right);
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 1a162c8..8496f54 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
@@ -228,6 +228,30 @@
     return '(IsTrue $value)';
   }
 
+  String visitSetField(SetField node) {
+    String object = access(node.object);
+    String field = node.field.name;
+    String value = access(node.value);
+    String body = indentBlock(() => visit(node.body));
+    return '$indentation(SetField $object $field $value)\n$body';
+  }
+
+  String visitGetField(GetField node) {
+    String object = access(node.object);
+    String field = node.field.toString();
+    return '(GetField $object $field)';
+  }
+
+  String visitCreateBox(CreateBox node) {
+    return '(CreateBox)';
+  }
+
+  String visitCreateClosureClass(CreateClosureClass node) {
+    String className = node.classElement.name;
+    String arguments = node.arguments.map(access).join(' ');
+    return '(CreateClosureClass $className ($arguments))';
+  }
+
   String visitIdentical(Identical node) {
     String left = access(node.left);
     String right = access(node.right);
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 c68ce94..c4d5f1f 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
@@ -251,6 +251,31 @@
     return "IsTrue(${names.name(node.value.definition)})";
   }
 
+  visitSetField(cps_ir.SetField node) {
+    String dummy = names.name(node);
+    String object = formatReference(node.object);
+    String field = node.field.name;
+    String value = formatReference(node.value);
+    printStmt(dummy, 'SetField $object.$field = $value');
+    visit(node.body);
+  }
+
+  visitGetField(cps_ir.GetField node) {
+    String object = formatReference(node.object);
+    String field = node.field.name;
+    return 'GetField($object.$field)';
+  }
+
+  visitCreateBox(cps_ir.CreateBox node) {
+    return 'CreateBox';
+  }
+
+  visitCreateClosureClass(cps_ir.CreateClosureClass node) {
+    String className = node.classElement.name;
+    String arguments = node.arguments.map(formatReference).join(', ');
+    return 'CreateClosureClass $className ($arguments)';
+  }
+
   visitIdentical(cps_ir.Identical node) {
     String left = formatReference(node.left);
     String right = formatReference(node.right);
@@ -258,7 +283,7 @@
   }
 
   visitInterceptor(cps_ir.Interceptor node) {
-    return "Interceptor(${node.input})";
+    return "Interceptor(${formatReference(node.input)})";
   }
 
   visitThis(cps_ir.This node) {
@@ -432,6 +457,10 @@
     visit(exp.body);
   }
 
+  visitSetField(cps_ir.SetField exp) {
+    visit(exp.body);
+  }
+
   visitDeclareFunction(cps_ir.DeclareFunction exp) {
     visit(exp.body);
   }
diff --git a/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart b/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart
index 336c1c4..089921b 100644
--- a/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart
+++ b/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart
@@ -420,6 +420,23 @@
   processInterceptor(Interceptor node) {
     node.input.parent = node;
   }
+
+  processSetField(SetField node) {
+    node.object.parent = node;
+    node.value.parent = node;
+    node.body.parent = node;
+  }
+
+  processGetField(GetField node) {
+    node.object.parent = node;
+  }
+
+  processCreateClosureClass(CreateClosureClass node) {
+    node.arguments.forEach((Reference ref) => ref.parent = node);
+  }
+
+  processCreateBox(CreateBox node) {
+  }
 }
 
 class _ReductionKind {
diff --git a/pkg/compiler/lib/src/cps_ir/type_propagation.dart b/pkg/compiler/lib/src/cps_ir/type_propagation.dart
index 9585ff9..c68a917 100644
--- a/pkg/compiler/lib/src/cps_ir/type_propagation.dart
+++ b/pkg/compiler/lib/src/cps_ir/type_propagation.dart
@@ -786,6 +786,22 @@
   void visitInterceptor(Interceptor node) {
     setReachable(node.input.definition);
   }
+
+  void visitGetField(GetField node) {
+    setValue(node, nonConst());
+  }
+
+  void visitSetField(SetField node) {
+    setReachable(node.body);
+  }
+
+  void visitCreateBox(CreateBox node) {
+    setValue(node, nonConst());
+  }
+
+  void visitCreateClosureClass(CreateClosureClass node) {
+    setValue(node, nonConst());
+  }
 }
 
 /// Represents the abstract value of a primitive value at some point in the
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index aa564ed..80be4a7 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -12,7 +12,7 @@
          stdin, stderr;
 
 import '../compiler.dart' as api;
-import 'source_file.dart';
+import 'io/source_file.dart';
 import 'source_file_provider.dart';
 import 'filenames.dart';
 import 'util/uri_extras.dart';
@@ -333,6 +333,7 @@
     new OptionHandler('--categories=.*', setCategories),
     new OptionHandler('--disable-type-inference', implyCompilation),
     new OptionHandler('--terse', passThrough),
+    new OptionHandler('--deferred-map=.+', implyCompilation),
     new OptionHandler('--dump-info', implyCompilation),
     new OptionHandler('--disallow-unsafe-eval',
                       (_) => hasDisallowUnsafeEval = true),
@@ -599,6 +600,10 @@
     unsupported category, for example, --categories=help.  To enable
     all categories, use --categories=all.
 
+  --deferred-map=<file>
+    Generates a json file with a mapping from each deferred import to a list of
+    the part.js files that will be loaded.
+
   --dump-info
     Generates an out.info.json file with information about the generated code.
     You can inspect the generated file with the viewer at:
@@ -668,7 +673,11 @@
   }
 }
 
-const _EXIT_SIGNAL = const Object();
+class _ExitSignal {
+  const _ExitSignal();
+}
+
+const _EXIT_SIGNAL = const _ExitSignal();
 
 void batchMain(List<String> batchArguments) {
   int exitCode;
diff --git a/pkg/compiler/lib/src/dart2jslib.dart b/pkg/compiler/lib/src/dart2jslib.dart
index 7537fa8..fcfbf5e 100644
--- a/pkg/compiler/lib/src/dart2jslib.dart
+++ b/pkg/compiler/lib/src/dart2jslib.dart
@@ -47,7 +47,7 @@
 import 'resolution/resolution.dart';
 import 'scanner/scannerlib.dart';
 import 'ssa/ssa.dart';
-import 'source_file.dart' show SourceFile;
+import 'io/source_file.dart' show SourceFile;
 import 'tracer.dart' show Tracer;
 import 'tree/tree.dart';
 import 'types/types.dart' as ti;
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 3007f52..26a0fa5 100644
--- a/pkg/compiler/lib/src/dart_backend/backend_ast_emitter.dart
+++ b/pkg/compiler/lib/src/dart_backend/backend_ast_emitter.dart
@@ -894,6 +894,24 @@
     return new SuperInitializer(node.target,
                                 emitArguments(arguments, node.selector));
   }
+
+  @override
+  visitGetField(tree.GetField node, arg) => errorUnsupportedNode(node);
+
+  @override
+  visitSetField(tree.SetField node, arg) => errorUnsupportedNode(node);
+
+  @override
+  visitCreateBox(tree.CreateBox node, arg) => errorUnsupportedNode(node);
+
+  @override
+  visitCreateClosureClass(tree.CreateClosureClass node, arg) {
+    return errorUnsupportedNode(node);
+  }
+
+  errorUnsupportedNode(tree.JsSpecificNode node) {
+    throw '$node not supported by dart backend';
+  }
 }
 
 class TypeGenerator {
diff --git a/pkg/compiler/lib/src/dart_backend/outputter.dart b/pkg/compiler/lib/src/dart_backend/outputter.dart
index d41d604..45da8e9 100644
--- a/pkg/compiler/lib/src/dart_backend/outputter.dart
+++ b/pkg/compiler/lib/src/dart_backend/outputter.dart
@@ -155,7 +155,7 @@
     PlaceholderCollector collector = new PlaceholderCollector(
         listener,
         mirrorRenamer,
-        libraryInfo.fixedMemberNames,
+        libraryInfo.fixedDynamicNames,
         elementInfo.elementAsts,
         mainFunction);
 
@@ -183,7 +183,9 @@
             && isSafeToRemoveTypeDeclarations(elementInfo.classMembers));
 
     PlaceholderRenamer placeholderRenamer = new PlaceholderRenamer(
-        libraryInfo.fixedMemberNames, libraryInfo.reexportingLibraries,
+        libraryInfo.fixedDynamicNames,
+        libraryInfo.fixedStaticNames,
+        libraryInfo.reexportingLibraries,
         cutDeclarationTypes: shouldCutDeclarationTypes,
         enableMinification: enableMinification);
 
@@ -215,18 +217,21 @@
 }
 
 class LibraryInfo {
-  final Set<String> fixedMemberNames;
+  final Set<String> fixedStaticNames;
+  final Set<String> fixedDynamicNames;
   final Map<Element, LibraryElement> reexportingLibraries;
   final List<LibraryElement> userLibraries;
 
-  LibraryInfo(this.fixedMemberNames,
+  LibraryInfo(this.fixedStaticNames,
+              this.fixedDynamicNames,
               this.reexportingLibraries,
               this.userLibraries);
 
   static LibraryInfo processLibraries(
       Iterable<LibraryElement> libraries,
       Iterable<AstElement> resolvedElements) {
-    Set<String> fixedMemberNames = new Set<String>();
+    Set<String> fixedStaticNames = new Set<String>();
+    Set<String> fixedDynamicNames = new Set<String>();
     Map<Element, LibraryElement> reexportingLibraries =
           <Element, LibraryElement>{};
     List<LibraryElement> userLibraries = <LibraryElement>[];
@@ -246,13 +251,10 @@
           assert(invariant(classElement, classElement.isResolved,
               message: "Unresolved platform class."));
           classElement.forEachLocalMember((member) {
-            String name = member.name;
-            // Skip operator names.
-            if (!name.startsWith(r'operator$')) {
-              // Fetch name of named constructors and factories if any,
-              // otherwise store regular name.
-              // TODO(antonm): better way to analyze the name.
-              fixedMemberNames.add(name.split(r'$').last);
+            if (member.isInstanceMember) {
+              fixedDynamicNames.add(member.name);
+            } else {
+              fixedStaticNames.add(member.name);
             }
           });
         }
@@ -260,7 +262,7 @@
         // if one imports dart:core with a prefix, we cannot tell prefix.name
         // from dynamic invocation (alas!).  So we'd better err on preserving
         // those names.
-        fixedMemberNames.add(element.name);
+        fixedStaticNames.add(element.name);
       });
 
       for (Element export in library.exports) {
@@ -282,20 +284,16 @@
           element.functionSignature.optionalParameters;
       for (final optional in optionalParameters) {
         if (!optional.isInitializingFormal) continue;
-        fixedMemberNames.add(optional.name);
+        fixedDynamicNames.add(optional.name);
       }
     }
     // The VM will automatically invoke the call method of objects
     // that are invoked as functions. Make sure to not rename that.
-    fixedMemberNames.add('call');
-    // TODO(antonm): TypeError.srcType and TypeError.dstType are defined in
-    // runtime/lib/error.dart. Overall, all DartVM specific libs should be
-    // accounted for.
-    fixedMemberNames.add('srcType');
-    fixedMemberNames.add('dstType');
+    fixedDynamicNames.add('call');
 
     return new LibraryInfo(
-        fixedMemberNames, reexportingLibraries, userLibraries);
+        fixedStaticNames, fixedDynamicNames,
+        reexportingLibraries, userLibraries);
   }
 }
 
@@ -523,11 +521,18 @@
         }
       }
     } else {
-      for(LibraryElement library in placeholderRenamer.platformImports) {
-        if (library.isPlatformLibrary && !library.isInternalLibrary) {
-          mainUnparser.unparseImportTag(library.canonicalUri.toString());
+      placeholderRenamer.platformImports.forEach(
+          (LibraryElement library, String prefix) {
+        assert(library.isPlatformLibrary && !library.isInternalLibrary);
+        mainUnparser.unparseImportTag(library.canonicalUri.toString());
+        if (prefix != null) {
+          // Adding a prefixed import because (some) top-level access need
+          // it to avoid shadowing.
+          // TODO(johnniwinther): Avoid prefix-less import if not needed.
+          mainUnparser.unparseImportTag(library.canonicalUri.toString(),
+                                        prefix: prefix);
         }
-      }
+      });
     }
 
     for (int i = 0; i < elementInfo.topLevelElements.length; i++) {
diff --git a/pkg/compiler/lib/src/dart_backend/placeholder_collector.dart b/pkg/compiler/lib/src/dart_backend/placeholder_collector.dart
index c403119..60f3fe8 100644
--- a/pkg/compiler/lib/src/dart_backend/placeholder_collector.dart
+++ b/pkg/compiler/lib/src/dart_backend/placeholder_collector.dart
@@ -279,7 +279,7 @@
   void tryMakeMemberPlaceholder(Identifier node) {
     assert(node != null);
     if (node is Operator) return;
-    final identifier = node.source;
+    String identifier = node.source;
     if (fixedMemberNames.contains(identifier)) return;
     memberPlaceholders.putIfAbsent(
         identifier, () => new Set<Identifier>()).add(node);
diff --git a/pkg/compiler/lib/src/dart_backend/renamer.dart b/pkg/compiler/lib/src/dart_backend/renamer.dart
index 79b8c58..21bef08 100644
--- a/pkg/compiler/lib/src/dart_backend/renamer.dart
+++ b/pkg/compiler/lib/src/dart_backend/renamer.dart
@@ -72,12 +72,14 @@
 class PlaceholderRenamer {
   /// After running [computeRenames] this will contain the computed renames.
   final Map<Node, String> renames = new Map<Node, String>();
-  /// After running [computeRenames] this will contain the used platform
-  /// libraries.
-  final Set<LibraryElement> platformImports = new Set<LibraryElement>();
+  /// After running [computeRenames] this will map the used platform
+  /// libraries to their respective prefixes.
+  final Map<LibraryElement, String> platformImports =
+      <LibraryElement, String>{};
 
   final bool enableMinification;
-  final Set<String> fixedMemberNames;
+  final Set<String> fixedDynamicNames;
+  final Set<String> fixedStaticNames;
   final Map<Element, LibraryElement> reexportingLibraries;
   final bool cutDeclarationTypes;
 
@@ -92,7 +94,8 @@
 
   Generator _generator;
 
-  PlaceholderRenamer(this.fixedMemberNames,
+  PlaceholderRenamer(this.fixedDynamicNames,
+                     this.fixedStaticNames,
                      this.reexportingLibraries,
                      {this.enableMinification, this.cutDeclarationTypes});
 
@@ -102,7 +105,7 @@
     }
   }
 
-  String _generateUniqueTopLevelName(originalName) {
+  String _generateUniqueTopLevelName(String originalName) {
     String newName = _generator.generate(originalName, (name) {
       return _forbiddenIdentifiers.contains(name) ||
              _allNamedParameterIdentifiers.contains(name);
@@ -142,14 +145,23 @@
         library = reexportingLibraries[entity];
       }
       if (library.isPlatformLibrary) {
-        if (library.canonicalUri != Compiler.DART_CORE) {
-          platformImports.add(library);
-        }
+        // TODO(johnniwinther): Handle prefixes for dart:core.
+        if (library.canonicalUri == Compiler.DART_CORE) return entity.name;
         if (library.isInternalLibrary) {
           throw new SpannableAssertionFailure(entity,
               "Internal library $library should never have been imported from "
               "the code compiled by dart2dart.");
         }
+
+        String prefix = platformImports.putIfAbsent(library, () => null);
+        if (entity.isTopLevel &&
+            fixedDynamicNames.contains(entity.name)) {
+          if (prefix == null) {
+            prefix = _generateUniqueTopLevelName('');
+            platformImports[library] = prefix;
+          }
+          return '$prefix.${entity.name}';
+        }
         return entity.name;
       }
     }
@@ -261,7 +273,8 @@
       _allNamedParameterIdentifiers.addAll(functionScope.parameterIdentifiers);
     }
 
-    _forbiddenIdentifiers = new Set<String>.from(fixedMemberNames);
+    _forbiddenIdentifiers = new Set<String>.from(fixedDynamicNames);
+    _forbiddenIdentifiers.addAll(fixedStaticNames);
     _forbiddenIdentifiers.addAll(Keyword.keywords.keys);
     _forbiddenIdentifiers.add('main');
 
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index f11b654..00eaf84c 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -40,6 +40,7 @@
 
 import 'util/util.dart' show
     Link, makeUnique;
+import 'util/uri_extras.dart' as uri_extras;
 
 import 'util/setlet.dart' show
     Setlet;
@@ -74,10 +75,15 @@
   /// loaded.
   final Setlet<Import> imports = new Setlet<Import>();
 
+  /// `true` if this output unit is for the main output file.
+  final bool isMainOutput;
+
   /// A unique name representing this [OutputUnit].
   /// Based on the set of [imports].
   String name;
 
+  OutputUnit({this.isMainOutput: false});
+
   String toString() => "OutputUnit($name)";
 
   bool operator==(OutputUnit other) {
@@ -110,7 +116,7 @@
       new LiteralDartString("main")), null, null, null);
 
   /// The OutputUnit that will be loaded when the program starts.
-  final OutputUnit mainOutputUnit = new OutputUnit();
+  final OutputUnit mainOutputUnit = new OutputUnit(isMainOutput: true);
 
   /// A set containing (eventually) all output units that will result from the
   /// program.
@@ -146,6 +152,10 @@
   final Map<Import, LibraryElement> _allDeferredImports =
       new Map<Import, LibraryElement>();
 
+  /// Because the token-stream is forgotten later in the program, we cache a
+  /// description of each deferred import.
+  final _deferredImportDescriptions = new Map<Import, ImportDescription>();
+
   // For each deferred import we want to know exactly what elements have to
   // be loaded.
   Map<Import, Set<Element>> _importedDeferredBy = null;
@@ -617,7 +627,7 @@
     });
   }
 
-  void ensureMetadataResolved(Compiler compiler) {
+  void beforeResolution(Compiler compiler) {
     if (compiler.mainApp == null) return;
     _allDeferredImports[_fakeMainImport] = compiler.mainApp;
     var lastDeferred;
@@ -659,7 +669,7 @@
               Element element =
                   metadata.constant.value.getType(compiler.coreTypes).element;
               if (element == deferredLibraryClass) {
-                 compiler.reportFatalError(
+                 compiler.reportError(
                      import, MessageKind.DEFERRED_OLD_SYNTAX);
               }
             }
@@ -671,13 +681,16 @@
           // The last import we saw with the same prefix.
           Import previousDeferredImport = prefixDeferredImport[prefix];
           if (import.isDeferred) {
-            _allDeferredImports[import] = library.getLibraryFromTag(import);
+            LibraryElement importedLibrary = library.getLibraryFromTag(import);
+            _allDeferredImports[import] = importedLibrary;
 
             if (prefix == null) {
               compiler.reportError(import,
                   MessageKind.DEFERRED_LIBRARY_WITHOUT_PREFIX);
             } else {
               prefixDeferredImport[prefix] = import;
+              _deferredImportDescriptions[import] =
+                  new ImportDescription(import, library, compiler);
             }
             isProgramSplit = true;
             lastDeferred = import;
@@ -764,4 +777,62 @@
     }
     return null;
   }
+
+  /// Returns a json-style map for describing what files that are loaded by a
+  /// given deferred import.
+  /// The mapping is structured as:
+  /// library uri -> {"name": library name, "files": (prefix -> list of files)}
+  /// Where
+  ///
+  /// - <library uri> is the relative uri of the library making a deferred
+  ///   import
+  /// - <library name> is the name of the libary, and "<unnamed>" if it is
+  ///   unnamed.
+  /// - <prefix> is the `as` prefix used for a given deferred import.
+  /// - <list of files> is a list of the filenames the must be loaded when that
+  ///   import is loaded.
+  Map<String, Map<String, dynamic>> computeDeferredMap() {
+    JavaScriptBackend backend = compiler.backend;
+    Map<String, Map<String, dynamic>> mapping =
+        new Map<String, Map<String, dynamic>>();
+    _deferredImportDescriptions.keys.forEach((ast.Import import) {
+      List<OutputUnit> outputUnits = hunksToLoad[importDeferName[import]];
+      ImportDescription description = _deferredImportDescriptions[import];
+      Map<String, dynamic> libraryMap =
+          mapping.putIfAbsent(description.importingUri,
+              () => <String, dynamic>{"name": description.importingLibraryName,
+                                      "imports": <String, List<String>>{}});
+
+      libraryMap["imports"][description.prefix] = outputUnits.map(
+            (OutputUnit outputUnit) {
+          return backend.deferredPartFileName(outputUnit.name);
+        }).toList();
+    });
+    return mapping;
+  }
+}
+
+class ImportDescription {
+  /// Relative uri to the importing library.
+  final String importingUri;
+  /// The prefix this import is imported as.
+  final String prefix;
+  final LibraryElement _importingLibrary;
+
+  ImportDescription(Import import,
+                    LibraryElement importingLibrary,
+                    Compiler compiler)
+      : importingUri = uri_extras.relativize(
+          compiler.mainApp.canonicalUri,
+          importingLibrary.canonicalUri, false),
+        prefix = import.prefix.source,
+        _importingLibrary = importingLibrary;
+
+  String get importingLibraryName {
+    String libraryName = _importingLibrary.getLibraryName();
+    return libraryName == ""
+      ? "<unnamed>"
+      : libraryName;
+  }
+
 }
diff --git a/pkg/compiler/lib/src/diagnostic_listener.dart b/pkg/compiler/lib/src/diagnostic_listener.dart
index 40d77b1..d57b11d 100644
--- a/pkg/compiler/lib/src/diagnostic_listener.dart
+++ b/pkg/compiler/lib/src/diagnostic_listener.dart
@@ -12,10 +12,6 @@
 
   SourceSpan spanFromSpannable(Spannable node);
 
-  /// Reports an error and terminates computation immediately.
-  void reportFatalError(Spannable node, MessageKind errorCode,
-                        [Map arguments = const {}]);
-
   void reportError(Spannable node, MessageKind errorCode,
                    [Map arguments = const {}]);
 
diff --git a/pkg/compiler/lib/src/dump_info.dart b/pkg/compiler/lib/src/dump_info.dart
index b2442b9..c92ea25 100644
--- a/pkg/compiler/lib/src/dump_info.dart
+++ b/pkg/compiler/lib/src/dump_info.dart
@@ -639,6 +639,10 @@
       'holding': holding,
       'outputUnits': outputUnits,
       'dump_version': 3,
+      'deferredFiles': compiler.deferredLoadTask.computeDeferredMap(),
+      // This increases when new information is added to the map, but the viewer
+      // still is compatible.
+      'dump_minor_version': '1'
     };
 
     Duration toJsonDuration = new DateTime.now().difference(startToJsonTime);
diff --git a/pkg/compiler/lib/src/elements/modelx.dart b/pkg/compiler/lib/src/elements/modelx.dart
index aaa56ab..903f205 100644
--- a/pkg/compiler/lib/src/elements/modelx.dart
+++ b/pkg/compiler/lib/src/elements/modelx.dart
@@ -12,21 +12,22 @@
 import '../resolution/resolution.dart';
 import '../resolution/class_members.dart' show ClassMemberMixin;
 
-import '../dart2jslib.dart' show invariant,
-                                 InterfaceType,
-                                 DartType,
-                                 TypeVariableType,
-                                 TypedefType,
-                                 DualKind,
-                                 MessageKind,
-                                 DiagnosticListener,
-                                 Script,
-                                 FunctionType,
-                                 Selector,
-                                 Constant,
-                                 Compiler,
-                                 Backend,
-                                 isPrivateName;
+import '../dart2jslib.dart' show
+    Backend,
+    Compiler,
+    Constant,
+    DartType,
+    DiagnosticListener,
+    DualKind,
+    FunctionType,
+    InterfaceType,
+    MessageKind,
+    Script,
+    Selector,
+    TypeVariableType,
+    TypedefType,
+    invariant,
+    isPrivateName;
 
 import '../dart_types.dart';
 
@@ -327,6 +328,20 @@
   accept(ElementVisitor visitor) => visitor.visitErroneousElement(this);
 }
 
+/// A constructor that was synthesized to recover from a compile-time error.
+class ErroneousConstructorElementX extends ErroneousElementX {
+  // 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.
+
+  ErroneousConstructorElementX(
+      MessageKind messageKind,
+      Map messageArguments,
+      String name,
+      Element enclosing)
+      : super(messageKind, messageArguments, name, enclosing);
+}
+
 /// A message attached to a [WarnOnUseElementX].
 class WrappedMessage {
   /// The message position. If [:null:] the position of the reference to the
@@ -384,7 +399,7 @@
   accept(ElementVisitor visitor) => visitor.visitWarnOnUseElement(this);
 }
 
-class AmbiguousElementX extends ElementX implements AmbiguousElement {
+abstract class AmbiguousElementX extends ElementX implements AmbiguousElement {
   /**
    * The message to report on resolving this element.
    */
@@ -423,6 +438,20 @@
     return set;
   }
 
+  accept(ElementVisitor visitor) => visitor.visitAmbiguousElement(this);
+
+  bool get isTopLevel => false;
+}
+
+/// Element synthesized to diagnose an ambiguous import.
+class AmbiguousImportX extends AmbiguousElementX {
+  AmbiguousImportX(
+      MessageKind messageKind,
+      Map messageArguments,
+      Element enclosingElement, Element existingElement, Element newElement)
+      : super(messageKind, messageArguments, enclosingElement, existingElement,
+              newElement);
+
   void diagnose(Element context, DiagnosticListener listener) {
     Setlet ambiguousElements = flatten();
     MessageKind code = (ambiguousElements.length == 1)
@@ -440,10 +469,16 @@
       });
     }
   }
+}
 
-  accept(ElementVisitor visitor) => visitor.visitAmbiguousElement(this);
-
-  bool get isTopLevel => false;
+/// Element synthesized to recover from a duplicated member of an element.
+class DuplicatedElementX extends AmbiguousElementX {
+  DuplicatedElementX(
+      MessageKind messageKind,
+      Map messageArguments,
+      Element enclosingElement, Element existingElement, Element newElement)
+      : super(messageKind, messageArguments, enclosingElement, existingElement,
+              newElement);
 }
 
 class ScopeX {
@@ -491,27 +526,32 @@
       listener.reportError(accessor,
                            MessageKind.DUPLICATE_DEFINITION,
                            {'name': accessor.name});
-      // TODO(johnniwinther): Make this an info instead of a fatal error.
-      listener.reportFatalError(other,
-                                MessageKind.EXISTING_DEFINITION,
-                                {'name': accessor.name});
+      listener.reportInfo(
+          other, MessageKind.EXISTING_DEFINITION, {'name': accessor.name});
+
+      contents[accessor.name] = new DuplicatedElementX(
+          MessageKind.DUPLICATE_DEFINITION, {'name': accessor.name},
+          accessor.memberContext.enclosingElement, other, accessor);
     }
 
     if (existing != null) {
       if (!identical(existing.kind, ElementKind.ABSTRACT_FIELD)) {
         reportError(existing);
+        return;
       } else {
         AbstractFieldElementX field = existing;
         accessor.abstractField = field;
         if (accessor.isGetter) {
           if (field.getter != null && field.getter != accessor) {
             reportError(field.getter);
+            return;
           }
           field.getter = accessor;
         } else {
           assert(accessor.isSetter);
           if (field.setter != null && field.setter != accessor) {
             reportError(field.setter);
+            return;
           }
           field.setter = accessor;
         }
@@ -699,7 +739,7 @@
               import, MessageKind.HIDDEN_IMPORT, existing, element);
         }
       } else {
-        Element ambiguousElement = new AmbiguousElementX(
+        Element ambiguousElement = new AmbiguousImportX(
             MessageKind.DUPLICATE_IMPORT, {'name': name},
             enclosingElement, existing, element);
         importScope[name] = ambiguousElement;
@@ -1267,6 +1307,81 @@
   }
 }
 
+/// A field that was synthesized to recover from a compile-time error.
+class ErroneousFieldElementX extends ElementX implements FieldElementX {
+  final VariableList variables;
+
+  ErroneousFieldElementX(Identifier name, Element enclosingElement)
+      : variables = new VariableList(Modifiers.EMPTY)
+            ..definitions = new VariableDefinitions(
+                null, Modifiers.EMPTY, new NodeList.singleton(name))
+            ..type = const DynamicType(),
+        super(name.source, ElementKind.FIELD, enclosingElement);
+
+  VariableDefinitions get definitionsCache => variables.definitions;
+
+  set definitionsCache(VariableDefinitions _) {
+    throw new UnsupportedError("definitionsCache=");
+  }
+
+  bool get hasNode => true;
+
+  VariableDefinitions get node => definitionsCache;
+
+  bool get hasResolvedAst => false;
+
+  ResolvedAst get resolvedAst {
+    throw new UnsupportedError("resolvedAst");
+  }
+
+  DynamicType get type => const DynamicType();
+
+  Token get token => node.getBeginToken();
+
+  get initializerCache {
+    throw new UnsupportedError("initializerCache");
+  }
+
+  set initializerCache(_) {
+    throw new UnsupportedError("initializerCache=");
+  }
+
+  void createDefinitions(VariableDefinitions definitions) {
+    throw new UnsupportedError("createDefinitions");
+  }
+
+  get initializer => null;
+
+  bool get isErroneous => true;
+
+  get nestedClosures {
+    throw new UnsupportedError("nestedClosures");
+  }
+
+  set nestedClosures(_) {
+    throw new UnsupportedError("nestedClosures=");
+  }
+
+  // TODO(ahe): Should this throw or do nothing?
+  accept(ElementVisitor visitor) => visitor.visitFieldElement(this);
+
+  // TODO(ahe): Should return the context of the error site?
+  MemberElement get memberContext => this;
+
+  // TODO(ahe): Should return the definingElement of the error site?
+  AstElement get definingElement => this;
+
+  void reuseElement() {
+    throw new UnsupportedError("reuseElement");
+  }
+
+  FieldElementX copyWithEnclosing(Element enclosingElement) {
+    throw new UnsupportedError("copyWithEnclosing");
+  }
+
+  DartType computeType(Compiler compiler) => type;
+}
+
 /// [Element] for a parameter-like element.
 class FormalElementX extends ElementX
     with AstElementMixin
@@ -1369,7 +1484,7 @@
 /// `A(this.field)`.
 class InitializingFormalElementX extends ParameterElementX
     implements InitializingFormalElement {
-  FieldElement fieldElement;
+  final FieldElement fieldElement;
 
   InitializingFormalElementX(ConstructorElement constructorDeclaration,
                              VariableDefinitions variables,
@@ -1386,6 +1501,29 @@
   bool get isLocal => false;
 }
 
+class ErroneousInitializingFormalElementX extends ParameterElementX
+    implements InitializingFormalElementX {
+  final ErroneousFieldElementX fieldElement;
+
+  ErroneousInitializingFormalElementX(
+      Identifier identifier,
+      Element enclosingElement)
+      : this.fieldElement =
+            new ErroneousFieldElementX(identifier, enclosingElement),
+        super(
+            ElementKind.INITIALIZING_FORMAL,
+            enclosingElement, null, identifier, null);
+
+  VariableDefinitions get definitions => fieldElement.node;
+
+  MemberElement get memberContext => enclosingElement;
+
+  bool get isLocal => false;
+
+  bool get isErroneous => true;
+
+  DynamicType get type => const DynamicType();
+}
 
 class AbstractFieldElementX extends ElementX implements AbstractFieldElement {
   FunctionElementX getter;
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
index c2638b4..9d04cd1 100644
--- a/pkg/compiler/lib/src/enqueue.dart
+++ b/pkg/compiler/lib/src/enqueue.dart
@@ -697,6 +697,7 @@
   }
 
   bool internalAddToWorkList(Element element) {
+    if (element.isErroneous) return false;
     assert(invariant(element, element is AnalyzableElement,
         message: 'Element $element is not analyzable.'));
     if (hasBeenResolved(element)) return false;
diff --git a/pkg/compiler/lib/src/hash/sha1.dart b/pkg/compiler/lib/src/hash/sha1.dart
index 949621d..60716a4 100644
--- a/pkg/compiler/lib/src/hash/sha1.dart
+++ b/pkg/compiler/lib/src/hash/sha1.dart
@@ -11,33 +11,55 @@
 import 'dart:math' show pow;
 import 'dart:convert';
 
-/// Returns the base64-encoded SHA-1 hash of the utf-8 bytes of [input].
-String hashOfString(String input) {
-  Hash hasher = new SHA1();
-  hasher.add(const Utf8Encoder().convert(input));
-  return _bytesToBase64(hasher.close());
-}
+import '../io/code_output.dart' show CodeOutputListener;
 
-/**
- * Converts a list of bytes into a Base 64 encoded string.
- *
- * The list can be any list of integers in the range 0..255,
- * for example a message digest.
- *
- * If [addLineSeparator] is true, the resulting string will  be
- * broken into lines of 76 characters, separated by "\r\n".
- *
- * If [urlSafe] is true, the result is URL and filename safe.
- *
- * Based on [RFC 4648](http://tools.ietf.org/html/rfc4648)
- *
- */
-String _bytesToBase64(List<int> bytes,
-                            {bool urlSafe : false,
-                             bool addLineSeparator : false}) {
-  return _CryptoUtils.bytesToBase64(bytes,
-                                    urlSafe,
-                                    addLineSeparator);
+class Hasher implements CodeOutputListener {
+  Hash _hasher = new SHA1();
+  String _hashString;
+
+  @override
+  void onDone(int length) {
+    // Do nothing.
+  }
+
+  @override
+  void onText(String text) {
+    if (_hasher != null) {
+      _hasher.add(const Utf8Encoder().convert(text));
+    }
+  }
+
+  /// Returns the base64-encoded SHA-1 hash of the utf-8 bytes of the output
+  /// text.
+  String getHash() {
+    if (_hashString == null) {
+      _hashString = _bytesToBase64(_hasher.close());
+      _hasher = null;
+    }
+    return _hashString;
+  }
+
+  /**
+   * Converts a list of bytes into a Base 64 encoded string.
+   *
+   * The list can be any list of integers in the range 0..255,
+   * for example a message digest.
+   *
+   * If [addLineSeparator] is true, the resulting string will  be
+   * broken into lines of 76 characters, separated by "\r\n".
+   *
+   * If [urlSafe] is true, the result is URL and filename safe.
+   *
+   * Based on [RFC 4648](http://tools.ietf.org/html/rfc4648)
+   *
+   */
+  String _bytesToBase64(List<int> bytes,
+                              {bool urlSafe : false,
+                               bool addLineSeparator : false}) {
+    return _CryptoUtils.bytesToBase64(bytes,
+                                      urlSafe,
+                                      addLineSeparator);
+  }
 }
 
 
diff --git a/pkg/compiler/lib/src/io/code_output.dart b/pkg/compiler/lib/src/io/code_output.dart
index f7f1c9b..bd97af0 100644
--- a/pkg/compiler/lib/src/io/code_output.dart
+++ b/pkg/compiler/lib/src/io/code_output.dart
@@ -6,8 +6,6 @@
 
 import 'dart:async';
 
-import '../source_file.dart';
-
 import 'source_map_builder.dart';
 
 class CodeOutputMarker {
@@ -17,27 +15,55 @@
   CodeOutputMarker(this.offsetDelta, this.sourcePosition);
 }
 
+abstract class CodeOutputListener {
+  void onText(String text);
+  void onDone(int length);
+}
+
 abstract class CodeOutput {
-  List<CodeOutputMarker> markers = new List<CodeOutputMarker>();
+  /// Write [text] to this output.
+  ///
+  /// If the output is closed, a [StateError] is thrown.
+  void add(String text);
 
-  int lastBufferOffset = 0;
-  int mappedRangeCounter = 0;
+  /// Adds the content of [buffer] to the output and adds its markers to
+  /// [markers].
+  ///
+  /// If the output is closed, a [StateError] is thrown.
+  void addBuffer(CodeBuffer buffer);
 
+  /// Returns the number of characters currently write to this output.
   int get length;
 
-  void _writeInternal(String text);
+  /// Returns `true` if this output has been closed.
+  bool get isClosed;
 
-  /// Converts [object] to a string and adds it to the buffer. If [object] is a
-  /// [CodeBuffer], adds its markers to [markers].
-  void write(var object) {
-    if (object is CodeBuffer) {
-      addBuffer(object);
-      return;
+  /// Closes the output. Further writes will cause a [StateError].
+  void close();
+
+  /// Applies [f] to every marker in this output.
+  void forEachSourceLocation(void f(int targetOffset,
+                                    SourceFileLocation sourceLocation));
+}
+
+abstract class AbstractCodeOutput extends CodeOutput {
+  List<CodeOutputMarker> markers = new List<CodeOutputMarker>();
+  int lastBufferOffset = 0;
+  int mappedRangeCounter = 0;
+  bool isClosed = false;
+
+  void _addInternal(String text);
+
+  @override
+  void add(String text) {
+    if (isClosed) {
+      throw new StateError("Code output is closed. Trying to write '$text'.");
     }
     if (mappedRangeCounter == 0) setSourceLocation(null);
-    _writeInternal(object);
+    _addInternal(text);
   }
 
+  @override
   void addBuffer(CodeBuffer other) {
     if (other.markers.length > 0) {
       CodeOutputMarker firstMarker = other.markers[0];
@@ -50,7 +76,10 @@
       }
       lastBufferOffset = length + other.lastBufferOffset;
     }
-    _writeInternal(other.getText());
+    if (!other.isClosed) {
+      other.close();
+    }
+    _addInternal(other.getText());
   }
 
   void beginMappedRange() {
@@ -78,141 +107,58 @@
       f(targetOffset, marker.sourcePosition);
     });
   }
+
+  void close() {
+    if (isClosed) {
+      throw new StateError("Code output is already closed.");
+    }
+    isClosed = true;
+  }
 }
 
 /// [CodeOutput] using a [StringBuffer] as backend.
-class CodeBuffer extends CodeOutput implements StringBuffer {
+class CodeBuffer extends AbstractCodeOutput {
   StringBuffer buffer = new StringBuffer();
 
   @override
-  void _writeInternal(String text) {
+  void _addInternal(String text) {
     buffer.write(text);
   }
 
   @override
   int get length => buffer.length;
 
-  @override
-  bool get isEmpty => buffer.isEmpty;
-
-  @override
-  bool get isNotEmpty => buffer.isNotEmpty;
-
-  @override
-  void writeAll(Iterable<Object> objects, [String separator = ""]) {
-    Iterator iterator = objects.iterator;
-    if (!iterator.moveNext()) return;
-    if (separator.isEmpty) {
-      do {
-        write(iterator.current);
-      } while (iterator.moveNext());
-    } else {
-      write(iterator.current);
-      while (iterator.moveNext()) {
-        write(separator);
-        write(iterator.current);
-      }
-    }
-  }
-
-  @override
-  void writeln([var object = ""]) {
-    write(object);
-    write("\n");
-  }
-
-  @override
-  void writeCharCode(int charCode) {
-    buffer.writeCharCode(charCode);
-  }
-
-  @override
-  void clear() {
-    buffer = new StringBuffer();
-    markers.clear();
-    lastBufferOffset = 0;
+  String getText() {
+    return buffer.toString();
   }
 
   String toString() {
     throw "Don't use CodeBuffer.toString() since it drops sourcemap data.";
   }
-
-  String getText() {
-    return buffer.toString();
-  }
 }
 
 /// [CodeOutput] using a [CompilationOutput] as backend.
-class StreamCodeOutput extends CodeOutput {
+class StreamCodeOutput extends AbstractCodeOutput {
   int length = 0;
   final EventSink<String> output;
+  final List<CodeOutputListener> _listeners;
 
-  StreamCodeOutput(this.output);
+  StreamCodeOutput(this.output, [this._listeners]);
 
   @override
-  void _writeInternal(String text) {
+  void _addInternal(String text) {
     output.add(text);
     length += text.length;
+    if (_listeners != null) {
+      _listeners.forEach((listener) => listener.onText(text));
+    }
   }
 
   void close() {
     output.close();
-  }
-}
-
-/// [StreamCodeSink] that collects line information.
-class LineColumnCodeOutput extends StreamCodeOutput
-    implements LineColumnProvider {
-  int lastLineStart = 0;
-  List<int> lineStarts = <int>[0];
-
-  LineColumnCodeOutput(EventSink<String> output) : super(output);
-
-  @override
-  void _writeInternal(String text) {
-    int offset = lastLineStart;
-    int index = 0;
-    while (index < text.length) {
-      // Unix uses '\n' and Windows uses '\r\n', so this algorithm works for
-      // both platforms.
-      index = text.indexOf('\n', index) + 1;
-      if (index <= 0) break;
-      lastLineStart = offset + index;
-      lineStarts.add(lastLineStart);
-    }
-    super._writeInternal(text);
-  }
-
-  @override
-  int getLine(int offset) {
-    List<int> starts = lineStarts;
-    if (offset < 0|| starts.last <= offset) {
-      throw 'bad position #$offset in buffer with length ${length}.';
-    }
-    int first = 0;
-    int count = starts.length;
-    while (count > 1) {
-      int step = count ~/ 2;
-      int middle = first + step;
-      int lineStart = starts[middle];
-      if (offset < lineStart) {
-        count = step;
-      } else {
-        first = middle;
-        count -= step;
-      }
-    }
-    return first;
-  }
-
-  @override
-  int getColumn(int line, int offset) {
-    return offset - lineStarts[line];
-  }
-
-  @override
-  void close() {
-    lineStarts.add(length);
     super.close();
+    if (_listeners != null) {
+      _listeners.forEach((listener) => listener.onDone(length));
+    }
   }
 }
diff --git a/pkg/compiler/lib/src/io/line_column_provider.dart b/pkg/compiler/lib/src/io/line_column_provider.dart
new file mode 100644
index 0000000..5aa700c
--- /dev/null
+++ b/pkg/compiler/lib/src/io/line_column_provider.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file

+// for 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.io.line_column;

+

+import 'code_output.dart';

+

+/// Interface for providing line/column information.

+abstract class LineColumnProvider {

+  /// Returns the line number (0-based) for [offset].

+  int getLine(int offset);

+

+  /// Returns the column number (0-based) for [offset] at the given [line].

+  int getColumn(int line, int offset);

+}

+

+/// [CodeOutputListener] that collects line information.

+class LineColumnCollector extends CodeOutputListener

+    implements LineColumnProvider {

+  int lastLineStart = 0;

+  List<int> lineStarts = <int>[0];

+

+  void _collect(String text) {

+    int offset = lastLineStart;

+    int index = 0;

+    while (index < text.length) {

+      // Unix uses '\n' and Windows uses '\r\n', so this algorithm works for

+      // both platforms.

+      index = text.indexOf('\n', index) + 1;

+      if (index <= 0) break;

+      lastLineStart = offset + index;

+      lineStarts.add(lastLineStart);

+    }

+  }

+

+  @override

+  void onText(String text) {

+    _collect(text);

+  }

+

+  @override

+  int getLine(int offset) {

+    List<int> starts = lineStarts;

+    if (offset < 0 || starts.last <= offset) {

+      throw 'bad position #$offset in buffer with length ${lineStarts.last}.';

+    }

+    int first = 0;

+    int count = starts.length;

+    while (count > 1) {

+      int step = count ~/ 2;

+      int middle = first + step;

+      int lineStart = starts[middle];

+      if (offset < lineStart) {

+        count = step;

+      } else {

+        first = middle;

+        count -= step;

+      }

+    }

+    return first;

+  }

+

+  @override

+  int getColumn(int line, int offset) {

+    return offset - lineStarts[line];

+  }

+

+  @override

+  void onDone(int length) {

+    lineStarts.add(length);

+  }

+}

diff --git a/pkg/compiler/lib/src/source_file.dart b/pkg/compiler/lib/src/io/source_file.dart
similarity index 95%
rename from pkg/compiler/lib/src/source_file.dart
rename to pkg/compiler/lib/src/io/source_file.dart
index ad92b46..a106e5e 100644
--- a/pkg/compiler/lib/src/source_file.dart
+++ b/pkg/compiler/lib/src/io/source_file.dart
@@ -2,19 +2,12 @@
 // for 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 source_file;
+library dart2js.io.source_file;
 
 import 'dart:math';
 import 'dart:convert' show UTF8;
 
-/// Interface for providing line/column information.
-abstract class LineColumnProvider {
-  /// Returns the line number (0-based) for [offset].
-  int getLine(int offset);
-
-  /// Returns the column number (0-based) for [offset] at the given [line].
-  int getColumn(int line, int offset);
-}
+import 'line_column_provider.dart';
 
 /**
  * Represents a file of source code. The content can be either a [String] or
diff --git a/pkg/compiler/lib/src/io/source_map_builder.dart b/pkg/compiler/lib/src/io/source_map_builder.dart
index de80533..117e298 100644
--- a/pkg/compiler/lib/src/io/source_map_builder.dart
+++ b/pkg/compiler/lib/src/io/source_map_builder.dart
@@ -6,8 +6,9 @@
 
 import '../util/util.dart';
 import '../scanner/scannerlib.dart' show Token;
-import '../source_file.dart';
 import '../util/uri_extras.dart' show relativize;
+import 'line_column_provider.dart';
+import 'source_file.dart';
 
 class SourceMapBuilder {
   static const int VLQ_BASE_SHIFT = 5;
@@ -20,7 +21,7 @@
   final Uri uri;
   final Uri fileUri;
 
-  SourceFile targetFile;
+  LineColumnProvider lineColumnProvider;
   List<SourceMapEntry> entries;
 
   Map<String, int> sourceUrlMap;
@@ -36,7 +37,7 @@
   int previousSourceNameIndex;
   bool firstEntryInLine;
 
-  SourceMapBuilder(this.uri, this.fileUri, this.targetFile) {
+  SourceMapBuilder(this.uri, this.fileUri, this.lineColumnProvider) {
     entries = new List<SourceMapEntry>();
 
     sourceUrlMap = new Map<String, int>();
@@ -87,7 +88,8 @@
   void addMapping(int targetOffset, SourceFileLocation sourceLocation) {
 
     bool sameLine(int position, otherPosition) {
-      return targetFile.getLine(position) == targetFile.getLine(otherPosition);
+      return lineColumnProvider.getLine(position) ==
+                 lineColumnProvider.getLine(otherPosition);
     }
 
     if (!entries.isEmpty && sameLine(targetOffset, entries.last.targetOffset)) {
@@ -125,8 +127,9 @@
   String build() {
     resetPreviousSourceLocation();
     StringBuffer mappingsBuffer = new StringBuffer();
-    entries.forEach((SourceMapEntry entry) => writeEntry(entry, targetFile,
-                                                         mappingsBuffer));
+    entries.forEach((SourceMapEntry entry) {
+      writeEntry(entry, mappingsBuffer);
+    });
     StringBuffer buffer = new StringBuffer();
     buffer.write('{\n');
     buffer.write('  "version": 3,\n');
@@ -151,9 +154,10 @@
     return buffer.toString();
   }
 
-  void writeEntry(SourceMapEntry entry, SourceFile targetFile, StringBuffer output) {
-    int targetLine = targetFile.getLine(entry.targetOffset);
-    int targetColumn = targetFile.getColumn(targetLine, entry.targetOffset);
+  void writeEntry(SourceMapEntry entry, StringBuffer output) {
+    int targetLine = lineColumnProvider.getLine(entry.targetOffset);
+    int targetColumn =
+        lineColumnProvider.getColumn(targetLine, entry.targetOffset);
 
     if (targetLine > previousTargetLine) {
       for (int i = previousTargetLine; i < targetLine; ++i) {
diff --git a/pkg/compiler/lib/src/js/nodes.dart b/pkg/compiler/lib/src/js/nodes.dart
index 9e0a76b..d5c574e 100644
--- a/pkg/compiler/lib/src/js/nodes.dart
+++ b/pkg/compiler/lib/src/js/nodes.dart
@@ -741,8 +741,7 @@
       case ',':
         return EXPRESSION;
       default:
-        throw new leg.CompilerCancelledException(
-            "Internal Error: Unhandled binary operator: $op");
+        throw "Internal Error: Unhandled binary operator: $op";
     }
   }
 }
diff --git a/pkg/compiler/lib/src/js/printer.dart b/pkg/compiler/lib/src/js/printer.dart
index b5bce3d..1e43895 100644
--- a/pkg/compiler/lib/src/js/printer.dart
+++ b/pkg/compiler/lib/src/js/printer.dart
@@ -58,7 +58,7 @@
     if (str != "") {
       if (pendingSemicolon) {
         if (!shouldCompressOutput) {
-          outBuffer.write(";");
+          outBuffer.add(";");
         } else if (str != "}") {
           // We want to output newline instead of semicolon because it makes
           // the raw stack traces much easier to read and it also makes line-
@@ -72,19 +72,19 @@
           // is escaped in strings, it is a lot easier to deal with semicolons
           // than newlines because the former doesn't need escaping.
           if (USE_NEW_EMITTER || expressionContinuationRegExp.hasMatch(str)) {
-            outBuffer.write(";");
+            outBuffer.add(";");
           } else {
-            outBuffer.write("\n");
+            outBuffer.add("\n");
           }
         }
       }
       if (pendingSpace &&
           (!shouldCompressOutput || identifierCharacterRegExp.hasMatch(str))) {
-        outBuffer.write(" ");
+        outBuffer.add(" ");
       }
       pendingSpace = false;
       pendingSemicolon = false;
-      outBuffer.write(str);
+      outBuffer.add(str);
       lastAddedString = str;
     }
   }
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index e57db6d..d57e9a2 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -172,7 +172,6 @@
   ClassElement irRepresentationClass;
 
   Element getInterceptorMethod;
-  Element interceptedNames;
 
   ClassElement jsInvocationMirrorClass;
 
@@ -182,14 +181,6 @@
   static const bool TRACE_CALLS = false;
   Element traceHelper;
 
-  /**
-   * This element is a top-level variable (in generated output) that the
-   * compiler initializes to a datastructure used to map from a Type to the
-   * interceptor.  See declaration of `mapTypeToInterceptor` in
-   * `interceptors.dart`.
-   */
-  Element mapTypeToInterceptor;
-
   TypeMask get stringType => compiler.typesTask.stringType;
   TypeMask get doubleType => compiler.typesTask.doubleType;
   TypeMask get intType => compiler.typesTask.intType;
@@ -1741,8 +1732,6 @@
 
       if (uri == DART_INTERCEPTORS) {
         getInterceptorMethod = findMethod('getInterceptor');
-        interceptedNames = findVariable('interceptedNames');
-        mapTypeToInterceptor = findVariable('mapTypeToInterceptor');
         getNativeInterceptorMethod = findMethod('getNativeInterceptor');
 
         List<ClassElement> classes = [
@@ -2308,6 +2297,20 @@
     // communicate with the spawning isolate.
     enqueuer.enableIsolateSupport();
   }
+
+  /// Returns the filename for the output-unit named [name].
+  ///
+  /// The filename is of the form "<main output file>_<name>.part.js".
+  /// If [addExtension] is false, the ".part.js" suffix is left out.
+  String deferredPartFileName(String name, {bool addExtension: true}) {
+    assert(name != "");
+    String outPath = compiler.outputUri != null
+        ? compiler.outputUri.path
+        : "out";
+    String outName = outPath.substring(outPath.lastIndexOf('/') + 1);
+    String extension = addExtension ? ".part.js" : "";
+    return "${outName}_$name$extension";
+  }
 }
 
 class JavaScriptResolutionCallbacks extends ResolutionCallbacks {
diff --git a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
index 05bacf5..cf32d70 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
@@ -424,4 +424,33 @@
     // TODO: implement SuperInitializer
   }
 
+  @override
+  js.Expression visitCreateBox(tree_ir.CreateBox node) {
+    return new js.ObjectInitializer([]);
+  }
+
+  @override
+  js.Expression visitCreateClosureClass(tree_ir.CreateClosureClass node) {
+    registry.registerInstantiatedClass(node.classElement);
+    return new js.New(glue.closureClassConstructorAccess(node.classElement),
+                      node.arguments.map(visitExpression).toList());
+  }
+
+  @override
+  js.Expression visitGetField(tree_ir.GetField node) {
+    return new js.PropertyAccess.field(
+        visitExpression(node.object),
+        glue.instanceFieldPropertyName(node.field));
+  }
+
+  @override
+  void visitSetField(tree_ir.SetField node) {
+    js.PropertyAccess field =
+        new js.PropertyAccess.field(
+            visitExpression(node.object),
+            glue.instanceFieldPropertyName(node.field));
+    js.Assignment asn = new js.Assignment(field, visitExpression(node.value));
+    accumulator.add(new js.ExpressionStatement(asn));
+    visitStatement(node.next);
+  }
 }
diff --git a/pkg/compiler/lib/src/js_backend/codegen/glue.dart b/pkg/compiler/lib/src/js_backend/codegen/glue.dart
index d15a458..bac9e33 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/glue.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/glue.dart
@@ -11,6 +11,7 @@
 import '../../constants/values.dart';
 import '../../elements/elements.dart';
 import '../../constants/expressions.dart';
+import '../../closure.dart' show ClosureClassElement;
 
 /// Encapsulates the dependencies of the function-compiler to the compiler,
 /// backend and emitter.
@@ -79,4 +80,13 @@
   void registerSpecializedGetInterceptor(Set<ClassElement> classes) {
     _backend.registerSpecializedGetInterceptor(classes);
   }
+
+  js.Expression closureClassConstructorAccess(ClosureClassElement element) {
+    return _backend.emitter.closureClassConstructorAccess(element);
+  }
+
+  String instanceFieldPropertyName(Element field) {
+    return _namer.instanceFieldPropertyName(field);
+  }
+
 }
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 32dde10..b21bb5e 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
@@ -48,4 +48,25 @@
         new Selector.fromElement(getInterceptor),
         <Expression>[getVariableReference(node.input)]);
   }
+
+  Expression visitGetField(cps_ir.GetField node) {
+    return new GetField(getVariableReference(node.object), node.field);
+  }
+
+  Statement visitSetField(cps_ir.SetField node) {
+    return new SetField(getVariableReference(node.object),
+                        node.field,
+                        getVariableReference(node.value),
+                        visit(node.body));
+  }
+
+  Expression visitCreateBox(cps_ir.CreateBox node) {
+    return new CreateBox();
+  }
+
+  Expression visitCreateClosureClass(cps_ir.CreateClosureClass node) {
+    return new CreateClosureClass(
+        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 8ecde4c8..0068a21 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/task.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/task.dart
@@ -11,7 +11,7 @@
 
 import '../js_backend.dart';
 import '../../dart2jslib.dart';
-import '../../source_file.dart';
+import '../../io/source_file.dart';
 import '../../cps_ir/cps_ir_nodes.dart' as cps;
 import '../../cps_ir/cps_ir_builder.dart';
 import '../../tree_ir/tree_ir_nodes.dart' as tree_ir;
@@ -44,8 +44,7 @@
   // TODO(karlklose,sigurm): remove and update dart-doc of [compile].
   final FunctionCompiler fallbackCompiler;
 
-  // TODO(sigurdm): Assign this.
-  Tracer tracer;
+  Tracer get tracer => compiler.tracer;
 
   CspFunctionCompiler(Compiler compiler, JavaScriptBackend backend)
       : irBuilderTask = new IrBuilderTask(compiler),
@@ -98,7 +97,6 @@
   cps.FunctionDefinition compileToCpsIR(AstElement element) {
     // TODO(sigurdm): Support these constructs.
     if (element.isGenerativeConstructorBody ||
-        element.enclosingClass is ClosureClassElement ||
         element.isNative ||
         element.isField) {
       giveUp('unsupported element kind: ${element.name}:${element.kind}');
@@ -108,7 +106,9 @@
     if (cpsNode == null) {
       giveUp('unable to build cps definition of $element');
     }
+    traceGraph("IR Builder", cpsNode);
     new UnsugarVisitor(glue).rewrite(cpsNode);
+    traceGraph("Unsugaring", cpsNode);
     return cpsNode;
   }
 
@@ -131,7 +131,6 @@
 
   cps.FunctionDefinition optimizeCpsIR(cps.FunctionDefinition cpsNode) {
     // Transformations on the CPS IR.
-    traceGraph("IR Builder", cpsNode);
 
     TypePropagator typePropagator = new TypePropagator<TypeMask>(
         compiler.types,
diff --git a/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart b/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
index 9afb0884..deadc5f 100644
--- a/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
@@ -97,6 +97,23 @@
   }
 }
 
+class JavaScriptAddOperation implements BinaryOperation {
+  final _addOperation = const AddOperation();
+  String get name => _addOperation.name;
+
+  const JavaScriptAddOperation();
+
+  ConstantValue fold(ConstantValue left, ConstantValue right) {
+    ConstantValue result = _addOperation.fold(left, right);
+    if (result != null && result.isNum) {
+      return JAVA_SCRIPT_CONSTANT_SYSTEM.convertToJavaScriptConstant(result);
+    }
+    return result;
+  }
+
+  apply(left, right) => _addOperation.apply(left, right);
+}
+
 class JavaScriptBinaryArithmeticOperation implements BinaryOperation {
   final BinaryOperation dartArithmeticOperation;
 
@@ -146,7 +163,7 @@
   final int BITS31 = 0x8FFFFFFF;
   final int BITS32 = 0xFFFFFFFF;
 
-  final add = const JavaScriptBinaryArithmeticOperation(const AddOperation());
+  final add = const JavaScriptAddOperation();
   final bitAnd = const JavaScriptBinaryBitOperation(const BitAndOperation());
   final bitNot = const JavaScriptBitNotOperation();
   final bitOr = const JavaScriptBinaryBitOperation(const BitOrOperation());
diff --git a/pkg/compiler/lib/src/js_backend/js_backend.dart b/pkg/compiler/lib/src/js_backend/js_backend.dart
index 3f8d0d5..e621f38 100644
--- a/pkg/compiler/lib/src/js_backend/js_backend.dart
+++ b/pkg/compiler/lib/src/js_backend/js_backend.dart
@@ -34,6 +34,7 @@
     ElementVisitor;
 import '../js_backend/codegen/task.dart';
 import 'patch_resolver.dart';
+import '../deferred_load.dart';
 
 part 'backend.dart';
 part 'checked_mode_helpers.dart';
diff --git a/pkg/compiler/lib/src/js_backend/native_emitter.dart b/pkg/compiler/lib/src/js_backend/native_emitter.dart
index f945fef..60f1155 100644
--- a/pkg/compiler/lib/src/js_backend/native_emitter.dart
+++ b/pkg/compiler/lib/src/js_backend/native_emitter.dart
@@ -9,7 +9,6 @@
   final Map<Element, ClassBuilder> cachedBuilders;
 
   final CodeEmitterTask emitterTask;
-  CodeBuffer nativeBuffer;
 
   // Native classes found in the application.
   Set<ClassElement> nativeClasses = new Set<ClassElement>();
@@ -33,7 +32,6 @@
         subtypes = new Map<ClassElement, List<ClassElement>>(),
         directSubtypes = new Map<ClassElement, List<ClassElement>>(),
         nativeMethods = new Set<FunctionElement>(),
-        nativeBuffer = new CodeBuffer(),
         cachedBuilders = emitterTask.compiler.cacheStrategy.newMap();
 
   Compiler get compiler => emitterTask.compiler;
@@ -45,7 +43,6 @@
   }
 
   /**
-   * Writes the class definitions for the interceptors to [mainBuffer].
    * Writes code to associate dispatch tags with interceptors to [nativeBuffer].
    *
    * The interceptors are filtered to avoid emitting trivial interceptors.  For
@@ -68,7 +65,6 @@
    */
   void generateNativeClasses(
       List<ClassElement> classes,
-      CodeBuffer mainBuffer,
       Map<ClassElement, Map<String, jsAst.Expression>> additionalProperties) {
     // 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
@@ -442,7 +438,7 @@
     return isSupertypeOfNativeClass(element);
   }
 
-  void assembleCode(CodeBuffer targetBuffer) {
+  void assembleCode(CodeOutput targetOutput) {
     List<jsAst.Property> objectProperties = <jsAst.Property>[];
 
     jsAst.Property addProperty(String name, jsAst.Expression value) {
@@ -470,13 +466,14 @@
           [ defPropFunction,
             new jsAst.ObjectInitializer(objectProperties)]);
 
-      if (emitterTask.compiler.enableMinification) targetBuffer.write(';');
-      targetBuffer.write(jsAst.prettyPrint(
+      if (emitterTask.compiler.enableMinification) {
+        targetOutput.add(';');
+      }
+      targetOutput.addBuffer(jsAst.prettyPrint(
           new jsAst.ExpressionStatement(init), compiler));
-      targetBuffer.write('\n');
+      targetOutput.add('\n');
     }
 
-    targetBuffer.write(nativeBuffer);
-    targetBuffer.write('\n');
+    targetOutput.add('\n');
   }
 }
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 01c5963..db34000 100644
--- a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
+++ b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
@@ -27,6 +27,8 @@
       new Map<OutputUnit, List<ConstantValue>>();
   final Map<OutputUnit, List<Element>> outputStaticLists =
       new Map<OutputUnit, List<Element>>();
+  final Map<OutputUnit, List<VariableElement>> outputStaticNonFinalFieldLists =
+      new Map<OutputUnit, List<VariableElement>>();
   final Map<OutputUnit, Set<LibraryElement>> outputLibraryLists =
       new Map<OutputUnit, Set<LibraryElement>>();
 
@@ -118,6 +120,10 @@
     return emitter.typeAccess(e);
   }
 
+  jsAst.Expression closureClassConstructorAccess(ClosureClassElement e) {
+    return emitter.closureClassConstructorAccess(e);
+  }
+
   void registerReadTypeVariable(TypeVariableElement element) {
     readTypeVariables.add(element);
   }
@@ -360,10 +366,22 @@
         backend.generatedCode.keys.where(isStaticFunction);
 
     for (Element element in Elements.sortedByPosition(elements)) {
-      outputStaticLists.putIfAbsent(
+      List<Element> list = outputStaticLists.putIfAbsent(
           compiler.deferredLoadTask.outputUnitForElement(element),
-          () => new List<Element>())
-          .add(element);
+          () => new List<Element>());
+      list.add(element);
+    }
+  }
+
+  void computeNeededStaticNonFinalFields() {
+    JavaScriptConstantCompiler handler = backend.constants;
+    Iterable<VariableElement> staticNonFinalFields =
+        handler.getStaticNonFinalFieldsForEmission();
+    for (Element element in Elements.sortedByPosition(staticNonFinalFields)) {
+      List<VariableElement> list = outputStaticNonFinalFieldLists.putIfAbsent(
+            compiler.deferredLoadTask.outputUnitForElement(element),
+            () => new List<VariableElement>());
+      list.add(element);
     }
   }
 
@@ -387,6 +405,7 @@
     computeNeededDeclarations();
     computeNeededConstants();
     computeNeededStatics();
+    computeNeededStaticNonFinalFields();
     computeNeededLibraries();
   }
 
@@ -443,6 +462,9 @@
   /// 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);
+
   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 3a951ba..aeb48b5 100644
--- a/pkg/compiler/lib/src/js_emitter/js_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/js_emitter.dart
@@ -4,6 +4,9 @@
 
 library dart2js.js_emitter;
 
+import 'dart:async';
+import 'dart:convert';
+
 import '../common.dart';
 
 import '../constants/expressions.dart';
@@ -18,8 +21,7 @@
 import '../dart_types.dart' show
     TypedefType;
 
-import '../io/code_output.dart' show
-    CodeBuffer;
+import '../io/code_output.dart';
 
 import '../elements/elements.dart' show
     ConstructorBodyElement,
@@ -30,7 +32,7 @@
 
 import '../hash/sha1.dart' show hashOfString;
 
-// import '../helpers/helpers.dart';  // Included for debug helpers.
+import '../helpers/helpers.dart';  // Included for debug helpers.
 
 import '../js/js.dart' as jsAst;
 import '../js/js.dart' show
@@ -55,9 +57,9 @@
 
 import 'new_emitter/emitter.dart' as new_js_emitter;
 
-import '../source_file.dart' show
-    SourceFile,
-    StringSourceFile;
+import '../io/line_column_provider.dart' show
+    LineColumnCollector,
+    LineColumnProvider;
 
 import '../io/source_map_builder.dart' show
     SourceMapBuilder;
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 b2c5273..c3df243 100644
--- a/pkg/compiler/lib/src/js_emitter/new_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/new_emitter/emitter.dart
@@ -134,5 +134,10 @@
   }
 
   @override
+  js.PropertyAccess closureClassConstructorAccess(ClassElement element) {
+    return _globalPropertyAccess(element);
+  }
+
+  @override
   void invalidateCaches() {}
 }
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 d441e13..7f53cbd 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
@@ -450,7 +450,7 @@
       }
       return;
     }
-    emitter.needsArrayInitializerSupport = true;
+    emitter.needsStructuredMemberInfo = true;
 
     // This element is needed for reflection or needs additional stubs or has a
     // super alias. So we need to retain additional information.
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 ff8eecb..4adec5d 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
@@ -16,6 +16,7 @@
   final InterceptorEmitter interceptorEmitter = new InterceptorEmitter();
   final MetadataEmitter metadataEmitter = new MetadataEmitter();
 
+  // TODO(johnniwinther): Wrap these fields in a caching strategy.
   final Set<ConstantValue> cachedEmittedConstants;
   final CodeBuffer cachedEmittedConstantsBuffer = new CodeBuffer();
   final Map<Element, ClassBuilder> cachedClassBuilders;
@@ -24,18 +25,19 @@
   bool needsClassSupport = false;
   bool needsMixinSupport = false;
   bool needsLazyInitializer = false;
-  /// This is set to true in ContainerBuilder if the program contains
-  /// function elements that need extra handling. In this case the element is
-  /// stored along with an array containing the needed information.
-  bool needsArrayInitializerSupport = false;
+
+  /// True if [ContainerBuilder.addMemberMethodFromInfo] used "structured info",
+  /// that is, some function was needed for reflection, had stubs, or had a
+  /// super alias.
+  bool needsStructuredMemberInfo = false;
+
   final Namer namer;
   ConstantEmitter constantEmitter;
   NativeEmitter get nativeEmitter => task.nativeEmitter;
   TypeTestRegistry get typeTestRegistry => task.typeTestRegistry;
 
   // The full code that is written to each hunk part-file.
-  Map<OutputUnit, CodeBuffer> outputBuffers = new Map<OutputUnit, CodeBuffer>();
-  final CodeBuffer deferredConstants = new CodeBuffer();
+  Map<OutputUnit, CodeOutput> outputBuffers = new Map<OutputUnit, CodeOutput>();
 
   /** Shorter access to [isolatePropertiesName]. Both here in the code, as
       well as in the generated code. */
@@ -65,14 +67,6 @@
   String get n => compiler.enableMinification ? "" : "\n";
   String get N => compiler.enableMinification ? "\n" : ";\n";
 
-  CodeBuffer getBuffer(OutputUnit outputUnit) {
-    return outputBuffers.putIfAbsent(outputUnit, () => new CodeBuffer());
-  }
-
-  CodeBuffer get mainBuffer {
-    return getBuffer(compiler.deferredLoadTask.mainOutputUnit);
-  }
-
   /**
    * List of expressions and statements that will be included in the
    * precompiled function.
@@ -137,8 +131,8 @@
     _cspPrecompiledConstructorNames.clear();
   }
 
-  void addComment(String comment, CodeBuffer buffer) {
-    buffer.write(jsAst.prettyPrint(js.comment(comment), compiler));
+  void addComment(String comment, CodeOutput output) {
+    output.addBuffer(jsAst.prettyPrint(js.comment(comment), compiler));
   }
 
   @override
@@ -237,6 +231,11 @@
     return globalPropertyAccess(element);
   }
 
+  @override
+  jsAst.PropertyAccess closureClassConstructorAccess(ClosureClassElement e) {
+    return globalPropertyAccess(e);
+  }
+
   List<jsAst.Statement> buildTrivialNsmHandlers(){
     return nsmEmitter.buildTrivialNsmHandlers();
   }
@@ -335,14 +334,14 @@
     jsAst.Expression defineClass = js('''
         function(name, fields) {
           var accessors = [];
-    
+
           var str = "function " + name + "(";
           var body = "";
           if (#hasIsolateSupport) { var fieldNames = ""; }
-    
+
           for (var i = 0; i < fields.length; i++) {
             if(i != 0) str += ", ";
-    
+
             var field = generateAccessor(fields[i], accessors, name);
             if (#hasIsolateSupport) { fieldNames += "'" + field + "',"; }
             var parameter = "parameter_" + field;
@@ -361,7 +360,7 @@
             str += name + ".$fieldNamesProperty=[" + fieldNames + "];\\n";
           }
           str += accessors.join("");
-    
+
           return str;
         }''', { 'hasIsolateSupport': hasIsolateSupport });
 
@@ -581,9 +580,9 @@
            'allowNativesSubclassing': true});
   }
 
-  void emitFinishIsolateConstructorInvocation(CodeBuffer buffer) {
+  void emitFinishIsolateConstructorInvocation(CodeOutput output) {
     String isolate = namer.isolateName;
-    buffer.write("$isolate = $finishIsolateConstructorName($isolate)$N");
+    output.add("$isolate = $finishIsolateConstructorName($isolate)$N");
   }
 
   /// In minified mode we want to keep the name for the most common core types.
@@ -763,44 +762,50 @@
     }
   }
 
-  void emitStaticNonFinalFieldInitializations(CodeBuffer buffer,
+  void emitStaticNonFinalFieldInitializations(CodeOutput output,
                                               OutputUnit outputUnit) {
-    JavaScriptConstantCompiler handler = backend.constants;
-    Iterable<VariableElement> staticNonFinalFields =
-        handler.getStaticNonFinalFieldsForEmission();
-    for (Element element in Elements.sortedByPosition(staticNonFinalFields)) {
-      // [:interceptedNames:] is handled in [emitInterceptedNames].
-      if (element == backend.interceptedNames) continue;
-      // `mapTypeToInterceptor` is handled in [emitMapTypeToInterceptor].
-      if (element == backend.mapTypeToInterceptor) continue;
-      compiler.withCurrentElement(element, () {
-        jsAst.Expression initialValue;
-        if (outputUnit !=
-            compiler.deferredLoadTask.outputUnitForElement(element)) {
-          if (outputUnit == compiler.deferredLoadTask.mainOutputUnit) {
-            // In the main output-unit we output a stub initializer for deferred
-            // variables, such that `isolateProperties` stays a fast object.
-            initialValue = jsAst.number(0);
-          } else {
-            // Don't output stubs outside the main output file.
-            return;
-          }
-        } else {
-          initialValue = constantEmitter.referenceInInitializationContext(
-              handler.getInitialValueFor(element).value);
+    void emitInitialization(Element element, jsAst.Expression initialValue) {
+      jsAst.Expression init =
+        js('$isolateProperties.# = #',
+            [namer.getNameOfGlobalField(element), initialValue]);
+      output.addBuffer(jsAst.prettyPrint(init, compiler,
+                                         monitor: compiler.dumpInfoTask));
+      output.add('$N');
+    }
 
+    bool inMainUnit = (outputUnit == compiler.deferredLoadTask.mainOutputUnit);
+    JavaScriptConstantCompiler handler = backend.constants;
+
+    Iterable<Element> fields = task.outputStaticNonFinalFieldLists[outputUnit];
+    // If the outputUnit does not contain any static non-final fields, then
+    // [fields] is `null`.
+    if (fields != null) {
+      for (Element element in fields) {
+        compiler.withCurrentElement(element, () {
+          ConstantValue constant = handler.getInitialValueFor(element).value;
+          emitInitialization(
+              element,
+              constantEmitter.referenceInInitializationContext(constant));
+        });
+      }
+    }
+
+    if (inMainUnit && task.outputStaticNonFinalFieldLists.length > 1) {
+      // In the main output-unit we output a stub initializer for deferred
+      // variables, so that `isolateProperties` stays a fast object.
+      task.outputStaticNonFinalFieldLists.forEach(
+          (OutputUnit fieldsOutputUnit, Iterable<VariableElement> fields) {
+        if (fieldsOutputUnit == outputUnit) return;  // Skip the main unit.
+        for (Element element in fields) {
+          compiler.withCurrentElement(element, () {
+            emitInitialization(element, jsAst.number(0));
+          });
         }
-        jsAst.Expression init =
-          js('$isolateProperties.# = #',
-              [namer.getNameOfGlobalField(element), initialValue]);
-        buffer.write(jsAst.prettyPrint(init, compiler,
-                                       monitor: compiler.dumpInfoTask));
-        buffer.write('$N');
       });
     }
   }
 
-  void emitLazilyInitializedStaticFields(CodeBuffer buffer) {
+  void emitLazilyInitializedStaticFields(CodeOutput output) {
     JavaScriptConstantCompiler handler = backend.constants;
     List<VariableElement> lazyFields =
         handler.getLazilyInitializedFieldsForEmission();
@@ -810,9 +815,9 @@
         jsAst.Expression init =
             buildLazilyInitializedStaticField(element, isolateProperties);
         if (init == null) continue;
-        buffer.write(
+        output.addBuffer(
             jsAst.prettyPrint(init, compiler, monitor: compiler.dumpInfoTask));
-        buffer.write("$N");
+        output.add("$N");
       }
     }
   }
@@ -871,25 +876,25 @@
     return namer.constantName(a).compareTo(namer.constantName(b));
   }
 
-  void emitCompileTimeConstants(CodeBuffer buffer, OutputUnit outputUnit) {
+  void emitCompileTimeConstants(CodeOutput output, OutputUnit outputUnit) {
     List<ConstantValue> constants = outputConstantLists[outputUnit];
     if (constants == null) return;
-    bool isMainBuffer = buffer == mainBuffer;
-    if (compiler.hasIncrementalSupport && isMainBuffer) {
-      buffer = cachedEmittedConstantsBuffer;
+    CodeOutput constantOutput = output;
+    if (compiler.hasIncrementalSupport && outputUnit.isMainOutput) {
+      constantOutput = cachedEmittedConstantsBuffer;
     }
     for (ConstantValue constant in constants) {
-      if (compiler.hasIncrementalSupport && isMainBuffer) {
+      if (compiler.hasIncrementalSupport && outputUnit.isMainOutput) {
         if (cachedEmittedConstants.contains(constant)) continue;
         cachedEmittedConstants.add(constant);
       }
       jsAst.Expression init = buildConstantInitializer(constant);
-      buffer.write(jsAst.prettyPrint(init, compiler,
-                                     monitor: compiler.dumpInfoTask));
-      buffer.write('$N');
+      constantOutput.addBuffer(jsAst.prettyPrint(init, compiler,
+                                         monitor: compiler.dumpInfoTask));
+      constantOutput.add('$N');
     }
-    if (compiler.hasIncrementalSupport && isMainBuffer) {
-      mainBuffer.write(cachedEmittedConstantsBuffer);
+    if (compiler.hasIncrementalSupport && outputUnit.isMainOutput) {
+      output.addBuffer(constantOutput);
     }
   }
 
@@ -906,8 +911,8 @@
         '${namer.isolateName}.$makeConstListProperty(#)');
   }
 
-  void emitMakeConstantList(CodeBuffer buffer) {
-    buffer.write(
+  void emitMakeConstantList(CodeOutput output) {
+    output.addBuffer(
         jsAst.prettyPrint(
             // Functions are stored in the hidden class and not as properties in
             // the object. We never actually look at the value, but only want
@@ -919,7 +924,7 @@
                                    }''',
                          [namer.isolateName, makeConstListProperty]),
             compiler, monitor: compiler.dumpInfoTask));
-    buffer.write(N);
+    output.add(N);
   }
 
   /// Returns the code equivalent to:
@@ -933,7 +938,7 @@
         [backend.emitter.staticFunctionAccess(isolateMain), mainAccess]);
   }
 
-  emitMain(CodeBuffer buffer) {
+  emitMain(CodeOutput output) {
     if (compiler.isMockCompilation) return;
     Element main = compiler.mainFunction;
     jsAst.Expression mainCallClosure = null;
@@ -955,14 +960,14 @@
               backend,
               generateEmbeddedGlobalAccess,
               js("convertToFastObject", []));
-      buffer.write(jsAst.prettyPrint(nativeBoilerPlate,
-                                     compiler, monitor: compiler.dumpInfoTask));
+      output.addBuffer(jsAst.prettyPrint(
+          nativeBoilerPlate, compiler, monitor: compiler.dumpInfoTask));
     }
 
     jsAst.Expression currentScriptAccess =
         generateEmbeddedGlobalAccess(embeddedNames.CURRENT_SCRIPT);
 
-    addComment('BEGIN invoke [main].', buffer);
+    addComment('BEGIN invoke [main].', output);
     // This code finds the currently executing script by listening to the
     // onload event of all script tags and getting the first script which
     // finishes. Since onload is called immediately after execution this should
@@ -999,14 +1004,14 @@
 })''', {'currentScript': currentScriptAccess,
         'mainCallClosure': mainCallClosure});
 
-    buffer.write(';');
-    buffer.write(jsAst.prettyPrint(invokeMain,
-                 compiler, monitor: compiler.dumpInfoTask));
-    buffer.write(N);
-    addComment('END invoke [main].', buffer);
+    output.add(';');
+    output.addBuffer(jsAst.prettyPrint(invokeMain,
+                     compiler, monitor: compiler.dumpInfoTask));
+    output.add(N);
+    addComment('END invoke [main].', output);
   }
 
-  void emitInitFunction(CodeBuffer buffer) {
+  void emitInitFunction(CodeOutput output) {
     String isolate = namer.currentIsolate;
     jsAst.Expression allClassesAccess =
         generateEmbeddedGlobalAccess(embeddedNames.ALL_CLASSES);
@@ -1034,17 +1039,17 @@
                                            getterName, lazyValue) {
             if (!#lazies) #lazies = Object.create(null);
             #lazies[fieldName] = getterName;
-  
+
             var sentinelUndefined = {};
             var sentinelInProgress = {};
             prototype[fieldName] = sentinelUndefined;
-  
+
             prototype[getterName] = function () {
               var result = $isolate[fieldName];
               try {
                 if (result === sentinelUndefined) {
                   $isolate[fieldName] = sentinelInProgress;
-  
+
                   try {
                     result = $isolate[fieldName] = lazyValue();
                   } finally {
@@ -1057,7 +1062,7 @@
                   if (result === sentinelInProgress)
                     #cyclicThrow(staticName);
                 }
-  
+
                 return result;
               } finally {
                 $isolate[getterName] = function() { return this[fieldName]; };
@@ -1115,7 +1120,7 @@
           }
           return Isolate;
       }
-        
+
       }''', {'allClasses': allClassesAccess,
             'interceptorsByTag': interceptorsByTagAccess,
             'leafTags': leafTagsAccess,
@@ -1128,12 +1133,14 @@
             'hasIncrementalSupport': compiler.hasIncrementalSupport,
             'lazyInitializerProperty': lazyInitializerProperty,});
 
-    buffer.write(jsAst.prettyPrint(decl,
-                 compiler, monitor: compiler.dumpInfoTask).getText());
-    if (compiler.enableMinification) buffer.write('\n');
+    output.addBuffer(
+        jsAst.prettyPrint(decl, compiler, monitor: compiler.dumpInfoTask));
+    if (compiler.enableMinification) {
+      output.add('\n');
+    }
   }
 
-  void emitConvertToFastObjectFunction() {
+  void emitConvertToFastObjectFunction(CodeOutput output) {
     List<jsAst.Statement> debugCode = <jsAst.Statement>[];
     if (DEBUG_FAST_OBJECTS) {
       debugCode.add(js.statement(r'''
@@ -1160,11 +1167,11 @@
         return properties;
       }''', [debugCode]);
 
-    mainBuffer.write(jsAst.prettyPrint(convertToFastObject, compiler));
-    mainBuffer.write(N);
+    output.addBuffer(jsAst.prettyPrint(convertToFastObject, compiler));
+    output.add(N);
   }
 
-  void writeLibraryDescriptors(CodeBuffer buffer, LibraryElement library) {
+  void writeLibraryDescriptors(CodeOutput output, LibraryElement library) {
     var uri = "";
     if (!compiler.enableMinification || backend.mustPreserveUris) {
       uri = library.canonicalUri;
@@ -1192,20 +1199,23 @@
 
     compiler.dumpInfoTask.registerElementAst(library, metadata);
     compiler.dumpInfoTask.registerElementAst(library, initializers);
-    buffer
-        ..write('["$libraryName",$_')
-        ..write('"${uri}",$_')
-        ..write(metadata == null ? "" : jsAst.prettyPrint(metadata,
-                                              compiler,
-                                              monitor: compiler.dumpInfoTask))
-        ..write(',$_')
-        ..write(namer.globalObjectFor(library))
-        ..write(',$_')
-        ..write(jsAst.prettyPrint(initializers,
-                                  compiler,
-                                  monitor: compiler.dumpInfoTask))
-        ..write(library == compiler.mainApp ? ',${n}1' : "")
-        ..write('],$n');
+    output
+        ..add('["$libraryName",$_')
+        ..add('"${uri}",$_');
+    if (metadata != null) {
+      output.addBuffer(jsAst.prettyPrint(metadata,
+                                         compiler,
+                                         monitor: compiler.dumpInfoTask));
+    }
+    output
+        ..add(',$_')
+        ..add(namer.globalObjectFor(library))
+        ..add(',$_')
+        ..addBuffer(jsAst.prettyPrint(initializers,
+                                      compiler,
+                                      monitor: compiler.dumpInfoTask))
+        ..add(library == compiler.mainApp ? ',${n}1' : "")
+        ..add('],$n');
   }
 
   void emitPrecompiledConstructor(OutputUnit outputUnit,
@@ -1232,7 +1242,7 @@
           ''' /* next string is not a raw string */ '''
           if (#hasIsolateSupport) {
             #constructorName.$fieldNamesProperty = #fieldNamesArray;
-          } 
+          }
         }''',
         {"constructorName": constructorName,
          "constructorNameString": js.string(constructorName),
@@ -1242,22 +1252,6 @@
     cspPrecompiledConstructorNamesFor(outputUnit).add(js('#', constructorName));
   }
 
-  /// Extracts the output name of the compiler's outputUri.
-  String deferredPartFileName(OutputUnit outputUnit,
-                              {bool addExtension: true}) {
-    String outPath = compiler.outputUri != null
-        ? compiler.outputUri.path
-        : "out";
-    String outName = outPath.substring(outPath.lastIndexOf('/') + 1);
-    String extension = addExtension ? ".part.js" : "";
-    if (outputUnit == compiler.deferredLoadTask.mainOutputUnit) {
-      return "$outName$extension";
-    } else {
-      String name = outputUnit.name;
-      return "${outName}_$name$extension";
-    }
-  }
-
   void emitLibraries(Iterable<LibraryElement> libraries) {
     if (libraries.isEmpty) return;
 
@@ -1314,7 +1308,7 @@
     }
   }
 
-  void emitMangledNames() {
+  void emitMangledNames(CodeOutput output) {
     if (!mangledFieldNames.isEmpty) {
       var keys = mangledFieldNames.keys.toList();
       keys.sort();
@@ -1327,13 +1321,13 @@
       jsAst.Expression mangledNamesAccess =
           generateEmbeddedGlobalAccess(embeddedNames.MANGLED_NAMES);
       var map = new jsAst.ObjectInitializer(properties);
-      mainBuffer.write(
+      output.addBuffer(
           jsAst.prettyPrint(
               js.statement('# = #', [mangledNamesAccess, map]),
               compiler,
               monitor: compiler.dumpInfoTask));
       if (compiler.enableMinification) {
-        mainBuffer.write(';');
+        output.add(';');
       }
     }
     if (!mangledGlobalFieldNames.isEmpty) {
@@ -1347,13 +1341,13 @@
       jsAst.Expression mangledGlobalNamesAccess =
           generateEmbeddedGlobalAccess(embeddedNames.MANGLED_GLOBAL_NAMES);
       var map = new jsAst.ObjectInitializer(properties);
-      mainBuffer.write(
+      output.addBuffer(
           jsAst.prettyPrint(
               js.statement('# = #', [mangledGlobalNamesAccess, map]),
               compiler,
               monitor: compiler.dumpInfoTask));
       if (compiler.enableMinification) {
-        mainBuffer.write(';');
+        output.add(';');
       }
     }
   }
@@ -1377,27 +1371,39 @@
 
   void emitMainOutputUnit(Map<OutputUnit, String> deferredLoadHashes,
                           CodeBuffer nativeBuffer) {
-    bool isProgramSplit = compiler.deferredLoadTask.isProgramSplit;
-    OutputUnit mainOutputUnit = compiler.deferredLoadTask.mainOutputUnit;
+    LineColumnCollector lineColumnCollector;
+    List<CodeOutputListener> codeOutputListeners;
+    if (generateSourceMap) {
+      lineColumnCollector = new LineColumnCollector();
+      codeOutputListeners = <CodeOutputListener>[lineColumnCollector];
+    }
 
-    mainBuffer.write(buildGeneratedBy());
-    addComment(HOOKS_API_USAGE, mainBuffer);
+    OutputUnit mainOutputUnit = compiler.deferredLoadTask.mainOutputUnit;
+    CodeOutput mainOutput =
+        new StreamCodeOutput(compiler.outputProvider('', 'js'),
+                             codeOutputListeners);
+    outputBuffers[mainOutputUnit] = mainOutput;
+
+    bool isProgramSplit = compiler.deferredLoadTask.isProgramSplit;
+
+    mainOutput.add(buildGeneratedBy());
+    addComment(HOOKS_API_USAGE, mainOutput);
 
     if (isProgramSplit) {
       /// For deferred loading we communicate the initializers via this global
       /// variable. The deferred hunks will add their initialization to this.
       /// The semicolon is important in minified mode, without it the
       /// following parenthesis looks like a call to the object literal.
-      mainBuffer..write(
+      mainOutput.add(
           'self.${deferredInitializers} = self.${deferredInitializers} || '
           'Object.create(null);$n');
     }
 
     // Using a named function here produces easier to read stack traces in
     // Chrome/V8.
-    mainBuffer.write('(function(${namer.currentIsolate})$_{\n');
+    mainOutput.add('(function(${namer.currentIsolate})$_{\n');
     if (compiler.hasIncrementalSupport) {
-      mainBuffer.write(jsAst.prettyPrint(js.statement(
+      mainOutput.addBuffer(jsAst.prettyPrint(js.statement(
           """
 {
   #helper = #helper || Object.create(null);
@@ -1415,9 +1421,9 @@
             'addMethod': buildIncrementalAddMethod() }), compiler));
     }
     if (isProgramSplit) {
-      /// We collect all the global state of the, so it can be passed to the
+      /// We collect all the global state, so it can be passed to the
       /// initializer of deferred files.
-      mainBuffer.write('var ${globalsHolder}$_=${_}Object.create(null)$N');
+      mainOutput.add('var ${globalsHolder}$_=${_}Object.create(null)$N');
     }
 
     jsAst.Statement mapFunction = js.statement('''
@@ -1433,30 +1439,30 @@
     return x;
   }
 ''');
-    mainBuffer.write(jsAst.prettyPrint(mapFunction, compiler));
+    mainOutput.addBuffer(jsAst.prettyPrint(mapFunction, compiler));
     for (String globalObject in Namer.reservedGlobalObjectNames) {
       // The global objects start as so-called "slow objects". For V8, this
       // means that it won't try to make map transitions as we add properties
       // to these objects. Later on, we attempt to turn these objects into
       // fast objects by calling "convertToFastObject" (see
       // [emitConvertToFastObjectFunction]).
-      mainBuffer.write('var ${globalObject}$_=${_}');
+      mainOutput.add('var ${globalObject}$_=${_}');
       if(isProgramSplit) {
-        mainBuffer.write('${globalsHolder}.$globalObject$_=${_}');
+        mainOutput.add('${globalsHolder}.$globalObject$_=${_}');
       }
-      mainBuffer.write('map()$N');
+      mainOutput.add('map()$N');
     }
 
-    mainBuffer.write('function ${namer.isolateName}()$_{}\n');
+    mainOutput.add('function ${namer.isolateName}()$_{}\n');
     if (isProgramSplit) {
-      mainBuffer.write(
+      mainOutput.add(
           '${globalsHolder}.${namer.isolateName}$_=$_${namer.isolateName}$N'
           '${globalsHolder}.$initName$_=${_}$initName$N'
           '${globalsHolder}.$parseReflectionDataName$_=$_'
             '$parseReflectionDataName$N');
     }
-    mainBuffer.write('init()$N$n');
-    mainBuffer.write('$isolateProperties$_=$_$isolatePropertiesName$N');
+    mainOutput.add('init()$N$n');
+    mainOutput.add('$isolateProperties$_=$_$isolatePropertiesName$N');
 
     emitStaticFunctions(task.outputStaticLists[mainOutputUnit]);
 
@@ -1468,83 +1474,84 @@
     }
 
     if (compiler.enableMinification) {
-      mainBuffer.write(';');
+      mainOutput.add(';');
     }
 
-    if (elementDescriptors.isNotEmpty) {
-      Iterable<LibraryElement> libraries =
-          task.outputLibraryLists[mainOutputUnit];
-      if (libraries == null) libraries = [];
-      emitLibraries(libraries);
-      emitTypedefs();
-      emitMangledNames();
+    Iterable<LibraryElement> libraries =
+        task.outputLibraryLists[mainOutputUnit];
+    if (libraries == null) libraries = [];
+    emitLibraries(libraries);
+    emitTypedefs();
+    emitMangledNames(mainOutput);
 
-      checkEverythingEmitted(elementDescriptors.keys);
+    checkEverythingEmitted(elementDescriptors.keys);
 
-      CodeBuffer libraryBuffer = new CodeBuffer();
-      for (LibraryElement library in Elements.sortedByPosition(libraries)) {
-        writeLibraryDescriptors(libraryBuffer, library);
-        elementDescriptors.remove(library);
-      }
-
-      mainBuffer
-          ..write(
-              jsAst.prettyPrint(
-                  getReflectionDataParser(this, backend),
-                  compiler))
-          ..write(n);
-
-      // The argument to reflectionDataParser is assigned to a temporary 'dart'
-      // so that 'dart.' will appear as the prefix to dart methods in stack
-      // traces and profile entries.
-      mainBuffer..write('var dart = [$n')
-                ..write(libraryBuffer)
-                ..write(']$N')
-                ..write('$parseReflectionDataName(dart)$N');
+    CodeBuffer libraryBuffer = new CodeBuffer();
+    for (LibraryElement library in Elements.sortedByPosition(libraries)) {
+      writeLibraryDescriptors(libraryBuffer, library);
+      elementDescriptors.remove(library);
     }
 
-    interceptorEmitter.emitGetInterceptorMethods(mainBuffer);
-    interceptorEmitter.emitOneShotInterceptors(mainBuffer);
+    mainOutput
+        ..addBuffer(
+            jsAst.prettyPrint(
+                getReflectionDataParser(this, backend),
+                compiler))
+        ..add(n);
+
+    // The argument to reflectionDataParser is assigned to a temporary 'dart'
+    // so that 'dart.' will appear as the prefix to dart methods in stack
+    // traces and profile entries.
+    mainOutput..add('var dart = [$n')
+              ..addBuffer(libraryBuffer)
+              ..add(']$N')
+              ..add('$parseReflectionDataName(dart)$N');
+
+    interceptorEmitter.emitGetInterceptorMethods(mainOutput);
+    interceptorEmitter.emitOneShotInterceptors(mainOutput);
 
     if (task.outputContainsConstantList) {
-      emitMakeConstantList(mainBuffer);
+      emitMakeConstantList(mainOutput);
     }
 
     // Constants in checked mode call into RTI code to set type information
     // which may need getInterceptor (and one-shot interceptor) methods, so
     // we have to make sure that [emitGetInterceptorMethods] and
     // [emitOneShotInterceptors] have been called.
-    emitCompileTimeConstants(mainBuffer, mainOutputUnit);
+    emitCompileTimeConstants(mainOutput, mainOutputUnit);
 
-    emitDeferredBoilerPlate(mainBuffer, deferredLoadHashes);
+    emitDeferredBoilerPlate(mainOutput, deferredLoadHashes);
+
+    if (compiler.deferredMapUri != null) {
+      outputDeferredMap();
+    }
 
     // Static field initializations require the classes and compile-time
     // constants to be set up.
-    emitStaticNonFinalFieldInitializations(mainBuffer, mainOutputUnit);
-    interceptorEmitter.emitInterceptedNames(mainBuffer);
-    interceptorEmitter.emitMapTypeToInterceptor(mainBuffer);
-    emitLazilyInitializedStaticFields(mainBuffer);
+    emitStaticNonFinalFieldInitializations(mainOutput, mainOutputUnit);
+    interceptorEmitter.emitMapTypeToInterceptor(mainOutput);
+    emitLazilyInitializedStaticFields(mainOutput);
 
-    mainBuffer.writeln();
-    mainBuffer.write(nativeBuffer);
+    mainOutput.add('\n');
+    mainOutput.addBuffer(nativeBuffer);
 
-    metadataEmitter.emitMetadata(mainBuffer);
+    metadataEmitter.emitMetadata(mainOutput);
 
     isolateProperties = isolatePropertiesName;
     // The following code should not use the short-hand for the
     // initialStatics.
-    mainBuffer.write('${namer.currentIsolate}$_=${_}null$N');
+    mainOutput.add('${namer.currentIsolate}$_=${_}null$N');
 
-    emitFinishIsolateConstructorInvocation(mainBuffer);
-    mainBuffer.write(
+    emitFinishIsolateConstructorInvocation(mainOutput);
+    mainOutput.add(
         '${namer.currentIsolate}$_=${_}new ${namer.isolateName}()$N');
 
-    emitConvertToFastObjectFunction();
+    emitConvertToFastObjectFunction(mainOutput);
     for (String globalObject in Namer.reservedGlobalObjectNames) {
-      mainBuffer.write('$globalObject = convertToFastObject($globalObject)$N');
+      mainOutput.add('$globalObject = convertToFastObject($globalObject)$N');
     }
     if (DEBUG_FAST_OBJECTS) {
-      mainBuffer.write(r'''
+      mainOutput.add(r'''
           // The following only works on V8 when run with option
           // "--allow-natives-syntax".  We use'new Function' because the
           // miniparser does not understand V8 native syntax.
@@ -1573,7 +1580,7 @@
           }
 ''');
       for (String object in Namer.userGlobalObjects) {
-      mainBuffer.write('''
+      mainOutput.add('''
         if (typeof print === "function") {
            print("Size of $object: "
                  + String(Object.getOwnPropertyNames($object).length)
@@ -1585,31 +1592,30 @@
 
     jsAst.FunctionDeclaration precompiledFunctionAst =
         buildCspPrecompiledFunctionFor(mainOutputUnit);
-    emitInitFunction(mainBuffer);
-    emitMain(mainBuffer);
-    mainBuffer.write('})()\n');
+    emitInitFunction(mainOutput);
+    emitMain(mainOutput);
+    mainOutput.add('})()\n');
 
     if (compiler.useContentSecurityPolicy) {
-      mainBuffer.write(
+      mainOutput.addBuffer(
           jsAst.prettyPrint(
               precompiledFunctionAst,
               compiler,
               monitor: compiler.dumpInfoTask,
-              allowVariableMinification: false).getText());
+              allowVariableMinification: false));
     }
 
-    String assembledCode = mainBuffer.getText();
     if (generateSourceMap) {
-      outputSourceMap(assembledCode, mainBuffer, '',
-          compiler.sourceMapUri, compiler.outputUri);
-      mainBuffer.write(
+      mainOutput.add(
           generateSourceMapTag(compiler.sourceMapUri, compiler.outputUri));
-      assembledCode = mainBuffer.getText();
     }
 
-    compiler.outputProvider('', 'js')
-        ..add(assembledCode)
-        ..close();
+    mainOutput.close();
+
+    if (generateSourceMap) {
+      outputSourceMap(mainOutput, lineColumnCollector, '',
+          compiler.sourceMapUri, compiler.outputUri);
+    }
   }
 
   /// Used by incremental compilation to patch up the prototype of
@@ -1758,6 +1764,7 @@
         if (libraries == null) libraries = [];
         emitLibraries(libraries);
 
+        // TODO(johnniwinther): Avoid creating [CodeBuffer]s.
         CodeBuffer buffer = new CodeBuffer();
         outputBuffers[outputUnit] = buffer;
         for (LibraryElement library in Elements.sortedByPosition(libraries)) {
@@ -1772,6 +1779,7 @@
 
   CodeBuffer buildNativesBuffer() {
     // Emit native classes on [nativeBuffer].
+    // TODO(johnniwinther): Avoid creating a [CodeBuffer].
     final CodeBuffer nativeBuffer = new CodeBuffer();
 
     if (nativeClasses.isEmpty) return nativeBuffer;
@@ -1779,8 +1787,7 @@
 
     addComment('Native classes', nativeBuffer);
 
-    nativeEmitter.generateNativeClasses(nativeClasses, mainBuffer,
-        additionalProperties);
+    nativeEmitter.generateNativeClasses(nativeClasses, additionalProperties);
 
     nativeEmitter.finishGenerateNativeClasses();
     nativeEmitter.assembleCode(nativeBuffer);
@@ -1805,7 +1812,6 @@
         !backend.htmlLibraryIsLoaded) {
       compiler.reportHint(NO_LOCATION_SPANNABLE, MessageKind.PREAMBLE);
     }
-
     // Return the total program size.
     return outputBuffers.values.fold(0, (a, b) => a + b.length);
   }
@@ -1844,8 +1850,8 @@
         () => new ClassBuilder(owner, namer));
   }
 
-  /// Emits support-code for deferred loading into [buffer].
-  void emitDeferredBoilerPlate(CodeBuffer buffer,
+  /// Emits support-code for deferred loading into [output].
+  void emitDeferredBoilerPlate(CodeOutput output,
                                Map<OutputUnit, String> deferredLoadHashes) {
     jsAst.Statement functions = js.statement('''
         {
@@ -1873,7 +1879,7 @@
                   embeddedNames.INITIALIZE_LOADED_HUNK),
               "deferredInitialized": generateEmbeddedGlobalAccess(
                   embeddedNames.DEFERRED_INITIALIZED)});
-    buffer.write(jsAst.prettyPrint(functions,
+    output.addBuffer(jsAst.prettyPrint(functions,
         compiler, monitor: compiler.dumpInfoTask));
     // Write a javascript mapping from Deferred import load ids (derrived
     // from the import prefix.) to a list of lists of uris of hunks to load,
@@ -1889,7 +1895,7 @@
       List<String> hashes = new List<String>();
       deferredLibraryHashes[loadId] = new List<String>();
       for (OutputUnit outputUnit in outputUnits) {
-        uris.add(deferredPartFileName(outputUnit));
+        uris.add(backend.deferredPartFileName(outputUnit.name));
         hashes.add(deferredLoadHashes[outputUnit]);
       }
 
@@ -1908,11 +1914,10 @@
           new jsAst.ObjectInitializer(properties, isOneLiner: true);
 
       jsAst.Node globalName = generateEmbeddedGlobalAccess(name);
-      buffer.write(jsAst.prettyPrint(
+      output.addBuffer(jsAst.prettyPrint(
           js("# = #", [globalName, initializer]),
           compiler, monitor: compiler.dumpInfoTask));
-      buffer.write('$N');
-
+      output.add('$N');
     }
 
     emitMapping(embeddedNames.DEFERRED_LIBRARY_URIS, deferredLibraryUris);
@@ -1931,39 +1936,55 @@
     for (OutputUnit outputUnit in compiler.deferredLoadTask.allOutputUnits) {
       if (outputUnit == compiler.deferredLoadTask.mainOutputUnit) continue;
 
-      CodeBuffer libraryDescriptorBuffer = deferredBuffers[outputUnit];
+      CodeOutput libraryDescriptorBuffer = deferredBuffers[outputUnit];
 
-      CodeBuffer outputBuffer = new CodeBuffer();
+      List<CodeOutputListener> outputListeners = <CodeOutputListener>[];
+      Hasher hasher = new Hasher();
+      outputListeners.add(hasher);
 
-      outputBuffer..write(buildGeneratedBy())
-        ..write('${deferredInitializers}.current$_=$_'
-                'function$_(${globalsHolder}) {$N');
-      for (String globalObject in Namer.reservedGlobalObjectNames) {
-        outputBuffer
-            .write('var $globalObject$_=$_'
-                   '${globalsHolder}.$globalObject$N');
+      LineColumnCollector lineColumnCollector;
+      if (generateSourceMap) {
+        lineColumnCollector = new LineColumnCollector();
+        outputListeners.add(lineColumnCollector);
       }
-      outputBuffer
-          ..write('var init$_=$_${globalsHolder}.init$N')
-          ..write('var $parseReflectionDataName$_=$_'
+
+      String partPrefix =
+          backend.deferredPartFileName(outputUnit.name, addExtension: false);
+      CodeOutput output = new StreamCodeOutput(
+          compiler.outputProvider(partPrefix, 'part.js'),
+          outputListeners);
+
+      outputBuffers[outputUnit] = output;
+
+      output
+          ..add(buildGeneratedBy())
+          ..add('${deferredInitializers}.current$_=$_'
+                   'function$_(${globalsHolder}) {$N');
+      for (String globalObject in Namer.reservedGlobalObjectNames) {
+        output
+            .add('var $globalObject$_=$_'
+                     '${globalsHolder}.$globalObject$N');
+      }
+      output
+          ..add('var init$_=$_${globalsHolder}.init$N')
+          ..add('var $parseReflectionDataName$_=$_'
                     '$globalsHolder.$parseReflectionDataName$N')
-          ..write('var ${namer.isolateName}$_=$_'
+          ..add('var ${namer.isolateName}$_=$_'
                     '${globalsHolder}.${namer.isolateName}$N');
       if (libraryDescriptorBuffer != null) {
-      // TODO(ahe): This defines a lot of properties on the
-      // Isolate.prototype object.  We know this will turn it into a
-      // slow object in V8, so instead we should do something similar
-      // to Isolate.$finishIsolateConstructor.
-         outputBuffer
-           ..write('var ${namer.currentIsolate}$_=$_$isolatePropertiesName$N')
+        // TODO(ahe): This defines a lot of properties on the
+        // Isolate.prototype object.  We know this will turn it into a
+        // slow object in V8, so instead we should do something similar
+        // to Isolate.$finishIsolateConstructor.
+        output
+            ..add('var ${namer.currentIsolate}$_=$_$isolatePropertiesName$N')
             // The argument to reflectionDataParser is assigned to a temporary
             // 'dart' so that 'dart.' will appear as the prefix to dart methods
             // in stack traces and profile entries.
-           ..write('var dart = [$n ')
-           ..addBuffer(libraryDescriptorBuffer)
-           ..write(']$N')
-           ..write('$parseReflectionDataName(dart)$N');
-
+            ..add('var dart = [$n ')
+            ..addBuffer(libraryDescriptorBuffer)
+            ..add(']$N')
+            ..add('$parseReflectionDataName(dart)$N');
       }
 
       // Set the currentIsolate variable to the current isolate (which is
@@ -1975,33 +1996,33 @@
       // After we have done the setup it must point to the current Isolate.
       // Otherwise all methods/functions accessing isolate variables will
       // access the wrong object.
-      outputBuffer.write("${namer.currentIsolate}$_=${_}arguments[1]$N");
+      output.add("${namer.currentIsolate}$_=${_}arguments[1]$N");
 
-      emitCompileTimeConstants(outputBuffer, outputUnit);
-      emitStaticNonFinalFieldInitializations(outputBuffer, outputUnit);
-      outputBuffer.write('}$N');
+      emitCompileTimeConstants(output, outputUnit);
+      emitStaticNonFinalFieldInitializations(output, outputUnit);
+      output.add('}$N');
 
       if (compiler.useContentSecurityPolicy) {
         jsAst.FunctionDeclaration precompiledFunctionAst =
             buildCspPrecompiledFunctionFor(outputUnit);
 
-        outputBuffer.write(
+        output.addBuffer(
             jsAst.prettyPrint(
                 precompiledFunctionAst, compiler,
                 monitor: compiler.dumpInfoTask,
-                allowVariableMinification: false).getText());
+                allowVariableMinification: false));
       }
 
       // Make a unique hash of the code (before the sourcemaps are added)
       // This will be used to retrieve the initializing function from the global
       // variable.
-      String hash = hashOfString(outputBuffer.getText());
+      String hash = hasher.getHash();
 
-      outputBuffer.write('${deferredInitializers}["$hash"]$_=$_'
-                         '${deferredInitializers}.current$N');
+      output.add('${deferredInitializers}["$hash"]$_=$_'
+                       '${deferredInitializers}.current$N');
 
-      String partPrefix = deferredPartFileName(outputUnit, addExtension: false);
       if (generateSourceMap) {
+
         Uri mapUri, partUri;
         Uri sourceMapUri = compiler.sourceMapUri;
         Uri outputUri = compiler.outputUri;
@@ -2022,16 +2043,14 @@
           partUri = compiler.outputUri.replace(pathSegments: partSegments);
         }
 
-        outputSourceMap(outputBuffer.getText(), outputBuffer, partName,
-            mapUri, partUri);
-        outputBuffer.write(generateSourceMapTag(mapUri, partUri));
+        output.add(generateSourceMapTag(mapUri, partUri));
+        output.close();
+        outputSourceMap(output, lineColumnCollector, partName,
+                        mapUri, partUri);
+      } else {
+        output.close();
       }
 
-      outputBuffers[outputUnit] = outputBuffer;
-      compiler.outputProvider(partPrefix, 'part.js')
-        ..add(outputBuffer.getText())
-        ..close();
-
       hunkHashes[outputUnit] = hash;
     }
     return hunkHashes;
@@ -2043,21 +2062,35 @@
     return '// Generated by dart2js, the Dart to JavaScript compiler$suffix.\n';
   }
 
-  void outputSourceMap(String code, CodeBuffer buffer, String name,
-                       [Uri sourceMapUri, Uri fileUri]) {
+  void outputSourceMap(CodeOutput output,
+                       LineColumnProvider lineColumnProvider,
+                       String name,
+                       [Uri sourceMapUri,
+                        Uri fileUri]) {
     if (!generateSourceMap) return;
     // Create a source file for the compilation output. This allows using
     // [:getLine:] to transform offsets to line numbers in [SourceMapBuilder].
-    SourceFile compiledFile = new StringSourceFile(null, code);
     SourceMapBuilder sourceMapBuilder =
-            new SourceMapBuilder(sourceMapUri, fileUri, compiledFile);
-    buffer.forEachSourceLocation(sourceMapBuilder.addMapping);
+            new SourceMapBuilder(sourceMapUri, fileUri, lineColumnProvider);
+    output.forEachSourceLocation(sourceMapBuilder.addMapping);
     String sourceMap = sourceMapBuilder.build();
     compiler.outputProvider(name, 'js.map')
         ..add(sourceMap)
         ..close();
   }
 
+  void outputDeferredMap() {
+    Map<String, dynamic> mapping = new Map<String, dynamic>();
+    // Json does not support comments, so we embed the explanation in the
+    // data.
+    mapping["_comment"] = "This mapping shows which compiled `.js` files are "
+        "needed for a given deferred library import.";
+    mapping.addAll(compiler.deferredLoadTask.computeDeferredMap());
+    compiler.outputProvider(compiler.deferredMapUri.path, 'deferred_map')
+        ..add(const JsonEncoder.withIndent("  ").convert(mapping))
+        ..close();
+  }
+
   void invalidateCaches() {
     if (!compiler.hasIncrementalSupport) return;
     if (cachedElements.isEmpty) return;
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/interceptor_emitter.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/interceptor_emitter.dart
index a33b9c6..189d392 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/interceptor_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/interceptor_emitter.dart
@@ -13,7 +13,7 @@
     }
   }
 
-  void emitGetInterceptorMethod(CodeBuffer buffer,
+  void emitGetInterceptorMethod(CodeOutput output,
                                 String key,
                                 Set<ClassElement> classes) {
     InterceptorStubGenerator stubGenerator =
@@ -21,27 +21,27 @@
     jsAst.Expression function =
         stubGenerator.generateGetInterceptorMethod(classes);
 
-    buffer.write(jsAst.prettyPrint(
+    output.addBuffer(jsAst.prettyPrint(
         js('${namer.globalObjectFor(backend.interceptorsLibrary)}.# = #',
            [key, function]),
         compiler));
-    buffer.write(N);
+    output.add(N);
   }
 
   /**
    * Emit all versions of the [:getInterceptor:] method.
    */
-  void emitGetInterceptorMethods(CodeBuffer buffer) {
-    emitter.addComment('getInterceptor methods', buffer);
+  void emitGetInterceptorMethods(CodeOutput output) {
+    emitter.addComment('getInterceptor methods', output);
     Map<String, Set<ClassElement>> specializedGetInterceptors =
         backend.specializedGetInterceptors;
     for (String name in specializedGetInterceptors.keys.toList()..sort()) {
       Set<ClassElement> classes = specializedGetInterceptors[name];
-      emitGetInterceptorMethod(buffer, name, classes);
+      emitGetInterceptorMethod(output, name, classes);
     }
   }
 
-  void emitOneShotInterceptors(CodeBuffer buffer) {
+  void emitOneShotInterceptors(CodeOutput output) {
     List<String> names = backend.oneShotInterceptors.keys.toList();
     names.sort();
 
@@ -54,39 +54,33 @@
       jsAst.Expression assignment =
           js('${globalObject}.# = #', [name, function]);
 
-      buffer.write(jsAst.prettyPrint(assignment, compiler));
-      buffer.write(N);
+      output.addBuffer(jsAst.prettyPrint(assignment, compiler));
+      output.add(N);
     }
   }
 
   /**
    * If [JSInvocationMirror._invokeOn] has been compiled, emit all the
    * possible selector names that are intercepted into the
-   * [interceptedNames] top-level variable. The implementation of
+   * [interceptedNames] embedded global. The implementation of
    * [_invokeOn] will use it to determine whether it should call the
    * method with an extra parameter.
    */
-  void emitInterceptedNames(CodeBuffer buffer) {
-    // TODO(ahe): We should not generate the list of intercepted names at
-    // compile time, it can be generated automatically at runtime given
-    // subclasses of Interceptor (which can easily be identified).
-    if (!compiler.enabledInvokeOn) return;
-
-    // TODO(ahe): We should roll this into
-    // [emitStaticNonFinalFieldInitializations].
-    String name = backend.namer.getNameOfGlobalField(backend.interceptedNames);
+  jsAst.ObjectInitializer generateInterceptedNamesSet() {
+    // We could also generate the list of intercepted names at
+    // runtime, by running through the subclasses of Interceptor
+    // (which can easily be identified).
+    if (!compiler.enabledInvokeOn) return null;
 
     int index = 0;
-    var invocationNames = interceptorInvocationNames.toList()..sort();
-    List<jsAst.Expression> elements = invocationNames.map(js.string).toList();
-    jsAst.ArrayInitializer array =
-        new jsAst.ArrayInitializer(elements);
-
-    jsAst.Expression assignment =
-        js('${emitter.isolateProperties}.# = #', [name, array]);
-
-    buffer.write(jsAst.prettyPrint(assignment, compiler));
-    buffer.write(N);
+    List<String> invocationNames = interceptorInvocationNames.toList()..sort();
+    List<jsAst.Property> properties =
+        new List<jsAst.Property>(invocationNames.length);
+    for (int i = 0; i < invocationNames.length; i++) {
+      String name = invocationNames[i];
+      properties[i] = new jsAst.Property(js.string(name), js.number(1));
+    }
+    return new jsAst.ObjectInitializer(properties, isOneLiner: true);
   }
 
   /**
@@ -94,7 +88,7 @@
    * [findInterceptorForType].  See declaration of [mapTypeToInterceptor] in
    * `interceptors.dart`.
    */
-  void emitMapTypeToInterceptor(CodeBuffer buffer) {
+  void emitMapTypeToInterceptor(CodeOutput output) {
     // TODO(sra): Perhaps inject a constant instead?
     CustomElementsAnalysis analysis = backend.customElementsAnalysis;
     if (!analysis.needsTable) return;
@@ -144,12 +138,11 @@
     }
 
     jsAst.ArrayInitializer array = new jsAst.ArrayInitializer(elements);
-    String name =
-        backend.namer.getNameOfGlobalField(backend.mapTypeToInterceptor);
-    jsAst.Expression assignment =
-        js('${emitter.isolateProperties}.# = #', [name, array]);
+    jsAst.Expression mapTypeToInterceptor = emitter
+        .generateEmbeddedGlobalAccess(embeddedNames.MAP_TYPE_TO_INTERCEPTOR);
+    jsAst.Expression assignment = js('# = #', [mapTypeToInterceptor, array]);
 
-    buffer.write(jsAst.prettyPrint(assignment, compiler));
-    buffer.write(N);
+    output.addBuffer(jsAst.prettyPrint(assignment, compiler));
+    output.add(N);
   }
 }
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/metadata_emitter.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/metadata_emitter.dart
index 4814889..4366c6d 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/metadata_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/metadata_emitter.dart
@@ -103,21 +103,21 @@
     });
   }
 
-  void emitMetadata(CodeBuffer buffer) {
+  void emitMetadata(CodeOutput output) {
     String metadataAccess = emitter.generateEmbeddedGlobalAccessString(
           embeddedNames.METADATA);
-    buffer.write('$metadataAccess$_=$_[');
+    output.add('$metadataAccess$_=$_[');
     for (String metadata in globalMetadata) {
       if (metadata is String) {
         if (metadata != 'null') {
-          buffer.write(metadata);
+          output.add(metadata);
         }
       } else {
         throw 'Unexpected value in metadata: ${Error.safeToString(metadata)}';
       }
-      buffer.write(',$n');
+      output.add(',$n');
     }
-    buffer.write('];$n');
+    output.add('];$n');
   }
 
   List<int> computeMetadata(FunctionElement element) {
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 e324d5e..993db08 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
@@ -68,8 +68,6 @@
         var flag = descriptor[property];
         if (flag > 0)
           descriptor[previousProperty].$reflectableField = flag;
-      } else if (firstChar === "@" && property !== "@") {
-        newDesc[property.substring(1)][$metadataField] = descriptor[property];
       } else if (firstChar === "*") {
         newDesc[previousProperty].$defaultValuesField = descriptor[property];
         var optionalMethods = newDesc.$methodsWithOptionalArgumentsField;
@@ -150,9 +148,6 @@
             descriptor[previousProperty].$reflectableField = flag;
           if (element && element.length)
             #typeInformation[previousProperty] = element;
-        } else if (firstChar === "@") {
-          property = property.substring(1);
-          ${namer.currentIsolate}[property][$metadataField] = element;
         } else if (firstChar === "*") {
           globalObject[previousProperty].$defaultValuesField = element;
           var optionalMethods = descriptor.$methodsWithOptionalArgumentsField;
@@ -165,7 +160,7 @@
           functions.push(property);
           #globalFunctions[property] = element;
         } else if (element.constructor === Array) {
-          if (#needsArrayInitializerSupport) {
+          if (#needsStructuredMemberInfo) {
             addStubs(globalObject, element, property,
                      true, descriptor, functions);
           }
@@ -181,7 +176,7 @@
 ''', {'typeInformation': typeInformationAccess,
       'globalFunctions': globalFunctionsAccess,
       'hasClasses': oldEmitter.needsClassSupport,
-      'needsArrayInitializerSupport': oldEmitter.needsArrayInitializerSupport});
+      'needsStructuredMemberInfo': oldEmitter.needsStructuredMemberInfo});
 
 
   /**
@@ -241,7 +236,10 @@
       if (getterStubName) functions.push(getterStubName);
       f.\$stubName = getterStubName;
       f.\$callName = null;
-      if (isIntercepted) #interceptedNames[getterStubName] = true;
+      // Update the interceptedNames map (which only exists if `invokeOn` was
+      // enabled).
+      if (#enabledInvokeOn)
+        if (isIntercepted) #interceptedNames[getterStubName] = 1;
     }
 
     if (#usesMangledNames) {
@@ -271,7 +269,8 @@
       }
     }
   }
-''', {'globalFunctions' : globalFunctionsAccess,
+''', {'globalFunctions': globalFunctionsAccess,
+      'enabledInvokeOn': compiler.enabledInvokeOn,
       'interceptedNames': interceptedNamesAccess,
       'usesMangledNames':
           compiler.mirrorsLibrary != null || compiler.enabledFunctionApply,
@@ -280,6 +279,9 @@
 
   List<jsAst.Statement> tearOffCode = buildTearOffCode(backend);
 
+  jsAst.ObjectInitializer interceptedNamesSet =
+      oldEmitter.interceptorEmitter.generateInterceptedNamesSet();
+
   jsAst.Statement init = js.statement('''{
   var functionCounter = 0;
   if (!#libraries) #libraries = [];
@@ -288,7 +290,8 @@
   if (!#statics) #statics = map();
   if (!#typeInformation) #typeInformation = map(); 
   if (!#globalFunctions) #globalFunctions = map();
-  if (!#interceptedNames) #interceptedNames = map();
+  if (#enabledInvokeOn)
+    if (!#interceptedNames) #interceptedNames = #interceptedNamesSet;
   var libraries = #libraries;
   var mangledNames = #mangledNames;
   var mangledGlobalNames = #mangledGlobalNames;
@@ -340,7 +343,9 @@
        'statics': staticsAccess,
        'typeInformation': typeInformationAccess,
        'globalFunctions': globalFunctionsAccess,
+       'enabledInvokeOn': compiler.enabledInvokeOn,
        'interceptedNames': interceptedNamesAccess,
+       'interceptedNamesSet': interceptedNamesSet,
        'notInCspMode': !compiler.useContentSecurityPolicy,
        'needsClassSupport': oldEmitter.needsClassSupport});
 
@@ -431,7 +436,7 @@
     #processClassData;
   }
   #processStatics;
-  if (#needsArrayInitializerSupport) {
+  if (#needsStructuredMemberInfo) {
     #addStubs;
     #tearOffCode;
   }
@@ -448,7 +453,7 @@
       'init': init,
       'finishClasses': finishClasses,
       'needsClassSupport': oldEmitter.needsClassSupport,
-      'needsArrayInitializerSupport': oldEmitter.needsArrayInitializerSupport});
+      'needsStructuredMemberInfo': oldEmitter.needsStructuredMemberInfo});
 }
 
 
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder.dart
index f26076f..79885e03 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder.dart
@@ -128,20 +128,11 @@
     return result;
   }
 
-  /// Returns a name composed of the main output file name and [name].
-  String _outputFileName(String name) {
-    assert(name != "");
-    String outPath = _compiler.outputUri != null
-        ? _compiler.outputUri.path
-        : "out";
-    String outName = outPath.substring(outPath.lastIndexOf('/') + 1);
-    return "${outName}_$name";
-  }
-
   DeferredOutput _buildDeferredOutput(MainOutput mainOutput,
                                       Fragment fragment) {
     DeferredOutput result = new DeferredOutput(
-        _outputFileName(fragment.name), fragment.name,
+        backend.deferredPartFileName(fragment.name, addExtension: false),
+                                     fragment.name,
         mainOutput,
         _buildLibraries(fragment),
         _buildStaticNonFinalFields(fragment),
@@ -444,6 +435,7 @@
                           List<ConstantValue> constantValues) {
     if (constantValues == null) return;
     for (ConstantValue constantValue in constantValues) {
+      _registry.registerConstant(outputUnit, constantValue);
       assert(!_constants.containsKey(constantValue));
       String name = namer.constantName(constantValue);
       String constantObject = namer.globalObjectForConstant(constantValue);
diff --git a/pkg/compiler/lib/src/js_emitter/registry.dart b/pkg/compiler/lib/src/js_emitter/registry.dart
index 0c036b3..e0115b1 100644
--- a/pkg/compiler/lib/src/js_emitter/registry.dart
+++ b/pkg/compiler/lib/src/js_emitter/registry.dart
@@ -54,6 +54,10 @@
   final Map<OutputUnit, Fragment> _deferredFragmentsMap =
       <OutputUnit, Fragment>{};
 
+  /// Cache for the last seen output unit.
+  OutputUnit _lastOutputUnit;
+  Fragment _lastFragment;
+
   DeferredLoadTask get _deferredLoadTask => _compiler.deferredLoadTask;
   Iterable<Holder> get holders => _holdersMap.values;
   Iterable<Fragment> get deferredFragments => _deferredFragmentsMap.values;
@@ -68,17 +72,23 @@
   OutputUnit get _mainOutputUnit => _deferredLoadTask.mainOutputUnit;
 
   Fragment _mapUnitToFragment(OutputUnit targetUnit) {
+    if (targetUnit == _lastOutputUnit) return _lastFragment;
+
     if (mainFragment == null) {
       mainFragment = new Fragment.main(_deferredLoadTask.mainOutputUnit);
     }
-    if (!_isProgramSplit) {
-      assert(targetUnit == _deferredLoadTask.mainOutputUnit);
-      return mainFragment;
+
+    Fragment result;
+    if (targetUnit == _mainOutputUnit) {
+      result = mainFragment;
+    } else {
+      String name = targetUnit.name;
+      result = _deferredFragmentsMap.putIfAbsent(
+          targetUnit, () => new Fragment.deferred(targetUnit, name));
     }
-    if (targetUnit == _mainOutputUnit) return mainFragment;
-    String name = targetUnit.name;
-    return _deferredFragmentsMap.putIfAbsent(
-        targetUnit, () => new Fragment.deferred(targetUnit, name));
+    _lastOutputUnit = targetUnit;
+    _lastFragment = result;
+    return result;
   }
 
   /// Adds all elements to their respective libraries in the correct fragment.
@@ -89,6 +99,12 @@
     }
   }
 
+  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);
+  }
+
   Holder registerHolder(String name) {
     return _holdersMap.putIfAbsent(
         name,
diff --git a/pkg/compiler/lib/src/js_emitter/type_test_generator.dart b/pkg/compiler/lib/src/js_emitter/type_test_generator.dart
index 2c9ce0d..f4b184f 100644
--- a/pkg/compiler/lib/src/js_emitter/type_test_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/type_test_generator.dart
@@ -74,7 +74,7 @@
           compiler.closureToClassMapper.closureMappingCache[node];
       if (closureData != null) {
         ClosureFieldElement thisLocal =
-            closureData.getFreeVariableElement(closureData.thisLocal);
+            closureData.freeVariableMap[closureData.thisLocal];
         if (thisLocal != null) {
           String thisName = namer.instanceFieldPropertyName(thisLocal);
           thisAccess = js('this.#', thisName);
diff --git a/pkg/compiler/lib/src/resolution/class_members.dart b/pkg/compiler/lib/src/resolution/class_members.dart
index 5e753f8..aaa40aa 100644
--- a/pkg/compiler/lib/src/resolution/class_members.dart
+++ b/pkg/compiler/lib/src/resolution/class_members.dart
@@ -348,8 +348,15 @@
       }
     } else {
       assert(declared.name == superMember.name);
+
       if (declared.isStatic) {
         for (Member inherited in superMember.declarations) {
+          if (cls == inherited.declarer.element) {
+            // An error should already have been reported.
+            assert(invariant(declared.element, compiler.compilationFailed));
+            continue;
+          }
+
           reportMessage(
               inherited.element, MessageKind.NO_STATIC_OVERRIDE, () {
             reportErrorWithContext(
@@ -361,6 +368,14 @@
 
       DartType declaredType = declared.functionType;
       for (Member inherited in superMember.declarations) {
+        if (inherited.element == declared.element) {
+          // TODO(ahe): For some reason, "call" elements are repeated in
+          // superMember.declarations. Investigate why.
+        } else if (cls == inherited.declarer.element) {
+          // An error should already have been reported.
+          assert(invariant(declared.element, compiler.compilationFailed));
+          continue;
+        }
 
         void reportError(MessageKind errorKind, MessageKind infoKind) {
           reportMessage(
diff --git a/pkg/compiler/lib/src/resolution/members.dart b/pkg/compiler/lib/src/resolution/members.dart
index 2a39487..74ec34e 100644
--- a/pkg/compiler/lib/src/resolution/members.dart
+++ b/pkg/compiler/lib/src/resolution/members.dart
@@ -743,7 +743,7 @@
       Element nextTarget = target.immediateRedirectionTarget;
       if (seen.contains(nextTarget)) {
         error(node, MessageKind.CYCLIC_REDIRECTING_FACTORY);
-        break;
+        return;
       }
       seen.add(target);
       target = nextTarget;
@@ -1119,6 +1119,7 @@
       compiler.internalError(member,
           "No abstract field for accessor");
     } else if (!identical(lookupElement.kind, ElementKind.ABSTRACT_FIELD)) {
+      if (lookupElement.isErroneous || lookupElement.isAmbiguous) return;
       compiler.internalError(member,
           "Inaccessible abstract field for accessor");
     }
@@ -1332,8 +1333,7 @@
   }
 
   error(Spannable node, MessageKind kind, [arguments = const {}]) {
-    // TODO(ahe): Make non-fatal.
-    compiler.reportFatalError(node, kind, arguments);
+    compiler.reportError(node, kind, arguments);
   }
 
   Link<MetadataAnnotation> resolveMetadata(Element element,
@@ -1411,8 +1411,12 @@
       target = constructor.enclosingClass.lookupLocalMember(name);
       if (target == null) {
         error(selector, MessageKind.CANNOT_RESOLVE, {'name': name});
+        target = new ErroneousFieldElementX(
+            selector.asIdentifier(), constructor.enclosingClass);
       } else if (target.kind != ElementKind.FIELD) {
         error(selector, MessageKind.NOT_A_FIELD, {'fieldName': name});
+        target = new ErroneousFieldElementX(
+            selector.asIdentifier(), constructor.enclosingClass);
       } else if (!target.isInstanceMember) {
         error(selector, MessageKind.INIT_STATIC_FIELD, {'fieldName': name});
       }
@@ -1639,7 +1643,7 @@
   R visit(Node node) => (node == null) ? null : node.accept(this);
 
   void error(Spannable node, MessageKind kind, [Map arguments = const {}]) {
-    compiler.reportFatalError(node, kind, arguments);
+    compiler.reportError(node, kind, arguments);
   }
 
   void warning(Spannable node, MessageKind kind, [Map arguments = const {}]) {
@@ -2230,6 +2234,9 @@
                                                  MessageKind kind,
                                                  [Map arguments = const {}]) {
     compiler.reportWarning(node, kind, arguments);
+    // TODO(ahe): Use [allowedCategory] to synthesize a more precise subclass
+    // of [ErroneousElementX]. For example, [ErroneousFieldElementX],
+    // [ErroneousConstructorElementX], etc.
     return new ErroneousElementX(kind, arguments, name, enclosingElement);
   }
 
@@ -2240,7 +2247,9 @@
       }
       return null;
     } else if (node.isSuper()) {
-      if (!inInstanceContext) error(node, MessageKind.NO_SUPER_IN_STATIC);
+      if (!inInstanceContext) {
+        error(node, MessageKind.NO_SUPER_IN_STATIC);
+      }
       if ((ElementCategory.SUPER & allowedCategory) == 0) {
         error(node, MessageKind.INVALID_USE_OF_SUPER);
       }
@@ -2267,9 +2276,11 @@
         // Use the erroneous element.
       } else {
         if ((element.kind.category & allowedCategory) == 0) {
-          // TODO(ahe): Improve error message. Need UX input.
-          error(node, MessageKind.GENERIC,
-                {'text': "is not an expression $element"});
+          element = warnAndCreateErroneousElement(
+              node, name,
+              MessageKind.GENERIC,
+              // TODO(ahe): Improve error message. Need UX input.
+              {'text': "is not an expression $element"});
         }
       }
       if (!Elements.isUnresolved(element) && element.isClass) {
@@ -2526,12 +2537,14 @@
       // TODO(ahe): Why is this using GENERIC?
       error(node.selector, MessageKind.GENERIC,
             {'text': "expected an identifier"});
+      return null;
     } else if (node.isSuperCall) {
       if (node.isOperator) {
         if (isUserDefinableOperator(name)) {
           name = selector.name;
         } else {
           error(node.selector, MessageKind.ILLEGAL_SUPER_SEND, {'name': name});
+          return null;
         }
       }
       if (!inInstanceContext) {
@@ -2543,6 +2556,7 @@
         // for a real error message.
         error(node.receiver, MessageKind.GENERIC,
               {'text': "Object has no superclass"});
+        return null;
       }
       // TODO(johnniwinther): Ensure correct behavior if currentClass is a
       // patch.
@@ -3342,6 +3356,11 @@
         compiler.resolver.constantCompiler.compileNode(
             node, registry.mapping);
 
+    if (constant == null) {
+      assert(invariant(node, compiler.compilationFailed));
+      return;
+    }
+
     ConstantValue value = constant.value;
     if (value.isMap) {
       checkConstMapKeysDontOverrideEquals(node, value);
@@ -4907,11 +4926,20 @@
     } else if (element.isTypedef) {
       error(node, MessageKind.CANNOT_INSTANTIATE_TYPEDEF,
             {'typedefName': name});
+      element = new ErroneousConstructorElementX(
+          MessageKind.CANNOT_INSTANTIATE_TYPEDEF,
+          {'typedefName': name}, name, resolver.enclosingElement);
     } 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);
     } 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);
     }
     return element;
   }
diff --git a/pkg/compiler/lib/src/resolution/resolution.dart b/pkg/compiler/lib/src/resolution/resolution.dart
index 8c1f867..3489fbd 100644
--- a/pkg/compiler/lib/src/resolution/resolution.dart
+++ b/pkg/compiler/lib/src/resolution/resolution.dart
@@ -14,30 +14,35 @@
 import '../tree/tree.dart';
 import '../scanner/scannerlib.dart';
 import '../elements/elements.dart';
-import '../elements/modelx.dart'
-    show BaseClassElementX,
-         BaseFunctionElementX,
-         ConstructorElementX,
-         ErroneousElementX,
-         FieldElementX,
-         FormalElementX,
-         FunctionElementX,
-         FunctionSignatureX,
-         InitializingFormalElementX,
-         LabelDefinitionX,
-         LocalFunctionElementX,
-         LocalParameterElementX,
-         LocalVariableElementX,
-         MetadataAnnotationX,
-         MixinApplicationElementX,
-         ParameterElementX,
-         ParameterMetadataAnnotation,
-         SynthesizedConstructorElementX,
-         JumpTargetX,
-         TypedefElementX,
-         TypeVariableElementX,
-         VariableElementX,
-         VariableList;
+
+import '../elements/modelx.dart' show
+    BaseClassElementX,
+    BaseFunctionElementX,
+    ConstructorElementX,
+    ErroneousConstructorElementX,
+    ErroneousElementX,
+    ErroneousFieldElementX,
+    ErroneousInitializingFormalElementX,
+    FieldElementX,
+    FormalElementX,
+    FunctionElementX,
+    FunctionSignatureX,
+    InitializingFormalElementX,
+    JumpTargetX,
+    LabelDefinitionX,
+    LocalFunctionElementX,
+    LocalParameterElementX,
+    LocalVariableElementX,
+    MetadataAnnotationX,
+    MixinApplicationElementX,
+    ParameterElementX,
+    ParameterMetadataAnnotation,
+    SynthesizedConstructorElementX,
+    TypeVariableElementX,
+    TypedefElementX,
+    VariableElementX,
+    VariableList;
+
 import '../ordered_typeset.dart' show OrderedTypeSet, OrderedTypeSetBuilder;
 import '../util/util.dart';
 
diff --git a/pkg/compiler/lib/src/resolution/signatures.dart b/pkg/compiler/lib/src/resolution/signatures.dart
index 8b31d43..8260d8b 100644
--- a/pkg/compiler/lib/src/resolution/signatures.dart
+++ b/pkg/compiler/lib/src/resolution/signatures.dart
@@ -172,13 +172,17 @@
   InitializingFormalElementX createFieldParameter(Send node,
                                                   Expression initializer) {
     InitializingFormalElementX element;
-    if (node.receiver.asIdentifier() == null ||
-        !node.receiver.asIdentifier().isThis()) {
+    Identifier receiver = node.receiver.asIdentifier();
+    if (receiver == null || !receiver.isThis()) {
       error(node, MessageKind.INVALID_PARAMETER);
-    } else if (!identical(enclosingElement.kind,
-                          ElementKind.GENERATIVE_CONSTRUCTOR)) {
-      error(node, MessageKind.INITIALIZING_FORMAL_NOT_ALLOWED);
+      return new ErroneousInitializingFormalElementX(
+          getParameterName(node), enclosingElement);
     } else {
+      if (!enclosingElement.isGenerativeConstructor) {
+        error(node, MessageKind.INITIALIZING_FORMAL_NOT_ALLOWED);
+        return new ErroneousInitializingFormalElementX(
+            getParameterName(node), enclosingElement);
+      }
       Identifier name = getParameterName(node);
       validateName(name);
       Element fieldElement =
@@ -186,8 +190,12 @@
       if (fieldElement == null ||
           !identical(fieldElement.kind, ElementKind.FIELD)) {
         error(node, MessageKind.NOT_A_FIELD, {'fieldName': name});
+        fieldElement = new ErroneousFieldElementX(
+            name, enclosingElement.enclosingClass);
       } else if (!fieldElement.isInstanceMember) {
         error(node, MessageKind.NOT_INSTANCE_FIELD, {'fieldName': name});
+        fieldElement = new ErroneousFieldElementX(
+            name, enclosingElement.enclosingClass);
       }
       element = new InitializingFormalElementX(enclosingElement,
           currentDefinitions, name, initializer, fieldElement);
diff --git a/pkg/compiler/lib/src/scanner/listener.dart b/pkg/compiler/lib/src/scanner/listener.dart
index 887232e..338b5dc 100644
--- a/pkg/compiler/lib/src/scanner/listener.dart
+++ b/pkg/compiler/lib/src/scanner/listener.dart
@@ -1463,10 +1463,15 @@
     memberErrors = memberErrors.tail;
   }
 
+  /// 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.reportFatalError(
+    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 reportError(Spannable spannable,
@@ -1490,6 +1495,8 @@
       {bool this.throwOnFatalError: false})
     : 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) {
diff --git a/pkg/compiler/lib/src/scanner/scannerlib.dart b/pkg/compiler/lib/src/scanner/scannerlib.dart
index 8177496..7543bb5 100644
--- a/pkg/compiler/lib/src/scanner/scannerlib.dart
+++ b/pkg/compiler/lib/src/scanner/scannerlib.dart
@@ -32,7 +32,7 @@
 import '../tree/tree.dart';
 import '../util/characters.dart';
 import '../util/util.dart';
-import '../source_file.dart' show SourceFile, Utf8BytesSourceFile;
+import '../io/source_file.dart' show SourceFile, Utf8BytesSourceFile;
 import 'dart:convert' show UTF8, UNICODE_BOM_CHARACTER_RUNE;
 import 'dart:typed_data' show Uint8List;
 
diff --git a/pkg/compiler/lib/src/source_file_provider.dart b/pkg/compiler/lib/src/source_file_provider.dart
index a511fff..978156c 100644
--- a/pkg/compiler/lib/src/source_file_provider.dart
+++ b/pkg/compiler/lib/src/source_file_provider.dart
@@ -12,7 +12,7 @@
 import '../compiler.dart' as api show Diagnostic, DiagnosticHandler;
 import 'dart2js.dart' show AbortLeg;
 import 'colors.dart' as colors;
-import 'source_file.dart';
+import 'io/source_file.dart';
 import 'filenames.dart';
 import 'util/uri_extras.dart';
 import 'dart:typed_data';
@@ -249,7 +249,11 @@
     Uri uri;
     String sourceMapFileName;
     bool isPrimaryOutput = false;
-    if (name == '') {
+    // TODO (johnniwinther, sigurdm): Make a better interface for
+    // output-providers.
+    if (extension == "deferred_map") {
+      uri = out.resolve(name);
+    } else if (name == '') {
       if (extension == 'js' || extension == 'dart') {
         isPrimaryOutput = true;
         uri = out;
@@ -261,7 +265,7 @@
                " \"Content-Security-Policy: script-src 'self'\"");
       } else if (extension == 'js.map' || extension == 'dart.map') {
         uri = sourceMapOut;
-      } else if (extension == 'info.html' || extension == "info.json") {
+      } else if (extension == "info.json") {
         String outName = out.path.substring(out.path.lastIndexOf('/') + 1);
         uri = out.resolve('$outName.$extension');
       } else {
diff --git a/pkg/compiler/lib/src/ssa/ssa.dart b/pkg/compiler/lib/src/ssa/ssa.dart
index 5defd6c..e702138 100644
--- a/pkg/compiler/lib/src/ssa/ssa.dart
+++ b/pkg/compiler/lib/src/ssa/ssa.dart
@@ -24,7 +24,7 @@
 import '../native/native.dart' as native;
 import '../scanner/scannerlib.dart'
     show PartialFunctionElement, Token, PLUS_TOKEN;
-import '../source_file.dart';
+import '../io/source_file.dart';
 import '../io/source_map_builder.dart';
 import '../tree/tree.dart' as ast;
 import '../types/types.dart';
diff --git a/pkg/compiler/lib/src/string_validator.dart b/pkg/compiler/lib/src/string_validator.dart
index d967e44..5a7c331 100644
--- a/pkg/compiler/lib/src/string_validator.dart
+++ b/pkg/compiler/lib/src/string_validator.dart
@@ -102,7 +102,7 @@
   }
 
   void stringParseError(String message, Token token, int offset) {
-    listener.reportFatalError(
+    listener.reportError(
         token, MessageKind.GENERIC, {'text': "$message @ $offset"});
   }
 
diff --git a/pkg/compiler/lib/src/tree_ir/optimization/copy_propagator.dart b/pkg/compiler/lib/src/tree_ir/optimization/copy_propagator.dart
index 0e3c61aa..a2828b6 100644
--- a/pkg/compiler/lib/src/tree_ir/optimization/copy_propagator.dart
+++ b/pkg/compiler/lib/src/tree_ir/optimization/copy_propagator.dart
@@ -224,6 +224,13 @@
     return node;
   }
 
+  Statement visitSetField(SetField node) {
+    node.next = visitStatement(node.next);
+    visitExpression(node.value);
+    visitExpression(node.object);
+    return node;
+  }
+
   void visitFunctionExpression(FunctionExpression node) {
     new CopyPropagator().rewrite(node.definition);
   }
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 a78f8b6..c02a739 100644
--- a/pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart
+++ b/pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart
@@ -315,6 +315,27 @@
     return node;
   }
 
+  Statement visitSetField(SetField node) {
+    node.object = visitExpression(node.object);
+    node.value = visitExpression(node.value);
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+  Expression visitGetField(GetField node) {
+    node.object = visitExpression(node.object);
+    return node;
+  }
+
+  Expression visitCreateBox(CreateBox node) {
+    return node;
+  }
+
+  Expression visitCreateClosureClass(CreateClosureClass node) {
+    _rewriteList(node.arguments);
+    return node;
+  }
+
   /// True if the given expression is known to evaluate to a boolean.
   /// This will not recursively traverse [Conditional] expressions, but if
   /// applied to the result of [visitExpression] conditionals will have been
diff --git a/pkg/compiler/lib/src/tree_ir/optimization/loop_rewriter.dart b/pkg/compiler/lib/src/tree_ir/optimization/loop_rewriter.dart
index 182e806..c461157 100644
--- a/pkg/compiler/lib/src/tree_ir/optimization/loop_rewriter.dart
+++ b/pkg/compiler/lib/src/tree_ir/optimization/loop_rewriter.dart
@@ -127,4 +127,12 @@
   void visitFunctionExpression(FunctionExpression node) {
     new LoopRewriter().rewrite(node.definition);
   }
+
+  Statement visitSetField(SetField node) {
+    visitExpression(node.object);
+    visitExpression(node.value);
+    node.next = visitStatement(node.next);
+    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 a483add..91f0b75 100644
--- a/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart
+++ b/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart
@@ -407,6 +407,29 @@
     return node;
   }
 
+  Statement visitSetField(SetField node) {
+    node.next = visitStatement(node.next);
+    node.object = visitExpression(node.object);
+    node.value = visitExpression(node.value);
+    return node;
+  }
+
+  Expression visitGetField(GetField node) {
+    node.object = visitExpression(node.object);
+    return node;
+  }
+
+  Expression visitCreateBox(CreateBox node) {
+    return node;
+  }
+
+  Expression visitCreateClosureClass(CreateClosureClass node) {
+    for (int i = node.arguments.length - 1; i >= 0; --i) {
+      node.arguments[i] = visitExpression(node.arguments[i]);
+    }
+    return node;
+  }
+
   /// If [s] and [t] are similar statements we extract their subexpressions
   /// and returns a new statement of the same type using expressions combined
   /// with the [combine] callback. For example:
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 d0f01f4..4cc853c 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
@@ -47,10 +47,9 @@
   final dart2js.InternalErrorFunction internalError;
 
   /// Maps variable/parameter elements to the Tree variables that represent it.
-  final Map<Element, List<Variable>> element2variables =
-      <Element,List<Variable>>{};
+  final Map<Local, List<Variable>> local2variables = <Local, List<Variable>>{};
 
-  /// Like [element2variables], except for closure variables.
+  /// Like [local2variables], except for closure variables.
   final Map<cps_ir.ClosureVariable, Variable> local2closure =
       <cps_ir.ClosureVariable, Variable>{};
 
@@ -87,7 +86,7 @@
     if (primitive.registerIndex == null) {
       return null; // variable is unused
     }
-    List<Variable> variables = element2variables.putIfAbsent(primitive.hint,
+    List<Variable> variables = local2variables.putIfAbsent(primitive.hint,
         () => <Variable>[]);
     while (variables.length <= primitive.registerIndex) {
       variables.add(new Variable(currentElement, primitive.hint));
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 947df50..4aaacef 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
@@ -12,6 +12,7 @@
 import '../universe/universe.dart';
 import '../universe/universe.dart' show Selector;
 import 'optimization/optimization.dart';
+import '../closure.dart' show ClosureClassElement;
 
 // The Tree language is the target of translation out of the CPS-based IR.
 //
@@ -650,6 +651,47 @@
   applyPass(Pass pass) => pass.rewriteConstructorDefinition(this);
 }
 
+abstract class JsSpecificNode implements Node {}
+
+class CreateBox extends Expression implements JsSpecificNode {
+  accept(ExpressionVisitor visitor) => visitor.visitCreateBox(this);
+  accept1(ExpressionVisitor1 visitor, arg) => visitor.visitCreateBox(this, arg);
+}
+
+class CreateClosureClass extends Expression implements JsSpecificNode {
+  ClosureClassElement classElement;
+  List<Expression> arguments;
+
+  CreateClosureClass(this.classElement, this.arguments);
+
+  accept(ExpressionVisitor visitor) => visitor.visitCreateClosureClass(this);
+  accept1(ExpressionVisitor1 visitor, arg) {
+    return visitor.visitCreateClosureClass(this, arg);
+  }
+}
+
+class GetField extends Expression implements JsSpecificNode {
+  Expression object;
+  Element field;
+
+  GetField(this.object, this.field);
+
+  accept(ExpressionVisitor visitor) => visitor.visitGetField(this);
+  accept1(ExpressionVisitor1 visitor, arg) => visitor.visitGetField(this, arg);
+}
+
+class SetField extends Statement implements JsSpecificNode {
+  Expression object;
+  Element field;
+  Expression value;
+  Statement next;
+
+  SetField(this.object, this.field, this.value, this.next);
+
+  accept(StatementVisitor visitor) => visitor.visitSetField(this);
+  accept1(StatementVisitor1 visitor, arg) => visitor.visitSetField(this, arg);
+}
+
 abstract class ExpressionVisitor<E> {
   E visitExpression(Expression e) => e.accept(this);
   E visitVariable(Variable node);
@@ -670,6 +712,9 @@
   E visitFunctionExpression(FunctionExpression node);
   E visitFieldInitializer(FieldInitializer node);
   E visitSuperInitializer(SuperInitializer node);
+  E visitGetField(GetField node);
+  E visitCreateBox(CreateBox node);
+  E visitCreateClosureClass(CreateClosureClass node);
 }
 
 abstract class ExpressionVisitor1<E, A> {
@@ -692,6 +737,9 @@
   E visitFunctionExpression(FunctionExpression node, A arg);
   E visitFieldInitializer(FieldInitializer node, A arg);
   E visitSuperInitializer(SuperInitializer node, A arg);
+  E visitGetField(GetField node, A arg);
+  E visitCreateBox(CreateBox node, A arg);
+  E visitCreateClosureClass(CreateClosureClass node, A arg);
 }
 
 abstract class StatementVisitor<S> {
@@ -706,6 +754,7 @@
   S visitWhileCondition(WhileCondition node);
   S visitFunctionDeclaration(FunctionDeclaration node);
   S visitExpressionStatement(ExpressionStatement node);
+  S visitSetField(SetField node);
 }
 
 abstract class StatementVisitor1<S, A> {
@@ -720,6 +769,7 @@
   S visitWhileCondition(WhileCondition node, A arg);
   S visitFunctionDeclaration(FunctionDeclaration node, A arg);
   S visitExpressionStatement(ExpressionStatement node, A arg);
+  S visitSetField(SetField node, A arg);
 }
 
 abstract class Visitor<S, E> implements ExpressionVisitor<E>,
@@ -854,4 +904,21 @@
   visitSuperInitializer(SuperInitializer node) {
     node.arguments.forEach(visitStatement);
   }
+
+  visitGetField(GetField node) {
+    visitExpression(node.object);
+  }
+
+  visitSetField(SetField node) {
+    visitExpression(node.object);
+    visitExpression(node.value);
+    visitStatement(node.next);
+  }
+
+  visitCreateBox(CreateBox node) {
+  }
+
+  visitCreateClosureClass(CreateClosureClass 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 be1fb18..9620b57 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart
@@ -151,6 +151,11 @@
     visitStatement(node.next);
   }
 
+  visitSetField(SetField node) {
+    _addStatement(node);
+    visitStatement(node.next);
+  }
+
 }
 
 class TreeTracer extends TracerUtil with StatementVisitor, PassMixin {
@@ -277,6 +282,16 @@
     printStatement(null, 'function ${node.definition.element.name}');
   }
 
+  visitSetField(SetField node) {
+    String object = expr(node.object);
+    String field = node.field.name;
+    String value = expr(node.value);
+    if (SubexpressionVisitor.usesInfixNotation(node.object)) {
+      object = '($object)';
+    }
+    printStatement(null, '$object.$field = $value');
+  }
+
   String expr(Expression e) {
     return e.accept(new SubexpressionVisitor(names));
   }
@@ -368,7 +383,7 @@
     return "typevar [${node.typeVariable.name}]";
   }
 
-  bool usesInfixNotation(Expression node) {
+  static bool usesInfixNotation(Expression node) {
     return node is Conditional || node is LogicalOperator;
   }
 
@@ -417,6 +432,25 @@
     throw "$node should not be visited by $this";
   }
 
+  String visitGetField(GetField node) {
+    String object = visitExpression(node.object);
+    String field = node.field.name;
+    if (usesInfixNotation(node.object)) {
+      object = '($object)';
+    }
+    return '$object.$field';
+  }
+
+  String visitCreateBox(CreateBox node) {
+    return 'CreateBox';
+  }
+
+  String visitCreateClosureClass(CreateClosureClass node) {
+    String className = node.classElement.name;
+    String arguments = node.arguments.map(visitExpression).join(', ');
+    return 'CreateClosure $className($arguments)';
+  }
+
 }
 
 /**
diff --git a/pkg/compiler/lib/src/typechecker.dart b/pkg/compiler/lib/src/typechecker.dart
index 2243375..61dbd7d 100644
--- a/pkg/compiler/lib/src/typechecker.dart
+++ b/pkg/compiler/lib/src/typechecker.dart
@@ -254,8 +254,8 @@
 
   final ClassElement currentClass;
 
-  InterfaceType thisType;
-  InterfaceType superType;
+  DartType thisType;
+  DartType superType;
 
   Link<DartType> cascadeTypes = const Link<DartType>();
 
@@ -339,6 +339,10 @@
     if (currentClass != null) {
       thisType = currentClass.thisType;
       superType = currentClass.supertype;
+    } else {
+      // If these are used, an error should have been reported by the resolver.
+      thisType = const DynamicType();
+      superType = const DynamicType();
     }
   }
 
diff --git a/pkg/compiler/lib/src/use_unused_api.dart b/pkg/compiler/lib/src/use_unused_api.dart
index a53d722..359aa9b 100644
--- a/pkg/compiler/lib/src/use_unused_api.dart
+++ b/pkg/compiler/lib/src/use_unused_api.dart
@@ -192,8 +192,6 @@
 }
 
 useCodeBuffer(io.CodeBuffer buffer) {
-  buffer.writeln();
-  new io.LineColumnCodeOutput(null);
 }
 
 usedByTests() {
diff --git a/pkg/compiler/lib/src/warnings.dart b/pkg/compiler/lib/src/warnings.dart
index e1bb353..908d9cf 100644
--- a/pkg/compiler/lib/src/warnings.dart
+++ b/pkg/compiler/lib/src/warnings.dart
@@ -182,7 +182,19 @@
       "Cannot resolve type '#{typeName}'.");
 
   static const MessageKind DUPLICATE_DEFINITION = const MessageKind(
-      "Duplicate definition of '#{name}'.");
+      "Duplicate definition of '#{name}'.",
+      howToFix: "Try to rename or remove this definition.",
+      examples: const ["""
+class C {
+  void f() {}
+  int get f => 1;
+}
+
+main() {
+  new C();
+}
+
+"""]);
 
   static const MessageKind EXISTING_DEFINITION = const MessageKind(
       "Existing definition of '#{name}'.");
@@ -1351,9 +1363,6 @@
       "The class '#{class}' overrides 'operator==', "
       "but not 'get hashCode'.");
 
-  static const MessageKind PACKAGE_ROOT_NOT_SET = const MessageKind(
-      "Cannot resolve '#{uri}'. Package root has not been set.");
-
   static const MessageKind INTERNAL_LIBRARY_FROM = const MessageKind(
       "Internal library '#{resolvedUri}' is not accessible from "
       "'#{importingUri}'.");
diff --git a/pkg/compiler/samples/darttags/darttags.dart b/pkg/compiler/samples/darttags/darttags.dart
index c44cdf0..3a29821 100644
--- a/pkg/compiler/samples/darttags/darttags.dart
+++ b/pkg/compiler/samples/darttags/darttags.dart
@@ -42,7 +42,7 @@
 import 'package:compiler/src/mirrors/mirrors_util.dart' show nameOf;
 
 import 'package:compiler/src/filenames.dart';
-import 'package:compiler/src/source_file.dart';
+import 'package:compiler/src/io/source_file.dart';
 import 'package:compiler/src/source_file_provider.dart';
 import 'package:compiler/src/util/uri_extras.dart';
 
diff --git a/pkg/compiler/samples/jsonify/jsonify.dart b/pkg/compiler/samples/jsonify/jsonify.dart
index bb0c413..f09ad7f 100644
--- a/pkg/compiler/samples/jsonify/jsonify.dart
+++ b/pkg/compiler/samples/jsonify/jsonify.dart
@@ -16,7 +16,7 @@
     show BackDoor;
 
 import '../../lib/src/filenames.dart';
-import '../../lib/src/source_file.dart';
+import '../../lib/src/io/source_file.dart';
 import '../../lib/src/source_file_provider.dart';
 import '../../lib/src/util/uri_extras.dart';
 
@@ -46,7 +46,12 @@
   Uri myLocation =
       handler.provider.cwd.resolveUri(Platform.script);
 
-  sdkRoot = myLocation.resolve(SDK_ROOT).resolve('../');
+  Uri packageRoot =
+      handler.provider.cwd.resolve(Platform.packageRoot);
+
+  Uri libraryRoot = myLocation.resolve(SDK_ROOT);
+
+  sdkRoot = libraryRoot.resolve('../');
 
   // Get the names of public dart2js libraries.
   Iterable<String> names = LIBRARIES.keys.where(isPublicDart2jsLibrary);
@@ -54,7 +59,7 @@
   // Turn the names into uris by prepending dart: to them.
   List<Uri> uris = names.map((String name) => Uri.parse('dart:$name')).toList();
 
-  analyze(uris, myLocation.resolve(SDK_ROOT), null, handler.provider, handler)
+  analyze(uris, libraryRoot, packageRoot, handler.provider, handler)
       .then(jsonify);
 }
 
diff --git a/pkg/dart2js_incremental/lib/caching_compiler.dart b/pkg/dart2js_incremental/lib/caching_compiler.dart
index efc79bd..0d0a145 100644
--- a/pkg/dart2js_incremental/lib/caching_compiler.dart
+++ b/pkg/dart2js_incremental/lib/caching_compiler.dart
@@ -72,7 +72,7 @@
         ..needsClassSupport = true
         ..needsMixinSupport = true
         ..needsLazyInitializer = true
-        ..needsArrayInitializerSupport = true;
+        ..needsStructuredMemberInfo = true;
 
     Uri core = Uri.parse("dart:core");
     return compiler.libraryLoader.loadLibrary(core).then((_) {
@@ -130,7 +130,6 @@
         ..globalMetadataMap.clear();
 
     backend.emitter.nativeEmitter
-        ..nativeBuffer.clear()
         ..nativeClasses.clear()
         ..nativeMethods.clear();
 
@@ -138,7 +137,6 @@
 
     backend.emitter.oldEmitter
         ..outputBuffers.clear()
-        ..deferredConstants.clear()
         ..isolateProperties = null
         ..classesCollector = null
         ..neededClasses.clear()
diff --git a/pkg/dart2js_incremental/lib/library_updater.dart b/pkg/dart2js_incremental/lib/library_updater.dart
index f63852f..a3017b1 100644
--- a/pkg/dart2js_incremental/lib/library_updater.dart
+++ b/pkg/dart2js_incremental/lib/library_updater.dart
@@ -38,7 +38,7 @@
     Scanner,
     Token;
 
-import 'package:compiler/src/source_file.dart' show
+import 'package:compiler/src/io/source_file.dart' show
     CachingUtf8BytesSourceFile,
     SourceFile,
     StringSourceFile;
diff --git a/pkg/docgen/lib/src/generator.dart b/pkg/docgen/lib/src/generator.dart
index 2f1722c..7df0260 100644
--- a/pkg/docgen/lib/src/generator.dart
+++ b/pkg/docgen/lib/src/generator.dart
@@ -274,9 +274,10 @@
       ..showWarnings = false).diagnosticHandler;
   Uri libraryUri = new Uri.file(appendSlash(libraryRoot));
   Uri packageUri = null;
-  if (packageRoot != null) {
-    packageUri = new Uri.file(appendSlash(packageRoot));
+  if (packageRoot == null) {
+    packageRoot = Platform.packageRoot;
   }
+  packageUri = new Uri.file(appendSlash(packageRoot));
   return dart2js.analyze(libraries, libraryUri, packageUri,
       provider.readStringFromUri, diagnosticHandler, ['--preserve-comments',
       '--categories=Client,Server'])..catchError((error) {
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 299dd12..440a191 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -92,6 +92,9 @@
 [ $compiler == dart2js && $runtime == drt ]
 async/test/stream_zip_test: RuntimeError, Pass # Issue 18548
 
+[ $compiler == dart2js && ($runtime == chrome || $runtime == ff) ]
+collection/test/unmodifiable_collection_test: Skip # Times out. Issue 22050
+
 [ $runtime == vm || $runtime == d8 || $runtime == jsshell ]
 third_party/angular_tests/browser_test: Skip # uses dart:html
 
@@ -182,7 +185,3 @@
 
 [ $use_repository_packages ]
 analyzer/test/*: PubGetError
-
-[ $runtime == vm ]
-analysis_server/test/search/element_references_test: RuntimeError # Issue 22014
-
diff --git a/runtime/bin/builtin_natives.cc b/runtime/bin/builtin_natives.cc
index b1ae667..efa61c4 100644
--- a/runtime/bin/builtin_natives.cc
+++ b/runtime/bin/builtin_natives.cc
@@ -50,6 +50,7 @@
   V(File_Stat, 1)                                                              \
   V(File_LastModified, 1)                                                      \
   V(File_Flush, 1)                                                             \
+  V(File_Lock, 4)                                                              \
   V(File_Create, 1)                                                            \
   V(File_CreateLink, 2)                                                        \
   V(File_LinkTarget, 1)                                                        \
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index b87669f..9b6557c 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -493,7 +493,8 @@
  public:
   DECLARE_COBJECT_CONSTRUCTORS(SendPort)
 
-  Dart_Port Value() const { return cobject_->value.as_send_port; }
+  Dart_Port Value() const { return cobject_->value.as_send_port.id; }
+  Dart_Port OriginId() const { return cobject_->value.as_send_port.origin_id; }
 
  private:
   DISALLOW_COPY_AND_ASSIGN(CObjectSendPort);
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc
index a98ff3d..c4c417b 100644
--- a/runtime/bin/file.cc
+++ b/runtime/bin/file.cc
@@ -391,6 +391,35 @@
 }
 
 
+void FUNCTION_NAME(File_Lock)(Dart_NativeArguments args) {
+  File* file = GetFilePointer(Dart_GetNativeArgument(args, 0));
+  ASSERT(file != NULL);
+  int64_t lock;
+  int64_t start;
+  int64_t end;
+  if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 1), &lock) &&
+      DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &start) &&
+      DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 3), &end)) {
+    if ((lock >= File::kLockMin) && (lock <= File::kLockMax) &&
+        (start >= 0) && (end == -1 || end > start)) {
+      if (file->Lock(static_cast<File::LockType>(lock), start, end)) {
+        Dart_SetReturnValue(args, Dart_True());
+      } else {
+        Dart_Handle err = DartUtils::NewDartOSError();
+        if (Dart_IsError(err)) Dart_PropagateError(err);
+        Dart_SetReturnValue(args, err);
+      }
+      return;
+    }
+  }
+
+  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);
+}
+
+
 void FUNCTION_NAME(File_Create)(Dart_NativeArguments args) {
   const char* str =
       DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
@@ -1196,5 +1225,30 @@
   return CObject::IllegalArgumentError();
 }
 
+
+CObject* File::LockRequest(const CObjectArray& request) {
+  if (request.Length() == 4 &&
+      request[0]->IsIntptr() &&
+      request[1]->IsInt32OrInt64() &&
+      request[2]->IsInt32OrInt64() &&
+      request[3]->IsInt32OrInt64()) {
+    File* file = CObjectToFilePointer(request[0]);
+    ASSERT(file != NULL);
+    if (!file->IsClosed()) {
+      int64_t lock = CObjectInt32OrInt64ToInt64(request[1]);
+      int64_t start = CObjectInt32OrInt64ToInt64(request[2]);
+      int64_t end = CObjectInt32OrInt64ToInt64(request[3]);
+      if (file->Lock(static_cast<File::LockType>(lock), start, end)) {
+        return CObject::True();
+      } else {
+        return CObject::NewOSError();
+      }
+    } else {
+      return CObject::FileClosedError();
+    }
+  }
+  return CObject::IllegalArgumentError();
+}
+
 }  // namespace bin
 }  // namespace dart
diff --git a/runtime/bin/file.h b/runtime/bin/file.h
index 990b7b2..7a8107f 100644
--- a/runtime/bin/file.h
+++ b/runtime/bin/file.h
@@ -69,6 +69,15 @@
     kStatSize = 6
   };
 
+  enum LockType {
+    // These match the constants in FileStat in file_impl.dart.
+    kLockMin = 0,
+    kLockUnlock = 0,
+    kLockShared = 1,
+    kLockExclusive = 2,
+    kLockMax = 2
+  };
+
   ~File();
 
   intptr_t GetFD();
@@ -105,6 +114,9 @@
   // Flush contents of file.
   bool Flush();
 
+  // Lock range of a file.
+  bool Lock(LockType lock, int64_t start, int64_t end);
+
   // Returns whether the file has been closed.
   bool IsClosed();
 
@@ -168,6 +180,7 @@
   static CObject* TypeRequest(const CObjectArray& request);
   static CObject* IdenticalRequest(const CObjectArray& request);
   static CObject* StatRequest(const CObjectArray& request);
+  static CObject* LockRequest(const CObjectArray& request);
 
  private:
   explicit File(FileHandle* handle) : handle_(handle) { }
diff --git a/runtime/bin/file_android.cc b/runtime/bin/file_android.cc
index 410fa0f..015fc0a 100644
--- a/runtime/bin/file_android.cc
+++ b/runtime/bin/file_android.cc
@@ -111,6 +111,32 @@
 }
 
 
+bool File::Lock(File::LockType lock, int64_t start, int64_t end) {
+  ASSERT(handle_->fd() >= 0);
+  ASSERT(end == -1 || end > start);
+  struct flock fl;
+  switch (lock) {
+    case File::kLockUnlock:
+      fl.l_type = F_UNLCK;
+      break;
+    case File::kLockShared:
+      fl.l_type = F_RDLCK;
+      break;
+    case File::kLockExclusive:
+      fl.l_type = F_WRLCK;
+      break;
+    default:
+      return false;
+  }
+  fl.l_whence = SEEK_SET;
+  fl.l_start = start;
+  fl.l_len = end == -1 ? 0 : end - start;
+  // fcntl does not block, but fails if the lock cannot be acquired.
+  int rc = fcntl(handle_->fd(), F_SETLK, &fl);
+  return rc != -1;
+}
+
+
 int64_t File::Length() {
   ASSERT(handle_->fd() >= 0);
   struct stat st;
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index c770caf..9fc4bd1 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -109,6 +109,32 @@
 }
 
 
+bool File::Lock(File::LockType lock, int64_t start, int64_t end) {
+  ASSERT(handle_->fd() >= 0);
+  ASSERT(end == -1 || end > start);
+  struct flock fl;
+  switch (lock) {
+    case File::kLockUnlock:
+      fl.l_type = F_UNLCK;
+      break;
+    case File::kLockShared:
+      fl.l_type = F_RDLCK;
+      break;
+    case File::kLockExclusive:
+      fl.l_type = F_WRLCK;
+      break;
+    default:
+      return false;
+  }
+  fl.l_whence = SEEK_SET;
+  fl.l_start = start;
+  fl.l_len = end == -1 ? 0 : end - start;
+  // fcntl does not block, but fails if the lock cannot be acquired.
+  int rc = fcntl(handle_->fd(), F_SETLK, &fl);
+  return rc != -1;
+}
+
+
 int64_t File::Length() {
   ASSERT(handle_->fd() >= 0);
   struct stat64 st;
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc
index 830b3c4..ce3b5f4 100644
--- a/runtime/bin/file_macos.cc
+++ b/runtime/bin/file_macos.cc
@@ -111,6 +111,32 @@
 }
 
 
+bool File::Lock(File::LockType lock, int64_t start, int64_t end) {
+  ASSERT(handle_->fd() >= 0);
+  ASSERT(end == -1 || end > start);
+  struct flock fl;
+  switch (lock) {
+    case File::kLockUnlock:
+      fl.l_type = F_UNLCK;
+      break;
+    case File::kLockShared:
+      fl.l_type = F_RDLCK;
+      break;
+    case File::kLockExclusive:
+      fl.l_type = F_WRLCK;
+      break;
+    default:
+      return false;
+  }
+  fl.l_whence = SEEK_SET;
+  fl.l_start = start;
+  fl.l_len = end == -1 ? 0 : end - start;
+  // fcntl does not block, but fails if the lock cannot be acquired.
+  int rc = fcntl(handle_->fd(), F_SETLK, &fl);
+  return rc != -1;
+}
+
+
 int64_t File::Length() {
   ASSERT(handle_->fd() >= 0);
   struct stat st;
diff --git a/runtime/bin/file_patch.dart b/runtime/bin/file_patch.dart
index ed8e3a0..2ca3e58 100644
--- a/runtime/bin/file_patch.dart
+++ b/runtime/bin/file_patch.dart
@@ -38,6 +38,8 @@
   /* patch */ static _truncate(int id, int length) native "File_Truncate";
   /* patch */ static _length(int id) native "File_Length";
   /* patch */ static _flush(int id) native "File_Flush";
+  /* patch */ static _lock(int id, int lock, int start, int end)
+      native "File_Lock";
 }
 
 
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index 7a4b0f0..62e7961 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -17,6 +17,7 @@
 #include "bin/builtin.h"
 #include "bin/log.h"
 #include "bin/utils.h"
+#include "platform/utils.h"
 
 
 namespace dart {
@@ -105,6 +106,44 @@
 }
 
 
+bool File::Lock(File::LockType lock, int64_t start, int64_t end) {
+  ASSERT(handle_->fd() >= 0);
+  ASSERT(end == -1 || end > start);
+  HANDLE handle = reinterpret_cast<HANDLE>(_get_osfhandle(handle_->fd()));
+  OVERLAPPED overlapped;
+  ZeroMemory(&overlapped, sizeof(OVERLAPPED));
+
+  overlapped.Offset = Utils::Low32Bits(start);
+  overlapped.OffsetHigh = Utils::High32Bits(start);
+
+  int64_t length = end == -1 ? 0 : end - start;
+  if (length == 0) length = kMaxInt64;
+  int32_t length_low = Utils::Low32Bits(length);
+  int32_t length_high = Utils::High32Bits(length);
+
+
+  BOOL rc;
+  switch (lock) {
+    case File::kLockUnlock:
+      rc = UnlockFileEx(handle, 0, length_low, length_high, &overlapped);
+      break;
+    case File::kLockShared:
+    case File::kLockExclusive: {
+      DWORD flags = LOCKFILE_FAIL_IMMEDIATELY;
+      if (lock == File::kLockExclusive) {
+        flags |= LOCKFILE_EXCLUSIVE_LOCK;
+      }
+      rc = LockFileEx(handle, flags, 0,
+                      length_low, length_high, &overlapped);
+      break;
+    }
+    default:
+      UNREACHABLE();
+  }
+  return rc;
+}
+
+
 int64_t File::Length() {
   ASSERT(handle_->fd() >= 0);
   struct __stat64 st;
@@ -437,7 +476,7 @@
   // Remove "\??\" from beginning of target.
   if (target_length > 4 && wcsncmp(L"\\??\\", target, 4) == 0) {
     target += 4;
-    target_length -=4;
+    target_length -= 4;
   }
   int utf8_length = WideCharToMultiByte(CP_UTF8,
                                         0,
diff --git a/runtime/bin/io_service.h b/runtime/bin/io_service.h
index af829eb..87810d0 100644
--- a/runtime/bin/io_service.h
+++ b/runtime/bin/io_service.h
@@ -41,18 +41,19 @@
   V(File, Type, 24)                                                            \
   V(File, Identical, 25)                                                       \
   V(File, Stat, 26)                                                            \
-  V(Socket, Lookup, 27)                                                        \
-  V(Socket, ListInterfaces, 28)                                                \
-  V(Socket, ReverseLookup, 29)                                                 \
-  V(Directory, Create, 30)                                                     \
-  V(Directory, Delete, 31)                                                     \
-  V(Directory, Exists, 32)                                                     \
-  V(Directory, CreateTemp, 33)                                                 \
-  V(Directory, ListStart, 34)                                                  \
-  V(Directory, ListNext, 35)                                                   \
-  V(Directory, ListStop, 36)                                                   \
-  V(Directory, Rename, 37)                                                     \
-  V(SSLFilter, ProcessFilter, 38)
+  V(File, Lock, 27)                                                            \
+  V(Socket, Lookup, 28)                                                        \
+  V(Socket, ListInterfaces, 29)                                                \
+  V(Socket, ReverseLookup, 30)                                                 \
+  V(Directory, Create, 31)                                                     \
+  V(Directory, Delete, 32)                                                     \
+  V(Directory, Exists, 33)                                                     \
+  V(Directory, CreateTemp, 34)                                                 \
+  V(Directory, ListStart, 35)                                                  \
+  V(Directory, ListNext, 36)                                                   \
+  V(Directory, ListStop, 37)                                                   \
+  V(Directory, Rename, 38)                                                     \
+  V(SSLFilter, ProcessFilter, 39)
 
 #define DECLARE_REQUEST(type, method, id)                                      \
   k##type##method##Request = id,
diff --git a/runtime/bin/io_service_patch.dart b/runtime/bin/io_service_patch.dart
index 612703e..d00f9f2 100644
--- a/runtime/bin/io_service_patch.dart
+++ b/runtime/bin/io_service_patch.dart
@@ -20,7 +20,14 @@
     _initialize(index);
     var completer = new Completer();
     _messageMap[id] = completer;
-    _servicePort[index].send([id, _replyToPort, request, data]);
+    try {
+      _servicePort[index].send([id, _replyToPort, request, data]);
+    } catch (error) {
+      _messageMap.remove(id).complete(error);
+      if (_messageMap.length == 0) {
+        _finalize();
+      }
+    }
     return completer.future;
   }
 
@@ -35,14 +42,18 @@
         assert(data is List && data.length == 2);
         _messageMap.remove(data[0]).complete(data[1]);
         if (_messageMap.length == 0) {
-          _id = 0;
-          _receivePort.close();
-          _receivePort = null;
+          _finalize();
         }
       };
     }
   }
 
+  static void _finalize() {
+    _id = 0;
+    _receivePort.close();
+    _receivePort = null;
+  }
+
   static int _getNextId() {
     if (_id == 0x7FFFFFFF) _id = 0;
     return _id++;
diff --git a/runtime/include/dart_native_api.h b/runtime/include/dart_native_api.h
index 850de91..2176aad 100644
--- a/runtime/include/dart_native_api.h
+++ b/runtime/include/dart_native_api.h
@@ -57,7 +57,10 @@
       intptr_t used;
       struct _Dart_CObject* digits;
     } as_bigint;
-    Dart_Port as_send_port;
+    struct {
+      Dart_Port id;
+      Dart_Port origin_id;
+    } as_send_port;
     struct {
       intptr_t length;
       struct _Dart_CObject** values;
diff --git a/runtime/lib/bigint.dart b/runtime/lib/bigint.dart
index 191739e..a22bb51 100644
--- a/runtime/lib/bigint.dart
+++ b/runtime/lib/bigint.dart
@@ -58,52 +58,32 @@
   // Bigint constant values.
   // Note: Not declared as final in order to satisfy optimizer, which expects
   // constants to be in canonical form (Smi).
-  static _Bigint ONE = new _Bigint()._setInt(1);
+  static _Bigint ONE = new _Bigint._fromInt(1);
 
   // Digit conversion table for parsing.
   static final Map<int, int> DIGIT_TABLE = _createDigitTable();
 
   // Internal data structure.
+  // TODO(regis): Remove the 3 native setters below and provide a constructor
+  // taking all 3 field values, which is equivalent to making the fields final.
   bool get _neg native "Bigint_getNeg";
   void set _neg(bool value) native "Bigint_setNeg";
   int get _used native "Bigint_getUsed";
   void set _used(int value) native "Bigint_setUsed";
   Uint32List get _digits native "Bigint_getDigits";
-  void set _digits(Uint32List digits) {
-    // The VM expects digits_ to be a Uint32List.
-    assert(digits != null);
-    _set_digits(digits);
-  }
-
-  void _set_digits(Uint32List value) native "Bigint_setDigits";
+  void set _digits(Uint32List value) native "Bigint_setDigits";
 
   // Factory returning an instance initialized to value 0.
   factory _Bigint() native "Bigint_allocate";
 
-  // Factory returning an instance initialized to an integer value.
+  // Factory returning an instance initialized to an integer value no larger
+  // than a Mint.
   factory _Bigint._fromInt(int i) {
-    return new _Bigint()._setInt(i);
-  }
-
-  // Factory returning an instance initialized to a hex string.
-  factory _Bigint._fromHex(String s) {
-    return new _Bigint()._setHex(s);
-  }
-
-  // Factory returning an instance initialized to a double value given by its
-  // components.
-  factory _Bigint._fromDouble(int sign, int significand, int exponent) {
-    return new _Bigint()._setDouble(sign, significand, exponent);
-  }
-
-  // Initialize instance to the given value no larger than a Mint.
-  _Bigint _setInt(int i) {
     assert(i is! _Bigint);
-    _ensureLength(2);
-    _used = 2;
+    bool neg;
     var l, h;
     if (i < 0) {
-      _neg = true;
+      neg = true;
       if (i == MIN_INT64) {
         l = 0;
         h = 0x80000000;
@@ -112,56 +92,18 @@
         h = (-i) >> DIGIT_BITS;
       }
     } else {
-      _neg = false;
+      neg = false;
       l = i & DIGIT_MASK;
       h = i >> DIGIT_BITS;
     }
-    _digits[0] = l;
-    _digits[1] = h;
-    _clamp();
-    return this;
-  }
-
-  // Initialize instance to the given hex string.
-  // TODO(regis): Copy Bigint::NewFromHexCString, fewer digit accesses.
-  // TODO(regis): Unused.
-  _Bigint _setHex(String s) {
-    const int HEX_BITS = 4;
-    const int HEX_DIGITS_PER_DIGIT = 8;
-    var hexDigitIndex = s.length;
-    _ensureLength((hexDigitIndex + HEX_DIGITS_PER_DIGIT - 1) ~/ HEX_DIGITS_PER_DIGIT);
-    var bitIndex = 0;
-    var digits = _digits;
-    while (--hexDigitIndex >= 0) {
-      var digit = DIGIT_TABLE[s.codeUnitAt(hexDigitIndex)];
-      if (digit = null) {
-        if (s[hexDigitIndex] == "-") _neg = true;
-        continue;  // Ignore invalid digits.
-      }
-      _neg = false;  // Ignore "-" if not at index 0.
-      if (bitIndex == 0) {
-        digits[_used++] = digit;
-        // TODO(regis): What if too many bad digits were ignored and
-        // _used becomes larger than _digits.length? error or reallocate?
-      } else {
-        digits[_used - 1] |= digit << bitIndex;
-      }
-      bitIndex = (bitIndex + HEX_BITS) % DIGIT_BITS;
-    }
-    _clamp();
-    return this;
-  }
-
-  // Initialize instance to the given double value.
-  _Bigint _setDouble(int sign, int significand, int exponent) {
-    assert(significand >= 0);
-    assert(exponent >= 0);
-    _setInt(significand);
-    _neg = sign < 0;
-    if (exponent > 0) {
-      _lShiftTo(exponent, this);
-    }
-    return this;
+    var result = new _Bigint();
+    result._ensureLength(2);
+    result._neg = neg;
+    result._used = 2;
+    result._digits[0] = l;
+    result._digits[1] = h;
+    result._clamp();
+    return result;
   }
 
   // Create digit conversion table for parsing.
@@ -1311,7 +1253,6 @@
   }
   int _moduloFromInteger(int other) {
     _Bigint result = new _Bigint();
-    var ob = other._toBigint();
     other._toBigint()._divRemTo(this, null, result);
     if (result._neg) {
       if (_neg) {
@@ -1387,7 +1328,7 @@
     var j = e._used - 1;
     var w;
     var is1 = true;
-    var r = new _Bigint()._setInt(1);
+    var r = new _Bigint._fromInt(1);
     var r2 = new _Bigint();
     var t;
     var e_digits = e._digits;
diff --git a/runtime/lib/double.cc b/runtime/lib/double.cc
index 49c49a8..4173c140 100644
--- a/runtime/lib/double.cc
+++ b/runtime/lib/double.cc
@@ -79,20 +79,13 @@
     args.SetAt(0, String::Handle(String::New(error_msg)));
     Exceptions::ThrowByType(Exceptions::kUnsupported, args);
   }
-  // TODO(regis): Should we implement Bigint::NewFromDouble instead?
   if ((-1.0 < val) && (val < 1.0)) {
     return Smi::New(0);
   }
   DoubleInternals internals = DoubleInternals(val);
-  if (internals.IsSpecial()) {
-    const Array& exception_arguments = Array::Handle(Array::New(1));
-    exception_arguments.SetAt(
-        0, Object::Handle(String::New("BigintOperations::NewFromDouble")));
-    Exceptions::ThrowByType(Exceptions::kInternalError, exception_arguments);
-  }
+  ASSERT(!internals.IsSpecial());  // Only Infinity and NaN are special.
   uint64_t significand = internals.Significand();
   intptr_t exponent = internals.Exponent();
-  intptr_t sign = internals.Sign();
   if (exponent <= 0) {
     significand >>= -exponent;
     exponent = 0;
@@ -104,37 +97,16 @@
   }
   // A significand has at most 63 bits (after the shift above).
   // The cast to int64_t is hence safe.
+  int64_t ival = static_cast<int64_t>(significand);
+  if (internals.Sign() < 0) {
+    ival = -ival;
+  }
   if (exponent == 0) {
     // The double fits in a Smi or Mint.
-    int64_t ival = static_cast<int64_t>(significand);
-    if (sign < 0) {
-      ival = -ival;
-    }
     return Integer::New(ival);
   }
-  // Lookup the factory creating a Bigint from a double.
-  const Class& bigint_class =
-      Class::Handle(Library::LookupCoreClass(Symbols::_Bigint()));
-  ASSERT(!bigint_class.IsNull());
-  const Function& factory_method = Function::Handle(
-      bigint_class.LookupFactoryAllowPrivate(
-          Symbols::_BigintFromDoubleFactory()));
-  ASSERT(!factory_method.IsNull());
-
-  // Create the argument list.
-  const intptr_t kNumArgs = 4;
-  const Array& args = Array::Handle(Array::New(kNumArgs));
-  // Factories get type arguments.
-  args.SetAt(0, Object::null_type_arguments());
-  args.SetAt(1, Smi::Handle(Smi::New(sign)));
-  args.SetAt(2,
-             Integer::Handle(Integer::New(static_cast<int64_t>(significand))));
-  args.SetAt(3, Integer::Handle(Integer::New(exponent)));
-
-  // Invoke the constructor and return the new object.
   Integer& result = Integer::Handle();
-  result ^= DartEntry::InvokeFunction(factory_method, args);
-  ASSERT(result.IsBigint());
+  result = Bigint::NewFromShiftedInt64(ival, exponent);
   return result.AsValidInteger();
 }
 
diff --git a/runtime/lib/integers.cc b/runtime/lib/integers.cc
index 257e680..d9f9e06 100644
--- a/runtime/lib/integers.cc
+++ b/runtime/lib/integers.cc
@@ -440,6 +440,7 @@
 DEFINE_NATIVE_ENTRY(Bigint_setDigits, 2) {
   const Bigint& bigint = Bigint::CheckedHandle(arguments->NativeArgAt(0));
   const TypedData& digits = TypedData::CheckedHandle(arguments->NativeArgAt(1));
+  ASSERT(!digits.IsNull());
   bigint.set_digits(digits);
   return Object::null();
 }
diff --git a/runtime/lib/integers.dart b/runtime/lib/integers.dart
index accda5b..48f6dc1 100644
--- a/runtime/lib/integers.dart
+++ b/runtime/lib/integers.dart
@@ -200,7 +200,7 @@
 
   int toInt() { return this; }
   double toDouble() { return new _Double.fromInteger(this); }
-  _Bigint _toBigint() { return new _Bigint()._setInt(this); }
+  _Bigint _toBigint() { return new _Bigint._fromInt(this); }
   num _toBigintOrDouble() { return _toBigint(); }
 
   String toStringAsFixed(int fractionDigits) {
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index e7fdebc..ac7a9aa 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -102,7 +102,8 @@
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, obj, arguments->NativeArgAt(1));
 
   uint8_t* data = NULL;
-  MessageWriter writer(&data, &allocator);
+  bool can_send_any_object = (isolate->origin_id() == port.origin_id());
+  MessageWriter writer(&data, &allocator, can_send_any_object);
   writer.WriteMessage(obj);
 
   // TODO(turnidge): Throw an exception when the return value is false?
@@ -178,6 +179,11 @@
     Isolate::SetCurrent(parent_isolate);
     return false;
   }
+  if (!state->is_spawn_uri()) {
+    // For isolates spawned using the spawnFunction semantics we set
+    // the origin_id to the origin_id of the parent isolate.
+    child_isolate->set_origin_id(parent_isolate->origin_id());
+  }
   state->set_isolate(reinterpret_cast<Isolate*>(child_isolate));
 
   Isolate::SetCurrent(parent_isolate);
@@ -185,8 +191,7 @@
 }
 
 
-static RawObject* Spawn(Isolate* parent_isolate,
-                        IsolateSpawnState* state) {
+static void Spawn(Isolate* parent_isolate, IsolateSpawnState* state) {
   // Create a new isolate.
   char* error = NULL;
   if (!CreateIsolate(parent_isolate, state, &error)) {
@@ -196,19 +201,13 @@
     ThrowIsolateSpawnException(msg);
   }
 
-  // Create a SendPort for the new isolate.
-  Isolate* spawned_isolate = state->isolate();
-  const SendPort& port = SendPort::Handle(
-      SendPort::New(spawned_isolate->main_port()));
-
   // Start the new isolate if it is already marked as runnable.
+  Isolate* spawned_isolate = state->isolate();
   MutexLocker ml(spawned_isolate->mutex());
   spawned_isolate->set_spawn_state(state);
   if (spawned_isolate->is_runnable()) {
     spawned_isolate->Run();
   }
-
-  return port.raw();
 }
 
 
@@ -226,8 +225,11 @@
       ctx = Closure::context(closure);
       ASSERT(ctx.num_variables() == 0);
 #endif
-      return Spawn(isolate, new IsolateSpawnState(
-          port.Id(), func, message, paused.value()));
+      Spawn(isolate, new IsolateSpawnState(port.Id(),
+                                           func,
+                                           message,
+                                           paused.value()));
+      return Object::null();
     }
   }
   const String& msg = String::Handle(String::New(
@@ -265,12 +267,13 @@
     utf8_package_root[len] = '\0';
   }
 
-  return Spawn(isolate, new IsolateSpawnState(port.Id(),
-                                              canonical_uri,
-                                              utf8_package_root,
-                                              args,
-                                              message,
-                                              paused.value()));
+  Spawn(isolate, new IsolateSpawnState(port.Id(),
+                                       canonical_uri,
+                                       utf8_package_root,
+                                       args,
+                                       message,
+                                       paused.value()));
+  return Object::null();
 }
 
 
@@ -293,7 +296,7 @@
   msg.SetAt(0, Smi::Handle(Smi::New(Message::kIsolateLibOOBMsg)));
 
   uint8_t* data = NULL;
-  MessageWriter writer(&data, &allocator);
+  MessageWriter writer(&data, &allocator, false);
   writer.WriteMessage(msg);
 
   PortMap::PostMessage(new Message(port.Id(),
diff --git a/runtime/lib/isolate_patch.dart b/runtime/lib/isolate_patch.dart
index d949f81..b0383d8 100644
--- a/runtime/lib/isolate_patch.dart
+++ b/runtime/lib/isolate_patch.dart
@@ -342,13 +342,13 @@
   static const _KILL = 4;
 
 
-  static SendPort _spawnFunction(SendPort readyPort, Function topLevelFunction,
-                                 var message, bool paused)
+  static void _spawnFunction(SendPort readyPort, Function topLevelFunction,
+                             var message, bool paused)
       native "Isolate_spawnFunction";
 
-  static SendPort _spawnUri(SendPort readyPort, String uri,
-                            List<String> args, var message,
-                            bool paused, String packageRoot)
+  static void _spawnUri(SendPort readyPort, String uri,
+                        List<String> args, var message,
+                        bool paused, String packageRoot)
       native "Isolate_spawnUri";
 
   static void _sendOOB(port, msg) native "Isolate_sendOOB";
diff --git a/runtime/observatory/lib/elements.dart b/runtime/observatory/lib/elements.dart
index 4c291ce..f63249d 100644
--- a/runtime/observatory/lib/elements.dart
+++ b/runtime/observatory/lib/elements.dart
@@ -10,6 +10,7 @@
 export 'package:observatory/src/elements/code_view.dart';
 export 'package:observatory/src/elements/context_ref.dart';
 export 'package:observatory/src/elements/context_view.dart';
+export 'package:observatory/src/elements/cpu_profile.dart';
 export 'package:observatory/src/elements/curly_block.dart';
 export 'package:observatory/src/elements/debugger.dart';
 export 'package:observatory/src/elements/error_view.dart';
@@ -25,7 +26,6 @@
 export 'package:observatory/src/elements/instance_ref.dart';
 export 'package:observatory/src/elements/instance_view.dart';
 export 'package:observatory/src/elements/io_view.dart';
-export 'package:observatory/src/elements/isolate_profile.dart';
 export 'package:observatory/src/elements/isolate_ref.dart';
 export 'package:observatory/src/elements/isolate_summary.dart';
 export 'package:observatory/src/elements/isolate_view.dart';
diff --git a/runtime/observatory/lib/elements.html b/runtime/observatory/lib/elements.html
index 954da13..eeb782d 100644
--- a/runtime/observatory/lib/elements.html
+++ b/runtime/observatory/lib/elements.html
@@ -5,6 +5,7 @@
 <link rel="import" href="src/elements/class_view.html">
 <link rel="import" href="src/elements/code_ref.html">
 <link rel="import" href="src/elements/code_view.html">
+<link rel="import" href="src/elements/cpu_profile.html">
 <link rel="import" href="src/elements/curly_block.html">
 <link rel="import" href="src/elements/debugger.html">
 <link rel="import" href="src/elements/error_view.html">
diff --git a/runtime/observatory/lib/object_graph.dart b/runtime/observatory/lib/object_graph.dart
index ec6cdae..9c9ad34 100644
--- a/runtime/observatory/lib/object_graph.dart
+++ b/runtime/observatory/lib/object_graph.dart
@@ -38,6 +38,9 @@
 class ObjectVertex {
   // Never null. The isolate root has id 0.
   final int _id;
+  bool get isRoot => _id == 0;
+  // TODO(koda): Include units in object graph metadata.
+  int addressForWordSize(int bytesPerWord) => _id * 2 * bytesPerWord;
   // null for VM-heap objects.
   int _shallowSize;
   int get shallowSize => _shallowSize;
@@ -75,12 +78,27 @@
       _addFrom(reader);
     }
     _computeRetainedSizes();
+    _mostRetained = new List<ObjectVertex>.from(
+        vertices.where((u) => !u.isRoot));
+    _mostRetained.sort((u, v) => v.retainedSize - u.retainedSize);
   }
 
   Iterable<ObjectVertex> get vertices => _idToVertex.values;
+  List<ObjectVertex> _mostRetained;
 
   ObjectVertex get root => _asVertex(0);
   
+  Iterable<ObjectVertex> getMostRetained({int classId, int limit}) {
+    var result = _mostRetained;
+    if (classId != null) {
+      result = result.where((u) => u.classId == classId);
+    }
+    if (limit != null) {
+      result = result.take(limit);
+    }
+    return result;
+  }
+  
   void _computeRetainedSizes() {
     // The retained size for an object is the sum of the shallow sizes of
     // all its descendants in the dominator tree (including itself).
diff --git a/runtime/observatory/lib/service.dart b/runtime/observatory/lib/service.dart
index 9b66b2e..73f3f1b 100644
--- a/runtime/observatory/lib/service.dart
+++ b/runtime/observatory/lib/service.dart
@@ -9,6 +9,7 @@
 import 'dart:typed_data';
 
 import 'package:logging/logging.dart';
+import 'package:observatory/object_graph.dart';
 import 'package:observatory/tracer.dart';
 import 'package:observe/observe.dart';
 
diff --git a/runtime/observatory/lib/service_common.dart b/runtime/observatory/lib/service_common.dart
index b460174..18567b7 100644
--- a/runtime/observatory/lib/service_common.dart
+++ b/runtime/observatory/lib/service_common.dart
@@ -172,7 +172,9 @@
       _webSocket.nonStringToByteData(data).then((ByteData bytes) {
         // See format spec. in VMs Service::SendEvent.
         int offset = 0;
-        int metaSize = bytes.getUint64(offset, Endianness.BIG_ENDIAN);
+        // Dart2JS workaround (no getUint64). Limit to 4 GB metadata.
+        assert(bytes.getUint32(offset, Endianness.BIG_ENDIAN) == 0);
+        int metaSize = bytes.getUint32(offset + 4, Endianness.BIG_ENDIAN);
         offset += 8;
         var meta = _utf8Decoder.convert(new Uint8List.view(
             bytes.buffer, bytes.offsetInBytes + offset, metaSize));
diff --git a/runtime/observatory/lib/src/app/application.dart b/runtime/observatory/lib/src/app/application.dart
index 54a0118..a280f4e 100644
--- a/runtime/observatory/lib/src/app/application.dart
+++ b/runtime/observatory/lib/src/app/application.dart
@@ -87,6 +87,9 @@
         notifications.add(event);
         break;
 
+      case '_Graph':
+        event.isolate.loadHeapSnapshot(event);
+        break;
 
       case 'GC':
         // Ignore GC events for now.
diff --git a/runtime/observatory/lib/src/app/view_model.dart b/runtime/observatory/lib/src/app/view_model.dart
index fcdb425..48d0c10 100644
--- a/runtime/observatory/lib/src/app/view_model.dart
+++ b/runtime/observatory/lib/src/app/view_model.dart
@@ -5,26 +5,26 @@
 part of app;
 
 abstract class TableTreeRow extends Observable {
-  final TableTreeRow parent;
-  @observable final int depth;
-  @observable final List<TableTreeRow> children = new List<TableTreeRow>();
-  @observable final List<String> columns = [];
   static const arrowRight = '\u2192';
   static const arrowDownRight = '\u21b3';
-  static const showExpanderStyle = 'cursor: pointer;';
-  static const hideExpanderStyle = 'visibility:hidden;';
+  // Number of pixels each subtree is indented.
+  static const subtreeIndent = 16;
 
-  // TODO(johnmccutchan): Move expander display decisions into html once
-  // tables and templates are better supported.
-  @observable String expander = arrowRight;
-  @observable String expanderStyle = showExpanderStyle;
+  final TableTree tree;
+  final TableTreeRow parent;
+  final int depth;
+  final List<TableTreeRow> children = new List<TableTreeRow>();
+  final List<TableCellElement> tableColumns = new List<TableCellElement>();
+  SpanElement _expander;
+  TableRowElement _tr;
+  TableRowElement get tr {
+    assert(_tr != null);
+    return _tr;
+  }
 
-  TableTreeRow(TableTreeRow parent) :
+  TableTreeRow(this.tree, TableTreeRow parent) :
       parent = parent,
       depth = parent != null ? parent.depth+1 : 0 {
-    if (!hasChildren()) {
-      expanderStyle = hideExpanderStyle;
-    }
   }
 
   bool _expanded = false;
@@ -35,48 +35,121 @@
     if (changed) {
       // If the state has changed, fire callbacks.
       if (_expanded) {
-        expander = arrowDownRight;
-        onShow();
+        _onExpand();
       } else {
-        expander = arrowRight;
-        onHide();
+        _onCollapse();
       }
     }
   }
 
-  bool toggle() {
+  bool expandOrCollapse() {
     expanded = !expanded;
     return expanded;
   }
 
   bool hasChildren();
 
-  /// Fired when the tree row is expanded. Add children rows here.
-  void onShow();
+  String _backgroundColorClassForRow() {
+    const colors = const ['rowColor0', 'rowColor1', 'rowColor2', 'rowColor3',
+                          'rowColor4', 'rowColor5', 'rowColor6', 'rowColor7',
+                          'rowColor8'];
+    var index = (depth - 1) % colors.length;
+    return colors[index];
+  }
 
-  /// Fired when the tree row is collapsed.
-  void onHide();
+  void _buildRow() {
+    _tr = new TableRowElement();
+    for (var i = 0; i < tree.columnCount; i++) {
+      var cell = _tr.insertCell(-1);
+      cell.classes.add(_backgroundColorClassForRow());
+      tableColumns.add(cell);
+    }
+    var firstColumn = tableColumns[0];
+    _expander = new SpanElement();
+    _expander.style.display = 'inline-block';
+    _expander.style.minWidth = '1.5em';
+    _expander.onClick.listen(onClick);
+    firstColumn.children.add(_expander);
+    firstColumn.style.paddingLeft = '${depth * subtreeIndent}px';
+    updateExpanderView();
+  }
+
+  void updateExpanderView() {
+    if (_expander == null) {
+      return;
+    }
+    if (!hasChildren()) {
+      _expander.style.visibility = 'hidden';
+      _expander.style.cursor = 'auto';
+      return;
+    } else {
+      _expander.style.visibility = 'visible';
+      _expander.style.cursor = 'pointer';
+    }
+    _expander.text = expanded ? arrowDownRight : arrowRight;
+  }
+
+  /// Fired when the tree row is being shown.
+  /// Populate tr and add logical children here.
+  void onShow() {
+    assert(_tr == null);
+    _buildRow();
+  }
+
+  /// Fired when the tree row is being hidden.
+  void onHide() {
+    assert(_tr != null);
+    _tr = null;
+    tableColumns.clear();
+    _expander = null;
+  }
+
+  /// Fired when the tree row is being expanded.
+  void _onExpand() {
+    for (var child in children) {
+      child.onShow();
+      child.updateExpanderView();
+    }
+    updateExpanderView();
+  }
+
+  /// Fired when the tree row is being collapsed.
+  void _onCollapse() {
+    for (var child in children) {
+      child.onHide();
+    }
+    updateExpanderView();
+  }
+
+  void onClick(Event e) {
+    tree.toggle(this);
+    e.stopPropagation();
+  }
 }
 
 class TableTree extends Observable {
-  @observable final List<TableTreeRow> rows = toObservable([]);
+  final TableSectionElement tableBody;
+  final List<TableTreeRow> rows = [];
+  final int columnCount;
 
   /// Create a table tree with column [headers].
-  TableTree();
+  TableTree(this.tableBody, this.columnCount);
 
   /// Initialize the table tree with the list of root children.
   void initialize(TableTreeRow root) {
+    tableBody.children.clear();
     rows.clear();
     root.onShow();
     rows.addAll(root.children);
+    for (var i = 0; i < rows.length; i++) {
+      rows[i].onShow();
+      tableBody.children.add(rows[i].tr);
+    }
   }
 
-  /// Toggle expansion of row at [rowIndex].
-  void toggle(int rowIndex) {
-    assert(rowIndex >= 0);
-    assert(rowIndex < rows.length);
-    var row = rows[rowIndex];
-    if (row.toggle()) {
+  /// Toggle expansion of row in tree.
+  void toggle(TableTreeRow row) {
+    if (row.expandOrCollapse()) {
       _expand(row);
     } else {
       _collapse(row);
@@ -89,6 +162,9 @@
     int index = _index(row);
     assert(index != -1);
     rows.insertAll(index + 1, row.children);
+    for (var i = 0; i < row.children.length; i++) {
+      tableBody.children.insert(index + i + 1, row.children[i].tr);
+    }
   }
 
   void _collapse(TableTreeRow row) {
@@ -107,6 +183,9 @@
     // Remove all children.
     int index = _index(row);
     rows.removeRange(index + 1, index + 1 + childCount);
+    for (var i = 0; i < childCount; i++) {
+      tableBody.children.removeAt(index + 1);
+    }
   }
 }
 
diff --git a/runtime/observatory/lib/src/elements/class_tree.dart b/runtime/observatory/lib/src/elements/class_tree.dart
index c9e1153..c42fb29 100644
--- a/runtime/observatory/lib/src/elements/class_tree.dart
+++ b/runtime/observatory/lib/src/elements/class_tree.dart
@@ -14,26 +14,30 @@
 class ClassTreeRow extends TableTreeRow {
   @reflectable final Isolate isolate;
   @reflectable final Class cls;
-  ClassTreeRow(this.isolate, this.cls, ClassTreeRow parent) : super(parent) {
+  ClassTreeRow(this.isolate, this.cls, TableTree tree, ClassTreeRow parent)
+      : super(tree, parent) {
     assert(isolate != null);
     assert(cls != null);
   }
 
   void onShow() {
-    if (children.length > 0) {
-      // Child rows already created.
-      return;
-    }
-    for (var subclass in cls.subclasses) {
-      if (subclass.isPatch) {
-        continue;
+    super.onShow();
+    if (children.length == 0) {
+      for (var subclass in cls.subclasses) {
+        if (subclass.isPatch) {
+          continue;
+        }
+        var row = new ClassTreeRow(isolate, subclass, tree, this);
+        children.add(row);
       }
-      var row = new ClassTreeRow(isolate, subclass, this);
-      children.add(row);
     }
-  }
+    var classCell = tableColumns[0];
+    // Enable expansion by clicking anywhere on the class column.
+    classCell.onClick.listen(onClick);
 
-  void onHide() {
+    var classRef = new Element.tag('class-ref');
+    classRef.ref = cls;
+    classCell.children.add(classRef);
   }
 
   bool hasChildren() {
@@ -53,7 +57,9 @@
   @override
   void attached() {
     super.attached();
-    tree = new TableTree();
+    var tableBody = shadowRoot.querySelector('#tableTreeBody');
+    assert(tableBody != null);
+    tree = new TableTree(tableBody, 1);
     if (isolate != null) {
       _update(isolate.objectClass);
     }
@@ -67,49 +73,16 @@
 
   void _update(Class root) {
     try {
-      var rootRow = new ClassTreeRow(isolate, root, null);
-      rootRow.children.add(new ClassTreeRow(isolate, root, rootRow));
+      var rootRow = new ClassTreeRow(isolate, root, tree, null);
+      rootRow.children.add(new ClassTreeRow(isolate, root, tree, rootRow));
       tree.initialize(rootRow);
     } catch (e, stackTrace) {
       Logger.root.warning('_update', e, stackTrace);
     }
     // Check if we only have one node at the root and expand it.
     if (tree.rows.length == 1) {
-      tree.toggle(0);
+      tree.toggle(tree.rows[0]);
     }
     notifyPropertyChange(#tree, null, tree);
   }
-
-  @observable String padding(TableTreeRow row) {
-    return 'padding-left: ${row.depth * 16}px;';
-  }
-
-  @observable String coloring(TableTreeRow row) {
-    const colors = const ['rowColor0', 'rowColor1', 'rowColor2', 'rowColor3',
-                          'rowColor4', 'rowColor5', 'rowColor6', 'rowColor7',
-                          'rowColor8'];
-    var index = (row.depth - 1) % colors.length;
-    return colors[index];
-  }
-
-  @observable void toggleExpanded(Event e, var detail, Element target) {
-    // We only want to expand a tree row if the target of the click is
-    // the table cell (passed in as target) or the span containing the
-    // expander symbol (#expand).
-    var eventTarget = e.target;
-    if ((eventTarget.id != 'expand') && (e.target != target)) {
-      // Target of click was not the expander span or the table cell.
-      return;
-    }
-    var row = target.parent;
-    if (row is TableRowElement) {
-      try {
-        // Subtract 1 to get 0 based indexing.
-        tree.toggle(row.rowIndex - 1);
-      }  catch (e, stackTrace) {
-        Logger.root.warning('toggleExpanded', e, stackTrace);
-      }
-    }
-  }
-
 }
diff --git a/runtime/observatory/lib/src/elements/class_tree.html b/runtime/observatory/lib/src/elements/class_tree.html
index 96270d2..cbe79d1 100644
--- a/runtime/observatory/lib/src/elements/class_tree.html
+++ b/runtime/observatory/lib/src/elements/class_tree.html
@@ -97,21 +97,12 @@
     <div class="content-centered">
       <h1>Class Hierarchy</h1>
       <table id="tableTree" class="table">
-        <thead>
+        <thead id="tableTreeHeader">
           <tr>
             <th>Class</th>
           </tr>
         </thead>
-        <tbody>
-          <tr template repeat="{{row in tree.rows }}">
-            <td on-click="{{toggleExpanded}}"
-                class="{{ coloring(row) }}"
-                style="{{ padding(row) }}">
-              <span id="expand" style="{{ row.expanderStyle }}">{{ row.expander }}</span>
-              <class-ref ref="{{ row.cls }}"></class-ref>
-            </td>
-          </tr>
-        </tbody>
+        <tbody id="tableTreeBody"></tbody>
       </table>
     </div>
   </template>
diff --git a/runtime/observatory/lib/src/elements/class_view.dart b/runtime/observatory/lib/src/elements/class_view.dart
index 2338362..e9e08d5 100644
--- a/runtime/observatory/lib/src/elements/class_view.dart
+++ b/runtime/observatory/lib/src/elements/class_view.dart
@@ -14,6 +14,7 @@
   @published Class cls;
   @observable ServiceMap instances;
   @observable int retainedBytes;
+  @observable ObservableList mostRetained;
   ClassViewElement.created() : super.created();
 
   Future<ServiceObject> eval(String text) {
@@ -26,6 +27,16 @@
           instances = obj;
         });
   }
+  
+  Future<ServiceObject> retainedToplist(var limit) {
+    return cls.isolate.fetchHeapSnapshot().then(
+        (HeapSnapshot snapshot) =>
+            Future.wait(snapshot.getMostRetained(classId: cls.vmCid,
+                                                 limit: 10))).then(
+        (List<ServiceObject> most) {
+            mostRetained = new ObservableList.from(most);
+        });
+  }
 
   // TODO(koda): Add no-arg "calculate-link" instead of reusing "eval-link".
   Future<ServiceObject> retainedSize(var dummy) {
@@ -37,6 +48,7 @@
   void refresh(var done) {
     instances = null;
     retainedBytes = null;
+    mostRetained = null;
     cls.reload().whenComplete(done);
   }
 
diff --git a/runtime/observatory/lib/src/elements/class_view.html b/runtime/observatory/lib/src/elements/class_view.html
index f8af57d..400bc83 100644
--- a/runtime/observatory/lib/src/elements/class_view.html
+++ b/runtime/observatory/lib/src/elements/class_view.html
@@ -166,7 +166,7 @@
             </div>
           </div>
           <div class="memberItem">
-            <div class="memberName">retained size</div>
+            <div class="memberName">total retained memory size</div>
             <div class="memberValue">
               <template if="{{ retainedBytes == null }}">
                 <eval-link callback="{{ retainedSize }}"
@@ -178,6 +178,21 @@
               </template>
             </div>
           </div>
+          <div class="memberItem">
+            <div class="memberName">toplist by retained memory</div>
+            <div class="memberValue">
+              <template if="{{ mostRetained == null }}">
+                <eval-link callback="{{ retainedToplist }}"
+                           label="[find]">
+                </eval-link>
+              </template>
+              <template if="{{ mostRetained != null }}">
+                <template repeat="{{ most in mostRetained }}">
+                  {{ most.retainedSize | formatSize }}<instance-ref ref="{{ most }}"></instance-ref><br>
+                </template>
+              </template>
+            </div>
+          </div>
         </template>
     </div>
 
diff --git a/runtime/observatory/lib/src/elements/isolate_profile.dart b/runtime/observatory/lib/src/elements/cpu_profile.dart
similarity index 63%
rename from runtime/observatory/lib/src/elements/isolate_profile.dart
rename to runtime/observatory/lib/src/elements/cpu_profile.dart
index 4122d96..44b9e0b 100644
--- a/runtime/observatory/lib/src/elements/isolate_profile.dart
+++ b/runtime/observatory/lib/src/elements/cpu_profile.dart
@@ -2,13 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library isolate_profile_element;
+library cpu_profile_element;
 
 import 'dart:html';
 import 'observatory_element.dart';
 import 'package:logging/logging.dart';
 import 'package:observatory/service.dart';
 import 'package:observatory/app.dart';
+import 'package:observatory/elements.dart';
 import 'package:polymer/polymer.dart';
 
 class ProfileCodeTrieNodeTreeRow extends TableTreeRow {
@@ -24,8 +25,9 @@
   @reflectable String tipTime = '';
 
   ProfileCodeTrieNodeTreeRow(this.profile, this.root, this.node,
+                             TableTree tree,
                              ProfileCodeTrieNodeTreeRow parent)
-      : super(parent) {
+      : super(tree, parent) {
     assert(root != null);
     assert(node != null);
     tipTicks = '${node.count}';
@@ -55,8 +57,6 @@
       }
       tipExclusive = Utils.formatPercent(node.code.exclusiveTicks, root.count);
     }
-    columns.add(tipParent);
-    columns.add(tipExclusive);
   }
 
   bool shouldDisplayChild(CodeTrieNode childNode, double threshold) {
@@ -64,22 +64,71 @@
             ((childNode.code.exclusiveTicks / root.count) > threshold);
   }
 
-  void onShow() {
-    var threshold = profile['threshold'];
-    if (children.length > 0) {
-      // Child rows already created.
-      return;
-    }
-    for (var childNode in node.children) {
-      if (!shouldDisplayChild(childNode, threshold)) {
-        continue;
-      }
-      var row = new ProfileCodeTrieNodeTreeRow(profile, root, childNode, this);
-      children.add(row);
-    }
+  void _buildTooltip(DivElement memberList, Map<String, String> items) {
+    items.forEach((k, v) {
+      var item = new DivElement();
+      item.classes.add('memberItem');
+      var name = new DivElement();
+      name.classes.add('memberName');
+      name.classes.add('white');
+      name.text = k;
+      var value = new DivElement();
+      value.classes.add('memberValue');
+      value.classes.add('white');
+      value.text = v;
+      item.children.add(name);
+      item.children.add(value);
+      memberList.children.add(item);
+    });
   }
 
-  void onHide() {
+  void onShow() {
+    super.onShow();
+    if (children.length == 0) {
+      var threshold = profile['threshold'];
+      for (var childNode in node.children) {
+        if (!shouldDisplayChild(childNode, threshold)) {
+          continue;
+        }
+        var row =
+            new ProfileCodeTrieNodeTreeRow(profile, root, childNode, tree, this);
+        children.add(row);
+      }
+    }
+    var row = tr;
+
+    var methodCell = tableColumns[0];
+    // Enable expansion by clicking anywhere on the method column.
+    methodCell.onClick.listen(onClick);
+
+    // Insert the parent percentage
+    var parentPercent = new DivElement();
+    parentPercent.style.position = 'relative';
+    parentPercent.style.display = 'inline';
+    parentPercent.text = tipParent;
+    methodCell.children.add(parentPercent);
+
+    var codeRef = new Element.tag('code-ref');
+    codeRef.ref = code;
+    methodCell.children.add(codeRef);
+
+    var selfCell = tableColumns[1];
+    selfCell.style.position = 'relative';
+    selfCell.text = tipExclusive;
+
+    var tooltipDiv = new DivElement();
+    tooltipDiv.classes.add('tooltip');
+
+    var memberListDiv = new DivElement();
+    memberListDiv.classes.add('memberList');
+    tooltipDiv.children.add(memberListDiv);
+    _buildTooltip(memberListDiv, {
+      'Kind' : tipKind,
+      'Percent of Parent' : tipParent,
+      'Sample Count' : tipTicks,
+      'Approximate Execution Time': tipTime,
+    });
+    selfCell.children.add(tooltipDiv);
   }
 
   bool hasChildren() {
@@ -87,10 +136,10 @@
   }
 }
 
-/// Displays an IsolateProfile
-@CustomTag('isolate-profile')
-class IsolateProfileElement extends ObservatoryElement {
-  IsolateProfileElement.created() : super.created();
+/// Displays a CpuProfile
+@CustomTag('cpu-profile')
+class CpuProfileElement extends ObservatoryElement {
+  CpuProfileElement.created() : super.created();
   @published ServiceMap profile;
   @observable bool hideTagsChecked;
   @observable String sampleCount = '';
@@ -130,7 +179,9 @@
   @override
   void attached() {
     super.attached();
-    tree = new TableTree();
+    var tableBody = shadowRoot.querySelector('#tableTreeBody');
+    assert(tableBody != null);
+    tree = new TableTree(tableBody, 2);
     _update();
   }
 
@@ -161,13 +212,15 @@
     }
     try {
       tree.initialize(
-          new ProfileCodeTrieNodeTreeRow(profile, root, root, null));
+          new ProfileCodeTrieNodeTreeRow(profile, root, root, tree, null));
     } catch (e, stackTrace) {
+      print(e);
+      print(stackTrace);
       Logger.root.warning('_buildStackTree', e, stackTrace);
     }
     // Check if we only have one node at the root and expand it.
     if (tree.rows.length == 1) {
-      tree.toggle(0);
+      tree.toggle(tree.rows[0]);
     }
     notifyPropertyChange(#tree, null, tree);
   }
@@ -175,36 +228,4 @@
   void _buildTree() {
     _buildStackTree();
   }
-
-  @observable String padding(TableTreeRow row) {
-    return 'padding-left: ${row.depth * 16}px;';
-  }
-
-  @observable String coloring(TableTreeRow row) {
-    const colors = const ['rowColor0', 'rowColor1', 'rowColor2', 'rowColor3',
-                          'rowColor4', 'rowColor5', 'rowColor6', 'rowColor7',
-                          'rowColor8'];
-    var index = (row.depth - 1) % colors.length;
-    return colors[index];
-  }
-
-  @observable void toggleExpanded(Event e, var detail, Element target) {
-    // We only want to expand a tree row if the target of the click is
-    // the table cell (passed in as target) or the span containing the
-    // expander symbol (#expand).
-    var eventTarget = e.target;
-    if ((eventTarget.id != 'expand') && (e.target != target)) {
-      // Target of click was not the expander span or the table cell.
-      return;
-    }
-    var row = target.parent;
-    if (row is TableRowElement) {
-      // Subtract 1 to get 0 based indexing.
-      try {
-        tree.toggle(row.rowIndex - 1);
-      }  catch (e, stackTrace) {
-        Logger.root.warning('toggleExpanded', e, stackTrace);
-      }
-    }
-  }
 }
diff --git a/runtime/observatory/lib/src/elements/isolate_profile.html b/runtime/observatory/lib/src/elements/cpu_profile.html
similarity index 71%
rename from runtime/observatory/lib/src/elements/isolate_profile.html
rename to runtime/observatory/lib/src/elements/cpu_profile.html
index f7fb0b1..7955cc1 100644
--- a/runtime/observatory/lib/src/elements/isolate_profile.html
+++ b/runtime/observatory/lib/src/elements/cpu_profile.html
@@ -5,7 +5,7 @@
 <link rel="import" href="observatory_element.html">
 <link rel="import" href="sliding_checkbox.html">
 
-<polymer-element name="isolate-profile" extends="observatory-element">
+<polymer-element name="cpu-profile" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
@@ -142,51 +142,17 @@
       </div>
       <hr>
       <table id="tableTree" class="table">
-        <thead>
+        <thead id="tableTreeheader">
           <tr>
             <th>Method</th>
             <th>Self</th>
           </tr>
         </thead>
-        <tbody>
-          <tr template repeat="{{row in tree.rows }}" style="{{}}">
-            <td on-click="{{toggleExpanded}}"
-                class="{{ coloring(row) }}"
-                style="{{ padding(row) }}">
-              <span id="expand" style="{{ row.expanderStyle }}">{{ row.expander }}</span>
-              <div style="position: relative;display: inline">
-                {{row.columns[0]}}
-              </div>
-              <code-ref ref="{{ row.code }}"></code-ref>
-            </td>
-            <td class="{{ coloring(row) }}" style="position: relative">
-              {{row.columns[1]}}
-              <div class="tooltip">
-                <div class="memberList">
-                  <div class="memberItem">
-                   <div class="memberName white">Kind</div>
-                   <div class="memberValue white">{{ row.tipKind }}</div>
-                  </div>
-                  <div class="memberItem">
-                   <div class="memberName white">Percent of Parent</div>
-                   <div class="memberValue white">{{ row.tipParent }}</div>
-                  </div>
-                  <div class="memberItem">
-                   <div class="memberName white">Sample Count</div>
-                   <div class="memberValue white">{{ row.tipTicks }} ({{ row.tipExclusive }})</div>
-                  </div>
-                  <div class="memberItem">
-                   <div class="memberName white">Approximate Execution Time</div>
-                   <div class="memberValue white">{{ row.tipTime }}</div>
-                  </div>
-                </div>
-              </div>
-            </td>
-          </tr>
+        <tbody id="tableTreeBody">
         </tbody>
       </table>
     </div>
   </template>
 </polymer-element>
 
-<script type="application/dart" src="isolate_profile.dart"></script>
+<script type="application/dart" src="cpu_profile.dart"></script>
diff --git a/runtime/observatory/lib/src/elements/heap_profile.dart b/runtime/observatory/lib/src/elements/heap_profile.dart
index 1171fb6..a0adf9e 100644
--- a/runtime/observatory/lib/src/elements/heap_profile.dart
+++ b/runtime/observatory/lib/src/elements/heap_profile.dart
@@ -99,7 +99,7 @@
 
   @override
   void detached() {
-    _subscription.cancel((){});
+    _subscription.cancel();
     super.detached();
   }
   
diff --git a/runtime/observatory/lib/src/elements/observatory_element.dart b/runtime/observatory/lib/src/elements/observatory_element.dart
index 43a4b5b..b31ac94 100644
--- a/runtime/observatory/lib/src/elements/observatory_element.dart
+++ b/runtime/observatory/lib/src/elements/observatory_element.dart
@@ -88,6 +88,7 @@
   /// within the application using the [LocationManager].
   void goto(MouseEvent event, var detail, Element target) {
     app.locationManager.onGoto(event, detail, target);
+    event.stopPropagation();
   }
 
   /// Create a link that can be consumed by [goto].
diff --git a/runtime/observatory/lib/src/elements/service_view.dart b/runtime/observatory/lib/src/elements/service_view.dart
index 161758e..98ed51c 100644
--- a/runtime/observatory/lib/src/elements/service_view.dart
+++ b/runtime/observatory/lib/src/elements/service_view.dart
@@ -121,7 +121,7 @@
         element.process = object;
         return element;
       case 'Profile':
-        IsolateProfileElement element = new Element.tag('isolate-profile');
+        CpuProfileElement element = new Element.tag('cpu-profile');
         element.profile = object;
         return element;
       case 'RandomAccessFileList':
diff --git a/runtime/observatory/lib/src/elements/service_view.html b/runtime/observatory/lib/src/elements/service_view.html
index 8d385d4..02a3ff8 100644
--- a/runtime/observatory/lib/src/elements/service_view.html
+++ b/runtime/observatory/lib/src/elements/service_view.html
@@ -3,13 +3,13 @@
 <link rel="import" href="class_view.html">
 <link rel="import" href="code_view.html">
 <link rel="import" href="context_view.html">
+<link rel="import" href="cpu_profile.html">
 <link rel="import" href="error_view.html">
 <link rel="import" href="field_view.html">
 <link rel="import" href="function_view.html">
 <link rel="import" href="heap_map.html">
 <link rel="import" href="heap_profile.html">
 <link rel="import" href="instance_view.html">
-<link rel="import" href="isolate_profile.html">
 <link rel="import" href="library_view.html">
 <link rel="import" href="observatory_element.html">
 <link rel="import" href="script_view.html">
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index 3c8f3b7..4a0842d 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -693,6 +693,32 @@
   }
 }
 
+class HeapSnapshot {
+  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)) {
+      var address = v.addressForWordSize(isolate.vm.architectureBits ~/ 8);
+      result.add(isolate.get(
+          'address/${address.toRadixString(16)}?ref=true').then((obj) {
+        obj.retainedSize = v.retainedSize;
+        return new Future(() => obj);
+      }));
+    }
+    return result;
+  }
+  
+  
+}
+
 /// State for a running isolate.
 class Isolate extends ServiceObjectOwner with Coverage {
   @reflectable VM get vm => owner;
@@ -854,6 +880,21 @@
   @observable String fileAndLine;
 
   @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');
+      _snapshotFetch = new Completer<HeapSnapshot>();
+    }
+    return _snapshotFetch.future;
+  }
 
   void updateHeapsFromMap(ObservableMap map) {
     newSpace.update(map['new']);
@@ -1541,6 +1582,7 @@
 class Instance extends ServiceObject {
   @observable Class clazz;
   @observable int size;
+  @observable int retainedSize;
   @observable String valueAsString;  // If primitive.
   @observable bool valueAsStringIsTruncated;
   @observable ServiceFunction closureFunc;  // If a closure.
diff --git a/runtime/observatory/observatory.gypi b/runtime/observatory/observatory.gypi
index 426920d..7cc201d 100644
--- a/runtime/observatory/observatory.gypi
+++ b/runtime/observatory/observatory.gypi
@@ -42,6 +42,8 @@
       'dependencies': [
         'dart_bootstrap#host',
         'fetch_observatory_deps#host',
+        # We use packages for building
+        '../pkg/pkg.gyp:pkg_packages#target',
       ],
       'toolsets': ['host'],
       'sources': [
@@ -78,6 +80,8 @@
         'lib/src/elements/context_ref.html',
         'lib/src/elements/context_view.dart',
         'lib/src/elements/context_view.html',
+        'lib/src/elements/cpu_profile.dart',
+        'lib/src/elements/cpu_profile.html',
         'lib/src/elements/curly_block.dart',
         'lib/src/elements/curly_block.html',
         'lib/src/elements/debugger.dart',
@@ -112,8 +116,6 @@
         'lib/src/elements/instance_view.html',
         'lib/src/elements/io_view.dart',
         'lib/src/elements/io_view.html',
-        'lib/src/elements/isolate_profile.dart',
-        'lib/src/elements/isolate_profile.html',
         'lib/src/elements/isolate_ref.dart',
         'lib/src/elements/isolate_ref.html',
         'lib/src/elements/isolate_summary.dart',
@@ -175,6 +177,7 @@
           'action_name': 'pub_build_observatory',
           'inputs': [
             '../../tools/observatory_tool.py',
+            '<(SHARED_INTERMEDIATE_DIR)/packages.stamp',
             '<@(_sources)',
           ],
           'outputs': [
@@ -222,4 +225,4 @@
       ],
     },
   ],
-}
\ No newline at end of file
+}
diff --git a/runtime/platform/assert.h b/runtime/platform/assert.h
index f1b2547..7aee9c3 100644
--- a/runtime/platform/assert.h
+++ b/runtime/platform/assert.h
@@ -65,10 +65,10 @@
 
   template<typename E, typename A>
   void GreaterEqual(const E& left, const A& right);
+#endif
 
   template<typename T>
-  void NotNull(const T p);
-#endif
+  T NotNull(const T p);
 
  private:
   const char* const file_;
@@ -215,14 +215,15 @@
   std::string es = ess.str(), as = ass.str();
   Fail("expected: %s >= %s", es.c_str(), as.c_str());
 }
+#endif
 
 
 template<typename T>
-void DynamicAssertionHelper::NotNull(const T p) {
-  if (p != NULL) return;
+T DynamicAssertionHelper::NotNull(const T p) {
+  if (p != NULL) return p;
   Fail("expected: not NULL, found NULL");
+  return NULL;
 }
-#endif
 
 }  // namespace dart
 
@@ -258,6 +259,11 @@
 // mode.
 #define DEBUG_ASSERT(cond) ASSERT(cond)
 
+// Returns 'ptr'; useful for initializer lists:
+//   class Foo { Foo(int* ptr) : ptr_(ASSERT_NOTNULL(ptr)) ...
+#define ASSERT_NOTNULL(ptr)                                                    \
+  dart::Assert(__FILE__, __LINE__).NotNull((ptr))
+
 #else  // if defined(DEBUG)
 
 // In order to avoid variable unused warnings for code that only uses
@@ -267,6 +273,8 @@
 
 #define DEBUG_ASSERT(cond)
 
+#define ASSERT_NOTNULL(ptr) (ptr)
+
 #endif  // if defined(DEBUG)
 
 
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 01ab6c1..d2d66d6 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -75,7 +75,6 @@
 
 [ $arch == mips ]
 cc/StaticNonNullSumCallCodegen: Crash, Pass # Issue 17440
-cc/Sdc1Ldc1: Crash # Issue 20182
 cc/JSON_JSONStream_Options: Crash, Pass # Issue 19328
 
 [ $arch == mips && $mode == debug ]
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc
index adc9505..c060bbf 100644
--- a/runtime/vm/assembler_ia32.cc
+++ b/runtime/vm/assembler_ia32.cc
@@ -1457,6 +1457,15 @@
 }
 
 
+void Assembler::testb(const Address& address, const Immediate& imm) {
+  ASSERT(imm.is_int8());
+  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  EmitUint8(0xF6);
+  EmitOperand(0, address);
+  EmitUint8(imm.value() & 0xFF);
+}
+
+
 void Assembler::andl(Register dst, Register src) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0x23);
@@ -2212,7 +2221,21 @@
 }
 
 
-void Assembler::VerifyHeapWord(const Address& address) {
+void Assembler::VerifyHeapWord(const Address& address,
+                               FieldContent old_content) {
+#if defined(DEBUG)
+  switch (old_content) {
+    case kEmptyOrSmiOrNull:
+      VerifyUninitialized(address);
+      break;
+    case kHeapObjectOrSmi:
+      VerifyObjectOrSmi(address);
+      break;
+    case kOnlySmi:
+      VerifySmi(address);
+      break;
+  }
+#endif  // DEBUG
   if (VerifiedMemory::enabled()) {
     Register addr_reg = EDX;
     Register value = EBX;
@@ -2233,8 +2256,10 @@
 }
 
 
-void Assembler::VerifiedWrite(const Address& dest, Register value) {
-  VerifyHeapWord(dest);
+void Assembler::VerifiedWrite(const Address& dest,
+                              Register value,
+                              FieldContent old_content) {
+  VerifyHeapWord(dest, old_content);
   movl(dest, value);
   if (VerifiedMemory::enabled()) {
     Register temp = (value == EDX) ? ECX : EDX;
@@ -2246,13 +2271,55 @@
 }
 
 
+#if defined(DEBUG)
+void Assembler::VerifyObjectOrSmi(const Address& dest) {
+  Label ok;
+  testb(dest, Immediate(kHeapObjectTag));
+  j(ZERO, &ok, Assembler::kNearJump);
+  // Non-smi case: Verify object pointer is word-aligned when untagged.
+  COMPILE_ASSERT(kHeapObjectTag == 1);
+  testb(dest, Immediate((kWordSize - 1) - kHeapObjectTag));
+  j(ZERO, &ok, Assembler::kNearJump);
+  Stop("Expected heap object or Smi");
+  Bind(&ok);
+}
+
+
+void Assembler::VerifyUninitialized(const Address& dest) {
+  Label ok;
+  testb(dest, Immediate(kHeapObjectTag));
+  j(ZERO, &ok, Assembler::kNearJump);
+  // Non-smi case: Check for the special zap word or null.
+#if defined(DEBUG)
+  cmpl(dest, Immediate(Heap::kZap32Bits));
+  j(EQUAL, &ok, Assembler::kNearJump);
+#else
+#error Only supported in DEBUG mode
+#endif
+  cmpl(dest, Immediate(reinterpret_cast<uint32_t>(Object::null())));
+  j(EQUAL, &ok, Assembler::kNearJump);
+  Stop("Expected zapped, Smi or null");
+  Bind(&ok);
+}
+
+
+void Assembler::VerifySmi(const Address& dest, const char* stop_msg) {
+  Label done;
+  testb(dest, Immediate(kHeapObjectTag));
+  j(ZERO, &done, Assembler::kNearJump);
+  Stop(stop_msg);
+  Bind(&done);
+}
+#endif  // defined(DEBUG)
+
+
 // Destroys the value register.
 void Assembler::StoreIntoObject(Register object,
                                 const Address& dest,
                                 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);
@@ -2277,8 +2344,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;
   pushl(value);
@@ -2304,8 +2372,9 @@
 
 void Assembler::StoreIntoObjectNoBarrier(Register object,
                                          const Address& dest,
-                                         const Object& value) {
-  VerifyHeapWord(dest);
+                                         const Object& value,
+                                         FieldContent old_content) {
+  VerifyHeapWord(dest, old_content);
   if (value.IsSmi() || value.InVMHeap()) {
     Immediate imm_value(reinterpret_cast<int32_t>(value.raw()));
     movl(dest, imm_value);
@@ -2331,20 +2400,19 @@
 
 
 void Assembler::StoreIntoSmiField(const Address& dest, Register value) {
-  VerifiedWrite(dest, value);
 #if defined(DEBUG)
   Label done;
   testl(value, Immediate(kHeapObjectTag));
   j(ZERO, &done);
-  Stop("Smi expected");
+  Stop("New value must be Smi.");
   Bind(&done);
 #endif  // defined(DEBUG)
+  VerifiedWrite(dest, value, kOnlySmi);
 }
 
 
-void Assembler::ZeroSmiField(const Address& dest) {
-  // TODO(koda): Add VerifySmi once we distinguish initalization.
-  VerifyHeapWord(dest);
+void Assembler::ZeroInitSmiField(const Address& dest) {
+  VerifyHeapWord(dest, kEmptyOrSmiOrNull);
   Immediate zero(Smi::RawValue(0));
   movl(dest, zero);
   if (VerifiedMemory::enabled()) {
@@ -2360,8 +2428,7 @@
 void Assembler::IncrementSmiField(const Address& dest, int32_t increment) {
   // Note: FlowGraphCompiler::EdgeCounterIncrementSizeInBytes depends on
   // the length of this instruction sequence.
-  // TODO(koda): Add VerifySmi once we distinguish initalization.
-  VerifyHeapWord(dest);
+  VerifyHeapWord(dest, kOnlySmi);
   Immediate inc_imm(Smi::RawValue(increment));
   addl(dest, inc_imm);
   if (VerifiedMemory::enabled()) {
diff --git a/runtime/vm/assembler_ia32.h b/runtime/vm/assembler_ia32.h
index 23ea4a2..a0d03de 100644
--- a/runtime/vm/assembler_ia32.h
+++ b/runtime/vm/assembler_ia32.h
@@ -536,6 +536,7 @@
 
   void testl(Register reg1, Register reg2);
   void testl(Register reg, const Immediate& imm);
+  void testb(const Address& address, const Immediate& imm);
 
   void andl(Register dst, const Immediate& imm);
   void andl(Register dst, Register src);
@@ -668,6 +669,14 @@
   void CompareObject(Register reg, const Object& object);
   void LoadDoubleConstant(XmmRegister dst, double value);
 
+  // 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.
@@ -675,14 +684,26 @@
 
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
-                                Register value);
+                                Register value,
+                                FieldContent old_content = kHeapObjectOrSmi);
+  void InitializeFieldNoBarrier(Register object,
+                                const Address& dest,
+                                Register value) {
+    return StoreIntoObjectNoBarrier(object, dest, value, kEmptyOrSmiOrNull);
+  }
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
-                                const Object& value);
+                                const Object& value,
+                                FieldContent old_content = kHeapObjectOrSmi);
+  void InitializeFieldNoBarrier(Register object,
+                                const Address& dest,
+                                const Object& value) {
+    return StoreIntoObjectNoBarrier(object, dest, value, kEmptyOrSmiOrNull);
+  }
 
   // Stores a Smi value into a heap object field that always contains a Smi.
   void StoreIntoSmiField(const Address& dest, Register value);
-  void ZeroSmiField(const Address& dest);
+  void ZeroInitSmiField(const Address& dest);
   // Increments a Smi field. Leaves flags in same state as an 'addl'.
   void IncrementSmiField(const Address& dest, int32_t increment);
 
@@ -945,11 +966,17 @@
   void StoreIntoObjectFilterNoSmi(Register object,
                                   Register value,
                                   Label* no_update);
-
-  // Analogous to VerifiedMemory::Verify(address, kWordSize).
-  void VerifyHeapWord(const Address& address);
-  // Analogous to VerifiedMemory::Write.
-  void VerifiedWrite(const Address& dest, Register value);
+#if defined(DEBUG)
+  void VerifyUninitialized(const Address& address);
+  void VerifyObjectOrSmi(const Address& address);
+  void VerifySmi(const Address& address, const char* stop_msg = "Expected Smi");
+#endif  // DEBUG
+  // Like VerifiedMemory::Verify(address, kWordSize) and ::Write, but also,
+  // in DEBUG mode, verifies that 'address' has content of type 'old_content'.
+  void VerifyHeapWord(const Address& address, FieldContent old_content);
+  void VerifiedWrite(const Address& dest,
+                     Register value,
+                     FieldContent old_content);
   void UnverifiedStoreOldObject(const Address& dest, const Object& value);
 
   int32_t jit_cookie();
diff --git a/runtime/vm/assembler_ia32_test.cc b/runtime/vm/assembler_ia32_test.cc
index b260e17..6492625 100644
--- a/runtime/vm/assembler_ia32_test.cc
+++ b/runtime/vm/assembler_ia32_test.cc
@@ -198,6 +198,27 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(Testb, assembler) {
+  __ movl(EAX, Immediate(1));
+  __ movl(ECX, Immediate(0));
+  __ pushl(Immediate(0xffffff11));
+  __ testb(Address(ESP, 0), Immediate(0x10));
+  // Fail if zero flag set.
+  __ cmove(EAX, ECX);
+  __ testb(Address(ESP, 0), Immediate(0x20));
+  // Fail if zero flag not set.
+  __ cmovne(EAX, ECX);
+  __ popl(ECX);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Testb, test) {
+  typedef int (*TestbCode)();
+  EXPECT_EQ(1, reinterpret_cast<TestbCode>(test->entry())());
+}
+
+
 ASSEMBLER_TEST_GENERATE(Increment, assembler) {
   __ movl(EAX, Immediate(0));
   __ pushl(EAX);
diff --git a/runtime/vm/assembler_mips_test.cc b/runtime/vm/assembler_mips_test.cc
index b49b806..d382503 100644
--- a/runtime/vm/assembler_mips_test.cc
+++ b/runtime/vm/assembler_mips_test.cc
@@ -1640,12 +1640,13 @@
 
 
 ASSEMBLER_TEST_GENERATE(Sdc1Ldc1, assembler) {
-  __ AddImmediate(SP, -8 * kWordSize);
-  __ LoadImmediate(T1, ~(8 - 1));
-  __ and_(T0, SP, T1);  // Need 8 byte alignment.
+  __ mov(T0, SP);
+  __ AddImmediate(SP, -3 * kWordSize);
+  __ AndImmediate(SP, SP, ~(8 - 1));  // Align SP by 8 bytes.
   __ LoadImmediate(D1, 1.0);
-  __ sdc1(D1, Address(T0));
-  __ ldc1(D0, Address(T0));
+  __ sdc1(D1, Address(SP));
+  __ ldc1(D0, Address(SP));
+  __ mov(SP, T0);
   __ Ret();
 }
 
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index f9b1aec..169db47 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -151,8 +151,9 @@
 void Assembler::CallPatchable(const ExternalLabel* label) {
   ASSERT(allow_constant_pool());
   intptr_t call_start = buffer_.GetPosition();
-  LoadExternalLabel(TMP, label, kPatchable, PP);
-  call(TMP);
+  const int32_t offset =
+      Array::element_offset(FindExternalLabel(label, kPatchable));
+  call(Address::AddressBaseImm32(PP, offset - kHeapObjectTag));
   ASSERT((buffer_.GetPosition() - call_start) == kCallExternalLabelSize);
 }
 
@@ -161,8 +162,9 @@
   if (Isolate::Current() == Dart::vm_isolate()) {
     call(label);
   } else {
-    LoadExternalLabel(TMP, label, kNotPatchable, pp);
-    call(TMP);
+    const int32_t offset =
+        Array::element_offset(FindExternalLabel(label, kNotPatchable));
+    call(Address::AddressBaseImm32(pp, offset - kHeapObjectTag));
   }
 }
 
@@ -1599,6 +1601,16 @@
 }
 
 
+void Assembler::testb(const Address& address, const Immediate& imm) {
+  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  EmitOperandREX(0, address, REX_NONE);
+  EmitUint8(0xF6);
+  EmitOperand(0, address);
+  ASSERT(imm.is_int8());
+  EmitUint8(imm.value() & 0xFF);
+}
+
+
 void Assembler::testq(Register reg1, Register reg2) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   Operand operand(reg2);
@@ -2590,7 +2602,7 @@
   intptr_t call_start = buffer_.GetPosition();
   LoadExternalLabel(TMP, label, kPatchable, pp);
   jmp(TMP);
-  ASSERT((buffer_.GetPosition() - call_start) == kCallExternalLabelSize);
+  ASSERT((buffer_.GetPosition() - call_start) == kJmpExternalLabelSize);
 }
 
 
@@ -2740,11 +2752,11 @@
 }
 
 
-void Assembler::Drop(intptr_t stack_elements) {
+void Assembler::Drop(intptr_t stack_elements, Register tmp) {
   ASSERT(stack_elements >= 0);
   if (stack_elements <= 4) {
     for (intptr_t i = 0; i < stack_elements; i++) {
-      popq(TMP);
+      popq(tmp);
     }
     return;
   }
@@ -2987,7 +2999,21 @@
 }
 
 
-void Assembler::VerifyHeapWord(const Address& address) {
+void Assembler::VerifyHeapWord(const Address& address,
+                               FieldContent old_content) {
+#if defined(DEBUG)
+  switch (old_content) {
+    case kEmptyOrSmiOrNull:
+      VerifyUninitialized(address);
+      break;
+    case kHeapObjectOrSmi:
+      VerifyObjectOrSmi(address);
+      break;
+    case kOnlySmi:
+      VerifySmi(address);
+      break;
+  }
+#endif  // DEBUG
   if (VerifiedMemory::enabled()) {
     Register addr_reg = RDX;
     Register value = RBX;
@@ -3009,8 +3035,10 @@
 }
 
 
-void Assembler::VerifiedWrite(const Address& dest, Register value) {
-  VerifyHeapWord(dest);
+void Assembler::VerifiedWrite(const Address& dest,
+                              Register value,
+                              FieldContent old_content) {
+  VerifyHeapWord(dest, old_content);
   movq(dest, value);
   if (VerifiedMemory::enabled()) {
     Register temp = (value == RDX) ? RCX : RDX;
@@ -3022,12 +3050,57 @@
 }
 
 
+#if defined(DEBUG)
+void Assembler::VerifyObjectOrSmi(const Address& dest) {
+  Label ok;
+  testb(dest, Immediate(kHeapObjectTag));
+  j(ZERO, &ok, Assembler::kNearJump);
+  // Non-smi case: Verify object pointer is word-aligned when untagged.
+  COMPILE_ASSERT(kHeapObjectTag == 1);
+  testb(dest, Immediate((kWordSize - 1) - kHeapObjectTag));
+  j(ZERO, &ok, Assembler::kNearJump);
+  static const bool kFixedLengthEncoding = true;
+  Stop("Expected heap object or Smi", kFixedLengthEncoding);
+  Bind(&ok);
+}
+
+
+void Assembler::VerifyUninitialized(const Address& dest) {
+  Label ok;
+  testb(dest, Immediate(kHeapObjectTag));
+  j(ZERO, &ok, Assembler::kNearJump);
+  // Non-smi case: Check for the special zap word or null.
+#if defined(DEBUG)
+  cmpq(dest, Immediate(Heap::kZap64Bits));
+  j(EQUAL, &ok, Assembler::kNearJump);
+#else
+#error Only supported in DEBUG mode
+#endif
+  cmpq(dest, Immediate(reinterpret_cast<uint64_t>(Object::null())));
+  j(EQUAL, &ok, Assembler::kNearJump);
+  static const bool kFixedLengthEncoding = true;
+  Stop("Expected zapped, Smi or null", kFixedLengthEncoding);
+  Bind(&ok);
+}
+
+
+void Assembler::VerifySmi(const Address& dest, const char* stop_msg) {
+  Label done;
+  testb(dest, Immediate(kHeapObjectTag));
+  j(ZERO, &done, Assembler::kNearJump);
+  static const bool kFixedLengthEncoding = true;
+  Stop(stop_msg, kFixedLengthEncoding);
+  Bind(&done);
+}
+#endif  // defined(DEBUG)
+
+
 void Assembler::StoreIntoObject(Register object,
                                 const Address& dest,
                                 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);
@@ -3048,8 +3121,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;
   pushq(value);
@@ -3065,9 +3139,10 @@
 void Assembler::StoreIntoObjectNoBarrier(Register object,
                                          const Address& dest,
                                          const Object& value,
-                                         Register pp) {
+                                         Register pp,
+                                         FieldContent old_content) {
+  VerifyHeapWord(dest, old_content);
   if (VerifiedMemory::enabled()) {
-    VerifyHeapWord(dest);
     Register temp = (pp == RCX) ? RDX : RCX;
     pushq(temp);
     leaq(temp, dest);
@@ -3082,20 +3157,20 @@
 
 
 void Assembler::StoreIntoSmiField(const Address& dest, Register value) {
-  VerifiedWrite(dest, value);
 #if defined(DEBUG)
   Label done;
   testq(value, Immediate(kHeapObjectTag));
   j(ZERO, &done);
-  Stop("Smi expected");
+  Stop("New value must be Smi.");
   Bind(&done);
 #endif  // defined(DEBUG)
+  VerifiedWrite(dest, value, kOnlySmi);
 }
 
 
-void Assembler::ZeroSmiField(const Address& dest) {
+void Assembler::ZeroInitSmiField(const Address& dest) {
   // TODO(koda): Add VerifySmi once we distinguish initalization.
-  VerifyHeapWord(dest);
+  VerifyHeapWord(dest, kEmptyOrSmiOrNull);
   Immediate zero(Smi::RawValue(0));
   movq(dest, zero);
   if (VerifiedMemory::enabled()) {
@@ -3112,7 +3187,7 @@
   // Note: FlowGraphCompiler::EdgeCounterIncrementSizeInBytes depends on
   // the length of this instruction sequence.
   // TODO(koda): Add VerifySmi once we distinguish initalization.
-  VerifyHeapWord(dest);
+  VerifyHeapWord(dest, kOnlySmi);
   Immediate inc_imm(Smi::RawValue(increment));
   addq(dest, inc_imm);
   if (VerifiedMemory::enabled()) {
diff --git a/runtime/vm/assembler_x64.h b/runtime/vm/assembler_x64.h
index c902b0d..580a248 100644
--- a/runtime/vm/assembler_x64.h
+++ b/runtime/vm/assembler_x64.h
@@ -352,7 +352,8 @@
   void call(Label* label);
   void call(const ExternalLabel* label);
 
-  static const intptr_t kCallExternalLabelSize = 10;
+  static const intptr_t kCallExternalLabelSize = 7;
+  static const intptr_t kJmpExternalLabelSize = 10;
 
   void pushq(Register reg);
   void pushq(const Address& address);
@@ -516,6 +517,7 @@
 
   void testl(Register reg1, Register reg2);
   void testl(Register reg, const Immediate& imm);
+  void testb(const Address& address, const Immediate& imm);
 
   void testq(Register reg1, Register reg2);
   void testq(Register reg, const Immediate& imm);
@@ -726,7 +728,7 @@
   void SubImmediate(Register reg, const Immediate& imm, Register pp);
   void SubImmediate(const Address& address, const Immediate& imm, Register pp);
 
-  void Drop(intptr_t stack_elements);
+  void Drop(intptr_t stack_elements, Register tmp = TMP);
 
   enum Patchability {
     kPatchable,
@@ -755,6 +757,14 @@
   void PushObject(const Object& object, Register pp);
   void CompareObject(Register reg, const Object& object, Register pp);
 
+  // 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,
+  };
+
   // Destroys value.
   void StoreIntoObject(Register object,  // Object we are storing into.
                        const Address& dest,  // Where we are storing into.
@@ -763,15 +773,28 @@
 
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
-                                Register value);
+                                Register value,
+                                FieldContent old_content = kHeapObjectOrSmi);
+  void InitializeFieldNoBarrier(Register object,
+                                const Address& dest,
+                                Register value) {
+    return StoreIntoObjectNoBarrier(object, dest, value, kEmptyOrSmiOrNull);
+  }
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
                                 const Object& value,
-                                Register pp);
+                                Register pp,
+                                FieldContent old_content = kHeapObjectOrSmi);
+  void InitializeFieldNoBarrier(Register object,
+                                const Address& dest,
+                                const Object& value,
+                                Register pp) {
+    return StoreIntoObjectNoBarrier(object, dest, value, pp, kEmptyOrSmiOrNull);
+  }
 
   // Stores a Smi value into a heap object field that always contains a Smi.
   void StoreIntoSmiField(const Address& dest, Register value);
-  void ZeroSmiField(const Address& dest);
+  void ZeroInitSmiField(const Address& dest);
   // Increments a Smi field. Leaves flags in same state as an 'addq'.
   void IncrementSmiField(const Address& dest, int64_t increment);
 
@@ -1109,11 +1132,17 @@
   void StoreIntoObjectFilterNoSmi(Register object,
                                   Register value,
                                   Label* no_update);
-
-  // Analogous to VerifiedMemory::Verify(address, kWordSize).
-  void VerifyHeapWord(const Address& address);
-  // Analogous to VerifiedMemory::Write.
-  void VerifiedWrite(const Address& dest, Register value);
+#if defined(DEBUG)
+  void VerifyUninitialized(const Address& address);
+  void VerifyObjectOrSmi(const Address& address);
+  void VerifySmi(const Address& address, const char* stop_msg = "Expected Smi");
+#endif  // DEBUG
+  // Like VerifiedMemory::Verify(address, kWordSize) and ::Write, but also,
+  // in DEBUG mode, verifies that 'address' has content of type 'old_content'.
+  void VerifyHeapWord(const Address& address, FieldContent old_content);
+  void VerifiedWrite(const Address& dest,
+                     Register value,
+                     FieldContent old_content);
   // Unaware of write barrier (use StoreInto* methods for storing to objects).
   void MoveImmediate(const Address& dst, const Immediate& imm, Register pp);
 
diff --git a/runtime/vm/assembler_x64_test.cc b/runtime/vm/assembler_x64_test.cc
index c2107ce..a62341e 100644
--- a/runtime/vm/assembler_x64_test.cc
+++ b/runtime/vm/assembler_x64_test.cc
@@ -297,6 +297,30 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(Testb, assembler) {
+  Label done;
+  __ movq(RAX, Immediate(1));
+  __ movq(RCX, Immediate(0));
+  __ pushq(Immediate(0xffffff11));
+  __ testb(Address(RSP, 0), Immediate(0x10));
+  // Fail if zero flag set.
+  __ cmoveq(RAX, RCX);
+  __ testb(Address(RSP, 0), Immediate(0x20));
+  // Fail if zero flag not set.
+  __ j(ZERO, &done);
+  __ movq(RAX, Immediate(0));
+  __ Bind(&done);
+  __ popq(RCX);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Testb, test) {
+  typedef int (*TestbCode)();
+  EXPECT_EQ(1, reinterpret_cast<TestbCode>(test->entry())());
+}
+
+
 ASSEMBLER_TEST_GENERATE(Increment, assembler) {
   __ movq(RAX, Immediate(0));
   __ pushq(RAX);
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index ccca86d..656c44c 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -529,7 +529,7 @@
   timer.Start();
   for (intptr_t i = 0; i < kLoopCount; i++) {
     StackZone zone(isolate);
-    MessageWriter writer(&buffer, &message_allocator);
+    MessageWriter writer(&buffer, &message_allocator, true);
     writer.WriteMessage(null_object);
     intptr_t buffer_len = writer.BytesWritten();
 
@@ -552,7 +552,7 @@
   timer.Start();
   for (intptr_t i = 0; i < kLoopCount; i++) {
     StackZone zone(isolate);
-    MessageWriter writer(&buffer, &message_allocator);
+    MessageWriter writer(&buffer, &message_allocator, true);
     writer.WriteMessage(smi_object);
     intptr_t buffer_len = writer.BytesWritten();
 
@@ -577,7 +577,7 @@
   timer.Start();
   for (intptr_t i = 0; i < kLoopCount; i++) {
     StackZone zone(isolate);
-    MessageWriter writer(&buffer, &malloc_allocator);
+    MessageWriter writer(&buffer, &malloc_allocator, true);
     writer.WriteMessage(array_object);
     intptr_t buffer_len = writer.BytesWritten();
 
diff --git a/runtime/vm/code_descriptors.h b/runtime/vm/code_descriptors.h
index ab854bf..e7daafb 100644
--- a/runtime/vm/code_descriptors.h
+++ b/runtime/vm/code_descriptors.h
@@ -135,7 +135,7 @@
     list_[try_index].pc_offset = pc_offset;
     ASSERT(handler_types.IsZoneHandle());
     list_[try_index].handler_types = &handler_types;
-    list_[try_index].needs_stacktrace = needs_stacktrace;
+    list_[try_index].needs_stacktrace |= needs_stacktrace;
   }
 
 
@@ -145,7 +145,10 @@
     if (try_index == CatchClauseNode::kInvalidTryIndex) {
       return;
     }
-    ASSERT((0 <= try_index) && (try_index < Length()));
+    ASSERT(try_index >= 0);
+    while (Length() <= try_index) {
+      AddPlaceHolder();
+    }
     list_[try_index].needs_stacktrace = true;
   }
 
diff --git a/runtime/vm/code_patcher.h b/runtime/vm/code_patcher.h
index 10ab117..4e2435f 100644
--- a/runtime/vm/code_patcher.h
+++ b/runtime/vm/code_patcher.h
@@ -82,11 +82,6 @@
                                                  const Code& code,
                                                  ICData* ic_data);
 
-  // Return the arguments descriptor array of the closure call
-  // before the given return address.
-  static RawArray* GetClosureArgDescAt(uword return_address,
-                                       const Code& code);
-
   static intptr_t InstanceCallSizeInBytes();
 
   static void InsertCallAt(uword start, uword target);
diff --git a/runtime/vm/code_patcher_arm.cc b/runtime/vm/code_patcher_arm.cc
index 92de85e..8cbe89c 100644
--- a/runtime/vm/code_patcher_arm.cc
+++ b/runtime/vm/code_patcher_arm.cc
@@ -13,14 +13,6 @@
 
 namespace dart {
 
-RawArray* CodePatcher::GetClosureArgDescAt(uword return_address,
-                                           const Code& code) {
-  ASSERT(code.ContainsInstructionAt(return_address));
-  CallPattern call(return_address, code);
-  return call.ClosureArgumentsDescriptor();
-}
-
-
 uword CodePatcher::GetStaticCallTargetAt(uword return_address,
                                          const Code& code) {
   ASSERT(code.ContainsInstructionAt(return_address));
diff --git a/runtime/vm/code_patcher_arm64.cc b/runtime/vm/code_patcher_arm64.cc
index c2a0138..fd29dc5 100644
--- a/runtime/vm/code_patcher_arm64.cc
+++ b/runtime/vm/code_patcher_arm64.cc
@@ -12,14 +12,6 @@
 
 namespace dart {
 
-RawArray* CodePatcher::GetClosureArgDescAt(uword return_address,
-                                           const Code& code) {
-  ASSERT(code.ContainsInstructionAt(return_address));
-  CallPattern call(return_address, code);
-  return call.ClosureArgumentsDescriptor();
-}
-
-
 uword CodePatcher::GetStaticCallTargetAt(uword return_address,
                                          const Code& code) {
   ASSERT(code.ContainsInstructionAt(return_address));
diff --git a/runtime/vm/code_patcher_ia32.cc b/runtime/vm/code_patcher_ia32.cc
index 48cf684..194aa02 100644
--- a/runtime/vm/code_patcher_ia32.cc
+++ b/runtime/vm/code_patcher_ia32.cc
@@ -150,51 +150,6 @@
 };
 
 
-// The expected pattern of a Dart closure call:
-//   mov EDX, arguments_descriptor_array
-//   call target_address
-//   <- return address
-class ClosureCall : public ValueObject {
- public:
-  explicit ClosureCall(uword return_address)
-      : start_(return_address - (kInstr1Size + kInstr2Size)) {
-    ASSERT(IsValid(return_address));
-    ASSERT(kInstr2Size == Assembler::kCallExternalLabelSize);
-  }
-
-  static bool IsValid(uword return_address) {
-    uint8_t* code_bytes = reinterpret_cast<uint8_t*>(
-        return_address - (kInstr1Size + kInstr2Size));
-    return (code_bytes[0] == 0xBA) && (code_bytes[kInstr1Size] == 0xE8);
-  }
-
-  RawArray* arguments_descriptor() const {
-    return *reinterpret_cast<RawArray**>(start_ + 1);
-  }
-
- private:
-  static const int kInstr1Size = 5;  // mov EDX, arguments descriptor array
-  static const int kInstr2Size = 5;  // call stub
-
-  uword return_address() const {
-    return start_ + kInstr1Size + kInstr2Size;
-  }
-  uword call_address() const { return start_; }
-
-  uword start_;
-  DISALLOW_IMPLICIT_CONSTRUCTORS(ClosureCall);
-};
-
-
-
-RawArray* CodePatcher::GetClosureArgDescAt(uword return_address,
-                                           const Code& code) {
-  ASSERT(code.ContainsInstructionAt(return_address));
-  ClosureCall call(return_address);
-  return call.arguments_descriptor();
-}
-
-
 uword CodePatcher::GetStaticCallTargetAt(uword return_address,
                                          const Code& code) {
   ASSERT(code.ContainsInstructionAt(return_address));
diff --git a/runtime/vm/code_patcher_mips.cc b/runtime/vm/code_patcher_mips.cc
index 13195e8..4b6ceca 100644
--- a/runtime/vm/code_patcher_mips.cc
+++ b/runtime/vm/code_patcher_mips.cc
@@ -12,14 +12,6 @@
 
 namespace dart {
 
-RawArray* CodePatcher::GetClosureArgDescAt(uword return_address,
-                                           const Code& code) {
-  ASSERT(code.ContainsInstructionAt(return_address));
-  CallPattern call(return_address, code);
-  return call.ClosureArgumentsDescriptor();
-}
-
-
 uword CodePatcher::GetStaticCallTargetAt(uword return_address,
                                          const Code& code) {
   ASSERT(code.ContainsInstructionAt(return_address));
diff --git a/runtime/vm/code_patcher_x64.cc b/runtime/vm/code_patcher_x64.cc
index a9bdf479..b4fa546 100644
--- a/runtime/vm/code_patcher_x64.cc
+++ b/runtime/vm/code_patcher_x64.cc
@@ -17,10 +17,9 @@
 namespace dart {
 
 // The expected pattern of a Dart unoptimized call (static and instance):
-//  00: 49 8b 9f imm32  mov RBX, [PP + off]
-//  07: 4d 8b 9f imm32  mov R11, [PP + off]
-//  14: 41 ff d3        call R11
-//  17 <- return address
+//   0: 49 8b 9f imm32  mov RBX, [PP + off]
+//   7: 41 ff 97 imm32  call [PP + off]
+//  14 <- return address
 class UnoptimizedCall : public ValueObject {
  public:
   UnoptimizedCall(uword return_address, const Code& code)
@@ -30,17 +29,15 @@
     ASSERT((kCallPatternSize - 7) == Assembler::kCallExternalLabelSize);
   }
 
-  static const int kCallPatternSize = 17;
+  static const int kCallPatternSize = 14;
 
   static bool IsValid(uword return_address) {
     uint8_t* code_bytes =
         reinterpret_cast<uint8_t*>(return_address - kCallPatternSize);
     return (code_bytes[0] == 0x49) && (code_bytes[1] == 0x8B) &&
            (code_bytes[2] == 0x9F) &&
-           (code_bytes[7] == 0x4D) && (code_bytes[8] == 0x8B) &&
-           (code_bytes[9] == 0x9F) &&
-           (code_bytes[14] == 0x41) && (code_bytes[15] == 0xFF) &&
-           (code_bytes[16] == 0xD3);
+           (code_bytes[7] == 0x41) && (code_bytes[8] == 0xFF) &&
+           (code_bytes[9] == 0x97);
   }
 
   RawObject* ic_data() const {
@@ -99,29 +96,53 @@
 };
 
 
-// The expected pattern of a dart static call:
-//  00 mov R10, arguments_descriptor_array (10 bytes) (optional in polym. calls)
-//  11: 4d 8b 9f imm32  mov R11, [PP + off]
-//  16: call R11  (3 bytes)
-//  <- return address
-class StaticCall : public ValueObject {
+// The expected pattern of a call where the target is loaded from
+// the object pool:
+//   0: 41 ff 97 imm32  call [PP + off]
+//   7: <- return address
+class PoolPointerCall : public ValueObject {
  public:
-  explicit StaticCall(uword return_address, const Code& code)
-      : start_(return_address - kCallPatternSize),
-        object_pool_(Array::Handle(code.ObjectPool())) {
+  explicit PoolPointerCall(uword return_address)
+      : start_(return_address - kCallPatternSize) {
     ASSERT(IsValid(return_address));
-    ASSERT(kCallPatternSize == Assembler::kCallExternalLabelSize);
   }
 
-  static const int kCallPatternSize = 10;
+  static const int kCallPatternSize = 7;
 
   static bool IsValid(uword return_address) {
     uint8_t* code_bytes =
         reinterpret_cast<uint8_t*>(return_address - kCallPatternSize);
-    return (code_bytes[0] == 0x4D) && (code_bytes[1] == 0x8B) &&
-           (code_bytes[2] == 0x9F) &&
-           (code_bytes[7] == 0x41) && (code_bytes[8] == 0xFF) &&
-           (code_bytes[9] == 0xD3);
+    return (code_bytes[0] == 0x41) && (code_bytes[1] == 0xFF) &&
+           (code_bytes[2] == 0x97);
+  }
+
+  int32_t pp_offset() const {
+    return *reinterpret_cast<int32_t*>(start_ + 3);
+  }
+
+  void set_pp_offset(int32_t offset) const {
+    *reinterpret_cast<int32_t*>(start_ + 3) = offset;
+    CPU::FlushICache(start_, kCallPatternSize);
+  }
+
+ protected:
+  uword start_;
+
+ private:
+  DISALLOW_IMPLICIT_CONSTRUCTORS(PoolPointerCall);
+};
+
+
+// The expected pattern of a dart static call:
+//   0: 41 ff 97 imm32  call [PP + off]
+//   7: <- return address
+class StaticCall : public PoolPointerCall {
+ public:
+  StaticCall(uword return_address, const Code& code)
+      : PoolPointerCall(return_address),
+        object_pool_(Array::Handle(code.ObjectPool())) {
+    ASSERT(IsValid(return_address));
+    ASSERT(kCallPatternSize == Assembler::kCallExternalLabelSize);
   }
 
   uword target() const {
@@ -137,90 +158,11 @@
   }
 
  private:
-  uword start_;
   const Array& object_pool_;
   DISALLOW_IMPLICIT_CONSTRUCTORS(StaticCall);
 };
 
 
-// The expected pattern of a call where the target is loaded from
-// the object pool:
-//  00: 4d 8b 9f imm32  mov R11, [PP + off]
-//  07: 41 ff d3        call R11
-//  10 <- return address
-class PoolPointerCall : public ValueObject {
- public:
-  explicit PoolPointerCall(uword return_address)
-      : start_(return_address - kCallPatternSize) {
-    ASSERT(IsValid(return_address));
-  }
-
-  static bool IsValid(uword return_address) {
-    uint8_t* code_bytes =
-        reinterpret_cast<uint8_t*>(return_address - kCallPatternSize);
-    return (code_bytes[0] == 0x4D) && (code_bytes[1] == 0x8B) &&
-           (code_bytes[2] == 0x9F) &&
-           (code_bytes[7] == 0x41) && (code_bytes[8] == 0xFF) &&
-           (code_bytes[9] == 0xD3);
-  }
-
-  int32_t pp_offset() const {
-    return *reinterpret_cast<int32_t*>(start_ + 3);
-  }
-
-  void set_pp_offset(int32_t offset) const {
-    *reinterpret_cast<int32_t*>(start_ + 3) = offset;
-    CPU::FlushICache(start_, kCallPatternSize);
-  }
-
- private:
-  static const int kCallPatternSize = 7 + 3;
-  uword start_;
-  DISALLOW_IMPLICIT_CONSTRUCTORS(PoolPointerCall);
-};
-
-
-// The expected code pattern of a Dart closure call:
-//  00: 49 ba imm64     mov R10, immediate 2      ; 10 bytes
-//  10: 4d 8b 9f imm32  mov R11, [PP + off]
-//  17: 41 ff d3        call R11                  ; 3 bytes
-//  20: <- return_address
-class ClosureCall : public ValueObject {
- public:
-  explicit ClosureCall(uword return_address)
-      : start_(return_address - kCallPatternSize) {
-    ASSERT(IsValid(return_address));
-  }
-
-  static bool IsValid(uword return_address) {
-    uint8_t* code_bytes =
-        reinterpret_cast<uint8_t*>(return_address - kCallPatternSize);
-    return (code_bytes[00] == 0x49) && (code_bytes[01] == 0xBA) &&
-           (code_bytes[10] == 0x4D) && (code_bytes[11] == 0x8B) &&
-           (code_bytes[12] == 0x9F) &&
-           (code_bytes[17] == 0x41) && (code_bytes[18] == 0xFF) &&
-           (code_bytes[19] == 0xD3);
-  }
-
-  RawArray* arguments_descriptor() const {
-    return *reinterpret_cast<RawArray**>(start_ + 2);
-  }
-
- private:
-  static const int kCallPatternSize = 10 + 7 + 3;
-  uword start_;
-  DISALLOW_IMPLICIT_CONSTRUCTORS(ClosureCall);
-};
-
-
-RawArray* CodePatcher::GetClosureArgDescAt(uword return_address,
-                                           const Code& code) {
-  ASSERT(code.ContainsInstructionAt(return_address));
-  ClosureCall call(return_address);
-  return call.arguments_descriptor();
-}
-
-
 uword CodePatcher::GetStaticCallTargetAt(uword return_address,
                                          const Code& code) {
   ASSERT(code.ContainsInstructionAt(return_address));
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index e3b85c3..ac26ef4 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1576,7 +1576,7 @@
   DARTSCOPE(isolate);
   const Object& object = Object::Handle(isolate, Api::UnwrapHandle(handle));
   uint8_t* data = NULL;
-  MessageWriter writer(&data, &allocator);
+  MessageWriter writer(&data, &allocator, false);
   writer.WriteMessage(object);
   intptr_t len = writer.BytesWritten();
   return PortMap::PostMessage(new Message(
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index dc89423..444e040 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -7015,7 +7015,7 @@
   response->type = Dart_CObject_kInt32;
   response->value.as_int32 = 123;
   Dart_PostCObject(
-      message->value.as_array.values[0]->value.as_send_port, response);
+      message->value.as_array.values[0]->value.as_send_port.id, response);
 }
 
 
@@ -7031,7 +7031,7 @@
   response->type = Dart_CObject_kInt32;
   response->value.as_int32 = 321;
   Dart_PostCObject(
-      message->value.as_array.values[0]->value.as_send_port, response);
+      message->value.as_array.values[0]->value.as_send_port.id, response);
 }
 
 
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index a601017..ab9eaa2 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -608,8 +608,10 @@
     }
     case kSendPortCid: {
       int64_t value64 = Read<int64_t>();
+      int64_t originId = Read<uint64_t>();
       Dart_CObject* object = AllocateDartCObject(Dart_CObject_kSendPort);
-      object->value.as_send_port = value64;
+      object->value.as_send_port.id = value64;
+      object->value.as_send_port.origin_id = originId;
       AddBackRef(object_id, object, kIsDeserialized);
       return object;
     }
diff --git a/runtime/vm/dart_entry_test.cc b/runtime/vm/dart_entry_test.cc
index 2b159c8..5f939ed 100644
--- a/runtime/vm/dart_entry_test.cc
+++ b/runtime/vm/dart_entry_test.cc
@@ -63,7 +63,6 @@
   String& name = String::Handle(String::New("foo"));
   Function& function = Function::Handle(cls.LookupStaticFunction(name));
   EXPECT(!function.IsNull());
-  GrowableArray<const Object*> arguments;
   const Object& retval = Object::Handle(
       DartEntry::InvokeFunction(function, Object::empty_array()));
   EXPECT(retval.IsError());
diff --git a/runtime/vm/disassembler_ia32.cc b/runtime/vm/disassembler_ia32.cc
index c8ef618..b81fdde 100644
--- a/runtime/vm/disassembler_ia32.cc
+++ b/runtime/vm/disassembler_ia32.cc
@@ -1332,10 +1332,16 @@
           PrintCPURegister(rm);
           Print(",");
           PrintHex(*(data+2));
+          data += 3;
         } else {
-          UNIMPLEMENTED();
+          data++;
+          Print("test_b ");
+          data += PrintRightOperand(data);
+          int32_t imm = *data;
+          Print(",");
+          PrintHex(imm);
+          data++;
         }
-        data += 3;
       }
         break;
 
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 0a5ed8f..0f8bdbb 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -697,10 +697,6 @@
       library = Library::CoreLibrary();
       class_name = &Symbols::UnsupportedError();
       break;
-    case kInternalError:
-      library = Library::CoreLibrary();
-      class_name = &Symbols::InternalError();
-      break;
     case kNullThrown:
       library = Library::CoreLibrary();
       class_name = &Symbols::NullThrownError();
diff --git a/runtime/vm/exceptions.h b/runtime/vm/exceptions.h
index 68a8b07..cf0eb98 100644
--- a/runtime/vm/exceptions.h
+++ b/runtime/vm/exceptions.h
@@ -55,7 +55,6 @@
     kUnsupported,
     kStackOverflow,
     kOutOfMemory,
-    kInternalError,
     kNullThrown,
     kIsolateSpawn,
     kIsolateUnhandledException,
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 4868197..033e0a1 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -3492,7 +3492,8 @@
                                      store_value,
                                      kEmitStoreBarrier,
                                      node->token_pos());
-  store->set_is_initialization(true);  // Maybe initializing store.
+  // Maybe initializing unboxed store.
+  store->set_is_potential_unboxed_initialization(true);
   ReturnDefinition(store);
 }
 
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index c4e0874..7771e56 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -1235,15 +1235,29 @@
   intptr_t increment_start = assembler_->CodeSize();
 #endif  // DEBUG
   __ IncrementSmiField(FieldAddress(EAX, Array::element_offset(0)), 1);
+#if defined(DEBUG)
   // If the assertion below fails, update EdgeCounterIncrementSizeInBytes.
-  DEBUG_ASSERT((assembler_->CodeSize() - increment_start) ==
-               EdgeCounterIncrementSizeInBytes());
+  intptr_t expected = EdgeCounterIncrementSizeInBytes();
+  intptr_t actual = assembler_->CodeSize() - increment_start;
+  if (actual != expected) {
+    FATAL2("Edge counter increment length: %" Pd ", expected %" Pd "\n",
+           actual,
+           expected);
+  }
+#endif  // DEBUG
 }
 
 
 int32_t FlowGraphCompiler::EdgeCounterIncrementSizeInBytes() {
   // Used by CodePatcher; so must be constant across all code in an isolate.
-  return VerifiedMemory::enabled() ? 50 : 4;
+  int32_t size = 4;
+#if defined(DEBUG)
+  size += 19;  // VerifySmi
+#endif  // DEBUG
+  if (VerifiedMemory::enabled()) {
+    size += 50;
+  }
+  return size;
 }
 
 
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 11fa54a..33eb9e5 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -1249,7 +1249,7 @@
                    &target_label,
                    RawPcDescriptors::kUnoptStaticCall,
                    locs);
-  __ Drop(argument_count);
+  __ Drop(argument_count, RCX);
 #if defined(DEBUG)
   __ movq(RBX, Immediate(kInvalidObjectPointer));
   __ movq(R10, Immediate(kInvalidObjectPointer));
@@ -1286,7 +1286,14 @@
 
 int32_t FlowGraphCompiler::EdgeCounterIncrementSizeInBytes() {
   // Used by CodePatcher; so must be constant across all code in an isolate.
-  return VerifiedMemory::enabled() ? 73 : 5;
+  int32_t size = 5;
+#if defined(DEBUG)
+  size += 36;  // VerifySmi
+#endif  // DEBUG
+  if (VerifiedMemory::enabled()) {
+    size += 72;
+  }
+  return size;
 }
 
 
@@ -1311,7 +1318,7 @@
                    target_label,
                    RawPcDescriptors::kIcCall,
                    locs);
-  __ Drop(argument_count);
+  __ Drop(argument_count, RCX);
 }
 
 
@@ -1328,7 +1335,7 @@
                    target_label,
                    RawPcDescriptors::kIcCall,
                    locs);
-  __ Drop(argument_count);
+  __ Drop(argument_count, RCX);
 #if defined(DEBUG)
   __ movq(R10, Immediate(kInvalidObjectPointer));
 #endif
@@ -1392,7 +1399,7 @@
       Isolate::kNoDeoptId, token_pos);
   RecordSafepoint(locs);
   AddDeoptIndexAtCall(Isolate::ToDeoptAfter(deopt_id), token_pos);
-  __ Drop(argument_count);
+  __ Drop(argument_count, RCX);
 }
 
 
@@ -1413,7 +1420,7 @@
                    RawPcDescriptors::kOptStaticCall,
                    locs);
   AddStaticCallTarget(function);
-  __ Drop(argument_count);
+  __ Drop(argument_count, RCX);
 }
 
 
@@ -1565,7 +1572,7 @@
                      locs);
     const Function& function = *sorted[i].target;
     AddStaticCallTarget(function);
-    __ Drop(argument_count);
+    __ Drop(argument_count, RCX);
     if (!is_last_check) {
       __ jmp(&match_found);
     }
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 75519d2..b89159c 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -4504,7 +4504,7 @@
 void FlowGraphOptimizer::VisitStoreInstanceField(
     StoreInstanceFieldInstr* instr) {
   if (instr->IsUnboxedStore()) {
-    ASSERT(instr->is_initialization_);
+    ASSERT(instr->is_potential_unboxed_initialization_);
     // Determine if this field should be unboxed based on the usage of getter
     // and setter functions: The heuristic requires that the setter has a
     // usage count of at least 1/kGetterSetterRatio of the getter usage count.
@@ -4549,7 +4549,9 @@
                                      new Value(flow_graph_->constant_null()),
                                      kNoStoreBarrier,
                                      instr->token_pos());
-  store->set_is_initialization(true);  // Won't be eliminated by DSE.
+  // Storing into uninitialized memory; remember to prevent dead store
+  // elimination and ensure proper GC barrier.
+  store->set_is_object_reference_initialization(true);
   flow_graph_->InsertAfter(replacement, store, NULL, FlowGraph::kEffect);
   Definition* cursor = store;
   for (intptr_t i = 0; i < instr->num_context_variables(); ++i) {
@@ -4559,7 +4561,9 @@
                                        new Value(flow_graph_->constant_null()),
                                        kNoStoreBarrier,
                                        instr->token_pos());
-    store->set_is_initialization(true);  // Won't be eliminated by DSE.
+    // Storing into uninitialized memory; remember to prevent dead store
+    // elimination and ensure proper GC barrier.
+    store->set_is_object_reference_initialization(true);
     flow_graph_->InsertAfter(cursor, store, NULL, FlowGraph::kEffect);
     cursor = store;
   }
@@ -7132,11 +7136,12 @@
 
   bool CanEliminateStore(Instruction* instr) {
     switch (instr->tag()) {
-      case Instruction::kStoreInstanceField:
-        if (instr->AsStoreInstanceField()->is_initialization()) {
-          // Can't eliminate stores that initialized unboxed fields.
-          return false;
-        }
+      case Instruction::kStoreInstanceField: {
+        StoreInstanceFieldInstr* store_instance = instr->AsStoreInstanceField();
+        // Can't eliminate stores that initialize fields.
+        return !(store_instance->is_potential_unboxed_initialization() ||
+                 store_instance->is_object_reference_initialization());
+      }
       case Instruction::kStoreIndexed:
       case Instruction::kStoreStaticField:
         return true;
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index 0863a162..770030d 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -166,25 +166,40 @@
   }
 
   StrictCompareInstr* compare = branch->comparison()->AsStrictCompare();
-  if ((compare == NULL) || !compare->right()->BindsToConstantNull()) {
+  if ((compare == NULL) || !compare->right()->BindsToConstant()) {
     return;
   }
 
   const intptr_t rollback_point = rollback_.length();
 
   Definition* defn = compare->left()->definition();
+  const Object& right = compare->right()->BoundConstant();
+  intptr_t cid = right.GetClassId();
+
+  if (defn->IsLoadClassId() && right.IsSmi()) {
+    defn = defn->AsLoadClassId()->object()->definition();
+    cid = Smi::Cast(right).Value();
+  }
+
+  if (!CheckClassInstr::IsImmutableClassId(cid)) {
+    return;
+  }
 
   if (compare->kind() == Token::kEQ_STRICT) {
-    branch->set_constrained_type(MarkNonNullable(defn));
-    PropagateRecursive(branch->false_successor());
+    if (cid == kNullCid) {
+      branch->set_constrained_type(MarkNonNullable(defn));
+      PropagateRecursive(branch->false_successor());
+    }
 
-    SetCid(defn, kNullCid);
+    SetCid(defn, cid);
     PropagateRecursive(branch->true_successor());
   } else if (compare->kind() == Token::kNE_STRICT) {
-    branch->set_constrained_type(MarkNonNullable(defn));
-    PropagateRecursive(branch->true_successor());
+    if (cid == kNullCid) {
+      branch->set_constrained_type(MarkNonNullable(defn));
+      PropagateRecursive(branch->true_successor());
+    }
 
-    SetCid(defn, kNullCid);
+    SetCid(defn, cid);
     PropagateRecursive(branch->false_successor());
   }
 
@@ -280,6 +295,12 @@
 
 
 void FlowGraphTypePropagator::VisitCheckClassId(CheckClassIdInstr* check) {
+  if (!check->Dependencies().IsNone()) {
+    // TODO(vegorov): If check is affected by side-effect we can still propagate
+    // the type further but not the cid.
+    return;
+  }
+
   LoadClassIdInstr* load_cid =
       check->value()->definition()->OriginalDefinition()->AsLoadClassId();
   if (load_cid != NULL) {
diff --git a/runtime/vm/gc_sweeper.cc b/runtime/vm/gc_sweeper.cc
index 063f6aa..270c9cc 100644
--- a/runtime/vm/gc_sweeper.cc
+++ b/runtime/vm/gc_sweeper.cc
@@ -44,6 +44,10 @@
       obj_size = free_end - current;
       if (is_executable) {
         memset(reinterpret_cast<void*>(current), 0xcc, obj_size);
+      } else {
+#if defined(DEBUG)
+        memset(reinterpret_cast<void*>(current), Heap::kZapByte, obj_size);
+#endif  // DEBUG
       }
       if ((current != start) || (free_end != end)) {
         // Only add to the free list if not covering the whole page.
@@ -77,7 +81,9 @@
   while (current < end) {
     RawObject* cur_obj = RawObject::FromAddr(current);
     ASSERT(!cur_obj->IsMarked());
-    current += cur_obj->Size();
+    intptr_t obj_size = cur_obj->Size();
+    memset(reinterpret_cast<void*>(current), Heap::kZapByte, obj_size);
+    current += obj_size;
   }
 #endif  // DEBUG
   return words_to_end;
diff --git a/runtime/vm/globals.h b/runtime/vm/globals.h
index 267b4a3..597756d 100644
--- a/runtime/vm/globals.h
+++ b/runtime/vm/globals.h
@@ -72,10 +72,12 @@
 
 
 // When using GCC we can use GCC attributes to ensure that certain
-// contants are 16 byte aligned.
+// contants are 8 or 16 byte aligned.
 #if defined(TARGET_OS_WINDOWS)
+#define ALIGN8 __declspec(align(8))
 #define ALIGN16 __declspec(align(16))
 #else
+#define ALIGN8 __attribute__((aligned(8)))
 #define ALIGN16 __attribute__((aligned(16)))
 #endif
 
diff --git a/runtime/vm/growable_array.h b/runtime/vm/growable_array.h
index 5f73008..d18391d 100644
--- a/runtime/vm/growable_array.h
+++ b/runtime/vm/growable_array.h
@@ -4,6 +4,8 @@
 // Defines growable array classes, that differ where they are allocated:
 // - GrowableArray: allocated on stack.
 // - ZoneGrowableArray: allocated in the zone.
+// - MallocGrowableArray: allocates using malloc/realloc; free is only called
+//   at destruction.
 
 #ifndef VM_GROWABLE_ARRAY_H_
 #define VM_GROWABLE_ARRAY_H_
@@ -15,23 +17,24 @@
 
 namespace dart {
 
-template<typename T, typename B>
+template<typename T, typename B, typename Allocator = Zone>
 class BaseGrowableArray : public B {
  public:
-  explicit BaseGrowableArray(Zone* zone)
-      : length_(0), capacity_(0), data_(NULL), zone_(zone) {
-    ASSERT(zone_ != NULL);
-  }
+  explicit BaseGrowableArray(Allocator* allocator)
+      : length_(0), capacity_(0), data_(NULL), allocator_(allocator) {}
 
-  BaseGrowableArray(intptr_t initial_capacity, Zone* zone)
-      : length_(0), capacity_(0), data_(NULL), zone_(zone) {
-    ASSERT(zone_ != NULL);
+  BaseGrowableArray(intptr_t initial_capacity, Allocator* allocator)
+      : length_(0), capacity_(0), data_(NULL), allocator_(allocator) {
     if (initial_capacity > 0) {
       capacity_ = Utils::RoundUpToPowerOfTwo(initial_capacity);
-      data_ = zone_->Alloc<T>(capacity_);
+      data_ = allocator_->template Alloc<T>(capacity_);
     }
   }
 
+  ~BaseGrowableArray() {
+    allocator_->template Free<T>(data_, capacity_);
+  }
+
   intptr_t length() const { return length_; }
   T* data() const { return data_; }
   bool is_empty() const { return length_ == 0; }
@@ -97,7 +100,7 @@
   intptr_t length_;
   intptr_t capacity_;
   T* data_;
-  Zone* zone_;  // Zone in which we are allocating the array.
+  Allocator* allocator_;  // Used to (re)allocate the array.
 
   // Used for growing the array.
   void Resize(intptr_t new_length);
@@ -106,19 +109,20 @@
 };
 
 
-template<typename T, typename B>
-inline void BaseGrowableArray<T, B>::Sort(
+template<typename T, typename B, typename Allocator>
+inline void BaseGrowableArray<T, B, Allocator>::Sort(
     int compare(const T*, const T*)) {
   typedef int (*CompareFunction)(const void*, const void*);
   qsort(data_, length_, sizeof(T), reinterpret_cast<CompareFunction>(compare));
 }
 
 
-template<typename T, typename B>
-void BaseGrowableArray<T, B>::Resize(intptr_t new_length) {
+template<typename T, typename B, typename Allocator>
+void BaseGrowableArray<T, B, Allocator>::Resize(intptr_t new_length) {
   if (new_length > capacity_) {
     intptr_t new_capacity = Utils::RoundUpToPowerOfTwo(new_length);
-    T* new_data = zone_->Realloc<T>(data_, capacity_, new_capacity);
+    T* new_data =
+        allocator_->template Realloc<T>(data_, capacity_, new_capacity);
     ASSERT(new_data != NULL);
     data_ = new_data;
     capacity_ = new_capacity;
@@ -127,10 +131,10 @@
 }
 
 
-template<typename T, typename B>
-void BaseGrowableArray<T, B>::SetLength(intptr_t new_length) {
+template<typename T, typename B, typename Allocator>
+void BaseGrowableArray<T, B, Allocator>::SetLength(intptr_t new_length) {
   if (new_length > capacity_) {
-    T* new_data = zone_->Alloc<T>(new_length);
+    T* new_data = allocator_->template Alloc<T>(new_length);
     ASSERT(new_data != NULL);
     data_ = new_data;
     capacity_ = new_length;
@@ -144,13 +148,14 @@
  public:
   GrowableArray(Isolate* isolate, intptr_t initial_capacity)
       : BaseGrowableArray<T, ValueObject>(
-          initial_capacity, isolate->current_zone()) {}
+          initial_capacity, ASSERT_NOTNULL(isolate->current_zone())) {}
   explicit GrowableArray(intptr_t initial_capacity)
       : BaseGrowableArray<T, ValueObject>(
-          initial_capacity, Isolate::Current()->current_zone()) {}
+          initial_capacity,
+          ASSERT_NOTNULL(Isolate::Current()->current_zone())) {}
   GrowableArray()
       : BaseGrowableArray<T, ValueObject>(
-          Isolate::Current()->current_zone()) {}
+          ASSERT_NOTNULL(Isolate::Current()->current_zone())) {}
 };
 
 
@@ -159,14 +164,46 @@
  public:
   ZoneGrowableArray(Isolate* isolate, intptr_t initial_capacity)
       : BaseGrowableArray<T, ZoneAllocated>(
-          initial_capacity, isolate->current_zone()) {}
+          initial_capacity, ASSERT_NOTNULL(isolate->current_zone())) {}
   explicit ZoneGrowableArray(intptr_t initial_capacity)
       : BaseGrowableArray<T, ZoneAllocated>(
           initial_capacity,
-          Isolate::Current()->current_zone()) {}
-  ZoneGrowableArray() :
-      BaseGrowableArray<T, ZoneAllocated>(
-          Isolate::Current()->current_zone()) {}
+          ASSERT_NOTNULL(Isolate::Current()->current_zone())) {}
+  ZoneGrowableArray()
+      : BaseGrowableArray<T, ZoneAllocated>(
+          ASSERT_NOTNULL(Isolate::Current()->current_zone())) {}
+};
+
+
+class Malloc : public AllStatic {
+ public:
+  template <class T>
+  static inline T* Alloc(intptr_t len) {
+    return reinterpret_cast<T*>(malloc(len * sizeof(T)));
+  }
+
+  template <class T>
+  static inline T* Realloc(T* old_array, intptr_t old_len, intptr_t new_len) {
+    return reinterpret_cast<T*>(realloc(old_array, new_len * sizeof(T)));
+  }
+
+  template <class T>
+  static inline void Free(T* old_array, intptr_t old_len) {
+    free(old_array);
+  }
+};
+
+
+class EmptyBase {};
+
+
+template<typename T>
+class MallocGrowableArray : public BaseGrowableArray<T, EmptyBase, Malloc> {
+ public:
+  explicit MallocGrowableArray(intptr_t initial_capacity)
+      : BaseGrowableArray<T, EmptyBase, Malloc>(initial_capacity, NULL) {}
+  MallocGrowableArray()
+      : BaseGrowableArray<T, EmptyBase, Malloc>(NULL) {}
 };
 
 }  // namespace dart
diff --git a/runtime/vm/growable_array_test.cc b/runtime/vm/growable_array_test.cc
index 2adf39d..09c1605 100644
--- a/runtime/vm/growable_array_test.cc
+++ b/runtime/vm/growable_array_test.cc
@@ -8,8 +8,9 @@
 
 namespace dart {
 
-TEST_CASE(GrowableArray) {
-  GrowableArray<int> g;
+template<class GrowableArrayInt, class GrowableArrayInt64>
+void TestGrowableArray() {
+  GrowableArrayInt g;
   EXPECT_EQ(0, g.length());
   EXPECT(g.is_empty());
   g.Add(5);
@@ -17,7 +18,7 @@
   EXPECT_EQ(1, g.length());
   EXPECT(!g.is_empty());
   g.Add(3);
-  const GrowableArray<int>& temp = g;
+  const GrowableArrayInt& temp = g;
   EXPECT_EQ(5, temp[0]);
   EXPECT_EQ(3, temp[1]);
   for (int i = 0; i < 10000; i++) {
@@ -26,7 +27,7 @@
   EXPECT_EQ(10002, g.length());
   EXPECT_EQ(10000 - 1, g.Last());
 
-  GrowableArray<int64_t> f(10);
+  GrowableArrayInt64 f(10);
   EXPECT_EQ(0, f.length());
   f.Add(-1LL);
   f.Add(15LL);
@@ -38,7 +39,7 @@
   EXPECT_EQ(100 - 1, f.Last());
   EXPECT_EQ(-1LL, f[0]);
 
-  GrowableArray<int> h;
+  GrowableArrayInt h;
   EXPECT_EQ(0, h.length());
   h.Add(101);
   h.Add(102);
@@ -62,6 +63,18 @@
 }
 
 
+TEST_CASE(GrowableArray) {
+  TestGrowableArray<GrowableArray<int>,
+                    GrowableArray<int64_t> >();
+}
+
+
+TEST_CASE(MallocGrowableArray) {
+  TestGrowableArray<MallocGrowableArray<int>,
+                    MallocGrowableArray<int64_t> >();
+}
+
+
 static int greatestFirst(const int* a, const int* b) {
   if (*a > *b) {
     return -1;
diff --git a/runtime/vm/heap.h b/runtime/vm/heap.h
index 137bcd3..aa11c73 100644
--- a/runtime/vm/heap.h
+++ b/runtime/vm/heap.h
@@ -63,6 +63,13 @@
   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;
+  static const uint32_t kZap32Bits = static_cast<uint32_t>(kZap64Bits);
+  static const uint8_t kZapByte = static_cast<uint8_t>(kZap64Bits);
+#endif  // DEBUG
+
   ~Heap();
 
   Scavenger* new_space() const { return new_space_; }
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index df597c8..3608370 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -152,20 +152,42 @@
 }
 
 
+bool CheckClassInstr::IsImmutableClassId(intptr_t cid) {
+  switch (cid) {
+    case kOneByteStringCid:
+    case kTwoByteStringCid:
+      return false;
+    default:
+      return true;
+  }
+}
+
+
+static bool AreAllChecksImmutable(const ICData& checks) {
+  const intptr_t len = checks.NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
+    if (checks.IsUsedAt(i)) {
+      if (!CheckClassInstr::IsImmutableClassId(
+              checks.GetReceiverClassIdAt(i))) {
+        return false;
+      }
+    }
+  }
+  return true;
+}
+
+
 EffectSet CheckClassInstr::Dependencies() const {
   // Externalization of strings via the API can change the class-id.
-  const bool externalizable =
-      unary_checks().HasReceiverClassId(kOneByteStringCid) ||
-      unary_checks().HasReceiverClassId(kTwoByteStringCid);
-  return externalizable ? EffectSet::Externalization() : EffectSet::None();
+  return !AreAllChecksImmutable(unary_checks()) ?
+      EffectSet::Externalization() : EffectSet::None();
 }
 
 
 EffectSet CheckClassIdInstr::Dependencies() const {
   // Externalization of strings via the API can change the class-id.
-  const bool externalizable =
-      cid_ == kOneByteStringCid || cid_ == kTwoByteStringCid;
-  return externalizable ? EffectSet::Externalization() : EffectSet::None();
+  return !CheckClassInstr::IsImmutableClassId(cid_) ?
+      EffectSet::Externalization() : EffectSet::None();
 }
 
 
@@ -2580,8 +2602,8 @@
     // Don't generate a table when contained in an unreachable block.
     return;
   }
-  ASSERT(SuccessorCount() == offsets_.Capacity());
-  offsets_.SetLength(SuccessorCount());
+  ASSERT(SuccessorCount() == offsets_.Length());
+  intptr_t element_size = offsets_.ElementSizeInBytes();
   for (intptr_t i = 0; i < SuccessorCount(); i++) {
     TargetEntryInstr* target = SuccessorAt(i);
     intptr_t offset = target->offset();
@@ -2605,7 +2627,7 @@
 
     ASSERT(offset > 0);
     offset -= Assembler::EntryPointToPcMarkerOffset();
-    offsets_.SetAt(i, Smi::ZoneHandle(isolate, Smi::New(offset)));
+    offsets_.SetInt32(i * element_size, offset);
   }
 }
 
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 370bd8f..a12992d 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -2199,7 +2199,7 @@
 // to IndirectGoto as an input.
 class IndirectGotoInstr : public TemplateInstruction<1, NoThrow> {
  public:
-  IndirectGotoInstr(GrowableObjectArray* offsets,
+  IndirectGotoInstr(TypedData* offsets,
                     Value* offset_from_start)
     : offsets_(*offsets) {
     SetInputAt(0, offset_from_start);
@@ -2207,6 +2207,11 @@
 
   DECLARE_INSTRUCTION(IndirectGoto)
 
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT(idx == 0);
+    return kNoRepresentation;
+  }
+
   virtual intptr_t ArgumentCount() const { return 0; }
 
   void AddSuccessor(TargetEntryInstr* successor) {
@@ -2228,12 +2233,12 @@
 
   virtual void PrintTo(BufferFormatter* f) const;
 
-  const GrowableObjectArray& offsets() const { return offsets_; }
+  Value* offset() const { return inputs_[0]; }
   void ComputeOffsetTable(Isolate* isolate);
 
  private:
   GrowableArray<TargetEntryInstr*> successors_;
-  GrowableObjectArray& offsets_;
+  TypedData& offsets_;
 };
 
 
@@ -3425,7 +3430,8 @@
         offset_in_bytes_(field.Offset()),
         emit_store_barrier_(emit_store_barrier),
         token_pos_(token_pos),
-        is_initialization_(false) {
+        is_potential_unboxed_initialization_(false),
+        is_object_reference_initialization_(false) {
     SetInputAt(kInstancePos, instance);
     SetInputAt(kValuePos, value);
   }
@@ -3439,14 +3445,20 @@
         offset_in_bytes_(offset_in_bytes),
         emit_store_barrier_(emit_store_barrier),
         token_pos_(token_pos),
-        is_initialization_(false) {
+        is_potential_unboxed_initialization_(false),
+        is_object_reference_initialization_(false) {
     SetInputAt(kInstancePos, instance);
     SetInputAt(kValuePos, value);
   }
 
   DECLARE_INSTRUCTION(StoreInstanceField)
 
-  void set_is_initialization(bool value) { is_initialization_ = value; }
+  void set_is_potential_unboxed_initialization(bool value) {
+    is_potential_unboxed_initialization_ = value;
+  }
+  void set_is_object_reference_initialization(bool value) {
+    is_object_reference_initialization_ = value;
+  }
 
   enum {
     kInstancePos = 0,
@@ -3455,7 +3467,12 @@
 
   Value* instance() const { return inputs_[kInstancePos]; }
   Value* value() const { return inputs_[kValuePos]; }
-  bool is_initialization() const { return is_initialization_; }
+  bool is_potential_unboxed_initialization() const {
+    return is_potential_unboxed_initialization_;
+  }
+  bool is_object_reference_initialization() const {
+    return is_object_reference_initialization_;
+  }
   virtual intptr_t token_pos() const { return token_pos_; }
 
   const Field& field() const { return field_; }
@@ -3500,7 +3517,11 @@
   intptr_t offset_in_bytes_;
   const StoreBarrierType emit_store_barrier_;
   const intptr_t token_pos_;
-  bool is_initialization_;  // Marks stores in the constructor.
+  // This may be the first store to an unboxed field.
+  bool is_potential_unboxed_initialization_;
+  // True if this store initializes an object reference field of an object that
+  // was allocated uninitialized; see AllocateUninitializedContext.
+  bool is_object_reference_initialization_;
 
   DISALLOW_COPY_AND_ASSIGN(StoreInstanceFieldInstr);
 };
@@ -7581,6 +7602,8 @@
 
   void set_licm_hoisted(bool value) { licm_hoisted_ = value; }
 
+  static bool IsImmutableClassId(intptr_t cid);
+
  private:
   const ICData& unary_checks_;
   GrowableArray<intptr_t> cids_;  // Sorted, lowest first.
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index cc62653..1c2eb89 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -1993,7 +1993,7 @@
           ((IsPotentialUnboxedStore()) ? 3 : 0);
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps,
-          ((IsUnboxedStore() && opt && is_initialization_) ||
+          ((IsUnboxedStore() && opt && is_potential_unboxed_initialization_) ||
            IsPotentialUnboxedStore())
           ? LocationSummary::kCallOnSlowPath
           : LocationSummary::kNoCall);
@@ -2053,7 +2053,7 @@
     const Register temp2 = locs()->temp(1).reg();
     const intptr_t cid = field().UnboxedFieldCid();
 
-    if (is_initialization_) {
+    if (is_potential_unboxed_initialization_) {
       const Class* cls = NULL;
       switch (cid) {
         case kDoubleCid:
@@ -6778,9 +6778,11 @@
 
   // Add the offset.
   Register offset_reg = locs()->in(0).reg();
-  __ add(target_address_reg,
-         target_address_reg,
-         Operand(offset_reg, ASR, kSmiTagSize));
+  Operand offset_opr =
+      (offset()->definition()->representation() == kTagged) ?
+      Operand(offset_reg, ASR, kSmiTagSize) :
+      Operand(offset_reg);
+  __ add(target_address_reg, target_address_reg, offset_opr);
 
   // Jump to the absolute address.
   __ bx(target_address_reg);
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index 2080ef2..4e9794f 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -1753,7 +1753,7 @@
           ((IsPotentialUnboxedStore()) ? 2 : 0);
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps,
-          ((IsUnboxedStore() && opt && is_initialization_) ||
+          ((IsUnboxedStore() && opt && is_potential_unboxed_initialization_) ||
            IsPotentialUnboxedStore())
           ? LocationSummary::kCallOnSlowPath
           : LocationSummary::kNoCall);
@@ -1789,7 +1789,7 @@
     const Register temp2 = locs()->temp(1).reg();
     const intptr_t cid = field().UnboxedFieldCid();
 
-    if (is_initialization_) {
+    if (is_potential_unboxed_initialization_) {
       const Class* cls = NULL;
       switch (cid) {
         case kDoubleCid:
@@ -5462,9 +5462,11 @@
 
   // Add the offset.
   Register offset_reg = locs()->in(0).reg();
-  __ add(target_address_reg,
-         target_address_reg,
-         Operand(offset_reg, ASR, kSmiTagSize));
+  Operand offset_opr =
+      (offset()->definition()->representation() == kTagged) ?
+      Operand(offset_reg, ASR, kSmiTagSize) :
+      Operand(offset_reg);
+  __ add(target_address_reg, target_address_reg, offset_opr);
 
   // Jump to the absolute address.
   __ br(target_address_reg);
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index dd6ae5c..79978e9 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -1718,7 +1718,7 @@
           ((IsPotentialUnboxedStore()) ? 3 : 0);
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps,
-          ((IsUnboxedStore() && opt && is_initialization_) ||
+          ((IsUnboxedStore() && opt && is_potential_unboxed_initialization_) ||
            IsPotentialUnboxedStore())
           ? LocationSummary::kCallOnSlowPath
           : LocationSummary::kNoCall);
@@ -1779,7 +1779,7 @@
     Register temp2 = locs()->temp(1).reg();
     const intptr_t cid = field().UnboxedFieldCid();
 
-    if (is_initialization_) {
+    if (is_potential_unboxed_initialization_) {
       const Class* cls = NULL;
       switch (cid) {
         case kDoubleCid:
@@ -1927,11 +1927,18 @@
       __ StoreIntoObjectNoBarrier(
           instance_reg,
           FieldAddress(instance_reg, offset_in_bytes_),
-          locs()->in(1).constant());
+          locs()->in(1).constant(),
+          is_object_reference_initialization_ ?
+              Assembler::kEmptyOrSmiOrNull :
+              Assembler::kHeapObjectOrSmi);
     } else {
       Register value_reg = locs()->in(1).reg();
       __ StoreIntoObjectNoBarrier(instance_reg,
-          FieldAddress(instance_reg, offset_in_bytes_), value_reg);
+                                  FieldAddress(instance_reg, offset_in_bytes_),
+                                  value_reg,
+                                  is_object_reference_initialization_ ?
+                                      Assembler::kEmptyOrSmiOrNull :
+                                      Assembler::kHeapObjectOrSmi);
     }
   }
   __ Bind(&skip_store);
@@ -2050,12 +2057,12 @@
                       EBX);  // end address
 
   // Store the type argument field.
-  __ StoreIntoObjectNoBarrier(EAX,
+  __ InitializeFieldNoBarrier(EAX,
                               FieldAddress(EAX, Array::type_arguments_offset()),
                               kElemTypeReg);
 
   // Set the length field.
-  __ StoreIntoObjectNoBarrier(EAX,
+  __ InitializeFieldNoBarrier(EAX,
                               FieldAddress(EAX, Array::length_offset()),
                               kLengthReg);
 
@@ -2073,13 +2080,13 @@
       intptr_t current_offset = 0;
       __ movl(EBX, raw_null);
       while (current_offset < array_size) {
-        __ StoreIntoObjectNoBarrier(EAX, Address(EDI, current_offset), EBX);
+        __ InitializeFieldNoBarrier(EAX, Address(EDI, current_offset), EBX);
         current_offset += kWordSize;
       }
     } else {
       Label init_loop;
       __ Bind(&init_loop);
-      __ StoreIntoObjectNoBarrier(EAX, Address(EDI, 0), Object::null_object());
+      __ InitializeFieldNoBarrier(EAX, Address(EDI, 0), Object::null_object());
       __ addl(EDI, Immediate(kWordSize));
       __ cmpl(EDI, EBX);
       __ j(BELOW, &init_loop, Assembler::kNearJump);
@@ -6550,7 +6557,9 @@
 
   // Add the offset.
   Register offset_reg = locs()->in(0).reg();
-  __ SmiUntag(offset_reg);
+  if (offset()->definition()->representation() == kTagged) {
+    __ SmiUntag(offset_reg);
+  }
   __ addl(target_address_reg, offset_reg);
 
   // Jump to the absolute address.
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index cc97483..5f79413 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -1916,7 +1916,7 @@
           ((IsPotentialUnboxedStore()) ? 3 : 0);
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps,
-          ((IsUnboxedStore() && opt && is_initialization_) ||
+          ((IsUnboxedStore() && opt && is_potential_unboxed_initialization_) ||
            IsPotentialUnboxedStore())
           ? LocationSummary::kCallOnSlowPath
           : LocationSummary::kNoCall);
@@ -1971,7 +1971,7 @@
     Register temp2 = locs()->temp(1).reg();
     const intptr_t cid = field().UnboxedFieldCid();
 
-    if (is_initialization_) {
+    if (is_potential_unboxed_initialization_) {
       const Class* cls = NULL;
       switch (cid) {
         case kDoubleCid:
@@ -5439,7 +5439,9 @@
 
   // Add the offset.
   Register offset_reg = locs()->in(0).reg();
+  if (offset()->definition()->representation() == kTagged) {
   __ SmiUntag(offset_reg);
+  }
   __ addu(target_address_reg, target_address_reg, offset_reg);
 
   // Jump to the absolute address.
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index a12001c..867c335 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -1274,11 +1274,11 @@
       break;
     case kTypedDataInt16ArrayCid:
     case kTypedDataUint16ArrayCid:
-    case kTypedDataInt32ArrayCid:
-    case kTypedDataUint32ArrayCid:
       // Writable register because the value must be untagged before storing.
       locs->set_in(2, Location::WritableRegister());
       break;
+    case kTypedDataInt32ArrayCid:
+    case kTypedDataUint32ArrayCid:
     case kTypedDataInt64ArrayCid:
       locs->set_in(2, Location::RequiresRegister());
       break;
@@ -1724,7 +1724,7 @@
           ((IsPotentialUnboxedStore()) ? 3 : 0);
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps,
-          ((IsUnboxedStore() && opt && is_initialization_) ||
+          ((IsUnboxedStore() && opt && is_potential_unboxed_initialization_) ||
            IsPotentialUnboxedStore())
           ? LocationSummary::kCallOnSlowPath
           : LocationSummary::kNoCall);
@@ -1783,7 +1783,7 @@
     Register temp2 = locs()->temp(1).reg();
     const intptr_t cid = field().UnboxedFieldCid();
 
-    if (is_initialization_) {
+    if (is_potential_unboxed_initialization_) {
       const Class* cls = NULL;
       switch (cid) {
         case kDoubleCid:
@@ -1928,11 +1928,19 @@
     if (locs()->in(1).IsConstant()) {
       __ StoreIntoObjectNoBarrier(instance_reg,
                                   FieldAddress(instance_reg, offset_in_bytes_),
-                                  locs()->in(1).constant(), PP);
+                                  locs()->in(1).constant(),
+                                  PP,
+                                  is_object_reference_initialization_ ?
+                                      Assembler::kEmptyOrSmiOrNull :
+                                      Assembler::kHeapObjectOrSmi);
     } else {
       Register value_reg = locs()->in(1).reg();
       __ StoreIntoObjectNoBarrier(instance_reg,
-          FieldAddress(instance_reg, offset_in_bytes_), value_reg);
+          FieldAddress(instance_reg, offset_in_bytes_),
+          value_reg,
+          is_object_reference_initialization_ ?
+              Assembler::kEmptyOrSmiOrNull :
+              Assembler::kHeapObjectOrSmi);
     }
   }
   __ Bind(&skip_store);
@@ -2048,12 +2056,12 @@
 
   // RAX: new object start as a tagged pointer.
   // Store the type argument field.
-  __ StoreIntoObjectNoBarrier(RAX,
+  __ InitializeFieldNoBarrier(RAX,
                               FieldAddress(RAX, Array::type_arguments_offset()),
                               kElemTypeReg);
 
   // Set the length field.
-  __ StoreIntoObjectNoBarrier(RAX,
+  __ InitializeFieldNoBarrier(RAX,
                               FieldAddress(RAX, Array::length_offset()),
                               kLengthReg);
 
@@ -2069,13 +2077,13 @@
     if (array_size < (kInlineArraySize * kWordSize)) {
       intptr_t current_offset = 0;
       while (current_offset < array_size) {
-        __ StoreIntoObjectNoBarrier(RAX, Address(RDI, current_offset), R12);
+        __ InitializeFieldNoBarrier(RAX, Address(RDI, current_offset), R12);
         current_offset += kWordSize;
       }
     } else {
       Label init_loop;
       __ Bind(&init_loop);
-      __ StoreIntoObjectNoBarrier(RAX, Address(RDI, 0), R12);
+      __ InitializeFieldNoBarrier(RAX, Address(RDI, 0), R12);
       __ addq(RDI, Immediate(kWordSize));
       __ cmpq(RDI, RCX);
       __ j(BELOW, &init_loop, Assembler::kNearJump);
@@ -6208,7 +6216,9 @@
   __ movq(target_address_reg, Address(RBP, kPcMarkerSlotFromFp * kWordSize));
 
   // Calculate the final absolute address.
-  __ SmiUntag(offset_reg);
+  if (offset()->definition()->representation() == kTagged) {
+    __ SmiUntag(offset_reg);
+  }
   __ addq(target_address_reg, offset_reg);
 
   // Jump to the absolute address.
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc
index ecd126c..7415188 100644
--- a/runtime/vm/intrinsifier_ia32.cc
+++ b/runtime/vm/intrinsifier_ia32.cc
@@ -115,12 +115,17 @@
   // Try allocating in new space.
   const Class& cls = Class::Handle(
       Isolate::Current()->object_store()->growable_object_array_class());
-  __ TryAllocate(cls, &fall_through, Assembler::kNearJump, EAX, EBX);
+#if defined(DEBUG)
+  static const bool kJumpLength = Assembler::kFarJump;
+#else
+  static const bool kJumpLength = Assembler::kNearJump;
+#endif  // DEBUG
+  __ TryAllocate(cls, &fall_through, kJumpLength, EAX, EBX);
 
   // Store backing array object in growable array object.
   __ movl(EBX, Address(ESP, kArrayOffset));  // data argument.
   // EAX is new, no barrier needed.
-  __ StoreIntoObjectNoBarrier(
+  __ InitializeFieldNoBarrier(
       EAX,
       FieldAddress(EAX, GrowableObjectArray::data_offset()),
       EBX);
@@ -128,12 +133,12 @@
   // EAX: new growable array object start as a tagged pointer.
   // Store the type argument field in the growable array object.
   __ movl(EBX, Address(ESP, kTypeArgumentsOffset));  // type argument.
-  __ StoreIntoObjectNoBarrier(
+  __ InitializeFieldNoBarrier(
       EAX,
       FieldAddress(EAX, GrowableObjectArray::type_arguments_offset()),
       EBX);
 
-  __ ZeroSmiField(FieldAddress(EAX, GrowableObjectArray::length_offset()));
+  __ ZeroInitSmiField(FieldAddress(EAX, GrowableObjectArray::length_offset()));
   __ ret();  // returns the newly allocated object in EAX.
 
   __ Bind(&fall_through);
@@ -328,7 +333,7 @@
   /* EAX: new object start as a tagged pointer. */                             \
   /* EBX: new object end address. */                                           \
   __ movl(EDI, Address(ESP, kArrayLengthStackOffset));  /* Array length. */    \
-  __ StoreIntoObjectNoBarrier(EAX,                                             \
+  __ InitializeFieldNoBarrier(EAX,                                             \
                               FieldAddress(EAX, type_name::length_offset()),   \
                               EDI);                                            \
   /* Initialize all array elements to 0. */                                    \
@@ -1868,14 +1873,14 @@
 
   // EDI: allocation size.
   __ addl(EBX, EDI);
-  __ j(CARRY, &pop_and_fail, Assembler::kNearJump);
+  __ j(CARRY, &pop_and_fail);
 
   // Check if the allocation fits into the remaining space.
   // EAX: potential new object start.
   // EBX: potential next object start.
   // EDI: allocation size.
   __ cmpl(EBX, Address::Absolute(heap->EndAddress(space)));
-  __ j(ABOVE_EQUAL, &pop_and_fail, Assembler::kNearJump);
+  __ j(ABOVE_EQUAL, &pop_and_fail);
 
   // Successfully allocated the object(s), now update top to point to
   // next object start and initialize the object.
@@ -1906,11 +1911,11 @@
 
   // Set the length field.
   __ popl(EDI);
-  __ StoreIntoObjectNoBarrier(EAX,
+  __ InitializeFieldNoBarrier(EAX,
                               FieldAddress(EAX, String::length_offset()),
                               EDI);
   // Clear hash.
-  __ ZeroSmiField(FieldAddress(EAX, String::hash_offset()));
+  __ ZeroInitSmiField(FieldAddress(EAX, String::hash_offset()));
   __ jmp(ok, Assembler::kNearJump);
 
   __ Bind(&pop_and_fail);
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc
index c8fb868..4f80141 100644
--- a/runtime/vm/intrinsifier_x64.cc
+++ b/runtime/vm/intrinsifier_x64.cc
@@ -76,7 +76,7 @@
   // Store backing array object in growable array object.
   __ movq(RCX, Address(RSP, kArrayOffset));  // data argument.
   // RAX is new, no barrier needed.
-  __ StoreIntoObjectNoBarrier(
+  __ InitializeFieldNoBarrier(
       RAX,
       FieldAddress(RAX, GrowableObjectArray::data_offset()),
       RCX);
@@ -84,13 +84,13 @@
   // RAX: new growable array object start as a tagged pointer.
   // Store the type argument field in the growable array object.
   __ movq(RCX, Address(RSP, kTypeArgumentsOffset));  // type argument.
-  __ StoreIntoObjectNoBarrier(
+  __ InitializeFieldNoBarrier(
       RAX,
       FieldAddress(RAX, GrowableObjectArray::type_arguments_offset()),
       RCX);
 
   // Set the length field in the growable array object to 0.
-  __ ZeroSmiField(FieldAddress(RAX, GrowableObjectArray::length_offset()));
+  __ ZeroInitSmiField(FieldAddress(RAX, GrowableObjectArray::length_offset()));
   __ ret();  // returns the newly allocated object in RAX.
 
   __ Bind(&fall_through);
@@ -286,7 +286,7 @@
   /* RAX: new object start as a tagged pointer. */                             \
   /* RCX: new object end address. */                                           \
   __ movq(RDI, Address(RSP, kArrayLengthStackOffset));  /* Array length. */    \
-  __ StoreIntoObjectNoBarrier(RAX,                                             \
+  __ InitializeFieldNoBarrier(RAX,                                             \
                               FieldAddress(RAX, type_name::length_offset()),   \
                               RDI);                                            \
   /* Initialize all array elements to 0. */                                    \
@@ -1778,11 +1778,11 @@
 
   // Set the length field.
   __ popq(RDI);
-  __ StoreIntoObjectNoBarrier(RAX,
+  __ InitializeFieldNoBarrier(RAX,
                               FieldAddress(RAX, String::length_offset()),
                               RDI);
   // Clear hash.
-  __ ZeroSmiField(FieldAddress(RAX, String::hash_offset()));
+  __ ZeroInitSmiField(FieldAddress(RAX, String::hash_offset()));
   __ jmp(ok, Assembler::kNearJump);
 
   __ Bind(&pop_and_fail);
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index e76b09e..0b3c156 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -52,6 +52,24 @@
 #define I (isolate())
 
 
+#if defined(DEBUG)
+// Helper class to ensure that a live origin_id is never reused
+// and assigned to an isolate.
+class VerifyOriginId : public IsolateVisitor {
+ public:
+  explicit VerifyOriginId(Dart_Port id) : id_(id) {}
+
+  void VisitIsolate(Isolate* isolate) {
+    ASSERT(isolate->origin_id() != id_);
+  }
+
+ private:
+  Dart_Port id_;
+  DISALLOW_COPY_AND_ASSIGN(VerifyOriginId);
+};
+#endif
+
+
 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
   void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size);
   return reinterpret_cast<uint8_t*>(new_ptr);
@@ -60,8 +78,9 @@
 
 static void SerializeObject(const Instance& obj,
                             uint8_t** obj_data,
-                            intptr_t* obj_len) {
-  MessageWriter writer(obj_data, &allocator);
+                            intptr_t* obj_len,
+                            bool allow_any_object) {
+  MessageWriter writer(obj_data, &allocator, allow_any_object);
   writer.WriteMessage(obj);
   *obj_len = writer.BytesWritten();
 }
@@ -97,8 +116,6 @@
 #endif
   bool IsCurrentIsolate() const;
   virtual Isolate* isolate() const { return isolate_; }
-  bool UnhandledExceptionCallbackHandler(const Object& message,
-                                         const UnhandledException& error);
 
  private:
   // Keep in sync with isolate_patch.dart.
@@ -117,8 +134,7 @@
   // processing of further events.
   bool HandleLibMessage(const Array& message);
 
-  bool ProcessUnhandledException(const Object& message, const Error& result);
-  RawFunction* ResolveCallbackFunction();
+  bool ProcessUnhandledException(const Error& result);
   Isolate* isolate_;
 };
 
@@ -181,7 +197,7 @@
       if (priority == kImmediateAction) {
         uint8_t* data = NULL;
         intptr_t len = 0;
-        SerializeObject(Object::null_instance(), &data, &len);
+        SerializeObject(Object::null_instance(), &data, &len, false);
         PortMap::PostMessage(new Message(send_port.Id(),
                                          data, len,
                                          Message::kNormalPriority));
@@ -195,7 +211,7 @@
         message.SetAt(3, Smi::Handle(I, Smi::New(kImmediateAction)));
         uint8_t* data = NULL;
         intptr_t len = 0;
-        SerializeObject(message, &data, &len);
+        SerializeObject(message, &data, &len, false);
         this->PostMessage(new Message(Message::kIllegalPort,
                                       data, len,
                                       Message::kNormalPriority),
@@ -223,7 +239,7 @@
         message.SetAt(3, Smi::Handle(I, Smi::New(kImmediateAction)));
         uint8_t* data = NULL;
         intptr_t len = 0;
-        SerializeObject(message, &data, &len);
+        SerializeObject(message, &data, &len, false);
         this->PostMessage(new Message(Message::kIllegalPort,
                                       data, len,
                                       Message::kNormalPriority),
@@ -272,8 +288,7 @@
     msg_handler = DartLibraryCalls::LookupHandler(message->dest_port());
     if (msg_handler.IsError()) {
       delete message;
-      return ProcessUnhandledException(Object::null_instance(),
-                                       Error::Cast(msg_handler));
+      return ProcessUnhandledException(Error::Cast(msg_handler));
     }
     if (msg_handler.IsNull()) {
       // If the port has been closed then the message will be dropped at this
@@ -293,8 +308,7 @@
   if (msg_obj.IsError()) {
     // An error occurred while reading the message.
     delete message;
-    return ProcessUnhandledException(Object::null_instance(),
-                                     Error::Cast(msg_obj));
+    return ProcessUnhandledException(Error::Cast(msg_obj));
   }
   if (!msg_obj.IsNull() && !msg_obj.IsInstance()) {
     // TODO(turnidge): We need to decide what an isolate does with
@@ -356,7 +370,7 @@
     const Object& result = Object::Handle(I,
         DartLibraryCalls::HandleMessage(msg_handler, msg));
     if (result.IsError()) {
-      success = ProcessUnhandledException(msg, Error::Cast(result));
+      success = ProcessUnhandledException(Error::Cast(result));
     } else {
       ASSERT(result.IsNull());
     }
@@ -366,71 +380,6 @@
 }
 
 
-RawFunction* IsolateMessageHandler::ResolveCallbackFunction() {
-  ASSERT(I->object_store()->unhandled_exception_handler() != NULL);
-  String& callback_name = String::Handle(I);
-  if (I->object_store()->unhandled_exception_handler() != String::null()) {
-    callback_name = I->object_store()->unhandled_exception_handler();
-  } else {
-    callback_name = String::New("_unhandledExceptionCallback");
-  }
-  Library& lib = Library::Handle(I, I->object_store()->isolate_library());
-  Function& func = Function::Handle(I, lib.LookupLocalFunction(callback_name));
-  if (func.IsNull()) {
-    lib = I->object_store()->root_library();
-    // Note: bootstrap code in builtin library may attempt to resolve a
-    // callback function before the script is fully loaded, in which case
-    // the root library may not be registered yet.
-    if (!lib.IsNull()) {
-      func = lib.LookupLocalFunction(callback_name);
-    }
-  }
-  return func.raw();
-}
-
-
-bool IsolateMessageHandler::UnhandledExceptionCallbackHandler(
-    const Object& message, const UnhandledException& error) {
-  const Instance& cause = Instance::Handle(I, error.exception());
-  const Instance& stacktrace = Instance::Handle(I, error.stacktrace());
-
-  // Wrap these args into an IsolateUncaughtException object.
-  const Array& exception_args = Array::Handle(I, Array::New(3));
-  exception_args.SetAt(0, message);
-  exception_args.SetAt(1, cause);
-  exception_args.SetAt(2, stacktrace);
-  const Object& exception = Object::Handle(I,
-      Exceptions::Create(Exceptions::kIsolateUnhandledException,
-                         exception_args));
-  if (exception.IsError()) {
-    return false;
-  }
-  ASSERT(exception.IsInstance());
-
-  // Invoke script's callback function.
-  Object& function = Object::Handle(I, ResolveCallbackFunction());
-  if (function.IsNull() || function.IsError()) {
-    return false;
-  }
-  const Array& callback_args = Array::Handle(I, Array::New(1));
-  callback_args.SetAt(0, exception);
-  const Object& result = Object::Handle(I,
-      DartEntry::InvokeFunction(Function::Cast(function), callback_args));
-  if (result.IsError()) {
-    const Error& err = Error::Cast(result);
-    OS::PrintErr("failed calling unhandled exception callback: %s\n",
-                 err.ToErrorCString());
-    return false;
-  }
-
-  ASSERT(result.IsBool());
-  bool continue_from_exception = Bool::Cast(result).value();
-  if (continue_from_exception) {
-    I->object_store()->clear_sticky_error();
-  }
-  return continue_from_exception;
-}
-
 #if defined(DEBUG)
 void IsolateMessageHandler::CheckAccess() {
   ASSERT(IsCurrentIsolate());
@@ -443,10 +392,10 @@
 }
 
 
-bool IsolateMessageHandler::ProcessUnhandledException(
-    const Object& message, const Error& result) {
+bool IsolateMessageHandler::ProcessUnhandledException(const Error& result) {
+  // Notify the debugger about specific unhandled exceptions which are withheld
+  // when being thrown.
   if (result.IsUnhandledException()) {
-    // Invoke the isolate's uncaught exception handler, if it exists.
     const UnhandledException& error = UnhandledException::Cast(result);
     RawInstance* exception = error.exception();
     if ((exception == I->object_store()->out_of_memory()) ||
@@ -454,12 +403,6 @@
       // We didn't notify the debugger when the stack was full. Do it now.
       I->debugger()->SignalExceptionThrown(Instance::Handle(exception));
     }
-    if ((exception != I->object_store()->out_of_memory()) &&
-        (exception != I->object_store()->stack_overflow())) {
-      if (UnhandledExceptionCallbackHandler(message, error)) {
-        return true;
-      }
-    }
   }
 
   // Invoke the isolate's unhandled exception callback if there is one.
@@ -498,6 +441,7 @@
       name_(NULL),
       start_time_(OS::GetCurrentTimeMicros()),
       main_port_(0),
+      origin_id_(0),
       pause_capability_(0),
       terminate_capability_(0),
       heap_(NULL),
@@ -708,6 +652,12 @@
   // main thread.
   result->SetStackLimitFromStackBase(reinterpret_cast<uword>(&result));
   result->set_main_port(PortMap::CreatePort(result->message_handler()));
+#if defined(DEBUG)
+  // Verify that we are never reusing a live origin id.
+  VerifyOriginId id_verifier(result->main_port());
+  Isolate::VisitIsolates(&id_verifier);
+#endif
+  result->set_origin_id(result->main_port());
   result->set_pause_capability(result->random()->NextUInt64());
   result->set_terminate_capability(result->random()->NextUInt64());
 
@@ -929,12 +879,6 @@
       return false;
     }
 
-    // Set up specific unhandled exception handler.
-    const String& callback_name = String::Handle(
-        isolate, String::New(state->exception_callback_name()));
-    isolate->object_store()->
-        set_unhandled_exception_handler(callback_name);
-
     Object& result = Object::Handle();
     result = state->ResolveFunction();
     bool is_spawn_uri = state->is_spawn_uri();
@@ -1551,7 +1495,6 @@
       library_url_(NULL),
       class_name_(NULL),
       function_name_(NULL),
-      exception_callback_name_(NULL),
       serialized_args_(NULL),
       serialized_args_len_(0),
       serialized_message_(NULL),
@@ -1569,8 +1512,11 @@
     const String& class_name = String::Handle(cls.Name());
     class_name_ = strdup(class_name.ToCString());
   }
-  exception_callback_name_ = strdup("_unhandledExceptionCallback");
-  SerializeObject(message, &serialized_message_, &serialized_message_len_);
+  bool can_send_any_object = true;
+  SerializeObject(message,
+                  &serialized_message_,
+                  &serialized_message_len_,
+                  can_send_any_object);
 }
 
 
@@ -1586,7 +1532,6 @@
       library_url_(NULL),
       class_name_(NULL),
       function_name_(NULL),
-      exception_callback_name_(NULL),
       serialized_args_(NULL),
       serialized_args_len_(0),
       serialized_message_(NULL),
@@ -1598,9 +1543,15 @@
   }
   library_url_ = NULL;
   function_name_ = strdup("main");
-  exception_callback_name_ = strdup("_unhandledExceptionCallback");
-  SerializeObject(args, &serialized_args_, &serialized_args_len_);
-  SerializeObject(message, &serialized_message_, &serialized_message_len_);
+  bool can_send_any_object = false;
+  SerializeObject(args,
+                  &serialized_args_,
+                  &serialized_args_len_,
+                  can_send_any_object);
+  SerializeObject(message,
+                  &serialized_message_,
+                  &serialized_message_len_,
+                  can_send_any_object);
 }
 
 
@@ -1610,7 +1561,6 @@
   free(library_url_);
   free(function_name_);
   free(class_name_);
-  free(exception_callback_name_);
   free(serialized_args_);
   free(serialized_message_);
 }
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 5302c42..d2fb921 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -170,6 +170,12 @@
     ASSERT(main_port_ == 0);  // Only set main port once.
     main_port_ = port;
   }
+  Dart_Port origin_id() const { return origin_id_; }
+  void set_origin_id(Dart_Port id) {
+    ASSERT((id == main_port_ && origin_id_ == 0) ||
+           (origin_id_ == main_port_));
+    origin_id_ = id;
+  }
   void set_pause_capability(uint64_t value) { pause_capability_ = value; }
   uint64_t pause_capability() const { return pause_capability_; }
   void set_terminate_capability(uint64_t value) {
@@ -633,6 +639,7 @@
   char* name_;
   int64_t start_time_;
   Dart_Port main_port_;
+  Dart_Port origin_id_;  // Isolates created by spawnFunc have some origin id.
   uint64_t pause_capability_;
   uint64_t terminate_capability_;
   Heap* heap_;
@@ -834,7 +841,6 @@
   char* library_url() const { return library_url_; }
   char* class_name() const { return class_name_; }
   char* function_name() const { return function_name_; }
-  char* exception_callback_name() const { return exception_callback_name_; }
   bool is_spawn_uri() const { return library_url_ == NULL; }
   bool paused() const { return paused_; }
 
@@ -851,7 +857,6 @@
   char* library_url_;
   char* class_name_;
   char* function_name_;
-  char* exception_callback_name_;
   uint8_t* serialized_args_;
   intptr_t serialized_args_len_;
   uint8_t* serialized_message_;
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
index d87ca01..ecdd2ae 100644
--- a/runtime/vm/json_stream.cc
+++ b/runtime/vm/json_stream.cc
@@ -102,7 +102,7 @@
   ASSERT(!reply.IsNull());
 
   uint8_t* data = NULL;
-  MessageWriter writer(&data, &allocator);
+  MessageWriter writer(&data, &allocator, false);
   writer.WriteMessage(reply);
   PortMap::PostMessage(new Message(port, data,
                                    writer.BytesWritten(),
diff --git a/runtime/vm/method_recognizer.h b/runtime/vm/method_recognizer.h
index 5f8f2a3..188fd4d 100644
--- a/runtime/vm/method_recognizer.h
+++ b/runtime/vm/method_recognizer.h
@@ -157,7 +157,7 @@
   V(_Smi, get:bitLength, Smi_bitLength, 869986288)                             \
   V(_Bigint, set:_neg, Bigint_setNeg, 1924982939)                              \
   V(_Bigint, set:_used, Bigint_setUsed, 1574448752)                            \
-  V(_Bigint, _set_digits, Bigint_setDigits, 1865626071)                        \
+  V(_Bigint, set:_digits, Bigint_setDigits, 1109140916)                        \
   V(_Bigint, _absAdd, Bigint_absAdd, 97148049)                                 \
   V(_Bigint, _absSub, Bigint_absSub, 159012285)                                \
   V(_Bigint, _mulAdd, Bigint_mulAdd, 1625285265)                               \
@@ -381,8 +381,7 @@
   V(_Bigint, get:_used, Bigint_getUsed, 1308559334)                            \
   V(_Bigint, set:_used, Bigint_setUsed, 1574448752)                            \
   V(_Bigint, get:_digits, Bigint_getDigits, 1408092463)                        \
-  V(_Bigint, set:_digits, Bigint_setDigits, 1625268649)                        \
-  V(_Bigint, _set_digits, Bigint_setDigits, 1865626071)                        \
+  V(_Bigint, set:_digits, Bigint_setDigits, 1109140916)                        \
 
 // A list of core function that should never be inlined.
 #define INLINE_BLACK_LIST(V)                                                   \
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index f315d20..4046022f 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -162,11 +162,14 @@
 
 // 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)                                   \
@@ -19939,7 +19942,8 @@
                                  bool is_control_port,
                                  Heap::Space space) {
   Isolate* isolate = Isolate::Current();
-  const SendPort& send_port = SendPort::Handle(isolate, SendPort::New(id));
+  const SendPort& send_port =
+      SendPort::Handle(isolate, SendPort::New(id, isolate->origin_id()));
 
   ReceivePort& result = ReceivePort::Handle(isolate);
   {
@@ -19970,6 +19974,13 @@
 
 
 RawSendPort* SendPort::New(Dart_Port id, Heap::Space space) {
+  return New(id, Isolate::Current()->origin_id(), space);
+}
+
+
+RawSendPort* SendPort::New(Dart_Port id,
+                           Dart_Port origin_id,
+                           Heap::Space space) {
   SendPort& result = SendPort::Handle();
   {
     RawObject* raw = Object::Allocate(SendPort::kClassId,
@@ -19978,6 +19989,7 @@
     NoGCScope no_gc;
     result ^= raw;
     result.StoreNonPointer(&result.raw_ptr()->id_, id);
+    result.StoreNonPointer(&result.raw_ptr()->origin_id_, origin_id);
   }
   return result.raw();
 }
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 3c9a99f..9adf134 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -7247,10 +7247,20 @@
  public:
   Dart_Port Id() const { return raw_ptr()->id_; }
 
+  Dart_Port origin_id() const { return raw_ptr()->origin_id_; }
+  void set_origin_id(Dart_Port id) const {
+    ASSERT(origin_id() == 0);
+    StoreNonPointer(&(raw_ptr()->origin_id_), id);
+  }
+
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(RawSendPort));
   }
-  static RawSendPort* New(Dart_Port id, Heap::Space space = Heap::kNew);
+  static RawSendPort* New(Dart_Port id,
+                          Heap::Space space = Heap::kNew);
+  static RawSendPort* New(Dart_Port id,
+                          Dart_Port origin_id,
+                          Heap::Space space = Heap::kNew);
 
  private:
   FINAL_HEAP_OBJECT_IMPLEMENTATION(SendPort, Instance);
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index 3cb7d03..59ba57a 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -76,7 +76,6 @@
     pending_deferred_loads_(GrowableObjectArray::null()),
     resume_capabilities_(GrowableObjectArray::null()),
     sticky_error_(Error::null()),
-    unhandled_exception_handler_(String::null()),
     empty_context_(Context::null()),
     stack_overflow_(Instance::null()),
     out_of_memory_(Instance::null()),
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 7453dba..23dad67 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -349,13 +349,6 @@
   }
   void clear_sticky_error() { sticky_error_ = Error::null(); }
 
-  RawString* unhandled_exception_handler() const {
-    return unhandled_exception_handler_;
-  }
-  void set_unhandled_exception_handler(const String& value) {
-    unhandled_exception_handler_ = value.raw();
-  }
-
   RawContext* empty_context() const { return empty_context_; }
   void set_empty_context(const Context& value) {
     empty_context_ = value.raw();
@@ -496,7 +489,6 @@
   RawGrowableObjectArray* pending_deferred_loads_;
   RawGrowableObjectArray* resume_capabilities_;
   RawError* sticky_error_;
-  RawString* unhandled_exception_handler_;
   RawContext* empty_context_;
   RawInstance* stack_overflow_;
   RawInstance* out_of_memory_;
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 4dbaa7c..e9e97b9 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1816,6 +1816,7 @@
 class RawSendPort : public RawInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(SendPort);
   Dart_Port id_;
+  Dart_Port origin_id_;
 
   friend class ReceivePort;
 };
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 46f9117..3bf9794 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -116,7 +116,17 @@
     SnapshotWriterVisitor visitor(writer);
     visitor.VisitPointers(from(), to());
   } else {
-    writer->WriteClassId(this);
+    // Until we have maps implemented as internal VM objects we will use
+    // the collections library qualifier to allow maps to be sent across.
+    if (writer->can_send_any_object() ||
+        writer->AllowObjectsInDartLibrary(ptr()->library_)) {
+      writer->WriteClassId(this);
+    } else {
+      // We do not allow regular dart instances in isolate messages.
+      writer->SetWriteException(Exceptions::kArgument,
+                                "Illegal argument in isolate message"
+                                " : (object is a regular Dart Instance)");
+    }
   }
 }
 
@@ -2666,9 +2676,10 @@
                                 intptr_t tags,
                                 Snapshot::Kind kind) {
   uint64_t id = reader->Read<uint64_t>();
+  uint64_t origin_id = reader->Read<uint64_t>();
 
   SendPort& result = SendPort::ZoneHandle(reader->isolate(),
-                                          SendPort::New(id));
+                                          SendPort::New(id, origin_id));
   reader->AddBackRef(object_id, &result, kIsDeserialized);
   return result.raw();
 }
@@ -2685,6 +2696,7 @@
   writer->WriteTags(writer->GetObjectTags(this));
 
   writer->Write<uint64_t>(ptr()->id_);
+  writer->Write<uint64_t>(ptr()->origin_id_);
 }
 
 
diff --git a/runtime/vm/regexp.cc b/runtime/vm/regexp.cc
index 93e4997..5d31fbf 100644
--- a/runtime/vm/regexp.cc
+++ b/runtime/vm/regexp.cc
@@ -5102,7 +5102,13 @@
   const intptr_t kParamCount = RegExpMacroAssembler::kParamCount;
 
   Function& fn = Function::Handle(isolate, Function::New(
-      Symbols::IrregExp(),
+      // Append the regexp pattern to the function name.
+      String::Handle(isolate, Symbols::New(
+          String::Handle(isolate, String::Concat(
+              String::Handle(isolate, String::Concat(
+                  Symbols::Irregexp(),
+                  Symbols::ColonSpace(), Heap::kOld)),
+              String::Handle(regexp.pattern()), Heap::kOld)))),
       RawFunction::kIrregexpFunction,
       true,  // Static.
       false,  // Not const.
diff --git a/runtime/vm/regexp_assembler.cc b/runtime/vm/regexp_assembler.cc
index 4a2fed2..4ecf4c1 100644
--- a/runtime/vm/regexp_assembler.cc
+++ b/runtime/vm/regexp_assembler.cc
@@ -217,8 +217,8 @@
 
   const intptr_t entries_count = entry_block_->indirect_entries().length();
 
-  GrowableObjectArray& offsets = GrowableObjectArray::ZoneHandle(
-      I, GrowableObjectArray::New(entries_count, Heap::kOld));
+  TypedData& offsets = TypedData::ZoneHandle(I,
+      TypedData::New(kTypedDataInt32ArrayCid, entries_count, Heap::kOld));
 
   PushArgumentInstr* block_offsets_push =
       PushArgument(Bind(new(I) ConstantInstr(offsets)));
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc
index 56f9f99..5ea4ad4 100644
--- a/runtime/vm/scavenger.cc
+++ b/runtime/vm/scavenger.cc
@@ -327,7 +327,8 @@
 SemiSpace::~SemiSpace() {
   if (reserved_ != NULL) {
 #if defined(DEBUG)
-    memset(reserved_->address(), kZapValue, size_in_words() << kWordSizeLog2);
+    memset(reserved_->address(), Heap::kZapByte,
+           size_in_words() << kWordSizeLog2);
 #endif  // defined(DEBUG)
     delete reserved_;
   }
@@ -366,7 +367,7 @@
       return NULL;
     }
 #if defined(DEBUG)
-    memset(reserved->address(), kZapValue, size_in_bytes);
+    memset(reserved->address(), Heap::kZapByte, size_in_bytes);
     VerifiedMemory::Accept(reserved->start(), size_in_bytes);
 #endif  // defined(DEBUG)
     return new SemiSpace(reserved);
@@ -378,7 +379,7 @@
 #ifdef DEBUG
   if (reserved_ != NULL) {
     const intptr_t size_in_bytes = size_in_words() << kWordSizeLog2;
-    memset(reserved_->address(), kZapValue, size_in_bytes);
+    memset(reserved_->address(), Heap::kZapByte, size_in_bytes);
     VerifiedMemory::Accept(reserved_->start(), size_in_bytes);
   }
 #endif
diff --git a/runtime/vm/scavenger.h b/runtime/vm/scavenger.h
index 75af237..117b3fe 100644
--- a/runtime/vm/scavenger.h
+++ b/runtime/vm/scavenger.h
@@ -61,10 +61,6 @@
 
   static SemiSpace* cache_;
   static Mutex* mutex_;
-
-#ifdef DEBUG
-  static const intptr_t kZapValue = 0xf3;
-#endif
 };
 
 
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 018e65e..1aae8ae 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -228,7 +228,7 @@
 
   // Serialize message.
   uint8_t* data = NULL;
-  MessageWriter writer(&data, &allocator);
+  MessageWriter writer(&data, &allocator, false);
   writer.WriteMessage(message);
 
   // TODO(turnidge): Throw an exception when the return value is false?
@@ -497,7 +497,7 @@
                                 name));
   ASSERT(!list.IsNull());
   uint8_t* data = NULL;
-  MessageWriter writer(&data, &allocator);
+  MessageWriter writer(&data, &allocator, false);
   writer.WriteMessage(list);
   intptr_t len = writer.BytesWritten();
   if (FLAG_trace_service) {
@@ -525,7 +525,7 @@
                                 name));
   ASSERT(!list.IsNull());
   uint8_t* data = NULL;
-  MessageWriter writer(&data, &allocator);
+  MessageWriter writer(&data, &allocator, false);
   writer.WriteMessage(list);
   intptr_t len = writer.BytesWritten();
   if (FLAG_trace_service) {
@@ -2633,7 +2633,7 @@
 
   // Push the event to port_.
   uint8_t* data = NULL;
-  MessageWriter writer(&data, &allocator);
+  MessageWriter writer(&data, &allocator, false);
   writer.WriteMessage(list);
   intptr_t len = writer.BytesWritten();
   if (FLAG_trace_service) {
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index d7b1c4b..7bbf5ef 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -1039,7 +1039,8 @@
 SnapshotWriter::SnapshotWriter(Snapshot::Kind kind,
                                uint8_t** buffer,
                                ReAlloc alloc,
-                               intptr_t initial_size)
+                               intptr_t initial_size,
+                               bool can_send_any_object)
     : BaseWriter(buffer, alloc, initial_size),
       kind_(kind),
       isolate_(Isolate::Current()),
@@ -1048,7 +1049,8 @@
       forward_list_(kMaxPredefinedObjectIds),
       exception_type_(Exceptions::kNone),
       exception_msg_(NULL),
-      unmarked_objects_(false) {
+      unmarked_objects_(false),
+      can_send_any_object_(can_send_any_object) {
 }
 
 
@@ -1708,9 +1710,15 @@
 }
 
 
+bool SnapshotWriter::AllowObjectsInDartLibrary(RawLibrary* library) {
+  return (library == object_store()->collection_library() ||
+          library == object_store()->typed_data_library());
+}
+
+
 void SnapshotWriter::ThrowException(Exceptions::ExceptionType type,
                                     const char* msg) {
-  isolate()->object_store()->clear_sticky_error();
+  object_store()->clear_sticky_error();
   UnmarkAll();
   if (msg != NULL) {
     const String& msg_obj = String::Handle(String::New(msg));
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 0b3e994..f0ef323 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -568,7 +568,8 @@
   SnapshotWriter(Snapshot::Kind kind,
                  uint8_t** buffer,
                  ReAlloc alloc,
-                 intptr_t initial_size);
+                 intptr_t initial_size,
+                 bool can_send_any_object);
 
  public:
   // Snapshot kind.
@@ -589,6 +590,7 @@
   void set_exception_msg(const char* msg) {
     exception_msg_ = msg;
   }
+  bool can_send_any_object() const { return can_send_any_object_; }
   void ThrowException(Exceptions::ExceptionType type, const char* msg);
 
   // Write a version string for the snapshot.
@@ -623,6 +625,7 @@
                      RawClass* cls,
                      intptr_t tags);
   void WriteInstanceRef(RawObject* raw, RawClass* cls);
+  bool AllowObjectsInDartLibrary(RawLibrary* library);
 
   Isolate* isolate() const { return isolate_; }
   ObjectStore* object_store() const { return object_store_; }
@@ -636,6 +639,7 @@
   Exceptions::ExceptionType exception_type_;  // Exception type.
   const char* exception_msg_;  // Message associated with exception.
   bool unmarked_objects_;  // True if marked objects have been unmarked.
+  bool can_send_any_object_;  // True if any Dart instance can be sent.
 
   friend class RawArray;
   friend class RawClass;
@@ -663,7 +667,7 @@
  public:
   static const intptr_t kInitialSize = 64 * KB;
   FullSnapshotWriter(uint8_t** buffer, ReAlloc alloc)
-      : SnapshotWriter(Snapshot::kFull, buffer, alloc, kInitialSize) {
+      : SnapshotWriter(Snapshot::kFull, buffer, alloc, kInitialSize, true) {
     ASSERT(buffer != NULL);
     ASSERT(alloc != NULL);
   }
@@ -681,7 +685,7 @@
  public:
   static const intptr_t kInitialSize = 64 * KB;
   ScriptSnapshotWriter(uint8_t** buffer, ReAlloc alloc)
-      : SnapshotWriter(Snapshot::kScript, buffer, alloc, kInitialSize) {
+      : SnapshotWriter(Snapshot::kScript, buffer, alloc, kInitialSize, true) {
     ASSERT(buffer != NULL);
     ASSERT(alloc != NULL);
   }
@@ -698,8 +702,12 @@
 class MessageWriter : public SnapshotWriter {
  public:
   static const intptr_t kInitialSize = 512;
-  MessageWriter(uint8_t** buffer, ReAlloc alloc)
-      : SnapshotWriter(Snapshot::kMessage, buffer, alloc, kInitialSize) {
+  MessageWriter(uint8_t** buffer, ReAlloc alloc, bool can_send_any_object)
+      : SnapshotWriter(Snapshot::kMessage,
+                       buffer,
+                       alloc,
+                       kInitialSize,
+                       can_send_any_object) {
     ASSERT(buffer != NULL);
     ASSERT(alloc != NULL);
   }
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index fe78fda..53fb9a6 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -151,7 +151,7 @@
 
   // Write snapshot with object content.
   uint8_t* buffer;
-  MessageWriter writer(&buffer, &zone_allocator);
+  MessageWriter writer(&buffer, &zone_allocator, true);
   const Object& null_object = Object::Handle();
   writer.WriteMessage(null_object);
   intptr_t buffer_len = writer.BytesWritten();
@@ -177,7 +177,7 @@
 
   // Write snapshot with object content.
   uint8_t* buffer;
-  MessageWriter writer(&buffer, &zone_allocator);
+  MessageWriter writer(&buffer, &zone_allocator, true);
   const Smi& smi = Smi::Handle(Smi::New(124));
   writer.WriteMessage(smi);
   intptr_t buffer_len = writer.BytesWritten();
@@ -204,7 +204,7 @@
 
   // Write snapshot with object content.
   uint8_t* buffer;
-  MessageWriter writer(&buffer, &zone_allocator);
+  MessageWriter writer(&buffer, &zone_allocator, true);
   const Smi& smi = Smi::Handle(Smi::New(-1));
   writer.WriteMessage(smi);
   intptr_t buffer_len = writer.BytesWritten();
@@ -229,7 +229,7 @@
 Dart_CObject* SerializeAndDeserializeMint(const Mint& mint) {
   // Write snapshot with object content.
   uint8_t* buffer;
-  MessageWriter writer(&buffer, &zone_allocator);
+  MessageWriter writer(&buffer, &zone_allocator, true);
   writer.WriteMessage(mint);
   intptr_t buffer_len = writer.BytesWritten();
 
@@ -299,7 +299,7 @@
 
   // Write snapshot with object content.
   uint8_t* buffer;
-  MessageWriter writer(&buffer, &zone_allocator);
+  MessageWriter writer(&buffer, &zone_allocator, true);
   const Double& dbl = Double::Handle(Double::New(101.29));
   writer.WriteMessage(dbl);
   intptr_t buffer_len = writer.BytesWritten();
@@ -326,7 +326,7 @@
 
   // Write snapshot with true object.
   uint8_t* buffer;
-  MessageWriter writer(&buffer, &zone_allocator);
+  MessageWriter writer(&buffer, &zone_allocator, true);
   const Bool& bl = Bool::True();
   writer.WriteMessage(bl);
   intptr_t buffer_len = writer.BytesWritten();
@@ -355,7 +355,7 @@
 
   // Write snapshot with false object.
   uint8_t* buffer;
-  MessageWriter writer(&buffer, &zone_allocator);
+  MessageWriter writer(&buffer, &zone_allocator, true);
   const Bool& bl = Bool::False();
   writer.WriteMessage(bl);
   intptr_t buffer_len = writer.BytesWritten();
@@ -387,7 +387,7 @@
 
   // Write snapshot with object content.
   uint8_t* buffer;
-  MessageWriter writer(&buffer, &zone_allocator);
+  MessageWriter writer(&buffer, &zone_allocator, true);
   const char* cstr = "0x270FFFFFFFFFFFFFD8F0";
   const String& str = String::Handle(String::New(cstr));
   Bigint& bigint = Bigint::Handle();
@@ -419,7 +419,7 @@
 Dart_CObject* SerializeAndDeserializeBigint(const Bigint& bigint) {
   // Write snapshot with object content.
   uint8_t* buffer;
-  MessageWriter writer(&buffer, &zone_allocator);
+  MessageWriter writer(&buffer, &zone_allocator, true);
   writer.WriteMessage(bigint);
   intptr_t buffer_len = writer.BytesWritten();
 
@@ -471,7 +471,7 @@
 TEST_CASE(SerializeSingletons) {
   // Write snapshot with object content.
   uint8_t* buffer;
-  MessageWriter writer(&buffer, &malloc_allocator);
+  MessageWriter writer(&buffer, &malloc_allocator, true);
   writer.WriteObject(Object::class_class());
   writer.WriteObject(Object::type_arguments_class());
   writer.WriteObject(Object::function_class());
@@ -513,7 +513,7 @@
   EXPECT(Utf8::IsValid(reinterpret_cast<const uint8_t*>(cstr), strlen(cstr)));
   // Write snapshot with object content.
   uint8_t* buffer;
-  MessageWriter writer(&buffer, &zone_allocator);
+  MessageWriter writer(&buffer, &zone_allocator, true);
   String& str = String::Handle(String::New(cstr));
   writer.WriteMessage(str);
   intptr_t buffer_len = writer.BytesWritten();
@@ -555,7 +555,7 @@
 
   // Write snapshot with object content.
   uint8_t* buffer;
-  MessageWriter writer(&buffer, &zone_allocator);
+  MessageWriter writer(&buffer, &zone_allocator, true);
   const int kArrayLength = 10;
   Array& array = Array::Handle(Array::New(kArrayLength));
   Smi& smi = Smi::Handle();
@@ -645,7 +645,7 @@
 
   // Write snapshot with object content.
   uint8_t* buffer;
-  MessageWriter writer(&buffer, &zone_allocator);
+  MessageWriter writer(&buffer, &zone_allocator, true);
   const int kArrayLength = 0;
   Array& array = Array::Handle(Array::New(kArrayLength));
   writer.WriteMessage(array);
@@ -674,7 +674,7 @@
 
   // Write snapshot with object content.
   uint8_t* buffer;
-  MessageWriter writer(&buffer, &zone_allocator);
+  MessageWriter writer(&buffer, &zone_allocator, true);
   const int kTypedDataLength = 256;
   TypedData& typed_data = TypedData::Handle(
       TypedData::New(kTypedDataUint8ArrayCid, kTypedDataLength));
@@ -708,7 +708,7 @@
   {                                                                           \
     StackZone zone(Isolate::Current());                                       \
     uint8_t* buffer;                                                          \
-    MessageWriter writer(&buffer, &zone_allocator);                           \
+    MessageWriter writer(&buffer, &zone_allocator, true);                     \
     const int kArrayLength = 127;                                             \
     TypedData& array = TypedData::Handle(                                     \
         TypedData::New(kTypedData##darttype##ArrayCid, kArrayLength));        \
@@ -739,7 +739,7 @@
                                reinterpret_cast<uint8_t*>(data), length));    \
     intptr_t scale = array.ElementSizeInBytes();                              \
     uint8_t* buffer;                                                          \
-    MessageWriter writer(&buffer, &zone_allocator);                           \
+    MessageWriter writer(&buffer, &zone_allocator, true);                     \
     writer.WriteMessage(array);                                               \
     intptr_t buffer_len = writer.BytesWritten();                              \
     SnapshotReader reader(buffer, buffer_len,                                 \
@@ -786,7 +786,7 @@
 
   // Write snapshot with object content.
   uint8_t* buffer;
-  MessageWriter writer(&buffer, &zone_allocator);
+  MessageWriter writer(&buffer, &zone_allocator, true);
   const int kTypedDataLength = 0;
   TypedData& typed_data = TypedData::Handle(
       TypedData::New(kTypedDataUint8ArrayCid, kTypedDataLength));
@@ -816,7 +816,7 @@
  public:
   static const intptr_t kInitialSize = 64 * KB;
   TestSnapshotWriter(uint8_t** buffer, ReAlloc alloc)
-      : SnapshotWriter(Snapshot::kScript, buffer, alloc, kInitialSize) {
+      : SnapshotWriter(Snapshot::kScript, buffer, alloc, kInitialSize, true) {
     ASSERT(buffer != NULL);
     ASSERT(alloc != NULL);
   }
@@ -1463,7 +1463,7 @@
 
   // Serialize the list into a message.
   uint8_t* buffer;
-  MessageWriter writer(&buffer, &zone_allocator);
+  MessageWriter writer(&buffer, &zone_allocator, false);
   const Object& list = Object::Handle(Api::UnwrapHandle(result));
   writer.WriteMessage(list);
   intptr_t buffer_len = writer.BytesWritten();
@@ -1477,7 +1477,7 @@
 static void CheckString(Dart_Handle dart_string, const char* expected) {
   StackZone zone(Isolate::Current());
   uint8_t* buffer;
-  MessageWriter writer(&buffer, &zone_allocator);
+  MessageWriter writer(&buffer, &zone_allocator, false);
   String& str = String::Handle();
   str ^= Api::UnwrapHandle(dart_string);
   writer.WriteMessage(str);
@@ -1497,7 +1497,7 @@
 static void CheckStringInvalid(Dart_Handle dart_string) {
   StackZone zone(Isolate::Current());
   uint8_t* buffer;
-  MessageWriter writer(&buffer, &zone_allocator);
+  MessageWriter writer(&buffer, &zone_allocator, false);
   String& str = String::Handle();
   str ^= Api::UnwrapHandle(dart_string);
   writer.WriteMessage(str);
@@ -1607,7 +1607,7 @@
     {
       StackZone zone(Isolate::Current());
       uint8_t* buffer;
-      MessageWriter writer(&buffer, &zone_allocator);
+      MessageWriter writer(&buffer, &zone_allocator, false);
       Smi& smi = Smi::Handle();
       smi ^= Api::UnwrapHandle(smi_result);
       writer.WriteMessage(smi);
@@ -1625,7 +1625,7 @@
     {
       StackZone zone(Isolate::Current());
       uint8_t* buffer;
-      MessageWriter writer(&buffer, &zone_allocator);
+      MessageWriter writer(&buffer, &zone_allocator, false);
       Bigint& bigint = Bigint::Handle();
       bigint ^= Api::UnwrapHandle(bigint_result);
       writer.WriteMessage(bigint);
@@ -2725,7 +2725,7 @@
 TEST_CASE(OmittedObjectEncodingLength) {
   StackZone zone(Isolate::Current());
   uint8_t* buffer;
-  MessageWriter writer(&buffer, &zone_allocator);
+  MessageWriter writer(&buffer, &zone_allocator, true);
   writer.WriteInlinedObjectHeader(kOmittedObjectId);
   // For performance, we'd like single-byte headers when ids are omitted.
   // If this starts failing, consider renumbering the snapshot ids.
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 576087a..611d119 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -369,7 +369,7 @@
   __ Bind(&loop);
   __ movl(EDI, Address(EBX, 0));
   // No generational barrier needed, since array is in new space.
-  __ StoreIntoObjectNoBarrier(EAX, Address(ECX, 0), EDI);
+  __ InitializeFieldNoBarrier(EAX, Address(ECX, 0), EDI);
   __ AddImmediate(ECX, Immediate(kWordSize));
   __ AddImmediate(EBX, Immediate(-kWordSize));
   __ Bind(&loop_condition);
@@ -631,12 +631,12 @@
   // ECX: array element type.
   // EDX: Array length as Smi (preserved).
   // Store the type argument field.
-  __ StoreIntoObjectNoBarrier(EAX,
+  __ InitializeFieldNoBarrier(EAX,
                               FieldAddress(EAX, Array::type_arguments_offset()),
                               ECX);
 
   // Set the length field.
-  __ StoreIntoObjectNoBarrier(EAX,
+  __ InitializeFieldNoBarrier(EAX,
                               FieldAddress(EAX, Array::length_offset()),
                               EDX);
 
@@ -654,7 +654,7 @@
   __ cmpl(EDI, EBX);
   __ j(ABOVE_EQUAL, &done, Assembler::kNearJump);
   // No generational barrier needed, since we are storing null.
-  __ StoreIntoObjectNoBarrier(EAX, Address(EDI, 0), Object::null_object());
+  __ InitializeFieldNoBarrier(EAX, Address(EDI, 0), Object::null_object());
   __ addl(EDI, Immediate(kWordSize));
   __ jmp(&init_loop, Assembler::kNearJump);
   __ Bind(&done);
@@ -813,7 +813,12 @@
     if (FLAG_use_slow_path) {
       __ jmp(&slow_case);
     } else {
-      __ j(ABOVE_EQUAL, &slow_case, Assembler::kNearJump);
+#if defined(DEBUG)
+      static const bool kJumpLength = Assembler::kFarJump;
+#else
+      static const bool kJumpLength = Assembler::kNearJump;
+#endif  // DEBUG
+      __ j(ABOVE_EQUAL, &slow_case, kJumpLength);
     }
 
     // Successfully allocated the object, now update top to point to
@@ -861,7 +866,7 @@
     // EAX: new object.
     // EDX: number of context variables.
     // No generational barrier needed, since we are storing null.
-    __ StoreIntoObjectNoBarrier(EAX,
+    __ InitializeFieldNoBarrier(EAX,
                                 FieldAddress(EAX, Context::parent_offset()),
                                 Object::null_object());
 
@@ -876,7 +881,7 @@
       __ Bind(&loop);
       __ decl(EDX);
       // No generational barrier needed, since we are storing null.
-      __ StoreIntoObjectNoBarrier(EAX,
+      __ InitializeFieldNoBarrier(EAX,
                                   Address(EBX, EDX, TIMES_4, 0),
                                   Object::null_object());
       __ Bind(&entry);
@@ -1054,7 +1059,7 @@
       for (intptr_t current_offset = Instance::NextFieldOffset();
            current_offset < instance_size;
            current_offset += kWordSize) {
-        __ StoreIntoObjectNoBarrier(EAX,
+        __ InitializeFieldNoBarrier(EAX,
                                     FieldAddress(EAX, current_offset),
                                     Object::null_object());
       }
@@ -1070,7 +1075,7 @@
       __ Bind(&init_loop);
       __ cmpl(ECX, EBX);
       __ j(ABOVE_EQUAL, &done, Assembler::kNearJump);
-      __ StoreIntoObjectNoBarrier(EAX,
+      __ InitializeFieldNoBarrier(EAX,
                                   Address(ECX, 0),
                                   Object::null_object());
       __ addl(ECX, Immediate(kWordSize));
@@ -1081,7 +1086,8 @@
       // EDX: new object type arguments.
       // Set the type arguments in the new object.
       intptr_t offset = cls.type_arguments_field_offset();
-      __ StoreIntoObjectNoBarrier(EAX, FieldAddress(EAX, offset), EDX);
+      // TODO(koda): Figure out why previous content is sometimes null here.
+      __ InitializeFieldNoBarrier(EAX, FieldAddress(EAX, offset), EDX);
     }
     // Done allocating and initializing the instance.
     // EAX: new object (tagged).
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index d62e613..16e0858 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -364,11 +364,16 @@
   // R12: address of first argument on stack.
   // RBX: address of first argument in array.
   Label loop, loop_condition;
-  __ jmp(&loop_condition, Assembler::kNearJump);
+#if defined(DEBUG)
+  static const bool kJumpLength = Assembler::kFarJump;
+#else
+  static const bool kJumpLength = Assembler::kNearJump;
+#endif  // DEBUG
+  __ jmp(&loop_condition, kJumpLength);
   __ Bind(&loop);
   __ movq(RDI, Address(R12, 0));
   // No generational barrier needed, since array is in new space.
-  __ StoreIntoObjectNoBarrier(RAX, Address(RBX, 0), RDI);
+  __ InitializeFieldNoBarrier(RAX, Address(RBX, 0), RDI);
   __ addq(RBX, Immediate(kWordSize));
   __ subq(R12, Immediate(kWordSize));
   __ Bind(&loop_condition);
@@ -632,12 +637,12 @@
 
   // RAX: new object start as a tagged pointer.
   // Store the type argument field.
-  __ StoreIntoObjectNoBarrier(RAX,
+  __ InitializeFieldNoBarrier(RAX,
                               FieldAddress(RAX, Array::type_arguments_offset()),
                               RBX);
 
   // Set the length field.
-  __ StoreIntoObjectNoBarrier(RAX,
+  __ InitializeFieldNoBarrier(RAX,
                               FieldAddress(RAX, Array::length_offset()),
                               R10);
 
@@ -652,11 +657,16 @@
   Label init_loop;
   __ Bind(&init_loop);
   __ cmpq(RDI, RCX);
-  __ j(ABOVE_EQUAL, &done, Assembler::kNearJump);
+#if defined(DEBUG)
+  static const bool kJumpLength = Assembler::kFarJump;
+#else
+  static const bool kJumpLength = Assembler::kNearJump;
+#endif  // DEBUG
+  __ j(ABOVE_EQUAL, &done, kJumpLength);
   // No generational barrier needed, since we are storing null.
-  __ StoreIntoObjectNoBarrier(RAX, Address(RDI, 0), R12);
+  __ InitializeFieldNoBarrier(RAX, Address(RDI, 0), R12);
   __ addq(RDI, Immediate(kWordSize));
-  __ jmp(&init_loop, Assembler::kNearJump);
+  __ jmp(&init_loop, kJumpLength);
   __ Bind(&done);
   __ ret();  // returns the newly allocated object in RAX.
 
@@ -888,7 +898,7 @@
     // RAX: new object.
     // R10: number of context variables.
     // No generational barrier needed, since we are storing null.
-    __ StoreIntoObjectNoBarrier(RAX,
+    __ InitializeFieldNoBarrier(RAX,
                                 FieldAddress(RAX, Context::parent_offset()),
                                 R12);
 
@@ -898,12 +908,16 @@
     {
       Label loop, entry;
       __ leaq(R13, FieldAddress(RAX, Context::variable_offset(0)));
-
-      __ jmp(&entry, Assembler::kNearJump);
+#if defined(DEBUG)
+      static const bool kJumpLength = Assembler::kFarJump;
+#else
+      static const bool kJumpLength = Assembler::kNearJump;
+#endif  // DEBUG
+      __ jmp(&entry, kJumpLength);
       __ Bind(&loop);
       __ decq(R10);
       // No generational barrier needed, since we are storing null.
-      __ StoreIntoObjectNoBarrier(RAX,
+      __ InitializeFieldNoBarrier(RAX,
                                   Address(R13, R10, TIMES_8, 0),
                                   R12);
       __ Bind(&entry);
@@ -1077,7 +1091,7 @@
       for (intptr_t current_offset = Instance::NextFieldOffset();
            current_offset < instance_size;
            current_offset += kWordSize) {
-        __ StoreIntoObjectNoBarrier(RAX,
+        __ InitializeFieldNoBarrier(RAX,
                                     FieldAddress(RAX, current_offset),
                                     R12);
       }
@@ -1092,8 +1106,13 @@
       Label done;
       __ Bind(&init_loop);
       __ cmpq(RCX, RBX);
-      __ j(ABOVE_EQUAL, &done, Assembler::kNearJump);
-      __ StoreIntoObjectNoBarrier(RAX, Address(RCX, 0), R12);
+#if defined(DEBUG)
+      static const bool kJumpLength = Assembler::kFarJump;
+#else
+      static const bool kJumpLength = Assembler::kNearJump;
+#endif  // DEBUG
+      __ j(ABOVE_EQUAL, &done, kJumpLength);
+      __ InitializeFieldNoBarrier(RAX, Address(RCX, 0), R12);
       __ addq(RCX, Immediate(kWordSize));
       __ jmp(&init_loop, Assembler::kNearJump);
       __ Bind(&done);
@@ -1102,7 +1121,7 @@
       // RDX: new object type arguments.
       // Set the type arguments in the new object.
       intptr_t offset = cls.type_arguments_field_offset();
-      __ StoreIntoObjectNoBarrier(RAX, FieldAddress(RAX, offset), RDX);
+      __ InitializeFieldNoBarrier(RAX, FieldAddress(RAX, offset), RDX);
     }
     // Done allocating and initializing the instance.
     // RAX: new object (tagged).
@@ -1630,7 +1649,12 @@
   __ LoadIsolate(RAX);
   __ movzxb(RAX, Address(RAX, Isolate::single_step_offset()));
   __ cmpq(RAX, Immediate(0));
-  __ j(NOT_EQUAL, &stepping, Assembler::kNearJump);
+#if defined(DEBUG)
+      static const bool kJumpLength = Assembler::kFarJump;
+#else
+      static const bool kJumpLength = Assembler::kNearJump;
+#endif  // DEBUG
+  __ j(NOT_EQUAL, &stepping, kJumpLength);
   __ Bind(&done_stepping);
 
   // RBX: IC data object (preserved).
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index b3e6bcb..2dc9f24 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -148,7 +148,6 @@
   V(_Smi, "_Smi")                                                              \
   V(_Mint, "_Mint")                                                            \
   V(_Bigint, "_Bigint")                                                        \
-  V(_BigintFromDoubleFactory, "_Bigint._fromDouble")                           \
   V(_Double, "_Double")                                                        \
   V(Bool, "bool")                                                              \
   V(True, "true")                                                              \
@@ -171,7 +170,7 @@
   V(StackTrace, "StackTrace")                                                  \
   V(JSSyntaxRegExp, "_JSSyntaxRegExp")                                         \
   V(RegExp, "RegExp")                                                          \
-  V(IrregExp, ":irregexp")                                                     \
+  V(Irregexp, ":irregexp")                                                     \
   V(Object, "Object")                                                          \
   V(Int, "int")                                                                \
   V(Double, "double")                                                          \
@@ -273,7 +272,6 @@
   V(UnsupportedError, "UnsupportedError")                                      \
   V(StackOverflowError, "StackOverflowError")                                  \
   V(OutOfMemoryError, "OutOfMemoryError")                                      \
-  V(InternalError, "_InternalError")                                           \
   V(NullThrownError, "NullThrownError")                                        \
   V(IsolateSpawnException, "IsolateSpawnException")                            \
   V(IsolateUnhandledException, "_IsolateUnhandledException")                   \
diff --git a/runtime/vm/zone.cc b/runtime/vm/zone.cc
index dc8dcf2..b16c030 100644
--- a/runtime/vm/zone.cc
+++ b/runtime/vm/zone.cc
@@ -63,6 +63,7 @@
 Zone::Segment* Zone::Segment::New(intptr_t size, Zone::Segment* next) {
   ASSERT(size >= 0);
   Segment* result = reinterpret_cast<Segment*>(new uint8_t[size]);
+  ASSERT(Utils::IsAligned(result->start(), Zone::kAlignment));
   if (result != NULL) {
 #ifdef DEBUG
     // Zap the entire allocated segment (including the header).
diff --git a/runtime/vm/zone.h b/runtime/vm/zone.h
index fea44c9..0d89c5d 100644
--- a/runtime/vm/zone.h
+++ b/runtime/vm/zone.h
@@ -67,6 +67,7 @@
       large_segments_(NULL),
       handles_(),
       previous_(NULL) {
+    ASSERT(Utils::IsAligned(position_, kAlignment));
 #ifdef DEBUG
     // Zap the entire initial buffer.
     memset(initial_buffer_.pointer(), kZapUninitializedByte,
@@ -84,7 +85,7 @@
   }
 
   // All pointers returned from AllocateUnsafe() and New() have this alignment.
-  static const intptr_t kAlignment = kWordSize;
+  static const intptr_t kAlignment = kDoubleSize;
 
   // Default initial chunk size.
   static const intptr_t kInitialChunkSize = 1 * KB;
@@ -112,16 +113,32 @@
   // Delete all objects and free all memory allocated in the zone.
   void DeleteAll();
 
+  // Does not actually free any memory. Enables templated containers like
+  // BaseGrowableArray to use different allocators.
+  template <class ElementType>
+  void Free(ElementType* old_array, intptr_t len) {
+#ifdef DEBUG
+    if (len > 0) {
+      memset(old_array, kZapUninitializedByte, len * sizeof(ElementType));
+    }
+#endif
+  }
+
 #if defined(DEBUG)
   // Dump the current allocated sizes in the zone object.
   void DumpZoneSizes();
 #endif
 
+  // Overflow check (FATAL) for array length.
+  template <class ElementType>
+  static inline void CheckLength(intptr_t len);
+
   // This buffer is used for allocation before any segments.
   // This would act as the initial stack allocated chunk so that we don't
   // end up calling malloc/free on zone scopes that allocate less than
   // kChunkSize
-  uint8_t buffer_[kInitialChunkSize];
+  COMPILE_ASSERT(kAlignment <= 8);
+  ALIGN8 uint8_t buffer_[kInitialChunkSize];
   MemoryRegion initial_buffer_;
 
   // The free region in the current (head) segment or the initial buffer is
@@ -149,7 +166,8 @@
 
   friend class StackZone;
   friend class ApiZone;
-  template<typename T, typename B> friend class BaseGrowableArray;
+  template<typename T, typename B, typename Allocator>
+  friend class BaseGrowableArray;
   DISALLOW_COPY_AND_ASSIGN(Zone);
 };
 
@@ -225,26 +243,48 @@
   return result;
 }
 
+
+template <class ElementType>
+inline void Zone::CheckLength(intptr_t len) {
+  const intptr_t kElementSize = sizeof(ElementType);
+  if (len > (kIntptrMax / kElementSize)) {
+    FATAL2("Zone::Alloc: 'len' is too large: len=%" Pd ", kElementSize=%" Pd,
+           len, kElementSize);
+  }
+}
+
+
 template <class ElementType>
 inline ElementType* Zone::Alloc(intptr_t len) {
-  const intptr_t element_size = sizeof(ElementType);
-  if (len > (kIntptrMax / element_size)) {
-    FATAL2("Zone::Alloc: 'len' is too large: len=%" Pd ", element_size=%" Pd,
-           len, element_size);
-  }
-  return reinterpret_cast<ElementType*>(AllocUnsafe(len * element_size));
+  CheckLength<ElementType>(len);
+  return reinterpret_cast<ElementType*>(AllocUnsafe(len * sizeof(ElementType)));
 }
 
 template <class ElementType>
 inline ElementType* Zone::Realloc(ElementType* old_data,
-                                      intptr_t old_len,
-                                      intptr_t new_len) {
+                                  intptr_t old_len,
+                                  intptr_t new_len) {
+  CheckLength<ElementType>(new_len);
+  const intptr_t kElementSize = sizeof(ElementType);
+  uword old_end = reinterpret_cast<uword>(old_data) + (old_len * kElementSize);
+  // Resize existing allocation if nothing was allocated in between...
+  if (Utils::RoundUp(old_end, kAlignment) == position_) {
+    uword new_end =
+        reinterpret_cast<uword>(old_data) + (new_len * kElementSize);
+    // ...and there is sufficient space.
+    if (new_end <= limit_) {
+      position_ = Utils::RoundUp(new_end, kAlignment);
+      return old_data;
+    }
+  }
+  if (new_len <= old_len) {
+    return old_data;
+  }
   ElementType* new_data = Alloc<ElementType>(new_len);
   if (old_data != 0) {
     memmove(reinterpret_cast<void*>(new_data),
             reinterpret_cast<void*>(old_data),
-            Utils::Minimum(old_len * sizeof(ElementType),
-                           new_len * sizeof(ElementType)));
+            old_len * kElementSize);
   }
   return new_data;
 }
diff --git a/sdk/lib/_internal/compiler/js_lib/interceptors.dart b/sdk/lib/_internal/compiler/js_lib/interceptors.dart
index 22e2e91..accb591 100644
--- a/sdk/lib/_internal/compiler/js_lib/interceptors.dart
+++ b/sdk/lib/_internal/compiler/js_lib/interceptors.dart
@@ -5,7 +5,8 @@
 library _interceptors;
 
 import 'dart:_js_embedded_names' show
-    DISPATCH_PROPERTY_NAME;
+    DISPATCH_PROPERTY_NAME,
+    MAP_TYPE_TO_INTERCEPTOR;
 
 import 'dart:collection';
 import 'dart:_internal' hide Symbol;
@@ -175,14 +176,6 @@
 }
 
 /**
- * If [JSInvocationMirror._invokeOn] is being used, this variable
- * contains a JavaScript array with the names of methods that are
- * intercepted.
- */
-var interceptedNames;
-
-
-/**
  * Data structure used to map a [Type] to the [Interceptor] and constructors for
  * that type.  It is JavaScript array of 3N entries of adjacent slots containing
  * a [Type], followed by an [Interceptor] class for the type, followed by a
@@ -196,8 +189,9 @@
  * is accessed only by code that also calls [findIndexForWebComponentType].  If
  * this assumption is invalidated, the compiler will have to be updated.
  */
-// TODO(sra): Mark this as initialized to a constant with unknown value.
-var mapTypeToInterceptor;
+get mapTypeToInterceptor {
+  return JS_EMBEDDED_GLOBAL('', MAP_TYPE_TO_INTERCEPTOR);
+}
 
 int findIndexForNativeSubclassType(Type type) {
   if (JS('bool', '# == null', mapTypeToInterceptor)) return null;
diff --git a/sdk/lib/_internal/compiler/js_lib/io_patch.dart b/sdk/lib/_internal/compiler/js_lib/io_patch.dart
index 97dae37..c2c218a 100644
--- a/sdk/lib/_internal/compiler/js_lib/io_patch.dart
+++ b/sdk/lib/_internal/compiler/js_lib/io_patch.dart
@@ -184,6 +184,10 @@
   static _flush(int id) {
     throw new UnsupportedError("RandomAccessFile._flush");
   }
+  @patch
+  static _lock(int id, int lock, int start, int end) {
+    throw new UnsupportedError("RandomAccessFile._lock");
+  }
 }
 
 @patch
diff --git a/sdk/lib/_internal/compiler/js_lib/js_helper.dart b/sdk/lib/_internal/compiler/js_lib/js_helper.dart
index ef28952..e578583 100644
--- a/sdk/lib/_internal/compiler/js_lib/js_helper.dart
+++ b/sdk/lib/_internal/compiler/js_lib/js_helper.dart
@@ -225,18 +225,10 @@
     var receiver = object;
     var name = _internalName;
     var arguments = _arguments;
-    var embeddedInterceptedNames = JS_EMBEDDED_GLOBAL('', INTERCEPTED_NAMES);
-    // TODO(ngeoffray): If this functionality ever become performance
-    // critical, we might want to dynamically change [interceptedNames]
-    // to be a JavaScript object with intercepted names as property
-    // instead of a JavaScript array.
-    // TODO(floitsch): we already add stubs (tear-off getters) as properties
-    // in the embedded global interceptedNames.
-    // Finish the transition and always use the object as hashtable.
+    var interceptedNames = JS_EMBEDDED_GLOBAL('', INTERCEPTED_NAMES);
     bool isIntercepted =
-        JS("bool",
-            'Object.prototype.hasOwnProperty.call(#, #) || #.indexOf(#) !== -1',
-            embeddedInterceptedNames, name, interceptedNames, name);
+        JS("bool", 'Object.prototype.hasOwnProperty.call(#, #)',
+            interceptedNames, name);
     if (isIntercepted) {
       receiver = interceptor;
       if (JS('bool', '# === #', object, interceptor)) {
diff --git a/sdk/lib/_internal/compiler/js_lib/js_number.dart b/sdk/lib/_internal/compiler/js_lib/js_number.dart
index 81adc2b..63afa4b 100644
--- a/sdk/lib/_internal/compiler/js_lib/js_number.dart
+++ b/sdk/lib/_internal/compiler/js_lib/js_number.dart
@@ -110,8 +110,7 @@
   toDouble() => this;
 
   String toStringAsFixed(int fractionDigits) {
-    checkNum(fractionDigits);
-    // TODO(floitsch): fractionDigits must be an integer.
+    checkInt(fractionDigits);
     if (fractionDigits < 0 || fractionDigits > 20) {
       throw new RangeError(fractionDigits);
     }
@@ -123,8 +122,7 @@
   String toStringAsExponential([int fractionDigits]) {
     String result;
     if (fractionDigits != null) {
-      // TODO(floitsch): fractionDigits must be an integer.
-      checkNum(fractionDigits);
+      checkInt(fractionDigits);
       if (fractionDigits < 0 || fractionDigits > 20) {
         throw new RangeError(fractionDigits);
       }
@@ -137,8 +135,7 @@
   }
 
   String toStringAsPrecision(int precision) {
-    // TODO(floitsch): precision must be an integer.
-    checkNum(precision);
+    checkInt(precision);
     if (precision < 1 || precision > 21) {
       throw new RangeError(precision);
     }
@@ -149,9 +146,33 @@
   }
 
   String toRadixString(int radix) {
-    checkNum(radix);
+    checkInt(radix);
     if (radix < 2 || radix > 36) throw new RangeError(radix);
-    return JS('String', r'#.toString(#)', this, radix);
+    String result = JS('String', r'#.toString(#)', this, radix);
+    const int rightParenCode = 0x29;
+    if (result.codeUnitAt(result.length - 1) != rightParenCode) {
+      return result;
+    }
+    return _handleIEtoString(result);
+  }
+
+  static String _handleIEtoString(String result) {
+    // Result is probably IE's untraditional format for large numbers,
+    // e.g., "8.0000000000008(e+15)" for 0x8000000000000800.toString(16).
+    var match = JS('List|Null',
+                   r'/^([\da-z]+)(?:\.([\da-z]+))?\(e\+(\d+)\)$/.exec(#)',
+                   result);
+    if (match == null) {
+      // Then we don't know how to handle it at all.
+      throw new UnsupportedError("Unexpected toString result: $result");
+    }
+    String result = JS('String', '#', match[1]);
+    int exponent = JS("int", "+#", match[3]);
+    if (match[2] != null) {
+      result = JS('String', '# + #', result, match[2]);
+      exponent -= JS('int', '#.length', match[2]);
+    }
+    return result + "0" * exponent;
   }
 
   // Note: if you change this, also change the function [S].
diff --git a/sdk/lib/_internal/compiler/js_lib/shared/embedded_names.dart b/sdk/lib/_internal/compiler/js_lib/shared/embedded_names.dart
index 14bfd8c..bd72f09 100644
--- a/sdk/lib/_internal/compiler/js_lib/shared/embedded_names.dart
+++ b/sdk/lib/_internal/compiler/js_lib/shared/embedded_names.dart
@@ -15,7 +15,14 @@
 const TYPE_INFORMATION = 'typeInformation';
 const GLOBAL_FUNCTIONS = 'globalFunctions';
 const STATICS = 'statics';
+
+/**
+ * If [JSInvocationMirror._invokeOn] is being used, this embedded global
+ * contains a JavaScript map with the names of methods that are
+ * intercepted.
+ */
 const INTERCEPTED_NAMES = 'interceptedNames';
+
 const MANGLED_GLOBAL_NAMES = 'mangledGlobalNames';
 const MANGLED_NAMES = 'mangledNames';
 const LIBRARIES = 'libraries';
@@ -41,3 +48,5 @@
 const TYPEDEF_TYPE_PROPERTY_NAME = r"$typedefType";
 const TYPEDEF_PREDICATE_PROPERTY_NAME = r"$$isTypedef";
 const NATIVE_SUPERCLASS_TAG_NAME = r"$nativeSuperclassTag";
+
+const MAP_TYPE_TO_INTERCEPTOR = "mapTypeToInterceptor";
diff --git a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
index 41427e6..35740f0 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
@@ -15,7 +15,7 @@
 import '../../../../../../../pkg/compiler/lib/compiler.dart' as compiler;
 import '../../../../../../../pkg/compiler/lib/src/dart2js.dart'
     show AbortLeg;
-import '../../../../../../../pkg/compiler/lib/src/source_file.dart';
+import '../../../../../../../pkg/compiler/lib/src/io/source_file.dart';
 import '../barback.dart';
 import '../dart.dart' as dart;
 import '../utils.dart';
diff --git a/sdk/lib/_internal/pub/lib/src/git.dart b/sdk/lib/_internal/pub/lib/src/git.dart
index 2c522eb..53d69d8 100644
--- a/sdk/lib/_internal/pub/lib/src/git.dart
+++ b/sdk/lib/_internal/pub/lib/src/git.dart
@@ -50,10 +50,14 @@
         "Please ensure Git is correctly installed.");
   }
 
+  log.muteProgress();
   return runProcess(_gitCommand, args, workingDir: workingDir,
       environment: environment).then((result) {
     if (!result.success) throw new GitException(args, result.stderr.join("\n"));
+
     return result.stdout;
+  }).whenComplete(() {
+    log.unmuteProgress();
   });
 }
 
diff --git a/sdk/lib/_internal/pub/lib/src/log.dart b/sdk/lib/_internal/pub/lib/src/log.dart
index 1462712..107970b 100644
--- a/sdk/lib/_internal/pub/lib/src/log.dart
+++ b/sdk/lib/_internal/pub/lib/src/log.dart
@@ -42,9 +42,6 @@
 /// [recordTranscript()] is called.
 Transcript<Entry> _transcript;
 
-/// All currently-running progress indicators.
-final _progresses = new Set<Progress>();
-
 /// The currently-animated progress indicator, if any.
 ///
 /// This will also be in [_progresses].
@@ -374,13 +371,10 @@
 /// information will only be visible at [Level.FINE].
 Future progress(String message, Future callback(), {bool fine: false}) {
   _stopProgress();
+
   var progress = new Progress(message, fine: fine);
   _animatedProgress = progress;
-  _progresses.add(progress);
-  return callback().whenComplete(() {
-    progress.stop();
-    _progresses.remove(progress);
-  });
+  return callback().whenComplete(progress.stop);
 }
 
 /// Stops animating the running progress indicator, if currently running.
@@ -389,6 +383,31 @@
   _animatedProgress = null;
 }
 
+/// The number of outstanding calls to [muteProgress] that have not been unmuted
+/// yet.
+int _numMutes = 0;
+
+/// Whether progress animation should be muted or not.
+bool get isMuted => _numMutes > 0;
+
+/// Stops animating any ongoing progress.
+///
+/// This is called before spawning Git since Git sometimes writes directly to
+/// the terminal to ask for login credentials, which would then get overwritten
+/// by the progress animation.
+///
+/// Each call to this must be paired with a call to [unmuteProgress].
+void muteProgress() {
+  _numMutes++;
+}
+
+/// Resumes animating any ongoing progress once all calls to [muteProgress]
+/// have made their matching [unmuteProgress].
+void unmuteProgress() {
+  assert(_numMutes > 0);
+  _numMutes--;
+}
+
 /// Wraps [text] in the ANSI escape codes to make it bold when on a platform
 /// that supports that.
 ///
diff --git a/sdk/lib/_internal/pub/lib/src/progress.dart b/sdk/lib/_internal/pub/lib/src/progress.dart
index 6c0ffdc..5029f61 100644
--- a/sdk/lib/_internal/pub/lib/src/progress.dart
+++ b/sdk/lib/_internal/pub/lib/src/progress.dart
@@ -48,10 +48,11 @@
       return;
     }
 
-    _update();
     _timer = new Timer.periodic(new Duration(milliseconds: 100), (_) {
       _update();
     });
+
+    _update();
   }
 
   /// Stops the progress indicator.
@@ -88,11 +89,11 @@
 
   /// Refreshes the progress line.
   void _update() {
+    if (log.isMuted) return;
+
     stdout.write(log.format("\r$_message... "));
 
     // Show the time only once it gets noticeably long.
-    if (_stopwatch.elapsed.inSeconds > 0) {
-      stdout.write(log.gray(_time));
-    }
+    if (_stopwatch.elapsed.inSeconds > 0) stdout.write("${log.gray(_time)} ");
   }
 }
diff --git a/sdk/lib/_internal/pub/pub.status b/sdk/lib/_internal/pub/pub.status
index b22be5d..449c482 100644
--- a/sdk/lib/_internal/pub/pub.status
+++ b/sdk/lib/_internal/pub/pub.status
@@ -6,8 +6,6 @@
 test/serve/web_socket/url_to_asset_id_test: Pass, Slow
 test/transformer/loads_a_diamond_transformer_dependency_graph_test: Pass, Slow
 
-test/async_compile_test: Fail # pub_generated need to be updated (see dartbug.com/21940)
-
 # Pub only runs on the VM, so just rule out all compilers.
 [ $compiler == dart2js || $compiler == dart2dart ]
 *: Skip
diff --git a/sdk/lib/_internal/pub_generated/README.md b/sdk/lib/_internal/pub_generated/README.md
index 06095b6..f4908d9 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:
 
-    b151ae5aeb8b825c528f46181d80430b2ee33a63
+    04e540562a04380a3e20a422c8bfe306e6f79f95
 
 (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 50ee1ce..b6d3712 100644
--- a/sdk/lib/_internal/pub_generated/bin/pub.dart
+++ b/sdk/lib/_internal/pub_generated/bin/pub.dart
@@ -253,7 +253,7 @@
   scheduleMicrotask(() {
     try {
       join0() {
-        runProcess('ver', []).then((x0) {
+        new Future.value(runProcess('ver', [])).then((x0) {
           try {
             var result = x0;
             join1() {
@@ -261,7 +261,7 @@
             }
             if (result.stdout.join('\n').contains('XP')) {
               log.error('Sorry, but pub is not supported on Windows XP.');
-              flushThenExit(exit_codes.USAGE).then((x1) {
+              new Future.value(flushThenExit(exit_codes.USAGE)).then((x1) {
                 try {
                   x1;
                   join1();
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/asset_environment.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/asset_environment.dart
index 5a6000b..8316d4e 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/barback/asset_environment.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/asset_environment.dart
@@ -74,7 +74,7 @@
       final completer0 = new Completer();
       scheduleMicrotask(() {
         try {
-          entrypoint.loadPackageGraph().then((x0) {
+          new Future.value(entrypoint.loadPackageGraph()).then((x0) {
             try {
               var graph = x0;
               graph = _adjustPackageGraph(graph, mode, packages);
@@ -82,9 +82,8 @@
               barback.log.listen(_log);
               var environment =
                   new AssetEnvironment._(graph, barback, mode, watcherType, hostname, basePort);
-              environment._load(
-                  entrypoints: entrypoints,
-                  useDart2JS: useDart2JS).then((x1) {
+              new Future.value(
+                  environment._load(entrypoints: entrypoints, useDart2JS: useDart2JS)).then((x1) {
                 try {
                   x1;
                   completer0.complete(environment);
@@ -294,7 +293,7 @@
           log.fine("Executables for ${packageName}: ${executableIds}");
           join1() {
             var package = graph.packages[packageName];
-            servePackageBinDirectory(packageName).then((x0) {
+            new Future.value(servePackageBinDirectory(packageName)).then((x0) {
               try {
                 var server = x0;
                 join2() {
@@ -309,18 +308,19 @@
                 }
                 try {
                   var precompiled = {};
-                  waitAndPrintErrors(executableIds.map(((id) {
+                  new Future.value(waitAndPrintErrors(executableIds.map(((id) {
                     final completer0 = new Completer();
                     scheduleMicrotask(() {
                       try {
                         var basename = path.url.basename(id.path);
                         var snapshotPath =
                             path.join(directory, "${basename}.snapshot");
-                        runProcess(
-                            Platform.executable,
-                            [
-                                '--snapshot=${snapshotPath}',
-                                server.url.resolve(basename).toString()]).then((x0) {
+                        new Future.value(
+                            runProcess(
+                                Platform.executable,
+                                [
+                                    '--snapshot=${snapshotPath}',
+                                    server.url.resolve(basename).toString()])).then((x0) {
                           try {
                             var result = x0;
                             join0() {
@@ -347,7 +347,7 @@
                       }
                     });
                     return completer0.future;
-                  }))).then((x1) {
+                  })))).then((x1) {
                     try {
                       x1;
                       final v0 = precompiled;
@@ -553,7 +553,7 @@
                 (config) => config.id.package == '\$dart2js');
           }));
           join0() {
-            BarbackServer.bind(this, _hostname, 0).then((x0) {
+            new Future.value(BarbackServer.bind(this, _hostname, 0)).then((x0) {
               try {
                 var transformerServer = x0;
                 var errorStream = barback.errors.map(((error) {
@@ -561,9 +561,9 @@
                   log.error(log.red(error.message));
                   log.fine(error.stackTrace.terse);
                 }));
-                _withStreamErrors((() {
+                new Future.value(_withStreamErrors((() {
                   return log.progress("Loading source assets", _provideSources);
-                }), [errorStream, barback.results]).then((x1) {
+                }), [errorStream, barback.results])).then((x1) {
                   try {
                     x1;
                     log.fine("Provided sources.");
@@ -581,7 +581,7 @@
                               message,
                               null));
                     }));
-                    _withStreamErrors((() {
+                    new Future.value(_withStreamErrors((() {
                       final completer0 = new Completer();
                       scheduleMicrotask(() {
                         try {
@@ -590,10 +590,11 @@
                             final completer0 = new Completer();
                             scheduleMicrotask(() {
                               try {
-                                loadAllTransformers(
-                                    this,
-                                    transformerServer,
-                                    entrypoints: entrypoints).then((x0) {
+                                new Future.value(
+                                    loadAllTransformers(
+                                        this,
+                                        transformerServer,
+                                        entrypoints: entrypoints)).then((x0) {
                                   try {
                                     x0;
                                     transformerServer.close();
@@ -614,7 +615,7 @@
                       });
                       return completer0.future;
                     }),
-                        [errorStream, barback.results, transformerServer.results]).then((x2) {
+                        [errorStream, barback.results, transformerServer.results])).then((x2) {
                       try {
                         x2;
                         completer0.complete();
@@ -653,12 +654,13 @@
     final completer0 = new Completer();
     scheduleMicrotask(() {
       try {
-        Future.wait(graph.packages.values.map(((package) {
+        new Future.value(Future.wait(graph.packages.values.map(((package) {
           final completer0 = new Completer();
           scheduleMicrotask(() {
             try {
               join0() {
-                _provideDirectorySources(package, "lib").then((x0) {
+                new Future.value(
+                    _provideDirectorySources(package, "lib")).then((x0) {
                   try {
                     x0;
                     completer0.complete();
@@ -677,7 +679,7 @@
             }
           });
           return completer0.future;
-        }))).then((x0) {
+        })))).then((x0) {
           try {
             x0;
             completer0.complete();
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/dart2js_transformer.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/dart2js_transformer.dart
index 66dce7b..3910ef8 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/barback/dart2js_transformer.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/dart2js_transformer.dart
@@ -14,7 +14,7 @@
 
 import '../../../../../../../pkg/compiler/lib/compiler.dart' as compiler;
 import '../../../../../../../pkg/compiler/lib/src/dart2js.dart' show AbortLeg;
-import '../../../../../../../pkg/compiler/lib/src/source_file.dart';
+import '../../../../../../../pkg/compiler/lib/src/io/source_file.dart';
 import '../barback.dart';
 import '../dart.dart' as dart;
 import '../utils.dart';
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 39d988e..43ae020 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
@@ -59,12 +59,13 @@
           var it0 = stagedTransformers.iterator;
           break0() {
             join2() {
-              Future.wait(environment.graph.packages.values.map(((package) {
+              new Future.value(
+                  Future.wait(environment.graph.packages.values.map(((package) {
                 final completer0 = new Completer();
                 scheduleMicrotask(() {
                   try {
-                    loader.transformersForPhases(
-                        package.pubspec.transformers).then((x0) {
+                    new Future.value(
+                        loader.transformersForPhases(package.pubspec.transformers)).then((x0) {
                       try {
                         var phases = x0;
                         var transformers =
@@ -99,7 +100,7 @@
                   }
                 });
                 return completer0.future;
-              }))).then((x1) {
+              })))).then((x1) {
                 try {
                   x1;
                   completer0.complete();
@@ -123,7 +124,8 @@
               join3(x2) {
                 var snapshotPath = x2;
                 first = false;
-                loader.load(stage, snapshot: snapshotPath).then((x3) {
+                new Future.value(
+                    loader.load(stage, snapshot: snapshotPath)).then((x3) {
                   trampoline0 = () {
                     trampoline0 = null;
                     try {
@@ -131,14 +133,15 @@
                       var packagesToUpdate = unionAll(stage.map(((id) {
                         return packagesThatUseTransformers[id];
                       })));
-                      Future.wait(packagesToUpdate.map(((packageName) {
+                      new Future.value(
+                          Future.wait(packagesToUpdate.map(((packageName) {
                         final completer0 = new Completer();
                         scheduleMicrotask(() {
                           try {
                             var package =
                                 environment.graph.packages[packageName];
-                            loader.transformersForPhases(
-                                package.pubspec.transformers).then((x0) {
+                            new Future.value(
+                                loader.transformersForPhases(package.pubspec.transformers)).then((x0) {
                               try {
                                 var phases = x0;
                                 environment.barback.updateTransformers(
@@ -154,7 +157,7 @@
                           }
                         });
                         return completer0.future;
-                      }))).then((x4) {
+                      })))).then((x4) {
                         trampoline0 = () {
                           trampoline0 = null;
                           try {
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 2097910..d2b952c 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
@@ -58,13 +58,14 @@
           return !_isolates.containsKey(id);
         })).toList();
         join0() {
-          log.progress("Loading ${toSentence(ids)} transformers", (() {
+          new Future.value(
+              log.progress("Loading ${toSentence(ids)} transformers", (() {
             return TransformerIsolate.spawn(
                 _environment,
                 _transformerServer,
                 ids,
                 snapshot: snapshot);
-          })).then((x0) {
+          }))).then((x0) {
             try {
               var isolate = x0;
               var it0 = ids.iterator;
@@ -126,7 +127,7 @@
             completer0.complete(_transformers[config]);
           }
           if (_isolates.containsKey(config.id)) {
-            _isolates[config.id].create(config).then((x0) {
+            new Future.value(_isolates[config.id].create(config)).then((x0) {
               try {
                 var transformers = x0;
                 join2() {
@@ -198,11 +199,12 @@
     final completer0 = new Completer();
     scheduleMicrotask(() {
       try {
-        Future.wait(phases.map(((phase) {
+        new Future.value(Future.wait(phases.map(((phase) {
           final completer0 = new Completer();
           scheduleMicrotask(() {
             try {
-              waitAndPrintErrors(phase.map(transformersFor)).then((x0) {
+              new Future.value(
+                  waitAndPrintErrors(phase.map(transformersFor))).then((x0) {
                 try {
                   var transformers = x0;
                   completer0.complete(unionAll(transformers));
@@ -215,7 +217,7 @@
             }
           });
           return completer0.future;
-        }))).then((x0) {
+        })))).then((x0) {
           try {
             var result = x0;
             completer0.complete(result.toList());
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 278b327..5d1b83e 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
@@ -29,7 +29,7 @@
         break0() {
           join0() {
             join1() {
-              globals.repairActivatedPackages().then((x0) {
+              new Future.value(globals.repairActivatedPackages()).then((x0) {
                 try {
                   var results = x0;
                   join2() {
@@ -39,7 +39,8 @@
                           completer0.complete();
                         }
                         if (failures > 0) {
-                          flushThenExit(exit_codes.UNAVAILABLE).then((x1) {
+                          new Future.value(
+                              flushThenExit(exit_codes.UNAVAILABLE)).then((x1) {
                             try {
                               x1;
                               join5();
@@ -104,7 +105,7 @@
           if (it0.moveNext()) {
             var source = it0.current;
             join6() {
-              source.repairCachedPackages().then((x2) {
+              new Future.value(source.repairCachedPackages()).then((x2) {
                 trampoline0 = () {
                   trampoline0 = null;
                   try {
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 1de7e16..fd38854 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/downgrade.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/downgrade.dart
@@ -37,10 +37,11 @@
     scheduleMicrotask(() {
       try {
         var dryRun = commandOptions['dry-run'];
-        entrypoint.acquireDependencies(
-            SolveType.DOWNGRADE,
-            useLatest: commandOptions.rest,
-            dryRun: dryRun).then((x0) {
+        new Future.value(
+            entrypoint.acquireDependencies(
+                SolveType.DOWNGRADE,
+                useLatest: commandOptions.rest,
+                dryRun: dryRun)).then((x0) {
           try {
             x0;
             join0() {
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 ca85396..ed4d93e 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
@@ -42,14 +42,11 @@
           join1() {
             var args = commandOptions.rest.skip(1).toList();
             join2() {
-              globals.runExecutable(
-                  package,
-                  executable,
-                  args,
-                  mode: mode).then((x0) {
+              new Future.value(
+                  globals.runExecutable(package, executable, args, mode: mode)).then((x0) {
                 try {
                   var exitCode = x0;
-                  flushThenExit(exitCode).then((x1) {
+                  new Future.value(flushThenExit(exitCode)).then((x1) {
                     try {
                       x1;
                       completer0.complete();
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 a340f79..a9fee0f 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/run.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/run.dart
@@ -41,15 +41,11 @@
           join1() {
             var mode;
             join2() {
-              runExecutable(
-                  entrypoint,
-                  package,
-                  executable,
-                  args,
-                  mode: mode).then((x0) {
+              new Future.value(
+                  runExecutable(entrypoint, package, executable, args, mode: mode)).then((x0) {
                 try {
                   var exitCode = x0;
-                  flushThenExit(exitCode).then((x1) {
+                  new Future.value(flushThenExit(exitCode)).then((x1) {
                     try {
                       x1;
                       completer0.complete();
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 2aae583..268f63a 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/serve.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/serve.dart
@@ -96,19 +96,21 @@
           var adminPort = x0;
           join1(x1) {
             var watcherType = x1;
-            AssetEnvironment.create(
-                entrypoint,
-                mode,
-                watcherType: watcherType,
-                hostname: hostname,
-                basePort: port,
-                useDart2JS: useDart2JS).then((x2) {
+            new Future.value(
+                AssetEnvironment.create(
+                    entrypoint,
+                    mode,
+                    watcherType: watcherType,
+                    hostname: hostname,
+                    basePort: port,
+                    useDart2JS: useDart2JS)).then((x2) {
               try {
                 var environment = x2;
                 var directoryLength = sourceDirectories.map(((dir) {
                   return dir.length;
                 })).reduce(math.max);
-                environment.startAdminServer(adminPort).then((x3) {
+                new Future.value(
+                    environment.startAdminServer(adminPort)).then((x3) {
                   try {
                     var server = x3;
                     server.results.listen(((_) {
@@ -131,7 +133,7 @@
                           }
                         }), onError: _fatalError);
                         environment.resumeUpdates();
-                        _completer.future.then((x4) {
+                        new Future.value(_completer.future).then((x4) {
                           try {
                             x4;
                             completer0.complete();
@@ -145,10 +147,8 @@
                         trampoline0 = null;
                         if (it0.moveNext()) {
                           var directory = it0.current;
-                          _startServer(
-                              environment,
-                              directory,
-                              directoryLength).then((x5) {
+                          new Future.value(
+                              _startServer(environment, directory, directoryLength)).then((x5) {
                             trampoline0 = () {
                               trampoline0 = null;
                               try {
@@ -206,7 +206,7 @@
     final completer0 = new Completer();
     scheduleMicrotask(() {
       try {
-        environment.serveDirectory(rootDirectory).then((x0) {
+        new Future.value(environment.serveDirectory(rootDirectory)).then((x0) {
           try {
             var server = x0;
             join0() {
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 bd67719..92bf32a 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/upgrade.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/upgrade.dart
@@ -38,10 +38,11 @@
     scheduleMicrotask(() {
       try {
         var dryRun = commandOptions['dry-run'];
-        entrypoint.acquireDependencies(
-            SolveType.UPGRADE,
-            useLatest: commandOptions.rest,
-            dryRun: dryRun).then((x0) {
+        new Future.value(
+            entrypoint.acquireDependencies(
+                SolveType.UPGRADE,
+                useLatest: commandOptions.rest,
+                dryRun: dryRun)).then((x0) {
           try {
             x0;
             join0() {
diff --git a/sdk/lib/_internal/pub_generated/lib/src/dart.dart b/sdk/lib/_internal/pub_generated/lib/src/dart.dart
index 8a66472..2f83268 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/dart.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/dart.dart
@@ -151,7 +151,7 @@
   scheduleMicrotask(() {
     try {
       join0() {
-        withTempDir(((dir) {
+        new Future.value(withTempDir(((dir) {
           final completer0 = new Completer();
           scheduleMicrotask(() {
             try {
@@ -159,15 +159,15 @@
               writeTextFile(dartPath, code, dontLogContents: true);
               var port = new ReceivePort();
               join0(x0) {
-                Isolate.spawn(_isolateBuffer, {
+                new Future.value(Isolate.spawn(_isolateBuffer, {
                   'replyTo': port.sendPort,
                   'uri': path.toUri(dartPath).toString(),
                   'packageRoot': x0,
                   'message': message
-                }).then((x1) {
+                })).then((x1) {
                   try {
                     x1;
-                    port.first.then((x2) {
+                    new Future.value(port.first).then((x2) {
                       try {
                         var response = x2;
                         join1() {
@@ -177,9 +177,8 @@
                             join3() {
                               snapshotArgs.addAll(
                                   ['--snapshot=${snapshot}', dartPath]);
-                              runProcess(
-                                  Platform.executable,
-                                  snapshotArgs).then((x3) {
+                              new Future.value(
+                                  runProcess(Platform.executable, snapshotArgs)).then((x3) {
                                 try {
                                   var result = x3;
                                   join4() {
@@ -237,7 +236,7 @@
             }
           });
           return completer0.future;
-        })).then((x0) {
+        }))).then((x0) {
           try {
             x0;
             completer0.complete();
@@ -266,11 +265,12 @@
             }
           }
           try {
-            Isolate.spawnUri(
-                path.toUri(snapshot),
-                [],
-                message,
-                packageRoot: packageRoot).then((x1) {
+            new Future.value(
+                Isolate.spawnUri(
+                    path.toUri(snapshot),
+                    [],
+                    message,
+                    packageRoot: packageRoot)).then((x1) {
               try {
                 x1;
                 completer0.complete(null);
diff --git a/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart b/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart
index 4927ec0..5234361 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart
@@ -115,26 +115,28 @@
     final completer0 = new Completer();
     scheduleMicrotask(() {
       try {
-        resolveVersions(
-            type,
-            cache.sources,
-            root,
-            lockFile: lockFile,
-            useLatest: useLatest).then((x0) {
+        new Future.value(
+            resolveVersions(
+                type,
+                cache.sources,
+                root,
+                lockFile: lockFile,
+                useLatest: useLatest)).then((x0) {
           try {
             var result = x0;
             join0() {
               result.showReport(type);
               join1() {
                 join2() {
-                  Future.wait(result.packages.map(_get)).then((x1) {
+                  new Future.value(
+                      Future.wait(result.packages.map(_get))).then((x1) {
                     try {
                       var ids = x1;
                       _saveLockFile(ids);
                       join3() {
                         _linkOrDeleteSecondaryPackageDirs();
                         result.summarizeChanges(type, dryRun: dryRun);
-                        loadPackageGraph(result).then((x2) {
+                        new Future.value(loadPackageGraph(result)).then((x2) {
                           try {
                             var packageGraph = x2;
                             packageGraph.loadTransformerCache().clearIfOutdated(
@@ -203,7 +205,7 @@
     scheduleMicrotask(() {
       try {
         join0() {
-          loadPackageGraph().then((x0) {
+          new Future.value(loadPackageGraph()).then((x0) {
             try {
               var graph = x0;
               var depsDir = path.join('.pub', 'deps', 'debug');
@@ -222,7 +224,8 @@
               })).toSet();
               join1() {
                 join2() {
-                  log.progress("Precompiling dependencies", (() {
+                  new Future.value(
+                      log.progress("Precompiling dependencies", (() {
                     final completer0 = new Completer();
                     scheduleMicrotask(() {
                       try {
@@ -230,19 +233,22 @@
                             dependenciesToPrecompile.map(graph.transitiveDependencies)).map(((package) {
                           return package.name;
                         })).toSet();
-                        AssetEnvironment.create(
-                            this,
-                            BarbackMode.DEBUG,
-                            packages: packagesToLoad,
-                            useDart2JS: false).then((x0) {
+                        new Future.value(
+                            AssetEnvironment.create(
+                                this,
+                                BarbackMode.DEBUG,
+                                packages: packagesToLoad,
+                                useDart2JS: false)).then((x0) {
                           try {
                             var environment = x0;
                             environment.barback.errors.listen(((_) {
                             }));
-                            environment.barback.getAllAssets().then((x1) {
+                            new Future.value(
+                                environment.barback.getAllAssets()).then((x1) {
                               try {
                                 var assets = x1;
-                                waitAndPrintErrors(assets.map(((asset) {
+                                new Future.value(
+                                    waitAndPrintErrors(assets.map(((asset) {
                                   final completer0 = new Completer();
                                   scheduleMicrotask(() {
                                     try {
@@ -250,9 +256,8 @@
                                         var destPath =
                                             path.join(depsDir, asset.id.package, path.fromUri(asset.id.path));
                                         ensureDir(path.dirname(destPath));
-                                        createFileFromStream(
-                                            asset.read(),
-                                            destPath).then((x0) {
+                                        new Future.value(
+                                            createFileFromStream(asset.read(), destPath)).then((x0) {
                                           try {
                                             x0;
                                             completer0.complete();
@@ -272,7 +277,7 @@
                                     }
                                   });
                                   return completer0.future;
-                                }))).then((x2) {
+                                })))).then((x2) {
                                   try {
                                     x2;
                                     log.message(
@@ -301,7 +306,7 @@
                     dependenciesToPrecompile.forEach(
                         (package) => deleteEntry(path.join(depsDir, package)));
                     throw error;
-                  })).then((x1) {
+                  }))).then((x1) {
                     try {
                       x1;
                       completer0.complete();
@@ -394,7 +399,7 @@
               fileExists(sdkVersionPath) &&
               readTextFile(sdkVersionPath) == "${sdk.version}\n";
           join1() {
-            loadPackageGraph().then((x0) {
+            new Future.value(loadPackageGraph()).then((x0) {
               try {
                 var graph = x0;
                 var executables =
@@ -407,7 +412,8 @@
                 break0() {
                   join2() {
                     join3() {
-                      log.progress("Precompiling executables", (() {
+                      new Future.value(
+                          log.progress("Precompiling executables", (() {
                         final completer0 = new Completer();
                         scheduleMicrotask(() {
                           try {
@@ -421,28 +427,30 @@
                                 unionAll(executables.values.map(((ids) {
                               return ids.toSet();
                             })));
-                            AssetEnvironment.create(
-                                this,
-                                BarbackMode.RELEASE,
-                                packages: packagesToLoad,
-                                entrypoints: executableIds,
-                                useDart2JS: false).then((x0) {
+                            new Future.value(
+                                AssetEnvironment.create(
+                                    this,
+                                    BarbackMode.RELEASE,
+                                    packages: packagesToLoad,
+                                    entrypoints: executableIds,
+                                    useDart2JS: false)).then((x0) {
                               try {
                                 var environment = x0;
                                 environment.barback.errors.listen(((error) {
                                   log.error(log.red("Build error:\n$error"));
                                 }));
-                                waitAndPrintErrors(
-                                    executables.keys.map(((package) {
+                                new Future.value(
+                                    waitAndPrintErrors(executables.keys.map(((package) {
                                   final completer0 = new Completer();
                                   scheduleMicrotask(() {
                                     try {
                                       var dir = path.join(binDir, package);
                                       cleanDir(dir);
-                                      environment.precompileExecutables(
-                                          package,
-                                          dir,
-                                          executableIds: executables[package]).then((x0) {
+                                      new Future.value(
+                                          environment.precompileExecutables(
+                                              package,
+                                              dir,
+                                              executableIds: executables[package])).then((x0) {
                                         try {
                                           x0;
                                           completer0.complete();
@@ -455,7 +463,7 @@
                                     }
                                   });
                                   return completer0.future;
-                                }))).then((x1) {
+                                })))).then((x1) {
                                   try {
                                     x1;
                                     completer0.complete();
@@ -472,7 +480,7 @@
                           }
                         });
                         return completer0.future;
-                      })).then((x1) {
+                      }))).then((x1) {
                         try {
                           x1;
                           completer0.complete();
@@ -700,20 +708,22 @@
     scheduleMicrotask(() {
       try {
         join0() {
-          log.progress("Loading package graph", (() {
+          new Future.value(log.progress("Loading package graph", (() {
             final completer0 = new Completer();
             scheduleMicrotask(() {
               try {
                 join0() {
-                  ensureLockFileIsUpToDate().then((x0) {
+                  new Future.value(ensureLockFileIsUpToDate()).then((x0) {
                     try {
                       x0;
-                      Future.wait(lockFile.packages.values.map(((id) {
+                      new Future.value(
+                          Future.wait(lockFile.packages.values.map(((id) {
                         final completer0 = new Completer();
                         scheduleMicrotask(() {
                           try {
                             var source = cache.sources[id.source];
-                            source.getDirectory(id).then((x0) {
+                            new Future.value(
+                                source.getDirectory(id)).then((x0) {
                               try {
                                 var dir = x0;
                                 completer0.complete(
@@ -727,7 +737,7 @@
                           }
                         });
                         return completer0.future;
-                      }))).then((x1) {
+                      })))).then((x1) {
                         try {
                           var packages = x1;
                           var packageMap =
@@ -747,11 +757,12 @@
                   }, onError: completer0.completeError);
                 }
                 if (result != null) {
-                  Future.wait(result.packages.map(((id) {
+                  new Future.value(Future.wait(result.packages.map(((id) {
                     final completer0 = new Completer();
                     scheduleMicrotask(() {
                       try {
-                        cache.sources[id.source].getDirectory(id).then((x0) {
+                        new Future.value(
+                            cache.sources[id.source].getDirectory(id)).then((x0) {
                           try {
                             var dir = x0;
                             completer0.complete(
@@ -765,7 +776,7 @@
                       }
                     });
                     return completer0.future;
-                  }))).then((x2) {
+                  })))).then((x2) {
                     try {
                       var packages = x2;
                       completer0.complete(
@@ -787,7 +798,7 @@
               }
             });
             return completer0.future;
-          }), fine: true).then((x0) {
+          }), fine: true)).then((x0) {
             try {
               var graph = x0;
               _packageGraph = graph;
diff --git a/sdk/lib/_internal/pub_generated/lib/src/executable.dart b/sdk/lib/_internal/pub_generated/lib/src/executable.dart
index 3737939..d8016ea 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/executable.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/executable.dart
@@ -49,11 +49,12 @@
                 join5() {
                   var assetPath = "${p.url.joinAll(p.split(executable))}.dart";
                   var id = new AssetId(package, assetPath);
-                  AssetEnvironment.create(
-                      entrypoint,
-                      mode,
-                      useDart2JS: false,
-                      entrypoints: [id]).then((x0) {
+                  new Future.value(
+                      AssetEnvironment.create(
+                          entrypoint,
+                          mode,
+                          useDart2JS: false,
+                          entrypoints: [id])).then((x0) {
                     try {
                       var environment = x0;
                       environment.barback.errors.listen(((error) {
@@ -73,9 +74,8 @@
                               vmArgs.add(
                                   server.url.resolve(relativePath).toString());
                               vmArgs.addAll(args);
-                              Process.start(
-                                  Platform.executable,
-                                  vmArgs).then((x0) {
+                              new Future.value(
+                                  Process.start(Platform.executable, vmArgs)).then((x0) {
                                 try {
                                   var process = x0;
                                   process.stderr.listen(stderr.add);
@@ -105,7 +105,8 @@
                         })));
                       }
                       if (package == entrypoint.root.name) {
-                        environment.serveDirectory(rootDir).then((x1) {
+                        new Future.value(
+                            environment.serveDirectory(rootDir)).then((x1) {
                           try {
                             server = x1;
                             join6();
@@ -114,8 +115,8 @@
                           }
                         }, onError: completer0.completeError);
                       } else {
-                        environment.servePackageBinDirectory(
-                            package).then((x2) {
+                        new Future.value(
+                            environment.servePackageBinDirectory(package)).then((x2) {
                           try {
                             server = x2;
                             join6();
@@ -165,7 +166,7 @@
             !entrypoint.root.immediateDependencies.any(((dep) {
           return dep.name == package;
         }))) {
-          entrypoint.loadPackageGraph().then((x3) {
+          new Future.value(entrypoint.loadPackageGraph()).then((x3) {
             try {
               var graph = x3;
               join7() {
@@ -228,7 +229,8 @@
             final completer0 = new Completer();
             scheduleMicrotask(() {
               try {
-                Process.start(Platform.executable, vmArgs).then((x0) {
+                new Future.value(
+                    Process.start(Platform.executable, vmArgs)).then((x0) {
                   try {
                     var process = x0;
                     process.stderr.listen(stderr.add);
@@ -245,11 +247,11 @@
             });
             return completer0.future;
           }
-          runProcess(stdin1).then((x0) {
+          new Future.value(runProcess(stdin1)).then((x0) {
             try {
               var exitCode = x0;
               join2() {
-                recompile().then((x1) {
+                new Future.value(recompile()).then((x1) {
                   try {
                     x1;
                     completer0.complete(runProcess(stdin2));
diff --git a/sdk/lib/_internal/pub_generated/lib/src/git.dart b/sdk/lib/_internal/pub_generated/lib/src/git.dart
index 1e3291f..a574e8a 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/git.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/git.dart
@@ -50,13 +50,17 @@
         "Cannot find a Git executable.\n" "Please ensure Git is correctly installed.");
   }
 
+  log.muteProgress();
   return runProcess(
       _gitCommand,
       args,
       workingDir: workingDir,
       environment: environment).then((result) {
     if (!result.success) throw new GitException(args, result.stderr.join("\n"));
+
     return result.stdout;
+  }).whenComplete(() {
+    log.unmuteProgress();
   });
 }
 
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 a05d2ce..aff228f 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/global_packages.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/global_packages.dart
@@ -85,14 +85,15 @@
     scheduleMicrotask(() {
       try {
         var source = cache.sources["git"] as GitSource;
-        source.getPackageNameFromRepo(repo).then((x0) {
+        new Future.value(source.getPackageNameFromRepo(repo)).then((x0) {
           try {
             var name = x0;
             _describeActive(name);
-            _installInCache(
-                new PackageDep(name, "git", VersionConstraint.any, repo),
-                executables,
-                overwriteBinStubs: overwriteBinStubs).then((x1) {
+            new Future.value(
+                _installInCache(
+                    new PackageDep(name, "git", VersionConstraint.any, repo),
+                    executables,
+                    overwriteBinStubs: overwriteBinStubs)).then((x1) {
               try {
                 x1;
                 completer0.complete();
@@ -127,10 +128,11 @@
     scheduleMicrotask(() {
       try {
         _describeActive(name);
-        _installInCache(
-            new PackageDep(name, "hosted", constraint, name),
-            executables,
-            overwriteBinStubs: overwriteBinStubs).then((x0) {
+        new Future.value(
+            _installInCache(
+                new PackageDep(name, "hosted", constraint, name),
+                executables,
+                overwriteBinStubs: overwriteBinStubs)).then((x0) {
           try {
             x0;
             completer0.complete();
@@ -160,7 +162,7 @@
     scheduleMicrotask(() {
       try {
         var entrypoint = new Entrypoint(path, cache);
-        entrypoint.ensureLockFileIsUpToDate().then((x0) {
+        new Future.value(entrypoint.ensureLockFileIsUpToDate()).then((x0) {
           try {
             x0;
             var name = entrypoint.root.name;
@@ -209,24 +211,26 @@
                 "pub global activate",
                 dependencies: [dep],
                 sources: cache.sources));
-        resolveVersions(SolveType.GET, cache.sources, root).then((x0) {
+        new Future.value(
+            resolveVersions(SolveType.GET, cache.sources, root)).then((x0) {
           try {
             var result = x0;
             join0() {
               result.showReport(SolveType.GET);
-              Future.wait(result.packages.map(_cacheDependency)).then((x1) {
+              new Future.value(
+                  Future.wait(result.packages.map(_cacheDependency))).then((x1) {
                 try {
                   var ids = x1;
                   var lockFile = new LockFile(ids);
-                  new Entrypoint.inMemory(
-                      root,
-                      lockFile,
-                      cache).loadPackageGraph(result).then((x2) {
+                  new Future.value(
+                      new Entrypoint.inMemory(
+                          root,
+                          lockFile,
+                          cache).loadPackageGraph(result)).then((x2) {
                     try {
                       var graph = x2;
-                      _precompileExecutables(
-                          graph.entrypoint,
-                          dep.name).then((x3) {
+                      new Future.value(
+                          _precompileExecutables(graph.entrypoint, dep.name)).then((x3) {
                         try {
                           var snapshots = x3;
                           _writeLockFile(dep.name, lockFile);
@@ -295,14 +299,15 @@
         try {
           var binDir = p.join(_directory, package, 'bin');
           cleanDir(binDir);
-          entrypoint.loadPackageGraph().then((x0) {
+          new Future.value(entrypoint.loadPackageGraph()).then((x0) {
             try {
               var graph = x0;
-              AssetEnvironment.create(
-                  entrypoint,
-                  BarbackMode.RELEASE,
-                  entrypoints: graph.packages[package].executableIds,
-                  useDart2JS: false).then((x1) {
+              new Future.value(
+                  AssetEnvironment.create(
+                      entrypoint,
+                      BarbackMode.RELEASE,
+                      entrypoints: graph.packages[package].executableIds,
+                      useDart2JS: false)).then((x1) {
                 try {
                   var environment = x1;
                   environment.barback.errors.listen(((error) {
@@ -338,7 +343,7 @@
           completer0.complete(source.resolveId(id));
         }
         if (!id.isRoot && source is CachedSource) {
-          source.downloadToSystemCache(id).then((x0) {
+          new Future.value(source.downloadToSystemCache(id)).then((x0) {
             try {
               x0;
               join0();
@@ -640,19 +645,19 @@
                   id = _loadPackageId(entry);
                   log.message(
                       "Reactivating ${log.bold(id.name)} ${id.version}...");
-                  find(id.name).then((x0) {
+                  new Future.value(find(id.name)).then((x0) {
                     trampoline0 = () {
                       trampoline0 = null;
                       try {
                         var entrypoint = x0;
-                        entrypoint.loadPackageGraph().then((x1) {
+                        new Future.value(
+                            entrypoint.loadPackageGraph()).then((x1) {
                           trampoline0 = () {
                             trampoline0 = null;
                             try {
                               var graph = x1;
-                              _precompileExecutables(
-                                  entrypoint,
-                                  id.name).then((x2) {
+                              new Future.value(
+                                  _precompileExecutables(entrypoint, id.name)).then((x2) {
                                 trampoline0 = () {
                                   trampoline0 = null;
                                   try {
diff --git a/sdk/lib/_internal/pub_generated/lib/src/log.dart b/sdk/lib/_internal/pub_generated/lib/src/log.dart
index 2b8cb4a..94a40b6 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/log.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/log.dart
@@ -42,9 +42,6 @@
 /// [recordTranscript()] is called.
 Transcript<Entry> _transcript;
 
-/// All currently-running progress indicators.
-final _progresses = new Set<Progress>();
-
 /// The currently-animated progress indicator, if any.
 ///
 /// This will also be in [_progresses].
@@ -376,13 +373,10 @@
 /// information will only be visible at [Level.FINE].
 Future progress(String message, Future callback(), {bool fine: false}) {
   _stopProgress();
+
   var progress = new Progress(message, fine: fine);
   _animatedProgress = progress;
-  _progresses.add(progress);
-  return callback().whenComplete(() {
-    progress.stop();
-    _progresses.remove(progress);
-  });
+  return callback().whenComplete(progress.stop);
 }
 
 /// Stops animating the running progress indicator, if currently running.
@@ -391,6 +385,31 @@
   _animatedProgress = null;
 }
 
+/// The number of outstanding calls to [muteProgress] that have not been unmuted
+/// yet.
+int _numMutes = 0;
+
+/// Whether progress animation should be muted or not.
+bool get isMuted => _numMutes > 0;
+
+/// Stops animating any ongoing progress.
+///
+/// This is called before spawning Git since Git sometimes writes directly to
+/// the terminal to ask for login credentials, which would then get overwritten
+/// by the progress animation.
+///
+/// Each call to this must be paired with a call to [unmuteProgress].
+void muteProgress() {
+  _numMutes++;
+}
+
+/// Resumes animating any ongoing progress once all calls to [muteProgress]
+/// have made their matching [unmuteProgress].
+void unmuteProgress() {
+  assert(_numMutes > 0);
+  _numMutes--;
+}
+
 /// Wraps [text] in the ANSI escape codes to make it bold when on a platform
 /// that supports that.
 ///
diff --git a/sdk/lib/_internal/pub_generated/lib/src/progress.dart b/sdk/lib/_internal/pub_generated/lib/src/progress.dart
index d74da56..483157d2 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/progress.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/progress.dart
@@ -49,10 +49,11 @@
       return;
     }
 
-    _update();
     _timer = new Timer.periodic(new Duration(milliseconds: 100), (_) {
       _update();
     });
+
+    _update();
   }
 
   /// Stops the progress indicator.
@@ -89,11 +90,11 @@
 
   /// Refreshes the progress line.
   void _update() {
+    if (log.isMuted) return;
+
     stdout.write(log.format("\r$_message... "));
 
     // Show the time only once it gets noticeably long.
-    if (_stopwatch.elapsed.inSeconds > 0) {
-      stdout.write(log.gray(_time));
-    }
+    if (_stopwatch.elapsed.inSeconds > 0) stdout.write("${log.gray(_time)} ");
   }
 }
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 b8cabb2..18b4954 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/source/git.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/source/git.dart
@@ -193,16 +193,14 @@
                 }
               }
               try {
-                git.run(
-                    ["clean", "-d", "--force", "-x"],
-                    workingDir: package.dir).then((x0) {
+                new Future.value(
+                    git.run(["clean", "-d", "--force", "-x"], workingDir: package.dir)).then((x0) {
                   trampoline0 = () {
                     trampoline0 = null;
                     try {
                       x0;
-                      git.run(
-                          ["reset", "--hard", "HEAD"],
-                          workingDir: package.dir).then((x1) {
+                      new Future.value(
+                          git.run(["reset", "--hard", "HEAD"], workingDir: package.dir)).then((x1) {
                         trampoline0 = () {
                           trampoline0 = null;
                           try {
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 bc4bcd5..489671c 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/source/hosted.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/source/hosted.dart
@@ -148,7 +148,7 @@
               var packages =
                   _getCachedPackagesInDirectory(path.basename(serverDir));
               packages.sort(Package.orderByNameAndVersion);
-              Future.forEach(packages, ((package) {
+              new Future.value(Future.forEach(packages, ((package) {
                 final completer0 = new Completer();
                 scheduleMicrotask(() {
                   try {
@@ -177,11 +177,8 @@
                       }
                     }
                     try {
-                      _download(
-                          url,
-                          package.name,
-                          package.version,
-                          package.dir).then((x0) {
+                      new Future.value(
+                          _download(url, package.name, package.version, package.dir)).then((x0) {
                         try {
                           x0;
                           successes++;
@@ -198,7 +195,7 @@
                   }
                 });
                 return completer0.future;
-              })).then((x0) {
+              }))).then((x0) {
                 trampoline0 = () {
                   trampoline0 = null;
                   try {
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 d558407..efbd53c 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/validator/dependency.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/validator/dependency.dart
@@ -40,7 +40,8 @@
     scheduleMicrotask(() {
       try {
         var caretDeps = [];
-        Future.forEach(entrypoint.root.pubspec.dependencies, ((dependency) {
+        new Future.value(
+            Future.forEach(entrypoint.root.pubspec.dependencies, ((dependency) {
           final completer0 = new Completer();
           scheduleMicrotask(() {
             try {
@@ -48,7 +49,7 @@
                 completer0.complete();
               }
               if (dependency.source != "hosted") {
-                _warnAboutSource(dependency).then((x0) {
+                new Future.value(_warnAboutSource(dependency)).then((x0) {
                   try {
                     x0;
                     join0();
@@ -111,7 +112,7 @@
             }
           });
           return completer0.future;
-        })).then((x0) {
+        }))).then((x0) {
           try {
             x0;
             join0() {
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/utils.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/utils.dart
index 7e1a7ae..bd2243f 100644
--- a/sdk/lib/_internal/pub_generated/test/global/binstubs/utils.dart
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/utils.dart
@@ -20,7 +20,7 @@
       join0(x0) {
         var separator = x0;
         var path = "${Platform.environment["PATH"]}${separator}${binDir}";
-        getPubTestEnvironment().then((x1) {
+        new Future.value(getPubTestEnvironment()).then((x1) {
           try {
             var environment = x1;
             environment["PATH"] = path;
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index 10aa237..7f4050c 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -239,14 +239,24 @@
    * Returns a future which will complete once all the futures in a list are
    * complete. If any of the futures in the list completes with an error,
    * the resulting future also completes with an error. Otherwise the value
-   * of the returned future will be a list of all the values that were produced.
+   * of the returned future will be a list of all the values that were
+   * produced.
    *
    * If `eagerError` is true, the future completes with an error immediately on
    * the first error from one of the futures. Otherwise all futures must
    * complete before the returned future is completed (still with the first
    * error to occur, the remaining errors are silently dropped).
+   *
+   * If [cleanUp] is provided, in the case of an error, any non-null result of
+   * a successful future is passed to `cleanUp`, which can then release any
+   * resources that the successful operation allocated.
+   *
+   * The call to `cleanUp` should not throw. If it does, the error will be an
+   * uncaught asynchronous error.
    */
-  static Future<List> wait(Iterable<Future> futures, {bool eagerError: false}) {
+  static Future<List> wait(Iterable<Future> futures,
+                           {bool eagerError: false,
+                            void cleanUp(successValue)}) {
     final _Future<List> result = new _Future<List>();
     List values;  // Collects the values. Set to null on error.
     int remaining = 0;  // How many futures are we waiting for.
@@ -254,11 +264,18 @@
     StackTrace stackTrace;  // The stackTrace that came with the error.
 
     // Handle an error from any of the futures.
-    handleError(theError, theStackTrace) {
-      final bool isFirstError = (values != null);
-      values = null;
+    void handleError(theError, theStackTrace) {
       remaining--;
-      if (isFirstError) {
+      if (values != null) {
+        if (cleanUp != null) {
+          for (var value in values) {
+            if (value != null) {
+              // Ensure errors from cleanUp are uncaught.
+              new Future.sync(() { cleanUp(value); });
+            }
+          }
+        }
+        values = null;
         if (remaining == 0 || eagerError) {
           result._completeError(theError, theStackTrace);
         } else {
@@ -281,8 +298,14 @@
           if (remaining == 0) {
             result._completeWithValue(values);
           }
-        } else if (remaining == 0 && !eagerError) {
-          result._completeError(error, stackTrace);
+        } else {
+          if (cleanUp != null && value != null) {
+            // Ensure errors from cleanUp are uncaught.
+            new Future.sync(() { cleanUp(value); });
+          }
+          if (remaining == 0 && !eagerError) {
+            result._completeError(error, stackTrace);
+          }
         }
       }, onError: handleError);
     }
diff --git a/sdk/lib/io/directory_impl.dart b/sdk/lib/io/directory_impl.dart
index 00c0450..a54b2ef 100644
--- a/sdk/lib/io/directory_impl.dart
+++ b/sdk/lib/io/directory_impl.dart
@@ -286,6 +286,9 @@
           if (response is int) {
             id = response;
             next();
+	  } else if (response is Error) {
+            controller.addError(response);
+            close();
           } else {
             error(response);
             close();
diff --git a/sdk/lib/io/file.dart b/sdk/lib/io/file.dart
index 9565d4d..711793a 100644
--- a/sdk/lib/io/file.dart
+++ b/sdk/lib/io/file.dart
@@ -32,6 +32,20 @@
 /// end of it. The file is created if it does not already exist.
 const APPEND = FileMode.APPEND;
 
+
+/// Type of lock when requesting a lock on a file.
+class FileLock {
+  final int _lock;
+
+  /// Shared file lock.
+  static const SHARED = const FileLock._internal(0);
+
+  /// Exclusive file lock.
+  static const EXCLUSIVE = const FileLock._internal(1);
+
+  const FileLock._internal(this._lock);
+}
+
 /**
  * A reference to a file on the file system.
  *
@@ -698,6 +712,104 @@
   void flushSync();
 
   /**
+   * Locks the file or part of the file.
+   *
+   * By default an exclusive lock will be obtained, but that can be overridden
+   * by the [mode] argument.
+   *
+   * Locks the byte range from [start] to [end] of the file, with the
+   * byte at position `end` not included. If no arguments are
+   * specified, the full file is locked, If only `start` is specified
+   * the file is locked from byte position `start` to the end of the
+   * file, no matter how large it grows. It is possible to specify an
+   * explicit value of `end` which is past the current length of the file.
+   *
+   * To obtain an exclusive lock on a file it must be opened for writing.
+   *
+   * *NOTE* file locking does have slight differences in behavior across
+   * platforms:
+   *
+   * On Linux and Mac OS this uses advisory locks, which have the
+   * surprising semantics that all locks associated with a given file
+   * are removed when *any* file descriptor for that file is closed by
+   * the process. Note that this does not actually lock the file for
+   * access. Also note that advisory locks are on a process
+   * level. This means that several isolates in the same process can
+   * obtain an exclusive lock on the same file.
+   *
+   * On Windows the regions used for lock and unlock needs to match. If that
+   * is not the case unlocking will result in the OS error "The segment is
+   * already unlocked".
+   */
+  Future<RandomAccessFile> lock(
+      [FileLock mode = FileLock.EXCLUSIVE, int start = 0, int end]);
+
+  /**
+   * Synchronously locks the file or part of the file.
+   *
+   * By default an exclusive lock will be obtained, but that can be overridden
+   * by the [mode] argument.
+   *
+   * Locks the byte range from [start] to [end] of the file ,with the
+   * byte at position `end` not included. If no arguments are
+   * specified, the full file is locked, If only `start` is specified
+   * the file is locked from byte position `start` to the end of the
+   * file, no matter how large it grows. It is possible to specify an
+   * explicit value of `end` which is past the current length of the file.
+   *
+   * To obtain an exclusive lock on a file it must be opened for writing.
+   *
+   * *NOTE* file locking does have slight differences in behavior across
+   * platforms:
+   *
+   * On Linux and Mac OS this uses advisory locks, which have the
+   * surprising semantics that all locks associated with a given file
+   * are removed when *any* file descriptor for that file is closed by
+   * the process. Note that this does not actually lock the file for
+   * access. Also note that advisory locks are on a process
+   * level. This means that several isolates in the same process can
+   * obtain an exclusive lock on the same file.
+   *
+   * On Windows the regions used for lock and unlock needs to match. If that
+   * is not the case unlocking will result in the OS error "The segment is
+   * already unlocked".
+   *
+   */
+  void lockSync([FileLock mode = FileLock.EXCLUSIVE, int start = 0, int end]);
+
+  /**
+   * Unlocks the file or part of the file.
+   *
+   * Unlocks the byte range from [start] to [end] of the file, with
+   * the byte at position `end` not included. If no arguments are
+   * specified, the full file is unlocked, If only `start` is
+   * specified the file is unlocked from byte position `start` to the
+   * end of the file.
+   *
+   * *NOTE* file locking does have slight differences in behavior across
+   * platforms:
+   *
+   * See [lock] for more details.
+   */
+  Future<RandomAccessFile> unlock([int start = 0, int end]);
+
+  /**
+   * Synchronously unlocks the file or part of the file.
+   *
+   * Unlocks the byte range from [start] to [end] of the file, with
+   * the byte at position `end` not included. If no arguments are
+   * specified, the full file is unlocked, If only `start` is
+   * specified the file is unlocked from byte position `start` to the
+   * end of the file.
+   *
+   * *NOTE* file locking does have slight differences in behavior across
+   * platforms:
+   *
+   * See [lockSync] for more details.
+   */
+  void unlockSync([int start = 0, int end]);
+
+  /**
    * Returns a human-readable string for this RandomAccessFile instance.
    */
   String toString();
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index 72d5a6d..b0babc2 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -940,6 +940,85 @@
     }
   }
 
+  static final int LOCK_UNLOCK = 0;
+  static final int LOCK_SHARED = 1;
+  static final int LOCK_EXCLUSIVE = 2;
+
+  Future<RandomAccessFile> lock(
+      [FileLock mode = FileLock.EXCLUSIVE, int start = 0, int end]) {
+    if ((start != null && start is !int) ||
+        (end != null && end is !int) ||
+         mode is !FileLock) {
+      throw new ArgumentError();
+    }
+    if (start == null) start = 0;
+    if (end == null) end = -1;
+    if (start < 0 || end < -1 || (end != -1 && start >= end)) {
+      throw new ArgumentError();
+    }
+    int lock = mode == FileLock.EXCLUSIVE ? LOCK_EXCLUSIVE : LOCK_SHARED;
+    return _dispatch(_FILE_LOCK, [_id, lock, start, end])
+        .then((response) {
+          if (_isErrorResponse(response)) {
+            throw _exceptionFromResponse(response, 'lock failed', path);
+          }
+          return this;
+        });
+  }
+
+  Future<RandomAccessFile> unlock([int start = 0, int end]) {
+    if ((start != null && start is !int) ||
+        (end != null && end is !int)) {
+      throw new ArgumentError();
+    }
+    if (start == null) start = 0;
+    if (end == null) end = -1;
+    if (start == end) throw new ArgumentError();
+    return _dispatch(_FILE_LOCK, [_id, LOCK_UNLOCK, start, end])
+        .then((response) {
+          if (_isErrorResponse(response)) {
+            throw _exceptionFromResponse(response, 'unlock failed', path);
+          }
+          return this;
+        });
+  }
+
+  external static _lock(int id, int lock, int start, int end);
+
+  void lockSync([FileLock mode = FileLock.EXCLUSIVE, int start = 0, int end]) {
+    _checkAvailable();
+    if ((start != null && start is !int) ||
+        (end != null && end is !int) ||
+         mode is !FileLock) {
+      throw new ArgumentError();
+    }
+    if (start == null) start = 0;
+    if (end == null) end = -1;
+    if (start < 0 || end < -1 || (end != -1 && start >= end)) {
+      throw new ArgumentError();
+    }
+    int lock = mode == FileLock.EXCLUSIVE ? LOCK_EXCLUSIVE : LOCK_SHARED;
+    var result = _lock(_id, lock, start, end);
+    if (result is OSError) {
+      throw new FileSystemException('lock failed', path, result);
+    }
+  }
+
+  void unlockSync([int start = 0, int end]) {
+    _checkAvailable();
+    if ((start != null && start is !int) ||
+        (end != null && end is !int)) {
+      throw new ArgumentError();
+    }
+    if (start == null) start = 0;
+    if (end == null) end = -1;
+    if (start == end) throw new ArgumentError();
+    var result = _lock(_id, LOCK_UNLOCK, start, end);
+    if (result is OSError) {
+      throw new FileSystemException('unlock failed', path, result);
+    }
+  }
+
   bool get closed => _id == 0;
 
   Future _dispatch(int request, List data, { bool markClosed: false }) {
diff --git a/sdk/lib/io/file_system_entity.dart b/sdk/lib/io/file_system_entity.dart
index 2c43295..ee4312f 100644
--- a/sdk/lib/io/file_system_entity.dart
+++ b/sdk/lib/io/file_system_entity.dart
@@ -269,22 +269,30 @@
   /**
    * Resolves the path of a file system object relative to the
    * current working directory, resolving all symbolic links on
-   * the path and resolving all '..' and '.' path segments.
-   * [resolveSymbolicLinks] returns a [:Future<String>:]
+   * the path and resolving all `..` and `.` path segments.
    *
-   * [resolveSymbolicLinks] uses the operating system's native filesystem api
-   * to resolve the path, using the realpath function on linux and
-   * Mac OS, and the GetFinalPathNameByHandle function on Windows.
-   * If the path does not point to an existing file system object,
-   * [resolveSymbolicLinks] completes the returned Future with an FileSystemException.
+   * [resolveSymbolicLinks] uses the operating system's native
+   * file system API to resolve the path, using the `realpath` function
+   * on linux and Mac OS, and the `GetFinalPathNameByHandle` function on
+   * Windows. If the path does not point to an existing file system object,
+   * `resolveSymbolicLinks` throws a `FileSystemException`.
    *
-   * On Windows, symbolic links are resolved to their target before applying
-   * a '..' that follows, and on other platforms, the '..' is applied to the
-   * symbolic link without resolving it.  The second behavior can be emulated
-   * on Windows by processing any '..' segments before calling
-   * [resolveSymbolicLinks].  One way of doing this is with the URI class:
-   * [:new Uri.parse('.').resolveUri(new Uri.file(input)).toFilePath();],
-   * since [resolve] removes '..' segments.
+   * On Windows the `..` segments are resolved _before_ resolving the symbolic
+   * link, and on other platforms the symbolic links are _resolved to their
+   * target_ before applying a `..` that follows.
+   *
+   * To ensure the same behavior on all platforms resolve `..` segments before
+   * calling `resolveSymbolicLinks`. One way of doing this is with the `Uri`
+   * class:
+   *
+   *     var path = Uri.parse('.').resolveUri(new Uri.file(input)).toFilePath();
+   *     if (path == '') path = '.';
+   *     new File(path).resolveSymbolicLinks().then((resolved) {
+   *       print(resolved);
+   *     });
+   *
+   * since `Uri.resolve` removes `..` segments. This will result in the Windows
+   * behavior.
    */
   Future<String> resolveSymbolicLinks() {
     return _IOService.dispatch(_FILE_RESOLVE_SYMBOLIC_LINKS, [path])
@@ -301,21 +309,29 @@
   /**
    * Resolves the path of a file system object relative to the
    * current working directory, resolving all symbolic links on
-   * the path and resolving all '..' and '.' path segments.
+   * the path and resolving all `..` and `.` path segments.
    *
    * [resolveSymbolicLinksSync] uses the operating system's native
-   * filesystem api to resolve the path, using the realpath function
-   * on linux and Mac OS, and the GetFinalPathNameByHandle function on Windows.
-   * If the path does not point to an existing file system object,
-   * [resolveSymbolicLinksSync] throws a FileSystemException.
+   * file system API to resolve the path, using the `realpath` function
+   * on linux and Mac OS, and the `GetFinalPathNameByHandle` function on
+   * Windows. If the path does not point to an existing file system object,
+   * `resolveSymbolicLinksSync` throws a `FileSystemException`.
    *
-   * On Windows, symbolic links are resolved to their target before applying
-   * a '..' that follows, and on other platforms, the '..' is applied to the
-   * symbolic link without resolving it.  The second behavior can be emulated
-   * on Windows by processing any '..' segments before calling
-   * [resolveSymbolicLinks].  One way of doing this is with the URI class:
-   * [:new Uri.parse('.').resolveUri(new Uri.file(input)).toFilePath();],
-   * since [resolve] removes '..' segments.
+   * On Windows the `..` segments are resolved _before_ resolving the symbolic
+   * link, and on other platforms the symbolic links are _resolved to their
+   * target_ before applying a `..` that follows.
+   *
+   * To ensure the same behavior on all platforms resolve `..` segments before
+   * calling `resolveSymbolicLinksSync`. One way of doing this is with the `Uri`
+   * class:
+   *
+   *     var path = Uri.parse('.').resolveUri(new Uri.file(input)).toFilePath();
+   *     if (path == '') path = '.';
+   *     var resolved = new File(path).resolveSymbolicLinksSync();
+   *     print(resolved);
+   *
+   * since `Uri.resolve` removes `..` segments. This will result in the Windows
+   * behavior.
    */
   String resolveSymbolicLinksSync() {
     var result = _resolveSymbolicLinks(path);
diff --git a/sdk/lib/io/io_service.dart b/sdk/lib/io/io_service.dart
index 4becb03..03db8ad 100644
--- a/sdk/lib/io/io_service.dart
+++ b/sdk/lib/io/io_service.dart
@@ -32,18 +32,19 @@
 const int _FILE_TYPE = 24;
 const int _FILE_IDENTICAL = 25;
 const int _FILE_STAT = 26;
-const int _SOCKET_LOOKUP = 27;
-const int _SOCKET_LIST_INTERFACES = 28;
-const int _SOCKET_REVERSE_LOOKUP = 29;
-const int _DIRECTORY_CREATE = 30;
-const int _DIRECTORY_DELETE = 31;
-const int _DIRECTORY_EXISTS = 32;
-const int _DIRECTORY_CREATE_TEMP = 33;
-const int _DIRECTORY_LIST_START = 34;
-const int _DIRECTORY_LIST_NEXT = 35;
-const int _DIRECTORY_LIST_STOP = 36;
-const int _DIRECTORY_RENAME = 37;
-const int _SSL_PROCESS_FILTER = 38;
+const int _FILE_LOCK = 27;
+const int _SOCKET_LOOKUP = 28;
+const int _SOCKET_LIST_INTERFACES = 29;
+const int _SOCKET_REVERSE_LOOKUP = 30;
+const int _DIRECTORY_CREATE = 31;
+const int _DIRECTORY_DELETE = 32;
+const int _DIRECTORY_EXISTS = 33;
+const int _DIRECTORY_CREATE_TEMP = 34;
+const int _DIRECTORY_LIST_START = 35;
+const int _DIRECTORY_LIST_NEXT = 36;
+const int _DIRECTORY_LIST_STOP = 37;
+const int _DIRECTORY_RENAME = 38;
+const int _SSL_PROCESS_FILTER = 39;
 
 class _IOService {
   external static Future dispatch(int request, List data);
diff --git a/site/try/src/interaction_manager.dart b/site/try/src/interaction_manager.dart
index 57cf459..7df3923 100644
--- a/site/try/src/interaction_manager.dart
+++ b/site/try/src/interaction_manager.dart
@@ -33,7 +33,7 @@
     UnmatchedToken,
     UnterminatedToken;
 
-import 'package:compiler/src/source_file.dart' show
+import 'package:compiler/src/io/source_file.dart' show
     StringSourceFile;
 
 import 'package:compiler/src/string_validator.dart' show
diff --git a/tests/co19/co19-analyzer.status b/tests/co19/co19-analyzer.status
index bf3862e..3d3ecf6 100644
--- a/tests/co19/co19-analyzer.status
+++ b/tests/co19/co19-analyzer.status
@@ -259,14 +259,35 @@
 # co19-roll r786
 LayoutTests/fast/events/initkeyboardevent-crash_t01: StaticWarning # co19-roll r786: Please triage this failure.
 LayoutTests/fast/events/wheelevent-constructor_t01: StaticWarning # co19-roll r786: Please triage this failure.
-LayoutTests/fast/svg/getbbox_t01: StaticWarning # co19-roll r786: Please triage this failure.
+
+# co19-roll r801
+LayoutTests/fast/html/select-dropdown-consistent-background-color_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/inline/boundingBox-with-continuation_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/loader/about-blank-hash-kept_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/loader/hashchange-event-properties_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/loader/scroll-position-restored-on-reload-at-load-event_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/loader/stateobjects/replacestate-in-onunload_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/media/media-query-list-syntax_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/media/mq-append-delete_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/media/mq-color-index_t02: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/media/mq-js-media-except_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/media/mq-js-media-except_t02: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/media/mq-parsing_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/mediastream/RTCPeerConnection-AddRemoveStream_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/vertical-lr/float-truncation_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/vertical-lr/image-inside-nested-blocks-with-border_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/vertical-rl/float-truncation_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/vertical-rl/image-inside-nested-blocks-with-border_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/overflow/scroll-vertical-not-horizontal_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/ruby/after-doesnt-crash_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-big-box-border-radius_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-diamond-margin-polygon_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t02: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t01: StaticWarning # co19-roll r801: Please triage this failure.
 
 LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t01: StaticWarning # co19 issue 703
 WebPlatformTest/dom/Node-replaceChild_t01: CompileTimeError # co19-roll r761: Please triage this failure.
 WebPlatformTest/html/semantics/forms/the-input-element/email_t02: StaticWarning # co19 issue 701
-
-LayoutTests/fast/table/before-child-non-table-section-add-table-crash_t01: StaticWarning # co19 issue 720.
-LayoutTests/fast/table/computeLogicalWidth-table-needsSectionRecalc_t01: StaticWarning # co19 issue 720.
-LayoutTests/fast/table/incorrect-colgroup-span-values_t01: StaticWarning # co19 issue 720.
-LayoutTests/fast/table/rowindex-comment-nodes_t01: StaticWarning # co19 issue 720.
-LayoutTests/fast/table/table-cell-offset-width_t01: StaticWarning # co19 issue 720.
+Language/12_Expressions/12_Instance_Creation/2_Const_A11_t01: MissingCompileTimeError # Issue 22010
+Language/12_Expressions/12_Instance_Creation/2_Const_A11_t03: MissingCompileTimeError # Issue 22010
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index e7124c5..668753e 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -254,14 +254,35 @@
 # co19-roll r786
 LayoutTests/fast/events/initkeyboardevent-crash_t01: StaticWarning # co19-roll r786: Please triage this failure.
 LayoutTests/fast/events/wheelevent-constructor_t01: StaticWarning # co19-roll r786: Please triage this failure.
-LayoutTests/fast/svg/getbbox_t01: StaticWarning # co19-roll r786: Please triage this failure.
+
+# co19-roll r801
+LayoutTests/fast/html/select-dropdown-consistent-background-color_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/inline/boundingBox-with-continuation_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/loader/about-blank-hash-kept_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/loader/hashchange-event-properties_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/loader/scroll-position-restored-on-reload-at-load-event_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/loader/stateobjects/replacestate-in-onunload_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/media/media-query-list-syntax_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/media/mq-append-delete_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/media/mq-color-index_t02: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/media/mq-js-media-except_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/media/mq-js-media-except_t02: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/media/mq-parsing_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/mediastream/RTCPeerConnection-AddRemoveStream_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/vertical-lr/float-truncation_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/vertical-lr/image-inside-nested-blocks-with-border_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/vertical-rl/float-truncation_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/vertical-rl/image-inside-nested-blocks-with-border_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/overflow/scroll-vertical-not-horizontal_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/ruby/after-doesnt-crash_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-big-box-border-radius_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-diamond-margin-polygon_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t01: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t02: StaticWarning # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t01: StaticWarning # co19-roll r801: Please triage this failure.
 
 LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t01: StaticWarning # co19 issue 703
 WebPlatformTest/dom/Node-replaceChild_t01: CompileTimeError # co19-roll r761: Please triage this failure.
 WebPlatformTest/html/semantics/forms/the-input-element/email_t02: StaticWarning # co19 issue 701
-
-LayoutTests/fast/table/before-child-non-table-section-add-table-crash_t01: StaticWarning # co19 issue 720.
-LayoutTests/fast/table/computeLogicalWidth-table-needsSectionRecalc_t01: StaticWarning # co19 issue 720.
-LayoutTests/fast/table/incorrect-colgroup-span-values_t01: StaticWarning # co19 issue 720.
-LayoutTests/fast/table/rowindex-comment-nodes_t01: StaticWarning # co19 issue 720.
-LayoutTests/fast/table/table-cell-offset-width_t01: StaticWarning # co19 issue 720.
+Language/12_Expressions/12_Instance_Creation/2_Const_A11_t01: MissingCompileTimeError # Issue 22010
+Language/12_Expressions/12_Instance_Creation/2_Const_A11_t03: MissingCompileTimeError # Issue 22010
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index e89e3ee..136e761 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -14,6 +14,7 @@
 # Tests that fail everywhere, including the analyzer.
 
 LibTest/typed_data/ByteData/buffer_A01_t01: Fail # co19 r736 bug - sent comment.
+LayoutTests/fast/mediastream/getusermedia_t01: Fail # co19 issue 738.
 
 # These tests are obsolete and need updating.
 WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-002_t01: Skip # Issue 19019
@@ -79,9 +80,6 @@
 [ $runtime == dartium || $compiler == dart2js ]
 LibTest/async/Future/Future.delayed_A01_t02: Pass, Fail # Issue 15524
 
-[ $compiler == dart2js || $compiler == none ]
-LibTest/async/DeferredLibrary/DeferredLibrary_A01_t01: Fail # co19 issue 718
-
 ### CHECKED MODE FAILURES ###
 
 [ $compiler != dartanalyzer && $compiler != dart2analyzer && $checked ]
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index 8be59a6..d431158 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -89,6 +89,8 @@
 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/2_Const_A11_t01: MissingCompileTimeError # Issue 21134
+Language/12_Expressions/12_Instance_Creation/2_Const_A11_t03: MissingCompileTimeError # Issue 21134
 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
@@ -115,8 +117,9 @@
 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/spawn_A02_t02: RuntimeError # Dart issue 15617
-LibTest/isolate/Isolate/spawnUri_A02_t01: RuntimeError # Dart issue 15617
+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 && $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 934fc87..ed32291 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -8,16 +8,14 @@
 # Crashes first, please. Then untriaged bugs. There is a section below
 # for co19 bugs.
 [ $compiler == dart2js ]
-# This test uses the old annotation-based syntax.
-LibTest/async/DeferredLibrary/DeferredLibrary_A01_t01: CompileTimeError # co19 issue 700
 LibTest/core/List/removeAt_A02_t01: RuntimeError # Issue 1533
 LibTest/isolate/ReceivePort/receive_A01_t02: RuntimeError # Issue 6750
 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 # 13363
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A12_t02: fail # 13363
+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/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
@@ -27,9 +25,9 @@
 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
-LibTest/async/Stream/listen_A05_t01: RuntimeError # https://code.google.com/p/co19/issues/detail?id=736 (see also dartbug.com/15171)
-LibTest/core/double/INFINITY_A01_t04: RuntimeError # TODO(ahe): Please triage this failure.
-LibTest/core/double/NEGATIVE_INFINITY_A01_t04: RuntimeError # TODO(ahe): Please triage this failure.
+LibTest/async/Stream/listen_A05_t01: RuntimeError # co19 issue 736. Issue 15171
+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
@@ -156,7 +154,6 @@
 # can understand so he can file a bug later.
 #
 [ $compiler == dart2js ]
-Language/03_Overview/2_Privacy_A01_t11: Pass, OK # co19 issue 316
 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
@@ -294,7 +291,7 @@
 LibTest/math/log_A01_t01: Fail # TODO(dart2js-team): Please triage this failure.
 
 
-[ $compiler == dart2js && ($runtime == ie10 || $runtime == ff || $runtime == chrome || $runtime == drt || $runtime == safari || $runtime == safarimobilesim || $runtime == opera ) ]
+[ $compiler == dart2js && ( $runtime == ie10 || $runtime == drt || $runtime == safari || $runtime == safarimobilesim || $runtime == opera ) ]
 *: Skip
 
 #
@@ -438,9 +435,6 @@
 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/12_Expressions/33_Type_Cast_A02_t03: fail # co19 issue 716
-Language/13_Statements/10_Rethrow_A01_t04: fail # co19 issue 719
-Language/13_Statements/10_Rethrow_A01_t05: fail # co19 issue 719
 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
@@ -449,7 +443,6 @@
 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_A12_t10: fail # co19 issue 716
 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
@@ -501,13 +494,6 @@
 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 && $checked ]
-Language/12_Expressions/03_Numbers_A05_t02: fail # co19 issue 716
-Language/12_Expressions/19_Conditional_A04_t03: fail # co19 issue 716
-Language/12_Expressions/20_Logical_Boolean_Expressions_A03_t01: fail # Issue 21195 and co19 issue 725
-Language/12_Expressions/27_Unary_Expressions_A02_t03: fail # Issue 21196 and co19 issue 726
-Language/13_Statements/06_For/1_For_Loop_A01_t08: fail # co19 issue 727
-
 [ $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
@@ -582,14 +568,6 @@
 LibTest/math/sin_A01_t02: RuntimeError # V8 issue 3006, https://code.google.com/p/v8/issues/detail?id=3006
 
 [ $compiler == dart2js && $minified ]
-Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: fail # co19 issue 729
-Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: fail # co19 issue 729
-Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: fail # co19 issue 729
-Language/12_Expressions/17_Getter_Invocation_A02_t01: fail # co19 issue 729
-Language/12_Expressions/18_Assignment_A05_t02: fail # co19 issue 729
-Language/12_Expressions/18_Assignment_A05_t04: fail # co19 issue 729
-Language/12_Expressions/18_Assignment_A05_t05: fail # co19 issue 729
-Language/12_Expressions/18_Assignment_A08_t04: fail # co19 issue 729
 LibTest/typed_data/Float32List/runtimeType_A01_t01: fail # co19-roll r559: Please triage this failure
 LibTest/typed_data/Float32x4List/runtimeType_A01_t01: fail # co19-roll r559: Please triage this failure
 LibTest/typed_data/Float64List/runtimeType_A01_t01: fail # co19-roll r559: Please triage this failure
@@ -619,7 +597,6 @@
 
 [ $compiler == dart2js ]
 LibTest/core/List/List_class_A01_t01: RuntimeError # co19-roll r623: Please triage this failure
-Language/03_Overview/2_Privacy_A01_t02: RuntimeError # co19 issue 730
 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
@@ -638,3 +615,2505 @@
 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) ]
+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/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-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
+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/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-blending-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-empty-image-pattern_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: Skip # Times out. 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-resize-after-paint_t01: Skip # Times out. 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/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
+LayoutTests/fast/canvas/webgl/framebuffer-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/gl-teximage_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/invalid-passed-params_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/object-deletion-behaviour_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-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/texImageTest_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/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-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/add-remove-stylesheets-at-once-minimal-recalc-style_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/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/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/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/fontface-properties_t01: 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
+LayoutTests/fast/css/implicit-attach-marking_t01: Skip # Times out. 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/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/modify-ua-rules-from-javascript_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/parsing-at-rule-recovery_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/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/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/shadow-current-color_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/css/sticky/parsing-position-sticky_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-element-process-crash_t01: Skip # Times out. 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-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-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/DOMException/XPathException_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: Pass, 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/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/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/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-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-port_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: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-autofocus_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/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/HTMLDocument/active-element-gets-unforcusable_t01: Skip # Times out. 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/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-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/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/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/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/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/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
+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-constructor_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-created-during-remove-children_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/range-detached-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/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-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
+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/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/blur-contenteditable_t01: Pass, 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/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/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
+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/implementation-createHTMLDocument_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: 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/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
+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/shadow-content-crash_t01: 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/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
+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/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_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/div-focus_t01: Pass, 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-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/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
+LayoutTests/fast/events/invalid-004_t01: RuntimeError # 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
+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: Pass, 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/scroll-event-phase_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/tabindex-removal-from-focused-element_t01: Pass, 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-parts-slice-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/blob-slice-test_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: Pass, 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/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-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/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/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/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
+LayoutTests/fast/forms/input-width-height-attributes-without-renderer-loaded-image_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/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: 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: 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
+LayoutTests/fast/html/imports/import-element-removed-flag_t01: RuntimeError # 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/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/layers/normal-flow-hit-test_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/layers/zindex-hit-test_t01: Pass, 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/media-query-list-syntax_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/mediastream/RTCPeerConnection-AddRemoveStream_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/cssom-view_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/flipped-blocks-hit-test_t01: Pass, 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_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/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/newmulticol/balance_t09: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance_t10: 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: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/widows_t02: 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/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_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/shapes/parsing/parsing-shape-lengths_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: Skip # Times out. Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-cancel_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-pause-resume_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/speechsynthesis/speech-synthesis-speak_t01: Skip # Times out. 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/float-containing-block-with-margin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/replaced-element-baseline_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/table-rows-have-stable-height_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/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/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/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-spaces_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/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/ipa-tone-letters_t01: Pass, 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/regional-indicator-symobls_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: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-pixel_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-rtl_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-vertical_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/text/sub-pixel/text-scaling-webfont_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/text/text-combine-shrink-to-fit_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/url/file-http-base_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/url/file_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/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/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/flipped-blocks-hit-test-overflow_t01: Pass, 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-inline-block-hittest_t01: Pass, 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/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/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/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/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/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/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/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/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/focus_A01_t01: Skip # Times out. 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: Skip # Times out. 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/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/animationFrame_A01_t01: Skip # Times out. 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_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
+LibTest/typed_data/Uint8ClampedList/buffer_A01_t01: Pass, 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_A03_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/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/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/isAttribute_A01_t01: RuntimeError # Please triage this failure
+WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t02: 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/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-replaceChild_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Node-textContent_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/setAttribute_A03_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/ranges/Range-comparePoint_t02: 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/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/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: 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/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: 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/textfieldselection-setRangeText_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setSelectionRange_t01: Pass, 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-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/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-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: Pass, 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-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_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/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/methods/elements-001_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-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-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-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-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-004_t01: RuntimeError # Please triage this failure
+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-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
+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/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/lower-boundary-encapsulation/test-004_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/test-009_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 == chrome || $runtime == drt) && $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
+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-shrinks-avoid-floats_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/box-sizing-border-box-dynamic-padding-border-update_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/display-inline-block-scrollbar_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/fixed-width-intrinsic-width-excludes-scrollbars_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/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/HTMLLabelElement/form/test1_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLTableElement/insert-row_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/scroll-event-phase_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/filesystem/file-writer-abort_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/filesystem/file-writer-events_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/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/html/article-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/html/aside-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/inline/empty-inline-before-collapsed-space_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/lists/list-style-position-inside_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/lists/marker-preferred-margins_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/fixed-column-percent-logical-height-orthogonal-writing-mode_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/replaced/available-height-for-content_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/computed-image-width-with-percent-height-and-fixed-ancestor_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/computed-image-width-with-percent-height-and-fixed-ancestor-vertical-lr_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/computed-image-width-with-percent-height-inside-table-cell-and-fixed-ancestor_t01: Pass, 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-margin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/shapes/parsing/parsing-shape-outside_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/absolute-table-percent-lengths_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/css-table-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/fixed-table-layout-width-change_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/html-table-width-max-width-constrained_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/margins-flipped-text-direction_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/min-max-width-preferred-size_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-width-exceeding-max-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/line-break-after-inline-latin1_t01: RuntimeError # Please triage this failure
+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
+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
+WebPlatformTest/dom/nodes/DOMImplementation-createDocumentType_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/dom/elements/global-attributes/dataset-enumeration_t01: RuntimeError # Please triage this failure
+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 ]
+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-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/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/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-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/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/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-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/texImage2DImageDataTest_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/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-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
+
+[ $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
+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-cancel2_t01: RuntimeError # 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-advance_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/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-radius-child_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/borders/border-width-percent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/box-sizing/css-table-with-box-sizing_t01: Pass, 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: Pass, 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-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-solid_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-blending-text_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-composite-canvas_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-composite-image_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-composite-text-alpha_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-drawImage-incomplete_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-zeroSizeGradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-fillRect-zeroSizeGradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-fillText-invalid-maxWidth_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-fillText-zeroSizeGradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-font-ex-units-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-frameless-document-text_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_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-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-shadowBlur_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-scale-strokePath-shadow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-set-properties-with-non-invertible-ctm_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-setTransform_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-stroke-zeroSizeGradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-strokePath-gradient-shadow_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-strokeRect-alpha-shadow_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-strokeRect-gradient-shadow_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-strokeRect-zeroSizeGradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-strokeText-invalid-maxWidth_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-strokeText-zeroSizeGradient_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-toDataURL-crash_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-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/getPutImageDataPairTest_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-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/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
+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-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/MarqueeLayoutTest_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-parser-crash_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/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-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/counters/counter-reset-subtree-insert-crash_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/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/focus-display-block-inline_t01: Pass, 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-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-face-used-after-retired_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-family-trailing-bracket-gunk_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/font-property-priority_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/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-length-unit_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/important-js-override_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-import-rule-insertion_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/invalid-predefined-color_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/overflow-property_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-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/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/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-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-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
+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/relative-positioned-block-crash_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/selector-text-escape_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/string-quote-binary_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/style-element-process-crash_t01: Skip # Times out. 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-important-rule_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/vertical-align-length-copy-bug_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-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/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/Document/document-title-get_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/fixed-position-offset-parent_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/getBoundingClientRect-getClientRects-relative-to-viewport_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Element/getClientRects_t01: Pass, 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/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-port_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/HTMLButtonElement/change-type_t01: Pass, 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: 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/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/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-natural-width-height_t01: Pass, 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/click-label_t01: RuntimeError # 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: Pass, 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: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLObjectElement/form/test1_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLObjectElement/set-type-to-null-crash_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/HTMLOutputElement/htmloutputelement-validity_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: 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/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/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/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/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/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-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/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-reachable_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Range/13000_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-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-detached-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-assertion_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/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-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
+LayoutTests/fast/dom/TreeWalker/TreeWalker-basic_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/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-screen-properties_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/dom/XMLSerializer-attribute-entities_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/anchor-origin_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/background-shorthand-csstext_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/blur-contenteditable_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/dom/boolean-attribute-reflection_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: 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
+LayoutTests/fast/dom/css-rule-functions_t01: RuntimeError # Please triage this failure
+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
+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/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/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
+LayoutTests/fast/dom/getElementsByClassName/011_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/implementation-createHTMLDocument_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/importNode-unsupported-node-type_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/insertBefore-refChild-crash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/javascript-backslash_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/length-attribute-mapping_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/location-hash_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/dom/navigator-userAgent_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: 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/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-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/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-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: RuntimeError # 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/insertAdjacentHTML-allowed-parents_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/change-overflow-on-overflow-change_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/events/clipboard-clearData_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/clipboard-dataTransferItemList-remove_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/clipboard-dataTransferItemList_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/div-focus_t01: Pass, 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-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/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-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: 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
+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-event-does-not-bubble_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/selectstart-on-selectall_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/selectstart-prevent-selectall_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/events/tabindex-removal-from-focused-element_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/events/wheelevent-constructor_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-immediate-abort_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/files/file-reader-methods-illegal-arguments_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-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
+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/box-size-integer-overflow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/flexbox/flexing-overflow-scroll-item_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/flexbox/repaint-scrollbar_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_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/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-input-css-style-change_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/forms/autofocus-opera-004_t01: RuntimeError # Please triage this failure
+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-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-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
+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-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-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
+LayoutTests/fast/forms/delete-text-with-invisible-br_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/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/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-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
+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-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-value-sanitization_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/input-width-height-attributes_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/min-content-form-controls_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/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/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-change-popup-to-listbox-roundtrip_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/select-list-box-mouse-focus_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/select-max-length_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/select-namedItem_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-nil-value-field-assert_t01: 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
+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/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/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-uri-resolution_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/innerHTML/javascript-url_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/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/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/color-does-not-include-alpha_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/media/invalid-lengths_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-serialization_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/media/mq-append-delete_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/mediastream/RTCPeerConnection-AddRemoveStream_t01: Skip # Times out. Please triage this failure
+LayoutTests/fast/mediastream/RTCPeerConnection_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/column-width-zero_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/fixed-column-percent-logical-height-orthogonal-writing-mode_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-maxheight_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance_t04: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance_t05: RuntimeError # Please triage this failure
+LayoutTests/fast/multicol/newmulticol/balance_t06: 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: RuntimeError # 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-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/widows_t02: 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/scrollbar-restored_t01: Pass, 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/stray-param_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/parser/strict-img-in-map_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/replaced/container-width-zero_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/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-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/computedstylemargin_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/sub-pixel/cssom-subpixel-precision_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-width_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/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/padding-height-and-override-height_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-cell-offset-width_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/table-size-integer-overflow_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/table/td-bordercolor-attribute_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/text/find-kana_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/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/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/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/text-fragment-first-letter-update-crash_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/text/zero-width-characters_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/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/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/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/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-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-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-invalid-xml_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-abort_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/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/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/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/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/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/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/focus_A01_t01: Skip # Times out. Please triage this failure
+LibTest/html/Element/getAttributeNS_A01_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/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/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_t01: 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/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/focus_A01_t01: Skip # Times out. 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/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/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
+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/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/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_A04_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/Float32List/Float32List.view_A06_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Float32x4List/Float32x4List.view_A06_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Float64List/Float64List.view_A06_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Int16List/Int16List.view_A06_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Int32List/Int32List.view_A06_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Int32x4/operator_OR_A01_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint16List/Uint16List.view_A06_t01: RuntimeError # Please triage this failure
+LibTest/typed_data/Uint32List/Uint32List.view_A06_t01: RuntimeError # Please triage this failure
+WebPlatformTest/DOMEvents/approved/EventObject.after.dispatchEvenr_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/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-createElementNS_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/Document-getElementsByTagName_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-replaceChild_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_A10_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/nodes/attributes/setAttribute_A03_t01: RuntimeError # Please triage this failure
+WebPlatformTest/dom/ranges/Range-comparePoint_t02: 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/templates-copy-document-owner_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/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-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.getElementsByName-newelements_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_t03: 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_t05: 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/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/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-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-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/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/range_t02: 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/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: 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/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/dir_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: Pass, 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/tabular-data/the-caption-element/caption_t01: RuntimeError # Please triage this failure
+WebPlatformTest/html/semantics/tabular-data/the-table-element/caption-methods_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/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: 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/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/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_quotaexceedederr_t01: Skip # Times out. 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 9660f1f..d61e858 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -6,19 +6,21 @@
 *: Skip # running co19 tests on content_shell would make our dartium cycle-times very long
 
 [ $compiler == none && $runtime == dartium && $system == macos ]
-LayoutTests/fast/writing-mode/broken-ideographic-font_t01: Skip # Timing out on the bots
+LayoutTests/fast/writing-mode/broken-ideographic-font_t01: Skip # Timing out on the bots. Please triage this failure.
 LayoutTests/fast/css-generated-content/pseudo-animation-before-onload_t01: Skip # Depends on animation timing, commented as known to be flaky in test.  Will not fix.
 LayoutTests/fast/writing-mode/vertical-inline-block-hittest_t01: Pass, RuntimeError # Issue 21605
 LayoutTests/fast/writing-mode/flipped-blocks-hit-test-overflow_t01: Pass, RuntimeError # Issue 21605
 
-[ $compiler == none && $mode == debug && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
+[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
 LayoutTests/fast/canvas/canvas-lineDash-input-sequence_t01: Skip # Issue 20867
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba4444_t01: Skip # Issue 20540
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgb565_t01: Skip # Issue 20540
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba5551_t01: Skip # Issue 20540
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video_t01: Skip # Issue 20540
-
-[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
+Language/12_Expressions/12_Instance_Creation/2_Const_A11_t01: Fail # Issue 22007
+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/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.
@@ -43,12 +45,17 @@
 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/forms/datetimelocal/datetimelocal-interactive-validation-required_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.
 
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: Pass, Fail # Issue 13719: Please triage this failure.
-Language/14_Libraries_and_Scripts/3_Parts_A02_t02: Skip # Issue 13719: Please triage this failure.
+LayoutTests/fast/mediastream/getusermedia_t01: Skip # co19 issue 738
+
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: Pass, Fail #: Please triage this failure.
+Language/14_Libraries_and_Scripts/3_Parts_A02_t02: Skip # Please triage this failure.
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: Pass # Issue 14478: This should break.
-LibTest/async/Completer/completeError_A02_t01: Pass, Fail # Issue 13719: Please triage this failure.
-LibTest/core/int/operator_left_shift_A01_t02: Pass, Fail # Issue 13719: Please triage this failure.
+LibTest/async/Completer/completeError_A02_t01: Pass, Fail # Please triage this failure.
+LibTest/core/int/operator_left_shift_A01_t02: Pass, Fail # Please triage this failure.
 LibTest/isolate/SendPort/send_A02_t01: Fail # Issue 13921
 LibTest/isolate/SendPort/send_A02_t04: Fail # Issue 13921
 LibTest/isolate/SendPort/send_A02_t05: Fail # Issue 13921
@@ -131,100 +138,93 @@
 LibTest/isolate/ReceivePort/transform_A01_t02: RuntimeError # Issue 13921
 LibTest/isolate/ReceivePort/where_A01_t01: RuntimeError # Issue 13921
 LibTest/isolate/ReceivePort/where_A01_t02: RuntimeError # Issue 13921
-
-# New Dartium failures on new co19 browser tests in co19 revision 706.
-
-LibTest/html/Element/blur_A01_t01: Skip # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/blur_A01_t01: Skip # Issue 17758.  Please triage this failure.
-LibTest/html/Element/focus_A01_t01: Skip # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/focus_A01_t01: Skip # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/enteredView_A01_t01: Skip # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/leftView_A01_t01: Skip # Issue 17758.  Please triage this failure.
-LibTest/html/HttpRequest/onError_A01_t02: Skip # Issue 17758.  Please triage this failure.
-LibTest/html/HttpRequest/responseText_A01_t02: Skip # Issue 17758.  Please triage this failure.
-LibTest/html/HttpRequestUpload/onError_A01_t02: Skip # Issue 17758.  Please triage this failure.
-LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: Skip # Issue 17758.  Please triage this failure.
-LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: Skip # Issue 17758.  Please triage this failure.
-LibTest/html/HttpRequestUpload/onLoad_A01_t01: Skip # Issue 17758.  Please triage this failure.
-WebPlatformTest/dom/events/event_constants/constants_A01_t01: Skip # Issue 17758.  Please triage this failure.
-WebPlatformTest/dom/events/event_constructors/Event_A01_t01: Skip # Issue 17758.  Please triage this failure.
-WebPlatformTest/dom/events/event_constructors/Event_A02_t01: Skip # Issue 17758.  Please triage this failure.
-
-LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/basic_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/hittest-relative-to-viewport_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/replace-element_t01: Pass, RuntimeError # Issue 17758.  Please triage this failure.
-LayoutTests/fast/dom/Document/createElementNS-namespace-err_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LayoutTests/fast/dom/Element/setAttributeNS-namespace-err_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LayoutTests/fast/html/hidden-attr_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LayoutTests/fast/html/imports/import-element-removed-flag_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LayoutTests/fast/html/imports/import-events_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/async/Stream/Stream.periodic_A01_t01: Pass, RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Document/childNodes_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Document/clone_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Document/clone_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Document/securityPolicy_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Element/borderEdge_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Element/contentEdge_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Element/dataset_A02_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Element/getAttributeNS_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Element/getAttributeNS_A01_t02: RuntimeError # Issue 19055.
-LibTest/html/Element/getClientRects_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Element/isContentEditable_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Element/isContentEditable_A02_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Element/marginEdge_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Element/paddingEdge_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Element/replaceWith_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/HttpRequest/responseType_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/HttpRequest/responseType_A01_t03: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/HttpRequest/statusText_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/IFrameElement.created_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/appendHtml_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/appendHtml_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/attributeChanged_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/attributes_setter_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/borderEdge_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/clone_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/contentWindow_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/createFragment_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/createFragment_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/createFragment_A01_t03: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/createShadowRoot_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/getClientRects_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/getNamespacedAttributes_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/innerHtml_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/isContentEditable_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/marginEdge_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/offsetTo_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/setInnerHtml_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Window/close_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Window/find_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Window/find_A03_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Window/find_A06_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Window/moveTo_A01_t01: RuntimeError, Pass # Issue 17758.  Please triage this failure.
-LibTest/html/Window/moveTo_A02_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Window/postMessage_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Window/requestFileSystem_A02_t01: RuntimeError, Pass # Issue 17758.  Please triage this failure.
-LibTest/html/Window/resizeBy_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Window/resizeTo_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/isolate/SendPort/send_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/isolate/SendPort/send_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/isolate/SendPort/send_A01_t03: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/isolate/SendPort/send_A01_t04: RuntimeError # Issue 17758.  Please triage this failure.
-
+LibTest/html/Element/blur_A01_t01: Skip # co19-roll r706.  Please triage this failure.
+LibTest/html/IFrameElement/blur_A01_t01: Skip # co19-roll r706.  Please triage this failure.
+LibTest/html/Element/focus_A01_t01: Skip # co19-roll r706.  Please triage this failure.
+LibTest/html/IFrameElement/focus_A01_t01: Skip # co19-roll r706.  Please triage this failure.
+LibTest/html/IFrameElement/enteredView_A01_t01: Skip # co19-roll r706.  Please triage this failure.
+LibTest/html/IFrameElement/leftView_A01_t01: Skip # co19-roll r706.  Please triage this failure.
+LibTest/html/HttpRequest/onError_A01_t02: Skip # co19-roll r706.  Please triage this failure.
+LibTest/html/HttpRequest/responseText_A01_t02: Skip # co19-roll r706.  Please triage this failure.
+LibTest/html/HttpRequestUpload/onError_A01_t02: Skip # co19-roll r706.  Please triage this failure.
+LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: Skip # co19-roll r706.  Please triage this failure.
+LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: Skip # co19-roll r706.  Please triage this failure.
+LibTest/html/HttpRequestUpload/onLoad_A01_t01: Skip # co19-roll r706.  Please triage this failure.
+WebPlatformTest/dom/events/event_constants/constants_A01_t01: Skip # co19-roll r706.  Please triage this failure.
+WebPlatformTest/dom/events/event_constructors/Event_A01_t01: Skip # co19-roll r706.  Please triage this failure.
+WebPlatformTest/dom/events/event_constructors/Event_A02_t01: Skip # co19-roll r706.  Please triage this failure.
+LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/basic_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/hittest-relative-to-viewport_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/replace-element_t01: Pass, RuntimeError # co19-roll r706.  Please triage this failure.
+LayoutTests/fast/dom/Document/createElementNS-namespace-err_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LayoutTests/fast/dom/Element/setAttributeNS-namespace-err_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LayoutTests/fast/html/hidden-attr_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LayoutTests/fast/html/imports/import-element-removed-flag_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LayoutTests/fast/html/imports/import-events_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/async/Stream/Stream.periodic_A01_t01: Pass, RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/html/Document/childNodes_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+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/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_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/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/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.
+LibTest/html/HttpRequest/statusText_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/html/IFrameElement/IFrameElement.created_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/html/IFrameElement/appendHtml_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+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/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.
+LibTest/html/IFrameElement/createFragment_A01_t02: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/html/IFrameElement/createFragment_A01_t03: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/html/IFrameElement/createShadowRoot_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/html/IFrameElement/getClientRects_A01_t02: RuntimeError # co19-roll r706.  Please triage this failure.
+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/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.
+LibTest/html/Window/find_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/html/Window/find_A03_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/html/Window/find_A06_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/html/Window/moveTo_A01_t01: RuntimeError, Pass # co19-roll r706.  Please triage this failure.
+LibTest/html/Window/moveTo_A02_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/html/Window/postMessage_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/html/Window/requestFileSystem_A02_t01: RuntimeError, Pass # co19-roll r706.  Please triage this failure.
+LibTest/html/Window/resizeBy_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/html/Window/resizeTo_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/isolate/SendPort/send_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/isolate/SendPort/send_A01_t02: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/isolate/SendPort/send_A01_t03: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/isolate/SendPort/send_A01_t04: RuntimeError # co19-roll r706.  Please triage this failure.
 Language/12_Expressions/13_Spawning_an_Isolate_A01_t01: RuntimeError # co19-roll r667: Please triage this failure
 LibTest/isolate/Isolate/spawn_A01_t01: RuntimeError # co19-roll r667: Please triage this failure
 LibTest/isolate/Isolate/spawn_A01_t02: RuntimeError # co19-roll r667: Please triage this failure
 LibTest/isolate/Isolate/spawn_A01_t03: RuntimeError # co19-roll r667: Please triage this failure
 LibTest/isolate/Isolate/spawn_A01_t04: RuntimeError # co19-roll r667: Please triage this failure
 LibTest/isolate/Isolate/spawn_A01_t05: RuntimeError # co19-roll r667: Please triage this failure
-
 LibTest/async/Timer/Timer_A01_t01: RuntimeError, Pass # Issue 16475
-
 LayoutTests/fast/dom/HTMLAnchorElement/remove-href-from-focused-anchor_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-hash_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-host_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -264,11 +264,9 @@
 LibTest/html/Node/nodes_A01_t02: RuntimeError # co19-roll r722: Please triage this failure.
 LibTest/html/Node/parent_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LibTest/html/Node/previousNode_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/custom-elements/concepts/type_A03_t01: RuntimeError # Issue 19055.
+WebPlatformTest/custom-elements/concepts/type_A03_t01: RuntimeError # Please triage this failure.
 WebPlatformTest/custom-elements/concepts/type_A05_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/custom-elements/concepts/type_A06_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/Node-appendChild_t01: RuntimeError # Issue 21136
-WebPlatformTest/dom/ranges/Range-comparePoint_t02: RuntimeError # Issue 21136
 WebPlatformTest/html-templates/innerhtml-on-templates/innerhtml_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # co19-roll r722: 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 # co19-roll r722: Please triage this failure.
@@ -286,14 +284,12 @@
 WebPlatformTest/shadow-dom/events/event-retargeting/test-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/events/event-retargeting/test-002_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/events/event-retargeting/test-004_t01: RuntimeError # co19-roll r722: Please triage this failure.
-
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t01: RuntimeError, Skip # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t02: Skip # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t05: Skip # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t06: Skip # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-002_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-003_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
-
 WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-003_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-002_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -302,19 +298,6 @@
 WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-004_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-007_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-008_t01: RuntimeError # Issue 19055.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-009_t01: RuntimeError # Issue 19055.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-010_t01: RuntimeError # Issue 19055.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-011_t01: RuntimeError # Issue 19055.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-012_t01: RuntimeError # Issue 19055.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-013_t01: RuntimeError # Issue 19055.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-014_t01: RuntimeError # Issue 19055.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-015_t01: RuntimeError # Issue 19055.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-016_t01: RuntimeError # Issue 19055.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-018_t01: RuntimeError # Issue 19055.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-019_t01: RuntimeError # Issue 19055.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-020_t01: RuntimeError # Issue 19055.
 WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLDocument/active-element-gets-unforcusable_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: Skip # co19-roll r722: Please triage this failure.
@@ -335,7 +318,7 @@
 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.
-LayoutTests/fast/dom/Range/range-detached-exceptions_t01: RuntimeError # Issue 19055.
+LayoutTests/fast/dom/Range/range-detached-exceptions_t01: RuntimeError # Please triage this failure.
 LayoutTests/fast/html/imports/import-element-removed-flag_t01: Skip # co19-roll r722: Please triage this failure.
 LibTest/collection/ListBase/ListBase_class_A01_t01: Skip # co19-roll r722: Please triage this failure.
 LibTest/collection/ListMixin/ListMixin_class_A01_t01: Skip # co19-roll r722: Please triage this failure.
@@ -361,25 +344,25 @@
 WebPlatformTest/dom/nodes/Node-appendChild_t02: RuntimeError, Pass # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Node-insertBefore_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Node-isEqualNode_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/Node-nodeName_t01: RuntimeError # Issue 19055.
+WebPlatformTest/dom/nodes/Node-nodeName_t01: RuntimeError # Please triage this failure.
 WebPlatformTest/dom/nodes/Node-replaceChild_t01: RuntimeError # co19-roll r722: Please triage this failure
-WebPlatformTest/dom/nodes/Node-textContent_t01: RuntimeError # Issue 18931
+WebPlatformTest/dom/nodes/Node-textContent_t01: RuntimeError # Please triage this failure.
 WebPlatformTest/dom/nodes/attributes/setAttributeNS_A05_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/attributes/setAttributeNS_A06_t03: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t02: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t03: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/attributes/setAttributeNS_A08_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/attributes/setAttribute_A03_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-005_t01: RuntimeError # Issue 18931
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-006_t01: RuntimeError # Issue 18931
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t01: RuntimeError # Issue 18931
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t02: RuntimeError # Issue 18931
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t01: RuntimeError # Issue 18931
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t02: RuntimeError # Issue 18931
-WebPlatformTest/shadow-dom/events/event-dispatch/test-002_t01: RuntimeError # Issue 18931
-WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-001_t01: RuntimeError # Issue 18931
-WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-002_t01: RuntimeError # Issue 18931
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-009_t01: RuntimeError # Issue 18931
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-005_t01: RuntimeError # Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-006_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-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/events/event-dispatch/test-002_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/shadow-trees/upper-boundary-encapsulation/test-009_t01: RuntimeError # Please triage this failure.
 
 # co19-roll r738.
 WebPlatformTest/DOMEvents/approved/ProcessingInstruction.DOMCharacterDataModified_t01: Skip # Times out. co19-roll r738: Please triage this failure.
@@ -480,10 +463,6 @@
 LayoutTests/fast/canvas/webgl/null-object-behaviour_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/webgl/premultiplyalpha-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/webgl/renderbuffer-initialization_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgb565_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba4444_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba5551_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/webgl/triangle_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/webgl/uniform-location_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/winding-enumeration_t01: RuntimeError # co19-roll r761: Please triage this failure.
@@ -495,6 +474,7 @@
 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.
+LayoutTests/fast/css/deprecated-flexbox-auto-min-size_t01: Pass, RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/first-child-display-change-inverse_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/focus-display-block-inline_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/font-face-cache-bug_t01: RuntimeError # co19-roll r761: Please triage this failure.
@@ -704,7 +684,6 @@
 LayoutTests/fast/sub-pixel/replaced-element-baseline_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/sub-pixel/table-rows-have-stable-height_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/table/anonymous-table-section-removed_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/table/before-child-non-table-section-add-table-crash_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/table/caption-orthogonal-writing-mode-sizing_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/table/col-width-span-expand_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/table/computeLogicalWidth-table-needsSectionRecalc_t01: Pass, RuntimeError # co19-roll r786: Please triage this failure.
@@ -784,27 +763,154 @@
 LayoutTests/fast/xsl/default-html_t01: RuntimeError # co19-roll r786: Please triage this failure.
 WebPlatformTest/html/semantics/forms/the-input-element/password_t01: RuntimeError # co19-roll r786: Please triage this failure.
 WebPlatformTest/html/syntax/parsing/Document.getElementsByTagName-foreign_t02: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/dom/52776_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
-LayoutTests/fast/dom/DOMException/XPathException_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
-LayoutTests/fast/dom/Node/fragment-mutation_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
-LayoutTests/fast/dom/Range/bug-19527_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
-LayoutTests/fast/dom/Range/insertNode-empty-fragment-crash_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
-LayoutTests/fast/dom/Range/mutation_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
-LayoutTests/fast/dom/Range/range-constructor_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
-LayoutTests/fast/dom/Range/range-expand_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
-LayoutTests/fast/dom/Range/range-insertNode-separate-endContainer_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
-LayoutTests/fast/dom/Range/range-insertNode-splittext_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
-LayoutTests/fast/dom/document-importNode-arguments_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
-LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
-LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
-LayoutTests/fast/dom/text-api-arguments_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
-Language/14_Libraries_and_Scripts/3_Parts_A01_t05: Skip # Times out flakily. Issue 20881
+LayoutTests/fast/dom/52776_t01: RuntimeError # Please triage this failure.
+LayoutTests/fast/dom/DOMException/XPathException_t01: RuntimeError # Please triage this failure.
+LayoutTests/fast/dom/Node/fragment-mutation_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-constructor_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/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/horizontal-scrollbar-in-rtl_t01: RuntimeError # Please triage this failure.
+LayoutTests/fast/dom/text-api-arguments_t01: RuntimeError # Please triage this failure.
+
+# co19-roll r801
+LayoutTests/fast/canvas/webgl/canvas-test_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.
+LayoutTests/fast/filesystem/file-writer-abort-continue_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/filesystem/file-writer-abort-depth_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/filesystem/file-writer-events_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/filesystem/file-writer-gc-blob_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/filesystem/file-writer-write-overlapped_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/filesystem/read-directory-many_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/filesystem/simple-readonly_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/HTMLOptionElement_selected2_t01: Skip # Times out. co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/autofocus-focus-only-once_t01: Skip # Times out. co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/autofocus-input-css-style-change_t01: Skip # Times out. co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/autofocus-opera-007_t01: Skip # Times out. co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/autofocus-readonly-attribute_t01: Skip # Times out. co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/button-baseline-and-collapsing_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/button/button-disabled-blur_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/clone-input-with-dirty-value_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-change-layout-by-value_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-onblur-setvalue-onfocusremoved_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-change-layout-by-value_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/focus-style-pending_t01: Skip # Times out. co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/focus_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/formmethod-attribute-button-html_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/formmethod-attribute-input-html_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/input-appearance-elementFromPoint_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/input-hit-test-border_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/input-stepup-stepdown_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/input-width-height-attributes-without-renderer-loaded-image_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/listbox-select-all_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/listbox-selection-2_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/menulist-disabled-selected-option_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/menulist-selection-reset_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/menulist-submit-without-selection_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/multiple-selected-options-innerHTML_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/option-change-single-selected_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/option-strip-unicode-spaces_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/parser-associated-form-removal_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/plaintext-mode-1_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/search-popup-crasher_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/select-change-popup-to-listbox-in-event-handler_t01: Skip # Times out. co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/select-clientheight-large-size_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/select-clientheight-with-multiple-attr_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/select-list-box-mouse-focus_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/submit-nil-value-field-assert_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/textarea-paste-newline_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/textarea-scrollbar-height_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/textfield-focus-out_t01: Skip # Times out. co19-roll r801: Please triage this failure.
+LayoutTests/fast/html/select-dropdown-consistent-background-color_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/inline/boundingBox-with-continuation_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/inline/inline-position-top-align_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/inline/inline-with-empty-inline-children_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/inline/out-of-flow-objects-and-whitespace-after-empty-inline_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/inline/parent-inline-element-padding-contributes-width_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/inline/positioned-element-padding-contributes-width_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/layers/normal-flow-hit-test_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/layers/zindex-hit-test_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/loader/about-blank-hash-change_t01: Skip # Times out. co19-roll r801: Please triage this failure.
+LayoutTests/fast/loader/about-blank-hash-kept_t01: Skip # Times out. co19-roll r801: Please triage this failure.
+LayoutTests/fast/loader/hashchange-event-properties_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/loader/loadInProgress_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/loader/onhashchange-attribute-listeners_t01: Skip # Times out. co19-roll r801: Please triage this failure.
+LayoutTests/fast/loader/scroll-position-restored-on-back_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/loader/scroll-position-restored-on-reload-at-load-event_t01: Skip # Times out. co19-roll r801: Please triage this failure.
+LayoutTests/fast/loader/stateobjects/pushstate-updates-location_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/loader/stateobjects/replacestate-in-onunload_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/loader/stateobjects/replacestate-updates-location_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/masking/parsing-clip-path-shape_t01: RuntimeError # co19-roll r801: Please triage this failure.
+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.
+LayoutTests/fast/multicol/break-after-always-bottom-margin_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/break-properties_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/cssom-view_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/flipped-blocks-hit-test_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/float-truncation_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/hit-test-above-or-below_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/hit-test-end-of-column-with-line-height_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/hit-test-end-of-column_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/hit-test-float_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/hit-test-gap-between-pages_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/hit-test-gap-between-pages-flipped_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/newmulticol/balance-images_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/newmulticol/balance-maxheight_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/newmulticol/balance_t04: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/newmulticol/balance_t07: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/newmulticol/balance_t08: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/newmulticol/balance_t09: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/newmulticol/balance_t10: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/vertical-lr/float-truncation_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/vertical-rl/break-properties_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/vertical-rl/float-truncation_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/vertical-rl/image-inside-nested-blocks-with-border_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/widows_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/widows_t02: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/overflow/child-100percent-height-inside-fixed-container-with-overflow-auto_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/overflow/replaced-child-100percent-height-inside-fixed-container-with-overflow-auto_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/overflow/scroll-vertical-not-horizontal_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/overflow/scrollbar-restored_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/parser/foster-parent-adopted_t02: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/parser/fragment-parser-doctype_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/parser/innerhtml-with-prefixed-elements_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/parser/pre-first-line-break_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/replaced/container-width-zero_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-table-cell-ignore-height_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/replaced/preferred-widths_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/replaced/table-percent-height_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/replaced/table-percent-width_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/ruby/ruby-line-height_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/parsing/parsing-shape-lengths_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-big-box-border-radius_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-diamond-margin-polygon_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-left_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-right_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t02: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-left_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-right_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t02: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/table/nested-tables-with-div-offset_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
 
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid ) && $checked ]
-# New Dartium checked failures on new co19 browser tests in co19 revision 706.
-LayoutTests/fast/html/article-element_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LayoutTests/fast/html/aside-element_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LayoutTests/fast/innerHTML/innerHTML-svg-read_t01: RuntimeError, Pass # Issue 17758.  Please triage this failure.
+LayoutTests/fast/html/article-element_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+LayoutTests/fast/html/aside-element_t01: RuntimeError # co19-roll r706.  Please triage this failure.
+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.
@@ -823,8 +929,10 @@
 LayoutTests/fast/dom/shadow/shadowhost-keyframes_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
 
 # co19-roll r761
+LayoutTests/fast/canvas/webgl/framebuffer-object-attachment_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/oes-vertex-array-object_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/read-pixels-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/box-sizing-border-box-dynamic-padding-border-update_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/css/deprecated-flexbox-auto-min-size_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/display-inline-block-scrollbar_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/fixed-width-intrinsic-width-excludes-scrollbars_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/xpath/xpath-result-eventlistener-crash_t01: RuntimeError # co19-roll r761: Please triage this failure.
@@ -867,8 +975,26 @@
 LayoutTests/fast/url/trivial_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-bad-mimetype_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-invalid-values_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: RuntimeError # Reenable fast/dom tests: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: RuntimeError # Reenable fast/dom tests: 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.
+
+# co19 roll r801
+LayoutTests/fast/flexbox/flexing-overflow-scroll-item_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/flexbox/intrinsic-min-width-applies-with-fixed-width_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/forms/select-list-box-mouse-focus_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/inline/empty-inline-before-collapsed-space_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/lists/list-style-position-inside_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/lists/marker-preferred-margins_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/fixed-column-percent-logical-height-orthogonal-writing-mode_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/multicol/vertical-lr/image-inside-nested-blocks-with-border_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/replaced/available-height-for-content_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/replaced/computed-image-width-with-percent-height-and-fixed-ancestor_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/replaced/computed-image-width-with-percent-height-and-fixed-ancestor-vertical-lr_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/replaced/computed-image-width-with-percent-height-inside-table-cell-and-fixed-ancestor_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/replaced/computed-image-width-with-percent-height-inside-table-cell-and-fixed-ancestor-vertical-lr_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/parsing/parsing-shape-image-threshold_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/parsing/parsing-shape-margin_t01: RuntimeError # co19-roll r801: Please triage this failure.
+LayoutTests/fast/shapes/parsing/parsing-shape-outside_t01: RuntimeError # co19-roll r801: Please triage this failure.
 
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) && $mode == debug ]
 WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: Skip # Issue 19495.
@@ -883,7 +1009,7 @@
 LayoutTests/fast/canvas/canvas-composite-text-alpha_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/canvas-scale-drawImage-shadow_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/canvas-scale-fillPath-shadow_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/canvas-scale-fillRect-shadow_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/canvas-scale-fillRect-shadow_t01: Skip # Times out. co19-roll r761: Please triage this failure.
 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.
@@ -895,107 +1021,129 @@
 LayoutTests/fast/css-generated-content/hit-test-generated-content_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/css-intrinsic-dimensions/css-tables_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/css-intrinsic-dimensions/tables_t01: RuntimeError # co19-roll r786: Please triage this failure.
+LayoutTests/fast/filesystem/file-writer-abort-continue_t01: Skip # Times out. co19-roll r786: Please triage this failure.
 LayoutTests/fast/text/international/listbox-width-rtl_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/text-autosizing/text-removal_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/transforms/scrollIntoView-transformed_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: Pass, RuntimeError # Reenable fast/dom tests: Please triage this failure.
-LayoutTests/fast/dom/partial-layout-non-overlay-scrollbars_t01: Pass, RuntimeError # Reenable fast/dom tests: Please triage this failure.
-LayoutTests/fast/dom/shadow/shadowdom-for-input-type-change_t01: RuntimeError # Reenable fast/dom tests: Please triage this failure.
-LayoutTests/fast/dom/jsDevicePixelRatio_t01: RuntimeError # Reenable fast/dom tests: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/prefetch-beforeload_t01: Pass, RuntimeError # Reenable fast/dom tests: Please triage this failure.
+LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: Pass, RuntimeError # Please triage this failure.
+LayoutTests/fast/dom/partial-layout-non-overlay-scrollbars_t01: Pass, RuntimeError # Please triage this failure.
+LayoutTests/fast/dom/shadow/shadowdom-for-input-type-change_t01: RuntimeError # Please triage this failure.
+LayoutTests/fast/dom/jsDevicePixelRatio_t01: RuntimeError # Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/prefetch-beforeload_t01: Pass, RuntimeError # Please triage this failure.
+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/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 && ($mode != debug || $system != macos) ]
-LayoutTests/fast/canvas/webgl/WebGLContextEvent_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/array-bounds-clamping_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/attrib-location-length-limits_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/buffer-bind-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/buffer-data-array-buffer_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/canvas-2d-webgl-texture_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/canvas-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/canvas-zero-size_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/compressed-tex-image_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/context-destroyed-crash_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/context-lost-restored_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/css-webkit-canvas-repaint_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/css-webkit-canvas_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/draw-arrays-out-of-bounds_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/error-reporting_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/framebuffer-bindings-unaffected-on-resize_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/framebuffer-object-attachment_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/framebuffer-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/functions-returning-strings_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/get-active-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/gl-bind-attrib-location-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/gl-enable-enum-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/gl-enum-tests_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/gl-get-calls_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/gl-getshadersource_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/gl-getstring_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/gl-pixelstorei_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/gl-teximage_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/gl-uniformmatrix4fv_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/gl-vertex-attrib-zero-issues_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/gl-vertex-attrib_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/gl-vertexattribpointer_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/glsl-conformance_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/index-validation-copies-indices_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/index-validation-crash-with-buffer-sub-data_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/index-validation-verifies-too-many-indices_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/index-validation-with-resized-buffer_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/index-validation_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/invalid-UTF-16_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/invalid-passed-params_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/null-uniform-location_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/object-deletion-behaviour_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/oes-element-index-uint_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/oes-vertex-array-object_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/point-size_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/program-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/read-pixels-pack-alignment_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/read-pixels-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/renderer-and-vendor-strings_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/shader-precision-format_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgb565_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba4444_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba5551_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgb565_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba4444_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba5551_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgb565_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba4444_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba5551_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-image-and-uniform-binding-bugs_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-image-webgl_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-input-validation_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-sub-image-2d-bad-args_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-sub-image-2d_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/tex-sub-image-cube-maps_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/texImage2DImageDataTest_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/texImageTest_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/texture-active-bind_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/texture-bindings-uneffected-on-resize_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/texture-color-profile_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/texture-complete_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/texture-npot_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/texture-transparent-pixels-initialized_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/uniform-location-length-limits_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/uninitialized-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/viewport-unchanged-upon-resize_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/webgl-composite-modes-repaint_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/webgl-composite-modes_t01: RuntimeError # co19-roll r761: Please triage this failure.
+[ $compiler == none && $runtime == dartium ]
 LayoutTests/fast/canvas/webgl/webgl-depth-texture_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/webgl-exceptions_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/webgl-large-texture_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/webgl-layer-update_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/webgl-specific_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/webgl-texture-binding-preserved_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/webgl-unprefixed-context-id_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/webgl/webgl-viewport-parameters-preserved_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/WebGLContextEvent_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/array-bounds-clamping_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/attrib-location-length-limits_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/buffer-bind-test_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/buffer-data-array-buffer_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/canvas-2d-webgl-texture_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/canvas-test_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/canvas-zero-size_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/compressed-tex-image_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/context-destroyed-crash_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/context-lost-restored_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/css-webkit-canvas-repaint_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/css-webkit-canvas_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/draw-arrays-out-of-bounds_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/error-reporting_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/framebuffer-bindings-unaffected-on-resize_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/framebuffer-object-attachment_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/framebuffer-test_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/functions-returning-strings_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/get-active-test_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/gl-bind-attrib-location-test_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/gl-enable-enum-test_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/gl-enum-tests_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/gl-get-calls_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/gl-getshadersource_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/gl-getstring_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/gl-pixelstorei_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/gl-teximage_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/gl-uniformmatrix4fv_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/gl-vertex-attrib-zero-issues_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/gl-vertex-attrib_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/gl-vertexattribpointer_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/glsl-conformance_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/index-validation-copies-indices_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/index-validation-crash-with-buffer-sub-data_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/index-validation-verifies-too-many-indices_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/index-validation-with-resized-buffer_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/index-validation_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/invalid-UTF-16_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/invalid-passed-params_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/null-uniform-location_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/object-deletion-behaviour_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/oes-element-index-uint_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/oes-vertex-array-object_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/point-size_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/program-test_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/read-pixels-pack-alignment_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/read-pixels-test_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/renderer-and-vendor-strings_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/shader-precision-format_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgb565_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba4444_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba5551_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgb565_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba4444_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba5551_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgb565_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba4444_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba5551_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/tex-image-and-uniform-binding-bugs_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/tex-image-webgl_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/tex-input-validation_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/tex-sub-image-2d-bad-args_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/tex-sub-image-2d_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/tex-sub-image-cube-maps_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/texImage2DImageDataTest_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/texImageTest_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/texture-active-bind_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/texture-bindings-uneffected-on-resize_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/texture-color-profile_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/texture-complete_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/texture-npot_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/texture-transparent-pixels-initialized_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/uniform-location-length-limits_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/uninitialized-test_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/viewport-unchanged-upon-resize_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/webgl-composite-modes-repaint_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/webgl-composite-modes_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/webgl-exceptions_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/webgl-large-texture_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/webgl-layer-update_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/webgl-specific_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/webgl-texture-binding-preserved_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/webgl-unprefixed-context-id_t01: RuntimeError # Issue 22026
+LayoutTests/fast/canvas/webgl/webgl-viewport-parameters-preserved_t01: RuntimeError # Issue 22026
 
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) && $system != windows ]
 LayoutTests/fast/css/font-face-unicode-range-monospace_t01: RuntimeError # co19-roll r761: Please triage this failure.
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 32b96fa..62a078c 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -25,10 +25,6 @@
 Language/13_Statements/15_Assert_A04_t02: skip # co19 issue 734
 Language/13_Statements/15_Assert_A04_t05: skip # co19 issue 734
 
-# re-enable next 3 tests when co19 revision synched to r793
-Language/12_Expressions/20_Logical_Boolean_Expressions_A03_t01: skip  # until >= r793
-Language/12_Expressions/27_Unary_Expressions_A02_t03: skip  # until >= r793
-Language/13_Statements/06_For/1_For_Loop_A01_t08: skip  # until >= r793
 
 LibTest/core/DateTime/parse_A03_t01: fail # Issue 12514
 
@@ -48,7 +44,8 @@
 [ $compiler == none && $runtime == vm ]
 LibTest/typed_data/Float32x4/reciprocalSqrt_A01_t01: Pass, Fail # co19 issue 599
 LibTest/typed_data/Float32x4/reciprocal_A01_t01: Pass, Fail # co19 issue 599
-
+Language/12_Expressions/12_Instance_Creation/2_Const_A11_t01: MissingCompileTimeError # Issue 22007
+Language/12_Expressions/12_Instance_Creation/2_Const_A11_t03: MissingCompileTimeError # Issue 22007
 # With asynchronous loading, the load errors in these tests are no longer recognized as compile errors:
 Language/14_Libraries_and_Scripts/1_Imports_A04_t02: Fail
 Language/14_Libraries_and_Scripts/2_Exports_A05_t02: Fail
diff --git a/tests/compiler/dart2js/backend_dart/dart_printer_test.dart b/tests/compiler/dart2js/backend_dart/dart_printer_test.dart
index dc6219f..4c51201 100644
--- a/tests/compiler/dart2js/backend_dart/dart_printer_test.dart
+++ b/tests/compiler/dart2js/backend_dart/dart_printer_test.dart
@@ -8,7 +8,7 @@
 import 'package:compiler/src/constants/values.dart';
 import 'package:compiler/src/dart_backend/backend_ast_nodes.dart';
 import 'package:compiler/src/scanner/scannerlib.dart';
-import 'package:compiler/src/source_file.dart';
+import 'package:compiler/src/io/source_file.dart';
 import 'package:compiler/src/dart2jslib.dart';
 import 'package:compiler/src/tree/tree.dart' show DartString;
 import 'dart:mirrors';
diff --git a/tests/compiler/dart2js/deferred_emit_type_checks_test.dart b/tests/compiler/dart2js/deferred_emit_type_checks_test.dart
index e236c69..f4f8295 100644
--- a/tests/compiler/dart2js/deferred_emit_type_checks_test.dart
+++ b/tests/compiler/dart2js/deferred_emit_type_checks_test.dart
@@ -6,21 +6,9 @@
 // Files when using deferred loading.
 
 import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
+import 'package:async_helper/async_helper.dart';
 import 'memory_source_file_helper.dart';
-import "dart:async";
-
-import 'package:compiler/src/dart2jslib.dart'
-       as dart2js;
-
-class MemoryOutputSink<T> extends EventSink<T> {
-  List<T> mem = new List<T>();
-  void add(T event) {
-    mem.add(event);
-  }
-  void addError(T event, [StackTrace stackTrace]) {}
-  void close() {}
-}
+import 'output_collector.dart';
 
 void main() {
   Uri script = currentDirectory.resolveUri(Platform.script);
@@ -30,30 +18,22 @@
   var provider = new MemorySourceFileProvider(MEMORY_SOURCE_FILES);
   var handler = new FormattingDiagnosticHandler(provider);
 
-  Map<String, MemoryOutputSink> outputs = new Map<String, MemoryOutputSink>();
-
-  MemoryOutputSink outputSaver(name, extension) {
-    if (name == '') {
-      name = 'main';
-      extension ='js';
-    }
-    return outputs.putIfAbsent("$name.$extension", () {
-     return new MemoryOutputSink();
-    });
-  }
+  OutputCollector collector = new OutputCollector();
 
   Compiler compiler = new Compiler(provider.readStringFromUri,
-                                   outputSaver,
+      collector,
                                    handler.diagnosticHandler,
                                    libraryRoot,
                                    packageRoot,
                                    [],
                                    {});
   asyncTest(() => compiler.run(Uri.parse('memory:main.dart')).then((_) {
-    String mainOutput = outputs['main.js'].mem[0];
-    String deferredOutput = outputs['out_1.part.js'].mem[0];
+    String mainOutput = collector.getOutput('', 'js');
+    String deferredOutput =  collector.getOutput('out_1', 'part.js');
     String isPrefix = compiler.backend.namer.operatorIsPrefix;
-    Expect.isTrue(deferredOutput.contains('${isPrefix}A: true'));
+    Expect.isTrue(deferredOutput.contains('${isPrefix}A: true'),
+        "Deferred output doesn't contain '${isPrefix}A: true':\n"
+        "$deferredOutput");
     Expect.isFalse(mainOutput.contains('${isPrefix}A: true'));
   }));
 }
diff --git a/tests/compiler/dart2js/deferred_load_mapping_test.dart b/tests/compiler/dart2js/deferred_load_mapping_test.dart
new file mode 100644
index 0000000..6877f4f
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_load_mapping_test.dart
@@ -0,0 +1,102 @@
+// 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';
+import "package:async_helper/async_helper.dart";
+import 'memory_source_file_helper.dart';
+import "memory_compiler.dart";
+
+void main() {
+  var collector = new OutputCollector();
+  Compiler compiler = compilerFor(MEMORY_SOURCE_FILES,
+                                  options: ['--deferred-map=deferred_map.json'],
+                                  outputProvider: collector);
+  asyncTest(() {
+    return compiler.run(Uri.parse('memory:main.dart')).then((success) {
+      // Ensure a mapping file is output.
+      Expect.isNotNull(
+          collector.getOutput("deferred_map.json", "deferred_map"));
+
+      Map mapping = compiler.deferredLoadTask.computeDeferredMap();
+      // Test structure of mapping.
+      Expect.equals("<unnamed>", mapping["main.dart"]["name"]);
+      Expect.equals(2, mapping["main.dart"]["imports"]["lib1"].length);
+      Expect.equals(2, mapping["main.dart"]["imports"]["lib2"].length);
+      Expect.equals(1, mapping["main.dart"]["imports"]["convert"].length);
+      Expect.equals("lib1", mapping["memory:lib1.dart"]["name"]);
+      Expect.equals(1, mapping["memory:lib1.dart"]["imports"]["lib4_1"].length);
+      Expect.equals(1, mapping["memory:lib2.dart"]["imports"]["lib4_2"].length);
+    });
+  });
+}
+
+const Map MEMORY_SOURCE_FILES = const {
+  "main.dart":"""
+import 'dart:convert' deferred as convert;
+import 'lib1.dart' deferred as lib1;
+import 'lib2.dart' deferred as lib2;
+
+void main() {
+  lib1.loadLibrary().then((_) {
+        lib1.foo1();
+        new lib1.C();
+    lib2.loadLibrary().then((_) {
+        lib2.foo2();
+    });
+  });
+  convert.loadLibrary().then((_) {
+    new convert.JsonCodec();
+  });
+}
+""",
+  "lib1.dart":"""
+library lib1;
+import "dart:async";
+import "dart:html";
+
+import "lib3.dart" as l3;
+import "lib4.dart" deferred as lib4_1;
+
+class C {}
+
+foo1() {
+  new InputElement();
+  lib4_1.loadLibrary().then((_) {
+    lib4_1.bar1();
+  });
+  return () {return 1 + l3.foo3();} ();
+}
+""",
+  "lib2.dart":"""
+library lib2;
+import "dart:async";
+import "lib3.dart" as l3;
+import "lib4.dart" deferred as lib4_2;
+
+foo2() {
+  lib4_2.loadLibrary().then((_) {
+    lib4_2.bar2();
+  });
+  return () {return 2+l3.foo3();} ();
+}
+""",
+  "lib3.dart":"""
+library lib3;
+
+foo3() {
+  return () {return 3;} ();
+}
+""",
+  "lib4.dart":"""
+library lib4;
+
+bar1() {
+  return "hello";
+}
+
+bar2() {
+  return 2;
+}
+""",
+};
diff --git a/tests/compiler/dart2js/exit_code_test.dart b/tests/compiler/dart2js/exit_code_test.dart
index 9b31127..3bf7efe 100644
--- a/tests/compiler/dart2js/exit_code_test.dart
+++ b/tests/compiler/dart2js/exit_code_test.dart
@@ -1,266 +1,267 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file

-// for details. All rights reserved. Use of this source code is governed by a

-// BSD-style license that can be found in the LICENSE file.

-

-// Test the exit code of dart2js in case of exceptions, fatal errors, errors,

-// warnings, etc.

-

-

-import 'dart:async';

-import 'dart:io' show Platform;

-

-import 'package:async_helper/async_helper.dart';

-import 'package:expect/expect.dart';

-

-import 'package:compiler/compiler.dart' as api;

-import 'package:compiler/src/dart2js.dart' as entry;

-import 'package:compiler/src/dart2jslib.dart';

-import 'package:compiler/src/apiimpl.dart' as apiimpl;

-import 'package:compiler/src/elements/elements.dart';

-import 'package:compiler/src/library_loader.dart';

-import 'package:compiler/src/resolution/resolution.dart';

-import 'package:compiler/src/scanner/scannerlib.dart';

-import 'package:compiler/src/util/util.dart';

-

-class TestCompiler extends apiimpl.Compiler {

-  final String testMarker;

-  final String testType;

-  final Function onTest;

-

-  TestCompiler(api.CompilerInputProvider inputProvider,

-                api.CompilerOutputProvider outputProvider,

-                api.DiagnosticHandler handler,

-                Uri libraryRoot,

-                Uri packageRoot,

-                List<String> options,

-                Map<String, dynamic> environment,

-                String this.testMarker,

-                String this.testType,

-                Function this.onTest)

-      : super(inputProvider, outputProvider, handler, libraryRoot,

-              packageRoot, options, environment) {

-    scanner = new TestScanner(this);

-    resolver = new TestResolver(this, backend.constantCompilerTask);

-    test('Compiler');

-  }

-

-  Future<bool> run(Uri uri) {

-    test('Compiler.run');

-    return super.run(uri);

-  }

-

-  Future onLibraryScanned(LibraryElement element, LibraryLoader loader) {

-    test('Compiler.onLibraryScanned');

-    return super.onLibraryScanned(element, loader);

-  }

-

-  Future onLibrariesLoaded(LoadedLibraries loadedLibraries) {

-    test('Compiler.onLibrariesLoaded');

-    return super.onLibrariesLoaded(loadedLibraries);

-  }

-

-  void analyzeElement(Element element) {

-    test('Compiler.analyzeElement');

-    super.analyzeElement(element);

-  }

-

-  void codegen(CodegenWorkItem work, CodegenEnqueuer world) {

-    test('Compiler.codegen');

-    super.codegen(work, world);

-  }

-

-  withCurrentElement(Element element, f()) {

-    return super.withCurrentElement(element, () {

-      test('Compiler.withCurrentElement');

-      return f();

-    });

-  }

-

-  test(String marker) {

-    if (marker == testMarker) {

-      switch (testType) {

-      case 'assert':

-        onTest(testMarker, testType);

-        assert(false);

-        break;

-      case 'invariant':

-        onTest(testMarker, testType);

-        invariant(NO_LOCATION_SPANNABLE, false, message: marker);

-        break;

-      case 'warning':

-        onTest(testMarker, testType);

-        reportWarning(NO_LOCATION_SPANNABLE,

-                      MessageKind.GENERIC, {'text': marker});

-        break;

-      case 'error':

-        onTest(testMarker, testType);

-        reportError(NO_LOCATION_SPANNABLE,

-                    MessageKind.GENERIC, {'text': marker});

-        break;

-      case 'fatalError':

-        onTest(testMarker, testType);

-        reportFatalError(NO_LOCATION_SPANNABLE,

-                         MessageKind.GENERIC, {'text': marker});

-        break;

-      case 'internalError':

-        onTest(testMarker, testType);

-        internalError(NO_LOCATION_SPANNABLE, marker);

-        break;

-      case 'NoSuchMethodError':

-        onTest(testMarker, testType);

-        null.foo;

-        break;

-      case '':

-        onTest(testMarker, testType);

-        break;

-      }

-    }

-  }

-}

-

-class TestScanner extends ScannerTask {

-  TestScanner(TestCompiler compiler) : super(compiler);

-

-  TestCompiler get compiler => super.compiler;

-

-  void scanElements(CompilationUnitElement compilationUnit) {

-    compiler.test('ScannerTask.scanElements');

-    super.scanElements(compilationUnit);

-  }

-}

-

-class TestResolver extends ResolverTask {

-  TestResolver(TestCompiler compiler, ConstantCompiler constantCompiler)

-      : super(compiler, constantCompiler);

-

-  TestCompiler get compiler => super.compiler;

-

-  void computeClassMembers(ClassElement element) {

-    compiler.test('ResolverTask.computeClassMembers');

-    super.computeClassMembers(element);

-  }

-}

-

-int checkedResults = 0;

-

-Future testExitCode(String marker, String type, int expectedExitCode) {

-  bool testOccurred = false;

-

-  void onTest(String testMarker, String testType) {

-    if (testMarker == marker && testType == type) {

-      testOccurred = true;

-    }

-  }

-  return new Future(() {

-    Future<api.CompilationResult> compile(

-        Uri script,

-        Uri libraryRoot,

-        Uri packageRoot,

-        api.CompilerInputProvider inputProvider,

-        api.DiagnosticHandler handler,

-        [List<String> options = const [],

-         api.CompilerOutputProvider outputProvider,

-         Map<String, dynamic> environment = const {}]) {

-      libraryRoot = Platform.script.resolve('../../../sdk/');

-      outputProvider = NullSink.outputProvider;

-      // Use this to silence the test when debugging:

-      // handler = (uri, begin, end, message, kind) {};

-      Compiler compiler = new TestCompiler(inputProvider,

-                                           outputProvider,

-                                           handler,

-                                           libraryRoot,

-                                           packageRoot,

-                                           options,

-                                           environment,

-                                           marker,

-                                           type,

-                                           onTest);

-      return compiler.run(script).then((bool success) {

-        return new api.CompilationResult(compiler, isSuccess: success);

-      });

-    }

-

-    int foundExitCode;

-

-    checkResult() {

-      Expect.isTrue(testOccurred, 'testExitCode($marker, $type) did not occur');

-      if (foundExitCode == null) foundExitCode = 0;

-      print('testExitCode($marker, $type) '

-            'exitCode=$foundExitCode expected=$expectedExitCode');

-      Expect.equals(expectedExitCode, foundExitCode,

-          'testExitCode($marker, $type) '

-          'exitCode=$foundExitCode expected=${expectedExitCode}');

-      checkedResults++;

-    }

-

-    void exit(exitCode) {

-      if (foundExitCode == null) {

-        foundExitCode = exitCode;

-      }

-    };

-

-    entry.exitFunc = exit;

-    entry.compileFunc = compile;

-

-    Future result = entry.internalMain(

-        ["tests/compiler/dart2js/exit_code_helper.dart"]);

-    return result.catchError((e, s) {

-      // Capture crashes.

-    }).whenComplete(checkResult);

-  });

-}

-

-Future testExitCodes(String marker, Map<String,int> expectedExitCodes) {

-  return Future.forEach(expectedExitCodes.keys, (String type) {

-    return testExitCode(marker, type, expectedExitCodes[type]);

-  });

-}

-

-void main() {

-  bool isCheckedMode = false;

-  assert((isCheckedMode = true));

-

-  final beforeRun = {

-    '': 0,

-    'NoSuchMethodError': 253,

-    'assert': isCheckedMode ? 253 : 0,

-    'invariant': 253

-  };

-

-  final duringRun = {

-    '': 0,

-    'NoSuchMethodError': 253,

-    'assert': isCheckedMode ? 253 : 0,

-    'invariant': 253,

-    'warning': 0,

-    'error': 1,

-    'fatalError': 1,

-    'internalError': 253,

-  };

-

-  final tests = {

-    'Compiler': beforeRun,

-    'Compiler.run': beforeRun,

-    'Compiler.onLibraryScanned': beforeRun,

-    'Compiler.onLibrariesLoaded': beforeRun,

-    'ScannerTask.scanElements': duringRun,

-    'Compiler.withCurrentElement': duringRun,

-    'Compiler.analyzeElement': duringRun,

-    'Compiler.codegen': duringRun,

-    'ResolverTask.computeClassMembers': duringRun,

-  };

-

-  asyncStart();

-  Future.forEach(tests.keys, (marker) {

-    return testExitCodes(marker, tests[marker]);

-  }).then((_) {

-    int countResults(Map runType) {

-      return runType.length *

-             tests.values.where((r) => r == runType).length;

-    }

-

-    Expect.equals(countResults(beforeRun) + countResults(duringRun),

-                  checkedResults);

-    asyncEnd();

-  });

-}

+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test the exit code of dart2js in case of exceptions, fatal errors, errors,
+// warnings, etc.
+
+
+import 'dart:async';
+import 'dart:io' show Platform;
+
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+import 'package:compiler/compiler.dart' as api;
+import 'package:compiler/src/dart2js.dart' as entry;
+import 'package:compiler/src/dart2jslib.dart';
+import 'package:compiler/src/apiimpl.dart' as apiimpl;
+import 'package:compiler/src/elements/elements.dart';
+import 'package:compiler/src/library_loader.dart';
+import 'package:compiler/src/resolution/resolution.dart';
+import 'package:compiler/src/scanner/scannerlib.dart';
+import 'package:compiler/src/util/util.dart';
+
+class TestCompiler extends apiimpl.Compiler {
+  final String testMarker;
+  final String testType;
+  final Function onTest;
+
+  TestCompiler(api.CompilerInputProvider inputProvider,
+                api.CompilerOutputProvider outputProvider,
+                api.DiagnosticHandler handler,
+                Uri libraryRoot,
+                Uri packageRoot,
+                List<String> options,
+                Map<String, dynamic> environment,
+                String this.testMarker,
+                String this.testType,
+                Function this.onTest)
+      : super(inputProvider, outputProvider, handler, libraryRoot,
+              packageRoot, options, environment) {
+    scanner = new TestScanner(this);
+    resolver = new TestResolver(this, backend.constantCompilerTask);
+    test('Compiler');
+  }
+
+  Future<bool> run(Uri uri) {
+    test('Compiler.run');
+    return super.run(uri);
+  }
+
+  Future onLibraryScanned(LibraryElement element, LibraryLoader loader) {
+    test('Compiler.onLibraryScanned');
+    return super.onLibraryScanned(element, loader);
+  }
+
+  Future onLibrariesLoaded(LoadedLibraries loadedLibraries) {
+    test('Compiler.onLibrariesLoaded');
+    return super.onLibrariesLoaded(loadedLibraries);
+  }
+
+  void analyzeElement(Element element) {
+    test('Compiler.analyzeElement');
+    super.analyzeElement(element);
+  }
+
+  void codegen(CodegenWorkItem work, CodegenEnqueuer world) {
+    test('Compiler.codegen');
+    super.codegen(work, world);
+  }
+
+  withCurrentElement(Element element, f()) {
+    return super.withCurrentElement(element, () {
+      test('Compiler.withCurrentElement');
+      return f();
+    });
+  }
+
+  test(String marker) {
+    if (marker == testMarker) {
+      switch (testType) {
+      case 'assert':
+        onTest(testMarker, testType);
+        assert(false);
+        break;
+      case 'invariant':
+        onTest(testMarker, testType);
+        invariant(NO_LOCATION_SPANNABLE, false, message: marker);
+        break;
+      case 'warning':
+        onTest(testMarker, testType);
+        reportWarning(NO_LOCATION_SPANNABLE,
+                      MessageKind.GENERIC, {'text': marker});
+        break;
+      case 'error':
+        onTest(testMarker, testType);
+        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);
+        break;
+      case 'NoSuchMethodError':
+        onTest(testMarker, testType);
+        null.foo;
+        break;
+      case '':
+        onTest(testMarker, testType);
+        break;
+      }
+    }
+  }
+}
+
+class TestScanner extends ScannerTask {
+  TestScanner(TestCompiler compiler) : super(compiler);
+
+  TestCompiler get compiler => super.compiler;
+
+  void scanElements(CompilationUnitElement compilationUnit) {
+    compiler.test('ScannerTask.scanElements');
+    super.scanElements(compilationUnit);
+  }
+}
+
+class TestResolver extends ResolverTask {
+  TestResolver(TestCompiler compiler, ConstantCompiler constantCompiler)
+      : super(compiler, constantCompiler);
+
+  TestCompiler get compiler => super.compiler;
+
+  void computeClassMembers(ClassElement element) {
+    compiler.test('ResolverTask.computeClassMembers');
+    super.computeClassMembers(element);
+  }
+}
+
+int checkedResults = 0;
+
+Future testExitCode(String marker, String type, int expectedExitCode) {
+  bool testOccurred = false;
+
+  void onTest(String testMarker, String testType) {
+    if (testMarker == marker && testType == type) {
+      testOccurred = true;
+    }
+  }
+  return new Future(() {
+    Future<api.CompilationResult> compile(
+        Uri script,
+        Uri libraryRoot,
+        Uri packageRoot,
+        api.CompilerInputProvider inputProvider,
+        api.DiagnosticHandler handler,
+        [List<String> options = const [],
+         api.CompilerOutputProvider outputProvider,
+         Map<String, dynamic> environment = const {}]) {
+      libraryRoot = Platform.script.resolve('../../../sdk/');
+      outputProvider = NullSink.outputProvider;
+      // Use this to silence the test when debugging:
+      // handler = (uri, begin, end, message, kind) {};
+      Compiler compiler = new TestCompiler(inputProvider,
+                                           outputProvider,
+                                           handler,
+                                           libraryRoot,
+                                           packageRoot,
+                                           options,
+                                           environment,
+                                           marker,
+                                           type,
+                                           onTest);
+      return compiler.run(script).then((bool success) {
+        return new api.CompilationResult(compiler, isSuccess: success);
+      });
+    }
+
+    int foundExitCode;
+
+    checkResult() {
+      Expect.isTrue(testOccurred, 'testExitCode($marker, $type) did not occur');
+      if (foundExitCode == null) foundExitCode = 0;
+      print('testExitCode($marker, $type) '
+            'exitCode=$foundExitCode expected=$expectedExitCode');
+      Expect.equals(expectedExitCode, foundExitCode,
+          'testExitCode($marker, $type) '
+          'exitCode=$foundExitCode expected=${expectedExitCode}');
+      checkedResults++;
+    }
+
+    void exit(exitCode) {
+      if (foundExitCode == null) {
+        foundExitCode = exitCode;
+      }
+    };
+
+    entry.exitFunc = exit;
+    entry.compileFunc = compile;
+
+    Future result = entry.internalMain(
+        ["tests/compiler/dart2js/exit_code_helper.dart"]);
+    return result.catchError((e, s) {
+      // Capture crashes.
+    }).whenComplete(checkResult);
+  });
+}
+
+Future testExitCodes(String marker, Map<String,int> expectedExitCodes) {
+  return Future.forEach(expectedExitCodes.keys, (String type) {
+    return testExitCode(marker, type, expectedExitCodes[type]);
+  });
+}
+
+void main() {
+  bool isCheckedMode = false;
+  assert((isCheckedMode = true));
+
+  final beforeRun = {
+    '': 0,
+    'NoSuchMethodError': 253,
+    'assert': isCheckedMode ? 253 : 0,
+    'invariant': 253
+  };
+
+  final duringRun = {
+    '': 0,
+    'NoSuchMethodError': 253,
+    'assert': isCheckedMode ? 253 : 0,
+    'invariant': 253,
+    'warning': 0,
+    'error': 1,
+    'fatalError': 1,
+    'internalError': 253,
+  };
+
+  final tests = {
+    'Compiler': beforeRun,
+    'Compiler.run': beforeRun,
+    'Compiler.onLibraryScanned': beforeRun,
+    'Compiler.onLibrariesLoaded': beforeRun,
+    'ScannerTask.scanElements': duringRun,
+    'Compiler.withCurrentElement': duringRun,
+    'Compiler.analyzeElement': duringRun,
+    'Compiler.codegen': duringRun,
+    'ResolverTask.computeClassMembers': duringRun,
+  };
+
+  asyncStart();
+  Future.forEach(tests.keys, (marker) {
+    return testExitCodes(marker, tests[marker]);
+  }).then((_) {
+    int countResults(Map runType) {
+      return runType.length *
+             tests.values.where((r) => r == runType).length;
+    }
+
+    Expect.equals(countResults(beforeRun) + countResults(duringRun),
+                  checkedResults);
+    asyncEnd();
+  });
+}
diff --git a/tests/compiler/dart2js/forloop_box_test.dart b/tests/compiler/dart2js/forloop_box_test.dart
new file mode 100644
index 0000000..25873c0
--- /dev/null
+++ b/tests/compiler/dart2js/forloop_box_test.dart
@@ -0,0 +1,39 @@
+// 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";
+import "package:async_helper/async_helper.dart";
+import 'compiler_helper.dart';
+
+String TEST = r'''
+main() {
+  var a;
+  for (var i=0; i<10; i++) {
+    a = () => i;
+  }
+  print(a());
+}
+''';
+
+String NEGATIVE_TEST = r'''
+run(f) => f();
+main() {
+  var a;
+  for (var i=0; i<10; run(() => i++)) {
+    a = () => i;
+  }
+  print(a());
+}
+''';
+
+main() {
+  asyncTest(() => compileAll(TEST).then((generated) {
+    Expect.isTrue(generated.contains('main_closure(i)'),
+        'for-loop variable was boxed');
+  }));
+  asyncTest(() => compileAll(NEGATIVE_TEST).then((generated) {
+    Expect.isFalse(generated.contains('main_closure(i)'),
+        'for-loop variable was not boxed');
+  }));
+}
diff --git a/tests/compiler/dart2js/js_backend_cps_ir_test.dart b/tests/compiler/dart2js/js_backend_cps_ir.dart
similarity index 78%
rename from tests/compiler/dart2js/js_backend_cps_ir_test.dart
rename to tests/compiler/dart2js/js_backend_cps_ir.dart
index ab7f761..34ccdfe 100644
--- a/tests/compiler/dart2js/js_backend_cps_ir_test.dart
+++ b/tests/compiler/dart2js/js_backend_cps_ir.dart
@@ -1,7 +1,6 @@
 // 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
 
 // Test that the CPS IR code generator compiles programs and produces the
 // the expected output.
@@ -14,21 +13,8 @@
 import 'package:compiler/src/js/js.dart' as js;
 import 'package:compiler/src/common.dart' show Element;
 
-import 'js_backend_cps_ir_basic.dart' as basic;
-import 'js_backend_cps_ir_literals.dart' as literals;
-import 'js_backend_cps_ir_operators.dart' as operators;
-import 'js_backend_cps_ir_control_flow.dart' as control_flow;
-import 'js_backend_cps_ir_interceptors.dart' as interceptors;
-
 const String TEST_MAIN_FILE = 'test.dart';
 
-List<TestEntry> tests = <TestEntry>[]
-     ..addAll(basic.tests)
-     ..addAll(literals.tests)
-     ..addAll(control_flow.tests)
-     ..addAll(operators.tests)
-     ..addAll(interceptors.tests);
-
 class TestEntry {
   final String source;
   final String expectation;
@@ -45,7 +31,8 @@
   return js.prettyPrint(ast, compiler).getText();
 }
 
-main() {
+
+runTests(List<TestEntry> tests) {
   Expect.isTrue(const bool.fromEnvironment("USE_CPS_IR"));
 
   for (TestEntry test in tests) {
diff --git a/tests/compiler/dart2js/js_backend_cps_ir_basic.dart b/tests/compiler/dart2js/js_backend_cps_ir_basic_test.dart
similarity index 94%
rename from tests/compiler/dart2js/js_backend_cps_ir_basic.dart
rename to tests/compiler/dart2js/js_backend_cps_ir_basic_test.dart
index d10d2c2..cde5ccc 100644
--- a/tests/compiler/dart2js/js_backend_cps_ir_basic.dart
+++ b/tests/compiler/dart2js/js_backend_cps_ir_basic_test.dart
@@ -1,12 +1,13 @@
 // 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 for basic functionality.
 
 library basic_tests;
 
-import 'js_backend_cps_ir_test.dart';
+import 'js_backend_cps_ir.dart';
 
 const List<TestEntry> tests = const [
   const TestEntry("""
@@ -101,3 +102,8 @@
   return null;
 }"""),
 ];
+
+
+void main() {
+  runTests(tests);
+}
diff --git a/tests/compiler/dart2js/js_backend_cps_ir_closures_test.dart b/tests/compiler/dart2js/js_backend_cps_ir_closures_test.dart
new file mode 100644
index 0000000..068f6d2
--- /dev/null
+++ b/tests/compiler/dart2js/js_backend_cps_ir_closures_test.dart
@@ -0,0 +1,124 @@
+// 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 closures.
+
+library closures_test;
+
+import 'js_backend_cps_ir.dart';
+
+const List<TestEntry> tests = const [
+  const TestEntry("""
+main(x) {
+  a() {
+    return x;
+  }
+  x = x + '1';
+  print(a());
+}
+""",
+r"""
+function(x) {
+  var box_0, a, v0;
+  box_0 = {};
+  box_0.x_0 = x;
+  a = new V.main_a(box_0);
+  x = box_0.x_0;
+  v0 = "1";
+  box_0.x_0 = J.getInterceptor(x).$add(x, v0);
+  P.print(a.call$0());
+  return null;
+}"""),
+
+  const TestEntry("""
+main(x) {
+  a() {
+    return x;
+  }
+  print(a());
+}
+""",
+r"""
+function(x) {
+  P.print(new V.main_a(x).call$0());
+  return null;
+}"""),
+
+  const TestEntry("""
+main() {
+  var x = 122;
+  var a = () => x;
+  x = x + 1;
+  print(a());
+}
+""",
+r"""
+function() {
+  var box_0, a, x, v0;
+  box_0 = {};
+  box_0.x_0 = 122;
+  a = new V.main_closure(box_0);
+  x = box_0.x_0;
+  v0 = 1;
+  box_0.x_0 = J.getInterceptor(x).$add(x, v0);
+  P.print(a.call$0());
+  return null;
+}"""),
+
+  const TestEntry("""
+main() {
+  var x = 122;
+  var a = () {
+    var y = x;
+    return () => y;
+  };
+  x = x + 1;
+  print(a()());
+}
+""",
+r"""
+function() {
+  var box_0, a, x, v0;
+  box_0 = {};
+  box_0.x_0 = 122;
+  a = new V.main_closure(box_0);
+  x = box_0.x_0;
+  v0 = 1;
+  box_0.x_0 = J.getInterceptor(x).$add(x, v0);
+  P.print(a.call$0().call$0());
+  return null;
+}"""),
+
+  const TestEntry("""
+main() {
+  var a;
+  for (var i=0; i<10; i++) {
+    a = () => i;
+  }
+  print(a());
+}
+""",
+r"""
+function() {
+  var a, i, v0, v1;
+  a = null;
+  i = 0;
+  while (true) {
+    v0 = 10;
+    if (P.identical(J.getInterceptor(i).$lt(i, v0), true)) {
+      a = new V.main_closure(i);
+      v1 = 1;
+      i = J.getInterceptor(i).$add(i, v1);
+    } else {
+      P.print(a.call$0());
+      return null;
+    }
+  }
+}"""),
+];
+
+void main() {
+  runTests(tests);
+}
diff --git a/tests/compiler/dart2js/js_backend_cps_ir_control_flow.dart b/tests/compiler/dart2js/js_backend_cps_ir_control_flow_test.dart
similarity index 95%
rename from tests/compiler/dart2js/js_backend_cps_ir_control_flow.dart
rename to tests/compiler/dart2js/js_backend_cps_ir_control_flow_test.dart
index 2695588..9f82e28 100644
--- a/tests/compiler/dart2js/js_backend_cps_ir_control_flow.dart
+++ b/tests/compiler/dart2js/js_backend_cps_ir_control_flow_test.dart
@@ -1,12 +1,13 @@
 // 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 control flow statements.
 
 library control_flow_tests;
 
-import 'js_backend_cps_ir_test.dart';
+import 'js_backend_cps_ir.dart';
 
 const List<TestEntry> tests = const [
   const TestEntry("""
@@ -138,3 +139,7 @@
   return null;
 }"""),
 ];
+
+void main() {
+  runTests(tests);
+}
diff --git a/tests/compiler/dart2js/js_backend_cps_ir_interceptors.dart b/tests/compiler/dart2js/js_backend_cps_ir_interceptors_test.dart
similarity index 83%
rename from tests/compiler/dart2js/js_backend_cps_ir_interceptors.dart
rename to tests/compiler/dart2js/js_backend_cps_ir_interceptors_test.dart
index 6640b9a..ef56ac0 100644
--- a/tests/compiler/dart2js/js_backend_cps_ir_interceptors.dart
+++ b/tests/compiler/dart2js/js_backend_cps_ir_interceptors_test.dart
@@ -1,12 +1,13 @@
 // 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 interceptors_tests;
 
-import 'js_backend_cps_ir_test.dart';
+import 'js_backend_cps_ir.dart';
 
 const List<TestEntry> tests = const [
   const TestEntry("""
@@ -25,3 +26,8 @@
   return null;
 }"""),
 ];
+
+
+void main() {
+  runTests(tests);
+}
diff --git a/tests/compiler/dart2js/js_backend_cps_ir_literals.dart b/tests/compiler/dart2js/js_backend_cps_ir_literals_test.dart
similarity index 88%
rename from tests/compiler/dart2js/js_backend_cps_ir_literals.dart
rename to tests/compiler/dart2js/js_backend_cps_ir_literals_test.dart
index 02cfefe..ea90c77 100644
--- a/tests/compiler/dart2js/js_backend_cps_ir_literals.dart
+++ b/tests/compiler/dart2js/js_backend_cps_ir_literals_test.dart
@@ -1,12 +1,13 @@
 // 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 literals.
 
 library literals_tests;
 
-import 'js_backend_cps_ir_test.dart';
+import 'js_backend_cps_ir.dart';
 
 const List<TestEntry> tests = const [
   const TestEntry("""
@@ -32,3 +33,7 @@
   return null;
 }"""),
 ];
+
+void main() {
+  runTests(tests);
+}
diff --git a/tests/compiler/dart2js/js_backend_cps_ir_operators.dart b/tests/compiler/dart2js/js_backend_cps_ir_operators_test.dart
similarity index 91%
rename from tests/compiler/dart2js/js_backend_cps_ir_operators.dart
rename to tests/compiler/dart2js/js_backend_cps_ir_operators_test.dart
index 781dde1..18aa0c5 100644
--- a/tests/compiler/dart2js/js_backend_cps_ir_operators.dart
+++ b/tests/compiler/dart2js/js_backend_cps_ir_operators_test.dart
@@ -1,12 +1,13 @@
 // 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 operators.
 
 library operators_tests;
 
-import 'js_backend_cps_ir_test.dart';
+import 'js_backend_cps_ir.dart';
 
 const List<TestEntry> tests = const [
   const TestEntry("main() { return true ? 42 : 'foo'; }"),
@@ -43,3 +44,7 @@
   return null;
 }"""),
 ];
+
+void main() {
+  runTests(tests);
+}
diff --git a/tests/compiler/dart2js/library_resolution_test.dart b/tests/compiler/dart2js/library_resolution_test.dart
index 9cd69b2..1a44800 100644
--- a/tests/compiler/dart2js/library_resolution_test.dart
+++ b/tests/compiler/dart2js/library_resolution_test.dart
@@ -21,7 +21,8 @@
     LibraryElement;
 
 import 'package:compiler/src/dart2jslib.dart' show
-    MessageKind;
+    MessageKind,
+    NullSink;
 
 import 'package:_internal/libraries.dart' show
     DART2JS_PLATFORM,
diff --git a/tests/compiler/dart2js/memory_source_file_helper.dart b/tests/compiler/dart2js/memory_source_file_helper.dart
index 6dc0969..827e5c1 100644
--- a/tests/compiler/dart2js/memory_source_file_helper.dart
+++ b/tests/compiler/dart2js/memory_source_file_helper.dart
@@ -13,7 +13,7 @@
 export 'package:compiler/src/filenames.dart'
        show currentDirectory;
 
-import 'package:compiler/src/source_file.dart'
+import 'package:compiler/src/io/source_file.dart'
        show StringSourceFile;
 
 import 'package:compiler/src/source_file_provider.dart'
diff --git a/tests/compiler/dart2js/mirror_helper_test.dart b/tests/compiler/dart2js/mirror_helper_test.dart
index f9e1647..e454c7e 100644
--- a/tests/compiler/dart2js/mirror_helper_test.dart
+++ b/tests/compiler/dart2js/mirror_helper_test.dart
@@ -43,8 +43,8 @@
     DartBackend backend = compiler.backend;
     MirrorRenamerImpl mirrorRenamer = backend.mirrorRenamer;
     Map<Node, String> renames = backend.placeholderRenamer.renames;
-    Set<LibraryElement> imports =
-        backend.placeholderRenamer.platformImports;
+    Iterable<LibraryElement> imports =
+        backend.placeholderRenamer.platformImports.keys;
 
     FunctionExpression node = backend.memberNodes.values.first.first;
     Block block = node.body;
@@ -65,8 +65,8 @@
 
     DartBackend backend = compiler.backend;
     Map<Node, String> renames = backend.placeholderRenamer.renames;
-    Set<LibraryElement> imports =
-        backend.placeholderRenamer.platformImports;
+    Iterable<LibraryElement> imports =
+        backend.placeholderRenamer.platformImports.keys;
     FunctionExpression node = backend.memberNodes.values.first.first;
     Block block = node.body;
     ExpressionStatement getNameFunctionNode = block.statements.nodes.head;
diff --git a/tests/compiler/dart2js/mirrors_test.dart b/tests/compiler/dart2js/mirrors_test.dart
index 339eb3a..2b5d992 100644
--- a/tests/compiler/dart2js/mirrors_test.dart
+++ b/tests/compiler/dart2js/mirrors_test.dart
@@ -43,13 +43,14 @@
 
 main() {
   Uri scriptUri = currentDirectory.resolveUri(Platform.script);
+  Uri packageRoot = scriptUri.resolve('./packages/');
   Uri libUri = scriptUri.resolve('../../../sdk/');
   Uri inputUri = scriptUri.resolve('mirrors_helper.dart');
   var provider = new CompilerSourceFileProvider();
   var diagnosticHandler =
         new FormattingDiagnosticHandler(provider).diagnosticHandler;
   asyncStart();
-  var result = analyze([inputUri], libUri, null,
+  var result = analyze([inputUri], libUri, packageRoot,
                        provider.readStringFromUri, diagnosticHandler,
                        <String>['--preserve-comments']);
   result.then((MirrorSystem mirrors) {
diff --git a/tests/compiler/dart2js/missing_file_test.dart b/tests/compiler/dart2js/missing_file_test.dart
index 69b76da..92c94d5 100644
--- a/tests/compiler/dart2js/missing_file_test.dart
+++ b/tests/compiler/dart2js/missing_file_test.dart
@@ -30,6 +30,7 @@
 void runCompiler(Uri main, String expectedMessage) {
   Uri script = currentDirectory.resolveUri(Platform.script);
   Uri libraryRoot = script.resolve('../../../sdk/');
+  Uri packageRoot = script.resolve('./packages/');
 
   var provider = new MemorySourceFileProvider(MEMORY_SOURCE_FILES);
   var handler = new FormattingDiagnosticHandler(provider);
@@ -53,7 +54,7 @@
                                    outputProvider,
                                    diagnosticHandler,
                                    libraryRoot,
-                                   null,
+                                   packageRoot,
                                    [],
                                    {});
 
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index 7fdad36..136ac76 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -13,7 +13,7 @@
 import 'package:compiler/src/js_backend/js_backend.dart'
     show JavaScriptBackend;
 import 'package:compiler/src/resolution/resolution.dart';
-import 'package:compiler/src/source_file.dart';
+import 'package:compiler/src/io/source_file.dart';
 import 'package:compiler/src/tree/tree.dart';
 import 'package:compiler/src/util/util.dart';
 import 'parser_helper.dart';
@@ -163,12 +163,6 @@
                      api.Diagnostic.WARNING);
   }
 
-  void reportFatalError(Spannable node,
-                        MessageKind messageKind,
-                        [Map arguments = const {}]) {
-    reportError(node, messageKind, arguments);
-  }
-
   void reportDiagnostic(Spannable node,
                         Message message,
                         api.Diagnostic kind) {
@@ -218,7 +212,14 @@
     if (visitor.scope is LibraryScope) {
       visitor.scope = new MethodScope(visitor.scope, element);
     }
-    visitor.visit(tree);
+    try {
+      visitor.visit(tree);
+    } on CompilerCancelledException catch (_) {
+      // Ignored.
+
+      // TODO(ahe): Don't ignore CompilerCancelledException, instead, fix
+      // pkg/compiler/lib/src/resolution/members.dart.
+    }
     visitor.scope = new LibraryScope(element.library);
     return visitor.registry.mapping;
   }
diff --git a/tests/compiler/dart2js/mock_libraries.dart b/tests/compiler/dart2js/mock_libraries.dart
index 8ef8847..a004239 100644
--- a/tests/compiler/dart2js/mock_libraries.dart
+++ b/tests/compiler/dart2js/mock_libraries.dart
@@ -241,7 +241,6 @@
   'getNativeInterceptor': 'getNativeInterceptor(x) {}',
   'initializeDispatchProperty': 'initializeDispatchProperty(f,p,i) {}',
   'initializeDispatchPropertyCSP': 'initializeDispatchPropertyCSP(f,p,i) {}',
-  'interceptedNames': 'var interceptedNames;',
   'Interceptor': r'''
       class Interceptor {
         toString() {}
@@ -346,7 +345,6 @@
       }''',
   'JSUInt31': 'class JSUInt31 extends JSUInt32 {}',
   'JSUInt32': 'class JSUInt32 extends JSPositiveInt {}',
-  'mapTypeToInterceptor': 'var mapTypeToInterceptor;',
   'ObjectInterceptor': 'class ObjectInterceptor {}',
   'PlainJavaScriptObject': 'class PlainJavaScriptObject {}',
   'UnknownJavaScriptObject': 'class UnknownJavaScriptObject {}',
diff --git a/tests/compiler/dart2js/package_root_test.dart b/tests/compiler/dart2js/package_root_test.dart
index 7a5cce3..93327b3 100644
--- a/tests/compiler/dart2js/package_root_test.dart
+++ b/tests/compiler/dart2js/package_root_test.dart
@@ -30,6 +30,7 @@
 void runCompiler(Uri main) {
   Uri script = currentDirectory.resolveUri(Platform.script);
   Uri libraryRoot = script.resolve('../../../sdk/');
+  Uri packageRoot = script.resolve('./packages/');
 
   var provider = new MemorySourceFileProvider(MEMORY_SOURCE_FILES);
   var handler = new FormattingDiagnosticHandler(provider);
@@ -53,15 +54,15 @@
                                    outputProvider,
                                    diagnosticHandler,
                                    libraryRoot,
-                                   null,
+                                   packageRoot,
                                    [],
                                    {});
 
   asyncTest(() => compiler.run(main).then((_) {
     Expect.equals(1, errors.length);
-    Expect.equals("Cannot resolve 'package:foo/foo.dart'. "
-                  "Package root has not been set.",
-                  errors[0]);
+    Expect.isTrue(
+        errors[0].startsWith(
+            "Can't read 'package:foo/foo.dart' (Error reading "));
   }));
 }
 
diff --git a/tests/compiler/dart2js/parser_helper.dart b/tests/compiler/dart2js/parser_helper.dart
index c7678a4..3b07370 100644
--- a/tests/compiler/dart2js/parser_helper.dart
+++ b/tests/compiler/dart2js/parser_helper.dart
@@ -9,7 +9,7 @@
 import "package:compiler/src/elements/elements.dart";
 import "package:compiler/src/tree/tree.dart";
 import "package:compiler/src/scanner/scannerlib.dart";
-import "package:compiler/src/source_file.dart";
+import "package:compiler/src/io/source_file.dart";
 import "package:compiler/src/util/util.dart";
 
 import "package:compiler/src/elements/modelx.dart"
diff --git a/tests/compiler/dart2js/private_test.dart b/tests/compiler/dart2js/private_test.dart
index bbe3780..f36513e 100644
--- a/tests/compiler/dart2js/private_test.dart
+++ b/tests/compiler/dart2js/private_test.dart
@@ -6,7 +6,7 @@
 import "package:async_helper/async_helper.dart";
 import 'mock_compiler.dart';
 
-import 'package:compiler/src/source_file.dart';
+import 'package:compiler/src/io/source_file.dart';
 import 'package:compiler/src/dart2jslib.dart';
 
 const String PRIVATE_SOURCE_URI = 'src:private';
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index 653a12d..cd3d0ff 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -919,7 +919,7 @@
           """class A {
                A() : this.foo = 1;
              }""";
-      return resolveConstructor(script, "A a = new A();", "A", "", 0,
+      return resolveConstructor(script, "A a = new A();", "A", "", 1,
           expectedWarnings: [],
           expectedErrors: [MessageKind.CANNOT_RESOLVE]);
     },
diff --git a/tests/compiler/dart2js/source_map_validator_helper.dart b/tests/compiler/dart2js/source_map_validator_helper.dart
index 4083e10..fdd5ac9 100644
--- a/tests/compiler/dart2js/source_map_validator_helper.dart
+++ b/tests/compiler/dart2js/source_map_validator_helper.dart
@@ -15,7 +15,7 @@
          CompilationUnitElement,
          ClassElement,
          AstElement;
-import 'package:compiler/src/source_file.dart' show SourceFile;
+import 'package:compiler/src/io/source_file.dart' show SourceFile;
 
 validateSourceMap(Uri targetUri, [Compiler compiler]) {
   Uri mapUri = getMapUri(targetUri);
@@ -174,7 +174,7 @@
 Uri getMapUri(Uri targetUri) {
   print('Accessing $targetUri');
   File targetFile = new File.fromUri(targetUri);
-  Expect.isTrue(targetFile.existsSync());
+  Expect.isTrue(targetFile.existsSync(), "File '$targetUri' doesn't exist.");
   List<String> target = targetFile.readAsStringSync().split('\n');
   String mapReference = target[target.length - 2]; // #sourceMappingURL=<url>
   Expect.isTrue(mapReference.startsWith('//# sourceMappingURL='));
diff --git a/tests/compiler/dart2js/source_mapping_test.dart b/tests/compiler/dart2js/source_mapping_test.dart
index 3ff0813..8b5fa4e 100644
--- a/tests/compiler/dart2js/source_mapping_test.dart
+++ b/tests/compiler/dart2js/source_mapping_test.dart
@@ -6,7 +6,7 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import "package:compiler/src/io/code_output.dart";
-import 'package:compiler/src/source_file.dart';
+import 'package:compiler/src/io/source_file.dart';
 import "mock_compiler.dart";
 import 'package:compiler/src/js_backend/js_backend.dart';
 
@@ -16,7 +16,8 @@
   compiler.sourceFiles[uri.toString()] = sourceFile;
   JavaScriptBackend backend = compiler.backend;
   return compiler.runCompiler(uri).then((_) {
-    return backend.emitter.oldEmitter.mainBuffer;
+    return backend.emitter.oldEmitter
+        .outputBuffers[compiler.deferredLoadTask.mainOutputUnit];
   });
 }
 
@@ -30,9 +31,9 @@
   String code = codeWithMarkers.replaceAll('@', '');
 
   SourceFile sourceFile = new StringSourceFile('<test script>', code);
-  asyncTest(() => compileAll(sourceFile).then((CodeBuffer buffer) {
+  asyncTest(() => compileAll(sourceFile).then((CodeOutput output) {
     Set<int> locations = new Set<int>();
-    buffer.forEachSourceLocation((int offset, var sourcePosition) {
+    output.forEachSourceLocation((int offset, var sourcePosition) {
       if (sourcePosition != null && sourcePosition.sourceFile == sourceFile) {
         locations.add(sourcePosition.token.charOffset);
       }
diff --git a/tests/compiler/dart2js/type_checker_test.dart b/tests/compiler/dart2js/type_checker_test.dart
index f00a0d7..7f70d7d 100644
--- a/tests/compiler/dart2js/type_checker_test.dart
+++ b/tests/compiler/dart2js/type_checker_test.dart
@@ -8,7 +8,7 @@
 import 'package:compiler/src/elements/elements.dart';
 import 'package:compiler/src/tree/tree.dart';
 import 'package:compiler/src/util/util.dart';
-import 'package:compiler/src/source_file.dart';
+import 'package:compiler/src/io/source_file.dart';
 import 'mock_compiler.dart';
 import 'parser_helper.dart';
 
diff --git a/tests/compiler/dart2js/warnings_checker.dart b/tests/compiler/dart2js/warnings_checker.dart
index cdcd02a..396f6b4 100644
--- a/tests/compiler/dart2js/warnings_checker.dart
+++ b/tests/compiler/dart2js/warnings_checker.dart
@@ -11,7 +11,7 @@
 import 'package:async_helper/async_helper.dart';

 import 'memory_compiler.dart';

 import 'package:compiler/src/filenames.dart';

-import 'package:compiler/src/source_file.dart';

+import 'package:compiler/src/io/source_file.dart';

 import 'package:compiler/src/source_file_provider.dart';

 import 'package:compiler/src/util/uri_extras.dart';

 import 'dart:convert';

diff --git a/tests/compiler/dart2js_extra/compile_time_constant4_test.dart b/tests/compiler/dart2js_extra/compile_time_constant4_test.dart
index 2a7e55a..61c8369 100644
--- a/tests/compiler/dart2js_extra/compile_time_constant4_test.dart
+++ b/tests/compiler/dart2js_extra/compile_time_constant4_test.dart
@@ -7,35 +7,35 @@
 const x = "foo";
 const y = "foo";
 const g1 = x
-  + "bar"  /// 01: compile-time error
+  + "bar"
 ;
 const g2 = x
-  + null   /// 02: compile-time error
+  + null   /// 01: compile-time error
 ;
 const g3 = x
-  + 499   /// 03: compile-time error
+  + 499   /// 02: compile-time error
 ;
 const g4 = x
-  + 3.3   /// 04: compile-time error
+  + 3.3   /// 03: compile-time error
 ;
 const g5 = x
-  + true   /// 05: compile-time error
+  + true   /// 04: compile-time error
 ;
 const g6 = x
-  + false   /// 06: compile-time error
+  + false   /// 05: compile-time error
 ;
 const g7 = "foo"
-  + x[0]   /// 07: compile-time error
+  + x[0]   /// 06: compile-time error
 ;
 const g8 = 1
-  + x.length  /// 08: compile-time error
+  + x.length
 ;
 const g9 = x == y;
 
 use(x) => x;
 
 main() {
-  Expect.equals("foo", g1);
+  Expect.equals("foobar", g1);
   Expect.isTrue(g9);
   use(g1);
   use(g2);
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index f56ef3b..947bfe2 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -56,6 +56,7 @@
 int_parse_radix_test/01: Pass, Fail # JS implementations disagree on U+0085 being whitespace.
 int_parse_radix_test/02: Fail # No bigints.
 double_parse_test/01: Pass, Fail # JS implementations disagree on U+0085 being whitespace.
+integer_to_radix_string_test: RuntimeError # issue 22045
 
 # With the exception of 'void', const Symbol() should not accept reserved
 # words.
@@ -213,10 +214,6 @@
 num_clamp_test: StaticWarning, OK # Test generates errors on purpose.
 string_test: StaticWarning, OK # Test generates error on purpose.
 
-[ $runtime == ie10 ]
-num_parse_test: RuntimeError  # Issue 15316
-num_parse_test/01: RuntimeError  # Issue 15316
-
 [ $system == windows && $arch == x64 ]
 stopwatch_test: Skip  # Flaky test due to expected performance behaviour.
 
diff --git a/tests/corelib/integer_to_radix_string_test.dart b/tests/corelib/integer_to_radix_string_test.dart
index 34db6fb..80d30cc 100644
--- a/tests/corelib/integer_to_radix_string_test.dart
+++ b/tests/corelib/integer_to_radix_string_test.dart
@@ -11,7 +11,7 @@
                   'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
                   'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
                   'u', 'v', 'w', 'x', 'y', 'z'];
-  for (var radix = 2; radix < 37; radix++) {
+  for (var radix = 2; radix <= 36; radix++) {
     for (var i = 0; i < radix; i++) {
       Expect.equals(expected[i], i.toRadixString(radix));
     }
@@ -26,4 +26,36 @@
       // Nothing to do.
     }
   }
+
+  // Try large numbers (regression test for issue 15316).
+  var bignums = [
+    0x80000000,
+    0x100000000,
+    0x10000000000000,
+    0x10000000000001,  // 53 significant bits.
+    0x20000000000000,
+    0x20000000000002,
+    0x1000000000000000,
+    0x1000000000000100,
+    0x2000000000000000,
+    0x2000000000000200,
+    0x8000000000000000,
+    0x8000000000000800,
+    0x10000000000000000,
+    0x10000000000001000,
+    0x100000000000010000,
+    0x1000000000000100000,
+    0x10000000000001000000,
+    0x100000000000010000000,
+    0x1000000000000100000000,
+    0x10000000000001000000000,
+  ];
+  for (var bignum in bignums) {
+    for (int radix = 2; radix <= 36; radix++) {
+      String digits = bignum.toRadixString(radix);
+      int result = int.parse(digits, radix: radix);
+      Expect.equals(bignum, result,
+                    "${bignum.toRadixString(16)} -> $digits/$radix");
+    }
+  }
 }
diff --git a/tests/html/html.status b/tests/html/html.status
index 25ea826..dc001be 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -129,7 +129,7 @@
 no_linked_scripts_htmltest: Skip # Times out on IE.  Issue 21537
 scripts_htmltest: Skip # Times out on IE.  Issue 21537
 two_scripts_htmltest: Skip # Times out on IE.  Issue 21537
-deferred_multi_app_htmltest: Skip # Issue 21537
+deferred_multi_app_htmltest: Skip # Times out on IE.  Issue 21537
 
 [$runtime == ie10 ]
 # IE10 Feature support statuses-
@@ -350,6 +350,9 @@
 [ $compiler == dart2js && ($runtime == drt || $runtime == ff) ]
 request_animation_frame_test: Skip # Async test hangs.
 
+[ $compiler == dart2js && $runtime == ff ]
+history_test/history: Skip # Issue 22050
+
 [ $compiler == dart2js && $csp && ($runtime == drt || $runtime == safari || $runtime == ff || $runtime == chrome || $runtime == chromeOnAndroid) ]
 # Note: these tests are all injecting scripts by design.  This is not allowed under CSP.
 event_customevent_test: Fail       # Test cannot run under CSP restrictions.
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index 17d496b..ab7ade2 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -49,6 +49,8 @@
 [ $compiler == dart2js ]
 spawn_uri_vm_test: SkipByDesign # Test uses a ".dart" URI.
 spawn_uri_nested_vm_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
 message3_test/constList_identical: RuntimeError # Issue 21817
 message3_test/constMap: RuntimeError  # Issue 21817
@@ -68,6 +70,8 @@
 spawn_uri_nested_vm_test: RuntimeError   # Issue 16549
 spawn_uri_test: RuntimeError             # Issue 16549
 spawn_uri_vm_test: RuntimeError          # Issue 16549
+issue_21398_parent_isolate_test: RuntimeError  # Issue 16549
+issue_21398_parent_isolate1_test: RuntimeError # Issue 16549
 
 [ $compiler == dart2js && ( $runtime == ff || $runtime == safari || $runtime == drt || $runtime == chrome || $runtime == chromeOnAndroid) ]
 isolate_stress_test: Pass, Slow # Issue 10697
@@ -93,6 +97,8 @@
 [ $compiler == none && ( $runtime == dartium || $runtime == drt || $runtime == ContentShellOnAndroid) ]
 compile_time_error_test/none: Fail, OK # Issue 13921 Dom isolates don't support spawnFunction
 isolate_import_test/none: Fail, OK # Issue 13921 Dom isolates don't support spawnFunction
+issue_21398_parent_isolate_test: Fail, OK # Issue 13921 Dom isolates don't support spawnFunction
+issue_21398_parent_isolate1_test: Fail, OK # Issue 13921 Dom isolates don't support spawnFunction
 isolate_stress_test: Skip # Issue 13921 Dom isolates don't support spawnFunction
 message3_test: Fail, OK # Issue 13921 Dom isolates don't support spawnFunction
 start_paused_test: Fail, OK   # Issue 13921 Dom isolates don't support spawnFunction
diff --git a/tests/isolate/issue_21398_child_isolate.dart b/tests/isolate/issue_21398_child_isolate.dart
new file mode 100644
index 0000000..2d7b23c
--- /dev/null
+++ b/tests/isolate/issue_21398_child_isolate.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:isolate';
+import "package:expect/expect.dart";
+
+class FromChildIsolate {
+  String toString() => 'from child isolate';
+}
+
+main(List<String> args, message) {
+  var sendPort = message;
+  try {
+    sendPort.send(new FromChildIsolate());
+  } catch(error) {
+    Expect.isTrue(error is ArgumentError);
+    sendPort.send("Invalid Argument(s).");
+  }
+}
diff --git a/tests/isolate/issue_21398_child_isolate1.dart b/tests/isolate/issue_21398_child_isolate1.dart
new file mode 100644
index 0000000..1a720bd
--- /dev/null
+++ b/tests/isolate/issue_21398_child_isolate1.dart
@@ -0,0 +1,12 @@
+// 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:isolate';
+import "package:expect/expect.dart";
+
+main(List<String> args, message) {
+  var sendPort1 = args[0] as SendPort;
+  var sendPort2 = args[1] as SendPort;
+  sendPort2.send(sendPort1);
+}
diff --git a/tests/isolate/issue_21398_child_isolate11.dart b/tests/isolate/issue_21398_child_isolate11.dart
new file mode 100644
index 0000000..f1224dd
--- /dev/null
+++ b/tests/isolate/issue_21398_child_isolate11.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.
+
+import 'dart:isolate';
+import "package:expect/expect.dart";
+
+class FromChildIsolate {
+  String toString() => 'from child isolate';
+}
+
+main(List<String> args, message) {
+  var receivePort = new ReceivePort();
+  var sendPort = message;
+  sendPort.send(receivePort.sendPort);
+  receivePort.listen(
+    (msg) {
+      Expect.isTrue(msg is SendPort);
+      try {
+        msg.send(new FromChildIsolate());
+      } catch(error) {
+        Expect.isTrue(error is ArgumentError);
+        msg.send("Invalid Argument(s).");
+      }
+    },
+    onError: (e) => print('$e')
+  );
+}
diff --git a/tests/isolate/issue_21398_parent_isolate1_test.dart b/tests/isolate/issue_21398_parent_isolate1_test.dart
new file mode 100644
index 0000000..1763e4c
--- /dev/null
+++ b/tests/isolate/issue_21398_parent_isolate1_test.dart
@@ -0,0 +1,164 @@
+// 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:isolate';
+import 'dart:async';
+import "package:expect/expect.dart";
+
+class FromMainIsolate {
+  String toString() => 'from main isolate';
+  int get fld => 10;
+}
+
+func1Child(args) {
+  var receivePort = new ReceivePort();
+  var sendPort = args[0];
+  sendPort.send(receivePort.sendPort);
+  receivePort.listen(
+    (msg) {
+      Expect.isTrue(msg is FromMainIsolate);
+      Expect.equals(10, msg.fld);
+      receivePort.close();
+    },
+    onError: (e) => print('$e')
+  );
+}
+
+
+func2Child(args) {
+  var receivePort = new ReceivePort();
+  var sendPort = args[0];
+  sendPort.send(receivePort.sendPort);
+  receivePort.listen(
+    (msg) {
+      Expect.isTrue(msg is SendPort);
+      msg.send(new FromMainIsolate());
+      receivePort.close();
+    },
+    onError: (e) => print('$e')
+  );
+}
+
+
+spawnFuncTest() {
+  var receive1 = new ReceivePort();
+  var receive2 = new ReceivePort();
+
+  var spawnFunctionIsolate1SendPort;
+  var spawnFunctionIsolate2SendPort;
+
+  // First spawn the first isolate using spawnFunction, this isolate will
+  // create a receivePort and send it's sendPort back and then it will just
+  // sit there listening for a message from the second isolate spawned
+  // using spawnFunction.
+  Isolate.spawn(func1Child, [receive1.sendPort]).then(
+    (isolate) {
+      receive1.listen(
+        (msg) {
+          Expect.isTrue(msg is SendPort);
+          spawnFunctionIsolate1SendPort = msg;
+          receive1.close();
+
+          // Now spawn the second isolate using spawnFunction, this isolate
+          // will create a receivePort and send it's sendPort back and then
+          // wait for the third isolate spawned using spawnUri to send it
+          // a sendPort to which it will try and send a non "literal-like"
+          // object.
+          Isolate.spawn(func2Child, [receive2.sendPort]).then(
+            (isolate) {
+              receive2.listen(
+                (msg) {
+                  spawnFunctionIsolate2SendPort = msg;
+                  receive2.close();
+
+                  // Now spawn an isolate using spawnUri and send these send
+                  // ports over to it. This isolate will send one of the
+                  // sendports over to the other.
+                  Isolate.spawnUri(Uri.parse('issue_21398_child_isolate1.dart'),
+                                   [spawnFunctionIsolate1SendPort,
+                                    spawnFunctionIsolate2SendPort], "no-msg");
+                },
+                onError: (e) => print('$e')
+              );
+            }
+          );
+        },
+        onError: (e) => print('$e')
+      );
+    }
+  );
+}
+
+
+uriChild(args) {
+  var receivePort = new ReceivePort();
+  var sendPort = args[0];
+  sendPort.send(receivePort.sendPort);
+  receivePort.listen(
+    (msg) {
+      Expect.isTrue(msg is String);
+      Expect.equals("Invalid Argument(s).", msg);
+      receivePort.close();
+    },
+    onError: (e) => print('$e')
+  );
+}
+
+
+spawnUriTest() {
+  var receive1 = new ReceivePort();
+  var receive2 = new ReceivePort();
+
+  var spawnFunctionIsolateSendPort;
+  var spawnUriIsolateSendPort;
+
+  // First spawn the first isolate using spawnFunction, this isolate will
+  // create a receivePort and send it's sendPort back and then it will just
+  // sit there listening for a message from the second isolate spawned
+  // using spawnFunction.
+  Isolate.spawn(uriChild, [receive1.sendPort]).then(
+    (isolate) {
+      receive1.listen(
+        (msg) {
+          Expect.isTrue(msg is SendPort);
+          spawnFunctionIsolateSendPort = msg;
+          receive1.close();
+
+          // Now spawn the second isolate using spawnUri, this isolate
+          // will create a receivePort and send it's sendPort back and then
+          // wait for the third isolate spawned using spawnUri to send it
+          // a sendPort to which it will try and send a non "literal-like"
+          // object.
+          Isolate.spawnUri(Uri.parse('issue_21398_child_isolate11.dart'),
+                           [],
+                           receive2.sendPort).then(
+            (isolate) {
+              receive2.listen(
+                (msg) {
+                  spawnUriIsolateSendPort = msg;
+                  receive2.close();
+
+                  // Now spawn an isolate using spawnUri and send these send
+                  // ports over to it. This isolate will send one of the
+                  // sendports over to the other.
+                  Isolate.spawnUri(Uri.parse('issue_21398_child_isolate1.dart'),
+                                   [spawnFunctionIsolateSendPort,
+                                    spawnUriIsolateSendPort], "no-msg");
+                },
+                onError: (e) => print('$e')
+              );
+            }
+          );
+        },
+        onError: (e) => print('$e')
+      );
+    }
+  );
+}
+
+
+main() {
+  spawnFuncTest();
+  spawnUriTest();
+}
diff --git a/tests/isolate/issue_21398_parent_isolate_test.dart b/tests/isolate/issue_21398_parent_isolate_test.dart
new file mode 100644
index 0000000..d342497
--- /dev/null
+++ b/tests/isolate/issue_21398_parent_isolate_test.dart
@@ -0,0 +1,65 @@
+// 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:isolate';
+import 'dart:async';
+import "package:expect/expect.dart";
+
+class FromMainIsolate {
+  String toString() => 'from main isolate';
+  int get fld => 10;
+}
+
+funcChild(args) {
+  var reply = args[1];
+  var obj = args[0];
+  Expect.isTrue(obj is FromMainIsolate);
+  Expect.equals(10, obj.fld);
+  reply.send(new FromMainIsolate());
+}
+
+main() {
+  var receive1 = new ReceivePort();
+  var receive2 = new ReceivePort();
+
+  // First spawn an isolate using spawnURI and have it
+  // send back a "non-literal" like object.
+  Isolate.spawnUri(Uri.parse('issue_21398_child_isolate.dart'),
+                   [],
+                   [new FromMainIsolate(), receive1.sendPort]).catchError(
+    (error) {
+      Expect.isTrue(error is ArgumentError);
+    }
+  );
+  Isolate.spawnUri(Uri.parse('issue_21398_child_isolate.dart'),
+                   [],
+                   receive1.sendPort).then(
+    (isolate) {
+      receive1.listen(
+        (msg) {
+          Expect.stringEquals(msg, "Invalid Argument(s).");
+          receive1.close();
+        },
+        onError: (e) => print('$e')
+      );
+    }
+  );
+
+  // Now spawn an isolate using spawnFunction and send it a "non-literal"
+  // like object and also have the child isolate send back a "non-literal"
+  // like object.
+  Isolate.spawn(funcChild, 
+                [new FromMainIsolate(), receive2.sendPort]).then(
+    (isolate) {
+      receive2.listen(
+        (msg) {
+          Expect.isTrue(msg is FromMainIsolate);
+          Expect.equals(10, msg.fld);
+          receive2.close();
+        },
+        onError: (e) => print('$e')
+      );
+    }
+  );
+}
diff --git a/tests/language/compile_time_constant12_test.dart b/tests/language/compile_time_constant12_test.dart
index 0ae5f57..60a2533 100644
--- a/tests/language/compile_time_constant12_test.dart
+++ b/tests/language/compile_time_constant12_test.dart
@@ -3,11 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 const String s = "foo";
-const int i = s.length; /// 01: compile-time error
+const int i = s.length;
 
 use(x) => x;
 
 main() {
   use(s);
-  use(i); /// 01: continued
+  use(i);
 }
diff --git a/tests/language/compile_time_constant_c_test.dart b/tests/language/compile_time_constant_c_test.dart
index 089da3d..7771ae9 100644
--- a/tests/language/compile_time_constant_c_test.dart
+++ b/tests/language/compile_time_constant_c_test.dart
@@ -6,7 +6,7 @@
   499: 400 + 99
 };
 const m1 = const {
-  "foo" + "bar": 42            /// 01: compile-time error
+  "foo" + "bar": 42            /// 01: ok
 };
 const m2 = const {
   "foo" * 4: 42                /// 02: compile-time error
diff --git a/tests/language/for_variable_capture_test.dart b/tests/language/for_variable_capture_test.dart
new file mode 100644
index 0000000..d59fb8f
--- /dev/null
+++ b/tests/language/for_variable_capture_test.dart
@@ -0,0 +1,284 @@
+// 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";
+
+run(callback) => callback();
+
+
+initializer() {
+	var closure;
+	for (var i=0, fn = () => i; i < 3; i++) {
+		i += 1;
+		closure = fn;
+	}
+	Expect.equals(1, closure());
+}
+
+condition() {
+	var closures = [];
+	check(callback) {
+		closures.add(callback);
+		return callback();
+	}
+	var values = [];
+	for (var i=0; check(() => ++i) < 8; ++i) {
+		values.add(i);
+	}
+	Expect.listEquals([1, 3, 5, 7], values);
+	Expect.listEquals([2, 4, 6, 8, 10], closures.map(run).toList());
+}
+
+body() {
+	var closures = [];
+	for (var i=0, j=0; i<3; i++) {
+		j++;
+		closures.add(() => i);
+		closures.add(() => j);
+	}
+	Expect.listEquals([0, 1, 1, 2, 2, 3], closures.map(run).toList());
+}
+
+update() {
+	var closures = [];
+	check(callback) {
+		closures.add(callback);
+		return callback();
+	}
+	var values = [];
+	for (var i=0; i < 4; check(() => ++i)) {
+		values.add(i);
+	}
+	Expect.listEquals([0, 1, 2, 3], values);
+	Expect.listEquals([2, 3, 4, 5], closures.map(run).toList());
+}
+
+initializer_condition() {
+	var values = [];
+	for (var i=0, fn = () => i; run(() => ++i) < 3; ) {
+		values.add(i);
+		values.add(fn());
+	}
+	Expect.listEquals([1, 1, 2, 1], values);
+}
+
+initializer_update() {
+	var update_closures = [];
+	update(callback) {
+		update_closures.add(callback);
+		return callback();
+	}
+	var init_closure;
+	for (var i=0, fn = () => i; i < 4; update(() => ++i)) {
+		init_closure = fn;
+		if (i == 0) {
+			++i; // Mutate copy of 'i' from first iteration.
+		}
+	}
+	Expect.equals(1, init_closure());
+	Expect.listEquals([3, 4, 5], update_closures.map(run).toList());
+	Expect.equals(1, init_closure());
+}
+
+initializer_body() {
+	var closures = [];
+	for (var i=0, fn = () => i; i < 3; i++) {
+		closures.add(() => i);
+		closures.add(fn);
+		fn = () => i;
+	}
+	Expect.listEquals([0, 0, 1, 0, 2, 1], closures.map(run).toList());
+}
+
+condition_update() {
+	var cond_closures = [];
+	check(callback) {
+		cond_closures.add(callback);
+		return callback();
+	}
+	var update_closures = [];
+	update(callback) {
+		update_closures.add(callback);
+		return callback();
+	}
+	var values = [];
+	for (var i=0; check(() => i) < 4; update(() => ++i)) {
+		values.add(i);
+	}
+	Expect.listEquals([0, 1, 2, 3], values);
+
+	Expect.listEquals([0, 1, 2, 3, 4], cond_closures.map(run).toList());
+	Expect.listEquals(   [2, 3, 4, 5], update_closures.map(run).toList());
+	Expect.listEquals([0, 2, 3, 4, 5], cond_closures.map(run).toList());
+}
+
+condition_body() {
+	var cond_closures = [];
+	check(callback) {
+		cond_closures.add(callback);
+		return callback();
+	}
+	var body_closures = [];
+	do_body(callback) {
+		body_closures.add(callback);
+		return callback();
+	}
+	for (var i=0; check(() => i) < 4; ++i) {
+		do_body(() => i);
+	}
+	Expect.listEquals([0, 1, 2, 3, 4], cond_closures.map(run).toList());
+	Expect.listEquals([0, 1, 2, 3],    body_closures.map(run).toList());
+}
+
+initializer_condition_update() {
+	var init;
+	var cond_closures = [];
+	check(callback) {
+		cond_closures.add(callback);
+		return callback();
+	}
+	var update_closures = [];
+	update(callback) {
+		update_closures.add(callback);
+		return callback();
+	}
+	var values = [];
+	for (var i=0, fn = () => i; check(() => ++i) < 8; update(() => ++i)) {
+		init = fn;
+		values.add(i);
+	}
+	Expect.listEquals([1, 3, 5, 7], values);
+	Expect.equals(1, init());
+
+	Expect.listEquals([2, 4, 6, 8, 10], cond_closures.map(run).toList());
+	Expect.listEquals(   [5, 7, 9, 11], update_closures.map(run).toList());
+}
+
+initializer_condition_body() {
+	var init;
+	var cond_closures = [];
+	check(callback) {
+		cond_closures.add(callback);
+		return callback();
+	}
+	var body_closures = [];
+	do_body(callback) {
+		body_closures.add(callback);
+		return callback();
+	}
+	var values = [];
+	for (var i=0, fn = () => i; check(() => ++i) < 8; ) {
+		init = fn;
+		do_body(() => ++i);
+		values.add(i);
+	}
+	Expect.listEquals([2, 4, 6, 8], values);
+	Expect.equals(2, init());
+
+	Expect.listEquals([3, 5, 7,  9, 10], cond_closures.map(run).toList());
+	Expect.listEquals([4, 6, 8, 10],     body_closures.map(run).toList());
+}
+
+initializer_update_body() {
+	var init;
+	var update_closures = [];
+	update(callback) {
+		update_closures.add(callback);
+		return callback();
+	}
+	var body_closures = [];
+	do_body(callback) {
+		body_closures.add(callback);
+		return callback();
+	}
+	var values = [];
+	for (var i=0, fn = () => i; i < 8; update(() => ++i)) {
+		init = fn;
+		do_body(() => ++i);
+		values.add(i);
+	}
+	Expect.listEquals([1, 3, 5, 7], values);
+	Expect.equals(1, init());
+
+	Expect.listEquals(   [4, 6, 8, 9], update_closures.map(run).toList());
+	Expect.listEquals([2, 5, 7, 9],    body_closures.map(run).toList());
+}
+
+condition_update_body() {
+	var cond_closures = [];
+	check(callback) {
+		cond_closures.add(callback);
+		return callback();
+	}
+	var update_closures = [];
+	update(callback) {
+		update_closures.add(callback);
+		return callback();
+	}
+	var body_closures = [];
+	do_body(callback) {
+		body_closures.add(callback);
+		return callback();
+	}
+	var values = [];
+	for (var i=0; check(() => i) < 8; update(() => ++i)) {
+		do_body(() => ++i);
+		values.add(i);
+	}
+	Expect.listEquals([1, 3, 5, 7], values);
+
+	Expect.listEquals([1, 3, 5, 7, 8], cond_closures.map(run).toList());
+	Expect.listEquals(   [4, 6, 8, 9], update_closures.map(run).toList());
+	Expect.listEquals([2, 5, 7, 9],    body_closures.map(run).toList());
+	Expect.listEquals([2, 5, 7, 9, 9], cond_closures.map(run).toList());
+}
+
+initializer_condition_update_body() {
+	var init;
+	var cond_closures = [];
+	check(callback) {
+		cond_closures.add(callback);
+		return callback();
+	}
+	var update_closures = [];
+	update(callback) {
+		update_closures.add(callback);
+		return callback();
+	}
+	var body_closures = [];
+	do_body(callback) {
+		body_closures.add(callback);
+		return callback();
+	}
+	var values = [];
+	for (var i=0, fn = () => i; check(() => i) < 8; update(() => ++i)) {
+		init = fn;
+		do_body(() => ++i);
+		values.add(i);
+	}
+	Expect.listEquals([1, 3, 5, 7], values);
+	Expect.equals(1, init());
+
+	Expect.listEquals([1, 3, 5, 7, 8], cond_closures.map(run).toList());
+	Expect.listEquals(   [4, 6, 8, 9], update_closures.map(run).toList());
+	Expect.listEquals([2, 5, 7, 9],    body_closures.map(run).toList());
+	Expect.listEquals([2, 5, 7, 9, 9], cond_closures.map(run).toList());
+}
+
+main() {
+	initializer();
+	condition();
+	update();
+	body();
+	initializer_condition();
+	initializer_update();
+	initializer_body();
+	condition_update();
+	condition_body();
+	initializer_condition_update();
+	initializer_condition_body();
+	initializer_update_body();
+	condition_update_body();
+	initializer_condition_update_body();
+}
diff --git a/tests/language/generic_instanceof4_test.dart b/tests/language/generic_instanceof4_test.dart
new file mode 100644
index 0000000..15896cb
--- /dev/null
+++ b/tests/language/generic_instanceof4_test.dart
@@ -0,0 +1,28 @@
+// 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.
+// Test that instanceof works correctly with type variables.
+
+import "package:expect/expect.dart";
+
+class A<T> {
+  foo(x) {
+    // Don't inline.
+    if (new DateTime.now().millisecondsSinceEpoch == 42) return foo(x);
+    return x is T;
+  }
+}
+
+class BB {}
+
+class B<T> implements BB {
+  foo() {
+    // Don't inline.
+    if (new DateTime.now().millisecondsSinceEpoch == 42) return foo();
+    return new A<T>().foo(new B());
+  }
+}
+
+main() {
+  Expect.isTrue(new B<BB>().foo());
+}
diff --git a/tests/language/language.status b/tests/language/language.status
index 1091d75..ae6e776 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -17,7 +17,6 @@
 # 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
@@ -64,6 +63,9 @@
 cyclic_type2_test: Fail, OK
 least_upper_bound_expansive_test/*: Fail, OK
 
+compile_time_constant_c_test/01: Fail # Issue 21000
+compile_time_constant12_test: Fail # Issue 21000
+
 [ $compiler == none && $runtime == vm ]
 class_keyword_test/02: MissingCompileTimeError # Issue 13627
 unicode_bom_test: Fail # Issue 16067
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index 1392f0d..6f96ea6 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -6,6 +6,9 @@
 # Runtime negative test. No static errors or warnings.
 closure_call_wrong_argument_count_negative_test: skip
 
+compile_time_constant_c_test/01: Fail # Issue 21000
+compile_time_constant12_test: Fail # Issue 21000
+
 enum_syntax_test/02: Fail # 21649
 enum_syntax_test/03: Fail # 21649
 enum_syntax_test/04: Fail # 21649
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index b27091a..0c2ad1d 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -12,6 +12,9 @@
 enum_syntax_test/05: Fail # 21649
 enum_syntax_test/06: Fail # 21649
 
+compile_time_constant_c_test/01: Fail # Issue 21000
+compile_time_constant12_test: Fail # Issue 21000
+
 # Test issue 12694 (was analyzer issue), (1) when "abstract" is import prefix using it as type is warning; (2) currently analyzer resolves prefix as field (don't ask)
 built_in_identifier_prefix_test: CompileTimeError # Issue 12694
 
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index f20ef65..dd32757 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -18,7 +18,6 @@
 stacktrace_test: Pass, RuntimeError # # Issue 12698
 stacktrace_rethrow_nonerror_test: Pass, RuntimeError # Issue 12698
 stacktrace_rethrow_error_test: Pass, RuntimeError # Issue 12698
-illegal_invocation_test/01: CompileTimeError # Issue 13630
 instantiate_type_variable_test/01: CompileTimeError # Issue 13631
 library_ambiguous_test/00: CompileTimeError # Issue 13632
 library_ambiguous_test/01: CompileTimeError # Issue 13632
@@ -72,9 +71,6 @@
 [ $compiler == dart2js && $unchecked ]
 type_checks_in_factory_method_test: RuntimeError # Issue 12746
 assertion_test: RuntimeError # Issue 12748
-double_to_string_as_exponential2_test: RuntimeError # Issue 12749
-double_to_string_as_fixed2_test: RuntimeError # Issue 12749
-double_to_string_as_precision2_test: RuntimeError # Issue 12749
 generic_test: RuntimeError, OK
 map_literal4_test: RuntimeError, OK # Checked mode required.
 named_parameters_type_test/01: MissingRuntimeError, OK
@@ -84,7 +80,7 @@
 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
@@ -258,6 +254,7 @@
 
 [ $minified ]
 stack_trace_test: Fail, OK # Stack trace not preserved in minified code.
+regress_21795_test: RuntimeError # Issue 12605
 
 [ $compiler == dart2js && $runtime == d8 && $system == windows ]
 *deferred*: Skip # Issue 17458
diff --git a/tests/language/regress_21795_test.dart b/tests/language/regress_21795_test.dart
new file mode 100644
index 0000000..91506c7
--- /dev/null
+++ b/tests/language/regress_21795_test.dart
@@ -0,0 +1,46 @@
+// 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.
+
+// Regression test for issue 21795.
+
+foo(t) {
+  try {
+    if (t == 123) throw 42;
+  } finally { }
+}
+
+bar() {
+  try {
+    return 42;
+  } finally { }
+}
+
+
+class A {
+  test(t) {
+    try {
+      foo(t);
+    } finally {
+      if (t == 0) {
+        try {
+        } catch (err, st) {
+        }
+      }
+    }
+  }
+}
+
+
+main() {
+  var a = new A();
+  for (var i=0; i<10000; ++i) a.test(0);
+  try {
+    a.test(123);
+  } catch (e, s) {
+    if (s.toString().indexOf("foo") == -1) {
+      print(s);
+      throw "Expected foo in stacktrace!";
+    }
+  }
+}
diff --git a/tests/language/regress_21998_1_test.dart b/tests/language/regress_21998_1_test.dart
new file mode 100644
index 0000000..3237f33
--- /dev/null
+++ b/tests/language/regress_21998_1_test.dart
@@ -0,0 +1,18 @@
+// 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:math' as Math;
+import 'package:expect/expect.dart';
+
+main() {
+  Expect.equals(4, new C().m());
+}
+
+class C {
+  max(a) => a;
+
+  m() {
+    return max(Math.max(2, 4));
+  }
+}
\ No newline at end of file
diff --git a/tests/language/regress_21998_2_test.dart b/tests/language/regress_21998_2_test.dart
new file mode 100644
index 0000000..53cace0
--- /dev/null
+++ b/tests/language/regress_21998_2_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.
+
+import 'dart:math' as Math;
+import 'package:expect/expect.dart';
+import 'regress_21998_lib1.dart' as lib1;
+
+main() {
+  Expect.equals(4, new C().m());
+}
+
+class C {
+  max(a) => a;
+
+  m() {
+    return max(Math.max(2, lib1.max('a', 'b', 'cd').length));
+  }
+}
\ No newline at end of file
diff --git a/tests/language/regress_21998_3_test.dart b/tests/language/regress_21998_3_test.dart
new file mode 100644
index 0000000..2eac880
--- /dev/null
+++ b/tests/language/regress_21998_3_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:math' as Math;
+import 'package:expect/expect.dart';
+import 'regress_21998_lib1.dart' as lib1;
+import 'regress_21998_lib2.dart';
+
+main() {
+  Expect.equals(4, new C().m());
+}
+
+class C {
+  max(a) => a;
+
+  m() {
+    return max(Math.max(lib2_max(1, 2), lib1.max('a', 'b', 'cd').length));
+  }
+}
\ No newline at end of file
diff --git a/tests/language/regress_21998_4_test.dart b/tests/language/regress_21998_4_test.dart
new file mode 100644
index 0000000..7afe1ac
--- /dev/null
+++ b/tests/language/regress_21998_4_test.dart
@@ -0,0 +1,22 @@
+// 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:math' as Math;
+import 'package:expect/expect.dart';
+import 'regress_21998_lib1.dart' as lib1;
+import 'regress_21998_lib2.dart';
+import 'regress_21998_lib3.dart';
+
+main() {
+  Expect.equals(4, new C().m());
+}
+
+class C {
+  max(a) => a;
+
+  m() {
+    return max(Math.max(
+               lib3_max(0, lib2_max(1, 2)), lib1.max('a', 'b', 'cd').length));
+  }
+}
\ No newline at end of file
diff --git a/tests/language/regress_21998_lib1.dart b/tests/language/regress_21998_lib1.dart
new file mode 100644
index 0000000..ef3d869
--- /dev/null
+++ b/tests/language/regress_21998_lib1.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.
+
+library regress_21998_lib1;
+
+String max(String a, String b, String c) => '$a$b$c';
\ No newline at end of file
diff --git a/tests/language/regress_21998_lib2.dart b/tests/language/regress_21998_lib2.dart
new file mode 100644
index 0000000..8d1ac893
--- /dev/null
+++ b/tests/language/regress_21998_lib2.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 regress_21998_lib2;
+
+import 'dart:math';
+
+lib2_max(a, b) => max(a, b);
\ No newline at end of file
diff --git a/tests/language/regress_21998_lib3.dart b/tests/language/regress_21998_lib3.dart
new file mode 100644
index 0000000..a18f2ff
--- /dev/null
+++ b/tests/language/regress_21998_lib3.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 regress_21998_lib3;
+
+import 'dart:math' as math;
+
+lib3_max(a, b) => math.max(a, b);
\ No newline at end of file
diff --git a/tests/lib/async/future_test.dart b/tests/lib/async/future_test.dart
index 12cc53b..108cbcd 100644
--- a/tests/lib/async/future_test.dart
+++ b/tests/lib/async/future_test.dart
@@ -749,6 +749,133 @@
     });
 }
 
+void testWaitCleanUp() {
+  asyncStart();
+  // Creates three futures with different completion times, and where some fail.
+  // The `mask` specifies which futures fail (values 1-7),
+  // and `permute` defines the order of completion. values 0-5.
+  void doTest(int mask, int permute) {
+    asyncStart();
+    String stringId = "waitCleanup-$mask-$permute";
+    List futures = new List(3);
+    List cleanup = new List(3);
+    int permuteTmp = permute;
+    for (int i = 0; i < 3; i++) {
+      bool throws = (mask & (1 << i)) != 0;
+      var future = new Future.delayed(
+          new Duration(milliseconds: 100 * (i + 1)),
+          () => (throws ? throw "Error $i($mask-$permute)" : i));
+      int mod = 3 - i;
+      int position = permuteTmp % mod;
+      permuteTmp = permuteTmp ~/ mod;
+      while (futures[position] != null) position++;
+      futures[position] = future;
+      cleanup[i] = throws;
+    }
+    void cleanUp(index) {
+      Expect.isFalse(cleanup[index]);
+      cleanup[index] = true;
+    }
+    Future.wait(futures, cleanUp: cleanUp)
+          .then((_) { Expect.fail("No error: $stringId"); },
+                onError: (e, s) {
+                  Expect.listEquals([true, true, true], cleanup);
+                  asyncEnd();
+                });
+  }
+
+  for (int i = 1; i < 8; i++) {
+    for (int j = 0; j < 6; j++) {
+      doTest(i, j);
+    }
+  }
+  asyncEnd();
+}
+
+void testWaitCleanUpEager() {
+  asyncStart();
+  // Creates three futures with different completion times, and where some fail.
+  // The `mask` specifies which futures fail (values 1-7),
+  // and `permute` defines the order of completion. values 0-5.
+  void doTest(int mask, int permute) {
+    asyncStart();
+    asyncStart();
+    bool done = false;
+    String stringId = "waitCleanup-$mask-$permute";
+    List futures = new List(3);
+    List cleanup = new List(3);
+    int permuteTmp = permute;
+    for (int i = 0; i < 3; i++) {
+      bool throws = (mask & (1 << i)) != 0;
+      var future = new Future.delayed(
+          new Duration(milliseconds: 100 * (i + 1)),
+          () => (throws ? throw "Error $i($mask-$permute)" : i));
+      int mod = 3 - i;
+      int position = permuteTmp % mod;
+      permuteTmp = permuteTmp ~/ mod;
+      while (futures[position] != null) position++;
+      futures[position] = future;
+      cleanup[i] = throws;
+    }
+    void checkDone() {
+      if (done) return;
+      if (cleanup.every((v) => v)) {
+        done = true;
+        asyncEnd();
+      }
+    }
+    void cleanUp(index) {
+      Expect.isFalse(cleanup[index]);
+      cleanup[index] = true;
+      // Cleanup might happen before and after the wait().then() callback.
+      checkDone();
+    }
+    Future.wait(futures, eagerError: true, cleanUp: cleanUp)
+          .then((_) { Expect.fail("No error: $stringId"); },
+                onError: (e, s) {
+                  asyncEnd();
+                  checkDone();
+                });
+  }
+
+  for (int i = 1; i < 8; i++) {
+    for (int j = 0; j < 6; j++) {
+      doTest(i, j);
+    }
+  }
+  asyncEnd();
+}
+
+void testWaitCleanUpError() {
+  var cms = const Duration(milliseconds: 100);
+  var cleanups = new List.filled(3, false);
+  var uncaughts = new List.filled(3, false);
+  asyncStart();
+  asyncStart();
+  asyncStart();
+  runZoned(() {
+    Future.wait([new Future.delayed(cms, () => 0),
+                 new Future.delayed(cms * 2, ()=> throw 1),
+                 new Future.delayed(cms * 3, () => 2)],
+                 cleanUp: (index) {
+                   Expect.isTrue(index == 0 || index == 2, "$index");
+                   Expect.isFalse(cleanups[index]);
+                   cleanups[index] = true;
+                   throw index;
+                 })
+          .catchError((e) {
+            Expect.equals(e, 1);
+            asyncEnd();
+          });
+
+  }, onError: (int index, s) {
+    Expect.isTrue(index == 0 || index == 2, "$index");
+    Expect.isFalse(uncaughts[index]);
+    uncaughts[index] = true;
+    asyncEnd();
+  });
+}
+
 main() {
   asyncStart();
 
@@ -805,6 +932,9 @@
 
   testSyncFuture_i13368();
 
+  testWaitCleanUp();
+  testWaitCleanUpError();
+
   asyncEnd();
 }
 
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 54fef3d..2322396 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -206,9 +206,15 @@
 [ $runtime == ff ]
 # FF setTimeout can fire early: https://bugzilla.mozilla.org/show_bug.cgi?id=291386
 convert/streamed_conversion_utf8_decode_test: Pass, Slow  # Issue 12029
-convert/streamed_conversion_utf8_encode_test: Pass, Slow # Issue 12029
 mirrors/mirrors_reader_test: Timeout, Slow, RuntimeError # Issue 16589
 
+[ $runtime == chrome || $runtime == ff || $runtime == ContentShellOnAndroid ]
+convert/streamed_conversion_utf8_encode_test: Skip # Times out. Issue 22050
+convert/streamed_conversion_json_utf8_encode_test: Skip # Times out. Issue 22050
+convert/streamed_conversion_json_utf8_decode_test: Skip # Times out. Issue 22050
+async/slow_consumer2_test: Skip # Times out. Issue 22050
+async/stream_timeout_test: Skip # Times out. Issue 22050
+
 [ $compiler == dart2js ]
 typed_data/typed_data_hierarchy_int64_test: RuntimeError # Issue 10275
 typed_data/int32x4_bigint_test: RuntimeError # Issue 1533
diff --git a/tests/lib/mirrors/invocation_fuzz_test.dart b/tests/lib/mirrors/invocation_fuzz_test.dart
index 392740c..404353a 100644
--- a/tests/lib/mirrors/invocation_fuzz_test.dart
+++ b/tests/lib/mirrors/invocation_fuzz_test.dart
@@ -14,9 +14,6 @@
 
 // Methods to be skipped, by qualified name.
 var blacklist = [
-  // TODO(regis): investigate.
-  'dart.core._Montgomery._invDigitPair',
-
   // Don't recurse on this test.
   'test.invoke_natives',
 
@@ -45,6 +42,8 @@
   // 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',
diff --git a/tests/standalone/io/file_lock_script.dart b/tests/standalone/io/file_lock_script.dart
new file mode 100644
index 0000000..162323a
--- /dev/null
+++ b/tests/standalone/io/file_lock_script.dart
@@ -0,0 +1,32 @@
+// 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.
+//
+// Script used by the file_lock_test.dart test.
+
+import "dart:io";
+
+main(List<String> args) {
+  File file = new File(args[0]);
+  int start = null;
+  int end = null;
+  var  mode = FileLock.EXCLUSIVE;
+  if (args[1] == 'SHARED') {
+    mode = FileLock.SHARED;
+  }
+  if (args[2] != 'null') {
+    start = int.parse(args[2]);
+  }
+  if (args[3] != 'null') {
+    end = int.parse(args[3]);
+  }
+  var raf = file.openSync(mode: WRITE);
+  try {
+    raf.lockSync(mode, start, end);
+    print('LOCK SUCCEEDED');
+  } catch (e) {
+    print('LOCK FAILED');
+  } finally {
+    raf.closeSync();
+  }
+}
diff --git a/tests/standalone/io/file_lock_test.dart b/tests/standalone/io/file_lock_test.dart
new file mode 100644
index 0000000..d84ca2b
--- /dev/null
+++ b/tests/standalone/io/file_lock_test.dart
@@ -0,0 +1,325 @@
+// 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';
+
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+import "package:path/path.dart";
+
+// Check whether the file is locked or not.
+check(String path, int start, int end, FileLock mode, {bool locked}) {
+  // Client process returns either 'LOCK FAILED' or 'LOCK SUCCEEDED'.
+  var expected = locked ? 'LOCK FAILED' : 'LOCK SUCCEEDED';
+  var arguments = []
+      ..addAll(Platform.executableArguments)
+      ..add(Platform.script.resolve('file_lock_script.dart').toFilePath())
+      ..add(path)
+      ..add(mode == FileLock.EXCLUSIVE ? 'EXCLUSIVE' : 'SHARED')
+      ..add('$start')
+      ..add('$end');
+    return Process.run(Platform.executable, arguments)
+        .then((ProcessResult result) {
+          if (result.exitCode != 0 || !result.stdout.contains(expected)) {
+            print("Client failed, exit code ${result.exitCode}");
+            print("  stdout:");
+            print(result.stdout);
+            print("  stderr:");
+            print(result.stderr);
+            print("  arguments:");
+            print(arguments);
+            Expect.fail('Client subprocess exit code: ${result.exitCode}');
+          }
+   });
+}
+
+checkLocked(String path,
+            [int start, int end, FileLock mode = FileLock.EXCLUSIVE]) =>
+    check(path, start, end, mode, locked: true);
+
+checkNotLocked(String path,
+               [int start, int end, FileLock mode = FileLock.EXCLUSIVE]) =>
+    check(path, start, end, mode, locked: false);
+
+void testLockWholeFile() {
+  Directory directory = Directory.systemTemp.createTempSync('dart_file_lock');
+  File file = new File(join(directory.path, "file"));
+  file.writeAsBytesSync(new List.filled(10, 0));
+  var raf = file.openSync(mode: WRITE);
+  raf.lockSync();
+  asyncStart();
+  checkLocked(file.path).then((_) {
+    return checkLocked(file.path, 0, 2).then((_) {
+      raf.unlockSync();
+      return checkNotLocked(file.path).then((_) {
+      });
+    });
+  }).whenComplete(() {
+    raf.closeSync();
+    directory.deleteSync(recursive: true);
+    asyncEnd();
+  });
+}
+
+void testLockWholeFileAsync() {
+  Directory directory = Directory.systemTemp.createTempSync('dart_file_lock');
+  File file = new File(join(directory.path, "file"));
+  file.writeAsBytesSync(new List.filled(10, 0));
+  var raf = file.openSync(mode: WRITE);
+  asyncStart();
+  Future.forEach([
+      () => raf.lock(),
+      () => checkLocked(file.path, 0, 2),
+      () => checkLocked(file.path),
+      () => raf.unlock(),
+      () => checkNotLocked(file.path),
+    ],
+    (f) => f()).whenComplete(() {
+      raf.closeSync();
+      directory.deleteSync(recursive: true);
+      asyncEnd();
+  });
+}
+
+void testLockRange() {
+  Directory directory = Directory.systemTemp.createTempSync('dart_file_lock');
+  File file = new File(join(directory.path, "file"));
+  file.writeAsBytesSync(new List.filled(10, 0));
+  var raf1 = file.openSync(mode: WRITE);
+  var raf2 = file.openSync(mode: WRITE);
+  asyncStart();
+  var tests = [
+      () => raf1.lockSync(FileLock.EXCLUSIVE, 2, 3),
+      () => raf2.lockSync(FileLock.EXCLUSIVE, 5, 7),
+      () => checkNotLocked(file.path, 0, 2),
+      () => checkLocked(file.path, 0, 3),
+      () => checkNotLocked(file.path, 4, 5),
+      () => checkLocked(file.path, 4, 6),
+      () => checkLocked(file.path, 6),
+      () => checkNotLocked(file.path, 7),
+      () => raf1.unlockSync(2, 3),
+      () => checkNotLocked(file.path, 0, 5),
+      () => checkLocked(file.path, 4, 6),
+      () => checkLocked(file.path, 6),
+      () => checkNotLocked(file.path, 7),
+    ];
+  // On Windows regions unlocked must match regions locked.
+  if (!Platform.isWindows) {
+    tests.addAll([
+        () => raf1.unlockSync(5, 6),
+        () => checkNotLocked(file.path, 0, 6),
+        () => checkLocked(file.path, 6),
+        () => checkNotLocked(file.path, 7),
+        () => raf2.unlockSync(6, 7),
+        () => checkNotLocked(file.path)
+      ]);
+  } else {
+    tests.addAll([
+        () => raf2.unlockSync(5, 7),
+        () => checkNotLocked(file.path)
+      ]);
+  }
+  Future.forEach(tests, (f) => f()).whenComplete(() {
+      raf1.closeSync();
+      raf2.closeSync();
+      directory.deleteSync(recursive: true);
+      asyncEnd();
+    });
+}
+
+void testLockRangeAsync() {
+  Directory directory = Directory.systemTemp.createTempSync('dart_file_lock');
+  File file = new File(join(directory.path, "file"));
+  file.writeAsBytesSync(new List.filled(10, 0));
+  var raf1 = file.openSync(mode: WRITE);
+  var raf2 = file.openSync(mode: WRITE);
+  asyncStart();
+  var tests = [
+      () => raf1.lock(FileLock.EXCLUSIVE, 2, 3),
+      () => raf2.lock(FileLock.EXCLUSIVE, 5, 7),
+      () => checkNotLocked(file.path, 0, 2),
+      () => checkLocked(file.path, 0, 3),
+      () => checkNotLocked(file.path, 4, 5),
+      () => checkLocked(file.path, 4, 6),
+      () => checkLocked(file.path, 6),
+      () => checkNotLocked(file.path, 7),
+      () => raf1.unlock(2, 3),
+      () => checkNotLocked(file.path, 0, 5),
+      () => checkLocked(file.path, 4, 6),
+      () => checkLocked(file.path, 6),
+      () => checkNotLocked(file.path, 7),
+    ];
+  // On Windows regions unlocked must match regions locked.
+  if (!Platform.isWindows) {
+    tests.addAll([
+        () => raf1.unlock(5, 6),
+        () => checkNotLocked(file.path, 0, 6),
+        () => checkLocked(file.path, 6),
+        () => checkNotLocked(file.path, 7),
+        () => raf2.unlock(6, 7),
+        () => checkNotLocked(file.path)
+      ]);
+  } else {
+    tests.addAll([
+        () => raf2.unlock(5, 7),
+        () => checkNotLocked(file.path)
+      ]);
+  }
+  Future.forEach(tests, (f) => f()).whenComplete(() {
+      raf1.closeSync();
+      raf2.closeSync();
+      directory.deleteSync(recursive: true);
+      asyncEnd();
+    });
+}
+
+void testLockEnd() {
+  Directory directory = Directory.systemTemp.createTempSync('dart_file_lock');
+  File file = new File(join(directory.path, "file"));
+  file.writeAsBytesSync(new List.filled(10, 0));
+  var raf = file.openSync(mode: APPEND);
+  asyncStart();
+  Future.forEach([
+      () => raf.lockSync(FileLock.EXCLUSIVE, 2),
+      () => checkNotLocked(file.path, 0, 2),
+      () => checkLocked(file.path, 0, 3),
+      () => checkLocked(file.path, 9),
+      () => raf.writeFromSync(new List.filled(10, 0)),
+      () => checkLocked(file.path, 10),
+      () => checkLocked(file.path, 19),
+      () => raf.unlockSync(2),
+      () => checkNotLocked(file.path)
+    ],
+    (f) => f()).whenComplete(() {
+      raf.closeSync();
+      directory.deleteSync(recursive: true);
+      asyncEnd();
+    });
+}
+
+void testLockEndAsync() {
+  Directory directory = Directory.systemTemp.createTempSync('dart_file_lock');
+  File file = new File(join(directory.path, "file"));
+  file.writeAsBytesSync(new List.filled(10, 0));
+  var raf = file.openSync(mode: APPEND);
+  asyncStart();
+  Future.forEach([
+      () => raf.lock(FileLock.EXCLUSIVE, 2),
+      () => checkNotLocked(file.path, 0, 2),
+      () => checkLocked(file.path, 0, 3),
+      () => checkLocked(file.path, 9),
+      () => raf.writeFromSync(new List.filled(10, 0)),
+      () => checkLocked(file.path, 10),
+      () => checkLocked(file.path, 19),
+      () => raf.unlock(2),
+      () => checkNotLocked(file.path)
+    ],
+    (f) => f()).whenComplete(() {
+      raf.closeSync();
+      directory.deleteSync(recursive: true);
+      asyncEnd();
+    });
+}
+
+void testLockShared() {
+  Directory directory = Directory.systemTemp.createTempSync('dart_file_lock');
+  File file = new File(join(directory.path, "file"));
+  file.writeAsBytesSync(new List.filled(10, 0));
+  var raf = file.openSync();
+  asyncStart();
+  Future.forEach([
+      () => raf.lock(FileLock.SHARED),
+      () => checkLocked(file.path),
+      () => checkLocked(file.path, 0, 2),
+      () => checkNotLocked(file.path, 0, 2, FileLock.SHARED)
+    ],
+    (f) => f()).then((_) {
+      raf.closeSync();
+      directory.deleteSync(recursive: true);
+      asyncEnd();
+    });
+}
+
+void testLockSharedAsync() {
+  Directory directory = Directory.systemTemp.createTempSync('dart_file_lock');
+  File file = new File(join(directory.path, "file"));
+  file.writeAsBytesSync(new List.filled(10, 0));
+  var raf = file.openSync();
+  asyncStart();
+  Future.forEach([
+      () => raf.lock(FileLock.SHARED),
+      () => checkLocked(file.path),
+      () => checkLocked(file.path, 0, 2),
+      () => checkNotLocked(file.path, 0, 2, FileLock.SHARED)
+    ],
+    (f) => f()).whenComplete(() {
+      raf.closeSync();
+      directory.deleteSync(recursive: true);
+      asyncEnd();
+    });
+}
+
+void testLockAfterLength() {
+  Directory directory = Directory.systemTemp.createTempSync('dart_file_lock');
+  File file = new File(join(directory.path, "file"));
+  file.writeAsBytesSync(new List.filled(10, 0));
+  var raf = file.openSync(mode: APPEND);
+  asyncStart();
+  Future.forEach([
+      () => raf.lockSync(FileLock.EXCLUSIVE, 2, 15),
+      () => checkNotLocked(file.path, 0, 2),
+      () => checkLocked(file.path, 0, 3),
+      () => checkLocked(file.path, 9),
+      () => checkLocked(file.path, 14),
+      () => raf.writeFromSync(new List.filled(10, 0)),
+      () => checkLocked(file.path, 10),
+      () => checkNotLocked(file.path, 15),
+      () => raf.unlockSync(2, 15),
+      () => checkNotLocked(file.path)
+    ],
+    (f) => f()).whenComplete(() {
+      raf.closeSync();
+      directory.deleteSync(recursive: true);
+      asyncEnd();
+    });
+}
+
+void testLockAfterLengthAsync() {
+  Directory directory = Directory.systemTemp.createTempSync('dart_file_lock');
+  File file = new File(join(directory.path, "file"));
+  file.writeAsBytesSync(new List.filled(10, 0));
+  var raf = file.openSync(mode: APPEND);
+  asyncStart();
+  Future.forEach([
+      () => raf.lock(FileLock.EXCLUSIVE, 2, 15),
+      () => checkNotLocked(file.path, 0, 2),
+      () => checkLocked(file.path, 0, 3),
+      () => checkLocked(file.path, 9),
+      () => checkLocked(file.path, 14),
+      () => raf.writeFromSync(new List.filled(10, 0)),
+      () => checkLocked(file.path, 10),
+      () => checkNotLocked(file.path, 15),
+      () => raf.unlock(2, 15),
+      () => checkNotLocked(file.path)
+    ],
+    (f) => f()).whenComplete(() {
+      raf.closeSync();
+      directory.deleteSync(recursive: true);
+      asyncEnd();
+    });
+}
+
+void main() {
+  testLockWholeFile();
+  testLockWholeFileAsync();
+  testLockRange();
+  testLockRangeAsync();
+  testLockEnd();
+  testLockEndAsync();
+  testLockShared();
+  testLockSharedAsync();
+  testLockAfterLength();
+  testLockAfterLengthAsync();
+}
diff --git a/tests/try/poi/apply_updates_test.dart b/tests/try/poi/apply_updates_test.dart
index 41bdff7..c26d283 100644
--- a/tests/try/poi/apply_updates_test.dart
+++ b/tests/try/poi/apply_updates_test.dart
@@ -17,7 +17,7 @@
 import 'package:compiler/src/dart2jslib.dart' show
     Script;
 
-import 'package:compiler/src/source_file.dart' show
+import 'package:compiler/src/io/source_file.dart' show
     StringSourceFile;
 
 import 'compiler_test_case.dart';
diff --git a/tests/try/poi/diff_test.dart b/tests/try/poi/diff_test.dart
index 6e99cd9..eaf9c1c 100644
--- a/tests/try/poi/diff_test.dart
+++ b/tests/try/poi/diff_test.dart
@@ -18,7 +18,7 @@
     Compiler,
     Script;
 
-import 'package:compiler/src/source_file.dart' show
+import 'package:compiler/src/io/source_file.dart' show
     StringSourceFile;
 
 import 'package:compiler/src/elements/elements.dart' show
diff --git a/tests/try/poi/library_updater_test.dart b/tests/try/poi/library_updater_test.dart
index 5d35d83..dbaea15e 100644
--- a/tests/try/poi/library_updater_test.dart
+++ b/tests/try/poi/library_updater_test.dart
@@ -13,7 +13,7 @@
 import 'package:compiler/src/dart2jslib.dart' show
     Script;
 
-import 'package:compiler/src/source_file.dart' show
+import 'package:compiler/src/io/source_file.dart' show
     StringSourceFile;
 
 import 'compiler_test_case.dart';
diff --git a/tools/VERSION b/tools/VERSION
index 53a0b59..ca9a130 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 9
 PATCH 0
-PRERELEASE 3
+PRERELEASE 4
 PRERELEASE_PATCH 0
diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
index 01c5aec..006e56d 100644
--- a/tools/testing/dart/browser_controller.dart
+++ b/tools/testing/dart/browser_controller.dart
@@ -148,6 +148,7 @@
                             {Map<String,String> environment}) {
     return Process.start(command, arguments, environment: environment)
         .then((startedProcess) {
+      _logEvent("Started browser using $command ${arguments.join(' ')}");
       process = startedProcess;
       // Used to notify when exiting, and as a return value on calls to
       // close().
diff --git a/tools/testing/dart/status_reporter.dart b/tools/testing/dart/status_reporter.dart
new file mode 100644
index 0000000..80d0ef7
--- /dev/null
+++ b/tools/testing/dart/status_reporter.dart
@@ -0,0 +1,187 @@
+// 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:convert';
+
+List<Map> LINUX_COMBINATIONS = [
+    {
+      'runtimes' : ['none'],
+      'modes' : ['release'],
+      'archs' : ['ia32'],
+      'compiler' : 'dartanalyzer'
+    },
+    {
+      'runtimes' : ['vm'],
+      'modes' : ['debug', 'release'],
+      'archs' : ['ia32', 'x64', 'simarm', 'simmips'],
+      'compiler' : 'none'
+    },
+    {
+      'runtimes' : ['vm'],
+      'modes' : ['release'],
+      'archs' : ['ia32', 'x64'],
+      'compiler' : 'dart2dart'
+    },
+    {
+      'runtimes' : ['d8', 'jsshell', 'chrome', 'ff'],
+      'modes' : ['release'],
+      'archs' : ['ia32'],
+      'compiler' : 'dart2js'
+    },
+    {
+      'runtimes' : ['dartium'],
+      'modes' : ['release', 'debug'],
+      'archs' : ['ia32'],
+      'compiler' : 'none'
+    },
+];
+
+List<Map> MACOS_COMBINATIONS = [
+    {
+      'runtimes' : ['vm'],
+      'modes' : ['debug', 'release'],
+      'archs' : ['ia32', 'x64'],
+      'compiler' : 'none'
+    },
+    {
+      'runtimes' : ['safari', 'safarimobilesim'],
+      'modes' : ['release'],
+      'archs' : ['ia32'],
+      'compiler' : 'dart2js'
+    },
+    {
+      'runtimes' : ['dartium'],
+      'modes' : ['release', 'debug'],
+      'archs' : ['ia32'],
+      'compiler' : 'none'
+    },
+];
+
+List<Map> WINDOWS_COMBINATIONS = [
+    {
+      'runtimes' : ['vm'],
+      'modes' : ['debug', 'release'],
+      'archs' : ['ia32', 'x64'],
+      'compiler' : 'none'
+    },
+    {
+      'runtimes' : ['chrome', 'ff', 'ie11', 'ie10'],
+      'modes' : ['release'],
+      'archs' : ['ia32'],
+      'compiler' : 'dart2js'
+    },
+    {
+      'runtimes' : ['dartium'],
+      'modes' : ['release', 'debug'],
+      'archs' : ['ia32'],
+      'compiler' : 'none'
+    },
+];
+
+Map<String, List<Map>> COMBINATIONS = {
+  'linux' : LINUX_COMBINATIONS,
+  'windows' : WINDOWS_COMBINATIONS,
+  'macos' : MACOS_COMBINATIONS
+};
+
+List<Map> getCombinations() {
+  return COMBINATIONS[Platform.operatingSystem];
+}
+
+void ensureBuild() {
+  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']);
+
+  if (result.exitCode != 0) {
+    print('ERROR');
+    print(result.stderr);
+    throw new Exception('Error while building.');
+  }
+  print('Done building.');
+}
+
+void sanityCheck(String output) {
+  LineSplitter splitter = new LineSplitter();
+  var lines = splitter.convert(output);
+  // Looks like this:
+  // Total: 15556 tests
+  var total = int.parse(lines[0].split(' ')[1].trim());
+  var count = 0;
+  for (var i = 1; i < lines.length; i++) {
+    if (lines[i] == '') continue;
+    // Looks like this:
+    //  * 3218 tests will be skipped (3047 skipped by design)
+    count += int.parse(lines[i].split(' ')[2].trim());
+  }
+  if (count != total) {
+    print('Count: $count, total: $total');
+    throw new Exception(
+        'Count and total do not align. Please validate manually.');
+  }
+}
+
+void main(List<String> args) {
+  ensureBuild();
+
+  List<String> keys;
+  for (var combination in getCombinations()) {
+    for (var mode in combination['modes']) {
+      for (var arch in combination['archs']) {
+        for (var runtime in combination['runtimes']) {
+          var compiler = combination['compiler'];
+
+          var args = ['tools/test.py', '-m$mode', '-c$compiler', '-r$runtime',
+                      '-a$arch', '--report-in-json', '--use-sdk'];
+          var result = Process.runSync('python', args);
+          if (result.exitCode != 0) {
+            print(result.stdout);
+            print(result.stderr);
+            throw new Exception("Error running: ${args.join(" ")}");
+          }
+
+          // Find Total: 15063 tests
+          // Everything after this will be the report.
+          var totalIndex = result.stdout.indexOf('JSON:');
+          var report = result.stdout.substring(totalIndex + 5);
+
+          var map = JSON.decode(report) as Map;
+
+          if (keys == null) {
+            keys = map.keys.toList();
+            var firstKey = keys.removeAt(0);
+            if (firstKey != 'total') {
+              throw '"total" should be the first key';
+            }
+
+            var headers = ['compiler', 'runtime', 'arch', 'mode', 'total'];
+            for (var k in keys) {
+              headers.addAll([k, '${k}_pct']);
+            }
+            print(headers.join(','));
+          }
+
+          var total = map['total'];
+          var values = [compiler, runtime, arch, mode, total];
+
+          for (var key in keys) {
+            var value = map[key];
+            values.add(value);
+            var pct = 100*(value/total);
+            values.add('${pct.toStringAsFixed(3)}%');
+          }
+
+          print(values.join(','));
+        }
+      }
+    }
+  }
+}
diff --git a/tools/testing/dart/summary_report.dart b/tools/testing/dart/summary_report.dart
new file mode 100644
index 0000000..d6db9a9
--- /dev/null
+++ b/tools/testing/dart/summary_report.dart
@@ -0,0 +1,133 @@
+// 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 summary_report;
+
+import "status_file_parser.dart";
+import "test_runner.dart";
+
+final summaryReport = new SummaryReport();
+
+class SummaryReport {
+  int _total = 0;
+  int _skipped = 0;
+  int _skippedByDesign = 0;
+  int _noCrash = 0;
+  int _flakyCrash = 0;
+  int _pass = 0;
+  int _failOk = 0;
+  int _fail = 0;
+  int _crash = 0;
+  int _timeout = 0;
+  int _compileErrorSkip = 0;
+
+  int get total => _total;
+
+  int get skippedOther => _skipped - _skippedByDesign;
+
+  int get bogus => _nonStandardTestCases.length;
+
+  final List<TestCase> _nonStandardTestCases = <TestCase>[];
+
+  void add(TestCase testCase) {
+    var expectations = testCase.expectedOutcomes;
+
+    bool containsFail = expectations
+        .any((expectation) => expectation.canBeOutcomeOf(Expectation.FAIL));
+    bool containsPass = expectations.contains(Expectation.PASS);
+    bool containsSkip = expectations.contains(Expectation.SKIP);
+    bool containsSkipByDesign =
+        expectations.contains(Expectation.SKIP_BY_DESIGN);
+    bool containsCrash = expectations.contains(Expectation.CRASH);
+    bool containsOK = expectations.contains(Expectation.OK);
+    bool containsSlow = expectations.contains(Expectation.SLOW);
+    bool containsTimeout = expectations.contains(Expectation.TIMEOUT);
+
+    ++_total;
+    if (containsSkip) {
+      ++_skipped;
+    } else if (containsSkipByDesign) {
+      ++_skipped;
+      ++_skippedByDesign;
+    } else {
+      // We don't do if-else below because the buckets should be exclusive.
+      // We keep a count around to guarantee that
+      int markers = 0;
+
+      // Counts the number of flaky tests.
+      if (containsFail && containsPass && !containsCrash && !containsOK) {
+        ++_noCrash;
+        ++markers;
+      }
+      if (containsCrash && !containsOK && expectations.length > 1) {
+        ++_flakyCrash;
+        ++markers;
+      }
+      if ((containsPass && expectations.length == 1) ||
+          (containsPass && containsSlow && expectations.length == 2)) {
+        ++_pass;
+        ++markers;
+      }
+      if (containsFail && containsOK) {
+        ++_failOk;
+        ++markers;
+      }
+      if ((containsFail && expectations.length == 1) ||
+          (containsFail && containsSlow && expectations.length == 2)) {
+        ++_fail;
+        ++markers;
+      }
+      if ((containsCrash && expectations.length == 1) ||
+          (containsCrash && containsSlow && expectations.length == 2)) {
+        ++_crash;
+        ++markers;
+      }
+      if (containsTimeout && expectations.length == 1) {
+        ++_timeout;
+        ++markers;
+      }
+      if (markers != 1) {
+        _nonStandardTestCases.add(testCase);
+      }
+    }
+  }
+
+  void addCompileErrorSkipTest() {
+    _total++;
+    _compileErrorSkip++;
+  }
+
+  Map<String, int> get values => {
+    'total': _total,
+    'skippedOther': skippedOther,
+    'skippedByDesign': _skippedByDesign,
+    'pass': _pass,
+    'noCrash': _noCrash,
+    'flakyCrash': _flakyCrash,
+    'failOk': _failOk,
+    'fail': _fail,
+    'crash': _crash,
+    'timeout': _timeout,
+    'compileErrorSkip': _compileErrorSkip,
+    'bogus': bogus
+  };
+
+  String get report => """Total: $_total tests
+ * $_skipped tests will be skipped ($_skippedByDesign skipped by design)
+ * $_noCrash tests are expected to be flaky but not crash
+ * $_flakyCrash tests are expected to flaky crash
+ * $_pass tests are expected to pass
+ * $_failOk tests are expected to fail that we won't fix
+ * $_fail tests are expected to fail that we should fix
+ * $_crash tests are expected to crash that we should fix
+ * $_timeout tests are allowed to timeout
+ * $_compileErrorSkip tests are skipped on browsers due to compile-time error
+ * $bogus could not be categorized or are in multiple categories
+""";
+
+  void printReport() {
+    if (_total == 0) return;
+    print(report);
+  }
+}
diff --git a/tools/testing/dart/test_configurations.dart b/tools/testing/dart/test_configurations.dart
index 091e477..6edd93c 100644
--- a/tools/testing/dart/test_configurations.dart
+++ b/tools/testing/dart/test_configurations.dart
@@ -62,6 +62,8 @@
   var printTiming = firstConf['time'];
   var listTests = firstConf['list'];
 
+  var reportInJson = firstConf['report_in_json'];
+
   var recordingPath = firstConf['record_to_file'];
   var recordingOutputPath = firstConf['replay_from_file'];
 
@@ -224,7 +226,9 @@
   }
 
   var eventListener = [];
-  if (progressIndicator != 'silent') {
+
+  // We don't print progress if we list tests.
+  if (progressIndicator != 'silent' && !listTests) {
     var printFailures = true;
     var formatter = new Formatter();
     if (progressIndicator == 'color') {
@@ -261,7 +265,13 @@
     eventListener.add(new UnexpectedCrashDumpArchiver());
   }
 
-  eventListener.add(new ExitCodeSetter());
+  // The only progress indicator when listing tests should be the
+  // the summary printer.
+  if (listTests) {
+    eventListener.add(new SummaryPrinter(jsonOnly: reportInJson));
+  } else {
+    eventListener.add(new ExitCodeSetter());
+  }
 
   void startProcessQueue() {
     // [firstConf] is needed here, since the ProcessQueue needs to know the
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index 940c5cc..c004ee6 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -222,6 +222,13 @@
               false,
               type: 'bool'),
           new _TestOptionSpecification(
+              'report_in_json',
+              'When doing list, output result summary in json only.',
+              ['--report-in-json'],
+              [],
+              false,
+              type: 'bool'),
+          new _TestOptionSpecification(
               'time',
               'Print timing information after running tests',
               ['--time'],
@@ -681,6 +688,11 @@
       configuration['mode'] = 'debug,release';
     }
 
+    if (configuration['report_in_json']) {
+      configuration['list'] = true;
+      configuration['report'] = true;
+    }
+
     // Use verbose progress indication for verbose output unless buildbot
     // progress indication is requested.
     if (configuration['verbose'] && configuration['progress'] != 'buildbot') {
diff --git a/tools/testing/dart/test_progress.dart b/tools/testing/dart/test_progress.dart
index bb31d29..0fbb767 100644
--- a/tools/testing/dart/test_progress.dart
+++ b/tools/testing/dart/test_progress.dart
@@ -10,6 +10,7 @@
 import "dart:convert" show JSON;
 import "path.dart";
 import "status_file_parser.dart";
+import "summary_report.dart";
 import "test_runner.dart";
 import "test_suite.dart";
 import "utils.dart";
@@ -307,9 +308,17 @@
 
 
 class SummaryPrinter extends EventListener {
+  final bool jsonOnly;
+
+  SummaryPrinter({bool jsonOnly})
+      : jsonOnly = (jsonOnly == null) ? false : jsonOnly;
+
   void allTestsKnown() {
-    if (SummaryReport.total > 0) {
-      SummaryReport.printReport();
+    if (jsonOnly) {
+      print("JSON:");
+      print(JSON.encode(summaryReport.values));
+    } else {
+      summaryReport.printReport();
     }
   }
 }
diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
index 68013f6..1bdf34e 100644
--- a/tools/testing/dart/test_runner.dart
+++ b/tools/testing/dart/test_runner.dart
@@ -2793,15 +2793,18 @@
           print("\nGenerating all matching test cases ....\n");
 
           for (TestCase testCase in testCases) {
+            eventFinishedTestCase(testCase);
             print("${testCase.displayName}   "
                   "Expectations: ${testCase.expectedOutcomes.join(', ')}   "
                   "Configuration: '${testCase.configurationString}'");
           }
+          eventAllTestsKnown();
         });
     }
 
     var testCaseEnqueuer;
     CommandQueue commandQueue;
+
     void setupForRunning(TestCaseEnqueuer testCaseEnqueuer) {
       Timer _debugTimer;
       // If we haven't seen a single test finishing during a 10 minute period
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 7253aec..bf79c8e 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -21,6 +21,7 @@
 import "path.dart";
 import "multitest.dart";
 import "status_file_parser.dart";
+import "summary_report.dart";
 import "test_runner.dart";
 import "utils.dart";
 import "http_server.dart" show PREFIX_BUILDDIR, PREFIX_DARTDIR;
@@ -279,10 +280,10 @@
       if (testCase.expectCompileError &&
           TestUtils.isBrowserRuntime(configuration['runtime']) &&
           new CompilerConfiguration(configuration).hasCompiler) {
-        SummaryReport.addCompileErrorSkipTest();
+        summaryReport.addCompileErrorSkipTest();
         return;
       } else {
-        SummaryReport.add(expectations);
+        summaryReport.add(testCase);
       }
     }
 
@@ -2406,74 +2407,3 @@
     return path;
   }
 }
-
-
-class SummaryReport {
-  static int total = 0;
-  static int skipped = 0;
-  static int skippedByDesign = 0;
-  static int noCrash = 0;
-  static int pass = 0;
-  static int failOk = 0;
-  static int fail = 0;
-  static int crash = 0;
-  static int timeout = 0;
-  static int compileErrorSkip = 0;
-
-  static void add(Set<Expectation> expectations) {
-    bool containsFail = expectations.any(
-        (expectation) => expectation.canBeOutcomeOf(Expectation.FAIL));
-    ++total;
-    if (expectations.contains(Expectation.SKIP)) {
-      ++skipped;
-    } else if (expectations.contains(Expectation.SKIP_BY_DESIGN)) {
-      ++skipped;
-      ++skippedByDesign;
-    } else {
-      // Counts the number of flaky tests.
-      if (expectations.contains(Expectation.PASS) &&
-          containsFail &&
-          !expectations.contains(Expectation.CRASH) &&
-          !expectations.contains(Expectation.OK)) {
-        ++noCrash;
-      }
-      if (expectations.contains(Expectation.PASS) && expectations.length == 1) {
-        ++pass;
-      }
-      if (expectations.containsAll([Expectation.FAIL, Expectation.OK]) &&
-          expectations.length == 2) {
-        ++failOk;
-      }
-      if (containsFail && expectations.length == 1) {
-        ++fail;
-      }
-      if (expectations.contains(Expectation.CRASH) &&
-          expectations.length == 1) {
-        ++crash;
-      }
-      if (expectations.contains(Expectation.TIMEOUT)) {
-        ++timeout;
-      }
-    }
-  }
-
-  static void addCompileErrorSkipTest() {
-    total++;
-    compileErrorSkip++;
-  }
-
-  static void printReport() {
-    if (total == 0) return;
-    String report = """Total: $total tests
- * $skipped tests will be skipped ($skippedByDesign skipped by design)
- * $noCrash tests are expected to be flaky but not crash
- * $pass tests are expected to pass
- * $failOk tests are expected to fail that we won't fix
- * $fail tests are expected to fail that we should fix
- * $crash tests are expected to crash that we should fix
- * $timeout tests are allowed to timeout
- * $compileErrorSkip tests are skipped on browsers due to compile-time error
-""";
-    print(report);
-  }
-}