Version 2.0.0-dev.64.0

Merge commit 'b6aa31f7d8cb6c880002ba4f0655b0eca873510f' into dev
diff --git a/BUILD.gn b/BUILD.gn
index b3f49d3..1957140 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -13,7 +13,7 @@
     testonly = true
   }
   deps = [
-    ":runtime_kernel",
+    ":runtime",
   ]
 }
 
@@ -34,6 +34,11 @@
 }
 
 group("runtime") {
+  import("runtime/runtime_args.gni")
+
+  target_supports_aot = dart_target_arch == "arm" ||
+                        dart_target_arch == "arm64" || dart_target_arch == "x64"
+
   if (targetting_fuchsia) {
     # Fuchsia has run_vm_tests marked testonly.
     testonly = true
@@ -45,21 +50,6 @@
     "runtime/bin:run_vm_tests",
     "runtime/bin:sample_extension",
     "runtime/bin:test_extension",
-  ]
-}
-
-group("runtime_kernel") {
-  import("runtime/runtime_args.gni")
-
-  target_supports_aot = dart_target_arch == "arm" ||
-                        dart_target_arch == "arm64" || dart_target_arch == "x64"
-
-  if (targetting_fuchsia) {
-    # Fuchsia has run_vm_tests marked testonly.
-    testonly = true
-  }
-  deps = [
-    ":runtime",
     "runtime/vm:kernel_platform_files($host_toolchain)",
 
     # TODO(rmacnak): Link this into 'dart'.
@@ -72,6 +62,12 @@
   }
 }
 
+group("runtime_kernel") {
+  deps = [
+    ":runtime",
+  ]
+}
+
 group("runtime_precompiled") {
   deps = [
     "runtime/bin:dart_bootstrap($host_toolchain)",
diff --git a/CHANGELOG.md b/CHANGELOG.md
index beb9682..1287ea8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,21 +1,65 @@
-## 2.0.0-dev.XX.0
-(Add new changes here, and they will be copied to the
- change section for the next dev version)
+## 2.0.0-dev.64.0
 
 ### Language
 
-#### Strong Mode
+* Numerous corner case bugs around return statements in synchronous and
+asynchronous functions fixed.  Specifically:
+  * Issues [31887][issue 31887], [32881][issue 32881]. Future flattening should
+    not be recursive.
+  * Issues [30638][issue 30638], [32233][issue 32233]. Incorrect downcast errors
+    with `FutureOr`
+  * Issue [32233][issue 32233]. Errors when returning `FutureOr`
+  * Issue [33218][issue 33218]. Returns in functions with void related types
+  * Issue [31278][issue 31278]. Incorrect hint on empty returns in async
+    functions
+* An empty `return;` in an async function with return type `Future<Object>` will
+    not report an error.
+* `return exp;` where `exp` has type `void` in an async function is now an error
+unless the return type of the function is `void` or `dynamic`.
+* Mixed return statements of the form `return;` and `return exp;` are now
+allowed when `exp` has type `void`.
+
+[issue 31887]: https://github.com/dart-lang/sdk/issues/31887
+[issue 30638]: https://github.com/dart-lang/sdk/issues/30638
+[issue 32233]: https://github.com/dart-lang/sdk/issues/32233
+[issue 32881]: https://github.com/dart-lang/sdk/issues/32881
+[issue 33218]: https://github.com/dart-lang/sdk/issues/33218
+[issue 31278]: https://github.com/dart-lang/sdk/issues/31278
 
 ### Dart VM
 
+* The Dart VM now runs programs by default with Dart 2.0 semantics. The flag
+  `--preview-dart-2` is not available anymore.
+
+* A new flag `--no-preview-dart-2` has been added, this flag can be used
+  to revert to Dart 1.0 semantics. The flag is temporary and only meant to
+  help users in the migration process. The flag will go away in a future dev
+  release, when we no longer support Dart 1.0.
+
 ### Tool Changes
 
-#### Pub
+#### Dart2js
 
-#### Other Tools
+* Dart2js now compiles programs by default with Dart 2.0 semantics. Apps are
+  expected to be bigger than before, because Dart 2.0 has many more implicit
+  checks (similar to the `--checked` flag in Dart 1.0). Other relevant flags:
+
+  * `--omit-implicit-checks`: is a flag that removes most of the extra implicit
+    checks. Only use this if you have enough test coverage to know that the app
+    will work well without the checks. If a check would have failed and it is
+    omitted, your app may crash or behave in unexpected ways.
+
+  * `--no-preview-dart-2`: a temporary flag to revert to Dart 1.0. This flag is
+    temporary and only meant to help users in the migration process. The flag
+    will go away in a future dev release, when we no longer support Dart 1.0.
 
 ### Core library changes
 
+* `dart:core`
+  * `int.parse` on the VM no longer accepts unsigned hexadecimal numbers
+    greater than or equal to 2**63 when not prefixed by `0x`.
+    (SDK issue [32858](https://github.com/dart-lang/sdk/issues/32858))
+
 ## 2.0.0-dev.63.0
 
 ### Tool Changes
@@ -28,7 +72,7 @@
 
 ### Language
 
-Inference chooses `void` when combining `Object` or `dynamic` and `void` ([issue
+* Inference chooses `void` when combining `Object` or `dynamic` and `void` ([issue
 3341]).  When combining with other top types, inference now prefers `void`.  So
 for example, given:
 
diff --git a/DEPS b/DEPS
index 94230ce..ae550dd 100644
--- a/DEPS
+++ b/DEPS
@@ -94,7 +94,7 @@
   "intl_tag": "0.15.2",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_tag": "2.0.6",
-  "linter_tag": "0.1.53",
+  "linter_tag": "0.1.54",
   "logging_tag": "0.11.3+1",
   "markdown_tag": "2.0.0",
   "matcher_tag": "0.12.1+4",
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index aa78dff..9ab7861 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -58,6 +58,9 @@
 % - Specify configurable imports.
 % - Specify the dynamic type of the Iterable/Future/Stream returned from
 %   invocations of functions marked sync*/async/async*.
+% - Add appendix listing the major differences between 64-bit integers
+%   and JavaScript integers.
+% - Remove appendix on naming conventions.
 %
 % 1.15
 % - Change how language specification describes control flow.
@@ -397,7 +400,7 @@
 \commentary{
 A consequence of these rules is that it is possible to hide a type with a method or variable.
 Naming conventions usually prevent such abuses.
-Nevertheless,the following program is legal:
+Nevertheless, the following program is legal:
 }
 
 \begin{dartCode}
@@ -9276,7 +9279,18 @@
 It is a static warning if the referenced part declaration $p$ names a library other than the current library as the library to which $p$ belongs.
 
 \LMHash{}
-It's a compile-time error if the same library contains two part directives with the same URI.
+Let $L$ be a library.
+It is a compile-time error if $L$ contains two part directives with the same URI.
+Furthermore,
+let $L_1$ be $L$ or any library which is directly or indirectly imported by $L$,
+and let $L_2$ be any library distinct from $L_1$ which is directly or indirectly imported by $L$
+(\ref{imports}).
+It is a compile-time error if $L_1$ and $L_2$ both contain a part directive with the same URI.
+
+\commentary{
+In particular, it is an error to use the same part twice in the same program
+(\ref{scripts}).
+}
 
 
 \subsection{Scripts}
@@ -10457,28 +10471,40 @@
 }
 
 
-\section*{Appendix: Naming Conventions}
-\LMLabel{namingConventions}
+\section*{Appendix: Integer Implementations}
+\LMLabel{integerImplementations}
 
 \commentary{
-The following naming conventions are customary in Dart programs.
+The \code{int} type represents integers.
+The specification is written with 64-bit two's complement integers as the
+intended implementation, but when Dart is compiled to JavaScript,
+the implementation of \code{int} will instead use the JavaScript
+number type.
+
+This introduces a number of differencs:
 \begin{itemize}
-\item The names of compile-time constant variables never use lower case letters.
-If they consist of multiple words, those words are separated by underscores.
-Examples: PI, I\_AM\_A\_CONSTANT.
-\item The names of functions (including getters, setters, methods and local or library functions) and non-constant variables begin with a lowercase letter.
-If the name consists of multiple words, each word (except the first) begins with an uppercase letter.
-No other uppercase letters are used.
-Examples: camlCase, dart4TheWorld
-\item The names of types (including classes and type aliases) begin with an upper case letter.
-If the name consists of multiple words, each word begins with an uppercase letter.
-No other uppercase letters are used.
-Examples: CamlCase, Dart4TheWorld.
-\item The names of type variables are short (preferably single letter).
-Examples: T, S, K, V , E.
-\item The names of libraries or library prefixes never use upper case letters.
-If they consist of multiple words, those words are separated by underscores.
-Example: my\_favorite\_library.
+\item Valid values of JavaScript \code{int} are any
+IEEE-754 64-bit floating point number with no fractional part.
+This includes positive and negative {\em infinity},
+which can be reached by overflowing
+(integer division by zero is still not allowed).
+Otherwise valid integer literals (including any leading minus sign)
+that represent invalid JavaScript \code{int} values
+cannot be compiled to JavaScript.
+Operations on integers may lose precision since 64-bit floating point numbers
+are limited to 53 significant bits.
+\item JavaScript \code{int} instances also implement \code{double},
+and integer-valued \code{double} instances also implement \code{int}.
+The \code{int} and \code{double} class are still separate subclasses of the
+class \code{num}, but {\em instances} of either class that represent an integer,
+act as if they are actually instances of a common subclass implementing both
+\code{int} and \code{double}. Fractional numbers only implement \code{double}.
+\item Bitwise operations on integers (and, or, xor, negate and shifts)
+all truncate the operands to 32-bit values.
+\item The \code{identical} method cannot distinguish the values $0.0$ and $-0.0$,
+and it cannot recognize any {\em NaN} value as identical to itself.
+For efficiency, the \code{identical} operation uses the JavaScript \code{===}
+operator.
 \end{itemize}
 }
 
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index eb9db41..2163483 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -372,7 +372,8 @@
         new PluginWatcher(resourceProvider, pluginManager);
 
     defaultContextOptions.generateImplicitErrors = false;
-    defaultContextOptions.useFastaParser = options.useCFE;
+    defaultContextOptions.useFastaParser =
+        options.useCFE || options.useFastaParser;
     defaultContextOptions.previewDart2 = options.previewDart2;
 
     {
@@ -1189,6 +1190,11 @@
    * Whether to enable the Dart 2.0 Common Front End implementation.
    */
   bool useCFE = false;
+
+  /**
+   * Whether to enable parsing via the Fasta parser.
+   */
+  bool useFastaParser = false;
 }
 
 /**
diff --git a/pkg/analysis_server/lib/src/collections.dart b/pkg/analysis_server/lib/src/collections.dart
index 6c88a04..afde613 100644
--- a/pkg/analysis_server/lib/src/collections.dart
+++ b/pkg/analysis_server/lib/src/collections.dart
@@ -3,20 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /**
- * Returns the concatenation of the input [iterables].
- *
- * The returned iterable is a lazily-evaluated view on the input iterables.
- */
-Iterable<E> concat<E>(Iterable<Iterable<E>> iterables) =>
-    iterables.expand((x) => x);
-
-/**
- * Returns the concatenation of the input [iterables] as a [List].
- */
-List<E> concatToList<E>(Iterable<Iterable<E>> iterables) =>
-    concat(iterables).toList();
-
-/**
  * Returns the given [list] if it is not empty, or `null` otherwise.
  */
 List<E> nullIfEmpty<E>(List<E> list) {
@@ -29,23 +15,6 @@
   return list;
 }
 
-/// A pair of values.
-class Pair<E, F> {
-  final E first;
-  final F last;
-
-  Pair(this.first, this.last);
-
-  int get hashCode => first.hashCode ^ last.hashCode;
-
-  bool operator ==(other) {
-    if (other is! Pair) return false;
-    return other.first == first && other.last == last;
-  }
-
-  String toString() => '($first, $last)';
-}
-
 /**
  * A container that remembers the last `n` items added to it.
  *
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index 6a4a0ff..f634061 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -49,11 +49,6 @@
       new RecentBuffer<CompletionPerformance>(performanceListMaxLength);
 
   /**
-   * Performance for the last priority change event.
-   */
-  CompletionPerformance computeCachePerformance;
-
-  /**
    * The current request being processed or `null` if none.
    */
   CompletionRequestImpl _currentRequest;
diff --git a/pkg/analysis_server/lib/src/domains/analysis/occurrences.dart b/pkg/analysis_server/lib/src/domains/analysis/occurrences.dart
index 3862078..eedb605 100644
--- a/pkg/analysis_server/lib/src/domains/analysis/occurrences.dart
+++ b/pkg/analysis_server/lib/src/domains/analysis/occurrences.dart
@@ -9,7 +9,7 @@
  * A concrete implementation of [OccurrencesCollector].
  */
 class OccurrencesCollectorImpl implements OccurrencesCollector {
-  Map<protocol.Element, protocol.Occurrences> elementOccurrences =
+  final Map<protocol.Element, protocol.Occurrences> elementOccurrences =
       <protocol.Element, protocol.Occurrences>{};
 
   List<protocol.Occurrences> get allOccurrences {
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 2857e67..e80dadc 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -593,11 +593,13 @@
     List<RefactoringKind> kinds = <RefactoringKind>[];
     // Check nodes.
     {
-      var unit = await server.getResolvedCompilationUnit(file);
-      var analysisSession = server.getAnalysisDriver(file)?.currentSession;
-      if (unit != null && analysisSession != null) {
+      var analysisResult = await server.getAnalysisResult(file);
+      if (analysisResult != null) {
+        // TODO(scheglov) Update other refactorings to use ResolveResult.
+        var unit = analysisResult.unit;
         // Try EXTRACT_LOCAL_VARIABLE.
-        if (new ExtractLocalRefactoring(unit, offset, length).isAvailable()) {
+        if (new ExtractLocalRefactoring(analysisResult, offset, length)
+            .isAvailable()) {
           kinds.add(RefactoringKind.EXTRACT_LOCAL_VARIABLE);
         }
         // Try EXTRACT_METHOD.
@@ -608,7 +610,7 @@
         }
         // Try EXTRACT_WIDGETS.
         if (new ExtractWidgetRefactoring(
-                searchEngine, analysisSession, unit, offset, length)
+                searchEngine, analysisResult.session, unit, offset, length)
             .isAvailable()) {
           kinds.add(RefactoringKind.EXTRACT_WIDGET);
         }
@@ -939,9 +941,10 @@
       }
     }
     if (kind == RefactoringKind.EXTRACT_LOCAL_VARIABLE) {
-      CompilationUnit unit = await server.getResolvedCompilationUnit(file);
-      if (unit != null) {
-        refactoring = new ExtractLocalRefactoring(unit, offset, length);
+      var analysisResult = await server.getAnalysisResult(file);
+      if (analysisResult != null) {
+        refactoring =
+            new ExtractLocalRefactoring(analysisResult, offset, length);
         feedback = new ExtractLocalVariableFeedback(
             <String>[], <int>[], <int>[],
             coveringExpressionOffsets: <int>[],
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart b/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
index 6a96170..996f97a 100644
--- a/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
+++ b/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
@@ -35,7 +35,7 @@
   /**
    * A table mapping analysis drivers to information related to the driver.
    */
-  Map<AnalysisDriver, _DriverInfo> _driverInfo =
+  final Map<AnalysisDriver, _DriverInfo> _driverInfo =
       <AnalysisDriver, _DriverInfo>{};
 
   /**
diff --git a/pkg/analysis_server/lib/src/search/type_hierarchy.dart b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
index 40b71ad..65eee55 100644
--- a/pkg/analysis_server/lib/src/search/type_hierarchy.dart
+++ b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
@@ -18,7 +18,7 @@
 class TypeHierarchyComputer {
   final SearchEngine _searchEngine;
 
-  Element _pivotElement;
+  final Element _pivotElement;
   LibraryElement _pivotLibrary;
   ElementKind _pivotKind;
   String _pivotName;
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index af6e262..d452c44 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -263,6 +263,11 @@
   static const String USE_CFE = "use-cfe";
 
   /**
+   * Whether to enable parsing via the Fasta parser.
+   */
+  static const String USE_FASTA_PARSER = "use-fasta-parser";
+
+  /**
    * The instrumentation server that is to be used by the analysis server.
    */
   InstrumentationServer instrumentationServer;
@@ -313,6 +318,7 @@
       analysisServerOptions.previewDart2 = true;
     }
     analysisServerOptions.useCFE = results[USE_CFE];
+    analysisServerOptions.useFastaParser = results[USE_FASTA_PARSER];
 
     telemetry.Analytics analytics = telemetry.createAnalyticsInstance(
         'UA-26406144-29', 'analysis-server',
@@ -537,6 +543,8 @@
     parser.addFlag(PREVIEW_DART2, help: "Enable the Dart 2.0 preview");
     parser.addFlag(USE_CFE,
         help: "Enable the Dart 2.0 Common Front End implementation");
+    parser.addFlag(USE_FASTA_PARSER,
+        help: "Whether to enable parsing via the Fasta parser");
 
     return parser;
   }
diff --git a/pkg/analysis_server/lib/src/server/http_server.dart b/pkg/analysis_server/lib/src/server/http_server.dart
index 6acfe4e..c5cff7d 100644
--- a/pkg/analysis_server/lib/src/server/http_server.dart
+++ b/pkg/analysis_server/lib/src/server/http_server.dart
@@ -29,8 +29,8 @@
   @override
   void handleGetRequest(HttpRequest request) {
     HttpResponse response = request.response;
-    response.statusCode = HttpStatus.NOT_FOUND;
-    response.headers.contentType = ContentType.TEXT;
+    response.statusCode = HttpStatus.notFound;
+    response.headers.contentType = ContentType.text;
     response.write(message);
     response.close();
   }
@@ -146,7 +146,7 @@
     httpServer.listen((HttpRequest request) async {
       // TODO(brianwilkerson) Determine whether this await is necessary.
       await null;
-      List<String> updateValues = request.headers[HttpHeaders.UPGRADE];
+      List<String> updateValues = request.headers[HttpHeaders.upgradeHeader];
       if (request.method == 'GET') {
         await _handleGetRequest(request);
       } else if (updateValues != null &&
@@ -154,8 +154,8 @@
         // We no longer support serving analysis server communications over
         // WebSocket connections.
         HttpResponse response = request.response;
-        response.statusCode = HttpStatus.NOT_FOUND;
-        response.headers.contentType = ContentType.TEXT;
+        response.statusCode = HttpStatus.notFound;
+        response.headers.contentType = ContentType.text;
         response.write(
             'WebSocket connections not supported (${request.uri.path}).');
         response.close();
@@ -171,8 +171,8 @@
    */
   void _returnUnknownRequest(HttpRequest request) {
     HttpResponse response = request.response;
-    response.statusCode = HttpStatus.NOT_FOUND;
-    response.headers.contentType = ContentType.TEXT;
+    response.statusCode = HttpStatus.notFound;
+    response.headers.contentType = ContentType.text;
     response.write('Not found');
     response.close();
   }
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 c47f71a..7a97f72 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -481,6 +481,7 @@
       await _addFix_createClass();
     }
     if (errorCode == StaticTypeWarningCode.UNDEFINED_FUNCTION) {
+      await _addFix_createClass();
       await _addFix_importLibrary_withFunction();
       await _addFix_importLibrary_withType();
       await _addFix_undefinedFunction_useSimilar();
@@ -494,6 +495,7 @@
     }
     if (errorCode == HintCode.UNDEFINED_METHOD ||
         errorCode == StaticTypeWarningCode.UNDEFINED_METHOD) {
+      await _addFix_createClass();
       await _addFix_importLibrary_withFunction();
       await _addFix_importLibrary_withType();
       await _addFix_undefinedMethod_useSimilar();
diff --git a/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart b/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
index 4199f27..49cd58e 100644
--- a/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
@@ -39,7 +39,7 @@
 class StatementAnalyzer extends SelectionAnalyzer {
   final CompilationUnit unit;
 
-  RefactoringStatus _status = new RefactoringStatus();
+  final RefactoringStatus _status = new RefactoringStatus();
 
   StatementAnalyzer(this.unit, SourceRange selection) : super(selection);
 
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index d5bd83e..247729dd 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -1399,32 +1399,6 @@
  */
 class TokenUtils {
   /**
-   * Return the first token in the list of [tokens] representing the given
-   * [keyword], or `null` if there is no such token.
-   */
-  static Token findKeywordToken(List<Token> tokens, Keyword keyword) {
-    for (Token token in tokens) {
-      if (token.keyword == keyword) {
-        return token;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * @return the first [Token] with given [TokenType], may be <code>null</code> if not
-   *         found.
-   */
-  static Token findToken(List<Token> tokens, TokenType type) {
-    for (Token token in tokens) {
-      if (token.type == type) {
-        return token;
-      }
-    }
-    return null;
-  }
-
-  /**
    * @return [Token]s of the given Dart source, not <code>null</code>, may be empty if no
    *         tokens or some exception happens.
    */
@@ -1442,13 +1416,6 @@
       return [];
     }
   }
-
-  /**
-   * @return <code>true</code> if given [Token]s contain only single [Token] with given
-   *         [TokenType].
-   */
-  static bool hasOnly(List<Token> tokens, TokenType type) =>
-      tokens.length == 1 && tokens[0].type == type;
 }
 
 class _CollectReferencedUnprefixedNames extends RecursiveAstVisitor {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
index 011ce65..bfbb2d1 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
@@ -14,6 +14,7 @@
 import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
@@ -30,11 +31,9 @@
  */
 class ExtractLocalRefactoringImpl extends RefactoringImpl
     implements ExtractLocalRefactoring {
-  final CompilationUnit unit;
+  final ResolveResult resolveResult;
   final int selectionOffset;
   final int selectionLength;
-  CompilationUnitElement unitElement;
-  String file;
   SourceRange selectionRange;
   CorrectionUtils utils;
 
@@ -55,16 +54,20 @@
   Set<String> excludedVariableNames = new Set<String>();
 
   ExtractLocalRefactoringImpl(
-      this.unit, this.selectionOffset, this.selectionLength) {
-    unitElement = unit.element;
+      this.resolveResult, this.selectionOffset, this.selectionLength) {
     selectionRange = new SourceRange(selectionOffset, selectionLength);
-    utils = new CorrectionUtils(unit);
-    file = unitElement.source.fullName;
+    utils = new CorrectionUtils(unit, buffer: resolveResult.content);
   }
 
+  String get file => resolveResult.path;
+
   @override
   String get refactoringName => 'Extract Local Variable';
 
+  CompilationUnit get unit => resolveResult.unit;
+
+  CompilationUnitElement get unitElement => unit.element;
+
   String get _declarationKeyword {
     if (_isPartOfConstantExpression(rootExpression)) {
       return "const";
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
index dc7777c..a93e45b 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
@@ -20,6 +20,7 @@
 import 'package:analysis_server/src/services/refactoring/rename_local.dart';
 import 'package:analysis_server/src/services/refactoring/rename_unit_member.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -65,11 +66,8 @@
   /**
    * Returns a new [ExtractLocalRefactoring] instance.
    */
-  factory ExtractLocalRefactoring(
-      CompilationUnit unit, int selectionOffset, int selectionLength) {
-    return new ExtractLocalRefactoringImpl(
-        unit, selectionOffset, selectionLength);
-  }
+  factory ExtractLocalRefactoring(ResolveResult resolveResult,
+      int selectionOffset, int selectionLength) = ExtractLocalRefactoringImpl;
 
   /**
    * The lengths of the expressions that cover the specified selection,
diff --git a/pkg/analysis_server/lib/src/status/pages.dart b/pkg/analysis_server/lib/src/status/pages.dart
index d13e0de..f9c7e06 100644
--- a/pkg/analysis_server/lib/src/status/pages.dart
+++ b/pkg/analysis_server/lib/src/status/pages.dart
@@ -156,22 +156,22 @@
       for (Page page in pages) {
         if (page.path == path) {
           HttpResponse response = request.response;
-          response.headers.contentType = ContentType.HTML;
+          response.headers.contentType = ContentType.html;
           response.write(await page.generate(request.uri.queryParameters));
           response.close();
           return;
         }
       }
 
-      await respond(request, createUnknownPage(path), HttpStatus.NOT_FOUND);
+      await respond(request, createUnknownPage(path), HttpStatus.notFound);
     } catch (e, st) {
       try {
         await respond(request, createExceptionPage('$e', st),
-            HttpStatus.INTERNAL_SERVER_ERROR);
+            HttpStatus.internalServerError);
       } catch (e, st) {
         HttpResponse response = request.response;
-        response.statusCode = HttpStatus.INTERNAL_SERVER_ERROR;
-        response.headers.contentType = ContentType.TEXT;
+        response.statusCode = HttpStatus.internalServerError;
+        response.headers.contentType = ContentType.text;
         response.write('$e\n\n$st');
         response.close();
       }
@@ -179,19 +179,19 @@
   }
 
   Future<Null> respond(HttpRequest request, Page page,
-      [int code = HttpStatus.OK]) async {
+      [int code = HttpStatus.ok]) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     HttpResponse response = request.response;
     response.statusCode = code;
-    response.headers.contentType = ContentType.HTML;
+    response.headers.contentType = ContentType.html;
     response.write(await page.generate(request.uri.queryParameters));
     response.close();
   }
 
   void respondRedirect(HttpRequest request, String pathFragment) {
     HttpResponse response = request.response;
-    response.statusCode = HttpStatus.MOVED_TEMPORARILY;
+    response.statusCode = HttpStatus.movedTemporarily;
     response.redirect(request.uri.resolve(pathFragment));
   }
 }
diff --git a/pkg/analysis_server/test/benchmarks_test.dart b/pkg/analysis_server/test/benchmarks_test.dart
index 165760f..355a0e9 100644
--- a/pkg/analysis_server/test/benchmarks_test.dart
+++ b/pkg/analysis_server/test/benchmarks_test.dart
@@ -48,7 +48,7 @@
       });
 
       // TODO(scheglov): Restore similar test coverage when the front-end API
-      // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
+      // allows it.  See https://github.com/dart-lang/sdk/issues/33520.
       // test('$benchmarkId-use-cfe', () {
       //   ProcessResult r = Process.runSync(
       //     Platform.resolvedExecutable,
diff --git a/pkg/analysis_server/test/integration/analysis/error_test.dart b/pkg/analysis_server/test/integration/analysis/error_test.dart
index a69de4a..f7974b4 100644
--- a/pkg/analysis_server/test/integration/analysis/error_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/error_test.dart
@@ -12,9 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisErrorIntegrationTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(AnalysisErrorIntegrationTest_UseCFE);
+    defineReflectiveTests(AnalysisErrorIntegrationTest_UseCFE);
   });
 }
 
@@ -109,14 +107,20 @@
 
   @override
   @failingTest
+  test_detect_simple_error() {
+    return super.test_detect_simple_error();
+  }
+
+  @override
+  @failingTest
   test_super_mixins_disabled() {
     // Disabling super mixins is not supported in the new FE.
     return super.test_super_mixins_disabled();
   }
 
   @override
+  @failingTest
   test_super_mixins_enabled() {
-    // This does pass with the new FE.
     return super.test_super_mixins_enabled();
   }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/get_errors_test.dart b/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
index b106bf0..981e904 100644
--- a/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
@@ -12,9 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetErrorsTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(GetErrorsTest_UseCFE);
+    defineReflectiveTests(GetErrorsTest_UseCFE);
   });
 }
 
@@ -42,4 +40,10 @@
 class GetErrorsTest_UseCFE extends GetErrorsTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_getErrors() {
+    return super.test_getErrors();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart b/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
index 08f8e52..7a10b8a 100644
--- a/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
@@ -15,9 +15,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisGetImportedElementsIntegrationTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(AnalysisGetImportedElementsIntegrationTest_UseCFE);
+    defineReflectiveTests(AnalysisGetImportedElementsIntegrationTest_UseCFE);
   });
 }
 
@@ -147,4 +145,16 @@
     extends AnalysisGetImportedElementsIntegrationTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_getImportedElements_none() {
+    return super.test_getImportedElements_none();
+  }
+
+  @failingTest
+  @override
+  test_getImportedElements_some() {
+    return super.test_getImportedElements_some();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart b/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
index a9d7bb7..96995ae 100644
--- a/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
@@ -75,4 +75,10 @@
   @override
   @failingTest
   test_navigation() => super.test_navigation();
+
+  @override
+  @failingTest
+  test_navigation_no_result() {
+    fail('This test crashes with CFE');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/lint_test.dart b/pkg/analysis_server/test/integration/analysis/lint_test.dart
index d217042..ae9649d 100644
--- a/pkg/analysis_server/test/integration/analysis/lint_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/lint_test.dart
@@ -87,4 +87,22 @@
 class LintIntegrationTest_UseCFE extends LintIntegrationTest {
   @override
   bool get useCFE => true;
+
+  @override
+  @failingTest
+  test_no_lints_when_not_specified() {
+    return super.test_no_lints_when_not_specified();
+  }
+
+  @override
+  @failingTest
+  test_simple_lint_newOptionsFile() {
+    return super.test_simple_lint_newOptionsFile();
+  }
+
+  @override
+  @failingTest
+  test_simple_lint_oldOptionsFile() {
+    return super.test_simple_lint_oldOptionsFile();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/occurrences_test.dart b/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
index 7054ac4..eeda63a 100644
--- a/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
@@ -12,9 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(OccurrencesTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(OccurrencesTest_UseCFE);
+    defineReflectiveTests(OccurrencesTest_UseCFE);
   });
 }
 
@@ -73,4 +71,10 @@
 class OccurrencesTest_UseCFE extends OccurrencesTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_occurrences() {
+    return super.test_occurrences();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/outline_test.dart b/pkg/analysis_server/test/integration/analysis/outline_test.dart
index 0952955..6192813 100644
--- a/pkg/analysis_server/test/integration/analysis/outline_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/outline_test.dart
@@ -12,9 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(OutlineTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(OutlineTest_UseCFE);
+    defineReflectiveTests(OutlineTest_UseCFE);
   });
 }
 
@@ -77,4 +75,10 @@
 class OutlineTest_UseCFE extends OutlineTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_outline() {
+    return super.test_outline();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/overrides_test.dart b/pkg/analysis_server/test/integration/analysis/overrides_test.dart
index 39c4bb4..2cfb696 100644
--- a/pkg/analysis_server/test/integration/analysis/overrides_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/overrides_test.dart
@@ -126,4 +126,10 @@
 class OverridesTest_UseCFE extends OverridesTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_overrides() {
+    return super.test_overrides();
+  }
 }
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 4411cc6..5cca2f0 100644
--- a/pkg/analysis_server/test/integration/analysis/package_root_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
@@ -13,9 +13,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetAnalysisRootsTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(SetAnalysisRootsTest_UseCFE);
+    defineReflectiveTests(SetAnalysisRootsTest_UseCFE);
   });
 }
 
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 2ee347d..0cb0424 100644
--- a/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
@@ -55,4 +55,10 @@
 class ReanalyzeTest_UseCFE extends ReanalyzeTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_reanalyze_concurrent() {
+    fail('This test crashes under the CFE');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart b/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
index 319a4a4..27a4c81 100644
--- a/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
@@ -44,4 +44,10 @@
 class ReanalyzeTest_UseCFE extends ReanalyzeTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_reanalyze() {
+    fail('This test crashes under the CFE');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart b/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
index f9ebcb0..dfbbe69 100644
--- a/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
@@ -36,4 +36,10 @@
 class SetAnalysisRootsTest_UseCFE extends SetAnalysisRootsTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_options() {
+    return super.test_options();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart b/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
index c75655b..bbd07a0 100644
--- a/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
@@ -46,4 +46,10 @@
 class SetGeneralSubscriptionsTest_UseCFE extends SetGeneralSubscriptionsTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_options() {
+    fail('This test crashes under the CFE');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart b/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
index 7d86706..64aeb6d 100644
--- a/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
@@ -34,4 +34,10 @@
 class SetPriorityFilesTest_UseCFE extends SetPriorityFilesTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_options() {
+    fail('This test crashes under the CFE');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart b/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
index 02dcd05..c1fcead 100644
--- a/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
@@ -36,4 +36,10 @@
 class SetSubscriptionsTest_UseCFE extends SetSubscriptionsTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_subscriptions() {
+    return super.test_subscriptions();
+  }
 }
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 55e1e84..2c084a5 100644
--- a/pkg/analysis_server/test/integration/analysis/update_content_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
@@ -11,9 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(UpdateContentTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(UpdateContentTest_UseCFE);
+    defineReflectiveTests(UpdateContentTest_UseCFE);
   });
 }
 
@@ -112,4 +110,16 @@
 class UpdateContentTest_UseCFE extends UpdateContentTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_updateContent() {
+    return super.test_updateContent();
+  }
+
+  @failingTest
+  @override
+  test_updateContent_multipleAdds() {
+    return super.test_updateContent_multipleAdds();
+  }
 }
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 dbdc7fa..b5087a9 100644
--- a/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
+++ b/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
@@ -12,9 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetSuggestionsTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(GetSuggestionsTest_UseCFE);
+    defineReflectiveTests(GetSuggestionsTest_UseCFE);
   });
 }
 
@@ -123,4 +121,22 @@
 class GetSuggestionsTest_UseCFE extends GetSuggestionsTest {
   @override
   bool get useCFE => true;
+
+  @override
+  @failingTest
+  test_getSuggestions() {
+    return super.test_getSuggestions();
+  }
+
+  @override
+  @failingTest
+  test_getSuggestions_onlyOverlay() {
+    return super.test_getSuggestions_onlyOverlay();
+  }
+
+  @override
+  @failingTest
+  test_getSuggestions_onlyOverlay_noWait() {
+    return super.test_getSuggestions_onlyOverlay_noWait();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart b/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart
index 0d359f6..260ab07 100644
--- a/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart
@@ -41,4 +41,10 @@
 class GetAvailableRefactoringsTest_UseCFE extends GetAvailableRefactoringsTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_has_refactorings() {
+    return super.test_has_refactorings();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/edit/get_fixes_test.dart b/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
index c0e52b7..6fd7413 100644
--- a/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
@@ -70,4 +70,10 @@
   @override
   @failingTest
   Future test_has_fixes() => super.test_has_fixes();
+
+  @failingTest
+  @override
+  test_no_fixes() {
+    fail('Test crashes with CFE');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart b/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
index 842e443..7d7faba 100644
--- a/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
@@ -12,9 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetPostfixCompletionTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(GetPostfixCompletionTest_UseCFE);
+    defineReflectiveTests(GetPostfixCompletionTest_UseCFE);
   });
 }
 
@@ -58,4 +56,10 @@
 class GetPostfixCompletionTest_UseCFE extends GetPostfixCompletionTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_postfix_completion() {
+    return super.test_postfix_completion();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/edit/import_elements_test.dart b/pkg/analysis_server/test/integration/edit/import_elements_test.dart
index da142fc..e565a1e 100644
--- a/pkg/analysis_server/test/integration/edit/import_elements_test.dart
+++ b/pkg/analysis_server/test/integration/edit/import_elements_test.dart
@@ -144,4 +144,22 @@
     extends AnalysisGetImportElementsIntegrationTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_importElements_definingUnit() {
+    return super.test_importElements_definingUnit();
+  }
+
+  @failingTest
+  @override
+  test_importElements_noEdits() {
+    return super.test_importElements_noEdits();
+  }
+
+  @failingTest
+  @override
+  test_importElements_part() {
+    return super.test_importElements_part();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart b/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart
index 02025b9..4dbf569 100644
--- a/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart
+++ b/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart
@@ -11,9 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(IsPostfixCompletionApplicableTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(IsPostfixCompletionApplicableTest_UseCFE);
+    defineReflectiveTests(IsPostfixCompletionApplicableTest_UseCFE);
   });
 }
 
@@ -48,4 +46,10 @@
     extends IsPostfixCompletionApplicableTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_is_postfix_completion_applicable() {
+    return super.test_is_postfix_completion_applicable();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart b/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart
index 6bb94c5..a9009c7 100644
--- a/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart
+++ b/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart
@@ -11,9 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ListPostfixCompletionTemplatesTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(ListPostfixCompletionTemplatesTest_UseCFE);
+    defineReflectiveTests(ListPostfixCompletionTemplatesTest_UseCFE);
   });
 }
 
@@ -48,4 +46,10 @@
     extends ListPostfixCompletionTemplatesTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_list_postfix_completion_templates() {
+    fail('Test crashes with CFE');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/edit/organize_directives_test.dart b/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
index 3a9f686..a30d913 100644
--- a/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
+++ b/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
@@ -12,9 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(OrganizeDirectivesTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(OrganizeDirectivesTest_UseCFE);
+    defineReflectiveTests(OrganizeDirectivesTest_UseCFE);
   });
 }
 
@@ -82,4 +80,22 @@
 class OrganizeDirectivesTest_UseCFE extends OrganizeDirectivesTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_organize_directives() {
+    return super.test_organize_directives();
+  }
+
+  @failingTest
+  @override
+  test_organize_directives_no_changes() {
+    return super.test_organize_directives_no_changes();
+  }
+
+  @failingTest
+  @override
+  test_organize_directives_with_errors() {
+    return super.test_organize_directives_with_errors();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/execution/delete_context_test.dart b/pkg/analysis_server/test/integration/execution/delete_context_test.dart
index 3cf0e19..07904fd 100644
--- a/pkg/analysis_server/test/integration/execution/delete_context_test.dart
+++ b/pkg/analysis_server/test/integration/execution/delete_context_test.dart
@@ -47,4 +47,10 @@
 class DeleteContextTest_UseCFE extends DeleteContextTest {
   @override
   bool get useCFE => true;
+
+  @override
+  @failingTest
+  test_delete() {
+    fail('Test crashes with CFE');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/execution/map_uri_test.dart b/pkg/analysis_server/test/integration/execution/map_uri_test.dart
index 9990a23..d0c886c 100644
--- a/pkg/analysis_server/test/integration/execution/map_uri_test.dart
+++ b/pkg/analysis_server/test/integration/execution/map_uri_test.dart
@@ -44,4 +44,10 @@
 class MapUriTest_UseCFE extends MapUriTest {
   @override
   bool get useCFE => true;
+
+  @override
+  @failingTest
+  test_mapUri() {
+    fail('Test crashes with CFE');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart b/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
index 823ac4d..234fd49 100644
--- a/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
+++ b/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
@@ -43,4 +43,10 @@
 class GetKytheEntriesTest_UseCFE extends GetKytheEntriesTest {
   @override
   bool get useCFE => true;
+
+  @override
+  @failingTest
+  test_getKytheEntries() {
+    return super.test_getKytheEntries();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/search/find_element_references_test.dart b/pkg/analysis_server/test/integration/search/find_element_references_test.dart
index 3b7e1a0..4f1cdd7 100644
--- a/pkg/analysis_server/test/integration/search/find_element_references_test.dart
+++ b/pkg/analysis_server/test/integration/search/find_element_references_test.dart
@@ -13,9 +13,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(FindElementReferencesTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(FindElementReferencesTest_UseCFE);
+    defineReflectiveTests(FindElementReferencesTest_UseCFE);
   });
 }
 
@@ -81,6 +79,12 @@
 
   @override
   @failingTest
+  test_badTarget() {
+    fail('Test times out with CFE.');
+  }
+
+  @override
+  @failingTest
   // TODO(devoncarew): 'NoSuchMethodError: The getter 'source' was called on null'
   Future test_findReferences() => new Future.error('failing test');
 }
diff --git a/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart b/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart
index 28a8828..bdab78a 100644
--- a/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart
+++ b/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart
@@ -11,9 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(FindMemberDeclarationsTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(FindMemberDeclarationsTest_UseCFE);
+    defineReflectiveTests(FindMemberDeclarationsTest_UseCFE);
   });
 }
 
@@ -57,4 +55,10 @@
 class FindMemberDeclarationsTest_UseCFE extends FindMemberDeclarationsTest {
   @override
   bool get useCFE => true;
+
+  @override
+  @failingTest
+  test_findMemberDeclarations() {
+    fail('Test times out with CFE.');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/server/status_test.dart b/pkg/analysis_server/test/integration/server/status_test.dart
index de8e9b7..231aa4f 100644
--- a/pkg/analysis_server/test/integration/server/status_test.dart
+++ b/pkg/analysis_server/test/integration/server/status_test.dart
@@ -13,9 +13,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(StatusTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(StatusTest_UseCFE);
+    defineReflectiveTests(StatusTest_UseCFE);
   });
 }
 
@@ -56,4 +54,10 @@
 class StatusTest_UseCFE extends StatusTest {
   @override
   bool get useCFE => true;
+
+  @override
+  @failingTest
+  test_status() {
+    fail('This test crashes CFE');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/support/integration_tests.dart b/pkg/analysis_server/test/integration/support/integration_tests.dart
index 97527b1..418189d 100644
--- a/pkg/analysis_server/test/integration/support/integration_tests.dart
+++ b/pkg/analysis_server/test/integration/support/integration_tests.dart
@@ -711,9 +711,6 @@
     } else if (servicesPort != null) {
       arguments.add('--enable-vm-service=$servicesPort');
     }
-    if (Platform.packageRoot != null) {
-      arguments.add('--package-root=${Platform.packageRoot}');
-    }
     if (Platform.packageConfig != null) {
       arguments.add('--packages=${Platform.packageConfig}');
     }
@@ -741,9 +738,6 @@
     if (useCFE) {
       arguments.add('--use-cfe');
     }
-    // TODO(devoncarew): We could experiment with instead launching the analysis
-    // server in a separate isolate. This would make it easier to debug the
-    // integration tests, and would likely speed up the tests as well.
     _process = await Process.start(dartBinary, arguments);
     _process.exitCode.then((int code) {
       if (code != 0) {
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index 2a4974a..9845594 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -95,11 +95,6 @@
     expect(resultCode, expected);
   }
 
-  assertNoFix(FixKind kind) async {
-    AnalysisError error = await _findErrorToFix();
-    await _assertNoFix(kind, error);
-  }
-
   assertHasFixAllFix(ErrorCode errorCode, FixKind kind, String expected,
       {String target}) async {
     AnalysisError error = await _findErrorToFixOfType(errorCode);
@@ -121,6 +116,11 @@
     expect(resultCode, expected);
   }
 
+  assertNoFix(FixKind kind) async {
+    AnalysisError error = await _findErrorToFix();
+    await _assertNoFix(kind, error);
+  }
+
   List<LinkedEditSuggestion> expectedSuggestions(
       LinkedEditSuggestionKind kind, List<String> values) {
     return values.map((value) {
@@ -139,8 +139,8 @@
   Future<Fix> _assertHasFix(FixKind kind, AnalysisError error,
       {bool hasFixAllFix: false}) async {
     if (hasFixAllFix && !kind.canBeAppliedTogether()) {
-      fail(
-          'Expected to find and return fix-all FixKind for $kind, but kind.canBeAppliedTogether is ${kind.canBeAppliedTogether}');
+      fail('Expected to find and return fix-all FixKind for $kind, '
+          'but kind.canBeAppliedTogether is ${kind.canBeAppliedTogether}');
     }
 
     // Compute the fixes for this AnalysisError
@@ -148,35 +148,39 @@
 
     // If hasFixAllFix is false, assert that none of the fixes are a fix-all fix
     if (!hasFixAllFix) {
-      for (Fix f in fixes) {
-        if (f.isFixAllFix()) {
-          fail("The boolean hasFixAllFix is false, but such a fix was found in "
-              "the computed set of fixes: $fixes, error: $error.");
+      for (Fix fix in fixes) {
+        if (fix.isFixAllFix()) {
+          fail('The boolean hasFixAllFix is false, but such a fix was found '
+              'in the computed set of fixes: $fixes, error: $error.');
         }
       }
     }
     // If hasFixAllFix is true, assert that there exists such a fix in the list
     else {
       bool foundFixAllFix = false;
-      for (Fix f in fixes) {
-        if (f.isFixAllFix()) {
+      for (Fix fix in fixes) {
+        if (fix.isFixAllFix()) {
           foundFixAllFix = true;
           break;
         }
       }
       if (!foundFixAllFix) {
-        fail("The boolean hasFixAllFix is true, but no fix-all fix was found "
-            "in the computed set of fixes: $fixes, error: $error.");
+        fail('The boolean hasFixAllFix is true, but no fix-all fix was found '
+            'in the computed set of fixes: $fixes, error: $error.');
       }
     }
 
     Fix foundFix = null;
     if (!hasFixAllFix) {
-      foundFix =
-          fixes.firstWhere((fix) => fix.kind == kind && !fix.isFixAllFix());
+      foundFix = fixes.firstWhere(
+        (fix) => fix.kind == kind && !fix.isFixAllFix(),
+        orElse: () => null,
+      );
     } else {
-      foundFix =
-          fixes.lastWhere((fix) => fix.kind == kind && fix.isFixAllFix());
+      foundFix = fixes.lastWhere(
+        (fix) => fix.kind == kind && fix.isFixAllFix(),
+        orElse: () => null,
+      );
     }
     if (foundFix == null) {
       fail('Expected to find fix $kind in\n${fixes.join('\n')}, hasFixAllFix = '
@@ -2104,6 +2108,44 @@
     _assertLinkedGroup(change.linkedEditGroups[0], ['Test v =', 'Test {']);
   }
 
+  test_createClass_instanceCreation_withoutNew_fromFunction() async {
+    await resolveTestUnit('''
+main() {
+  Test ();
+}
+''');
+    await assertHasFix(DartFixKind.CREATE_CLASS, '''
+main() {
+  Test ();
+}
+
+class Test {
+}
+''');
+    _assertLinkedGroup(change.linkedEditGroups[0], ['Test ()', 'Test {']);
+  }
+
+  test_createClass_instanceCreation_withoutNew_fromMethod() async {
+    await resolveTestUnit('''
+class A {
+  main() {
+    Test ();
+  }
+}
+''');
+    await assertHasFix(DartFixKind.CREATE_CLASS, '''
+class A {
+  main() {
+    Test ();
+  }
+}
+
+class Test {
+}
+''');
+    _assertLinkedGroup(change.linkedEditGroups[0], ['Test ()', 'Test {']);
+  }
+
   test_createClass_itemOfList() async {
     await resolveTestUnit('''
 main() {
@@ -5476,36 +5518,6 @@
 ''');
   }
 
-  test_removeUnusedImport_anotherImportOnLine() async {
-    await resolveTestUnit('''
-import 'dart:math'; import 'dart:async';
-
-main() {
-  Future f;
-}
-''');
-    await assertHasFix(DartFixKind.REMOVE_UNUSED_IMPORT, '''
-import 'dart:async';
-
-main() {
-  Future f;
-}
-''');
-  }
-
-  test_removeUnusedImport_severalLines() async {
-    await resolveTestUnit('''
-import
-  'dart:math';
-main() {
-}
-''');
-    await assertHasFix(DartFixKind.REMOVE_UNUSED_IMPORT, '''
-main() {
-}
-''');
-  }
-
   test_removeUnusedImport_all() async {
     await resolveTestUnit('''
 import 'dart:math';
@@ -5571,6 +5583,36 @@
 ''');
   }
 
+  test_removeUnusedImport_anotherImportOnLine() async {
+    await resolveTestUnit('''
+import 'dart:math'; import 'dart:async';
+
+main() {
+  Future f;
+}
+''');
+    await assertHasFix(DartFixKind.REMOVE_UNUSED_IMPORT, '''
+import 'dart:async';
+
+main() {
+  Future f;
+}
+''');
+  }
+
+  test_removeUnusedImport_severalLines() async {
+    await resolveTestUnit('''
+import
+  'dart:math';
+main() {
+}
+''');
+    await assertHasFix(DartFixKind.REMOVE_UNUSED_IMPORT, '''
+main() {
+}
+''');
+  }
+
   test_replaceVarWithDynamic() async {
     errorFilter = (AnalysisError error) {
       return error.errorCode == ParserErrorCode.VAR_AS_TYPE_NAME;
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 c6f022e..8eb5778 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
@@ -1302,7 +1302,8 @@
   }
 
   void _createRefactoring(int offset, int length) {
-    refactoring = new ExtractLocalRefactoring(testUnit, offset, length);
+    refactoring =
+        new ExtractLocalRefactoring(testAnalysisResult, offset, length);
     refactoring.name = 'res';
   }
 
diff --git a/pkg/analysis_server/test/stress/utilities/server.dart b/pkg/analysis_server/test/stress/utilities/server.dart
index 8f7f3a3..0beb104 100644
--- a/pkg/analysis_server/test/stress/utilities/server.dart
+++ b/pkg/analysis_server/test/stress/utilities/server.dart
@@ -648,9 +648,6 @@
     } else if (servicesPort != null) {
       arguments.add('--enable-vm-service=$servicesPort');
     }
-    if (Platform.packageRoot != null) {
-      arguments.add('--package-root=${Platform.packageRoot}');
-    }
     if (Platform.packageConfig != null) {
       arguments.add('--packages=${Platform.packageConfig}');
     }
diff --git a/pkg/analysis_server/tool/instrumentation/server.dart b/pkg/analysis_server/tool/instrumentation/server.dart
index 64f77bb..558cac1 100644
--- a/pkg/analysis_server/tool/instrumentation/server.dart
+++ b/pkg/analysis_server/tool/instrumentation/server.dart
@@ -102,7 +102,9 @@
    */
   void serveHttp(int port) {
     _server = HttpServer.bind(InternetAddress.loopbackIPv4, port);
-    _server.then(_handleServer).catchError((_) {/* Ignore errors. */});
+    _server.then(_handleServer).catchError((_) {
+      /* Ignore errors. */
+    });
   }
 
   /**
@@ -127,7 +129,7 @@
       return;
     } catch (exception, stackTrace) {
       HttpResponse response = request.response;
-      response.statusCode = HttpStatus.OK;
+      response.statusCode = HttpStatus.ok;
       response.headers.contentType = _htmlContent;
       StringBuffer buffer = new StringBuffer();
       buffer.write('<p><b>Exception while composing page:</b></p>');
@@ -141,7 +143,7 @@
     }
 
     HttpResponse response = request.response;
-    response.statusCode = HttpStatus.OK;
+    response.statusCode = HttpStatus.ok;
     response.headers.contentType = _htmlContent;
     response.write(buffer.toString());
     response.close();
@@ -176,11 +178,11 @@
    */
   void _returnUnknownRequest(HttpRequest request) {
     HttpResponse response = request.response;
-    response.statusCode = HttpStatus.NOT_FOUND;
+    response.statusCode = HttpStatus.notFound;
     response.headers.contentType =
         new ContentType("text", "html", charset: "utf-8");
-    response.write(
-        '<html><head></head><body><h3>Page not found: "${request.uri.path}".</h3></body></html>');
+    response.write('<html><head></head><body><h3>Page not found: "${request.uri
+            .path}".</h3></body></html>');
     response.close();
   }
 
diff --git a/pkg/analyzer/lib/dart/analysis/analysis_context_collection.dart b/pkg/analyzer/lib/dart/analysis/analysis_context_collection.dart
new file mode 100644
index 0000000..bc5e6c5
--- /dev/null
+++ b/pkg/analyzer/lib/dart/analysis/analysis_context_collection.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/analysis/analysis_context.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
+import 'package:meta/meta.dart';
+
+/// A collection of analysis contexts.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class AnalysisContextCollection {
+  /// Initialize a newly created collection of analysis contexts that can
+  /// analyze the files that are included by the list of [includedPaths].
+  ///
+  /// All paths must be absolute and normalized.
+  ///
+  /// If a [resourceProvider] is given, then it will be used to access the file
+  /// system, otherwise the default resource provider will be used.
+  factory AnalysisContextCollection({
+    @required List<String> includedPaths,
+    ResourceProvider resourceProvider,
+  }) = AnalysisContextCollectionImpl;
+
+  /// Return the existing [AnalysisContext] that should be used to analyze
+  /// the given [path], or throw [StateError] if the [path] is not analyzed
+  /// in any of the created analysis contexts.
+  AnalysisContext contextFor(String path);
+}
diff --git a/pkg/analyzer/lib/file_system/overlay_file_system.dart b/pkg/analyzer/lib/file_system/overlay_file_system.dart
new file mode 100644
index 0000000..666e5722
--- /dev/null
+++ b/pkg/analyzer/lib/file_system/overlay_file_system.dart
@@ -0,0 +1,422 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. 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:core';
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/source/source_resource.dart';
+import 'package:meta/meta.dart';
+import 'package:path/path.dart' as pathos;
+import 'package:watcher/watcher.dart';
+
+/**
+ * A resource provider that allows clients to overlay the file system provided
+ * by a base resource provider. These overlays allow both the contents and
+ * modification stamps of files to be different than what the base resource
+ * provider would report.
+ *
+ * This provider does not report watch events when overlays are added, modified
+ * or removed.
+ */
+class OverlayResourceProvider implements ResourceProvider {
+  /**
+   * The underlying resource provider used to access files and folders that
+   * do not have an overlay.
+   */
+  final ResourceProvider baseProvider;
+
+  /**
+   * A map from the paths of files for which there is an overlay to the contents
+   * of the files.
+   */
+  final Map<String, String> _overlayContent = <String, String>{};
+
+  /**
+   * A map from the paths of files for which there is an overlay to the
+   * modification stamps of the files.
+   */
+  final Map<String, int> _overlayModificationStamps = <String, int>{};
+
+  /**
+   * Initialize a newly created resource provider to represent an overlay on the
+   * given [baseProvider].
+   */
+  OverlayResourceProvider(this.baseProvider);
+
+  @override
+  pathos.Context get pathContext => baseProvider.pathContext;
+
+  @override
+  File getFile(String path) =>
+      new _OverlayFile(this, baseProvider.getFile(path));
+
+  @override
+  Folder getFolder(String path) =>
+      new _OverlayFolder(this, baseProvider.getFolder(path));
+
+  @override
+  Future<List<int>> getModificationTimes(List<Source> sources) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
+    return sources.map((source) {
+      String path = source.fullName;
+      return _overlayModificationStamps[path] ??
+          baseProvider.getFile(path).modificationStamp;
+    }).toList();
+  }
+
+  @override
+  Resource getResource(String path) {
+    return new _OverlayResource._from(this, baseProvider.getResource(path));
+  }
+
+  @override
+  Folder getStateLocation(String pluginId) =>
+      new _OverlayFolder(this, baseProvider.getStateLocation(pluginId));
+
+  /**
+   * Remove any overlay of the file at the given [path]. The state of the file
+   * in the base resource provider will not be affected.
+   */
+  bool removeOverlay(String path) {
+    bool hadOverlay = _overlayContent.containsKey(path);
+    _overlayContent.remove(path);
+    _overlayModificationStamps.remove(path);
+    return hadOverlay;
+  }
+
+  /**
+   * Overlay the content of the file at the given [path]. The file will appear
+   * to have the given [content] and [modificationStamp] even if the file is
+   * modified in the base resource provider.
+   */
+  void setOverlay(String path,
+      {@required String content, @required int modificationStamp}) {
+    if (content == null) {
+      throw new ArgumentError(
+          'OverlayResourceProvider.setOverlay: content cannot be null');
+    } else if (modificationStamp == null) {
+      throw new ArgumentError(
+          'OverlayResourceProvider.setOverlay: modificationStamp cannot be null');
+    }
+    _overlayContent[path] = content;
+    _overlayModificationStamps[path] = modificationStamp;
+  }
+
+  /**
+   * Copy any overlay for the file at the [oldPath] to be an overlay for the
+   * file with the [newPath].
+   */
+  void _copyOverlay(String oldPath, String newPath) {
+    if (_hasOverlay(oldPath)) {
+      _overlayContent[newPath] = _overlayContent[oldPath];
+      _overlayModificationStamps[newPath] = _overlayModificationStamps[oldPath];
+    }
+  }
+
+  /**
+   * Return the content of the overlay of the file at the given [path], or
+   * `null` if there is no overlay for the specified file.
+   */
+  String _getOverlayContent(String path) {
+    return _overlayContent[path];
+  }
+
+  /**
+   * Return the modification stamp of the overlay of the file at the given
+   * [path], or `null` if there is no overlay for the specified file.
+   */
+  int _getOverlayModificationStamp(String path) {
+    return _overlayModificationStamps[path];
+  }
+
+  /**
+   * Return `true` if there is an overlay associated with the file at the given
+   * [path].
+   */
+  bool _hasOverlay(String path) => _overlayContent.containsKey(path);
+
+  /**
+   * Return the paths of all of the overlaid files that are immediate children
+   * of the given [folder].
+   */
+  Iterable<String> _overlaysInFolder(Folder folder) {
+    String folderPath = folder.path;
+    return _overlayContent.keys
+        .where((path) => pathContext.dirname(path) == folderPath);
+  }
+}
+
+/**
+ * A file from an [OverlayResourceProvider].
+ */
+class _OverlayFile extends _OverlayResource implements File {
+  /**
+   * Initialize a newly created file to have the given [provider] and to
+   * correspond to the given [file] from the provider's base resource provider.
+   */
+  _OverlayFile(OverlayResourceProvider provider, File file)
+      : super(provider, file);
+
+  @override
+  Stream<WatchEvent> get changes => _file.changes;
+
+  @override
+  bool get exists => _provider._hasOverlay(path) || _resource.exists;
+
+  @override
+  int get lengthSync {
+    String content = _provider._getOverlayContent(path);
+    if (content != null) {
+      return content.length;
+    }
+    return _file.lengthSync;
+  }
+
+  @override
+  int get modificationStamp {
+    int stamp = _provider._getOverlayModificationStamp(path);
+    if (stamp != null) {
+      return stamp;
+    }
+    return _file.modificationStamp;
+  }
+
+  /**
+   * Return the file from the base resource provider that corresponds to this
+   * folder.
+   */
+  File get _file => _resource as File;
+
+  @override
+  File copyTo(Folder parentFolder) {
+    String newPath = _provider.pathContext.join(parentFolder.path, shortName);
+    _provider._copyOverlay(path, newPath);
+    if (_file.exists) {
+      if (parentFolder is _OverlayFolder) {
+        return new _OverlayFile(_provider, _file.copyTo(parentFolder._folder));
+      }
+      return new _OverlayFile(_provider, _file.copyTo(parentFolder));
+    } else {
+      return new _OverlayFile(
+          _provider, _provider.baseProvider.getFile(newPath));
+    }
+  }
+
+  @override
+  Source createSource([Uri uri]) =>
+      new FileSource(this, uri ?? _provider.pathContext.toUri(path));
+
+  @override
+  void delete() {
+    bool hadOverlay = _provider.removeOverlay(path);
+    if (_resource.exists) {
+      _resource.delete();
+    } else if (!hadOverlay) {
+      throw new FileSystemException(path, 'does not exist');
+    }
+  }
+
+  @override
+  List<int> readAsBytesSync() {
+    String content = _provider._getOverlayContent(path);
+    if (content != null) {
+      return content.codeUnits;
+    }
+    return _file.readAsBytesSync();
+  }
+
+  @override
+  String readAsStringSync() {
+    String content = _provider._getOverlayContent(path);
+    if (content != null) {
+      return content;
+    }
+    return _file.readAsStringSync();
+  }
+
+  @override
+  File renameSync(String newPath) {
+    File newFile = _file.renameSync(newPath);
+    if (_provider._hasOverlay(path)) {
+      _provider.setOverlay(newPath,
+          content: _provider._getOverlayContent(path),
+          modificationStamp: _provider._getOverlayModificationStamp(path));
+      _provider.removeOverlay(path);
+    }
+    return new _OverlayFile(_provider, newFile);
+  }
+
+  @override
+  void writeAsBytesSync(List<int> bytes) {
+    writeAsStringSync(new String.fromCharCodes(bytes));
+  }
+
+  @override
+  void writeAsStringSync(String content) {
+    if (_provider._hasOverlay(path)) {
+      throw new FileSystemException(
+          path, 'Cannot write a file with an overlay');
+    }
+    _file.writeAsStringSync(content);
+  }
+}
+
+/**
+ * A folder from an [OverlayResourceProvider].
+ */
+class _OverlayFolder extends _OverlayResource implements Folder {
+  /**
+   * Initialize a newly created folder to have the given [provider] and to
+   * correspond to the given [folder] from the provider's base resource
+   * provider.
+   */
+  _OverlayFolder(OverlayResourceProvider provider, Folder folder)
+      : super(provider, folder);
+
+  @override
+  Stream<WatchEvent> get changes => _folder.changes;
+
+  @override
+  bool get exists => _resource.exists;
+
+  /**
+   * Return the folder from the base resource provider that corresponds to this
+   * folder.
+   */
+  Folder get _folder => _resource as Folder;
+
+  @override
+  String canonicalizePath(String relPath) {
+    pathos.Context context = _provider.pathContext;
+    relPath = context.normalize(relPath);
+    String childPath = context.join(path, relPath);
+    childPath = context.normalize(childPath);
+    return childPath;
+  }
+
+  @override
+  bool contains(String path) => _folder.contains(path);
+
+  @override
+  Folder copyTo(Folder parentFolder) {
+    Folder destination = parentFolder.getChildAssumingFolder(shortName);
+    destination.create();
+    for (Resource child in getChildren()) {
+      child.copyTo(destination);
+    }
+    return destination;
+  }
+
+  @override
+  void create() {
+    _folder.create();
+  }
+
+  @override
+  Resource getChild(String relPath) =>
+      new _OverlayResource._from(_provider, _folder.getChild(relPath));
+
+  @override
+  File getChildAssumingFile(String relPath) =>
+      new _OverlayFile(_provider, _folder.getChildAssumingFile(relPath));
+
+  @override
+  Folder getChildAssumingFolder(String relPath) =>
+      new _OverlayFolder(_provider, _folder.getChildAssumingFolder(relPath));
+
+  @override
+  List<Resource> getChildren() {
+    List<Resource> children = _folder
+        .getChildren()
+        .map((child) => new _OverlayResource._from(_provider, child))
+        .toList();
+    for (String overlayPath in _provider._overlaysInFolder(this)) {
+      children.add(_provider.getFile(overlayPath));
+    }
+    return children;
+  }
+}
+
+/**
+ * The base class for resources from an [OverlayResourceProvider].
+ */
+abstract class _OverlayResource implements Resource {
+  /**
+   * The resource provider associated with this resource.
+   */
+  final OverlayResourceProvider _provider;
+
+  /**
+   * The resource from the provider's base provider that corresponds to this
+   * resource.
+   */
+  final Resource _resource;
+
+  /**
+   * Initialize a newly created instance of a resource to have the given
+   * [_provider] and to represent the [_resource] from the provider's base
+   * resource provider.
+   */
+  _OverlayResource(this._provider, this._resource);
+
+  /**
+   * Return an instance of the subclass of this class corresponding to the given
+   * [resource] that is associated with the given [provider].
+   */
+  factory _OverlayResource._from(
+      OverlayResourceProvider provider, Resource resource) {
+    if (resource is Folder) {
+      return new _OverlayFolder(provider, resource);
+    } else if (resource is File) {
+      return new _OverlayFile(provider, resource);
+    }
+    throw new ArgumentError('Unknown resource type: ${resource.runtimeType}');
+  }
+
+  @override
+  int get hashCode => path.hashCode;
+
+  @override
+  Folder get parent {
+    Folder parent = _resource.parent;
+    if (parent == null) {
+      return null;
+    }
+    return new _OverlayFolder(_provider, parent);
+  }
+
+  @override
+  String get path => _resource.path;
+
+  @override
+  String get shortName => _resource.shortName;
+
+  @override
+  bool operator ==(other) {
+    if (runtimeType != other.runtimeType) {
+      return false;
+    }
+    return path == other.path;
+  }
+
+  @override
+  void delete() {
+    _resource.delete();
+  }
+
+  @override
+  bool isOrContains(String path) {
+    return _resource.isOrContains(path);
+  }
+
+  @override
+  Resource resolveSymbolicLinksSync() => new _OverlayResource._from(
+      _provider, _resource.resolveSymbolicLinksSync());
+
+  @override
+  Uri toUri() => _resource.toUri();
+}
diff --git a/pkg/analyzer/lib/src/command_line/arguments.dart b/pkg/analyzer/lib/src/command_line/arguments.dart
index 263d250..a0a3140 100644
--- a/pkg/analyzer/lib/src/command_line/arguments.dart
+++ b/pkg/analyzer/lib/src/command_line/arguments.dart
@@ -27,7 +27,6 @@
 const String implicitCastsFlag = 'implicit-casts';
 const String lintsFlag = 'lints';
 const String noImplicitDynamicFlag = 'no-implicit-dynamic';
-const String packageDefaultAnalysisOptions = 'package-default-analysis-options';
 const String packageRootOption = 'package-root';
 const String packagesOption = 'packages';
 const String sdkPathOption = 'dart-sdk';
@@ -94,11 +93,6 @@
   builderOptions.defaultPackageFilePath = args[packagesOption];
   builderOptions.defaultPackagesDirectoryPath = args[packageRootOption];
   //
-  // Flags.
-  //
-  builderOptions.packageDefaultAnalysisOptions =
-      args[packageDefaultAnalysisOptions];
-  //
   // Analysis options.
   //
   AnalysisOptionsImpl defaultOptions = new AnalysisOptionsImpl();
@@ -200,17 +194,6 @@
       help: 'Define environment variables. For example, "-Dfoo=bar" defines an '
           'environment variable named "foo" whose value is "bar".',
       hide: hide);
-  parser.addFlag(packageDefaultAnalysisOptions,
-      help: 'If an analysis options file is not explicitly specified '
-          'via the "--$analysisOptionsFileOption" option\n'
-          'and an analysis options file cannot be found '
-          'in the project directory or any parent directory,\n'
-          'then look for analysis options in the following locations:\n'
-          '- $flutterAnalysisOptionsPath\n'
-          '- $bazelAnalysisOptionsPath',
-      defaultsTo: true,
-      negatable: true,
-      hide: hide);
   parser.addOption(packagesOption,
       help: 'The path to the package resolution configuration file, which '
           'supplies a mapping of package names\nto paths. This option cannot be '
diff --git a/pkg/analyzer/lib/src/context/builder.dart b/pkg/analyzer/lib/src/context/builder.dart
index e967809..e346ba6 100644
--- a/pkg/analyzer/lib/src/context/builder.dart
+++ b/pkg/analyzer/lib/src/context/builder.dart
@@ -452,28 +452,26 @@
         verbose('Exception: $e\n  when loading ${optionsFile.path}');
       }
     } else {
-      // Search for the default analysis options
-      // unless explicitly directed not to do so.
+      // Search for the default analysis options.
+      // TODO(danrubel) determine if bazel or gn project depends upon flutter
       Source source;
-      if (builderOptions.packageDefaultAnalysisOptions) {
-        // TODO(danrubel) determine if bazel or gn project depends upon flutter
-        if (workspace.hasFlutterDependency) {
-          source = sourceFactory.forUri(flutterAnalysisOptionsPath);
-        }
-        if (source == null || !source.exists()) {
-          source = sourceFactory.forUri(bazelAnalysisOptionsPath);
-        }
-        if (source != null && source.exists()) {
-          try {
-            optionMap = optionsProvider.getOptionsFromSource(source);
-            if (contextRoot != null) {
-              contextRoot.optionsFilePath = source.fullName;
-            }
-            verbose('Loaded analysis options from ${source.fullName}');
-          } catch (e) {
-            // Ignore exceptions thrown while trying to load the options file.
-            verbose('Exception: $e\n  when loading ${source.fullName}');
+      if (workspace.hasFlutterDependency) {
+        source = sourceFactory.forUri(flutterAnalysisOptionsPath);
+      }
+      if (source == null || !source.exists()) {
+        source = sourceFactory.forUri(bazelAnalysisOptionsPath);
+      }
+
+      if (source != null && source.exists()) {
+        try {
+          optionMap = optionsProvider.getOptionsFromSource(source);
+          if (contextRoot != null) {
+            contextRoot.optionsFilePath = source.fullName;
           }
+          verbose('Loaded analysis options from ${source.fullName}');
+        } catch (e) {
+          // Ignore exceptions thrown while trying to load the options file.
+          verbose('Exception: $e\n  when loading ${source.fullName}');
         }
       }
     }
@@ -693,11 +691,6 @@
   String defaultPackagesDirectoryPath;
 
   /**
-   * Allow Flutter and bazel default analysis options to be used.
-   */
-  bool packageDefaultAnalysisOptions = true;
-
-  /**
    * Initialize a newly created set of options
    */
   ContextBuilderOptions();
diff --git a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
new file mode 100644
index 0000000..428a48c
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
@@ -0,0 +1,78 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/analysis/analysis_context.dart';
+import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/dart/analysis/context_builder.dart';
+import 'package:analyzer/dart/analysis/context_locator.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:meta/meta.dart';
+
+/// An implementation of [AnalysisContextCollection].
+class AnalysisContextCollectionImpl implements AnalysisContextCollection {
+  /// The resource provider used to access the file system.
+  final ResourceProvider resourceProvider;
+
+  /// The list of analysis contexts.
+  final List<AnalysisContext> contexts = [];
+
+  /// Initialize a newly created analysis context manager.
+  AnalysisContextCollectionImpl({
+    @required List<String> includedPaths,
+    ResourceProvider resourceProvider,
+    String sdkPath,
+  }) : resourceProvider =
+            resourceProvider ?? PhysicalResourceProvider.INSTANCE {
+    _throwIfAnyNotAbsoluteNormalizedPath(includedPaths);
+    if (sdkPath != null) {
+      _throwIfNotAbsoluteNormalizedPath(sdkPath);
+    }
+
+    var contextLocator = new ContextLocator(
+      resourceProvider: this.resourceProvider,
+    );
+    var roots = contextLocator.locateRoots(includedPaths: includedPaths);
+    for (var root in roots) {
+      var contextBuilder = new ContextBuilder(
+        resourceProvider: this.resourceProvider,
+      );
+      var context = contextBuilder.createContext(
+        contextRoot: root,
+        sdkPath: sdkPath,
+      );
+      contexts.add(context);
+    }
+  }
+
+  @override
+  AnalysisContext contextFor(String path) {
+    _throwIfNotAbsoluteNormalizedPath(path);
+
+    for (var context in contexts) {
+      if (context.contextRoot.isAnalyzed(path)) {
+        return context;
+      }
+    }
+
+    throw new StateError('Unable to find the context to $path');
+  }
+
+  /// Check every element with [_throwIfNotAbsoluteNormalizedPath].
+  void _throwIfAnyNotAbsoluteNormalizedPath(List<String> paths) {
+    for (var path in paths) {
+      _throwIfNotAbsoluteNormalizedPath(path);
+    }
+  }
+
+  /// The driver supports only absolute normalized paths, this method is used
+  /// to validate any input paths to prevent errors later.
+  void _throwIfNotAbsoluteNormalizedPath(String path) {
+    var pathContext = resourceProvider.pathContext;
+    if (!pathContext.isAbsolute(path) || pathContext.normalize(path) != path) {
+      throw new ArgumentError(
+          'Only absolute normalized paths are supported: $path');
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_root.dart b/pkg/analyzer/lib/src/dart/analysis/context_root.dart
index 463b9f6..349da1b 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_root.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_root.dart
@@ -103,7 +103,7 @@
     }
     for (String excludedPath in excludedPaths) {
       if (context.isAbsolute(excludedPath)) {
-        if (context.isWithin(excludedPath, path)) {
+        if (path == excludedPath || context.isWithin(excludedPath, path)) {
           return true;
         }
       } else {
@@ -127,7 +127,7 @@
   bool _isIncluded(String path) {
     Context context = resourceProvider.pathContext;
     for (String includedPath in includedPaths) {
-      if (context.isWithin(includedPath, path)) {
+      if (path == includedPath || context.isWithin(includedPath, path)) {
         return true;
       }
     }
diff --git a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
index 8cfdda3..ff4bb12 100644
--- a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
@@ -4,6 +4,7 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/kernel_metadata.dart';
+import 'package:analyzer/src/fasta/resolution_storer.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -26,6 +27,7 @@
 import 'package:front_end/src/fasta/source/stack_listener.dart';
 import 'package:front_end/src/fasta/target_implementation.dart';
 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart';
+import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart';
 import 'package:front_end/src/fasta/uri_translator.dart';
 import 'package:front_end/src/fasta/uri_translator_impl.dart';
 import 'package:kernel/class_hierarchy.dart';
@@ -39,31 +41,7 @@
 
 /// Resolution information in a single function body.
 class CollectedResolution {
-  /// The list of local declarations stored by body builders while
-  /// compiling the library.
-  final List<TreeNode> kernelDeclarations = [];
-
-  /// The list of references to local or external stored by body builders
-  /// while compiling the library.
-  final List<Node> kernelReferences = [];
-
-  /// The list of types stored by body builders while compiling the library.
-  final List<DartType> kernelTypes = [];
-
-  /// File offsets corresponding to the declarations in [kernelDeclarations].
-  ///
-  /// These are used strictly for validation purposes.
-  final List<int> declarationOffsets = [];
-
-  /// File offsets corresponding to the objects in [kernelReferences].
-  ///
-  /// These are used strictly for validation purposes.
-  final List<int> referenceOffsets = [];
-
-  /// File offsets corresponding to the types in [kernelTypes].
-  ///
-  /// These are used strictly for validation purposes.
-  final List<int> typeOffsets = [];
+  final Map<int, ResolutionData<DartType, int, Node, int>> kernelData = {};
 }
 
 /// The compilation result for a single file.
@@ -399,7 +377,9 @@
 
   StackListener createListener(
       ModifierBuilder builder, Scope memberScope, bool isInstanceMember,
-      [Scope formalParameterScope]) {
+      [Scope formalParameterScope,
+      TypeInferenceListener<int, int, Node, int> listener]) {
+    ResolutionStorer<int, int, Node, int> storer;
     var fileResolutions = _resolutions[builder.fileUri];
     if (fileResolutions == null) {
       fileResolutions = <CollectedResolution>[];
@@ -407,8 +387,9 @@
     }
     var resolution = new CollectedResolution();
     fileResolutions.add(resolution);
+    storer = new ResolutionStorer<int, int, Node, int>(resolution.kernelData);
     return super.createListener(
-        builder, memberScope, isInstanceMember, formalParameterScope);
+        builder, memberScope, isInstanceMember, formalParameterScope, storer);
   }
 }
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index a9090d2..c58b12b 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:collection';
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -21,7 +20,6 @@
 import 'package:analyzer/src/dart/constant/utilities.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/handle.dart';
-import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/error/pending_error.dart';
 import 'package:analyzer/src/fasta/error_converter.dart';
@@ -32,7 +30,6 @@
 import 'package:analyzer/src/generated/error_verifier.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/kernel/resynthesize.dart';
 import 'package:analyzer/src/lint/linter.dart';
 import 'package:analyzer/src/lint/linter_visitor.dart';
@@ -452,10 +449,10 @@
   /// Create a new [ResolutionApplier] for the given front-end [resolution].
   /// The [context] element is used to associate synthetic elements and access
   /// type parameters from the enclosing scopes.
-  ResolutionApplier _createResolutionApplier(
-      ElementImpl context, CollectedResolution resolution) {
-    return new _ResolutionApplierContext(
-            _resynthesizer, _typeProvider, _libraryElement, resolution, context)
+  ResolutionApplier _createResolutionApplier(ElementImpl context,
+      CollectedResolution resolution, Map<int, AstNode> localDeclarations) {
+    return new _ResolutionApplierContext(_resynthesizer, _typeProvider,
+            _libraryElement, resolution, context, localDeclarations)
         .applier;
   }
 
@@ -738,24 +735,26 @@
     }
   }
 
-  void _resolveFile2(
-      FileState file, CompilationUnit unit, _ResolutionProvider resolutions) {
+  void _resolveFile2(FileState file, CompilationUnitImpl unit,
+      _ResolutionProvider resolutions) {
     CompilationUnitElement unitElement = unit.element;
     new DeclarationResolver(enableKernelDriver: true, applyKernelTypes: true)
         .resolve(unit, unitElement);
 
-    if (_libraryElement.context.analysisOptions.previewDart2) {
-      unit.accept(new AstRewriteVisitor(_context.typeSystem, _libraryElement,
-          file.source, _typeProvider, AnalysisErrorListener.NULL_LISTENER));
-    }
+    // TODO(paulberry): need to find a better way to do this.
+    // See dartbug.com/33506.
+//    if (_libraryElement.context.analysisOptions.previewDart2) {
+//      unit.accept(new AstRewriteVisitor(_context.typeSystem, _libraryElement,
+//          file.source, _typeProvider, AnalysisErrorListener.NULL_LISTENER));
+//    }
 
     for (var declaration in unit.declarations) {
       if (declaration is ClassDeclaration) {
         if (declaration.metadata.isNotEmpty) {
           var resolution = resolutions.next();
-          var applier = _createResolutionApplier(null, resolution);
+          var applier = _createResolutionApplier(
+              null, resolution, unit.localDeclarations);
           applier.applyToAnnotations(declaration);
-          applier.checkDone();
         }
         for (var member in declaration.members) {
           if (member is ConstructorDeclaration) {
@@ -774,31 +773,31 @@
               // TODO(scheglov) Add support for type parameterized redirects.
             } else {
               var resolution = resolutions.next();
-              var applier = _createResolutionApplier(context, resolution);
+              var applier = _createResolutionApplier(
+                  context, resolution, unit.localDeclarations);
               member.initializers.accept(applier);
               member.parameters.accept(applier);
               member.body.accept(applier);
               applier.applyToAnnotations(member);
-              applier.checkDone();
             }
           } else if (member is FieldDeclaration) {
             List<VariableDeclaration> fields = member.fields.variables;
             var context = fields[0].element as ElementImpl;
             var resolution = resolutions.next();
-            var applier = _createResolutionApplier(context, resolution);
+            var applier = _createResolutionApplier(
+                context, resolution, unit.localDeclarations);
             for (var field in fields.reversed) {
               field.initializer?.accept(applier);
             }
             applier.applyToAnnotations(member);
-            applier.checkDone();
           } else if (member is MethodDeclaration) {
             ExecutableElementImpl context = member.element;
             var resolution = resolutions.next();
-            var applier = _createResolutionApplier(context, resolution);
+            var applier = _createResolutionApplier(
+                context, resolution, unit.localDeclarations);
             member.parameters?.accept(applier);
             member.body.accept(applier);
             applier.applyToAnnotations(member);
-            applier.checkDone();
           } else {
             throw new StateError('(${declaration.runtimeType}) $declaration');
           }
@@ -810,11 +809,11 @@
       } else if (declaration is FunctionDeclaration) {
         var context = declaration.element as ExecutableElementImpl;
         var resolution = resolutions.next();
-        var applier = _createResolutionApplier(context, resolution);
+        var applier = _createResolutionApplier(
+            context, resolution, unit.localDeclarations);
         declaration.functionExpression.parameters?.accept(applier);
         declaration.functionExpression.body.accept(applier);
         applier.applyToAnnotations(declaration);
-        applier.checkDone();
       } else if (declaration is FunctionTypeAlias) {
         // No bodies to resolve.
       } else if (declaration is GenericTypeAlias) {
@@ -823,12 +822,12 @@
         List<VariableDeclaration> variables = declaration.variables.variables;
         var context = variables[0].element as ElementImpl;
         var resolution = resolutions.next();
-        var applier = _createResolutionApplier(context, resolution);
+        var applier = _createResolutionApplier(
+            context, resolution, unit.localDeclarations);
         for (var variable in variables.reversed) {
           variable.initializer?.accept(applier);
         }
         applier.applyToAnnotations(declaration);
-        applier.checkDone();
       } else {
         throw new StateError('(${declaration.runtimeType}) $declaration');
       }
@@ -1039,6 +1038,7 @@
   final TypeProvider typeProvider;
   final LibraryElement libraryElement;
   final CollectedResolution resolution;
+  final Map<int, AstNode> localDeclarations;
 
   @override
   ClassElement enclosingClassElement;
@@ -1046,17 +1046,15 @@
   List<ElementImpl> contextStack = [];
   ElementImpl context;
 
-  List<Element> declaredElements = [];
-  Map<kernel.TreeNode, Element> declarationToElement = new HashMap.identity();
-  Map<FunctionElementImpl, kernel.TreeNode> functionElementToDeclaration =
-      new HashMap.identity();
-  Map<ParameterElementImpl, kernel.VariableDeclaration>
-      parameterElementToDeclaration = new HashMap.identity();
-
   ResolutionApplier applier;
 
-  _ResolutionApplierContext(this.resynthesizer, this.typeProvider,
-      this.libraryElement, this.resolution, this.context) {
+  _ResolutionApplierContext(
+      this.resynthesizer,
+      this.typeProvider,
+      this.libraryElement,
+      this.resolution,
+      this.context,
+      this.localDeclarations) {
     for (Element element = context;
         element != null;
         element = element.enclosingElement) {
@@ -1066,108 +1064,30 @@
       }
     }
 
-    // Convert local declarations into elements.
-    for (var declaredNode in resolution.kernelDeclarations) {
-      translateKernelDeclaration(declaredNode);
-    }
-
     // Convert referenced nodes into elements.
-    List<Element> referencedElements = [];
-    for (var referencedNode in resolution.kernelReferences) {
-      Element element;
-      if (referencedNode is kernel.VariableDeclaration) {
-        kernel.TreeNode parent = referencedNode.parent;
-        if (parent is kernel.Statement) {
-          element = declarationToElement[referencedNode];
-        } else {
-          assert(parent is kernel.FunctionNode || parent is kernel.Catch);
-          // Might be a parameter of a local function.
-          element = declarationToElement[referencedNode];
-          // If no element, then it is a parameter of the context executable.
-          if (element == null) {
-            ExecutableElementImpl contextExecutable = context;
-            for (var parameter in contextExecutable.parameters) {
-              if (parameter.name == referencedNode.name) {
-                element = parameter;
-                break;
-              }
-            }
-          }
-        }
-        assert(element != null);
-      } else if (referencedNode is kernel.NamedNode) {
-        element = resynthesizer
-            .getElementFromCanonicalName(referencedNode.canonicalName);
-        assert(element != null);
-      } else if (referencedNode is kernel.DynamicType) {
-        element = DynamicElementImpl.instance;
-      } else if (referencedNode is kernel.FunctionType) {
-        element = resynthesizer
-            .getElementFromCanonicalName(referencedNode.typedef.canonicalName);
-        assert(element != null);
-      } else if (referencedNode is kernel.InterfaceType) {
-        element = resynthesizer.getElementFromCanonicalName(
-            referencedNode.classNode.canonicalName);
-        assert(element != null);
-      } else if (referencedNode is kernel.MemberGetterNode) {
-        if (referencedNode.member == null) {
-          element = null;
-        } else {
-          var memberElement = resynthesizer
-              .getElementFromCanonicalName(referencedNode.member.canonicalName);
-          assert(memberElement != null);
-          if (memberElement is PropertyInducingElementImpl) {
-            element = memberElement.getter;
-            assert(element != null);
-          } else {
-            element = memberElement;
-          }
-        }
-      } else if (referencedNode is kernel.MemberSetterNode) {
-        if (referencedNode.member == null) {
-          element = null;
-        } else {
-          var memberElement = resynthesizer
-              .getElementFromCanonicalName(referencedNode.member.canonicalName);
-          assert(memberElement != null);
-          if (memberElement is PropertyInducingElementImpl) {
-            element = memberElement.setter;
-            assert(element != null);
-          } else {
-            element = memberElement;
-          }
-        }
-      } else if (referencedNode is kernel.ImportPrefixNode) {
-        assert(referencedNode.name != null);
-        for (var import in libraryElement.imports) {
-          if (import.prefix?.name == referencedNode.name) {
-            element = import.prefix;
-            break;
-          }
-        }
-        assert(element != null);
-      } else if (referencedNode is kernel.NullNode) {
-        element = null;
-      } else if (referencedNode == null) {
-        // This will occur if an identifier could not be resolved, such as a
-        // reference to a member when the target has type `dynamic`.
-        element = null;
-      } else {
-        throw new UnimplementedError(
-            'Declaration: (${referencedNode.runtimeType}) $referencedNode');
-      }
-      referencedElements.add(element);
+    Map<int, kernel.ResolutionData<DartType, Element, Element, PrefixElement>>
+        convertedData = {};
+    for (var location in resolution.kernelData.keys) {
+      var data = resolution.kernelData[location];
+      convertedData[location] = new kernel.ResolutionData(
+          argumentTypes: data.argumentTypes == null
+              ? null
+              : data.argumentTypes.map(translateType).toList(),
+          combiner: _translateReference(data.combiner),
+          declaration: _translateDeclaration(data.declaration),
+          inferredType: translateType(data.inferredType),
+          invokeType: translateType(data.invokeType),
+          isExplicitCall: data.isExplicitCall,
+          isImplicitCall: data.isImplicitCall,
+          isWriteReference: data.isWriteReference,
+          literalType: translateType(data.literalType),
+          prefixInfo: _translatePrefixInfo(data.prefixInfo),
+          reference: _translateReference(data.reference,
+              isWriteReference: data.isWriteReference),
+          writeContext: translateType(data.writeContext));
     }
 
-    applier = new ValidatingResolutionApplier(
-        libraryElement,
-        this,
-        declaredElements,
-        referencedElements,
-        resolution.kernelTypes,
-        resolution.declarationOffsets,
-        resolution.referenceOffsets,
-        resolution.typeOffsets);
+    applier = new ResolutionApplier(libraryElement, this, convertedData);
   }
 
   @override
@@ -1188,28 +1108,6 @@
     // The function is the new resolution context.
     contextStack.add(context);
     context = element;
-
-    var declaration = functionElementToDeclaration[element];
-
-    // Get the declaration kernel type.
-    kernel.FunctionType kernelType;
-    if (declaration is kernel.VariableDeclaration) {
-      kernelType = declaration.type;
-    } else if (declaration is kernel.FunctionExpression) {
-      kernelType = declaration.function.functionType;
-    } else {
-      throw new StateError('(${declaration.runtimeType}) $declaration');
-    }
-
-    element.returnType = resynthesizer.getType(context, kernelType.returnType);
-
-    for (var parameter in element.parameters) {
-      ParameterElementImpl parameterImpl = parameter;
-      var kernelParameter = parameterElementToDeclaration[parameter];
-      parameterImpl.type = resynthesizer.getType(context, kernelParameter.type);
-    }
-
-    element.type = new FunctionTypeImpl(element);
   }
 
   @override
@@ -1218,43 +1116,62 @@
     context = contextStack.removeLast();
   }
 
-  /// Translate the given [declaration].
-  void translateKernelDeclaration(kernel.TreeNode declaration) {
-    if (declaration is kernel.VariableDeclaration) {
-      kernel.TreeNode functionDeclaration = declaration.parent;
-      if (functionDeclaration is kernel.FunctionDeclaration) {
-        var element =
-            new FunctionElementImpl(declaration.name, declaration.fileOffset);
-        functionElementToDeclaration[element] = declaration;
-        _addFormalParameters(element, functionDeclaration.function);
-        declaredElements.add(element);
-        declarationToElement[declaration] = element;
-      } else {
-        // TODO(scheglov) Do we need ConstLocalVariableElementImpl?
-        var element = new LocalVariableElementImpl(
-            declaration.name, declaration.fileOffset);
-        declaredElements.add(element);
-        declarationToElement[declaration] = element;
-      }
-    } else if (declaration is kernel.FunctionExpression) {
-      var element = new FunctionElementImpl('', declaration.fileOffset);
-      functionElementToDeclaration[element] = declaration;
-      _addFormalParameters(element, declaration.function);
-      declaredElements.add(element);
-      declarationToElement[declaration] = element;
+  Element _translateDeclaration(int declarationOffset) {
+    if (declarationOffset == null) return null;
+    var declaration = localDeclarations[declarationOffset];
+    Element element;
+    if (declaration is VariableDeclaration) {
+      element = declaration.element;
+    } else if (declaration is FormalParameter) {
+      element = declaration.element;
+    } else if (declaration is DeclaredSimpleIdentifier) {
+      element = declaration.staticElement;
+    } else if (declaration is FunctionDeclaration) {
+      element = declaration.element;
+    } else {
+      throw new UnimplementedError('${declaration.runtimeType}');
+    }
+    assert(element != null);
+    return element;
+  }
+
+  PrefixElement _translatePrefixInfo(int importIndex) {
+    if (importIndex == null) return null;
+    return libraryElement.imports[importIndex].prefix;
+  }
+
+  Element _translateReference(kernel.Node referencedNode,
+      {bool isWriteReference = false}) {
+    if (referencedNode == null) return null;
+    Element element;
+    if (referencedNode is kernel.NamedNode) {
+      element = resynthesizer
+          .getElementFromCanonicalName(referencedNode.canonicalName);
+    } else if (referencedNode is kernel.FunctionType) {
+      element = resynthesizer
+          .getElementFromCanonicalName(referencedNode.typedef.canonicalName);
+      assert(element != null);
+    } else if (referencedNode is kernel.InterfaceType) {
+      element = resynthesizer
+          .getElementFromCanonicalName(referencedNode.classNode.canonicalName);
+      assert(element != null);
     } else {
       throw new UnimplementedError(
-          'Declaration: (${declaration.runtimeType}) $declaration');
+          'TODO(paulberry): ${referencedNode.runtimeType}');
+    }
+    if (element is PropertyInducingElement) {
+      return isWriteReference ? element.setter : element.getter;
+    } else {
+      return element;
     }
   }
 
   @override
   DartType translateType(kernel.DartType kernelType) {
-    if (kernelType is kernel.NullType) {
-      return null;
-    } else if (kernelType is kernel.IndexAssignNullFunctionType) {
+    if (kernelType == null) {
       return null;
     } else if (kernelType is kernel.TypeArgumentsDartType) {
+      // TODO(paulberry): get rid of this case
       List<kernel.DartType> kernelTypes = kernelType.types;
       var types = new List<DartType>(kernelTypes.length);
       for (var i = 0; i < kernelTypes.length; i++) {
@@ -1265,54 +1182,6 @@
       return resynthesizer.getType(context, kernelType);
     }
   }
-
-  /// Add formal parameters defined in the [kernelFunction] to the [element].
-  void _addFormalParameters(
-      FunctionElementImpl element, kernel.FunctionNode kernelFunction) {
-    // Set type parameters.
-    {
-      var astParameters = <TypeParameterElement>[];
-      for (var kernelParameter in kernelFunction.typeParameters) {
-        var astParameter = new TypeParameterElementImpl(
-            kernelParameter.name, kernelParameter.fileOffset);
-        astParameter.type = new TypeParameterTypeImpl(astParameter);
-        // TODO(scheglov) remember mapping to set bounds later
-        astParameters.add(astParameter);
-      }
-      element.typeParameters = astParameters;
-    }
-
-    // Set formal parameters.
-    {
-      var astParameters = <ParameterElement>[];
-
-      // Add positional parameters
-      var kernelPositionalParameters = kernelFunction.positionalParameters;
-      for (var i = 0; i < kernelPositionalParameters.length; i++) {
-        var kernelParameter = kernelPositionalParameters[i];
-        var astParameter = new ParameterElementImpl(
-            kernelParameter.name, kernelParameter.fileOffset);
-        astParameter.parameterKind = i < kernelFunction.requiredParameterCount
-            ? ParameterKind.REQUIRED
-            : ParameterKind.POSITIONAL;
-        astParameters.add(astParameter);
-        declarationToElement[kernelParameter] = astParameter;
-        parameterElementToDeclaration[astParameter] = kernelParameter;
-      }
-
-      // Add named parameters.
-      for (var kernelParameter in kernelFunction.namedParameters) {
-        var astParameter = new ParameterElementImpl(
-            kernelParameter.name, kernelParameter.fileOffset);
-        astParameter.parameterKind = ParameterKind.NAMED;
-        astParameters.add(astParameter);
-        declarationToElement[kernelParameter] = astParameter;
-        parameterElementToDeclaration[astParameter] = kernelParameter;
-      }
-
-      element.parameters = astParameters;
-    }
-  }
 }
 
 /// [Iterator] like object that provides [CollectedResolution]s.
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index 59dcb83..e017334 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -767,12 +767,13 @@
  * Container that keeps track of file owners.
  */
 class SearchedFiles {
-  final Map<String, Search> owners = {};
+  final Map<Uri, Search> owners = {};
 
   bool add(String path, Search search) {
-    var owner = owners[path];
+    var file = search._driver.fsState.getFileForPath(path);
+    var owner = owners[file.uri];
     if (owner == null) {
-      owners[path] = search;
+      owners[file.uri] = search;
       return true;
     }
     return identical(owner, search);
@@ -780,7 +781,7 @@
 
   void ownAdded(Search search) {
     for (var path in search._driver.addedFiles) {
-      owners[path] = search;
+      add(path, search);
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 265a55c..457bb8e 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -2424,6 +2424,8 @@
   @override
   LineInfo lineInfo;
 
+  Map<int, AstNode> localDeclarations;
+
   /**
    * Initialize a newly created compilation unit to have the given directives
    * and declarations. The [scriptTag] can be `null` if there is no script tag
diff --git a/pkg/analyzer/lib/src/dart/element/builder.dart b/pkg/analyzer/lib/src/dart/element/builder.dart
index e0101c1..8fde0c3 100644
--- a/pkg/analyzer/lib/src/dart/element/builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/builder.dart
@@ -1182,6 +1182,7 @@
     _visitChildren(holder, node);
 
     FunctionElementImpl element = new FunctionElementImpl.forNode(node.name);
+    element.type = new FunctionTypeImpl(element);
     _setCodeRange(element, node);
     setElementDocumentationComment(element, node);
     element.metadata = _createElementAnnotations(node.metadata);
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index d9d126a..8514e4f 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -1447,9 +1447,13 @@
 
   @override
   DartType flattenFutures(TypeSystem typeSystem) {
-    // Implement the case: "If T = Future<S> then flatten(T) = flatten(S)."
-    if (isDartAsyncFuture && typeArguments.isNotEmpty) {
-      return typeArguments[0].flattenFutures(typeSystem);
+    // Implement the cases:
+    //  - "If T = FutureOr<S> then flatten(T) = S."
+    //  - "If T = Future<S> then flatten(T) = S."
+    if (isDartAsyncFutureOr || isDartAsyncFuture) {
+      return typeArguments.isNotEmpty
+          ? typeArguments[0]
+          : DynamicTypeImpl.instance;
     }
 
     // Implement the case: "Otherwise if T <: Future then let S be a type
diff --git a/pkg/analyzer/lib/src/fasta/analyzer_expression_generator.dart b/pkg/analyzer/lib/src/fasta/analyzer_expression_generator.dart
index f37feab..c007f79 100644
--- a/pkg/analyzer/lib/src/fasta/analyzer_expression_generator.dart
+++ b/pkg/analyzer/lib/src/fasta/analyzer_expression_generator.dart
@@ -30,6 +30,55 @@
   Expression buildSimpleRead() => generator.buildSimpleRead();
 }
 
+class AnalyzerDelayedAssignmentGenerator extends AnalyzerExpressionGenerator
+    with fasta.DelayedAssignment<Expression, Statement, Arguments> {
+  final Token token;
+  final fasta.Generator<Expression, Statement, Arguments> generator;
+  final String assignmentOperator;
+  final Expression value;
+
+  AnalyzerDelayedAssignmentGenerator(
+      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      AstFactory astFactory,
+      this.token,
+      this.generator,
+      this.assignmentOperator,
+      this.value)
+      : super(helper, astFactory);
+
+  @override
+  Expression buildSimpleRead() => astFactory.assignmentExpression(
+      generator.buildSimpleRead(), token, value);
+
+  @override
+  Expression doInvocation(int offset, Arguments arguments) => buildSimpleRead();
+}
+
+class AnalyzerDelayedPostfixIncrementGenerator
+    extends AnalyzerExpressionGenerator
+    with fasta.DelayedPostfixIncrement<Expression, Statement, Arguments> {
+  final Token token;
+  final fasta.Generator<Expression, Statement, Arguments> generator;
+  final kernel.Name binaryOperator;
+  final kernel.Procedure interfaceTarget;
+
+  AnalyzerDelayedPostfixIncrementGenerator(
+      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      AstFactory astFactory,
+      this.token,
+      this.generator,
+      this.binaryOperator,
+      this.interfaceTarget)
+      : super(helper, astFactory);
+
+  @override
+  Expression buildSimpleRead() =>
+      astFactory.postfixExpression(generator.buildSimpleRead(), token);
+
+  @override
+  Expression doInvocation(int offset, Arguments arguments) => buildSimpleRead();
+}
+
 abstract class AnalyzerExpressionGenerator
     implements fasta.Generator<Expression, Statement, Arguments> {
   final ExpressionGeneratorHelper<Expression, Statement, Arguments> helper;
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index ce8de6c..b34a4c1 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -62,6 +62,7 @@
   ScriptTag scriptTag;
   final List<Directive> directives = <Directive>[];
   final List<CompilationUnitMember> declarations = <CompilationUnitMember>[];
+  final localDeclarations = <int, AstNode>{};
 
   @override
   final Uri uri;
@@ -206,7 +207,7 @@
 
     if (interpolationCount == 0) {
       Token token = pop();
-      String value = unescapeString(token.lexeme);
+      String value = unescapeString(token.lexeme, token, this);
       push(ast.simpleStringLiteral(token, value));
     } else {
       List<Object> parts = popTypedList(1 + interpolationCount * 2);
@@ -215,7 +216,7 @@
       Quote quote = analyzeQuote(first.lexeme);
       List<InterpolationElement> elements = <InterpolationElement>[];
       elements.add(ast.interpolationString(
-          first, unescapeFirstStringPart(first.lexeme, quote)));
+          first, unescapeFirstStringPart(first.lexeme, quote, first, this)));
       for (int i = 1; i < parts.length - 1; i++) {
         var part = parts[i];
         if (part is Token) {
@@ -228,7 +229,7 @@
         }
       }
       elements.add(ast.interpolationString(
-          last, unescapeLastStringPart(last.lexeme, quote)));
+          last, unescapeLastStringPart(last.lexeme, quote, last, this)));
       push(ast.stringInterpolation(elements));
     }
   }
@@ -500,7 +501,7 @@
         identical(token.kind, HEXADECIMAL_TOKEN));
     debugEvent("LiteralInt");
 
-    push(ast.integerLiteral(token, int.parse(token.lexeme)));
+    push(ast.integerLiteral(token, int.tryParse(token.lexeme)));
   }
 
   void handleExpressionFunctionBody(Token arrowToken, Token semicolon) {
@@ -626,7 +627,15 @@
     Expression initializer = pop();
     SimpleIdentifier identifier = pop();
     // TODO(ahe): Don't push initializers, instead install them.
-    push(ast.variableDeclaration(identifier, assignmentOperator, initializer));
+    push(_makeVariableDeclaration(identifier, assignmentOperator, initializer));
+  }
+
+  VariableDeclaration _makeVariableDeclaration(
+      SimpleIdentifier name, Token equals, Expression initializer) {
+    var variableDeclaration =
+        ast.variableDeclaration(name, equals, initializer);
+    localDeclarations[name.offset] = variableDeclaration;
+    return variableDeclaration;
   }
 
   @override
@@ -668,7 +677,7 @@
     if (node is VariableDeclaration) {
       variable = node;
     } else if (node is SimpleIdentifier) {
-      variable = ast.variableDeclaration(node, null, null);
+      variable = _makeVariableDeclaration(node, null, null);
     } else {
       unhandled("${node.runtimeType}", "identifier", nameToken.charOffset, uri);
     }
@@ -1206,6 +1215,7 @@
       parameter = ast.defaultFormalParameter(node, ParameterKind.NAMED,
           defaultValue.separator, defaultValue.value);
     }
+    localDeclarations[nameToken.offset] = parameter;
     push(parameter);
   }
 
@@ -1351,9 +1361,11 @@
       List<FormalParameter> catchParameters = catchParameterList.parameters;
       if (catchParameters.length > 0) {
         exception = catchParameters[0].identifier;
+        localDeclarations[exception.offset] = exception;
       }
       if (catchParameters.length > 1) {
         stackTrace = catchParameters[1].identifier;
+        localDeclarations[stackTrace.offset] = stackTrace;
       }
     }
     push(ast.catchClause(
@@ -2011,7 +2023,7 @@
     debugEvent("NoFieldInitializer");
 
     SimpleIdentifier name = pop();
-    push(ast.variableDeclaration(name, null, null));
+    push(_makeVariableDeclaration(name, null, null));
   }
 
   @override
@@ -2088,7 +2100,7 @@
 
     Expression initializer = pop();
     SimpleIdentifier name = pop();
-    push(ast.variableDeclaration(name, assignment, initializer));
+    push(_makeVariableDeclaration(name, assignment, initializer));
   }
 
   @override
@@ -2122,8 +2134,10 @@
     List<Annotation> metadata = pop(NullValue.Metadata);
     FunctionExpression functionExpression =
         ast.functionExpression(typeParameters, parameters, body);
-    push(ast.functionDeclarationStatement(ast.functionDeclaration(
-        null, metadata, null, returnType, null, name, functionExpression)));
+    var functionDeclaration = ast.functionDeclaration(
+        null, metadata, null, returnType, null, name, functionExpression);
+    localDeclarations[name.offset] = functionDeclaration;
+    push(ast.functionDeclarationStatement(functionDeclaration));
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
index 2a7ab90..436b733 100644
--- a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
@@ -192,8 +192,8 @@
       Generator<Expression, Statement, Arguments> generator,
       Expression value,
       String assignmentOperator) {
-    // TODO(brianwilkerson) Implement this.
-    throw new UnimplementedError();
+    return new AnalyzerDelayedAssignmentGenerator(
+        helper, astFactory, token, generator, assignmentOperator, value);
   }
 
   @override
@@ -203,8 +203,8 @@
       Generator<Expression, Statement, Arguments> generator,
       kernel.Name binaryOperator,
       kernel.Procedure interfaceTarget) {
-    // TODO(brianwilkerson) Implement this.
-    throw new UnimplementedError();
+    return new AnalyzerDelayedPostfixIncrementGenerator(
+        helper, astFactory, token, generator, binaryOperator, interfaceTarget);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/fasta/error_converter.dart b/pkg/analyzer/lib/src/fasta/error_converter.dart
index acfe8432..17763f1 100644
--- a/pkg/analyzer/lib/src/fasta/error_converter.dart
+++ b/pkg/analyzer/lib/src/fasta/error_converter.dart
@@ -349,6 +349,10 @@
         errorReporter?.reportErrorForOffset(
             StrongModeCode.INVALID_CAST_NEW_EXPR, offset, length);
         return;
+      case "INVALID_CODE_POINT":
+        errorReporter?.reportErrorForOffset(
+            ParserErrorCode.INVALID_CODE_POINT, offset, length, ['\\u{...}']);
+        return;
       case "INVALID_CONSTRUCTOR_NAME":
         errorReporter?.reportErrorForOffset(
             CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, offset, length);
@@ -357,6 +361,10 @@
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.INVALID_GENERIC_FUNCTION_TYPE, offset, length);
         return;
+      case "INVALID_HEX_ESCAPE":
+        errorReporter?.reportErrorForOffset(
+            ParserErrorCode.INVALID_HEX_ESCAPE, offset, length);
+        return;
       case "INVALID_METHOD_OVERRIDE":
         errorReporter?.reportErrorForOffset(
             StrongModeCode.INVALID_METHOD_OVERRIDE, offset, length);
@@ -373,6 +381,10 @@
         _reportByCode(ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, message,
             offset, length);
         return;
+      case "INVALID_UNICODE_ESCAPE":
+        errorReporter?.reportErrorForOffset(
+            ParserErrorCode.INVALID_UNICODE_ESCAPE, offset, length);
+        return;
       case "LIBRARY_DIRECTIVE_NOT_FIRST":
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST, offset, length);
diff --git a/pkg/analyzer/lib/src/fasta/resolution_applier.dart b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
index 4d2414f..5aa09cd 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_applier.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
@@ -21,48 +21,18 @@
   final LibraryElement _enclosingLibraryElement;
   final TypeContext _typeContext;
 
-  final List<Element> _declaredElements;
-  int _declaredElementIndex = 0;
-
-  final List<Element> _referencedElements;
-  int _referencedElementIndex = 0;
-
-  final List<kernel.DartType> _types;
-  int _typeIndex = 0;
+  final Map<int, ResolutionData<DartType, Element, Element, PrefixElement>>
+      _data;
 
   /// The current label scope. Each [Block] adds a new one.
   _LabelScope _labelScope = new _LabelScope(null);
 
-  /// Indicates whether we are applying resolution to an annotation.
-  ///
-  /// When this field is `true`, [PropertyInducingElement]s should be replaced
-  /// with corresponding getters.
-  bool _inAnnotation = false;
-
-  ResolutionApplier(this._enclosingLibraryElement, this._typeContext,
-      this._declaredElements, this._referencedElements, this._types);
+  ResolutionApplier(
+      this._enclosingLibraryElement, this._typeContext, this._data);
 
   /// Apply resolution to annotations of the given [node].
   void applyToAnnotations(AnnotatedNode node) {
-    _inAnnotation = true;
     node.metadata.accept(this);
-    _inAnnotation = false;
-  }
-
-  /// Verifies that all types passed to the constructor have been applied.
-  void checkDone() {
-    if (_declaredElementIndex != _declaredElements.length) {
-      throw new StateError('Some declarations were not consumed, starting at '
-          '${_declaredElements[_declaredElementIndex]}');
-    }
-    if (_referencedElementIndex != _referencedElements.length) {
-      throw new StateError('Some references were not consumed, starting at '
-          '${_referencedElements[_referencedElementIndex]}');
-    }
-    if (_typeIndex != _types.length) {
-      throw new StateError(
-          'Some types were not consumed, starting at ${_types[_typeIndex]}');
-    }
   }
 
   @override
@@ -74,24 +44,33 @@
   @override
   void visitAnnotation(Annotation node) {
     SimpleIdentifier constructorName = node.constructorName;
+    SyntacticEntity entity;
+    if (constructorName != null) {
+      entity = constructorName;
+    } else {
+      var name = node.name;
+      if (name is PrefixedIdentifier) {
+        entity = name.identifier;
+      } else {
+        entity = name;
+      }
+    }
+    var data = _get(entity);
 
-    // Peek forward and check if the next element is a PrefixElement.
     SimpleIdentifier topEntity;
-    if (_referencedElements[_referencedElementIndex] is PrefixElement) {
+    if (data.prefixInfo != null) {
       PrefixedIdentifier prefixedIdentifier = node.name;
 
       SimpleIdentifier prefix = prefixedIdentifier.prefix;
-      PrefixElement prefixElement = _getReferenceFor(prefix);
-      _getTypeFor(prefix); // prefix type
-      prefix.staticElement = prefixElement;
+      prefix.staticElement = data.prefixInfo;
 
       topEntity = prefixedIdentifier.identifier;
     } else {
       topEntity = node.name;
     }
 
-    Element element = _getReferenceFor(topEntity);
-    DartType type = _getTypeFor(topEntity);
+    Element element = data.reference;
+    DartType type = data.inferredType;
     node.element = element;
 
     if (element is ConstructorElement) {
@@ -117,12 +96,24 @@
     }
   }
 
+  ResolutionData<DartType, Element, Element, PrefixElement> _get(
+      SyntacticEntity entity,
+      {bool failIfAbsent: true}) {
+    int entityOffset = entity.offset;
+    var data = _data[entityOffset];
+    if (failIfAbsent && data == null) {
+      throw new StateError('No data for $entity at $entityOffset');
+    }
+    return data;
+  }
+
   @override
   void visitAsExpression(AsExpression node) {
     node.expression.accept(this);
+    var data = _get(node.asOperator);
     applyToTypeAnnotation(
-        _enclosingLibraryElement, _getTypeFor(node.asOperator), node.type);
-    node.staticType = _getTypeFor(node.asOperator);
+        _enclosingLibraryElement, data.literalType, node.type);
+    node.staticType = data.inferredType;
   }
 
   @override
@@ -131,33 +122,27 @@
     node.rightHandSide.accept(this);
 
     SyntacticEntity entity = _getAssignmentEntity(node.leftHandSide);
-    node.staticElement = _getReferenceFor(entity);
-    node.staticType = _getTypeFor(entity);
+    var data = _get(entity);
+    node.staticElement = data.combiner;
+    node.staticType = data.inferredType;
   }
 
   @override
   void visitBinaryExpression(BinaryExpression node) {
     node.leftOperand.accept(this);
 
+    var data = _get(node.operator);
     TokenType operatorType = node.operator.type;
     if (operatorType != TokenType.QUESTION_QUESTION &&
         operatorType != TokenType.AMPERSAND_AMPERSAND &&
         operatorType != TokenType.BAR_BAR) {
-      node.staticElement = _getReferenceFor(node.operator);
-      _getTypeFor(node.operator); // callee type
-      _getTypeFor(node.operator); // invocation type
-      _getTypeFor(node.operator); // type arguments
+      node.staticElement = data.reference;
     }
 
     // Record the return type of the expression.
-    node.staticType = _getTypeFor(node.operator);
+    node.staticType = data.inferredType;
 
     node.rightOperand.accept(this);
-
-    // Skip the synthetic Not for `!=`.
-    if (operatorType == TokenType.BANG_EQ) {
-      _getTypeFor(null, synthetic: true);
-    }
   }
 
   @override
@@ -184,7 +169,7 @@
 
   @override
   void visitCatchClause(CatchClause node) {
-    DartType guardType = _getTypeFor(node.onKeyword ?? node.catchKeyword);
+    DartType guardType = _get(node.onKeyword ?? node.catchKeyword).literalType;
     if (node.exceptionType != null) {
       applyToTypeAnnotation(
           _enclosingLibraryElement, guardType, node.exceptionType);
@@ -192,8 +177,8 @@
 
     SimpleIdentifier exception = node.exceptionParameter;
     if (exception != null) {
-      LocalVariableElementImpl element = _getDeclarationFor(exception);
-      DartType type = _getTypeFor(exception);
+      LocalVariableElementImpl element = exception.staticElement;
+      DartType type = _get(exception).literalType;
       element.type = type;
       exception.staticElement = element;
       exception.staticType = type;
@@ -201,8 +186,8 @@
 
     SimpleIdentifier stackTrace = node.stackTraceParameter;
     if (stackTrace != null) {
-      LocalVariableElementImpl element = _getDeclarationFor(stackTrace);
-      DartType type = _getTypeFor(stackTrace);
+      LocalVariableElementImpl element = stackTrace.staticElement;
+      DartType type = _get(stackTrace).literalType;
       element.type = type;
       stackTrace.staticElement = element;
       stackTrace.staticType = type;
@@ -216,12 +201,14 @@
     node.condition.accept(this);
     node.thenExpression.accept(this);
     node.elseExpression.accept(this);
-    node.staticType = _getTypeFor(node.question);
+    node.staticType = _get(node.question).inferredType;
   }
 
   @override
   void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
-    FieldElement fieldElement = _getReferenceFor(node.equals);
+    var element = _get(node.equals).reference;
+    FieldElement fieldElement =
+        element is PropertyAccessorElement ? element.variable : null;
     node.fieldName.staticElement = fieldElement;
     node.fieldName.staticType = fieldElement.type;
 
@@ -240,7 +227,7 @@
   @override
   void visitExpression(Expression node) {
     visitNode(node);
-    node.staticType = _getTypeFor(node);
+    node.staticType = _get(node).inferredType;
   }
 
   @override
@@ -249,7 +236,7 @@
     if (loopVariable != null) {
       SimpleIdentifier identifier = loopVariable.identifier;
 
-      DartType type = _getTypeFor(identifier);
+      DartType type = _get(identifier).inferredType;
       identifier.staticType = type;
 
       if (loopVariable.type != null) {
@@ -257,15 +244,14 @@
             _enclosingLibraryElement, type, loopVariable.type);
       }
 
-      VariableElementImpl element = _getDeclarationFor(identifier);
+      VariableElementImpl element = identifier.staticElement;
       if (element != null) {
         _typeContext.encloseVariable(element);
         identifier.staticElement = element;
         element.type = type;
       }
     } else {
-      node.identifier.staticElement = _getReferenceFor(node.identifier);
-      node.identifier.staticType = _getTypeFor(node.identifier);
+      node.identifier.accept(this);
     }
     node.iterable.accept(this);
     node.body.accept(this);
@@ -275,10 +261,7 @@
   void visitFormalParameterList(FormalParameterList parameterList) {
     for (var parameter in parameterList.parameters) {
       if (parameter is DefaultFormalParameter) {
-        if (parameter.defaultValue == null) {
-          // Consume the Null type, for the implicit default value.
-          _getTypeFor(null, synthetic: true);
-        } else {
+        if (parameter.defaultValue != null) {
           parameter.defaultValue.accept(this);
         }
       }
@@ -293,13 +276,11 @@
     // Apply resolution to default values.
     parameterList.accept(this);
 
-    FunctionElementImpl element = _getDeclarationFor(node);
+    FunctionElementImpl element = node.element;
     _typeContext.enterLocalFunction(element);
 
-    if (node.returnType != null && element != null) {
-      applyToTypeAnnotation(
-          _enclosingLibraryElement, element.returnType, node.returnType);
-    }
+    functionExpression.body?.accept(this);
+    _storeFunctionType(_get(node).inferredType, element);
 
     // Associate the elements with the nodes.
     if (element != null) {
@@ -319,11 +300,12 @@
         }
       }
 
+      applyToTypeAnnotation(
+          _enclosingLibraryElement, element.returnType, node.returnType);
       applyParameters(
           _enclosingLibraryElement, element.parameters, parameterList);
     }
 
-    functionExpression.body?.accept(this);
     _typeContext.exitLocalFunction(element);
   }
 
@@ -331,9 +313,15 @@
   void visitFunctionExpression(FunctionExpression node) {
     FormalParameterList parameterList = node.parameters;
 
-    FunctionElementImpl element = _getDeclarationFor(node);
+    FunctionElementImpl element = node.element;
     _typeContext.enterLocalFunction(element);
 
+    // Apply resolution to default values.
+    parameterList.accept(this);
+
+    node.body.accept(this);
+    _storeFunctionType(_get(node).inferredType, element);
+
     // Associate the elements with the nodes.
     if (element != null) {
       node.element = element;
@@ -342,28 +330,45 @@
           _enclosingLibraryElement, element.parameters, parameterList);
     }
 
-    // Apply resolution to default values.
-    parameterList.accept(this);
-
-    node.body.accept(this);
     _typeContext.exitLocalFunction(element);
   }
 
+  void _storeFunctionType(DartType type, FunctionElementImpl element) {
+    if (type is FunctionType && element != null) {
+      element.returnType = type.returnType;
+      int normalParameterIndex = 0;
+      int optionalParameterIndex = 0;
+      for (ParameterElementImpl parameter in element.parameters) {
+        if (parameter.isNamed) {
+          parameter.type = type.namedParameterTypes[parameter.name];
+        } else if (normalParameterIndex < type.normalParameterTypes.length) {
+          parameter.type = type.normalParameterTypes[normalParameterIndex++];
+        } else if (optionalParameterIndex <
+            type.optionalParameterTypes.length) {
+          parameter.type =
+              type.optionalParameterTypes[optionalParameterIndex++];
+        }
+      }
+    }
+  }
+
   @override
   void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     node.function.accept(this);
 
-    DartType invokeType = _getTypeFor(node.argumentList);
+    var data = _get(node.argumentList);
+    DartType invokeType = data.invokeType;
     node.staticInvokeType = invokeType;
 
-    DartType typeArgumentsDartType = _getTypeFor(node.argumentList);
-    if (node.typeArguments != null &&
-        typeArgumentsDartType is TypeArgumentsDartType) {
-      _applyTypeArgumentsToList(_enclosingLibraryElement, typeArgumentsDartType,
+    List<DartType> typeArguments = data.argumentTypes;
+    if (node.typeArguments != null && typeArguments is TypeArgumentsDartType) {
+      _applyTypeArgumentsToList(
+          _enclosingLibraryElement,
+          new TypeArgumentsDartType(typeArguments),
           node.typeArguments.arguments);
     }
 
-    DartType resultType = _getTypeFor(node.argumentList);
+    DartType resultType = data.inferredType;
     node.staticType = resultType;
 
     node.argumentList.accept(this);
@@ -374,7 +379,8 @@
     node.target.accept(this);
 
     DartType targetType = node.target.staticType;
-    MethodElement element = _getReferenceFor(node.leftBracket);
+    var data = _get(node.leftBracket);
+    MethodElement element = data.reference;
 
     // Convert the raw element into a member.
     if (targetType is InterfaceType) {
@@ -382,11 +388,7 @@
       node.staticElement = member;
     }
 
-    _getTypeFor(node.leftBracket); // callee type
-    _getTypeFor(node.leftBracket); // invoke type
-    _getTypeFor(node.leftBracket); // type arguments
-
-    node.staticType = _getTypeFor(node.leftBracket);
+    node.staticType = data.inferredType;
 
     node.index.accept(this);
   }
@@ -394,19 +396,12 @@
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     ConstructorName constructorName = node.constructorName;
+    var data = _get(constructorName);
 
-    // Peek forward and check if the next element is a PrefixElement.
-    PrefixElement prefix;
-    AstNode constructorEntity = constructorName;
-    if (_referencedElements[_referencedElementIndex] is PrefixElement) {
-      PrefixedIdentifier typeIdentifier = constructorName.type.name;
-      prefix = _getReferenceFor(typeIdentifier.prefix);
-      _getTypeFor(typeIdentifier.prefix); // prefix type
-      constructorEntity = typeIdentifier.identifier;
-    }
+    PrefixElement prefix = data.prefixInfo;
 
-    ConstructorElement constructor = _getReferenceFor(constructorEntity);
-    DartType type = _getTypeFor(constructorEntity);
+    ConstructorElement constructor = data.reference;
+    DartType type = data.inferredType;
 
     applyConstructorElement(
         _enclosingLibraryElement, prefix, constructor, type, constructorName);
@@ -422,9 +417,10 @@
   @override
   void visitIsExpression(IsExpression node) {
     node.expression.accept(this);
+    var data = _get(node.isOperator);
     applyToTypeAnnotation(
-        _enclosingLibraryElement, _getTypeFor(node.isOperator), node.type);
-    node.staticType = _getTypeFor(node.isOperator);
+        _enclosingLibraryElement, data.literalType, node.type);
+    node.staticType = data.inferredType;
   }
 
   @override
@@ -439,7 +435,7 @@
   @override
   void visitListLiteral(ListLiteral node) {
     node.elements.accept(this);
-    DartType type = _getTypeFor(node.constKeyword ?? node.leftBracket);
+    DartType type = _get(node.constKeyword ?? node.leftBracket).inferredType;
     node.staticType = type;
     if (node.typeArguments != null) {
       _applyTypeArgumentsToList(
@@ -450,7 +446,7 @@
   @override
   void visitMapLiteral(MapLiteral node) {
     node.entries.accept(this);
-    DartType type = _getTypeFor(node.constKeyword ?? node.leftBracket);
+    DartType type = _get(node.constKeyword ?? node.leftBracket).inferredType;
     node.staticType = type;
     if (node.typeArguments != null) {
       _applyTypeArgumentsToList(
@@ -464,11 +460,19 @@
 
     ArgumentList argumentList = node.argumentList;
 
-    Element invokeElement = _getReferenceFor(node.methodName);
-    _getTypeFor(node.methodName); // static element type
-    DartType invokeType = _getTypeFor(argumentList);
-    DartType typeArgumentsDartType = _getTypeFor(argumentList);
-    DartType resultType = _getTypeFor(argumentList);
+    var data = _get(argumentList);
+    Element invokeElement;
+    if (data.isImplicitCall) {
+      if (node.methodName != null) {
+        node.methodName.accept(this);
+        invokeElement = node.methodName.staticElement;
+      }
+    } else {
+      invokeElement = data.reference;
+    }
+    DartType invokeType = data.invokeType;
+    List<DartType> typeArguments = data.argumentTypes;
+    DartType resultType = data.inferredType;
 
     if (invokeElement is PropertyInducingElement) {
       PropertyInducingElement property = invokeElement;
@@ -480,16 +484,19 @@
 
     if (node.methodName.name == 'call' && invokeElement == null) {
       // Don't resolve explicit call() invocation of function types.
+    } else if (_get(node.methodName, failIfAbsent: false) != null) {
+      node.methodName.accept(this);
     } else {
       node.methodName.staticElement = invokeElement;
       node.methodName.staticType = invokeType;
     }
 
     if (invokeType is FunctionType) {
-      if (node.typeArguments != null &&
-          typeArgumentsDartType is TypeArgumentsDartType) {
-        _applyTypeArgumentsToList(_enclosingLibraryElement,
-            typeArgumentsDartType, node.typeArguments.arguments);
+      if (node.typeArguments != null && typeArguments != null) {
+        _applyTypeArgumentsToList(
+            _enclosingLibraryElement,
+            new TypeArgumentsDartType(typeArguments),
+            node.typeArguments.arguments);
       }
     }
 
@@ -523,8 +530,9 @@
   void visitPostfixExpression(PostfixExpression node) {
     node.operand.accept(this);
     SyntacticEntity entity = _getAssignmentEntity(node.operand);
-    node.staticElement = _getReferenceFor(entity);
-    node.staticType = _getTypeFor(entity);
+    var data = _get(entity);
+    node.staticElement = data.combiner;
+    node.staticType = data.inferredType;
   }
 
   @override
@@ -542,20 +550,19 @@
       // ++v;
       // This is an assignment, it is associated with the operand.
       SyntacticEntity entity = _getAssignmentEntity(node.operand);
-      node.staticElement = _getReferenceFor(entity);
-      node.staticType = _getTypeFor(entity);
+      var data = _get(entity);
+      node.staticElement = data.combiner;
+      node.staticType = data.inferredType;
     } else if (tokenType == TokenType.BANG) {
       // !boolExpression;
-      node.staticType = _getTypeFor(node);
+      node.staticType = _get(node).inferredType;
     } else {
       // ~v;
       // This is a method invocation, it is associated with the operator.
       SyntacticEntity entity = node.operator;
-      node.staticElement = _getReferenceFor(entity);
-      _getTypeFor(entity); // The static function type of the operator.
-      _getTypeFor(entity); // The invoke function type of the operator.
-      _getTypeFor(entity); // The type arguments (empty).
-      node.staticType = _getTypeFor(entity);
+      var data = _get(entity);
+      node.staticElement = data.reference;
+      node.staticType = data.inferredType;
     }
   }
 
@@ -571,7 +578,7 @@
       RedirectingConstructorInvocation node) {
     SimpleIdentifier constructorName = node.constructorName;
 
-    ConstructorElement element = _getReferenceFor(constructorName ?? node);
+    ConstructorElement element = _get(constructorName ?? node).reference;
     node.staticElement = element;
     constructorName?.staticElement = element;
 
@@ -582,18 +589,24 @@
 
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
-    node.staticElement = _getReferenceFor(node);
-    super.visitSimpleIdentifier(node);
+    var data = _get(node);
+    if (data.prefixInfo != null) {
+      node.staticElement = data.prefixInfo;
+    } else if (data.declaration != null) {
+      node.staticElement = data.declaration;
+    } else if (data.reference != null) {
+      node.staticElement = data.reference;
+    } else {
+      node.staticElement = null;
+    }
+    node.staticType =
+        data.isWriteReference ? data.writeContext : data.inferredType;
   }
 
   @override
   void visitStringInterpolation(StringInterpolation node) {
     for (var element in node.elements) {
-      if (element is InterpolationString) {
-        if (element.value.isNotEmpty) {
-          _getTypeFor(element);
-        }
-      } else if (element is InterpolationExpression) {
+      if (element is InterpolationExpression) {
         element.expression.accept(this);
       }
     }
@@ -630,11 +643,6 @@
   }
 
   @override
-  void visitTypeAnnotation(TypeAnnotation node) {
-    applyToTypeAnnotation(_enclosingLibraryElement, _getTypeFor(node), node);
-  }
-
-  @override
   void visitVariableDeclaration(VariableDeclaration node) {
     AstNode parent = node.parent;
     if (parent is VariableDeclarationList &&
@@ -642,10 +650,10 @@
             parent.parent is FieldDeclaration)) {
       // Don't visit the name; resolution for it will come from the outline.
     } else {
-      DartType type = _getTypeFor(node.name);
+      DartType type = _get(node.name).inferredType;
       node.name.staticType = type;
 
-      VariableElementImpl element = _getDeclarationFor(node.name);
+      VariableElementImpl element = node.name.staticElement;
       if (element != null) {
         _typeContext.encloseVariable(element);
         node.name.staticElement = element;
@@ -703,33 +711,6 @@
     }
   }
 
-  /// Return the element associated with the declaration represented by the
-  /// given [node].
-  Element _getDeclarationFor(AstNode node) {
-    return _declaredElements[_declaredElementIndex++];
-  }
-
-  /// Return the element associated with the reference represented by the
-  /// given [entity].
-  Element _getReferenceFor(SyntacticEntity entity) {
-    Element element = _referencedElements[_referencedElementIndex++];
-    if (_inAnnotation && element is PropertyInducingElement) {
-      return element.getter;
-    }
-    return element;
-  }
-
-  /// Return the type associated with the given [entity].
-  ///
-  /// If [synthetic] is `true`, the [entity] must be `null` and the type is
-  /// an implicit type, e.g. the type of the absent default values of an
-  /// optional parameter (i.e. [Null]).
-  DartType _getTypeFor(SyntacticEntity entity, {bool synthetic: false}) {
-    assert(!synthetic || entity == null);
-    kernel.DartType kernelType = _types[_typeIndex++];
-    return _typeContext.translateType(kernelType);
-  }
-
   /// Apply resolution to named arguments of the [argumentList].
   void _resolveNamedArguments(
       ArgumentList argumentList, List<ParameterElement> parameters) {
@@ -973,107 +954,6 @@
   DartType translateType(kernel.DartType kernelType);
 }
 
-/// Visitor that applies resolution data from the front end (obtained via
-/// [ResolutionStorer]) to an analyzer AST, and also checks file offsets to
-/// verify that the types are applied to the correct subexpressions.
-class ValidatingResolutionApplier extends ResolutionApplier {
-  /// The offset that is used when the actual offset is not know.
-  /// The applier should not validate this offset.
-  static const UNKNOWN_OFFSET = -2;
-
-  /// Indicates whether debug messages should be printed.
-  static const bool _debug = false;
-
-  final List<int> _declaredElementOffsets;
-  final List<int> _referencedElementOffsets;
-  final List<int> _typeOffsets;
-
-  ValidatingResolutionApplier(
-      LibraryElement enclosingLibraryElement,
-      TypeContext typeContext,
-      List<Element> declaredElements,
-      List<Element> referencedElements,
-      List<kernel.DartType> types,
-      this._declaredElementOffsets,
-      this._referencedElementOffsets,
-      this._typeOffsets)
-      : super(enclosingLibraryElement, typeContext, declaredElements,
-            referencedElements, types);
-
-  @override
-  void checkDone() {
-    if (_declaredElementIndex != _declaredElements.length) {
-      throw new StateError('Some declarations were not consumed, starting at '
-          'offset ${_declaredElementOffsets[_declaredElementIndex]}');
-    }
-    if (_referencedElementIndex != _referencedElements.length) {
-      throw new StateError('Some references were not consumed, starting at '
-          'offset ${_referencedElementOffsets[_referencedElementIndex]}');
-    }
-    if (_typeIndex != _types.length) {
-      throw new StateError('Some types were not consumed, starting at offset '
-          '${_typeOffsets[_typeIndex]}');
-    }
-  }
-
-  @override
-  Element _getDeclarationFor(AstNode node) {
-    int nodeOffset = node.offset;
-    if (_debug) {
-      print('Getting declaration element for $node at $nodeOffset');
-    }
-    if (_declaredElementIndex >= _declaredElements.length) {
-      throw new StateError(
-          'No declaration information for $node at $nodeOffset');
-    }
-    int elementOffset = _declaredElementOffsets[_declaredElementIndex];
-    if (nodeOffset != elementOffset) {
-      throw new StateError(
-          'Expected element declaration for analyzer offset $nodeOffset; '
-          'got one for kernel offset $elementOffset');
-    }
-    return super._getDeclarationFor(node);
-  }
-
-  @override
-  Element _getReferenceFor(SyntacticEntity entity) {
-    int entityOffset = entity.offset;
-    if (_debug) {
-      print('Getting reference element for $entity at $entityOffset');
-    }
-    if (_referencedElementIndex >= _referencedElements.length) {
-      throw new StateError(
-          'No reference information for $entity at $entityOffset');
-    }
-    int elementOffset = _referencedElementOffsets[_referencedElementIndex];
-    if (elementOffset != UNKNOWN_OFFSET && entityOffset != elementOffset) {
-      throw new StateError(
-          'Expected element reference for analyzer offset $entityOffset; '
-          'got one for kernel offset $elementOffset');
-    }
-    return super._getReferenceFor(entity);
-  }
-
-  @override
-  DartType _getTypeFor(SyntacticEntity entity, {bool synthetic: false}) {
-    var entityOffset = synthetic ? -1 : entity.offset;
-    if (_debug) {
-      print('Getting type for $entity at $entityOffset');
-    }
-    if (_typeIndex >= _types.length) {
-      throw new StateError('No type information for $entity at $entityOffset');
-    }
-    int typeOffset = _typeOffsets[_typeIndex];
-    if (typeOffset != UNKNOWN_OFFSET &&
-        entity != null &&
-        entityOffset != typeOffset) {
-      throw new StateError('Expected a type for $entity at $entityOffset; '
-          'got one for kernel offset $typeOffset');
-    }
-    return super._getTypeFor(entity);
-  }
-}
-
 /// The hierarchical scope for labels.
 class _LabelScope {
   final _LabelScope parent;
diff --git a/pkg/analyzer/lib/src/fasta/resolution_storer.dart b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
index 454fc62..ebdd2cc 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_storer.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
@@ -3,679 +3,421 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/fasta/resolution_applier.dart';
-import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart';
+import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/type_algebra.dart';
 
-/// The reference to the import prefix with the [name].
-class ImportPrefixNode implements TreeNode {
-  final String name;
+class ResolutionData<Type, Declaration, Reference, PrefixInfo> {
+  final List<Type> argumentTypes;
+  final Reference combiner;
+  final Declaration declaration;
+  final Type inferredType;
+  final Type invokeType;
+  final bool isExplicitCall;
+  final bool isImplicitCall;
+  final bool isWriteReference;
+  final Type literalType;
+  final PrefixInfo prefixInfo;
+  final Reference reference;
+  final Type writeContext;
 
-  ImportPrefixNode(this.name);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  String toString() {
-    return '(prefix-$name)';
-  }
-}
-
-/// The type of [DartType] node that is used as a marker for using `null`
-/// as the [FunctionType] for index assignment.
-class IndexAssignNullFunctionType implements DartType {
-  const IndexAssignNullFunctionType();
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  String toString() {
-    return 'IndexAssignNullFunctionType';
-  }
-}
-
-/// Type inference listener that records inferred types and file offsets for
-/// later use by [ValidatingResolutionApplier].
-class InstrumentedResolutionStorer extends ResolutionStorer {
-  /// Indicates whether debug messages should be printed.
-  static const bool _debug = false;
-
-  final List<int> _declarationOffsets;
-  final List<int> _referenceOffsets;
-  final List<int> _typeOffsets;
-
-  final List<int> _deferredReferenceOffsets = [];
-  final List<int> _deferredTypeOffsets = [];
-
-  InstrumentedResolutionStorer(
-      List<TreeNode> declarations,
-      List<Node> references,
-      List<DartType> types,
-      this._declarationOffsets,
-      this._referenceOffsets,
-      this._typeOffsets)
-      : super(declarations, references, types);
-
-  @override
-  void _deferReference(int offset) {
-    super._deferReference(offset);
-    if (_debug) {
-      _deferredReferenceOffsets.add(offset);
-    }
-  }
-
-  @override
-  void _deferType(int offset) {
-    super._deferType(offset);
-    if (_debug) {
-      _deferredTypeOffsets.add(offset);
-    }
-  }
-
-  @override
-  void _recordDeclaration(TreeNode declaration, int offset) {
-    if (_debug) {
-      print('Recording declaration of $declaration for offset $offset');
-    }
-    _declarationOffsets.add(offset);
-    super._recordDeclaration(declaration, offset);
-  }
-
-  @override
-  int _recordReference(Node target, int offset) {
-    if (_debug) {
-      print('Recording reference to $target for offset $offset');
-    }
-    _referenceOffsets.add(offset);
-    return super._recordReference(target, offset);
-  }
-
-  @override
-  int _recordType(DartType type, int offset) {
-    if (_debug) {
-      print('Recording type $type for offset $offset');
-    }
-    assert(_types.length == _typeOffsets.length);
-    _typeOffsets.add(offset);
-    return super._recordType(type, offset);
-  }
-
-  @override
-  void _replaceReference(Node reference) {
-    if (_debug) {
-      int offset = _deferredReferenceOffsets.removeLast();
-      print('Replacing reference $reference for offset $offset');
-    }
-    super._replaceReference(reference);
-  }
-
-  @override
-  void _replaceType(DartType type, [int newOffset = -1]) {
-    if (newOffset != -1) {
-      _typeOffsets[_deferredTypeSlots.last] = newOffset;
-    }
-    if (_debug) {
-      if (newOffset != -1) {
-        _deferredTypeOffsets.removeLast();
-        _deferredTypeOffsets.add(newOffset);
-      }
-      int offset = _deferredTypeOffsets.removeLast();
-      print('Replacing type $type for offset $offset');
-    }
-    super._replaceType(type, newOffset);
-  }
-}
-
-/// A reference to the getter represented by the [member].
-/// The [member] might be either a getter itself, or a field.
-class MemberGetterNode implements TreeNode {
-  /// The member representing the getter, or `null` if the getter could not be
-  /// resolved.
-  final Member member;
-
-  MemberGetterNode(this.member);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  String toString() {
-    return '$member.getter';
-  }
-}
-
-/// A reference to the setter represented by the [member].
-/// The [member] might be either a setter itself, or a field.
-class MemberSetterNode implements TreeNode {
-  /// The member representing the setter, or `null` if the setter could not be
-  /// resolved.
-  final Member member;
-
-  MemberSetterNode(this.member);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  String toString() {
-    return '$member.setter';
-  }
-}
-
-/// The type of [TreeNode] node that is used as a marker for `null`.
-class NullNode implements TreeNode {
-  final String kind;
-
-  const NullNode(this.kind);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  String toString() {
-    return '(null-$kind)';
-  }
-}
-
-/// The type of [DartType] node that is used as a marker for `null`.
-///
-/// It is used for import prefix identifiers, which are resolved to elements,
-/// but don't have any types.
-class NullType implements DartType {
-  const NullType();
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  String toString() {
-    return '(null-type)';
-  }
+  ResolutionData(
+      {this.argumentTypes,
+      this.combiner,
+      this.declaration,
+      this.inferredType,
+      this.invokeType,
+      this.isExplicitCall = false,
+      this.isImplicitCall = false,
+      this.isWriteReference = false,
+      this.literalType,
+      this.prefixInfo,
+      this.reference,
+      this.writeContext});
 }
 
 /// Type inference listener that records inferred types for later use by
 /// [ResolutionApplier].
-class ResolutionStorer {
-  /// The offset that is used when the actual offset is not know.
-  /// The consumer of information should not validate this offset.
-  static const UNKNOWN_OFFSET = -2;
+class ResolutionStorer<Location, Declaration, Reference, PrefixInfo>
+    extends TypeInferenceListener<Location, Declaration, Reference,
+        PrefixInfo> {
+  final Map<Location,
+      ResolutionData<DartType, Declaration, Reference, PrefixInfo>> _data;
 
-  final List<TreeNode> _declarations;
-  final List<Node> _references;
-  final List<DartType> _types;
+  final _stack = <Function>[];
 
-  /// Indices into [_references] which need to be filled in later.
-  final _deferredReferenceSlots = <int>[];
+  ResolutionStorer(this._data);
 
-  /// Indices into [_types] which need to be filled in later.
-  final _deferredTypeSlots = <int>[];
-
-  ResolutionStorer(this._declarations, this._references, this._types);
-
-  void asExpressionExit(AsExpression expression, DartType inferredType) {
-    _recordType(expression.type, expression.fileOffset);
-    _recordType(inferredType, expression.fileOffset);
+  void _store(Location location,
+      {List<DartType> argumentTypes,
+      Reference combiner,
+      Declaration declaration,
+      DartType inferredType,
+      DartType invokeType,
+      bool isExplicitCall = false,
+      bool isImplicitCall = false,
+      bool isWriteReference = false,
+      DartType literalType,
+      PrefixInfo prefixInfo,
+      Reference reference,
+      bool replace = false,
+      DartType writeContext}) {
+    if (!replace && _data.containsKey(location)) {
+      throw new StateError('Data already stored for offset $location');
+    }
+    _data[location] = new ResolutionData(
+        argumentTypes: argumentTypes,
+        combiner: combiner,
+        declaration: declaration,
+        inferredType: inferredType,
+        invokeType: invokeType,
+        isExplicitCall: isExplicitCall,
+        isImplicitCall: isImplicitCall,
+        isWriteReference: isWriteReference,
+        literalType: literalType,
+        prefixInfo: prefixInfo,
+        reference: reference,
+        writeContext: writeContext);
   }
 
-  void cascadeExpressionExit(Let expression, DartType inferredType) {
+  void _unstore(Location location) {
+    _data.remove(location) == null;
+  }
+
+  @override
+  void asExpressionExit(Location location, DartType inferredType) {
+    _store(location, literalType: inferredType, inferredType: inferredType);
+  }
+
+  @override
+  void cascadeExpressionExit(Location location, DartType inferredType) {
     // Overridden so that the type of the expression will not be recorded. We
     // don't need to record the type because the type is always the same as the
     // type of the target, and we don't have the appropriate offset so we can't
     // correctly apply the type even if we recorded it.
   }
 
-  void catchStatementEnter(Catch node) {
-    _recordType(node.guard, node.fileOffset);
+  @override
+  void catchStatementEnter(
+      Location location,
+      DartType guardType,
+      Location exceptionLocation,
+      DartType exceptionType,
+      Location stackTraceLocation,
+      DartType stackTraceType) {
+    _store(location, literalType: guardType);
 
-    VariableDeclaration exception = node.exception;
-    if (exception != null) {
-      _recordDeclaration(exception, exception.fileOffset);
-      _recordType(exception.type, exception.fileOffset);
+    if (exceptionLocation != null) {
+      _store(exceptionLocation, literalType: exceptionType);
     }
 
-    VariableDeclaration stackTrace = node.stackTrace;
-    if (stackTrace != null) {
-      _recordDeclaration(stackTrace, stackTrace.fileOffset);
-      _recordType(stackTrace.type, stackTrace.fileOffset);
+    if (stackTraceLocation != null) {
+      _store(stackTraceLocation, literalType: stackTraceType);
     }
   }
 
-  void constructorInvocationEnter(InvocationExpression expression,
-      String prefixName, DartType typeContext) {
-    _recordImportPrefix(prefixName);
-    _deferReference(expression.fileOffset);
-    _deferType(expression.fileOffset);
+  @override
+  void constructorInvocationEnter(Location location, DartType typeContext) {
+    _push((Reference expressionTarget, DartType inferredType) {
+      // A class reference may have already been stored at this location by
+      // storeClassReference.  We want to replace it with a constructor
+      // reference.
+      _unstore(location);
+      _store(location, inferredType: inferredType, reference: expressionTarget);
+    });
   }
 
+  @override
   void constructorInvocationExit(
-      InvocationExpression expression, DartType inferredType) {
-    _replaceType(inferredType);
-    if (expression is ConstructorInvocation) {
-      _replaceReference(expression.target);
-    } else if (expression is StaticInvocation) {
-      _replaceReference(expression.target);
-    } else {
-      throw new UnimplementedError('${expression.runtimeType}');
-    }
+      Location location, Reference expressionTarget, DartType inferredType) {
+    _pop()(expressionTarget, inferredType);
   }
 
-  void fieldInitializerEnter(FieldInitializer initializer) {
-    _recordReference(initializer.field, initializer.fileOffset);
+  @override
+  void fieldInitializerEnter(Location location, Reference initializerField) {
+    _store(location, reference: initializerField);
   }
 
-  /// Verifies that all deferred work has been completed.
   void finished() {
-    assert(_deferredTypeSlots.isEmpty);
+    assert(_stack.isEmpty);
   }
 
-  void forInStatementEnter(ForInStatement statement,
-      VariableDeclaration variable, Expression write) {
-    if (variable != null) {
-      _deferType(variable.fileOffset);
-      _recordDeclaration(variable, variable.fileOffset);
-    } else {
-      if (write is VariableSet) {
-        _recordReference(write.variable, write.fileOffset);
-        _recordType(write.variable.type, write.fileOffset);
-      } else if (write is PropertySet) {
-        Field field = write.interfaceTarget;
-        _recordReference(new MemberSetterNode(field), write.fileOffset);
-        _recordType(field.type, write.fileOffset);
-      } else if (write is StaticSet) {
-        Field field = write.target;
-        _recordReference(new MemberSetterNode(field), write.fileOffset);
-        _recordType(field.type, write.fileOffset);
+  @override
+  void forInStatementEnter(
+      Location location,
+      Location variableLocation,
+      Location writeLocation,
+      DartType writeType,
+      Declaration writeVariable,
+      Reference writeTarget) {
+    _push((DartType variableType) {
+      if (variableLocation != null) {
+        _store(variableLocation, inferredType: variableType);
       } else {
-        throw new UnimplementedError('(${write.runtimeType}) $write');
+        if (writeVariable != null) {
+          _store(writeLocation,
+              declaration: writeVariable, inferredType: writeType);
+        } else {
+          _store(writeLocation,
+              reference: writeTarget,
+              isWriteReference: true,
+              writeContext: writeType);
+        }
       }
-    }
+    });
   }
 
+  @override
   void forInStatementExit(
-      ForInStatement statement, VariableDeclaration variable) {
-    if (variable != null) {
-      _replaceType(variable.type);
-    }
+      Location location, bool variablePresent, DartType variableType) {
+    _pop()(variableType);
   }
 
-  void functionDeclarationEnter(FunctionDeclaration statement) {
-    _recordDeclaration(statement.variable, statement.fileOffset);
-  }
-
-  void functionExpressionEnter(
-      FunctionExpression expression, DartType typeContext) {
-    _recordDeclaration(expression, expression.fileOffset);
-  }
-
-  void functionExpressionExit(
-      FunctionExpression expression, DartType inferredType) {
-    // We don't need to record the inferred type.
-    // It is already set in the function declaration.
-  }
-
+  @override
   void genericExpressionEnter(
-      String expressionType, Expression expression, DartType typeContext) {}
+      String expressionType, Location location, DartType typeContext) {
+    super.genericExpressionEnter(expressionType, location, typeContext);
+  }
 
+  @override
   void genericExpressionExit(
-      String expressionType, Expression expression, DartType inferredType) {
-    _recordType(inferredType, expression.fileOffset);
+      String expressionType, Location location, DartType inferredType) {
+    _store(location, inferredType: inferredType);
+    super.genericExpressionExit(expressionType, location, inferredType);
   }
 
-  void ifNullBeforeRhs(Expression expression) {
-    _deferType(expression.fileOffset);
+  @override
+  void functionDeclarationExit(Location location, FunctionType inferredType) {
+    _store(location, inferredType: inferredType);
   }
 
-  void ifNullExit(Expression expression, DartType inferredType) {
-    _replaceType(inferredType);
+  @override
+  void nullLiteralExit(
+      Location location, bool isSynthetic, DartType inferredType) {
+    if (isSynthetic) return null;
+    super.nullLiteralExit(location, isSynthetic, inferredType);
   }
 
-  void indexAssignAfterReceiver(Expression write, DartType typeContext) {
-    _deferReference(write.fileOffset);
-    _recordType(const IndexAssignNullFunctionType(), write.fileOffset);
-    _recordType(const IndexAssignNullFunctionType(), write.fileOffset);
-    _recordType(new TypeArgumentsDartType(<DartType>[]), write.fileOffset);
-    _deferType(write.fileOffset);
+  @override
+  void indexAssignExit(Location location, Reference writeMember,
+      Reference combiner, DartType inferredType) {
+    _store(location,
+        reference: writeMember, inferredType: inferredType, combiner: combiner);
   }
 
-  void indexAssignExit(Expression expression, Expression write,
-      Member writeMember, Procedure combiner, DartType inferredType) {
-    _replaceReference(writeMember);
-    _replaceType(inferredType);
-    _recordReference(
-        combiner ?? const NullNode('assign-combiner'), write.fileOffset);
-    _recordType(inferredType, write.fileOffset);
-  }
-
-  void isExpressionExit(IsExpression expression, DartType inferredType) {
-    _recordType(expression.type, expression.fileOffset);
-    _recordType(inferredType, expression.fileOffset);
+  @override
+  void isExpressionExit(
+      Location location, DartType testedType, DartType inferredType) {
+    _store(location, literalType: testedType, inferredType: inferredType);
   }
 
   void isNotExpressionExit(
-      Not expression, DartType type, DartType inferredType) {
-    _recordType(type, expression.fileOffset);
-    _recordType(inferredType, expression.fileOffset);
+      Location location, DartType type, DartType inferredType) {
+    _store(location, literalType: type, inferredType: inferredType);
   }
 
-  void logicalExpressionBeforeRhs(LogicalExpression expression) {
-    _deferType(expression.fileOffset);
-  }
-
-  void logicalExpressionExit(
-      LogicalExpression expression, DartType inferredType) {
-    _replaceType(inferredType);
-  }
-
-  void methodInvocationBeforeArgs(Expression expression, bool isImplicitCall) {
-    if (!isImplicitCall) {
-      // When the invocation target is `VariableGet`, we record the target
-      // before arguments. To ensure this order for method invocations, we
-      // first record `null`, and then replace it on exit.
-      _deferReference(expression.fileOffset);
-      _deferType(expression.fileOffset); // callee type
-    }
-    _deferType(expression.fileOffset); // invoke type
-    _deferType(expression.fileOffset); // type arguments
-    _deferType(expression.fileOffset); // result type
-  }
-
+  @override
   void methodInvocationExit(
-      Expression expression,
-      Arguments arguments,
+      Location resultOffset,
+      List<DartType> argumentsTypes,
       bool isImplicitCall,
-      Member interfaceMember,
+      Reference interfaceMember,
       FunctionType calleeType,
       Substitution substitution,
       DartType inferredType) {
-    int resultOffset = arguments.fileOffset != -1
-        ? arguments.fileOffset
-        : expression.fileOffset;
-    _replaceType(inferredType, resultOffset);
-    _replaceType(new TypeArgumentsDartType(arguments.types), resultOffset);
-
     FunctionType invokeType = substitution == null
         ? calleeType
         : substitution.substituteType(calleeType.withoutTypeParameters);
-    _replaceType(invokeType, resultOffset);
 
-    if (!isImplicitCall) {
-      interfaceMember = _getRealTarget(interfaceMember);
-      _replaceReference(interfaceMember);
-      _replaceType(const NullType()); // callee type
-    }
+    _store(resultOffset,
+        inferredType: inferredType,
+        argumentTypes: argumentsTypes,
+        invokeType: invokeType,
+        isImplicitCall: isImplicitCall,
+        reference: interfaceMember);
+
+    super.genericExpressionExit("methodInvocation", resultOffset, inferredType);
   }
 
+  @override
   void methodInvocationExitCall(
-      Expression expression,
-      Arguments arguments,
+      Location resultOffset,
+      List<DartType> argumentsTypes,
       bool isImplicitCall,
       FunctionType calleeType,
       Substitution substitution,
       DartType inferredType) {
-    int resultOffset = arguments.fileOffset != -1
-        ? arguments.fileOffset
-        : expression.fileOffset;
-    _replaceType(inferredType, resultOffset);
-    _replaceType(new TypeArgumentsDartType(arguments.types), resultOffset);
-
     FunctionType invokeType = substitution == null
         ? calleeType
         : substitution.substituteType(calleeType.withoutTypeParameters);
-    _replaceType(invokeType, resultOffset);
 
-    if (!isImplicitCall) {
-      _replaceReference(const NullNode('explicit-call'));
-      _replaceType(const NullType()); // callee type
-    }
+    _store(resultOffset,
+        inferredType: inferredType,
+        argumentTypes: argumentsTypes,
+        invokeType: invokeType,
+        isImplicitCall: isImplicitCall);
+
+    super.genericExpressionExit("methodInvocation", resultOffset, inferredType);
   }
 
-  void propertyAssignEnter(
-      Expression expression, Expression write, DartType typeContext) {
-    _deferReference(write.fileOffset);
-    _deferType(write.fileOffset);
+  @override
+  void propertyAssignExit(Location location, Reference writeMember,
+      DartType writeContext, Reference combiner, DartType inferredType) {
+    _store(location,
+        isWriteReference: true,
+        reference: writeMember,
+        writeContext: writeContext,
+        combiner: combiner,
+        inferredType: inferredType);
   }
 
-  void propertyAssignExit(
-      Expression expression,
-      Expression write,
-      Member writeMember,
-      DartType writeContext,
-      Procedure combiner,
-      DartType inferredType) {
-    writeMember = _getRealTarget(writeMember);
-    _replaceReference(new MemberSetterNode(writeMember));
-    _replaceType(writeContext);
-    _recordReference(
-        combiner ?? const NullNode('assign-combiner'), write.fileOffset);
-    _recordType(inferredType, write.fileOffset);
-  }
-
+  @override
   void propertyGetExit(
-      Expression expression, Member member, DartType inferredType) {
-    _recordReference(new MemberGetterNode(member), expression.fileOffset);
+      Location location, Reference member, DartType inferredType) {
+    _store(location, reference: member, inferredType: inferredType);
   }
 
-  void propertyGetExitCall(Expression expression, DartType inferredType) {
-    _recordReference(const NullNode('explicit-call'), expression.fileOffset);
-    _recordType(const NullType(), expression.fileOffset);
+  @override
+  void propertyGetExitCall(Location location, DartType inferredType) {
+    _store(location, isExplicitCall: true);
   }
 
-  void redirectingInitializerEnter(RedirectingInitializer initializer) {
-    _recordReference(initializer.target, initializer.fileOffset);
+  @override
+  void redirectingInitializerEnter(
+      Location location, Reference initializerTarget) {
+    _store(location, reference: initializerTarget);
   }
 
-  void staticAssignEnter(
-      Expression expression,
-      String prefixName,
-      int targetOffset,
-      Class targetClass,
-      Expression write,
-      DartType typeContext) {
-    // if there was an import prefix, record it.
-    _recordImportPrefix(prefixName);
-    // If the static target is explicit (and is a class), record it.
-    if (targetClass != null) {
-      _recordReference(targetClass, targetOffset);
-      _recordType(targetClass.rawType, targetOffset);
-    }
-
-    _deferReference(write.fileOffset);
-    _deferType(write.fileOffset);
+  @override
+  void staticAssignEnter(Location location, DartType typeContext) {
+    _push((Reference writeMember, DartType writeContext, Reference combiner,
+        DartType inferredType) {
+      _store(location,
+          reference: writeMember,
+          isWriteReference: true,
+          writeContext: writeContext,
+          combiner: combiner,
+          inferredType: inferredType);
+    });
   }
 
-  void staticAssignExit(
-      Expression expression,
-      Expression write,
-      Member writeMember,
-      DartType writeContext,
-      Procedure combiner,
-      DartType inferredType) {
-    _replaceReference(new MemberSetterNode(writeMember));
-    _replaceType(writeContext);
-    _recordReference(
-        combiner ?? const NullNode('assign-combiner'), write.fileOffset);
-    _recordType(inferredType, write.fileOffset);
+  @override
+  void staticAssignExit(Location location, Reference writeMember,
+      DartType writeContext, Reference combiner, DartType inferredType) {
+    _pop()(writeMember, writeContext, combiner, inferredType);
   }
 
-  void staticGetEnter(StaticGet expression, String prefixName, int targetOffset,
-      Class targetClass, DartType typeContext) {
-    // if there was an import prefix, record it.
-    _recordImportPrefix(prefixName);
-    // If the static target is explicit (and is a class), record it.
-    if (targetClass != null) {
-      _recordReference(targetClass, targetOffset);
-      _recordType(targetClass.rawType, targetOffset);
-    }
+  @override
+  void staticGetEnter(Location location, DartType typeContext) {
+    _push(
+        (Location location, Reference expressionTarget, DartType inferredType) {
+      _store(location, reference: expressionTarget, inferredType: inferredType);
+    });
   }
 
-  void staticGetExit(StaticGet expression, DartType inferredType) {
-    _recordReference(
-        new MemberGetterNode(expression.target), expression.fileOffset);
+  @override
+  void staticGetExit(
+      Location location, Reference expressionTarget, DartType inferredType) {
+    _pop()(location, expressionTarget, inferredType);
   }
 
-  void staticInvocationEnter(StaticInvocation expression, String prefixName,
-      int targetOffset, Class targetClass, DartType typeContext) {
-    // if there was an import prefix, record it.
-    _recordImportPrefix(prefixName);
-    // If the static target is explicit (and is a class), record it.
-    if (targetClass != null) {
-      _recordReference(targetClass, targetOffset);
-      _recordType(targetClass.rawType, targetOffset);
-    }
-    // When the invocation target is `VariableGet`, we record the target
-    // before arguments. To ensure this order for method invocations, we
-    // first record `null`, and then replace it on exit.
-    _deferReference(expression.fileOffset);
-    // We are visiting a static invocation like: f(args), and we haven't visited
-    // args yet.
-    //
-    // The analyzer AST will expect a type for f at this point.  (It can't wait
-    // until later, because for all it knows, f is a method on `this`, and
-    // methods need a type for f at this point--see comments in
-    // [methodInvocationBeforeArgs]).  But the type isn't known yet (because it
-    // may depend on type inference based on arguments).
-    //
-    // So we add a `null` to our list of types; we'll update it with the actual
-    // type later.
-    _deferType(expression.fileOffset); // callee type
-    _deferType(expression.arguments.fileOffset); // invoke type
-    _deferType(expression.arguments.fileOffset); // type arguments
-    _deferType(expression.arguments.fileOffset); // result type
+  @override
+  void staticInvocationEnter(Location location,
+      Location expressionArgumentsLocation, DartType typeContext) {
+    _push((Reference expressionTarget,
+        List<DartType> expressionArgumentsTypes,
+        FunctionType calleeType,
+        Substitution substitution,
+        DartType inferredType) {
+      FunctionType invokeType = substitution == null
+          ? calleeType
+          : substitution.substituteType(calleeType.withoutTypeParameters);
+      _store(expressionArgumentsLocation,
+          invokeType: invokeType,
+          argumentTypes: expressionArgumentsTypes,
+          reference: expressionTarget,
+          inferredType: inferredType);
+    });
   }
 
+  @override
   void staticInvocationExit(
-      StaticInvocation expression,
+      Location location,
+      Reference expressionTarget,
+      List<DartType> expressionArgumentsTypes,
       FunctionType calleeType,
       Substitution substitution,
       DartType inferredType) {
-    _replaceType(inferredType);
-    _replaceReference(expression.target);
-    _replaceType(new TypeArgumentsDartType(expression.arguments.types));
-    FunctionType invokeType = substitution == null
-        ? calleeType
-        : substitution.substituteType(calleeType.withoutTypeParameters);
-    _replaceType(invokeType);
-    _replaceType(const NullType()); // callee type
+    _pop()(expressionTarget, expressionArgumentsTypes, calleeType, substitution,
+        inferredType);
   }
 
-  void stringConcatenationExit(
-      StringConcatenation expression, DartType inferredType) {
+  @override
+  void stringConcatenationExit(Location location, DartType inferredType) {
     // We don't need the type - we already know that it is String.
     // Moreover, the file offset for StringConcatenation is `-1`.
   }
 
-  void thisExpressionExit(ThisExpression expression, DartType inferredType) {}
+  @override
+  void thisExpressionExit(Location location, DartType inferredType) {}
 
-  void typeLiteralEnter(@override TypeLiteral expression, String prefixName,
-      DartType typeContext) {
-    // if there was an import prefix, record it.
-    _recordImportPrefix(prefixName);
+  @override
+  void typeLiteralEnter(Location location, DartType typeContext) {
+    _push((Reference expressionType, DartType inferredType) {
+      _store(location, reference: expressionType, inferredType: inferredType);
+    });
   }
 
-  void typeLiteralExit(TypeLiteral expression, DartType inferredType) {
-    _recordReference(expression.type, expression.fileOffset);
+  void typeLiteralExit(
+      Location location, Reference expressionType, DartType inferredType) {
+    _pop()(expressionType, inferredType);
   }
 
-  void variableAssignEnter(
-      Expression expression, DartType typeContext, Expression write) {
-    _deferReference(write.fileOffset);
-    _deferType(write.fileOffset);
+  @override
+  void variableAssignExit(Location location, DartType writeContext,
+      Declaration writeVariable, Reference combiner, DartType inferredType) {
+    _store(location,
+        declaration: writeVariable,
+        isWriteReference: true,
+        writeContext: writeContext,
+        combiner: combiner,
+        inferredType: inferredType);
   }
 
-  void variableAssignExit(Expression expression, DartType writeContext,
-      Expression write, Procedure combiner, DartType inferredType) {
-    _replaceReference(write is VariableSet
-        ? write.variable
-        : const NullNode('writable-variable'));
-    _replaceType(writeContext);
-    _recordReference(
-        combiner ?? const NullNode('assign-combiner'), write.fileOffset);
-    _recordType(inferredType, write.fileOffset);
-  }
-
-  void variableDeclarationEnter(VariableDeclaration statement) {
-    _recordDeclaration(statement, statement.fileOffset);
-    _deferType(statement.fileOffset);
-  }
-
+  @override
   void variableDeclarationExit(
-      VariableDeclaration statement, DartType inferredType) {
-    _replaceType(statement.type);
+      Location location, DartType statementType, DartType inferredType) {
+    _store(location, literalType: statementType, inferredType: inferredType);
   }
 
-  void variableGetExit(VariableGet expression, DartType inferredType) {
-    /// Return `true` if the given [variable] declaration occurs in a let
-    /// expression that is, or is part of, a cascade expression.
-    bool isInCascade(VariableDeclaration variable) {
-      TreeNode ancestor = variable.parent;
-      while (ancestor is Let) {
-        if (ancestor is ShadowCascadeExpression) {
-          return true;
-        }
-        ancestor = ancestor.parent;
-      }
-      return false;
-    }
-
-    VariableDeclaration variable = expression.variable;
-    if (isInCascade(variable)) {
+  @override
+  void variableGetExit(Location location, bool isInCascade,
+      Declaration expressionVariable, DartType inferredType) {
+    if (isInCascade) {
       return;
     }
-    _recordReference(variable, expression.fileOffset);
-    _recordType(inferredType, expression.fileOffset);
+    _store(location,
+        declaration: expressionVariable, inferredType: inferredType);
   }
 
-  /// Record `null` as the reference at the given [offset], and put the current
-  /// slot into the [_deferredReferenceSlots] stack.
-  void _deferReference(int offset) {
-    int slot = _recordReference(null, offset);
-    _deferredReferenceSlots.add(slot);
+  void _push(Function f) {
+    _stack.add(f);
   }
 
-  /// Record `null` as the type at the given [offset], and put the current
-  /// slot into the [_deferredTypeSlots] stack.
-  void _deferType(int offset) {
-    int slot = _recordType(null, offset);
-    _deferredTypeSlots.add(slot);
+  Function _pop() {
+    return _stack.removeLast();
   }
 
-  void _recordDeclaration(TreeNode declaration, int offset) {
-    _declarations.add(declaration);
+  @override
+  void storePrefixInfo(Location location, PrefixInfo prefixInfo) {
+    _store(location, prefixInfo: prefixInfo);
   }
 
-  /// If the [prefixName] is not `null` record the reference to it.
-  void _recordImportPrefix(String prefixName) {
-    if (prefixName != null) {
-      _recordReference(new ImportPrefixNode(prefixName), UNKNOWN_OFFSET);
-      _recordType(const NullType(), UNKNOWN_OFFSET);
-    }
-  }
-
-  int _recordReference(Node target, int offset) {
-    int slot = _references.length;
-    _references.add(target);
-    return slot;
-  }
-
-  int _recordType(DartType type, int offset) {
-    int slot = _types.length;
-    _types.add(type);
-    return slot;
-  }
-
-  void _replaceReference(Node reference) {
-    int slot = _deferredReferenceSlots.removeLast();
-    _references[slot] = reference;
-  }
-
-  void _replaceType(DartType type, [int newOffset = -1]) {
-    int slot = _deferredTypeSlots.removeLast();
-    _types[slot] = type;
-  }
-
-  /// If the [member] is a forwarding stub, return the target it forwards to.
-  /// Otherwise return the given [member].
-  static Member _getRealTarget(Member member) {
-    if (member is Procedure && member.isForwardingStub) {
-      return member.forwardingStubInterfaceTarget;
-    }
-    return member;
+  @override
+  void storeClassReference(
+      Location location, Reference reference, DartType rawType) {
+    // TODO(paulberry): would it be better to use literalType?
+    _store(location, reference: reference, inferredType: rawType);
   }
 }
 
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index 27e5169..ba1885e 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -91,10 +91,7 @@
   Object visitBlockFunctionBody(BlockFunctionBody node) {
     if (_isBodyToCreateElementsFor(node)) {
       _walker.consumeLocalElements();
-      // With kernel local elements are created in resolution applier.
-      if (!_applyKernelTypes) {
-        node.accept(_walker.elementBuilder);
-      }
+      node.accept(_walker.elementBuilder);
       return null;
     } else {
       return super.visitBlockFunctionBody(node);
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 86a305f..204542e 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -209,24 +209,6 @@
    */
   ClassElementImpl _enclosingClass;
 
-  ClassElement get enclosingClass => _enclosingClass;
-
-  /**
-   * For consumers of error verification as a library, (currently just the
-   * angular plugin), expose a setter that can make the errors reported more
-   * accurate when dangling code snippets are being resolved from a class
-   * context. Note that this setter is very defensive for potential misuse; it
-   * should not be modified in the middle of visiting a tree and requires an
-   * analyzer-provided Impl instance to work.
-   */
-  set enclosingClass(ClassElement classElement) {
-    assert(classElement is ClassElementImpl);
-    assert(_enclosingClass == null);
-    assert(_enclosingEnum == null);
-    assert(_enclosingFunction == null);
-    _enclosingClass = classElement;
-  }
-
   /**
    * The enum containing the AST nodes being visited, or `null` if we are not
    * in the scope of an enum.
@@ -345,6 +327,24 @@
     _options = _currentLibrary.context.analysisOptions;
   }
 
+  ClassElement get enclosingClass => _enclosingClass;
+
+  /**
+   * For consumers of error verification as a library, (currently just the
+   * angular plugin), expose a setter that can make the errors reported more
+   * accurate when dangling code snippets are being resolved from a class
+   * context. Note that this setter is very defensive for potential misuse; it
+   * should not be modified in the middle of visiting a tree and requires an
+   * analyzer-provided Impl instance to work.
+   */
+  set enclosingClass(ClassElement classElement) {
+    assert(classElement is ClassElementImpl);
+    assert(_enclosingClass == null);
+    assert(_enclosingEnum == null);
+    assert(_enclosingFunction == null);
+    _enclosingClass = classElement;
+  }
+
   @override
   Object visitAnnotation(Annotation node) {
     _checkForInvalidAnnotationFromDeferredLibrary(node);
@@ -1619,6 +1619,57 @@
   }
 
   /**
+   * Check that return statements without expressions are not in a generative
+   * constructor and the return type is not assignable to `null`; that is, we
+   * don't have `return;` if the enclosing method has a non-void containing
+   * return type.
+   *
+   * See [CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR],
+   * [StaticWarningCode.RETURN_WITHOUT_VALUE], and
+   * [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE].
+   */
+  void _checkForAllEmptyReturnStatementErrorCodes(
+      ReturnStatement statement, DartType expectedReturnType) {
+    if (_inGenerator) {
+      return;
+    }
+    if (_options.strongMode) {
+      var returnType = _inAsync
+          ? expectedReturnType.flattenFutures(_typeSystem)
+          : expectedReturnType;
+      if (returnType.isDynamic ||
+          returnType.isDartCoreNull ||
+          returnType.isVoid) {
+        return;
+      }
+    } else {
+      // TODO(leafp): Delete this non-strong path
+      if (_inAsync) {
+        if (expectedReturnType.isDynamic || expectedReturnType.isVoid) {
+          return;
+        }
+        if (expectedReturnType is InterfaceType &&
+            expectedReturnType.isDartAsyncFuture) {
+          DartType futureArgument = expectedReturnType.typeArguments[0];
+          if (futureArgument.isDynamic ||
+              futureArgument.isDartCoreNull ||
+              futureArgument.isVoid ||
+              futureArgument.isObject) {
+            return;
+          }
+        }
+      } else if (expectedReturnType.isDynamic || expectedReturnType.isVoid) {
+        return;
+      }
+    }
+    // If we reach here, this is an invalid return
+    _hasReturnWithoutValue = true;
+    _errorReporter.reportErrorForNode(
+        StaticWarningCode.RETURN_WITHOUT_VALUE, statement);
+    return;
+  }
+
+  /**
    * Verify that the given [constructor] declaration does not violate any of the
    * error codes relating to the initialization of fields in the enclosing
    * class.
@@ -2307,7 +2358,8 @@
    *
    * Check that return statements without expressions are not in a generative
    * constructor and the return type is not assignable to `null`; that is, we
-   * don't have `return;` if the enclosing method has a return type.
+   * don't have `return;` if the enclosing method has a non-void containing
+   * return type.
    *
    * Check that the return type matches the type of the declared return type in
    * the enclosing method or function.
@@ -2322,6 +2374,7 @@
         ? DynamicTypeImpl.instance
         : functionType.returnType;
     Expression returnExpression = statement.expression;
+
     // RETURN_IN_GENERATIVE_CONSTRUCTOR
     bool isGenerativeConstructor(ExecutableElement element) =>
         element is ConstructorElement && !element.isFactory;
@@ -2336,34 +2389,7 @@
     }
     // RETURN_WITHOUT_VALUE
     if (returnExpression == null) {
-      if (_inGenerator) {
-        return;
-      } else if (_inAsync) {
-        if (expectedReturnType.isDynamic || expectedReturnType.isVoid) {
-          return;
-        }
-        if (expectedReturnType is InterfaceType &&
-            expectedReturnType.isDartAsyncFuture) {
-          DartType futureArgument = expectedReturnType.typeArguments[0];
-          if (futureArgument.isDynamic ||
-              futureArgument.isDartCoreNull ||
-              futureArgument.isVoid ||
-              futureArgument.isObject) {
-            return;
-          }
-        }
-      } else if (expectedReturnType.isDynamic ||
-          expectedReturnType.isVoid ||
-          (expectedReturnType.isDartCoreNull && _options.strongMode)) {
-        // TODO(leafp): Empty returns shouldn't be allowed for Null in strong
-        // mode either once we allow void as a type argument.  But for now, the
-        // only type we can validly infer for f.then((_) {print("hello");}) is
-        // Future<Null>, so we allow this.
-        return;
-      }
-      _hasReturnWithoutValue = true;
-      _errorReporter.reportErrorForNode(
-          StaticWarningCode.RETURN_WITHOUT_VALUE, statement);
+      _checkForAllEmptyReturnStatementErrorCodes(statement, expectedReturnType);
       return;
     } else if (_inGenerator) {
       // RETURN_IN_GENERATOR
@@ -2371,6 +2397,7 @@
           CompileTimeErrorCode.RETURN_IN_GENERATOR,
           statement,
           [_inAsync ? "async*" : "sync*"]);
+      return;
     }
 
     _checkForReturnOfInvalidType(returnExpression, expectedReturnType);
@@ -4837,8 +4864,10 @@
     if (_hasReturnWithoutValue) {
       return;
     }
-    if (_returnsWith.isNotEmpty && _returnsWithout.isNotEmpty) {
-      for (ReturnStatement returnWith in _returnsWith) {
+    var nonVoidReturnsWith =
+        _returnsWith.where((stmt) => !getStaticType(stmt.expression).isVoid);
+    if (nonVoidReturnsWith.isNotEmpty && _returnsWithout.isNotEmpty) {
+      for (ReturnStatement returnWith in nonVoidReturnsWith) {
         _errorReporter.reportErrorForToken(
             StaticWarningCode.MIXED_RETURN_TYPES, returnWith.returnKeyword);
       }
@@ -5647,7 +5676,7 @@
    * See [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE].
    */
   void _checkForReturnOfInvalidType(
-      Expression returnExpression, DartType expectedReturnType,
+      Expression returnExpression, DartType expectedType,
       {bool isArrowFunction = false}) {
     if (_enclosingFunction == null) {
       return;
@@ -5658,19 +5687,79 @@
       // of the return type.  So no need to do any further checking.
       return;
     }
+    if (_options.strongMode) {
+      if (returnExpression == null) {
+        return; // Empty returns are handled elsewhere
+      }
+
+      DartType expressionType = getStaticType(returnExpression);
+
+      void reportTypeError() {
+        String displayName = _enclosingFunction.displayName;
+
+        if (displayName.isEmpty) {
+          _errorReporter.reportTypeErrorForNode(
+              StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE,
+              returnExpression,
+              [expressionType, expectedType]);
+        } else {
+          _errorReporter.reportTypeErrorForNode(
+              StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
+              returnExpression,
+              [expressionType, expectedType, displayName]);
+        }
+      }
+
+      var toType = expectedType;
+      var fromType = expressionType;
+
+      if (isArrowFunction) {
+        if (_inAsync && toType.flattenFutures(_typeSystem).isVoid) {
+          return;
+        } else if (toType.isVoid) {
+          return;
+        }
+      }
+
+      if (toType.isDynamic) {
+        return;
+      }
+
+      if (toType.isVoid) {
+        if (fromType.isVoid) {
+          return;
+        }
+        if (!_inAsync && fromType.isDynamic ||
+            fromType.isDartCoreNull ||
+            fromType.isBottom) {
+          return;
+        }
+      } else if (!fromType.isVoid) {
+        if (_inAsync) {
+          fromType = _typeProvider.futureType
+              .instantiate(<DartType>[fromType.flattenFutures(_typeSystem)]);
+        }
+        if (_expressionIsAssignableAtType(returnExpression, fromType, toType)) {
+          return;
+        }
+      }
+      reportTypeError();
+      return;
+    }
+    // TODO(leafp): Delete this non Dart 2 path
     DartType staticReturnType = _computeReturnTypeForMethod(returnExpression);
     String displayName = _enclosingFunction.displayName;
 
     void reportTypeError() => _errorReporter.reportTypeErrorForNode(
         StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
         returnExpression,
-        [staticReturnType, expectedReturnType, displayName]);
+        [staticReturnType, expectedType, displayName]);
     void reportTypeErrorFromClosure() => _errorReporter.reportTypeErrorForNode(
         StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE,
         returnExpression,
-        [staticReturnType, expectedReturnType]);
+        [staticReturnType, expectedType]);
 
-    if (expectedReturnType.isVoid) {
+    if (expectedType.isVoid) {
       if (isArrowFunction) {
         // "void f(..) => e" admits all types for "e".
         return;
@@ -5691,10 +5780,10 @@
 
     // TODO(mfairhurst) Make this stricter once codebases are compliant.
     final invalidVoidReturn = staticReturnType.isVoid &&
-        !(expectedReturnType.isVoid || expectedReturnType.isDynamic);
+        !(expectedType.isVoid || expectedType.isDynamic);
     if (!invalidVoidReturn &&
         _expressionIsAssignableAtType(
-            returnExpression, staticReturnType, expectedReturnType)) {
+            returnExpression, staticReturnType, expectedType)) {
       return;
     }
     if (displayName.isEmpty) {
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 1a5a68a..9422646 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -4637,7 +4637,7 @@
       Token token = getAndAdvance();
       int value = null;
       try {
-        value = int.parse(token.lexeme.substring(2), radix: 16);
+        value = int.parse(token.lexeme);
       } on FormatException {
         // The invalid format should have been reported by the scanner.
       }
diff --git a/pkg/analyzer/lib/src/generated/parser_fasta.dart b/pkg/analyzer/lib/src/generated/parser_fasta.dart
index 69905bb..6f5e77a 100644
--- a/pkg/analyzer/lib/src/generated/parser_fasta.dart
+++ b/pkg/analyzer/lib/src/generated/parser_fasta.dart
@@ -110,7 +110,7 @@
     currentToken = fastaParser.parseClassMember(currentToken);
     ClassDeclaration declaration = astBuilder.classDeclaration;
     astBuilder.classDeclaration = null;
-    return declaration.members[0];
+    return declaration.members.isNotEmpty ? declaration.members[0] : null;
   }
 
   @override
@@ -130,7 +130,9 @@
   @override
   CompilationUnit parseCompilationUnit2() {
     currentToken = fastaParser.parseUnit(currentToken);
-    return astBuilder.pop();
+    CompilationUnitImpl compilationUnit = astBuilder.pop();
+    compilationUnit.localDeclarations = astBuilder.localDeclarations;
+    return compilationUnit;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 09d4a84..663b76e 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1186,7 +1186,30 @@
       if (body.isGenerator) {
         return;
       }
-      // Check that the type is resolvable, and is not "void"
+
+      if (_typeSystem is StrongTypeSystemImpl) {
+        // Check that the type is resolvable, and is not "void"
+        DartType returnTypeType = returnType.type;
+        if (returnTypeType == null) {
+          return;
+        }
+
+        var flattenedType = body.isAsynchronous
+            ? returnTypeType.flattenFutures(_typeSystem)
+            : returnTypeType;
+        if (flattenedType.isDynamic ||
+            flattenedType.isDartCoreNull ||
+            flattenedType.isVoid) {
+          return;
+        }
+        // Check the block for a return statement, if not, create the hint
+        if (!ExitDetector.exits(body)) {
+          _errorReporter.reportErrorForNode(HintCode.MISSING_RETURN, returnType,
+              [returnTypeType.displayName]);
+        }
+      }
+      // TODO(leafp): Delete this non-strong mode path
+      // Check that the type is resolvable and not "void"
       DartType returnTypeType = returnType.type;
       if (returnTypeType == null ||
           returnTypeType.isVoid ||
diff --git a/pkg/analyzer/lib/src/kernel/resynthesize.dart b/pkg/analyzer/lib/src/kernel/resynthesize.dart
index 43cb699..876f47d 100644
--- a/pkg/analyzer/lib/src/kernel/resynthesize.dart
+++ b/pkg/analyzer/lib/src/kernel/resynthesize.dart
@@ -372,7 +372,8 @@
     }
 
     // Replace Analyzer type parameters with type arguments.
-    throw new UnimplementedError('TODO(paulberry)');
+    throw new UnimplementedError(
+        'TODO(paulberry): resynthesize generic typedef');
   }
 
   /// Return the [TypeParameterElement] for the given [kernelTypeParameter].
diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
index bb05401..47bdf9f 100644
--- a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
+++ b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
@@ -74,6 +74,13 @@
    * [assetPath] or in a subdirectory of the parent of the file.
    */
   bool _assetExistsAtPath(String assetPath) {
+    // Check for asset directories.
+    Folder assetDirectory = provider.getFolder(assetPath);
+    if (assetDirectory.exists) {
+      return true;
+    }
+
+    // Else, check for an asset file.
     File assetFile = provider.getFile(assetPath);
     if (assetFile.exists) {
       return true;
@@ -159,15 +166,16 @@
               if (entry.startsWith('packages/')) {
                 // TODO(brianwilkerson) Add validation of package references.
               } else {
+                bool isDirectoryEntry = entry.endsWith("/");
                 String normalizedEntry =
                     context.joinAll(path.posix.split(entry));
                 String assetPath = context.join(packageRoot, normalizedEntry);
                 if (!_assetExistsAtPath(assetPath)) {
+                  ErrorCode errorCode = isDirectoryEntry
+                      ? PubspecWarningCode.ASSET_DIRECTORY_DOES_NOT_EXIST
+                      : PubspecWarningCode.ASSET_DOES_NOT_EXIST;
                   _reportErrorForNode(
-                      reporter,
-                      entryValue,
-                      PubspecWarningCode.ASSET_DOES_NOT_EXIST,
-                      [entryValue.value]);
+                      reporter, entryValue, errorCode, [entryValue.value]);
                 }
               }
             } else {
diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart b/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart
index d4d4c2d..0e3461b 100644
--- a/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart
+++ b/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart
@@ -23,6 +23,18 @@
           correction: "Try creating the file or fixing the path to the file.");
 
   /**
+   * A code indicating that a specified asset directory does not exist.
+   *
+   * Parameters:
+   * 0: the path to the asset directory as given in the file.
+   */
+  static const PubspecWarningCode ASSET_DIRECTORY_DOES_NOT_EXIST =
+      const PubspecWarningCode('ASSET_DIRECTORY_DOES_NOT_EXIST',
+          "The asset directory {0} does not exist.",
+          correction: "Try creating the directory or fixing the path to the "
+              "directory.");
+
+  /**
    * A code indicating that the value of the asset field is not a list.
    */
   static const PubspecWarningCode ASSET_FIELD_NOT_LIST = const PubspecWarningCode(
diff --git a/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart b/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
index d89deab..bee56b9 100644
--- a/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
+++ b/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
@@ -6,6 +6,7 @@
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/dart/analysis/context_locator.dart';
 
 /**
  * A mixin for test classes that adds a [ResourceProvider] and utility methods
@@ -15,6 +16,24 @@
 class ResourceProviderMixin {
   MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
 
+  String convertPath(String path) => resourceProvider.convertPath(path);
+
+  /// Convert the given [path] to be a valid import uri for this provider's path context.
+  String convertPathForImport(String path) {
+    path = resourceProvider.convertPath(path);
+
+    // On Windows, absolute import paths are not quite the same as a normal fs path.
+    // C:\test.dart must be imported as one of:
+    //   import "file:///C:/test.dart"
+    //   import "/C:/test.dart"
+    if (Platform.isWindows && resourceProvider.pathContext.isAbsolute(path)) {
+      // The .path on a file Uri is in the form "/C:/test.dart"
+      path = new Uri.file(path).path;
+    }
+
+    return path;
+  }
+
   void deleteFile(String path) {
     String convertedPath = resourceProvider.convertPath(path);
     resourceProvider.deleteFile(convertedPath);
@@ -35,6 +54,17 @@
     return resourceProvider.getFolder(convertedPath);
   }
 
+  String join(String part1,
+          [String part2,
+          String part3,
+          String part4,
+          String part5,
+          String part6,
+          String part7,
+          String part8]) =>
+      resourceProvider.pathContext
+          .join(part1, part2, part3, part4, part5, part6, part7, part8);
+
   void modifyFile(String path, String content) {
     String convertedPath = resourceProvider.convertPath(path);
     resourceProvider.modifyFile(convertedPath, content);
@@ -55,32 +85,13 @@
     return resourceProvider.newFolder(convertedPath);
   }
 
-  String join(String part1,
-          [String part2,
-          String part3,
-          String part4,
-          String part5,
-          String part6,
-          String part7,
-          String part8]) =>
-      resourceProvider.pathContext
-          .join(part1, part2, part3, part4, part5, part6, part7, part8);
+  File newOptionsFile(String directoryPath) {
+    return newFile(resourceProvider.pathContext
+        .join(directoryPath, ContextLocatorImpl.ANALYSIS_OPTIONS_NAME));
+  }
 
-  String convertPath(String path) => resourceProvider.convertPath(path);
-
-  /// Convert the given [path] to be a valid import uri for this provider's path context.
-  String convertPathForImport(String path) {
-    path = resourceProvider.convertPath(path);
-
-    // On Windows, absolute import paths are not quite the same as a normal fs path.
-    // C:\test.dart must be imported as one of:
-    //   import "file:///C:/test.dart"
-    //   import "/C:/test.dart"
-    if (Platform.isWindows && resourceProvider.pathContext.isAbsolute(path)) {
-      // The .path on a file Uri is in the form "/C:/test.dart"
-      path = new Uri.file(path).path;
-    }
-
-    return path;
+  File newPackagesFile(String directoryPath) {
+    return newFile(resourceProvider.pathContext
+        .join(directoryPath, ContextLocatorImpl.PACKAGES_FILE_NAME));
   }
 }
diff --git a/pkg/analyzer/test/file_system/overlay_file_system_test.dart b/pkg/analyzer/test/file_system/overlay_file_system_test.dart
new file mode 100644
index 0000000..e06fafd
--- /dev/null
+++ b/pkg/analyzer/test/file_system/overlay_file_system_test.dart
@@ -0,0 +1,784 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. 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:core';
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/file_system/overlay_file_system.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:meta/meta.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FileTest);
+    defineReflectiveTests(FolderTest);
+    defineReflectiveTests(OverlayResourceProviderTest);
+  });
+}
+
+var _isFile = new isInstanceOf<File>();
+var _isFileSystemException = new isInstanceOf<FileSystemException>();
+var _isFolder = new isInstanceOf<Folder>();
+
+@reflectiveTest
+class FileTest extends OverlayTestSupport {
+  @failingTest
+  test_changes() {
+    // TODO(brianwilkerson) Implement this.
+    fail('Not tested');
+  }
+
+  test_copyTo_noOverlay() {
+    File file = _file(exists: true);
+    File targetFile =
+        provider.getFile(baseProvider.convertPath('/foo/test.dart'));
+    expect(targetFile.exists, isFalse);
+    file.copyTo(file.parent.parent);
+    expect(targetFile.exists, isTrue);
+  }
+
+  test_copyTo_onlyOverlay() {
+    File file = _file(exists: false);
+    provider.setOverlay(file.path, content: 'overlay', modificationStamp: 3);
+    File targetFile =
+        provider.getFile(baseProvider.convertPath('/foo/test.dart'));
+    expect(targetFile.exists, isFalse);
+    file.copyTo(file.parent.parent);
+    expect(targetFile.exists, isTrue);
+    expect(targetFile.readAsStringSync(), 'overlay');
+    provider.removeOverlay(targetFile.path);
+    expect(targetFile.exists, isFalse);
+  }
+
+  test_copyTo_withOverlay() {
+    File file = _file(exists: true, content: 'base');
+    provider.setOverlay(file.path, content: 'overlay', modificationStamp: 3);
+    File targetFile =
+        provider.getFile(baseProvider.convertPath('/foo/test.dart'));
+    expect(targetFile.exists, isFalse);
+    file.copyTo(file.parent.parent);
+    expect(targetFile.exists, isTrue);
+    expect(targetFile.readAsStringSync(), 'overlay');
+    provider.removeOverlay(targetFile.path);
+    expect(targetFile.exists, isTrue);
+    expect(targetFile.readAsStringSync(), 'base');
+  }
+
+  test_createSource() {
+    File file = _file(exists: true);
+    Source source = file.createSource();
+    expect(source, isNotNull);
+    expect(source.fullName, defaultFilePath);
+    expect(source.uri, new Uri.file(defaultFilePath));
+  }
+
+  test_delete_existing_withoutOverlay() {
+    File file = _file(exists: true);
+    expect(file.exists, isTrue);
+    file.delete();
+    expect(file.exists, isFalse);
+  }
+
+  test_delete_existing_withOverlay() {
+    File file = _file(exists: true, withOverlay: true);
+    expect(file.exists, isTrue);
+    file.delete();
+    expect(file.exists, isFalse);
+  }
+
+  test_delete_notExisting_withoutOverlay() {
+    File file = _file(exists: false);
+    expect(file.exists, isFalse);
+    expect(() => file.delete(), throwsA(_isFileSystemException));
+  }
+
+  test_delete_notExisting_withOverlay() {
+    File file = _file(exists: false, withOverlay: true);
+    expect(file.exists, isTrue);
+    file.delete();
+    expect(file.exists, isFalse);
+  }
+
+  test_exists_existing_withoutOverlay() {
+    File file = _file(exists: true);
+    expect(file.exists, isTrue);
+  }
+
+  test_exists_existing_withOverlay() {
+    File file = _file(exists: true, withOverlay: true);
+    expect(file.exists, isTrue);
+  }
+
+  test_exists_notExisting_withoutOverlay() {
+    File file = _file(exists: false);
+    expect(file.exists, isFalse);
+  }
+
+  test_exists_notExisting_withOverlay() {
+    File file = _file(exists: false, withOverlay: true);
+    expect(file.exists, isTrue);
+  }
+
+  test_isOrContains_false() {
+    File file = _file(exists: true);
+    expect(file.isOrContains(baseProvider.convertPath('/foo/bar/a.dart')),
+        isFalse);
+  }
+
+  test_isOrContains_true() {
+    File file = _file(exists: true);
+    expect(file.isOrContains(file.path), isTrue);
+  }
+
+  test_lengthSync_withoutOverlay() {
+    File file = _file(exists: true);
+    expect(file.lengthSync, 1);
+  }
+
+  test_lengthSync_withOverlay() {
+    File file = _file(exists: true, withOverlay: true);
+    expect(file.lengthSync, 3);
+  }
+
+  test_modificationStamp_existing_withoutOverlay() {
+    File file = _file(exists: true);
+    expect(file.modificationStamp, isNotNull);
+  }
+
+  test_modificationStamp_existing_withOverlay() {
+    File file = _file(exists: true, withOverlay: true);
+    expect(file.modificationStamp, 42);
+  }
+
+  test_modificationStamp_notExisting_withoutOverlay() {
+    File file = _file(exists: false);
+    expect(() => file.modificationStamp, throwsA(_isFileSystemException));
+  }
+
+  test_modificationStamp_notExisting_withOverlay() {
+    File file = _file(exists: false, withOverlay: true);
+    expect(file.modificationStamp, 42);
+  }
+
+  test_parent() {
+    Folder parent = _file(exists: true).parent;
+    expect(parent, isNotNull);
+    expect(parent.exists, isTrue);
+    expect(parent.path, defaultFolderPath);
+  }
+
+  test_readAsBytesSync_existing_withoutOverlay() {
+    File file = _file(exists: true);
+    expect(file.readAsBytesSync(), <int>[97]);
+  }
+
+  test_readAsBytesSync_existing_withOverlay() {
+    File file = _file(exists: true, withOverlay: true);
+    expect(file.readAsBytesSync(), <int>[98, 98, 98]);
+  }
+
+  test_readAsBytesSync_notExisting_withoutOverlay() {
+    File file = _file(exists: false);
+    expect(() => file.readAsBytesSync(), throwsA(_isFileSystemException));
+  }
+
+  test_readAsBytesSync_notExisting_withOverlay() {
+    File file = _file(exists: false, withOverlay: true);
+    expect(file.readAsBytesSync(), <int>[98, 98, 98]);
+  }
+
+  test_readAsStringSync_existing_withoutOverlay() {
+    File file = _file(exists: true);
+    expect(file.readAsStringSync(), 'a');
+  }
+
+  test_readAsStringSync_existing_withOverlay() {
+    File file = _file(exists: true, withOverlay: true);
+    expect(file.readAsStringSync(), 'bbb');
+  }
+
+  test_readAsStringSync_notExisting_withoutOverlay() {
+    File file = _file(exists: false);
+    expect(() {
+      file.readAsStringSync();
+    }, throwsA(_isFileSystemException));
+  }
+
+  test_readAsStringSync_notExisting_withOverlay() {
+    File file = _file(exists: false, withOverlay: true);
+    expect(file.readAsStringSync(), 'bbb');
+  }
+
+  test_renameSync_existingFile_conflictsWithFile() {
+    String oldPath = '/foo/bar/file.txt';
+    String newPath = baseProvider.convertPath('/foo/bar/new-file.txt');
+    File oldFile = _file(content: 'old', exists: true, path: oldPath);
+    File newFile = _file(content: 'new', exists: true, path: newPath);
+    oldFile.renameSync(newPath);
+    expect(oldFile.path, baseProvider.convertPath(oldPath));
+    expect(oldFile.exists, isFalse);
+    expect(newFile.path, newPath);
+    expect(newFile.exists, isTrue);
+    expect(newFile.readAsStringSync(), 'old');
+  }
+
+  test_renameSync_existingFile_conflictsWithFolder() {
+    String oldPath = '/foo/bar/file.txt';
+    String newPath = baseProvider.convertPath('/foo/bar/new-baz');
+    File oldFile = _file(exists: true, path: oldPath);
+    Folder newFolder = _folder(exists: true, path: newPath);
+    expect(() => oldFile.renameSync(newPath), throwsA(_isFileSystemException));
+    expect(oldFile.path, baseProvider.convertPath(oldPath));
+    expect(oldFile.exists, isTrue);
+    expect(newFolder.path, newPath);
+    expect(newFolder.exists, isTrue);
+  }
+
+  test_renameSync_existingFile_withoutOverlay() {
+    String oldPath = '/foo/bar/file.txt';
+    String newPath = baseProvider.convertPath('/foo/bar/new-file.txt');
+    File oldFile = _file(exists: true, path: oldPath);
+    File newFile = oldFile.renameSync(newPath);
+    expect(oldFile.path, baseProvider.convertPath(oldPath));
+    expect(oldFile.exists, isFalse);
+    expect(newFile.path, newPath);
+    expect(newFile.exists, isTrue);
+    expect(newFile.readAsStringSync(), 'a');
+  }
+
+  test_renameSync_existingFile_withOverlay() {
+    String oldPath = '/foo/bar/file.txt';
+    String newPath = baseProvider.convertPath('/foo/bar/new-file.txt');
+    File oldFile = _file(exists: true, path: oldPath, withOverlay: true);
+    File newFile = oldFile.renameSync(newPath);
+    expect(oldFile.path, baseProvider.convertPath(oldPath));
+    expect(oldFile.exists, isFalse);
+    expect(newFile.path, newPath);
+    expect(newFile.exists, isTrue);
+    expect(newFile.readAsStringSync(), 'bbb');
+  }
+
+  test_renameSync_notExisting_withoutOverlay() {
+    String oldPath = '/foo/bar/file.txt';
+    String newPath = baseProvider.convertPath('/foo/bar/new-file.txt');
+    File oldFile = _file(exists: true, path: oldPath);
+    File newFile = oldFile.renameSync(newPath);
+    expect(oldFile.path, baseProvider.convertPath(oldPath));
+    expect(oldFile.exists, isFalse);
+    expect(newFile.path, newPath);
+    expect(newFile.exists, isTrue);
+    expect(newFile.readAsStringSync(), 'a');
+  }
+
+  test_renameSync_notExisting_withOverlay() {
+    String oldPath = '/foo/bar/file.txt';
+    String newPath = baseProvider.convertPath('/foo/bar/new-file.txt');
+    File oldFile = _file(exists: false, path: oldPath, withOverlay: true);
+    File newFile = oldFile.renameSync(newPath);
+    expect(oldFile.path, baseProvider.convertPath(oldPath));
+    expect(oldFile.exists, isFalse);
+    expect(newFile.path, newPath);
+    expect(newFile.exists, isTrue);
+    expect(newFile.readAsStringSync(), 'bbb');
+  }
+
+  @failingTest
+  void test_resolveSymbolicLinksSync_links_existingFile_withoutOverlay() {
+    fail('Not tested');
+    // TODO(brianwilkerson) Decide how to test this given that we cannot
+    // create a link in a MemoryResourceProvider.
+//    // Create a file at '/temp/a/b/test.txt'.
+//    String pathA = baseProvider.convertPath('/temp/a');
+//    String pathB = baseProvider.convertPath('/temp/a/b');
+//    baseProvider.newFolder(pathB);
+//    String filePath = baseProvider.convertPath('/temp/a/b/test.txt');
+//    File testFile = baseProvider.newFile(filePath, 'test');
+//
+//    // Create a symbolic link from '/temp/c/d' to '/temp/a'.
+//    String pathC = baseProvider.convertPath('/temp/c');
+//    String pathD = baseProvider.convertPath('/temp/c/d');
+//    new io.Link(pathD).createSync(pathA, recursive: true);
+//
+//    // Create a symbolic link from '/temp/e/f' to '/temp/c'.
+//    String pathE = baseProvider.convertPath('/temp/e');
+//    String pathF = baseProvider.convertPath('/temp/e/f');
+//    new io.Link(pathF).createSync(pathC, recursive: true);
+//
+//    // Resolve the path '/temp/e/f/d/b/test.txt' to '/temp/a/b/test.txt'.
+//    String linkPath = baseProvider.convertPath('/temp/e/f/d/b/test.txt');
+//    File file = baseProvider.getFile(linkPath);
+//    expect(file.resolveSymbolicLinksSync().path,
+//        testFile.resolveSymbolicLinksSync());
+  }
+
+  void test_resolveSymbolicLinksSync_noLinks_existingFile_withoutOverlay() {
+    _resolveSymbolicLinksSync_noLinks(
+        _file(exists: true, path: '/temp/a/b/test.txt'));
+  }
+
+  void test_resolveSymbolicLinksSync_noLinks_existingFile_withOverlay() {
+    _resolveSymbolicLinksSync_noLinks(
+        _file(exists: true, path: '/temp/a/b/test.txt', withOverlay: true));
+  }
+
+  void test_resolveSymbolicLinksSync_noLinks_notExisting_withoutOverlay() {
+    _resolveSymbolicLinksSync_noLinks(
+        _file(exists: false, path: '/temp/a/b/test.txt'));
+  }
+
+  void test_resolveSymbolicLinksSync_noLinks_notExisting_withOverlay() {
+    _resolveSymbolicLinksSync_noLinks(
+        _file(exists: false, path: '/temp/a/b/test.txt', withOverlay: true));
+  }
+
+  test_shortName() {
+    expect(_file(exists: true).shortName, 'test.dart');
+  }
+
+  test_toUri() {
+    File file = _file(exists: true);
+    expect(file.toUri(), new Uri.file(file.path));
+  }
+
+  test_writeAsBytesSync_withoutOverlay() {
+    File file = _file(exists: true);
+    file.writeAsBytesSync(<int>[99, 99]);
+    expect(file.readAsBytesSync(), <int>[99, 99]);
+  }
+
+  test_writeAsBytesSync_withOverlay() {
+    File file = _file(exists: true, withOverlay: true);
+    expect(() => file.writeAsBytesSync(<int>[99, 99]),
+        throwsA(_isFileSystemException));
+  }
+
+  test_writeAsStringSync_withoutOverlay() {
+    File file = _file(exists: true);
+    file.writeAsStringSync('cc');
+    expect(file.readAsStringSync(), 'cc');
+  }
+
+  test_writeAsStringSync_withOverlay() {
+    File file = _file(exists: true, withOverlay: true);
+    expect(() => file.writeAsStringSync('cc'), throwsA(_isFileSystemException));
+  }
+
+  void _resolveSymbolicLinksSync_noLinks(File file) {
+    //
+    // On some platforms the path to the temp directory includes a symbolic
+    // link. We remove that from the equation before creating the File in order
+    // to show that the operation works as expected without symbolic links.
+    //
+    file = baseProvider.getFile(file.resolveSymbolicLinksSync().path);
+    expect(file.resolveSymbolicLinksSync(), file);
+  }
+}
+
+@reflectiveTest
+class FolderTest extends OverlayTestSupport {
+  test_canonicalizePath_dot_absolute() {
+    Folder folder = _folder(exists: true, path: '/foo/bar');
+    expect(folder.canonicalizePath(baseProvider.convertPath('/a/b/./c')),
+        equals(baseProvider.convertPath('/a/b/c')));
+  }
+
+  test_canonicalizePath_dot_relative() {
+    Folder folder = _folder(exists: true, path: '/foo/bar');
+    expect(folder.canonicalizePath(baseProvider.convertPath('./baz')),
+        equals(baseProvider.convertPath('/foo/bar/baz')));
+  }
+
+  test_canonicalizePath_dotDot_absolute() {
+    Folder folder = _folder(exists: true, path: '/foo/bar');
+    expect(folder.canonicalizePath(baseProvider.convertPath('/a/b/../c')),
+        equals(baseProvider.convertPath('/a/c')));
+  }
+
+  test_canonicalizePath_dotDot_relative() {
+    Folder folder = _folder(exists: true, path: '/foo/bar');
+    expect(folder.canonicalizePath(baseProvider.convertPath('../baz')),
+        equals(baseProvider.convertPath('/foo/baz')));
+  }
+
+  test_canonicalizePath_simple_absolute() {
+    Folder folder = _folder(exists: true, path: '/foo/bar');
+    expect(folder.canonicalizePath(baseProvider.convertPath('/baz')),
+        equals(baseProvider.convertPath('/baz')));
+  }
+
+  test_canonicalizePath_simple_relative() {
+    Folder folder = _folder(exists: true, path: '/foo/bar');
+    expect(folder.canonicalizePath(baseProvider.convertPath('baz')),
+        equals(baseProvider.convertPath('/foo/bar/baz')));
+  }
+
+  @failingTest
+  test_changes() {
+    // TODO(brianwilkerson) Implement this.
+    fail('Not tested');
+  }
+
+  test_contains() {
+    Folder folder = _folder(exists: true);
+    expect(folder.contains(defaultFilePath), isTrue);
+  }
+
+  test_copyTo() {
+    String sourcePath = baseProvider.convertPath('/source');
+    String subdirPath = baseProvider.convertPath('/source/subdir');
+    baseProvider.newFolder(sourcePath);
+    baseProvider.newFolder(subdirPath);
+    baseProvider.newFile(
+        baseProvider.convertPath('/source/file1.txt'), 'file1');
+    baseProvider.newFile(
+        baseProvider.convertPath('/source/subdir/file2.txt'), 'file2');
+    Folder source = provider.getFolder(sourcePath);
+    Folder destination =
+        provider.getFolder(baseProvider.convertPath('/destination'));
+
+    Folder copy = source.copyTo(destination);
+    expect(copy.parent, destination);
+    _verifyStructure(copy, source);
+  }
+
+  test_create() {
+    Folder folder = _folder(exists: false);
+    expect(folder.exists, isFalse);
+    folder.create();
+    expect(folder.exists, isTrue);
+  }
+
+  test_delete_existing() {
+    Folder folder = _folder(exists: true);
+    expect(folder.exists, isTrue);
+    folder.delete();
+    expect(folder.exists, isFalse);
+  }
+
+  test_delete_notExisting() {
+    Folder folder = _folder(exists: false);
+    expect(folder.exists, isFalse);
+    expect(() => folder.delete(), throwsA(new isInstanceOf<ArgumentError>()));
+  }
+
+  test_exists_false() {
+    Folder folder = _folder(exists: false);
+    expect(folder.exists, isFalse);
+  }
+
+  test_exists_true() {
+    Folder folder = _folder(exists: true);
+    expect(folder.exists, isTrue);
+  }
+
+  test_getChild_file_existing() {
+    Folder folder = _folder(exists: true);
+    _file(exists: true);
+    Resource child = folder.getChild(defaultFilePath);
+    expect(child, _isFile);
+  }
+
+  test_getChild_file_notExisting() {
+    Folder folder = _folder(exists: true);
+    Resource child = folder.getChild(defaultFilePath);
+    expect(child, _isFile);
+  }
+
+  test_getChild_folder() {
+    Folder folder = _folder(exists: true);
+    String childPath = provider.pathContext.join(folder.path, 'lib');
+    _folder(exists: true, path: childPath);
+    Resource child = folder.getChild(childPath);
+    expect(child, _isFolder);
+  }
+
+  test_getChildAssumingFile() {
+    Folder folder = _folder(exists: true);
+    File child = folder.getChildAssumingFile('README.md');
+    expect(child, isNotNull);
+  }
+
+  test_getChildAssumingFolder() {
+    Folder folder = _folder(exists: true);
+    Folder child = folder.getChildAssumingFolder('lib');
+    expect(child, isNotNull);
+  }
+
+  test_getChildren() {
+    Folder folder = _folder(exists: true);
+    Folder child1 = _folder(
+        exists: true, path: provider.pathContext.join(folder.path, 'lib'));
+    _file(exists: true, path: provider.pathContext.join(child1.path, 'a.dart'));
+    File child2 = _file(
+        exists: true, path: provider.pathContext.join(folder.path, 'b.dart'));
+    File child3 = _file(
+        exists: false,
+        path: provider.pathContext.join(folder.path, 'c.dart'),
+        withOverlay: true);
+    List<Resource> children = folder.getChildren();
+    expect(children, hasLength(3));
+    expect(children.map((resource) => resource.path),
+        unorderedEquals([child1.path, child2.path, child3.path]));
+  }
+
+  test_isOrContains_false() {
+    Folder folder = _folder(exists: true);
+    expect(folder.isOrContains(baseProvider.convertPath('/foo/baz')), isFalse);
+  }
+
+  test_isOrContains_true_child() {
+    Folder folder = _folder(exists: true);
+    expect(folder.isOrContains(defaultFilePath), isTrue);
+  }
+
+  test_isOrContains_true_same() {
+    Folder folder = _folder(exists: true);
+    expect(folder.isOrContains(folder.path), isTrue);
+  }
+
+  test_parent_ofNonRoot() {
+    Folder parent = _folder(exists: true).parent;
+    expect(parent, isNotNull);
+    expect(parent.exists, isTrue);
+    expect(parent.path, baseProvider.convertPath('/foo'));
+  }
+
+  test_parent_ofRoot() {
+    Folder parent = _folder(exists: true, path: '/').parent;
+    expect(parent, isNull);
+  }
+
+  @failingTest
+  test_resolveSymbolicLinksSync_links() {
+    // TODO(brianwilkerson) Implement this.
+    fail('Not tested');
+  }
+
+  void test_resolveSymbolicLinksSync_noLinks_existingFile() {
+    _resolveSymbolicLinksSync_noLinks(
+        _folder(exists: true, path: '/temp/a/b/test.txt'));
+  }
+
+  void test_resolveSymbolicLinksSync_noLinks_notExisting() {
+    _resolveSymbolicLinksSync_noLinks(
+        _folder(exists: false, path: '/temp/a/b/test.txt'));
+  }
+
+  test_shortName() {
+    expect(_folder(exists: true).shortName, 'bar');
+  }
+
+  test_toUri() {
+    Folder folder = _folder(exists: true);
+    expect(folder.toUri(), new Uri.directory(folder.path));
+  }
+
+  void _resolveSymbolicLinksSync_noLinks(Folder folder) {
+    //
+    // On some platforms the path to the temp directory includes a symbolic
+    // link. We remove that from the equation before creating the File in order
+    // to show that the operation works as expected without symbolic links.
+    //
+    folder = baseProvider.getFolder(folder.resolveSymbolicLinksSync().path);
+    expect(folder.resolveSymbolicLinksSync(), folder);
+  }
+
+  /**
+   * Verify that the [copy] has the same name and content as the [source].
+   */
+  void _verifyStructure(Folder copy, Folder source) {
+    expect(copy.shortName, source.shortName);
+    Map<String, File> sourceFiles = <String, File>{};
+    Map<String, Folder> sourceFolders = <String, Folder>{};
+    for (Resource child in source.getChildren()) {
+      if (child is File) {
+        sourceFiles[child.shortName] = child;
+      } else if (child is Folder) {
+        sourceFolders[child.shortName] = child;
+      } else {
+        fail('Unknown class of resource: ${child.runtimeType}');
+      }
+    }
+    Map<String, File> copyFiles = <String, File>{};
+    Map<String, Folder> copyFolders = <String, Folder>{};
+    for (Resource child in source.getChildren()) {
+      if (child is File) {
+        copyFiles[child.shortName] = child;
+      } else if (child is Folder) {
+        copyFolders[child.shortName] = child;
+      } else {
+        fail('Unknown class of resource: ${child.runtimeType}');
+      }
+    }
+    for (String fileName in sourceFiles.keys) {
+      File sourceChild = sourceFiles[fileName];
+      File copiedChild = copyFiles[fileName];
+      if (copiedChild == null) {
+        fail('Failed to copy file ${sourceChild.path}');
+      }
+      expect(copiedChild.readAsStringSync(), sourceChild.readAsStringSync(),
+          reason: 'Incorrectly copied file ${sourceChild.path}');
+    }
+    for (String fileName in sourceFolders.keys) {
+      Folder sourceChild = sourceFolders[fileName];
+      Folder copiedChild = copyFolders[fileName];
+      if (copiedChild == null) {
+        fail('Failed to copy folder ${sourceChild.path}');
+      }
+      _verifyStructure(copiedChild, sourceChild);
+    }
+  }
+}
+
+@reflectiveTest
+class OverlayResourceProviderTest extends OverlayTestSupport {
+  test_getFile_existing_withoutOverlay() {
+    File file = _file(exists: true);
+    expect(file, isNotNull);
+    expect(file.path, defaultFilePath);
+    expect(file.exists, isTrue);
+  }
+
+  test_getFile_existing_withOverlay() {
+    File file = _file(exists: true, withOverlay: true);
+    expect(file, isNotNull);
+    expect(file.path, defaultFilePath);
+    expect(file.exists, isTrue);
+  }
+
+  test_getFile_notExisting_withoutOverlay() {
+    File file = _file(exists: false);
+    expect(file, isNotNull);
+    expect(file.path, defaultFilePath);
+    expect(file.exists, isFalse);
+  }
+
+  test_getFile_notExisting_withOverlay() {
+    File file = _file(exists: false, withOverlay: true);
+    expect(file, isNotNull);
+    expect(file.path, defaultFilePath);
+    expect(file.exists, isTrue);
+  }
+
+  test_getFolder_existing() {
+    Folder folder = _folder(exists: true);
+    expect(folder, isNotNull);
+    expect(folder.path, defaultFolderPath);
+    expect(folder.exists, isTrue);
+  }
+
+  test_getFolder_notExisting() {
+    Folder folder = _folder(exists: false);
+    expect(folder, isNotNull);
+    expect(folder.path, defaultFolderPath);
+    expect(folder.exists, isFalse);
+  }
+
+  test_getModificationTimes_withoutOverlay() async {
+    Source source = _file(exists: true).createSource();
+    List<int> times = await provider.getModificationTimes([source]);
+    expect(times, [source.modificationStamp]);
+  }
+
+  test_getModificationTimes_withOverlay() async {
+    Source source = _file(exists: true, withOverlay: true).createSource();
+    List<int> times = await provider.getModificationTimes([source]);
+    expect(times, [42]);
+  }
+
+  test_getResource_existingFile_withoutOverlay() {
+    String path = _file(exists: true).path;
+    Resource resource = provider.getResource(path);
+    expect(resource, _isFile);
+  }
+
+  test_getResource_existingFile_withOverlay() {
+    String path = _file(exists: true, withOverlay: true).path;
+    Resource resource = provider.getResource(path);
+    expect(resource, _isFile);
+  }
+
+  test_getResource_existingFolder() {
+    String path = _folder(exists: true).path;
+    Resource resource = provider.getResource(path);
+    expect(resource, _isFolder);
+  }
+
+  test_getResource_notExisting_withoutOverlay() {
+    String path = _file(exists: false).path;
+    Resource resource = provider.getResource(path);
+    expect(resource, _isFile);
+  }
+
+  test_getResource_notExisting_withOverlay() {
+    String path = _file(exists: false, withOverlay: true).path;
+    Resource resource = provider.getResource(path);
+    expect(resource, _isFile);
+  }
+
+  test_getStateLocation_uniqueness() {
+    String idOne = 'one';
+    Folder folderOne = provider.getStateLocation(idOne);
+    expect(folderOne, isNotNull);
+    String idTwo = 'two';
+    Folder folderTwo = provider.getStateLocation(idTwo);
+    expect(folderTwo, isNotNull);
+    expect(folderTwo, isNot(equals(folderOne)));
+    expect(provider.getStateLocation(idOne), equals(folderOne));
+  }
+
+  test_pathContext() {
+    expect(provider.pathContext, baseProvider.pathContext);
+  }
+}
+
+class OverlayTestSupport {
+  MemoryResourceProvider baseProvider;
+  OverlayResourceProvider provider;
+
+  String defaultFolderPath;
+  String defaultFilePath;
+
+  void setUp() {
+    baseProvider = new MemoryResourceProvider();
+    provider = new OverlayResourceProvider(baseProvider);
+
+    defaultFolderPath = baseProvider.convertPath('/foo/bar');
+    defaultFilePath = baseProvider.convertPath('/foo/bar/test.dart');
+  }
+
+  File _file(
+      {@required bool exists,
+      String content,
+      String path,
+      bool withOverlay = false}) {
+    if (path == null) {
+      path = defaultFilePath;
+    } else {
+      path = baseProvider.convertPath(path);
+    }
+    if (exists) {
+      baseProvider.newFile(path, content ?? 'a');
+    }
+    if (withOverlay) {
+      provider.setOverlay(path, content: 'bbb', modificationStamp: 42);
+    }
+    return provider.getFile(path);
+  }
+
+  Folder _folder({@required bool exists, String path}) {
+    if (path == null) {
+      path = defaultFolderPath;
+    } else {
+      path = baseProvider.convertPath(path);
+    }
+    if (exists) {
+      baseProvider.newFolder(path);
+    }
+    return provider.getFolder(path);
+  }
+}
diff --git a/pkg/analyzer/test/file_system/test_all.dart b/pkg/analyzer/test/file_system/test_all.dart
index 75a06d2..05d9220 100644
--- a/pkg/analyzer/test/file_system/test_all.dart
+++ b/pkg/analyzer/test/file_system/test_all.dart
@@ -2,20 +2,19 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer.test.file_system.test_all;
-
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import 'memory_file_system_test.dart' as memory_file_system_test;
-import 'physical_resource_provider_test.dart'
-    as physical_resource_provider_test;
-import 'resource_uri_resolver_test.dart' as resource_uri_resolver_test;
+import 'memory_file_system_test.dart' as memory_file_system;
+import 'overlay_file_system_test.dart' as overlay_file_system;
+import 'physical_resource_provider_test.dart' as physical_resource_provider;
+import 'resource_uri_resolver_test.dart' as resource_uri_resolver;
 
 /// Utility for manually running all tests.
 main() {
   defineReflectiveSuite(() {
-    memory_file_system_test.main();
-    physical_resource_provider_test.main();
-    resource_uri_resolver_test.main();
+    memory_file_system.main();
+    overlay_file_system.main();
+    physical_resource_provider.main();
+    resource_uri_resolver.main();
   }, name: 'file system');
 }
diff --git a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
index 629ddde..171376f 100644
--- a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(CheckedModeCompileTimeErrorCodeTest_Kernel);
+    defineReflectiveTests(CheckedModeCompileTimeErrorCodeTest_Kernel);
   });
 }
 
@@ -172,6 +170,12 @@
   }
 
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31936')
+  @override
+  test_listLiteral_inferredElementType() async =>
+      super.test_listLiteral_inferredElementType();
+
+  @failingTest
   @override
   test_mapKeyTypeNotAssignable() async {
     // Expected 1 errors of type CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, found 0;
@@ -180,6 +184,18 @@
   }
 
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31936')
+  @override
+  test_mapLiteral_inferredKeyType() async =>
+      super.test_mapLiteral_inferredKeyType();
+
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31936')
+  @override
+  test_mapLiteral_inferredValueType() async =>
+      super.test_mapLiteral_inferredValueType();
+
+  @failingTest
   @override
   test_mapValueTypeNotAssignable() async {
     // Expected 1 errors of type CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, found 0;
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
index 9832e8c..765ee32 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(CompileTimeErrorCodeTest_Kernel);
+    defineReflectiveTests(CompileTimeErrorCodeTest_Kernel);
   });
 }
 
@@ -35,6 +33,11 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/12916')
+  test_ambiguousExport() async => super.test_ambiguousExport();
+
+  @override
+  @failingTest
   test_annotationWithNotClass() async {
     // Bad state: No reference information for property at 117
     await super.test_annotationWithNotClass();
@@ -70,6 +73,13 @@
 
   @override
   @failingTest
+  test_async_used_as_identifier_in_prefix() {
+    // NoSuchMethodError: The getter 'element' was called on null.
+    return super.test_async_used_as_identifier_in_prefix();
+  }
+
+  @override
+  @failingTest
   test_bug_23176() async {
     // This test fails because the kernel driver element model produces a
     // different element model result than the regular parser produces. Once these
@@ -438,22 +448,6 @@
 
   @override
   @failingTest
-  test_constInitializedWithNonConstValue_missingConstInListLiteral() async {
-    // Expected 1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
-    await super
-        .test_constInitializedWithNonConstValue_missingConstInListLiteral();
-  }
-
-  @override
-  @failingTest
-  test_constInitializedWithNonConstValue_missingConstInMapLiteral() async {
-    // Expected 1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
-    await super
-        .test_constInitializedWithNonConstValue_missingConstInMapLiteral();
-  }
-
-  @override
-  @failingTest
   test_constInitializedWithNonConstValueFromDeferredClass() async {
     // Bad state: Expected element reference for analyzer offset 58; got one for kernel offset 60
     await super.test_constInitializedWithNonConstValueFromDeferredClass();
@@ -965,21 +959,6 @@
 
   @override
   @failingTest
-  test_fieldInitializerOutsideConstructor_defaultParameter() async {
-    // Expected 1 errors of type CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, found 0
-    await super.test_fieldInitializerOutsideConstructor_defaultParameter();
-  }
-
-  @override
-  @failingTest
-  test_fieldInitializerOutsideConstructor_inFunctionTypeParameter() async {
-    // Expected 1 errors of type CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, found 0
-    await super
-        .test_fieldInitializerOutsideConstructor_inFunctionTypeParameter();
-  }
-
-  @override
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30982')
   test_fieldInitializerRedirectingConstructor_afterRedirection() async {
     return super.test_fieldInitializerRedirectingConstructor_afterRedirection();
@@ -1025,20 +1004,6 @@
 
   @override
   @failingTest
-  test_finalNotInitialized_instanceField_const_static() async {
-    // Bad state: Some types were not consumed, starting at offset 26
-    await super.test_finalNotInitialized_instanceField_const_static();
-  }
-
-  @override
-  @failingTest
-  test_finalNotInitialized_library_const() async {
-    // Bad state: Some types were not consumed, starting at offset 7
-    await super.test_finalNotInitialized_library_const();
-  }
-
-  @override
-  @failingTest
   test_finalNotInitialized_local_const() async {
     // Expected 1 errors of type CompileTimeErrorCode.CONST_NOT_INITIALIZED, found 0
     await super.test_finalNotInitialized_local_const();
@@ -2724,13 +2689,6 @@
 
   @override
   @failingTest
-  test_referencedBeforeDeclaration_hideInBlock_function() async {
-    // Bad state: No declaration information for v() {} at 34
-    await super.test_referencedBeforeDeclaration_hideInBlock_function();
-  }
-
-  @override
-  @failingTest
   test_referencedBeforeDeclaration_hideInBlock_local() async {
     // Bad state: No type information for v at 38
     await super.test_referencedBeforeDeclaration_hideInBlock_local();
@@ -2759,13 +2717,6 @@
 
   @override
   @failingTest
-  test_referencedBeforeDeclaration_type_localFunction() async {
-    // Bad state: No declaration information for int String(int x) => x + 1; at 40
-    await super.test_referencedBeforeDeclaration_type_localFunction();
-  }
-
-  @override
-  @failingTest
   test_referencedBeforeDeclaration_type_localVariable() async {
     // Bad state: No type information for String at 44
     await super.test_referencedBeforeDeclaration_type_localVariable();
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 06b1454..5423d74 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -564,7 +564,6 @@
     verify([source]);
   }
 
-  @failingTest
   test_awaitInWrongContext_syncStar() async {
     // This test requires better error recovery than we currently have. In
     // particular, we need to be able to distinguish between an await expression
@@ -574,7 +573,9 @@
   yield await x;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT]);
+    if (usingFastaParser) {
+      assertErrors(source, [CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT]);
+    }
     verify([source]);
   }
 
@@ -588,10 +589,18 @@
 }
 ''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      ParserErrorCode.EXPECTED_CLASS_MEMBER,
-      ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE
-    ]);
+    assertErrors(
+        source,
+        usingFastaParser
+            ? [
+                ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE,
+                ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE,
+                ParserErrorCode.EXPECTED_TOKEN
+              ]
+            : [
+                ParserErrorCode.EXPECTED_CLASS_MEMBER,
+                ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE
+              ]);
     verify([source]);
   }
 
@@ -655,7 +664,15 @@
   typedef x;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
+    assertErrors(
+        source,
+        usingFastaParser
+            ? [
+                StaticWarningCode.UNDEFINED_IDENTIFIER,
+                StaticWarningCode.UNDEFINED_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ]
+            : [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
     verify([source]);
   }
 
@@ -2203,17 +2220,32 @@
   test_extendsDisallowedClass_class_double() async {
     Source source = addSource("class A extends double {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   test_extendsDisallowedClass_class_int() async {
     Source source = addSource("class A extends int {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-      CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+              ]);
     verify([source]);
   }
 
@@ -2230,17 +2262,32 @@
   test_extendsDisallowedClass_class_num() async {
     Source source = addSource("class A extends num {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   test_extendsDisallowedClass_class_String() async {
     Source source = addSource("class A extends String {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-      CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+              ]);
     verify([source]);
   }
 
@@ -2265,7 +2312,14 @@
 class M {}
 class C = double with M;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2279,7 +2333,8 @@
         useCFE
             ? [
                 CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
               ]
             : [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
@@ -2299,7 +2354,14 @@
 class M {}
 class C = num with M;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2313,7 +2375,8 @@
         useCFE
             ? [
                 CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
               ]
             : [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
@@ -2738,22 +2801,28 @@
   test_implementsDisallowedClass_class_double() async {
     Source source = addSource("class A implements double {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   test_implementsDisallowedClass_class_int() async {
     Source source = addSource("class A implements int {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2771,22 +2840,28 @@
   test_implementsDisallowedClass_class_num() async {
     Source source = addSource("class A implements num {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   test_implementsDisallowedClass_class_String() async {
     Source source = addSource("class A implements String {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2824,11 +2899,14 @@
 class M {}
 class C = A with M implements double;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2838,11 +2916,14 @@
 class M {}
 class C = A with M implements int;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2866,11 +2947,14 @@
 class M {}
 class C = A with M implements num;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2880,11 +2964,14 @@
 class M {}
 class C = A with M implements String;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -4370,22 +4457,28 @@
   test_mixinOfDisallowedClass_class_double() async {
     Source source = addSource("class A extends Object with double {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   test_mixinOfDisallowedClass_class_int() async {
     Source source = addSource("class A extends Object with int {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -4403,22 +4496,28 @@
   test_mixinOfDisallowedClass_class_num() async {
     Source source = addSource("class A extends Object with num {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   test_mixinOfDisallowedClass_class_String() async {
     Source source = addSource("class A extends Object with String {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -4440,11 +4539,14 @@
 class A {}
 class C = A with double;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -4453,11 +4555,14 @@
 class A {}
 class C = A with int;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -4479,11 +4584,14 @@
 class A {}
 class C = A with num;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -4492,11 +4600,14 @@
 class A {}
 class C = A with String;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -5105,7 +5216,23 @@
 }''');
     await computeAnalysisResult(source);
     assertErrors(
-        source, [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT]);
+        source,
+        usingFastaParser
+            ? [
+                // TODO(danrubel): Consider improving recovery
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.UNEXPECTED_TOKEN,
+                ParserErrorCode.UNEXPECTED_TOKEN,
+                ParserErrorCode.UNEXPECTED_TOKEN,
+              ]
+            : [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT]);
     verify([source]);
   }
 
@@ -5116,7 +5243,21 @@
 }''');
     await computeAnalysisResult(source);
     assertErrors(
-        source, [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT]);
+        source,
+        usingFastaParser
+            ? [
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.UNEXPECTED_TOKEN,
+                ParserErrorCode.UNEXPECTED_TOKEN,
+                ParserErrorCode.UNEXPECTED_TOKEN,
+              ]
+            : [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT]);
     verify([source]);
   }
 
@@ -6494,7 +6635,14 @@
   return 0;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.RETURN_IN_GENERATOR]);
+    assertErrors(
+        source,
+        usingFastaParser
+            ? [
+                CompileTimeErrorCode.RETURN_IN_GENERATOR,
+                CompileTimeErrorCode.RETURN_IN_GENERATOR
+              ]
+            : [CompileTimeErrorCode.RETURN_IN_GENERATOR]);
     verify([source]);
   }
 
@@ -6504,7 +6652,14 @@
   return 0;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.RETURN_IN_GENERATOR]);
+    assertErrors(
+        source,
+        usingFastaParser
+            ? [
+                CompileTimeErrorCode.RETURN_IN_GENERATOR,
+                CompileTimeErrorCode.RETURN_IN_GENERATOR
+              ]
+            : [CompileTimeErrorCode.RETURN_IN_GENERATOR]);
     verify([source]);
   }
 
@@ -6680,10 +6835,14 @@
 f(this.x(y)) {}
 ''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
-      CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR
-    ]);
+    assertErrors(
+        source,
+        usingFastaParser
+            ? [CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR]
+            : [
+                ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
+                CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR
+              ]);
     verify([source]);
   }
 
diff --git a/pkg/analyzer/test/generated/declaration_resolver_test.dart b/pkg/analyzer/test/generated/declaration_resolver_test.dart
index 6ad2446..e93560a3 100644
--- a/pkg/analyzer/test/generated/declaration_resolver_test.dart
+++ b/pkg/analyzer/test/generated/declaration_resolver_test.dart
@@ -247,7 +247,12 @@
     // analyzer.  TODO(paulberry): is this a bug?
     FunctionDeclaration node = EngineTestCase.findNode(
         unit, code, 'g', (AstNode n) => n is FunctionDeclaration);
-    expect((node as FunctionDeclarationImpl).metadata, isEmpty);
+    NodeList<Annotation> metadata = (node as FunctionDeclarationImpl).metadata;
+    if (usingFastaParser) {
+      expect(metadata, hasLength(1));
+    } else {
+      expect(metadata, isEmpty);
+    }
   }
 
   test_metadata_localVariableDeclaration() async {
@@ -814,6 +819,8 @@
   }
 
   test_genericFunction_typeParameter() async {
+    // Fasta ignores generic type comments
+    if (usingFastaParser) return;
     String code = r'''
 /*=T*/ max/*<T>*/(/*=T*/ x, /*=T*/ y) => null;
 ''';
@@ -836,6 +843,8 @@
   }
 
   test_genericMethod_typeParameter() async {
+    // Fasta ignores generic type comments
+    if (usingFastaParser) return;
     String code = r'''
 class C {
   /*=T*/ max/*<T>*/(/*=T*/ x, /*=T*/ y) => null;
diff --git a/pkg/analyzer/test/generated/error_suppression_kernel_test.dart b/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
index 34fc3ca..410dd7e 100644
--- a/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
+++ b/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(ErrorSuppressionTest_Kernel);
+    defineReflectiveTests(ErrorSuppressionTest_Kernel);
   });
 }
 
diff --git a/pkg/analyzer/test/generated/hint_code_kernel_test.dart b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
index 6f6314d..ad843c2 100644
--- a/pkg/analyzer/test/generated/hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(HintCodeTest_Kernel);
+    defineReflectiveTests(HintCodeTest_Kernel);
   });
 }
 
@@ -66,41 +64,6 @@
 
   @failingTest
   @override
-  test_canBeNullAfterNullAware_after_cascade() async {
-    // Expected 1 errors of type HintCode.CAN_BE_NULL_AFTER_NULL_AWARE, found 0
-    return super.test_canBeNullAfterNullAware_after_cascade();
-  }
-
-  @failingTest
-  @override
-  test_deadCode_deadBlock_else() async {
-    // Expected 1 errors of type HintCode.DEAD_CODE, found 0
-    return super.test_deadCode_deadBlock_else();
-  }
-
-  @failingTest
-  @override
-  test_deadCode_deadBlock_else_nested() async {
-    // Expected 1 errors of type HintCode.DEAD_CODE, found 0
-    return super.test_deadCode_deadBlock_else_nested();
-  }
-
-  @failingTest
-  @override
-  test_deadCode_deadBlock_if() async {
-    // Expected 1 errors of type HintCode.DEAD_CODE, found 0
-    return super.test_deadCode_deadBlock_if();
-  }
-
-  @failingTest
-  @override
-  test_deadCode_deadBlock_if_nested() async {
-    // Expected 1 errors of type HintCode.DEAD_CODE, found 0
-    return super.test_deadCode_deadBlock_if_nested();
-  }
-
-  @failingTest
-  @override
   test_deadCode_deadFinalStatementInCase() async {
     // Expected 1 errors of type StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, found 0
     return super.test_deadCode_deadFinalStatementInCase();
@@ -173,37 +136,16 @@
 
   @failingTest
   @override
-  test_divisionOptimization_propagatedType() async {
-    // Expected 1 errors of type HintCode.DIVISION_OPTIMIZATION, found 0
-    return super.test_divisionOptimization_propagatedType();
+  test_duplicateShownHiddenName_hidden() {
+    // Expected 1 errors of type HintCode.DUPLICATE_HIDDEN_NAME, found 0
+    return super.test_duplicateShownHiddenName_hidden();
   }
 
   @failingTest
   @override
-  test_invalidAssignment_instanceVariable() async {
-    // Expected 1 errors of type HintCode.INVALID_ASSIGNMENT, found 0
-    return super.test_invalidAssignment_instanceVariable();
-  }
-
-  @failingTest
-  @override
-  test_invalidAssignment_localVariable() async {
-    // Expected 1 errors of type HintCode.INVALID_ASSIGNMENT, found 0
-    return super.test_invalidAssignment_localVariable();
-  }
-
-  @failingTest
-  @override
-  test_invalidAssignment_staticVariable() async {
-    // Expected 1 errors of type HintCode.INVALID_ASSIGNMENT, found 0
-    return super.test_invalidAssignment_staticVariable();
-  }
-
-  @failingTest
-  @override
-  test_invalidAssignment_variableDeclaration() async {
-    // UnimplementedError: Multiple field
-    return super.test_invalidAssignment_variableDeclaration();
+  test_duplicateShownHiddenName_shown() {
+    // Expected 1 errors of type HintCode.DUPLICATE_SHOWN_NAME, found 0
+    return super.test_duplicateShownHiddenName_shown();
   }
 
   @override
@@ -237,6 +179,13 @@
     return super.test_invalidRequiredParam_valid();
   }
 
+  @override
+  @failingTest
+  test_isNotDouble() {
+    // Bad state: No data for is at 10
+    return super.test_isNotDouble();
+  }
+
   @failingTest
   @override
   test_js_lib_OK() async {
@@ -300,6 +249,13 @@
     return super.test_mustCallSuper_indirect();
   }
 
+  @failingTest
+  @override
+  test_nullAwareBeforeOperator_ok_is_not() {
+    // Bad state: No data for is at 14
+    return super.test_nullAwareBeforeOperator_ok_is_not();
+  }
+
   @override
   @failingTest
   test_required_constructor_param() async {
@@ -374,6 +330,14 @@
     return super.test_strongMode_downCastCompositeWarn();
   }
 
+  @failingTest
+  @override
+  test_strongMode_topLevelInstanceGetter_implicitlyTyped_field_call() {
+    // NoSuchMethodError: The setter 'enclosingElement=' was called on null.
+    return super
+        .test_strongMode_topLevelInstanceGetter_implicitlyTyped_field_call();
+  }
+
   @override
   @failingTest
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_invoke() {
@@ -390,23 +354,41 @@
 
   @failingTest
   @override
-  test_undefinedGetter() async {
-    // Expected 1 errors of type HintCode.UNDEFINED_GETTER, found 0
-    return super.test_undefinedGetter();
+  test_strongMode_topLevelInstanceGetter_implicitlyTyped_invoke_not_generic() {
+    // NoSuchMethodError: The setter 'enclosingElement=' was called on null.
+    return super
+        .test_strongMode_topLevelInstanceGetter_implicitlyTyped_invoke_not_generic();
   }
 
   @failingTest
   @override
-  test_undefinedMethod() async {
-    // Expected 1 errors of type HintCode.UNDEFINED_METHOD, found 0
-    return super.test_undefinedMethod();
+  test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_explicit_type_params_prefixed() {
+    // NoSuchMethodError: The setter 'enclosingElement=' was called on null.
+    return super
+        .test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_explicit_type_params_prefixed();
   }
 
   @failingTest
   @override
-  test_undefinedMethod_assignmentExpression() async {
-    // Expected 1 errors of type HintCode.UNDEFINED_METHOD, found 0
-    return super.test_undefinedMethod_assignmentExpression();
+  test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_not_generic_prefixed() {
+    // NoSuchMethodError: The getter 'element' was called on null.
+    return super
+        .test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_not_generic_prefixed();
+  }
+
+  @failingTest
+  @override
+  test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_prefixed() {
+    // NoSuchMethodError: The getter 'element' was called on null.
+    return super
+        .test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_prefixed();
+  }
+
+  @failingTest
+  @override
+  test_typeCheck_type_not_Null() {
+    // Bad state: No data for is at 20
+    return super.test_typeCheck_type_not_Null();
   }
 
   @failingTest
@@ -439,23 +421,23 @@
 
   @failingTest
   @override
-  test_undefinedOperator_postfixExpression() async {
-    // Expected 1 errors of type HintCode.UNDEFINED_OPERATOR, found 0
-    return super.test_undefinedOperator_postfixExpression();
+  test_unnecessaryTypeCheck_null_not_Null() {
+    // Bad state: No data for is at 14
+    return super.test_unnecessaryTypeCheck_null_not_Null();
   }
 
   @failingTest
   @override
-  test_undefinedOperator_prefixExpression() async {
-    // Expected 1 errors of type HintCode.UNDEFINED_OPERATOR, found 0
-    return super.test_undefinedOperator_prefixExpression();
+  test_unnecessaryTypeCheck_type_not_dynamic() {
+    // Bad state: No data for is at 20
+    return super.test_unnecessaryTypeCheck_type_not_dynamic();
   }
 
   @failingTest
   @override
-  test_undefinedSetter() async {
-    // Expected 1 errors of type HintCode.UNDEFINED_SETTER, found 0
-    return super.test_undefinedSetter();
+  test_unnecessaryTypeCheck_type_not_object() {
+    // Bad state: No data for is at 20
+    return super.test_unnecessaryTypeCheck_type_not_object();
   }
 
   @failingTest
@@ -493,16 +475,4 @@
     // Expected 1 errors of type HintCode.UNUSED_SHOWN_NAME, found 0
     return super.test_unusedShownName_topLevelVariable();
   }
-
-  @failingTest
-  @override
-  test_importDeferredLibraryWithLoadFunction() async {
-    await super.test_importDeferredLibraryWithLoadFunction();
-  }
-
-  @failingTest
-  @override
-  test_no_missingReturn_async_futureOrVoid() async {
-    await super.test_no_missingReturn_async_futureOrVoid();
-  }
 }
diff --git a/pkg/analyzer/test/generated/hint_code_test.dart b/pkg/analyzer/test/generated/hint_code_test.dart
index f37baf0..1ee7d3e 100644
--- a/pkg/analyzer/test/generated/hint_code_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_test.dart
@@ -2573,11 +2573,7 @@
 FutureOr<void> f(Future f) async {}
 ''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [HintCode.MISSING_RETURN]);
-    } else {
-      assertNoErrors(source);
-    }
+    assertNoErrors(source);
     verify([source]);
   }
 
diff --git a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
index c52404a..2f7a8c9 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(NonErrorResolverTest_Kernel);
+    defineReflectiveTests(NonErrorResolverTest_Kernel);
   });
 }
 
@@ -45,10 +43,16 @@
 
   @override
   @failingTest
-  @notForDart2
-  test_async_return_flattens_futures() async {
-    // Only FutureOr is flattened.
-    return super.test_async_return_flattens_futures();
+  test_argumentTypeNotAssignable_invocation_typedef_generic() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_argumentTypeNotAssignable_invocation_typedef_generic();
+  }
+
+  @override
+  @failingTest
+  test_argumentTypeNotAssignable_optionalNew() {
+    // Bad state: No data for (builder: () {return Widget();}) at 164
+    return super.test_argumentTypeNotAssignable_optionalNew();
   }
 
   @override
@@ -123,6 +127,13 @@
 
   @override
   @failingTest
+  test_const_dynamic() {
+    // UnimplementedError: TODO(paulberry): DynamicType
+    return super.test_const_dynamic();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_constConstructorWithNonConstSuper_unresolved() async {
     return super.test_constConstructorWithNonConstSuper_unresolved();
@@ -151,6 +162,34 @@
 
   @override
   @failingTest
+  test_duplicateDefinition_emptyName() {
+    // NoSuchMethodError: The setter 'enclosingElement=' was called on null.
+    return super.test_duplicateDefinition_emptyName();
+  }
+
+  @override
+  @failingTest
+  test_dynamicIdentifier() {
+    // UnimplementedError: TODO(paulberry): DynamicType
+    return super.test_dynamicIdentifier();
+  }
+
+  @override
+  @failingTest
+  test_fieldFormalParameter_genericFunctionTyped() {
+    // Expected 0 errors of type ParserErrorCode.EXPECTED_TOKEN, found 1 (88)
+    return super.test_fieldFormalParameter_genericFunctionTyped();
+  }
+
+  @override
+  @failingTest
+  test_fieldFormalParameter_genericFunctionTyped_named() {
+    // Expected 0 errors of type ParserErrorCode.EXPECTED_TOKEN, found 1 (89)
+    return super.test_fieldFormalParameter_genericFunctionTyped_named();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_finalNotInitialized_hasNativeClause_hasConstructor() async {
     return super.test_finalNotInitialized_hasNativeClause_hasConstructor();
@@ -165,13 +204,6 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_forEach_genericFunctionType() async {
-    return super.test_forEach_genericFunctionType();
-  }
-
-  @override
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
   test_functionDeclaration_scope_signature() async {
     return super.test_functionDeclaration_scope_signature();
@@ -186,11 +218,62 @@
 
   @override
   @failingTest
+  test_genericTypeAlias_castsAndTypeChecks_hasTypeParameters() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_genericTypeAlias_castsAndTypeChecks_hasTypeParameters();
+  }
+
+  @override
+  @failingTest
+  test_genericTypeAlias_castsAndTypeChecks_noTypeParameters() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_genericTypeAlias_castsAndTypeChecks_noTypeParameters();
+  }
+
+  @override
+  @failingTest
+  test_genericTypeAlias_fieldAndReturnType_noTypeParameters() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_genericTypeAlias_fieldAndReturnType_noTypeParameters();
+  }
+
+  @override
+  @failingTest
+  test_genericTypeAlias_fieldAndReturnType_typeParameters_arguments() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super
+        .test_genericTypeAlias_fieldAndReturnType_typeParameters_arguments();
+  }
+
+  @override
+  @failingTest
+  test_genericTypeAlias_fieldAndReturnType_typeParameters_noArguments() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super
+        .test_genericTypeAlias_fieldAndReturnType_typeParameters_noArguments();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_genericTypeAlias_invalidGenericFunctionType() async {
     return super.test_genericTypeAlias_invalidGenericFunctionType();
   }
 
+  @override
+  @failingTest
+  test_genericTypeAlias_noTypeParameters() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_genericTypeAlias_noTypeParameters();
+  }
+
+  @override
+  @failingTest
+  test_genericTypeAlias_typeParameters() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_genericTypeAlias_typeParameters();
+  }
+
   @override // passes with kernel
   test_infer_mixin() => super.test_infer_mixin();
 
@@ -200,16 +283,6 @@
 
   @override
   @failingTest
-  test_infer_mixin_with_substitution() =>
-      super.test_infer_mixin_with_substitution();
-
-  @override
-  @failingTest
-  test_infer_mixin_with_substitution_functionType() =>
-      super.test_infer_mixin_with_substitution_functionType();
-
-  @override
-  @failingTest
   @potentialAnalyzerProblem
   test_integerLiteralOutOfRange_negative_valid() async {
     return super.test_integerLiteralOutOfRange_negative_valid();
@@ -224,6 +297,47 @@
 
   @override
   @failingTest
+  test_invalidAnnotation_constantVariable_field_importWithPrefix() {
+    // type 'PrefixedIdentifierImpl' is not a subtype of type 'SimpleIdentifier'
+    // of 'topEntity'
+    return super
+        .test_invalidAnnotation_constantVariable_field_importWithPrefix();
+  }
+
+  @override
+  @failingTest
+  test_invalidAnnotation_constantVariable_topLevel_importWithPrefix() {
+    // type 'PrefixedIdentifierImpl' is not a subtype of type 'SimpleIdentifier'
+    // of 'topEntity'
+    return super
+        .test_invalidAnnotation_constantVariable_topLevel_importWithPrefix();
+  }
+
+  @override
+  @failingTest
+  test_invalidAnnotation_constConstructor_importWithPrefix() {
+    // type 'PrefixedIdentifierImpl' is not a subtype of type 'SimpleIdentifier'
+    // of 'topEntity'
+    return super.test_invalidAnnotation_constConstructor_importWithPrefix();
+  }
+
+  @override
+  @failingTest
+  test_invalidAnnotation_constConstructor_named_importWithPrefix() {
+    // Bad state: No data for named at 29
+    return super
+        .test_invalidAnnotation_constConstructor_named_importWithPrefix();
+  }
+
+  @override
+  @failingTest
+  test_invocationOfNonFunction_functionTypeTypeParameter() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_invocationOfNonFunction_functionTypeTypeParameter();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31758')
   test_invocationOfNonFunction_Object() async {
     return super.test_invocationOfNonFunction_Object();
@@ -231,6 +345,13 @@
 
   @override
   @failingTest
+  test_issue_32394() {
+    // Failed assertion: line 1133 pos 12: 'element != null': is not true.
+    return super.test_issue_32394();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_loadLibraryDefined() async {
     return super.test_loadLibraryDefined();
@@ -238,6 +359,14 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/30609')
+  test_metadata_enumConstantDeclaration() {
+    // Failed to resolve 2 nodes
+    return super.test_metadata_enumConstantDeclaration();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
   test_methodDeclaration_scope_signature() async {
     return super.test_methodDeclaration_scope_signature();
@@ -245,6 +374,13 @@
 
   @override
   @failingTest
+  test_nativeConstConstructor() {
+    // Expected 0 errors of type ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY, found 1 (35)
+    return super.test_nativeConstConstructor();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31628')
   test_nonConstCaseExpression_constField() async {
     return super.test_nonConstCaseExpression_constField();
@@ -273,16 +409,16 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_returnOfInvalidType_typeParameter_18468() async {
-    return super.test_returnOfInvalidType_typeParameter_18468();
+  test_optionalNew_rewrite_instantiatesToBounds() {
+    // Bad state: No data for named1 at 21
+    return super.test_optionalNew_rewrite_instantiatesToBounds();
   }
 
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_sharedDeferredPrefix() async {
-    return super.test_sharedDeferredPrefix();
+  test_returnOfInvalidType_typeParameter_18468() async {
+    return super.test_returnOfInvalidType_typeParameter_18468();
   }
 
   @override
@@ -301,9 +437,9 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_undefinedIdentifier_synthetic_whenExpression() async {
-    return super.test_undefinedIdentifier_synthetic_whenExpression();
+  test_undefinedGetter_static_conditionalAccess() {
+    // Bad state: No data for A at 36
+    return super.test_undefinedGetter_static_conditionalAccess();
   }
 
   @override
@@ -312,4 +448,18 @@
   test_undefinedIdentifier_synthetic_whenMethodName() async {
     return super.test_undefinedIdentifier_synthetic_whenMethodName();
   }
+
+  @override
+  @failingTest
+  test_undefinedMethod_static_conditionalAccess() {
+    // Bad state: No data for A at 39
+    return super.test_undefinedMethod_static_conditionalAccess();
+  }
+
+  @override
+  @failingTest
+  test_undefinedSetter_static_conditionalAccess() {
+    // Bad state: No data for A at 34
+    return super.test_undefinedSetter_static_conditionalAccess();
+  }
 }
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index f425dce..1084149 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -664,18 +664,6 @@
     verify([source]);
   }
 
-  test_async_future_object_with_return() async {
-    Source source = addSource('''
-import 'dart:async';
-Future<Object> f() async {
-  return;
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   test_async_future_object_with_return_value() async {
     Source source = addSource('''
 import 'dart:async';
@@ -722,19 +710,6 @@
     verify([source]);
   }
 
-  test_async_return_flattens_futures() async {
-    Source source = addSource('''
-import 'dart:async';
-Future<int> f() async {
-  return g();
-}
-Future<Future<int>> g() => null;
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   test_async_with_return() async {
     Source source = addSource('''
 f() async {
@@ -789,14 +764,11 @@
   }
 
   test_await_flattened() async {
-    // The analyzer type system over-flattens so it considers `await ffi()` to
-    // have type `int` - see dartbug.com/31887
-    var expectedType = enableKernelDriver ? 'Future<int>' : 'int';
     Source source = addSource('''
 import 'dart:async';
 Future<Future<int>> ffi() => null;
 f() async {
-  $expectedType b = await ffi();
+  Future<int> b = await ffi();
 }
 ''');
     await computeAnalysisResult(source);
diff --git a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
index 082ef32..dc39f65 100644
--- a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
@@ -11,9 +11,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(NonHintCodeTest_Kernel);
+    defineReflectiveTests(NonHintCodeTest_Kernel);
   });
 }
 
@@ -39,6 +37,40 @@
   @override
   bool get useCFE => true;
 
+  @override
+  @failingTest
+  test_deprecatedAnnotationUse_namedParameter_inDefiningFunction() {
+    // Failed assertion: line 215 pos 14: 'node.parent is PartOfDirective ||
+    // node.parent is EnumConstantDeclaration': is not true.
+    return super
+        .test_deprecatedAnnotationUse_namedParameter_inDefiningFunction();
+  }
+
+  @override
+  @failingTest
+  test_deprecatedAnnotationUse_namedParameter_inNestedLocalFunction() {
+    // Failed assertion: line 215 pos 14: 'node.parent is PartOfDirective ||
+    // node.parent is EnumConstantDeclaration': is not true.
+    return super
+        .test_deprecatedAnnotationUse_namedParameter_inNestedLocalFunction();
+  }
+
+  @override
+  @failingTest
+  test_deprecatedAnnotationUse_namedParameter_inDefiningMethod() {
+    // Failed assertion: line 215 pos 14: 'node.parent is PartOfDirective ||
+    // node.parent is EnumConstantDeclaration': is not true.
+    return super.test_deprecatedAnnotationUse_namedParameter_inDefiningMethod();
+  }
+
+  @override
+  @failingTest
+  test_deprecatedAnnotationUse_namedParameter_inDefiningLocalFunction() {
+    // Failed to resolve 1 nodes
+    return super
+        .test_deprecatedAnnotationUse_namedParameter_inDefiningLocalFunction();
+  }
+
   @failingTest
   @override
   @potentialAnalyzerProblem
@@ -51,20 +83,6 @@
   @override
   @failingTest
   @notForDart2
-  test_undefinedGetter_inSubtype() async {
-    await super.test_undefinedGetter_inSubtype();
-  }
-
-  @override
-  @failingTest
-  @notForDart2
-  test_undefinedMethod_inSubtype() async {
-    await super.test_undefinedMethod_inSubtype();
-  }
-
-  @override
-  @failingTest
-  @notForDart2
   test_undefinedOperator_binaryExpression_inSubtype() async {
     await super.test_undefinedOperator_binaryExpression_inSubtype();
   }
@@ -91,13 +109,6 @@
   }
 
   @override
-  @failingTest
-  @notForDart2
-  test_undefinedSetter_inSubtype() async {
-    await super.test_undefinedSetter_inSubtype();
-  }
-
-  @override
   test_unnecessaryCast_generics() async {
     // dartbug.com/18953
     // Overridden because type inference now produces more information and there
@@ -122,17 +133,26 @@
 //    await super.test_unusedImport_annotationOnDirective();
   }
 
-  @failingTest
   @override
-  @potentialAnalyzerProblem
-  test_unusedImport_metadata() async {
-    await super.test_unusedImport_metadata();
+  @failingTest
+  test_overrideOnNonOverridingField_inSuperclass() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
+    return super.test_overrideOnNonOverridingField_inSuperclass();
+  }
+
+  @override
+  @failingTest
+  test_overrideOnNonOverridingField_inInterface() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
+    return super.test_overrideOnNonOverridingField_inInterface();
   }
 
   @failingTest
   @override
   @potentialAnalyzerProblem
-  test_importDeferredLibraryWithLoadFunction() async {
-    await super.test_importDeferredLibraryWithLoadFunction();
+  test_unusedImport_metadata() async {
+    await super.test_unusedImport_metadata();
   }
 }
diff --git a/pkg/analyzer/test/generated/non_hint_code_test.dart b/pkg/analyzer/test/generated/non_hint_code_test.dart
index d418538..e18c1e1 100644
--- a/pkg/analyzer/test/generated/non_hint_code_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_test.dart
@@ -44,7 +44,7 @@
 Future<Object> f() async {}
 ''');
     await computeAnalysisResult(source);
-    assertNoErrors(source);
+    assertErrors(source, [HintCode.MISSING_RETURN]);
     verify([source]);
   }
 
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index 8c02681..6999dfb 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -126,249 +126,6 @@
   }
 
   @override
-  @failingTest
-  void test_invalidCodePoint() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Internal problem: Compiler cannot run without a compiler context.
-    //   Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
-    //   package:front_end/src/fasta/compiler_context.dart 81:7             CompilerContext.current
-    //   package:front_end/src/fasta/command_line_reporting.dart 112:30     shouldThrowOn
-    //   package:front_end/src/fasta/deprecated_problems.dart 41:7          deprecated_inputError
-    //   package:front_end/src/fasta/quote.dart 181:5                       unescapeCodeUnits.error
-    //   package:front_end/src/fasta/quote.dart 251:40                      unescapeCodeUnits
-    //   package:front_end/src/fasta/quote.dart 147:13                      unescape
-    //   package:front_end/src/fasta/quote.dart 135:10                      unescapeString
-    //   package:analyzer/src/fasta/ast_builder.dart 159:22                 AstBuilder.endLiteralString
-    //   test/generated/parser_fasta_listener.dart 896:14                   ForwardingTestListener.endLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3497:14             Parser.parseSingleLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3434:13             Parser.parseLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3133:14             Parser.parsePrimary
-    //   package:front_end/src/fasta/parser/parser.dart 3097:14             Parser.parseUnaryExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2968:13             Parser.parsePrecedenceExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2942:11             Parser.parseExpression
-    //   test/generated/parser_fasta_test.dart 3196:39                      ParserProxy._run
-    super.test_invalidCodePoint();
-  }
-
-  @override
-  @failingTest
-  void test_invalidHexEscape_invalidDigit() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Internal problem: Compiler cannot run without a compiler context.
-    //   Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
-    //   package:front_end/src/fasta/compiler_context.dart 81:7             CompilerContext.current
-    //   package:front_end/src/fasta/command_line_reporting.dart 112:30     shouldThrowOn
-    //   package:front_end/src/fasta/deprecated_problems.dart 41:7          deprecated_inputError
-    //   package:front_end/src/fasta/quote.dart 181:5                       unescapeCodeUnits.error
-    //   package:front_end/src/fasta/quote.dart 221:47                      unescapeCodeUnits
-    //   package:front_end/src/fasta/quote.dart 147:13                      unescape
-    //   package:front_end/src/fasta/quote.dart 135:10                      unescapeString
-    //   package:analyzer/src/fasta/ast_builder.dart 159:22                 AstBuilder.endLiteralString
-    //   test/generated/parser_fasta_listener.dart 896:14                   ForwardingTestListener.endLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3497:14             Parser.parseSingleLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3434:13             Parser.parseLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3133:14             Parser.parsePrimary
-    //   package:front_end/src/fasta/parser/parser.dart 3097:14             Parser.parseUnaryExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2968:13             Parser.parsePrecedenceExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2942:11             Parser.parseExpression
-    //   test/generated/parser_fasta_test.dart 3196:39                      ParserProxy._run
-    super.test_invalidHexEscape_invalidDigit();
-  }
-
-  @override
-  @failingTest
-  void test_invalidHexEscape_tooFewDigits() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Internal problem: Compiler cannot run without a compiler context.
-    //   Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
-    //   package:front_end/src/fasta/compiler_context.dart 81:7             CompilerContext.current
-    //   package:front_end/src/fasta/command_line_reporting.dart 112:30     shouldThrowOn
-    //   package:front_end/src/fasta/deprecated_problems.dart 41:7          deprecated_inputError
-    //   package:front_end/src/fasta/quote.dart 181:5                       unescapeCodeUnits.error
-    //   package:front_end/src/fasta/quote.dart 217:52                      unescapeCodeUnits
-    //   package:front_end/src/fasta/quote.dart 147:13                      unescape
-    //   package:front_end/src/fasta/quote.dart 135:10                      unescapeString
-    //   package:analyzer/src/fasta/ast_builder.dart 159:22                 AstBuilder.endLiteralString
-    //   test/generated/parser_fasta_listener.dart 896:14                   ForwardingTestListener.endLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3497:14             Parser.parseSingleLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3434:13             Parser.parseLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3133:14             Parser.parsePrimary
-    //   package:front_end/src/fasta/parser/parser.dart 3097:14             Parser.parseUnaryExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2968:13             Parser.parsePrecedenceExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2942:11             Parser.parseExpression
-    //   test/generated/parser_fasta_test.dart 3196:39                      ParserProxy._run
-    super.test_invalidHexEscape_tooFewDigits();
-  }
-
-  @override
-  @failingTest
-  void test_invalidUnicodeEscape_incomplete_noDigits() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Internal problem: Compiler cannot run without a compiler context.
-    //   Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
-    //   package:front_end/src/fasta/compiler_context.dart 81:7             CompilerContext.current
-    //   package:front_end/src/fasta/command_line_reporting.dart 112:30     shouldThrowOn
-    //   package:front_end/src/fasta/deprecated_problems.dart 41:7          deprecated_inputError
-    //   package:front_end/src/fasta/quote.dart 181:5                       unescapeCodeUnits.error
-    //   package:front_end/src/fasta/quote.dart 232:54                      unescapeCodeUnits
-    //   package:front_end/src/fasta/quote.dart 147:13                      unescape
-    //   package:front_end/src/fasta/quote.dart 135:10                      unescapeString
-    //   package:analyzer/src/fasta/ast_builder.dart 159:22                 AstBuilder.endLiteralString
-    //   test/generated/parser_fasta_listener.dart 896:14                   ForwardingTestListener.endLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3497:14             Parser.parseSingleLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3434:13             Parser.parseLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3133:14             Parser.parsePrimary
-    //   package:front_end/src/fasta/parser/parser.dart 3097:14             Parser.parseUnaryExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2968:13             Parser.parsePrecedenceExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2942:11             Parser.parseExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2862:13             Parser.parseExpressionStatement
-    //   package:front_end/src/fasta/parser/parser.dart 2790:14             Parser.parseStatementX
-    //   package:front_end/src/fasta/parser/parser.dart 2722:20             Parser.parseStatement
-    //   test/generated/parser_fasta_test.dart 3287:39                      ParserProxy._run
-    super.test_invalidUnicodeEscape_incomplete_noDigits();
-  }
-
-  @override
-  @failingTest
-  void test_invalidUnicodeEscape_incomplete_someDigits() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Internal problem: Compiler cannot run without a compiler context.
-    //   Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
-    //   package:front_end/src/fasta/compiler_context.dart 81:7             CompilerContext.current
-    //   package:front_end/src/fasta/command_line_reporting.dart 112:30     shouldThrowOn
-    //   package:front_end/src/fasta/deprecated_problems.dart 41:7          deprecated_inputError
-    //   package:front_end/src/fasta/quote.dart 181:5                       unescapeCodeUnits.error
-    //   package:front_end/src/fasta/quote.dart 232:54                      unescapeCodeUnits
-    //   package:front_end/src/fasta/quote.dart 147:13                      unescape
-    //   package:front_end/src/fasta/quote.dart 135:10                      unescapeString
-    //   package:analyzer/src/fasta/ast_builder.dart 159:22                 AstBuilder.endLiteralString
-    //   test/generated/parser_fasta_listener.dart 896:14                   ForwardingTestListener.endLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3497:14             Parser.parseSingleLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3434:13             Parser.parseLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3133:14             Parser.parsePrimary
-    //   package:front_end/src/fasta/parser/parser.dart 3097:14             Parser.parseUnaryExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2968:13             Parser.parsePrecedenceExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2942:11             Parser.parseExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2862:13             Parser.parseExpressionStatement
-    //   package:front_end/src/fasta/parser/parser.dart 2790:14             Parser.parseStatementX
-    //   package:front_end/src/fasta/parser/parser.dart 2722:20             Parser.parseStatement
-    //   test/generated/parser_fasta_test.dart 3287:39                      ParserProxy._run
-    super.test_invalidUnicodeEscape_incomplete_someDigits();
-  }
-
-  @override
-  @failingTest
-  void test_invalidUnicodeEscape_invalidDigit() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Internal problem: Compiler cannot run without a compiler context.
-    //   Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
-    //   package:front_end/src/fasta/compiler_context.dart 81:7             CompilerContext.current
-    //   package:front_end/src/fasta/command_line_reporting.dart 112:30     shouldThrowOn
-    //   package:front_end/src/fasta/deprecated_problems.dart 41:7          deprecated_inputError
-    //   package:front_end/src/fasta/quote.dart 181:5                       unescapeCodeUnits.error
-    //   package:front_end/src/fasta/quote.dart 240:54                      unescapeCodeUnits
-    //   package:front_end/src/fasta/quote.dart 147:13                      unescape
-    //   package:front_end/src/fasta/quote.dart 135:10                      unescapeString
-    //   package:analyzer/src/fasta/ast_builder.dart 159:22                 AstBuilder.endLiteralString
-    //   test/generated/parser_fasta_listener.dart 896:14                   ForwardingTestListener.endLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3497:14             Parser.parseSingleLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3434:13             Parser.parseLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3133:14             Parser.parsePrimary
-    //   package:front_end/src/fasta/parser/parser.dart 3097:14             Parser.parseUnaryExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2968:13             Parser.parsePrecedenceExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2942:11             Parser.parseExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2862:13             Parser.parseExpressionStatement
-    //   package:front_end/src/fasta/parser/parser.dart 2790:14             Parser.parseStatementX
-    //   package:front_end/src/fasta/parser/parser.dart 2722:20             Parser.parseStatement
-    //   test/generated/parser_fasta_test.dart 3287:39                      ParserProxy._run
-    super.test_invalidUnicodeEscape_invalidDigit();
-  }
-
-  @override
-  @failingTest
-  void test_invalidUnicodeEscape_tooFewDigits_fixed() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Internal problem: Compiler cannot run without a compiler context.
-    //   Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
-    //   package:front_end/src/fasta/compiler_context.dart 81:7             CompilerContext.current
-    //   package:front_end/src/fasta/command_line_reporting.dart 112:30     shouldThrowOn
-    //   package:front_end/src/fasta/deprecated_problems.dart 41:7          deprecated_inputError
-    //   package:front_end/src/fasta/quote.dart 181:5                       unescapeCodeUnits.error
-    //   package:front_end/src/fasta/quote.dart 240:54                      unescapeCodeUnits
-    //   package:front_end/src/fasta/quote.dart 147:13                      unescape
-    //   package:front_end/src/fasta/quote.dart 135:10                      unescapeString
-    //   package:analyzer/src/fasta/ast_builder.dart 159:22                 AstBuilder.endLiteralString
-    //   test/generated/parser_fasta_listener.dart 896:14                   ForwardingTestListener.endLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3497:14             Parser.parseSingleLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3434:13             Parser.parseLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3133:14             Parser.parsePrimary
-    //   package:front_end/src/fasta/parser/parser.dart 3097:14             Parser.parseUnaryExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2968:13             Parser.parsePrecedenceExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2942:11             Parser.parseExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2862:13             Parser.parseExpressionStatement
-    //   package:front_end/src/fasta/parser/parser.dart 2790:14             Parser.parseStatementX
-    //   package:front_end/src/fasta/parser/parser.dart 2722:20             Parser.parseStatement
-    //   test/generated/parser_fasta_test.dart 3287:39                      ParserProxy._run
-    super.test_invalidUnicodeEscape_tooFewDigits_fixed();
-  }
-
-  @override
-  @failingTest
-  void test_invalidUnicodeEscape_tooFewDigits_variable() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Internal problem: Compiler cannot run without a compiler context.
-    //   Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
-    //   package:front_end/src/fasta/compiler_context.dart 81:7             CompilerContext.current
-    //   package:front_end/src/fasta/command_line_reporting.dart 112:30     shouldThrowOn
-    //   package:front_end/src/fasta/deprecated_problems.dart 41:7          deprecated_inputError
-    //   package:front_end/src/fasta/quote.dart 181:5                       unescapeCodeUnits.error
-    //   package:front_end/src/fasta/quote.dart 235:49                      unescapeCodeUnits
-    //   package:front_end/src/fasta/quote.dart 147:13                      unescape
-    //   package:front_end/src/fasta/quote.dart 135:10                      unescapeString
-    //   package:analyzer/src/fasta/ast_builder.dart 159:22                 AstBuilder.endLiteralString
-    //   test/generated/parser_fasta_listener.dart 896:14                   ForwardingTestListener.endLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3497:14             Parser.parseSingleLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3434:13             Parser.parseLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3133:14             Parser.parsePrimary
-    //   package:front_end/src/fasta/parser/parser.dart 3097:14             Parser.parseUnaryExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2968:13             Parser.parsePrecedenceExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2942:11             Parser.parseExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2862:13             Parser.parseExpressionStatement
-    //   package:front_end/src/fasta/parser/parser.dart 2790:14             Parser.parseStatementX
-    //   package:front_end/src/fasta/parser/parser.dart 2722:20             Parser.parseStatement
-    //   test/generated/parser_fasta_test.dart 3287:39                      ParserProxy._run
-    super.test_invalidUnicodeEscape_tooFewDigits_variable();
-  }
-
-  @override
-  @failingTest
-  void test_invalidUnicodeEscape_tooManyDigits_variable() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Internal problem: Compiler cannot run without a compiler context.
-    //   Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
-    //   package:front_end/src/fasta/compiler_context.dart 81:7             CompilerContext.current
-    //   package:front_end/src/fasta/command_line_reporting.dart 112:30     shouldThrowOn
-    //   package:front_end/src/fasta/deprecated_problems.dart 41:7          deprecated_inputError
-    //   package:front_end/src/fasta/quote.dart 181:5                       unescapeCodeUnits.error
-    //   package:front_end/src/fasta/quote.dart 251:40                      unescapeCodeUnits
-    //   package:front_end/src/fasta/quote.dart 147:13                      unescape
-    //   package:front_end/src/fasta/quote.dart 135:10                      unescapeString
-    //   package:analyzer/src/fasta/ast_builder.dart 159:22                 AstBuilder.endLiteralString
-    //   test/generated/parser_fasta_listener.dart 896:14                   ForwardingTestListener.endLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3497:14             Parser.parseSingleLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3434:13             Parser.parseLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3133:14             Parser.parsePrimary
-    //   package:front_end/src/fasta/parser/parser.dart 3097:14             Parser.parseUnaryExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2968:13             Parser.parsePrecedenceExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2942:11             Parser.parseExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2862:13             Parser.parseExpressionStatement
-    //   package:front_end/src/fasta/parser/parser.dart 2790:14             Parser.parseStatementX
-    //   package:front_end/src/fasta/parser/parser.dart 2722:20             Parser.parseStatement
-    //   test/generated/parser_fasta_test.dart 3287:39                      ParserProxy._run
-    super.test_invalidUnicodeEscape_tooManyDigits_variable();
-  }
-
-  @override
   void test_method_invalidTypeParameterComments() {
     // Ignored: Fasta does not support the generic comment syntax.
   }
@@ -496,7 +253,7 @@
   @override
   @failingTest
   void test_parseUnaryExpression_decrement_super() {
-    // TODO(brianwilkerson) Does not recover.
+    // TODO(danrubel) Reports a different error and different token stream.
     // Expected: TokenType:<MINUS>
     //   Actual: TokenType:<MINUS_MINUS>
     super.test_parseUnaryExpression_decrement_super();
@@ -505,7 +262,7 @@
   @override
   @failingTest
   void test_parseUnaryExpression_decrement_super_withComment() {
-    // TODO(brianwilkerson) Does not recover.
+    // TODO(danrubel) Reports a different error and different token stream.
     // Expected: TokenType:<MINUS>
     //   Actual: TokenType:<MINUS_MINUS>
     super.test_parseUnaryExpression_decrement_super_withComment();
@@ -1204,13 +961,6 @@
   }
 
   @override
-  @failingTest
-  void test_missingIdentifier_afterAnnotation() {
-    // TODO(brianwilkerson) reportUnrecoverableErrorWithToken
-    super.test_missingIdentifier_afterAnnotation();
-  }
-
-  @override
   void test_relationalExpression_missing_LHS_RHS() {
     parseExpression("is", codes: [
       ParserErrorCode.EXPECTED_TYPE_NAME,
@@ -1230,14 +980,7 @@
 
 @reflectiveTest
 class SimpleParserTest_Fasta extends FastaParserTestCase
-    with SimpleParserTestMixin {
-  @override
-  @failingTest
-  void test_parseTypeParameterList_single() {
-    // TODO(brianwilkerson) Does not use all tokens.
-    super.test_parseTypeParameterList_single();
-  }
-}
+    with SimpleParserTestMixin {}
 
 /**
  * Tests of the fasta parser based on [StatementParserTestMixin].
diff --git a/pkg/analyzer/test/generated/parser_forest_test.dart b/pkg/analyzer/test/generated/parser_forest_test.dart
index b0a2885..7ca4c06 100644
--- a/pkg/analyzer/test/generated/parser_forest_test.dart
+++ b/pkg/analyzer/test/generated/parser_forest_test.dart
@@ -1560,11 +1560,6 @@
   }
 
   @failingTest
-  void test_invalidCodePoint() {
-    super.test_invalidCodePoint();
-  }
-
-  @failingTest
   void test_invalidCommentReference__new_nonIdentifier() {
     super.test_invalidCommentReference__new_nonIdentifier();
   }
@@ -1595,16 +1590,6 @@
   }
 
   @failingTest
-  void test_invalidHexEscape_invalidDigit() {
-    super.test_invalidHexEscape_invalidDigit();
-  }
-
-  @failingTest
-  void test_invalidHexEscape_tooFewDigits() {
-    super.test_invalidHexEscape_tooFewDigits();
-  }
-
-  @failingTest
   void test_invalidInterpolationIdentifier_startWithDigit() {
     super.test_invalidInterpolationIdentifier_startWithDigit();
   }
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index f9edf37..3c85986 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -25,6 +25,9 @@
 import 'test_support.dart';
 
 main() {
+  // The fasta parser has a parallel set of tests in parser_fasta_test.dart
+  if (Parser.useFasta) return;
+
   defineReflectiveSuite(() {
     defineReflectiveTests(ClassMemberParserTest);
     defineReflectiveTests(ComplexParserTest);
@@ -3998,8 +4001,8 @@
   }
 
   void test_invalidCodePoint() {
-    StringLiteral literal = parseExpression("'\\u{110000}'",
-        errors: [expectedError(ParserErrorCode.INVALID_CODE_POINT, 0, 10)]);
+    StringLiteral literal = parseExpression("'begin \\u{110000}'",
+        errors: [expectedError(ParserErrorCode.INVALID_CODE_POINT, 7, 9)]);
     expectNotNullIfNoErrors(literal);
   }
 
@@ -4065,8 +4068,8 @@
   }
 
   void test_invalidHexEscape_invalidDigit() {
-    StringLiteral literal = parseExpression("'\\x0 a'",
-        errors: [expectedError(ParserErrorCode.INVALID_HEX_ESCAPE, 1, 3)]);
+    StringLiteral literal = parseExpression("'not \\x0 a'",
+        errors: [expectedError(ParserErrorCode.INVALID_HEX_ESCAPE, 5, 3)]);
     expectNotNullIfNoErrors(literal);
   }
 
@@ -4248,7 +4251,7 @@
   }
 
   void test_invalidUnicodeEscape_invalidDigit() {
-    Expression expression = parseStringLiteral("'\\u0 a'");
+    Expression expression = parseStringLiteral("'\\u0 and some more'");
     expectNotNullIfNoErrors(expression);
     listener.assertErrors(
         [expectedError(ParserErrorCode.INVALID_UNICODE_ESCAPE, 1, 3)]);
@@ -4271,10 +4274,12 @@
   void test_invalidUnicodeEscape_tooManyDigits_variable() {
     Expression expression = parseStringLiteral("'\\u{12345678}'");
     expectNotNullIfNoErrors(expression);
-    listener.assertErrors([
-      expectedError(ParserErrorCode.INVALID_UNICODE_ESCAPE, 1, 12),
-      expectedError(ParserErrorCode.INVALID_CODE_POINT, 1, 12)
-    ]);
+    listener.assertErrors(usingFastaParser
+        ? [expectedError(ParserErrorCode.INVALID_CODE_POINT, 1, 9)]
+        : [
+            expectedError(ParserErrorCode.INVALID_UNICODE_ESCAPE, 1, 12),
+            expectedError(ParserErrorCode.INVALID_CODE_POINT, 1, 12)
+          ]);
   }
 
   void test_libraryDirectiveNotFirst() {
@@ -11813,17 +11818,23 @@
   }
 
   void test_missingIdentifier_afterAnnotation() {
-    createParser('@override }');
+    createParser('@override }', expectedEndOffset: 10);
     ClassMember member = parser.parseClassMember('C');
     expectNotNullIfNoErrors(member);
     listener.assertErrors(
         [expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 10, 1)]);
-    expect(member, new isInstanceOf<MethodDeclaration>());
-    MethodDeclaration method = member;
-    expect(method.documentationComment, isNull);
-    NodeList<Annotation> metadata = method.metadata;
-    expect(metadata, hasLength(1));
-    expect(metadata[0].name.name, "override");
+    if (usingFastaParser) {
+      // TODO(danrubel): Consider generating a sub method so that the
+      // existing annotation can be associated with a class member.
+      expect(member, isNull);
+    } else {
+      expect(member, new isInstanceOf<MethodDeclaration>());
+      MethodDeclaration method = member;
+      expect(method.documentationComment, isNull);
+      NodeList<Annotation> metadata = method.metadata;
+      expect(metadata, hasLength(1));
+      expect(metadata[0].name.name, "override");
+    }
   }
 
   void test_missingSemicolon_varialeDeclarationList() {
@@ -14592,13 +14603,20 @@
   }
 
   void test_parseTypeParameterList_single() {
-    createParser('<<A>');
+    createParser('<<A>', expectedEndOffset: 0);
     TypeParameterList parameterList = parser.parseTypeParameterList();
-    expectNotNullIfNoErrors(parameterList);
-    assertNoErrors();
-    expect(parameterList.leftBracket, isNotNull);
-    expect(parameterList.rightBracket, isNotNull);
-    expect(parameterList.typeParameters, hasLength(1));
+    if (usingFastaParser) {
+      // TODO(danrubel): Consider splitting `<<` and marking the first `<`
+      // as an unexpected token.
+      expect(parameterList, isNull);
+      assertNoErrors();
+    } else {
+      expectNotNullIfNoErrors(parameterList);
+      assertNoErrors();
+      expect(parameterList.leftBracket, isNotNull);
+      expect(parameterList.rightBracket, isNotNull);
+      expect(parameterList.typeParameters, hasLength(1));
+    }
   }
 
   void test_parseTypeParameterList_withTrailingEquals() {
diff --git a/pkg/analyzer/test/generated/resolver_kernel_test.dart b/pkg/analyzer/test/generated/resolver_kernel_test.dart
index a3537a4..bc11b8b 100644
--- a/pkg/analyzer/test/generated/resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/resolver_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(StrictModeTest_Kernel);
+    defineReflectiveTests(StrictModeTest_Kernel);
   });
 }
 
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart
index 07c4b89..bdee524 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(StaticTypeAnalyzer2Test_Kernel);
+    defineReflectiveTests(StaticTypeAnalyzer2Test_Kernel);
   });
 }
 
@@ -24,20 +22,6 @@
 
   @override
   @failingTest
-  test_FunctionExpressionInvocation_block() async {
-    // Bad state: No reference information for (() {return 1;})() at 21
-    await super.test_FunctionExpressionInvocation_block();
-  }
-
-  @override
-  @failingTest
-  test_MethodInvocation_nameType_parameter_propagatedType() async {
-    // Expected: DynamicTypeImpl:<dynamic>
-    await super.test_MethodInvocation_nameType_parameter_propagatedType();
-  }
-
-  @override
-  @failingTest
   test_staticMethods_classTypeParameters_genericMethod() async {
     // Expected: '(dynamic) → void'
     await super.test_staticMethods_classTypeParameters_genericMethod();
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
index 0d314be..7ee2030 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
@@ -342,10 +342,10 @@
     expect(_flatten(futureDynamicType), dynamicType);
     // flatten(Future<int>) = int
     expect(_flatten(futureIntType), intType);
-    // flatten(Future<Future>) = dynamic
-    expect(_flatten(futureFutureDynamicType), dynamicType);
-    // flatten(Future<Future<int>>) = int
-    expect(_flatten(futureFutureIntType), intType);
+    // flatten(Future<Future>) = Future<dynamic>
+    expect(_flatten(futureFutureDynamicType), futureDynamicType);
+    // flatten(Future<Future<int>>) = Future<int>
+    expect(_flatten(futureFutureIntType), futureIntType);
   }
 
   void test_flatten_unrelated_types() {
@@ -482,7 +482,7 @@
         _typeProvider.futureType.instantiate(<DartType>[futureIntType]);
     Expression node = AstTestFactory
         .awaitExpression(_resolvedVariable(futureFutureIntType, 'e'));
-    expect(_analyze(node), same(intType));
+    expect(_analyze(node), same(futureIntType));
     _listener.assertNoErrors();
   }
 
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
index f864c75..234c2ff 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
@@ -8,10 +8,8 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(StaticTypeWarningCodeTest_Kernel);
-    // defineReflectiveTests(StrongModeStaticTypeWarningCodeTest_Kernel);
+    defineReflectiveTests(StaticTypeWarningCodeTest_Kernel);
+    defineReflectiveTests(StrongModeStaticTypeWarningCodeTest_Kernel);
   });
 }
 
@@ -66,6 +64,13 @@
 
   @override
   @failingTest
+  test_bug21912() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_bug21912();
+  }
+
+  @override
+  @failingTest
   test_expectedOneListTypeArgument() async {
     // Bad state: Found 1 argument types for 2 type arguments
     await super.test_expectedOneListTypeArgument();
@@ -431,6 +436,16 @@
 
   @override
   @failingTest
+  test_returnOfInvalidType_async_future_future_int_mismatches_future_int() {
+    // Expected 1 errors of type StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
+    // found 0; 0 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found
+    // 1 (54)
+    return super
+        .test_returnOfInvalidType_async_future_future_int_mismatches_future_int();
+  }
+
+  @override
+  @failingTest
   test_returnOfInvalidType_async_future_int_mismatches_future_string() async {
     // Expected 1 errors of type StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, found 0
     await super
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 ca84d57..1912d7f 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
@@ -143,14 +143,13 @@
   }
 
   test_await_flattened() async {
-    // The analyzer type system over-flattens - see dartbug.com/31887
     await assertErrorsInCode('''
 import 'dart:async';
 Future<Future<int>> ffi() => null;
 f() async {
-  Future<int> b = await ffi(); // Warning: int not assignable to Future<int>
+  Future<int> b = await ffi(); 
 }
-''', useCFE ? [] : [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+''', []);
   }
 
   test_await_simple() async {
@@ -921,6 +920,16 @@
 f(B<A> b) {}''', [StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT]);
   }
 
+  test_returnOfInvalidType_async_future_future_int_mismatches_future_int() async {
+    await assertErrorsInCode('''
+import 'dart:async';
+Future<int> f() async {
+  return g();
+}
+Future<Future<int>> g() => null;
+''', [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
+  }
+
   test_returnOfInvalidType_async_future_int_mismatches_future_string() async {
     await assertErrorsInCode('''
 import 'dart:async';
diff --git a/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart b/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
index da2d2e9..ff7880f 100644
--- a/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(StaticWarningCodeTest_Kernel);
+    defineReflectiveTests(StaticWarningCodeTest_Kernel);
   });
 }
 
@@ -150,6 +148,13 @@
 
   @override
   @failingTest
+  test_argumentTypeNotAssignable_call() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_argumentTypeNotAssignable_call();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_argumentTypeNotAssignable_cascadeSecond() async {
     return super.test_argumentTypeNotAssignable_cascadeSecond();
@@ -476,20 +481,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_concreteClassWithAbstractMember() async {
-    return super.test_concreteClassWithAbstractMember();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_concreteClassWithAbstractMember_noSuchMethod_interface() async {
-    return super.test_concreteClassWithAbstractMember_noSuchMethod_interface();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_conflictingDartImport() async {
     return super.test_conflictingDartImport();
   }
@@ -759,58 +750,188 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_direct() async {
-    return super.test_functionWithoutCall_direct();
+  test_generalizedVoid_invocationOfVoidFieldError() async {
+    return super.test_generalizedVoid_invocationOfVoidFieldError();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_direct_typeAlias() async {
-    return super.test_functionWithoutCall_direct_typeAlias();
+  test_generalizedVoid_invocationOfVoidLocalError() async {
+    return super.test_generalizedVoid_invocationOfVoidLocalError();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_indirect_extends() async {
-    return super.test_functionWithoutCall_indirect_extends();
+  test_generalizedVoid_invocationOfVoidResultError() async {
+    return super.test_generalizedVoid_invocationOfVoidResultError();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_indirect_extends_typeAlias() async {
-    return super.test_functionWithoutCall_indirect_extends_typeAlias();
+  test_generalizedVoid_invocationOfVoidToplevelError() async {
+    return super.test_generalizedVoid_invocationOfVoidToplevelError();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_indirect_implements() async {
-    return super.test_functionWithoutCall_indirect_implements();
+  test_generalizedVoid_throwVoidValueError() async {
+    return super.test_generalizedVoid_throwVoidValueError();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_indirect_implements_typeAlias() async {
-    return super.test_functionWithoutCall_indirect_implements_typeAlias();
+  test_generalizedVoid_useOfInForeachIterableError() async {
+    return super.test_generalizedVoid_useOfInForeachIterableError();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_mixin_implements() async {
-    return super.test_functionWithoutCall_mixin_implements();
+  test_generalizedVoid_useOfVoidAsIndexAssignError() async {
+    return super.test_generalizedVoid_useOfVoidAsIndexAssignError();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_mixin_implements_typeAlias() async {
-    return super.test_functionWithoutCall_mixin_implements_typeAlias();
+  test_generalizedVoid_useOfVoidAsIndexError() async {
+    return super.test_generalizedVoid_useOfVoidAsIndexError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidAssignedToDynamicError() async {
+    return super.test_generalizedVoid_useOfVoidAssignedToDynamicError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidByIndexingError() async {
+    return super.test_generalizedVoid_useOfVoidByIndexingError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidCallMethodError() async {
+    return super.test_generalizedVoid_useOfVoidCallMethodError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidCallMethodWithNullError() async {
+    return super.test_generalizedVoid_useOfVoidCallMethodWithNullError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidCallSetterError() async {
+    return super.test_generalizedVoid_useOfVoidCallSetterError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidCascadeError() async {
+    return super.test_generalizedVoid_useOfVoidCascadeError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInConditionalConditionError() async {
+    return super.test_generalizedVoid_useOfVoidInConditionalConditionError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInConditionalLhsError() async {
+    return super.test_generalizedVoid_useOfVoidInConditionalLhsError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInConditionalRhsError() async {
+    return super.test_generalizedVoid_useOfVoidInConditionalRhsError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInDoWhileConditionError() async {
+    return super.test_generalizedVoid_useOfVoidInDoWhileConditionError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInForeachVariableError() async {
+    return super.test_generalizedVoid_useOfVoidInForeachVariableError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInIsTestError() async {
+    return super.test_generalizedVoid_useOfVoidInIsTestError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInListLiteralError() async {
+    return super.test_generalizedVoid_useOfVoidInListLiteralError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInMapLiteralKeyError() async {
+    return super.test_generalizedVoid_useOfVoidInMapLiteralKeyError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInMapLiteralValueError() async {
+    return super.test_generalizedVoid_useOfVoidInMapLiteralValueError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInNullOperatorLhsError() async {
+    return super.test_generalizedVoid_useOfVoidInNullOperatorLhsError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInSpecialAssignmentError() async {
+    return super.test_generalizedVoid_useOfVoidInSpecialAssignmentError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInSwitchExpressionError() async {
+    return super.test_generalizedVoid_useOfVoidInSwitchExpressionError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInWhileConditionError() async {
+    return super.test_generalizedVoid_useOfVoidInWhileConditionError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidNullPropertyAccessError() async {
+    return super.test_generalizedVoid_useOfVoidNullPropertyAccessError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidPropertyAccessError() async {
+    return super.test_generalizedVoid_useOfVoidPropertyAccessError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidReturnInNonVoidFunctionError() async {
+    return super.test_generalizedVoid_useOfVoidReturnInNonVoidFunctionError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidWhenArgumentError() async {
+    return super.test_generalizedVoid_useOfVoidWhenArgumentError();
   }
 
   @override
@@ -973,34 +1094,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_invalidOverride_defaultOverridesNonDefault() async {
-    return super.test_invalidOverride_defaultOverridesNonDefault();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_invalidOverride_defaultOverridesNonDefault_named() async {
-    return super.test_invalidOverride_defaultOverridesNonDefault_named();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_invalidOverrideDifferentDefaultValues_named() async {
-    return super.test_invalidOverrideDifferentDefaultValues_named();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_invalidOverrideDifferentDefaultValues_positional() async {
-    return super.test_invalidOverrideDifferentDefaultValues_positional();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_invalidOverrideNamed_fewerNamedParameters() async {
     return super.test_invalidOverrideNamed_fewerNamedParameters();
   }
@@ -1520,6 +1613,13 @@
 
   @override
   @failingTest
+  test_returnWithoutValue_async_future_object_with_return() {
+    // Expected 1 errors of type StaticWarningCode.RETURN_WITHOUT_VALUE, found 0
+    return super.test_returnWithoutValue_async_future_object_with_return();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_returnWithoutValue_factoryConstructor() async {
     return super.test_returnWithoutValue_factoryConstructor();
@@ -1549,13 +1649,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_returnWithoutValue_Null() async {
-    return super.test_returnWithoutValue_Null();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_staticAccessToInstanceMember_method_invocation() async {
     return super.test_staticAccessToInstanceMember_method_invocation();
   }
@@ -1663,13 +1756,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_typePromotion_functionType_arg_InterToDyn() async {
-    return super.test_typePromotion_functionType_arg_InterToDyn();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_typeTestNonType() async {
     return super.test_typeTestNonType();
   }
@@ -1814,204 +1900,6 @@
     return super.test_undefinedStaticMethodOrGetter_setter_inSuperclass();
   }
 
-  @override
-  @failingTest
-  test_generalizedVoid_assignToVoid_notStrong_error() async {
-    return super.test_generalizedVoid_assignToVoid_notStrong_error();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInForPartsOk() async {
-    return super.test_generalizedVoid_useOfVoidInForPartsOk();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInIsTestError() async {
-    return super.test_generalizedVoid_useOfVoidInIsTestError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInConditionalConditionError() async {
-    return super.test_generalizedVoid_useOfVoidInConditionalConditionError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInConditionalLhsError() async {
-    return super.test_generalizedVoid_useOfVoidInConditionalLhsError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInConditionalRhsError() async {
-    return super.test_generalizedVoid_useOfVoidInConditionalRhsError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidWhenArgumentError() async {
-    return super.test_generalizedVoid_useOfVoidWhenArgumentError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidAssignedToDynamicError() async {
-    return super.test_generalizedVoid_useOfVoidAssignedToDynamicError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_throwVoidValueError() async {
-    return super.test_generalizedVoid_throwVoidValueError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInListLiteralError() async {
-    return super.test_generalizedVoid_useOfVoidInListLiteralError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInMapLiteralValueError() async {
-    return super.test_generalizedVoid_useOfVoidInMapLiteralValueError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInMapLiteralKeyError() async {
-    return super.test_generalizedVoid_useOfVoidInMapLiteralKeyError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInNullOperatorLhsError() async {
-    return super.test_generalizedVoid_useOfVoidInNullOperatorLhsError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidReturnInNonVoidFunctionError() async {
-    return super.test_generalizedVoid_useOfVoidReturnInNonVoidFunctionError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInWhileConditionError() async {
-    return super.test_generalizedVoid_useOfVoidInWhileConditionError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInDoWhileConditionError() async {
-    return super.test_generalizedVoid_useOfVoidInDoWhileConditionError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfInForeachIterableError() async {
-    return super.test_generalizedVoid_useOfInForeachIterableError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInForeachVariableError() async {
-    return super.test_generalizedVoid_useOfVoidInForeachVariableError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInSpecialAssignmentError() async {
-    return super.test_generalizedVoid_useOfVoidInSpecialAssignmentError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidCallMethodError() async {
-    return super.test_generalizedVoid_useOfVoidCallMethodError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidCallMethodWithNullError() async {
-    return super.test_generalizedVoid_useOfVoidCallMethodWithNullError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidCascadeError() async {
-    return super.test_generalizedVoid_useOfVoidCascadeError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_invocationOfVoidToplevelError() async {
-    return super.test_generalizedVoid_invocationOfVoidToplevelError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_invocationOfVoidLocalError() async {
-    return super.test_generalizedVoid_invocationOfVoidLocalError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_invocationOfVoidFieldError() async {
-    return super.test_generalizedVoid_invocationOfVoidFieldError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_invocationOfVoidResultError() async {
-    return super.test_generalizedVoid_invocationOfVoidResultError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidByIndexingError() async {
-    return super.test_generalizedVoid_useOfVoidByIndexingError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidAsIndexError() async {
-    return super.test_generalizedVoid_useOfVoidAsIndexError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidAsIndexAssignError() async {
-    return super.test_generalizedVoid_useOfVoidAsIndexAssignError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInSwitchExpressionError() async {
-    return super.test_generalizedVoid_useOfVoidInSwitchExpressionError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidPropertyAccessError() async {
-    return super.test_generalizedVoid_useOfVoidPropertyAccessError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidCallSetterError() async {
-    return super.test_generalizedVoid_useOfVoidCallSetterError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidNullPropertyAccessError() async {
-    return super.test_generalizedVoid_useOfVoidNullPropertyAccessError();
-  }
-
   @failingTest
   @override
   test_useOfVoidResult_assignmentExpression_function() async {
@@ -2026,8 +1914,8 @@
 
   @failingTest
   @override
-  test_useOfVoidResult_variableDeclaration_method2() async {
-    return super.test_useOfVoidResult_variableDeclaration_method2();
+  test_useOfVoidResult_inForLoop_error() async {
+    return super.test_useOfVoidResult_inForLoop_error();
   }
 
   @override
@@ -2037,8 +1925,8 @@
 
   @failingTest
   @override
-  test_useOfVoidResult_inForLoop_error() async {
-    return super.test_useOfVoidResult_inForLoop_error();
+  test_useOfVoidResult_variableDeclaration_function_error() async {
+    return super.test_useOfVoidResult_variableDeclaration_function_error();
   }
 
   @override
@@ -2048,8 +1936,8 @@
 
   @failingTest
   @override
-  test_useOfVoidResult_variableDeclaration_function_error() async {
-    return super.test_useOfVoidResult_variableDeclaration_function_error();
+  test_useOfVoidResult_variableDeclaration_method2() async {
+    return super.test_useOfVoidResult_variableDeclaration_method2();
   }
 
   @failingTest
diff --git a/pkg/analyzer/test/generated/static_warning_code_test.dart b/pkg/analyzer/test/generated/static_warning_code_test.dart
index a78274e..7f66abf 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -3672,6 +3672,18 @@
     verify([source]);
   }
 
+  test_returnWithoutValue_async_future_object_with_return() async {
+    Source source = addSource('''
+import 'dart:async';
+Future<Object> f() async {
+  return;
+}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [StaticWarningCode.RETURN_WITHOUT_VALUE]);
+    verify([source]);
+  }
+
   test_returnWithoutValue_factoryConstructor() async {
     Source source = addSource("class A { factory A() { return; } }");
     await computeAnalysisResult(source);
diff --git a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
index 61abc60..9157b6d 100644
--- a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
@@ -9,11 +9,9 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(StrongModeLocalInferenceTest_Kernel);
-    // defineReflectiveTests(StrongModeStaticTypeAnalyzer2Test_Kernel);
-    // defineReflectiveTests(StrongModeTypePropagationTest_Kernel);
+    defineReflectiveTests(StrongModeLocalInferenceTest_Kernel);
+    defineReflectiveTests(StrongModeStaticTypeAnalyzer2Test_Kernel);
+    defineReflectiveTests(StrongModeTypePropagationTest_Kernel);
   });
 }
 
@@ -67,6 +65,13 @@
 
   @override
   @failingTest
+  test_constrainedByBounds4() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_constrainedByBounds4();
+  }
+
+  @override
+  @failingTest
   test_constrainedByBounds5() async {
     // Bad state: Expected a type for 4 at 119; got one for kernel offset 118
     await super.test_constrainedByBounds5();
@@ -102,6 +107,41 @@
 
   @override
   @failingTest
+  test_functionDeclaration_body_propagation() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_functionDeclaration_body_propagation();
+  }
+
+  @override
+  @failingTest
+  test_functionLiteral_assignment_typedArguments() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_functionLiteral_assignment_typedArguments();
+  }
+
+  @override
+  @failingTest
+  test_functionLiteral_assignment_unTypedArguments() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_functionLiteral_assignment_unTypedArguments();
+  }
+
+  @override
+  @failingTest
+  test_functionLiteral_body_propagation() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_functionLiteral_body_propagation();
+  }
+
+  @override
+  @failingTest
+  test_functionLiteral_unTypedArgument_propagation() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_functionLiteral_unTypedArgument_propagation();
+  }
+
+  @override
+  @failingTest
   test_futureOr_downwards8() async {
     // type 'BottomTypeImpl' is not a subtype of type 'InterfaceType' in type cast where
     await super.test_futureOr_downwards8();
@@ -222,13 +262,6 @@
 
   @override
   @failingTest
-  test_inferredFieldDeclaration_propagation() async {
-    // Expected: InterfaceTypeImpl:<int>
-    await super.test_inferredFieldDeclaration_propagation();
-  }
-
-  @override
-  @failingTest
   test_instanceCreation() async {
     // AnalysisException: Element mismatch in /test.dart at class A<S, T>
     await super.test_instanceCreation();
@@ -240,6 +273,13 @@
 
   @override
   @failingTest
+  test_partialTypes1() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_partialTypes1();
+  }
+
+  @override
+  @failingTest
   test_pinning_multipleConstraints1() async {
     // Expected 1 errors of type StrongModeCode.STRONG_MODE_INVALID_CAST_LITERAL, found 0
     await super.test_pinning_multipleConstraints1();
@@ -254,12 +294,96 @@
 
   @override
   @failingTest
+  test_pinning_multipleConstraints_contravariant1() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_pinning_multipleConstraints_contravariant1();
+  }
+
+  @override
+  @failingTest
+  test_pinning_multipleConstraints_contravariant2() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_pinning_multipleConstraints_contravariant2();
+  }
+
+  @override
+  @failingTest
+  test_pinning_multipleConstraints_contravariant3() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_pinning_multipleConstraints_contravariant3();
+  }
+
+  @override
+  @failingTest
+  test_pinning_multipleConstraints_contravariant4() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_pinning_multipleConstraints_contravariant4();
+  }
+
+  @override
+  @failingTest
+  test_redirectedConstructor_named() {
+    // Expected: 'A<T2, U2>'; Actual: 'A<T, U>'
+    return super.test_redirectedConstructor_named();
+  }
+
+  @override
+  @failingTest
+  test_redirectedConstructor_unnamed() {
+    // Expected: 'A<T2, U2>'; Actual: 'A<T, U>'
+    return super.test_redirectedConstructor_unnamed();
+  }
+
+  @override
+  @failingTest
   test_redirectingConstructor_propagation() async {
     // AnalysisException: Element mismatch in /test.dart at class A
     await super.test_redirectingConstructor_propagation();
     // TODO(brianwilkerson) Figure out why this test is flaky.
     fail('Flaky test');
   }
+
+  @override
+  @failingTest
+  test_returnType_variance1() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_returnType_variance1();
+  }
+
+  @override
+  @failingTest
+  test_returnType_variance2() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_returnType_variance2();
+  }
+
+  @override
+  @failingTest
+  test_returnType_variance3() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_returnType_variance3();
+  }
+
+  @override
+  @failingTest
+  test_returnType_variance4() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_returnType_variance4();
+  }
+
+  @override
+  @failingTest
+  test_returnType_variance5() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_returnType_variance5();
+  }
+
+  @override
+  @failingTest
+  test_returnType_variance6() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_returnType_variance6();
+  }
 }
 
 @reflectiveTest
@@ -289,6 +413,13 @@
 
   @override
   @failingTest
+  test_genericFunction_typedef() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_genericFunction_typedef();
+  }
+
+  @override
+  @failingTest
   test_genericMethod_explicitTypeParams() async {
     // Bad state: Found 2 argument types for 1 type arguments
     await super.test_genericMethod_explicitTypeParams();
@@ -303,6 +434,22 @@
 
   @override
   @failingTest
+  test_genericMethod_functionExpressionInvocation_functionTypedParameter_explicit() {
+    // Failed to resolve 2 nodes
+    return super
+        .test_genericMethod_functionExpressionInvocation_functionTypedParameter_explicit();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_functionExpressionInvocation_functionTypedParameter_inferred() {
+    // Failed to resolve 1 nodes
+    return super
+        .test_genericMethod_functionExpressionInvocation_functionTypedParameter_inferred();
+  }
+
+  @override
+  @failingTest
   test_genericMethod_functionExpressionInvocation_inferred() async {
     // Bad state: Expected element declaration for analyzer offset 230; got one for kernel offset 233
     await super.test_genericMethod_functionExpressionInvocation_inferred();
@@ -317,6 +464,22 @@
 
   @override
   @failingTest
+  test_genericMethod_functionInvocation_functionTypedParameter_explicit() {
+    // Failed to resolve 1 nodes
+    return super
+        .test_genericMethod_functionInvocation_functionTypedParameter_explicit();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_functionInvocation_functionTypedParameter_inferred() {
+    // Failed to resolve 1 nodes
+    return super
+        .test_genericMethod_functionInvocation_functionTypedParameter_inferred();
+  }
+
+  @override
+  @failingTest
   test_genericMethod_functionInvocation_inferred() async {
     // Failed to resolve 1 nodes:
     await super.test_genericMethod_functionInvocation_inferred();
@@ -324,6 +487,13 @@
 
   @override
   @failingTest
+  test_genericMethod_functionTypedParameter_tearoff() {
+    // Failed to resolve 1 nodes
+    return super.test_genericMethod_functionTypedParameter_tearoff();
+  }
+
+  @override
+  @failingTest
   test_genericMethod_implicitDynamic() async {
     // Expected: '<T>((dynamic) → T) → T'
     await super.test_genericMethod_implicitDynamic();
@@ -338,9 +508,24 @@
 
   @override
   @failingTest
-  test_genericMethod_override_invalidReturnType() async {
+  test_genericMethod_nestedFunctions() {
+    // Expected: '<S>(S) → <S>(S) → S'; Actual: '<S₀>(S) → <S>(S) → S'
+    return super.test_genericMethod_nestedFunctions();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_override_differentContextsSameBounds() {
+    // UnimplementedError: TODO(paulberry): TypeParameterType
+    return super.test_genericMethod_override_differentContextsSameBounds();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_override_invalidContravariantTypeParamBounds() async {
     // Expected 1 errors of type StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
-    await super.test_genericMethod_override_invalidReturnType();
+    await super
+        .test_genericMethod_override_invalidContravariantTypeParamBounds();
   }
 
   @override
@@ -353,10 +538,9 @@
 
   @override
   @failingTest
-  test_genericMethod_override_invalidContravariantTypeParamBounds() async {
+  test_genericMethod_override_invalidReturnType() async {
     // Expected 1 errors of type StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
-    await super
-        .test_genericMethod_override_invalidContravariantTypeParamBounds();
+    await super.test_genericMethod_override_invalidReturnType();
   }
 
   @override
@@ -382,9 +566,109 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_instantiateToBounds_class_error_recursion() async {
-    return super.test_instantiateToBounds_class_error_recursion();
+  test_genericMethod_toplevel_field_staticTearoff() {
+    // Failed to resolve 1 nodes
+    return super.test_genericMethod_toplevel_field_staticTearoff();
+  }
+
+  @override
+  @failingTest
+  test_instantiateToBounds_class_error_typedef() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_instantiateToBounds_class_error_typedef();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_class_error_recursion_typedef() {
+    // Expected 2 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0; 1 errors of
+    // type CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, found 0
+    return super.test_notInstantiatedBound_class_error_recursion_typedef();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_class_argument() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_class_argument();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_class_argument2() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_class_argument2();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_class_direct() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_class_direct();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_class_indirect() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_class_indirect();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_functionType() {
+    // Expected 2 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_functionType();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_typedef_argument() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_typedef_argument();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_typedef_argument2() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_typedef_argument2();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_typedef_direct() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_typedef_direct();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_ok_class_function() {
+    // Failed to resolve 1 nodes
+    return super.test_notInstantiatedBound_ok_class_function();
+  }
+
+  @override
+  @failingTest
+  test_objectMethodOnFunctions_Typedef() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_objectMethodOnFunctions_Typedef();
+  }
+
+  @override
+  @failingTest
+  test_returnOfInvalidType_object_void() async {
+    await super.test_returnOfInvalidType_object_void();
   }
 
   @override
@@ -407,12 +691,6 @@
     // Expected 2 errors of type StaticWarningCode.NON_VOID_RETURN_FOR_SETTER, found 0
     await super.test_setterWithOtherTypeIsError();
   }
-
-  @override
-  @failingTest
-  test_returnOfInvalidType_object_void() async {
-    await super.test_returnOfInvalidType_object_void();
-  }
 }
 
 @reflectiveTest
@@ -426,4 +704,12 @@
 
   @override
   bool get useCFE => true;
+
+  @override
+  @failingTest
+  test_inconsistentMethodInheritance_inferFunctionTypeFromTypedef() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super
+        .test_inconsistentMethodInheritance_inferFunctionTypeFromTypedef();
+  }
 }
diff --git a/pkg/analyzer/test/src/command_line/arguments_test.dart b/pkg/analyzer/test/src/command_line/arguments_test.dart
index 1d9afa9..8cbef81 100644
--- a/pkg/analyzer/test/src/command_line/arguments_test.dart
+++ b/pkg/analyzer/test/src/command_line/arguments_test.dart
@@ -154,7 +154,7 @@
   void test_defineAnalysisArguments() {
     ArgParser parser = new ArgParser();
     defineAnalysisArguments(parser);
-    expect(parser.options, hasLength(14));
+    expect(parser.options, hasLength(13));
   }
 
   void test_extractDefinedVariables() {
diff --git a/pkg/analyzer/test/src/context/builder_test.dart b/pkg/analyzer/test/src/context/builder_test.dart
index 558578c..94e546b 100644
--- a/pkg/analyzer/test/src/context/builder_test.dart
+++ b/pkg/analyzer/test/src/context/builder_test.dart
@@ -707,35 +707,6 @@
     _expectEqualOptions(options, expected);
   }
 
-  void test_getAnalysisOptions_default_flutter_disabled() {
-    _defineMockLintRules();
-    ArgParser argParser = new ArgParser();
-    defineAnalysisArguments(argParser);
-    ArgResults argResults =
-        argParser.parse(['--no-$packageDefaultAnalysisOptions']);
-
-    builderOptions = createContextBuilderOptions(argResults);
-    expect(builderOptions.packageDefaultAnalysisOptions, isFalse);
-    builder = new ContextBuilder(resourceProvider, sdkManager, contentCache,
-        options: builderOptions);
-
-    AnalysisOptionsImpl expected = new AnalysisOptionsImpl();
-
-    String packagesFilePath =
-        resourceProvider.convertPath('/some/directory/path/.packages');
-    createFile(packagesFilePath, 'flutter:/pkg/flutter/lib/');
-    String optionsFilePath = resourceProvider
-        .convertPath('/pkg/flutter/lib/analysis_options_user.yaml');
-    createFile(optionsFilePath, '''
-linter:
-  rules:
-    - mock_lint_rule
-''');
-    String projPath = resourceProvider.convertPath('/some/directory/path');
-    AnalysisOptions options = builder.getAnalysisOptions(projPath);
-    _expectEqualOptions(options, expected);
-  }
-
   void test_getAnalysisOptions_default_noOverrides() {
     AnalysisOptionsImpl defaultOptions = new AnalysisOptionsImpl();
     defaultOptions.enableLazyAssignmentOperators = true;
@@ -788,7 +759,6 @@
     defineAnalysisArguments(argParser);
     ArgResults argResults = argParser.parse([]);
     builderOptions = createContextBuilderOptions(argResults);
-    expect(builderOptions.packageDefaultAnalysisOptions, isTrue);
     builder = new ContextBuilder(resourceProvider, sdkManager, contentCache,
         options: builderOptions);
     AnalysisOptionsImpl expected = new AnalysisOptionsImpl();
diff --git a/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart b/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart
new file mode 100644
index 0000000..0afd0b0
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart
@@ -0,0 +1,119 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:meta/meta.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../context/mock_sdk.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AnalysisContextCollectionTest);
+  });
+}
+
+@reflectiveTest
+class AnalysisContextCollectionTest extends Object with ResourceProviderMixin {
+  void setUp() {
+    new MockSdk(resourceProvider: resourceProvider);
+  }
+
+  test_contextFor_noContext() {
+    var collection = _newCollection(includedPaths: [convertPath('/root')]);
+    expect(
+      () => collection.contextFor(convertPath('/other/test.dart')),
+      throwsStateError,
+    );
+  }
+
+  test_contextFor_notAbsolute() {
+    var collection = _newCollection(includedPaths: [convertPath('/root')]);
+    expect(
+      () => collection.contextFor(convertPath('test.dart')),
+      throwsArgumentError,
+    );
+  }
+
+  test_contextFor_notNormalized() {
+    var collection = _newCollection(includedPaths: [convertPath('/root')]);
+    expect(
+      () => collection.contextFor(convertPath('/test/lib/../lib/test.dart')),
+      throwsArgumentError,
+    );
+  }
+
+  test_new_includedPaths_notAbsolute() {
+    expect(
+      () => new AnalysisContextCollectionImpl(includedPaths: ['root']),
+      throwsArgumentError,
+    );
+  }
+
+  test_new_includedPaths_notNormalized() {
+    expect(
+      () => new AnalysisContextCollectionImpl(
+          includedPaths: [convertPath('/root/lib/../lib')]),
+      throwsArgumentError,
+    );
+  }
+
+  test_new_outer_inner() {
+    var outerFolder = newFolder('/test/outer');
+    newFile('/test/outer/lib/outer.dart');
+
+    var innerFolder = newFolder('/test/outer/inner');
+    newOptionsFile('/test/outer/inner');
+    newFile('/test/outer/inner/inner.dart');
+
+    var collection = _newCollection(includedPaths: [outerFolder.path]);
+
+    expect(collection.contexts, hasLength(2));
+
+    var outerContext = collection.contexts
+        .singleWhere((c) => c.contextRoot.root == outerFolder);
+    var innerContext = collection.contexts
+        .singleWhere((c) => c.contextRoot.root == innerFolder);
+    expect(innerContext, isNot(same(outerContext)));
+
+    // Outer and inner contexts own corresponding files.
+    expect(collection.contextFor(convertPath('/test/outer/lib/outer.dart')),
+        same(outerContext));
+    expect(collection.contextFor(convertPath('/test/outer/inner/inner.dart')),
+        same(innerContext));
+
+    // The file does not have to exist, during creation, or at all.
+    expect(collection.contextFor(convertPath('/test/outer/lib/outer2.dart')),
+        same(outerContext));
+    expect(collection.contextFor(convertPath('/test/outer/inner/inner2.dart')),
+        same(innerContext));
+  }
+
+  test_new_sdkPath_notAbsolute() {
+    expect(
+      () => new AnalysisContextCollectionImpl(
+          includedPaths: ['/root'], sdkPath: 'sdk'),
+      throwsArgumentError,
+    );
+  }
+
+  test_new_sdkPath_notNormalized() {
+    expect(
+      () => new AnalysisContextCollectionImpl(
+          includedPaths: [convertPath('/root')], sdkPath: '/home/sdk/../sdk'),
+      throwsArgumentError,
+    );
+  }
+
+  AnalysisContextCollectionImpl _newCollection(
+      {@required List<String> includedPaths}) {
+    return new AnalysisContextCollectionImpl(
+      resourceProvider: resourceProvider,
+      includedPaths: includedPaths,
+      sdkPath: convertPath(sdkRoot),
+    );
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart b/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
index ea4762e..388be9b 100644
--- a/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
@@ -37,16 +37,6 @@
     fail(buffer.toString());
   }
 
-  File newOptionsFile(String directoryPath) {
-    return newFile(resourceProvider.pathContext
-        .join(directoryPath, ContextLocatorImpl.ANALYSIS_OPTIONS_NAME));
-  }
-
-  File newPackagesFile(String directoryPath) {
-    return newFile(resourceProvider.pathContext
-        .join(directoryPath, ContextLocatorImpl.PACKAGES_FILE_NAME));
-  }
-
   void setUp() {
     contextLocator = new ContextLocatorImpl(resourceProvider: resourceProvider);
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/context_root_test.dart b/pkg/analyzer/test/src/dart/analysis/context_root_test.dart
index 573d210..9b6324d 100644
--- a/pkg/analyzer/test/src/dart/analysis/context_root_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/context_root_test.dart
@@ -55,6 +55,17 @@
     expect(contextRoot.isAnalyzed(filePath), isFalse);
   }
 
+  test_isAnalyzed_explicitlyExcluded_same() {
+    String aPath = provider.convertPath('/test/root/lib/a.dart');
+    String bPath = provider.convertPath('/test/root/lib/b.dart');
+    File aFile = provider.getFile(aPath);
+
+    contextRoot.excluded.add(aFile);
+
+    expect(contextRoot.isAnalyzed(aPath), isFalse);
+    expect(contextRoot.isAnalyzed(bPath), isTrue);
+  }
+
   test_isAnalyzed_implicitlyExcluded_dot_analysisOptions() {
     String filePath = provider.convertPath('/test/root/lib/.analysis_options');
     expect(contextRoot.isAnalyzed(filePath), isFalse);
@@ -70,6 +81,18 @@
     expect(contextRoot.isAnalyzed(filePath), isTrue);
   }
 
+  test_isAnalyzed_included_same() {
+    String aPath = provider.convertPath('/test/root/lib/a.dart');
+    String bPath = provider.convertPath('/test/root/lib/b.dart');
+    File aFile = provider.getFile(aPath);
+
+    contextRoot = new ContextRootImpl(provider, rootFolder);
+    contextRoot.included.add(aFile);
+
+    expect(contextRoot.isAnalyzed(aPath), isTrue);
+    expect(contextRoot.isAnalyzed(bPath), isFalse);
+  }
+
   test_isAnalyzed_packagesDirectory_analyzed() {
     String folderPath = provider.convertPath('/test/root/lib/packages');
     provider.newFolder(folderPath);
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
index 19ca54e..830cd0f 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
@@ -9,9 +9,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(AnalysisDriverTest_Kernel);
+    defineReflectiveTests(AnalysisDriverTest_Kernel);
   });
 }
 
@@ -59,13 +57,6 @@
   @failingTest
   @potentialAnalyzerProblem
   @override
-  test_const_annotation_notConstConstructor() async {
-    await super.test_const_annotation_notConstConstructor();
-  }
-
-  @failingTest
-  @potentialAnalyzerProblem
-  @override
   test_const_annotation_withArgs() async {
     await super.test_const_annotation_withArgs();
   }
@@ -77,6 +68,13 @@
     await super.test_const_externalConstFactory();
   }
 
+  @override
+  @failingTest
+  test_const_implicitCreation() {
+    // Bad state: No data for () at 69
+    return super.test_const_implicitCreation();
+  }
+
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31555')
   @override
@@ -192,6 +190,23 @@
     await super.test_getResult_nameConflict_local_typeInference();
   }
 
+  @override
+  @failingTest
+  test_missingDartLibrary_async() {
+    // Crash when compiling package:test/test.dart, at character offset null:
+    // Class 'FutureOr' not found in library 'dart:async'
+    return super.test_missingDartLibrary_async();
+  }
+
+  @override
+  @failingTest
+  test_missingDartLibrary_core() {
+    // Crash when compiling package:test/test.dart, at character offset null:
+    // file:///sdk/lib/core/core.dart:1: Internal problem: Couldn't find
+    // 'Object' in 'file:///sdk/lib/core/core.dart'.
+    return super.test_missingDartLibrary_core();
+  }
+
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30959')
   @override
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
index 66a1bb0..2422f69 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(AnalysisDriverResolutionTest_Kernel);
+    defineReflectiveTests(AnalysisDriverResolutionTest_Kernel);
   });
 }
 
@@ -25,10 +23,84 @@
 
   @override
   @failingTest
+  @potentialAnalyzerProblem
+  test_annotation_prefixed_classConstructor() {
+    // TODO(paulberry): broken because prefixes are not working properly
+    return super.test_annotation_prefixed_classConstructor();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_annotation_prefixed_classConstructorNamed() {
+    // TODO(paulberry): broken because prefixes are not working properly
+    return super.test_annotation_prefixed_classConstructorNamed();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_annotation_prefixed_classField() {
+    // TODO(paulberry): broken because prefixes are not working properly
+    return super.test_annotation_prefixed_classField();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_annotation_prefixed_topLevelVariable() {
+    // TODO(paulberry): broken because prefixes are not working properly
+    return super.test_annotation_prefixed_topLevelVariable();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31605')
   test_constructor_redirected_generic() async {
     await super.test_constructor_redirected_generic();
   }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_functionExpressionInvocation() {
+    // TODO(paulberry): broken because of in-progress FunctionTypeImpl rework
+    return super.test_functionExpressionInvocation();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_instanceCreation_prefixed() {
+    // TODO(paulberry): broken because prefixes are not working properly
+    return super.test_instanceCreation_prefixed();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_isExpression_not() {
+    // TODO(paulberry): I suspect that the special case for is! has bit rotted
+    return super.test_isExpression_not();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_local_function_generic() {
+    // TODO(paulberry): I suspect this is broken due to the function type's
+    // generic parameters not being properly associated with the generic
+    // parameters from the kernel representation.
+    return super.test_local_function_generic();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_type_functionTypeAlias() {
+    // TODO(paulberry): broken because of in-progress FunctionTypeImpl rework
+    return super.test_type_functionTypeAlias();
+  }
 }
 
 /// Tests marked with this annotation fail because of a Fasta problem.
diff --git a/pkg/analyzer/test/src/dart/analysis/test_all.dart b/pkg/analyzer/test/src/dart/analysis/test_all.dart
index cd75df1..20acbf2 100644
--- a/pkg/analyzer/test/src/dart/analysis/test_all.dart
+++ b/pkg/analyzer/test/src/dart/analysis/test_all.dart
@@ -4,6 +4,7 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'analysis_context_collection_test.dart' as analysis_context_collection;
 import 'context_builder_test.dart' as context_builder;
 import 'context_locator_test.dart' as context_locator;
 import 'context_root_test.dart' as context_root;
@@ -23,6 +24,7 @@
 
 main() {
   defineReflectiveSuite(() {
+    analysis_context_collection.main();
     context_builder.main();
     context_locator.main();
     context_root.main();
diff --git a/pkg/analyzer/test/src/dart/ast/ast_test.dart b/pkg/analyzer/test/src/dart/ast/ast_test.dart
index c860a24..dd7bbaa 100644
--- a/pkg/analyzer/test/src/dart/ast/ast_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/ast_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:async';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -496,7 +497,7 @@
     resetWith(options: new AnalysisOptionsImpl()..previewDart2 = true);
   }
 
-  void resolve(String source) async {
+  Future<void> resolve(String source) async {
     testSource = source;
     testUnit = await resolveSource2('/test.dart', source);
   }
diff --git a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
index ab82e9a..1a930e5 100644
--- a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
@@ -18,6 +18,7 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
@@ -449,12 +450,16 @@
 
   test_dependencyOnFactoryRedirect() async {
     // a depends on A.foo() depends on A.bar()
-    await _assertProperDependencies(r'''
+    await _assertProperDependencies(
+        r'''
 const A a = const A.foo();
 class A {
   factory const A.foo() = A.bar;
   const A.bar();
-}''');
+}''',
+        Parser.useFasta
+            ? const <ErrorCode>[ParserErrorCode.CONST_AFTER_FACTORY]
+            : const <ErrorCode>[]);
   }
 
   test_dependencyOnFactoryRedirectWithTypeParams() async {
diff --git a/pkg/analyzer/test/src/fasta/resolution_applier_test.dart b/pkg/analyzer/test/src/fasta/resolution_applier_test.dart
deleted file mode 100644
index 1b1a23b..0000000
--- a/pkg/analyzer/test/src/fasta/resolution_applier_test.dart
+++ /dev/null
@@ -1,355 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/fasta/resolution_applier.dart';
-import 'package:analyzer/src/generated/testing/test_type_provider.dart';
-import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:kernel/kernel.dart' as kernel;
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../../generated/parser_fasta_test.dart';
-import '../../generated/resolver_test_case.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(ResolutionApplierTest);
-  });
-}
-
-@reflectiveTest
-class ResolutionApplierTest extends FastaParserTestCase {
-  /// The type provider used to access the types passed to the resolution
-  /// applier.
-  TestTypeProvider typeProvider;
-
-  /// 1. Generate an AST structure from the given [content]. The AST is expected
-  ///    to have a top-level function declaration as the first element.
-  /// 2. Use a [ResolutionApplier] to apply the [declaredElements],
-  ///    [referencedElements], and [types] to the body of the function.
-  /// 3. Verify that everything in the function body that should be resolved
-  ///    _is_ resolved.
-  void applyTypes(String content, List<Element> declaredElements,
-      List<Element> referencedElements, List<DartType> types) {
-    CompilationUnit unit = parseCompilationUnit(content);
-    expect(unit, isNotNull);
-    expect(unit.declarations, hasLength(1));
-    FunctionDeclaration function = unit.declarations[0];
-    FunctionBody body = function.functionExpression.body;
-    ResolutionApplier applier = new ResolutionApplier(
-        null,
-        new _TestTypeContext(),
-        declaredElements,
-        referencedElements,
-        types.map((type) => new _KernelWrapperOfType(type)).toList());
-
-    body.accept(applier);
-    applier.checkDone();
-
-    ResolutionVerifier verifier = new ResolutionVerifier();
-    // TODO(brianwilkerson) Uncomment the line below when the tests no longer
-    // fail.
-//    body.accept(verifier);
-    verifier.assertResolved();
-  }
-
-  void setUp() {
-    typeProvider = new TestTypeProvider();
-  }
-
-  void test_binaryExpression() {
-    applyTypes(r'''
-f(String s, int i) {
-  return s + i;
-}
-''', [], [
-      _createFunctionParameter('s', 9),
-      new MethodElementImpl('+', -1),
-      _createFunctionParameter('i', 16),
-    ], <DartType>[
-      typeProvider.stringType,
-      new FunctionTypeImpl(new FunctionElementImpl('+', -1)),
-      new FunctionTypeImpl(new FunctionElementImpl('+', -1)),
-      new TypeArgumentsDartType([]),
-      typeProvider.intType,
-      typeProvider.stringType,
-    ]);
-  }
-
-  void test_functionExpressionInvocation() {
-    applyTypes(r'''
-f(Object a) {
-  return a.b().c();
-}
-''', [], [
-      _createFunctionParameter('a', 9),
-      new MethodElementImpl('b', -1),
-      new MethodElementImpl('c', -1)
-    ], <DartType>[
-      typeProvider.objectType,
-      typeProvider.objectType,
-      typeProvider.objectType,
-      new TypeArgumentsDartType([]),
-      typeProvider.objectType,
-      typeProvider.objectType,
-      typeProvider.objectType,
-      new TypeArgumentsDartType([]),
-      typeProvider.objectType
-    ]);
-  }
-
-  void test_genericFunctionType() {
-    GenericFunctionTypeElementImpl element =
-        new GenericFunctionTypeElementImpl.forOffset(8);
-    element.enclosingElement = new FunctionElementImpl('f', 0);
-    element.typeParameters = <TypeParameterElement>[];
-    element.returnType = typeProvider.intType;
-    element.parameters = [
-      _createFunctionParameter('', -1, type: typeProvider.stringType),
-      _createFunctionParameter('x', 34, type: typeProvider.boolType),
-    ];
-    FunctionTypeImpl functionType = new FunctionTypeImpl(element);
-    element.type = functionType;
-    applyTypes(r'''
-f() {
-  int Function(String, bool x) foo;
-}
-''', [new LocalVariableElementImpl('foo', 37)], [], <DartType>[functionType]);
-  }
-
-  void test_listLiteral_const_noAnnotation() {
-    applyTypes(r'''
-get f => const ['a', 'b', 'c'];
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.listType.instantiate([typeProvider.stringType])
-    ]);
-  }
-
-  void test_listLiteral_const_typeAnnotation() {
-    applyTypes(r'''
-get f => const <String>['a', 'b', 'c'];
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.listType.instantiate([typeProvider.stringType])
-    ]);
-  }
-
-  void test_listLiteral_noAnnotation() {
-    applyTypes(r'''
-get f => ['a', 'b', 'c'];
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.listType.instantiate([typeProvider.stringType])
-    ]);
-  }
-
-  void test_listLiteral_typeAnnotation() {
-    applyTypes(r'''
-get f => <String>['a', 'b', 'c'];
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.listType.instantiate([typeProvider.stringType])
-    ]);
-  }
-
-  void test_localVariable() {
-    InterfaceType mapType = typeProvider.mapType.instantiate([
-      typeProvider.stringType,
-      typeProvider.listType.instantiate([typeProvider.stringType])
-    ]);
-    applyTypes(r'''
-f() {
-  Map<String, List<String>> m = {};
-}
-''', [new LocalVariableElementImpl('m', 34)], [], <DartType>[mapType, mapType]);
-  }
-
-  void test_mapLiteral_const_noAnnotation() {
-    applyTypes(r'''
-get f => const {'a' : 1, 'b' : 2, 'c' : 3};
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.mapType
-          .instantiate([typeProvider.stringType, typeProvider.intType])
-    ]);
-  }
-
-  void test_mapLiteral_const_typeAnnotation() {
-    applyTypes(r'''
-get f => const <String, int>{'a' : 1, 'b' : 2, 'c' : 3};
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.mapType
-          .instantiate([typeProvider.stringType, typeProvider.intType])
-    ]);
-  }
-
-  void test_mapLiteral_noAnnotation() {
-    applyTypes(r'''
-get f => {'a' : 1, 'b' : 2, 'c' : 3};
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.mapType
-          .instantiate([typeProvider.stringType, typeProvider.intType])
-    ]);
-  }
-
-  void test_mapLiteral_typeAnnotation() {
-    applyTypes(r'''
-get f => <String, int>{'a' : 1, 'b' : 2, 'c' : 3};
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.mapType
-          .instantiate([typeProvider.stringType, typeProvider.intType])
-    ]);
-  }
-
-  void test_methodInvocation_getter() {
-    applyTypes(r'''
-f(String s) {
-  return s.length;
-}
-''', [], [
-      _createFunctionParameter('s', 9),
-      new MethodElementImpl('length', -1)
-    ], <DartType>[
-      typeProvider.stringType,
-      typeProvider.intType,
-    ]);
-  }
-
-  void test_methodInvocation_method() {
-    var substringType =
-        new FunctionTypeImpl(new FunctionElementImpl('substring', -1));
-    applyTypes(r'''
-f(String s) {
-  return s.substring(3, 7);
-}
-''', [], [
-      _createFunctionParameter('s', 9),
-      new MethodElementImpl('length', -1)
-    ], <DartType>[
-      typeProvider.stringType,
-      substringType,
-      substringType,
-      new TypeArgumentsDartType([]),
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.stringType
-    ]);
-  }
-
-  @failingTest
-  void test_typeAlias() {
-    TypeParameterElement B = _createTypeParameter('B', 42);
-    TypeParameterElement C = _createTypeParameter('C', 45);
-    GenericTypeAliasElementImpl element =
-        new GenericTypeAliasElementImpl('A', 40);
-    element.typeParameters = <TypeParameterElement>[B, C];
-    GenericFunctionTypeElementImpl functionElement =
-        element.function = new GenericFunctionTypeElementImpl.forOffset(-1);
-    functionElement.typeParameters = <TypeParameterElement>[];
-    functionElement.returnType = B.type;
-    functionElement.parameters = [
-      _createFunctionParameter('x', 48, type: C.type),
-    ];
-    FunctionTypeImpl functionType = new FunctionTypeImpl.forTypedef(element);
-    applyTypes(r'''
-f() {
-  A<int, String> foo;
-}
-//typedef B A<B, C>(C x);
-''', [new LocalVariableElementImpl('foo', 23)], [], <DartType>[functionType]);
-  }
-
-  /// Return a newly created parameter element with the given [name] and
-  /// [offset].
-  ParameterElement _createFunctionParameter(String name, int offset,
-      {DartType type}) {
-    ParameterElementImpl parameter = new ParameterElementImpl(name, offset);
-    parameter.type = type;
-    parameter.parameterKind = ParameterKind.REQUIRED;
-    return parameter;
-  }
-
-  /// Return a newly created type parameter element with the given [name] and
-  /// [offset].
-  TypeParameterElement _createTypeParameter(String name, int offset) {
-    TypeParameterElementImpl typeParameter =
-        new TypeParameterElementImpl(name, offset);
-    TypeParameterTypeImpl typeParameterType =
-        new TypeParameterTypeImpl(typeParameter);
-    typeParameter.type = typeParameterType;
-    return typeParameter;
-  }
-}
-
-/// Kernel wrapper around the Analyzer [type].
-class _KernelWrapperOfType implements kernel.DartType {
-  final DartType type;
-
-  _KernelWrapperOfType(this.type);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-/// Test implementation of [TypeContext].
-class _TestTypeContext implements TypeContext {
-  @override
-  ClassElement get enclosingClassElement => null;
-
-  @override
-  DartType get stringType => null;
-
-  @override
-  DartType get typeType => null;
-
-  @override
-  void encloseVariable(ElementImpl element) {}
-
-  @override
-  void enterLocalFunction(FunctionElementImpl element) {}
-
-  @override
-  void exitLocalFunction(FunctionElementImpl element) {}
-
-  @override
-  DartType translateType(kernel.DartType kernelType) {
-    return (kernelType as _KernelWrapperOfType).type;
-  }
-}
diff --git a/pkg/analyzer/test/src/fasta/test_all.dart b/pkg/analyzer/test/src/fasta/test_all.dart
index 675b470..37ccad1 100644
--- a/pkg/analyzer/test/src/fasta/test_all.dart
+++ b/pkg/analyzer/test/src/fasta/test_all.dart
@@ -7,7 +7,6 @@
 import 'ast_builder_test.dart' as ast_builder;
 import 'message_coverage_test.dart' as message_coverage;
 import 'recovery/test_all.dart' as recovery;
-import 'resolution_applier_test.dart' as resolution_applier;
 import 'resolution_test.dart' as resolution;
 
 main() {
@@ -15,7 +14,6 @@
     ast_builder.main();
     message_coverage.main();
     recovery.main();
-    resolution_applier.main();
     resolution.main();
   }, name: 'fasta');
 }
diff --git a/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart b/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
index 9386a8d..f4eb228 100644
--- a/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
+++ b/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
@@ -159,6 +159,25 @@
 ''');
   }
 
+  test_assetDirectoryDoesNotExist_error() {
+    assertErrors('''
+name: sample
+flutter:
+  assets:
+    - assets/logos/
+''', [PubspecWarningCode.ASSET_DIRECTORY_DOES_NOT_EXIST]);
+  }
+
+  test_assetDirectoryDoesExists_noError() {
+    newFolder('/sample/assets/logos');
+    assertNoErrors('''
+name: sample
+flutter:
+  assets:
+    - assets/logos/
+''');
+  }
+
   test_dependenciesFieldNotMap_dev_error_bool() {
     assertErrors('''
 name: sample
diff --git a/pkg/analyzer/test/src/summary/summary_common.dart b/pkg/analyzer/test/src/summary/summary_common.dart
index 0f78b0f..952ede8 100644
--- a/pkg/analyzer/test/src/summary/summary_common.dart
+++ b/pkg/analyzer/test/src/summary/summary_common.dart
@@ -8760,10 +8760,15 @@
     serializeLibraryText('@a(-b=""c');
     expect(unlinkedUnits, hasLength(1));
     List<UnlinkedVariable> variables = unlinkedUnits[0].variables;
-    expect(variables, hasLength(1));
-    List<UnlinkedExpr> annotations = variables[0].annotations;
-    expect(annotations, hasLength(1));
-    expect(annotations[0].isValidConst, isFalse);
+    if (Parser.useFasta) {
+      // Fasta recovers by appending `)` after `c`
+      expect(variables, isEmpty);
+    } else {
+      expect(variables, hasLength(1));
+      List<UnlinkedExpr> annotations = variables[0].annotations;
+      expect(annotations, hasLength(1));
+      expect(annotations[0].isValidConst, isFalse);
+    }
   }
 
   test_metadata_invalid_instanceCreation_argument_super() {
diff --git a/pkg/analyzer/tool/task_dependency_graph/generate.dart b/pkg/analyzer/tool/task_dependency_graph/generate.dart
index 53477e1..b3da4d0 100644
--- a/pkg/analyzer/tool/task_dependency_graph/generate.dart
+++ b/pkg/analyzer/tool/task_dependency_graph/generate.dart
@@ -161,10 +161,7 @@
         FolderBasedDartSdk.defaultSdkDirectory(resourceProvider));
 
     ContextBuilderOptions builderOptions = new ContextBuilderOptions();
-    if (Platform.packageRoot != null) {
-      builderOptions.defaultPackagesDirectoryPath =
-          Uri.parse(Platform.packageRoot).toFilePath();
-    } else if (Platform.packageConfig != null) {
+    if (Platform.packageConfig != null) {
       builderOptions.defaultPackageFilePath =
           Uri.parse(Platform.packageConfig).toFilePath();
     } else {
diff --git a/pkg/analyzer_cli/lib/src/context_cache.dart b/pkg/analyzer_cli/lib/src/context_cache.dart
index 9f07d92..11ec5f0 100644
--- a/pkg/analyzer_cli/lib/src/context_cache.dart
+++ b/pkg/analyzer_cli/lib/src/context_cache.dart
@@ -96,6 +96,7 @@
     contextOptions.generateImplicitErrors = clOptions.showPackageWarnings;
     contextOptions.generateSdkErrors = clOptions.showSdkWarnings;
     contextOptions.previewDart2 = clOptions.previewDart2;
+    contextOptions.useFastaParser = clOptions.useFastaParser;
     contextOptions.strongMode = clOptions.strongMode;
     if (clOptions.useCFE) {
       contextOptions.useFastaParser = true;
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index d82228d..80450e8 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -114,6 +114,9 @@
   /// Whether to enable the Dart 2.0 Common Front End.
   final bool useCFE;
 
+  /// Whether to enable parsing via the Fasta parser.
+  final bool useFastaParser;
+
   /// Whether to enable the Dart 2.0 Preview.
   final bool previewDart2;
 
@@ -187,6 +190,7 @@
         machineFormat = args['format'] == 'machine',
         perfReport = args['x-perf-report'],
         useCFE = args['use-cfe'],
+        useFastaParser = args['use-fasta-parser'],
         previewDart2 = args['preview-dart-2'],
         batchMode = args['batch'],
         showPackageWarnings = args['show-package-warnings'] ||
@@ -509,7 +513,10 @@
           help:
               'Enable the Dart 2.0 Common Front End implementation (experimental).',
           defaultsTo: false,
-          negatable: false,
+          hide: hide)
+      ..addFlag('use-fasta-parser',
+          help: 'Whether to enable parsing via the Fasta parser.',
+          defaultsTo: false,
           hide: hide)
       ..addFlag('preview-dart-2',
           help: 'Enable the Dart 2.0 preview.',
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index d33adca..606e0c3 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -28,19 +28,14 @@
     defineReflectiveTests(BuildModeTest);
     defineReflectiveTests(ExitCodesTest);
     defineReflectiveTests(ExitCodesTest_PreviewDart2);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(ExitCodesTest_UseCFE);
+    defineReflectiveTests(ExitCodesTest_UseCFE);
     defineReflectiveTests(LinterTest);
     defineReflectiveTests(LinterTest_PreviewDart2);
-    // Disabled until integration with the CFE has been restarted.
-//    defineReflectiveTests(LinterTest_UseCFE);
+    defineReflectiveTests(LinterTest_UseCFE);
     defineReflectiveTests(NonDartFilesTest);
     defineReflectiveTests(OptionsTest);
     defineReflectiveTests(OptionsTest_PreviewDart2);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(OptionsTest_UseCFE);
+    defineReflectiveTests(OptionsTest_UseCFE);
   }, name: 'Driver');
 }
 
@@ -680,6 +675,12 @@
 
   @override
   @failingTest
+  test_enableAssertInitializer() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
   test_fatalErrors() {
     // TODO(devoncarew): This test times out when used with @failingTest.
     return new Future.error('failing test');
@@ -687,11 +688,51 @@
 
   @override
   @failingTest
-  test_fatalWarnings() => super.test_fatalWarnings();
+  test_fatalHints() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_notFatalWarnings() => super.test_notFatalWarnings();
+  test_fatalWarnings() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_missingOptionsFile() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_notFatalHints() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_notFatalWarnings() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_partFile() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_partFile_extra() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_partFile_reversed() {
+    fail('Test crashes CFE');
+  }
 }
 
 @reflectiveTest
@@ -800,6 +841,48 @@
 class LinterTest_UseCFE extends LinterTest {
   @override
   bool get useCFE => true;
+
+  @override
+  @failingTest
+  test_defaultLints_generatedLints() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_defaultLints_getsDefaultLints() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_lintsInOptions_generatedLints() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_lintsInOptions_getAnalysisOptions() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_noLints_lintsDisabled() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_noLints_noGeneratedWarnings() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_noLints_noRegisteredLints() {
+    fail('Test times out');
+  }
 }
 
 @reflectiveTest
@@ -1016,42 +1099,75 @@
 
   @override
   @failingTest
-  test_analysisOptions_excludes() => super.test_analysisOptions_excludes();
+  test_analysisOptions_excludes() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_analysisOptions_excludesRelativeToAnalysisOptions_explicit() =>
-      super.test_analysisOptions_excludesRelativeToAnalysisOptions_explicit();
+  test_analysisOptions_excludesRelativeToAnalysisOptions_explicit() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_analysisOptions_excludesRelativeToAnalysisOptions_inferred() =>
-      super.test_analysisOptions_excludesRelativeToAnalysisOptions_inferred();
+  test_analysisOptions_excludesRelativeToAnalysisOptions_inferred() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_basic_filters() => super.test_basic_filters();
+  test_analyzeFilesInDifferentContexts() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_basic_language() => super.test_basic_language();
+  test_basic_filters() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_basic_strongMode() => super.test_basic_strongMode();
+  test_basic_language() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_includeDirective() => super.test_includeDirective();
+  test_basic_strongMode() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_previewDart2() => super.test_previewDart2();
+  test_includeDirective() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_withFlags_overrideFatalWarning() =>
-      super.test_withFlags_overrideFatalWarning();
+  test_previewDart2() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_strongSdk() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_todo() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_withFlags_overrideFatalWarning() {
+    fail('Test times out');
+  }
 }
 
 class TestSource implements Source {
diff --git a/pkg/analyzer_cli/test/options_test.dart b/pkg/analyzer_cli/test/options_test.dart
index 86ff443..4ffddfe 100644
--- a/pkg/analyzer_cli/test/options_test.dart
+++ b/pkg/analyzer_cli/test/options_test.dart
@@ -251,6 +251,17 @@
         expect(options.useCFE, isTrue);
       });
 
+      test('--use-fasta-parser', () {
+        CommandLineOptions options =
+            CommandLineOptions.parse(['--use-fasta-parser', 'foo.dart']);
+        expect(options.useFastaParser, isTrue);
+      });
+
+      test('--no-use-fasta-parser', () {
+        CommandLineOptions options = CommandLineOptions.parse(['', 'foo.dart']);
+        expect(options.useFastaParser, isFalse);
+      });
+
       test('--preview-dart-2', () {
         CommandLineOptions options =
             CommandLineOptions.parse(['--preview-dart-2', 'foo.dart']);
diff --git a/pkg/analyzer_plugin/test/integration/support/integration_tests.dart b/pkg/analyzer_plugin/test/integration/support/integration_tests.dart
index 0e58499..fbeae0c 100644
--- a/pkg/analyzer_plugin/test/integration/support/integration_tests.dart
+++ b/pkg/analyzer_plugin/test/integration/support/integration_tests.dart
@@ -653,9 +653,6 @@
     } else if (servicesPort != null) {
       arguments.add('--enable-vm-service=$servicesPort');
     }
-    if (Platform.packageRoot != null) {
-      arguments.add('--package-root=${Platform.packageRoot}');
-    }
     if (Platform.packageConfig != null) {
       arguments.add('--packages=${Platform.packageConfig}');
     }
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index c35ddbb..42d6b0c 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -41,7 +41,13 @@
 
   static const String strongMode = '--strong';
   static const String previewDart2 = '--preview-dart-2';
+  // Revert to Dart 1.0
+  //
+  // Temporary option to opt-out of Dart 2.0 while migrating.
+  static const String noPreviewDart2 = '--no-preview-dart-2';
+
   static const String omitImplicitChecks = '--omit-implicit-checks';
+  static const String laxRuntimeTypeToString = '--lax-runtime-type-to-string';
 
   static const String platformBinaries = '--platform-binaries=.+';
 
diff --git a/pkg/compiler/lib/src/common/resolution.dart b/pkg/compiler/lib/src/common/resolution.dart
index cf2ed2c..ad9214f 100644
--- a/pkg/compiler/lib/src/common/resolution.dart
+++ b/pkg/compiler/lib/src/common/resolution.dart
@@ -19,6 +19,7 @@
   Iterable<ConstantExpression> get constantLiterals =>
       const <ConstantExpression>[];
   Iterable<ClassEntity> get seenClasses => const <ClassEntity>[];
+  Iterable<RuntimeTypeUse> get runtimeTypeUses => const <RuntimeTypeUse>[];
 
   Iterable<dynamic> get nativeData => const <dynamic>[];
 
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index 738bd388..c54b666 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -1091,6 +1091,15 @@
   FunctionEntity get createInvocationMirror =>
       _findHelperFunction('createInvocationMirror');
 
+  bool isCreateInvocationMirrorHelper(MemberEntity member) {
+    return member.isTopLevel &&
+        member.name == '_createInvocationMirror' &&
+        member.library == coreLibrary;
+  }
+
+  FunctionEntity get createUnmangledInvocationMirror =>
+      _findHelperFunction('createUnmangledInvocationMirror');
+
   FunctionEntity get cyclicThrowHelper =>
       _findHelperFunction("throwCyclicInit");
 
diff --git a/pkg/compiler/lib/src/constants/expressions.dart b/pkg/compiler/lib/src/constants/expressions.dart
index 7916753..b03de0b 100644
--- a/pkg/compiler/lib/src/constants/expressions.dart
+++ b/pkg/compiler/lib/src/constants/expressions.dart
@@ -1144,6 +1144,15 @@
           });
           isValid = false;
         }
+        if (isValid &&
+            (operator.kind == BinaryOperatorKind.IDIV ||
+                operator.kind == BinaryOperatorKind.MOD)) {
+          if (rightValue.isZero) {
+            environment.reportError(right, MessageKind.INVALID_CONSTANT_DIV,
+                {'left': left, 'right': right, 'operator': operator});
+            isValid = false;
+          }
+        }
         break;
       case BinaryOperatorKind.SHL:
       case BinaryOperatorKind.SHR:
@@ -1168,6 +1177,16 @@
           });
           isValid = false;
         }
+        if (isValid &&
+            (operator.kind == BinaryOperatorKind.SHL ||
+                operator.kind == BinaryOperatorKind.SHR)) {
+          IntConstantValue shift = rightValue;
+          if (shift.intValue < BigInt.zero) {
+            environment.reportError(right, MessageKind.INVALID_CONSTANT_SHIFT,
+                {'left': left, 'right': right, 'operator': operator});
+            isValid = false;
+          }
+        }
         break;
       case BinaryOperatorKind.LOGICAL_AND:
         if (!leftValue.isBool) {
@@ -1229,6 +1248,8 @@
           if (value != null) {
             return value;
           }
+          environment
+              .reportError(this, MessageKind.NOT_A_COMPILE_TIME_CONSTANT, {});
       }
     }
     return new NonConstantValue();
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index e1a8e61..a06b868 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -124,7 +124,8 @@
   bool analyzeOnly = false;
   bool trustTypeAnnotations = false;
   bool checkedMode = false;
-  bool strongMode = false;
+  bool strongMode = true;
+  bool forceStrongMode = true;
   List<String> hints = <String>[];
   bool verbose;
   bool throwOnError;
@@ -219,11 +220,16 @@
     passThrough(argument);
   }
 
-  void setStrongMode(_) {
-    strongMode = true;
+  void setForceStrongMode(_) {
+    strongMode = forceStrongMode = true;
     passThrough(Flags.strongMode);
   }
 
+  void setLegacyMode(_) {
+    if (!forceStrongMode) strongMode = false;
+    passThrough(Flags.noPreviewDart2);
+  }
+
   void addInEnvironment(String argument) {
     int eqIndex = argument.indexOf('=');
     String name = argument.substring(2, eqIndex);
@@ -357,9 +363,16 @@
     new OptionHandler(Flags.useContentSecurityPolicy, passThrough),
     new OptionHandler(Flags.enableExperimentalMirrors, passThrough),
     new OptionHandler(Flags.enableAssertMessage, passThrough),
-    new OptionHandler(Flags.strongMode, setStrongMode),
-    new OptionHandler(Flags.previewDart2, setStrongMode),
+    // TODO(sigmund): ignore this option after we update our test bot
+    // configurations or stop testing Dart1.
+    // At the time this was added, some bots invoked dart2js with
+    // --no-preview-dart-2, but some test files contain extra dart2js options,
+    // including --strong. We want to make sure --strong takes precedence.
+    new OptionHandler(Flags.strongMode, setForceStrongMode),
+    new OptionHandler(Flags.previewDart2, setForceStrongMode),
+    new OptionHandler(Flags.noPreviewDart2, setLegacyMode),
     new OptionHandler(Flags.omitImplicitChecks, passThrough),
+    new OptionHandler(Flags.laxRuntimeTypeToString, passThrough),
     new OptionHandler(Flags.benchmarkingProduction, passThrough),
 
     // TODO(floitsch): remove conditional directives flag.
@@ -422,6 +435,17 @@
   if (enableColors != null) {
     diagnosticHandler.enableColors = enableColors;
   }
+
+  if (checkedMode && strongMode) {
+    checkedMode = false;
+    hints.add("Option '${Flags.enableCheckedMode}' is not needed in Dart 2.0.");
+  }
+
+  if (trustTypeAnnotations && strongMode) {
+    hints.add("Option '${Flags.trustTypeAnnotations}' is not available "
+        "in Dart 2.0. Try using '${Flags.omitImplicitChecks}' instead.");
+  }
+
   for (String hint in hints) {
     diagnosticHandler.info(hint, api.Diagnostic.HINT);
   }
@@ -438,20 +462,9 @@
     helpAndFail('Extra arguments: ${extra.join(" ")}');
   }
 
-  if (checkedMode && strongMode) {
-    checkedMode = false;
-    hints.add("Option '${Flags.enableCheckedMode}' is not needed in strong "
-        "mode.");
-  }
-
-  if (trustTypeAnnotations) {
-    if (checkedMode) {
-      helpAndFail("Option '${Flags.trustTypeAnnotations}' may not be used in "
-          "checked mode.");
-    } else if (strongMode) {
-      hints.add("Option '${Flags.trustTypeAnnotations}' is not available "
-          "in strong mode. Try using '${Flags.omitImplicitChecks}' instead.");
-    }
+  if (trustTypeAnnotations && checkedMode) {
+    helpAndFail("Option '${Flags.trustTypeAnnotations}' may not be used in "
+        "checked mode.");
   }
 
   if (packageRoot != null && packageConfig != null) {
@@ -504,8 +517,6 @@
 
   Uri script = currentDirectory.resolve(arguments[0]);
   diagnosticHandler.autoReadFileUri = true;
-  // TODO(sigmund): reenable hints (Issue #32111)
-  diagnosticHandler.showHints = showHints = false;
   CompilerOptions compilerOptions = CompilerOptions.parse(options,
       libraryRoot: libraryRoot, platformBinaries: platformBinaries)
     ..entryPoint = script
@@ -587,7 +598,6 @@
 
 Common options:
   -o <file> Generate the output into <file>.
-  -c        Insert runtime type checks and enable assertions (checked mode).
   -m        Generate minified output.
   -h        Display this message (add -v for information about all options).''');
 }
@@ -620,25 +630,10 @@
   --version
     Display version information.
 
-  -p<path>, --package-root=<path>
-    Where to find packages, that is, "package:..." imports.  This option cannot
-    be used with --packages.
-
   --packages=<path>
     Path to the package resolution configuration file, which supplies a mapping
     of package names to paths.  This option cannot be used with --package-root.
 
-  --analyze-all
-    Analyze all code.  Without this option, the compiler only analyzes
-    code that is reachable from [main].  This option implies --analyze-only.
-
-  --analyze-only
-    Analyze but do not generate code.
-
-  --analyze-signatures-only
-    Skip analysis of method bodies and field initializers. This option implies
-    --analyze-only.
-
   --suppress-warnings
     Do not display any warnings.
 
@@ -668,14 +663,14 @@
   --fast-startup
     Produce JavaScript that can be parsed more quickly by VMs. This option
     usually results in larger JavaScript files with faster startup.
-    Note: the dart:mirrors library is not supported with this option.
 
-  --preview-dart-2
-    Preview of all Dart 2.0 semantics, this includes generic methods and strong
-    mode type checks.
+  --no-preview-dart-2
+    Temporarily revert to Dart 1.0 semantics.
 
-    This flag is mainly for early dogfooding and will be removed when all
-    features are shipped.
+    By default dart2js compiles programs in Dart 2.0 semantics, which includes
+    generic methods and strong mode type checks. Since apps may have additional
+    checks that fail at runtime, this temporary flag may help in the migration
+    process. See also '--omit-implicit-checks'.
 
 The following advanced options can help reduce the size of the generated code,
 but they may cause programs to behave unexpectedly if assumptions are not met.
@@ -684,7 +679,7 @@
 
   --omit-implicit-checks
     Omit implicit runtime checks, such as parameter checks and implicit
-    downcasts. These checks are included by default in strong mode. By
+    downcasts. These checks are included by default in Dart 2.0. By
     using this flag the checks are removed, however the compiler will assume
     that all such checks were valid and may use this information for
     optimizations. Use this option only if you have enough testing to ensure
diff --git a/pkg/compiler/lib/src/diagnostics/messages.dart b/pkg/compiler/lib/src/diagnostics/messages.dart
index 0bd3e70..496e9aa 100644
--- a/pkg/compiler/lib/src/diagnostics/messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/messages.dart
@@ -215,6 +215,7 @@
   INVALID_CONSTANT_COMPLEMENT_TYPE,
   INVALID_CONSTANT_CONDITIONAL_TYPE,
   INVALID_CONSTANT_CONSTRUCTOR,
+  INVALID_CONSTANT_DIV,
   INVALID_CONSTANT_INDEX,
   INVALID_CONSTANT_INTERPOLATION_TYPE,
   INVALID_CONSTANT_NEGATE_TYPE,
@@ -222,6 +223,7 @@
   INVALID_CONSTANT_NUM_ADD_TYPE,
   INVALID_CONSTANT_STRING_ADD_TYPE,
   INVALID_CONSTANT_STRING_LENGTH_TYPE,
+  INVALID_CONSTANT_SHIFT,
   INVALID_CONSTRUCTOR_ARGUMENTS,
   INVALID_CONSTRUCTOR_NAME,
   INVALID_CONTINUE,
@@ -3501,6 +3503,15 @@
           "`#{constant}` of type '#{type}' is not a valid operand for a "
           ".length expression. Must be a value of type 'String'."),
 
+      MessageKind.INVALID_CONSTANT_SHIFT: const MessageTemplate(
+          MessageKind.INVALID_CONSTANT_SHIFT,
+          "Shift amount must be non-negative in "
+          "`#{left} #{operator} #{right}`."),
+
+      MessageKind.INVALID_CONSTANT_DIV: const MessageTemplate(
+          MessageKind.INVALID_CONSTANT_DIV,
+          "Divisor must be non-zero in `#{left} #{operator} #{right}`."),
+
       MessageKind.INVALID_CONSTANT_NUM_ADD_TYPE: const MessageTemplate(
           MessageKind.INVALID_CONSTANT_NUM_ADD_TYPE,
           "`#{constant}` of type '#{type}' is not a valid operand of a "
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index bacfc5e..a8164c0 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -409,7 +409,8 @@
             compiler.backendStrategy.sourceInformationStrategy,
         constantCompilerTask = new JavaScriptConstantTask(compiler) {
     CommonElements commonElements = compiler.frontendStrategy.commonElements;
-    _backendUsageBuilder = new BackendUsageBuilderImpl(commonElements);
+    _backendUsageBuilder =
+        new BackendUsageBuilderImpl(compiler.frontendStrategy);
     _checkedModeHelpers = new CheckedModeHelpers();
     emitter =
         new CodeEmitterTask(compiler, generateSourceMap, useStartupEmitter);
@@ -799,6 +800,7 @@
         closedWorld.nativeData,
         closedWorld.elementEnvironment,
         closedWorld.commonElements,
+        closedWorld.rtiNeed,
         strongMode: compiler.options.strongMode);
     emitter.createEmitter(namer, closedWorld, codegenWorldBuilder, sorter);
     // TODO(johnniwinther): Share the impact object created in
diff --git a/pkg/compiler/lib/src/js_backend/backend_impact.dart b/pkg/compiler/lib/src/js_backend/backend_impact.dart
index 90bc21f..9adf701 100644
--- a/pkg/compiler/lib/src/js_backend/backend_impact.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_impact.dart
@@ -720,9 +720,12 @@
   BackendImpact _noSuchMethodSupport;
 
   BackendImpact get noSuchMethodSupport {
-    return _noSuchMethodSupport ??= new BackendImpact(
-        staticUses: [_commonElements.createInvocationMirror],
-        dynamicUses: [Selectors.noSuchMethod_]);
+    return _noSuchMethodSupport ??= new BackendImpact(staticUses: [
+      _commonElements.createInvocationMirror,
+      _commonElements.createUnmangledInvocationMirror
+    ], dynamicUses: [
+      Selectors.noSuchMethod_
+    ]);
   }
 
   BackendImpact _loadLibrary;
diff --git a/pkg/compiler/lib/src/js_backend/backend_usage.dart b/pkg/compiler/lib/src/js_backend/backend_usage.dart
index 7e2065e..3b7503c 100644
--- a/pkg/compiler/lib/src/js_backend/backend_usage.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_usage.dart
@@ -6,6 +6,8 @@
 import '../common_elements.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
+import '../frontend_strategy.dart';
+import '../universe/feature.dart';
 import '../util/util.dart' show Setlet;
 import 'backend_impact.dart';
 
@@ -26,6 +28,8 @@
 
   Iterable<ClassEntity> get helperClassesUsed;
 
+  Iterable<RuntimeTypeUse> get runtimeTypeUses;
+
   /// `true` if a core-library function requires the preamble file to function.
   bool get requiresPreamble;
 
@@ -71,8 +75,8 @@
 
   void registerUsedMember(MemberEntity member);
 
-  /// `true` of `Object.runtimeType` is used.
-  bool isRuntimeTypeUsed;
+  /// Register use of `runtimeType`.
+  void registerRuntimeTypeUse(RuntimeTypeUse runtimeTypeUse);
 
   /// `true` if `Function.apply` is used.
   bool isFunctionApplyUsed;
@@ -84,7 +88,7 @@
 }
 
 class BackendUsageBuilderImpl implements BackendUsageBuilder {
-  final CommonElements _commonElements;
+  FrontendStrategy _frontendStrategy;
   // TODO(johnniwinther): Remove the need for these.
   Setlet<FunctionEntity> _globalFunctionDependencies;
   Setlet<ClassEntity> _globalClassDependencies;
@@ -95,6 +99,8 @@
   /// List of classes that the backend may use.
   final Set<ClassEntity> _helperClassesUsed = new Set<ClassEntity>();
 
+  final Set<RuntimeTypeUse> _runtimeTypeUses = new Set<RuntimeTypeUse>();
+
   bool _needToInitializeIsolateAffinityTag = false;
   bool _needToInitializeDispatchProperty = false;
 
@@ -104,9 +110,6 @@
   /// `true` if [CommonElements.invokeOnMethod] is used.
   bool isInvokeOnUsed = false;
 
-  /// `true` of `Object.runtimeType` is used.
-  bool isRuntimeTypeUsed = false;
-
   /// `true` if `Function.apply` is used.
   bool isFunctionApplyUsed = false;
 
@@ -116,43 +119,34 @@
   /// `true` if `noSuchMethod` is used.
   bool isNoSuchMethodUsed = false;
 
-  BackendUsageBuilderImpl(this._commonElements);
+  BackendUsageBuilderImpl(this._frontendStrategy);
+
+  CommonElements get _commonElements => _frontendStrategy.commonElements;
 
   @override
   void registerBackendFunctionUse(FunctionEntity element) {
-    assert(_isValidBackendUse(element),
+    assert(_isValidBackendUse(element, element.library),
         failedAt(element, "Backend use of $element is not allowed."));
     _helperFunctionsUsed.add(element);
   }
 
   @override
   void registerBackendClassUse(ClassEntity element) {
-    assert(_isValidBackendUse(element),
+    assert(_isValidBackendUse(element, element.library),
         failedAt(element, "Backend use of $element is not allowed."));
     _helperClassesUsed.add(element);
   }
 
-  bool _isValidBackendUse(Entity element) {
+  bool _isValidBackendUse(Entity element, LibraryEntity library) {
     if (_isValidEntity(element)) return true;
-    // TODO(redemption): Support these checks on kernel based elements:
-    /*if (element is Element) {
-      assert(element.isDeclaration,
-          failedAt(element, "Backend use $element must be the declaration."));
-      if (element.implementationLibrary.isPatch ||
-          // Needed to detect deserialized injected elements, that is
-          // element declared in patch files.
-          (element.library.isPlatformLibrary &&
-              element.sourcePosition.uri.path
-                  .contains('_internal/js_runtime/lib/')) ||
-          element.library == _commonElements.jsHelperLibrary ||
-          element.library == _commonElements.interceptorsLibrary) {
-        // TODO(johnniwinther): We should be more precise about these.
-        return true;
-      } else {
-        return false;
-      }
-    }*/
-    return true;
+    SourceSpan span = _frontendStrategy.spanFromSpannable(element, element);
+    if (library.canonicalUri.scheme == 'dart' &&
+        span.uri.path.contains('_internal/js_runtime/lib/')) {
+      // TODO(johnniwinther): We should be more precise about these.
+      return true;
+    } else {
+      return false;
+    }
   }
 
   bool _isValidEntity(Entity element) {
@@ -258,6 +252,11 @@
     _globalClassDependencies.add(element);
   }
 
+  @override
+  void registerRuntimeTypeUse(RuntimeTypeUse runtimeTypeUse) {
+    _runtimeTypeUses.add(runtimeTypeUse);
+  }
+
   BackendUsage close() {
     return new BackendUsageImpl(
         globalFunctionDependencies: _globalFunctionDependencies,
@@ -268,7 +267,7 @@
         needToInitializeDispatchProperty: _needToInitializeDispatchProperty,
         requiresPreamble: requiresPreamble,
         isInvokeOnUsed: isInvokeOnUsed,
-        isRuntimeTypeUsed: isRuntimeTypeUsed,
+        runtimeTypeUses: _runtimeTypeUses,
         isFunctionApplyUsed: isFunctionApplyUsed,
         isMirrorsUsed: isMirrorsUsed,
         isNoSuchMethodUsed: isNoSuchMethodUsed);
@@ -286,6 +285,8 @@
   /// Set of classes instantiated by the backend.
   final Set<ClassEntity> _helperClassesUsed;
 
+  final Set<RuntimeTypeUse> _runtimeTypeUses;
+
   bool needToInitializeIsolateAffinityTag;
   bool needToInitializeDispatchProperty;
 
@@ -295,9 +296,6 @@
   /// `true` if [CommonElements.invokeOnMethod] is used.
   final bool isInvokeOnUsed;
 
-  /// `true` of `Object.runtimeType` is used.
-  final bool isRuntimeTypeUsed;
-
   /// `true` if `Function.apply` is used.
   final bool isFunctionApplyUsed;
 
@@ -316,14 +314,15 @@
       this.needToInitializeDispatchProperty,
       this.requiresPreamble,
       this.isInvokeOnUsed,
-      this.isRuntimeTypeUsed,
+      Set<RuntimeTypeUse> runtimeTypeUses,
       this.isFunctionApplyUsed,
       this.isMirrorsUsed,
       this.isNoSuchMethodUsed})
       : this._globalFunctionDependencies = globalFunctionDependencies,
         this._globalClassDependencies = globalClassDependencies,
         this._helperFunctionsUsed = helperFunctionsUsed,
-        this._helperClassesUsed = helperClassesUsed;
+        this._helperClassesUsed = helperClassesUsed,
+        this._runtimeTypeUses = runtimeTypeUses;
 
   @override
   bool isFunctionUsedByBackend(FunctionEntity element) {
@@ -347,4 +346,10 @@
 
   @override
   Iterable<ClassEntity> get helperClassesUsed => _helperClassesUsed;
+
+  @override
+  bool get isRuntimeTypeUsed => _runtimeTypeUses.isNotEmpty;
+
+  @override
+  Iterable<RuntimeTypeUse> get runtimeTypeUses => _runtimeTypeUses;
 }
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index 8d6506d..a438262 100644
--- a/pkg/compiler/lib/src/js_backend/impact_transformer.dart
+++ b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
@@ -233,6 +233,14 @@
           .registerTypeUse(new TypeUse.instantiation(listLiteralUse.type));
     }
 
+    for (RuntimeTypeUse runtimeTypeUse in worldImpact.runtimeTypeUses) {
+      // Enable runtime type support if we discover a getter called
+      // runtimeType. We have to enable runtime type before hitting the
+      // codegen, so that constructors know whether they need to generate code
+      // for runtime type.
+      _backendUsageBuilder.registerRuntimeTypeUse(runtimeTypeUse);
+    }
+
     if (worldImpact.constSymbolNames.isNotEmpty) {
       registerImpact(_impacts.constSymbol);
     }
diff --git a/pkg/compiler/lib/src/js_backend/resolution_listener.dart b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
index f46723a..c1b2cac 100644
--- a/pkg/compiler/lib/src/js_backend/resolution_listener.dart
+++ b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
@@ -285,6 +285,10 @@
     }
     _backendUsage.registerUsedMember(member);
 
+    if (_commonElements.isCreateInvocationMirrorHelper(member)) {
+      _registerBackendImpact(worldImpact, _impacts.noSuchMethodSupport);
+    }
+
     if (_elementEnvironment.isDeferredLoadLibraryGetter(member)) {
       // TODO(sigurdm): Create a function registerLoadLibraryAccess.
       if (!_isLoadLibraryFunctionResolved) {
@@ -298,7 +302,6 @@
       // runtimeType. We have to enable runtime type before hitting the
       // codegen, so that constructors know whether they need to generate code
       // for runtime type.
-      _backendUsage.isRuntimeTypeUsed = true;
       // TODO(ahe): Record precise dependency here.
       worldImpact.addImpact(_registerRuntimeType());
     }
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index 332926b..a449b52 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -16,7 +16,7 @@
 import '../universe/feature.dart';
 import '../universe/selector.dart';
 import '../universe/world_builder.dart';
-import '../world.dart' show JClosedWorld, KClosedWorld;
+import '../world.dart' show ClassQuery, JClosedWorld, KClosedWorld;
 import 'backend_usage.dart';
 import 'namer.dart';
 import 'native_data.dart';
@@ -86,17 +86,12 @@
   ///
   bool methodNeedsSignature(FunctionEntity method);
 
-  /// Returns `true` if a signature is needed for the call-method created for
-  /// [localFunction].
-  ///
-  /// See [methodNeedsSignature] for more information on what a signature is
-  /// and when it is needed.
-  bool localFunctionNeedsSignature(Local localFunction);
-
   /// Returns `true` if a dynamic call of [selector] needs to pass type
   /// arguments.
   bool selectorNeedsTypeArguments(Selector selector);
 
+  bool get runtimeTypeUsedOnClosures;
+
   /// Returns `true` if a generic instantiation on an expression of type
   /// [functionType] with the given [typeArgumentCount] needs to pass type
   /// arguments.
@@ -112,9 +107,6 @@
   bool classNeedsTypeArguments(ClassEntity cls) => true;
 
   @override
-  bool localFunctionNeedsSignature(Local localFunction) => true;
-
-  @override
   bool methodNeedsSignature(FunctionEntity method) => true;
 
   @override
@@ -127,6 +119,9 @@
   bool selectorNeedsTypeArguments(Selector selector) => true;
 
   @override
+  bool get runtimeTypeUsedOnClosures => true;
+
+  @override
   bool instantiationNeedsTypeArguments(
       DartType functionType, int typeArgumentCount) {
     return true;
@@ -719,7 +714,6 @@
 
 class RuntimeTypesNeedImpl implements RuntimeTypesNeed {
   final ElementEnvironment _elementEnvironment;
-  final BackendUsage _backendUsage;
   final Set<ClassEntity> classesNeedingTypeArguments;
   final Set<FunctionEntity> methodsNeedingSignature;
   final Set<FunctionEntity> methodsNeedingTypeArguments;
@@ -727,54 +721,45 @@
   final Set<Local> localFunctionsNeedingTypeArguments;
   final Set<Selector> selectorsNeedingTypeArguments;
   final Set<int> instantiationsNeedingTypeArguments;
+  // TODO(johnniwinther): Remove these fields together with Dart 1.
+  final bool allNeedsTypeArguments;
+  final bool runtimeTypeUsedOnClosures;
 
   RuntimeTypesNeedImpl(
       this._elementEnvironment,
-      this._backendUsage,
       this.classesNeedingTypeArguments,
       this.methodsNeedingSignature,
       this.methodsNeedingTypeArguments,
       this.localFunctionsNeedingSignature,
       this.localFunctionsNeedingTypeArguments,
       this.selectorsNeedingTypeArguments,
-      this.instantiationsNeedingTypeArguments);
+      this.instantiationsNeedingTypeArguments,
+      {this.allNeedsTypeArguments,
+      this.runtimeTypeUsedOnClosures});
 
   bool checkClass(covariant ClassEntity cls) => true;
 
   bool classNeedsTypeArguments(ClassEntity cls) {
     assert(checkClass(cls));
     if (!_elementEnvironment.isGenericClass(cls)) return false;
-    if (_backendUsage.isRuntimeTypeUsed) return true;
+    if (allNeedsTypeArguments) return true;
     return classesNeedingTypeArguments.contains(cls);
   }
 
   bool methodNeedsSignature(FunctionEntity function) {
-    return _backendUsage.isRuntimeTypeUsed ||
-        methodsNeedingSignature.contains(function);
+    return allNeedsTypeArguments || methodsNeedingSignature.contains(function);
   }
 
   bool methodNeedsTypeArguments(FunctionEntity function) {
     if (function.parameterStructure.typeParameters == 0) return false;
-    if (_backendUsage.isRuntimeTypeUsed) return true;
+    if (allNeedsTypeArguments) return true;
     return methodsNeedingTypeArguments.contains(function);
   }
 
-  bool localFunctionNeedsSignature(Local function) {
-    // This function should not be called when the compiler is using the new FE
-    // (--use-kernel). As an invariant, localFunctionsNeedingSignature is always
-    // null when --use-kernel is true.
-    if (localFunctionsNeedingSignature == null) {
-      throw new UnsupportedError(
-          'RuntimeTypesNeed.localFunctionNeedingSignature with --use-kernel');
-    }
-    return _backendUsage.isRuntimeTypeUsed ||
-        localFunctionsNeedingSignature.contains(function);
-  }
-
   @override
   bool selectorNeedsTypeArguments(Selector selector) {
     if (selector.callStructure.typeArgumentCount == 0) return false;
-    if (_backendUsage.isRuntimeTypeUsed) return true;
+    if (allNeedsTypeArguments) return true;
     return selectorsNeedingTypeArguments.contains(selector);
   }
 
@@ -1642,6 +1627,135 @@
       }
     }
 
+    bool allNeedsTypeArguments;
+    bool runtimeTypeUsedOnClosures;
+    BackendUsage backendUsage = closedWorld.backendUsage;
+    CommonElements commonElements = closedWorld.commonElements;
+    if (!options.strongMode) {
+      allNeedsTypeArguments =
+          runtimeTypeUsedOnClosures = backendUsage.isRuntimeTypeUsed;
+    } else {
+      allNeedsTypeArguments = runtimeTypeUsedOnClosures = false;
+
+      /// Set to `true` if subclasses of `Object` need runtimeType. This is
+      /// only used to stop the computation early.
+      bool neededOnAll = false;
+
+      /// Set to `true` if subclasses of `Function` need runtimeType.
+      bool neededOnFunctions = false;
+
+      Set<ClassEntity> classesDirectlyNeedingRuntimeType =
+          new Set<ClassEntity>();
+
+      ClassEntity impliedClass(DartType type) {
+        if (type is InterfaceType) {
+          return type.element;
+        } else if (type is DynamicType) {
+          return commonElements.objectClass;
+        } else if (type is FunctionType) {
+          // TODO(johnniwinther): Include only potential function type subtypes.
+          return commonElements.functionClass;
+        } else if (type is VoidType) {
+          // No classes implied.
+        } else if (type is FunctionTypeVariable) {
+          return impliedClass(type.bound);
+        } else if (type is TypeVariableType) {
+          // TODO(johnniwinther): Can we do better?
+          return impliedClass(
+              _elementEnvironment.getTypeVariableBound(type.element));
+        }
+        throw new UnsupportedError('Unexpected type $type');
+      }
+
+      void addClass(ClassEntity cls) {
+        if (cls != null) {
+          classesDirectlyNeedingRuntimeType.add(cls);
+        }
+        if (cls == commonElements.objectClass) {
+          neededOnAll = true;
+        }
+        if (cls == commonElements.functionClass) {
+          neededOnFunctions = true;
+        }
+      }
+
+      for (RuntimeTypeUse runtimeTypeUse in backendUsage.runtimeTypeUses) {
+        switch (runtimeTypeUse.kind) {
+          case RuntimeTypeUseKind.string:
+            if (!options.laxRuntimeTypeToString) {
+              addClass(impliedClass(runtimeTypeUse.receiverType));
+            }
+
+            break;
+          case RuntimeTypeUseKind.equals:
+            ClassEntity receiverClass =
+                impliedClass(runtimeTypeUse.receiverType);
+            ClassEntity argumentClass =
+                impliedClass(runtimeTypeUse.argumentType);
+
+            // TODO(johnniwinther): Special case use of `this.runtimeType`.
+            if (closedWorld.isSubtypeOf(receiverClass, argumentClass)) {
+              addClass(receiverClass);
+            } else if (closedWorld.isSubtypeOf(argumentClass, receiverClass)) {
+              addClass(argumentClass);
+            }
+            if (neededOnAll) break;
+            // TODO(johnniwinther): Special case use of `this.runtimeType`.
+            // TODO(johnniwinther): Rename [commonSubclasses] to something like
+            // [strictCommonClasses] and support the non-strict case directly.
+            // Since we do a subclassesOf
+            classesDirectlyNeedingRuntimeType.addAll(
+                closedWorld.commonSubclasses(receiverClass, ClassQuery.SUBTYPE,
+                    argumentClass, ClassQuery.SUBTYPE));
+            break;
+          case RuntimeTypeUseKind.unknown:
+            addClass(impliedClass(runtimeTypeUse.receiverType));
+            break;
+        }
+        if (neededOnAll) break;
+      }
+      Set<ClassEntity> allClassesNeedingRuntimeType;
+      if (neededOnAll) {
+        neededOnFunctions = true;
+        allClassesNeedingRuntimeType =
+            closedWorld.subclassesOf(commonElements.objectClass).toSet();
+      } else {
+        allClassesNeedingRuntimeType = new Set<ClassEntity>();
+        // TODO(johnniwinther): Support this operation directly in
+        // [ClosedWorld] using the [ClassSet]s.
+        for (ClassEntity cls in classesDirectlyNeedingRuntimeType) {
+          if (!allClassesNeedingRuntimeType.contains(cls)) {
+            allClassesNeedingRuntimeType.addAll(closedWorld.subtypesOf(cls));
+          }
+        }
+      }
+      allClassesNeedingRuntimeType.forEach(potentiallyNeedTypeArguments);
+      if (neededOnFunctions) {
+        for (Local function in resolutionWorldBuilder.genericLocalFunctions) {
+          potentiallyNeedTypeArguments(function);
+        }
+        for (Local function in localFunctions) {
+          FunctionType functionType =
+              _elementEnvironment.getLocalFunctionType(function);
+          functionType.forEachTypeVariable((TypeVariableType typeVariable) {
+            Entity typeDeclaration = typeVariable.element.typeDeclaration;
+            if (!processedEntities.contains(typeDeclaration)) {
+              potentiallyNeedTypeArguments(typeDeclaration);
+            }
+          });
+          localFunctionsNeedingSignature.addAll(localFunctions);
+        }
+        for (FunctionEntity function in resolutionWorldBuilder.genericMethods) {
+          potentiallyNeedTypeArguments(function);
+        }
+        for (FunctionEntity function
+            in resolutionWorldBuilder.closurizedMembersWithFreeTypeVariables) {
+          methodsNeedingSignature.add(function);
+          potentiallyNeedTypeArguments(function.enclosingClass);
+        }
+      }
+    }
+
     Set<Selector> selectorsNeedingTypeArguments = new Set<Selector>();
     typeVariableTests
         .forEachAppliedSelector((Selector selector, Set<Entity> targets) {
@@ -1708,18 +1822,21 @@
     print('selectorsNeedingTypeArguments:');
     selectorsNeedingTypeArguments.forEach((e) => print('  $e'));
     print('instantiationsNeedingTypeArguments: '
-        '$instantiationsNeedingTypeArguments');*/
+        '$instantiationsNeedingTypeArguments');
+    print('allNeedsTypeArguments=$allNeedsTypeArguments');
+    print('runtimeTypeUsedOnClosures=$runtimeTypeUsedOnClosures');*/
 
     return new RuntimeTypesNeedImpl(
         _elementEnvironment,
-        closedWorld.backendUsage,
         classesNeedingTypeArguments,
         methodsNeedingSignature,
         methodsNeedingTypeArguments,
         localFunctionsNeedingSignature,
         localFunctionsNeedingTypeArguments,
         selectorsNeedingTypeArguments,
-        instantiationsNeedingTypeArguments);
+        instantiationsNeedingTypeArguments,
+        allNeedsTypeArguments: allNeedsTypeArguments,
+        runtimeTypeUsedOnClosures: runtimeTypeUsedOnClosures);
   }
 }
 
@@ -1873,8 +1990,14 @@
     //
     // In Dart 2, a closure class implements the function type of its `call`
     // method and needs a signature function for testing its function type
-    // against typedefs and function types that are used in is-checks.
-    if (isFunctionChecked || checkedFunctionTypes.isNotEmpty) {
+    // against typedefs and function types that are used in is-checks. Since
+    // closures have a signature method iff they need it and should have a
+    // function type iff they have a signature, we process all classes. We know
+    // that the function type is not inherited, so we don't need to process
+    // their super classes.
+    if (isFunctionChecked ||
+        checkedFunctionTypes.isNotEmpty ||
+        options.strongMode) {
       Set<ClassEntity> processedClasses = new Set<ClassEntity>();
 
       void processClass(ClassEntity cls) {
@@ -1903,7 +2026,11 @@
           liveClasses.add(cls);
         }
       });
-      liveClasses.forEach(processSuperClasses);
+      if (options.strongMode) {
+        liveClasses.forEach(processClass);
+      } else {
+        liveClasses.forEach(processSuperClasses);
+      }
     }
 
     if (options.parameterCheckPolicy.isEmitted) {
@@ -1931,13 +2058,13 @@
 /// In Dart 1, any class with a `call` method has a function type, in Dart 2
 /// only closure classes have a function type.
 ClassFunctionType _computeFunctionType(
-    ElementEnvironment _elementEnvironment, ClassEntity cls,
+    ElementEnvironment elementEnvironment, ClassEntity cls,
     {bool strongMode}) {
   FunctionEntity signatureFunction;
   if (cls.isClosure) {
     // Use signature function if available.
     signatureFunction =
-        _elementEnvironment.lookupLocalClassMember(cls, Identifiers.signature);
+        elementEnvironment.lookupLocalClassMember(cls, Identifiers.signature);
     if (signatureFunction == null && strongMode) {
       // In Dart 2, a closure only needs its function type if it has a
       // signature function.
@@ -1948,10 +2075,10 @@
     return null;
   }
   MemberEntity call =
-      _elementEnvironment.lookupLocalClassMember(cls, Identifiers.call);
+      elementEnvironment.lookupLocalClassMember(cls, Identifiers.call);
   if (call != null && call.isFunction) {
     FunctionEntity callFunction = call;
-    FunctionType callType = _elementEnvironment.getFunctionType(callFunction);
+    FunctionType callType = elementEnvironment.getFunctionType(callFunction);
     return new ClassFunctionType(callFunction, callType, signatureFunction);
   }
   return null;
@@ -1962,9 +2089,11 @@
   final ElementEnvironment _elementEnvironment;
   final CommonElements commonElements;
   final TypeRepresentationGenerator _representationGenerator;
+  final RuntimeTypesNeed _rtiNeed;
 
   RuntimeTypesEncoderImpl(this.namer, NativeBasicData nativeData,
-      this._elementEnvironment, this.commonElements, {bool strongMode})
+      this._elementEnvironment, this.commonElements, this._rtiNeed,
+      {bool strongMode})
       : _representationGenerator = new TypeRepresentationGenerator(
             namer, nativeData,
             strongMode: strongMode);
@@ -2068,7 +2197,16 @@
     ClassEntity contextClass = DartTypes.getClassContext(type);
     jsAst.Expression encoding =
         getTypeEncoding(emitter, type, alwaysGenerateFunction: true);
-    if (contextClass != null) {
+    if (contextClass != null &&
+        // We only generate folding using 'computeSignature' if [contextClass]
+        // has reified type arguments. The 'computeSignature' function might not
+        // be emitted (if it's not needed elsewhere) and the generated signature
+        // will have `undefined` as its type variables in any case.
+        //
+        // This is needed specifically for --lax-runtime-type-to-string which
+        // may require a signature on a method that uses class type variables
+        // while at the same time not needing type arguments on the class.
+        _rtiNeed.classNeedsTypeArguments(contextClass)) {
       jsAst.Name contextName = namer.className(contextClass);
       return js('function () { return #(#, #, #); }', [
         emitter.staticFunctionAccess(commonElements.computeSignature),
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
index 34a538d..407b49e 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
@@ -1695,6 +1695,9 @@
     if (compiler.options.trustPrimitives) flavor.write(', trust primitives');
     if (compiler.options.trustTypeAnnotations) flavor.write(', trust types');
     if (compiler.options.omitImplicitChecks) flavor.write(', omit checks');
+    if (compiler.options.laxRuntimeTypeToString) {
+      flavor.write(', lax runtime type');
+    }
     if (compiler.options.useContentSecurityPolicy) flavor.write(', CSP');
     if (_closedWorld.backendUsage.isMirrorsUsed) flavor.write(', mirrors');
     return new jsAst.Comment(generatedBy(compiler, flavor: '$flavor'));
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
index f57321e..edda727 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
@@ -226,6 +226,9 @@
     if (compiler.options.trustPrimitives) flavor.write(', trust primitives');
     if (compiler.options.trustTypeAnnotations) flavor.write(', trust types');
     if (compiler.options.omitImplicitChecks) flavor.write(', omit checks');
+    if (compiler.options.laxRuntimeTypeToString) {
+      flavor.write(', lax runtime type');
+    }
     if (compiler.options.useContentSecurityPolicy) flavor.write(', CSP');
     return new js.Comment(generatedBy(compiler, flavor: '$flavor'));
   }
diff --git a/pkg/compiler/lib/src/js_model/elements.dart b/pkg/compiler/lib/src/js_model/elements.dart
index 2641d69..5f2a4a1 100644
--- a/pkg/compiler/lib/src/js_model/elements.dart
+++ b/pkg/compiler/lib/src/js_model/elements.dart
@@ -92,7 +92,7 @@
 
 abstract class JsToFrontendMapBase extends JsToFrontendMap {
   DartType toBackendType(DartType type) =>
-      const TypeConverter().visit(type, _toBackendEntity);
+      type == null ? null : const TypeConverter().visit(type, _toBackendEntity);
 
   Entity _toBackendEntity(Entity entity) {
     if (entity is ClassEntity) return toBackendClass(entity);
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index e1779e6..6b68731 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -44,6 +44,7 @@
 import '../types/abstract_value_domain.dart';
 import '../types/types.dart';
 import '../universe/class_set.dart';
+import '../universe/feature.dart';
 import '../universe/selector.dart';
 import '../universe/world_builder.dart';
 import '../world.dart';
@@ -202,7 +203,7 @@
       NativeBasicData nativeBasicData,
       JClosedWorld closedWorld,
       SelectorConstraintsStrategy selectorConstraintsStrategy) {
-    return new KernelCodegenWorldBuilder(
+    return new CodegenWorldBuilderImpl(
         elementMap,
         _globalLocalsMap,
         closedWorld.elementEnvironment,
@@ -348,11 +349,12 @@
           this,
           map.toBackendMemberMap(closureModels, identity),
           new JsClosureRtiNeed(
-            backendUsage,
-            jRtiNeed,
-            localFunctionsNodesNeedingTypeArguments,
-            localFunctionsNodesNeedingSignature,
-          ));
+              jRtiNeed,
+              localFunctionsNodesNeedingTypeArguments,
+              localFunctionsNodesNeedingSignature,
+              runtimeTypeUsedOnClosures:
+                  kernelRtiNeed.runtimeTypeUsedOnClosures,
+              allNeedsTypeArguments: kernelRtiNeed.allNeedsTypeArguments));
 
       List<FunctionEntity> callMethodsNeedingSignature = <FunctionEntity>[];
       for (ir.Node node in localFunctionsNodesNeedingSignature) {
@@ -416,6 +418,14 @@
         map.toBackendFunctionSet(backendUsage.helperFunctionsUsed);
     Set<ClassEntity> helperClassesUsed =
         map.toBackendClassSet(backendUsage.helperClassesUsed);
+    Set<RuntimeTypeUse> runtimeTypeUses =
+        backendUsage.runtimeTypeUses.map((RuntimeTypeUse runtimeTypeUse) {
+      return new RuntimeTypeUse(
+          runtimeTypeUse.kind,
+          map.toBackendType(runtimeTypeUse.receiverType),
+          map.toBackendType(runtimeTypeUse.argumentType));
+    }).toSet();
+
     return new BackendUsageImpl(
         globalFunctionDependencies: globalFunctionDependencies,
         globalClassDependencies: globalClassDependencies,
@@ -427,7 +437,7 @@
             backendUsage.needToInitializeDispatchProperty,
         requiresPreamble: backendUsage.requiresPreamble,
         isInvokeOnUsed: backendUsage.isInvokeOnUsed,
-        isRuntimeTypeUsed: backendUsage.isRuntimeTypeUsed,
+        runtimeTypeUses: runtimeTypeUses,
         isFunctionApplyUsed: backendUsage.isFunctionApplyUsed,
         isMirrorsUsed: backendUsage.isMirrorsUsed,
         isNoSuchMethodUsed: backendUsage.isNoSuchMethodUsed);
@@ -565,14 +575,15 @@
     }).toSet();
     return new RuntimeTypesNeedImpl(
         _elementEnvironment,
-        backendUsage,
         classesNeedingTypeArguments,
         methodsNeedingSignature,
         methodsNeedingTypeArguments,
         null,
         null,
         selectorsNeedingTypeArguments,
-        rtiNeed.instantiationsNeedingTypeArguments);
+        rtiNeed.instantiationsNeedingTypeArguments,
+        allNeedsTypeArguments: rtiNeed.allNeedsTypeArguments,
+        runtimeTypeUsedOnClosures: rtiNeed.runtimeTypeUsedOnClosures);
   }
 
   /// Construct a closure class and set up the necessary class inference
@@ -854,23 +865,21 @@
 }
 
 class JsClosureRtiNeed implements ClosureRtiNeed {
-  final BackendUsage backendUsage;
   final RuntimeTypesNeed rtiNeed;
   final Set<ir.Node> localFunctionsNodesNeedingTypeArguments;
   final Set<ir.Node> localFunctionsNodesNeedingSignature;
+  final bool runtimeTypeUsedOnClosures;
+  final bool allNeedsTypeArguments;
 
-  JsClosureRtiNeed(
-      this.backendUsage,
-      this.rtiNeed,
-      this.localFunctionsNodesNeedingTypeArguments,
-      this.localFunctionsNodesNeedingSignature);
+  JsClosureRtiNeed(this.rtiNeed, this.localFunctionsNodesNeedingTypeArguments,
+      this.localFunctionsNodesNeedingSignature,
+      {this.runtimeTypeUsedOnClosures, this.allNeedsTypeArguments});
 
   @override
   bool localFunctionNeedsSignature(ir.Node node) {
     assert(node is ir.FunctionDeclaration || node is ir.FunctionExpression);
-    return backendUsage.isRuntimeTypeUsed
-        ? true
-        : localFunctionsNodesNeedingSignature.contains(node);
+    return runtimeTypeUsedOnClosures ||
+        localFunctionsNodesNeedingSignature.contains(node);
   }
 
   @override
@@ -884,9 +893,8 @@
   @override
   bool localFunctionNeedsTypeArguments(ir.Node node) {
     assert(node is ir.FunctionDeclaration || node is ir.FunctionExpression);
-    return backendUsage.isRuntimeTypeUsed
-        ? true
-        : localFunctionsNodesNeedingTypeArguments.contains(node);
+    return allNeedsTypeArguments ||
+        localFunctionsNodesNeedingTypeArguments.contains(node);
   }
 
   @override
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index 462ba79..71a8c15 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -4,12 +4,13 @@
 
 library compiler.src.kernel.dart2js_target;
 
-import 'package:kernel/kernel.dart';
+import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/core_types.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/target/targets.dart';
 
 import '../native/native.dart' show maybeEnableNative;
+import '../universe/selector.dart';
 
 /// A kernel [Target] to configure the Dart Front End for dart2js.
 class Dart2jsTarget extends Target {
@@ -20,6 +21,8 @@
 
   bool get strongMode => flags.strongMode;
 
+  bool get enableNoSuchMethodForwarders => flags.strongMode;
+
   List<String> get extraRequiredLibraries => _requiredLibraries[name];
 
   @override
@@ -40,23 +43,56 @@
 
   @override
   void performModularTransformationsOnLibraries(
-      CoreTypes coreTypes, ClassHierarchy hierarchy, List<Library> libraries,
+      CoreTypes coreTypes, ClassHierarchy hierarchy, List<ir.Library> libraries,
       {void logger(String msg)}) {}
 
   @override
-  void performGlobalTransformations(CoreTypes coreTypes, Component component,
+  void performGlobalTransformations(CoreTypes coreTypes, ir.Component component,
       {void logger(String msg)}) {}
 
   @override
-  Expression instantiateInvocation(CoreTypes coreTypes, Expression receiver,
-      String name, Arguments arguments, int offset, bool isSuper) {
-    // TODO(sigmund): implement;
-    return new InvalidExpression(null);
+  ir.Expression instantiateInvocation(
+      CoreTypes coreTypes,
+      ir.Expression receiver,
+      String name,
+      ir.Arguments arguments,
+      int offset,
+      bool isSuper) {
+    int kind;
+    if (name.startsWith('get:')) {
+      kind = Selector.invocationMirrorGetterKind;
+      name = name.substring(4);
+    } else if (name.startsWith('set:')) {
+      kind = Selector.invocationMirrorSetterKind;
+      name = name.substring(4);
+    } else {
+      kind = Selector.invocationMirrorMethodKind;
+    }
+    return new ir.StaticInvocation(
+        coreTypes.index
+            .getTopLevelMember('dart:core', '_createInvocationMirror'),
+        new ir.Arguments(<ir.Expression>[
+          new ir.StringLiteral(name)..fileOffset = offset,
+          new ir.ListLiteral(
+              arguments.types.map((t) => new ir.TypeLiteral(t)).toList()),
+          new ir.ListLiteral(arguments.positional)..fileOffset = offset,
+          new ir.MapLiteral(new List<ir.MapEntry>.from(
+              arguments.named.map((ir.NamedExpression arg) {
+            return new ir.MapEntry(
+                new ir.StringLiteral(arg.name)..fileOffset = arg.fileOffset,
+                arg.value)
+              ..fileOffset = arg.fileOffset;
+          })), keyType: coreTypes.stringClass.rawType)
+            ..isConst = (arguments.named.length == 0)
+            ..fileOffset = arguments.fileOffset,
+          new ir.IntLiteral(kind)..fileOffset = offset,
+        ]))
+      ..fileOffset = offset;
   }
 
   @override
-  Expression instantiateNoSuchMethodError(CoreTypes coreTypes,
-      Expression receiver, String name, Arguments arguments, int offset,
+  ir.Expression instantiateNoSuchMethodError(CoreTypes coreTypes,
+      ir.Expression receiver, String name, ir.Arguments arguments, int offset,
       {bool isMethod: false,
       bool isGetter: false,
       bool isSetter: false,
@@ -68,7 +104,7 @@
       bool isConstructor: false,
       bool isTopLevel: false}) {
     // TODO(sigmund): implement;
-    return new InvalidExpression(null);
+    return new ir.InvalidExpression(null);
   }
 }
 
diff --git a/pkg/compiler/lib/src/kernel/element_map.dart b/pkg/compiler/lib/src/kernel/element_map.dart
index 128db95..7be52d1 100644
--- a/pkg/compiler/lib/src/kernel/element_map.dart
+++ b/pkg/compiler/lib/src/kernel/element_map.dart
@@ -93,8 +93,11 @@
   /// Returns the [Name] corresponding to [name].
   Name getName(ir.Name name);
 
-  /// Return `true` if [node] is the `dart:_foreign_helper` library.
-  bool isForeignLibrary(ir.Library node);
+  /// Return `true` if [member] is a "foreign helper", that is, a member whose
+  /// semantics is defined synthetically and not through Dart code.
+  ///
+  /// Most foreign helpers are located in the `dart:_foreign_helper` library.
+  bool isForeignHelper(MemberEntity member);
 
   /// Computes the [native.NativeBehavior] for a call to the [JS] function.
   native.NativeBehavior getNativeBehaviorForJsCall(ir.StaticInvocation node);
@@ -563,3 +566,52 @@
           "Async marker ${node.asyncMarker} is not supported.");
   }
 }
+
+/// Kernel encodes a null-aware expression `a?.b` as
+///
+///     let final #1 = a in #1 == null ? null : #1.b
+///
+/// [getNullAwareExpression] recognizes such expressions storing the result in
+/// a [NullAwareExpression] object.
+///
+/// [syntheticVariable] holds the synthesized `#1` variable. [expression] holds
+/// the `#1.b` expression. [receiver] returns `a` expression. [parent] returns
+/// the parent of the let node, i.e. the parent node of the original null-aware
+/// expression. [let] returns the let node created for the encoding.
+class NullAwareExpression {
+  final ir.VariableDeclaration syntheticVariable;
+  final ir.Expression expression;
+
+  NullAwareExpression(this.syntheticVariable, this.expression);
+
+  ir.Expression get receiver => syntheticVariable.initializer;
+
+  ir.TreeNode get parent => syntheticVariable.parent.parent;
+
+  ir.Let get let => syntheticVariable.parent;
+
+  String toString() => let.toString();
+}
+
+NullAwareExpression getNullAwareExpression(ir.TreeNode node) {
+  if (node is ir.Let) {
+    ir.Expression body = node.body;
+    if (node.variable.name == null &&
+        node.variable.isFinal &&
+        body is ir.ConditionalExpression &&
+        body.condition is ir.MethodInvocation &&
+        body.then is ir.NullLiteral) {
+      ir.MethodInvocation invocation = body.condition;
+      ir.Expression receiver = invocation.receiver;
+      if (invocation.name.name == '==' &&
+          receiver is ir.VariableGet &&
+          receiver.variable == node.variable &&
+          invocation.arguments.positional.single is ir.NullLiteral) {
+        // We have
+        //   let #t1 = e0 in #t1 == null ? null : e1
+        return new NullAwareExpression(node.variable, body.otherwise);
+      }
+    }
+  }
+  return null;
+}
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index e66871d..b2584d4 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -37,7 +37,6 @@
 import '../js_model/closure.dart';
 import '../js_model/elements.dart';
 import '../js_model/locals.dart';
-import '../native/enqueue.dart';
 import '../native/native.dart' as native;
 import '../native/resolver.dart';
 import '../options.dart';
@@ -1975,48 +1974,6 @@
   bool get enableAssertions => _elementMap.options.enableUserAssertions;
 }
 
-class KernelResolutionWorldBuilder extends KernelResolutionWorldBuilderBase {
-  final KernelToElementMapForImpactImpl elementMap;
-
-  KernelResolutionWorldBuilder(
-      CompilerOptions options,
-      this.elementMap,
-      NativeBasicData nativeBasicData,
-      NativeDataBuilder nativeDataBuilder,
-      InterceptorDataBuilder interceptorDataBuilder,
-      BackendUsageBuilder backendUsageBuilder,
-      RuntimeTypesNeedBuilder rtiNeedBuilder,
-      KAllocatorAnalysis allocatorAnalysis,
-      NativeResolutionEnqueuer nativeResolutionEnqueuer,
-      NoSuchMethodRegistry noSuchMethodRegistry,
-      SelectorConstraintsStrategy selectorConstraintsStrategy,
-      ClassHierarchyBuilder classHierarchyBuilder,
-      ClassQueries classQueries)
-      : super(
-            options,
-            elementMap.elementEnvironment,
-            elementMap.types,
-            elementMap.commonElements,
-            nativeBasicData,
-            nativeDataBuilder,
-            interceptorDataBuilder,
-            backendUsageBuilder,
-            rtiNeedBuilder,
-            allocatorAnalysis,
-            nativeResolutionEnqueuer,
-            noSuchMethodRegistry,
-            selectorConstraintsStrategy,
-            classHierarchyBuilder,
-            classQueries);
-
-  @override
-  void forEachLocalFunction(void f(MemberEntity member, Local localFunction)) {
-    for (KLocalFunction local in localFunctions) {
-      f(local.memberContext, local);
-    }
-  }
-}
-
 abstract class KernelClosedWorldMixin implements ClosedWorldBase {
   KernelToElementMapBase get elementMap;
 
@@ -2173,6 +2130,124 @@
     return _classSets[cls];
   }
 
+  // TODO(johnniwinther): Share the methods based on [ClassSet] and
+  // [ClassHierarchyNode] between KClosedWorld and JClosedWorld.
+  /// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
+  /// instance of [y].
+  bool isSubtypeOf(ClassEntity x, ClassEntity y) {
+    ClassSet classSet = _classSets[y];
+    assert(classSet != null,
+        failedAt(y, "No ClassSet for $y (${y.runtimeType}): ${_classSets}"));
+    ClassHierarchyNode classHierarchyNode = _classHierarchyNodes[x];
+    assert(classHierarchyNode != null,
+        failedAt(x, "No ClassHierarchyNode for $x"));
+    return classSet.hasSubtype(classHierarchyNode);
+  }
+
+  /// Returns an iterable over the directly instantiated that implement [cls]
+  /// possibly including [cls] itself, if it is live.
+  Iterable<ClassEntity> subtypesOf(ClassEntity cls) {
+    ClassSet classSet = _classSets[cls];
+    if (classSet == null) {
+      return const <ClassEntity>[];
+    } else {
+      return classSet
+          .subtypesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED);
+    }
+  }
+
+  /// Returns an iterable over the directly instantiated classes that extend
+  /// [cls] possibly including [cls] itself, if it is live.
+  Iterable<ClassEntity> subclassesOf(ClassEntity cls) {
+    ClassHierarchyNode hierarchy = _classHierarchyNodes[cls];
+    if (hierarchy == null) return const <ClassEntity>[];
+    return hierarchy
+        .subclassesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED);
+  }
+
+  /// Returns an iterable over the directly instantiated that implement [cls]
+  /// _not_ including [cls].
+  Iterable<ClassEntity> strictSubtypesOf(ClassEntity cls) {
+    ClassSet classSet = _classSets[cls];
+    if (classSet == null) {
+      return const <ClassEntity>[];
+    } else {
+      return classSet.subtypesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
+          strict: true);
+    }
+  }
+
+  Iterable<ClassEntity> getInterfaces(ClassEntity cls) {
+    return elementMap._getInterfaces(cls).map((t) => t.element);
+  }
+
+  ClassEntity getSuperClass(ClassEntity cls) {
+    return elementMap._getSuperType(cls)?.element;
+  }
+
+  /// Returns an iterable over the directly instantiated classes that extend
+  /// [cls] _not_ including [cls] itself.
+  Iterable<ClassEntity> strictSubclassesOf(ClassEntity cls) {
+    ClassHierarchyNode subclasses = _classHierarchyNodes[cls];
+    if (subclasses == null) return const <ClassEntity>[];
+    return subclasses.subclassesByMask(
+        ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
+        strict: true);
+  }
+
+  Set<ClassEntity> _commonContainedClasses(ClassEntity cls1, ClassQuery query1,
+      ClassEntity cls2, ClassQuery query2) {
+    Iterable<ClassEntity> xSubset = _containedSubset(cls1, query1);
+    if (xSubset == null) return null;
+    Iterable<ClassEntity> ySubset = _containedSubset(cls2, query2);
+    if (ySubset == null) return null;
+    return xSubset.toSet().intersection(ySubset.toSet());
+  }
+
+  Iterable<ClassEntity> _containedSubset(ClassEntity cls, ClassQuery query) {
+    switch (query) {
+      case ClassQuery.EXACT:
+        return null;
+      case ClassQuery.SUBCLASS:
+        return strictSubclassesOf(cls);
+      case ClassQuery.SUBTYPE:
+        return strictSubtypesOf(cls);
+    }
+    throw new ArgumentError('Unexpected query: $query.');
+  }
+
+  Iterable<ClassEntity> commonSubclasses(ClassEntity cls1, ClassQuery query1,
+      ClassEntity cls2, ClassQuery query2) {
+    // TODO(johnniwinther): Use [ClassSet] to compute this.
+    // Compute the set of classes that are contained in both class subsets.
+    Set<ClassEntity> common =
+        _commonContainedClasses(cls1, query1, cls2, query2);
+    if (common == null || common.isEmpty) return const <ClassEntity>[];
+    // Narrow down the candidates by only looking at common classes
+    // that do not have a superclass or supertype that will be a
+    // better candidate.
+    return common.where((ClassEntity each) {
+      bool containsSuperclass = common.contains(getSuperClass(each));
+      // If the superclass is also a candidate, then we don't want to
+      // deal with this class. If we're only looking for a subclass we
+      // know we don't have to look at the list of interfaces because
+      // they can never be in the common set.
+      if (containsSuperclass ||
+          query1 == ClassQuery.SUBCLASS ||
+          query2 == ClassQuery.SUBCLASS) {
+        return !containsSuperclass;
+      }
+      // Run through the direct supertypes of the class. If the common
+      // set contains the direct supertype of the class, we ignore the
+      // the class because the supertype is a better candidate.
+
+      for (ClassEntity interface in getInterfaces(each)) {
+        if (common.contains(interface)) return false;
+      }
+      return true;
+    });
+  }
+
   /// Applies [f] to each live class that implements [cls] _not_ including [cls]
   /// itself.
   void forEachStrictSubtypeOf(
diff --git a/pkg/compiler/lib/src/kernel/element_map_mixins.dart b/pkg/compiler/lib/src/kernel/element_map_mixins.dart
index d8c74cc..88c8a8c 100644
--- a/pkg/compiler/lib/src/kernel/element_map_mixins.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_mixins.dart
@@ -104,9 +104,13 @@
     return new Selector.setter(name);
   }
 
-  /// Return `true` if [node] is the `dart:_foreign_helper` library.
-  bool isForeignLibrary(ir.Library node) {
-    return node.importUri == Uris.dart__foreign_helper;
+  /// Return `true` if [member] is a "foreign helper", that is, a member whose
+  /// semantics is defined synthetically and not through Dart code.
+  ///
+  /// Most foreign helpers are located in the `dart:_foreign_helper` library.
+  bool isForeignHelper(MemberEntity member) {
+    return member.library == commonElements.foreignLibrary ||
+        commonElements.isCreateInvocationMirrorHelper(member);
   }
 
   /// Looks up [typeName] for use in the spec-string of a `JS` call.
@@ -387,7 +391,7 @@
 
   /// Compute the kind of foreign helper function called by [node], if any.
   ForeignKind getForeignKind(ir.StaticInvocation node) {
-    if (isForeignLibrary(node.target.enclosingLibrary)) {
+    if (isForeignHelper(getMember(node.target))) {
       switch (node.target.name.name) {
         case JavaScriptBackend.JS:
           return ForeignKind.JS;
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index dcef78f..ec0511b 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -373,7 +373,8 @@
       }
     }
 
-    void addProcedures(ir.Class c, {bool includeStatic}) {
+    void addProcedures(ir.Class c,
+        {bool includeStatic, bool includeNoSuchMethodForwarders}) {
       for (ir.Procedure member in c.procedures) {
         if (member.isForwardingStub && member.isAbstract) {
           // Skip abstract forwarding stubs. These are never emitted but they
@@ -391,6 +392,9 @@
           continue;
         }
         if (!includeStatic && member.isStatic) continue;
+        if (!includeNoSuchMethodForwarders && member.isNoSuchMethodForwarder) {
+          continue;
+        }
         var name = member.name.name;
         assert(!name.contains('#'));
         if (member.kind == ir.ProcedureKind.Factory) {
@@ -424,13 +428,15 @@
     if (cls.mixedInClass != null) {
       elementMap.ensureClassMembers(cls.mixedInClass);
       addFields(cls.mixedInClass.mixin, includeStatic: false);
-      addProcedures(cls.mixedInClass.mixin, includeStatic: false);
+      addProcedures(cls.mixedInClass.mixin,
+          includeStatic: false, includeNoSuchMethodForwarders: false);
       mergeSort(members, compare: orderByFileOffset);
       mixinMemberCount = members.length;
     }
     addFields(cls, includeStatic: true);
     addConstructors(cls);
-    addProcedures(cls, includeStatic: true);
+    addProcedures(cls,
+        includeStatic: true, includeNoSuchMethodForwarders: true);
 
     if (isUnnamedMixinApplication && _constructorMap.isEmpty) {
       // Ensure that constructors are created for the superclass in case it
diff --git a/pkg/compiler/lib/src/kernel/kernel_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
index b595d81..19e2aa3 100644
--- a/pkg/compiler/lib/src/kernel/kernel_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
@@ -136,9 +136,12 @@
       SelectorConstraintsStrategy selectorConstraintsStrategy,
       ClassHierarchyBuilder classHierarchyBuilder,
       ClassQueries classQueries) {
-    return new KernelResolutionWorldBuilder(
+    return new ResolutionWorldBuilderImpl(
         _options,
         elementMap,
+        elementMap.elementEnvironment,
+        elementMap.types,
+        elementMap.commonElements,
         nativeBasicData,
         nativeDataBuilder,
         interceptorDataBuilder,
diff --git a/pkg/compiler/lib/src/kernel/runtime_type_analysis.dart b/pkg/compiler/lib/src/kernel/runtime_type_analysis.dart
new file mode 100644
index 0000000..096c9b2
--- /dev/null
+++ b/pkg/compiler/lib/src/kernel/runtime_type_analysis.dart
@@ -0,0 +1,310 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:kernel/ast.dart' as ir;
+
+import '../common/names.dart';
+import '../elements/types.dart';
+import '../kernel/element_map.dart';
+import '../universe/feature.dart';
+
+/// Computes the [RuntimeTypeUse] corresponding to the `e.runtimeType` [node].
+RuntimeTypeUse computeRuntimeTypeUse(
+    KernelToElementMapForImpact elementMap, ir.PropertyGet node) {
+  /// Returns `true` if [node] is of the form `e.runtimeType`.
+  bool isGetRuntimeType(ir.TreeNode node) {
+    return node is ir.PropertyGet && node.name.name == Identifiers.runtimeType_;
+  }
+
+  /// Returns [node] if [node] is of the form `e.runtimeType` and `null`
+  /// otherwise.
+  ir.PropertyGet asGetRuntimeType(ir.TreeNode node) {
+    return isGetRuntimeType(node) ? node : null;
+  }
+
+  /// Returns `true` if [node] is of the form `e.toString()`.
+  bool isInvokeToString(ir.TreeNode node) {
+    return node is ir.MethodInvocation && node.name.name == 'toString';
+  }
+
+  assert(isGetRuntimeType(node));
+
+  // TODO(johnniwinther): Special-case `this.runtimeType`.
+  ir.Expression receiver;
+  ir.Expression argument;
+  RuntimeTypeUseKind kind;
+
+  if (node.receiver is ir.VariableGet &&
+      node.parent is ir.ConditionalExpression &&
+      node.parent.parent is ir.Let) {
+    NullAwareExpression nullAware = getNullAwareExpression(node.parent.parent);
+    if (nullAware != null) {
+      // The node is of the form:
+      //
+      //     let #t1 = e in #t1 == null ? null : #t1.runtimeType
+      //                                             ^
+
+      if (nullAware.parent is ir.VariableDeclaration &&
+          nullAware.parent.parent is ir.Let) {
+        NullAwareExpression outer =
+            getNullAwareExpression(nullAware.parent.parent);
+        if (outer != null &&
+            outer.receiver == nullAware.let &&
+            isInvokeToString(outer.expression)) {
+          // Detected
+          //
+          //     e?.runtimeType?.toString()
+          //        ^
+          // encoded as
+          //
+          //     let #t2 = (let #t1 = e in #t1 == null ? null : #t1.runtimeType)
+          //                                                        ^
+          //        in #t2 == null ? null : #t2.toString()
+          //
+          kind = RuntimeTypeUseKind.string;
+          receiver = nullAware.receiver;
+        }
+      } else if (nullAware.parent is ir.MethodInvocation) {
+        ir.MethodInvocation methodInvocation = nullAware.parent;
+        if (methodInvocation.receiver == nullAware.let &&
+            methodInvocation.name.name == '==') {
+          // Detected
+          //
+          //  e0?.runtimeType == other
+          ir.PropertyGet otherGetRuntimeType =
+              asGetRuntimeType(methodInvocation.arguments.positional.first);
+          if (otherGetRuntimeType != null) {
+            // Detected
+            //
+            //     e0?.runtimeType == e1.runtimeType
+            //         ^
+            // encoded as
+            //
+            //     (let #t1 = e0 in #t1 == null ? null : #t1.runtimeType)
+            //                                               ^
+            //        .==(e1.runtimeType)
+            kind = RuntimeTypeUseKind.equals;
+            receiver = nullAware.receiver;
+            argument = otherGetRuntimeType.receiver;
+          }
+
+          NullAwareExpression otherNullAware = getNullAwareExpression(
+              methodInvocation.arguments.positional.first);
+          if (otherNullAware != null &&
+              isGetRuntimeType(otherNullAware.expression)) {
+            // Detected
+            //
+            //     e0?.runtimeType == e1?.runtimeType
+            //         ^
+            // encoded as
+            //
+            //     (let #t1 = e0 in #t1 == null ? null : #t1.runtimeType)
+            //                                               ^
+            //         .==(let #t2 = e1 in #t2 == null ? null : #t2.runtimeType)
+            //
+            kind = RuntimeTypeUseKind.equals;
+            receiver = nullAware.receiver;
+            argument = otherNullAware.receiver;
+          }
+        } else if (isInvokeToString(nullAware.parent)) {
+          // Detected
+          //
+          //     e?.runtimeType.toString()
+          //        ^
+          // encoded as
+          //
+          //     (let #t1 = e in #t1 == null ? null : #t1.runtimeType)
+          //                                          ^
+          //         .toString()
+          //
+          kind = RuntimeTypeUseKind.string;
+          receiver = nullAware.receiver;
+        }
+      } else if (nullAware.parent is ir.Arguments &&
+          nullAware.parent.parent is ir.MethodInvocation) {
+        ir.MethodInvocation methodInvocation = nullAware.parent.parent;
+        if (methodInvocation.name.name == '==' &&
+            methodInvocation.arguments.positional.first == nullAware.let) {
+          // [nullAware] is the right hand side of ==.
+
+          ir.PropertyGet otherGetRuntimeType =
+              asGetRuntimeType(methodInvocation.receiver);
+          NullAwareExpression otherNullAware =
+              getNullAwareExpression(methodInvocation.receiver);
+
+          if (otherGetRuntimeType != null) {
+            // Detected
+            //
+            //     e0.runtimeType == e1?.runtimeType
+            //                           ^
+            // encoded as
+            //
+            //     e0.runtimeType.==(
+            //         let #t1 = e1 in #t1 == null ? null : #t1.runtimeType)
+            //                                                  ^
+            kind = RuntimeTypeUseKind.equals;
+            receiver = otherGetRuntimeType.receiver;
+            argument = nullAware.receiver;
+          }
+
+          if (otherNullAware != null &&
+              isGetRuntimeType(otherNullAware.expression)) {
+            // Detected
+            //
+            //     e0?.runtimeType == e1?.runtimeType
+            //                            ^
+            // encoded as
+            //
+            //     (let #t1 = e0 in #t1 == null ? null : #t1.runtimeType)
+            //         .==(let #t2 = e1 in #t2 == null ? null : #t2.runtimeType)
+            //                                                      ^
+            kind = RuntimeTypeUseKind.equals;
+            receiver = otherNullAware.receiver;
+            argument = nullAware.receiver;
+          }
+        }
+      } else if (nullAware.parent is ir.StringConcatenation) {
+        // Detected
+        //
+        //     '${e?.runtimeType}'
+        //           ^
+        // encoded as
+        //
+        //     '${let #t1 = e in #t1 == null ? null : #t1.runtimeType}'
+        //                                                ^
+        kind = RuntimeTypeUseKind.string;
+        receiver = nullAware.receiver;
+      } else {
+        // Default to unknown
+        //
+        //     e?.runtimeType
+        //        ^
+        // encoded as
+        //
+        //     let #t1 = e in #t1 == null ? null : #t1.runtimeType
+        //                                         ^
+        kind = RuntimeTypeUseKind.unknown;
+        receiver = nullAware.receiver;
+      }
+    }
+  } else if (node.parent is ir.VariableDeclaration &&
+      node.parent.parent is ir.Let) {
+    NullAwareExpression nullAware = getNullAwareExpression(node.parent.parent);
+    if (nullAware != null && isInvokeToString(nullAware.expression)) {
+      // Detected
+      //
+      //     e.runtimeType?.toString()
+      //       ^
+      // encoded as
+      //
+      //     let #t1 = e.runtimeType in #t1 == null ? null : #t1.toString()
+      //                 ^
+      kind = RuntimeTypeUseKind.string;
+      receiver = node.receiver;
+    }
+  } else if (node.parent is ir.MethodInvocation) {
+    ir.MethodInvocation methodInvocation = node.parent;
+    if (methodInvocation.name.name == '==' &&
+        methodInvocation.receiver == node) {
+      // [node] is the left hand side of ==.
+
+      ir.PropertyGet otherGetRuntimeType =
+          asGetRuntimeType(methodInvocation.arguments.positional.first);
+      NullAwareExpression nullAware =
+          getNullAwareExpression(methodInvocation.arguments.positional.first);
+      if (otherGetRuntimeType != null) {
+        // Detected
+        //
+        //     e0.runtimeType == e1.runtimeType
+        //        ^
+        // encoded as
+        //
+        //     e0.runtimeType.==(e1.runtimeType)
+        //        ^
+        kind = RuntimeTypeUseKind.equals;
+        receiver = node.receiver;
+        argument = otherGetRuntimeType.receiver;
+      } else if (nullAware != null && isGetRuntimeType(nullAware.expression)) {
+        // Detected
+        //
+        //     e0.runtimeType == e1?.runtimeType
+        //        ^
+        // encoded as
+        //
+        //     e0.runtimeType.==(
+        //        ^
+        //         let #t1 = e1 in #t1 == null ? null : #t1.runtimeType)
+        kind = RuntimeTypeUseKind.equals;
+        receiver = node.receiver;
+        argument = nullAware.receiver;
+      }
+    } else if (isInvokeToString(node.parent)) {
+      // Detected
+      //
+      //     e.runtimeType.toString()
+      //       ^
+      kind = RuntimeTypeUseKind.string;
+      receiver = node.receiver;
+    }
+  } else if (node.parent is ir.Arguments &&
+      node.parent.parent is ir.MethodInvocation) {
+    ir.MethodInvocation methodInvocation = node.parent.parent;
+    if (methodInvocation.name.name == '==' &&
+        methodInvocation.arguments.positional.first == node) {
+      // [node] is the right hand side of ==.
+      ir.PropertyGet otherGetRuntimeType =
+          asGetRuntimeType(methodInvocation.receiver);
+      NullAwareExpression nullAware =
+          getNullAwareExpression(methodInvocation.receiver);
+
+      if (otherGetRuntimeType != null) {
+        // Detected
+        //
+        //     e0.runtimeType == e1.runtimeType
+        //                          ^
+        // encoded as
+        //
+        //     e0.runtimeType.==(e1.runtimeType)
+        //                          ^
+        kind = RuntimeTypeUseKind.equals;
+        receiver = otherGetRuntimeType.receiver;
+        argument = node.receiver;
+      } else if (nullAware != null && isGetRuntimeType(nullAware.expression)) {
+        // Detected
+        //
+        //     e0?.runtimeType == e1.runtimeType
+        //                           ^
+        // encoded as
+        //
+        //     (let #t1 = e0 in #t1 == null ? null : #t1.runtimeType)
+        //         .==(e1.runtimeType)
+        //                ^
+        kind = RuntimeTypeUseKind.equals;
+        receiver = nullAware.receiver;
+        argument = node.receiver;
+      }
+    }
+  } else if (node.parent is ir.StringConcatenation) {
+    // Detected
+    //
+    //     '${e.runtimeType}'
+    //          ^
+    kind = RuntimeTypeUseKind.string;
+    receiver = node.receiver;
+  }
+
+  if (kind == null) {
+    // Default to unknown
+    //
+    //     e.runtimeType
+    //       ^
+    kind = RuntimeTypeUseKind.unknown;
+    receiver = node.receiver;
+  }
+
+  DartType receiverType = elementMap.getStaticType(receiver);
+  DartType argumentType =
+      argument == null ? argument : elementMap.getStaticType(argument);
+  return new RuntimeTypeUse(kind, receiverType, argumentType);
+}
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index cea1634..866d70c 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -208,6 +208,10 @@
   /// Whether to omit implicit strong mode checks.
   bool omitImplicitChecks = false;
 
+  /// Whether to omit class type arguments only needed for `toString` on
+  /// `RuntimeType`.
+  bool laxRuntimeTypeToString = false;
+
   /// What should the compiler do with type assertions of assignments.
   ///
   /// This is an internal configuration option derived from other flags.
@@ -227,7 +231,7 @@
   bool useContentSecurityPolicy = false;
 
   /// Enables strong mode in dart2js.
-  bool strongMode = false;
+  bool strongMode = true;
 
   /// When obfuscating for minification, whether to use the frequency of a name
   /// as an heuristic to pick shorter names.
@@ -321,8 +325,11 @@
       ..platformBinaries =
           platformBinaries ?? _extractUriOption(options, '--platform-binaries=')
       ..sourceMapUri = _extractUriOption(options, '--source-map=')
-      ..strongMode = _hasOption(options, Flags.strongMode)
+      ..strongMode = _hasOption(options, Flags.strongMode) ||
+          !_hasOption(options, Flags.noPreviewDart2)
       ..omitImplicitChecks = _hasOption(options, Flags.omitImplicitChecks)
+      ..laxRuntimeTypeToString =
+          _hasOption(options, Flags.laxRuntimeTypeToString)
       ..testMode = _hasOption(options, Flags.testMode)
       ..trustJSInteropTypeAnnotations =
           _hasOption(options, Flags.trustJSInteropTypeAnnotations)
diff --git a/pkg/compiler/lib/src/resolution/registry.dart b/pkg/compiler/lib/src/resolution/registry.dart
index ecdf526..b8f4879 100644
--- a/pkg/compiler/lib/src/resolution/registry.dart
+++ b/pkg/compiler/lib/src/resolution/registry.dart
@@ -22,6 +22,7 @@
   Setlet<ConstantExpression> _constantLiterals;
   Setlet<dynamic> _nativeData;
   Setlet<ClassEntity> _seenClasses;
+  Set<RuntimeTypeUse> _runtimeTypeUses;
   Set<GenericInstantiation> _genericInstantiations;
 
   ResolutionWorldImpactBuilder(this.name);
@@ -51,6 +52,19 @@
     return _listLiterals != null ? _listLiterals : const <ListLiteralUse>[];
   }
 
+  void registerRuntimeTypeUse(RuntimeTypeUse runtimeTypeUse) {
+    assert(runtimeTypeUse != null);
+    _runtimeTypeUses ??= new Setlet<RuntimeTypeUse>();
+    _runtimeTypeUses.add(runtimeTypeUse);
+  }
+
+  @override
+  Iterable<RuntimeTypeUse> get runtimeTypeUses {
+    return _runtimeTypeUses != null
+        ? _runtimeTypeUses
+        : const <RuntimeTypeUse>[];
+  }
+
   void registerConstSymbolName(String name) {
     _constSymbolNames ??= new Setlet<String>();
     _constSymbolNames.add(name);
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 2ad67c8..fb04063 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -19,6 +19,7 @@
 import '../dump_info.dart';
 import '../elements/entities.dart';
 import '../elements/jumps.dart';
+import '../elements/names.dart';
 import '../elements/types.dart';
 import '../io/source_information.dart';
 import '../js/js.dart' as js;
@@ -3280,11 +3281,11 @@
     ir.Procedure target = node.target;
     SourceInformation sourceInformation =
         _sourceInformationBuilder.buildCall(node, node);
-    if (_elementMap.isForeignLibrary(target.enclosingLibrary)) {
-      handleInvokeStaticForeign(node, target);
+    FunctionEntity function = _elementMap.getMember(target);
+    if (_elementMap.isForeignHelper(function)) {
+      handleInvokeStaticForeign(node, function);
       return;
     }
-    FunctionEntity function = _elementMap.getMember(target);
 
     if (options.strongMode &&
         function == _commonElements.extractTypeArguments &&
@@ -3558,8 +3559,8 @@
   }
 
   void handleInvokeStaticForeign(
-      ir.StaticInvocation invocation, ir.Procedure target) {
-    String name = target.name.name;
+      ir.StaticInvocation invocation, MemberEntity member) {
+    String name = member.name;
     if (name == 'JS') {
       handleForeignJs(invocation);
     } else if (name == 'DART_CLOSURE_TO_JS') {
@@ -3584,6 +3585,8 @@
       handleJsInterceptorConstant(invocation);
     } else if (name == 'JS_STRING_CONCAT') {
       handleJsStringConcat(invocation);
+    } else if (name == '_createInvocationMirror') {
+      _handleCreateInvocationMirror(invocation);
     } else {
       reporter.internalError(
           _elementMap.getSpannable(targetElement, invocation),
@@ -3591,6 +3594,114 @@
     }
   }
 
+  void _handleCreateInvocationMirror(ir.StaticInvocation invocation) {
+    ir.StringLiteral nameLiteral = invocation.arguments.positional[0];
+    String name = nameLiteral.value;
+
+    ir.ListLiteral typeArgumentsLiteral = invocation.arguments.positional[1];
+    List<DartType> typeArguments =
+        typeArgumentsLiteral.expressions.map((ir.Expression expression) {
+      ir.TypeLiteral typeLiteral = expression;
+      return _elementMap.getDartType(typeLiteral.type);
+    }).toList();
+
+    ir.ListLiteral positionalArgumentsLiteral =
+        invocation.arguments.positional[2];
+    ir.MapLiteral namedArgumentsLiteral = invocation.arguments.positional[3];
+    ir.IntLiteral kindLiteral = invocation.arguments.positional[4];
+
+    Name memberName = new Name(name, _currentFrame.member.library);
+    Selector selector;
+    switch (kindLiteral.value) {
+      case Selector.invocationMirrorGetterKind:
+        selector = new Selector.getter(memberName);
+        break;
+      case Selector.invocationMirrorSetterKind:
+        selector = new Selector.setter(memberName);
+        break;
+      case Selector.invocationMirrorMethodKind:
+        if (memberName == Names.INDEX_NAME) {
+          selector = new Selector.index();
+        } else if (memberName == Names.INDEX_SET_NAME) {
+          selector = new Selector.indexSet();
+        } else {
+          CallStructure callStructure = new CallStructure(
+              positionalArgumentsLiteral.expressions.length,
+              namedArgumentsLiteral.entries.map<String>((ir.MapEntry entry) {
+                ir.StringLiteral key = entry.key;
+                return key.value;
+              }).toList(),
+              typeArguments.length);
+          if (Selector.isOperatorName(name)) {
+            selector =
+                new Selector(SelectorKind.OPERATOR, memberName, callStructure);
+          } else {
+            selector = new Selector.call(memberName, callStructure);
+          }
+        }
+        break;
+    }
+
+    HConstant nameConstant = graph.addConstant(
+        closedWorld.constantSystem
+            .createSymbol(closedWorld.commonElements, name),
+        closedWorld);
+
+    List<HInstruction> arguments = <HInstruction>[];
+    for (ir.Expression argument in positionalArgumentsLiteral.expressions) {
+      argument.accept(this);
+      arguments.add(pop());
+    }
+    if (namedArgumentsLiteral.entries.isNotEmpty) {
+      Map<String, HInstruction> namedValues = <String, HInstruction>{};
+      for (ir.MapEntry entry in namedArgumentsLiteral.entries) {
+        ir.StringLiteral key = entry.key;
+        String name = key.value;
+        entry.value.accept(this);
+        namedValues[name] = pop();
+      }
+      for (String name in selector.callStructure.getOrderedNamedArguments()) {
+        arguments.add(namedValues[name]);
+      }
+    }
+
+    _addTypeArguments(arguments, typeArguments,
+        _sourceInformationBuilder.buildCall(invocation, invocation));
+
+    HInstruction argumentsInstruction = buildLiteralList(arguments);
+    add(argumentsInstruction);
+
+    List<HInstruction> argumentNames = <HInstruction>[];
+    for (String argumentName in selector.namedArguments) {
+      ConstantValue argumentNameConstant =
+          constantSystem.createString(argumentName);
+      argumentNames.add(graph.addConstant(argumentNameConstant, closedWorld));
+    }
+    HInstruction argumentNamesInstruction = buildLiteralList(argumentNames);
+    add(argumentNamesInstruction);
+
+    HInstruction typeArgumentCount =
+        graph.addConstantInt(typeArguments.length, closedWorld);
+
+    js.Name internalName = namer.invocationName(selector);
+
+    ConstantValue kindConstant =
+        constantSystem.createIntFromInt(selector.invocationMirrorKind);
+
+    _pushStaticInvocation(
+        _commonElements.createUnmangledInvocationMirror,
+        [
+          nameConstant,
+          graph.addConstantStringFromName(internalName, closedWorld),
+          graph.addConstant(kindConstant, closedWorld),
+          argumentsInstruction,
+          argumentNamesInstruction,
+          typeArgumentCount,
+        ],
+        abstractValueDomain.dynamicType,
+        const <DartType>[]);
+  }
+
   bool _unexpectedForeignArguments(ir.StaticInvocation invocation,
       {int minPositional, int maxPositional, int typeArgumentCount = 0}) {
     String pluralizeArguments(int count, [String adjective = '']) {
diff --git a/pkg/compiler/lib/src/ssa/kernel_impact.dart b/pkg/compiler/lib/src/ssa/kernel_impact.dart
index 0c3846e..b5cd0b2 100644
--- a/pkg/compiler/lib/src/ssa/kernel_impact.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart
@@ -13,6 +13,7 @@
 import '../elements/entities.dart';
 import '../elements/types.dart';
 import '../kernel/element_map.dart';
+import '../kernel/runtime_type_analysis.dart';
 import '../options.dart';
 import '../resolution/registry.dart' show ResolutionWorldImpactBuilder;
 import '../universe/call_structure.dart';
@@ -141,9 +142,8 @@
     handleSignature(constructor.function, checkReturnType: false);
     visitNodes(constructor.initializers);
     visitNode(constructor.function.body);
-    if (constructor.isExternal &&
-        !elementMap.isForeignLibrary(constructor.enclosingLibrary)) {
-      MemberEntity member = elementMap.getMember(constructor);
+    MemberEntity member = elementMap.getMember(constructor);
+    if (constructor.isExternal && !elementMap.isForeignHelper(member)) {
       bool isJsInterop = elementMap.nativeBasicData.isJsInteropMember(member);
       impactBuilder.registerNativeData(elementMap
           .getNativeBehaviorForMethod(constructor, isJsInterop: isJsInterop));
@@ -197,9 +197,8 @@
     handleSignature(procedure.function);
     visitNode(procedure.function.body);
     handleAsyncMarker(procedure.function);
-    if (procedure.isExternal &&
-        !elementMap.isForeignLibrary(procedure.enclosingLibrary)) {
-      MemberEntity member = elementMap.getMember(procedure);
+    MemberEntity member = elementMap.getMember(procedure);
+    if (procedure.isExternal && !elementMap.isForeignHelper(member)) {
       bool isJsInterop = elementMap.nativeBasicData.isJsInteropMember(member);
       impactBuilder.registerNativeData(elementMap
           .getNativeBehaviorForMethod(procedure, isJsInterop: isJsInterop));
@@ -651,6 +650,16 @@
     impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(
         new Selector.getter(elementMap.getName(node.name)),
         constraint, const <DartType>[]));
+
+    if (node.name.name == Identifiers.runtimeType_) {
+      if (_options.strongMode) {
+        RuntimeTypeUse runtimeTypeUse = computeRuntimeTypeUse(elementMap, node);
+        impactBuilder.registerRuntimeTypeUse(runtimeTypeUse);
+      } else {
+        impactBuilder.registerRuntimeTypeUse(new RuntimeTypeUse(
+            RuntimeTypeUseKind.unknown, const DynamicType(), null));
+      }
+    }
   }
 
   @override
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index 2258231..4451c74 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -978,7 +978,7 @@
   HInstruction(this.inputs, this.instructionType)
       : id = idCounter++,
         usedBy = <HInstruction>[] {
-    assert(inputs.every((e) => e != null));
+    assert(inputs.every((e) => e != null), "inputs: $inputs");
   }
 
   int get hashCode => id;
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index bc0ea62..cd71861 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -424,7 +424,8 @@
         } else if (applies(commonElements.jsArrayAdd)) {
           // The codegen special cases array calls, but does not
           // inline argument type checks.
-          if (!_options.enableTypeAssertions) {
+          if (!_options.parameterCheckPolicy.isEmitted ||
+              input is HLiteralList) {
             target = commonElements.jsArrayAdd;
           }
         }
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder.dart b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
index bd9dca0..b0f526e 100644
--- a/pkg/compiler/lib/src/universe/codegen_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
@@ -79,7 +79,7 @@
       [Comparator<ConstantValue> preSortCompare]);
 }
 
-abstract class CodegenWorldBuilderImpl extends WorldBuilderBase
+class CodegenWorldBuilderImpl extends WorldBuilderBase
     implements CodegenWorldBuilder {
   final ElementEnvironment _elementEnvironment;
   final NativeBasicData _nativeBasicData;
@@ -159,8 +159,16 @@
 
   final Set<ConstantValue> _constantValues = new Set<ConstantValue>();
 
-  CodegenWorldBuilderImpl(this._elementEnvironment, this._nativeBasicData,
-      this._world, this.selectorConstraintsStrategy);
+  final KernelToWorldBuilder _elementMap;
+  final GlobalLocalsMap _globalLocalsMap;
+
+  CodegenWorldBuilderImpl(
+      this._elementMap,
+      this._globalLocalsMap,
+      this._elementEnvironment,
+      this._nativeBasicData,
+      this._world,
+      this.selectorConstraintsStrategy);
 
   Iterable<ClassEntity> get processedClasses => _processedClasses.keys
       .where((cls) => _processedClasses[cls].isInstantiated);
@@ -636,21 +644,6 @@
     _staticMemberUsage.forEach(processMemberUse);
     return functions;
   }
-}
-
-class KernelCodegenWorldBuilder extends CodegenWorldBuilderImpl {
-  final KernelToWorldBuilder _elementMap;
-  final GlobalLocalsMap _globalLocalsMap;
-
-  KernelCodegenWorldBuilder(
-      this._elementMap,
-      this._globalLocalsMap,
-      ElementEnvironment elementEnvironment,
-      NativeBasicData nativeBasicData,
-      JClosedWorld world,
-      SelectorConstraintsStrategy selectorConstraintsStrategy)
-      : super(elementEnvironment, nativeBasicData, world,
-            selectorConstraintsStrategy);
 
   @override
   bool hasConstantFieldInitializer(FieldEntity field) {
diff --git a/pkg/compiler/lib/src/universe/feature.dart b/pkg/compiler/lib/src/universe/feature.dart
index 3d4f018..f854843 100644
--- a/pkg/compiler/lib/src/universe/feature.dart
+++ b/pkg/compiler/lib/src/universe/feature.dart
@@ -8,7 +8,7 @@
 /// compilation pipeline, for example during resolution.
 library compiler.universe.feature;
 
-import '../elements/types.dart' show DartType, InterfaceType;
+import '../elements/types.dart';
 import '../util/util.dart';
 
 /// A language feature that may be seen in the program.
@@ -148,6 +148,73 @@
   }
 }
 
+/// Enum for recognized use kinds of `Object.runtimeType`.
+enum RuntimeTypeUseKind {
+  /// Unknown use of `Object.runtimeType`. This is the fallback value if the
+  /// usage didn't match any of the recogized patterns.
+  unknown,
+
+  /// `Object.runtimeType` used in a pattern like
+  /// `a.runtimeType == b.runtimeType`.
+  equals,
+
+  /// `Object.runtimeType` used in a pattern like `'${e.runtimeType}'` or
+  /// `e.runtimeType.toString()`.
+  string,
+}
+
+/// A use of `Object.runtimeType`.
+class RuntimeTypeUse {
+  /// The use kind of `Object.runtimeType`.
+  final RuntimeTypeUseKind kind;
+
+  /// The static type of the receiver.
+  final DartType receiverType;
+
+  /// The static type of the argument if [kind] is `RuntimeTypeUseKind.equals`.
+  final DartType argumentType;
+
+  RuntimeTypeUse(this.kind, this.receiverType, this.argumentType);
+
+  int get hashCode =>
+      kind.hashCode * 13 +
+      receiverType.hashCode * 17 +
+      argumentType.hashCode * 19;
+
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    if (other is! RuntimeTypeUse) return false;
+    return kind == other.kind &&
+        receiverType == other.receiverType &&
+        argumentType == other.argumentType;
+  }
+
+  /// Short textual representation use for testing.
+  String get shortText {
+    StringBuffer sb = new StringBuffer();
+    switch (kind) {
+      case RuntimeTypeUseKind.string:
+        sb.write('string:');
+        sb.write(receiverType);
+        break;
+      case RuntimeTypeUseKind.equals:
+        sb.write('equals:');
+        sb.write(receiverType);
+        sb.write('/');
+        sb.write(argumentType);
+        break;
+      case RuntimeTypeUseKind.unknown:
+        sb.write('unknown:');
+        sb.write(receiverType);
+        break;
+    }
+    return sb.toString();
+  }
+
+  String toString() => 'RuntimeTypeUse(kind=$kind,receiver=$receiverType'
+      ',argument=$argumentType)';
+}
+
 /// A generic instantiation of an expression of type [functionType] with the
 /// given [typeArguments].
 class GenericInstantiation {
diff --git a/pkg/compiler/lib/src/universe/resolution_world_builder.dart b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
index 726dc05..b472c00 100644
--- a/pkg/compiler/lib/src/universe/resolution_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
@@ -267,8 +267,8 @@
   }
 }
 
-/// Base implementation of [ResolutionEnqueuerWorldBuilder].
-abstract class ResolutionWorldBuilderBase extends WorldBuilderBase
+/// Implementation of [ResolutionEnqueuerWorldBuilder].
+class ResolutionWorldBuilderImpl extends WorldBuilderBase
     implements ResolutionEnqueuerWorldBuilder {
   /// Instantiation information for all classes with instantiated types.
   ///
@@ -373,9 +373,9 @@
   final NativeResolutionEnqueuer _nativeResolutionEnqueuer;
   final NoSuchMethodRegistry _noSuchMethodRegistry;
 
-  final SelectorConstraintsStrategy selectorConstraintsStrategy;
-  final ClassHierarchyBuilder classHierarchyBuilder;
-  final ClassQueries classQueries;
+  final SelectorConstraintsStrategy _selectorConstraintsStrategy;
+  final ClassHierarchyBuilder _classHierarchyBuilder;
+  final ClassQueries _classQueries;
 
   bool hasRuntimeTypeSupport = false;
   bool hasFunctionApplySupport = false;
@@ -392,8 +392,11 @@
 
   bool get isClosed => _closed;
 
-  ResolutionWorldBuilderBase(
+  final KernelToElementMapForImpactImpl _elementMap;
+
+  ResolutionWorldBuilderImpl(
       this._options,
+      this._elementMap,
       this._elementEnvironment,
       this._dartTypes,
       this._commonElements,
@@ -405,9 +408,9 @@
       this._allocatorAnalysis,
       this._nativeResolutionEnqueuer,
       this._noSuchMethodRegistry,
-      this.selectorConstraintsStrategy,
-      this.classHierarchyBuilder,
-      this.classQueries);
+      this._selectorConstraintsStrategy,
+      this._classHierarchyBuilder,
+      this._classQueries);
 
   Iterable<ClassEntity> get processedClasses => _processedClasses.keys
       .where((cls) => _processedClasses[cls].isInstantiated);
@@ -535,7 +538,7 @@
         isRedirection: isRedirection);
     if (kind != Instantiation.UNINSTANTIATED) {
       if (_options.strongMode) {
-        classHierarchyBuilder.updateClassHierarchyNodeForClass(cls,
+        _classHierarchyBuilder.updateClassHierarchyNodeForClass(cls,
             directlyInstantiated: info.isDirectlyInstantiated,
             abstractlyInstantiated: info.isAbstractlyInstantiated);
       }
@@ -600,7 +603,7 @@
     void _process(Map<String, Set<_MemberUsage>> memberMap,
         EnumSet<MemberUse> action(_MemberUsage usage)) {
       _processSet(memberMap, methodName, (_MemberUsage usage) {
-        if (selectorConstraintsStrategy.appliedUnnamed(
+        if (_selectorConstraintsStrategy.appliedUnnamed(
             dynamicUse, usage.entity, this)) {
           memberUsed(usage.entity, action(usage));
           return true;
@@ -640,7 +643,7 @@
         name, () => new Maplet<Selector, SelectorConstraints>());
     UniverseSelectorConstraints constraints =
         selectors.putIfAbsent(selector, () {
-      return selectorConstraintsStrategy.createSelectorConstraints(selector);
+      return _selectorConstraintsStrategy.createSelectorConstraints(selector);
     });
     return constraints.addReceiverConstraint(constraint);
   }
@@ -883,7 +886,7 @@
 
   /// Returns an iterable over all mixin applications that mixin [cls].
   Iterable<ClassEntity> allMixinUsesOf(ClassEntity cls) {
-    Iterable<ClassEntity> uses = classHierarchyBuilder.mixinUses[cls];
+    Iterable<ClassEntity> uses = _classHierarchyBuilder.mixinUses[cls];
     return uses != null ? uses : const <ClassEntity>[];
   }
 
@@ -909,26 +912,26 @@
       if (!info.hasInstantiation) {
         return;
       }
-      assert(classQueries.checkClass(cls));
-      if (!classQueries.validateClass(cls)) {
+      assert(_classQueries.checkClass(cls));
+      if (!_classQueries.validateClass(cls)) {
         failedAt(cls, 'Class "${cls.name}" is not resolved.');
       }
 
-      classHierarchyBuilder.updateClassHierarchyNodeForClass(cls,
+      _classHierarchyBuilder.updateClassHierarchyNodeForClass(cls,
           directlyInstantiated: info.isDirectlyInstantiated,
           abstractlyInstantiated: info.isAbstractlyInstantiated);
 
       // Walk through the superclasses, and record the types
       // implemented by that type on the superclasses.
-      ClassEntity superclass = classQueries.getSuperClass(cls);
+      ClassEntity superclass = _classQueries.getSuperClass(cls);
       while (superclass != null) {
         Set<ClassEntity> typesImplementedBySubclassesOfCls =
             typesImplementedBySubclasses.putIfAbsent(
                 superclass, () => new Set<ClassEntity>());
-        for (InterfaceType current in classQueries.getSupertypes(cls)) {
+        for (InterfaceType current in _classQueries.getSupertypes(cls)) {
           typesImplementedBySubclassesOfCls.add(current.element);
         }
-        superclass = classQueries.getSuperClass(superclass);
+        superclass = _classQueries.getSuperClass(superclass);
       }
     }
 
@@ -953,15 +956,15 @@
   }
 
   void registerClass(ClassEntity cls) {
-    classHierarchyBuilder.registerClass(cls);
+    _classHierarchyBuilder.registerClass(cls);
   }
 
   bool isInheritedInSubtypeOf(MemberEntity member, ClassEntity type) {
     // TODO(johnniwinther): Use the [member] itself to avoid enqueueing members
     // that are overridden.
-    classHierarchyBuilder.registerClass(member.enclosingClass);
-    classHierarchyBuilder.registerClass(type);
-    return classHierarchyBuilder.isInheritedInSubtypeOf(
+    _classHierarchyBuilder.registerClass(member.enclosingClass);
+    _classHierarchyBuilder.registerClass(type);
+    return _classHierarchyBuilder.isInheritedInSubtypeOf(
         member.enclosingClass, type);
   }
 
@@ -980,44 +983,6 @@
     _memberUsage.forEach(processMemberUse);
     return functions;
   }
-}
-
-abstract class KernelResolutionWorldBuilderBase
-    extends ResolutionWorldBuilderBase {
-  KernelToElementMapForImpactImpl get elementMap;
-
-  KernelResolutionWorldBuilderBase(
-      CompilerOptions options,
-      ElementEnvironment elementEnvironment,
-      DartTypes dartTypes,
-      CommonElements commonElements,
-      NativeBasicData nativeBasicData,
-      NativeDataBuilder nativeDataBuilder,
-      InterceptorDataBuilder interceptorDataBuilder,
-      BackendUsageBuilder backendUsageBuilder,
-      RuntimeTypesNeedBuilder rtiNeedBuilder,
-      KAllocatorAnalysis allocatorAnalysis,
-      NativeResolutionEnqueuer nativeResolutionEnqueuer,
-      NoSuchMethodRegistry noSuchMethodRegistry,
-      SelectorConstraintsStrategy selectorConstraintsStrategy,
-      ClassHierarchyBuilder classHierarchyBuilder,
-      ClassQueries classQueries)
-      : super(
-            options,
-            elementEnvironment,
-            dartTypes,
-            commonElements,
-            nativeBasicData,
-            nativeDataBuilder,
-            interceptorDataBuilder,
-            backendUsageBuilder,
-            rtiNeedBuilder,
-            allocatorAnalysis,
-            nativeResolutionEnqueuer,
-            noSuchMethodRegistry,
-            selectorConstraintsStrategy,
-            classHierarchyBuilder,
-            classQueries);
 
   @override
   KClosedWorld closeWorld() {
@@ -1025,18 +990,19 @@
         populateHierarchyNodes();
 
     var backendUsage = _backendUsageBuilder.close();
-    backendUsage.helperClassesUsed.forEach(classHierarchyBuilder.registerClass);
+    backendUsage.helperClassesUsed
+        .forEach(_classHierarchyBuilder.registerClass);
     _nativeResolutionEnqueuer.liveNativeClasses
-        .forEach(classHierarchyBuilder.registerClass);
+        .forEach(_classHierarchyBuilder.registerClass);
 
     _closed = true;
     assert(
-        classHierarchyBuilder.classHierarchyNodes.length ==
-            classHierarchyBuilder.classSets.length,
+        _classHierarchyBuilder.classHierarchyNodes.length ==
+            _classHierarchyBuilder.classSets.length,
         "ClassHierarchyNode/ClassSet mismatch: "
-        "${classHierarchyBuilder.classHierarchyNodes} vs "
-        "${classHierarchyBuilder.classSets}");
-    return _closedWorldCache = new KClosedWorldImpl(elementMap,
+        "${_classHierarchyBuilder.classHierarchyNodes} vs "
+        "${_classHierarchyBuilder.classSets}");
+    return _closedWorldCache = new KClosedWorldImpl(_elementMap,
         options: _options,
         elementEnvironment: _elementEnvironment,
         dartTypes: _dartTypes,
@@ -1053,9 +1019,16 @@
         liveInstanceMembers: _liveInstanceMembers,
         assignedInstanceMembers: computeAssignedInstanceMembers(),
         processedMembers: _processedMembers,
-        mixinUses: classHierarchyBuilder.mixinUses,
+        mixinUses: _classHierarchyBuilder.mixinUses,
         typesImplementedBySubclasses: typesImplementedBySubclasses,
-        classHierarchyNodes: classHierarchyBuilder.classHierarchyNodes,
-        classSets: classHierarchyBuilder.classSets);
+        classHierarchyNodes: _classHierarchyBuilder.classHierarchyNodes,
+        classSets: _classHierarchyBuilder.classSets);
+  }
+
+  @override
+  void forEachLocalFunction(void f(MemberEntity member, Local localFunction)) {
+    for (KLocalFunction local in localFunctions) {
+      f(local.memberContext, local);
+    }
   }
 }
diff --git a/pkg/compiler/lib/src/universe/selector.dart b/pkg/compiler/lib/src/universe/selector.dart
index d4af193..34aaf06 100644
--- a/pkg/compiler/lib/src/universe/selector.dart
+++ b/pkg/compiler/lib/src/universe/selector.dart
@@ -208,15 +208,16 @@
    */
   String get invocationMirrorMemberName => isSetter ? '$name=' : name;
 
+  static const int invocationMirrorMethodKind = 0;
+  static const int invocationMirrorGetterKind = 1;
+  static const int invocationMirrorSetterKind = 2;
+
   int get invocationMirrorKind {
-    const int METHOD = 0;
-    const int GETTER = 1;
-    const int SETTER = 2;
-    int kind = METHOD;
+    int kind = invocationMirrorMethodKind;
     if (isGetter) {
-      kind = GETTER;
+      kind = invocationMirrorGetterKind;
     } else if (isSetter) {
-      kind = SETTER;
+      kind = invocationMirrorSetterKind;
     }
     return kind;
   }
diff --git a/pkg/compiler/lib/src/universe/world_builder.dart b/pkg/compiler/lib/src/universe/world_builder.dart
index d43fb15..c1bf88d 100644
--- a/pkg/compiler/lib/src/universe/world_builder.dart
+++ b/pkg/compiler/lib/src/universe/world_builder.dart
@@ -21,6 +21,7 @@
 import '../js_model/locals.dart';
 import '../js_model/elements.dart' show JSignatureMethod;
 import '../kernel/element_map_impl.dart';
+import '../kernel/kelements.dart';
 import '../native/enqueue.dart' show NativeResolutionEnqueuer;
 import '../options.dart';
 import '../universe/class_set.dart';
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index 3cc5ee8..2a33f49 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -1066,6 +1066,39 @@
   RuntimeTypesNeed get rtiNeed;
   NoSuchMethodData get noSuchMethodData;
 
+  /// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
+  /// instance of [y].
+  bool isSubtypeOf(ClassEntity x, ClassEntity y);
+
+  /// Returns an iterable of the classes that are contained in the
+  /// strict subclass/subtype sets of both [cls1] and [cls2].
+  ///
+  /// Classes that are implied by included superclasses/supertypes are not
+  /// returned.
+  ///
+  /// For instance for this hierarchy
+  ///
+  ///     class A {}
+  ///     class B {}
+  ///     class C implements A, B {}
+  ///     class D extends C {}
+  ///
+  /// the query
+  ///
+  ///     commonSubclasses(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBTYPE)
+  ///
+  /// return the set {C} because [D] is implied by [C].
+  Iterable<ClassEntity> commonSubclasses(
+      ClassEntity cls1, ClassQuery query1, ClassEntity cls2, ClassQuery query2);
+
+  /// Returns an iterable over the directly instantiated that implement [cls]
+  /// possibly including [cls] itself, if it is live.
+  Iterable<ClassEntity> subtypesOf(ClassEntity cls);
+
+  /// Returns an iterable over the live classes that extend [cls] including
+  /// [cls] itself.
+  Iterable<ClassEntity> subclassesOf(ClassEntity cls);
+
   /// Applies [f] to each live class that implements [cls] _not_ including [cls]
   /// itself.
   void forEachStrictSubtypeOf(
diff --git a/pkg/compiler/tool/status_files/log_parser.dart b/pkg/compiler/tool/status_files/log_parser.dart
index d373a2b..43df6f4 100644
--- a/pkg/compiler/tool/status_files/log_parser.dart
+++ b/pkg/compiler/tool/status_files/log_parser.dart
@@ -12,7 +12,7 @@
 
 /// Extracts test records from a test.py [log].
 List<Record> parse(String log) {
-  var records = [];
+  var records = <Record>[];
   var suite;
   var test;
   var config;
@@ -20,7 +20,7 @@
   var actual;
   var reason;
   var fullReason; // lines before stack, usually multiline reason.
-  var stack = [];
+  var stack = <String>[];
   var paragraph = []; // collector of lines for fullReason.
   bool reproIsNext = false;
   for (var line in log.split('\n')) {
diff --git a/pkg/dev_compiler/bin/dartdevc.dart b/pkg/dev_compiler/bin/dartdevc.dart
index 854700c..4dd9996 100755
--- a/pkg/dev_compiler/bin/dartdevc.dart
+++ b/pkg/dev_compiler/bin/dartdevc.dart
@@ -20,7 +20,7 @@
   args = preprocessArgs(PhysicalResourceProvider.INSTANCE, args);
 
   if (args.contains('--persistent_worker')) {
-    await new _CompilerWorker(args..remove('--persistent_worker')).run();
+    await _CompilerWorker(args..remove('--persistent_worker')).run();
   } else if (args.isNotEmpty && args.last == "--batch") {
     await runBatch(args.sublist(0, args.length - 1));
   } else {
@@ -39,10 +39,10 @@
   Future<WorkResponse> performRequest(WorkRequest request) async {
     var args = _startupArgs.toList()..addAll(request.arguments);
 
-    var output = new StringBuffer();
+    var output = StringBuffer();
     var exitCode = compile(args, printFn: output.writeln);
     AnalysisEngine.instance.clearCaches();
-    return new WorkResponse()
+    return WorkResponse()
       ..exitCode = exitCode
       ..output = output.toString();
   }
@@ -51,12 +51,12 @@
 runBatch(List<String> batchArgs) async {
   int totalTests = 0;
   int testsFailed = 0;
-  var watch = new Stopwatch()..start();
+  var watch = Stopwatch()..start();
   print('>>> BATCH START');
   String line;
   while ((line = stdin.readLineSync(encoding: utf8)).isNotEmpty) {
     totalTests++;
-    var args = batchArgs.toList()..addAll(line.split(new RegExp(r'\s+')));
+    var args = batchArgs.toList()..addAll(line.split(RegExp(r'\s+')));
 
     // We don't try/catch here, since `compile` should handle that.
     var compileExitCode = compile(args);
diff --git a/pkg/dev_compiler/bin/dartdevk.dart b/pkg/dev_compiler/bin/dartdevk.dart
index 98f3907..027cfe4 100755
--- a/pkg/dev_compiler/bin/dartdevk.dart
+++ b/pkg/dev_compiler/bin/dartdevk.dart
@@ -18,7 +18,7 @@
   if (parsedArgs.isBatch) {
     await runBatch(parsedArgs.args);
   } else if (parsedArgs.isWorker) {
-    await new _CompilerWorker(parsedArgs.args).run();
+    await _CompilerWorker(parsedArgs.args).run();
   } else {
     var result = await compile(parsedArgs.args);
     exitCode = result.success ? 0 : 1;
@@ -29,7 +29,7 @@
 Future runBatch(List<String> batchArgs) async {
   var tests = 0;
   var failed = 0;
-  var watch = new Stopwatch()..start();
+  var watch = Stopwatch()..start();
 
   print('>>> BATCH START');
 
@@ -38,7 +38,7 @@
 
   while ((line = stdin.readLineSync(encoding: utf8))?.isNotEmpty == true) {
     tests++;
-    var args = batchArgs.toList()..addAll(line.split(new RegExp(r'\s+')));
+    var args = batchArgs.toList()..addAll(line.split(RegExp(r'\s+')));
 
     String outcome;
     try {
@@ -74,12 +74,12 @@
   Future<WorkResponse> performRequest(WorkRequest request) async {
     var args = _startupArgs.toList()..addAll(request.arguments);
 
-    var output = new StringBuffer();
+    var output = StringBuffer();
     var result = await runZoned(() => compile(args), zoneSpecification:
-        new ZoneSpecification(print: (self, parent, zone, message) {
+        ZoneSpecification(print: (self, parent, zone, message) {
       output.writeln(message.toString());
     }));
-    return new WorkResponse()
+    return WorkResponse()
       ..exitCode = result.success ? 0 : 1
       ..output = output.toString();
   }
@@ -95,11 +95,11 @@
 /// latter needs to be replaced by reading all the contents of the
 /// file and expanding them into the resulting argument list.
 _ParsedArgs _preprocessArgs(List<String> args) {
-  if (args.isEmpty) return new _ParsedArgs(false, false, args);
+  if (args.isEmpty) return _ParsedArgs(false, false, args);
 
   String lastArg = args.last;
   if (lastArg == '--batch') {
-    return new _ParsedArgs(true, false, args.sublist(0, args.length - 1));
+    return _ParsedArgs(true, false, args.sublist(0, args.length - 1));
   }
 
   var newArgs = <String>[];
@@ -115,20 +115,20 @@
       newArgs.add(arg);
     }
   }
-  return new _ParsedArgs(false, isWorker, newArgs);
+  return _ParsedArgs(false, isWorker, newArgs);
 }
 
 /// Return all lines in a file found at [path].
 Iterable<String> _readLines(String path) {
   try {
-    return new File(path)
+    return File(path)
         .readAsStringSync()
         .replaceAll('\r\n', '\n')
         .replaceAll('\r', '\n')
         .split('\n')
         .where((String line) => line.isNotEmpty);
   } on FileSystemException catch (e) {
-    throw new Exception('Failed to read $path: $e');
+    throw Exception('Failed to read $path: $e');
   }
 }
 
diff --git a/pkg/dev_compiler/lib/src/analyzer/ast_builder.dart b/pkg/dev_compiler/lib/src/analyzer/ast_builder.dart
index f4b4539..672a2a3 100644
--- a/pkg/dev_compiler/lib/src/analyzer/ast_builder.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/ast_builder.dart
@@ -10,10 +10,10 @@
 
 export 'package:analyzer/dart/ast/standard_ast_factory.dart';
 
-final ast = new AstBuilder();
+final ast = AstBuilder();
 
 class AstBuilder {
-  KeywordToken get constKeyword => new KeywordToken(Keyword.CONST, 0);
+  KeywordToken get constKeyword => KeywordToken(Keyword.CONST, 0);
 
   TypeName typeName(Identifier id, List<TypeAnnotation> args) {
     TypeArgumentList argList = null;
@@ -26,8 +26,8 @@
     TypeParameterList tps =
         (tParams.length == 0) ? null : typeParameterList(tParams);
     FormalParameterList fps = formalParameterList(params);
-    Token semi = new Token(TokenType.SEMICOLON, 0);
-    Token td = new KeywordToken(Keyword.TYPEDEF, 0);
+    Token semi = Token(TokenType.SEMICOLON, 0);
+    Token td = KeywordToken(Keyword.TYPEDEF, 0);
     return astFactory.functionTypeAlias(
         null, null, td, ret, name, tps, fps, semi);
   }
@@ -41,13 +41,13 @@
   }
 
   PropertyAccess propertyAccess(Expression target, SimpleIdentifier name) {
-    var p = new Token(TokenType.PERIOD, 0);
+    var p = Token(TokenType.PERIOD, 0);
     return astFactory.propertyAccess(target, p, name);
   }
 
   MethodInvocation methodInvoke(Expression target, SimpleIdentifier name,
       TypeArgumentList typeArguments, NodeList<Expression> args) {
-    var p = new Token(TokenType.PERIOD, 0);
+    var p = Token(TokenType.PERIOD, 0);
     return astFactory.methodInvocation(
         target, p, name, typeArguments, argumentList(args));
   }
@@ -180,7 +180,7 @@
   Token _binaryOperation(String oper) {
     var type = getTokenType(oper);
     assert(type != null);
-    return new Token(type, 0);
+    return Token(type, 0);
   }
 
   BinaryExpression binaryExpression(Expression l, String oper, Expression r) {
@@ -190,8 +190,8 @@
 
   ConditionalExpression conditionalExpression(
       Expression cond, Expression tExp, Expression fExp) {
-    var q = new Token(TokenType.QUESTION, 0);
-    var c = new Token(TokenType.COLON, 0);
+    var q = Token(TokenType.QUESTION, 0);
+    var c = Token(TokenType.COLON, 0);
     return astFactory.conditionalExpression(cond, q, tExp, c, fExp);
   }
 
@@ -201,14 +201,14 @@
   }
 
   Block block(List<Statement> statements) {
-    Token ld = new BeginToken(TokenType.OPEN_CURLY_BRACKET, 0);
-    Token rd = new Token(TokenType.CLOSE_CURLY_BRACKET, 0);
+    Token ld = BeginToken(TokenType.OPEN_CURLY_BRACKET, 0);
+    Token rd = Token(TokenType.CLOSE_CURLY_BRACKET, 0);
     return astFactory.block(ld, statements, rd);
   }
 
   MethodDeclaration blockMethodDeclaration(TypeName rt, SimpleIdentifier m,
       List<FormalParameter> params, List<Statement> statements,
-      {bool isStatic: false}) {
+      {bool isStatic = false}) {
     FormalParameterList fl = formalParameterList(params);
     Block b = block(statements);
     BlockFunctionBody body = blockFunctionBody(b);
@@ -266,8 +266,8 @@
   }
 
   NamedExpression namedExpression(String s, Expression e) {
-    Label l = astFactory.label(
-        identifierFromString(s), new Token(TokenType.COLON, 0));
+    Label l =
+        astFactory.label(identifierFromString(s), Token(TokenType.COLON, 0));
     return astFactory.namedExpression(l, e);
   }
 
@@ -275,8 +275,8 @@
   /// specified by the VariableElement. See also [variableStatement].
   VariableDeclarationList declareVariable(SimpleIdentifier name,
       [Expression init]) {
-    var eqToken = init != null ? new Token(TokenType.EQ, 0) : null;
-    var varToken = new KeywordToken(Keyword.VAR, 0);
+    var eqToken = init != null ? Token(TokenType.EQ, 0) : null;
+    var varToken = KeywordToken(Keyword.VAR, 0);
     return astFactory.variableDeclarationList(null, null, varToken, null,
         [astFactory.variableDeclaration(name, eqToken, init)]);
   }
@@ -288,89 +288,88 @@
 
   InstanceCreationExpression instanceCreation(
       ConstructorName ctor, List<Expression> args) {
-    var newToken = new KeywordToken(Keyword.NEW, 0);
+    var newToken = KeywordToken(Keyword.NEW, 0);
     return astFactory.instanceCreationExpression(
         newToken, ctor, argumentList(args));
   }
 
   ConstructorName constructorName(TypeName type, [SimpleIdentifier name]) {
-    Token period = name != null ? new Token(TokenType.PERIOD, 0) : null;
+    Token period = name != null ? Token(TokenType.PERIOD, 0) : null;
     return astFactory.constructorName(type, period, name);
   }
 
   SimpleIdentifier identifierFromString(String name) {
-    StringToken token = new SyntheticStringToken(TokenType.IDENTIFIER, name, 0);
+    StringToken token = SyntheticStringToken(TokenType.IDENTIFIER, name, 0);
     return astFactory.simpleIdentifier(token);
   }
 
   PrefixedIdentifier prefixedIdentifier(
       SimpleIdentifier pre, SimpleIdentifier id) {
-    Token period = new Token(TokenType.PERIOD, 0);
+    Token period = Token(TokenType.PERIOD, 0);
     return astFactory.prefixedIdentifier(pre, period, id);
   }
 
   TypeParameter typeParameter(SimpleIdentifier name, [TypeName bound = null]) {
-    Token keyword =
-        (bound == null) ? null : new KeywordToken(Keyword.EXTENDS, 0);
+    Token keyword = (bound == null) ? null : KeywordToken(Keyword.EXTENDS, 0);
     return astFactory.typeParameter(null, null, name, keyword, bound);
   }
 
   TypeParameterList typeParameterList(List<TypeParameter> params) {
-    Token lb = new Token(TokenType.LT, 0);
-    Token rb = new Token(TokenType.GT, 0);
+    Token lb = Token(TokenType.LT, 0);
+    Token rb = Token(TokenType.GT, 0);
     return astFactory.typeParameterList(lb, params, rb);
   }
 
   TypeArgumentList typeArgumentList(List<TypeAnnotation> args) {
-    Token lb = new Token(TokenType.LT, 0);
-    Token rb = new Token(TokenType.GT, 0);
+    Token lb = Token(TokenType.LT, 0);
+    Token rb = Token(TokenType.GT, 0);
     return astFactory.typeArgumentList(lb, args, rb);
   }
 
   ArgumentList argumentList(List<Expression> args) {
-    Token lp = new BeginToken(TokenType.OPEN_PAREN, 0);
-    Token rp = new Token(TokenType.CLOSE_PAREN, 0);
+    Token lp = BeginToken(TokenType.OPEN_PAREN, 0);
+    Token rp = Token(TokenType.CLOSE_PAREN, 0);
     return astFactory.argumentList(lp, args, rp);
   }
 
   BooleanLiteral booleanLiteral(bool b) {
-    var k = new KeywordToken(b ? Keyword.TRUE : Keyword.FALSE, 0);
+    var k = KeywordToken(b ? Keyword.TRUE : Keyword.FALSE, 0);
     return astFactory.booleanLiteral(k, b);
   }
 
   NullLiteral nullLiteral() {
-    var n = new KeywordToken(Keyword.NULL, 0);
+    var n = KeywordToken(Keyword.NULL, 0);
     return astFactory.nullLiteral(n);
   }
 
   IntegerLiteral integerLiteral(int i) {
-    StringToken token = new StringToken(TokenType.INT, '$i', 0);
+    StringToken token = StringToken(TokenType.INT, '$i', 0);
     return astFactory.integerLiteral(token, i);
   }
 
   SimpleStringLiteral simpleStringLiteral(String s) {
-    StringToken token = new StringToken(TokenType.STRING, "\"" + s + "\"", 0);
+    StringToken token = StringToken(TokenType.STRING, "\"" + s + "\"", 0);
     return astFactory.simpleStringLiteral(token, s);
   }
 
   SimpleStringLiteral tripleQuotedStringLiteral(String s) {
-    StringToken token = new StringToken(TokenType.STRING, '"""' + s + '"""', 0);
+    StringToken token = StringToken(TokenType.STRING, '"""' + s + '"""', 0);
     return astFactory.simpleStringLiteral(token, s);
   }
 
   AsExpression asExpression(Expression exp, TypeName type) {
-    Token token = new KeywordToken(Keyword.AS, 0);
+    Token token = KeywordToken(Keyword.AS, 0);
     return astFactory.asExpression(exp, token, type);
   }
 
   IsExpression isExpression(Expression exp, TypeName type) {
-    Token token = new KeywordToken(Keyword.IS, 0);
+    Token token = KeywordToken(Keyword.IS, 0);
     return astFactory.isExpression(exp, token, null, type);
   }
 
   ParenthesizedExpression parenthesizedExpression(Expression exp) {
-    Token lp = new BeginToken(TokenType.OPEN_PAREN, exp.offset);
-    Token rp = new Token(TokenType.CLOSE_PAREN, exp.end);
+    Token lp = BeginToken(TokenType.OPEN_PAREN, exp.offset);
+    Token rp = Token(TokenType.CLOSE_PAREN, exp.end);
     return astFactory.parenthesizedExpression(lp, exp, rp);
   }
 
@@ -380,20 +379,20 @@
   }
 
   FormalParameterList formalParameterList(List<FormalParameter> params) {
-    Token lp = new BeginToken(TokenType.OPEN_PAREN, 0);
-    Token rp = new Token(TokenType.CLOSE_PAREN, 0);
+    Token lp = BeginToken(TokenType.OPEN_PAREN, 0);
+    Token rp = Token(TokenType.CLOSE_PAREN, 0);
     bool hasOptional = params.any((p) => p.isPositional);
     bool hasNamed = params.any((p) => p.isNamed);
     assert(!(hasOptional && hasNamed));
     Token ld = null;
     Token rd = null;
     if (hasOptional) {
-      ld = new BeginToken(TokenType.OPEN_SQUARE_BRACKET, 0);
-      rd = new Token(TokenType.CLOSE_SQUARE_BRACKET, 0);
+      ld = BeginToken(TokenType.OPEN_SQUARE_BRACKET, 0);
+      rd = Token(TokenType.CLOSE_SQUARE_BRACKET, 0);
     }
     if (hasNamed) {
-      ld = new BeginToken(TokenType.OPEN_CURLY_BRACKET, 0);
-      rd = new Token(TokenType.CLOSE_CURLY_BRACKET, 0);
+      ld = BeginToken(TokenType.OPEN_CURLY_BRACKET, 0);
+      rd = Token(TokenType.CLOSE_CURLY_BRACKET, 0);
     }
     return astFactory.formalParameterList(lp, params, ld, rd, rp);
   }
@@ -404,12 +403,12 @@
 
   ExpressionFunctionBody expressionFunctionBody(Expression body,
       [bool decl = false]) {
-    Token semi = (decl) ? new Token(TokenType.SEMICOLON, 0) : null;
+    Token semi = (decl) ? Token(TokenType.SEMICOLON, 0) : null;
     return astFactory.expressionFunctionBody(null, null, body, semi);
   }
 
   ExpressionStatement expressionStatement(Expression expression) {
-    Token semi = new Token(TokenType.SEMICOLON, 0);
+    Token semi = Token(TokenType.SEMICOLON, 0);
     return astFactory.expressionStatement(expression, semi);
   }
 
@@ -420,8 +419,8 @@
 
   MethodDeclaration methodDeclaration(TypeName rt, SimpleIdentifier m,
       FormalParameterList fl, FunctionBody body,
-      {bool isStatic: false}) {
-    Token st = isStatic ? new KeywordToken(Keyword.STATIC, 0) : null;
+      {bool isStatic = false}) {
+    Token st = isStatic ? KeywordToken(Keyword.STATIC, 0) : null;
     return astFactory.methodDeclaration(
         null, null, null, st, rt, null, null, m, null, fl, body);
   }
@@ -432,8 +431,8 @@
   }
 
   Statement returnExpression([Expression e]) {
-    Token ret = new KeywordToken(Keyword.RETURN, 0);
-    Token semi = new Token(TokenType.SEMICOLON, 0);
+    Token ret = KeywordToken(Keyword.RETURN, 0);
+    Token semi = Token(TokenType.SEMICOLON, 0);
     return astFactory.returnStatement(ret, e, semi);
   }
 
@@ -453,7 +452,7 @@
 
   VariableDeclarationStatement variableDeclarationStatement(
       VariableDeclarationList varDecl) {
-    var semi = new Token(TokenType.SEMICOLON, 0);
+    var semi = Token(TokenType.SEMICOLON, 0);
     return astFactory.variableDeclarationStatement(varDecl, semi);
   }
 }
diff --git a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
index a4f0d88..fdda18f 100644
--- a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
@@ -91,10 +91,10 @@
   ///
   /// We sometimes special case codegen for a single library, as it simplifies
   /// name scoping requirements.
-  final _libraries = new Map<LibraryElement, JS.Identifier>();
+  final _libraries = Map<LibraryElement, JS.Identifier>();
 
   /// Imported libraries, and the temporaries used to refer to them.
-  final _imports = new Map<LibraryElement, JS.TemporaryId>();
+  final _imports = Map<LibraryElement, JS.TemporaryId>();
 
   /// The list of dart:_runtime SDK functions; these are assumed by other code
   /// in the SDK to be generated before anything else.
@@ -118,11 +118,10 @@
   /// In an async* function, this represents the stream controller parameter.
   JS.TemporaryId _asyncStarController;
 
-  final _initializingFormalTemps =
-      new HashMap<ParameterElement, JS.TemporaryId>();
+  final _initializingFormalTemps = HashMap<ParameterElement, JS.TemporaryId>();
 
   JS.Identifier _extensionSymbolsModule;
-  final _extensionSymbols = new Map<String, JS.TemporaryId>();
+  final _extensionSymbols = Map<String, JS.TemporaryId>();
 
   /// The  type provider from the current Analysis [context].
   final TypeProvider types;
@@ -153,6 +152,7 @@
   final InterfaceType linkedHashSetImplType;
   final InterfaceType identityHashSetImplType;
   final InterfaceType syncIterableType;
+  final InterfaceType asyncStarImplType;
 
   ConstFieldVisitor _constants;
 
@@ -179,7 +179,7 @@
   /// mappings.
   Element _currentElement;
 
-  final _deferredProperties = new HashMap<PropertyAccessorElement, JS.Method>();
+  final _deferredProperties = HashMap<PropertyAccessorElement, JS.Method>();
 
   BuildUnit _buildUnit;
 
@@ -187,7 +187,7 @@
 
   bool _superAllowed = true;
 
-  final _superHelpers = new Map<String, JS.Method>();
+  final _superHelpers = Map<String, JS.Method>();
 
   List<TypeParameterType> _typeParamInConst;
 
@@ -200,14 +200,14 @@
 
   /// Information about virtual fields for all libraries in the current build
   /// unit.
-  final virtualFields = new VirtualFieldModel();
+  final virtualFields = VirtualFieldModel();
 
-  final _usedCovariantPrivateMembers = new HashSet<ExecutableElement>();
+  final _usedCovariantPrivateMembers = HashSet<ExecutableElement>();
 
   CodeGenerator(
       AnalysisContext c, this.summaryData, this.options, this._extensionTypes)
       : context = c,
-        rules = new StrongTypeSystemImpl(c.typeProvider),
+        rules = StrongTypeSystemImpl(c.typeProvider),
         types = c.typeProvider,
         _asyncStreamIterator = getClass(c, 'dart:async', 'StreamIterator').type,
         _coreIdentical = _getLibrary(c, 'dart:core')
@@ -233,8 +233,9 @@
         identityHashSetImplType =
             getClass(c, 'dart:collection', '_IdentityHashSet').type,
         syncIterableType = getClass(c, 'dart:_js_helper', 'SyncIterable').type,
+        asyncStarImplType = getClass(c, 'dart:async', '_AsyncStarImpl').type,
         dartJSLibrary = _getLibrary(c, 'dart:js') {
-    jsTypeRep = new JSTypeRep(rules, c);
+    jsTypeRep = JSTypeRep(rules, c);
   }
 
   LibraryElement get currentLibrary => _currentElement.library;
@@ -262,7 +263,7 @@
     var module = _emitModule(compilationUnits, unit.name);
     var dartApiSummary = _summarizeModule(compilationUnits);
 
-    return new JSModuleFile(unit.name, errors, options, module, dartApiSummary);
+    return JSModuleFile(unit.name, errors, options, module, dartApiSummary);
   }
 
   List<int> _summarizeModule(List<CompilationUnit> units) {
@@ -277,9 +278,9 @@
               : (sdk as FolderBasedDartSdk).getSummarySdkBundle(true));
     }
 
-    var assembler = new PackageBundleAssembler();
+    var assembler = PackageBundleAssembler();
 
-    var uriToUnit = new Map<String, UnlinkedUnit>.fromIterables(
+    var uriToUnit = Map<String, UnlinkedUnit>.fromIterables(
         units.map((u) => u.element.source.uri.toString()), units.map((unit) {
       var unlinked = serializeAstUnlinked(unit);
       assembler.addUnlinkedUnit(unit.element.source, unlinked);
@@ -303,7 +304,7 @@
 
   JS.Program _emitModule(List<CompilationUnit> compilationUnits, String name) {
     if (moduleItems.isNotEmpty) {
-      throw new StateError('Can only call emitModule once.');
+      throw StateError('Can only call emitModule once.');
     }
 
     for (var unit in compilationUnits) {
@@ -313,7 +314,7 @@
     // Transform the AST to make coercions explicit.
     compilationUnits = CoercionReifier.reify(compilationUnits);
     var items = <JS.ModuleItem>[];
-    var root = new JS.Identifier('_root');
+    var root = JS.Identifier('_root');
     items.add(js.statement('const # = Object.create(null)', [root]));
 
     var isBuildingSdk =
@@ -321,20 +322,20 @@
     if (isBuildingSdk) {
       // Don't allow these to be renamed when we're building the SDK.
       // There is JS code in dart:* that depends on their names.
-      runtimeModule = new JS.Identifier('dart');
-      _extensionSymbolsModule = new JS.Identifier('dartx');
+      runtimeModule = JS.Identifier('dart');
+      _extensionSymbolsModule = JS.Identifier('dartx');
     } else {
       // Otherwise allow these to be renamed so users can write them.
-      runtimeModule = new JS.TemporaryId('dart');
-      _extensionSymbolsModule = new JS.TemporaryId('dartx');
+      runtimeModule = JS.TemporaryId('dart');
+      _extensionSymbolsModule = JS.TemporaryId('dartx');
     }
-    _typeTable = new TypeTable(runtimeModule);
+    _typeTable = TypeTable(runtimeModule);
 
     // Initialize our library variables.
     var exports = <JS.NameSpecifier>[];
     void emitLibrary(JS.Identifier id) {
       items.add(js.statement('const # = Object.create(#)', [id, root]));
-      exports.add(new JS.NameSpecifier(id));
+      exports.add(JS.NameSpecifier(id));
     }
 
     for (var unit in compilationUnits) {
@@ -343,7 +344,7 @@
 
       var libraryTemp = isSdkInternalRuntime(library)
           ? runtimeModule
-          : new JS.TemporaryId(jsLibraryName(_libraryRoot, library));
+          : JS.TemporaryId(jsLibraryName(_libraryRoot, library));
       _libraries[library] = libraryTemp;
       emitLibrary(libraryTemp);
     }
@@ -352,11 +353,11 @@
     // TODO(jmesserly): find a cleaner design for this.
     if (isBuildingSdk) emitLibrary(_extensionSymbolsModule);
 
-    items.add(new JS.ExportDeclaration(new JS.ExportClause(exports)));
+    items.add(JS.ExportDeclaration(JS.ExportClause(exports)));
 
     // Collect all class/type Element -> Node mappings
     // in case we need to forward declare any classes.
-    _declarationNodes = new HashMap<TypeDefiningElement, AstNode>.identity();
+    _declarationNodes = HashMap<TypeDefiningElement, AstNode>.identity();
     for (var unit in compilationUnits) {
       for (var declaration in unit.declarations) {
         var element = declaration.element;
@@ -366,7 +367,7 @@
       }
     }
     if (compilationUnits.isNotEmpty) {
-      _constants = new ConstFieldVisitor(context,
+      _constants = ConstFieldVisitor(context,
           dummySource: resolutionMap
               .elementDeclaredByCompilationUnit(compilationUnits.first)
               .source);
@@ -391,7 +392,7 @@
     // Initialize extension symbols
     _extensionSymbols.forEach((name, id) {
       JS.Expression value =
-          new JS.PropertyAccess(_extensionSymbolsModule, _propertyName(name));
+          JS.PropertyAccess(_extensionSymbolsModule, _propertyName(name));
       if (isBuildingSdk) {
         value = js.call('# = Symbol(#)', [value, js.string("dartx.$name")]);
       }
@@ -409,7 +410,7 @@
     _copyAndFlattenBlocks(items, moduleItems);
 
     // Build the module.
-    return new JS.Program(items, name: _buildUnit.name);
+    return JS.Program(items, name: _buildUnit.name);
   }
 
   void _emitDebuggerExtensionInfo(String name) {
@@ -417,7 +418,7 @@
     _libraries.forEach((library, value) {
       // TODO(jacobr): we could specify a short library name instead of the
       // full library uri if we wanted to save space.
-      properties.add(new JS.Property(
+      properties.add(JS.Property(
           js.escapedString(jsLibraryDebuggerName(_libraryRoot, library)),
           value));
     });
@@ -428,7 +429,7 @@
         .statement('#.trackLibraries(#, #, ${JSModuleFile.sourceMapHoleID});', [
       runtimeModule,
       js.string(name),
-      new JS.ObjectInitializer(properties, multiline: true)
+      JS.ObjectInitializer(properties, multiline: true)
     ]));
   }
 
@@ -482,7 +483,7 @@
     if (parts.isEmpty) parts = [''];
     JS.PropertyAccess access;
     for (var part in parts) {
-      access = new JS.PropertyAccess(
+      access = JS.PropertyAccess(
           access ?? runtimeCall('global'), js.escapedString(part, "'"));
     }
     return access;
@@ -493,7 +494,7 @@
     var name = getAnnotationName(e, isPublicJSAnnotation);
     if (name != null) {
       if (name.contains('.')) {
-        throw new UnsupportedError(
+        throw UnsupportedError(
             'static members do not support "." in their names. '
             'See https://github.com/dart-lang/sdk/issues/27926');
       }
@@ -526,13 +527,13 @@
     }
     var moduleName = _buildUnit.libraryToModule(source);
     if (moduleName == null) {
-      throw new StateError('Could not find module containing "$library".');
+      throw StateError('Could not find module containing "$library".');
     }
     return moduleName;
   }
 
   void _finishImports(List<JS.ModuleItem> items) {
-    var modules = new Map<String, List<LibraryElement>>();
+    var modules = Map<String, List<LibraryElement>>();
 
     for (var import in _imports.keys) {
       modules.putIfAbsent(_libraryToModule(import), () => []).add(import);
@@ -553,13 +554,13 @@
       //     import {foo as foo$} from 'foo'; // if rename was needed
       //
       var imports =
-          libraries.map((l) => new JS.NameSpecifier(_imports[l])).toList();
+          libraries.map((l) => JS.NameSpecifier(_imports[l])).toList();
       if (module == coreModuleName) {
-        imports.add(new JS.NameSpecifier(runtimeModule));
-        imports.add(new JS.NameSpecifier(_extensionSymbolsModule));
+        imports.add(JS.NameSpecifier(runtimeModule));
+        imports.add(JS.NameSpecifier(_extensionSymbolsModule));
       }
 
-      items.add(new JS.ImportDeclaration(
+      items.add(JS.ImportDeclaration(
           namedImports: imports, from: js.string(module, "'")));
     });
   }
@@ -696,7 +697,7 @@
 
     var currentNames = currentLibrary.publicNamespace.definedNames;
     var exportedNames =
-        new NamespaceBuilder().createExportNamespaceForDirective(element);
+        NamespaceBuilder().createExportNamespaceForDirective(element);
 
     // We only need to export main as it is the only method part of the
     // publicly exposed JS API for a library.
@@ -886,19 +887,19 @@
     // https://github.com/dart-lang/sdk/issues/31003
     var className = classElem.typeParameters.isNotEmpty
         ? (classElem == _jsArray
-            ? new JS.Identifier(classElem.name)
-            : new JS.TemporaryId(classElem.name))
+            ? JS.Identifier(classElem.name)
+            : JS.TemporaryId(classElem.name))
         : _emitTopLevelName(classElem);
 
     var savedClassProperties = _classProperties;
-    _classProperties = new ClassPropertyModel.build(
+    _classProperties = ClassPropertyModel.build(
         _extensionTypes,
         virtualFields,
         classElem,
         getClassCovariantParameters(classNode),
         _usedCovariantPrivateMembers);
 
-    var memberMap = new Map<Element, Declaration>();
+    var memberMap = Map<Element, Declaration>();
     for (var m in members) {
       if (m is FieldDeclaration) {
         for (var f in m.fields.variables) {
@@ -1146,7 +1147,7 @@
     if (isClassSymbol == null) {
       // TODO(jmesserly): we could export these symbols, if we want to mark
       // implemented interfaces for user-defined classes.
-      var id = new JS.TemporaryId("_is_${classElem.name}_default");
+      var id = JS.TemporaryId("_is_${classElem.name}_default");
       moduleItems.add(
           js.statement('const # = Symbol(#);', [id, js.string(id.name, "'")]));
       isClassSymbol = id;
@@ -1186,16 +1187,16 @@
 
   List<JS.Identifier> _emitTypeFormals(List<TypeParameterElement> typeFormals) {
     return typeFormals
-        .map((t) => new JS.Identifier(t.name))
+        .map((t) => JS.Identifier(t.name))
         .toList(growable: false);
   }
 
   /// Emits a field declaration for TypeScript & Closure's ES6_TYPED
   /// (e.g. `class Foo { i: string; }`)
   JS.VariableDeclarationList _emitTypeScriptField(FieldElement field) {
-    return new JS.VariableDeclarationList(field.isStatic ? 'static' : null, [
-      new JS.VariableInitialization(
-          new JS.Identifier(
+    return JS.VariableDeclarationList(field.isStatic ? 'static' : null, [
+      JS.VariableInitialization(
+          JS.Identifier(
               // TODO(ochafik): use a refactored _emitMemberName instead.
               field.name,
               type: emitTypeRef(field.type)),
@@ -1218,7 +1219,7 @@
       jsFormals,
       _typeTable.discharge(formals),
       body,
-      className ?? new JS.Identifier(element.name)
+      className ?? JS.Identifier(element.name)
     ]);
 
     var genericArgs = [typeConstructor];
@@ -1244,13 +1245,12 @@
         ? classElem.fields.map(_emitTypeScriptField).toList()
         : null;
     if (classElem.typeParameters.isNotEmpty) {
-