diff --git a/.packages b/.packages
index e09d3e7..e5e9d80 100644
--- a/.packages
+++ b/.packages
@@ -82,6 +82,7 @@
 shelf_packages_handler:third_party/pkg/shelf_packages_handler/lib
 shelf_static:third_party/pkg/shelf_static/lib
 shelf_web_socket:third_party/pkg/shelf_web_socket/lib
+smith:pkg/smith/lib
 source_map_stack_trace:third_party/pkg/source_map_stack_trace/lib
 sourcemap_testing:pkg/sourcemap_testing/lib
 source_maps:third_party/pkg/source_maps/lib
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 723a2e4..4fa15f1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,5 @@
+## 2.0.0-dev.66.0
+
 ## 2.0.0-dev.65.0
 
 ### Tool Changes
diff --git a/DEPS b/DEPS
index e7712ec..d785eeb 100644
--- a/DEPS
+++ b/DEPS
@@ -35,8 +35,8 @@
   "chromium_git": "https://chromium.googlesource.com",
   "fuchsia_git": "https://fuchsia.googlesource.com",
 
-  "co19_rev": "d4b3fc9af414c990b4d22f313e533b275d2f27c5",
-  "co19_2_rev": "74562e984a81673b581e148b5802684d6df840d2",
+  "co19_rev": "9858ee7d79cf09b50d6b5bc13fb950ae5f357954",
+  "co19_2_rev": "c64be2141d1e4e9a883389d709ef6bf0477c1fcf",
 
   # As Flutter does, we pull buildtools, including the clang toolchain, from
   # Fuchsia. This revision should be kept up to date with the revision pulled
@@ -110,7 +110,7 @@
   "ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_tag": "1.3.4",
   "protobuf_tag": "0.7.1",
-  "pub_rev": "2258022cb7fd6ec43900d3b88012efb268020019",
+  "pub_rev": "58fe996eab8d54f28f5109c407ff0ab62fbd835d",
   "pub_semver_tag": "1.4.1",
   "quiver_tag": "0.29.0",
   "resource_rev":"af5a5bf65511943398146cf146e466e5f0b95cb9",
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index bad2ba0..ce1ff45 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -61,6 +61,7 @@
 % - Add appendix listing the major differences between 64-bit integers
 %   and JavaScript integers.
 % - Remove appendix on naming conventions.
+% - Make it explicit that "dynamic" is exported from dart:core.
 %
 % 1.15
 % - Change how language specification describes control flow.
@@ -4052,7 +4053,8 @@
 \LMLabel{symbols}
 
 \LMHash{}
-A {\em symbol literal} denotes the name of a declaration in a Dart program.
+A {\em symbol literal} denotes a name that would be either
+a valid declaration name or a valid library name in a Dart program.
 
 \begin{grammar}
 {\bf symbolLiteral:}`\#' (operator $|$ (identifier (`{\escapegrammar .}' identifier)*))
@@ -4060,10 +4062,39 @@
 \end{grammar}
 
 \LMHash{}
-A symbol literal \code{\#\id} where \id{} does not begin with an underscore ('\code{\_}') is equivalent to the expression \code{\CONST{} Symbol('\id')}.
+A symbol literal \code{\#$id$} where $id$ is an identifier
+that does not begin with an underscore ('\code{\_}'),
+evaluates to an instance of \code{Symbol} representing the identifier $id$.
+All occurences of \code{\#$id$} evaluate to the same instance
+\commentary{(symbol instances are canonicalized)},
+and no other symbol literals evaluate to that \code{Symbol} instance
+or to a \code{Symbol} instance that is equal
+(according to the \code{==} operator \ref{equality}) to that instance.
 
 \LMHash{}
-A symbol literal \code{\#\_\id} evaluates to the object that would be returned by the call \code{MirrorSystem.getSymbol("\_\id", \metavar{libraryMirror})} where \metavar{libraryMirror} is an instance of the class \code{LibraryMirror} defined in the library \code{dart:mirrors}, reflecting the current library.
+A symbol literal \code{\#$id$.$id_2$\ldots$id_n$}
+where $id$ \ldots $id_n$ are identifiers,
+evaluates to an instance of \code{Symbol} representing that particular sequence of identifiers.
+All occurences of \code{\#$id$.$id_2$\ldots$id_n$} with the same sequence of identifiers
+evaluate to the same instance,
+and no other symbol literals evaluate to that \code{Symbol} instance
+or to a \code{Symbol} instance that is \code{==} to that instance.
+\commentary{This kind of symbol literal denotes the name of a library declaration. Library names are not subject to library privacy, even
+if some of its identifiers begin with an underscore.}
+
+\LMHash{}
+A symbol literal \code{\#\metavar{operator}} evaluates to an instance of \code{Symbol}
+representing that particular operator name.
+All occurences of \code{\#\metavar{operator}} evaluate to the same instance,
+and no other symbol literals evaluate to that \code{Symbol} instance
+or to a \code{Symbol} instance that is \code{==} to that instance.
+
+\LMHash{}
+A symbol literal \code{\#\_$id$}, evaluates to an instance of \code{Symbol}
+representing the private identifier \code{_$id} of the containing library.
+All occurences of \code{\#\_$id$} {\em in the same library} evaluate to the same instance,
+and no other symbol literals evaluate to that \code{Symbol} instance
+or to a \code{Symbol} instance that is \code{==} to that instance.
 
 \rationale{
 One may well ask what is the motivation for introducing literal symbols? In some languages, symbols are canonicalized whereas strings are not.
@@ -4075,7 +4106,7 @@
 This practice poses difficulties for reflective programs that refer to program declarations via strings.
 A string will refer to an identifier in the source, but the identifier will no longer be used in the minified code, and reflective code using these would fail.
 Therefore, Dart reflection uses objects of type \code{Symbol} rather than strings.
-Instances of \code{Symbol} are guaranteed to be stable with repeat to minification.
+Instances of \code{Symbol} are guaranteed to be stable with respect to minification.
 Providing a literal form for symbols makes reflective code easier to read and write.
 The fact that symbols are easy to type and can often act as convenient substitutes for enums are secondary benefits.
 }
@@ -4083,7 +4114,6 @@
 \LMHash{}
 The static type of a symbol literal is \code{Symbol}.
 
-
 \subsection{Lists}
 \LMLabel{lists}
 
@@ -5604,14 +5634,7 @@
 then if $g$ is a getter that forwards to a static getter, getter lookup fails.
 If the getter lookup succeeded,
 let $v_g$ be the value of the getter invocation $e.m$.
-Then the value of $i$ is the result of invoking the static method
-\code{Function.apply()}
-with arguments
-$v_g$,
-\code{[$o_1, \ldots, o_n$]},
-\code{\{$\#x_{n+1}$: $o_{n+1}, \ldots, \#x_{n+k}$: $o_{n+k}$\}},
-and
-\code{[$t_1, \ldots, t_r$]}.
+Now repeat from finding $f$ above, this time with $o$ being $v_g$ and $m$ being \code{call}.
 
 \LMHash{}
 If getter lookup has also failed,
@@ -5800,14 +5823,7 @@
 then let $g$ be the result of looking up getter (\ref{getterAndSetterLookup}) $m$ in $S_{dynamic}$ with respect to $L$.
 If the getter lookup succeeded,
 let $v_g$ be the value of the getter invocation $\SUPER{}.m$.
-Then the value of $i$ is the result of invoking
-the static method
-\code{Function.apply()}
-with arguments
-$v_g,
-[o_1, \ldots, o_n],
-\{\#x_{n+1}: o_{n+1}, \ldots, \#x_{n+k}: o_{n+k}\},
-[t_1, \ldots, t_r]$.
+Now repeat from finding $f$ above, this time with $o$ being $v_g$ and $m$ being \code{call}.
 
 \LMHash{}
 If getter lookup has also failed,
@@ -10051,7 +10067,10 @@
 }
 
 \LMHash{}
-The name \DYNAMIC{} denotes a \code{Type} object even though \DYNAMIC{} is not a class.
+The built-in type declaration \code{dynamic},
+which is declared in the library \code{dart:core},
+denotes the \DYNAMIC{} type.
+When the name \DYNAMIC{} exported by \code{dart:core} is evaluated as an expression, it evaluates to a \code{Type} object representing the \DYNAMIC{} type, even though \DYNAMIC{} is not a class.
 
 \LMHash{}
 The built-in type declaration \code{FutureOr},
diff --git a/pkg/analysis_server/test/integration/analysis/error_test.dart b/pkg/analysis_server/test/integration/analysis/error_test.dart
index ad440e8..9af229f 100644
--- a/pkg/analysis_server/test/integration/analysis/error_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/error_test.dart
@@ -108,6 +108,7 @@
   @override
   @failingTest
   test_super_mixins_disabled() {
+    // Disabling super mixins is not supported in the new FE.
     return super.test_super_mixins_disabled();
   }
 
diff --git a/pkg/analysis_server/tool/spec/generate_files b/pkg/analysis_server/tool/spec/generate_files
index df2802d1..0651cb2 100755
--- a/pkg/analysis_server/tool/spec/generate_files
+++ b/pkg/analysis_server/tool/spec/generate_files
@@ -54,7 +54,7 @@
 DART="${BUILD_DIR}/dart-sdk/bin/dart"
 
 declare -a VM_OPTIONS
-VM_OPTIONS+=("--checked")
+VM_OPTIONS+=("--enable-asserts")
 VM_OPTIONS+=("--packages=${PKG_FILE}")
 
 cd "${SCRIPT_DIR}"
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index e81260f..8739ccb 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.32.2
+
+* Improved const evaluation analysis (new errors for `const A(B())` if `B` is non-const).
+* Parser recovery improvements.
+
 ## 0.32.1
 
 * The Parser() class now by default will parse with optional new or const. This
diff --git a/pkg/analyzer/lib/analyzer.dart b/pkg/analyzer/lib/analyzer.dart
index 18a2e6c..ab46a8d 100644
--- a/pkg/analyzer/lib/analyzer.dart
+++ b/pkg/analyzer/lib/analyzer.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@deprecated
 import 'dart:io';
 
 import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 60afc67..62593e5 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -1369,6 +1369,17 @@
 
   @override
   TypeAlias computeNode();
+
+  /// Produces the function type resulting from instantiating this typedef with
+  /// the given type arguments.
+  ///
+  /// Note that for a generic typedef, this instantiates the typedef, not the
+  /// generic function type associated with it.  So, for example, if the typedef
+  /// is:
+  ///     typedef F<T> = void Function<U>(T, U);
+  /// then a single type argument should be provided, and it will be substituted
+  /// for T.
+  FunctionType instantiate(List<DartType> argumentTypes);
 }
 
 /**
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 1557389..2b24f8c 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -81,7 +81,7 @@
   CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER,
   CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION,
   CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST,
-  CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN,
+  CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
   CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER,
   CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD,
   CompileTimeErrorCode.CONST_DEFERRED_CLASS,
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index df71b24..33a23f7 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -95,7 +95,7 @@
   /**
    * The version of data format, should be incremented on every format change.
    */
-  static const int DATA_VERSION = 61;
+  static const int DATA_VERSION = 62;
 
   /**
    * The number of exception contexts allowed to write. Once this field is
diff --git a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
index 03f505c..eb7f1d8 100644
--- a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
@@ -218,7 +218,8 @@
 
         // Compute new outlines.
         var newComponent = await _logger.runAsync('Compile', () async {
-          return await kernelTarget.buildOutlines(nameRoot: _component.root);
+          await kernelTarget.buildOutlines(nameRoot: _component.root);
+          return await kernelTarget.buildComponent();
         });
 
         // Add new libraries to the current component.
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 709f366..a7510b0 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -1151,6 +1151,8 @@
       element = resynthesizer
           .getElementFromCanonicalName(referencedNode.classNode.canonicalName);
       assert(element != null);
+    } else if (referencedNode is kernel.DynamicType) {
+      element = DynamicElementImpl.instance;
     } else {
       throw new UnimplementedError(
           'TODO(paulberry): ${referencedNode.runtimeType}');
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index a15908f..50fa260 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -5491,8 +5491,17 @@
   GenericFunctionTypeElementImpl get function {
     if (_function == null) {
       if (_kernel != null) {
-        _function =
-            new GenericFunctionTypeElementImpl.forKernel(this, _kernel.type);
+        var kernelType = _kernel.type;
+        if (kernelType is kernel.FunctionType) {
+          _function =
+              new GenericFunctionTypeElementImpl.forKernel(this, kernelType);
+        } else {
+          // Error recovery.
+          _function = new GenericFunctionTypeElementImpl.forOffset(-1);
+          _function.enclosingElement = this;
+          _function.returnType = DynamicTypeImpl.instance;
+          _function.parameters = <ParameterElement>[];
+        }
       }
       if (_unlinkedTypedef != null) {
         if (_unlinkedTypedef.style == TypedefStyle.genericFunctionType) {
@@ -5647,6 +5656,15 @@
     return null;
   }
 
+  @override
+  FunctionType instantiate(List<DartType> argumentTypes) {
+    if (argumentTypes.length != typeParameters.length) {
+      throw new ArgumentError('Wrong number of type arguments supplied');
+    }
+    if (typeParameters.isEmpty) return function.type;
+    return typeAfterSubstitution(argumentTypes);
+  }
+
   /**
    * Return the type of the function defined by this typedef after substituting
    * the given [typeArguments] for the type parameters defined for this typedef
diff --git a/pkg/analyzer/lib/src/dart/element/handle.dart b/pkg/analyzer/lib/src/dart/element/handle.dart
index c3a659d..9695ed3c 100644
--- a/pkg/analyzer/lib/src/dart/element/handle.dart
+++ b/pkg/analyzer/lib/src/dart/element/handle.dart
@@ -693,6 +693,10 @@
 
   @override
   FunctionTypeAlias computeNode() => actualElement.computeNode();
+
+  @override
+  FunctionType instantiate(List<DartType> argumentTypes) =>
+      actualElement.instantiate(argumentTypes);
 }
 
 /**
@@ -732,6 +736,10 @@
 
   @override
   FunctionTypeAlias computeNode() => actualElement.computeNode();
+
+  @override
+  FunctionType instantiate(List<DartType> argumentTypes) =>
+      actualElement.instantiate(argumentTypes);
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 5d1bada..e7ec4ad 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -484,14 +484,19 @@
    * specify a constant constructor of the superclass of the immediately
    * enclosing class or a compile-time error occurs.
    *
-   * 9 Mixins: For each generative constructor named ... an implicitly declared
-   * constructor named ... is declared.
+   * 12.1 Mixin Application: For each generative constructor named ... an
+   * implicitly declared constructor named ... is declared. If Sq is a
+   * generative const constructor, and M does not declare any fields, Cq is
+   * also a const constructor.
    */
-  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_MIXIN =
-      const CompileTimeErrorCode('CONST_CONSTRUCTOR_WITH_MIXIN',
-          "Const constructor can't be declared for a class with a mixin.",
-          correction: "Try removing the 'const' keyword, or "
-              "removing the 'with' clause from the class declaration.");
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD =
+      const CompileTimeErrorCode(
+          'CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD',
+          "Const constructor can't be declared for a class with a mixin "
+          "that declares a field.",
+          correction: "Try removing the 'const' keyword or "
+              "removing the 'with' clause from the class declaration, "
+              "or removing fields from the mixin class.");
 
   /**
    * 7.6.3 Constant Constructors: The superinitializer that appears, explicitly
diff --git a/pkg/analyzer/lib/src/fasta/resolution_applier.dart b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
index 9d1b45c..5471ac5 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_applier.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
@@ -43,70 +43,44 @@
 
   @override
   void visitAnnotation(Annotation node) {
+    Identifier name = node.name;
     SimpleIdentifier constructorName = node.constructorName;
-    SyntacticEntity entity;
-    if (constructorName != null) {
-      entity = constructorName;
-    } else {
-      var name = node.name;
-      if (name is PrefixedIdentifier) {
-        entity = name.identifier;
+
+    var data = _get(name);
+    if (name is SimpleIdentifier) {
+      name.staticElement = data.reference;
+      name.staticType = data.inferredType;
+      node.element = data.reference;
+    } else if (name is PrefixedIdentifier) {
+      if (data.prefixInfo != null) {
+        name.prefix.staticElement = data.prefixInfo;
+
+        data = _get(name.identifier);
+        name.identifier.staticElement = data.reference;
+        name.identifier.staticType = data.inferredType;
       } else {
-        entity = name;
+        name.prefix.staticElement = data.reference;
+        name.prefix.staticType = data.inferredType;
+        constructorName = name.identifier;
       }
     }
-    var data = _get(entity);
 
-    SimpleIdentifier topEntity;
-    if (data.prefixInfo != null) {
-      PrefixedIdentifier prefixedIdentifier = node.name;
-
-      SimpleIdentifier prefix = prefixedIdentifier.prefix;
-      prefix.staticElement = data.prefixInfo;
-
-      topEntity = prefixedIdentifier.identifier;
-    } else {
-      topEntity = node.name;
-    }
-
-    Element element = data.reference;
-    DartType type = data.inferredType;
-    node.element = element;
-
-    if (element is ConstructorElement) {
-      topEntity.staticElement = element.enclosingElement;
+    ArgumentList argumentList = node.arguments;
+    if (argumentList != null) {
+      var data = _get(argumentList);
+      ConstructorElement element = data.reference;
+      node.element = element;
 
       if (constructorName != null) {
         constructorName.staticElement = element;
         constructorName.staticType = element.type;
       }
 
-      ArgumentList argumentList = node.arguments;
-      if (argumentList != null) {
-        _applyResolutionToArguments(argumentList);
-        _resolveNamedArguments(argumentList, element.parameters);
-      }
-    } else {
-      topEntity.staticElement = element;
-      topEntity.staticType = type;
-      if (constructorName != null) {
-        constructorName.accept(this);
-        node.element = constructorName.staticElement;
-      }
+      _applyResolutionToArguments(argumentList);
+      _resolveNamedArguments(argumentList, element.parameters);
     }
   }
 
-  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);
@@ -333,25 +307,6 @@
     _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);
@@ -361,7 +316,7 @@
     node.staticInvokeType = invokeType;
 
     List<DartType> typeArguments = data.argumentTypes;
-    if (node.typeArguments != null && typeArguments is TypeArgumentsDartType) {
+    if (node.typeArguments != null && typeArguments != null) {
       _applyTypeArgumentsToList(
           _enclosingLibraryElement,
           new TypeArgumentsDartType(typeArguments),
@@ -395,14 +350,14 @@
 
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
-    ConstructorName constructorName = node.constructorName;
-    var data = _get(constructorName);
+    var data = _get(node.argumentList);
 
     PrefixElement prefix = data.prefixInfo;
 
     ConstructorElement constructor = data.reference;
     DartType type = data.inferredType;
 
+    ConstructorName constructorName = node.constructorName;
     applyConstructorElement(
         _enclosingLibraryElement, prefix, constructor, type, constructorName);
 
@@ -694,6 +649,17 @@
     }
   }
 
+  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;
+  }
+
   /// Return the [SyntacticEntity] with which the front-end associates
   /// assignment to the given [leftHandSide].
   SyntacticEntity _getAssignmentEntity(Expression leftHandSide) {
@@ -729,6 +695,25 @@
     }
   }
 
+  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++];
+        }
+      }
+    }
+  }
+
   /// Apply the [type] that is created by the [constructorName] and the
   /// [constructorElement] it references.
   static void applyConstructorElement(
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index b470ac2..8cb4b47 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -3242,11 +3242,13 @@
       return;
     }
     // check for mixins
-    if (_enclosingClass.mixins.length != 0) {
-      _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN,
-          constructor.returnType);
-      return;
+    for (var mixin in _enclosingClass.mixins) {
+      if (mixin.element.fields.isNotEmpty) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
+            constructor.returnType);
+        return;
+      }
     }
     // try to find and check super constructor invocation
     for (ConstructorInitializer initializer in constructor.initializers) {
@@ -5726,35 +5728,63 @@
 
       var toType = expectedType;
       var fromType = expressionType;
-
-      if (isArrowFunction) {
-        if (_inAsync && toType.flattenFutures(_typeSystem).isVoid) {
-          return;
-        } else if (toType.isVoid) {
-          return;
-        }
+      if (_inAsync) {
+        toType = toType.flattenFutures(_typeSystem);
+        fromType = fromType.flattenFutures(_typeSystem);
       }
 
+      // Anything can be returned to `void` in an arrow bodied function
+      // or to `Future<void>` in an async arrow bodied function.
+      if (isArrowFunction && toType.isVoid) {
+        return;
+      }
+
+      // Anything can be returned to `dynamic`, or to `Future<dynamic>` in
+      // an async function.
       if (toType.isDynamic) {
         return;
       }
 
+      // Anything can be return to `Future<Null>` in an async function
+      if (_inAsync && toType.isDartCoreNull) {
+        return;
+      }
+
+      // If we're not in one of the `void` related special cases
+      // just check assignability.
+      if (!expectedType.isVoid && !fromType.isVoid) {
+        var checkWithType = (!_inAsync)
+            ? fromType
+            : _typeProvider.futureType.instantiate(<DartType>[fromType]);
+        if (_expressionIsAssignableAtType(
+            returnExpression, checkWithType, expectedType)) {
+          return;
+        }
+      }
+
+      // Void related special cases.  If the expression type flattens
+      // to `void`, and the expected type doesn't, then it's an error.
+      // Otherwise:
       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;
+        // In the case that the expected type is `void`
+        if (expectedType.isVoid) {
+          // Valid if the expression type is void, dynamic or Null
+          if (expressionType.isVoid ||
+              expressionType.isDynamic ||
+              expressionType.isDartCoreNull ||
+              expressionType.isBottom) {
+            return;
+          }
+        } else {
+          // The expected type is Future<void> or FutureOr<void>,
+          // and the return is valid if the expression type flattens
+          // to void, dynamic, or Null.
+          if (fromType.isVoid ||
+              fromType.isDynamic ||
+              fromType.isDartCoreNull ||
+              fromType.isBottom) {
+            return;
+          }
         }
       }
       reportTypeError();
diff --git a/pkg/analyzer/lib/src/generated/java_core.dart b/pkg/analyzer/lib/src/generated/java_core.dart
index 51eead8..b180724 100644
--- a/pkg/analyzer/lib/src/generated/java_core.dart
+++ b/pkg/analyzer/lib/src/generated/java_core.dart
@@ -27,7 +27,8 @@
  */
 String formatList(String pattern, List<Object> arguments) {
   if (arguments == null || arguments.isEmpty) {
-    assert(!pattern.contains(new RegExp(r'\{(\d+)\}')));
+    assert(!pattern.contains(new RegExp(r'\{(\d+)\}')),
+        'Message requires arguments, but none were provided.');
     return pattern;
   }
   return pattern.replaceAllMapped(new RegExp(r'\{(\d+)\}'), (match) {
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index a500975..3158176 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer.src.generated.type_system;
-
 import 'dart:collection';
 import 'dart:math' as math;
 
@@ -15,8 +13,7 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart' show TypeParameterMember;
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/error/codes.dart'
-    show StrongModeCode, CompileTimeErrorCode;
+import 'package:analyzer/src/error/codes.dart' show StrongModeCode;
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisContext, AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
diff --git a/pkg/analyzer/lib/src/kernel/resynthesize.dart b/pkg/analyzer/lib/src/kernel/resynthesize.dart
index 876f47d..a370739 100644
--- a/pkg/analyzer/lib/src/kernel/resynthesize.dart
+++ b/pkg/analyzer/lib/src/kernel/resynthesize.dart
@@ -260,7 +260,8 @@
   FunctionType _getFunctionType(
       ElementImpl context, kernel.FunctionType kernelType) {
     if (kernelType.typedef != null) {
-      return _getTypedefType(context, kernelType);
+      var translatedType = _getTypedefType(context, kernelType);
+      if (translatedType != null) return translatedType;
     }
 
     var element = new FunctionElementImpl('', -1);
@@ -329,51 +330,35 @@
 
     GenericTypeAliasElementImpl typedefElement =
         getElementFromCanonicalName(typedef.canonicalName);
-    GenericFunctionTypeElementImpl functionElement = typedefElement.function;
 
     kernel.FunctionType typedefType = typedef.type;
-    var kernelTypeParameters = typedef.typeParameters.toList();
-    kernelTypeParameters.addAll(typedefType.typeParameters);
 
-    // If no type parameters, the raw type of the element will do.
-    FunctionTypeImpl rawType = functionElement.type;
-    if (kernelTypeParameters.isEmpty) {
-      return rawType;
+    if (kernelType.typeParameters.length != typedefType.typeParameters.length) {
+      // Type parameters don't match; just resynthesize as a synthetic function
+      // type.
+      return null;
     }
 
-    // Compute type arguments for kernel type parameters.
-    var kernelMap = kernel.unifyTypes(typedefType.withoutTypeParameters,
-        kernelType.withoutTypeParameters, kernelTypeParameters.toSet());
-
-    // Prepare Analyzer type parameters, in the same order as kernel ones.
-    var astTypeParameters = typedefElement.typeParameters.toList();
-    astTypeParameters.addAll(functionElement.typeParameters);
+    // In the general case imagine the typedef is:
+    //     typedef F<T, U> = ... Function<V, W>(...);
+    // And kernelType is:
+    //     ... Function<X, Y>(...);
+    // So the outer type parameters of the typedef have been instantiated (or
+    // there were none); the inner type parameters have not been instantiated
+    // (or there were none).
+    //
+    // Now we have to figure out what substitution was used to instantiate
+    // the typedef, since the kernel doesn't track that information.
+    var substitution = kernel.unifyTypes(
+        typedefType, kernelType, typedef.typeParameters.toSet());
 
     // Convert kernel type arguments into Analyzer types.
-    int length = astTypeParameters.length;
-    var usedTypeParameters = <TypeParameterElement>[];
-    var usedTypeArguments = <DartType>[];
-    for (var i = 0; i < length; i++) {
-      var kernelParameter = kernelTypeParameters[i];
-      var kernelArgument = kernelMap[kernelParameter];
-      if (kernelArgument == null ||
-          kernelArgument is kernel.TypeParameterType &&
-              kernelArgument.parameter.parent == null) {
-        continue;
-      }
-      TypeParameterElement astParameter = astTypeParameters[i];
-      DartType astArgument = getType(context, kernelArgument);
-      usedTypeParameters.add(astParameter);
-      usedTypeArguments.add(astArgument);
-    }
-
-    if (usedTypeParameters.isEmpty) {
-      return rawType;
-    }
-
-    // Replace Analyzer type parameters with type arguments.
-    throw new UnimplementedError(
-        'TODO(paulberry): resynthesize generic typedef');
+    var typeArguments = typedef.typeParameters
+        .map((t) => substitution.containsKey(t)
+            ? getType(context, substitution[t])
+            : _typeProvider.nullType)
+        .toList();
+    return typedefElement.instantiate(typeArguments);
   }
 
   /// Return the [TypeParameterElement] for the given [kernelTypeParameter].
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 819219b..dddf70e 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.32.1
+version: 0.32.2
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
@@ -11,10 +11,10 @@
   collection: ^1.10.1
   convert: ^2.0.0
   crypto: '>=1.1.1 <3.0.0'
-  front_end: 0.1.1
+  front_end: 0.1.2
   glob: ^1.0.3
   html: '>=0.12.0 <1.14.0'
-  kernel: 0.3.1
+  kernel: 0.3.2
   meta: ^1.0.2
   package_config: '>=0.1.5 <2.0.0'
   path: '>=0.9.0 <2.0.0'
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 6cd4ceb..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
@@ -149,6 +149,13 @@
 
   @failingTest
   @override
+  test_fieldTypeOk_generic() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t4 = #lib2::y in let ...
+    await super.test_fieldTypeOk_generic();
+  }
+
+  @failingTest
+  @override
   test_fieldTypeOk_unresolved_null() async {
     // UnimplementedError: kernel: (AsExpression) x as{TypeError} invalid-type
     await super.test_fieldTypeOk_unresolved_null();
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 97fa300..f2a68eb 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
@@ -240,9 +240,16 @@
 
   @override
   @failingTest
-  test_constConstructorWithMixin() async {
-    // Expected 1 errors of type CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN, found 0
-    await super.test_constConstructorWithMixin();
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33645')
+  test_constConstructorWithMixinWithField() async {
+    return super.test_constConstructorWithMixinWithField();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33645')
+  test_constConstructorWithMixinWithField_final() async {
+    return super.test_constConstructorWithMixinWithField_final();
   }
 
   @override
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 6f250b2..0e0fd58 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -1026,15 +1026,33 @@
     verify([source]);
   }
 
-  test_constConstructorWithMixin() async {
+  test_constConstructorWithMixinWithField() async {
     Source source = addSource(r'''
-class M {
+class A {
+  var a;
 }
-class A extends Object with M {
-  const A();
+class B extends Object with A {
+  const B();
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN]);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
+      CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD
+    ]);
+    verify([source]);
+  }
+
+  test_constConstructorWithMixinWithField_final() async {
+    Source source = addSource(r'''
+class A {
+  final int a = 0;
+}
+class B extends Object with A {
+  const B();
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD]);
     verify([source]);
   }
 
@@ -1076,7 +1094,7 @@
 }''');
     await computeAnalysisResult(source);
     assertErrors(source, [
-      CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN,
+      CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
       CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD
     ]);
     verify([source]);
@@ -1617,6 +1635,27 @@
     verify([source]);
   }
 
+  test_constWithNonConst_in_const_context() async {
+    Source source = addSource(r'''
+class A {
+  const A(x);
+}
+class B {
+}
+main() {
+  const A(B());
+}
+''');
+    await computeAnalysisResult(source);
+    // TODO(a14n): the error CONST_WITH_NON_CONSTANT_ARGUMENT is redundant and
+    // ought to be suppressed.
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_WITH_NON_CONST,
+      CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT
+    ]);
+    verify([source]);
+  }
+
   test_constWithNonConst_with() async {
     Source source = addSource(r'''
 class B {
@@ -1639,27 +1678,6 @@
     verify([source]);
   }
 
-  test_constWithNonConst_in_const_context() async {
-    Source source = addSource(r'''
-class A {
-  const A(x);
-}
-class B {
-}
-main() {
-  const A(B());
-}
-''');
-    await computeAnalysisResult(source);
-    // TODO(a14n): the error CONST_WITH_NON_CONSTANT_ARGUMENT is redundant and
-    // ought to be suppressed.
-    assertErrors(source, [
-      CompileTimeErrorCode.CONST_WITH_NON_CONST,
-      CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT
-    ]);
-    verify([source]);
-  }
-
   test_constWithNonConstantArgument_annotation() async {
     Source source = addSource(r'''
 class A {
@@ -2749,6 +2767,98 @@
     verify([source]);
   }
 
+  test_genericFunctionTypeArgument_class() async {
+    Source source = addSource(r'''
+class C<T> {}
+C<T Function<T>(T)> c;''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  test_genericFunctionTypeArgument_function() async {
+    Source source = addSource(r'''
+T f<T>(T) => null;
+main() { f<S Function<S>(S)>(null); }''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  test_genericFunctionTypeArgument_functionType() async {
+    Source source = addSource(r'''
+T Function<T>(T) f;
+main() { f<S Function<S>(S)>(null); }''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  @failingTest
+  test_genericFunctionTypeArgument_inference_function() async {
+    // TODO(mfairhurst) how should these inference errors be reported?
+    Source source = addSource(r'''
+T f<T>(T) => null;
+main() { f(<S>(S s) => s); }''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  @failingTest
+  test_genericFunctionTypeArgument_inference_functionType() async {
+    // TODO(mfairhurst) how should these inference errors be reported?
+    Source source = addSource(r'''
+T Function<T>(T) f;
+main() { f(<S>(S s) => s); }''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  @failingTest
+  test_genericFunctionTypeArgument_inference_method() async {
+    // TODO(mfairhurst) how should these inference errors be reported?
+    Source source = addSource(r'''
+class C {
+  T f<T>(T) => null;
+}
+main() { new C().f(<S>(S s) => s); }''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  test_genericFunctionTypeArgument_method() async {
+    Source source = addSource(r'''
+class C {
+  T f<T>(T) => null;
+}
+main() { new C().f<S Function<S>(S)>(null); }''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  @failingTest
+  test_genericFunctionTypeArgument_typedef() async {
+    // TODO(mfairhurst) diagnose these parse errors to give the correct error
+    Source source = addSource(r'''
+typedef T f<T>(T t);
+final T<Function<S>(int)> x = null;''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
   test_genericFunctionTypeAsBound_class() async {
     Source source = addSource(r'''
 class C<T extends S Function<S>(S)> {
@@ -7063,98 +7173,6 @@
     verify([source]);
   }
 
-  test_genericFunctionTypeArgument_class() async {
-    Source source = addSource(r'''
-class C<T> {}
-C<T Function<T>(T)> c;''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
-    verify([source]);
-  }
-
-  test_genericFunctionTypeArgument_functionType() async {
-    Source source = addSource(r'''
-T Function<T>(T) f;
-main() { f<S Function<S>(S)>(null); }''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
-    verify([source]);
-  }
-
-  test_genericFunctionTypeArgument_function() async {
-    Source source = addSource(r'''
-T f<T>(T) => null;
-main() { f<S Function<S>(S)>(null); }''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
-    verify([source]);
-  }
-
-  test_genericFunctionTypeArgument_method() async {
-    Source source = addSource(r'''
-class C {
-  T f<T>(T) => null;
-}
-main() { new C().f<S Function<S>(S)>(null); }''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
-    verify([source]);
-  }
-
-  @failingTest
-  test_genericFunctionTypeArgument_inference_functionType() async {
-    // TODO(mfairhurst) how should these inference errors be reported?
-    Source source = addSource(r'''
-T Function<T>(T) f;
-main() { f(<S>(S s) => s); }''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
-    verify([source]);
-  }
-
-  @failingTest
-  test_genericFunctionTypeArgument_inference_function() async {
-    // TODO(mfairhurst) how should these inference errors be reported?
-    Source source = addSource(r'''
-T f<T>(T) => null;
-main() { f(<S>(S s) => s); }''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
-    verify([source]);
-  }
-
-  @failingTest
-  test_genericFunctionTypeArgument_inference_method() async {
-    // TODO(mfairhurst) how should these inference errors be reported?
-    Source source = addSource(r'''
-class C {
-  T f<T>(T) => null;
-}
-main() { new C().f(<S>(S s) => s); }''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
-    verify([source]);
-  }
-
-  @failingTest
-  test_genericFunctionTypeArgument_typedef() async {
-    // TODO(mfairhurst) diagnose these parse errors to give the correct error
-    Source source = addSource(r'''
-typedef T f<T>(T t);
-final T<Function<S>(int)> x = null;''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
-    verify([source]);
-  }
-
   test_undefinedAnnotation_unresolved_identifier() async {
     Source source = addSource(r'''
 @unresolved
diff --git a/pkg/analyzer/test/generated/error_suppression_kernel_test.dart b/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
index 85bd5a7..410dd7e 100644
--- a/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
+++ b/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
@@ -66,6 +66,41 @@
 
   @override
   @failingTest
+  test_multiple_ignores() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t2 = #lib2::x in let ...
+    await super.test_multiple_ignores();
+  }
+
+  @override
+  @failingTest
+  test_multiple_ignores_traling() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t3 = #lib3::x in let ...
+    await super.test_multiple_ignores_traling();
+  }
+
+  @override
+  @failingTest
+  test_multiple_ignores_whitespace_variant_1() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t4 = #lib4::x in let ...
+    await super.test_multiple_ignores_whitespace_variant_1();
+  }
+
+  @override
+  @failingTest
+  test_multiple_ignores_whitespace_variant_2() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t5 = #lib5::x in let ...
+    await super.test_multiple_ignores_whitespace_variant_2();
+  }
+
+  @override
+  @failingTest
+  test_multiple_ignores_whitespace_variant_3() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t6 = #lib6::x in let ...
+    await super.test_multiple_ignores_whitespace_variant_3();
+  }
+
+  @override
+  @failingTest
   test_no_ignores() async {
     // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0;
     //          1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
diff --git a/pkg/analyzer/test/generated/hint_code_kernel_test.dart b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
index 333ef36..ad843c2 100644
--- a/pkg/analyzer/test/generated/hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
@@ -12,11 +12,6 @@
   });
 }
 
-/// Tests marked with this annotation fail because of a Fasta problem.
-class FastaProblem {
-  const FastaProblem(String issueUri);
-}
-
 @reflectiveTest
 class HintCodeTest_Kernel extends HintCodeTest_Driver {
   @override
@@ -74,27 +69,6 @@
     return super.test_deadCode_deadFinalStatementInCase();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deadCode_statementAfterAlwaysThrowsFunction() async {
-    await super.test_deadCode_statementAfterAlwaysThrowsFunction();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deadCode_statementAfterAlwaysThrowsMethod() async {
-    await super.test_deadCode_statementAfterAlwaysThrowsMethod();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_assignment() async {
-    await super.test_deprecatedAnnotationUse_assignment();
-  }
-
   @failingTest
   @override
   test_deprecatedAnnotationUse_call() async {
@@ -102,13 +76,6 @@
     return super.test_deprecatedAnnotationUse_call();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_deprecated() async {
-    await super.test_deprecatedAnnotationUse_deprecated();
-  }
-
   @failingTest
   @override
   test_deprecatedAnnotationUse_Deprecated() async {
@@ -118,95 +85,16 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_export() async {
-    await super.test_deprecatedAnnotationUse_export();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_field() async {
-    await super.test_deprecatedAnnotationUse_field();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_getter() async {
-    await super.test_deprecatedAnnotationUse_getter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_import() async {
-    await super.test_deprecatedAnnotationUse_import();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_indexExpression() async {
-    await super.test_deprecatedAnnotationUse_indexExpression();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_instanceCreation() async {
-    await super.test_deprecatedAnnotationUse_instanceCreation();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_instanceCreation_namedConstructor() async {
-    await super
-        .test_deprecatedAnnotationUse_instanceCreation_namedConstructor();
-  }
-
-  @override
-  @failingTest
   test_deprecatedAnnotationUse_named() async {
     return super.test_deprecatedAnnotationUse_named();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_operator() async {
-    await super.test_deprecatedAnnotationUse_operator();
-  }
-
   @failingTest
   @override
   test_deprecatedAnnotationUse_positional() async {
     return super.test_deprecatedAnnotationUse_positional();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_setter() async {
-    await super.test_deprecatedAnnotationUse_setter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_superConstructor() async {
-    await super.test_deprecatedAnnotationUse_superConstructor();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_superConstructor_namedConstructor() async {
-    await super
-        .test_deprecatedAnnotationUse_superConstructor_namedConstructor();
-  }
-
   @failingTest
   @override
   test_deprecatedFunction_class() async {
@@ -262,83 +150,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_factory__expr_return_null_OK() async {
-    await super.test_factory__expr_return_null_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_factory_abstract_OK() async {
-    await super.test_factory_abstract_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_factory_bad_return() async {
-    await super.test_factory_bad_return();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_factory_block_OK() async {
-    await super.test_factory_block_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_factory_block_return_null_OK() async {
-    await super.test_factory_block_return_null_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_factory_expr_OK() async {
-    await super.test_factory_expr_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_factory_misplaced_annotation() async {
-    await super.test_factory_misplaced_annotation();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_factory_no_return_type_OK() async {
-    await super.test_factory_no_return_type_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_factory_subclass_OK() async {
-    await super.test_factory_subclass_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_factory_void_return() async {
-    await super.test_factory_void_return();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidImmutableAnnotation_method() async {
-    await super.test_invalidImmutableAnnotation_method();
-  }
-
-  @override
-  @failingTest
   test_invalidRequiredParam_on_named_parameter_with_default() async {
     return super.test_invalidRequiredParam_on_named_parameter_with_default();
   }
@@ -370,223 +181,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_closure() async {
-    await super.test_invalidUseOfProtectedMember_closure();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_field() async {
-    await super.test_invalidUseOfProtectedMember_field();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_field_OK() async {
-    await super.test_invalidUseOfProtectedMember_field_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_function() async {
-    await super.test_invalidUseOfProtectedMember_function();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_function_OK() async {
-    await super.test_invalidUseOfProtectedMember_function_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_function_OK2() async {
-    await super.test_invalidUseOfProtectedMember_function_OK2();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_getter() async {
-    await super.test_invalidUseOfProtectedMember_getter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_getter_OK() async {
-    await super.test_invalidUseOfProtectedMember_getter_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_in_docs_OK() async {
-    await super.test_invalidUseOfProtectedMember_in_docs_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_message() async {
-    await super.test_invalidUseOfProtectedMember_message();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_method_1() async {
-    await super.test_invalidUseOfProtectedMember_method_1();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_method_OK() async {
-    await super.test_invalidUseOfProtectedMember_method_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_OK_1() async {
-    await super.test_invalidUseOfProtectedMember_OK_1();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_OK_2() async {
-    await super.test_invalidUseOfProtectedMember_OK_2();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_OK_3() async {
-    await super.test_invalidUseOfProtectedMember_OK_3();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_OK_4() async {
-    await super.test_invalidUseOfProtectedMember_OK_4();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_OK_field() async {
-    await super.test_invalidUseOfProtectedMember_OK_field();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_OK_getter() async {
-    await super.test_invalidUseOfProtectedMember_OK_getter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_OK_setter() async {
-    await super.test_invalidUseOfProtectedMember_OK_setter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_OK_setter_2() async {
-    await super.test_invalidUseOfProtectedMember_OK_setter_2();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_setter() async {
-    await super.test_invalidUseOfProtectedMember_setter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_setter_OK() async {
-    await super.test_invalidUseOfProtectedMember_setter_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_topLevelVariable() async {
-    await super.test_invalidUseOfProtectedMember_topLevelVariable();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfVisibleForTestingMember_constructor() async {
-    await super.test_invalidUseOfVisibleForTestingMember_constructor();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfVisibleForTestingMember_method() async {
-    await super.test_invalidUseOfVisibleForTestingMember_method();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfVisibleForTestingMember_method_OK() async {
-    await super.test_invalidUseOfVisibleForTestingMember_method_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfVisibleForTestingMember_OK_export() async {
-    await super.test_invalidUseOfVisibleForTestingMember_OK_export();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfVisibleForTestingMember_propertyAccess() async {
-    await super.test_invalidUseOfVisibleForTestingMember_propertyAccess();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfVisibleForTestingMember_topLevelFunction() async {
-    await super.test_invalidUseOfVisibleForTestingMember_topLevelFunction();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseProtectedAndForTesting_asProtected_OK() async {
-    await super.test_invalidUseProtectedAndForTesting_asProtected_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseProtectedAndForTesting_asTesting_OK() async {
-    await super.test_invalidUseProtectedAndForTesting_asTesting_OK();
-  }
-
-  @override
-  @failingTest
   test_isNotDouble() {
     // Bad state: No data for is at 10
     return super.test_isNotDouble();
@@ -641,34 +235,6 @@
     return super.test_missingJsLibAnnotation_variable();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_mustBeImmutable_direct() async {
-    await super.test_mustBeImmutable_direct();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_mustBeImmutable_extends() async {
-    await super.test_mustBeImmutable_extends();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_mustBeImmutable_fromMixin() async {
-    await super.test_mustBeImmutable_fromMixin();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_mustBeImmutable_instance() async {
-    await super.test_mustBeImmutable_instance();
-  }
-
   @failingTest
   @override
   test_mustCallSuper() async {
@@ -676,13 +242,6 @@
     return super.test_mustCallSuper();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_mustCallSuper_fromInterface() async {
-    await super.test_mustCallSuper_fromInterface();
-  }
-
   @failingTest
   @override
   test_mustCallSuper_indirect() async {
@@ -690,27 +249,6 @@
     return super.test_mustCallSuper_indirect();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_mustCallSuper_overridden() async {
-    await super.test_mustCallSuper_overridden();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_mustCallSuper_overridden_w_future() async {
-    await super.test_mustCallSuper_overridden_w_future();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_mustCallSuper_overridden_w_future2() async {
-    await super.test_mustCallSuper_overridden_w_future2();
-  }
-
   @failingTest
   @override
   test_nullAwareBeforeOperator_ok_is_not() {
@@ -720,34 +258,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingField_invalid() async {
-    await super.test_overrideOnNonOverridingField_invalid();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingGetter_invalid() async {
-    await super.test_overrideOnNonOverridingGetter_invalid();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingMethod_invalid() async {
-    await super.test_overrideOnNonOverridingMethod_invalid();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingSetter_invalid() async {
-    await super.test_overrideOnNonOverridingSetter_invalid();
-  }
-
-  @override
-  @failingTest
   test_required_constructor_param() async {
     return super.test_required_constructor_param();
   }
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 b080ee6..0195c61 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
@@ -26,6 +26,11 @@
   const FastaProblem(String issueUri);
 }
 
+/// Tests marked with this annotation fail because of an Analyzer problem.
+class AnalyzerProblem {
+  const AnalyzerProblem(String issueUri);
+}
+
 @reflectiveTest
 class NonErrorResolverTest_Kernel extends NonErrorResolverTest_Driver {
   @override
@@ -36,27 +41,13 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/31625')
+  @AnalyzerProblem('https://github.com/dart-lang/sdk/issues/33636')
   test_ambiguousImport_showCombinator() async {
     return super.test_ambiguousImport_showCombinator();
   }
 
   @override
   @failingTest
-  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
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31604')
   test_commentReference_beforeConstructor() async {
     return super.test_commentReference_beforeConstructor();
@@ -127,13 +118,6 @@
 
   @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();
@@ -142,13 +126,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_constConstructorWithNonFinalField_mixin() async {
-    return super.test_constConstructorWithNonFinalField_mixin();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_constDeferredClass_new() async {
     return super.test_constDeferredClass_new();
   }
@@ -169,13 +146,6 @@
 
   @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();
@@ -216,64 +186,6 @@
     return super.test_functionTypeAlias_scope_signature();
   }
 
-  @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();
 
@@ -283,20 +195,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_instance_creation_inside_annotation() async {
-    return super.test_instance_creation_inside_annotation();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_integerLiteralOutOfRange_negative_valid() async {
-    return super.test_integerLiteralOutOfRange_negative_valid();
-  }
-
-  @override
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31641')
   test_invalidAnnotation_constantVariable_field() async {
     return super.test_invalidAnnotation_constantVariable_field();
@@ -313,45 +211,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidAnnotation_constantVariable_topLevel() async {
-    return super.test_invalidAnnotation_constantVariable_topLevel();
-  }
-
-  @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();
@@ -437,13 +296,6 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_staticAccessToInstanceMember_annotation() async {
-    return super.test_staticAccessToInstanceMember_annotation();
-  }
-
-  @override
-  @failingTest
   test_undefinedGetter_static_conditionalAccess() {
     // Bad state: No data for A at 36
     return super.test_undefinedGetter_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 6a12526..efa9d7a 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -1314,6 +1314,18 @@
     verify([source]);
   }
 
+  test_constConstructorWithMixinWithField() async {
+    Source source = addSource(r'''
+class M {
+}
+class A extends Object with M {
+  const A();
+}''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_constConstructorWithNonConstSuper_explicit() async {
     Source source = addSource(r'''
 class A {
@@ -1368,19 +1380,6 @@
     verify([source]);
   }
 
-  test_constConstructorWithNonFinalField_mixin() async {
-    Source source = addSource(r'''
-class A {
-  a() {}
-}
-class B extends Object with A {
-  const B();
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN]);
-    verify([source]);
-  }
-
   test_constConstructorWithNonFinalField_static() async {
     Source source = addSource(r'''
 class A {
@@ -2907,6 +2906,12 @@
     assertNoErrors(source);
   }
 
+  test_integerLiteralOutOfRange_negative_small() async {
+    Source source = addSource('int x = -42;');
+    await computeAnalysisResult(source);
+    assertErrors(source);
+  }
+
   test_integerLiteralOutOfRange_negative_valid() async {
     Source source = addSource('int x = -9223372036854775808;');
     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 b3fe456..f8e4ba4 100644
--- a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
@@ -71,20 +71,6 @@
         .test_deprecatedAnnotationUse_namedParameter_inNestedLocalFunction();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedMemberUse_inDeprecatedClass() async {
-    await super.test_deprecatedMemberUse_inDeprecatedClass();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedMemberUse_inDeprecatedFunction() async {
-    await super.test_deprecatedMemberUse_inDeprecatedFunction();
-  }
-
   @failingTest
   @override
   @potentialAnalyzerProblem
@@ -96,27 +82,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedMemberUse_inDeprecatedMethod() async {
-    await super.test_deprecatedMemberUse_inDeprecatedMethod();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedMemberUse_inDeprecatedMethod_inDeprecatedClass() async {
-    await super.test_deprecatedMemberUse_inDeprecatedMethod_inDeprecatedClass();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_missingReturn_alwaysThrows() async {
-    await super.test_missingReturn_alwaysThrows();
-  }
-
-  @override
-  @failingTest
   test_overrideOnNonOverridingField_inInterface() {
     // Expected 1 errors of type
     // StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
@@ -133,76 +98,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingGetter_inInterface() async {
-    await super.test_overrideOnNonOverridingGetter_inInterface();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingGetter_inSuperclass() async {
-    await super.test_overrideOnNonOverridingGetter_inSuperclass();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingMethod_inInterface() async {
-    await super.test_overrideOnNonOverridingMethod_inInterface();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingMethod_inSuperclass() async {
-    await super.test_overrideOnNonOverridingMethod_inSuperclass();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingMethod_inSuperclass_abstract() async {
-    await super.test_overrideOnNonOverridingMethod_inSuperclass_abstract();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingSetter_inInterface() async {
-    await super.test_overrideOnNonOverridingSetter_inInterface();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingSetter_inSuperclass() async {
-    await super.test_overrideOnNonOverridingSetter_inSuperclass();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_proxy_annotation_prefixed() async {
-    await super.test_proxy_annotation_prefixed();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_proxy_annotation_prefixed2() async {
-    await super.test_proxy_annotation_prefixed2();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_proxy_annotation_prefixed3() async {
-    await super.test_proxy_annotation_prefixed3();
-  }
-
-  @override
-  @failingTest
   @notForDart2
   test_undefinedOperator_binaryExpression_inSubtype() async {
     await super.test_undefinedOperator_binaryExpression_inSubtype();
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 3c85986..18d1d5a 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -4451,16 +4451,11 @@
     // It doesn't try to advance past the invalid token `!` to find the
     // valid `>`. If it did we'd get less cascading errors, at least for this
     // particular example.
-    createParser('void m<E, hello!>() {}', expectedEndOffset: 6);
+    createParser('void m<E, hello!>() {}');
     ClassMember member = parser.parseClassMember('C');
     expectNotNullIfNoErrors(member);
     listener.assertErrors(usingFastaParser
-        ? [
-            // TODO(danrubel): Improve recovery
-            expectedError(
-                ParserErrorCode.MISSING_METHOD_PARAMETERS, 5, 1) /*<*/,
-            expectedError(ParserErrorCode.MISSING_FUNCTION_BODY, 6, 1) /*E*/
-          ]
+        ? [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 15, 1)]
         : [
             expectedError(ParserErrorCode.EXPECTED_TOKEN, 0, 0) /*>*/,
             expectedError(ParserErrorCode.MISSING_IDENTIFIER, 0, 0),
@@ -4470,10 +4465,8 @@
           ]);
     expect(member, new isInstanceOf<MethodDeclaration>());
     MethodDeclaration method = member;
-    if (!usingFastaParser) {
-      expect(method.typeParameters.toString(), '<E, hello>',
-          reason: 'parser recovers what it can');
-    }
+    expect(method.typeParameters.toString(), '<E, hello>',
+        reason: 'parser recovers what it can');
   }
 
   void test_missingAssignableSelector_identifiersAssigned() {
@@ -6758,6 +6751,17 @@
     expect(literal.typeArguments, isNotNull);
   }
 
+  void test_parseConstExpression_mapLiteral_typed_missingGt() {
+    Expression expression = parseExpression('const <A, B {}',
+        errors: [expectedError(ParserErrorCode.EXPECTED_TOKEN, 12, 1)]);
+    expect(expression, isNotNull);
+    var literal = expression as MapLiteral;
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.entries, hasLength(0));
+    expect(literal.rightBracket, isNotNull);
+    expect(literal.typeArguments, isNotNull);
+  }
+
   void test_parseConstExpression_mapLiteral_typed_genericComment() {
     enableGenericMethodComments = true;
     Expression expression = parseConstExpression('const /*<A, B>*/ {}');
@@ -6836,6 +6840,17 @@
     expect(binaryExpression.rightOperand, isNotNull);
   }
 
+  void test_parseExpression_constAndTypeParameters() {
+    Expression expression = parseExpression('const <E>',
+        codes: usingFastaParser
+            ? [
+                // TODO(danrubel): Improve this error message.
+                ParserErrorCode.EXPECTED_TOKEN
+              ]
+            : [ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL]);
+    expect(expression, isNotNull);
+  }
+
   void test_parseExpression_function_async() {
     Expression expression = parseExpression('() async {}');
     var functionExpression = expression as FunctionExpression;
@@ -7022,6 +7037,46 @@
     expect((expression.body as ExpressionFunctionBody).semicolon, isNull);
   }
 
+  void test_parseFunctionExpression_functionInPlaceOfTypeName() {
+    Expression expression = parseExpression('<test(' ', (){});>[0, 1, 2]',
+        codes: usingFastaParser
+            ? [
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.UNEXPECTED_TOKEN,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.MISSING_FUNCTION_BODY,
+              ]
+            : [
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL,
+              ]);
+    expect(expression, isNotNull);
+  }
+
+  void test_parseFunctionExpression_constAndTypeParameters2() {
+    FunctionExpression expression =
+        parseFunctionExpression('const <E>(E i) => i++');
+    expect(expression, isNotNull);
+    assertErrorsWithCodes(usingFastaParser
+        ? [ParserErrorCode.UNEXPECTED_TOKEN]
+        : [
+            ParserErrorCode.EXPECTED_TOKEN,
+            ParserErrorCode.EXPECTED_TOKEN,
+            ParserErrorCode.MISSING_IDENTIFIER,
+            ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR,
+            ParserErrorCode.MISSING_CLOSING_PARENTHESIS,
+          ]);
+    expect(expression.body, isNotNull);
+    if (usingFastaParser) {
+      expect(expression.typeParameters, isNotNull);
+      expect(expression.parameters, isNotNull);
+      expect((expression.body as ExpressionFunctionBody).semicolon, isNull);
+    }
+  }
+
   void test_parseFunctionExpression_typeParameterComments() {
     enableGenericMethodComments = true;
     FunctionExpression expression =
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 b0bd5c2..a493d63 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
@@ -64,13 +64,6 @@
 
   @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();
@@ -261,16 +254,23 @@
 
   @override
   @failingTest
-  test_invalidAssignment_dynamic() async {
-    // Bad state: No reference information for dynamic at 11
-    await super.test_invalidAssignment_dynamic();
+  test_invalidAssignment_defaultValue_named() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t1 = 0 in let ...
+    await super.test_invalidAssignment_defaultValue_named();
   }
 
   @override
   @failingTest
-  test_invocationOfNonFunction_class() async {
-    // Expected 1 errors of type StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, found 0
-    await super.test_invocationOfNonFunction_class();
+  test_invalidAssignment_defaultValue_optional() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t2 = 0 in let ...
+    await super.test_invalidAssignment_defaultValue_optional();
+  }
+
+  @override
+  @failingTest
+  test_invalidAssignment_dynamic() async {
+    // Bad state: No reference information for dynamic at 11
+    await super.test_invalidAssignment_dynamic();
   }
 
   @override
@@ -705,13 +705,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_undefinedGetter_proxy_annotation_fakeProxy() async {
-    await super.test_undefinedGetter_proxy_annotation_fakeProxy();
-  }
-
-  @override
-  @failingTest
   test_undefinedGetter_static() async {
     // Bad state: No reference information for A at 19
     await super.test_undefinedGetter_static();
@@ -803,13 +796,6 @@
 
   @override
   @failingTest
-  test_undefinedMethodWithConstructor() async {
-    // Bad state: No reference information for C at 35
-    await super.test_undefinedMethodWithConstructor();
-  }
-
-  @override
-  @failingTest
   test_undefinedOperator_indexBoth() async {
     // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_OPERATOR, found 0
     await super.test_undefinedOperator_indexBoth();
diff --git a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
index 0e94294..8f9548d 100644
--- a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
@@ -65,13 +65,6 @@
 
   @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();
@@ -107,41 +100,6 @@
 
   @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();
@@ -273,13 +231,6 @@
 
   @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();
@@ -294,34 +245,6 @@
 
   @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();
@@ -342,48 +265,6 @@
     // 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
@@ -413,13 +294,6 @@
 
   @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();
@@ -573,13 +447,6 @@
 
   @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
@@ -653,13 +520,6 @@
 
   @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();
   }
@@ -697,12 +557,4 @@
 
   @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/dart/analysis/driver_kernel_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
index 4bb1b75..5494d3e 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
@@ -31,6 +31,8 @@
   @override
   bool get useCFE => true;
 
+//  @failingTest
+//  @potentialAnalyzerProblem
   @override
   test_asyncChangesDuringAnalysis_getErrors() async {
     // TODO(brianwilkerson) Re-enable this test. It was disabled because it
@@ -54,7 +56,7 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33642')
   test_const_annotation_notConstConstructor() async {
     await super.test_const_annotation_notConstConstructor();
   }
@@ -66,27 +68,6 @@
     await super.test_const_annotation_withArgs();
   }
 
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_const_annotation_withoutArgs() async {
-    await super.test_const_annotation_withoutArgs();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_const_circular_reference() async {
-    await super.test_const_circular_reference();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_const_dependency_sameUnit() async {
-    await super.test_const_dependency_sameUnit();
-  }
-
   @failingTest
   @potentialAnalyzerProblem
   @override
@@ -94,13 +75,6 @@
     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
@@ -108,13 +82,6 @@
     await super.test_const_implicitSuperConstructorInvocation();
   }
 
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_const_simple_topLevelVariable() async {
-    await super.test_const_simple_topLevelVariable();
-  }
-
   @failingTest
   @potentialAnalyzerProblem
   @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 ce897ed..c912d36 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
@@ -23,43 +23,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_annotation() async {
-    await super.test_annotation();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_annotation_constructor_withNestedConstructorInvocation() async {
-    await super.test_annotation_constructor_withNestedConstructorInvocation();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_annotation_kind_reference() async {
-    await super.test_annotation_kind_reference();
-  }
-
-  @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
@@ -68,14 +31,6 @@
 
   @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();
@@ -84,14 +39,6 @@
   @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();
@@ -114,14 +61,6 @@
     // 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/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index dc7cb05..033035c 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -128,77 +128,48 @@
     }
   }
 
-  test_annotation_constructor_withNestedConstructorInvocation() async {
-    addTestFile('''
-class C {
-  const C();
+  test_annotation_prefixed_classField() async {
+    var a = _p('/test/lib/a.dart');
+    provider.newFile(a, r'''
+class A {
+  static const a = 1;
 }
-class D {
-  final C c;
-  const D(this.c);
-}
-@D(const C())
-f() {}
 ''');
-    var result = await driver.getResult(testFile);
-    var elementC = AstFinder.getClass(result.unit, 'C').element;
-    var constructorC = elementC.constructors[0];
-    var elementD = AstFinder.getClass(result.unit, 'D').element;
-    var constructorD = elementD.constructors[0];
-    var atD = AstFinder.getTopLevelFunction(result.unit, 'f').metadata[0];
-    InstanceCreationExpression constC = atD.arguments.arguments[0];
+    addTestFile(r'''
+import 'a.dart' as p;
 
-    expect(atD.name.staticElement, elementD);
-    expect(atD.element, constructorD);
-
-    expect(constC.staticElement, constructorC);
-    expect(constC.staticType, elementC.type);
-
-    expect(constC.constructorName.staticElement, constructorC);
-    expect(constC.constructorName.type.type, elementC.type);
-  }
-
-  test_annotation_kind_reference() async {
-    String content = r'''
-const annotation_1 = 1;
-const annotation_2 = 1;
-@annotation_1
-@annotation_2
-void main() {
-  print(42);
-}
-''';
-    addTestFile(content);
-
+@p.A.a
+main() {}
+''');
     AnalysisResult result = await driver.getResult(testFile);
-    var typeProvider = result.unit.element.context.typeProvider;
+    CompilationUnit unit = result.unit;
+    var typeProvider = unit.element.context.typeProvider;
 
-    TopLevelVariableDeclaration declaration_1 = result.unit.declarations[0];
-    VariableDeclaration variable_1 = declaration_1.variables.variables[0];
-    TopLevelVariableElement element_1 = variable_1.element;
+    ImportElement aImport = unit.element.library.imports[0];
+    PrefixElement aPrefix = aImport.prefix;
+    LibraryElement aLibrary = aImport.importedLibrary;
 
-    TopLevelVariableDeclaration declaration_2 = result.unit.declarations[1];
-    VariableDeclaration variable_2 = declaration_2.variables.variables[0];
-    TopLevelVariableElement element_2 = variable_2.element;
+    CompilationUnitElement aUnitElement = aLibrary.definingCompilationUnit;
+    ClassElement aClass = aUnitElement.getType('A');
+    var aGetter = aClass.getField('a').getter;
 
-    FunctionDeclaration main = result.unit.declarations[2];
+    Annotation annotation = unit.declarations[0].metadata.single;
+    expect(annotation.element, same(aGetter));
+    PrefixedIdentifier prefixed = annotation.name;
 
-    Annotation annotation_1 = main.metadata[0];
-    expect(annotation_1.element, same(element_1.getter));
+    expect(prefixed.prefix.staticElement, same(aPrefix));
+    expect(prefixed.prefix.staticType, isNull);
 
-    SimpleIdentifier identifier_1 = annotation_1.name;
-    expect(identifier_1.staticElement, same(element_1.getter));
-    expect(identifier_1.staticType, typeProvider.intType);
+    expect(prefixed.identifier.staticElement, same(aClass));
+    expect(prefixed.prefix.staticType, isNull);
 
-    Annotation annotation_2 = main.metadata[1];
-    expect(annotation_2.element, same(element_2.getter));
+    expect(annotation.constructorName.staticElement, aGetter);
+    expect(annotation.constructorName.staticType, typeProvider.intType);
 
-    SimpleIdentifier identifier_2 = annotation_2.name;
-    expect(identifier_2.staticElement, same(element_2.getter));
-    expect(identifier_2.staticType, typeProvider.intType);
+    expect(annotation.arguments, isNull);
   }
 
-  test_annotation_prefixed_classConstructor() async {
+  test_annotation_prefixed_constructor() async {
     var a = _p('/test/lib/a.dart');
     provider.newFile(a, r'''
 class A {
@@ -240,7 +211,7 @@
     _assertArgumentToParameter(arguments[1], parameters[1]);
   }
 
-  test_annotation_prefixed_classConstructorNamed() async {
+  test_annotation_prefixed_constructor_named() async {
     var a = _p('/test/lib/a.dart');
     provider.newFile(a, r'''
 class A {
@@ -284,47 +255,6 @@
     _assertArgumentToParameter(arguments[1], parameters[1]);
   }
 
-  test_annotation_prefixed_classField() async {
-    var a = _p('/test/lib/a.dart');
-    provider.newFile(a, r'''
-class A {
-  static const a = 1;
-}
-''');
-    addTestFile(r'''
-import 'a.dart' as p;
-
-@p.A.a
-main() {}
-''');
-    AnalysisResult result = await driver.getResult(testFile);
-    CompilationUnit unit = result.unit;
-    var typeProvider = unit.element.context.typeProvider;
-
-    ImportElement aImport = unit.element.library.imports[0];
-    PrefixElement aPrefix = aImport.prefix;
-    LibraryElement aLibrary = aImport.importedLibrary;
-
-    CompilationUnitElement aUnitElement = aLibrary.definingCompilationUnit;
-    ClassElement aClass = aUnitElement.getType('A');
-    var aGetter = aClass.getField('a').getter;
-
-    Annotation annotation = unit.declarations[0].metadata.single;
-    expect(annotation.element, same(aGetter));
-    PrefixedIdentifier prefixed = annotation.name;
-
-    expect(prefixed.prefix.staticElement, same(aPrefix));
-    expect(prefixed.prefix.staticType, isNull);
-
-    expect(prefixed.identifier.staticElement, same(aClass));
-    expect(prefixed.prefix.staticType, isNull);
-
-    expect(annotation.constructorName.staticElement, aGetter);
-    expect(annotation.constructorName.staticType, typeProvider.intType);
-
-    expect(annotation.arguments, isNull);
-  }
-
   test_annotation_prefixed_topLevelVariable() async {
     var a = _p('/test/lib/a.dart');
     provider.newFile(a, r'''
@@ -360,6 +290,140 @@
     expect(annotation.arguments, isNull);
   }
 
+  test_annotation_unprefixed_constructor() async {
+    addTestFile(r'''
+@A(1, b: 2)
+main() {}
+
+class A {
+  const A(int a, {int b});
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    CompilationUnit unit = result.unit;
+    CompilationUnitElement unitElement = unit.element;
+
+    ClassElement aClass = unitElement.getType('A');
+    ConstructorElement constructor = aClass.unnamedConstructor;
+
+    Annotation annotation = unit.declarations[0].metadata.single;
+    expect(annotation.element, same(constructor));
+
+    SimpleIdentifier name = annotation.name;
+    expect(name.staticElement, same(aClass));
+
+    expect(annotation.constructorName, isNull);
+
+    var arguments = annotation.arguments.arguments;
+    var parameters = constructor.parameters;
+    _assertArgumentToParameter(arguments[0], parameters[0]);
+    _assertArgumentToParameter(arguments[1], parameters[1]);
+  }
+
+  test_annotation_unprefixed_constructor_named() async {
+    addTestFile(r'''
+@A.named(1, b: 2)
+main() {}
+
+class A {
+  const A.named(int a, {int b});
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    CompilationUnit unit = result.unit;
+    CompilationUnitElement unitElement = unit.element;
+
+    ClassElement aClass = unitElement.getType('A');
+    ConstructorElement constructor = aClass.constructors.single;
+
+    Annotation annotation = unit.declarations[0].metadata.single;
+    expect(annotation.element, same(constructor));
+    PrefixedIdentifier prefixed = annotation.name;
+
+    expect(prefixed.prefix.staticElement, same(aClass));
+    expect(prefixed.prefix.staticType, aClass.type);
+
+    expect(prefixed.identifier.staticElement, same(constructor));
+    expect(prefixed.identifier.staticType.toString(), '(int, {b: int}) → A');
+
+    expect(annotation.constructorName, isNull);
+
+    var arguments = annotation.arguments.arguments;
+    var parameters = constructor.parameters;
+    _assertArgumentToParameter(arguments[0], parameters[0]);
+    _assertArgumentToParameter(arguments[1], parameters[1]);
+  }
+
+  test_annotation_unprefixed_constructor_withNestedConstructorInvocation() async {
+    addTestFile('''
+class C {
+  const C();
+}
+class D {
+  final C c;
+  const D(this.c);
+}
+@D(const C())
+f() {}
+''');
+    var result = await driver.getResult(testFile);
+    var elementC = AstFinder.getClass(result.unit, 'C').element;
+    var constructorC = elementC.constructors[0];
+    var elementD = AstFinder.getClass(result.unit, 'D').element;
+    var constructorD = elementD.constructors[0];
+    var atD = AstFinder.getTopLevelFunction(result.unit, 'f').metadata[0];
+    InstanceCreationExpression constC = atD.arguments.arguments[0];
+
+    expect(atD.name.staticElement, elementD);
+    expect(atD.element, constructorD);
+
+    expect(constC.staticElement, constructorC);
+    expect(constC.staticType, elementC.type);
+
+    expect(constC.constructorName.staticElement, constructorC);
+    expect(constC.constructorName.type.type, elementC.type);
+  }
+
+  test_annotation_unprefixed_topLevelVariable() async {
+    String content = r'''
+const annotation_1 = 1;
+const annotation_2 = 1;
+@annotation_1
+@annotation_2
+void main() {
+  print(42);
+}
+''';
+    addTestFile(content);
+
+    AnalysisResult result = await driver.getResult(testFile);
+    var typeProvider = result.unit.element.context.typeProvider;
+
+    TopLevelVariableDeclaration declaration_1 = result.unit.declarations[0];
+    VariableDeclaration variable_1 = declaration_1.variables.variables[0];
+    TopLevelVariableElement element_1 = variable_1.element;
+
+    TopLevelVariableDeclaration declaration_2 = result.unit.declarations[1];
+    VariableDeclaration variable_2 = declaration_2.variables.variables[0];
+    TopLevelVariableElement element_2 = variable_2.element;
+
+    FunctionDeclaration main = result.unit.declarations[2];
+
+    Annotation annotation_1 = main.metadata[0];
+    expect(annotation_1.element, same(element_1.getter));
+
+    SimpleIdentifier identifier_1 = annotation_1.name;
+    expect(identifier_1.staticElement, same(element_1.getter));
+    expect(identifier_1.staticType, typeProvider.intType);
+
+    Annotation annotation_2 = main.metadata[1];
+    expect(annotation_2.element, same(element_2.getter));
+
+    SimpleIdentifier identifier_2 = annotation_2.name;
+    expect(identifier_2.staticElement, same(element_2.getter));
+    expect(identifier_2.staticType, typeProvider.intType);
+  }
+
   test_asExpression() async {
     String content = r'''
 void main() {
diff --git a/pkg/analyzer/test/src/fasta/recovery/invalid_code_test.dart b/pkg/analyzer/test/src/fasta/recovery/invalid_code_test.dart
index f080fb8..107fd21 100644
--- a/pkg/analyzer/test/src/fasta/recovery/invalid_code_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/invalid_code_test.dart
@@ -34,16 +34,44 @@
 ''', expectedErrorsInValidCode: [ParserErrorCode.MISSING_IDENTIFIER]);
   }
 
-  @failingTest
   void test_expressionInPlaceOfTypeName() {
     // https://github.com/dart-lang/sdk/issues/30370
     testRecovery('''
 f() {
   return <g('')>[0, 1, 2];
 }
-''', [], '''
+''', [ParserErrorCode.UNEXPECTED_TOKEN], '''
 f() {
-  return <_s_>[0, 1, 2];
+  return <g>[0, 1, 2];
+}
+''');
+  }
+
+  void test_expressionInPlaceOfTypeName2() {
+    // https://github.com/dart-lang/sdk/issues/30370
+    testRecovery('''
+f() {
+  return <test('', (){})>[0, 1, 2];
+}
+''', [ParserErrorCode.UNEXPECTED_TOKEN], '''
+f() {
+  return <test>[0, 1, 2];
+}
+''');
+  }
+
+  @failingTest
+  void test_functionInPlaceOfTypeName() {
+    // https://github.com/dart-lang/sdk/issues/30370
+    // TODO(danrubel): Improve recovery. Currently, the fasta scanner
+    // does not associate `<` with `>` in this situation.
+    testRecovery('''
+f() {
+  return <test('', (){});>[0, 1, 2];
+}
+''', [ParserErrorCode.UNEXPECTED_TOKEN], '''
+f() {
+  return _s_ < test('', (){}); _s_ > [0, 1, 2];
 }
 ''');
   }
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart
index dc875ff..ad6cb54 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart
@@ -12,23 +12,6 @@
 
 class LocalVariableTest extends PartialCodeTest {
   buildAll() {
-    List<String> allExceptEof = <String>[
-      'assert',
-      'block',
-      'break',
-      'continue',
-      'do',
-      'if',
-      'for',
-      'labeled',
-      'localFunctionNonVoid',
-      'localFunctionVoid',
-      'localVariable',
-      'switch',
-      'try',
-      'return',
-      'while'
-    ];
     buildTests(
         'local_variable',
         [
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart
index 76e6f1c..e4cfd56 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart
@@ -13,17 +13,6 @@
 
 class TopLevelVariableTest extends PartialCodeTest {
   buildAll() {
-    List<String> allExceptEof = <String>[
-      'class',
-      'typedef',
-      'functionVoid',
-      'functionNonVoid',
-      'var',
-      'const',
-      'final',
-      'getter',
-      'setter'
-    ];
     buildTests(
         'top_level_variable',
         [
diff --git a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
index f594ed6..359b16c 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
@@ -30,7 +30,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(ResynthesizeKernelStrongTest);
+    defineReflectiveTests(ResynthesizeTest_Kernel);
   });
 }
 
@@ -49,7 +49,7 @@
 }
 
 @reflectiveTest
-class ResynthesizeKernelStrongTest extends ResynthesizeTest {
+class ResynthesizeTest_Kernel extends ResynthesizeTest {
   static const DEBUG = false;
 
   final resourceProvider = new MemoryResourceProvider();
@@ -95,27 +95,6 @@
   }
 
   @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_class_constructor_fieldFormal_named_withDefault() async {
-    await super.test_class_constructor_fieldFormal_named_withDefault();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_class_constructor_fieldFormal_optional_withDefault() async {
-    await super.test_class_constructor_fieldFormal_optional_withDefault();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_class_field_const() async {
-    await super.test_class_field_const();
-  }
-
-  @override
   test_class_setter_invalid_named_parameter() async {
     var library = await checkLibrary('class C { void set x({a}) {} }');
     checkElementText(library, r'''
@@ -168,635 +147,6 @@
   test_const_constructor_inferred_args() =>
       super.test_const_constructor_inferred_args();
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_finalField_hasConstConstructor() async {
-    await super.test_const_finalField_hasConstConstructor();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invalid_field_const() async {
-    await super.test_const_invalid_field_const();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invalid_intLiteral() async {
-    await super.test_const_invalid_intLiteral();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invalid_topLevel() async {
-    await super.test_const_invalid_topLevel();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_generic_named() async {
-    await super.test_const_invokeConstructor_generic_named();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_generic_named_imported() async {
-    await super.test_const_invokeConstructor_generic_named_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_generic_named_imported_withPrefix() async {
-    return super
-        .test_const_invokeConstructor_generic_named_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_generic_noTypeArguments() async {
-    await super.test_const_invokeConstructor_generic_noTypeArguments();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_generic_unnamed() async {
-    await super.test_const_invokeConstructor_generic_unnamed();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_generic_unnamed_imported() async {
-    await super.test_const_invokeConstructor_generic_unnamed_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_generic_unnamed_imported_withPrefix() async {
-    return super
-        .test_const_invokeConstructor_generic_unnamed_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_named() async {
-    await super.test_const_invokeConstructor_named();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_named_imported() async {
-    await super.test_const_invokeConstructor_named_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_named_imported_withPrefix() async {
-    await super.test_const_invokeConstructor_named_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_named_unresolved() async {
-    await super.test_const_invokeConstructor_named_unresolved();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_named_unresolved2() async {
-    await super.test_const_invokeConstructor_named_unresolved2();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_named_unresolved3() async {
-    await super.test_const_invokeConstructor_named_unresolved3();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_named_unresolved4() async {
-    await super.test_const_invokeConstructor_named_unresolved4();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_named_unresolved5() async {
-    await super.test_const_invokeConstructor_named_unresolved5();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_named_unresolved6() async {
-    await super.test_const_invokeConstructor_named_unresolved6();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_unnamed() async {
-    await super.test_const_invokeConstructor_unnamed();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_unnamed_imported() async {
-    await super.test_const_invokeConstructor_unnamed_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_unnamed_imported_withPrefix() async {
-    await super.test_const_invokeConstructor_unnamed_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_unnamed_unresolved() async {
-    await super.test_const_invokeConstructor_unnamed_unresolved();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_unnamed_unresolved2() async {
-    await super.test_const_invokeConstructor_unnamed_unresolved2();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_unnamed_unresolved3() async {
-    await super.test_const_invokeConstructor_unnamed_unresolved3();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_length_ofClassConstField() async {
-    await super.test_const_length_ofClassConstField();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_length_ofClassConstField_imported() async {
-    await super.test_const_length_ofClassConstField_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_length_ofClassConstField_imported_withPrefix() async {
-    await super.test_const_length_ofClassConstField_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_length_ofStringLiteral() async {
-    await super.test_const_length_ofStringLiteral();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_length_ofTopLevelVariable() async {
-    await super.test_const_length_ofTopLevelVariable();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_length_ofTopLevelVariable_imported() async {
-    await super.test_const_length_ofTopLevelVariable_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_length_ofTopLevelVariable_imported_withPrefix() async {
-    await super.test_const_length_ofTopLevelVariable_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_length_staticMethod() async {
-    await super.test_const_length_staticMethod();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_list_inferredType() async {
-    await super.test_const_list_inferredType();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_map_inferredType() async {
-    await super.test_const_map_inferredType();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_parameterDefaultValue_initializingFormal_functionTyped() async {
-    return super
-        .test_const_parameterDefaultValue_initializingFormal_functionTyped();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_parameterDefaultValue_initializingFormal_named() async {
-    await super.test_const_parameterDefaultValue_initializingFormal_named();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_parameterDefaultValue_initializingFormal_positional() async {
-    return super
-        .test_const_parameterDefaultValue_initializingFormal_positional();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_parameterDefaultValue_normal() async {
-    await super.test_const_parameterDefaultValue_normal();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_staticField() async {
-    await super.test_const_reference_staticField();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_staticField_imported() async {
-    await super.test_const_reference_staticField_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_staticField_imported_withPrefix() async {
-    await super.test_const_reference_staticField_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_staticMethod() async {
-    await super.test_const_reference_staticMethod();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_staticMethod_imported() async {
-    await super.test_const_reference_staticMethod_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_staticMethod_imported_withPrefix() async {
-    await super.test_const_reference_staticMethod_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_topLevelFunction() async {
-    await super.test_const_reference_topLevelFunction();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_topLevelFunction_generic() async {
-    await super.test_const_reference_topLevelFunction_generic();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_topLevelFunction_imported() async {
-    await super.test_const_reference_topLevelFunction_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_topLevelFunction_imported_withPrefix() async {
-    await super.test_const_reference_topLevelFunction_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_topLevelVariable() async {
-    await super.test_const_reference_topLevelVariable();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_topLevelVariable_imported() async {
-    await super.test_const_reference_topLevelVariable_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_topLevelVariable_imported_withPrefix() async {
-    await super.test_const_reference_topLevelVariable_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_type() async {
-    await super.test_const_reference_type();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_type_imported() async {
-    await super.test_const_reference_type_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_type_imported_withPrefix() async {
-    await super.test_const_reference_type_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_unresolved_prefix0() async {
-    await super.test_const_reference_unresolved_prefix0();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_unresolved_prefix1() async {
-    await super.test_const_reference_unresolved_prefix1();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_unresolved_prefix2() async {
-    await super.test_const_reference_unresolved_prefix2();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_binary() async {
-    await super.test_const_topLevel_binary();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_conditional() async {
-    await super.test_const_topLevel_conditional();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_identical() async {
-    await super.test_const_topLevel_identical();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_ifNull() async {
-    await super.test_const_topLevel_ifNull();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_literal() async {
-    await super.test_const_topLevel_literal();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_parenthesis() async {
-    await super.test_const_topLevel_parenthesis();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_prefix() async {
-    await super.test_const_topLevel_prefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_super() async {
-    await super.test_const_topLevel_super();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_this() async {
-    await super.test_const_topLevel_this();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_typedList() async {
-    await super.test_const_topLevel_typedList();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_typedList_imported() async {
-    await super.test_const_topLevel_typedList_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_typedList_importedWithPrefix() async {
-    await super.test_const_topLevel_typedList_importedWithPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_typedList_typedefArgument() async {
-    await super.test_const_topLevel_typedList_typedefArgument();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_typedMap() async {
-    await super.test_const_topLevel_typedMap();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_untypedList() async {
-    await super.test_const_topLevel_untypedList();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_untypedMap() async {
-    await super.test_const_topLevel_untypedMap();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constExpr_pushReference_field_simpleIdentifier() async {
-    await super.test_constExpr_pushReference_field_simpleIdentifier();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constExpr_pushReference_staticMethod_simpleIdentifier() async {
-    await super.test_constExpr_pushReference_staticMethod_simpleIdentifier();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_assertInvocation() async {
-    await super.test_constructor_initializers_assertInvocation();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_assertInvocation_message() async {
-    await super.test_constructor_initializers_assertInvocation_message();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_field() async {
-    await super.test_constructor_initializers_field();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_field_notConst() async {
-    await super.test_constructor_initializers_field_notConst();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_field_withParameter() async {
-    await super.test_constructor_initializers_field_withParameter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_superInvocation_named() async {
-    await super.test_constructor_initializers_superInvocation_named();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_superInvocation_named_underscore() async {
-    return super
-        .test_constructor_initializers_superInvocation_named_underscore();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_superInvocation_namedExpression() async {
-    return super
-        .test_constructor_initializers_superInvocation_namedExpression();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_superInvocation_unnamed() async {
-    await super.test_constructor_initializers_superInvocation_unnamed();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_thisInvocation_named() async {
-    await super.test_constructor_initializers_thisInvocation_named();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_thisInvocation_namedExpression() async {
-    await super.test_constructor_initializers_thisInvocation_namedExpression();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_thisInvocation_unnamed() async {
-    await super.test_constructor_initializers_thisInvocation_unnamed();
-  }
-
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30258')
   test_constructor_redirected_factory_named_generic() async {
@@ -833,83 +183,6 @@
     await super.test_constructor_redirected_factory_unnamed_prefixed_generic();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_redirected_thisInvocation_named() async {
-    await super.test_constructor_redirected_thisInvocation_named();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_redirected_thisInvocation_named_generic() async {
-    await super.test_constructor_redirected_thisInvocation_named_generic();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_redirected_thisInvocation_unnamed() async {
-    await super.test_constructor_redirected_thisInvocation_unnamed();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_redirected_thisInvocation_unnamed_generic() async {
-    await super.test_constructor_redirected_thisInvocation_unnamed_generic();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_withCycles_const() async {
-    await super.test_constructor_withCycles_const();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_defaultValue_refersToGenericClass_constructor() async {
-    await super.test_defaultValue_refersToGenericClass_constructor();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_defaultValue_refersToGenericClass_constructor2() async {
-    await super.test_defaultValue_refersToGenericClass_constructor2();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_defaultValue_refersToGenericClass_functionG() async {
-    await super.test_defaultValue_refersToGenericClass_functionG();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_defaultValue_refersToGenericClass_methodG() async {
-    await super.test_defaultValue_refersToGenericClass_methodG();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_defaultValue_refersToGenericClass_methodG_classG() async {
-    await super.test_defaultValue_refersToGenericClass_methodG_classG();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_defaultValue_refersToGenericClass_methodNG() async {
-    await super.test_defaultValue_refersToGenericClass_methodNG();
-  }
-
   @failingTest
   @notForDart2
   test_export_configurations_useFirst() async {
@@ -928,27 +201,6 @@
     await super.test_exportImport_configurations_useFirst();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_field_propagatedType_const_noDep() async {
-    await super.test_field_propagatedType_const_noDep();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_function_async() async {
-    await super.test_function_async();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_function_asyncStar() async {
-    await super.test_function_asyncStar();
-  }
-
   @failingTest
   @override
   test_futureOr() async {
@@ -1001,20 +253,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_infer_generic_typedef_simple() async {
-    await super.test_infer_generic_typedef_simple();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_instantiateToBounds_functionTypeAlias_simple() async {
-    await super.test_instantiateToBounds_functionTypeAlias_simple();
-  }
-
-  @override
-  @failingTest
   test_invalid_annotation_prefixed_constructor() {
     return super.test_invalid_annotation_prefixed_constructor();
   }
@@ -1049,125 +287,18 @@
     await super.test_invalidUri_part_emptyUri();
   }
 
-  @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  @potentialAnalyzerProblem
   test_invalidUris() async {
     await super.test_invalidUris();
   }
 
-  @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_member_function_async() async {
-    await super.test_member_function_async();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_member_function_asyncStar() async {
-    await super.test_member_function_asyncStar();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_member_function_syncStar() async {
-    await super.test_member_function_syncStar();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_classDeclaration() async {
-    await super.test_metadata_classDeclaration();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_classTypeAlias() async {
-    await super.test_metadata_classTypeAlias();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_constructor_call_named() async {
-    await super.test_metadata_constructor_call_named();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_constructor_call_named_prefixed() async {
-    await super.test_metadata_constructor_call_named_prefixed();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_constructor_call_unnamed() async {
-    await super.test_metadata_constructor_call_unnamed();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_constructor_call_unnamed_prefixed() async {
-    await super.test_metadata_constructor_call_unnamed_prefixed();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_constructor_call_with_args() async {
-    await super.test_metadata_constructor_call_with_args();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_constructorDeclaration_named() async {
-    await super.test_metadata_constructorDeclaration_named();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_constructorDeclaration_unnamed() async {
-    await super.test_metadata_constructorDeclaration_unnamed();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  @potentialAnalyzerProblem
   test_metadata_enumConstantDeclaration() async {
     await super.test_metadata_enumConstantDeclaration();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_enumDeclaration() async {
-    await super.test_metadata_enumDeclaration();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_exportDirective() async {
-    await super.test_metadata_exportDirective();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_fieldDeclaration() async {
-    await super.test_metadata_fieldDeclaration();
-  }
-
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
   test_metadata_fieldFormalParameter() async {
@@ -1180,34 +311,6 @@
     await super.test_metadata_fieldFormalParameter_withDefault();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_functionDeclaration_function() async {
-    await super.test_metadata_functionDeclaration_function();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_functionDeclaration_getter() async {
-    await super.test_metadata_functionDeclaration_getter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_functionDeclaration_setter() async {
-    await super.test_metadata_functionDeclaration_setter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_functionTypeAlias() async {
-    await super.test_metadata_functionTypeAlias();
-  }
-
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
   test_metadata_functionTypedFormalParameter() async {
@@ -1220,62 +323,6 @@
     await super.test_metadata_functionTypedFormalParameter_withDefault();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_importDirective() async {
-    await super.test_metadata_importDirective();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_invalid_classDeclaration() async {
-    await super.test_metadata_invalid_classDeclaration();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_libraryDirective() async {
-    await super.test_metadata_libraryDirective();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_methodDeclaration_getter() async {
-    await super.test_metadata_methodDeclaration_getter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_methodDeclaration_method() async {
-    await super.test_metadata_methodDeclaration_method();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_methodDeclaration_setter() async {
-    await super.test_metadata_methodDeclaration_setter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_partDirective() async {
-    await super.test_metadata_partDirective();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_prefixed_variable() async {
-    await super.test_metadata_prefixed_variable();
-  }
-
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
   test_metadata_simpleFormalParameter() async {
@@ -1288,41 +335,6 @@
     await super.test_metadata_simpleFormalParameter_withDefault();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_topLevelVariableDeclaration() async {
-    await super.test_metadata_topLevelVariableDeclaration();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_typeParameter_ofClass() async {
-    await super.test_metadata_typeParameter_ofClass();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_typeParameter_ofClassTypeAlias() async {
-    await super.test_metadata_typeParameter_ofClassTypeAlias();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_typeParameter_ofFunction() async {
-    await super.test_metadata_typeParameter_ofFunction();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_typeParameter_ofTypedef() async {
-    await super.test_metadata_typeParameter_ofTypedef();
-  }
-
   @failingTest
   @notForDart2
   test_parameter_checked() async {
@@ -1337,59 +349,16 @@
     await super.test_parameter_checked_inherited();
   }
 
-  @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_parameterTypeNotInferred_constructor() async {
-    await super.test_parameterTypeNotInferred_constructor();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_parameterTypeNotInferred_initializingFormal() async {
-    await super.test_parameterTypeNotInferred_initializingFormal();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_parameterTypeNotInferred_staticMethod() async {
-    await super.test_parameterTypeNotInferred_staticMethod();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_parameterTypeNotInferred_topLevelFunction() async {
-    await super.test_parameterTypeNotInferred_topLevelFunction();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  @potentialAnalyzerProblem
   test_setter_inferred_type_conflictingInheritance() async {
     await super.test_setter_inferred_type_conflictingInheritance();
   }
 
-  @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_type_reference_to_typedef_with_type_arguments() async {
-    await super.test_type_reference_to_typedef_with_type_arguments();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_type_reference_to_typedef_with_type_arguments_implicit() async {
-    await super.test_type_reference_to_typedef_with_type_arguments_implicit();
-  }
-
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/31711')
-  test_typedef_generic_asFieldType() async {
-    await super.test_typedef_generic_asFieldType();
+  @potentialAnalyzerProblem
+  test_type_inference_based_on_loadLibrary() async {
+    await super.test_type_inference_based_on_loadLibrary();
   }
 
   @failingTest
@@ -1407,28 +376,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_unresolved_annotation_instanceCreation_argument_this() async {
-    await super.test_unresolved_annotation_instanceCreation_argument_this();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_unresolved_annotation_namedConstructorCall_noClass() async {
-    await super.test_unresolved_annotation_namedConstructorCall_noClass();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_unresolved_annotation_namedConstructorCall_noConstructor() async {
-    return super
-        .test_unresolved_annotation_namedConstructorCall_noConstructor();
-  }
-
-  @override
-  @failingTest
   test_unresolved_annotation_prefixedIdentifier_badPrefix() {
     return super.test_unresolved_annotation_prefixedIdentifier_badPrefix();
   }
@@ -1441,71 +388,10 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_unresolved_annotation_prefixedNamedConstructorCall_badPrefix() async {
-    return super
-        .test_unresolved_annotation_prefixedNamedConstructorCall_badPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_unresolved_annotation_prefixedNamedConstructorCall_noClass() async {
-    return super
-        .test_unresolved_annotation_prefixedNamedConstructorCall_noClass();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_unresolved_annotation_prefixedNamedConstructorCall_noConstructor() async {
-    return super
-        .test_unresolved_annotation_prefixedNamedConstructorCall_noConstructor();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_unresolved_annotation_prefixedUnnamedConstructorCall_badPrefix() async {
-    return super
-        .test_unresolved_annotation_prefixedUnnamedConstructorCall_badPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_unresolved_annotation_prefixedUnnamedConstructorCall_noClass() async {
-    return super
-        .test_unresolved_annotation_prefixedUnnamedConstructorCall_noClass();
-  }
-
-  @override
-  @failingTest
   test_unresolved_annotation_simpleIdentifier() {
     return super.test_unresolved_annotation_simpleIdentifier();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_unresolved_annotation_unnamedConstructorCall_noClass() async {
-    await super.test_unresolved_annotation_unnamedConstructorCall_noClass();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_variable_const() async {
-    await super.test_variable_const();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_variable_propagatedType_const_noDep() async {
-    await super.test_variable_propagatedType_const_noDep();
-  }
-
   Future<KernelResynthesizer> _createResynthesizer(Uri testUri) async {
     var logger = new PerformanceLog(null);
     var byteStore = new MemoryByteStore();
diff --git a/pkg/analyzer/tool/generate_files b/pkg/analyzer/tool/generate_files
index 0542717..0dbecaf 100755
--- a/pkg/analyzer/tool/generate_files
+++ b/pkg/analyzer/tool/generate_files
@@ -39,7 +39,7 @@
 DART="${BIN_DIR}/dart"
 
 declare -a VM_OPTIONS
-VM_OPTIONS+=("--checked")
+VM_OPTIONS+=("--enable-asserts")
 VM_OPTIONS+=("--packages=${ROOT_DIR}/.packages")
 
 cd "${SCRIPT_DIR}"
diff --git a/pkg/analyzer_plugin/tool/spec/generate_files b/pkg/analyzer_plugin/tool/spec/generate_files
index df2802d1..0651cb2 100755
--- a/pkg/analyzer_plugin/tool/spec/generate_files
+++ b/pkg/analyzer_plugin/tool/spec/generate_files
@@ -54,7 +54,7 @@
 DART="${BUILD_DIR}/dart-sdk/bin/dart"
 
 declare -a VM_OPTIONS
-VM_OPTIONS+=("--checked")
+VM_OPTIONS+=("--enable-asserts")
 VM_OPTIONS+=("--packages=${PKG_FILE}")
 
 cd "${SCRIPT_DIR}"
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index a06b868..fe5a7c0 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -438,7 +438,8 @@
 
   if (checkedMode && strongMode) {
     checkedMode = false;
-    hints.add("Option '${Flags.enableCheckedMode}' is not needed in Dart 2.0.");
+    hints.add("Option '${Flags.enableCheckedMode}' is not needed in Dart 2.0. "
+        "To enable assertions use '${Flags.enableAsserts}' instead.");
   }
 
   if (trustTypeAnnotations && strongMode) {
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index 467d61b..54daa5c 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -1073,11 +1073,13 @@
   /// this current set. This should only be called from [ImportSetLattice],
   /// since it is where we preserve this invariant.
   ImportSet _add(_DeferredImport import) {
-    return _transitions.putIfAbsent(import, () {
-      var result = new ImportSet(new List.from(_imports)..add(import));
+    ImportSet result = _transitions[import];
+    if (result == null) {
+      result = new ImportSet(new List.from(_imports)..add(import));
       result._transitions[import] = result;
-      return result;
-    });
+      _transitions[import] = result;
+    }
+    return result;
   }
 
   String toString() {
diff --git a/pkg/compiler/lib/src/frontend_strategy.dart b/pkg/compiler/lib/src/frontend_strategy.dart
index 45f1261..f6b8293 100644
--- a/pkg/compiler/lib/src/frontend_strategy.dart
+++ b/pkg/compiler/lib/src/frontend_strategy.dart
@@ -23,7 +23,7 @@
 import 'library_loader.dart';
 import 'native/enqueue.dart' show NativeResolutionEnqueuer;
 import 'native/resolver.dart';
-import 'universe/class_hierarchy.dart';
+import 'universe/class_hierarchy_builder.dart';
 import 'universe/world_builder.dart';
 import 'universe/world_impact.dart';
 
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
index 5b45c23..74e9360 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
@@ -1207,8 +1207,7 @@
       // Put the other operators in buckets by size, later to be added in
       // size order.
       int size = computeSize(element);
-      Set<MemberEntity> set =
-          methodSizes.putIfAbsent(size, () => new Setlet<MemberEntity>());
+      Set<MemberEntity> set = methodSizes[size] ??= new Setlet<MemberEntity>();
       set.add(element);
     });
     return methodSizes;
diff --git a/pkg/compiler/lib/src/inferrer/type_system.dart b/pkg/compiler/lib/src/inferrer/type_system.dart
index b5c8895..6fa9191 100644
--- a/pkg/compiler/lib/src/inferrer/type_system.dart
+++ b/pkg/compiler/lib/src/inferrer/type_system.dart
@@ -398,12 +398,14 @@
   MemberTypeInformation getInferredTypeOfMember(MemberEntity member) {
     assert(!member.isAbstract,
         failedAt(member, "Unexpected abstract member $member."));
-    return memberTypeInformations.putIfAbsent(member, () {
-      MemberTypeInformation typeInformation =
-          strategy.createMemberTypeInformation(_abstractValueDomain, member);
-      _orderedTypeInformations.add(typeInformation);
-      return typeInformation;
-    });
+    return memberTypeInformations[member] ??= _getInferredTypeOfMember(member);
+  }
+
+  MemberTypeInformation _getInferredTypeOfMember(MemberEntity member) {
+    MemberTypeInformation typeInformation =
+        strategy.createMemberTypeInformation(_abstractValueDomain, member);
+    _orderedTypeInformations.add(typeInformation);
+    return typeInformation;
   }
 
   /**
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
index 7311eb2..644cfd2 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
@@ -334,50 +334,23 @@
     assert(TypeMask.assertIsNormalized(this, closedWorld));
     assert(TypeMask.assertIsNormalized(other, closedWorld));
     FlatTypeMask flatOther = other;
-
-    ClassEntity otherBase = flatOther.base;
-
-    bool includeNull = isNullable && flatOther.isNullable;
-
-    TypeMask emptyOrNull() {
-      return includeNull
-          ? closedWorld.abstractValueDomain.nullType
-          : closedWorld.abstractValueDomain.emptyType;
+    if (isEmptyOrNull) {
+      return flatOther.isNullable ? this : nonNullable();
+    } else if (flatOther.isEmptyOrNull) {
+      return isNullable ? flatOther : other.nonNullable();
+    } else if (base == flatOther.base) {
+      return intersectionSame(flatOther, closedWorld);
+    } else if (closedWorld.isSubclassOf(flatOther.base, base)) {
+      return intersectionStrictSubclass(flatOther, closedWorld);
+    } else if (closedWorld.isSubclassOf(base, flatOther.base)) {
+      return flatOther.intersectionStrictSubclass(this, closedWorld);
+    } else if (closedWorld.isSubtypeOf(flatOther.base, base)) {
+      return intersectionStrictSubtype(flatOther, closedWorld);
+    } else if (closedWorld.isSubtypeOf(base, flatOther.base)) {
+      return flatOther.intersectionStrictSubtype(this, closedWorld);
+    } else {
+      return intersectionDisjoint(flatOther, closedWorld);
     }
-
-    if (isEmptyOrNull || flatOther.isEmptyOrNull) {
-      return emptyOrNull();
-    }
-
-    SubclassResult result = closedWorld.classHierarchy
-        .commonSubclasses(base, _classQuery, otherBase, flatOther._classQuery);
-
-    FlatTypeMask createSingle(ClassEntity cls) {
-      switch (result.query) {
-        case ClassQuery.EXACT:
-          return includeNull
-              ? new TypeMask.exact(cls, closedWorld)
-              : new TypeMask.nonNullExact(cls, closedWorld);
-        case ClassQuery.SUBCLASS:
-          return includeNull
-              ? new TypeMask.subclass(cls, closedWorld)
-              : new TypeMask.nonNullSubclass(cls, closedWorld);
-        case ClassQuery.SUBTYPE:
-          return includeNull
-              ? new TypeMask.subtype(cls, closedWorld)
-              : new TypeMask.nonNullSubtype(cls, closedWorld);
-      }
-      throw new UnsupportedError("Unexpected ClassQuery: ${result.query}.");
-    }
-
-    List<FlatTypeMask> masks =
-        result.classes.map<FlatTypeMask>(createSingle).toList();
-    if (masks.isEmpty) return emptyOrNull();
-    if (masks.length == 1) return masks.single;
-    if (masks.length > UnionTypeMask.MAX_UNION_LENGTH) {
-      return UnionTypeMask.flatten(masks, closedWorld);
-    }
-    return new UnionTypeMask._internal(masks);
   }
 
   bool isDisjoint(TypeMask other, JClosedWorld closedWorld) {
@@ -459,6 +432,54 @@
     }
   }
 
+  TypeMask intersectionStrictSubtype(
+      FlatTypeMask other, JClosedWorld closedWorld) {
+    assert(base != other.base);
+    assert(closedWorld.isSubtypeOf(other.base, base));
+    if (!isSubtype) return intersectionHelper(other, closedWorld);
+    // Only the other mask puts constraints on the intersection mask,
+    // so base the combined flags on the other mask. Only if both
+    // masks are nullable, will the result be nullable too.
+    // The result is guaranteed to be normalized, as the other type
+    // was normalized.
+    int combined = other.flags & ((flags & 1) | ~1);
+    if (other.flags == combined) {
+      return other;
+    } else {
+      return new FlatTypeMask.normalized(other.base, combined, closedWorld);
+    }
+  }
+
+  TypeMask intersectionDisjoint(FlatTypeMask other, JClosedWorld closedWorld) {
+    assert(base != other.base);
+    assert(!closedWorld.isSubtypeOf(base, other.base));
+    assert(!closedWorld.isSubtypeOf(other.base, base));
+    return intersectionHelper(other, closedWorld);
+  }
+
+  TypeMask intersectionHelper(FlatTypeMask other, JClosedWorld closedWorld) {
+    assert(base != other.base);
+    assert(!closedWorld.isSubclassOf(base, other.base));
+    assert(!closedWorld.isSubclassOf(other.base, base));
+    // If one of the masks are exact or if both of them are subclass
+    // masks, then the intersection is empty.
+    if (isExact || other.isExact) return intersectionEmpty(other);
+    if (isSubclass && other.isSubclass) return intersectionEmpty(other);
+    assert(isSubtype || other.isSubtype);
+    int kind = (isSubclass || other.isSubclass) ? SUBCLASS : SUBTYPE;
+    Iterable<ClassEntity> candidates = closedWorld.commonSubclasses(
+        base, _classQuery, other.base, other._classQuery);
+    if (candidates.isEmpty) return intersectionEmpty(other);
+    // Run through the list of candidates and compute the union. The
+    // result will only be nullable if both masks are nullable. We have
+    // to normalize here, as we generate types based on new base classes.
+    int combined = (kind << 1) | (flags & other.flags & 1);
+    Iterable<TypeMask> masks = candidates.map((ClassEntity cls) {
+      return new FlatTypeMask.normalized(cls, combined, closedWorld);
+    });
+    return UnionTypeMask.unionOf(masks, closedWorld);
+  }
+
   TypeMask intersectionEmpty(FlatTypeMask other) {
     return isNullable && other.isNullable
         ? new TypeMask.empty()
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
index 23752a0..2b6ae66 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
@@ -9,13 +9,12 @@
 import '../../constants/values.dart' show ConstantValue, PrimitiveConstantValue;
 import '../../elements/entities.dart';
 import '../../types/abstract_value_domain.dart';
-import '../../universe/class_hierarchy.dart';
 import '../../universe/selector.dart' show Selector;
 import '../../universe/use.dart' show DynamicUse;
 import '../../universe/world_builder.dart'
     show UniverseSelectorConstraints, SelectorConstraintsStrategy;
 import '../../util/util.dart';
-import '../../world.dart' show JClosedWorld;
+import '../../world.dart' show ClassQuery, JClosedWorld;
 import '../type_graph_inferrer.dart' show TypeGraphInferrer;
 import 'constants.dart';
 
diff --git a/pkg/compiler/lib/src/io/source_map_builder.dart b/pkg/compiler/lib/src/io/source_map_builder.dart
index ffb6423..c19cfa0 100644
--- a/pkg/compiler/lib/src/io/source_map_builder.dart
+++ b/pkg/compiler/lib/src/io/source_map_builder.dart
@@ -276,13 +276,11 @@
 /// Map from line/column pairs to lists of [T] elements.
 class LineColumnMap<T> {
   Map<int, Map<int, List<T>>> _map = <int, Map<int, List<T>>>{};
-  var _makeLineMap = () => <int, List<T>>{};
-  var _makeList = () => <T>[];
 
   /// Returns the list of elements associated with ([line],[column]).
   List<T> _getList(int line, int column) {
-    Map<int, List<T>> lineMap = _map.putIfAbsent(line, _makeLineMap);
-    return lineMap.putIfAbsent(column, _makeList);
+    Map<int, List<T>> lineMap = _map[line] ??= <int, List<T>>{};
+    return lineMap[column] ??= <T>[];
   }
 
   /// Adds [element] to the end of the list of elements associated with
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 3b6fc65..8b424b6 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -38,7 +38,7 @@
 import '../ssa/ssa.dart' show SsaFunctionCompiler;
 import '../tracer.dart';
 import '../universe/call_structure.dart' show CallStructure;
-import '../universe/class_hierarchy.dart'
+import '../universe/class_hierarchy_builder.dart'
     show ClassHierarchyBuilder, ClassQueries;
 import '../universe/selector.dart' show Selector;
 import '../universe/use.dart' show StaticUse;
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index b7a388a..a438262 100644
--- a/pkg/compiler/lib/src/js_backend/impact_transformer.dart
+++ b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
@@ -4,7 +4,7 @@
 
 library js_backend.backend.impact_transformer;
 
-import '../universe/class_hierarchy.dart' show ClassHierarchyBuilder;
+import '../universe/class_hierarchy_builder.dart' show ClassHierarchyBuilder;
 
 import '../common.dart';
 import '../common_elements.dart';
diff --git a/pkg/compiler/lib/src/js_backend/inferred_data.dart b/pkg/compiler/lib/src/js_backend/inferred_data.dart
index 3318b1c..1f5de05 100644
--- a/pkg/compiler/lib/src/js_backend/inferred_data.dart
+++ b/pkg/compiler/lib/src/js_backend/inferred_data.dart
@@ -167,8 +167,7 @@
 
   @override
   SideEffectsBuilder getSideEffectsBuilder(MemberEntity member) {
-    return _sideEffectsBuilders.putIfAbsent(
-        member, () => new SideEffectsBuilder(member));
+    return _sideEffectsBuilders[member] ??= new SideEffectsBuilder(member);
   }
 
   @override
diff --git a/pkg/compiler/lib/src/js_backend/interceptor_data.dart b/pkg/compiler/lib/src/js_backend/interceptor_data.dart
index 3ef09f3..abed251 100644
--- a/pkg/compiler/lib/src/js_backend/interceptor_data.dart
+++ b/pkg/compiler/lib/src/js_backend/interceptor_data.dart
@@ -254,8 +254,8 @@
       if (member.name == Identifiers.call) return;
       // All methods on [Object] are shadowed by [Interceptor].
       if (cls == _commonElements.objectClass) return;
-      Set<MemberEntity> set = _interceptedElements.putIfAbsent(
-          member.name, () => new Set<MemberEntity>());
+      Set<MemberEntity> set =
+          _interceptedElements[member.name] ??= new Set<MemberEntity>();
       set.add(member);
     });
 
@@ -271,8 +271,8 @@
           (ClassEntity cls, MemberEntity member) {
         // All methods on [Object] are shadowed by [Interceptor].
         if (cls == _commonElements.objectClass) return;
-        Set<MemberEntity> set = _interceptedElements.putIfAbsent(
-            member.name, () => new Set<MemberEntity>());
+        Set<MemberEntity> set =
+            _interceptedElements[member.name] ??= new Set<MemberEntity>();
         set.add(member);
       });
     }
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index 54863e5..a449b52 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -13,11 +13,10 @@
 import '../js/js.dart' show js;
 import '../js_emitter/js_emitter.dart' show Emitter;
 import '../options.dart';
-import '../universe/class_hierarchy.dart';
 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';
@@ -1470,8 +1469,7 @@
         classesNeedingTypeArguments.add(cls);
 
         // TODO(ngeoffray): This should use subclasses, not subtypes.
-        closedWorld.classHierarchy.forEachStrictSubtypeOf(cls,
-            (ClassEntity sub) {
+        closedWorld.forEachStrictSubtypeOf(cls, (ClassEntity sub) {
           potentiallyNeedTypeArguments(sub);
         });
       } else if (entity is FunctionEntity) {
@@ -1696,16 +1694,19 @@
                 impliedClass(runtimeTypeUse.argumentType);
 
             // TODO(johnniwinther): Special case use of `this.runtimeType`.
-            SubclassResult result = closedWorld.classHierarchy.commonSubclasses(
-                receiverClass,
-                ClassQuery.SUBTYPE,
-                argumentClass,
-                ClassQuery.SUBTYPE);
-
-            for (ClassEntity cls in result.classes) {
-              addClass(cls);
-              if (neededOnAll) break;
+            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));
@@ -1716,17 +1717,15 @@
       Set<ClassEntity> allClassesNeedingRuntimeType;
       if (neededOnAll) {
         neededOnFunctions = true;
-        allClassesNeedingRuntimeType = closedWorld.classHierarchy
-            .subclassesOf(commonElements.objectClass)
-            .toSet();
+        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.classHierarchy.subtypesOf(cls));
+            allClassesNeedingRuntimeType.addAll(closedWorld.subtypesOf(cls));
           }
         }
       }
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index 1f4923a..6b68731 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -289,10 +289,10 @@
       });
     }
 
-    closedWorld.classHierarchy
+    closedWorld
         .getClassHierarchyNode(closedWorld.commonElements.objectClass)
         .forEachSubclass((ClassEntity cls) {
-      convertClassSet(closedWorld.classHierarchy.getClassSet(cls));
+      convertClassSet(closedWorld.getClassSet(cls));
     }, ClassHierarchyNode.ALL);
 
     Set<MemberEntity> liveInstanceMembers =
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index b3e5f49..1af442c 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -43,7 +43,7 @@
 import '../ordered_typeset.dart';
 import '../ssa/kernel_impact.dart';
 import '../ssa/type_builder.dart';
-import '../universe/class_hierarchy.dart';
+import '../universe/class_hierarchy_builder.dart';
 import '../universe/class_set.dart';
 import '../universe/selector.dart';
 import '../universe/world_builder.dart';
@@ -930,215 +930,222 @@
   }
 
   LibraryEntity _getLibrary(ir.Library node, [LibraryEnv libraryEnv]) {
-    return _libraryMap.putIfAbsent(node, () {
-      assert(
-          !_envIsClosed,
-          "Environment of $this is closed. Trying to create "
-          "library for $node.");
-      Uri canonicalUri = node.importUri;
-      String name = node.name;
-      if (name == null) {
-        // Use the file name as script name.
-        String path = canonicalUri.path;
-        name = path.substring(path.lastIndexOf('/') + 1);
-      }
-      IndexedLibrary library = createLibrary(name, canonicalUri);
-      return _libraries.register(library, new LibraryData(node),
-          libraryEnv ?? _env.lookupLibrary(canonicalUri));
-    });
+    return _libraryMap[node] ??= _getLibraryCreate(node, libraryEnv);
+  }
+
+  LibraryEntity _getLibraryCreate(ir.Library node, LibraryEnv libraryEnv) {
+    assert(
+        !_envIsClosed,
+        "Environment of $this is closed. Trying to create "
+        "library for $node.");
+    Uri canonicalUri = node.importUri;
+    String name = node.name;
+    if (name == null) {
+      // Use the file name as script name.
+      String path = canonicalUri.path;
+      name = path.substring(path.lastIndexOf('/') + 1);
+    }
+    IndexedLibrary library = createLibrary(name, canonicalUri);
+    return _libraries.register(library, new LibraryData(node),
+        libraryEnv ?? _env.lookupLibrary(canonicalUri));
   }
 
   ClassEntity _getClass(ir.Class node, [ClassEnv classEnv]) {
-    return _classMap.putIfAbsent(node, () {
-      assert(
-          !_envIsClosed,
-          "Environment of $this is closed. Trying to create "
-          "class for $node.");
-      KLibrary library = _getLibrary(node.enclosingLibrary);
-      if (classEnv == null) {
-        classEnv = _libraries.getEnv(library).lookupClass(node.name);
-      }
-      IndexedClass cls =
-          createClass(library, node.name, isAbstract: node.isAbstract);
-      return _classes.register(cls,
-          new ClassData(node, new RegularClassDefinition(cls, node)), classEnv);
-    });
+    return _classMap[node] ??= _getClassCreate(node, classEnv);
+  }
+
+  ClassEntity _getClassCreate(ir.Class node, ClassEnv classEnv) {
+    assert(
+        !_envIsClosed,
+        "Environment of $this is closed. Trying to create "
+        "class for $node.");
+    KLibrary library = _getLibrary(node.enclosingLibrary);
+    if (classEnv == null) {
+      classEnv = _libraries.getEnv(library).lookupClass(node.name);
+    }
+    IndexedClass cls =
+        createClass(library, node.name, isAbstract: node.isAbstract);
+    return _classes.register(cls,
+        new ClassData(node, new RegularClassDefinition(cls, node)), classEnv);
   }
 
   TypedefEntity _getTypedef(ir.Typedef node) {
-    return _typedefMap.putIfAbsent(node, () {
-      assert(
-          !_envIsClosed,
-          "Environment of $this is closed. Trying to create "
-          "typedef for $node.");
-      IndexedLibrary library = _getLibrary(node.enclosingLibrary);
-      IndexedTypedef typedef = createTypedef(library, node.name);
-      TypedefType typedefType = new TypedefType(
-          typedef,
-          new List<DartType>.filled(
-              node.typeParameters.length, const DynamicType()));
-      return _typedefs.register(
-          typedef, new TypedefData(node, typedef, typedefType));
-    });
+    return _typedefMap[node] ??= _getTypedefCreate(node);
+  }
+
+  TypedefEntity _getTypedefCreate(ir.Typedef node) {
+    assert(
+        !_envIsClosed,
+        "Environment of $this is closed. Trying to create "
+        "typedef for $node.");
+    IndexedLibrary library = _getLibrary(node.enclosingLibrary);
+    IndexedTypedef typedef = createTypedef(library, node.name);
+    TypedefType typedefType = new TypedefType(
+        typedef,
+        new List<DartType>.filled(
+            node.typeParameters.length, const DynamicType()));
+    return _typedefs.register(
+        typedef, new TypedefData(node, typedef, typedefType));
   }
 
   TypeVariableEntity _getTypeVariable(ir.TypeParameter node) {
-    return _typeVariableMap.putIfAbsent(node, () {
-      assert(
-          !_envIsClosed,
-          "Environment of $this is closed. Trying to create "
-          "type variable for $node.");
-      if (node.parent is ir.Class) {
-        ir.Class cls = node.parent;
-        int index = cls.typeParameters.indexOf(node);
-        return _typeVariables.register(
-            createTypeVariable(_getClass(cls), node.name, index),
-            new TypeVariableData(node));
-      }
-      if (node.parent is ir.FunctionNode) {
-        ir.FunctionNode func = node.parent;
-        int index = func.typeParameters.indexOf(node);
-        if (func.parent is ir.Constructor) {
-          ir.Constructor constructor = func.parent;
-          ir.Class cls = constructor.enclosingClass;
+    return _typeVariableMap[node] ??= _getTypeVariableCreate(node);
+  }
+
+  TypeVariableEntity _getTypeVariableCreate(ir.TypeParameter node) {
+    assert(
+        !_envIsClosed,
+        "Environment of $this is closed. Trying to create "
+        "type variable for $node.");
+    if (node.parent is ir.Class) {
+      ir.Class cls = node.parent;
+      int index = cls.typeParameters.indexOf(node);
+      return _typeVariables.register(
+          createTypeVariable(_getClass(cls), node.name, index),
+          new TypeVariableData(node));
+    }
+    if (node.parent is ir.FunctionNode) {
+      ir.FunctionNode func = node.parent;
+      int index = func.typeParameters.indexOf(node);
+      if (func.parent is ir.Constructor) {
+        ir.Constructor constructor = func.parent;
+        ir.Class cls = constructor.enclosingClass;
+        return _getTypeVariable(cls.typeParameters[index]);
+      } else if (func.parent is ir.Procedure) {
+        ir.Procedure procedure = func.parent;
+        if (procedure.kind == ir.ProcedureKind.Factory) {
+          ir.Class cls = procedure.enclosingClass;
           return _getTypeVariable(cls.typeParameters[index]);
-        } else if (func.parent is ir.Procedure) {
-          ir.Procedure procedure = func.parent;
-          if (procedure.kind == ir.ProcedureKind.Factory) {
-            ir.Class cls = procedure.enclosingClass;
-            return _getTypeVariable(cls.typeParameters[index]);
-          } else {
-            return _typeVariables.register(
-                createTypeVariable(_getMethod(procedure), node.name, index),
-                new TypeVariableData(node));
-          }
         } else {
-          throw new UnsupportedError(
-              'Unsupported function type parameter parent '
-              'node ${func.parent}.');
+          return _typeVariables.register(
+              createTypeVariable(_getMethod(procedure), node.name, index),
+              new TypeVariableData(node));
         }
+      } else {
+        throw new UnsupportedError('Unsupported function type parameter parent '
+            'node ${func.parent}.');
       }
-      throw new UnsupportedError('Unsupported type parameter type node $node.');
-    });
+    }
+    throw new UnsupportedError('Unsupported type parameter type node $node.');
   }
 
   ConstructorEntity _getConstructor(ir.Member node) {
-    return _constructorMap.putIfAbsent(node, () {
-      assert(
-          !_envIsClosed,
-          "Environment of $this is closed. Trying to create "
-          "constructor for $node.");
-      MemberDefinition definition;
-      ir.FunctionNode functionNode;
-      ClassEntity enclosingClass = _getClass(node.enclosingClass);
-      Name name = getName(node.name);
-      bool isExternal = node.isExternal;
+    return _constructorMap[node] ??= _getConstructorCreate(node);
+  }
 
-      IndexedConstructor constructor;
-      if (node is ir.Constructor) {
-        functionNode = node.function;
-        constructor = createGenerativeConstructor(enclosingClass, name,
-            _getParameterStructure(functionNode, includeTypeParameters: false),
-            isExternal: isExternal, isConst: node.isConst);
-        definition = new SpecialMemberDefinition(
-            constructor, node, MemberKind.constructor);
-      } else if (node is ir.Procedure) {
-        functionNode = node.function;
-        bool isFromEnvironment = isExternal &&
-            name.text == 'fromEnvironment' &&
-            const ['int', 'bool', 'String'].contains(enclosingClass.name);
-        constructor = createFactoryConstructor(enclosingClass, name,
-            _getParameterStructure(functionNode, includeTypeParameters: false),
-            isExternal: isExternal,
-            isConst: node.isConst,
-            isFromEnvironmentConstructor: isFromEnvironment);
-        definition = new RegularMemberDefinition(constructor, node);
-      } else {
-        // TODO(johnniwinther): Convert `node.location` to a [SourceSpan].
-        throw failedAt(
-            NO_LOCATION_SPANNABLE, "Unexpected constructor node: ${node}.");
-      }
-      return _members.register<IndexedConstructor, ConstructorData>(
-          constructor, new ConstructorDataImpl(node, functionNode, definition));
-    });
+  ConstructorEntity _getConstructorCreate(ir.Member node) {
+    assert(
+        !_envIsClosed,
+        "Environment of $this is closed. Trying to create "
+        "constructor for $node.");
+    MemberDefinition definition;
+    ir.FunctionNode functionNode;
+    ClassEntity enclosingClass = _getClass(node.enclosingClass);
+    Name name = getName(node.name);
+    bool isExternal = node.isExternal;
+
+    IndexedConstructor constructor;
+    if (node is ir.Constructor) {
+      functionNode = node.function;
+      constructor = createGenerativeConstructor(enclosingClass, name,
+          _getParameterStructure(functionNode, includeTypeParameters: false),
+          isExternal: isExternal, isConst: node.isConst);
+      definition = new SpecialMemberDefinition(
+          constructor, node, MemberKind.constructor);
+    } else if (node is ir.Procedure) {
+      functionNode = node.function;
+      bool isFromEnvironment = isExternal &&
+          name.text == 'fromEnvironment' &&
+          const ['int', 'bool', 'String'].contains(enclosingClass.name);
+      constructor = createFactoryConstructor(enclosingClass, name,
+          _getParameterStructure(functionNode, includeTypeParameters: false),
+          isExternal: isExternal,
+          isConst: node.isConst,
+          isFromEnvironmentConstructor: isFromEnvironment);
+      definition = new RegularMemberDefinition(constructor, node);
+    } else {
+      // TODO(johnniwinther): Convert `node.location` to a [SourceSpan].
+      throw failedAt(
+          NO_LOCATION_SPANNABLE, "Unexpected constructor node: ${node}.");
+    }
+    return _members.register<IndexedConstructor, ConstructorData>(
+        constructor, new ConstructorDataImpl(node, functionNode, definition));
   }
 
   FunctionEntity _getMethod(ir.Procedure node) {
-    return _methodMap.putIfAbsent(node, () {
-      assert(
-          !_envIsClosed,
-          "Environment of $this is closed. Trying to create "
-          "function for $node.");
-      LibraryEntity library;
-      ClassEntity enclosingClass;
-      if (node.enclosingClass != null) {
-        enclosingClass = _getClass(node.enclosingClass);
-        library = enclosingClass.library;
-      } else {
-        library = _getLibrary(node.enclosingLibrary);
-      }
-      Name name = getName(node.name);
-      bool isStatic = node.isStatic;
-      bool isExternal = node.isExternal;
-      // TODO(johnniwinther): Remove `&& !node.isExternal` when #31233 is fixed.
-      bool isAbstract = node.isAbstract && !node.isExternal;
-      AsyncMarker asyncMarker = getAsyncMarker(node.function);
-      IndexedFunction function;
-      switch (node.kind) {
-        case ir.ProcedureKind.Factory:
-          throw new UnsupportedError("Cannot create method from factory.");
-        case ir.ProcedureKind.Getter:
-          function = createGetter(library, enclosingClass, name, asyncMarker,
-              isStatic: isStatic,
-              isExternal: isExternal,
-              isAbstract: isAbstract);
-          break;
-        case ir.ProcedureKind.Method:
-        case ir.ProcedureKind.Operator:
-          function = createMethod(library, enclosingClass, name,
-              _getParameterStructure(node.function), asyncMarker,
-              isStatic: isStatic,
-              isExternal: isExternal,
-              isAbstract: isAbstract);
-          break;
-        case ir.ProcedureKind.Setter:
-          assert(asyncMarker == AsyncMarker.SYNC);
-          function = createSetter(library, enclosingClass, name.setter,
-              isStatic: isStatic,
-              isExternal: isExternal,
-              isAbstract: isAbstract);
-          break;
-      }
-      return _members.register<IndexedFunction, FunctionData>(
-          function,
-          new FunctionDataImpl(node, node.function,
-              new RegularMemberDefinition(function, node)));
-    });
+    return _methodMap[node] ??= _getMethodCreate(node);
+  }
+
+  FunctionEntity _getMethodCreate(ir.Procedure node) {
+    assert(
+        !_envIsClosed,
+        "Environment of $this is closed. Trying to create "
+        "function for $node.");
+    LibraryEntity library;
+    ClassEntity enclosingClass;
+    if (node.enclosingClass != null) {
+      enclosingClass = _getClass(node.enclosingClass);
+      library = enclosingClass.library;
+    } else {
+      library = _getLibrary(node.enclosingLibrary);
+    }
+    Name name = getName(node.name);
+    bool isStatic = node.isStatic;
+    bool isExternal = node.isExternal;
+    // TODO(johnniwinther): Remove `&& !node.isExternal` when #31233 is fixed.
+    bool isAbstract = node.isAbstract && !node.isExternal;
+    AsyncMarker asyncMarker = getAsyncMarker(node.function);
+    IndexedFunction function;
+    switch (node.kind) {
+      case ir.ProcedureKind.Factory:
+        throw new UnsupportedError("Cannot create method from factory.");
+      case ir.ProcedureKind.Getter:
+        function = createGetter(library, enclosingClass, name, asyncMarker,
+            isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
+        break;
+      case ir.ProcedureKind.Method:
+      case ir.ProcedureKind.Operator:
+        function = createMethod(library, enclosingClass, name,
+            _getParameterStructure(node.function), asyncMarker,
+            isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
+        break;
+      case ir.ProcedureKind.Setter:
+        assert(asyncMarker == AsyncMarker.SYNC);
+        function = createSetter(library, enclosingClass, name.setter,
+            isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
+        break;
+    }
+    return _members.register<IndexedFunction, FunctionData>(
+        function,
+        new FunctionDataImpl(
+            node, node.function, new RegularMemberDefinition(function, node)));
   }
 
   FieldEntity _getField(ir.Field node) {
-    return _fieldMap.putIfAbsent(node, () {
-      assert(
-          !_envIsClosed,
-          "Environment of $this is closed. Trying to create "
-          "field for $node.");
-      LibraryEntity library;
-      ClassEntity enclosingClass;
-      if (node.enclosingClass != null) {
-        enclosingClass = _getClass(node.enclosingClass);
-        library = enclosingClass.library;
-      } else {
-        library = _getLibrary(node.enclosingLibrary);
-      }
-      Name name = getName(node.name);
-      bool isStatic = node.isStatic;
-      IndexedField field = createField(library, enclosingClass, name,
-          isStatic: isStatic,
-          isAssignable: node.isMutable,
-          isConst: node.isConst);
-      return _members.register<IndexedField, FieldData>(field,
-          new FieldDataImpl(node, new RegularMemberDefinition(field, node)));
-    });
+    return _fieldMap[node] ??= _getFieldCreate(node);
+  }
+
+  FieldEntity _getFieldCreate(ir.Field node) {
+    assert(
+        !_envIsClosed,
+        "Environment of $this is closed. Trying to create "
+        "field for $node.");
+    LibraryEntity library;
+    ClassEntity enclosingClass;
+    if (node.enclosingClass != null) {
+      enclosingClass = _getClass(node.enclosingClass);
+      library = enclosingClass.library;
+    } else {
+      library = _getLibrary(node.enclosingLibrary);
+    }
+    Name name = getName(node.name);
+    bool isStatic = node.isStatic;
+    IndexedField field = createField(library, enclosingClass, name,
+        isStatic: isStatic,
+        isAssignable: node.isMutable,
+        isConst: node.isConst);
+    return _members.register<IndexedField, FieldData>(field,
+        new FieldDataImpl(node, new RegularMemberDefinition(field, node)));
   }
 
   ParameterStructure _getParameterStructure(ir.FunctionNode node,
@@ -2073,6 +2080,9 @@
 
   final Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses;
 
+  final Map<ClassEntity, ClassHierarchyNode> _classHierarchyNodes;
+  final Map<ClassEntity, ClassSet> _classSets;
+
   // TODO(johnniwinther): Can this be derived from [ClassSet]s?
   final Set<ClassEntity> _implementedClasses;
 
@@ -2086,8 +2096,6 @@
 
   final Iterable<MemberEntity> processedMembers;
 
-  final ClassHierarchy classHierarchy;
-
   KClosedWorldImpl(this.elementMap,
       {CompilerOptions options,
       this.elementEnvironment,
@@ -2110,8 +2118,8 @@
       Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes,
       Map<ClassEntity, ClassSet> classSets})
       : _implementedClasses = implementedClasses,
-        classHierarchy = new ClassHierarchyImpl(
-            commonElements, classHierarchyNodes, classSets) {
+        _classHierarchyNodes = classHierarchyNodes,
+        _classSets = classSets {
     computeRtiNeed(resolutionWorldBuilder, rtiNeedBuilder, options);
   }
 
@@ -2119,6 +2127,152 @@
   bool isImplemented(ClassEntity cls) {
     return _implementedClasses.contains(cls);
   }
+
+  /// Returns [ClassHierarchyNode] for [cls] used to model the class hierarchies
+  /// of known classes.
+  ///
+  /// This method is only provided for testing. For queries on classes, use the
+  /// methods defined in [JClosedWorld].
+  ClassHierarchyNode getClassHierarchyNode(ClassEntity cls) {
+    return _classHierarchyNodes[cls];
+  }
+
+  /// Returns [ClassSet] for [cls] used to model the extends and implements
+  /// relations of known classes.
+  ///
+  /// This method is only provided for testing. For queries on classes, use the
+  /// methods defined in [JClosedWorld].
+  ClassSet getClassSet(ClassEntity cls) {
+    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(
+      ClassEntity cls, IterationStep f(ClassEntity cls)) {
+    ClassSet classSet = _classSets[cls];
+    if (classSet == null) return;
+    classSet.forEachSubtype(f, ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
+        strict: true);
+  }
 }
 
 // Interface for testing equivalence of Kernel-based entities.
diff --git a/pkg/compiler/lib/src/kernel/kernel_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
index 9e91d03..19e2aa3 100644
--- a/pkg/compiler/lib/src/kernel/kernel_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
@@ -31,7 +31,7 @@
 import '../native/enqueue.dart' show NativeResolutionEnqueuer;
 import '../native/resolver.dart';
 import '../options.dart';
-import '../universe/class_hierarchy.dart';
+import '../universe/class_hierarchy_builder.dart';
 import '../universe/world_builder.dart';
 import '../universe/world_impact.dart';
 import 'deferred_load.dart';
diff --git a/pkg/compiler/lib/src/native/enqueue.dart b/pkg/compiler/lib/src/native/enqueue.dart
index 0de573e..543d330 100644
--- a/pkg/compiler/lib/src/native/enqueue.dart
+++ b/pkg/compiler/lib/src/native/enqueue.dart
@@ -271,7 +271,7 @@
 
     _elementEnvironment.forEachSupertype(cls, (InterfaceType type) {
       List<ClassEntity> subtypes =
-          emitter.subtypes.putIfAbsent(type.element, () => <ClassEntity>[]);
+          emitter.subtypes[type.element] ??= <ClassEntity>[];
       subtypes.add(cls);
     });
 
@@ -286,7 +286,7 @@
     }
 
     List<ClassEntity> directSubtypes =
-        emitter.directSubtypes.putIfAbsent(superclass, () => <ClassEntity>[]);
+        emitter.directSubtypes[superclass] ??= <ClassEntity>[];
     directSubtypes.add(cls);
   }
 
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 866d70c..fc870e9 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -277,6 +277,8 @@
   /// Create an options object by parsing flags from [options].
   static CompilerOptions parse(List<String> options,
       {Uri libraryRoot, Uri platformBinaries}) {
+    bool isStrong = _hasOption(options, Flags.strongMode) ||
+        !_hasOption(options, Flags.noPreviewDart2);
     return new CompilerOptions()
       ..libraryRoot = libraryRoot
       ..allowMockCompilation = _hasOption(options, Flags.allowMockCompilation)
@@ -307,8 +309,8 @@
       ..enableMinification = _hasOption(options, Flags.minify)
       ..enableNativeLiveTypeAnalysis =
           !_hasOption(options, Flags.disableNativeLiveTypeAnalysis)
-      ..enableTypeAssertions = _hasOption(options, Flags.enableCheckedMode) &&
-          !_hasOption(options, Flags.strongMode)
+      ..enableTypeAssertions =
+          _hasOption(options, Flags.enableCheckedMode) && !isStrong
       ..enableUserAssertions = _hasOption(options, Flags.enableCheckedMode) ||
           _hasOption(options, Flags.enableAsserts)
       ..experimentalTrackAllocations =
@@ -325,8 +327,7 @@
       ..platformBinaries =
           platformBinaries ?? _extractUriOption(options, '--platform-binaries=')
       ..sourceMapUri = _extractUriOption(options, '--source-map=')
-      ..strongMode = _hasOption(options, Flags.strongMode) ||
-          !_hasOption(options, Flags.noPreviewDart2)
+      ..strongMode = isStrong
       ..omitImplicitChecks = _hasOption(options, Flags.omitImplicitChecks)
       ..laxRuntimeTypeToString =
           _hasOption(options, Flags.laxRuntimeTypeToString)
diff --git a/pkg/compiler/lib/src/universe/class_hierarchy.dart b/pkg/compiler/lib/src/universe/class_hierarchy.dart
deleted file mode 100644
index f19320a..0000000
--- a/pkg/compiler/lib/src/universe/class_hierarchy.dart
+++ /dev/null
@@ -1,543 +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 '../common.dart';
-import '../common_elements.dart';
-import '../elements/entities.dart';
-import '../elements/types.dart' show InterfaceType;
-import 'class_set.dart';
-
-// TODO(johnniwinther): Move more methods from `JClosedWorld` to
-// `ClassHierarchy`.
-abstract class ClassHierarchy {
-  /// Returns [ClassHierarchyNode] for [cls] used to model the class hierarchies
-  /// of known classes.
-  ///
-  /// This method is only provided for testing. For queries on classes, use the
-  /// methods defined in [JClosedWorld].
-  ClassHierarchyNode getClassHierarchyNode(ClassEntity cls);
-
-  /// Returns [ClassSet] for [cls] used to model the extends and implements
-  /// relations of known classes.
-  ///
-  /// This method is only provided for testing. For queries on classes, use the
-  /// methods defined in [JClosedWorld].
-  ClassSet getClassSet(ClassEntity cls);
-
-  /// 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 a [SubclassResult] for the subclasses that are contained in
-  /// the 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].
-  SubclassResult 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(
-      ClassEntity cls, IterationStep f(ClassEntity cls));
-}
-
-class ClassHierarchyImpl implements ClassHierarchy {
-  final CommonElements _commonElements;
-  final Map<ClassEntity, ClassHierarchyNode> _classHierarchyNodes;
-  final Map<ClassEntity, ClassSet> _classSets;
-
-  ClassHierarchyImpl(
-      this._commonElements, this._classHierarchyNodes, this._classSets);
-
-  /// Returns [ClassHierarchyNode] for [cls] used to model the class hierarchies
-  /// of known classes.
-  ///
-  /// This method is only provided for testing. For queries on classes, use the
-  /// methods defined in [JClosedWorld].
-  ClassHierarchyNode getClassHierarchyNode(ClassEntity cls) {
-    return _classHierarchyNodes[cls];
-  }
-
-  /// Returns [ClassSet] for [cls] used to model the extends and implements
-  /// relations of known classes.
-  ///
-  /// This method is only provided for testing. For queries on classes, use the
-  /// methods defined in [JClosedWorld].
-  ClassSet getClassSet(ClassEntity cls) {
-    return _classSets[cls];
-  }
-
-  /// 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);
-  }
-
-  /// Return `true` if [x] is a (non-strict) subclass of [y].
-  bool isSubclassOf(ClassEntity x, ClassEntity y) {
-    return _classHierarchyNodes[y].hasSubclass(_classHierarchyNodes[x]);
-  }
-
-  /// 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);
-    }
-  }
-
-  /// 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);
-  }
-
-  /// Applies [f] to each live class that extend [cls] _not_ including [cls]
-  /// itself.
-  void forEachStrictSubclassOf(
-      ClassEntity cls, IterationStep f(ClassEntity cls)) {
-    ClassHierarchyNode subclasses = _classHierarchyNodes[cls];
-    if (subclasses == null) return;
-    subclasses.forEachSubclass(f, ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
-        strict: true);
-  }
-
-  /// Applies [f] to each live class that implements [cls] _not_ including [cls]
-  /// itself.
-  void forEachStrictSubtypeOf(
-      ClassEntity cls, IterationStep f(ClassEntity cls)) {
-    ClassSet classSet = _classSets[cls];
-    if (classSet == null) return;
-    classSet.forEachSubtype(f, ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
-        strict: true);
-  }
-
-  SubclassResult commonSubclasses(ClassEntity cls1, ClassQuery query1,
-      ClassEntity cls2, ClassQuery query2) {
-    if (query1 == ClassQuery.EXACT && query2 == ClassQuery.EXACT) {
-      // Exact classes [cls1] and [cls2] must be identical to have any classes
-      // in common.
-      if (cls1 != cls2) {
-        return const SubclassResult.empty();
-      }
-      return new SubclassResult.exact(cls1);
-    } else if (query1 == ClassQuery.EXACT) {
-      if (query2 == ClassQuery.SUBCLASS) {
-        // Exact [cls1] must be a subclass of [cls2] to have any classes in
-        // common.
-        if (isSubclassOf(cls1, cls2)) {
-          return new SubclassResult.exact(cls1);
-        }
-      } else if (query2 == ClassQuery.SUBTYPE) {
-        // Exact [cls1] must be a subtype of [cls2] to have any classes in
-        // common.
-        if (isSubtypeOf(cls1, cls2)) {
-          return new SubclassResult.exact(cls1);
-        }
-      }
-      return const SubclassResult.empty();
-    } else if (query2 == ClassQuery.EXACT) {
-      if (query1 == ClassQuery.SUBCLASS) {
-        // Exact [cls2] must be a subclass of [cls1] to have any classes in
-        // common.
-        if (isSubclassOf(cls2, cls1)) {
-          return new SubclassResult.exact(cls2);
-        }
-      } else if (query1 == ClassQuery.SUBTYPE) {
-        // Exact [cls2] must be a subtype of [cls1] to have any classes in
-        // common.
-        if (isSubtypeOf(cls2, cls1)) {
-          return new SubclassResult.exact(cls2);
-        }
-      }
-      return const SubclassResult.empty();
-    } else if (query1 == ClassQuery.SUBCLASS && query2 == ClassQuery.SUBCLASS) {
-      // [cls1] must be a subclass of [cls2] or vice versa to have any classes
-      // in common.
-      if (cls1 == cls2 || isSubclassOf(cls1, cls2)) {
-        // The subclasses of [cls1] are contained within the subclasses of
-        // [cls2].
-        return new SubclassResult.subclass(cls1);
-      } else if (isSubclassOf(cls2, cls1)) {
-        // The subclasses of [cls2] are contained within the subclasses of
-        // [cls1].
-        return new SubclassResult.subclass(cls2);
-      }
-      return const SubclassResult.empty();
-    } else if (query1 == ClassQuery.SUBCLASS) {
-      if (isSubtypeOf(cls1, cls2)) {
-        // The subclasses of [cls1] are all subtypes of [cls2].
-        return new SubclassResult.subclass(cls1);
-      }
-      if (cls1 == _commonElements.objectClass) {
-        // Since [cls1] is `Object` all subtypes of [cls2] are contained within
-        // the subclasses of [cls1].
-        return new SubclassResult.subtype(cls2);
-      }
-      // Find all the root subclasses of [cls1] of that implement [cls2].
-      //
-      // For this hierarchy:
-      //
-      //     class I {}
-      //     class A {}
-      //     class B extends A implements I {}
-      //     class C extends B {}
-      //     class D extends A implements I {}
-      //
-      // the common subclasses of "subclass of A" and "subtype of I" returns
-      // "subclasses of {B, D}". The inclusion of class `C` is implied because
-      // it is a subclass of `B`.
-      List<ClassEntity> classes = <ClassEntity>[];
-      forEachStrictSubclassOf(cls1, (ClassEntity subclass) {
-        if (isSubtypeOf(subclass, cls2)) {
-          classes.add(subclass);
-          // Skip subclasses of [subclass]; they all implement [cls2] by
-          // inheritance and are included in the subclasses of [subclass].
-          return IterationStep.SKIP_SUBCLASSES;
-        }
-        return IterationStep.CONTINUE;
-      });
-      return new SubclassResult.subclasses(classes);
-    } else if (query2 == ClassQuery.SUBCLASS) {
-      if (isSubtypeOf(cls2, cls1)) {
-        // The subclasses of [cls2] are all subtypes of [cls1].
-        return new SubclassResult.subclass(cls2);
-      }
-      if (cls2 == _commonElements.objectClass) {
-        // Since [cls2] is `Object` all subtypes of [cls1] are contained within
-        // the subclasses of [cls2].
-        return new SubclassResult.subtype(cls1);
-      }
-      // Find all the root subclasses of [cls2] of that implement [cls1].
-      List<ClassEntity> classes = <ClassEntity>[];
-      forEachStrictSubclassOf(cls2, (ClassEntity subclass) {
-        if (isSubtypeOf(subclass, cls1)) {
-          classes.add(subclass);
-          // Skip subclasses of [subclass]; they all implement [cls1] by
-          // inheritance and are included in the subclasses of [subclass].
-          return IterationStep.SKIP_SUBCLASSES;
-        }
-        return IterationStep.CONTINUE;
-      });
-      return new SubclassResult.subclasses(classes);
-    } else {
-      if (cls1 == cls2 || isSubtypeOf(cls1, cls2)) {
-        // The subtypes of [cls1] are contained within the subtypes of [cls2].
-        return new SubclassResult.subtype(cls1);
-      } else if (isSubtypeOf(cls2, cls1)) {
-        // The subtypes of [cls2] are contained within the subtypes of [cls1].
-        return new SubclassResult.subtype(cls2);
-      }
-      // Find all the root subclasses of [cls1] of that implement [cls2].
-      //
-      // For this hierarchy:
-      //
-      //     class I {}
-      //     class A {}
-      //     class B extends A implements I {}
-      //     class C extends B {}
-      //     class D extends A implements I {}
-      //     class E implements B {}
-      //     class F extends E {}
-      //
-      // the common subclasses of "subtype of A" and "subtype of I" returns
-      // "subclasses of {B, D, E}". The inclusion of classes `C` and `F` is
-      // implied because they are subclasses of `B` and `E`, respectively.
-      List<ClassEntity> classes = <ClassEntity>[];
-      forEachStrictSubtypeOf(cls1, (ClassEntity subclass) {
-        if (isSubtypeOf(subclass, cls2)) {
-          classes.add(subclass);
-          // Skip subclasses of [subclass]; they all implement [cls2] by
-          // inheritance and are included in the subclasses of [subclass].
-          return IterationStep.SKIP_SUBCLASSES;
-        }
-        return IterationStep.CONTINUE;
-      });
-      return new SubclassResult.subclasses(classes);
-    }
-  }
-}
-
-class ClassHierarchyBuilder {
-  // We keep track of subtype and subclass relationships in four
-  // distinct sets to make class hierarchy analysis faster.
-  final Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes =
-      <ClassEntity, ClassHierarchyNode>{};
-  final Map<ClassEntity, ClassSet> classSets = <ClassEntity, ClassSet>{};
-  final Map<ClassEntity, Set<ClassEntity>> mixinUses =
-      new Map<ClassEntity, Set<ClassEntity>>();
-
-  final CommonElements _commonElements;
-  final ClassQueries _classQueries;
-
-  ClassHierarchyBuilder(this._commonElements, this._classQueries);
-
-  void registerClass(ClassEntity cls) {
-    _ensureClassSet(_classQueries.getDeclaration(cls));
-  }
-
-  ClassHierarchyNode _ensureClassHierarchyNode(ClassEntity cls) {
-    assert(_classQueries.checkClass(cls));
-    return classHierarchyNodes.putIfAbsent(cls, () {
-      ClassHierarchyNode parentNode;
-      ClassEntity superclass = _classQueries.getSuperClass(cls);
-      if (superclass != null) {
-        parentNode = _ensureClassHierarchyNode(superclass);
-      }
-      return new ClassHierarchyNode(
-          parentNode, cls, _classQueries.getHierarchyDepth(cls));
-    });
-  }
-
-  ClassSet _ensureClassSet(ClassEntity cls) {
-    assert(_classQueries.checkClass(cls));
-    return classSets.putIfAbsent(cls, () {
-      ClassHierarchyNode node = _ensureClassHierarchyNode(cls);
-      ClassSet classSet = new ClassSet(node);
-
-      for (InterfaceType type in _classQueries.getSupertypes(cls)) {
-        // TODO(johnniwinther): Optimization: Avoid adding [cls] to
-        // superclasses.
-        ClassSet subtypeSet = _ensureClassSet(type.element);
-        subtypeSet.addSubtype(node);
-      }
-
-      ClassEntity appliedMixin = _classQueries.getAppliedMixin(cls);
-      while (appliedMixin != null) {
-        // TODO(johnniwinther): Use the data stored in [ClassSet].
-        registerMixinUse(cls, appliedMixin);
-        ClassSet mixinSet = _ensureClassSet(appliedMixin);
-        mixinSet.addMixinApplication(node);
-
-        // In case of
-        //
-        //    class A {}
-        //    class B = Object with A;
-        //    class C = Object with B;
-        //
-        // we need to register that C not only mixes in B but also A.
-        appliedMixin = _classQueries.getAppliedMixin(appliedMixin);
-      }
-      return classSet;
-    });
-  }
-
-  void _updateSuperClassHierarchyNodeForClass(ClassHierarchyNode node) {
-    // Ensure that classes implicitly implementing `Function` are in its
-    // subtype set.
-    ClassEntity cls = node.cls;
-    if (cls != _commonElements.functionClass &&
-        _classQueries.implementsFunction(cls)) {
-      ClassSet subtypeSet = _ensureClassSet(_commonElements.functionClass);
-      subtypeSet.addSubtype(node);
-    }
-    if (!node.isInstantiated && node.parentNode != null) {
-      _updateSuperClassHierarchyNodeForClass(node.parentNode);
-    }
-  }
-
-  void updateClassHierarchyNodeForClass(ClassEntity cls,
-      {bool directlyInstantiated: false, bool abstractlyInstantiated: false}) {
-    ClassHierarchyNode node = _ensureClassSet(cls).node;
-    _updateSuperClassHierarchyNodeForClass(node);
-    if (directlyInstantiated) {
-      node.isDirectlyInstantiated = true;
-    }
-    if (abstractlyInstantiated) {
-      node.isAbstractlyInstantiated = true;
-    }
-  }
-
-  void registerMixinUse(ClassEntity mixinApplication, ClassEntity mixin) {
-    // TODO(johnniwinther): Add map restricted to live classes.
-    // We don't support patch classes as mixin.
-    Set<ClassEntity> users =
-        mixinUses.putIfAbsent(mixin, () => new Set<ClassEntity>());
-    users.add(mixinApplication);
-  }
-
-  bool _isSubtypeOf(ClassEntity x, ClassEntity y) {
-    assert(
-        classSets.containsKey(x), "ClassSet for $x has not been computed yet.");
-    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);
-  }
-
-  bool isInheritedInSubtypeOf(ClassEntity x, ClassEntity y) {
-    ClassSet classSet = classSets[x];
-    assert(classSet != null,
-        failedAt(x, "No ClassSet for $x (${x.runtimeType}): ${classSets}"));
-
-    if (_isSubtypeOf(x, y)) {
-      // [x] implements [y] itself, possible through supertypes.
-      return true;
-    }
-
-    /// Returns `true` if any live subclass of [node] implements [y].
-    bool subclassImplements(ClassHierarchyNode node, {bool strict}) {
-      return node.anySubclass((ClassEntity z) => _isSubtypeOf(z, y),
-          ClassHierarchyNode.INSTANTIATED,
-          strict: strict);
-    }
-
-    if (subclassImplements(classSet.node, strict: true)) {
-      // A subclass of [x] implements [y].
-      return true;
-    }
-
-    for (ClassHierarchyNode mixinApplication
-        in classSet.mixinApplicationNodes) {
-      if (subclassImplements(mixinApplication, strict: false)) {
-        // A subclass of [mixinApplication] implements [y].
-        return true;
-      }
-    }
-    return false;
-  }
-}
-
-abstract class ClassQueries {
-  bool checkClass(covariant ClassEntity cls);
-  bool validateClass(covariant ClassEntity cls);
-
-  /// Returns the declaration of [cls].
-  ClassEntity getDeclaration(covariant ClassEntity cls);
-
-  /// Returns the class mixed into [cls] if any.
-  // TODO(johnniwinther): Replace this by a `getAppliedMixins` function that
-  // return transitively mixed in classes like in:
-  //     class A {}
-  //     class B = Object with A;
-  //     class C = Object with B;
-  ClassEntity getAppliedMixin(covariant ClassEntity cls);
-
-  /// Returns the hierarchy depth of [cls].
-  int getHierarchyDepth(covariant ClassEntity cls);
-
-  /// Returns `true` if [cls] implements `Function` either explicitly or through
-  /// a `call` method.
-  bool implementsFunction(covariant ClassEntity cls);
-
-  /// Returns the superclass of [cls] if any.
-  ClassEntity getSuperClass(covariant ClassEntity cls);
-
-  /// Returns all supertypes of [cls].
-  Iterable<InterfaceType> getSupertypes(covariant ClassEntity cls);
-}
-
-/// Enum values defining subset of classes included in queries.
-enum ClassQuery {
-  /// Only the class itself is included.
-  EXACT,
-
-  /// The class and all subclasses (transitively) are included.
-  SUBCLASS,
-
-  /// The class and all classes that implement or subclass it (transitively)
-  /// are included.
-  SUBTYPE,
-}
-
-/// Result computed in [ClassHierarchy.commonSubclasses].
-class SubclassResult {
-  /// The classes in the result set. The classes are always disjoint wrt. the
-  /// interpretation of [query].
-  final List<ClassEntity> classes;
-
-  /// How [classes] should be interpreted: If `ClassQuery.EXACT`, only the
-  /// classes in [classes] are on the result set. If `ClassQuery.SUBCLASS`,
-  /// non-strict subclasses of the classes in [classes] are in the result set.
-  /// If `ClassQuery.SUBTYPE`, non-strict subtypes of the classes in [classes]
-  /// are in the result set.
-  final ClassQuery query;
-
-  /// Creates the empty result set.
-  const SubclassResult.empty()
-      : query = ClassQuery.EXACT,
-        classes = const <ClassEntity>[];
-
-  /// Creates the single set of [cls].
-  SubclassResult.exact(ClassEntity cls)
-      : query = ClassQuery.EXACT,
-        classes = <ClassEntity>[cls];
-
-  /// Creates the set of subclasses of [cls].
-  SubclassResult.subclass(ClassEntity cls)
-      : query = ClassQuery.SUBCLASS,
-        classes = <ClassEntity>[cls];
-
-  /// Creates the set of subtypes of [cls].
-  SubclassResult.subtype(ClassEntity cls)
-      : query = ClassQuery.SUBTYPE,
-        classes = <ClassEntity>[cls];
-
-  /// Creates the set of classes that are subclasses of a class in [classes].
-  SubclassResult.subclasses(this.classes) : query = ClassQuery.SUBCLASS;
-
-  SubclassResult.internal(this.query, this.classes);
-
-  String toString() => 'SubclassResult($query,$classes)';
-}
diff --git a/pkg/compiler/lib/src/universe/class_hierarchy_builder.dart b/pkg/compiler/lib/src/universe/class_hierarchy_builder.dart
new file mode 100644
index 0000000..337975f
--- /dev/null
+++ b/pkg/compiler/lib/src/universe/class_hierarchy_builder.dart
@@ -0,0 +1,181 @@
+// 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 '../common.dart';
+import '../common_elements.dart';
+import '../elements/entities.dart';
+import '../elements/types.dart' show InterfaceType;
+import 'class_set.dart';
+
+class ClassHierarchyBuilder {
+  // We keep track of subtype and subclass relationships in four
+  // distinct sets to make class hierarchy analysis faster.
+  final Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes =
+      <ClassEntity, ClassHierarchyNode>{};
+  final Map<ClassEntity, ClassSet> classSets = <ClassEntity, ClassSet>{};
+  final Map<ClassEntity, Set<ClassEntity>> mixinUses =
+      new Map<ClassEntity, Set<ClassEntity>>();
+
+  final CommonElements _commonElements;
+  final ClassQueries _classQueries;
+
+  ClassHierarchyBuilder(this._commonElements, this._classQueries);
+
+  void registerClass(ClassEntity cls) {
+    _ensureClassSet(_classQueries.getDeclaration(cls));
+  }
+
+  ClassHierarchyNode _ensureClassHierarchyNode(ClassEntity cls) {
+    assert(_classQueries.checkClass(cls));
+    return classHierarchyNodes.putIfAbsent(cls, () {
+      ClassHierarchyNode parentNode;
+      ClassEntity superclass = _classQueries.getSuperClass(cls);
+      if (superclass != null) {
+        parentNode = _ensureClassHierarchyNode(superclass);
+      }
+      return new ClassHierarchyNode(
+          parentNode, cls, _classQueries.getHierarchyDepth(cls));
+    });
+  }
+
+  ClassSet _ensureClassSet(ClassEntity cls) {
+    assert(_classQueries.checkClass(cls));
+    return classSets.putIfAbsent(cls, () {
+      ClassHierarchyNode node = _ensureClassHierarchyNode(cls);
+      ClassSet classSet = new ClassSet(node);
+
+      for (InterfaceType type in _classQueries.getSupertypes(cls)) {
+        // TODO(johnniwinther): Optimization: Avoid adding [cls] to
+        // superclasses.
+        ClassSet subtypeSet = _ensureClassSet(type.element);
+        subtypeSet.addSubtype(node);
+      }
+
+      ClassEntity appliedMixin = _classQueries.getAppliedMixin(cls);
+      while (appliedMixin != null) {
+        // TODO(johnniwinther): Use the data stored in [ClassSet].
+        registerMixinUse(cls, appliedMixin);
+        ClassSet mixinSet = _ensureClassSet(appliedMixin);
+        mixinSet.addMixinApplication(node);
+
+        // In case of
+        //
+        //    class A {}
+        //    class B = Object with A;
+        //    class C = Object with B;
+        //
+        // we need to register that C not only mixes in B but also A.
+        appliedMixin = _classQueries.getAppliedMixin(appliedMixin);
+      }
+      return classSet;
+    });
+  }
+
+  void _updateSuperClassHierarchyNodeForClass(ClassHierarchyNode node) {
+    // Ensure that classes implicitly implementing `Function` are in its
+    // subtype set.
+    ClassEntity cls = node.cls;
+    if (cls != _commonElements.functionClass &&
+        _classQueries.implementsFunction(cls)) {
+      ClassSet subtypeSet = _ensureClassSet(_commonElements.functionClass);
+      subtypeSet.addSubtype(node);
+    }
+    if (!node.isInstantiated && node.parentNode != null) {
+      _updateSuperClassHierarchyNodeForClass(node.parentNode);
+    }
+  }
+
+  void updateClassHierarchyNodeForClass(ClassEntity cls,
+      {bool directlyInstantiated: false, bool abstractlyInstantiated: false}) {
+    ClassHierarchyNode node = _ensureClassSet(cls).node;
+    _updateSuperClassHierarchyNodeForClass(node);
+    if (directlyInstantiated) {
+      node.isDirectlyInstantiated = true;
+    }
+    if (abstractlyInstantiated) {
+      node.isAbstractlyInstantiated = true;
+    }
+  }
+
+  void registerMixinUse(ClassEntity mixinApplication, ClassEntity mixin) {
+    // TODO(johnniwinther): Add map restricted to live classes.
+    // We don't support patch classes as mixin.
+    Set<ClassEntity> users =
+        mixinUses.putIfAbsent(mixin, () => new Set<ClassEntity>());
+    users.add(mixinApplication);
+  }
+
+  bool _isSubtypeOf(ClassEntity x, ClassEntity y) {
+    assert(
+        classSets.containsKey(x), "ClassSet for $x has not been computed yet.");
+    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);
+  }
+
+  bool isInheritedInSubtypeOf(ClassEntity x, ClassEntity y) {
+    ClassSet classSet = classSets[x];
+    assert(classSet != null,
+        failedAt(x, "No ClassSet for $x (${x.runtimeType}): ${classSets}"));
+
+    if (_isSubtypeOf(x, y)) {
+      // [x] implements [y] itself, possible through supertypes.
+      return true;
+    }
+
+    /// Returns `true` if any live subclass of [node] implements [y].
+    bool subclassImplements(ClassHierarchyNode node, {bool strict}) {
+      return node.anySubclass((ClassEntity z) => _isSubtypeOf(z, y),
+          ClassHierarchyNode.INSTANTIATED,
+          strict: strict);
+    }
+
+    if (subclassImplements(classSet.node, strict: true)) {
+      // A subclass of [x] implements [y].
+      return true;
+    }
+
+    for (ClassHierarchyNode mixinApplication
+        in classSet.mixinApplicationNodes) {
+      if (subclassImplements(mixinApplication, strict: false)) {
+        // A subclass of [mixinApplication] implements [y].
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
+abstract class ClassQueries {
+  bool checkClass(covariant ClassEntity cls);
+  bool validateClass(covariant ClassEntity cls);
+
+  /// Returns the declaration of [cls].
+  ClassEntity getDeclaration(covariant ClassEntity cls);
+
+  /// Returns the class mixed into [cls] if any.
+  // TODO(johnniwinther): Replace this by a `getAppliedMixins` function that
+  // return transitively mixed in classes like in:
+  //     class A {}
+  //     class B = Object with A;
+  //     class C = Object with B;
+  ClassEntity getAppliedMixin(covariant ClassEntity cls);
+
+  /// Returns the hierarchy depth of [cls].
+  int getHierarchyDepth(covariant ClassEntity cls);
+
+  /// Returns `true` if [cls] implements `Function` either explicitly or through
+  /// a `call` method.
+  bool implementsFunction(covariant ClassEntity cls);
+
+  /// Returns the superclass of [cls] if any.
+  ClassEntity getSuperClass(covariant ClassEntity cls);
+
+  /// Returns all supertypes of [cls].
+  Iterable<InterfaceType> getSupertypes(covariant ClassEntity cls);
+}
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder.dart b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
index dc49fe5..fecaed8 100644
--- a/pkg/compiler/lib/src/universe/codegen_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
@@ -304,12 +304,10 @@
     Selector selector = dynamicUse.selector;
     String name = selector.name;
     Object constraint = dynamicUse.receiverConstraint;
-    Map<Selector, SelectorConstraints> selectors = selectorMap.putIfAbsent(
-        name, () => new Maplet<Selector, SelectorConstraints>());
-    UniverseSelectorConstraints constraints =
-        selectors.putIfAbsent(selector, () {
-      return selectorConstraintsStrategy.createSelectorConstraints(selector);
-    });
+    Map<Selector, SelectorConstraints> selectors =
+        selectorMap[name] ??= new Maplet<Selector, SelectorConstraints>();
+    UniverseSelectorConstraints constraints = selectors[selector] ??=
+        selectorConstraintsStrategy.createSelectorConstraints(selector);
     return constraints.addReceiverConstraint(constraint);
   }
 
diff --git a/pkg/compiler/lib/src/universe/function_set.dart b/pkg/compiler/lib/src/universe/function_set.dart
index aee80f5..5f78a8e 100644
--- a/pkg/compiler/lib/src/universe/function_set.dart
+++ b/pkg/compiler/lib/src/universe/function_set.dart
@@ -20,7 +20,7 @@
     Map<String, FunctionSetNode> nodes = new Map<String, FunctionSetNode>();
     for (MemberEntity member in liveInstanceMembers) {
       String name = member.name;
-      nodes.putIfAbsent(name, () => new FunctionSetNode(name)).add(member);
+      (nodes[name] ??= new FunctionSetNode(name)).add(member);
     }
     return new FunctionSet.internal(nodes);
   }
diff --git a/pkg/compiler/lib/src/universe/world_builder.dart b/pkg/compiler/lib/src/universe/world_builder.dart
index 2417fd3..c1bf88d 100644
--- a/pkg/compiler/lib/src/universe/world_builder.dart
+++ b/pkg/compiler/lib/src/universe/world_builder.dart
@@ -28,7 +28,7 @@
 import '../util/enumset.dart';
 import '../util/util.dart';
 import '../world.dart' show World, JClosedWorld, KClosedWorld, OpenWorld;
-import 'class_hierarchy.dart' show ClassHierarchyBuilder, ClassQueries;
+import 'class_hierarchy_builder.dart' show ClassHierarchyBuilder, ClassQueries;
 import 'selector.dart' show Selector;
 import 'use.dart'
     show
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index d440deb..2a33f49 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -23,7 +23,6 @@
 import 'ordered_typeset.dart';
 import 'options.dart';
 import 'types/abstract_value_domain.dart';
-import 'universe/class_hierarchy.dart';
 import 'universe/class_set.dart';
 import 'universe/function_set.dart' show FunctionSet;
 import 'universe/selector.dart' show Selector;
@@ -69,8 +68,6 @@
 
   Iterable<MemberEntity> get processedMembers;
 
-  ClassHierarchy get classHierarchy;
-
   /// Returns `true` if [cls] is either directly or indirectly instantiated.
   bool isInstantiated(ClassEntity cls);
 
@@ -175,6 +172,27 @@
   /// Returns an iterable over the common supertypes of the [classes].
   Iterable<ClassEntity> commonSupertypesOf(Iterable<ClassEntity> classes);
 
+  /// 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 live mixin applications that mixin [cls].
   Iterable<ClassEntity> mixinUsesOf(ClassEntity cls);
 
@@ -337,6 +355,19 @@
   bool isInheritedInSubtypeOf(MemberEntity member, ClassEntity type);
 }
 
+/// Enum values defining subset of classes included in queries.
+enum ClassQuery {
+  /// Only the class itself is included.
+  EXACT,
+
+  /// The class and all subclasses (transitively) are included.
+  SUBCLASS,
+
+  /// The class and all classes that implement or subclass it (transitively)
+  /// are included.
+  SUBTYPE,
+}
+
 abstract class ClosedWorldBase implements JClosedWorld {
   final ConstantSystem constantSystem;
   final NativeData nativeData;
@@ -373,8 +404,6 @@
 
   final Iterable<MemberEntity> processedMembers;
 
-  final ClassHierarchy classHierarchy;
-
   ClosedWorldBase(
       this.elementEnvironment,
       this.dartTypes,
@@ -396,9 +425,7 @@
       AbstractValueStrategy abstractValueStrategy)
       : this._implementedClasses = implementedClasses,
         this._classHierarchyNodes = classHierarchyNodes,
-        this._classSets = classSets,
-        classHierarchy = new ClassHierarchyImpl(
-            commonElements, classHierarchyNodes, classSets) {}
+        this._classSets = classSets {}
 
   bool checkEntity(covariant Entity element);
 
@@ -638,6 +665,27 @@
     return classSet != null ? classSet.getLubOfInstantiatedSubtypes() : null;
   }
 
+  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.');
+  }
+
   /// Returns `true` if [cls] is mixed into a live class.
   bool isUsedAsMixin(ClassEntity cls) {
     return !mixinUsesOf(cls).isEmpty;
@@ -761,6 +809,38 @@
     return commonSupertypes;
   }
 
+  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;
+    });
+  }
+
   /// Returns an iterable over the live mixin applications that mixin [cls].
   Iterable<ClassEntity> mixinUsesOf(ClassEntity cls) {
     if (_liveMixinUses == null) {
@@ -957,11 +1037,23 @@
   InterceptorData get interceptorData;
   ElementEnvironment get elementEnvironment;
   CommonElements get commonElements;
-  ClassHierarchy get classHierarchy;
 
   /// Returns `true` if [cls] is implemented by an instantiated class.
   bool isImplemented(ClassEntity cls);
 
+  /// Returns [ClassHierarchyNode] for [cls] used to model the class hierarchies
+  /// of known classes.
+  ///
+  /// This method is only provided for testing. For queries on classes, use the
+  /// methods defined in [JClosedWorld].
+  ClassHierarchyNode getClassHierarchyNode(ClassEntity cls);
+
+  /// Returns [ClassSet] for [cls] used to model the extends and implements
+  /// relations of known classes.
+  ///
+  /// This method is only provided for testing. For queries on classes, use the
+  /// methods defined in [JClosedWorld].
+  ClassSet getClassSet(ClassEntity cls);
   Iterable<MemberEntity> get liveInstanceMembers;
   Map<ClassEntity, Set<ClassEntity>> get mixinUses;
   Map<ClassEntity, Set<ClassEntity>> get typesImplementedBySubclasses;
@@ -973,4 +1065,42 @@
   Iterable<MemberEntity> get processedMembers;
   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(
+      ClassEntity cls, IterationStep f(ClassEntity cls));
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index c72cfab..7065b1b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -2495,7 +2495,7 @@
         if (receiver is LargeIntAccessGenerator) {
           int value = int.tryParse("-" + receiver.token.lexeme);
           if (value != null) {
-            receiverValue = forest.literalInt(value, token);
+            receiverValue = forest.literalInt(value, receiver.token);
             if (errorOnUnexactWebIntLiterals) {
               checkWebIntLiteralsErrorIfUnexact(value, token);
             }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
index 930a322..ebb64ec 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
@@ -432,6 +432,49 @@
     cloned.parent = cls;
   }
 
+  void addNoSuchMethodForwarderGetterForField(Member noSuchMethod,
+      KernelTarget target, Field field, ClassHierarchy hierarchy) {
+    Substitution substitution = Substitution.fromSupertype(
+        hierarchy.getClassAsInstanceOf(cls, field.enclosingClass));
+    Procedure getter = new Procedure(
+        field.name,
+        ProcedureKind.Getter,
+        new FunctionNode(null,
+            typeParameters: <TypeParameter>[],
+            positionalParameters: <VariableDeclaration>[],
+            namedParameters: <VariableDeclaration>[],
+            requiredParameterCount: 0,
+            returnType: substitution.substituteType(field.type)),
+        fileUri: field.fileUri)
+      ..fileOffset = field.fileOffset;
+    transformProcedureToNoSuchMethodForwarder(noSuchMethod, target, getter);
+    cls.procedures.add(getter);
+    getter.parent = cls;
+  }
+
+  void addNoSuchMethodForwarderSetterForField(Member noSuchMethod,
+      KernelTarget target, Field field, ClassHierarchy hierarchy) {
+    Substitution substitution = Substitution.fromSupertype(
+        hierarchy.getClassAsInstanceOf(cls, field.enclosingClass));
+    Procedure setter = new Procedure(
+        field.name,
+        ProcedureKind.Setter,
+        new FunctionNode(null,
+            typeParameters: <TypeParameter>[],
+            positionalParameters: <VariableDeclaration>[
+              new VariableDeclaration("value",
+                  type: substitution.substituteType(field.type))
+            ],
+            namedParameters: <VariableDeclaration>[],
+            requiredParameterCount: 1,
+            returnType: const VoidType()),
+        fileUri: field.fileUri)
+      ..fileOffset = field.fileOffset;
+    transformProcedureToNoSuchMethodForwarder(noSuchMethod, target, setter);
+    cls.procedures.add(setter);
+    setter.parent = cls;
+  }
+
   /// Adds noSuchMethod forwarding stubs to this class. Returns `true` if the
   /// class was modified.
   bool addNoSuchMethodForwarders(
@@ -492,6 +535,14 @@
         existingForwardersNames.add(member.name);
         changed = true;
       }
+      if (member is Field &&
+          ClassHierarchy.findMemberByName(concrete, member.name) == null &&
+          !existingForwardersNames.contains(member.name)) {
+        addNoSuchMethodForwarderGetterForField(
+            noSuchMethod, target, member, hierarchy);
+        existingForwardersNames.add(member.name);
+        changed = true;
+      }
     }
 
     List<Member> concreteSetters =
@@ -514,6 +565,15 @@
         existingSetterForwardersNames.add(member.name);
         changed = true;
       }
+      if (member is Field &&
+          ClassHierarchy.findMemberByName(concreteSetters, member.name) ==
+              null &&
+          !existingSetterForwardersNames.contains(member.name)) {
+        addNoSuchMethodForwarderSetterForField(
+            noSuchMethod, target, member, hierarchy);
+        existingSetterForwardersNames.add(member.name);
+        changed = true;
+      }
     }
 
     return changed;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
index c4b13df..a842348 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
@@ -830,8 +830,8 @@
           fileOffset,
           noLength);
     }
-    inferrer.listener
-        .constructorInvocation(this, fileOffset, target, inferredType);
+    inferrer.listener.constructorInvocation(
+        this, argumentJudgments.fileOffset, target, inferredType);
 
     if (isRedirected(this)) {
       InterfaceType returnType = inferredType;
@@ -1071,8 +1071,8 @@
         argumentJudgments);
     var inferredType = inferenceResult.type;
     this.inferredType = inferredType;
-    inferrer.listener
-        .constructorInvocation(this, fileOffset, target, inferredType);
+    inferrer.listener.constructorInvocation(
+        this, argumentJudgments.fileOffset, target, inferredType);
 
     if (isRedirected(this)) {
       InterfaceType returnType = inferredType;
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 6178e4b..3b8f651 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -4079,21 +4079,17 @@
   /// This is a suffix parser because it is assumed that type arguments have
   /// been parsed, or `listener.handleNoTypeArguments(..)` has been executed.
   Token parseLiteralFunctionSuffix(Token token) {
-    Token next = token.next;
-    assert(optional('(', next));
-    Token closeBrace = next.endGroup;
-    if (closeBrace != null) {
-      Token nextToken = closeBrace.next;
-      int kind = nextToken.kind;
-      if (identical(kind, FUNCTION_TOKEN) ||
-          identical(kind, OPEN_CURLY_BRACKET_TOKEN) ||
-          (identical(kind, KEYWORD_TOKEN) &&
-              (optional('async', nextToken) || optional('sync', nextToken)))) {
-        return parseFunctionExpression(token);
-      }
-      // Fall through.
+    assert(optional('(', token.next));
+    // Scanner ensures `(` has matching `)`.
+    Token next = token.next.endGroup.next;
+    int kind = next.kind;
+    if (!identical(kind, FUNCTION_TOKEN) &&
+        !identical(kind, OPEN_CURLY_BRACKET_TOKEN) &&
+        (!identical(kind, KEYWORD_TOKEN) ||
+            !optional('async', next) && !optional('sync', next))) {
+      reportRecoverableErrorWithToken(next, fasta.templateUnexpectedToken);
     }
-    return reportUnexpectedToken(next);
+    return parseFunctionExpression(token);
   }
 
   /// genericListLiteral | genericMapLiteral | genericFunctionLiteral.
@@ -4105,25 +4101,31 @@
   ///   genericFunctionLiteral ::=
   ///       typeParameters formalParameterList functionBody
   /// Provide token for [constKeyword] if preceded by 'const', null if not.
-  Token parseLiteralListOrMapOrFunction(Token token, Token constKeyword) {
+  Token parseLiteralListOrMapOrFunction(final Token start, Token constKeyword) {
+    assert(optional('<', start.next));
+    TypeParamOrArgInfo typeParamOrArg = computeTypeParamOrArg(start, true);
+    Token token = typeParamOrArg.skip(start);
     Token next = token.next;
-    assert(optional('<', next));
-    Token closeBrace = next.endGroup;
-    if (constKeyword == null &&
-        closeBrace != null &&
-        identical(closeBrace.next.kind, OPEN_PAREN_TOKEN)) {
-      token = computeTypeParamOrArg(token).parseVariables(token, this);
-      return parseLiteralFunctionSuffix(token);
-    } else {
-      token = computeTypeParamOrArg(token).parseArguments(token, this);
-      Token next = token.next;
-      if (optional('{', next)) {
-        return parseLiteralMapSuffix(token, constKeyword);
-      } else if ((optional('[', next)) || (optional('[]', next))) {
-        return parseLiteralListSuffix(token, constKeyword);
+    if (optional('(', next)) {
+      if (constKeyword != null) {
+        reportRecoverableErrorWithToken(
+            constKeyword, fasta.templateUnexpectedToken);
       }
-      return reportUnexpectedToken(token.next);
+      token = typeParamOrArg.parseVariables(start, this);
+      return parseLiteralFunctionSuffix(token);
     }
+    token = typeParamOrArg.parseArguments(start, this);
+    if (optional('{', next)) {
+      return parseLiteralMapSuffix(token, constKeyword);
+    }
+    if (!optional('[', next) && !optional('[]', next)) {
+      // TODO(danrubel): Improve this error message.
+      reportRecoverableError(
+          next, fasta.templateExpectedButGot.withArguments('['));
+      rewriter.insertTokenAfter(
+          token, new SyntheticToken(TokenType.INDEX, next.charOffset));
+    }
+    return parseLiteralListSuffix(token, constKeyword);
   }
 
   /// ```
diff --git a/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart b/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
index 9a1a945..8d05a29 100644
--- a/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
+++ b/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
@@ -603,9 +603,12 @@
       assert(optional('>', endGroup) || optional('>>', endGroup));
       // If `>>`, then the end or last consumed token is the token before `>>`.
       end = optional('>>', next) ? token : next;
-    } else if (inDeclaration && start.endGroup == null) {
-      // Recovery: Unbalanced `<`
-      end = token;
+    } else if (inDeclaration) {
+      end = start.endGroup;
+      if (end == null) {
+        // Recovery: Unbalanced `<`
+        end = token;
+      }
     } else {
       return noTypeParamOrArg;
     }
@@ -614,6 +617,7 @@
 
   @override
   Token parseArguments(Token token, Parser parser) {
+    assert(identical(token.next, start));
     Token next = start;
     Token innerEndGroup = processBeginGroup(start, parser);
     parser.listener.beginTypeArguments(start);
@@ -654,6 +658,7 @@
 
   @override
   Token parseVariables(Token token, Parser parser) {
+    assert(identical(token.next, start));
     Token next = start;
     Listener listener = parser.listener;
     listener.beginTypeVariables(start);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart b/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
index e414ffe5..9805fbf 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
@@ -832,8 +832,38 @@
     setters.length = candidates.length;
     int getterIndex = 0;
     int setterIndex = 0;
+    // To detect conflicts between instance members (possibly inherited ones)
+    // and static members, use a map from names to lists of members.  There can
+    // be more than one static member with a given name, e.g., if there is a
+    // getter and a setter.  We will report both conflicts.
+    Map<Name, List<Member>> staticMembers = {};
+    for (var procedure in class_.procedures) {
+      if (procedure.isStatic) {
+        staticMembers.putIfAbsent(procedure.name, () => []).add(procedure);
+      }
+    }
+    for (var field in class_.fields) {
+      if (field.isStatic) {
+        staticMembers.putIfAbsent(field.name, () => []).add(field);
+      }
+    }
     forEachApiMember(candidates, (int start, int end, Name name) {
       Procedure member = candidates[start];
+      // We should not have a method, getter, or setter in our interface that
+      // conflicts with a static method, getter, or setter declared in the
+      // class.
+      List<Member> conflicts = staticMembers[name];
+      if (conflicts != null) {
+        for (var conflict in conflicts) {
+          library.addProblem(messageDeclaredMemberConflictsWithInheritedMember,
+              conflict.fileOffset, noLength, conflict.fileUri,
+              context: [
+                messageDeclaredMemberConflictsWithInheritedMemberCause
+                    .withLocation(member.fileUri, member.fileOffset, noLength)
+              ]);
+        }
+        return;
+      }
       ProcedureKind kind = _kindOf(member);
       if (kind != ProcedureKind.Getter && kind != ProcedureKind.Setter) {
         for (int i = start + 1; i < end; ++i) {
diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml
index dd18315..41420c9 100644
--- a/pkg/front_end/pubspec.yaml
+++ b/pkg/front_end/pubspec.yaml
@@ -1,7 +1,7 @@
 name: front_end
 # Currently, front_end API is not stable and users should not
 # depend on semver semantics when depending on this package.
-version: 0.1.1
+version: 0.1.2
 author: Dart Team <misc@dartlang.org>
 description: Front end for compilation of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/front_end
@@ -11,7 +11,7 @@
   charcode: '^1.1.1'
   convert: '^2.0.1'
   crypto: '^2.0.2'
-  kernel: 0.3.1
+  kernel: 0.3.2
   meta: '^1.1.1'
   package_config: '^1.0.1'
   path: '^1.3.9'
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart
new file mode 100644
index 0000000..fdaad64
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart
@@ -0,0 +1,35 @@
+// 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.
+
+// This test checks that noSuchMethod forwarders are generated for abstract
+// accessors implicitly declared via fields of abstract classes.  The type
+// checks should be performed for the return values of getters and for the r.h.s
+// of assignments for setters.
+
+void expectTypeError(callback()) {
+  try {
+    callback();
+    throw 'Expected TypeError, did not occur';
+  } on TypeError {}
+}
+
+abstract class I {
+  int foo;
+}
+
+class A implements I {
+  dynamic noSuchMethod(i) => "bar";
+
+  // Should have noSuchMethod forwarders for the 'foo' getter and setter.
+}
+
+class B extends A {
+  // Should not have noSuchMethod forwarders for the 'foo' getter and setter.
+}
+
+main() {
+  var a = new A();
+  expectTypeError(() => a.foo);
+  expectTypeError(() => (a as dynamic).foo = "bar");
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.expect
new file mode 100644
index 0000000..4715ca5
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class A extends core::Object implements self::I {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic i) → dynamic
+    return "bar";
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+class B extends self::A {
+  synthetic constructor •() → void
+    : super self::A::•()
+    ;
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  dynamic a = new self::A::•();
+  self::expectTypeError(() → dynamic => a.foo);
+  self::expectTypeError(() → dynamic => (a as dynamic).foo = "bar");
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.transformed.expect
new file mode 100644
index 0000000..4715ca5
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.transformed.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class A extends core::Object implements self::I {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic i) → dynamic
+    return "bar";
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+class B extends self::A {
+  synthetic constructor •() → void
+    : super self::A::•()
+    ;
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  dynamic a = new self::A::•();
+  self::expectTypeError(() → dynamic => a.foo);
+  self::expectTypeError(() → dynamic => (a as dynamic).foo = "bar");
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.outline.expect
new file mode 100644
index 0000000..4a9cf68
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.outline.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  field core::int foo;
+  synthetic constructor •() → void
+    ;
+}
+class A extends core::Object implements self::I {
+  synthetic constructor •() → void
+    ;
+  method noSuchMethod(dynamic i) → dynamic
+    ;
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+class B extends self::A {
+  synthetic constructor •() → void
+    ;
+}
+static method expectTypeError(() → dynamic callback) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.strong.expect
new file mode 100644
index 0000000..178f196
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.strong.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class A extends core::Object implements self::I {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic
+    return "bar";
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+class B extends self::A {
+  synthetic constructor •() → void
+    : super self::A::•()
+    ;
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  self::A a = new self::A::•();
+  self::expectTypeError(() → core::int => a.{self::A::foo});
+  self::expectTypeError(() → core::String => (a as dynamic).foo = "bar");
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.strong.transformed.expect
new file mode 100644
index 0000000..178f196
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.strong.transformed.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class A extends core::Object implements self::I {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic
+    return "bar";
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+class B extends self::A {
+  synthetic constructor •() → void
+    : super self::A::•()
+    ;
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  self::A a = new self::A::•();
+  self::expectTypeError(() → core::int => a.{self::A::foo});
+  self::expectTypeError(() → core::String => (a as dynamic).foo = "bar");
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart
new file mode 100644
index 0000000..cebe1ac
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart
@@ -0,0 +1,40 @@
+// 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.
+
+// This test checks that noSuchMethod forwarders that were generated for
+// abstract accessors declared via field in an interface don't override concrete
+// getters and setters in the mixin application.
+
+int count = 0;
+
+abstract class A {
+  int foo;
+}
+
+class B implements A {
+  noSuchMethod(i) {
+    ++count;
+    return null;
+  }
+
+  // Should receive noSuchMethod forwarders for the 'foo' getter and setter.
+}
+
+class C extends Object with B {
+  // The getter and the setter below shouldn't be overridden with noSuchMethod
+  // forwarders.
+  int get foo => 42;
+  void set foo(int value) {}
+}
+
+main() {
+  var c = new C();
+  if (c.foo != 42) {
+    throw "Value mismatch: c.foo != 42.";
+  }
+  c.foo = 43;
+  if (count != 0) {
+    throw "Value mismatch: count != 0";
+  }
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.expect
new file mode 100644
index 0000000..b5697c5
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.expect
@@ -0,0 +1,44 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic i) → dynamic {
+    self::count = self::count.+(1);
+    return null;
+  }
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+abstract class _C&Object&B = core::Object with self::B {
+}
+class C extends self::_C&Object&B {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  get foo() → core::int
+    return 42;
+  set foo(core::int value) → void {}
+}
+static field core::int count = 0;
+static method main() → dynamic {
+  dynamic c = new self::C::•();
+  if(!c.foo.==(42)) {
+    throw "Value mismatch: c.foo != 42.";
+  }
+  c.foo = 43;
+  if(!self::count.==(0)) {
+    throw "Value mismatch: count != 0";
+  }
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.transformed.expect
new file mode 100644
index 0000000..dba219d
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.transformed.expect
@@ -0,0 +1,51 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic i) → dynamic {
+    self::count = self::count.+(1);
+    return null;
+  }
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+abstract class _C&Object&B extends core::Object implements self::B {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic i) → dynamic {
+    self::count = self::count.+(1);
+    return null;
+  }
+}
+class C extends self::_C&Object&B {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  get foo() → core::int
+    return 42;
+  set foo(core::int value) → void {}
+}
+static field core::int count = 0;
+static method main() → dynamic {
+  dynamic c = new self::C::•();
+  if(!c.foo.==(42)) {
+    throw "Value mismatch: c.foo != 42.";
+  }
+  c.foo = 43;
+  if(!self::count.==(0)) {
+    throw "Value mismatch: count != 0";
+  }
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect
new file mode 100644
index 0000000..ec76229
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect
@@ -0,0 +1,32 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo;
+  synthetic constructor •() → void
+    ;
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → void
+    ;
+  method noSuchMethod(dynamic i) → dynamic
+    ;
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+abstract class _C&Object&B = core::Object with self::B {
+}
+class C extends self::_C&Object&B {
+  synthetic constructor •() → void
+    ;
+  get foo() → core::int
+    ;
+  set foo(core::int value) → void
+    ;
+}
+static field core::int count;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.expect
new file mode 100644
index 0000000..953a669
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.expect
@@ -0,0 +1,44 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic {
+    self::count = self::count.{core::num::+}(1);
+    return null;
+  }
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+abstract class _C&Object&B = core::Object with self::B {
+}
+class C extends self::_C&Object&B {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  get foo() → core::int
+    return 42;
+  set foo(core::int value) → void {}
+}
+static field core::int count = 0;
+static method main() → dynamic {
+  self::C c = new self::C::•();
+  if(!c.{self::C::foo}.{core::num::==}(42)) {
+    throw "Value mismatch: c.foo != 42.";
+  }
+  c.{self::C::foo} = 43;
+  if(!self::count.{core::num::==}(0)) {
+    throw "Value mismatch: count != 0";
+  }
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.transformed.expect
new file mode 100644
index 0000000..ab758a7
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.transformed.expect
@@ -0,0 +1,51 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic {
+    self::count = self::count.{core::num::+}(1);
+    return null;
+  }
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+abstract class _C&Object&B extends core::Object implements self::B {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic {
+    self::count = self::count.{core::num::+}(1);
+    return null;
+  }
+}
+class C extends self::_C&Object&B {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  get foo() → core::int
+    return 42;
+  set foo(core::int value) → void {}
+}
+static field core::int count = 0;
+static method main() → dynamic {
+  self::C c = new self::C::•();
+  if(!c.{self::C::foo}.{core::num::==}(42)) {
+    throw "Value mismatch: c.foo != 42.";
+  }
+  c.{self::C::foo} = 43;
+  if(!self::count.{core::num::==}(0)) {
+    throw "Value mismatch: count != 0";
+  }
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart
new file mode 100644
index 0000000..74d8dee
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart
@@ -0,0 +1,48 @@
+// 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.
+
+// This test checks that noSuchMethod forwarders are generated for abstract
+// accessors implicitly declared via fields of abstract classes in case when one
+// of the accessors is defined in a superclass.
+
+void expectTypeError(callback()) {
+  try {
+    callback();
+    throw 'Expected TypeError, did not occur';
+  } on TypeError {}
+}
+
+abstract class A {
+  int foo;
+}
+
+abstract class B implements A {
+  int get foo => 42;
+
+  noSuchMethod(i) => "bar";
+}
+
+class C extends B {
+  // Should receive a noSuchMethod forwarder for the 'foo' setter, but not for
+  // the 'foo' getter.
+}
+
+abstract class D implements A {
+  void set foo(int value) {}
+
+  noSuchMethod(i) => "bar";
+}
+
+class E extends D {
+  // Should receive a noSuchMethod forwarder for the 'foo' getter, but not for
+  // the 'foo' setter.
+}
+
+main() {
+  var c = new C();
+  expectTypeError(() => (c as dynamic).foo = "bar");
+
+  var e = new E();
+  expectTypeError(() => e.foo);
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.expect
new file mode 100644
index 0000000..4f01365
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.expect
@@ -0,0 +1,55 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+abstract class B extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  get foo() → core::int
+    return 42;
+  method noSuchMethod(dynamic i) → dynamic
+    return "bar";
+}
+class C extends self::B {
+  synthetic constructor •() → void
+    : super self::B::•()
+    ;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+abstract class D extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  set foo(core::int value) → void {}
+  method noSuchMethod(dynamic i) → dynamic
+    return "bar";
+}
+class E extends self::D {
+  synthetic constructor •() → void
+    : super self::D::•()
+    ;
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  dynamic c = new self::C::•();
+  self::expectTypeError(() → dynamic => (c as dynamic).foo = "bar");
+  dynamic e = new self::E::•();
+  self::expectTypeError(() → dynamic => e.foo);
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.transformed.expect
new file mode 100644
index 0000000..4f01365
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.transformed.expect
@@ -0,0 +1,55 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+abstract class B extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  get foo() → core::int
+    return 42;
+  method noSuchMethod(dynamic i) → dynamic
+    return "bar";
+}
+class C extends self::B {
+  synthetic constructor •() → void
+    : super self::B::•()
+    ;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+abstract class D extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  set foo(core::int value) → void {}
+  method noSuchMethod(dynamic i) → dynamic
+    return "bar";
+}
+class E extends self::D {
+  synthetic constructor •() → void
+    : super self::D::•()
+    ;
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  dynamic c = new self::C::•();
+  self::expectTypeError(() → dynamic => (c as dynamic).foo = "bar");
+  dynamic e = new self::E::•();
+  self::expectTypeError(() → dynamic => e.foo);
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.outline.expect
new file mode 100644
index 0000000..02d4667
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.outline.expect
@@ -0,0 +1,41 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo;
+  synthetic constructor •() → void
+    ;
+}
+abstract class B extends core::Object implements self::A {
+  synthetic constructor •() → void
+    ;
+  get foo() → core::int
+    ;
+  method noSuchMethod(dynamic i) → dynamic
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → void
+    ;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+abstract class D extends core::Object implements self::A {
+  synthetic constructor •() → void
+    ;
+  set foo(core::int value) → void
+    ;
+  method noSuchMethod(dynamic i) → dynamic
+    ;
+}
+class E extends self::D {
+  synthetic constructor •() → void
+    ;
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+}
+static method expectTypeError(() → dynamic callback) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.strong.expect
new file mode 100644
index 0000000..43a4429
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.strong.expect
@@ -0,0 +1,55 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+abstract class B extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  get foo() → core::int
+    return 42;
+  method noSuchMethod(core::Invocation i) → dynamic
+    return "bar";
+}
+class C extends self::B {
+  synthetic constructor •() → void
+    : super self::B::•()
+    ;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+abstract class D extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  set foo(core::int value) → void {}
+  method noSuchMethod(core::Invocation i) → dynamic
+    return "bar";
+}
+class E extends self::D {
+  synthetic constructor •() → void
+    : super self::D::•()
+    ;
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  self::C c = new self::C::•();
+  self::expectTypeError(() → core::String => (c as dynamic).foo = "bar");
+  self::E e = new self::E::•();
+  self::expectTypeError(() → core::int => e.{self::E::foo});
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.strong.transformed.expect
new file mode 100644
index 0000000..43a4429
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.strong.transformed.expect
@@ -0,0 +1,55 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+abstract class B extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  get foo() → core::int
+    return 42;
+  method noSuchMethod(core::Invocation i) → dynamic
+    return "bar";
+}
+class C extends self::B {
+  synthetic constructor •() → void
+    : super self::B::•()
+    ;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+abstract class D extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  set foo(core::int value) → void {}
+  method noSuchMethod(core::Invocation i) → dynamic
+    return "bar";
+}
+class E extends self::D {
+  synthetic constructor •() → void
+    : super self::D::•()
+    ;
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  self::C c = new self::C::•();
+  self::expectTypeError(() → core::String => (c as dynamic).foo = "bar");
+  self::E e = new self::E::•();
+  self::expectTypeError(() → core::int => e.{self::E::foo});
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart
new file mode 100644
index 0000000..8b3cd2c
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart
@@ -0,0 +1,33 @@
+// 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.
+
+// This test checks that noSuchMethod forwarders that are generated for abstract
+// accessors synthesized from a field of an interface have the proper type
+// substitution performed on the types of their parameters and on the return
+// type.
+
+void expectTypeError(callback()) {
+  try {
+    callback();
+    throw 'Expected TypeError, did not occur';
+  } on TypeError {}
+}
+
+abstract class A<X> {
+  List<X> foo;
+}
+
+class B implements A<int> {
+  dynamic noSuchMethod(i) => <dynamic>[];
+
+  // The noSuchMethod forwarder for the getter should return `List<int>`.
+
+  // The noSuchMethod forwarder for the setter should take `List<int>`.
+}
+
+main() {
+  var b = new B();
+  expectTypeError(() => b.foo);
+  expectTypeError(() => (b as dynamic).foo = <dynamic>[]);
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.expect
new file mode 100644
index 0000000..232606c
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object = dynamic> extends core::Object {
+  field core::List<self::A::X> foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A<core::int> {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic i) → dynamic
+    return <dynamic>[];
+  no-such-method-forwarder get foo() → core::List<core::int>
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::List<core::int>;
+  no-such-method-forwarder set foo(core::List<core::int> value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  dynamic b = new self::B::•();
+  self::expectTypeError(() → dynamic => b.foo);
+  self::expectTypeError(() → dynamic => (b as dynamic).foo = <dynamic>[]);
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.transformed.expect
new file mode 100644
index 0000000..232606c
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.transformed.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object = dynamic> extends core::Object {
+  field core::List<self::A::X> foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A<core::int> {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic i) → dynamic
+    return <dynamic>[];
+  no-such-method-forwarder get foo() → core::List<core::int>
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::List<core::int>;
+  no-such-method-forwarder set foo(core::List<core::int> value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  dynamic b = new self::B::•();
+  self::expectTypeError(() → dynamic => b.foo);
+  self::expectTypeError(() → dynamic => (b as dynamic).foo = <dynamic>[]);
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect
new file mode 100644
index 0000000..8d22954
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect
@@ -0,0 +1,23 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object = dynamic> extends core::Object {
+  field core::List<self::A::X> foo;
+  synthetic constructor •() → void
+    ;
+}
+class B extends core::Object implements self::A<core::int> {
+  synthetic constructor •() → void
+    ;
+  method noSuchMethod(dynamic i) → dynamic
+    ;
+  no-such-method-forwarder get foo() → core::List<core::int>
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::List<core::int>;
+  no-such-method-forwarder set foo(core::List<core::int> value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+static method expectTypeError(() → dynamic callback) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.expect
new file mode 100644
index 0000000..3b8a767
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object = dynamic> extends core::Object {
+  generic-covariant-impl field core::List<self::A::X> foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A<core::int> {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic
+    return <dynamic>[];
+  no-such-method-forwarder get foo() → core::List<core::int>
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::List<core::int>;
+  no-such-method-forwarder set foo(core::List<core::int> value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  self::B b = new self::B::•();
+  self::expectTypeError(() → core::List<core::int> => b.{self::B::foo});
+  self::expectTypeError(() → core::List<dynamic> => (b as dynamic).foo = <dynamic>[]);
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.transformed.expect
new file mode 100644
index 0000000..3b8a767
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.transformed.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object = dynamic> extends core::Object {
+  generic-covariant-impl field core::List<self::A::X> foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A<core::int> {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic
+    return <dynamic>[];
+  no-such-method-forwarder get foo() → core::List<core::int>
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::List<core::int>;
+  no-such-method-forwarder set foo(core::List<core::int> value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  self::B b = new self::B::•();
+  self::expectTypeError(() → core::List<core::int> => b.{self::B::foo});
+  self::expectTypeError(() → core::List<dynamic> => (b as dynamic).foo = <dynamic>[]);
+}
diff --git a/pkg/kernel/pubspec.yaml b/pkg/kernel/pubspec.yaml
index ac6ca9c2..651c83e5 100644
--- a/pkg/kernel/pubspec.yaml
+++ b/pkg/kernel/pubspec.yaml
@@ -1,7 +1,7 @@
 name: kernel
 # Currently, kernel API is not stable and users should
 # not depend on semver semantics when depending on this package.
-version: 0.3.1
+version: 0.3.2
 author: Dart Team <misc@dartlang.org>
 description: Dart IR (Intermediate Representation)
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/kernel
@@ -14,7 +14,7 @@
   package_config: ^1.0.0
 dev_dependencies:
   analyzer: '>=0.31.0 <0.33.0'
-  front_end: 0.1.1
+  front_end: 0.1.2
   test: ^0.12.15+6
   stack_trace: ^1.6.6
   test_reflective_loader: ^0.1.0
diff --git a/pkg/pkg.status b/pkg/pkg.status
index cd5cb27..5e11bee 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -151,6 +151,9 @@
 [ $no_preview_dart_2 ]
 dev_compiler/*: SkipByDesign # uses Dart 2.
 
+[ !$preview_dart_2 ]
+smith/test/*: Skip # Uses optional new.
+
 [ $arch == x64 && $runtime == vm && $system == windows && $checked ]
 analyzer/test/src/task/strong/inferred_type_test: Pass, Slow
 
@@ -167,8 +170,9 @@
 analysis_server/test/services/correction/fix_test: Fail
 analysis_server/test/services/refactoring/extract_local_test: Fail
 analyzer/test/generated/compile_time_error_code_driver_test: Fail
+analyzer/test/generated/compile_time_error_code_kernel_test: Fail
+analyzer/test/generated/compile_time_error_code_kernel_test.dart: Fail
 analyzer/test/generated/compile_time_error_code_test: Fail
-analyzer/test/generated/hint_code_driver_test: Fail
 analyzer/test/generated/invalid_code_driver_test: Fail
 analyzer/test/generated/non_error_resolver_driver_test: Fail
 analyzer/test/generated/non_error_resolver_test: Fail
diff --git a/pkg/smith/analysis_options.yaml b/pkg/smith/analysis_options.yaml
new file mode 100644
index 0000000..1a46de2
--- /dev/null
+++ b/pkg/smith/analysis_options.yaml
@@ -0,0 +1,3 @@
+analyzer:
+  strong-mode:
+    implicit-casts: false
diff --git a/pkg/smith/bin/print_configurations.dart b/pkg/smith/bin/print_configurations.dart
new file mode 100644
index 0000000..38b175d
--- /dev/null
+++ b/pkg/smith/bin/print_configurations.dart
@@ -0,0 +1,14 @@
+// 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:smith/smith.dart';
+
+/// A rudimentary script to print the configurations in the given test matrix
+/// file.
+void main(List<String> arguments) {
+  // TODO(rnystrom): Validate args. Usage.
+  var matrix = TestMatrix.fromPath(arguments[0]);
+  for (var configuration in matrix.configurations) {
+    print(configuration);
+  }
+}
diff --git a/pkg/smith/lib/configuration.dart b/pkg/smith/lib/configuration.dart
new file mode 100644
index 0000000..0467305
--- /dev/null
+++ b/pkg/smith/lib/configuration.dart
@@ -0,0 +1,795 @@
+// 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:io';
+
+// TODO(rnystrom): Differences from test.dart's version:
+// - Remove special handling for "ff" as firefox.
+// - "windows" -> "win".
+// - "macos" -> "mac".
+// - toString() on enum classes is just name.
+// - builderTag defaults to empty string, not null.
+// Need to migrate test.dart to not expect the above before it can use this.
+
+// READ ME! If you add a new field to this, make sure to add it to
+// [parse()], [optionsEqual()], [hashCode], and [toString()]. A good check is to
+// comment out an existing field and see what breaks. Every error is a place
+// where you will need to add code for your new field.
+
+/// A set of options that affects how a Dart SDK test is run in a way that may
+/// affect its outcome.
+///
+/// This includes options like "compiler" and "runtime" which fundamentally
+/// decide how a test is executed. Options are tracked because a single test
+/// may have different outcomes for different configurations. For example, it
+/// may currently pass on the VM but not dart2js or vice versa.
+///
+/// Options that affect how a test can be run but don't affect its outcome are
+/// *not* stored here. Things like how test results are displayed, where logs
+/// are written, etc. live outside of this.
+class Configuration {
+  /// Expands a configuration name "[template]" all using [optionsJson] to a
+  /// list of configurations.
+  ///
+  /// A template is a configuration name that contains zero or more
+  /// parenthesized sections. Within the parentheses are a series of options
+  /// separated by pipes. For example:
+  ///
+  ///     strong-fasta-(linux|mac|win)-(debug|release)
+  ///
+  /// Text outside of parenthesized groups is treated literally. Each
+  /// parenthesized section expands to a configuration for each of the options
+  /// separated by pipes. If a template contains multiple parenthesized
+  /// sections, configurations are created for all combinations of them. The
+  /// above template expands to:
+  ///
+  ///     strong-fasta-linux-debug
+  ///     strong-fasta-linux-release
+  ///     strong-fasta-mac-debug
+  ///     strong-fasta-mac-release
+  ///     strong-fasta-win-debug
+  ///     strong-fasta-win-release
+  ///
+  /// After expansion, the resulting strings (and [optionsJson]) are passed to
+  /// [parse()] to convert each one to a full configuration.
+  static List<Configuration> expandTemplate(
+      String template, Map<String, dynamic> optionsJson) {
+    if (template.isEmpty) throw FormatException("Template must not be empty.");
+
+    var sections = <List<String>>[];
+    var start = 0;
+    while (start < template.length) {
+      var openParen = template.indexOf("(", start);
+
+      if (openParen == -1) {
+        // Add the last literal section.
+        sections.add([template.substring(start, template.length)]);
+        break;
+      }
+
+      var closeParen = template.indexOf(")", openParen);
+      if (closeParen == -1) {
+        throw FormatException('Missing ")" in name template "$template".');
+      }
+
+      // Add the literal part before the next "(".
+      sections.add([template.substring(start, openParen)]);
+
+      // Add the options within the parentheses.
+      sections.add(template.substring(openParen + 1, closeParen).split("|"));
+
+      // Continue past the ")".
+      start = closeParen + 1;
+    }
+
+    var result = <Configuration>[];
+
+    // Walk through every combination of every section.
+    iterateSection(String prefix, int section) {
+      // If we pinned all the sections, parse it.
+      if (section >= sections.length) {
+        try {
+          result.add(Configuration.parse(prefix, optionsJson));
+        } on FormatException catch (ex) {
+          throw FormatException(
+              'Could not parse expanded configuration "$prefix" from template '
+              '"$template":\n${ex.message}');
+        }
+        return;
+      }
+
+      for (var i = 0; i < sections[section].length; i++) {
+        iterateSection(prefix + sections[section][i], section + 1);
+      }
+    }
+
+    iterateSection("", 0);
+
+    return result;
+  }
+
+  /// Parse a single configuration with [name] with additional options defined
+  /// in [optionsJson].
+  ///
+  /// The name should be a series of words separated by hyphens. Any word that
+  /// matches the name of an [Architecture], [Compiler], [Mode], [Runtime], or
+  /// [System] sets that option in the resulting configuration. Those options
+  /// may also be specified in the JSON map.
+  ///
+  /// Additional Boolean and string options are defined in the map. The key
+  /// names match the corresponding command-line option names, using kebab-case.
+  static Configuration parse(String name, Map<String, dynamic> optionsJson) {
+    if (name.isEmpty) throw FormatException("Name must not be empty.");
+
+    // Infer option values from the words in the configuration name.
+    var words = name.split("-").toSet();
+    var optionsCopy = new Map.of(optionsJson);
+
+    T enumOption<T extends NamedEnum>(
+        String option, List<String> allowed, T Function(String) parse) {
+      // Look up the value from the words in the name.
+      T fromName;
+      for (var value in allowed) {
+        // Don't treat "none" as matchable since it's ambiguous as to whether
+        // it refers to compiler or runtime.
+        if (value == "none") continue;
+
+        if (words.contains(value)) {
+          if (fromName != null) {
+            throw FormatException(
+                'Found multiple values for $option ("$fromName" and "$value"), '
+                'in configuration name.');
+          }
+          fromName = parse(value);
+        }
+      }
+
+      // Look up the value from the options.
+      T fromOption;
+      if (optionsCopy.containsKey(option)) {
+        fromOption = parse(optionsCopy[option] as String);
+        optionsCopy.remove(option);
+      }
+
+      if (fromName != null && fromOption != null) {
+        if (fromName == fromOption) {
+          throw FormatException(
+              'Redundant $option in configuration name "$fromName" and options.');
+        } else {
+          throw FormatException(
+              'Found $option "$fromOption" in options and "$fromName" in '
+              'configuration name.');
+        }
+      }
+
+      return fromName ?? fromOption;
+    }
+
+    bool boolOption(String option) {
+      if (!optionsCopy.containsKey(option)) return null;
+
+      var value = optionsCopy.remove(option);
+      if (value == null) throw FormatException('Option "$option" was null.');
+      if (value is! bool) {
+        throw FormatException('Option "$option" had value "$value", which is '
+            'not a bool.');
+      }
+      return value as bool;
+    }
+
+    int intOption(String option) {
+      if (!optionsCopy.containsKey(option)) return null;
+
+      var value = optionsCopy.remove(option);
+      if (value == null) throw FormatException('Option "$option" was null.');
+      if (value is! int) {
+        throw FormatException('Option "$option" had value "$value", which is '
+            'not an int.');
+      }
+      return value as int;
+    }
+
+    String stringOption(String option) {
+      if (!optionsCopy.containsKey(option)) return null;
+
+      var value = optionsCopy.remove(option);
+      if (value == null) throw FormatException('Option "$option" was null.');
+      if (value is! String) {
+        throw FormatException('Option "$option" had value "$value", which is '
+            'not a string.');
+      }
+      return value as String;
+    }
+
+    // Extract options from the name and map.
+    var architecture =
+        enumOption("architecture", Architecture.names, Architecture.find);
+    var compiler = enumOption("compiler", Compiler.names, Compiler.find);
+    var mode = enumOption("mode", Mode.names, Mode.find);
+    var runtime = enumOption("runtime", Runtime.names, Runtime.find);
+    var system = enumOption("system", System.names, System.find);
+
+    // Fill in any missing values using defaults when possible.
+    architecture ??= Architecture.x64;
+    system ??= System.host;
+
+    // Infer from compiler from runtime or vice versa.
+    if (compiler == null) {
+      if (runtime == null) {
+        throw FormatException(
+            'Must specify at least one of compiler or runtime in options or '
+            'configuration name.');
+      } else {
+        compiler = runtime.defaultCompiler;
+      }
+    } else {
+      if (runtime == null) {
+        runtime = compiler.defaultRuntime;
+      } else {
+        // Do nothing, specified both.
+      }
+    }
+
+    // Infer the mode from the compiler.
+    mode ??= compiler.defaultMode;
+
+    var configuration = Configuration(
+        name, architecture, compiler, mode, runtime, system,
+        builderTag: stringOption("builder-tag"),
+        vmOptions: stringOption("vm-options"),
+        timeout: intOption("timeout"),
+        enableAsserts: boolOption("enable-asserts"),
+        isChecked: boolOption("checked"),
+        isCsp: boolOption("csp"),
+        isHostChecked: boolOption("host-checked"),
+        isMinified: boolOption("minified"),
+        isStrong: boolOption("strong"),
+        previewDart2: boolOption("preview-dart-2"),
+        useBlobs: boolOption("use-blobs"),
+        useDart2JSWithKernel: boolOption("dart2js-with-kernel"),
+        useDart2JSOldFrontEnd: boolOption("dart2js-old-frontend"),
+        useFastStartup: boolOption("fast-startup"),
+        useHotReload: boolOption("hot-reload"),
+        useHotReloadRollback: boolOption("hot-reload-rollback"),
+        useSdk: boolOption("use-sdk"));
+
+    // Should have consumed the whole map.
+    if (optionsCopy.isNotEmpty) {
+      throw new FormatException('Unknown option "${optionsCopy.keys.first}".');
+    }
+
+    return configuration;
+  }
+
+  final String name;
+
+  final Architecture architecture;
+
+  final Compiler compiler;
+
+  final Mode mode;
+
+  final Runtime runtime;
+
+  final System system;
+
+  // TODO(rnystrom): Is this still needed?
+  final String builderTag;
+
+  final String vmOptions;
+
+  final int timeout;
+
+  final bool enableAsserts;
+
+  // TODO(rnystrom): Remove this when Dart 1.0 is no longer supported.
+  final bool isChecked;
+
+  final bool isCsp;
+
+  // TODO(rnystrom): Remove this when Dart 1.0 is no longer supported.
+  final bool isHostChecked;
+
+  final bool isMinified;
+
+  // TODO(rnystrom): Remove this when Dart 1.0 is no longer supported.
+  final bool isStrong;
+
+  // TODO(rnystrom): Remove this when Dart 1.0 is no longer supported.
+  final bool previewDart2;
+
+  // TODO(rnystrom): What is this?
+  final bool useBlobs;
+
+  // TODO(rnystrom): Remove these when Dart 1.0 is no longer supported.
+  final bool useDart2JSWithKernel;
+  final bool useDart2JSOldFrontEnd;
+
+  final bool useFastStartup;
+
+  final bool useHotReload;
+  final bool useHotReloadRollback;
+
+  final bool useSdk;
+
+  Configuration(this.name, this.architecture, this.compiler, this.mode,
+      this.runtime, this.system,
+      {String builderTag,
+      String vmOptions,
+      int timeout,
+      bool enableAsserts,
+      bool isChecked,
+      bool isCsp,
+      bool isHostChecked,
+      bool isMinified,
+      bool isStrong,
+      bool previewDart2,
+      bool useBlobs,
+      bool useDart2JSWithKernel,
+      bool useDart2JSOldFrontEnd,
+      bool useFastStartup,
+      bool useHotReload,
+      bool useHotReloadRollback,
+      bool useSdk})
+      : builderTag = builderTag ?? "",
+        vmOptions = vmOptions ?? "",
+        timeout = timeout ?? 0,
+        enableAsserts = enableAsserts ?? false,
+        isChecked = isChecked ?? false,
+        isCsp = isCsp ?? false,
+        isHostChecked = isHostChecked ?? false,
+        isMinified = isMinified ?? false,
+        isStrong = isStrong ?? false,
+        previewDart2 = previewDart2 ?? false,
+        useBlobs = useBlobs ?? false,
+        useDart2JSWithKernel = useDart2JSWithKernel ?? false,
+        useDart2JSOldFrontEnd = useDart2JSOldFrontEnd ?? false,
+        useFastStartup = useFastStartup ?? false,
+        useHotReload = useHotReload ?? false,
+        useHotReloadRollback = useHotReloadRollback ?? false,
+        useSdk = useSdk ?? false;
+
+  /// Returns `true` if this configuration's options all have the same values
+  /// as [other].
+  bool optionsEqual(Configuration other) =>
+      architecture == other.architecture &&
+      compiler == other.compiler &&
+      mode == other.mode &&
+      runtime == other.runtime &&
+      system == other.system &&
+      builderTag == other.builderTag &&
+      vmOptions == other.vmOptions &&
+      timeout == other.timeout &&
+      enableAsserts == other.enableAsserts &&
+      isChecked == other.isChecked &&
+      isCsp == other.isCsp &&
+      isHostChecked == other.isHostChecked &&
+      isMinified == other.isMinified &&
+      isStrong == other.isStrong &&
+      previewDart2 == other.previewDart2 &&
+      useBlobs == other.useBlobs &&
+      useDart2JSWithKernel == other.useDart2JSWithKernel &&
+      useDart2JSOldFrontEnd == other.useDart2JSOldFrontEnd &&
+      useFastStartup == other.useFastStartup &&
+      useHotReload == other.useHotReload &&
+      useHotReloadRollback == other.useHotReloadRollback &&
+      useSdk == other.useSdk;
+
+  bool operator ==(Object other) =>
+      other is Configuration && name == other.name && optionsEqual(other);
+
+  int get hashCode =>
+      name.hashCode ^
+      architecture.hashCode ^
+      compiler.hashCode ^
+      mode.hashCode ^
+      runtime.hashCode ^
+      system.hashCode ^
+      builderTag.hashCode ^
+      vmOptions.hashCode ^
+      timeout.hashCode ^
+      (enableAsserts ? 1 : 0) ^
+      (isChecked ? 2 : 0) ^
+      (isCsp ? 4 : 0) ^
+      (isHostChecked ? 8 : 0) ^
+      (isMinified ? 16 : 0) ^
+      (isStrong ? 32 : 0) ^
+      (previewDart2 ? 64 : 0) ^
+      (useBlobs ? 128 : 0) ^
+      (useDart2JSWithKernel ? 256 : 0) ^
+      (useDart2JSOldFrontEnd ? 512 : 0) ^
+      (useFastStartup ? 1024 : 0) ^
+      (useHotReload ? 2048 : 0) ^
+      (useHotReloadRollback ? 4096 : 0) ^
+      (useSdk ? 8192 : 0);
+
+  String toString() {
+    var buffer = new StringBuffer();
+    buffer.write(name);
+    buffer.write("(");
+
+    var fields = <String>[];
+    fields.add("architecture: $architecture");
+    fields.add("compiler: $compiler");
+    fields.add("mode: $mode");
+    fields.add("runtime: $runtime");
+    fields.add("system: $system");
+
+    if (builderTag != "") fields.add("builder-tag: $builderTag");
+    if (vmOptions != "") fields.add("vm-options: $vmOptions");
+    if (timeout != 0) fields.add("timeout: $timeout");
+    if (enableAsserts) fields.add("enable-asserts");
+    if (isChecked) fields.add("checked");
+    if (isCsp) fields.add("csp");
+    if (isHostChecked) fields.add("host-checked");
+    if (isMinified) fields.add("minified");
+    if (isStrong) fields.add("strong");
+    if (previewDart2) fields.add("preview-dart-2");
+    if (useBlobs) fields.add("use-blobs");
+    if (useDart2JSWithKernel) fields.add("dart2js-with-kernel");
+    if (useDart2JSOldFrontEnd) fields.add("dart2js-old-frontend");
+    if (useFastStartup) fields.add("fast-startup");
+    if (useHotReload) fields.add("hot-reload");
+    if (useHotReloadRollback) fields.add("hot-reload-rollback");
+    if (useSdk) fields.add("use-sdk");
+
+    buffer.write(fields.join(", "));
+    buffer.write(")");
+    return buffer.toString();
+  }
+}
+
+class Architecture extends NamedEnum {
+  static const ia32 = const Architecture._('ia32');
+  static const x64 = const Architecture._('x64');
+  static const arm = const Architecture._('arm');
+  static const armv6 = const Architecture._('armv6');
+  static const armv5te = const Architecture._('armv5te');
+  static const arm64 = const Architecture._('arm64');
+  static const simarm = const Architecture._('simarm');
+  static const simarmv6 = const Architecture._('simarmv6');
+  static const simarmv5te = const Architecture._('simarmv5te');
+  static const simarm64 = const Architecture._('simarm64');
+  static const simdbc = const Architecture._('simdbc');
+  static const simdbc64 = const Architecture._('simdbc64');
+
+  static final List<String> names = _all.keys.toList();
+
+  static final _all = new Map<String, Architecture>.fromIterable([
+    ia32,
+    x64,
+    arm,
+    armv6,
+    armv5te,
+    arm64,
+    simarm,
+    simarmv6,
+    simarmv5te,
+    simarm64,
+    simdbc,
+    simdbc64
+  ], key: (architecture) => (architecture as Architecture).name);
+
+  static Architecture find(String name) {
+    var architecture = _all[name];
+    if (architecture != null) return architecture;
+
+    throw new ArgumentError('Unknown architecture "$name".');
+  }
+
+  const Architecture._(String name) : super(name);
+}
+
+class Compiler extends NamedEnum {
+  static const none = const Compiler._('none');
+  static const precompiler = const Compiler._('precompiler');
+  static const dart2js = const Compiler._('dart2js');
+  static const dart2analyzer = const Compiler._('dart2analyzer');
+  static const dartdevc = const Compiler._('dartdevc');
+  static const dartdevk = const Compiler._('dartdevk');
+  static const appJit = const Compiler._('app_jit');
+  static const appJitk = const Compiler._('app_jitk');
+  static const dartk = const Compiler._('dartk');
+  static const dartkp = const Compiler._('dartkp');
+  static const specParser = const Compiler._('spec_parser');
+  static const fasta = const Compiler._('fasta');
+
+  static final List<String> names = _all.keys.toList();
+
+  static final _all = new Map<String, Compiler>.fromIterable([
+    none,
+    precompiler,
+    dart2js,
+    dart2analyzer,
+    dartdevc,
+    dartdevk,
+    appJit,
+    appJitk,
+    dartk,
+    dartkp,
+    specParser,
+    fasta,
+  ], key: (compiler) => (compiler as Compiler).name);
+
+  static Compiler find(String name) {
+    var compiler = _all[name];
+    if (compiler != null) return compiler;
+
+    throw new ArgumentError('Unknown compiler "$name".');
+  }
+
+  const Compiler._(String name) : super(name);
+
+  /// Gets the runtimes this compiler can target.
+  List<Runtime> get supportedRuntimes {
+    switch (this) {
+      case Compiler.dart2js:
+        // Note: by adding 'none' as a configuration, if the user
+        // runs test.py -c dart2js -r drt,none the dart2js_none and
+        // dart2js_drt will be duplicating work. If later we don't need 'none'
+        // with dart2js, we should remove it from here.
+        return const [
+          Runtime.d8,
+          Runtime.jsshell,
+          Runtime.none,
+          Runtime.firefox,
+          Runtime.chrome,
+          Runtime.safari,
+          Runtime.ie9,
+          Runtime.ie10,
+          Runtime.ie11,
+          Runtime.chromeOnAndroid,
+        ];
+
+      case Compiler.dartdevc:
+      case Compiler.dartdevk:
+        // TODO(rnystrom): Expand to support other JS execution environments
+        // (other browsers, d8) when tested and working.
+        return const [
+          Runtime.none,
+          Runtime.chrome,
+        ];
+
+      case Compiler.dart2analyzer:
+        return const [Runtime.none];
+      case Compiler.appJit:
+      case Compiler.appJitk:
+      case Compiler.dartk:
+        return const [Runtime.vm, Runtime.selfCheck];
+      case Compiler.precompiler:
+      case Compiler.dartkp:
+        return const [Runtime.dartPrecompiled];
+      case Compiler.specParser:
+        return const [Runtime.none];
+      case Compiler.fasta:
+        return const [Runtime.none];
+      case Compiler.none:
+        return const [Runtime.vm, Runtime.flutter];
+    }
+
+    throw "unreachable";
+  }
+
+  /// The preferred runtime to use with this compiler if no other runtime is
+  /// specified.
+  Runtime get defaultRuntime {
+    switch (this) {
+      case Compiler.dart2js:
+        return Runtime.d8;
+      case Compiler.dartdevc:
+      case Compiler.dartdevk:
+        return Runtime.chrome;
+      case Compiler.dart2analyzer:
+        return Runtime.none;
+      case Compiler.appJit:
+      case Compiler.appJitk:
+      case Compiler.dartk:
+        return Runtime.vm;
+      case Compiler.precompiler:
+      case Compiler.dartkp:
+        return Runtime.dartPrecompiled;
+      case Compiler.specParser:
+      case Compiler.fasta:
+        return Runtime.none;
+      case Compiler.none:
+        return Runtime.vm;
+    }
+
+    throw "unreachable";
+  }
+
+  Mode get defaultMode {
+    switch (this) {
+      case Compiler.dart2analyzer:
+      case Compiler.dart2js:
+      case Compiler.dartdevc:
+      case Compiler.dartdevk:
+      case Compiler.fasta:
+        return Mode.release;
+
+      default:
+        return Mode.debug;
+    }
+  }
+}
+
+class Mode extends NamedEnum {
+  static const debug = const Mode._('debug');
+  static const product = const Mode._('product');
+  static const release = const Mode._('release');
+
+  static final List<String> names = _all.keys.toList();
+
+  static final _all = new Map<String, Mode>.fromIterable(
+      [debug, product, release],
+      key: (mode) => (mode as Mode).name);
+
+  static Mode find(String name) {
+    var mode = _all[name];
+    if (mode != null) return mode;
+
+    throw new ArgumentError('Unknown mode "$name".');
+  }
+
+  const Mode._(String name) : super(name);
+
+  bool get isDebug => this == debug;
+}
+
+class Runtime extends NamedEnum {
+  static const vm = const Runtime._('vm');
+  static const flutter = const Runtime._('flutter');
+  static const dartPrecompiled = const Runtime._('dart_precompiled');
+  static const d8 = const Runtime._('d8');
+  static const jsshell = const Runtime._('jsshell');
+  static const firefox = const Runtime._('firefox');
+  static const chrome = const Runtime._('chrome');
+  static const safari = const Runtime._('safari');
+  static const ie9 = const Runtime._('ie9');
+  static const ie10 = const Runtime._('ie10');
+  static const ie11 = const Runtime._('ie11');
+  static const chromeOnAndroid = const Runtime._('chromeOnAndroid');
+  static const selfCheck = const Runtime._('self_check');
+  static const none = const Runtime._('none');
+
+  static final List<String> names = _all.keys.toList();
+
+  static final _all = new Map<String, Runtime>.fromIterable([
+    vm,
+    flutter,
+    dartPrecompiled,
+    d8,
+    jsshell,
+    firefox,
+    chrome,
+    safari,
+    ie9,
+    ie10,
+    ie11,
+    chromeOnAndroid,
+    selfCheck,
+    none
+  ], key: (runtime) => (runtime as Runtime).name);
+
+  static Runtime find(String name) {
+    var runtime = _all[name];
+    if (runtime != null) return runtime;
+
+    throw new ArgumentError('Unknown runtime "$name".');
+  }
+
+  const Runtime._(String name) : super(name);
+
+  bool get isBrowser => const [
+        ie9,
+        ie10,
+        ie11,
+        safari,
+        chrome,
+        firefox,
+        chromeOnAndroid
+      ].contains(this);
+
+  bool get isIE => name.startsWith("ie");
+
+  bool get isSafari => name.startsWith("safari");
+
+  /// Whether this runtime is a command-line JavaScript environment.
+  bool get isJSCommandLine => const [d8, jsshell].contains(this);
+
+  /// If the runtime doesn't support `Window.open`, we use iframes instead.
+  bool get requiresIFrame => !const [ie11, ie10].contains(this);
+
+  /// The preferred compiler to use with this runtime if no other compiler is
+  /// specified.
+  Compiler get defaultCompiler {
+    switch (this) {
+      case vm:
+      case flutter:
+        return Compiler.none;
+
+      case dartPrecompiled:
+        return Compiler.precompiler;
+
+      case d8:
+      case jsshell:
+      case firefox:
+      case chrome:
+      case safari:
+      case ie9:
+      case ie10:
+      case ie11:
+      case chromeOnAndroid:
+        return Compiler.dart2js;
+
+      case selfCheck:
+        return Compiler.dartk;
+
+      case none:
+        // If we aren't running it, we probably just want to analyze it.
+        return Compiler.dart2analyzer;
+    }
+
+    throw "unreachable";
+  }
+}
+
+class System extends NamedEnum {
+  static const android = const System._('android');
+  static const fuchsia = const System._('fuchsia');
+  static const linux = const System._('linux');
+  static const mac = const System._('mac');
+  static const win = const System._('win');
+
+  static final List<String> names = _all.keys.toList();
+
+  static final _all = new Map<String, System>.fromIterable(
+      [android, fuchsia, linux, mac, win],
+      key: (system) => (system as System).name);
+
+  /// Gets the system of the current machine.
+  static System get host => find(Platform.operatingSystem);
+
+  static System find(String name) {
+    var system = _all[name];
+    if (system != null) return system;
+
+    // Also allow dart:io's names for the operating systems.
+    switch (Platform.operatingSystem) {
+      case "macos":
+        return mac;
+      case "windows":
+        return win;
+    }
+    // TODO(rnystrom): What about ios?
+
+    throw new ArgumentError('Unknown operating system "$name".');
+  }
+
+  const System._(String name) : super(name);
+
+  /// The root directory name for build outputs on this system.
+  String get outputDirectory {
+    switch (this) {
+      case android:
+      case fuchsia:
+      case linux:
+      case win:
+        return 'out/';
+
+      case mac:
+        return 'xcodebuild/';
+    }
+
+    throw "unreachable";
+  }
+}
+
+/// Base class for an enum-like class whose values are identified by name.
+abstract class NamedEnum {
+  final String name;
+
+  const NamedEnum(this.name);
+
+  String toString() => name;
+}
diff --git a/pkg/smith/lib/smith.dart b/pkg/smith/lib/smith.dart
new file mode 100644
index 0000000..7118870
--- /dev/null
+++ b/pkg/smith/lib/smith.dart
@@ -0,0 +1,5 @@
+// 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.
+export 'configuration.dart';
+export 'test_matrix.dart';
diff --git a/pkg/smith/lib/test_matrix.dart b/pkg/smith/lib/test_matrix.dart
new file mode 100644
index 0000000..0bf2a5b
--- /dev/null
+++ b/pkg/smith/lib/test_matrix.dart
@@ -0,0 +1,55 @@
+// 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:convert';
+import 'dart:io';
+
+import 'configuration.dart';
+
+/// The manifest that defines the set of supported test [Configuration]s and
+/// how they are run on the bots.
+class TestMatrix {
+  final List<Configuration> configurations;
+
+  /// Reads a test matrix from the file at [path].
+  static TestMatrix fromPath(String path) {
+    var json = jsonDecode(new File(path).readAsStringSync());
+    return fromJson(json as Map<String, dynamic>);
+  }
+
+  static TestMatrix fromJson(Map<String, dynamic> json) {
+    var configurationsJson = json["configurations"] as Map<String, dynamic>;
+
+    // Keep track of the configurations and which templates they were expanded
+    // from.
+    var configurations = <Configuration>[];
+
+    configurationsJson.forEach((template, configurationJson) {
+      var options = configurationJson["options"] ?? const <String, dynamic>{};
+
+      for (var configuration in Configuration.expandTemplate(
+          template, options as Map<String, dynamic>)) {
+        for (var existing in configurations) {
+          // Make the names don't collide.
+          if (configuration.name == existing.name) {
+            throw FormatException(
+                'Configuration "${configuration.name}" already exists.');
+          }
+
+          // Make sure we don't have two equivalent configurations.
+          if (configuration.optionsEqual(existing)) {
+            throw FormatException(
+                'Configuration "${configuration.name}" is identical to '
+                '"${existing.name}".');
+          }
+        }
+
+        configurations.add(configuration);
+      }
+    });
+
+    return TestMatrix._(configurations);
+  }
+
+  TestMatrix._(this.configurations);
+}
diff --git a/pkg/smith/pubspec.yaml b/pkg/smith/pubspec.yaml
new file mode 100644
index 0000000..42a702f
--- /dev/null
+++ b/pkg/smith/pubspec.yaml
@@ -0,0 +1,7 @@
+name: smith
+author: Dart Team <misc@dartlang.org>
+description: Shared code for working with the Dart SDK's tests and test runner.
+homepage: http://www.dartlang.org
+dev_dependencies:
+  expect:
+    path: ../expect
diff --git a/pkg/smith/test/configuration_test.dart b/pkg/smith/test/configuration_test.dart
new file mode 100644
index 0000000..56404d0
--- /dev/null
+++ b/pkg/smith/test/configuration_test.dart
@@ -0,0 +1,369 @@
+// 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:expect/minitest.dart';
+
+import 'package:smith/smith.dart';
+
+void main() {
+  group("Configuration", () {
+    test("equality", () {
+      // Same.
+      expect(
+          Configuration("name", Architecture.x64, Compiler.dart2js, Mode.debug,
+              Runtime.vm, System.linux),
+          equals(Configuration("name", Architecture.x64, Compiler.dart2js,
+              Mode.debug, Runtime.vm, System.linux)));
+
+      // Mode debug != release.
+      expect(
+          Configuration("name", Architecture.x64, Compiler.dart2js, Mode.debug,
+              Runtime.vm, System.linux),
+          notEquals(Configuration("name", Architecture.x64, Compiler.dart2js,
+              Mode.release, Runtime.vm, System.linux)));
+
+      // Differ by non-required option.
+      expect(
+          Configuration("name", Architecture.x64, Compiler.dart2js, Mode.debug,
+              Runtime.vm, System.linux, enableAsserts: true),
+          notEquals(Configuration("name", Architecture.x64, Compiler.dart2js,
+              Mode.debug, Runtime.vm, System.linux,
+              enableAsserts: false)));
+    });
+
+    group(".expandTemplate()", () {
+      test("empty string", () {
+        expectExpandError("", {}, 'Template must not be empty.');
+      });
+
+      test("missing ')'", () {
+        expectExpandError(
+            "before-(oops", {}, 'Missing ")" in name template "before-(oops".');
+      });
+
+      test("no parentheses", () {
+        expect(
+            Configuration.expandTemplate("x64-dart2js-debug-vm-linux", {}),
+            equals([
+              Configuration("x64-dart2js-debug-vm-linux", Architecture.x64,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.linux)
+            ]));
+      });
+
+      test("parentheses at beginning", () {
+        expect(
+            Configuration.expandTemplate(
+                "(ia32|x64)-dart2js-debug-vm-linux", {}),
+            equals([
+              Configuration("ia32-dart2js-debug-vm-linux", Architecture.ia32,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.linux),
+              Configuration("x64-dart2js-debug-vm-linux", Architecture.x64,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.linux)
+            ]));
+      });
+
+      test("parentheses at end", () {
+        expect(
+            Configuration.expandTemplate(
+                "x64-dart2js-debug-vm-(linux|mac|win)", {}),
+            equals([
+              Configuration("x64-dart2js-debug-vm-linux", Architecture.x64,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.linux),
+              Configuration("x64-dart2js-debug-vm-mac", Architecture.x64,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.mac),
+              Configuration("x64-dart2js-debug-vm-win", Architecture.x64,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.win)
+            ]));
+      });
+
+      test("expands all parenthesized sections", () {
+        expect(
+            Configuration.expandTemplate(
+                "(ia32|x64)-dart2js-(debug|release)-vm-(linux|mac|win)", {}),
+            equals([
+              Configuration("ia32-dart2js-debug-vm-linux", Architecture.ia32,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.linux),
+              Configuration("ia32-dart2js-debug-vm-mac", Architecture.ia32,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.mac),
+              Configuration("ia32-dart2js-debug-vm-win", Architecture.ia32,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.win),
+              Configuration("ia32-dart2js-release-vm-linux", Architecture.ia32,
+                  Compiler.dart2js, Mode.release, Runtime.vm, System.linux),
+              Configuration("ia32-dart2js-release-vm-mac", Architecture.ia32,
+                  Compiler.dart2js, Mode.release, Runtime.vm, System.mac),
+              Configuration("ia32-dart2js-release-vm-win", Architecture.ia32,
+                  Compiler.dart2js, Mode.release, Runtime.vm, System.win),
+              Configuration("x64-dart2js-debug-vm-linux", Architecture.x64,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.linux),
+              Configuration("x64-dart2js-debug-vm-mac", Architecture.x64,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.mac),
+              Configuration("x64-dart2js-debug-vm-win", Architecture.x64,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.win),
+              Configuration("x64-dart2js-release-vm-linux", Architecture.x64,
+                  Compiler.dart2js, Mode.release, Runtime.vm, System.linux),
+              Configuration("x64-dart2js-release-vm-mac", Architecture.x64,
+                  Compiler.dart2js, Mode.release, Runtime.vm, System.mac),
+              Configuration("x64-dart2js-release-vm-win", Architecture.x64,
+                  Compiler.dart2js, Mode.release, Runtime.vm, System.win)
+            ]));
+      });
+      test("empty '()' is treated as empty string", () {
+        expect(
+            Configuration.expandTemplate("x64-()dart2js-debug-vm-linux", {}),
+            equals([
+              Configuration("x64-dart2js-debug-vm-linux", Architecture.x64,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.linux)
+            ]));
+      });
+    });
+
+    group(".parse()", () {
+      test("infer required fields from name", () {
+        expect(
+            Configuration.parse("ia32-dart2js-debug-vm-linux", {}),
+            equals(Configuration(
+                "ia32-dart2js-debug-vm-linux",
+                Architecture.ia32,
+                Compiler.dart2js,
+                Mode.debug,
+                Runtime.vm,
+                System.linux)));
+      });
+
+      test("read required fields from options", () {
+        expect(
+            Configuration.parse("something", {
+              "architecture": "x64",
+              "compiler": "dart2js",
+              "mode": "debug",
+              "runtime": "vm",
+              "system": "linux"
+            }),
+            equals(Configuration("something", Architecture.x64,
+                Compiler.dart2js, Mode.debug, Runtime.vm, System.linux)));
+      });
+
+      test("required fields from both name and options", () {
+        expect(
+            Configuration.parse("dart2js-vm",
+                {"architecture": "x64", "mode": "debug", "system": "linux"}),
+            equals(Configuration("dart2js-vm", Architecture.x64,
+                Compiler.dart2js, Mode.debug, Runtime.vm, System.linux)));
+      });
+
+      test("'none' is not treated as compiler or runtime name", () {
+        expect(
+            Configuration.parse("none-x64-dart2js-debug-vm-linux", {}),
+            equals(Configuration(
+                "none-x64-dart2js-debug-vm-linux",
+                Architecture.x64,
+                Compiler.dart2js,
+                Mode.debug,
+                Runtime.vm,
+                System.linux)));
+      });
+
+      test("architecture defaults to 'x64'", () {
+        expect(Configuration.parse("dart2js-debug-vm-linux", {}).architecture,
+            equals(Architecture.x64));
+      });
+
+      test("compiler defaults to runtime's default compiler", () {
+        expect(Configuration.parse("vm", {}).compiler, equals(Compiler.none));
+      });
+
+      test("mode defaults to compiler's default mode", () {
+        expect(Configuration.parse("dartkp-vm-linux", {}).mode,
+            equals(Mode.debug));
+
+        expect(Configuration.parse("dart2js-vm-linux", {}).mode,
+            equals(Mode.release));
+      });
+
+      test("runtime defaults to compiler's default runtime", () {
+        expect(Configuration.parse("dartdevc", {}).runtime,
+            equals(Runtime.chrome));
+      });
+
+      test("runtime defaults to compiler's default runtime from option", () {
+        expect(Configuration.parse("wat", {"compiler": "dartdevc"}).runtime,
+            equals(Runtime.chrome));
+      });
+
+      test("system defaults to the host os", () {
+        expect(
+            Configuration.parse("dart2js-vm", {}).system, equals(System.host));
+      });
+
+      test("other options from map", () {
+        expect(
+            Configuration.parse("dart2js", {
+              "builder-tag": "the tag",
+              "vm-options": "vm stuff",
+              "enable-asserts": true,
+              "checked": true,
+              "csp": true,
+              "host-checked": true,
+              "minified": true,
+              "preview-dart-2": true,
+              "dart2js-with-kernel": true,
+              "dart2js-old-frontend": true,
+              "fast-startup": true,
+              "hot-reload": true,
+              "hot-reload-rollback": true,
+              "use-sdk": true,
+            }),
+            equals(Configuration(
+              "dart2js",
+              Architecture.x64,
+              Compiler.dart2js,
+              Mode.release,
+              Runtime.d8,
+              System.host,
+              builderTag: "the tag",
+              vmOptions: "vm stuff",
+              enableAsserts: true,
+              isChecked: true,
+              isCsp: true,
+              isHostChecked: true,
+              isMinified: true,
+              previewDart2: true,
+              useDart2JSWithKernel: true,
+              useDart2JSOldFrontEnd: true,
+              useFastStartup: true,
+              useHotReload: true,
+              useHotReloadRollback: true,
+              useSdk: true,
+            )));
+      });
+
+      test("neither compiler nor runtime specified", () {
+        expectParseError(
+            "debug",
+            {},
+            'Must specify at least one of compiler or runtime in options or '
+            'configuration name.');
+      });
+
+      test("empty string", () {
+        expectParseError("", {}, 'Name must not be empty.');
+      });
+
+      test("redundant field", () {
+        expectParseError("dart2js-debug", {"mode": "debug"},
+            'Redundant mode in configuration name "debug" and options.');
+      });
+
+      test("duplicate field", () {
+        expectParseError(
+            "dart2js-debug",
+            {"mode": "release"},
+            'Found mode "release" in options and "debug" in configuration '
+            'name.');
+      });
+
+      test("multiple values for same option in name", () {
+        expectParseError(
+            "dart2js-debug-release",
+            {},
+            'Found multiple values for mode ("debug" and "release"), in '
+            'configuration name.');
+      });
+
+      test("null bool option", () {
+        expectParseError("dart2js", {"enable-asserts": null},
+            'Option "enable-asserts" was null.');
+      });
+
+      test("wrong type for bool option", () {
+        expectParseError("dart2js", {"enable-asserts": "false"},
+            'Option "enable-asserts" had value "false", which is not a bool.');
+      });
+
+      test("null string option", () {
+        expectParseError(
+            "dart2js", {"builder-tag": null}, 'Option "builder-tag" was null.');
+      });
+
+      test("wrong type for string option", () {
+        expectParseError("dart2js", {"builder-tag": true},
+            'Option "builder-tag" had value "true", which is not a string.');
+      });
+
+      test("unknown option", () {
+        expectParseError("dart2js", {"wat": "???"}, 'Unknown option "wat".');
+      });
+    });
+
+    group("constructor", () {});
+
+    group("optionsEqual()", () {
+      var debugWithAsserts = Configuration(
+        "name",
+        Architecture.x64,
+        Compiler.dart2js,
+        Mode.debug,
+        Runtime.vm,
+        System.linux,
+        enableAsserts: true,
+      );
+
+      var debugWithAsserts2 = Configuration(
+        "different name",
+        Architecture.x64,
+        Compiler.dart2js,
+        Mode.debug,
+        Runtime.vm,
+        System.linux,
+        enableAsserts: true,
+      );
+
+      var debugNoAsserts = Configuration(
+        "name",
+        Architecture.x64,
+        Compiler.dart2js,
+        Mode.debug,
+        Runtime.vm,
+        System.linux,
+      );
+
+      var releaseNoAsserts = Configuration(
+        "name",
+        Architecture.x64,
+        Compiler.dart2js,
+        Mode.release,
+        Runtime.vm,
+        System.linux,
+      );
+
+      test("different options are not equal", () {
+        expect(debugWithAsserts.optionsEqual(debugNoAsserts), isFalse);
+        expect(debugNoAsserts.optionsEqual(releaseNoAsserts), isFalse);
+        expect(releaseNoAsserts.optionsEqual(debugWithAsserts), isFalse);
+      });
+
+      test("same options are equal", () {
+        expect(debugWithAsserts.optionsEqual(debugWithAsserts2), isTrue);
+      });
+    });
+  });
+}
+
+void expectParseError(String name, Map<String, dynamic> options, String error) {
+  try {
+    var configuration = Configuration.parse(name, options);
+    fail("Expected FormatException but got $configuration.");
+  } on FormatException catch (ex) {
+    expect(ex.message, equals(error));
+  }
+}
+
+void expectExpandError(
+    String template, Map<String, dynamic> options, String error) {
+  try {
+    var configurations = Configuration.expandTemplate(template, options);
+    fail("Expected FormatException but got $configurations.");
+  } on FormatException catch (ex) {
+    expect(ex.message, equals(error));
+  }
+}
diff --git a/pkg/smith/test/test_matrix_test.dart b/pkg/smith/test/test_matrix_test.dart
new file mode 100644
index 0000000..3872422
--- /dev/null
+++ b/pkg/smith/test/test_matrix_test.dart
@@ -0,0 +1,72 @@
+// 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:expect/minitest.dart';
+
+import 'package:smith/smith.dart';
+
+void main() {
+  group("TestMatrix.fromJson()", () {
+    test("parses configurations", () {
+      var testMatrix = TestMatrix.fromJson({
+        "configurations": {
+          "x64-dart2js-debug-vm-linux": <String, dynamic>{
+            "options": <String, dynamic>{"enableAsserts": true},
+          },
+          "x64-dartdevc-vm-linux": <String, dynamic>{
+            "options": <String, dynamic>{
+              "mode": "release",
+              "enableAsserts": true
+            },
+          },
+        }
+      });
+
+      expect(
+          testMatrix.configurations[0],
+          equals(Configuration("x64-dart2js-debug-vm-linux", Architecture.x64,
+              Compiler.dart2js, Mode.debug, Runtime.vm, System.linux,
+              enableAsserts: true)));
+      expect(
+          testMatrix.configurations[1],
+          equals(Configuration("x64-dartdevc-vm-linux", Architecture.x64,
+              Compiler.dartdevc, Mode.release, Runtime.vm, System.linux,
+              enableAsserts: true)));
+    });
+
+    test("error if expanded configuration names collide", () {
+      expectJsonError(
+          'Configuration "none-x64-dart2js-debug-vm-linux" already exists.', {
+        "configurations": {
+          "none-x64-dart2js-debug-vm-linux": <String, dynamic>{},
+          "none-(x64|ia32)-dart2js-debug-vm-linux": <String, dynamic>{},
+        }
+      });
+    });
+
+    test("error if two configurations have same options", () {
+      expectJsonError(
+          'Configuration "two-x64-dart2js-debug-vm-linux" is identical to '
+          '"one-x64-dart2js-debug-vm-linux".',
+          {
+            "configurations": {
+              "one-x64-dart2js-debug-vm-linux": <String, dynamic>{
+                "options": <String, dynamic>{"enableAsserts": true}
+              },
+              "two-x64-dart2js-debug-vm-linux": <String, dynamic>{
+                "options": <String, dynamic>{"enableAsserts": true}
+              },
+            }
+          });
+    });
+  });
+}
+
+void expectJsonError(String error, Map<String, dynamic> json) {
+  try {
+    var testMatrix = TestMatrix.fromJson(json);
+    fail("Expected FormatException but got $testMatrix.");
+  } on FormatException catch (ex) {
+    expect(ex.message, equals(error));
+  }
+}
diff --git a/pkg/status_file/test/parse_and_normalize_test.dart b/pkg/status_file/test/parse_and_normalize_test.dart
index 0692c3a..a7c3338 100644
--- a/pkg/status_file/test/parse_and_normalize_test.dart
+++ b/pkg/status_file/test/parse_and_normalize_test.dart
@@ -15,19 +15,6 @@
     for (var entry in new Directory.fromUri(repoRoot.resolve(directory))
         .listSync(recursive: true)) {
       if (!entry.path.endsWith(".status")) continue;
-
-      // Inside the co19 repository, there is a status file that doesn't appear
-      // to be valid and looks more like some kind of template or help document.
-      // Ignore it.
-      var co19StatusFile = repoRoot.resolve('tests/co19/src/co19.status');
-      var co19_2StatusFile = repoRoot.resolve('tests/co19_2/src/co19.status');
-      if (FileSystemEntity.identicalSync(
-              entry.path, new File.fromUri(co19StatusFile).path) ||
-          FileSystemEntity.identicalSync(
-              entry.path, new File.fromUri(co19_2StatusFile).path)) {
-        continue;
-      }
-
       try {
         var statusFile = new StatusFile.read(entry.path);
         statusFile.toString();
diff --git a/pkg/status_file/test/repo_status_files_test.dart b/pkg/status_file/test/repo_status_files_test.dart
index 8aacb64..9f14fe7 100644
--- a/pkg/status_file/test/repo_status_files_test.dart
+++ b/pkg/status_file/test/repo_status_files_test.dart
@@ -17,19 +17,6 @@
     for (var entry in new Directory.fromUri(repoRoot.resolve(directory))
         .listSync(recursive: true)) {
       if (!entry.path.endsWith(".status")) continue;
-
-      // Inside the co19 repository, there is a status file that doesn't appear
-      // to be valid and looks more like some kind of template or help document.
-      // Ignore it.
-      var co19StatusFile = repoRoot.resolve('tests/co19/src/co19.status');
-      var co19_2StatusFile = repoRoot.resolve('tests/co19_2/src/co19.status');
-      if (FileSystemEntity.identicalSync(
-              entry.path, new File.fromUri(co19StatusFile).path) ||
-          FileSystemEntity.identicalSync(
-              entry.path, new File.fromUri(co19_2StatusFile).path)) {
-        continue;
-      }
-
       try {
         new StatusFile.read(entry.path);
       } catch (err) {
diff --git a/pkg/vm/lib/bytecode/assembler.dart b/pkg/vm/lib/bytecode/assembler.dart
index d5fa43b..3ccf658 100644
--- a/pkg/vm/lib/bytecode/assembler.dart
+++ b/pkg/vm/lib/bytecode/assembler.dart
@@ -67,6 +67,10 @@
     bytecode.addAll(_encodeBufferOut);
   }
 
+  int _getOpcodeAt(int pos) {
+    return bytecode[pos]; // TODO(alexmarkov): Take endianness into account.
+  }
+
   void _setWord(int pos, int word) {
     _encodeBufferIn[0] = word; // TODO(alexmarkov): Which endianness to use?
     bytecode.setRange(pos, pos + _encodeBufferOut.length, _encodeBufferOut);
@@ -166,8 +170,14 @@
     emitWord(_encodeT(Opcode.kJump, label.jumpOperand(offset)));
   }
 
+  void emitJumpIfNoAsserts(Label label) {
+    emitWord(_encodeT(Opcode.kJumpIfNoAsserts, label.jumpOperand(offset)));
+  }
+
   void patchJump(int pos, int rt) {
-    _setWord(pos, _encodeT(Opcode.kJump, rt));
+    final Opcode opcode = Opcode.values[_getOpcodeAt(pos)];
+    assert(isJump(opcode));
+    _setWord(pos, _encodeT(opcode, rt));
   }
 
   void emitReturn(int ra) {
diff --git a/pkg/vm/lib/bytecode/dbc.dart b/pkg/vm/lib/bytecode/dbc.dart
index c2e6216..a3b002b 100644
--- a/pkg/vm/lib/bytecode/dbc.dart
+++ b/pkg/vm/lib/bytecode/dbc.dart
@@ -18,6 +18,10 @@
 // 3. NativeCall instruction is modified to have 'D' format and take 1 argument:
 //    D = index of NativeEntry constant pool entry
 //
+// 4. JumpIfNoAsserts instruction is added. This instruction jumps to the given
+//    target if assertions are not enabled. It has the same format as Jump
+//    instruction.
+//
 
 enum Opcode {
   kTrap,
@@ -29,6 +33,7 @@
   kDropR,
   kDrop,
   kJump,
+  kJumpIfNoAsserts,
   kReturn,
   kReturnTOS,
   kMove,
@@ -266,6 +271,8 @@
       Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
   Opcode.kJump: const Format(
       Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
+  Opcode.kJumpIfNoAsserts: const Format(
+      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
   Opcode.kReturn: const Format(
       Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
   Opcode.kReturnTOS: const Format(
@@ -651,3 +658,5 @@
   exception,
   stackTrace,
 }
+
+bool isJump(Opcode opcode) => BytecodeFormats[opcode].encoding == Encoding.kT;
diff --git a/pkg/vm/lib/bytecode/disassembler.dart b/pkg/vm/lib/bytecode/disassembler.dart
index 279d492..be1e109 100644
--- a/pkg/vm/lib/bytecode/disassembler.dart
+++ b/pkg/vm/lib/bytecode/disassembler.dart
@@ -95,7 +95,7 @@
   void _scanForJumpTargets() {
     for (int i = 0; i < _instructions.length; i++) {
       final instr = _instructions[i];
-      if (instr.opcode == Opcode.kJump) {
+      if (isJump(instr.opcode)) {
         final target = i + instr.operands[0];
         assert(0 <= target && target < _instructions.length);
         if (!_labels.containsKey(target)) {
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 986874d..c3c76cf 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -30,8 +30,6 @@
 /// Flag to toggle generation of bytecode in platform kernel files.
 const bool isKernelBytecodeEnabledForPlatform = isKernelBytecodeEnabled;
 
-const bool isTraceEnabled = false;
-
 void generateBytecode(Component component,
     {bool strongMode: true, bool dropAST: false}) {
   final coreTypes = new CoreTypes(component);
@@ -107,42 +105,36 @@
     if (node.isAbstract) {
       return;
     }
-    try {
-      if (node is Field) {
-        if (node.isStatic && node.initializer != null) {
-          start(node);
-          if (node.isConst) {
-            _genPushConstExpr(node.initializer);
-          } else {
-            node.initializer.accept(this);
-          }
-          _genReturnTOS();
-          end(node);
-        }
-      } else if ((node is Procedure && !node.isRedirectingFactoryConstructor) ||
-          (node is Constructor)) {
+    if (node is Field) {
+      if (node.isStatic && node.initializer != null) {
         start(node);
-        if (node is Constructor) {
-          _genConstructorInitializers(node);
-        }
-        if (node.isExternal) {
-          final String nativeName = getExternalName(node);
-          if (nativeName == null) {
-            return;
-          }
-          _genNativeCall(nativeName);
+        if (node.isConst) {
+          _genPushConstExpr(node.initializer);
         } else {
-          node.function?.body?.accept(this);
-          // TODO(alexmarkov): figure out when 'return null' should be generated.
-          _genPushNull();
+          node.initializer.accept(this);
         }
         _genReturnTOS();
         end(node);
       }
-    } on UnsupportedOperationError catch (e) {
-      if (isTraceEnabled) {
-        print('Unable to generate bytecode for $node: $e');
+    } else if ((node is Procedure && !node.isRedirectingFactoryConstructor) ||
+        (node is Constructor)) {
+      start(node);
+      if (node is Constructor) {
+        _genConstructorInitializers(node);
       }
+      if (node.isExternal) {
+        final String nativeName = getExternalName(node);
+        if (nativeName == null) {
+          return;
+        }
+        _genNativeCall(nativeName);
+      } else {
+        node.function?.body?.accept(this);
+        // TODO(alexmarkov): figure out when 'return null' should be generated.
+        _genPushNull();
+      }
+      _genReturnTOS();
+      end(node);
     }
   }
 
@@ -230,6 +222,10 @@
   Procedure get futureValue =>
       _futureValue ??= libraryIndex.getMember('dart:async', 'Future', 'value');
 
+  Procedure _throwNewAssertionError;
+  Procedure get throwNewAssertionError => _throwNewAssertionError ??=
+      libraryIndex.getMember('dart:core', '_AssertionError', '_throwNew');
+
   void _genConstructorInitializers(Constructor node) {
     bool isRedirecting =
         node.initializers.any((init) => init is RedirectingInitializer);
@@ -491,14 +487,14 @@
   }
 
   /// Generates bool condition. Returns `true` if condition is negated.
-  bool _genCondition(Node condition) {
+  bool _genCondition(Expression condition) {
     bool negated = false;
     if (condition is Not) {
       condition = (condition as Not).operand;
       negated = true;
     }
     condition.accept(this);
-    // TODO(alexmarkov): bool check
+    asm.emitAssertBoolean(0);
     return negated;
   }
 
@@ -628,10 +624,6 @@
     metadata.mapping[node] =
         new BytecodeMetadata(cp, asm.bytecode, asm.exceptionsTable, closures);
 
-    if (isTraceEnabled) {
-      print('Generated bytecode for $node');
-    }
-
     enclosingClass = null;
     enclosingMember = null;
     classTypeParameters = null;
@@ -1611,7 +1603,24 @@
 
   @override
   visitAssertStatement(AssertStatement node) {
-    // TODO(alexmarkov): support asserts
+    final Label done = new Label();
+    asm.emitJumpIfNoAsserts(done);
+
+    final bool negated = _genCondition(node.condition);
+    _genJumpIfTrue(negated, done);
+
+    _genPushInt(node.conditionStartOffset);
+    _genPushInt(node.conditionEndOffset);
+
+    if (node.message != null) {
+      node.message.accept(this);
+    } else {
+      _genPushNull();
+    }
+
+    _genStaticCall(throwNewAssertionError, new ConstantArgDesc(3), 3);
+
+    asm.bind(done);
   }
 
   @override
@@ -1623,7 +1632,14 @@
 
   @override
   visitAssertBlock(AssertBlock node) {
-    // TODO(alexmarkov): support asserts
+    final Label done = new Label();
+    asm.emitJumpIfNoAsserts(done);
+
+    _enterScope(node);
+    visitList(node.statements, this);
+    _leaveScope();
+
+    asm.bind(done);
   }
 
   @override
@@ -1852,7 +1868,9 @@
         for (var expr in switchCase.expressions) {
           asm.emitPush(temp);
           _genPushConstExpr(expr);
-          asm.emitInstanceCall2(
+          // TODO(alexmarkov): generate InstanceCall2 once we have a way to
+          // mark ICData as having 2 checked arguments.
+          asm.emitInstanceCall1(
               2,
               cp.add(new ConstantICData(
                   InvocationKind.method, new Name('=='), equalsArgDesc)));
diff --git a/pkg/vm/lib/frontend_server.dart b/pkg/vm/lib/frontend_server.dart
index 5c69abf..709d28e 100644
--- a/pkg/vm/lib/frontend_server.dart
+++ b/pkg/vm/lib/frontend_server.dart
@@ -714,7 +714,7 @@
       compiler.acceptLastDelta();
       await compiler.recompileDelta();
       compiler.acceptLastDelta();
-      return 0;
+      return;
     } finally {
       temp.deleteSync(recursive: true);
     }
diff --git a/pkg/vm/testcases/bytecode/asserts.dart b/pkg/vm/testcases/bytecode/asserts.dart
new file mode 100644
index 0000000..2778c8d
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/asserts.dart
@@ -0,0 +1,13 @@
+// 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.
+
+void test1(bool condition) {
+  assert(condition);
+}
+
+void test2(bool condition(), String message()) {
+  assert(condition(), message());
+}
+
+main() {}
diff --git a/pkg/vm/testcases/bytecode/asserts.dart.expect b/pkg/vm/testcases/bytecode/asserts.dart.expect
new file mode 100644
index 0000000..6d2946c
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/asserts.dart.expect
@@ -0,0 +1,80 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  JumpIfNoAsserts      L1
+  Push                 FP[-5]
+  AssertBoolean        0
+  PushConstant         CP#0
+  IfEqStrictTOS
+  Jump                 L1
+  PushConstant         CP#1
+  PushConstant         CP#2
+  PushConstant         CP#3
+  PushConstant         CP#5
+  IndirectStaticCall   3, CP#4
+L1:
+  PushConstant         CP#3
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Bool true
+  [1] = Int 255
+  [2] = Int 264
+  [3] = Null
+  [4] = ArgDesc num-args 3, num-type-args 0, names []
+  [5] = StaticICData target 'dart.core::_AssertionError::_throwNew', arg-desc CP#4
+}
+]static method test1(core::bool condition) → void {
+  assert(condition);
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  JumpIfNoAsserts      L1
+  Push                 FP[-6]
+  InstanceCall1        1, CP#1
+  AssertBoolean        0
+  PushConstant         CP#2
+  IfEqStrictTOS
+  Jump                 L1
+  PushConstant         CP#3
+  PushConstant         CP#4
+  Push                 FP[-5]
+  InstanceCall1        1, CP#5
+  PushConstant         CP#7
+  IndirectStaticCall   3, CP#6
+L1:
+  PushConstant         CP#8
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = ICData target-name 'call', arg-desc CP#0
+  [2] = Bool true
+  [3] = Int 328
+  [4] = Int 339
+  [5] = ICData target-name 'call', arg-desc CP#0
+  [6] = ArgDesc num-args 3, num-type-args 0, names []
+  [7] = StaticICData target 'dart.core::_AssertionError::_throwNew', arg-desc CP#6
+  [8] = Null
+}
+]static method test2(() → core::bool condition, () → core::String message) → void {
+  assert(condition.call(), message.call());
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]static method main() → dynamic {}
diff --git a/pkg/vm/testcases/bytecode/async.dart b/pkg/vm/testcases/bytecode/async.dart
index e3900c7..cf1d164 100644
--- a/pkg/vm/testcases/bytecode/async.dart
+++ b/pkg/vm/testcases/bytecode/async.dart
@@ -56,4 +56,9 @@
   return nested;
 }
 
+Future<int> testAssert(Future<int> a) async {
+  assert((await a) == 42);
+  return 7;
+}
+
 main() {}
diff --git a/pkg/vm/testcases/bytecode/async.dart.expect b/pkg/vm/testcases/bytecode/async.dart.expect
index 60a3f58..981b101 100644
--- a/pkg/vm/testcases/bytecode/async.dart.expect
+++ b/pkg/vm/testcases/bytecode/async.dart.expect
@@ -714,6 +714,7 @@
   LoadFieldTOS         CP#1
   PushConstant         CP#17
   InstanceCall1        2, CP#19
+  AssertBoolean        0
   PushConstant         CP#20
   IfNeStrictTOS
   Jump                 L2
@@ -884,6 +885,7 @@
   Push                 r8
   PushConstant         CP#17
   InstanceCall1        2, CP#34
+  AssertBoolean        0
   PushConstant         CP#20
   IfNeStrictTOS
   Jump                 L7
@@ -1309,6 +1311,7 @@
   PushConstant         CP#8
   PushConstant         CP#27
   InstanceCall1        4, CP#28
+  AssertBoolean        0
   PushConstant         CP#29
   IfNeStrictTOS
   Jump                 L4
@@ -2172,6 +2175,292 @@
 }
 [@vm.bytecode=
 Bytecode {
+  Entry                4
+  CheckStack
+  AllocateContext      1
+  StoreLocal           r1
+  Push                 r1
+  Push                 r0
+  StoreFieldTOS        CP#0
+  PopLocal             r0
+  Push                 r0
+  Push                 FP[-5]
+  StoreFieldTOS        CP#1
+  AllocateContext      8
+  StoreLocal           r1
+  Push                 r1
+  Push                 r0
+  StoreFieldTOS        CP#0
+  PopLocal             r0
+  Push                 r0
+  PushConstant         CP#2
+  PushConstant         CP#4
+  IndirectStaticCall   1, CP#3
+  StoreFieldTOS        CP#5
+  Push                 r0
+  PushConstant         CP#6
+  StoreFieldTOS        CP#7
+  PushConstant         CP#6
+  PopLocal             r2
+  Push                 r0
+  PushConstant         CP#6
+  StoreFieldTOS        CP#8
+  Push                 r0
+  PushConstant         CP#6
+  StoreFieldTOS        CP#9
+  Push                 r0
+  PushConstant         CP#10
+  StoreFieldTOS        CP#1
+  Push                 r0
+  PushConstant         CP#6
+  StoreFieldTOS        CP#11
+  Push                 r0
+  PushConstant         CP#6
+  StoreFieldTOS        CP#12
+  Push                 r0
+  Allocate             CP#32
+  StoreLocal           r3
+  Push                 r3
+  PushConstant         CP#6
+  StoreFieldTOS        CP#33
+  Push                 r3
+  PushConstant         CP#6
+  StoreFieldTOS        CP#34
+  Push                 r3
+  PushConstant         CP#13
+  StoreFieldTOS        CP#35
+  Push                 r3
+  Push                 r0
+  StoreFieldTOS        CP#14
+  StoreFieldTOS        CP#16
+  Push                 r0
+  LoadFieldTOS         CP#16
+  PushConstant         CP#36
+  IndirectStaticCall   1, CP#3
+  StoreLocal           r2
+  Drop1
+  Push                 r0
+  Push                 r0
+  LoadFieldTOS         CP#16
+  PushConstant         CP#37
+  IndirectStaticCall   1, CP#3
+  StoreLocal           r3
+  StoreFieldTOS        CP#8
+  Push                 r3
+  Drop1
+  Push                 r0
+  Push                 r0
+  LoadFieldTOS         CP#16
+  PushConstant         CP#38
+  IndirectStaticCall   1, CP#3
+  StoreLocal           r3
+  StoreFieldTOS        CP#9
+  Push                 r3
+  Drop1
+  PushConstant         CP#39
+  Push                 r0
+  LoadFieldTOS         CP#16
+  PushConstant         CP#40
+  IndirectStaticCall   2, CP#20
+  Drop1
+  Push                 r0
+  LoadFieldTOS         CP#5
+  InstanceCall1        1, CP#41
+  ReturnTOS
+  Push                 r0
+  LoadFieldTOS         CP#0
+  PopLocal             r0
+  PushConstant         CP#6
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ContextOffset parent
+  [1] = ContextOffset var [0]
+  [2] = TypeArgumentsForInstanceAllocation dart.async::Completer [dart.core::int]
+  [3] = ArgDesc num-args 1, num-type-args 0, names []
+  [4] = StaticICData target 'dart.async::Completer::sync', arg-desc CP#3
+  [5] = ContextOffset var [7]
+  [6] = Null
+  [7] = ContextOffset var [6]
+  [8] = ContextOffset var [3]
+  [9] = ContextOffset var [4]
+  [10] = Int 0
+  [11] = ContextOffset var [1]
+  [12] = ContextOffset var [2]
+  [13] = ClosureFunction :async_op ([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding ;
+  [14] = FieldOffset dart.core::_Closure::_context
+  [15] = Int 1
+  [16] = ContextOffset var [5]
+  [17] = ArgDesc num-args 4, num-type-args 0, names []
+  [18] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#17
+  [19] = Int 42
+  [20] = ArgDesc num-args 2, num-type-args 0, names []
+  [21] = ICData target-name '==', arg-desc CP#20
+  [22] = Bool true
+  [23] = Int 1161
+  [24] = Int 1176
+  [25] = ArgDesc num-args 3, num-type-args 0, names []
+  [26] = StaticICData target 'dart.core::_AssertionError::_throwNew', arg-desc CP#25
+  [27] = Int 7
+  [28] = ICData target-name 'complete', arg-desc CP#20
+  [29] = Type dynamic
+  [30] = ICData target-name 'completeError', arg-desc CP#25
+  [31] = EndClosureFunctionScope
+  [32] = Class dart.core::_Closure
+  [33] = FieldOffset dart.core::_Closure::_instantiator_type_arguments
+  [34] = FieldOffset dart.core::_Closure::_function_type_arguments
+  [35] = FieldOffset dart.core::_Closure::_function
+  [36] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#3
+  [37] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#3
+  [38] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#3
+  [39] = TypeArgumentsForInstanceAllocation dart.async::Future [dynamic]
+  [40] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#20
+  [41] = ICData get target-name 'future', arg-desc CP#3
+}
+Closure CP#13 {
+  EntryOptional        1, 3, 0
+  LoadConstant         r1, CP#6
+  LoadConstant         r2, CP#6
+  LoadConstant         r3, CP#6
+  Frame                6
+  CheckStack
+  Push                 r0
+  LoadFieldTOS         CP#14
+  PopLocal             r4
+  Push                 r4
+  LoadFieldTOS         CP#1
+  StoreLocal           r5
+  PushConstant         CP#10
+  IfNeStrictNumTOS
+  Jump                 L1
+  Push                 r4
+  Push                 r4
+  StoreFieldTOS        CP#12
+Try #0 start:
+  JumpIfNoAsserts      L2
+  Push                 r4
+  PushConstant         CP#15
+  StoreFieldTOS        CP#1
+  Push                 r4
+  Push                 r4
+  StoreFieldTOS        CP#11
+  Push                 r4
+  LoadFieldTOS         CP#0
+  LoadFieldTOS         CP#1
+  Push                 r4
+  LoadFieldTOS         CP#8
+  Push                 r4
+  LoadFieldTOS         CP#9
+  Push                 r4
+  LoadFieldTOS         CP#16
+  PushConstant         CP#18
+  IndirectStaticCall   4, CP#17
+  PopLocal             r8
+  PushConstant         CP#6
+  ReturnTOS
+L6:
+  IfEqNull             r2
+  Jump                 L3
+  Push                 r2
+  Push                 r3
+  Throw                1
+L3:
+  JumpIfNoAsserts      L2
+  Push                 r1
+  PushConstant         CP#19
+  InstanceCall1        2, CP#21
+  AssertBoolean        0
+  PushConstant         CP#22
+  IfEqStrictTOS
+  Jump                 L2
+  PushConstant         CP#23
+  PushConstant         CP#24
+  PushConstant         CP#6
+  PushConstant         CP#26
+  IndirectStaticCall   3, CP#25
+L2:
+  Push                 r4
+  PushConstant         CP#27
+  StoreLocal           r8
+  StoreFieldTOS        CP#7
+  Push                 r8
+  Drop1
+  Jump                 L4
+L4:
+  Push                 r4
+  LoadFieldTOS         CP#5
+  Push                 r4
+  LoadFieldTOS         CP#7
+  InstanceCall1        2, CP#28
+  Drop1
+  PushConstant         CP#6
+  ReturnTOS
+  Jump                 L5
+Try #0 end:
+Try #0 handler:
+  Push                 r0
+  LoadFieldTOS         CP#14
+  PopLocal             r4
+  Push                 r4
+  LoadFieldTOS         CP#12
+  PopLocal             r4
+  MoveSpecial          r6, exception
+  MoveSpecial          r7, stackTrace
+  Push                 r6
+  PopLocal             r8
+  Push                 r7
+  PopLocal             r9
+  Push                 r4
+  LoadFieldTOS         CP#5
+  Push                 r8
+  Push                 r9
+  InstanceCall1        3, CP#30
+  Drop1
+  Jump                 L5
+L5:
+  PushConstant         CP#6
+  ReturnTOS
+L1:
+  Push                 r4
+  LoadFieldTOS         CP#11
+  PopLocal             r4
+  Jump                 L6
+
+}
+]static method testAssert(asy::Future<core::int> a) → asy::Future<core::int> /* originally async */ {
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+  asy::FutureOr<core::int> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L6:
+      {
+        assert {
+          [yield] let dynamic #t8 = asy::_awaitHelper(a, :async_op_then, :async_op_error, :async_op) in null;
+          assert(:result.{core::num::==}(42));
+        }
+        :return_value = 7;
+        break #L6;
+      }
+      :async_completer.{asy::Completer::complete}(:return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  asy::Future::microtask<dynamic>(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+[@vm.bytecode=
+Bytecode {
   Entry                0
   CheckStack
   PushConstant         CP#0
diff --git a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
index 8df59b8..d135ff4 100644
--- a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
+++ b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
@@ -146,6 +146,7 @@
   PushStatic           CP#0
   PushConstant         CP#1
   InstanceCall1        2, CP#3
+  AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L1
@@ -460,6 +461,7 @@
   PushStatic           CP#0
   PushConstant         CP#1
   InstanceCall1        2, CP#3
+  AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L1
@@ -467,6 +469,7 @@
   PushStatic           CP#5
   PushConstant         CP#1
   InstanceCall1        2, CP#6
+  AssertBoolean        0
   BooleanNegateTOS
   PopLocal             r0
   Jump                 L2
@@ -475,6 +478,7 @@
   PopLocal             r0
 L2:
   Push                 r0
+  AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L3
@@ -654,6 +658,7 @@
   PushStatic           CP#0
   PushConstant         CP#1
   InstanceCall1        2, CP#3
+  AssertBoolean        0
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
@@ -661,6 +666,7 @@
   PushStatic           CP#0
   PushConstant         CP#5
   InstanceCall1        2, CP#6
+  AssertBoolean        0
   PopLocal             r1
   Jump                 L2
 L1:
@@ -668,6 +674,7 @@
   PopLocal             r1
 L2:
   Push                 r1
+  AssertBoolean        0
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L3
@@ -675,6 +682,7 @@
   PushStatic           CP#0
   PushConstant         CP#7
   InstanceCall1        2, CP#8
+  AssertBoolean        0
   PopLocal             r0
   Jump                 L4
 L3:
@@ -682,6 +690,7 @@
   PopLocal             r0
 L4:
   Push                 r0
+  AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L5
diff --git a/pkg/vm/testcases/bytecode/closures.dart.expect b/pkg/vm/testcases/bytecode/closures.dart.expect
index 2bece87..af1ed56 100644
--- a/pkg/vm/testcases/bytecode/closures.dart.expect
+++ b/pkg/vm/testcases/bytecode/closures.dart.expect
@@ -730,6 +730,7 @@
   LoadFieldTOS         CP#1
   PushConstant         CP#13
   InstanceCall1        2, CP#14
+  AssertBoolean        0
   PushConstant         CP#15
   IfNeStrictTOS
   Jump                 L1
@@ -894,6 +895,7 @@
   LoadFieldTOS         CP#2
   PushConstant         CP#7
   InstanceCall1        2, CP#9
+  AssertBoolean        0
   PushConstant         CP#10
   IfNeStrictTOS
   Jump                 L1
diff --git a/pkg/vm/testcases/bytecode/loops.dart.expect b/pkg/vm/testcases/bytecode/loops.dart.expect
index f2bf88a..fe91f5f 100644
--- a/pkg/vm/testcases/bytecode/loops.dart.expect
+++ b/pkg/vm/testcases/bytecode/loops.dart.expect
@@ -16,6 +16,7 @@
   Push                 FP[-5]
   InstanceCall1        1, CP#2
   InstanceCall1        2, CP#4
+  AssertBoolean        0
   PushConstant         CP#5
   IfNeStrictTOS
   Jump                 L1
@@ -71,6 +72,7 @@
   Push                 r1
   PushConstant         CP#0
   InstanceCall1        2, CP#2
+  AssertBoolean        0
   PushConstant         CP#3
   IfNeStrictTOS
   Jump                 L1
@@ -78,6 +80,7 @@
   Push                 FP[-5]
   InstanceCall1        1, CP#5
   InstanceCall1        2, CP#6
+  AssertBoolean        0
   PushConstant         CP#3
   IfNeStrictTOS
   Jump                 L2
@@ -142,12 +145,14 @@
   Push                 FP[-5]
   InstanceCall1        1, CP#4
   InstanceCall1        2, CP#6
+  AssertBoolean        0
   PushConstant         CP#7
   IfNeStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#0
   InstanceCall1        2, CP#8
+  AssertBoolean        0
   PushConstant         CP#7
   IfNeStrictTOS
   Jump                 L2
@@ -215,6 +220,7 @@
   Push                 FP[-5]
   InstanceCall1        1, CP#2
   InstanceCall1        2, CP#4
+  AssertBoolean        0
   PushConstant         CP#5
   IfNeStrictTOS
   Jump                 L1
@@ -286,6 +292,7 @@
   Push                 FP[-5]
   InstanceCall1        1, CP#7
   InstanceCall1        2, CP#8
+  AssertBoolean        0
   PushConstant         CP#9
   IfEqStrictTOS
   Jump                 L1
diff --git a/pkg/vm/testcases/bytecode/switch.dart.expect b/pkg/vm/testcases/bytecode/switch.dart.expect
index cf87dfd..c82563b 100644
--- a/pkg/vm/testcases/bytecode/switch.dart.expect
+++ b/pkg/vm/testcases/bytecode/switch.dart.expect
@@ -12,19 +12,19 @@
   PopLocal             r1
   Push                 r1
   PushConstant         CP#2
-  InstanceCall2        2, CP#3
+  InstanceCall1        2, CP#3
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#5
-  InstanceCall2        2, CP#6
+  InstanceCall1        2, CP#6
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L2
   Push                 r1
   PushConstant         CP#7
-  InstanceCall2        2, CP#8
+  InstanceCall1        2, CP#8
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L3
@@ -99,37 +99,37 @@
   PopLocal             r1
   Push                 r1
   PushConstant         CP#2
-  InstanceCall2        2, CP#3
+  InstanceCall1        2, CP#3
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#5
-  InstanceCall2        2, CP#6
+  InstanceCall1        2, CP#6
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#7
-  InstanceCall2        2, CP#8
+  InstanceCall1        2, CP#8
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#9
-  InstanceCall2        2, CP#10
+  InstanceCall1        2, CP#10
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L2
   Push                 r1
   PushConstant         CP#11
-  InstanceCall2        2, CP#12
+  InstanceCall1        2, CP#12
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L2
   Push                 r1
   PushConstant         CP#13
-  InstanceCall2        2, CP#14
+  InstanceCall1        2, CP#14
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L2
@@ -212,37 +212,37 @@
   PopLocal             r1
   Push                 r1
   PushConstant         CP#2
-  InstanceCall2        2, CP#3
+  InstanceCall1        2, CP#3
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#5
-  InstanceCall2        2, CP#6
+  InstanceCall1        2, CP#6
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#7
-  InstanceCall2        2, CP#8
+  InstanceCall1        2, CP#8
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#9
-  InstanceCall2        2, CP#10
+  InstanceCall1        2, CP#10
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L2
   Push                 r1
   PushConstant         CP#11
-  InstanceCall2        2, CP#12
+  InstanceCall1        2, CP#12
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L2
   Push                 r1
   PushConstant         CP#13
-  InstanceCall2        2, CP#14
+  InstanceCall1        2, CP#14
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L2
diff --git a/pkg/vm/testcases/bytecode/try_blocks.dart.expect b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
index f3ac1e4..bf677f1 100644
--- a/pkg/vm/testcases/bytecode/try_blocks.dart.expect
+++ b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
@@ -571,6 +571,7 @@
   IndirectStaticCall   1, CP#1
   Drop1
   Push                 FP[-5]
+  AssertBoolean        0
   PushConstant         CP#6
   IfNeStrictTOS
   Jump                 L2
@@ -617,9 +618,9 @@
   ReturnTOS
 }
 ExceptionsTable {
-  try-index 0, outer -1, start 2, end 35, handler 35, needs-stack-trace, types [CP#3]
+  try-index 0, outer -1, start 2, end 36, handler 36, needs-stack-trace, types [CP#3]
   try-index 1, outer 0, start 2, end 7, handler 7, needs-stack-trace, types [CP#3]
-  try-index 2, outer 0, start 11, end 24, handler 24, types [CP#3]
+  try-index 2, outer 0, start 11, end 25, handler 25, types [CP#3]
 }
 ConstantPool {
   [0] = String 'try 1 > try 2'
@@ -669,6 +670,7 @@
   Push                 r0
   PushConstant         CP#1
   InstanceCall1        2, CP#3
+  AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L1
@@ -676,6 +678,7 @@
   Push                 r0
   PushConstant         CP#5
   InstanceCall1        2, CP#6
+  AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L2
@@ -715,7 +718,7 @@
   ReturnTOS
 }
 ExceptionsTable {
-  try-index 0, outer -1, start 11, end 19, handler 19, needs-stack-trace, types [CP#7]
+  try-index 0, outer -1, start 12, end 21, handler 21, needs-stack-trace, types [CP#7]
 }
 ConstantPool {
   [0] = Int 0
@@ -765,13 +768,13 @@
   PopLocal             r2
   Push                 r2
   PushConstant         CP#3
-  InstanceCall2        2, CP#4
+  InstanceCall1        2, CP#4
   PushConstant         CP#5
   IfEqStrictTOS
   Jump                 L1
   Push                 r2
   PushConstant         CP#6
-  InstanceCall2        2, CP#7
+  InstanceCall1        2, CP#7
   PushConstant         CP#5
   IfEqStrictTOS
   Jump                 L2
diff --git a/pkg/vm/testcases/bytecode/type_ops.dart.expect b/pkg/vm/testcases/bytecode/type_ops.dart.expect
index cf66e57..9a60881 100644
--- a/pkg/vm/testcases/bytecode/type_ops.dart.expect
+++ b/pkg/vm/testcases/bytecode/type_ops.dart.expect
@@ -110,6 +110,7 @@
   PushConstant         CP#1
   PushConstant         CP#2
   InstanceCall1        4, CP#4
+  AssertBoolean        0
   PushConstant         CP#5
   IfNeStrictTOS
   Jump                 L1
@@ -124,6 +125,7 @@
   PushConstant         CP#1
   PushConstant         CP#9
   InstanceCall1        4, CP#10
+  AssertBoolean        0
   PushConstant         CP#5
   IfNeStrictTOS
   Jump                 L2
@@ -186,6 +188,7 @@
   Push                 FP[-7]
   PushConstant         CP#1
   InstanceCall1        4, CP#3
+  AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L1
@@ -200,6 +203,7 @@
   Push                 FP[-7]
   PushConstant         CP#9
   InstanceCall1        4, CP#10
+  AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L2
@@ -368,6 +372,7 @@
   PushConstant         CP#0
   PushConstant         CP#1
   InstanceCall1        4, CP#3
+  AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L1
@@ -381,6 +386,7 @@
   PushConstant         CP#0
   PushConstant         CP#8
   InstanceCall1        4, CP#9
+  AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L2
diff --git a/runtime/bin/crypto_fuchsia.cc b/runtime/bin/crypto_fuchsia.cc
index d5297ae..c2fe425 100644
--- a/runtime/bin/crypto_fuchsia.cc
+++ b/runtime/bin/crypto_fuchsia.cc
@@ -13,17 +13,7 @@
 namespace bin {
 
 bool Crypto::GetRandomBytes(intptr_t count, uint8_t* buffer) {
-  intptr_t read = 0;
-  while (read < count) {
-    const intptr_t remaining = count - read;
-    const intptr_t len =
-        (ZX_CPRNG_DRAW_MAX_LEN < remaining) ? ZX_CPRNG_DRAW_MAX_LEN : remaining;
-    const zx_status_t status = zx_cprng_draw_new(buffer + read, len);
-    if (status != ZX_OK) {
-      return false;
-    }
-    read += len;
-  }
+  zx_cprng_draw(buffer, count);
   return true;
 }
 
diff --git a/runtime/bin/main_options.cc b/runtime/bin/main_options.cc
index e162713..cf88c86 100644
--- a/runtime/bin/main_options.cc
+++ b/runtime/bin/main_options.cc
@@ -356,7 +356,6 @@
       if ((strncmp(argv[i], kChecked, strlen(kChecked)) == 0) ||
           (strncmp(argv[i], kCheckedFull, strlen(kCheckedFull)) == 0)) {
         checked_set = true;
-        vm_options->AddArgument(kCheckedFull);
         i++;
         continue;  // '-c' is not a VM flag so don't add to vm options.
       } else if (!OptionProcessor::IsValidFlag(argv[i], kPrefix, kPrefixLen)) {
@@ -449,9 +448,11 @@
         " run using a snapshot is invalid.\n");
     return -1;
   }
-  if (checked_set && Options::preview_dart_2()) {
-    Log::PrintErr("Flags --checked and --preview-dart-2 are not compatible.\n");
-    return -1;
+  if (checked_set) {
+    vm_options->AddArgument("--enable-asserts");
+    if (Options::no_preview_dart_2()) {
+      vm_options->AddArgument("--enable-type-checks");
+    }
   }
 
   // If --snapshot is given without --snapshot-kind, default to script snapshot.
diff --git a/runtime/bin/main_options.h b/runtime/bin/main_options.h
index 0592ffa..54ad3c8 100644
--- a/runtime/bin/main_options.h
+++ b/runtime/bin/main_options.h
@@ -43,7 +43,8 @@
   V(short_socket_read, short_socket_read)                                      \
   V(short_socket_write, short_socket_write)                                    \
   V(disable_exit, exit_disabled)                                               \
-  V(no_preview_dart_2, no_preview_dart_2)
+  V(no_preview_dart_2, no_preview_dart_2)                                      \
+  V(preview_dart_2, nop_option)
 
 // Boolean flags that have a short form.
 #define SHORT_BOOL_OPTIONS_LIST(V)                                             \
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 5bdfcb8..7577fb7 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -1555,7 +1555,7 @@
   AbstractType& type = AbstractType::Handle(zone);
   String& name = String::Handle(zone);
   String& getter_name = String::Handle(zone);
-  String& setter_name = String::Handle(zone);
+  String& other_name = String::Handle(zone);
   Class& super_class = Class::Handle(zone);
   const intptr_t num_fields = array.Length();
   for (intptr_t i = 0; i < num_fields; i++) {
@@ -1579,8 +1579,8 @@
       // An implicit setter is not generated for a static field, therefore, we
       // cannot rely on the code below handling the static setter case to report
       // a conflict with an instance setter. So we check explicitly here.
-      setter_name = Field::SetterSymbol(name);
-      super_class = FindSuperOwnerOfFunction(cls, setter_name);
+      other_name = Field::SetterSymbol(name);
+      super_class = FindSuperOwnerOfFunction(cls, other_name);
       if (!super_class.IsNull()) {
         const String& class_name = String::Handle(zone, cls.Name());
         const String& super_cls_name = String::Handle(zone, super_class.Name());
@@ -1708,6 +1708,19 @@
         }
       }
     }
+    if (function.IsImplicitGetterFunction() ||
+        function.IsImplicitSetterFunction() ||
+        function.IsImplicitStaticFieldInitializer()) {
+      // Cache the field object in the function data_ field.
+      if (function.IsImplicitSetterFunction()) {
+        other_name = Field::NameFromSetter(name);
+      } else {
+        other_name = Field::NameFromGetter(name);
+      }
+      field = cls.LookupFieldAllowPrivate(other_name);
+      ASSERT(!field.IsNull());
+      function.set_accessor_field(field);
+    }
     if (function.IsSetterFunction() || function.IsImplicitSetterFunction()) {
       if (function.is_static()) {
         super_class = FindSuperOwnerOfFunction(cls, name);
diff --git a/runtime/vm/compiler/aot/aot_call_specializer.cc b/runtime/vm/compiler/aot/aot_call_specializer.cc
index 1b9b8e5..93bcf21bf 100644
--- a/runtime/vm/compiler/aot/aot_call_specializer.cc
+++ b/runtime/vm/compiler/aot/aot_call_specializer.cc
@@ -253,8 +253,7 @@
 
 bool AotCallSpecializer::TryInlineFieldAccess(StaticCallInstr* call) {
   if (call->function().IsImplicitGetterFunction()) {
-    Field& field =
-        Field::ZoneHandle(call->function().LookupImplicitGetterSetterField());
+    Field& field = Field::ZoneHandle(call->function().accessor_field());
     if (should_clone_fields_) {
       field = field.CloneFromOriginal();
     }
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 23b2002..86b3e06 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -8315,8 +8315,8 @@
   return flow_graph_builder_->BuildImplicitClosureCreation(target);
 }
 
-Fragment StreamingFlowGraphBuilder::CheckBoolean() {
-  return flow_graph_builder_->CheckBoolean();
+Fragment StreamingFlowGraphBuilder::CheckBoolean(TokenPosition position) {
+  return flow_graph_builder_->CheckBoolean(position);
 }
 
 Fragment StreamingFlowGraphBuilder::CheckAssignableInCheckedMode(
@@ -8375,8 +8375,9 @@
   if (*negate) {
     SkipBytes(1);  // Skip Not tag, thus go directly to the inner expression.
   }
-  Fragment instructions = BuildExpression();  // read expression.
-  instructions += CheckBoolean();
+  TokenPosition position = TokenPosition::kNoSource;
+  Fragment instructions = BuildExpression(&position);  // read expression.
+  instructions += CheckBoolean(position);
   return instructions;
 }
 
@@ -9621,8 +9622,10 @@
 Fragment StreamingFlowGraphBuilder::BuildNot(TokenPosition* position) {
   if (position != NULL) *position = TokenPosition::kNoSource;
 
-  Fragment instructions = BuildExpression();  // read expression.
-  instructions += CheckBoolean();
+  TokenPosition operand_position = TokenPosition::kNoSource;
+  Fragment instructions =
+      BuildExpression(&operand_position);  // read expression.
+  instructions += CheckBoolean(operand_position);
   instructions += BooleanNegate();
   return instructions;
 }
@@ -10291,17 +10294,18 @@
   // The call to `_AssertionError._evaluateAssertion()` will take care of both
   // and returns a boolean.
   instructions += BuildExpression();  // read condition.
+
+  const TokenPosition condition_start_offset =
+      ReadPosition();  // read condition start offset.
+  const TokenPosition condition_end_offset =
+      ReadPosition();  // read condition end offset.
+
   instructions += PushArgument();
   instructions += EvaluateAssertion();
-  instructions += CheckBoolean();
+  instructions += CheckBoolean(condition_start_offset);
   instructions += Constant(Bool::True());
   instructions += BranchIfEqual(&then, &otherwise, false);
 
-  TokenPosition condition_start_offset =
-      ReadPosition();  // read condition start offset.
-  TokenPosition condition_end_offset =
-      ReadPosition();  // read condition end offset.
-
   const Class& klass =
       Class::ZoneHandle(Z, Library::LookupCoreClass(Symbols::AssertionError()));
   ASSERT(!klass.IsNull());
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 5b1c7dd..2636f59 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -1492,7 +1492,7 @@
   JoinEntryInstr* BuildJoinEntry(intptr_t try_index);
   Fragment Goto(JoinEntryInstr* destination);
   Fragment BuildImplicitClosureCreation(const Function& target);
-  Fragment CheckBoolean();
+  Fragment CheckBoolean(TokenPosition position);
   Fragment CheckAssignableInCheckedMode(const AbstractType& dst_type,
                                         const String& dst_name);
   Fragment CheckArgumentType(LocalVariable* variable, const AbstractType& type);
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 1bb584e..7d677b5 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -2422,12 +2422,12 @@
                     ICData::kStatic);
 }
 
-Fragment FlowGraphBuilder::CheckBoolean() {
+Fragment FlowGraphBuilder::CheckBoolean(TokenPosition position) {
   Fragment instructions;
   if (I->strong() || I->type_checks() || I->asserts()) {
     LocalVariable* top_of_stack = MakeTemporary();
     instructions += LoadLocal(top_of_stack);
-    instructions += AssertBool();
+    instructions += AssertBool(position);
     instructions += Drop();
   }
   return instructions;
@@ -2451,10 +2451,10 @@
   return instructions;
 }
 
-Fragment FlowGraphBuilder::AssertBool() {
+Fragment FlowGraphBuilder::AssertBool(TokenPosition position) {
   Value* value = Pop();
-  AssertBooleanInstr* instr = new (Z)
-      AssertBooleanInstr(TokenPosition::kNoSource, value, GetNextDeoptId());
+  AssertBooleanInstr* instr =
+      new (Z) AssertBooleanInstr(position, value, GetNextDeoptId());
   Push(instr);
   return Fragment(instr);
 }
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index 9bb30e5..3ef59b2 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -824,13 +824,13 @@
   Fragment EvaluateAssertion();
   Fragment CheckVariableTypeInCheckedMode(const AbstractType& dst_type,
                                           const String& name_symbol);
-  Fragment CheckBoolean();
+  Fragment CheckBoolean(TokenPosition position);
   Fragment CheckAssignable(
       const AbstractType& dst_type,
       const String& dst_name,
       AssertAssignableInstr::Kind kind = AssertAssignableInstr::kUnknown);
 
-  Fragment AssertBool();
+  Fragment AssertBool(TokenPosition position);
   Fragment AssertAssignable(
       TokenPosition position,
       const AbstractType& dst_type,
diff --git a/runtime/vm/compiler/jit/compiler.cc b/runtime/vm/compiler/jit/compiler.cc
index 0430ef9..875983c 100644
--- a/runtime/vm/compiler/jit/compiler.cc
+++ b/runtime/vm/compiler/jit/compiler.cc
@@ -1495,9 +1495,15 @@
       DartCompilationPipeline pipeline;
       CompileParsedFunctionHelper helper(parsed_function, false, kNoOSRDeoptId);
       const Code& code = Code::Handle(helper.Compile(&pipeline));
+      const Function& initializer = parsed_function->function();
       if (!code.IsNull()) {
-        const Function& initializer = parsed_function->function();
         code.set_var_descriptors(Object::empty_var_descriptors());
+#if defined(DART_USE_INTERPRETER)
+      }
+      // In case the initializer has bytecode, the compilation step above only
+      // loaded the bytecode without generating code.
+      if (!code.IsNull() || initializer.HasBytecode()) {
+#endif
         // Invoke the function to evaluate the expression.
         return DartEntry::InvokeFunction(initializer, Object::empty_array());
       }
diff --git a/runtime/vm/constants_kbc.h b/runtime/vm/constants_kbc.h
index 312ca7f..4b8e028 100644
--- a/runtime/vm/constants_kbc.h
+++ b/runtime/vm/constants_kbc.h
@@ -113,6 +113,11 @@
 //    Jump to the given target. Target is specified as offset from the PC of the
 //    jump instruction.
 //
+//  - JumpIfNoAsserts target
+//
+//    Jump to the given target if assertions are not enabled.
+//    Target is specified as offset from the PC of the jump instruction.
+//
 //  - Return R; ReturnTOS
 //
 //    Return to the caller using either a value from the given register or a
@@ -772,6 +777,7 @@
   V(DropR,                                 A, num, ___, ___)                   \
   V(Drop,                                  A, num, ___, ___)                   \
   V(Jump,                                  T, tgt, ___, ___)                   \
+  V(JumpIfNoAsserts,                       T, tgt, ___, ___)                   \
   V(Return,                                A, reg, ___, ___)                   \
   V(ReturnTOS,                             0, ___, ___, ___)                   \
   V(Move,                                A_X, reg, xeg, ___)                   \
diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc
index 2d4305b..f320a65 100644
--- a/runtime/vm/interpreter.cc
+++ b/runtime/vm/interpreter.cc
@@ -887,7 +887,6 @@
 
 DART_NOINLINE bool Interpreter::InvokeCompiled(Thread* thread,
                                                RawFunction* function,
-                                               RawArray* argdesc,
                                                RawObject** call_base,
                                                RawObject** call_top,
                                                uint32_t** pc,
@@ -897,85 +896,139 @@
   // TODO(regis): Revisit.
   UNIMPLEMENTED();
 #endif
-  if (!Function::HasCode(function)) {
-    ASSERT(!Function::HasBytecode(function));
-    call_top[1] = 0;  // Code result.
-    call_top[2] = function;
-    Exit(thread, *FP, call_top + 3, *pc);
-    NativeArguments native_args(thread, 1, call_top + 2, call_top + 1);
-    if (!InvokeRuntime(thread, this, DRT_CompileFunction, native_args)) {
-      return false;
-    }
-  }
-  if (Function::HasCode(function)) {
-    RawCode* code = function->ptr()->code_;
-    ASSERT(code != StubCode::LazyCompile_entry()->code());
-    // TODO(regis): Once we share the same stack, try to invoke directly.
-#if defined(DEBUG)
-    if (IsTracingExecution()) {
-      THR_Print("%" Pu64 " ", icount_);
-      THR_Print("invoking compiled %s\n",
-                Function::Handle(function).ToCString());
-    }
-#endif
-    // On success, returns a RawInstance.  On failure, a RawError.
-    typedef RawObject* (*invokestub)(RawCode * code, RawArray * argdesc,
-                                     RawObject * *arg0, Thread * thread);
-    invokestub entrypoint = reinterpret_cast<invokestub>(
-        StubCode::InvokeDartCodeFromBytecode_entry()->EntryPoint());
-    RawObject* result;
-    Exit(thread, *FP, call_top + 1, *pc);
-    {
-      InterpreterSetjmpBuffer buffer(this);
-      if (!setjmp(buffer.buffer_)) {
-        thread->set_vm_tag(reinterpret_cast<uword>(entrypoint));
-        result = entrypoint(code, argdesc, call_base, thread);
-        thread->set_vm_tag(VMTag::kDartTagId);
-        thread->set_top_exit_frame_info(0);
-        ASSERT(thread->execution_state() == Thread::kThreadInGenerated);
-      } else {
-        return false;
-      }
-    }
-    // Pop args and push result.
-    *SP = call_base;
-    **SP = result;
-
-    // It is legit to call the constructor of an error object, however a
-    // result of class UnhandledException must be propagated.
-    if (result->IsHeapObject() &&
-        result->GetClassId() == kUnhandledExceptionCid) {
-      (*SP)[0] = UnhandledException::RawCast(result)->ptr()->exception_;
-      (*SP)[1] = UnhandledException::RawCast(result)->ptr()->stacktrace_;
-      (*SP)[2] = 0;  // Space for result.
-      Exit(thread, *FP, *SP + 3, *pc);
-      NativeArguments args(thread, 2, *SP, *SP + 2);
-      if (!InvokeRuntime(thread, this, DRT_ReThrow, args)) {
-        return false;
-      }
-    }
-    return true;
-  }
-  ASSERT(Function::HasBytecode(function));
-  // Bytecode was loaded in the above compilation step.
-  // Stay in interpreter.
+  ASSERT(Function::HasCode(function));
+  RawCode* code = function->ptr()->code_;
+  ASSERT(code != StubCode::LazyCompile_entry()->code());
+  // TODO(regis): Once we share the same stack, try to invoke directly.
 #if defined(DEBUG)
   if (IsTracingExecution()) {
     THR_Print("%" Pu64 " ", icount_);
-    THR_Print("invoking %s\n", Function::Handle(function).ToCString());
+    THR_Print("invoking compiled %s\n", Function::Handle(function).ToCString());
   }
 #endif
-  RawCode* bytecode = function->ptr()->bytecode_;
-  RawObject** callee_fp = call_top + kKBCDartFrameFixedSize;
-  callee_fp[kKBCPcMarkerSlotFromFp] = bytecode;
-  callee_fp[kKBCSavedCallerPcSlotFromFp] = reinterpret_cast<RawObject*>(*pc);
-  callee_fp[kKBCSavedCallerFpSlotFromFp] = reinterpret_cast<RawObject*>(*FP);
-  pp_ = bytecode->ptr()->object_pool_;
-  *pc = reinterpret_cast<uint32_t*>(bytecode->ptr()->entry_point_);
-  pc_ = reinterpret_cast<uword>(*pc);  // For the profiler.
-  *FP = callee_fp;
-  *SP = *FP - 1;
-  // Dispatch will interpret function.
+  // On success, returns a RawInstance.  On failure, a RawError.
+  typedef RawObject* (*invokestub)(RawCode * code, RawArray * argdesc,
+                                   RawObject * *arg0, Thread * thread);
+  invokestub entrypoint = reinterpret_cast<invokestub>(
+      StubCode::InvokeDartCodeFromBytecode_entry()->EntryPoint());
+  RawObject* result;
+  Exit(thread, *FP, call_top + 1, *pc);
+  {
+    InterpreterSetjmpBuffer buffer(this);
+    if (!setjmp(buffer.buffer_)) {
+      thread->set_vm_tag(reinterpret_cast<uword>(entrypoint));
+      result = entrypoint(code, argdesc_, call_base, thread);
+      thread->set_vm_tag(VMTag::kDartTagId);
+      thread->set_top_exit_frame_info(0);
+      ASSERT(thread->execution_state() == Thread::kThreadInGenerated);
+    } else {
+      return false;
+    }
+  }
+  // Pop args and push result.
+  *SP = call_base;
+  **SP = result;
+  pp_ = InterpreterHelpers::FrameCode(*FP)->ptr()->object_pool_;
+
+  // It is legit to call the constructor of an error object, however a
+  // result of class UnhandledException must be propagated.
+  if (result->IsHeapObject() &&
+      result->GetClassId() == kUnhandledExceptionCid) {
+    (*SP)[0] = UnhandledException::RawCast(result)->ptr()->exception_;
+    (*SP)[1] = UnhandledException::RawCast(result)->ptr()->stacktrace_;
+    (*SP)[2] = 0;  // Space for result.
+    Exit(thread, *FP, *SP + 3, *pc);
+    NativeArguments args(thread, 2, *SP, *SP + 2);
+    if (!InvokeRuntime(thread, this, DRT_ReThrow, args)) {
+      return false;
+    }
+    UNREACHABLE();
+  }
+  return true;
+}
+
+DART_NOINLINE bool Interpreter::ProcessInvocation(bool* invoked,
+                                                  Thread* thread,
+                                                  RawFunction* function,
+                                                  RawObject** call_base,
+                                                  RawObject** call_top,
+                                                  uint32_t** pc,
+                                                  RawObject*** FP,
+                                                  RawObject*** SP) {
+  ASSERT(!Function::HasCode(function) && !Function::HasBytecode(function));
+  // If the function is an implicit getter or setter, process its invocation
+  // here without code or bytecode.
+  RawFunction::Kind kind = Function::kind(function);
+  switch (kind) {
+    case RawFunction::kImplicitGetter: {
+      // Field offset in words is cached as a Smi in function's data_.
+      RawInstance* instance = reinterpret_cast<RawInstance*>((*SP)[0]);
+      RawField* field = reinterpret_cast<RawField*>(function->ptr()->data_);
+      intptr_t offset_in_words = Smi::Value(field->ptr()->value_.offset_);
+      (*SP)[0] =
+          reinterpret_cast<RawObject**>(instance->ptr())[offset_in_words];
+      *invoked = true;
+      return true;
+    }
+    case RawFunction::kImplicitSetter: {
+      // Field offset in words is cached as a Smi in function's data_.
+      // TODO(regis): We currently ignore field.guarded_cid() and the type
+      // test of the setter value. Either execute these tests here or fall
+      // back to compiling the setter when required.
+      RawInstance* instance = reinterpret_cast<RawInstance*>((*SP)[-1]);
+      RawField* field = reinterpret_cast<RawField*>(function->ptr()->data_);
+      intptr_t offset_in_words = Smi::Value(field->ptr()->value_.offset_);
+      reinterpret_cast<RawObject**>(instance->ptr())[offset_in_words] =
+          (*SP)[0];
+      *--(*SP) = Object::null();
+      *invoked = true;
+      return true;
+    }
+    case RawFunction::kImplicitStaticFinalGetter: {
+      // Field object is cached in function's data_.
+      RawField* field = reinterpret_cast<RawField*>(function->ptr()->data_);
+      RawInstance* value = field->ptr()->value_.static_value_;
+      if (value == Object::sentinel().raw() ||
+          value == Object::transition_sentinel().raw()) {
+        (*SP)[1] = 0;  // Result of invoking the initializer.
+        (*SP)[2] = field;
+        Exit(thread, *FP, *SP + 3, *pc);
+        NativeArguments native_args(thread, 1, *SP + 2, *SP + 1);
+        if (!InvokeRuntime(thread, this, DRT_InitStaticField, native_args)) {
+          return false;
+        }
+        pp_ = InterpreterHelpers::FrameCode(*FP)->ptr()->object_pool_;
+        // The field is initialized by the runtime call, but not returned.
+        value = field->ptr()->value_.static_value_;
+      }
+      // Field was initialized. Return its value.
+      *++(*SP) = value;
+      *invoked = true;
+      return true;
+    }
+    case RawFunction::kNoSuchMethodDispatcher:
+    case RawFunction::kInvokeFieldDispatcher:
+      // TODO(regis): Implement. For now, use jitted version.
+      break;
+    default:
+      break;
+  }
+  // Compile the function to either generate code or load bytecode.
+  call_top[1] = 0;  // Code result.
+  call_top[2] = function;
+  Exit(thread, *FP, call_top + 3, *pc);
+  NativeArguments native_args(thread, 1, call_top + 2, call_top + 1);
+  if (!InvokeRuntime(thread, this, DRT_CompileFunction, native_args)) {
+    return false;
+  }
+  if (Function::HasCode(function)) {
+    *invoked = true;
+    return InvokeCompiled(thread, function, call_base, call_top, pc, FP, SP);
+  }
+  ASSERT(Function::HasBytecode(function));
+  // Bytecode was loaded in the above compilation step.
+  // The caller will dispatch to the function's bytecode.
+  *invoked = false;
   ASSERT(thread->vm_tag() == VMTag::kDartTagId);
   ASSERT(thread->top_exit_frame_info() == 0);
   return true;
@@ -990,10 +1043,17 @@
   RawObject** callee_fp = call_top + kKBCDartFrameFixedSize;
 
   RawFunction* function = FrameFunction(callee_fp);
-  if (Function::HasCode(function) || !Function::HasBytecode(function)) {
-    // TODO(regis): If the function is a dispatcher, execute the dispatch here.
-    return InvokeCompiled(thread, function, argdesc_, call_base, call_top, pc,
-                          FP, SP);
+  if (Function::HasCode(function)) {
+    return InvokeCompiled(thread, function, call_base, call_top, pc, FP, SP);
+  }
+  if (!Function::HasBytecode(function)) {
+    bool invoked = false;
+    bool result = ProcessInvocation(&invoked, thread, function, call_base,
+                                    call_top, pc, FP, SP);
+    if (invoked || !result) {
+      return result;
+    }
+    ASSERT(Function::HasBytecode(function));
   }
 #if defined(DEBUG)
   if (IsTracingExecution()) {
@@ -3234,6 +3294,7 @@
 
   {
     BYTECODE(InitStaticTOS, 0);
+    UNREACHABLE();  // Not used. TODO(regis): Remove this bytecode.
     RawField* field = static_cast<RawField*>(*SP--);
     RawObject* value = field->ptr()->value_.static_value_;
     if ((value == Object::sentinel().raw()) ||
@@ -4103,6 +4164,15 @@
   }
 
   {
+    BYTECODE(JumpIfNoAsserts, 0);
+    if (!thread->isolate()->asserts()) {
+      const int32_t target = static_cast<int32_t>(op) >> 8;
+      pc += (target - 1);
+    }
+    DISPATCH();
+  }
+
+  {
     BYTECODE(LoadClassId, A_D);
     const uint16_t object_reg = rD;
     RawObject* obj = static_cast<RawObject*>(FP[object_reg]);
diff --git a/runtime/vm/interpreter.h b/runtime/vm/interpreter.h
index ef71e71..04b3caa 100644
--- a/runtime/vm/interpreter.h
+++ b/runtime/vm/interpreter.h
@@ -135,9 +135,17 @@
               RawObject*** FP,
               RawObject*** SP);
 
+  bool ProcessInvocation(bool* invoked,
+                         Thread* thread,
+                         RawFunction* function,
+                         RawObject** call_base,
+                         RawObject** call_top,
+                         uint32_t** pc,
+                         RawObject*** FP,
+                         RawObject*** SP);
+
   bool InvokeCompiled(Thread* thread,
                       RawFunction* function,
-                      RawArray* argdesc,
                       RawObject** call_base,
                       RawObject** call_top,
                       uint32_t** pc,
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index c1e7654..2440091 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -5912,25 +5912,20 @@
   set_data(value);
 }
 
-RawField* Function::LookupImplicitGetterSetterField() const {
-  // TODO(27590) Store Field object inside RawFunction::data_ if possible.
-  Zone* Z = Thread::Current()->zone();
-  String& field_name = String::Handle(Z, name());
-  switch (kind()) {
-    case RawFunction::kImplicitGetter:
-    case RawFunction::kImplicitStaticFinalGetter:
-      field_name = Field::NameFromGetter(field_name);
-      break;
-    case RawFunction::kImplicitSetter:
-      field_name = Field::NameFromSetter(field_name);
-      break;
-    default:
-      UNREACHABLE();
-  }
-  ASSERT(field_name.IsSymbol());
-  const Class& owner = Class::Handle(Z, Owner());
-  ASSERT(!owner.IsNull());
-  return owner.LookupField(field_name);
+RawField* Function::accessor_field() const {
+  ASSERT(kind() == RawFunction::kImplicitGetter ||
+         kind() == RawFunction::kImplicitSetter ||
+         kind() == RawFunction::kImplicitStaticFinalGetter);
+  return Field::RawCast(raw_ptr()->data_);
+}
+
+void Function::set_accessor_field(const Field& value) const {
+  ASSERT(kind() == RawFunction::kImplicitGetter ||
+         kind() == RawFunction::kImplicitSetter ||
+         kind() == RawFunction::kImplicitStaticFinalGetter);
+  // Top level classes may be finalized multiple times.
+  ASSERT(raw_ptr()->data_ == Object::null() || raw_ptr()->data_ == value.raw());
+  set_data(value);
 }
 
 RawFunction* Function::parent_function() const {
@@ -5974,7 +5969,8 @@
 }
 
 RawFunction* Function::implicit_closure_function() const {
-  if (IsClosureFunction() || IsSignatureFunction() || IsFactory()) {
+  if (IsClosureFunction() || IsSignatureFunction() || IsFactory() ||
+      IsDispatcherOrImplicitAccessor() || IsImplicitStaticFieldInitializer()) {
     return Function::null();
   }
   const Object& obj = Object::Handle(raw_ptr()->data_);
@@ -6193,6 +6189,9 @@
 //                            Array[2] = Kernel offset of enclosing library
 //   signature function:      SignatureData
 //   method extractor:        Function extracted closure function
+//   implicit getter:         Field
+//   implicit setter:         Field
+//   impl. static final gttr: Field
 //   noSuchMethod dispatcher: Array arguments descriptor
 //   invoke-field dispatcher: Array arguments descriptor
 //   redirecting constructor: RedirectionData
@@ -7217,6 +7216,7 @@
   clone.set_owner(clone_owner);
   clone.ClearICDataArray();
   clone.ClearCode();
+  clone.set_data(Object::null_object());
   clone.set_usage_counter(0);
   clone.set_deoptimization_counter(0);
   clone.set_optimized_instruction_count(0);
@@ -18654,7 +18654,7 @@
       // meaningless, therefore use the token index of this type parameter.
       *bound_error = LanguageError::NewFormatted(
           *bound_error, script, token_pos(), Report::AtLocation,
-          Report::kMalboundedType, Heap::kNew,
+          Report::kMalboundedType, Heap::kOld,
           "type parameter '%s' of class '%s' must extend bound '%s', "
           "but type argument '%s' is not a subtype of '%s'",
           type_param_name.ToCString(), class_name.ToCString(),
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 8c69cb2..ba4f605 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -2283,8 +2283,6 @@
   RawContextScope* context_scope() const;
   void set_context_scope(const ContextScope& value) const;
 
-  RawField* LookupImplicitGetterSetterField() const;
-
   // Enclosing function of this local function.
   RawFunction* parent_function() const;
 
@@ -2294,6 +2292,9 @@
   void set_saved_args_desc(const Array& array) const;
   RawArray* saved_args_desc() const;
 
+  void set_accessor_field(const Field& value) const;
+  RawField* accessor_field() const;
+
   bool IsMethodExtractor() const {
     return kind() == RawFunction::kMethodExtractor;
   }
@@ -2348,6 +2349,9 @@
   RawFunction::Kind kind() const {
     return KindBits::decode(raw_ptr()->kind_tag_);
   }
+  static RawFunction::Kind kind(RawFunction* function) {
+    return KindBits::decode(function->ptr()->kind_tag_);
+  }
 
   RawFunction::AsyncModifier modifier() const {
     return ModifierBits::decode(raw_ptr()->kind_tag_);
@@ -2646,6 +2650,12 @@
     return kind() == RawFunction::kImplicitSetter;
   }
 
+  // Returns true if this function represents an implicit static field
+  // initializer function.
+  bool IsImplicitStaticFieldInitializer() const {
+    return kind() == RawFunction::kImplicitStaticFinalGetter;
+  }
+
   // Returns true if this function represents a (possibly implicit) closure
   // function.
   bool IsClosureFunction() const {
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index 89661ef..6dd1d5b 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -330,7 +330,7 @@
   if ((kind() == RawFunction::kImplicitGetter) ||
       (kind() == RawFunction::kImplicitSetter) ||
       (kind() == RawFunction::kImplicitStaticFinalGetter)) {
-    const Field& field = Field::Handle(LookupImplicitGetterSetterField());
+    const Field& field = Field::Handle(accessor_field());
     if (!field.IsNull()) {
       jsobj.AddProperty("_field", field);
     }
diff --git a/runtime/vm/os_fuchsia.cc b/runtime/vm/os_fuchsia.cc
index e8ed9aa..e97f30c 100644
--- a/runtime/vm/os_fuchsia.cc
+++ b/runtime/vm/os_fuchsia.cc
@@ -43,11 +43,13 @@
 static zx_status_t GetLocalAndDstOffsetInSeconds(int64_t seconds_since_epoch,
                                                  int32_t* local_offset,
                                                  int32_t* dst_offset) {
-  fuchsia::timezone::TimezoneSyncPtr time_svc;
-  fuchsia::sys::ConnectToEnvironmentService(time_svc.NewRequest());
-  if (!time_svc->GetTimezoneOffsetMinutes(seconds_since_epoch * 1000,
-                                          local_offset, dst_offset))
-    return ZX_ERR_UNAVAILABLE;
+  fuchsia::timezone::TimezoneSync2Ptr tz;
+  fuchsia::sys::ConnectToEnvironmentService(tz.NewRequest());
+  zx_status_t status = tz->GetTimezoneOffsetMinutes(seconds_since_epoch * 1000,
+                                                    local_offset,
+                                                    dst_offset).statvs;
+  if (status != ZX_OK)
+    return status;
   *local_offset *= 60;
   *dst_offset *= 60;
   return ZX_OK;
@@ -56,10 +58,10 @@
 const char* OS::GetTimeZoneName(int64_t seconds_since_epoch) {
   // TODO(abarth): Handle time zone changes.
   static const auto* tz_name = new std::string([] {
-    fuchsia::timezone::TimezoneSyncPtr time_svc;
-    fuchsia::sys::ConnectToEnvironmentService(time_svc.NewRequest());
+    fuchsia::timezone::TimezoneSyncPtr tz;
+    fuchsia::sys::ConnectToEnvironmentService(tz.NewRequest());
     fidl::StringPtr result;
-    time_svc->GetTimezoneId(&result);
+    tz->GetTimezoneId(&result);
     return *result;
   }());
   return tz_name->c_str();
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index a7a67b3..eb810c7 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -1361,7 +1361,7 @@
 
 SequenceNode* Parser::ParseStaticInitializer() {
   ExpectIdentifier("field name expected");
-  CheckToken(Token::kASSIGN, "field initialier expected");
+  CheckToken(Token::kASSIGN, "field initializer expected");
   ConsumeToken();
   OpenFunctionBlock(parsed_function()->function());
   TokenPosition expr_pos = TokenPos();
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 38d5fa1..bcbb625 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -1782,6 +1782,7 @@
     }
     Exceptions::PropagateError(Error::Cast(result));
   }
+  arguments.SetReturn(result);
 #else
   UNREACHABLE();
 #endif  // defined(DART_USE_INTERPRETER)
diff --git a/sdk/lib/core/symbol.dart b/sdk/lib/core/symbol.dart
index ac0fc65..8580d6f 100644
--- a/sdk/lib/core/symbol.dart
+++ b/sdk/lib/core/symbol.dart
@@ -18,7 +18,7 @@
   static const Symbol empty = const Symbol("");
 
   /**
-   * Constructs a new Symbol.
+   * Constructs a new [Symbol] representing the provided name.
    *
    * The name must be a valid public Dart member name,
    * public constructor name, or library name, optionally qualified.
@@ -39,6 +39,37 @@
    * * or the empty string (the default name of a library with no library
    *   name declaration).
    *
+   * Symbol instances created from the same [name] are equal,
+   * but not necessarily identical, but symbols created as compile-time
+   * constants are canonicalized, as all other constant object creations.
+   *
+   * ```dart
+   * assert(new Symbol("foo") == new Symbol("foo"));
+   * assert(identical(const Symbol("foo"), const Symbol("foo")));
+   * ```
+   *
+   * If [name] is a single identifier that does not start with an underscore,
+   * or it is a qualified identifier,
+   * or it is an operator name different from `unary-`,
+   * then the result of `const Symbol(name)` is the same instance that
+   * the symbol literal created by prefixing `#` to the content of [name]
+   * would evaluate to.
+   *
+   * ```dart
+   * assert(new Symbol("foo") == #foo);
+   * assert(new Symbol("[]=") == #[]=]);
+   * assert(new Symbol("foo.bar") == #foo.bar);
+   * assert(identical(const Symbol("foo"), #foo));
+   * assert(identical(const Symbol("[]="), #[]=]));
+   * assert(identical(const Symbol("foo.bar"), #foo.bar));
+   * ```
+   *
+   * This constructor cannot create a [Symbol] instance that is equal to
+   * a private symbol literal like `#_foo`.
+   * ```dart
+   * const Symbol("_foo") // Invalid
+   * ``
+   *
    * The following text is non-normative:
    *
    * Creating non-const Symbol instances may result in larger output.  If
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 60298fa..8dca3dfa 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -480,7 +480,6 @@
 LayoutTests/fast/css/content/content-normal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/counters/complex-before_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/css-escaped-identifier_t01: RuntimeError # co19 issue 14
-LayoutTests/fast/css/css-properties-case-insensitive_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/css3-nth-tokens-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/cssText-shorthand_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/csstext-of-content-string_t01: Pass, RuntimeError # Please triage this failure
@@ -796,8 +795,6 @@
 LayoutTests/fast/forms/textarea-paste-newline_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/textfield-focus-out_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/forms/validationMessage_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/validity-property_t01: RuntimeError # Issue 25155
-LayoutTests/fast/forms/willvalidate_t01: RuntimeError # Issue 25155
 LayoutTests/fast/html/article-element_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/html/aside-element_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/html/details-add-child-1_t01: RuntimeError # Please triage this failure
@@ -7084,31 +7081,15 @@
 LibTest/core/int/toInt_A01_t01: CompileTimeError # Larger than 64 bit int
 LibTest/core/int/truncateToDouble_A01_t01: CompileTimeError # Larger than 64 bit int
 LibTest/core/int/truncate_A01_t01: CompileTimeError # Larger than 64 bit int
-LibTest/html/Document/dispatchEvent_A01_t01: Crash
-LibTest/html/Document/on_A01_t01: Crash
-LibTest/html/Document/on_A01_t02: Crash
-LibTest/html/HttpRequest/abort_A01_t01: Crash
-LibTest/html/HttpRequest/dispatchEvent_A01_t01: Crash
 LibTest/html/HttpRequest/getAllResponseHeaders_A01_t01: Crash
 LibTest/html/HttpRequest/getResponseHeader_A01_t01: Crash
 LibTest/html/HttpRequest/getString_A01_t01: Crash
-LibTest/html/HttpRequest/onAbort_A01_t01: Crash
-LibTest/html/HttpRequest/onLoadEnd_A01_t01: Crash
-LibTest/html/HttpRequest/onLoadStart_A01_t01: Crash
-LibTest/html/HttpRequest/onLoad_A01_t01: Crash
-LibTest/html/HttpRequest/onReadyStateChange_A01_t01: Crash
 LibTest/html/HttpRequest/overrideMimeType_A01_t01: Crash
-LibTest/html/HttpRequest/readyStateChangeEvent_A01_t01: Crash
 LibTest/html/HttpRequest/request_A01_t01: Crash
-LibTest/html/HttpRequest/responseText_A01_t01: Crash
 LibTest/html/HttpRequest/setRequestHeader_A01_t01: Crash
 LibTest/html/HttpRequest/statusText_A01_t01: Crash
 LibTest/html/HttpRequest/status_A01_t01: Crash
-LibTest/html/HttpRequestUpload/onAbort_A01_t01: Crash
 LibTest/html/IFrameElement/contentWindow_A01_t01: Crash
-LibTest/html/IFrameElement/dispatchEvent_A01_t01: Crash
-LibTest/html/Node/dispatchEvent_A01_t01: Crash
-LibTest/html/Window/dispatchEvent_A01_t01: Crash
 LibTest/html/Window/postMessage_A01_t02: Crash
 LibTest/html/Window/requestFileSystem_A01_t01: Crash
 LibTest/html/Window/requestFileSystem_A01_t02: Crash
@@ -7151,37 +7132,21 @@
 Language/Statements/For/syntax_t13: Crash
 Language/Statements/For/syntax_t20: Crash
 LibTest/core/Invocation/namedArguments_A01_t01: Crash
-LibTest/html/Document/dispatchEvent_A01_t01: Crash
-LibTest/html/Document/on_A01_t01: Crash
-LibTest/html/Document/on_A01_t02: Crash
-LibTest/html/HttpRequest/abort_A01_t01: Crash
-LibTest/html/HttpRequest/dispatchEvent_A01_t01: Crash
 LibTest/html/HttpRequest/getAllResponseHeaders_A01_t01: Crash
 LibTest/html/HttpRequest/getResponseHeader_A01_t01: Crash
 LibTest/html/HttpRequest/getString_A01_t01: Crash
-LibTest/html/HttpRequest/onAbort_A01_t01: Crash
 LibTest/html/HttpRequest/onError_A01_t02: Crash
-LibTest/html/HttpRequest/onLoadEnd_A01_t01: Crash
-LibTest/html/HttpRequest/onLoadStart_A01_t01: Crash
-LibTest/html/HttpRequest/onLoad_A01_t01: Crash
-LibTest/html/HttpRequest/onReadyStateChange_A01_t01: Crash
 LibTest/html/HttpRequest/overrideMimeType_A01_t01: Crash
-LibTest/html/HttpRequest/readyStateChangeEvent_A01_t01: Crash
 LibTest/html/HttpRequest/request_A01_t01: Crash
-LibTest/html/HttpRequest/responseText_A01_t01: Crash
 LibTest/html/HttpRequest/responseText_A01_t02: Crash
 LibTest/html/HttpRequest/setRequestHeader_A01_t01: Crash
 LibTest/html/HttpRequest/statusText_A01_t01: Crash
 LibTest/html/HttpRequest/status_A01_t01: Crash
-LibTest/html/HttpRequestUpload/onAbort_A01_t01: Crash
 LibTest/html/HttpRequestUpload/onError_A01_t02: Crash
 LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: Crash
 LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: Crash
 LibTest/html/HttpRequestUpload/onLoad_A01_t01: Crash
 LibTest/html/IFrameElement/contentWindow_A01_t01: Crash
-LibTest/html/IFrameElement/dispatchEvent_A01_t01: Crash
-LibTest/html/Node/dispatchEvent_A01_t01: Crash
-LibTest/html/Window/dispatchEvent_A01_t01: Crash
 LibTest/html/Window/postMessage_A01_t02: Crash
 LibTest/html/Window/requestFileSystem_A01_t01: Crash
 LibTest/html/Window/requestFileSystem_A01_t02: Crash
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index 7eabb3c..1953746 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -58,15 +58,18 @@
 Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t02: MissingCompileTimeError
 Language/Classes/Constructors/Constant_Constructors/invalid_constant_initializer_t02: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/static_type_t01: CompileTimeError
+Language/Classes/Getters/static_getter_t01: CompileTimeError
 Language/Classes/Instance_Methods/same_name_setter_t02: CompileTimeError # Issue 14736
 Language/Classes/Setters/name_t03: CompileTimeError
 Language/Classes/Setters/name_t04: CompileTimeError
 Language/Classes/Setters/name_t06: CompileTimeError
+Language/Classes/Setters/name_t07: CompileTimeError
+Language/Classes/Setters/static_setter_t05: CompileTimeError
+Language/Classes/Setters/static_setter_t06: CompileTimeError
+Language/Classes/Static_Methods/same_name_method_and_setter_t01: CompileTimeError
 Language/Classes/Superinterfaces/more_than_once_t01: MissingCompileTimeError
 Language/Classes/Superinterfaces/superclass_as_superinterface_t01: MissingCompileTimeError
-Language/Classes/same_name_instance_and_static_members_t01: MissingCompileTimeError
 Language/Classes/same_name_instance_and_static_members_t02: MissingCompileTimeError
-Language/Classes/same_name_instance_and_static_members_t03: MissingCompileTimeError
 Language/Classes/same_name_instance_and_static_members_t04: MissingCompileTimeError
 Language/Expressions/Constants/exception_t01: MissingCompileTimeError
 Language/Expressions/Constants/exception_t03: MissingCompileTimeError
@@ -92,9 +95,7 @@
 Language/Classes/Getters/same_name_method_t07: MissingCompileTimeError
 Language/Classes/Superinterfaces/more_than_once_t01: MissingCompileTimeError
 Language/Classes/Superinterfaces/superclass_as_superinterface_t01: MissingCompileTimeError
-Language/Classes/same_name_instance_and_static_members_t01: MissingCompileTimeError
 Language/Classes/same_name_instance_and_static_members_t02: MissingCompileTimeError
-Language/Classes/same_name_instance_and_static_members_t03: MissingCompileTimeError
 Language/Classes/same_name_instance_and_static_members_t04: MissingCompileTimeError
 Language/Expressions/Constants/bitwise_operators_t05: MissingCompileTimeError
 Language/Expressions/Constants/depending_on_itself_t01: MissingCompileTimeError
@@ -1699,6 +1700,8 @@
 Language/Classes/Static_Methods/declaration_t01: MissingCompileTimeError
 Language/Classes/Superclasses/wrong_superclass_t08: MissingCompileTimeError
 Language/Classes/Superinterfaces/wrong_type_t05: MissingCompileTimeError
+Language/Classes/same_name_instance_and_static_members_t01: MissingCompileTimeError
+Language/Classes/same_name_instance_and_static_members_t03: MissingCompileTimeError
 Language/Classes/same_name_type_variable_t04: MissingCompileTimeError
 Language/Classes/same_name_type_variable_t07: MissingCompileTimeError
 Language/Expressions/Constants/bitwise_operators_t03: MissingCompileTimeError
diff --git a/tests/compiler/dart2js/jsinterop/world_test.dart b/tests/compiler/dart2js/jsinterop/world_test.dart
index 25377d5..cb9cf2c 100644
--- a/tests/compiler/dart2js/jsinterop/world_test.dart
+++ b/tests/compiler/dart2js/jsinterop/world_test.dart
@@ -11,7 +11,6 @@
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart' show ClassEntity;
 import 'package:compiler/src/elements/names.dart';
-import 'package:compiler/src/universe/class_hierarchy.dart';
 import 'package:compiler/src/universe/selector.dart';
 import 'package:compiler/src/world.dart';
 import '../helpers/element_lookup.dart';
diff --git a/tests/compiler/dart2js/model/class_set_test.dart b/tests/compiler/dart2js/model/class_set_test.dart
index 833334f..f91acf6 100644
--- a/tests/compiler/dart2js/model/class_set_test.dart
+++ b/tests/compiler/dart2js/model/class_set_test.dart
@@ -68,7 +68,7 @@
 
   void checkClass(ClassEntity cls,
       {bool directlyInstantiated: false, bool indirectlyInstantiated: false}) {
-    ClassHierarchyNode node = world.classHierarchy.getClassHierarchyNode(cls);
+    ClassHierarchyNode node = world.getClassHierarchyNode(cls);
     Expect.isNotNull(node, "Expected ClassHierarchyNode for $cls.");
     Expect.equals(
         directlyInstantiated || indirectlyInstantiated,
@@ -139,7 +139,7 @@
   }
 
   iterator = new ClassHierarchyNodeIterable(
-          world.classHierarchy.getClassHierarchyNode(G), ClassHierarchyNode.ALL)
+          world.getClassHierarchyNode(G), ClassHierarchyNode.ALL)
       .iterator;
   checkState(G, currentNode: null, stack: null);
   Expect.isNull(iterator.current);
@@ -151,7 +151,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.classHierarchy.getClassHierarchyNode(G), ClassHierarchyNode.ALL,
+          world.getClassHierarchyNode(G), ClassHierarchyNode.ALL,
           includeRoot: false)
       .iterator;
   checkState(G, currentNode: null, stack: null);
@@ -161,7 +161,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.classHierarchy.getClassHierarchyNode(C), ClassHierarchyNode.ALL)
+          world.getClassHierarchyNode(C), ClassHierarchyNode.ALL)
       .iterator;
   checkState(C, currentNode: null, stack: null);
   Expect.isNull(iterator.current);
@@ -182,7 +182,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.classHierarchy.getClassHierarchyNode(D), ClassHierarchyNode.ALL)
+          world.getClassHierarchyNode(D), ClassHierarchyNode.ALL)
       .iterator;
   checkState(D, currentNode: null, stack: null);
   Expect.isNull(iterator.current);
@@ -194,7 +194,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.classHierarchy.getClassHierarchyNode(B), ClassHierarchyNode.ALL)
+          world.getClassHierarchyNode(B), ClassHierarchyNode.ALL)
       .iterator;
   checkState(B, currentNode: null, stack: null);
   Expect.isNull(iterator.current);
@@ -209,7 +209,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.classHierarchy.getClassHierarchyNode(B), ClassHierarchyNode.ALL,
+          world.getClassHierarchyNode(B), ClassHierarchyNode.ALL,
           includeRoot: false)
       .iterator;
   checkState(B, currentNode: null, stack: null);
@@ -222,7 +222,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-      world.classHierarchy.getClassHierarchyNode(B),
+      world.getClassHierarchyNode(B),
       new EnumSet<Instantiation>.fromValues(<Instantiation>[
         Instantiation.DIRECTLY_INSTANTIATED,
         Instantiation.UNINSTANTIATED
@@ -237,7 +237,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.classHierarchy.getClassHierarchyNode(A), ClassHierarchyNode.ALL)
+          world.getClassHierarchyNode(A), ClassHierarchyNode.ALL)
       .iterator;
   checkState(A, currentNode: null, stack: null);
   Expect.isNull(iterator.current);
@@ -267,7 +267,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.classHierarchy.getClassHierarchyNode(A), ClassHierarchyNode.ALL,
+          world.getClassHierarchyNode(A), ClassHierarchyNode.ALL,
           includeRoot: false)
       .iterator;
   checkState(A, currentNode: null, stack: null);
@@ -295,7 +295,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-      world.classHierarchy.getClassHierarchyNode(A),
+      world.getClassHierarchyNode(A),
       new EnumSet<Instantiation>.fromValues(<Instantiation>[
         Instantiation.DIRECTLY_INSTANTIATED,
         Instantiation.UNINSTANTIATED
@@ -325,7 +325,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.classHierarchy.getClassHierarchyNode(A),
+          world.getClassHierarchyNode(A),
           new EnumSet<Instantiation>.fromValues(<Instantiation>[
             Instantiation.DIRECTLY_INSTANTIATED,
             Instantiation.UNINSTANTIATED
@@ -400,7 +400,7 @@
   ClassEntity X = env.getClass("X");
 
   void checkForEachSubclass(ClassEntity cls, List<ClassEntity> expected) {
-    ClassSet classSet = world.classHierarchy.getClassSet(cls);
+    ClassSet classSet = world.getClassSet(cls);
     List<ClassEntity> visited = <ClassEntity>[];
     classSet.forEachSubclass((cls) {
       visited.add(cls);
@@ -437,7 +437,7 @@
   checkForEachSubclass(X, [X]);
 
   void checkForEachSubtype(ClassEntity cls, List<ClassEntity> expected) {
-    ClassSet classSet = world.classHierarchy.getClassSet(cls);
+    ClassSet classSet = world.getClassSet(cls);
     List<ClassEntity> visited = <ClassEntity>[];
     classSet.forEachSubtype((cls) {
       visited.add(cls);
@@ -482,7 +482,7 @@
       mask = ClassHierarchyNode.ALL;
     }
 
-    ClassSet classSet = world.classHierarchy.getClassSet(cls);
+    ClassSet classSet = world.getClassSet(cls);
     List<ClassEntity> visited = <ClassEntity>[];
 
     IterationStep visit(_cls) {
@@ -539,7 +539,7 @@
 
   void checkAny(ClassEntity cls, List<ClassEntity> expected,
       {ClassEntity find, bool expectedResult, bool anySubtype: false}) {
-    ClassSet classSet = world.classHierarchy.getClassSet(cls);
+    ClassSet classSet = world.getClassSet(cls);
     List<ClassEntity> visited = <ClassEntity>[];
 
     bool visit(cls) {
diff --git a/tests/compiler/dart2js/model/subtypeset_test.dart b/tests/compiler/dart2js/model/subtypeset_test.dart
index fac2f27..fd5e963 100644
--- a/tests/compiler/dart2js/model/subtypeset_test.dart
+++ b/tests/compiler/dart2js/model/subtypeset_test.dart
@@ -67,7 +67,7 @@
 
   void checkClass(ClassEntity cls, List<ClassEntity> expectedSubtypes,
       {bool checkSubset: false}) {
-    ClassSet node = world.classHierarchy.getClassSet(cls);
+    ClassSet node = world.getClassSet(cls);
     Set<ClassEntity> actualSubtypes = node.subtypes().toSet();
     if (checkSubset) {
       for (ClassEntity subtype in expectedSubtypes) {
diff --git a/tests/compiler/dart2js/model/world_test.dart b/tests/compiler/dart2js/model/world_test.dart
index 78e93f1..3abdd5d 100644
--- a/tests/compiler/dart2js/model/world_test.dart
+++ b/tests/compiler/dart2js/model/world_test.dart
@@ -9,9 +9,8 @@
 import 'package:compiler/src/common/names.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/elements/entities.dart';
-import 'package:compiler/src/universe/class_hierarchy.dart';
 import 'package:compiler/src/universe/class_set.dart';
-import 'package:compiler/src/world.dart' show JClosedWorld;
+import 'package:compiler/src/world.dart' show ClassQuery, JClosedWorld;
 import '../type_test_helper.dart';
 
 void main() {
@@ -551,106 +550,65 @@
   ClassEntity A = env.getElement("A");
   ClassEntity B = env.getElement("B");
   ClassEntity C = env.getElement("C");
+  ClassEntity D = env.getElement("D");
   ClassEntity F = env.getElement("F");
   ClassEntity G = env.getElement("G");
+  ClassEntity H = env.getElement("H");
   ClassEntity I = env.getElement("I");
   ClassEntity J = env.getElement("J");
 
   void check(ClassEntity cls1, ClassQuery query1, ClassEntity cls2,
-      ClassQuery query2, SubclassResult expectedResult) {
-    SubclassResult result1 =
-        closedWorld.classHierarchy.commonSubclasses(cls1, query1, cls2, query2);
-    SubclassResult result2 =
-        closedWorld.classHierarchy.commonSubclasses(cls2, query2, cls1, query1);
-    Expect.equals(
-        result1.query,
-        result2.query,
+      ClassQuery query2, List<ClassEntity> expectedResult) {
+    Iterable<ClassEntity> result1 =
+        closedWorld.commonSubclasses(cls1, query1, cls2, query2);
+    Iterable<ClassEntity> result2 =
+        closedWorld.commonSubclasses(cls2, query2, cls1, query1);
+    Expect.setEquals(
+        result1,
+        result2,
         "Asymmetric results for ($cls1,$query1) vs ($cls2,$query2):"
         "\n a vs b: $result1\n b vs a: $result2");
     Expect.setEquals(
-        result1.classes,
-        result2.classes,
-        "Asymmetric results for ($cls1,$query1) vs ($cls2,$query2):"
-        "\n a vs b: $result1\n b vs a: $result2");
-    Expect.equals(
-        expectedResult.query,
-        result1.query,
-        "Unexpected results for ($cls1,$query1) vs ($cls2,$query2):"
-        "\n expected: $expectedResult\n actual: $result1");
-    Expect.setEquals(
-        expectedResult.classes,
-        result1.classes,
+        expectedResult,
+        result1,
         "Unexpected results for ($cls1,$query1) vs ($cls2,$query2):"
         "\n expected: $expectedResult\n actual: $result1");
   }
 
-  check(A, ClassQuery.EXACT, A, ClassQuery.EXACT,
-      new SubclassResult.internal(ClassQuery.EXACT, [A]));
-  check(A, ClassQuery.EXACT, A, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.EXACT, [A]));
-  check(A, ClassQuery.EXACT, A, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.EXACT, [A]));
-  check(A, ClassQuery.SUBCLASS, A, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, [A]));
-  check(A, ClassQuery.SUBCLASS, A, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, [A]));
-  check(A, ClassQuery.SUBTYPE, A, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.SUBTYPE, [A]));
+  check(A, ClassQuery.EXACT, A, ClassQuery.EXACT, []);
+  check(A, ClassQuery.EXACT, A, ClassQuery.SUBCLASS, []);
+  check(A, ClassQuery.EXACT, A, ClassQuery.SUBTYPE, []);
+  check(A, ClassQuery.SUBCLASS, A, ClassQuery.SUBCLASS, [C]);
+  check(A, ClassQuery.SUBCLASS, A, ClassQuery.SUBTYPE, [C]);
+  check(A, ClassQuery.SUBTYPE, A, ClassQuery.SUBTYPE, [C, D]);
 
-  check(A, ClassQuery.EXACT, B, ClassQuery.EXACT,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(A, ClassQuery.EXACT, B, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(A, ClassQuery.SUBCLASS, B, ClassQuery.EXACT,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(A, ClassQuery.EXACT, B, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(A, ClassQuery.SUBTYPE, B, ClassQuery.EXACT,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(A, ClassQuery.SUBCLASS, B, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(A, ClassQuery.SUBCLASS, B, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, [G]));
-  check(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, [J]));
-  check(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, [F, G, I, J]));
+  check(A, ClassQuery.EXACT, B, ClassQuery.EXACT, []);
+  check(A, ClassQuery.EXACT, B, ClassQuery.SUBCLASS, []);
+  check(A, ClassQuery.SUBCLASS, B, ClassQuery.EXACT, []);
+  check(A, ClassQuery.EXACT, B, ClassQuery.SUBTYPE, []);
+  check(A, ClassQuery.SUBTYPE, B, ClassQuery.EXACT, []);
+  check(A, ClassQuery.SUBCLASS, B, ClassQuery.SUBCLASS, []);
+  check(A, ClassQuery.SUBCLASS, B, ClassQuery.SUBTYPE, [G]);
+  check(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBCLASS, [J]);
+  check(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBTYPE, [F, G, I, J]);
 
-  check(A, ClassQuery.EXACT, C, ClassQuery.EXACT,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(A, ClassQuery.EXACT, C, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(A, ClassQuery.SUBCLASS, C, ClassQuery.EXACT,
-      new SubclassResult.internal(ClassQuery.EXACT, [C]));
-  check(A, ClassQuery.EXACT, C, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(A, ClassQuery.SUBTYPE, C, ClassQuery.EXACT,
-      new SubclassResult.internal(ClassQuery.EXACT, [C]));
-  check(A, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, [C]));
-  check(A, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, [C]));
-  check(A, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, [C]));
-  check(A, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.SUBTYPE, [C]));
+  check(A, ClassQuery.EXACT, C, ClassQuery.EXACT, []);
+  check(A, ClassQuery.EXACT, C, ClassQuery.SUBCLASS, []);
+  check(A, ClassQuery.SUBCLASS, C, ClassQuery.EXACT, []);
+  check(A, ClassQuery.EXACT, C, ClassQuery.SUBTYPE, []);
+  check(A, ClassQuery.SUBTYPE, C, ClassQuery.EXACT, []);
+  check(A, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS, [G]);
+  check(A, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE, [G]);
+  check(A, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS, [G]);
+  check(A, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE, [F, G, H]);
 
-  check(B, ClassQuery.EXACT, C, ClassQuery.EXACT,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(B, ClassQuery.EXACT, C, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(B, ClassQuery.SUBCLASS, C, ClassQuery.EXACT,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(B, ClassQuery.EXACT, C, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(B, ClassQuery.SUBTYPE, C, ClassQuery.EXACT,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, []));
-  check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, [G]));
-  check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, [F, G]));
+  check(B, ClassQuery.EXACT, C, ClassQuery.EXACT, []);
+  check(B, ClassQuery.EXACT, C, ClassQuery.SUBCLASS, []);
+  check(B, ClassQuery.SUBCLASS, C, ClassQuery.EXACT, []);
+  check(B, ClassQuery.EXACT, C, ClassQuery.SUBTYPE, []);
+  check(B, ClassQuery.SUBTYPE, C, ClassQuery.EXACT, []);
+  check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS, []);
+  check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE, []);
+  check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS, [G]);
+  check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE, [F, G]);
 }
diff --git a/tests/compiler/dart2js/needs_no_such_method_test.dart b/tests/compiler/dart2js/needs_no_such_method_test.dart
index 735e390..5cd35d2 100644
--- a/tests/compiler/dart2js/needs_no_such_method_test.dart
+++ b/tests/compiler/dart2js/needs_no_such_method_test.dart
@@ -9,9 +9,8 @@
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/names.dart';
 import 'package:compiler/src/universe/call_structure.dart';
-import 'package:compiler/src/universe/class_hierarchy.dart';
 import 'package:compiler/src/universe/selector.dart';
-import 'package:compiler/src/world.dart' show JClosedWorld;
+import 'package:compiler/src/world.dart' show JClosedWorld, ClassQuery;
 import 'type_test_helper.dart';
 
 void main() {
diff --git a/tests/compiler/dart2js/rti/bound_check_test.dart b/tests/compiler/dart2js/rti/bound_check_test.dart
index 10f1b35..e767d28 100644
--- a/tests/compiler/dart2js/rti/bound_check_test.dart
+++ b/tests/compiler/dart2js/rti/bound_check_test.dart
@@ -82,7 +82,7 @@
     ], expectedOutput: OUTPUT1, printJs: args.contains('-v'));
     await runWithD8(
         memorySourceFiles: {'main.dart': SOURCE2},
-        options: [Flags.enableCheckedMode],
+        options: [Flags.noPreviewDart2, Flags.enableCheckedMode],
         expectedOutput: OUTPUT2,
         printJs: args.contains('-v'));
   });
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals5.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals5.dart
new file mode 100644
index 0000000..d93f282
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals5.dart
@@ -0,0 +1,52 @@
+// 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:expect/expect.dart';
+
+/*strong.class: Class1a:explicit=[Class1a]*/
+class Class1a {
+  /*kernel.element: Class1a.:needsSignature*/
+  Class1a();
+}
+
+/*kernel.class: Class1b:needsArgs*/
+/*strong.class: Class1b:needsArgs*/
+/*omit.class: Class1b:needsArgs*/
+class Class1b<T> extends Class1a {
+  /*kernel.element: Class1b.:needsSignature*/
+  Class1b();
+}
+
+/*kernel.class: Class1c:needsArgs*/
+/*strong.class: Class1c:needsArgs*/
+/*omit.class: Class1c:needsArgs*/
+class Class1c<T> extends Class1a {
+  /*kernel.element: Class1c.:needsSignature*/
+  Class1c();
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  Class2();
+}
+
+/*kernel.element: test:needsSignature*/
+/*strong.element: test:*/
+/*omit.element: test:*/
+test(Class1a c, Type type) {
+  return c.runtimeType == type;
+}
+
+/*kernel.element: main:needsSignature*/
+/*strong.element: main:*/
+/*omit.element: main:*/
+main() {
+  Expect.isTrue(test(new Class1a(), Class1a));
+  Expect.isFalse(test(new Class1b<int>(), Class1a));
+  Expect.isFalse(test(new Class1c<int>(), Class1a));
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals6.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals6.dart
new file mode 100644
index 0000000..36cb66d
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals6.dart
@@ -0,0 +1,54 @@
+// 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:expect/expect.dart';
+
+/*kernel.class: Class1a:needsArgs*/
+/*strong.class: Class1a:explicit=[Class1a],needsArgs*/
+/*omit.class: Class1a:needsArgs*/
+class Class1a<T> {
+  /*kernel.element: Class1a.:needsSignature*/
+  Class1a();
+}
+
+/*kernel.class: Class1b:needsArgs*/
+/*strong.class: Class1b:needsArgs*/
+/*omit.class: Class1b:needsArgs*/
+class Class1b<T> extends Class1a<T> {
+  /*kernel.element: Class1b.:needsSignature*/
+  Class1b();
+}
+
+/*kernel.class: Class1c:needsArgs*/
+/*strong.class: Class1c:needsArgs*/
+/*omit.class: Class1c:needsArgs*/
+class Class1c<T> extends Class1a<T> {
+  /*kernel.element: Class1c.:needsSignature*/
+  Class1c();
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  Class2();
+}
+
+/*kernel.element: test:needsSignature*/
+/*strong.element: test:*/
+/*omit.element: test:*/
+test(Class1a c, Type type) {
+  return c.runtimeType == type;
+}
+
+/*kernel.element: main:needsSignature*/
+/*strong.element: main:*/
+/*omit.element: main:*/
+main() {
+  Expect.isTrue(test(new Class1a(), Class1a));
+  Expect.isFalse(test(new Class1b<int>(), Class1a));
+  Expect.isFalse(test(new Class1c<int>(), Class1a));
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals7.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals7.dart
new file mode 100644
index 0000000..5cf6134
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals7.dart
@@ -0,0 +1,62 @@
+// 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:expect/expect.dart';
+
+/*strong.class: Class1a:explicit=[Class1a]*/
+class Class1a {
+  /*kernel.element: Class1a.:needsSignature*/
+  Class1a();
+}
+
+/*kernel.class: Class1b:needsArgs*/
+/*strong.class: Class1b:needsArgs*/
+/*omit.class: Class1b:needsArgs*/
+class Class1b<T> extends Class1a {
+  /*kernel.element: Class1b.:needsSignature*/
+  Class1b();
+}
+
+/*kernel.class: Class1c:needsArgs*/
+/*strong.class: Class1c:needsArgs*/
+/*omit.class: Class1c:needsArgs*/
+class Class1c<T> extends Class1a {
+  /*kernel.element: Class1c.:needsSignature*/
+  Class1c();
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  Class2();
+}
+
+/*kernel.class: Class3:needsArgs*/
+/*strong.class: Class3:explicit=[Class3]*/
+/*omit.class: Class3:*/
+class Class3<T> {
+  final Class1a field;
+
+  /*kernel.element: Class3.:needsSignature*/
+  Class3(this.field);
+}
+
+/*kernel.element: test:needsSignature*/
+/*strong.element: test:*/
+/*omit.element: test:*/
+test(Class3 c, Type type) {
+  return c.field.runtimeType == type;
+}
+
+/*kernel.element: main:needsSignature*/
+/*strong.element: main:*/
+/*omit.element: main:*/
+main() {
+  Expect.isTrue(test(new Class3<int>(new Class1a()), Class1a));
+  Expect.isFalse(test(new Class3<int>(new Class1b<int>()), Class1a));
+  Expect.isFalse(test(new Class3<int>(new Class1c<int>()), Class1a));
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals6_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals6_test.dart
new file mode 100644
index 0000000..af98ea6
--- /dev/null
+++ b/tests/compiler/dart2js_extra/runtime_type_equals6_test.dart
@@ -0,0 +1,34 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class Class1a {
+  Class1a();
+}
+
+class Class1b<T> extends Class1a {
+  Class1b();
+}
+
+class Class1c<T> extends Class1a {
+  Class1c();
+}
+
+class Class2<T> {
+  Class2();
+}
+
+test(Class1a c, Type type) {
+  return c.runtimeType == type;
+}
+
+main() {
+  Expect.isTrue(test(new Class1a(), Class1a));
+  Expect.isFalse(test(new Class1b<int>(), Class1a));
+  Expect.isFalse(test(new Class1c<int>(), Class1a));
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals7_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals7_test.dart
new file mode 100644
index 0000000..0d2727b
--- /dev/null
+++ b/tests/compiler/dart2js_extra/runtime_type_equals7_test.dart
@@ -0,0 +1,34 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class Class1a<T> {
+  Class1a();
+}
+
+class Class1b<T> extends Class1a<T> {
+  Class1b();
+}
+
+class Class1c<T> extends Class1a<T> {
+  Class1c();
+}
+
+class Class2<T> {
+  Class2();
+}
+
+test(Class1a c, Type type) {
+  return c.runtimeType == type;
+}
+
+main() {
+  Expect.isTrue(test(new Class1a(), Class1a));
+  Expect.isFalse(test(new Class1b<int>(), Class1a));
+  Expect.isFalse(test(new Class1c<int>(), Class1a));
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals8_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals8_test.dart
new file mode 100644
index 0000000..145ceae
--- /dev/null
+++ b/tests/compiler/dart2js_extra/runtime_type_equals8_test.dart
@@ -0,0 +1,40 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class Class1a {
+  Class1a();
+}
+
+class Class1b<T> extends Class1a {
+  Class1b();
+}
+
+class Class1c<T> extends Class1a {
+  Class1c();
+}
+
+class Class2<T> {
+  Class2();
+}
+
+class Class3<T> {
+  final Class1a field;
+
+  Class3(this.field);
+}
+
+test(Class3 c, Type type) {
+  return c.field.runtimeType == type;
+}
+
+main() {
+  Expect.isTrue(test(new Class3<int>(new Class1a()), Class1a));
+  Expect.isFalse(test(new Class3<int>(new Class1b<int>()), Class1a));
+  Expect.isFalse(test(new Class3<int>(new Class1c<int>()), Class1a));
+  new Class2<int>();
+}
diff --git a/tests/language_2/language_2.status b/tests/language_2/language_2.status
index 227ceb6..fdece1b 100644
--- a/tests/language_2/language_2.status
+++ b/tests/language_2/language_2.status
@@ -13,6 +13,9 @@
 [ $compiler != dart2analyzer ]
 switch_case_warn_test: Skip # Analyzer only, see language_analyzer2.status
 
+[ $mode == debug ]
+large_class_declaration_test: Slow, Pass
+
 [ $mode == product ]
 assertion_test: SkipByDesign # Requires checked mode.
 generic_test: SkipByDesign # Requires checked mode.
@@ -300,7 +303,6 @@
 void/return_future_or_void_sync_error3_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
 void/return_future_or_void_sync_error4_test/none: MissingStaticWarning # https://github.com/dart-lang/sdk/issues/33218
 void/return_future_void_async_error2_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
-void/return_future_void_async_test: StaticWarning # https://github.com/dart-lang/sdk/issues/33218
 void/return_void_async_error0_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
 void/return_void_async_error1_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
 void/return_void_async_error2_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index 8ad3271..73f540f 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -14,6 +14,8 @@
 conflicting_type_variable_and_setter_test: CompileTimeError # Issue 25525
 const_cast2_test/01: CompileTimeError
 const_cast2_test/none: CompileTimeError
+const_constructor_mixin3_test/01: MissingCompileTimeError # Issue 33644
+const_constructor_mixin_test/01: MissingCompileTimeError # Issue 33644
 const_for_in_variable_test/01: MissingCompileTimeError # Issue 25161
 constructor_call_wrong_argument_count_negative_test: Fail # Issue 11585
 constructor_type_parameter_test/00: MissingCompileTimeError # Issue 33110
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index a79000f..84f88bb 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -167,13 +167,11 @@
 async_star_regression_23116_test: RuntimeError
 async_star_test/02: RuntimeError
 await_test: RuntimeError
-bad_override_test/03: MissingCompileTimeError
 bit_operations_test/03: RuntimeError
 bit_operations_test/04: RuntimeError
 bit_operations_test/none: RuntimeError
 branch_canonicalization_test: RuntimeError
 canonical_const2_test: RuntimeError, OK # non JS number semantics
-check_member_static_test/02: MissingCompileTimeError
 checked_method_error_order_test: RuntimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
@@ -296,12 +294,6 @@
 external_test/13: MissingRuntimeError
 external_test/20: MissingRuntimeError
 factory_redirection_test/07: MissingCompileTimeError
-fauxverride_test/03: MissingCompileTimeError
-fauxverride_test/05: MissingCompileTimeError
-field_override3_test/00: MissingCompileTimeError
-field_override3_test/01: MissingCompileTimeError
-field_override3_test/02: MissingCompileTimeError
-field_override3_test/03: MissingCompileTimeError
 final_attempt_reinitialization_test/01: MissingCompileTimeError
 final_attempt_reinitialization_test/02: MissingCompileTimeError
 full_stacktrace1_test: RuntimeError # Issue 12698
@@ -311,9 +303,6 @@
 generic_function_dcall_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_tearoff_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_typedef_test: RuntimeError
-getter_override_test/00: MissingCompileTimeError
-getter_override_test/01: MissingCompileTimeError
-getter_override_test/02: MissingCompileTimeError
 identical_closure2_test: RuntimeError # non JS number semantics
 implicit_downcast_during_assert_initializer_test: RuntimeError
 infinity_test: RuntimeError # non JS number semantics - Issue 4984
@@ -340,9 +329,6 @@
 malformed2_test/00: MissingCompileTimeError
 map_literal1_test/01: MissingCompileTimeError
 map_literal8_test: RuntimeError
-method_override7_test/00: MissingCompileTimeError
-method_override7_test/01: MissingCompileTimeError
-method_override7_test/02: MissingCompileTimeError
 mint_arithmetic_test: RuntimeError # non JS number semantics
 mixin_forwarding_constructor4_test/01: MissingCompileTimeError
 mixin_forwarding_constructor4_test/02: MissingCompileTimeError
@@ -442,7 +428,6 @@
 not_enough_positional_arguments_test/07: MissingCompileTimeError
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError, OK # non JS number semantics
-override_field_test/01: MissingCompileTimeError
 positional_parameters_type_test/01: MissingCompileTimeError
 positional_parameters_type_test/02: MissingCompileTimeError
 private_super_constructor_test/01: MissingCompileTimeError
@@ -462,8 +447,6 @@
 regress_29784_test/02: MissingCompileTimeError # Issue 29784
 regress_30339_test: RuntimeError # Issue 26429
 regress_31057_test: Crash # Unsupported operation: Unsupported type parameter type node B.
-setter_override_test/00: MissingCompileTimeError
-setter_override_test/03: MissingCompileTimeError
 stacktrace_demangle_ctors_test: RuntimeError # Issue 12698
 stacktrace_rethrow_error_test/none: RuntimeError # Issue 12698
 stacktrace_rethrow_error_test/withtraceparameter: RuntimeError # Issue 12698
@@ -519,11 +502,9 @@
 async_await_test/none: RuntimeError
 async_star_cancel_while_paused_test: RuntimeError
 async_star_test/02: RuntimeError
-bad_override_test/03: MissingCompileTimeError
 bit_operations_test: RuntimeError
 branch_canonicalization_test: RuntimeError
 canonical_const2_test: RuntimeError, OK # non JS number semantics
-check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
 compile_time_constant_o_test/01: MissingCompileTimeError
@@ -579,14 +560,8 @@
 external_test/21: CompileTimeError
 external_test/24: CompileTimeError
 f_bounded_quantification4_test: RuntimeError
-fauxverride_test/03: MissingCompileTimeError
-fauxverride_test/05: MissingCompileTimeError
 field_initialization_order_test/01: MissingCompileTimeError
 field_initialization_order_test/none: RuntimeError
-field_override3_test/00: MissingCompileTimeError
-field_override3_test/01: MissingCompileTimeError
-field_override3_test/02: MissingCompileTimeError
-field_override3_test/03: MissingCompileTimeError
 flatten_test/05: MissingRuntimeError
 flatten_test/08: MissingRuntimeError
 flatten_test/09: MissingRuntimeError
@@ -608,9 +583,6 @@
 generic_no_such_method_dispatcher_simple_test: CompileTimeError
 generic_no_such_method_dispatcher_test: CompileTimeError
 generic_tearoff_test: CompileTimeError
-getter_override_test/00: MissingCompileTimeError
-getter_override_test/01: MissingCompileTimeError
-getter_override_test/02: MissingCompileTimeError
 identical_closure2_test: RuntimeError # non JS number semantics
 if_null_precedence_test/none: RuntimeError
 infinity_test: RuntimeError # non JS number semantics - Issue 4984
@@ -637,9 +609,6 @@
 local_function2_test/none: RuntimeError
 local_function3_test/none: RuntimeError
 local_function_test/none: RuntimeError
-method_override7_test/00: MissingCompileTimeError
-method_override7_test/01: MissingCompileTimeError
-method_override7_test/02: MissingCompileTimeError
 method_override_test: CompileTimeError
 minify_closure_variable_collision_test: CompileTimeError
 mint_arithmetic_test: RuntimeError # non JS number semantics
@@ -727,7 +696,6 @@
 null_no_such_method_test: CompileTimeError
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError, OK # non JS number semantics
-override_field_test/01: MissingCompileTimeError
 override_inheritance_field_test/04: CompileTimeError
 override_inheritance_field_test/06: CompileTimeError
 override_inheritance_field_test/26: CompileTimeError
@@ -749,8 +717,6 @@
 regress_29784_test/02: MissingCompileTimeError # Issue 29784
 regress_30339_test: CompileTimeError
 setter_no_getter_test/01: CompileTimeError
-setter_override_test/00: MissingCompileTimeError
-setter_override_test/03: MissingCompileTimeError
 stacktrace_demangle_ctors_test: RuntimeError # Issue 12698
 stacktrace_rethrow_error_test/none: RuntimeError # Issue 12698
 stacktrace_rethrow_error_test/withtraceparameter: RuntimeError # Issue 12698
@@ -870,16 +836,12 @@
 async_star_cancel_while_paused_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
 async_star_test/02: RuntimeError
 await_not_started_immediately_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-bad_override_test/01: MissingCompileTimeError
-bad_override_test/02: MissingCompileTimeError
-bad_override_test/03: MissingCompileTimeError
 bit_operations_test: RuntimeError
 branch_canonicalization_test: RuntimeError
 call_non_method_field_test/01: MissingCompileTimeError
 call_non_method_field_test/02: MissingCompileTimeError
 canonical_const2_test: RuntimeError, OK # non JS number semantics
 check_member_static_test/01: MissingCompileTimeError
-check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
 class_literal_static_test/01: MissingCompileTimeError
@@ -953,15 +915,9 @@
 f_bounded_quantification_test/01: MissingCompileTimeError
 f_bounded_quantification_test/02: MissingCompileTimeError
 factory4_test/00: MissingCompileTimeError
-fauxverride_test/03: MissingCompileTimeError
-fauxverride_test/05: MissingCompileTimeError
 field3_test/01: MissingCompileTimeError
 field_initialization_order_test/01: MissingCompileTimeError
 field_initialization_order_test/none: RuntimeError
-field_override3_test/00: MissingCompileTimeError
-field_override3_test/01: MissingCompileTimeError
-field_override3_test/02: MissingCompileTimeError
-field_override3_test/03: MissingCompileTimeError
 field_override_test/00: MissingCompileTimeError
 field_override_test/01: MissingCompileTimeError
 flatten_test/05: MissingRuntimeError
@@ -988,10 +944,6 @@
 generic_no_such_method_dispatcher_simple_test: CompileTimeError
 generic_no_such_method_dispatcher_test: CompileTimeError
 generic_tearoff_test: CompileTimeError
-getter_override_test/00: MissingCompileTimeError
-getter_override_test/01: MissingCompileTimeError
-getter_override_test/02: MissingCompileTimeError
-getter_override_test/03: MissingCompileTimeError
 identical_closure2_test: RuntimeError # non JS number semantics
 identical_const_test/01: MissingCompileTimeError
 identical_const_test/02: MissingCompileTimeError
@@ -1046,10 +998,6 @@
 map_literal3_test/01: MissingCompileTimeError
 map_literal3_test/02: MissingCompileTimeError
 map_literal3_test/03: MissingCompileTimeError
-method_override7_test/00: MissingCompileTimeError
-method_override7_test/01: MissingCompileTimeError
-method_override7_test/02: MissingCompileTimeError
-method_override7_test/03: MissingCompileTimeError
 method_override_test: CompileTimeError
 minify_closure_variable_collision_test: CompileTimeError
 mint_arithmetic_test: RuntimeError # non JS number semantics
@@ -1165,7 +1113,6 @@
 null_no_such_method_test: CompileTimeError
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError, OK # non JS number semantics
-override_field_test/01: MissingCompileTimeError
 override_field_test/02: MissingCompileTimeError
 override_field_test/03: MissingCompileTimeError
 override_inheritance_field_test/04: CompileTimeError
@@ -1203,10 +1150,6 @@
 regress_30339_test: CompileTimeError
 setter4_test: MissingCompileTimeError
 setter_no_getter_test/01: CompileTimeError
-setter_override_test/00: MissingCompileTimeError
-setter_override_test/01: MissingCompileTimeError
-setter_override_test/02: MissingCompileTimeError
-setter_override_test/03: MissingCompileTimeError
 stacktrace_demangle_ctors_test: RuntimeError # Issue 12698
 stacktrace_rethrow_error_test/none: RuntimeError # Issue 12698
 stacktrace_rethrow_error_test/withtraceparameter: RuntimeError # Issue 12698
@@ -1352,9 +1295,6 @@
 async_star_cancel_while_paused_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 async_star_test/02: RuntimeError
 await_not_started_immediately_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-bad_override_test/01: MissingCompileTimeError
-bad_override_test/02: MissingCompileTimeError
-bad_override_test/03: MissingCompileTimeError
 bit_operations_test: RuntimeError
 branch_canonicalization_test: RuntimeError
 call_non_method_field_test/01: MissingCompileTimeError
@@ -1362,7 +1302,6 @@
 call_with_no_such_method_test: RuntimeError
 canonical_const2_test: RuntimeError, OK # non JS number semantics
 check_member_static_test/01: MissingCompileTimeError
-check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
 class_literal_static_test/01: MissingCompileTimeError
@@ -1431,15 +1370,9 @@
 f_bounded_quantification_test/01: MissingCompileTimeError
 f_bounded_quantification_test/02: MissingCompileTimeError
 factory4_test/00: MissingCompileTimeError
-fauxverride_test/03: MissingCompileTimeError
-fauxverride_test/05: MissingCompileTimeError
 field3_test/01: MissingCompileTimeError
 field_initialization_order_test/01: MissingCompileTimeError
 field_initialization_order_test/none: RuntimeError
-field_override3_test/00: MissingCompileTimeError
-field_override3_test/01: MissingCompileTimeError
-field_override3_test/02: MissingCompileTimeError
-field_override3_test/03: MissingCompileTimeError
 field_override_test/00: MissingCompileTimeError
 field_override_test/01: MissingCompileTimeError
 flatten_test/05: MissingRuntimeError
@@ -1466,10 +1399,6 @@
 generic_no_such_method_dispatcher_simple_test: CompileTimeError
 generic_no_such_method_dispatcher_test: CompileTimeError
 generic_tearoff_test: CompileTimeError
-getter_override_test/00: MissingCompileTimeError
-getter_override_test/01: MissingCompileTimeError
-getter_override_test/02: MissingCompileTimeError
-getter_override_test/03: MissingCompileTimeError
 identical_closure2_test: RuntimeError # non JS number semantics
 identical_const_test/01: MissingCompileTimeError
 identical_const_test/02: MissingCompileTimeError
@@ -1527,10 +1456,6 @@
 map_literal3_test/01: MissingCompileTimeError
 map_literal3_test/02: MissingCompileTimeError
 map_literal3_test/03: MissingCompileTimeError
-method_override7_test/00: MissingCompileTimeError
-method_override7_test/01: MissingCompileTimeError
-method_override7_test/02: MissingCompileTimeError
-method_override7_test/03: MissingCompileTimeError
 method_override_test: CompileTimeError
 minify_closure_variable_collision_test: CompileTimeError
 mint_arithmetic_test: RuntimeError # non JS number semantics
@@ -1652,7 +1577,6 @@
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError, OK # non JS number semantics
 overridden_no_such_method_test: RuntimeError
-override_field_test/01: MissingCompileTimeError
 override_field_test/02: MissingCompileTimeError
 override_field_test/03: MissingCompileTimeError
 override_inheritance_field_test/04: CompileTimeError
@@ -1688,10 +1612,6 @@
 regress_30339_test: CompileTimeError
 setter4_test: MissingCompileTimeError
 setter_no_getter_test/01: CompileTimeError
-setter_override_test/00: MissingCompileTimeError
-setter_override_test/01: MissingCompileTimeError
-setter_override_test/02: MissingCompileTimeError
-setter_override_test/03: MissingCompileTimeError
 stack_trace_test: RuntimeError, OK # Stack trace not preserved in minified code.
 stacktrace_demangle_ctors_test: RuntimeError # Issue 12698
 stacktrace_rethrow_error_test/none: RuntimeError # Issue 12698
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index 7160089..83843ad 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -33,6 +33,8 @@
 conflicting_type_variable_and_setter_test: CompileTimeError
 const_cast2_test/01: CompileTimeError
 const_cast2_test/none: CompileTimeError
+const_constructor_mixin3_test/01: MissingCompileTimeError # Issue 33644
+const_constructor_mixin_test/01: MissingCompileTimeError # Issue 33644
 const_for_in_variable_test/01: MissingCompileTimeError
 const_types_test/07: MissingCompileTimeError
 const_types_test/08: MissingCompileTimeError
@@ -102,6 +104,7 @@
 issue32353_test: RuntimeError
 label_test: RuntimeError
 left_shift_test: RuntimeError # Ints and doubles are unified.
+method_override7_test/03: MissingCompileTimeError
 method_override_test: CompileTimeError # Negative test
 mixin_super_2_test/01: MissingCompileTimeError
 mixin_super_2_test/03: MissingCompileTimeError
@@ -318,9 +321,6 @@
 async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError
 async_return_types_test/nestedFuture: MissingCompileTimeError
 async_return_types_test/wrongReturnType: MissingCompileTimeError
-bad_override_test/01: MissingCompileTimeError
-bad_override_test/02: MissingCompileTimeError
-bad_override_test/03: MissingCompileTimeError
 bit_operations_test/03: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 bit_operations_test/04: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 bit_operations_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
@@ -335,7 +335,6 @@
 call_non_method_field_test/01: MissingCompileTimeError
 call_non_method_field_test/02: MissingCompileTimeError
 check_member_static_test/01: MissingCompileTimeError
-check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
 compile_time_constant_c_test/02: MissingCompileTimeError
@@ -395,13 +394,7 @@
 f_bounded_quantification_test/01: MissingCompileTimeError
 f_bounded_quantification_test/02: MissingCompileTimeError
 factory4_test/00: MissingCompileTimeError
-fauxverride_test/03: MissingCompileTimeError
-fauxverride_test/05: MissingCompileTimeError
 field_initialization_order_test/01: MissingCompileTimeError
-field_override3_test/00: MissingCompileTimeError
-field_override3_test/01: MissingCompileTimeError
-field_override3_test/02: MissingCompileTimeError
-field_override3_test/03: MissingCompileTimeError
 field_override_test/00: MissingCompileTimeError
 field_override_test/01: MissingCompileTimeError
 function_propagation_test: RuntimeError
@@ -415,10 +408,6 @@
 generic_no_such_method_dispatcher_simple_test: CompileTimeError # Warning: Superclass has no method named 'foo'.
 generic_no_such_method_dispatcher_test: CompileTimeError # Issue 31533
 generic_test/01: MissingCompileTimeError # front end does not validate `extends`
-getter_override_test/00: MissingCompileTimeError
-getter_override_test/01: MissingCompileTimeError
-getter_override_test/02: MissingCompileTimeError
-getter_override_test/03: MissingCompileTimeError
 guess_cid_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 identical_closure2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 identical_const_test/01: MissingCompileTimeError
@@ -466,9 +455,6 @@
 map_literal3_test/01: MissingCompileTimeError
 map_literal3_test/02: MissingCompileTimeError
 map_literal3_test/03: MissingCompileTimeError
-method_override7_test/00: MissingCompileTimeError
-method_override7_test/01: MissingCompileTimeError
-method_override7_test/02: MissingCompileTimeError
 method_override_test: CompileTimeError # Issue 31616
 mint_arithmetic_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 mint_compares_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
@@ -546,7 +532,6 @@
 mixin_supertype_subclass_test/05: MissingCompileTimeError
 mixin_type_parameters_errors_test/03: MissingCompileTimeError
 mixin_type_parameters_errors_test/04: MissingCompileTimeError
-mock_writable_final_field_test: RuntimeError # Issue 30847
 mock_writable_final_private_field_test: RuntimeError
 multiline_newline_test/06: MissingCompileTimeError
 multiline_newline_test/06r: MissingCompileTimeError
@@ -555,7 +540,6 @@
 no_such_method_mock_test: RuntimeError # Issue 31426 - Kernel does not introduce nSM for implemented fields.
 null_no_such_method_test: CompileTimeError # Issue 31533
 number_identity_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-override_field_test/01: MissingCompileTimeError
 override_field_test/02: MissingCompileTimeError
 override_inheritance_field_test/04: CompileTimeError # Issue 31616
 override_inheritance_field_test/06: CompileTimeError # Issue 31616
@@ -584,10 +568,6 @@
 regress_30339_test: CompileTimeError
 setter4_test: MissingCompileTimeError
 setter_no_getter_test/01: CompileTimeError
-setter_override_test/00: MissingCompileTimeError
-setter_override_test/01: MissingCompileTimeError
-setter_override_test/02: MissingCompileTimeError
-setter_override_test/03: MissingCompileTimeError
 string_split_test: CompileTimeError # Issue 31616
 string_supertype_checked_test: CompileTimeError # Issue 31616
 super_bound_closure_test/none: CompileTimeError # Issue 31533
@@ -714,7 +694,6 @@
 local_function2_test/none: RuntimeError # ReferenceError: TToNull is not defined
 local_function3_test/none: RuntimeError # Expect.equals(expected: <true>, actual: <false>) fails.
 local_function_test/none: RuntimeError # Expect.equals(expected: <true>, actual: <false>) fails.
-method_override7_test/03: MissingCompileTimeError # Issue 30514
 mint_arithmetic_test: RuntimeError # Issue 29920; Expect.equals(expected: <4294967297>, actual: <1>) fails.
 modulo_test: RuntimeError # Ints and doubles are unified.; Expect.throws fails: Did not throw
 multiline_newline_test/04: MissingCompileTimeError
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index 533ae5ff..b54747c 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -124,7 +124,6 @@
 mixin_illegal_superclass_test/28: MissingCompileTimeError
 mixin_illegal_superclass_test/29: MissingCompileTimeError
 mixin_illegal_superclass_test/30: MissingCompileTimeError
-mock_writable_final_private_field_test: RuntimeError
 named_parameters_default_eq_test/none: RuntimeError
 nested_generic_closure_test: RuntimeError
 no_main_test/01: Crash
@@ -169,6 +168,7 @@
 [ $compiler == dartkp ]
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
+constant_string_interpolation2_test: DartkCrash # Issue 33628
 covariant_subtyping_test: RuntimeError
 duplicate_implements_test/01: MissingCompileTimeError
 duplicate_implements_test/02: MissingCompileTimeError
@@ -226,8 +226,6 @@
 async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError # Issue 33068
 async_return_types_test/nestedFuture: MissingCompileTimeError # Issue 33068
 async_return_types_test/wrongReturnType: MissingCompileTimeError # Issue 33068
-bad_override_test/01: MissingCompileTimeError # Issue 32984
-bad_override_test/02: MissingCompileTimeError # Issue 32984
 call_non_method_field_test/01: MissingCompileTimeError # Issue 32975
 call_non_method_field_test/02: MissingCompileTimeError # Issue 32975
 check_member_static_test/01: MissingCompileTimeError # Issue 32613
@@ -264,7 +262,6 @@
 generic_methods_bounds_test/01: MissingCompileTimeError # Issue 33018
 generic_methods_overriding_test/01: MissingCompileTimeError # Issue 32613
 generic_methods_recursive_bound_test/02: MissingCompileTimeError # Issue 33018
-getter_override_test/03: MissingCompileTimeError # Issue 32984
 issue31596_override_test/07: MissingCompileTimeError
 issue31596_override_test/08: MissingCompileTimeError
 issue31596_super_test/02: MissingCompileTimeError
@@ -285,7 +282,6 @@
 malbounded_type_test_test/00: MissingCompileTimeError # Issue 33018
 malbounded_type_test_test/01: MissingCompileTimeError # Issue 33018
 malbounded_type_test_test/02: MissingCompileTimeError # Issue 33018
-method_override7_test/03: MissingCompileTimeError # Issue 32984
 mixin_forwarding_constructor4_test/01: MissingCompileTimeError # KernelVM bug: Issue 15101
 mixin_forwarding_constructor4_test/02: MissingCompileTimeError # KernelVM bug: Issue 15101
 mixin_forwarding_constructor4_test/03: MissingCompileTimeError # KernelVM bug: Issue 15101
@@ -338,8 +334,6 @@
 regress_29784_test/01: MissingCompileTimeError
 regress_29784_test/02: MissingCompileTimeError
 setter4_test: MissingCompileTimeError # Issue 14736
-setter_override_test/01: MissingCompileTimeError
-setter_override_test/02: MissingCompileTimeError
 switch_bad_case_test/01: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 switch_bad_case_test/02: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 switch_case_test/00: MissingCompileTimeError # KernelVM bug: Constant evaluation.
@@ -797,12 +791,11 @@
 method_override_test: CompileTimeError # Issue 31616
 mixin_illegal_super_use_test: Skip # Issues 24478 and 23773
 mixin_illegal_superclass_test: Skip # Issues 24478 and 23773
-mock_writable_final_private_field_test: RuntimeError # Issue 30849
 named_constructor_test/01: MissingRuntimeError # Fasta bug: Bad compilation of constructor reference.
 named_parameters_default_eq_test/none: RuntimeError
 nested_generic_closure_test: RuntimeError
-no_main_test/01: DartkCrash
 no_main_test/01: Skip
+no_main_test/01: DartkCrash
 no_such_method_mock_test: RuntimeError # Issue 31426
 null_no_such_method_test: CompileTimeError # Issue 31533
 override_inheritance_field_test/04: CompileTimeError # Issue 31616
@@ -839,6 +832,7 @@
 type_promotion_functions_test/none: CompileTimeError # Issue 31537
 type_promotion_logical_and_test/01: MissingCompileTimeError
 type_promotion_more_specific_test/04: CompileTimeError # Issue 31533
+vm/bool_check_stack_traces_test/02: RuntimeError # Issue 33584
 vm/closure_memory_retention_test: Skip # KernelVM bug: Hits OOM
 vm/regress_29145_test: Skip # Issue 29145
 vm/type_cast_vm_test: RuntimeError
@@ -907,6 +901,8 @@
 type_alias_equality_test/02: RuntimeError # Issue 31359
 type_alias_equality_test/03: RuntimeError # Issue 31359
 type_alias_equality_test/04: RuntimeError # Issue 31359
+vm/bool_check_stack_traces_test/01: RuntimeError # Issue 33584
+vm/bool_check_stack_traces_test/02: RuntimeError # Issue 33584
 
 [ $compiler == dartkp && $runtime == dart_precompiled && $checked && $strong ]
 assert_initializer_test/31: MissingCompileTimeError # KernelVM bug: Constant evaluation.
@@ -1008,13 +1004,11 @@
 async_star_cancel_while_paused_test: RuntimeError
 async_star_pause_test: Fail, OK
 async_star_test/02: RuntimeError, CompileTimeError # Issue 31402 (Invocation arguments)
-bad_override_test/03: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 built_in_identifier_prefix_test: CompileTimeError
 call_method_implicit_tear_off_implements_function_test/05: RuntimeError
 call_method_implicit_tear_off_implements_function_test/06: RuntimeError
 call_method_must_not_be_field_test/03: RuntimeError # Issue 32265
 call_method_must_not_be_getter_test/03: RuntimeError # Issue 32265
-check_member_static_test/02: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 checked_setter3_test/01: MissingCompileTimeError
 checked_setter3_test/02: MissingCompileTimeError
 checked_setter3_test/03: MissingCompileTimeError
@@ -1053,14 +1047,8 @@
 external_test/13: MissingRuntimeError # KernelVM bug: Unbound external.
 external_test/20: MissingRuntimeError # KernelVM bug: Unbound external.
 factory3_test/01: Pass
-fauxverride_test/03: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
-fauxverride_test/05: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 field_increment_bailout_test: SkipByDesign
 field_initialization_order_test: Fail, OK
-field_override3_test/00: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
-field_override3_test/01: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
-field_override3_test/02: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
-field_override3_test/03: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 flatten_test/05: MissingRuntimeError
 flatten_test/08: MissingRuntimeError
 flatten_test/09: MissingRuntimeError
@@ -1077,9 +1065,6 @@
 generic_no_such_method_dispatcher_simple_test: CompileTimeError # Issue 31533
 generic_no_such_method_dispatcher_test: CompileTimeError # Issue 31533
 generic_tearoff_test: CompileTimeError
-getter_override_test/00: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
-getter_override_test/01: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
-getter_override_test/02: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 hello_dart_test: Skip # Incompatible flag: --compile_all
 implicit_closure_test: Skip # Incompatible flag: --use_slow_path
 implicit_downcast_during_assignment_test: Pass # Correctly passes.
@@ -1132,13 +1117,9 @@
 method_override6_test/01: MissingCompileTimeError
 method_override6_test/02: MissingCompileTimeError
 method_override6_test/03: MissingCompileTimeError
-method_override7_test/00: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
-method_override7_test/01: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
-method_override7_test/02: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 method_override_test: CompileTimeError # Issue 31616
 mixin_illegal_super_use_test: Skip # Issues 24478 and 23773
 mixin_illegal_superclass_test: Skip # Issues 24478 and 23773
-mock_writable_final_private_field_test: RuntimeError # Issue 30849
 named_parameters_default_eq_test/none: RuntimeError
 nested_generic_closure_test: RuntimeError
 no_main_test/01: Skip
@@ -1148,7 +1129,6 @@
 null_test/mirrors: Skip # Uses mirrors.
 null_test/none: SkipByDesign
 overridden_no_such_method_test: SkipByDesign
-override_field_test/01: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 override_inheritance_field_test/04: CompileTimeError # Issue 31616
 override_inheritance_field_test/06: CompileTimeError # Issue 31616
 override_inheritance_field_test/26: CompileTimeError # Issue 31616
@@ -1171,8 +1151,6 @@
 regress_29405_test: CompileTimeError # Issue 31402 (Invocation arguments)
 regress_30339_test: CompileTimeError # Issue 31402 (Variable declaration)
 setter_no_getter_test/01: Pass, CompileTimeError # Issue 31533 (started passing after switching to batch-mode)
-setter_override_test/00: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
-setter_override_test/03: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 stacktrace_demangle_ctors_test: RuntimeError
 string_interpolation_and_buffer_test: RuntimeError # Issue 31402 (Return and yield statements)
 string_split_test: CompileTimeError # Issue 31616
@@ -1260,8 +1238,6 @@
 map_literal3_test/02: MissingCompileTimeError
 
 [ $compiler == fasta && $strong ]
-bad_override_test/03: MissingCompileTimeError
-check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
 compile_time_constant_static4_test/02: MissingCompileTimeError
@@ -1284,28 +1260,16 @@
 export_ambiguous_main_test: MissingCompileTimeError
 external_test/21: CompileTimeError
 external_test/24: CompileTimeError
-fauxverride_test/03: MissingCompileTimeError
-fauxverride_test/05: MissingCompileTimeError
 field_initialization_order_test/01: MissingCompileTimeError
-field_override3_test/00: MissingCompileTimeError
-field_override3_test/01: MissingCompileTimeError
-field_override3_test/02: MissingCompileTimeError
-field_override3_test/03: MissingCompileTimeError
 generic_function_type_as_type_argument_test/01: MissingCompileTimeError
 generic_function_type_as_type_argument_test/02: MissingCompileTimeError
 generic_methods_generic_function_result_test/01: MissingCompileTimeError
 generic_no_such_method_dispatcher_simple_test: CompileTimeError
 generic_no_such_method_dispatcher_test: CompileTimeError
 generic_tearoff_test: CompileTimeError
-getter_override_test/00: MissingCompileTimeError
-getter_override_test/01: MissingCompileTimeError
-getter_override_test/02: MissingCompileTimeError
 instantiate_tearoff_of_call_test: CompileTimeError
 issue31596_super_test/01: CompileTimeError
 issue31596_super_test/03: CompileTimeError
-method_override7_test/00: MissingCompileTimeError
-method_override7_test/01: MissingCompileTimeError
-method_override7_test/02: MissingCompileTimeError
 method_override_test: CompileTimeError
 mixin_illegal_super_use_test/01: MissingCompileTimeError
 mixin_illegal_super_use_test/04: MissingCompileTimeError
@@ -1349,7 +1313,6 @@
 multiline_newline_test/06: MissingCompileTimeError
 multiline_newline_test/06r: MissingCompileTimeError
 null_no_such_method_test: CompileTimeError
-override_field_test/01: MissingCompileTimeError
 override_inheritance_field_test/04: CompileTimeError
 override_inheritance_field_test/06: CompileTimeError
 override_inheritance_field_test/26: CompileTimeError
@@ -1363,8 +1326,6 @@
 regress_29405_test: CompileTimeError
 regress_30339_test: CompileTimeError
 setter_no_getter_test/01: CompileTimeError
-setter_override_test/00: MissingCompileTimeError
-setter_override_test/03: MissingCompileTimeError
 string_split_test: CompileTimeError
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
@@ -1494,6 +1455,8 @@
 bad_named_parameters_test/03: MissingCompileTimeError
 bad_named_parameters_test/04: MissingCompileTimeError
 bad_named_parameters_test/05: MissingCompileTimeError
+bad_override_test/01: MissingCompileTimeError
+bad_override_test/02: MissingCompileTimeError
 bad_override_test/03: MissingCompileTimeError
 bad_override_test/06: MissingCompileTimeError
 built_in_identifier_type_annotation_test/dynamic-gen: MissingCompileTimeError
@@ -1736,6 +1699,7 @@
 getter_override_test/00: MissingCompileTimeError
 getter_override_test/01: MissingCompileTimeError
 getter_override_test/02: MissingCompileTimeError
+getter_override_test/03: MissingCompileTimeError
 getters_setters2_test/02: MissingCompileTimeError
 if_null_assignment_behavior_test/03: MissingCompileTimeError
 if_null_assignment_behavior_test/13: MissingCompileTimeError
@@ -1892,6 +1856,7 @@
 method_override7_test/00: MissingCompileTimeError
 method_override7_test/01: MissingCompileTimeError
 method_override7_test/02: MissingCompileTimeError
+method_override7_test/03: MissingCompileTimeError
 mixin_illegal_constructor_test/13: MissingCompileTimeError
 mixin_illegal_constructor_test/14: MissingCompileTimeError
 mixin_illegal_constructor_test/15: MissingCompileTimeError
@@ -2078,7 +2043,10 @@
 return_type_test: MissingCompileTimeError
 rewrite_implicit_this_test/01: MissingCompileTimeError
 setter_no_getter_call_test/01: MissingCompileTimeError
+setter_override2_test/02: MissingCompileTimeError
 setter_override_test/00: MissingCompileTimeError
+setter_override_test/01: MissingCompileTimeError
+setter_override_test/02: MissingCompileTimeError
 setter_override_test/03: MissingCompileTimeError
 static_call_wrong_argument_count_negative_test: Fail
 static_field1_test/01: MissingCompileTimeError
diff --git a/tests/language_2/vm/bool_check_stack_traces_test.dart b/tests/language_2/vm/bool_check_stack_traces_test.dart
new file mode 100644
index 0000000..cd80936
--- /dev/null
+++ b/tests/language_2/vm/bool_check_stack_traces_test.dart
@@ -0,0 +1,103 @@
+// 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:expect/expect.dart";
+
+class Test1 {
+  void bar(bool condition) {
+    if (condition) {
+      Expect.fail('Should not reach here');
+    }
+    Expect.fail('Should throw earlier');
+  }
+}
+
+void test1(bool condition) {
+  Test1 obj = new Test1();
+  obj.bar(condition);
+}
+
+class Test2 {
+  bool condition;
+  Test2(this.condition);
+
+  void bar() {
+    if (!condition) {
+      Expect.fail('Should not reach here');
+    }
+    Expect.fail('Should throw earlier');
+  }
+}
+
+void test2(bool condition) {
+  Test2 obj = new Test2(condition);
+  obj.bar();
+}
+
+class Test3 {
+  bool condition;
+  Test3(this.condition);
+
+  bool bazz() => condition;
+
+  void bar() {
+    while (bazz() || bazz()) {
+      Expect.fail('Should not reach here');
+    }
+    Expect.fail('Should throw earlier');
+  }
+}
+
+void test3(bool condition) {
+  Test3 obj = new Test3(condition);
+  obj.bar();
+}
+
+const bool test4Condition = null;
+
+void test4(bool condition) {
+  if (test4Condition) {
+    Expect.fail('Should not reach here');
+  }
+  Expect.fail('Should throw earlier');
+}
+
+void test5(bool condition) {
+  if (null) {
+    Expect.fail('Should not reach here');
+  }
+  Expect.fail('Should throw earlier');
+}
+
+void testStackTrace(void testCase(bool condition), List<int> lineNumbers) {
+  try {
+    testCase(null);
+    Expect.fail("Using null in a bool condition should throw TypeError");
+  } catch (e, stacktrace) {
+    print('--------- exception ---------');
+    print(e);
+    print('-------- stack trace --------');
+    print(stacktrace);
+    print('-----------------------------');
+
+    Expect.isTrue(e is AssertionError);
+    Expect.equals(
+        'Failed assertion: boolean expression must not be null', e.toString());
+
+    final String st = stacktrace.toString();
+    for (int lineNum in lineNumbers) {
+      String item = '.dart:$lineNum';
+      Expect.isTrue(st.contains(item), "Stack trace doesn't contain $item");
+    }
+    print('OK');
+  }
+}
+
+main() {
+  testStackTrace(test1, [9, 18]);
+  testStackTrace(test2, [26, 35]);
+  testStackTrace(test3, [45, 54]);
+  testStackTrace(test4, [60]); //# 01: ok
+  testStackTrace(test5, [67]); //# 02: ok
+}
diff --git a/tests/language_2/void/return_future_future_or_void_async_test.dart b/tests/language_2/void/return_future_future_or_void_async_test.dart
index 81fb4da..68b65ad 100644
--- a/tests/language_2/void/return_future_future_or_void_async_test.dart
+++ b/tests/language_2/void/return_future_future_or_void_async_test.dart
@@ -8,8 +8,6 @@
 
 void main() {
   test1();
-  test2();
-  test3();
   test4();
   test5();
   test6();
@@ -20,16 +18,6 @@
 // Testing that a block bodied async function may have no return
 Future<FutureOr<void>> test1() async {}
 
-// Testing that a block bodied async function may return Future<void>
-Future<FutureOr<void>> test2([bool b]) async {
-  return null as Future<void>;
-}
-
-// Testing that a block bodied async function may return FutureOr<void>
-Future<FutureOr<void>> test3([bool b]) async {
-  return null as FutureOr<void>;
-}
-
 // Testing that a block bodied async function may return Future<FutureOr<void>>
 Future<FutureOr<void>> test4([bool b]) async {
   return null as Future<FutureOr<void>>;
@@ -54,5 +42,5 @@
 // Testing that a block bodied async function may return non-void
 // Future values
 Future<FutureOr<void>> test8() async {
-  return new Future.value(42);
+  return new Future<int>.value(42);
 }
diff --git a/tests/language_2/void/return_future_or_void_async_error0_test.dart b/tests/language_2/void/return_future_or_void_async_error0_test.dart
deleted file mode 100644
index c5115a7..0000000
--- a/tests/language_2/void/return_future_or_void_async_error0_test.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-// 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';
-
-void voidValue = null;
-
-void main() {
-  test();
-}
-
-// Testing that a block bodied function may not return void
-FutureOr<void> test() async {
-  return /*@compile-error=unspecified*/ voidValue;
-}
diff --git a/tests/language_2/void/return_future_or_void_async_test.dart b/tests/language_2/void/return_future_or_void_async_test.dart
index dfdf1e7..151f337 100644
--- a/tests/language_2/void/return_future_or_void_async_test.dart
+++ b/tests/language_2/void/return_future_or_void_async_test.dart
@@ -11,8 +11,7 @@
   test1();
   test2();
   test3();
-  test4();
-  test5();
+  test6();
 }
 
 // Testing that a block bodied function may have an empty return
@@ -33,14 +32,7 @@
   return null as FutureOr<void>;
 }
 
-// Testing that a block bodied async function may return non-void
-// values
-FutureOr<void> test4() async {
-  return 42;
-}
-
-// Testing that a block bodied async function may return non-void
-// Future values
-FutureOr<void> test5() async {
-  return new Future.value(42);
+// Testing that a block bodied function may return void
+FutureOr<void> test6() async {
+  return voidValue;
 }
diff --git a/tests/language_2/void/return_future_void_async_error2_test.dart b/tests/language_2/void/return_future_void_async_error2_test.dart
deleted file mode 100644
index d31263e..0000000
--- a/tests/language_2/void/return_future_void_async_error2_test.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-// 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';
-
-void voidValue = null;
-
-void main() {
-  test();
-}
-
-// Testing that a block bodied async function may return void
-Future<void> test() async {
-  return /*@compile-error=unspecified*/ voidValue;
-}
diff --git a/tests/language_2/void/return_future_void_async_test.dart b/tests/language_2/void/return_future_void_async_test.dart
index ba3f1f1..dae62ed 100644
--- a/tests/language_2/void/return_future_void_async_test.dart
+++ b/tests/language_2/void/return_future_void_async_test.dart
@@ -34,20 +34,17 @@
   return null as FutureOr<void>;
 }
 
-// Testing that a block bodied async function may return non-void
-// values
-Future<void> test4() async {
-  return 42;
+// Testing that a block bodied async function may return null
+Future<void> test4([bool b]) async {
+  return null;
 }
 
-// Testing that a block bodied async function may return non-void
-// Future values
-Future<void> test5() async {
-  return new Future.value(42);
+// Testing that a block bodied async function may return dynamic
+Future<void> test5([bool b]) async {
+  return null as dynamic;
 }
 
-// Testing that a block bodied async function return nested void
-// Future values
+// Testing that a block bodied async function return void
 Future<void> test6() async {
-  return null as Future<Future<void>>;
+  return voidValue;
 }
diff --git a/tests/language_2/void/return_void_async_error3_test.dart b/tests/language_2/void/return_void_async_error3_test.dart
deleted file mode 100644
index 27e691b..0000000
--- a/tests/language_2/void/return_void_async_error3_test.dart
+++ /dev/null
@@ -1,14 +0,0 @@
-// 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';
-
-void main() {
-  test();
-}
-
-// Testing that a block bodied async function may not return Future<void>
-void test() async {
-  return /*@compile-error=unspecified*/ null as Future<void>;
-}
diff --git a/tests/language_2/void/return_void_async_test.dart b/tests/language_2/void/return_void_async_test.dart
index bf10b9c..2f9966b 100644
--- a/tests/language_2/void/return_void_async_test.dart
+++ b/tests/language_2/void/return_void_async_test.dart
@@ -11,6 +11,8 @@
   test1();
   test2();
   test3();
+  test4();
+  test5();
 }
 
 // Testing that a block bodied async function may have an empty return
@@ -35,3 +37,13 @@
     return voidValue;
   }
 }
+
+// Testing that a block bodied async function may return Null
+void test4() async {
+  return null;
+}
+
+// Testing that a block bodied async function may return dynamic
+void test5() async {
+  return null as dynamic;
+}
diff --git a/tests/standalone_2/standalone_2.status b/tests/standalone_2/standalone_2.status
index be289b1..a80c78b 100644
--- a/tests/standalone_2/standalone_2.status
+++ b/tests/standalone_2/standalone_2.status
@@ -6,6 +6,9 @@
 # listed in tests/lib/analyzer/analyze_tests.status without the "standalone"
 # prefix.
 io/http_close_test: Pass, RuntimeError # Issue 28380
+io/non_utf8_directory_test: Skip # Issue 33519. Temp files causing bots to go purple.
+io/non_utf8_file_test: Skip # Issue 33519. Temp files causing bots to go purple.
+io/non_utf8_link_test: Skip # Issue 33519. Temp files causing bots to go purple.
 io/raw_socket_test: Pass, RuntimeError # Issue 28288
 issue14236_test: Pass # Do not remove this line. It serves as a marker for Issue 14516 comment #4.
 package/invalid_uri_test: Fail, OK # CompileTimeErrors intentionally
diff --git a/tools/VERSION b/tools/VERSION
index bbc4468..bbe378c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 0
 PATCH 0
-PRERELEASE 65
+PRERELEASE 66
 PRERELEASE_PATCH 0
diff --git a/tools/sdks/linux/dart-sdk.tar.gz.sha1 b/tools/sdks/linux/dart-sdk.tar.gz.sha1
index e12fb60..f888b4d 100644
--- a/tools/sdks/linux/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/linux/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-cb26a440fbe1a3cef64c580ee9055a746278ea82
\ No newline at end of file
+739732637a9d7a2cbd04beb36c4d117d615fd22c
\ No newline at end of file
diff --git a/tools/sdks/mac/dart-sdk.tar.gz.sha1 b/tools/sdks/mac/dart-sdk.tar.gz.sha1
index 03cf63f..0db4273 100644
--- a/tools/sdks/mac/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/mac/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-c66ec04f2b2e00c30b307eb2275a2bd91fa97287
\ No newline at end of file
+80c81b7d814e5897b8350b6f2a3b60353080ca45
\ No newline at end of file
diff --git a/tools/sdks/win/dart-sdk.tar.gz.sha1 b/tools/sdks/win/dart-sdk.tar.gz.sha1
index 361bfca..3b0ea4f 100644
--- a/tools/sdks/win/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/win/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-26a6441397eea6cf00c7b3e565de4aa40c43a9c6
\ No newline at end of file
+5dbee047c7824357eb7e6581cd69687a623449ab
\ No newline at end of file
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index 757ef01..c474bd7 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -1011,8 +1011,10 @@
     } else {
       arguments.add('--no-strong');
     }
-    if (_configuration.compiler == Compiler.dart2analyzer &&
-        _configuration.usesFasta) {
+    if (_configuration.useAnalyzerCfe) {
+      arguments.add('--use-cfe');
+    }
+    if (_configuration.useAnalyzerFastaParser) {
       arguments.add('--use-fasta-parser');
     }
 
diff --git a/tools/testing/dart/configuration.dart b/tools/testing/dart/configuration.dart
index e78b2d4..80808c3 100644
--- a/tools/testing/dart/configuration.dart
+++ b/tools/testing/dart/configuration.dart
@@ -46,6 +46,8 @@
       this.reportInJson,
       this.resetBrowser,
       this.skipCompilation,
+      this.useAnalyzerCfe,
+      this.useAnalyzerFastaParser,
       this.useBlobs,
       this.useSdk,
       this.useFastStartup,
@@ -120,6 +122,8 @@
   final bool reportInJson;
   final bool resetBrowser;
   final bool skipCompilation;
+  final bool useAnalyzerCfe;
+  final bool useAnalyzerFastaParser;
   final bool useBlobs;
   final bool useSdk;
   final bool useFastStartup;
@@ -194,7 +198,7 @@
     return fastaCompilers.contains(compiler) ||
         (compiler == Compiler.dart2js && !useDart2JSOldFrontend) ||
         (compiler == Compiler.dart2analyzer &&
-            builderTag == 'analyzer_use_fasta');
+            (builderTag == 'analyzer_use_fasta' || useAnalyzerCfe));
   }
 
   /// The base directory named for this configuration, like:
@@ -471,6 +475,8 @@
         'fast_startup': useFastStartup,
         'timeout': timeout,
         'no_preview_dart_2': noPreviewDart2,
+        'use_cfe': useAnalyzerCfe,
+        'analyzer_use_fasta_parser': useAnalyzerFastaParser,
         'dart2js_with_kernel': useDart2JSWithKernel,
         'dart2js_old_frontend': useDart2JSOldFrontend,
         'enable_asserts': useEnableAsserts,
diff --git a/tools/testing/dart/environment.dart b/tools/testing/dart/environment.dart
index 55397f8..f0bda0dd 100644
--- a/tools/testing/dart/environment.dart
+++ b/tools/testing/dart/environment.dart
@@ -13,6 +13,8 @@
 // consider adding support for "!" to status expressions.
 final _variables = {
   "analyzer": new _Variable.bool((c) => c.compiler == Compiler.dart2analyzer),
+  "analyzer_use_fasta_parser":
+      new _Variable.bool((c) => c.useAnalyzerFastaParser),
   "arch": new _Variable((c) => c.architecture.name, Architecture.names),
   "browser": new _Variable.bool((c) => c.runtime.isBrowser),
   "builder_tag": new _Variable((c) => c.builderTag ?? "", const []),
diff --git a/tools/testing/dart/options.dart b/tools/testing/dart/options.dart
index 5296bd1..fb29a71 100644
--- a/tools/testing/dart/options.dart
+++ b/tools/testing/dart/options.dart
@@ -173,6 +173,12 @@
     new _Option.bool(
         'no_preview_dart_2', 'Pass the --no-preview-dart-2 flag to analyzer',
         hide: true),
+    new _Option.bool('use_cfe', 'Pass the --use-cfe flag to analyzer',
+        hide: true),
+    new _Option.bool('analyzer_use_fasta_parser',
+        'Pass the --use-fasta-parser flag to analyzer',
+        hide: true),
+
     // TODO(sigmund): replace dart2js_with_kernel with preview-dart-2.
     new _Option.bool(
         'dart2js_with_kernel', 'Pass the --use-kernel flag to dart2js.',
@@ -656,6 +662,9 @@
                 reportInJson: data["report_in_json"] as bool,
                 resetBrowser: data["reset_browser_configuration"] as bool,
                 skipCompilation: data["skip_compilation"] as bool,
+                useAnalyzerCfe: data["use_cfe"] as bool,
+                useAnalyzerFastaParser:
+                    data["analyzer_use_fasta_parser"] as bool,
                 useBlobs: data["use_blobs"] as bool,
                 useSdk: data["use_sdk"] as bool,
                 useFastStartup: data["fast_startup"] as bool,
